Assignment 2: Learn to C

Due Thursday, September 12, before midnight

The goals for this assignment are:

  • Work with strings

  • Work with structs

  • Work with arrays

1. Update your repository

Do a fetch upstream to obtain the basecode for this assignment.

The first time you do a fetch, you need to set the URL of the upstream repository.

  • git remote add upstream git@github.com:brynmawr-cs223-f24/cs223-assignments.git

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 A02.

The fetch and merge commands update your repository with any changes from the original.

2. Exclaim!

Sometimes life can be very frustrating and we just need to shout. Write a program, exclaim.c that turns a word into an exclaimation. Your program should loop through each character. If the character is a lowercase letter, replace it with a randomly chosen character from the set {'@', '!', '#', '*'}.

Two examples of the running program are shown below. User input is shown in bold.

$ make exclaim
gcc -g -Wall -Wvla -Werror exclaim.c -o exclaim
$ ./exclaim
Enter a word: apple
OMG! *#!*!
$ ./exclaim
Enter a word: YOLO!
OMG! YOLO!
$ ./exclaim
Enter a word: Tada!
OMG! T*#!!

Requirements and Hints:

  • You can assume that the user will enter a string that fits into a 32 character buffer, e.g. store the user’s input with a variable defined as char buff[32];

  • Use the fact that ascii characters correspond to integers to check for a lowercase letter. ASCII Table

  • Use rand() to choose a random character.

3. Acronym

Write a program, acronym.c, that computes an acronym from a given phrase. Your program should create a string consisting of all capital letters from the given phrase.

$ make acroynm
gcc -g -Wall -Wvla -Werror acronym.c -o acronym
$ ./acronym
Enter a phrase: What Does The Fox Say?
Your acronym is WDTFS
$ ./acronym
Enter a phrase: The Truth Is Out There
Your acronym is TTIOT
$ ./acronym
Enter a phrase: You Only Live Once
Your acronym is YOLO

Requirements and Hints:

  • You do not need to handle the case where a capital letter occurs in the middle of a word.

  • Watch out that any string you create ends with a terminating null character, e.g. '\0'

  • You can assume that all input fits within 1024 characters.

To read in a string containing phrases, use the following format string with scanf: scanf("%[^\n]%*c", phrase); The %[^\n] will read until the newline is reached. The %*c reads the newline and ignores it.

4. Songs

Implement a program, songs.c, that fills an array with three or more songs and then allows the user to edit the data in the array.

$ make songs
gcc -g -Wall -Wvla -Werror songs.c -o songs
$ ./songs
Welcome to Steven Struct's Song List.

0) Shout                artist: Tears for Fears         duration: 4:11  danceability: 0.50
1) As it was            artist: Harry Styles            duration: 2:47  danceability: 0.70
2) Wish you were here   artist: Pink Floyd              duration: 5:34  danceability: 0.30

=======================

Enter a song id to edit [0,1,2]: 1
Which attribute do you wish to edit? [artist, title, duration, danceability]: duration
Enter a duration (minutes): 2
Enter a duration (seconds): 40

0) Shout                artist: Tears for Fears         duration: 4:11  danceability: 0.50
1) As it was            artist: Harry Styles            duration: 2:40  danceability: 0.70
2) Wish you were here   artist: Pink Floyd              duration: 5:34  danceability: 0.30

=======================
$ ./songs
Welcome to Steven Struct's Song List.

0) Shout                artist: Tears for Fears         duration: 4:11  danceability: 0.50
1) As it was            artist: Harry Styles            duration: 2:47  danceability: 0.70
2) Wish you were here   artist: Pink Floyd              duration: 5:34  danceability: 0.30

=======================

Enter a song id to edit [0,1,2]: 2
Which attribute do you wish to edit? [artist, title, duration, danceability]: artist
Enter a artist: The Who

0) Shout                artist: Tears for Fears         duration: 4:11  danceability: 0.50
1) As it was            artist: Harry Styles            duration: 2:47  danceability: 0.70
2) Wish you were here   artist: The Who                 duration: 5:34  danceability: 0.30

=======================

$ ./songs
Welcome to Steven Struct's Song List.

0) Shout                artist: Tears for Fears         duration: 4:11  danceability: 0.50
1) As it was            artist: Harry Styles            duration: 2:47  danceability: 0.70
2) Wish you were here   artist: Pink Floyd              duration: 5:34  danceability: 0.30

=======================

Enter a song id to edit [0,1,2]: 5
Invalid choice!

$ ./songs
Welcome to Steven Struct's Song List.

0) Shout                artist: Tears for Fears         duration: 4:11  danceability: 0.50
1) As it was            artist: Harry Styles            duration: 2:47  danceability: 0.70
2) Wish you were here   artist: Pink Floyd              duration: 5:34  danceability: 0.30

=======================

Enter a song id to edit [0,1,2]: 0
Which attribute do you wish to edit? [artist, title, duration, danceability]: danceability
Enter danceability: 0.9

0) Shout                artist: Tears for Fears         duration: 4:11  danceability: 0.90
1) As it was            artist: Harry Styles            duration: 2:47  danceability: 0.70
2) Wish you were here   artist: Pink Floyd              duration: 5:34  danceability: 0.30

=======================

Requirements and Hints:

  • Your program should define a struct song to hold the song information. Duration should be stored in integers, danceability should be a float, and artist and title should be strings.

  • Your program should check for a valid song id and print an error message id the user enters an invalid id.

  • Your program should initialize at least 3 songs and store them in an array.

  • Your program should loop through the array of songs to print them in a table. Implementing this feature in a function is a good idea.

  • Your program should support spaces in the song names and titles.

  • Use strcmp to test which attribute the user wants to update.

  • Use strcpy to update the artist or title in the array.

  • 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 song artists and titles fit into a 32 character buffer.

  • Use %-20s to format left-justified strings with 20 spaces of padding.

Because the song artists and titles can have spaces in them, using scanf requires additional syntax. Instead of scanf(" %d", &val);, use scanf(" %d%*c", &val);. The trailing %*c tells scanf to read and ignore the newline character at the end of the line. Furthermore, to read the name, call scanf(" %[^\n]%*c", artist); instead of scanf(" %s", artist);.

5. Submit your Work

Push you work to Github to submit your work.

$ cd A02
$ git add *.c
$ git commit -m "assignment 2 complete"
$ git push

6. Grading Rubric

Assignment rubrics

Grades are out of 4 points.

  • (1 point) exclaim

    • (0.1 points) style and header comment

    • (0.4 points) correct behavior: asks the user for input and creates the new string

    • (0.5 points) no memory errors

  • (1 point) acronym

    • (0.1 points) style and header comment

    • (0.4 points) correct behavior: asks the user for input and creates the new string

    • (0.5 points) no memory errors

  • (2 points) songs

    • (0.2 points) style and header comment

    • (0.8 points) correct behavior: reads file, prints output with columns and supports editing

    • (1.0 points) 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

  • -12.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