| Question | Mark |
| 0. Write a program [8 marks] | |
| 1. Nested loops [8 marks] | |
| 2. Scope and parameters [8 marks] | |
| 3. Writing functions [8 marks] | |
| 4. Recursion [8 marks] | |
| 5. Arrays and searching [8 marks] | |
| 6. Command line args [8 marks] | |
| 7. File I/O [8 marks] | |
| 8. Structs [8 marks] | |
| 9. Dynamic allocation [8 marks] | |
| 10. Pointers, structs, and linked lists [8 marks] | |
| Exam Total [80 marks] |
Question 0: Write a program [8]
Write a complete and correct C++ program that meets the following specifications:
Question 1: Nested loops [8]
Write the printFactors function following the algorithm below, using ints for all variables. (Assume cmath has been included.)
void printFactors(int n) // for each integer x from 1 to n (inclusive) // limit = sqrt x // for each integer f from 1 to limit (inclusive) // if f evenly divides x then: // d = x / f // print a message saying f and d are factors of x
Question 2: Scope and parameters [8]
The program below is a valid (though unusual) C++ program that uses a variety of different variable scopes. Study the program carefully, and show the precise output produced by the program.
#include <cstdio>
const int X = 1;
const int Y = 2;
void swap(int &X, int Y);
int f(int &X);
int main()
{
int X = 3;
swap(X, Y);
printf("main(%d,%d)\n", X, Y);
int Y = f(Y) * X;
}
void swap(int &X, int Y)
{
int tmp = Y;
X = Y;
X = tmp;
printf("swap(%d,%d)\n", X, Y);
}
int f(int &X)
{
X = 4;
int Y = 1;
printf("f1(%d,%d)\n", X, Y);
do {
int X = Y*6;
printf("f2(%d,%d)\n", X, Y);
X--;
Y++;
} while (Y < X);
return X;
}
Question 3: Writing functions [8]
Write the two functions prototyped below.
// returns the negated square of x // e.g. negSquare(3) returns -9 double negSquare(double x); // alters the first n array values, // multiplying each by s void scale(float a[], int n, float s);
Question 4: Recursion [8]
Show the six lines of output produced by the following (valid) program:
#include <cstdio>
void mix(char arr[], int left, int right);
void swap(char &x, char &y);
int main()
{
char arr[6] = "abcde";
mix(arr, 1, 3);
}
void mix(char arr[], int left, int right)
{
if (left > right) {
return;
} else if (left == right) {
printf("%s\n", arr);
} else {
mix(arr, left+1, right);
for (int pos = left+1; pos <= right; pos++) {
if (arr[left] != arr[pos]) {
swap(arr[left], arr[pos]);
mix(arr, left+1, right);
swap(arr[left], arr[pos]);
}
}
}
}
void swap(char &x, char &y)
{
char tmp = x;
x = y;
y = tmp;
}
Question 5: Arrays and searching [8]
Write a C++ function that meets the specifications below:
Question 6: Command line arguments [8]
Part 1: Write a function that meets the following specifications:
Part 2:Write a main routine that:
Question 7: File I/O [8]
Write a function that has a bool return type and takes three parameters: two character arrays (file1, file2), and an integer value (n).
The function copies the first n characters of file1 into file2, with appropriate error checking.
The function returns true if both files opened successfully and all n characters were copied successfully and false otherwise.
Question 8: Structs [8]
Given the struct definition and the two function prototypes below, complete the implementation of the functions.
// the maximum number of values in a data set
const int MaxVals = 500;
// a data set is a collection of up to 500 values,
// numVals records how many are actually stored at the moment
struct DataSet {
double values[MaxVals];
int numVals;
};
// calculate and return the average of the values in data set d
// (i.e. the sum of the values / the number of values)
double average(DataSet d);
// calculate and return the average of all the data sets in array S
// (the sum of the data set averages / the number of data sets)
double overallAverage(DataSet S[], int numSets);
Question 9: Dynamic allocation [8]
Suppose that someone else has written a function processarray with the following specifcations:
// the function does something with the contents of the array of floats void processarray(float arr[], int size);Your task is to write a main routine that:
Question 10: Pointers, structs, and linked lists [8]
Part I: Given the struct definition and the function prototype below, complete the implementation of the function.
// stores a time as three integer values, hour (1-12), minutes (0-59), seconds (0-59)
struct time {
int hour, minute, second;
};
// displays a time in the format hh:mm:ss
// e.g. 12:05:15
void display(time *tptr);
Part II: Given the struct definition and function prototype below, complete the implementation of the function. Be sure to include all appropriate null-pointer checking.
// Fraction represents an individual fraction (numerator/denominator)
// that can be held as one element of a doubly-linked list
struct Fraction {
long numerator, denominator; // the Fraction data fields
Fraction *next; // pointer to the next Fraction in the list (i.e. closer to the back)
Fraction *prev; // pointer to the next Fraction in the list (i.e. closer to the front)
};
// given pointers to the front and back of the list, and a pointer to the
// fraction, f, to be inserted,
// inserts the supplied fraction supplied fraction at the back of the list,
// returning true if successful, false otherwise
bool insertF(Fraction* &front, Fraction* &back, Fraction* f);
CSCI 160 Exam Quick Reference Sheet: Sections F16N01-F16N04
Comments: Single line //
or Multi-line /* ....
.... */
C++ operators
=============
Arithmetic operators: + - * / % ++ --
Assignment operators: = += -= *= /= %=
Boolean operators: && || ! == != <= >= < >
Data Types
=======================================================
Data Keywords Literal Examples Special values
integers: short, int, long 3, -200, 0 INT_MAX, INT_MIN (climits library)
reals: float, double 3.14, -0.0003 FLT_MAX, FLT_MIN (cfloat library)
character: char 'x' \' \" \\ \t \n \0
boolean: bool true, false
Sample variable declarations (with/without initialization)
==========================================================
int i; int i = 3;
char c; char c = 'Q'; char c = '\n';
bool b; bool b = true;
long arr[5]; long arr[5] = { 0, 0, 0, 0, 0 }; // array assignment only valid
char str[10]; char str[] = "some text"; // at point of declaration
Sample constant declarations
============================
const double Pi = 3.1415;
const char[] ErrMsg = "Error: something terrible happened!\n";
Sample enumerated type definitions
==================================
enum Weekdays { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
enum Commands { Quit = 'Q', Continue = 'C', Print = 'P' };
Sample input with scanf, fgets, and getc (cstdio library)
=========================================================
// scanf returns a count of the number of variables "filled"
scanf("%c", &x); // read a character into char variable x
scanf("%d", &i); // read an integer into int variable i
scanf("%ld", &n); // read an integer into long variable n
scanf("%g", &f); // read a real number into float variable f
scanf("%s", &a); // read text into variable a (char[])
scanf("%*s"); // read and discard the next word of input
scanf("%[abc]", &x); // read an a, b, or c into variable x
scanf("%*[ \t\n]%c", &x); // skip tabs, spaces, and newlines and read next char into x
scanf("%4d", &i); // read a maxium of 4 digits into int variable i
fgets(arr, 100, stdin); // read the rest of the line (up to 100 chars max) into the char array
x = getc(stdin); // read a single character into char variable x
ungetc(c, stdin); // take char c and push it into the input buffer
Sample output with printf (cstdio library)
==========================================
// printf returns a count of the number of characters printed
printf("%c", x); // print the contents of char variable c
printf("%d", i); // print the contents of int variable i
printf("%ld", n); // print the contents of long variable n
printf("%g", f); // print the contents of float variable f
// (%f gives fixed point, %e gives exponential notation, %g can do either)
printf("%5.2g, f); // print the contents of f with width 5, 2 decimal places
printf("%s", a); // print the contents of character array a
Some useful library functions and constants
===========================================
cctype cfloat cmath
------ ------ -----
bool isalpha(char) FLT_MIN, FLT_MAX double ceil(double)
bool isalnum(char) DBL_MIN, DBL_MAX double floor(double)
bool isdigit(char) double fabs(double)
bool islower(char) climits double log(double)
bool isupper(char) ------- double pow(double, double)
bool ispunct(char) CHAR_MIN, CHAR_MAX double cos(double)
bool isspace(char) SHORT_MIN, SHORT_MAX // also acos, sin, asin, tan, atan
char tolower(char) INT_MIN, INT_MAX double sqrt(double)
char toupper(char) LONG_MIN, LONG_MAX
cstring cstdlib
------- -------
char* strcat(char*, char*) int abs(int)
char* strncat(char*, char*, int) int atoi(char*)
char* strcpy(char*, char*) float atof(char*)
char* strncpy(char*, char*, int) void srand(time(NULL)) // needs ctime lib
int strcmp(char*, char*) int rand(int)
int strncmp(char*, char*, int)
int strlen(char*)
Sample control structures
=========================
if (expr) { // works on short, int, long, for (x = 1; x < 9; x++) {
....... // char, or enum values ....
} else if (expr) { switch (expr) { }
........ case value1:
} else { ..... while (x < 9) {
........ break; ....
} case value2: x++;
..... }
// is X between 3 and 9? break;
if ((3 < X) && (X < 9)) { default: do {
// yes it is ..... ....
} else { break; x++;
// no it isn't }; } while (x < 9);
}
Sample function prototypes and implementations Sample calls
============================================== ============
void swap(int &a, int &b); float calc(int x, float f) int main()
...... ..... {
void swap(int &a, int &b) float calc(int x, float f) int i = 1;
{ { int j = 2;
int temp = a; float result = x * f; swap(i, j);
a = b; return result; float f = calc(i, 2.5);
b = temp; } int array[20];
} initArray(array, 20);
}
void initArray(int arr[], int size)
{
for (int i = 0; i < size; i++
arr[i] = 0;
}
Pointer examples
================
int i; // an integer variable i
int *iPtr; // iPtr can point at integers in memory
iPtr = &i; // iPtr now points at variable i (& takes the address of i)
(*iPtr) = 3; // store 3 whereever iPtr points in memory
Sample function prototype with a pointer passed by reference
============================================================
void doSomething(int* &ptr);
Dynamic memory allocation and deallocation
==========================================
using new/delete using malloc/free
---------------- -----------------
int *i = new int; int *i = (int*)malloc(sizeof(int); // alloc new int
delete i; free i; // free the int
float *f = new float[10]; float *f = (float*)malloc(sizeof(float)); // alloc new arr of floats
delete [] f; free f; // free the array
// remember to test for NULL after any call to new or malloc
Sample struct definition and use
===================================
struct Info { Info i;
char initials[2]; i.id = 0;
int id; i.value = -34.216;
float value; i.initials[0] = 'D';
};
The C++ string class (using the library)
====================
std::string str; // declare a string variable str
str = "blah blah blah"; // assign text to a string
printf("%s", str.c_str()); // print the string contents
str[3] = 'x'; // change the fourth character in the string to x