Week 01 Laboratory Exercises
Objectives
- to refamiliarise yourself with C
- to practice interacting with files and standard I/O
- to practice interacting with command-line arguments
- to explore implementing recursive functions
Preparation
Before the lab you should re-read the relevant lecture slides and their accompanying examples.
Getting Started
lab01
and changing to this directory.
mkdir lab01 cd lab01
There are some provided files for this lab which you can fetch with this command:
1521 fetch lab01
If you're not working at CSE, you can download the provided files as a zip file or a tar file.
Exercise — individual:
Remove All Vowels from STDIN
no_vowels.c
which reads characters from its input
and writes the same characters to its output, except it does not write vowels.
Your program should stop only at the end of input.
no_vowels.c
must only use:
scanf(3) to read one character at a time from stdin.
printf(3) to print one character at a time to stdout.
Once you have no_vowels.c
working correctly it should behave as follows:
./no_vowels Hello, World! Hll, Wrld! echo "Peter Piper picked a peck of pickled peppers." > input ./no_vowels < input Ptr Ppr pckd pck f pckld ppprs. ./no_vowels Andrew is the LiC of COMP1521 ndrw s th LC f CMP1521 Are you saying 'Boo' or 'Boo-Urns'? r y syng 'B' r 'B-rns'? In this house, we obey the laws of thermodynamics! n ths hs, w by th lws f thrmdynmcs!
When you think your program is working,
you can use autotest
to run some simple automated tests:
1521 autotest no_vowels
When you are finished working on this exercise,
you must
submit your work by running give
:
give cs1521 lab01_no_vowels no_vowels.c
You must run give
before Tuesday 27 February 12:00 (midday) (2024-02-27 12:00:00)
to obtain the marks for this lab exercise.
Note that this is an individual exercise,
the work you submit with give
must be entirely your own.
Exercise — individual:
Transform All Uppercase letters to Lowercase
no_uppercase.c
which reads characters from its input
and writes the same characters to its output, any upper case letters are replaced
by their as lower case equivalent.
Your program should stop only at the end of input.
Add code to no_uppercase.c
so that,
given text on stdin, any uppercase letters are printed as lowercase to stdout.
no_uppercase.c
must only use:
getchar(3) to read one character at a time from stdin.
putchar(3) to print one character at a time to stdout.
Once you have no_uppercase.c
working correctly it should behave as follows:
./no_uppercase ABC abc ABCabc123 abcabc123 123!@# 123!@# Hello, World! hello, world! Andrew is the LiC of COMP1521 andrew is the lic of comp1521
echo "Peter Piper picked a peck of pickled peppers." > input ./no_uppercase < input peter piper picked a peck of pickled peppers.
When you think your program is working,
you can use autotest
to run some simple automated tests:
1521 autotest no_uppercase
When you are finished working on this exercise,
you must
submit your work by running give
:
give cs1521 lab01_no_uppercase no_uppercase.c
You must run give
before Tuesday 27 February 12:00 (midday) (2024-02-27 12:00:00)
to obtain the marks for this lab exercise.
Note that this is an individual exercise,
the work you submit with give
must be entirely your own.
Exercise — individual:
Remove Uneven Lines of Input
Add code to no_odd_lines.c
so that,
given text on stdin, only print lines with an even number of characters to stdout.
Note that the newline character is included in a line's character count.
no_odd_lines.c
must only use:
fgets(3) to read one line at a time from stdin.
fputs(3) to print one line at a time to stdout.
Once you have no_odd_lines.c
working correctly it should behave as follows:
./no_odd_lines Hello, World Hello, World! Hello, World! Angela is the LiC of COMP1521. Angela is the LiC of COMP1521, and Xavier is the admin. Angela is the LiC of COMP1521, and Xavier is the admin. echo "Peter Piper picked a peck of pickled peppers." > input echo "A peck of pickled peppers Peter Piper picked." >> input echo "If Peter Piper picked a peck of pickled peppers," >> input echo "Where's the peck of pickled peppers Peter Piper picked?" >> input ./no_odd_lines < input Peter Piper picked a peck of pickled peppers. A peck of pickled peppers Peter Piper picked. Where's the peck of pickled peppers Peter Piper picked?
When you think your program is working,
you can use autotest
to run some simple automated tests:
1521 autotest no_odd_lines
When you are finished working on this exercise,
you must
submit your work by running give
:
give cs1521 lab01_no_odd_lines no_odd_lines.c
You must run give
before Tuesday 27 February 12:00 (midday) (2024-02-27 12:00:00)
to obtain the marks for this lab exercise.
Note that this is an individual exercise,
the work you submit with give
must be entirely your own.
Exercise — individual:
Pretty Print Command Line Arguments
Add code to my_args.c
so that,
given 0 or more command line arguments,
the command line arguments are "pretty printed".
In this case, "pretty printing" simply means to follow the format shown in the example below.
Once you have my_args.c
working correctly it should behave as follows:
./my_args Program name: ./my_args There are no other arguments ../lab01/my_args Program name: ../lab01/my_args There are no other arguments ./my_args hello world Program name: ./my_args There are 2 arguments: Argument 1 is "hello" Argument 2 is "world" ./my_args "hello world" 1 2 3 4 5 Program name: ./my_args There are 6 arguments: Argument 1 is "hello world" Argument 2 is "1" Argument 3 is "2" Argument 4 is "3" Argument 5 is "4" Argument 6 is "5" mv my_args list_args ./list_args Program name: ./list_args There are no other arguments
When you think your program is working,
you can use autotest
to run some simple automated tests:
1521 autotest my_args
When you are finished working on this exercise,
you must
submit your work by running give
:
give cs1521 lab01_my_args my_args.c
You must run give
before Tuesday 27 February 12:00 (midday) (2024-02-27 12:00:00)
to obtain the marks for this lab exercise.
Note that this is an individual exercise,
the work you submit with give
must be entirely your own.
Exercise — individual:
Statistical Analysis of Command Line Arguments
Add code to arg_stats.c
so that,
given 1 or more command line arguments,
it prints the minimum and maximum values,
the sum and product of all the values,
and the mean of all the values.
The mean should be rounded towards zero.
Once you have arg_stats.c
working correctly it should behave as follows:
./arg_stats Usage: ./arg_stats NUMBER [NUMBER ...] ./arg_stats 1 MIN: 1 MAX: 1 SUM: 1 PROD: 1 MEAN: 1 ./arg_stats 1 2 3 4 5 6 7 8 9 MIN: 1 MAX: 9 SUM: 45 PROD: 362880 MEAN: 5 ./arg_stats 9 8 7 6 1 2 3 5 4 MIN: 1 MAX: 9 SUM: 45 PROD: 362880 MEAN: 5 ./arg_stats 1 9 1 9 1 9 MIN: 1 MAX: 9 SUM: 30 PROD: 729 MEAN: 5
When you think your program is working,
you can use autotest
to run some simple automated tests:
1521 autotest arg_stats
When you are finished working on this exercise,
you must
submit your work by running give
:
give cs1521 lab01_arg_stats arg_stats.c
You must run give
before Tuesday 27 February 12:00 (midday) (2024-02-27 12:00:00)
to obtain the marks for this lab exercise.
Note that this is an individual exercise,
the work you submit with give
must be entirely your own.
Exercise — individual:
(Dis)Proving the Collatz Conjecture
Add code to collatz.c
that take a single positive integer
as a command-line argument and prints the
collatz chain
for that number.
This is how the collatz chain is calculated:
If the current number is 1
, the series terminates.
If the current number is ODD, then multiply by 3 and add 1 to get the next number.
If the current number is EVEN, then divide by 2 to get the next number.
Once you have collatz.c
working correctly it should behave as follows:
./collatz Usage: ./collatz NUMBER ./collatz 1 1 ./collatz 12 12 6 3 10 5 16 8 4 2 1 ./collatz 10 10 5 16 8 4 2 1
When you think your program is working,
you can use autotest
to run some simple automated tests:
1521 autotest collatz
When you are finished working on this exercise,
you must
submit your work by running give
:
give cs1521 lab01_collatz collatz.c
You must run give
before Tuesday 27 February 12:00 (midday) (2024-02-27 12:00:00)
to obtain the marks for this lab exercise.
Note that this is an individual exercise,
the work you submit with give
must be entirely your own.
Exercise — individual:
Calculating the Fibonacci Sequence The (Not So) Fast Way
Add code to fibonacci.c
so that,
given a line of input containing a natural number,
the corresponding Fibonacci number is printed.
This is how you obtain your Fibonacci number:
Starting with 0 and 1:
Add the preceding two Fibonacci numbers together to get the current Fibonacci number:
Once you have fibonacci.c
working correctly it should behave as follows - note that bolded lines
represent sample user input to the program, and the other lines represent the expected output.
That is, an input of 2 prints 1, because 1 is the second Fibonacci number,
and an input of 9 prints 34, because 34 is the ninth Fibonacci number.
./fibonacci 0 0 1 1 2 1 5 5 9 34
When you think your program is working,
you can use autotest
to run some simple automated tests:
1521 autotest fibonacci
When you are finished working on this exercise,
you must
submit your work by running give
:
give cs1521 lab01_fibonacci fibonacci.c
You must run give
before Tuesday 27 February 12:00 (midday) (2024-02-27 12:00:00)
to obtain the marks for this lab exercise.
Note that this is an individual exercise,
the work you submit with give
must be entirely your own.
Challenge Exercise — individual:
Do You MIPS me?
Write a MIPS assembler program bad_pun.s
,
which is equivalent to this C program:
// A simple C program that attempts to be punny
#include <stdio.h>
int main(void) {
printf("Well, this was a MIPStake!\n");
return 0;
}
For example:
1521 mipsy bad_pun.s Well, this was a MIPStake!
When you think your program is working,
you can use autotest
to run some simple automated tests:
1521 autotest bad_pun
When you are finished working on this exercise,
you must
submit your work by running give
:
give cs1521 lab01_bad_pun bad_pun.s
You must run give
before Tuesday 27 February 12:00 (midday) (2024-02-27 12:00:00)
to obtain the marks for this lab exercise.
Note that this is an individual exercise,
the work you submit with give
must be entirely your own.
Challenge Exercise — individual:
Cheating in maths class
Write a MIPS assembler program gaussian_sum.s
,
which is equivalent to this C program:
// A simple C program that calculates the Gaussian sum between two numbers
// Written 12/2/2022
// by Dylan Brotherston (d.brotherston@unsw.edu.au)
#include <stdio.h>
int main(void)
{
int number1, number2;
printf("Enter first number: ");
scanf("%d", &number1);
printf("Enter second number: ");
scanf("%d", &number2);
int gaussian_sum = ((number2 - number1 + 1) * (number1 + number2)) / 2;
printf("The sum of all numbers between %d and %d (inclusive) is: %d\n", number1, number2, gaussian_sum);
return 0;
}
For example:
1521 mipsy gaussian_sum.s Enter first number: 1 Enter second number: 100 The sum of all numbers between 1 and 100 (inclusive) is: 5050 1521 mipsy gaussian_sum.s Enter first number: 1 Enter second number: 1000 The sum of all numbers between 1 and 1000 (inclusive) is: 500500 1521 mipsy gaussian_sum.s Enter first number: 10 Enter second number: 13 The sum of all numbers between 10 and 13 (inclusive) is: 46
When you think your program is working,
you can use autotest
to run some simple automated tests:
1521 autotest gaussian_sum
When you are finished working on this exercise,
you must
submit your work by running give
:
give cs1521 lab01_gaussian_sum gaussian_sum.s
You must run give
before Tuesday 27 February 12:00 (midday) (2024-02-27 12:00:00)
to obtain the marks for this lab exercise.
Note that this is an individual exercise,
the work you submit with give
must be entirely your own.
Submission
give
.
You can run give
multiple times.
Only your last submission will be marked.
Don't submit any exercises you haven't attempted.
If you are working at home, you may find it more convenient to upload your work via give's web interface.
Remember you have until Week 3 Tuesday 12:00:00 (midday) to submit your work without receiving a late penalty.
You cannot obtain marks by e-mailing your code to tutors or lecturers.
You check the files you have submitted here.
Automarking will be run by the lecturer several days after the submission deadline,
using test cases different to those autotest
runs for you.
(Hint: do your own testing as well as running autotest
.)
After automarking is run by the lecturer you can view your results here. The resulting mark will also be available via give's web interface.
Lab Marks
When all components of a lab are automarked you should be able to view the the marks via give's web interface or by running this command on a CSE machine:
1521 classrun -sturec