Create a new directory for this lab called lab04
by typing:
mkdir lab04Change to this directory by typing:
cd lab04
For example:
./three_five Enter number: 10 3 5 6 9 ./three_five Enter number: 30 3 5 6 9 10 12 15 18 20 21 24 25 27As usual autotest is available to help you test your program.
~cs1511/bin/autotest lab04 three_five.c
three_five.c
// Written 26/3/2015 // by Andrew Taylor (andrewt@cse.unsw.edu.au) // as a lab example for COMP1911 // Suggested by https://projecteuler.net/ problem // Print multiples of 3 or 5 < n #include <stdio.h> int main(void) { int number, i; printf("Enter number: "); scanf("%d", &number); i = 1; while (i < number) { if (i % 3 == 0 || i % 5 == 0) { printf("%d\n", i); } i = i + 1; } return 0; }
perfect.c
that reads a positive integer n
from standard input and prints all the factors of n, their sum and if
indicates if n is a perfect number.
./perfect Enter number: 6 The factors of 6 are: 1 2 3 6 Sum of factors = 12 6 is a perfect number ./perfect Enter number: 1001 The factors of 1001 are: 1 7 11 13 77 91 143 1001 Sum of factors = 1344 1001 is not a perfect numberAutotest is available to help you test your program.
~cs1511/bin/autotest lab04 perfect.c
perfect.c
// Test if a number is perfect // Written 26/3/2015 // by Andrew Taylor (andrewt@cse.unsw.edu.au) // as a lab example for COMP1911 #include <stdio.h> int main(void) { int number, sum, i; printf("Enter number: "); scanf("%d", &number); printf("The factors of %d are:\n", number); i = 1; sum = 0; while (i <= number) { if ((number % i) == 0 ) { printf("%d\n", i); sum = sum + i; } i = i + 1; } printf("Sum of factors = %d\n", sum); if (number == (sum - number)) { printf("%d is a perfect number\n", number); } else { printf("%d is not a perfect number\n", number); } return 0; }
x.c
that reads an integer n from standard input.
and prints an nxn pattern of asterisks and dashes in the shape of an "X".
You can assume n is odd and >= 5.
Make your program match the examples below exactly.
You are not permitted to use an array in this exercise.
./x Enter size: 5 *---* -*-*- --*-- -*-*- *---* ./x Enter size: 9 *-------* -*-----*- --*---*-- ---*-*--- ----*---- ---*-*--- --*---*-- -*-----*- *-------* ./x Enter size: 15 *-------------* -*-----------*- --*---------*-- ---*-------*--- ----*-----*---- -----*---*----- ------*-*------ -------*------- ------*-*------ -----*---*----- ----*-----*---- ---*-------*--- --*---------*-- -*-----------*- *-------------*As usual autotest is available to help you test your program.
~cs1511/bin/autotest lab04 x.c
x.c
// Written 14/3/2017 by Andrew Taylor (andrewt@unsw.edu.au) // as a lab example for COMP1511 // Print an nxn "x" pattern of asterisks and spaces // // For example here is the output for n == 9 // // *-------* // -*-----*- // --*---*-- // ---*-*--- // ----*---- // ---*-*--- // --*---*-- // -*-----*- // *-------* #include <stdio.h> int main(void) { int size, n_numbers_read; int row, column; printf("Enter size: "); n_numbers_read = scanf("%d", &size); if (n_numbers_read != 1) { // scanf failed to read a number return 1; } if (size < 5 || size % 2 != 1) { printf("Error: size has to be odd and >= 5.\n"); return 1; } row = 0; while (row < size) { column = 0; while (column < size) { if (row == column || row == size - (column + 1)) { printf("*"); } else { printf("-"); } column = column + 1; } printf("\n"); row = row + 1; } return 0; }
plus.c
that reads an integer n from standard input.
and prints an nxn pattern of asterisks and dashes in the shape of an "+".
You can assume n is odd and >= 5.
Make your program match the examples below exactly.
You are not permitted to use an array in this exercise.
./plus Enter size: 7 ---*--- ---*--- ---*--- ******* ---*--- ---*--- ---*--- ./plus Enter size: 13 ------*------ ------*------ ------*------ ------*------ ------*------ ------*------ ************* ------*------ ------*------ ------*------ ------*------ ------*------ ------*------As usual autotest is available to help you test your program.
~cs1511/bin/autotest lab04 plus.c
plus.c
// Written 14/3/2017 by Andrew Taylor (andrewt@unsw.edu.au) // as a lab example for COMP1511 // Print an nxn "plus" pattern of asterisks and dashes // // For example here is the output for n == 9 // // ----*---- // ----*---- // ----*---- // ----*---- // ********* // ----*---- // ----*---- // ----*---- // ----*---- #include <stdio.h> int main(void) { int size, n_numbers_read; int row, column; printf("Enter size: "); n_numbers_read = scanf("%d", &size); if (n_numbers_read != 1) { // scanf failed to read a number return 1; } if (size < 5 || size % 2 != 1) { printf("Error: size has to be odd and >= 5.\n"); return 1; } row = 0; while (row < size) { column = 0; while (column < size) { if (row == size/2 || column == size/2) { printf("*"); } else { printf("-"); } column = column + 1; } printf("\n"); row = row + 1; } return 0; }
chessboard.c
that reads an integer n from standard input.
and prints an nxn pattern of asterisks and dashes in the shape of a chessboard.
You can assume n is odd and >= 5.
Make your program match the examples below exactly.
You are not permitted to use an array in this exercise.
./chessboard Enter size: 5 -*-*- *-*-* -*-*- *-*-* -*-*- ./chessboard Enter size: 7 -*-*-*- *-*-*-* -*-*-*- *-*-*-* -*-*-*- *-*-*-* -*-*-*- ./chessboard Enter size: 17 -*-*-*-*-*-*-*-*- *-*-*-*-*-*-*-*-* -*-*-*-*-*-*-*-*- *-*-*-*-*-*-*-*-* -*-*-*-*-*-*-*-*- *-*-*-*-*-*-*-*-* -*-*-*-*-*-*-*-*- *-*-*-*-*-*-*-*-* -*-*-*-*-*-*-*-*- *-*-*-*-*-*-*-*-* -*-*-*-*-*-*-*-*- *-*-*-*-*-*-*-*-* -*-*-*-*-*-*-*-*- *-*-*-*-*-*-*-*-* -*-*-*-*-*-*-*-*- *-*-*-*-*-*-*-*-* -*-*-*-*-*-*-*-*-As usual autotest is available to help you test your program.
~cs1511/bin/autotest lab04 chessboard.c
chessboard.c
// Written 14/3/2017 by Andrew Taylor (andrewt@unsw.edu.au) // as a lab example for COMP1511 // Print an nxn "chessboard" pattern of asterisks and spaces // // For example here is the output for n == 9 // // -*-*-*-*- // *-*-*-*-* // -*-*-*-*- // *-*-*-*-* // -*-*-*-*- // *-*-*-*-* // -*-*-*-*- // *-*-*-*-* // -*-*-*-*- #include <stdio.h> int main(void) { int size, n_numbers_read; int row, column; printf("Enter size: "); n_numbers_read = scanf("%d", &size); if (n_numbers_read != 1) { // scanf failed to read a number return 1; } if (size < 5 || size % 2 != 1) { printf("Error: size has to be odd and >= 5.\n"); return 1; } row = 0; while (row < size) { column = 0; while (column < size) { if ((row + column) % 2 == 1) { printf("*"); } else { printf("-"); } column = column + 1; } printf("\n"); row = row + 1; } return 0; }
./prime_factors Enter number: 6 The prime factorization of 6 is: 2 * 3 = 6 ./prime_factors Enter number: 30 The prime factorization of 30 is: 2 * 3 * 5 = 30 ./prime_factors Enter number: 22501 22501 is prime ./prime_factors Enter number: 2048 The prime factorization of 2048 is: 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2048 ./prime_factors Enter number: 22500 The prime factorization of 22500 is: 2 * 2 * 3 * 3 * 5 * 5 * 5 * 5 = 22500 ./prime_factors Enter number: 22501 22501 is primeHint: prime_factors.c requires a complex flow of control. Sketch out on paper the structure of your program. Your tutor may ask to see this.
Hint: prime_factors.c requires a declaring a number of variables and thinking carefully about how they will be used (choose good names). If you don't have the right variables, you'll get stuck writing the if and while statements.
Hint: prime_factors.c will require difficult debugging - think about where you can printf statements to see the value of variables and understand what your program is doing.
You are not permitted to use an array in this exercise.
Autotest is available to help you test your program.
~cs1511/bin/autotest lab04 prime_factors.c
prime_factors.c
// Find prime factors of a number // Written 26/3/2015 // by Andrew Taylor (andrewt@cse.unsw.edu.au) // as a lab example for COMP1911 #include <stdio.h> int main(int argc, char *argv[]) { int number, n, nFactors; int i; printf("Enter number: "); scanf("%d", &number); // To find all prime factors of a number, we simply go through all // numbers from 2 to the original number and see if the // original numbers is divisible by any of them. // We also need to take into account that there may be // multiple prime factors of the // same value, e.g. 12 = 2*2*3, so we have to keep dividing a number // by a factor until it is no longer divisible. i = 2; nFactors = 0; n = number; while (i < number) { if (n % i == 0) { if (nFactors == 0) { printf("The prime factorization of %d is:\n", number); } else { printf(" * "); } printf("%d", i); n = n / i; nFactors = nFactors + 1; } else { i = i + 1; } } if (nFactors == 0) { printf("%d is prime\n", number); } else { printf(" = %d\n", number); } return 0; }
spiral.c
that reads an integer n from standard input.
and prints an nxn pattern of asterisks and dashes in the shape of a spiral.
You can assume n is odd and >= 5.
You are only permitted to use C language features covered in weeks 1-3 lectures. In particular, you are not permitted to use array(s).
Make your program match the examples below exactly.
You are not permitted to use an array in this exercise.
./spiral Enter size: 5 ***** ----* ***-* *---* ***** ./spiral Enter size: 7 ******* ------* *****-* *---*-* *-***-* *-----* ******* ./spiral Enter size: 9 ********* --------* *******-* *-----*-* *-***-*-* *-*---*-* *-*****-* *-------* ********* ./spiral Enter size: 17 ***************** ----------------* ***************-* *-------------*-* *-***********-*-* *-*---------*-*-* *-*-*******-*-*-* *-*-*-----*-*-*-* *-*-*-***-*-*-*-* *-*-*-*---*-*-*-* *-*-*-*****-*-*-* *-*-*-------*-*-* *-*-*********-*-* *-*-----------*-* *-*************-* *---------------* *****************Try to invent your own solution - don't google or ask others how do it. Tutors want to see your original work even if it only partly works
As usual autotest is available to help you test your program.
~cs1511/bin/autotest lab04 spiral.c
spiral.c
//spiral.c //By Alex Rowell z5116848 //Written 20th/21st March 2017 //A program to print a spiral of stars #include <stdio.h> #include <stdlib.h> //A key part of this implementation is splitting the numbers into lines //These are the straight lines of numbers, with the first number coming from the line before //There are 4 cases to deal with each line based on which direction it would go when spiraling inwards //(For the example below 'r' is for lines going right, 'd' for lines going down, 'u' for lines going up and 'l' for lines going left) //eg. // rrrrr // ----d // urr-d // u---d // lllld int main(void) { int num; printf("Enter size: "); if (!scanf("%d", &num) || num % 2 == 0) { //Did not get a number or the number is even, exit return EXIT_FAILURE; } int row = 0; int col = 0; while (row < num) { col = 0; while (col < num) { if (row <= num/2 && row % 2 == 0 && col >= row - 1 && col <= num-row - 1) { //Line going to the right printf("*"); } else if (row > num/2 && row % 2 == 0 && col <= row && col >= num - row - 1) { //Line going to the left printf("*"); } else if (col <= num/2 && col % 2 == 0 && row >= col + 2 && row < num - col - 1) { //Line going upwards printf("*"); } else if (col > num/2 && col % 2 == 0 && row <= col && row >= num - col) { //Line going downwards printf("*"); } else { // Not part of any line printf("-"); } col = col + 1; } printf("\n"); row = row + 1; } return EXIT_SUCCESS; }Another solution for
spiral.c
// Prints an ascii spiral given a size >= 5 // Written 19/3/2017 // by Evan Kohilas (z5114986@unsw.edu.au) /* * Example for size = 17 * row, section: ... : formula * 0, 0: ***************** :"*-"x0 + "*"x17 + "-*"x0 * 1, 0: ----------------* :"*-"x0 + "-"x15 + "-*"x1 * 2, 1: ***************-* :"*-"x0 + "*"x15 + "-*"x1 * 3, 1: *-------------*-* :"*-"x1 + "-"x11 + "-*"x2 * 4, 2: *-***********-*-* :"*-"x1 + "*"x11 + "-*"x2 * 5, 2: *-*---------*-*-* :"*-"x2 + "-"x7 + "-*"x3 * 6, 3: *-*-*******-*-*-* :"*-"x2 + "*"x7 + "-*"x3 * 7, 3: *-*-*-----*-*-*-* :"*-"x3 + "-"x3 + "-*"x4 * 8, 4: *-*-*-***-*-*-*-* :"*-"x3 + "*"x3 + "-*"x4 * 9, 5: *-*-*-*---*-*-*-* :"*-"x4 + "-"x1 + "-*"x4 * 10, 5: *-*-*-*****-*-*-* :"*-"x3 + "*"x5 + "-*"x3 * 11, 6: *-*-*-------*-*-* :"*-"x3 + "-"x5 + "-*"x3 * 12, 6: *-*-*********-*-* :"*-"x2 + "*"x9 + "-*"x2 * 13, 7: *-*-----------*-* :"*-"x2 + "-"x9 + "-*"x2 * 14, 7: *-*************-* :"*-"x1 + "*"x13 + "-*"x1 * 15, 8: *---------------* :"*-"x1 + "-"x13 + "-*"x1 * 16, 8: ***************** :"*-"x0 + "*"x17 + "-*"x0 */ #include <stdio.h> int main(void){ int size; printf("Entire size: "); scanf("%d", &size); int i = 0; int offset; if (size % 4 == 3){ // if down spiral offset = 1; } else if (size % 4 == 1){ // if up spiral offset = 0; } else { printf("WARNING: INVALID SIZE\n"); offset = 0; } int mid = size/2 + offset; int mid_section = size/4 + offset; int max_section = size/2; int row = 0; while (row < size){ int section; if (row < mid) { section = row/2; } else if (row == mid){ section = mid_section; } else if (row > mid) { section = (row + 1)/2; } else { printf("WARNING: UNKNOWN CASE\n"); section = 0; } if (row == 0){ // first row i = 0; while (i < size){ printf("*"); i += 1; } } else if (row == 1){ // second row i = 0; while (i < (size - 1)){ printf("-"); i += 1; } printf("*"); } else if ((section < mid_section) && (row % 2 == 0)) { // even rows before middle //left i = 0; while (i < (section - 1)) { printf("*-"); i += 1; } //middle i = 0; while (i < ((size - 2) - ((section - 1) * 4))) { printf("*"); i += 1; } //right i = 0; while (i < section) { printf("-*"); i += 1; } } else if ((section < mid_section) && (row % 2 != 0)) { // odd rows before middle //left i = 0; while (i < section) { printf("*-"); i += 1; } //middle i = 0; while (i < ((size - 2) - (section * 4))) { printf("-"); i += 1; } //right i = 0; while (i < (section + 1)) { printf("-*"); i += 1; } } else if (section == mid_section) { // middle row //left i = 0; while (i < (section - 1)) { printf("*-"); i += 1; } //middle printf("***"); //right i = 0; while (i < (section - offset)) { printf("-*"); i += 1; } } else if ((section > mid_section) && (row % 2 != 0)) { // even rows after middle //left i = 0; while (i < (max_section - section + 1)) { printf("*-"); i += 1; } //middle i = 0; while (i < ((section - mid_section - 1)*4 + 1 + offset*2)) { printf("-"); i += 1; } //right i = 0; while (i < (max_section - section + 1)) { printf("-*"); i += 1; } } else if ((section > mid_section) && (row % 2 == 0)) { // odd rows after middle //left i = 0; while (i < (max_section - section)) { printf("*-"); i += 1; } //middle i = 0; while (i < ((section - mid_section)*4 + 1 + offset*2)) { printf("*"); i += 1; } //right i = 0; while (i < (max_section - section)) { printf("-*"); i += 1; } } else { // unknown cases printf(">>> WARNING: UNKNOWN ROW CASE <<<"); } row += 1; printf("\n"); } return 0; }
decimal_spiral.c
that reads an integer n from standard input.
and prints an nxn pattern of decimal digits and dashes in the shape of a spiral.
You can assume n is odd and >= 5.
You are only permitted to use C language features covered in weeks 1-3 lectures. In particular, you are not permitted to use array(s).
Make your program match the examples below exactly.
You are not permitted to use an array in this exercise.
./decimal_spiral Enter size: 5 65432 ----1 210-0 3---9 45678 ./decimal_spiral Enter size: 7 0987654 ------3 87654-2 9---3-1 0-012-0 1-----9 2345678 ./decimal_spiral Enter size: 9 876543210 --------9 8765432-8 9-----1-7 0-210-0-6 1-3---9-5 2-45678-4 3-------3 456789012 ./decimal_spiral Enter size: 15 654321098765432 --------------1 2109876543210-0 3-----------9-9 4-210987654-8-8 5-3-------3-7-7 6-4-87654-2-6-6 7-5-9---3-1-5-5 8-6-0-012-0-4-4 9-7-1-----9-3-3 0-8-2345678-2-2 1-9---------1-1 2-01234567890-0 3-------------9 456789012345678Try to invent your own solution - don't google or ask others how do it. Tutors want to see your original work even if it only partly works - this is a really hard problem.
As usual autotest is available to help you test your program.
~cs1511/bin/autotest lab04 decimal_spiral.c
decimal_spiral.c
//decimal_spiral.c //By Alex Rowell z5116848 //Written 20th March 2017 //A program to print a spiral of numbers, with the numbers increasing as it spirals outwards #include <stdio.h> #include <stdlib.h> //These are for the direction of the current line being printed (to be explained below) #define DIR_NONE 0 #define DIR_LEFT 1 #define DIR_RIGHT 2 #define DIR_UP 3 #define DIR_DOWN 4 //A key part of this implementation is splitting the numbers into lines //These are the straight lines of numbers, with the first number coming from the line before //There are 4 cases to deal with each line based on which direction it would go when spiraling inwards //(For the example below 'r' is for lines going right, 'd' for lines going down, 'u' for lines going up and 'l' for lines going left) //eg. // rrrrr // ----d // urr-d // u---d // lllld int main(void) { int num; printf("Enter size: "); if (!scanf("%d", &num) || num % 2 == 0) { //Did not get a number or the number is even, exit return EXIT_FAILURE; } // These are the sizes of the original lines, the right line starts // longer than the others since it doesn't have another direction that takes its first number // The up line starts shorter than the others since every time it gets to the upwards line the line // gets smaller int original_up_size = num - 3; int original_down_size = num - 1; int original_right_size = num + 1; int original_left_size = num - 1; //Determine the total number of numbers to write (so that it can count down) //This is done by simulating each side int total_stars = 0; int up_size = original_up_size; int down_size = original_down_size; int right_size = original_right_size; int left_size = original_left_size; while (up_size > 0) { total_stars = total_stars + up_size; up_size = up_size - 4; //Every go of the spiral, each side shrinks by 4 } while (down_size > 0) { total_stars = total_stars + down_size; down_size = down_size - 4; } while (right_size > 0) { total_stars = total_stars + right_size; right_size = right_size - 4; } while (left_size > 0) { total_stars = total_stars + left_size; left_size = left_size - 4; } int row = 0; int col = 0; while (row < num) { col = 0; while (col < num) { int line_num = 0; // The number of line changes in the spiral before this line int offset = 0; // The number along the line this position is int line_dir = DIR_NONE; //The direction the line's going (or none if a dash should be printed) if (row <= num/2 && row % 2 == 0 && col >= row - 1 && col <= num-row - 1) { //Line going to the right line_dir = DIR_RIGHT; line_num = (row / 2 * 4); offset = col - row + 2; } else if (row > num/2 && row % 2 == 0 && col <= row && col >= num - row - 1) { //Line going to the left line_dir = DIR_LEFT; line_num = ((num-row-1)/2 * 4) + 2; offset = row - col; } else if (col <= num/2 && col % 2 == 0 && row >= col + 2 && row < num - col - 1) { //Line going upwards line_dir = DIR_UP; line_num = (col / 2 * 4) + 3; offset = num - col - 1 - row; } else if (col > num/2 && col % 2 == 0 && row <= col && row >= num - col) { //Line going downwards line_dir = DIR_DOWN; line_num = ((num-col-1)/2 * 4) + 1; offset = row - num + col + 1; } if (line_dir != DIR_NONE) { // Reset the number of stars in the first line of each type // For calculating the number to print out up_size = original_up_size; down_size = original_down_size; right_size = original_right_size; left_size = original_left_size; int num_so_far = 0; //The total numbers that have been printed so far in the spiral int i = 0; while (i < line_num) { // Similar to calculating total number of numbers printed in the whole spiral // but in this case only go up to the current line if (i % 4 == 0) { // rightwards line num_so_far = num_so_far + right_size; right_size = right_size - 4; } else if (i % 4 == 1) { // downwards line num_so_far = num_so_far + down_size; down_size = down_size - 4; } else if (i % 4 == 2) { // leftwards line num_so_far = num_so_far + left_size; left_size = left_size - 4; } else { // i % 4 == 3, upwards line num_so_far = num_so_far + up_size; up_size = up_size - 4; } i = i + 1; } num_so_far = num_so_far + offset; // Include the amount printed in the current line int to_print = total_stars - num_so_far; // Subtract num_so_far from total_stars as // the spiral should be counting down as it goes inwards printf("%d", to_print % 10); // Only take last digit of what to print } else { printf("-"); // Not part of spiral, just print a dash } col = col + 1; } printf("\n"); row = row + 1; } return EXIT_SUCCESS; }
lab04
directory):
give cs1511 lab04 three_five.c perfect.c x.c plus.c chessboard.c prime_factors.c spiral.c decimal_spiral.cSubmit the challenge exercises only if you attempt them.
If you are working at home, you may find it more convenient to upload your work via give's web interface.
Remember the lab assessment guidelines - if you don't finish the exercises
you can finish them in your own time, submit them
by Monday 11:00am using give
and ask your tutor to assess them at the start of
the following lab.
Either or both members of a programming pair can submit the work (make sure each program lists both of you as authors in the header comment).