Your tutor has asked a lab pair to present their week 4 work.
Discuss the good, the bad and the ugly aspects of their code.
Please be gentle in any criticism - we are all learning!
Hidden Sequence | Guess |
---|---|
4 4 4 4 | 4 4 4 4 |
1 1 1 1 | 4 4 4 4 |
1 4 1 1 | 4 4 1 4 |
1 1 4 1 | 4 4 1 4 |
1 2 3 4 | 4 3 2 1 |
1 2 3 4 | 2 1 3 4 |
5 6 7 8 | 6 6 7 7 |
1 8 2 7 | 7 8 1 2 |
1 1 2 3 | 4 1 1 1 |
1 2 2 1 | 2 2 2 2 |
Hidden Sequence | Guess | Farnarkles | Arkles |
---|---|---|---|
4 4 4 4 | 4 4 4 4 | 4 | 0 |
1 1 1 1 | 4 4 4 4 | 0 | 0 |
1 4 1 1 | 4 4 1 4 | 2 | 0 |
1 1 4 1 | 4 4 1 4 | 0 | 2 |
1 2 3 4 | 4 3 2 1 | 0 | 4 |
1 2 3 4 | 2 1 3 4 | 2 | 2 |
5 6 7 8 | 6 6 7 7 | 2 | 0 |
1 8 2 7 | 7 8 1 2 | 1 | 3 |
1 1 2 3 | 4 1 1 1 | 1 | 1 |
1 2 2 1 | 2 2 2 2 | 2 | 0 |
srand(time(NULL)); printf("%d\n", rand() % 6 + 1);
srand(time(NULL)) initialized the random number generation with the current time
rand() returns a pseudo-random integer
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; // The next two lines is what the question asks you to do i = 0; while (i < ELEMENTS) { squares[i] = i * i; i = i + 1; } // Let's print the array to check i = 0; while (i < ELEMENTS) { printf("squares[%d] has the value %d\n", i, squares[i]); i = i + 1; } return 0; }
int array_length(int nums[])which returns the number of elements in the array
nums
.
It is not possible for a C function to determine the length of an array it has been passed.
Programmers usually do one of 3 things.
int test_all_initialized(int nums[])which returns 1 if all elements of array
nums
are initialized, otherwise returns 0.
It is not possible at runtime in C to determine if a variable has been initialized
C programmers must take care to ensure that all variables, including array elements, are appropriately initialized.
int not_in_int_array(int nums[], int n, int x);
int not_in_int_array(int nums[], int n, int x) { int i; i = 0; while (i < n) { if (nums[i] == x) { return 0; } i = i + 1; } return 1; }
int dot_product(int vector1[VECTOR_LENGTH], int vector2[VECTOR_LENGTH])
Reminder: you calculate the dot product by multiplying corresponding elements and summing the result.
So the dot-product of 1 3 1 3 2 and 2 1 2 1 2 is 14.
dot_product
includsing a main function for testing.
#include <stdio.h> #define VECTOR_LENGTH 10 int dot_product(int vector1[VECTOR_LENGTH], int vector2[VECTOR_LENGTH]) { int i, dot_product; dot_product = 0; i = 0; while (i < VECTOR_LENGTH) { dot_product = dot_product + vector1[i] * vector2[i]; i = i + 1; } return dot_product; } int main(void) { int vector1[VECTOR_LENGTH]; int vector2[VECTOR_LENGTH]; int i; printf("Enter vector 1 of %d positive numbers: ", VECTOR_LENGTH); i = 0; while (i < VECTOR_LENGTH) { scanf("%d", &vector1[i]); i = i + 1; } printf("Enter vector 2 of %d positive numbers: ", VECTOR_LENGTH); while (i < VECTOR_LENGTH) { scanf("%d", &vector2[i]); i = i + 1; } printf("Their dot-product is %d.\n", dot_product(vector1, vector2)); return 0; }
Your tutor may still choose to cover some of the questions time permitting.
It should have this prototype:
double max_value(double array[], int length)
max_value
includsing a main function for testing.
#include <stdio.h> #define MAX_NUMBERS 100000 double max_value(double array[], int length) { double max = array[0]; int i; i = 1; while (i < length) { if( array[i] > max ) { max = array[i]; } i = i + 1; } return max; } int main(void) { double numbers[MAX_NUMBERS]; int n_numbers, number_read; n_numbers = 0; number_read = 1; while (number_read == 1 && n_numbers < MAX_NUMBERS) { number_read = scanf("%lf", &numbers[n_numbers]); n_numbers = n_numbers + 1; } printf("Maximum of the numbers is %lf\n", max_value(numbers, n_numbers)); return 0; }
It should have this prototype:
int increasing(double array[], int length)
increasing
that includes a main function for testing.
#include <stdio.h> #define MAX_NUMBERS 100000 int increasing(int array[], int length) { int i; i = 1; while (i < length) { if (array[i - 1] >= array[i]) { return 0; } i = i + 1; } return 1; } int main(void) { int numbers[MAX_NUMBERS]; int n_numbers, number_read; n_numbers = 0; number_read = 1; while (number_read == 1 && n_numbers < MAX_NUMBERS) { number_read = scanf("%d", &numbers[n_numbers]); n_numbers = n_numbers + 1; } if (!increasing(numbers, n_numbers-1)) { printf("The numbers are not in increasing order\n"); } else { printf("The numbers are in increasing order\n"); } return 0; }
occur.c
which reads 6 numbers then reads another number
and prints how many times that number occurred in the first 5.
For example:
./occur Enter 6 numbers: 1 3 1 3 1 9 Enter a number: 1 1 occurred 3 times in the 6 numbers readMake sure you make you make it very easy to change how many numbers the program reads.
occur.c
#include <stdio.h> #define N_NUMBERS 6 int main(void) { int x[N_NUMBERS], i, j, match, count; printf("Enter %d numbers: ", N_NUMBERS); i = 0; while (i< N_NUMBERS) { scanf("%d", &x[i]); i = i + 1; } count = 0; printf("Enter a number: "); scanf("%d", &match); j = N_NUMBERS - 1; while (j >= 0) { if (x[j] == match) { count = count + 1; } j = j - 1; } printf("%d occurred %d times in the %d numbers read\n", match, count, N_NUMBERS); return 0; }
int x; int a[6]; x = 10; a[3 * 2] = 2 * 3 * 7; printf("%d\n", x);mysteriously printed
42
. How could this happen when x
is clearly
assigned only the value 10
?
How can you easily detect such errors before they have mysterious effects?
42
to a[6]
an array element that does not exist.
The result of this is undefined.
In this case the value 42
has apparently been assigned to the variable x
.
Silently changing another variable is a common consequence of use of an an illegal array index.
Subtler and more confusing behaviour are also quite possible.
If you are using a CSE machine you can compile the program with dcc
.
It produces a program which will stop immediately with a clear error message if an invalid array index is used.
So if 9 numbers were entered the program should print the 5th number entered. And if 27 numbers were entered the program should print the 14th number entered.
If an even number of numbers is entered there are two middle numbers, print the second of them.
For example if 8 numbers are entered, prints the 5th.
You can assume at most 10,000 numbers will be entered.
middle.c
#include <stdio.h> #define MAX_NUMBERS 10000 int main(void) { int numbers[MAX_NUMBERS]; int num_read = 1; int length = 0; while (num_read == 1 && length < MAX_NUMBERS) { num_read = scanf("%d", &numbers[length]); if (num_read == 1) { length = length + 1; } } printf("The middle number is %d\n", numbers[length / 2]); return 0; }
double average(int numbers[], int num_elements);
double maxDifference(int numbers[], int num_elements);