Spreadsheet Assignment
Contents
- 1 Slides
- 2 Spreadsheet Examples
- 3 Basis Library
- 4 Code To Implement
- 4.1 Csv
- 4.2 Spreadsheet
- 4.2.1 create_sheet
- 4.2.2 row_count
- 4.2.3 column_count
- 4.2.4 row_at
- 4.2.5 cell_in_row_at_column_index
- 4.2.6 cell_at (Provided)
- 4.2.7 column_at
- 4.2.8 sum_values_in_cell_list
- 4.2.9 sum_values_in_row (Provided)
- 4.2.10 sum_values_in_column (Provided)
- 4.2.11 max_value_in_cell_list
- 4.2.12 max_value_in_row (Provided)
- 4.2.13 max_value_in_column (Provided)
- 4.2.14 count_if_in_cell_list
- 4.2.15 count_if_in_row (Provided)
- 4.2.16 count_if_in_column (Provided)
- 4.2.17 EXTRA_CREDIT_to_dictionaries_using_headers_as_keys
Slides
Spreadsheet Examples
nums
This rather simple spreadsheet is comprised entirely of ints.
1 | 2 | 3 | 4 |
10 | 20 | 30 | 40 |
grades
In this spreadsheet we can see that Joshua Bloch is rocking out the Java assignments in 425, Dan Grossman is allowing his subconscious disdain for Java to affect his ability with those assignments, and Shannon O'Ganns was failing poorly enough to seemingly resort to some sort of subversion of the grading process.
Name | Java List | SML Calendar | SML Hearts | SML Card Game | Java HOF | SML Binary Tree | SML Pattern Matching |
Max | 100 | 104 | 100 | 104 | 100 | 100 | 105 |
Joshua Bloch | 100 | 85 | 80 | 75 | 100 | 70 | 65 |
Harry Q. Bovik | 80 | 81 | 82 | 83 | 84 | 85 | 86 |
Dan Grossman | 75 | 104 | 100 | 104 | 80 | 100 | 105 |
Shannon O'Ganns | 70 | 40 | 0 | 120 | 120 | 130 | 140 |
hockey
In this spreadsheet we have the three greatest hockey players of all time with some of their stats. Although not particularly interesting from a computer science perspective, it is remarkable that Wayne Gretzky has more assists than the year of his birth.
Name | Uniform Number | Birth Year | Games Played | Goals | Assists |
Bobby Orr | 4 | 1948 | 657 | 270 | 645 |
Wayne Gretzky | 99 | 1961 | 1487 | 894 | 1963 |
Mario Lemieux | 66 | 1965 | 915 | 690 | 1033 |
Basis Library
Option
String
Int
List
Code To Implement
Csv
read_csv
fun read_csv(csv:string) : string list list = raise NotYetImplemented
It is highly recommended that you use the String fields function. NOTE: fields is curried. You have been provided with an example usage of fields in string_fields_example.sml:
fun is_separator(c : char) : bool = c = #"/" val split_path = String.fields is_separator "git/425/sml/spreadsheet"
which when run will bind split_path
to ["git","425","sml","spreadsheet"]
Spreadsheet
create_sheet
fun create_sheet(word_lists : string list list) : sheet = raise NotYetImplemented
row_count
fun row_count(s : sheet) : int = raise NotYetImplemented
column_count
fun column_count(s : sheet) : int = raise NotYetImplemented
row_at
fun row_at(s : sheet, row_index : int) : cell list = raise NotYetImplemented
cell_in_row_at_column_index
fun cell_in_row_at_column_index( r : cell list, col_index : int) : cell = raise NotYetImplemented
cell_at (Provided)
fun cell_at(s : sheet, row_index : int, col_index : int) : cell = cell_in_row_at_column_index(row_at(s, row_index), col_index)
column_at
fun column_at(s : sheet, col_index : int) : cell list = raise NotYetImplemented
sum_values_in_cell_list
fun sum_values_in_cell_list(cells : cell list) : int = raise NotYetImplemented
sum_values_in_row (Provided)
fun sum_values_in_row(s : sheet, row_index : int) : int = sum_values_in_cell_list(row_at(s, row_index))
sum_values_in_column (Provided)
fun sum_values_in_column(s : sheet, column_index : int) : int = sum_values_in_cell_list(column_at(s, column_index))
max_value_in_cell_list
fun max_value_in_cell_list(cells : cell list) : int option = raise NotYetImplemented
max_value_in_row (Provided)
fun max_value_in_row(s : sheet, row_index : int) : int option = max_value_in_cell_list(row_at(s, row_index))
max_value_in_column (Provided)
fun max_value_in_column(s : sheet, column_index : int) : int option = max_value_in_cell_list(column_at(s, column_index))
count_if_in_cell_list
fun count_if_in_cell_list(cells : cell list, predicate : (cell -> bool)) : int = raise NotYetImplemented
count_if_in_row (Provided)
fun count_if_in_row(s : sheet, row_index : int, predicate : (cell -> bool)) : int = count_if_in_cell_list(row_at(s, row_index), predicate)
count_if_in_column (Provided)
fun count_if_in_column(s : sheet, col_index : int, predicate : (cell -> bool)) : int = count_if_in_cell_list(column_at(s, col_index), predicate)
EXTRA_CREDIT_to_dictionaries_using_headers_as_keys
fun EXTRA_CREDIT_to_dictionaries_using_headers_as_keys(s : sheet) : (cell,cell) SingleListDictionary.dictionary list = raise NotYetImplemented
NOTE: you can assume that you will not be passed the empty list. If you want to handle this case anyway, raising Empty seems like a reasonable thing to do.