Your tutor has asked a lab pair to present their week 3 work.
Discuss the good, the bad and the ugly aspects of their code.
Please be gentle in any criticism - we are all learning!
1 1 1 1 6
2 2 2 5 4
int i; while (i < 100) { printf("%d\n", i); i = i + 1; }
int i = 0; int j = 0; while (j = 1 || i < 100) { printf("%d\n", i); i = i + 1; }
dcc should warn you about accidental uses of assignment in if/while conditions.
int i = 0; int n = 10; while (i < n) { printf("%d\n", i); n = n + i; i = i + 1; }
n = n + i
results in
n
growing faster than i
.
int i = 0; while (i < 10) printf("%d\n", i); i = i + 1;
numbers
numbers[2]
since C uses zero based indexing.
int numbers[20];
and your
program assigns a value to each element in the array, what is the
problem with the statement x = numbers[20];
?
Behaviour of a program that does this is undefined and it is possible, for example, that it will cause the program to terminate. Sometimes it will retrieve the value of another variable.
int squares[15];
Write a C code fragment to store, in each element of this array, the square of the index of that element, e.g., squares[5] would contain the value 25.
#include <stdio.h>
#define ELEMENTS 15
int main(void) {
int squares[ELEMENTS];
int i = 0;
while (i < ELEMENTS) {
squares[i] = i * i;
i = i + 1;
}
i = 0;
while (i < ELEMENTS) {
printf("squares[%d] has the value %d\n", i, squares[i]);
i = i + 1;
}
return 0;
}
#include <stdio.h>
int main(void) {
printf("%d\n", 13 < 42);
printf("%d\n", 13 < 42 || 42 > 50);
printf("%d\n", 13 < 42 && 42 > 50);
printf("%d\n", 13 && 42);
printf("%d\n", 13 || 42);
return 0;
}
Obviously your partner's code has to be completely rewritten, but
first figure out what it will print and why?
1 1 0 1 1Remember C logical and comparison operators actually return an int, 0 for false, 1 for true.
Your tutor may still choose to cover some of the questions time permitting.
./asterisks Please enter an integer: 5 * * * * *
asterisks.c
#include <stdio.h>
int main(void) {
int i, n;
printf("Please enter an integer: ");
scanf("%d", &n);
i = 0;
while (i < n) {
printf("*\n");
i = i + 1;
}
return 0;
}
#include <stdio.h>
int main(void) {
int number;
int row, column;
// Obtain input
printf("Enter size: ");
scanf("%d", &number);
row = 1;
while (row <= number) {
column = 1;
while (column <= number) {
printf("*");
column = column + 1;
}
printf("\n");
row = row + 1;
}
return 0;
}
The output if the user types in the number 5 is:
./square Enter size: 5 ***** ***** ***** ***** *****Modify the program so that it prints out a triangle like this:
./triangle Enter number: 5 ----* ---** --*** -**** *****
triangle.c
// Written 14/3/2017 by Andrew Taylor (andrewt@unsw.edu.au)
// as a lab example for COMP1511
// Print an nxn "triangle" 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;
}
row = 0;
while (row < size) {
column = 0;
while (column < size) {
if (column > size - row - 2) {
printf("*");
} else {
printf("-");
}
column = column + 1;
}
printf("\n");
row = row + 1;
}
return 0;
}
./diagonal Enter an integer: 10 *--------- -*-------- --*------- ---*------ ----*----- -----*---- ------*--- -------*-- --------*- ---------*
diagonal.c
// Written 14/3/2017 by Andrew Taylor (andrewt@unsw.edu.au)
// as a lab example for COMP1511
// Print an nxn "diagonal" 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;
}
row = 0;
while (row < size) {
column = 0;
while (column < size) {
if (row == column) {
printf("*");
} else {
printf("-");
}
column = column + 1;
}
printf("\n");
row = row + 1;
}
return 0;
}
./bars Enter an integer: 9 -*-*-*-*- -*-*-*-*- -*-*-*-*- -*-*-*-*- -*-*-*-*- -*-*-*-*- -*-*-*-*- -*-*-*-*- -*-*-*-*-
bars.c
// Written 14/3/2017 by Andrew Taylor (andrewt@unsw.edu.au)
// as a lab example for COMP1511
// Print an nxn "bars" 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 (column % 2 == 1) {
printf("*");
} else {
printf("-");
}
column = column + 1;
}
printf("\n");
row = row + 1;
}
return 0;
}
./rectangle Enter rectangle height and length: 3 5 ***** * * *****
rectangle.c
#include <stdio.h>
int main(void) {
int height, length;
int row, column;
printf("Enter rectangle height and length: ");
scanf("%d", &height);
scanf("%d", &length);
row = 0;
while (row < height) {
column = 0;
while (column < length) {
// If the index is on one of the edges, print *.
// Otherwise, print a space.
if (row == 0 || row == height - 1 || column == 0 ||
column == length - 1) {
printf("*");
} else {
printf(" ");
}
column = column + 1;
}
printf("\n");
row = row + 1;
}
return 0;
}
rectangle1.c
#include <stdio.h>
int main(void) {
int height, length;
int row, column;
int values_read;
printf("Enter rectangle height and length: ");
values_read = scanf("%d%d", &height, &length);
if (values_read != 2) {
printf("Two integers must be supplied as input.\n");
} else if (height < 1 || length < 1) {
printf("It is impossible to draw a rectangle with the given "
"height and length.\n");
} else {
row = 0;
while (row < height) {
column = 0;
while (column < length) {
// If the index is on one of the edges, print *.
// Otherwise, print a space.
if (row == 0 || row == height - 1 || column == 0 ||
column == length - 1) {
printf("*");
} else {
printf(" ");
}
column = column + 1;
}
printf("\n");
row = row + 1;
}
}
return 0;
}
./diamond Enter side length: 3 * * * * * * * * ./diamond Enter side length: 6 * * * * * * * * * * * * * * * * * * * *
diamond.c
#include <stdio.h>
int main(void) {
int side;
int row, column;
printf("Enter side length: ");
scanf("%d", &side);
row = 0;
while (row < side * 2 - 1) {
column = 0;
while (column < side * 2 - 1) {
if (row <= (side - 1)) {
if (column == (side - 1) - row ||
column == (side - 1) + row) {
printf("*");
} else {
printf(" ");
}
} else {
if (column == row - (side - 1) ||
column == 3 * (side - 1) - row) {
printf("*");
} else {
printf(" ");
}
}
column = column + 1;
}
printf("\n");
row = row + 1;
}
return 0;
}
./read_ints Please enter some integers: 10 -90 100 999 78hello You entered 5 integers ./read_ints Please enter some integers: 1 2 3 4 5 6 7 8 9 10 11 12 hello You entered 12 integers
read_until_non_integer.c
#include <stdio.h>
#define N 10
int main(void) {
int n, return_code;
int count;
printf("Please enter some integers:\n");
count = 0;
return_code = scanf("%d", &n);
while (return_code == 1) {
count = count + 1;
return_code = scanf("%d", &n);
}
printf("You entered %d integers\n", count);
return 0;
}
./multiplication_table Enter multiplication table size: 5 1| 1 2 3 4 5 2| 2 4 6 8 10 3| 3 6 9 12 15 4| 4 8 12 16 20 5| 5 10 15 20 25
multiplication_table.c
#include <stdio.h>
int main(void) {
int row = 1, col = 1;
int table_size;
printf("Enter multiplication table size: ");
scanf("%d", &table_size);
while (row <= table_size) {
col = 1;
while (col <= table_size) {
if (col == 1) {
printf("%2d|", row);
}
printf("%4d ", row * col);
col = col + 1;
}
printf("\n");
row = row + 1;
}
return 0;
}
./guess_number Random number is between 1 and 100. Enter your guess: 50 Random number is between 1 and 50. Enter your guess: 40 Random number is between 1 and 40. Enter your guess: 37 Yay, you guessed the number 37 correctly! ./guess_number Random number is between 1 and 100. Enter your guess: 80 Random number is between 80 and 100. Enter your guess: 90 Random number is between 80 and 90. Enter your guess: 85 Random number is between 80 and 85. Enter your guess: 83 Random number is between 80 and 83. Enter your guess: 82 Yay, you guessed the number 82 correctly!
guess_number.c
// let a user guesses a random number 1..100 inclusive .
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100
int main(void) {
int guess;
// seed pseudo-random number generator with current time
srand(time(NULL));
// rand() returns a pseudo-random number
int random_number = 1 + rand() % MAX;
int min = 1;
int max = MAX;
// set guess to an impossible value so loop will be entered
guess = -1;
while (guess != random_number) {
printf("Random number is between %d and %d.\n", min, max);
printf("Enter your guess: ");
// we should check the scan succeeds here
scanf("%d", &guess);
if (guess > random_number && max > guess) {
max = guess;
}
if (guess < random_number && min < guess) {
min = guess;
}
}
printf("\n_yay, you guessed the number %d correctly!\n\n", guess);
return 0;
}
3 + 5 * 10 - 12
a > 5 || b < 3
a = b > c && b || d
!a || a && c
Figuring this out can be a bit tedious and prone to errors. The moral? In complex expressions make your intention explicit by using parentheses.
Note: The precedence rules of arithmetic operators in C follow the conventions used in mathematics.
int input_num, i; printf("Enter a number: "); scanf("%d", &input_num); i = input_num; if (i <= 5) { printf("%d\n", i * i); i++; }
int input_num, i; printf("Enter a number: "); scanf("%d", &input_num); i = input_num; while (i <= 5) { printf("%d\n", i * i); i++; }