Spreadsheet Assignment

From CSE425S Wiki
Jump to navigation Jump to search

Slides

view 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

NOTE: For both CSV and Spreadsheet functions, you may assume that all rows will have the same number of columns.

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)

to_dictionaries_using_headers_as_keys

fun to_dictionaries_using_headers_as_keys(s : sheet) : (cell,cell) SingleListDictionary.dictionary list =
       raise NotYetImplemented

Given this spreadsheet:

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

to_dictionaries_using_headers_as_keys should return a list with 3 single list dictionaries, one for each non-header row. The dictionaries would be filled with entries for each column, using the cell in the header of the column as the key and the cell in the particular row of the column as the value.

[ { TEXT("Name") => TEXT("Bobby Orr"),     TEXT("Uniform Number") => VALUE(4),  TEXT("Birth Year") => VALUE(1948), TEXT("Games Played") => VALUE(657),  TEXT("Goals") => VALUE(270), TEXT("Assists") => VALUE(645)  }, 
  { TEXT("Name") => TEXT("Wayne Gretzky"), TEXT("Uniform Number") => VALUE(99), TEXT("Birth Year") => VALUE(1961), TEXT("Games Played") => VALUE(1487), TEXT("Goals") => VALUE(894), TEXT("Assists") => VALUE(1963) }, 
  { TEXT("Name") => TEXT("Mario Lemieux"), TEXT("Uniform Number") => VALUE(66), TEXT("Birth Year") => VALUE(1965), TEXT("Games Played") => VALUE(915),  TEXT("Goals") => VALUE(690), TEXT("Assists") => VALUE(1033) } ]

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.

Testing

file: sml run_unit_test_spreadsheet.sml

in folder: src/test/sml/spreadsheet

Pledge, Acknowledgments, Citations

file: studio-spreadsheet-pledge-acknowledgments-citations.txt

More info about the Honor Pledge