Question | Mark |
1. Write a program [6 marks] | |
2. Write and call a function [6 marks] | |
3. Show the output [6 marks] | |
4. Modify a function [6 marks] | |
5. Write a program [6 marks] | |
Exam Total [30 marks] |
Question 1: Write a program [6]
Write a complete and correct C++ program that meets the following specifications:
A sample run of the program is shown below (with the user input illustrated in bold italics):
Please enter three integers: 17 4 11 Your values (from smallest to biggest) were: 4 11 17 |
// Sample solution 1 #include <cstdio> // swap exchanges the values of the two parameters passed to it void swap(int &a, int &b); int main() { // get and store the three values printf("Please enter three integers:\n"); int x, y, z; scanf("%d", &x); scanf("%d", &y); scanf("%d", &z); // first, rearrange so the smallest value winds up in x // and the two bigger values wind up in y and z if (x > y) { swap(x, y); } if (x > z) { swap(x, z); } // now rearrange y and z if necessary if (y > z) { swap(y, z); } // display the results printf("Your values (from smallest to biggest) were:\n"); printf("%d %d %d\n", x, y, z); } void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; } | // Sample solution 2 #include <cstdio> int main() { // get and store the three values printf("Please enter three integers:\n"); int x, y, z; scanf("%d", &x); scanf("%d", &y); scanf("%d", &z); // as we go, we'll figure out which is biggest, smallest, and middle int small, med, big; if (x > y) { if (y > z) { small = z; med = y; big = x; } else { if (x > z) { small = y; med = z; big = x; } else { small = y; med = x; big = z; } } } else { if (z < x) { small = z; med = x; big = y; } else { if (y < z) { small = x; med = y; big = z; } else { small = x; med = z; big = y; } } } // now print them in order printf("Your values (from smallest to biggest) were:\n"); printf("%d %d %d\n", small, med, big); } |
Question 2: Write and call a function [6]
A function description and prototype are provided below.
(i) Write the full version of the function.
// when passed values a, b, c, and x, // compute and return the result of ax2 + bx + c double evalpoly(double a, double b, double c, double x); |
(ii) Show a sample call to the function, where you pass values 0.5, 2, 0.1, and 10, and store the returned value in a variable named R. (You do not need to write an entire main routine or declare R, just show the sample call.)
// Sample solution double evalpoly(double a, double b, double c, double x) { return(a*x*x + b*x + c); // (or store the computed value in a variable and return that) } // sample call R = evalpoly(0.5, 2, 0.1, 10); |
Question 3: Show the output [6]
Show the complete and precise output the following program would produce on the screen during execution.
#include <cstdio> const char* Q = "Q3"; const char* N = "Midt"; void inf(); void f(int &a, int &b); int g(int v1, int v2); int main() { int x = 4; int y, z; y = 10; inf(); f(x, y); z = g(x, y); printf("x: %d, y: %d, z: %d\n", x, y, z); } void inf() { printf("This is %s %s\n", Q, N); } void f(int &a, int &b) { int x = b; b = a; a = x; } int g(int v1, int v2) { int res = v1 / v2; v2 = v2 * 2; printf("v1: %d, v2: %d, res: %d\n", v1, v2, res); return res; } |
// Sample solution This is Q3 Midt v1: 10, v2: 8, res: 2 x: 10, y: 4, z: 2 |
Question 4: Modify a function [6]
You are given the function below (assume it is part of some larger program).
// given that MaxValue is a globally defined constant, // getNum prompts the user to enter integer in the range 0..MaxValue, // reads their response and returns it, // returning 0 if they did not enter an integer int getNum() { int userVal = 0; printf("Please enter an integer in the range 0..%d\n", MaxValue); scanf("%d", &userVal); return userVal; } |
Suppose we need to change the function prototype and behaviour to be as follows:
// given MaxValue as a parameter, // getNum prompts the user to enter an integer in the range 0..MaxValue, // reads and checks their response, // if the response was valid then getNum // stores their entry in finalVal and returns true // otherwise it returns false (leaving finalVal unchanged) bool getNum(int &finalVal, int MaxValue); |
Write the new version of the function. (You only need to write the function, you do not need to provide a main routine, call to the function, etc.)
// Sample solution bool getNum(int &finalVal, int MaxValue) { int userval; // will hold the user's data int numvals; // will hold the scanf return value (1 if scanf worked, 0 if it failed) // prompt the user and read the response printf("Please enter an integer in the range 0..%d\n", MaxValue); int numvals = scanf("%d", &userval); // if the user entered a number and it was in the correct range // then set finalVal and return true if ((numvals > 0) && (userval >= 0) && (userval <= MaxValue)) { finalVal = userval; return true; } // otherwise something was wrong, return false return false; } |
Question 5: Write a program [6]
Write a complete and correct C++ program that meets the following specifications:
Bonus mark: have the program capture and store the return value from the printf to count how many digits were in the output, then display that too. |
Two sample runs of the program are shown below (with the user's input illustrated in bold italics in both examples):
Please enter a real number: 37.124 The integer portion of your value was 37 |
// Sample solution #include <cstdio> #include <cmath> int main() { // prompt the user printf("Please enter a real number:\n"); float x; // if scanf returns a value greater than 0 then it DID read in a number, // so we can try to process it if (scanf("%f", &x) > 0) { printf("The integer portion of your value was "); // use floor (from cmath) to round down to the nearest integer int integerPart = floor(x); // print the value with no trailing 0's (i.e. so it comes out as just the integer) // and use printf's return value to see how many characters long it was int len = printf("%g", integerPart); printf("\n"); printf("There were %d digits in the integer portion of your value.\n", len); } // otherwise scanf returned 0, i.e. the user did not type in a number else { // read the first character of whatever garbage the user typed in // and print the error message char firstch; scanf("%c", &firstch); printf("The value beginning with %c was not a number.\n", firstch); } } // Notes: this one was a little trickier on purpose, // the easiest solutions are // x = floor(x); then print with %g // or printf("%d", (int)(x)); // or int i = x; then print with %d // or to simply read it into an int in the first place, // e.g. int userVal; // scanf("%d", &userVal); // (although this does leave the .xxxx sitting in the input buffer) // // unfortunately if you used "%.0f" to try printing // only the integer portion then it rounds, // so a value like 1.5 would come out as 2 // and if you try to use %d to print the float then it // will actually come out as a seemingly irrelevant // and potentially huge number, // e.g. 1.5 with %d displays as 1533953904 |
CSCI 160 Exam Quick Reference Sheet: Sections F19N01-F19N04 Comments: Single line // or Multi-line /* .... .... */ C++ operators ============= Arithmetic operators: + - * / % ++ -- Assignment operators: = += -= *= /= %= Boolean operators: && || ! == != <= >= < > Data Types ======================================================= Data Keywords Literal Examples integers: short, int, long 3, -200, 0 reals: float, double 3.14, -0.0003 character: char 'x' boolean: bool true, false text const: const char* "this is some text" Sample variable declarations (with/without initialization) ========================================================== int i; int i = 3; char c; char c = 'Q'; char c = '\n'; bool b; bool b = true; Sample constant declarations ============================ const double Pi = 3.1415; 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("%4d", &i); // read a maxium of 4 digits into int variable i 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", "Hello"); // print the contents of a text string (char*) Some useful library functions and constants =========================================== cmath cctype ----- ------ double ceil(double) char toupper(char) // also islower double floor(double) bool isupper(char) double fabs(double) // also isspace, isalpha, isdigit, etc double log(double) double pow(double, double) cfloat climits double cos(double) ------ ------- // also acos, sin, asin, tan, atan DBL_MAX SHORT_MAX double sqrt(double) FLT_MAX INT_MAX LONG_MAX Sample control structures ========================= if (expr) { // works on short, int, long, ....... // char, or enum values } else if (expr) { switch (expr) { ........ case value1: } else { ..... ........ break; } case value2: ..... // is X between 3 and 9? break if ((3 < X) && (X < 9)) { default: // yes it is ..... } else { break; // no it isn't }; } 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; } } }