140 likes | 408 Views
First Midterm Exam. November 22 , 200 8 , Saturday , 1 0 :40 – 1 2 :20, max 100 minutes One A4 size cheat-note allowed (both sides could be used) Closed book, closed notes, no calculators and no laptops Until the end of loops up to 5.4 from book (excluding 4.6.3)
E N D
First Midterm Exam • November 22, 2008, Saturday, 10:40 – 12:20, max 100 minutes • One A4 size cheat-note allowed (both sides could be used) • Closed book, closed notes, no calculators and no laptops • Until the end of loops • up to 5.4 from book (excluding 4.6.3) • but you are responsible everything covered in class even if not covered in book • e.g. robot class (all member functions; not only the ones you used in hw) • several examples • Problem set and solutions are up on the web
First Midterm Exam – Exam Places if (lastname >= "Acar" && lastname <= "Başar") cout << " FENS L045" << endl; else if (lastname >= "Başaran" && lastname <= "Canarslan") cout << " FENS L062 " << endl; else if (lastname >= "Cev" && lastname <= "Çokay") cout << " FENS L063 " << endl; else if (lastname >= "Çokuysal" && lastname <= "Koç") cout << " FENS G077 amfi" << endl; else if (lastname >= "Konukoğlu" && lastname <= "Ongun") cout << " FENS G035 " << endl; else if (lastname >= "Onur" && lastname <= "Öztürk") cout << " FASS G022 " << endl; else if (lastname >= "Özüpekoğlu" && lastname <= "Stamati") cout << " FASS G049 " << endl; else if (lastname >= "Su" && lastname <= "Tokman") cout << " FASS G052 " << endl; else if (lastname >= "Tomaç" && lastname <= "Zilan") cout << " FASS G062 amfi" << endl;
Reference parameters (6.2.3) • It’s useful for a function to return more than one value • Find roots of a quadratic • two return values. What are they? • Get first and last name of a user and return them • two return values • Functions are limited to one return value using return • If you need to return several values back from a function • Use reference parameters • The idea is that when the value of the parameter is modified function modifies the value of the corresponding argument as well
Value Parameters - Pass by value • The parameters we have seen so far are value parameters • their arguments are passed by value • if you change the value of a parameter in function, corresponding argument does NOT change in the caller function • Example: see passbyvalue.cpp (not in book) • parameter a changes in function average, but corresponding argument, num1, does not change in main Enter two integers: 10 15 in main before calling average: num1 = 10, num2 = 15 beginning of function average: a = 10, b = 15 end of function average: a = 25, b = 15 average is 12.5 in main after calling average: num1 = 10, num2 = 15
Reference Parameters – Pass by Reference • Reference parameters are used to change the value of the argument in the caller function as well • ampersand between type and name void myfunction (int & num) • if you change the value of a reference parameter in function, corresponding argument changes in the caller function • Argument of a reference parameter must be a variable • This is a reasonable rule, because otherwise its value wouldn’t change • See passbyreference.cpp (not in book) • parameter a changes in function average; corresponding argument, num1, changes in main as well Enter two integers: 10 15 in main before calling average: num1 = 10, num2 = 15 beginning of function average: a = 10, b = 15 end of function average: a = 25, b = 15 average is 12.5 in main after calling average: num1 = 25, num2 = 15
Underlying Mechanisms • For value parameters, the arguments’ values are copied into parameters • arguments and parameters have different memory locations double average (int a, int b) average(num1, num2) 10 15 copy value copy value main function 10 15
Underlying Mechanisms • For reference parameters, the parameter and the argument share the same memory location • parameter is an alias of argument double average (int & a, int b) average(num1, num2) 15 refers to the same memory location copy value main function 10 15
Example: Swap • Write a function that swaps the values of its two integer parameters void swap (int & a, int & b) { int temp; temp = a; a = b; b = temp; } • How do we use this in main? int a=5, b=8; swap (a,b); // a becomes 8, b becomes 5 swap(a,5); // syntax error, arguments must be variables
Examples • What’s prototype for a void function that takes a stringas parameter and returns the number of vowels and consonants in it. void letters (string s, int & vowels, int & consonants); • What’s prototype for a void function that returns the number of hours, minutesin N seconds. Where N is a parameter? void TimeConversion (int N, int & hours, int & minutes);
Reference Parameters are not only to return multiple values • Even if you have a single value to return, you may prefer to return it as a reference parameter, not as the return value of the function. • ToLower function,defined in strutils, changes its argument to all lowercase. It is actually a void function, i.e. does not return anything as the function’s return value • Prototype is void ToLower(string & s); • Example use string s = "HeLLo"; ToLower(s); // s becomes “hello”
Example (See roots.cpp) • Roots of quadratic equation ax2 + bx + c = 0 • what could be a prototype? void roots (double a, double b, double c, double & r1, double &r2); • What happens if • one root? • no roots? • how will you inform the caller function about the number of roots? • necessary in order to let the caller function to interpret arguments for r1 and r2 • Solution: let the function return (as the return value) an integer value for the number of roots • So, the prototype becomes int roots (double a, double b, double c, double & r1, double & r2);
Parameter Passing: const-reference • Pass by value (value parameters) has overheads • copying the value • memory allocation for both parameter and argument • Sometimes we want to avoid the overhead of making the copy, but we don’t want to allow the argument to be changed. • const-reference parameters avoid copies, but cannot be changed in the function • trying to change a const-reference parameter is a syntax error • defined with const before a reference parameter void demo (const int & num, const string & s);
Example • Count # occurrences of a letter in a string • write a function for it • Look at every character in the string int LetterCount(const string& s, const string& letter) // post: return number of occurrences of letter in s { int k, count = 0, len = s.length(); for(k=0; k < len; k++) { if (s.substr(k,1) == letter) { count++; } } return count; } • Calls below are legal int ec = LetterCount("elephant", "e"); string s = "hello"; cout << LetterCount(s, "a");
General rules for Parameters • Const-reference parameters allow constants and literals to be passed • For example, “elephant” cannot be passed asan argument for a reference parameter, but it is ok with const-reference • Some good-programming tips • Built-in types (int, double, bool, char) - pass by value unless you change it and return from the function • All other types - pass by const-reference unless you change it and return from the function • When you change and eant to return the changed value, use reference parameters • What about using classes as the parameter type? • use reference parameters if changing the state of the parameter object • that is why we use reference parameters for Robot objects • use const reference if you are not changing the state of the parameter object