CS61A Lab 12
Lab 12: Scheme Data Abstraction lab12.zip
Due by 11:59pm on Wednesday, April 13.
Starter Files
Download lab12.zip. Inside the archive, you will find starter files for the questions in this lab, along with a copy of the Ok autograder.
Topics
Consult this section if you need a refresher on the material for this lab. It’s okay to skip directly to the questions and refer back here should you get stuck.
Data Abstractions
Data Abstractions
Example Data Abstractions
Rational
Recall that a rational number is any number that can be expressed as p / q, where p and q are integers.
1 | ; Creates the rational number n/d (Assume n, d are integers and d != 0) |
Trees
Below is a Scheme-ified data abstraction of the Tree class we’ve been working with this semester.
1 | ; Constructs tree given label and list of branches |
Questions
What Would Scheme Do?
Q1: WWSD: Data Abstractions
Let’s familiarize ourselves with some Scheme data abstractions!
If you need a refresher on the
tree
andrational
abstractions, refer to this lab’s introduction or Monday 04/11’s lecture.
Use Ok to test your knowledge with the following “What Would Python Display?” questions:
1 | python3 ok -q abstractions -u✂️ |
1 | scm> (load rational.scm) |
1 | $ python3 ok -q abstractions -u |
Code Writing Questions
Remember that when working with data abstractions, you should not break the abstraction barrier if possible! Later questions will have abstraction checks, where the underlying representation of the abstraction will be changed; thus, attempting to refer to specifics of the implementation will break. Attempt to use the functions you are creating to interface with the classes whenever possible.
Cities
Say we have an abstract data type for cities. A city has a name, a latitude coordinate, and a longitude coordinate.
Our data abstraction has one constructor:
(make-city name lat lon)
: Creates a city object with the given name, latitude, and longitude.
We also have the following selectors in order to get the information for each city:
(get-name city)
: Returns the city’s name(get-lat city)
: Returns the city’s latitude(get-lon city)
: Returns the city’s longitude
Here is how we would use the constructor and selectors to create cities and extract their information:
1 | scm> (define berkeley (make-city 'Berkeley 122 37)) |
All of the selector and constructor functions can be found in the lab file, if you are curious to see how they are implemented. However, the point of data abstraction is that we do not need to know how an abstract data type is implemented, but rather just how we can interact with and use the data type.
Q2: Distance
We will now implement the function distance
, which computes the Euclidean distance between two city objects; the Euclidean distance between two coordinate pairs (x1, y1)
and (x2, y2)
can be found by calculating the sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
. Use the latitude and longitude of a city as its coordinates; you’ll need to use the selectors to access this info!
You may find the following methods useful:
(expt base exp)
: calculatebase ** exp
(sqrt x)
calculatesqrt(x)
1 | (define (distance city-a city-b) |
Use Ok to test your code:
1 | python3 ok -q city_distance✂️ |
Q3: Closer city
Next, implement closer-city
, a function that takes a latitude, longitude, and two cities, and returns the name of the city that is relatively closer to the provided latitude and longitude.
You may only use the selectors and constructors introduced above and the distance
function you just defined for this question.
Hint: How can you use your
distance
function to find the distance between the given location and each of the given cities?
1 | (define (closer-city lat lon city-a city-b) |
Use Ok to test your code:
1 | python3 ok -q city_closer✂️ |
Teachers and Students
In the following questions, you’ll be implementing data abstractions for students and teachers:
- The
teacher
abstraction keeps track of the teacher’sname
, theclass
they teach, and thestudents
enrolled in their class. Specifically, ateacher
’sname
andclass
are atomic symbols, and theirstudents
is a list ofstudent
objects. - The
student
abstraction keeps track of a student’sname
and number ofclasses
attended. Specifically, astudent
’sname
is an atomic symbol, and theirclasses
is a list of atomic symbols representing all classes attended. For example, if a student had attendedcs61a
andastronomy
, theirclasses
list would be(cs61a astronomy)
.
You can find the constructors for these classes below:
1 | (define (student-create name classes) (cons name classes)) |
Q4: Teachers and Students: Selectors
Implement student-get-name
, student-get-classes
, teacher-get-name
, teacher-get-class
, and teacher-get-students
. These functions take in a student
or teacher
abstraction, and return the relevant attribute; for example, student-get-name
takes a student
as input, and returns the name
.
1 | (define (student-create name classes) |
Use Ok to test your code:
1 | python3 ok -q teacher_student_selectors✂️ |
Q5: Students: Attend Class
Implement student-attend-class
. This method takes in a student
and a class
as input, and returns a new student
abstraction with the class
list updated to reflect the class
attended.
Be sure to keep the abstraction barrier in mind!
1 | (define (student-attend-class student class) |
Use Ok to test your code:
1 | python3 ok -q student_attend_class✂️ |
Q6: Teachers: Hold Discussion
Implement teacher-hold-class
. This method takes in a teacher
as input, and emulates holding a class. Specifically, the function should return a new updated teacher
, where all student
objects in the teacher
’s students
list have updated class
lists to reflect their attendance.
Be sure to keep the abstraction barrier in mind! Feel free to use any of the functions implemented in previous parts of this lab. You may also find the
map
function useful.
1 | (define (teacher-hold-class teacher) |
Use Ok to test your code:
1 | python3 ok -q teacher_hold_class✂️ |
Submit
Make sure to submit this assignment by running:
1 | python3 ok --submit |