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 thelibrary) ==================== 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