Assignment 3: If you malloc something, set it free
Due Wednesday, February 8th, before midnight
The goals for this assignment are:
-
Work with pointers
-
Work with malloc/free
-
Work with arrays
1. Update your repository
Do a fetch upstream to obtain the basecode for this assignment.
Using the command line
-
Open terminal and change your current directory to your assignment repository.
-
Run the command
git fetch upstream
-
Run the command
git merge upstream/master
Your repository should now contain a new folder named A03
.
The fetch
and merge
commands update your repository with any changes from the original.
2. Can’t get a word in entwise
"We must not be hasty." -- Treebeard
The Ents in Lord of the Rings were a noble race of tree herders, whose language was "long and sonorous". Ents live a very long time and so speak very…carefully…and….very…s.l.o.w.l.y.
Write a program ,slow.c
, that turns a phrase into ent-speech. Your program
should ask for the pause length and a phrase to change. Your program should
output an ent-phrase. Ent-phrases contain '.' between each letter in the input.
Two examples of the running program are shown below. User input is shown in bold.
$ make slow
gcc -g -Wall -Wvla -Werror slow.c -o slow
$ ./slow
Pause length: 3
Text: Surprise!
S...u...r...p...r...i...s...e...!...
$ ./slow
Pause length: 5
Text: Hmmm?
H.....m.....m.....m.....?.....
Requirements and Hints:
-
You can assume that the user will enter a string that fits into a 32 character buffer, e.g.
char buff[32];
-
Watch out that any string you create ends with a terminating null character, e.g.
'\0'
-
Use malloc/free to allocate a string that has enough space to store your "slow" speech!
3. Dynamic songs
Implement a program, dynamic_songs.c
, that reads songs from a text file into
an array. Unlike last week’s songs, your program only needs the following features:
-
The ability to open a CSV file (
songlist.csv
) and read its contents into an array created with malloc. -
The ability to read in additional information: tempo, valence, and energy.
-
The ability to run with memory leaks or valgrind errors (remember to call
free
andfclose
!) -
The ability to set the contents of our dynamic array of songs, based on the file
-
The ability to print out the list of songs
The CSV this week contains the duration of songs in milliseconds, not seconds! |
The format of the CSV file is
<Num Songs>,,,,,,
Title, Artist, Duration (ms), Danceability, Energy, Tempo, Valence
Canned Heat,Jamiroquai,331760,0.7,0.865,128.04,0.78
....
From the first line, you should only read the first token to get the number of songs. The second line is a header that you should skip. All subsequent lines are data that you should read into your array.
The last 4 columns are based on Spotify audio analysis traits
-
Danceability (float) Danceability describes how suitable a track is for dancing based on a combination of musical elements including tempo, rhythm stability, beat strength, and overall regularity. A value of 0.0 is least danceable and 1.0 is most danceable.
-
Energy (float) Energy is a measure from 0.0 to 1.0 and represents a perceptual measure of intensity and activity. Typically, energetic tracks feel fast, loud, and noisy. For example, death metal has high energy, while a Bach prelude scores low on the scale. Perceptual features contributing to this attribute include dynamic range, perceived loudness, timbre, onset rate, and general entropy.
-
Tempo (float) The overall estimated tempo of a track in beats per minute (BPM). In musical terminology, tempo is the speed or pace of a given piece and derives directly from the average beat duration.
-
Valence (float) A measure from 0.0 to 1.0 describing the musical positiveness conveyed by a track. Tracks with high valence sound more positive (e.g. happy, cheerful, euphoric), while tracks with low valence sound more negative (e.g. sad, depressed, angry). >= 0⇐ 1
You can read songlist.CSV with nano but you can also load it into Excel or Google sheets to view the file.
|
$ make dynamic_songs
gcc -g -Wall -Wvla -Werror dynamic_songs.c -o dynamic_songs
$ ./dynamic_songs
Welcome to Dynamic Donna's Danceability Directory.
0) Canned Heat artist: Jamiroquai duration: 5:31 D: 0.700 E: 0.865 T: 128.040 V: 0.780
1) Eye of the Tiger artist: Survivor duration: 4:05 D: 0.817 E: 0.599 T: 108.873 V: 0.548
2) The Veldt artist: deadmau5 duration: 2:50 D: 0.736 E: 0.759 T: 128.039 V: 0.485
3) Golden artist: Harry Styles duration: 3:28 D: 0.448 E: 0.838 T: 139.863 V: 0.254
4) Thunderstruck artist: AC/DC duration: 4:52 D: 0.502 E: 0.890 T: 133.520 V: 0.259
5) Nonsense artist: Madeon duration: 3:45 D: 0.543 E: 0.781 T: 87.009 V: 0.695
6) One More Time artist: Daft Punk duration: 5:20 D: 0.613 E: 0.697 T: 122.746 V: 0.476
7) Around the World artist: Daft Punk duration: 7:09 D: 0.956 E: 0.795 T: 121.294 V: 0.841
8) Lose Yourself to Dance artist: Daft Punk duration: 5:53 D: 0.832 E: 0.659 T: 100.163 V: 0.674
9) 10% artist: KAYTRANADA duration: 3:06 D: 0.794 E: 0.757 T: 107.990 V: 0.615
10) Easy artist: Groove Armada duration: 5:52 D: 0.657 E: 0.860 T: 124.150 V: 0.590
11) Halcyon and On and On artist: Orbital duration: 9:27 D: 0.577 E: 0.729 T: 126.988 V: 0.177
12) Enjoy the Silence artist: Depeche Mode duration: 4:17 D: 0.641 E: 0.812 T: 112.777 V: 0.822
13) Rasputin artist: Boney M. duration: 5:51 D: 0.639 E: 0.893 T: 126.143 V: 0.966
14) Who's Theme artist: Nujabes duration: 4:57 D: 0.603 E: 0.485 T: 169.734 V: 0.357
15) Burn the Witch artist: Radiohead duration: 3:40 D: 0.541 E: 0.847 T: 148.937 V: 0.620
16) Hold Me Now artist: Thompson Twins duration: 4:45 D: 0.785 E: 0.517 T: 108.108 V: 0.859
17) Crystallize artist: Lindsey Stirling duration: 4:18 D: 0.440 E: 0.623 T: 140.006 V: 0.056
Requirements and Hints:
-
Your program must use malloc/free to allocate the array of songs.
-
Your program should print the songs in an attractive table, although the formatting does not need to match the sample output exactly.
-
You can assume that all songs names and artists fit into an 128 character buffer.
-
Feel free to re-use code from A02 (such as your printed table)!
Because the song names and artists can have spaces in them, read in the file line by line
using fgets and then use strtok to split each line using comma as a deliminator , .
Because strtok splits a line into strings, you will need to convert some of the tokens by
numeric types. Use atoi to convert a string to a integer. Use atof to a convert a string to
a float.
|
The data for this question comes from Spotify. If you would like to see the statistics for your own favorite songs, try the developer console here! You will need to ID of the song, which you can get from your Spotify account by right clicking on a song. |
4. Grading Rubric
Assignment rubrics
Grades are out of 4 points.
-
(1 point) slow
-
(0.1 points) style and header comment
-
(0.5 points) no memory errors
-
(0.4 points) correct behavior: asks the user for input and creates the new string
-
-
(3 points) dynamic songs
-
(0.15 points) style and header comment
-
(0.05 points) defines a struct to hold the information for each song
-
(0.5 points) correctly handles the duration and prints results in a table
-
(0.8 points) reads and parses songlist.csv
-
(1.5 points) creates an array to hold the data from the file (No memory errors)
-
Code rubrics
For full credit, your C programs must be feature-complete, robust (e.g. run without memory errors or crashing) and have good style.
-
Some credit lost for missing features or bugs, depending on severity of error
-
-5% for style errors. See the class coding style here.
-
-50% for memory errors
-
-100% for failure to checkin work to Github
-
-100% for failure to compile on linux using make