500 likes | 656 Views
Review. Read textbook chapters 1 - 6 Read Lectures 11 - 24 General Programming Tips: use Top-Down Design use Incremental Programming use Functions to simplify code and create modules. Using Variables. You may declare variables in C using the data type you need - e.g.:
E N D
Review • Read textbook chapters 1 - 6 • Read Lectures 11 - 24 • General Programming Tips: • use Top-Down Design • use Incremental Programming • use Functions to simplify code and create modules
Using Variables • You may declare variables in C using the data type you need - e.g.: • Integers (int, long int, short int) • Floating point (float, double) • Characters (char) • Examples of variable declarations: int meatballs ; • float area ;
Declaring Variables • When we declare a variable: • space in memory is set aside to hold that data type • That space is associated with the variable name • Visualization of the declaration • int meatballs ; meatballs FE07
Keywords in C • int long • register return • short signed • sizeof static • struct switch • typedef union • unsigned void • volatile while • auto break • case char • const continue • default do • double else • enum extern • float for • goto if
Arithmetic Operators • Name Operator Example • Addition + num1 + num2 • Subtraction - initial - spent • Multiplication * fathoms * 6 • Division / sum / count • Modulus % m % n
Modulus % • The expression m % n yields the remainder after m is divided by n. • Modulus is an integer operation. - Both operands MUST be integers. • Examples : 17 % 5 = 2 • 6 % 3 = 0 • 9 % 2 = 1 • 5 % 8 = 5
Integer Division • If both operands of a division expression are integers, you get an integer answer. The fractional portion is thrown away. • Examples : 17 / 5 = 3 • 4 / 3 = 1 • 35 / 9 = 3 • Division where one operand is a floating point number will produce a floating point answer. Automatic promotion.
Arithmetic Operators Rules of Operator Precedence • Operator(s) Precedence & Associativity • ( ) Evaluated first. If nested - innermost first. If on same level - left to right. • * / % Evaluated second. If many, they are evaluated left to right • + - Evaluated third. If there are several, evaluated left to right. • = Evaluated last, right to left.
Relational Operators • < less than • > greater than • < = less than or equal to • > = grater than or equal to • = = is equal to • != is not equal to • Relational expressions evaluate to the int • value 1 (True) or the int value 0 (False) • All of these operators are called binary operators because they take two expressions as operands
True or False • Arithmetic expressions also evaluate to true of false. • Any expression that has a zero value is false. ( 0 ) is False • Any expression that has a non-zero value is true. ( 1 ) is True
Structured Programming • All programs can be written in terms of only 3 control structures • The sequence structure • Unless otherwise directed, the statements are executed in the order in which they are written. • The selection structure • Used to choose among alternative courses of action • The repetitive structure • Allows that an action is to be repeated while some condition remains true.
A Selection Structurethe if statement • if ( condition is “true” ) • { • statement(s) • } • if ( value = = 0 ) • { • printf (“The value you entered was zero\n”); • }
Gotcha int a = 2; if (a = 1) { printf (“ a is one \n”); } else if (a == 2) { printf (“ a is two \n ”); } else { printf (“ The vaue of a is %d \n”, a); }
Example while loop • children = 10 ; • cookies = 1024 ; • while ( children > 0 ) • { • children = children - 1; • cookies = cookies / 2 ; • }
Using a Sentinel Value • We could let the user keep entering the grades and when he’s done enter some special value that signals us that he’s done. • This special signal value is called a sentinel value. • We have to make sure that the value we choose as the sentinel isn’t a legal grade. (ie. can’t use 0 as the sentinel )
The Priming Read • When we use a sentinel value to contol a while loop, we have to get the first value from the user before we encounter the loop so that it will be tested and the loop can be entered. • This is known as a priming read. • We have to give significant thought to the initialization of variables, the sentinel value and getting into the loop.
The cast operator ( ) • We can use a cast operator to create a temporary value of the desired type, to be used in a calculation. • Does NOT change the variable’s type or how it is stored. • Is only good for the statement it’s in. • Often used to avoid integer division. • Used anytime we want to temporarily change a type for a calculation.
Using a Sentinel (continued) • printf (“Enter grade, -1 to end : “); • scanf (“%d”, &grade); • while (grade != -1) • { • total = total + grade ; • counter = counter + 1 ; • printf (“Enter grade, -1 to end : “); • scanf (“%d”, &grade); • } • average = ( float ) total / counter ; • printf (“The average was %.2f\n”, average) ;
Increment and Decrement Operators • The Increment Operator ++ • The Decrement Operator -- • Precedence - lower than (), but higher than * / and % • Associativity - right to left • Increment and decrement operators can only be applied to variables, NOT to constants or expressions
The for loop Repetitive Structure • The for loop handles details of the counter-controlled loop automatically • The initialization of the the loop control variable, termination conditional test and modification are handled in for loop structure for ( i = 1; i < 11; i++) { initialization modification } test
A for loop that countsfrom 0 to 10 for (i = 0; i < 11 ; i++) { printf (“%d”, i); } printf (“\n”);
do-while loop example do { printf (“Enter a positive number: “); scanf (“%d”, &num); if (num < = 0) { printf (“ \n That is not positive, try again \n ”); } } while (num <= 0);
for vs while • use a for loop when your program “knows” exactly how many times to loop • use a while loop when there is a condition that will terminate your loop
Nested for loops for (i = 1; i < 5; i++) { for (j = 1; j < 3; j+) { if (j % 2 = = 0) { printf (“O”); } else { printf (“X”); } } printf (“\n”); } How many times is the ‘if’ statement executed? What is the output ??
The char data type • The char data type holds a single character char ch; • The char is held as a one-byte integer in memory. The ASCII code is what is actually stored, so we can use them as characters or integers, depending on our purpose • Use scanf (“%c”, &ch); to input 1 char
Character Example #include <stdio.h> main ( ) { char ch; printf (“Enter a character: “); scanf (“%c”, &ch); printf (“The value of %c is %d.\n”, ch, ch); } If the user entered an A the output would be The value of A is 65.
The getchar ( ) function • We can also use the getchar() function that is found in the stdio library • The getchar ( ) function reads one charcter from stdin and returns that character (value) • The value can then be stored in either a char variable or an integer variable
getchar () example #include <stdio.h> main ( ) { char grade; printf (“Enter a letter grade: “); grade = getchar ( ); printf (“\nThe grade you entered was %c.\n”, grade); }
switch example switch (day) { case 0: printf (“Sunday\n”); break; case 1: printf (“Monday\n”); break; case 2: printf (“Tuesday\n”); break; case 3: printf (“Wednesday\n”); break; case 4: printf (“Thursday\n”); break; case 5: printf (“Friday\n”); break; case 6: printf (“Saturday\n”); break; default: printf (“Error -- unexpected value for day\”); break; }
break • The last statement of each ‘case’ in the switch should be (99 % of the time) break; • The break causes program control to jump to the right brace of the switch • Without the break, the code flows into the next case. This is almost never what you want.
Logical Operators • Logical operators are used for combining condition • && is AND if ( (x > 5) && (y < 6) ) • || is OR if ( (z == 0) || (x > 10) ) • ! is NOT if (! (bob >42) )
Operator Precedence & Associativity ( ) left to right/inside-out ++ -- ! + (unary) - (unary) (type) right to left * / % left to right + (addition) - (subtraction) left to right < <= > >= left ot right == != left to right && left to right || left to right = += -= *= /= %= right to left , (comma) right to left
Examining PrintMessage function #include <stdio.h> void PrintMessage (void); function Prototype main ( ) { PrintMessage ( ); function call } void PrintMessage (void) function header { printf (“A message for you:\n\n”); function printf (“Have a Nice Day!\n”); body }
Another version ofPrintMessage void PrintMessage (int counter); main ( ) { int num; printf (“Enter an integer: “); scanf (“%d”, &num); PrintMessage (num); one argumentmatches the one } of type intformal parameter of type int void PrintMessage (int counter) { int i; for (i = 0; i < counter; i++) { printf (“Have a nice day\n\n”); } }
Local Variables • Functions only “see” their own local variable. This includes main ( ) • The variables that are passed to the function are matched with the formal parameters in the order they are passed • The parameters are declarations of local variables. The values passed are assigned to those variables • Other local variables can be declared within the function
Data Types andConversion Specifiers Data Type printf scanf conversion conversion float %f %f double %f %lf long double %Lf %Lf int %d %d long int %ld %ld unsigned int %u %u unsigned long int %lu %lu short int %hd %hd char %c %c
Commonly Used Header Files header file Contains function prototypes for <stdio.h> the standard input/output library functions & information used by them <math.h> the math library functions <stdlib.h> the conversion of number to text, text to number, memory allocation, random numbers and other utility functions <time.h> maninpulating time and date <ctype.h> functions that test characters for certain properties and that can convert case
Manipulating what rand() returns • Since rand() returns unsigned integers in a large range, we often have to manipulate the return value to suit our purposes • Suppose we want only random numbers in the range from 0 to 5 • num = rand () % 6 • How about 1 to 6? • num = 1 + rand( ) % 6; • How about 5 to 20? • num = 5 + rand ( ) % 16;
srand ( ) and rand ( ) • The pseudo-random number generator needs an unsigned int as it’s seed • Although it produces what appear to be random numbers, if we use the same seed, we get the same sequence of random numbers • To get different random numbers each time we run our program, we have to give a different seed each time
Array Declarations • int array [5] ; • This declaration sets aside a chunk of memory that’s big enough to hold 5 integers. • It does not initialize those memory locations to 0 or any other value. • Initializing an array may be done with an array initializer, as in : • int array [5] = { 5, 2, 6, 9, 3 } ; array 5 2 6 9 3 0 1 2 3 4
Indexing Array Elements • Values of individual elements can be found by indexing into the array. In our example, array [0] is equal to 5 and array [3] is equal to 9. • The integer in square brackets is called the subscript. • The subscript could also be an expression that evaluates to an integer. • In our example, array is the name of the array.
Filling Arrays • Since many arrays are quite large, using an array initializer is impractical. • Large arrays are often filled using a for loop. • for ( i = 0; i < 100; i++) • { • rolls [ i ] = 0 ; • } • would set every element of the 100 element array, rolls, to 0.
Arrays and Pointers • The array name alone (without [ ] ) is just a variable that contains the starting address of the block of memory where the array is held. • A pointer is just a variable that holds an address. • So the array name alone is a pointer to the array. • Pointers have types. If an array is an array of ints, then the name of that array has the type pointer to int or intpointer.
Passing Arrays to Functions • The function prototype : • void FillArray ( int array[ ], int numElems); • The function definition header: • void FillArray ( int array[ ], int numElems) • The function call: • FillArray ( array, SIZE); • Notice that we are passing only the name of the array (an address) and that we aren’t returning anything (the function is void)
Passing Arrays to Functions • If an individual element of an array such as temper[3] is passed to a function, it is passed by value not address. So the array is not modified. • Not like when &temper[0] or temper is passed. • Example on page 230 of text.
Multiple Subscripted Arrays • A common use of multiple subscripted arrays is to represent tables of values consisting of information arranged in rows + columns. • For example: a [ 2 ] [ 3 ] • row column
Multiple Subscripted Arrays • void printArray ( int a [ ] [ 3 ] , int SIZE_R , int SIZE_C ) • { • ... • } • When we receive a single-subscripted array as an argument to a function, the array brackets are empty in the functions parameter list. • The first subscript of a multiple-subscripted array is not required either, but all subsequent subscripts are required
Final Exam for CS 104, Spring 2002 • To study for final exam do: • start studying for the final exam well before the exam date so you can ask questions • ask questions in class or come to the office hours or email us if you have questions • study textbook chapters 1-6 • study lecture slides 11 - 25 • use final exam master question list on class web site • no answers provided • not all questions have necessarily been covered in this course (what we didn't cover will also not show up in the final exam)
Final Exam for CS 104, Spring 2002 • Tips for final exam: • make sure you can follow what programs do - in the final you'll be required to read and understand what some small programs do and write down their output (I find this rather easy but you need to FOCUS + CONCENTRATE to make sure you don't mix things up) • you will also be required to write some small programs and functions and arrays so make sure you know how to do that • ALWAYS WRITE DOWN SOMETHING that shows me that you worked on the problem - you might get points for trying to solve the problems even if the solution is wrong. YOU WILL NEVER GET ANY POINTS IF YOU LEAVE QUESTIONS BLANK - that especially counts for multiple choice,... questions!
Final Exam for CS 104, Spring 2002 • Date, Time and Place of Final Exam: • Wed, May 15th, 2002 at 7:00 - 9:00 pm in AC IV 150 • usual time and place • different date/time than listed in UMBC schedule!