Question | Mark |
1. Write a program [7 marks] | |
2. Write a function [7 marks] | |
3. Modify a function [7 marks] | |
4. Show the output [7 marks] | |
5. Implement an algorithm [7 marks] | |
Exam Total [35 marks] |
Question 1: Write a program [7]
Write a complete and correct C++ program as described below.
SAMPLE SOLUTION #include <cstdio> const int NumValues = 1000; int main() { float Values[NumValues]; printf("Please enter %d numbers\n", NumValues); for (int i = 0; i < NumValues; i++) { float val; scanf("%g", &val); Values[i] = val; } printf("Please enter a maximum value\n"); float maxVal; scanf("%g", &maxVal); printf("The values less than %g are:\n", maxVal); for (int i = 0; i < NumValues; i++) { if (Values[i] < maxVal) { printf("%g\n", Values[i]); } } return 0; } |
Question 2: write a function [7]
Write a complete and correct C++ function that fulfills the requirements below:
SAMPLE SOLUTION int PrintBetween(int low, int high) { int sum = 0; for (int i = low+1; i < high; i++) { printf("%d\n", i); sum += i; } return sum; } |
Question 3: modify a function [7]
(I) Rewrite the function below to use a while loop rather than the for loop (keeping the functionality as close as possible to the original).
// reverse the contents of an array void reverse(long data[], int size) { // work from the ends to the middle of the array, // swapping the characters in the two opposing positions int midpoint = size/2; for (int p = 0; p < midpoint; p++) { int opposite = size - (1 + p); int oldP = data[p]; data[p] = data[opposite]; data[opposite] = oldP; } } |
SAMPLE SOLUTION void reverse(long data[], int size) { int midpoint = size/2; int p = 0; while (p < midpoint) { int opposite = size - (1 + p); int oldP = data[p]; data[p] = data[opposite]; data[opposite] = oldP; p++; } } |
(II) Rewrite the function below to use a do-while loop rather than recursion.
// find the last array position containing the target value // and return it, // return -1 if the target is nowhere in the array int findLast(float arr[], int currPos, float target) { if (currPos < 0) { return -1; } else if (arr[currPos] == target) { return currPos; } else { int result = findLast(arr, currPos-1, target); return result; } } | SAMPLE SOLUTION int findLast(float arr[], int currPos, float target) { do { if (currPos < 0) { return -1; } else if (arr[currPos] == target) { return currPos; } else { currPos--; } } while (currPos >= 0); return -1; } |
Question 4: Show the output [7]
Show the output produced by the draw function below if the following call is made
( assuming the call comes from within an otherwise
valid program of course):
draw(4,8);
void draw(int x, long y) { long c = 1; for (int i = 0; i < x; i++) { long tmp = 5; printf("%d:", i); while (c < y) { printf("%ld", tmp); tmp++; c = c+2; } printf("\n"); c = c + i - x; } } | SAMPLE SOLUTION 0:5678 1:56 2:5 3:5 |
Question 5: Implement an algorithm [7]
Write the function shown in the prototype below, following the algorithm in the comments as closely as possible.
// return the position at which the pattern first appears in the given string, // or -1 if not found // the function assumes the string and the pattern are null-terminated // e.g. findMatch("test", "mytest"); would return 2, // findMatch("test", "testing"); would return 0, // findMatch("test", "stuff"); would return -1 int findMatch(char pattern[], char text[]); // Algorithm: // create integer variables for the current text position, // the length of the pattern, and the length of the text // start the text position at 0, // use the strlen function to set the lengths of pattern and text // create a boolean variable to keep track of whether or not // we have found a match yet, and initialize it to false // while found is false and the text position plus pattern length // is smaller than the text length, do the following: // set the match found variable to true // for each position, p, from 0 to the pattern length - 1, // if the pattern character in position p does NOT // match the text character in position textPos + 1, // set the match found variable to false // after the for loop ends, if found is still true // then we have found a match, return the text position // otherwise increment the text position // after the while loop ends, we must not have found a match, // so return -1 // |
SAMPLE SOLUTION // return the position at which the pattern first appears in the given string, // or -1 if not found int findMatch(char *pattern, char *str) { int strPos = 0; int patLen = strlen(pattern); int totLen = strlen(str); bool found = false; while (((strPos + patLen) <= totLen) && !found) { found = true; for (int p = 0; p < patLen; p++) { if (pattern[p] != str[strPos + p]) { found = false; } } if (found) { return strPos; } else { strPos++; } } return -1; } |
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 input with scanf, fgets, and getc (cstdio library) ========================================================= 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("%[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("%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 printf("The value of %d times %g is %g\n", i, f, (i*f)); // combined example 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; b = temp; } float f = calc(i, 2.5); } int array[20]; void initArray(int arr[], int size) initArray(array, 20); { } for (int i = 0; i < size; i++ arr[i] = 0; }