6.6. Exercises#

Many of these exercises are taken from past exams of APS105 Computer Fundamentals courses at University of Toronto. The solutions are provided in the answer boxes.

Headings in this page classify the exercises into different categories: [Easy], [Intermediate], and [Challenging]. I suggest you start by easy exercises and work your way up to the challenging ones.

Question 9 in Fall 2013 Midterm Exam [Easy]

Determine the values of the variables W, X, Y and Z after the function SumEm executes in the main program of the following C program:

#include <stdio.h>
void SumEm(int *A, int B, int C, int *D) {
  if (B > C) {
    *A = B + *D;
    *D = C;
  } else {
    *A = C + *D;
    *D = B;
  }
  return;
}
int main(void) {
  int W, X, Y, Z;
  W = 0;
  X = 5;
  Y = 8;
  Z = 10;
  SumEm(&W, X, Y, &Z);
  return 0;
}
W =
X =
Y =
Z =

Question 1 in Winter 2017 Final Exam [Easy]

Find and correct all compile-time errors (mistakes that would cause compilation or that would cause the ‘build’ to fail) in the following C program. Your answer should both identify what the error is, and what the correction should be. Marks will be deducted if you identify correct items as compile-time errors.

#include <stdio.h>
int main(void) {
  int j, k;
  int *i = &j;
  for (*i = 0; *i < 10, *i = *i + 1) {
    scanf("%d", &k);
    printf("%d", (*i) * (*i) * (*i));
  }
}

Question 1 in Fall 2014 Midterm Exam [Easy]

What will be printed when the following C program is executed?

int main(void) {
  int first = 1, second = 10;
  int *pointerToFirst, *pointerToSecond;

  pointerToFirst = &first;
  pointerToSecond = &second;
  *pointerToFirst = *pointerToSecond - *pointerToFirst;
  *pointerToSecond = *pointerToSecond - *pointerToFirst;
  *pointerToFirst = *pointerToSecond + *pointerToFirst;
  printf("%d, %d\n", first, second);
}

Question 6 in Winter 2017 Midterm Exam [Easy]

Consider the following code, which uses pointers:

int a, b, c, d;
int *e, *f;
a = 5;
b = 6;
e = &c;
f = &d;
*e = a + b;
*f = *e + b;
e = &a;
f = &b;
*e = c + d;
*f = a + b;

What are the values of the variables a and b after this code is executed?

Question 5 in Winter 2018 Midterm Exam [Intermediate]

Write the output of the following program.

#include <stdio.h>
int main(void) {
  int *p, x;
  int fiveInt[5] = {1, 2, 3, 4, 5};
  int *q;
  p = NULL;
  q = fiveInt;
  x = 6;
  p = &x;
  printf("A: %d %d\n", x, *p);
  *(q + 3) = *p;
  *p = *q + *(q + 3);
  printf("B: %d %d %d\n", x, *p, *q);
  return 0;
}

Modified version of Question 6 in Winter 2018 Midterm Exam [Intermediate]

Identify the potential runtime error in the following code and briefly explain how you would fix it.

#include <stdio.h>
int higher(int *m, int *n) {
  int isHigher;
  if (m >= n)
    isHigher = m;
  else
    isHigher = n;
  return &isHigher;
}
int main(void) {
  int c = 9, d = 8;
  int isHigher;
  isHigher = higher(&c, &d);
  printf("%d\n", isHigher);
  return 0;
}

Question 9 in Winter 2019 Midterm Exam [Intermediate]

There are \(0.3048\) metres in a foot, \(100\) centimetres in a metre, and \(12\) inches in a foot. Write a program that will accept, as input, a length in feet and inches. You do not have to check for valid input – assume the user enters positive, non-fractional values for the feet and inches. The program will output the equivalent length in metres and centimetres (rounded to the nearest centimetre).

Your code should include four functions: one for input, one for output, one to perform the calculation, and main. The function prototypes are below. For full marks, your code should not use any global variables.

void getInput(int *outFeet, int *outInches);
void printOutput(int feet, int inches, int metres, int centimetres);
void convert(int feet, int inches, int *outMetres, int *outCentimetres);

An example of one run of the program is below:

Please enter the feet and inches to convert: 5 10
5 feet 10 inches is 1 metres and 78 centimetres

Question 13 in Winter 2014 Midterm Exam [Challenging]

In this question, you are to complete the code for a function and its calling in a main program. The function is called sumAndProductOfMultiples. It takes integers multiple1 and multiple2, and a maximum bound max as input, and computes both the sum and the product of all the positive integers less than max that are multiples of either multiple1 or multiple2.

For example, if multiple1 = 3, multiple2 = 5, and max = 10, the positive integers less than \(10\) that are multiples of either \(3\) or \(5\) are \(3\), \(5\), \(6\), \(9\). Their sum is \(23\), and their product is \(810\). The function must return the sum and product values via pointer parameters sumPtr and productPtr, as implied in the skeleton code below.

In the code skeleton below, you are given most of the main function, but you must give the call to the sumAndProductOfMultiples function. After that you are given just the declaration line of the function, and you must write the remainder of the function.

#include <stdio.h>
void sumAndProductOfMultiples(int multiple1, int multiple2, int max,
                              int* sumPtr, int* productPtr);

int main(void) {
  int multi1 = 3, multi2 = 5, max = 10;
  int sum, product;
  // add your call to sumAndProductOfMultiples here:
  
  printf("m1 = %d, m2 = %d, max = %d, sum = %d, product = %d\n", multi1, multi2,
         max, sum, product);
  return 0;
}
void sumAndProductOfMultiples(int multiple1, int multiple2, int max,
                              int* sumPtr, int* productPtr) {
                
                              }

Question 5 in Winter 2022 Midterm Exam [Challenging]

In the box provided below, write the output generated after the following program is completely executed.

#include <stdio.h>
int main(void) {
  int first = 1, second = 2, data[4] = {10, 20, 30, 40};
  int *third = &second, *fourth = &first, *fifth = data + first + 1;
  (*third)++;
  (*fourth)++;
  data[second] = *fifth + first + *third + *fourth;
  printf("first = %d, second = %d, third = %d, fourth = %d, fifth = %d\n",
         first, second, *third, *fourth, *fifth);
  for (int i = 0; i < 4; i++) {
    printf("%d, ", data[i]);
  }
  printf("\n");
  return 0;
}