Homework • Done the reading? – K&R 1.1-1.9 – Glass Chapters 1 and 2 • • • • Applied for cs240? (If not, keep at it!) Gotten a UNIX account? (If not, keep at it!) Making progress on HW1? Due next class! HW2 will be on line by next class. 1 gcc • At UNIX prompt, type “gcc hello.c –o hello” • If you get any compiler error messages: – Figure out what they mean – Study and correct your source code – Repeat “gcc hello.c –o hello” until you get no messages • If you get no output except a new prompt: – The compiler has accepted your source code – You should now have a file named “hello” 2 Running your program “hello” • At UNIX prompt, type “hello” • If you get the printout “Hello World!” and a new prompt, your program ran successfully • If not, – – – – Study any UNIX error messages for clues Study your source code for logical errors Probably logical errors - compiler didn’t catch Fix your source code and recompile / rerun 3 Handing in Assignments • Turn in assignments as hard copy of typescript file % script (Start recording typescript file) Script started, file is typescript % ls –l (list directory entries) % cat hello.c (display source file) % gcc hello.c –o hello (compile source file) % hello (run executable file) % exit script done on Thu Aug 22 14:30:02 2002 % lpr typescript (printout typescript file) 4 Debugging a C program error • There is a big difference between: – The program compiling correctly – The program doing what you want it to do • You hope the compiler will catch your errors – These errors will be easier to find • If the compiler does not catch your errors – These errors will be harder to find 5 Compiler Error Messages • A compiler error message may direct you to a specific error in your program • A compiler error message may be vague about what the error is and why it is an error • Some compilers are better than others at providing useful error messages! 6 Compiler Error Messages • Introduced error is a missing closing brace: #include <stdio.h> int main ( ) { printf("Hello, World!"); return 0; /* missing “}” */ • % gcc hello.c –o hello hello.c: In function `main': hello.c:6: parse error at end of input • Not a very helpful message – Gotta figure it out! 7 Variables • Defined Data Type, Name, and (= value) int lower = 0; • • • • /* Note: “=“ and “;” */ lower case by convention for readability An executable statement Memory location assigned to hold the value Value can be changed as program executes lower = 20; /* Legal */ 8 Symbolic Constants • Defined Name and Value #define LOWER 0 • • • • /* Note: No “=“ or “;” */ UPPER CASE by convention for readability Not an executable statement No memory location assigned to hold value Value can’t be changed as program executes LOWER = 20; /* NOT Legal */ 9 Example Program (K&R, P 15) #include <stdio.h> #define LOWER 0 /* Symbolic Constants */ #define UPPER 300 #define STEP 20 /* Print out Fahrenheit – Celsius Conversion Table */ int main ( ) { int fahr; /* Variable */ for (fahr = LOWER; fahr <= UPPER; fahr =fahr + STEP) printf(“%3d,%6.1f\n”, fahr, (5.0/9.0)*(fahr – 32)); return 0; } 10 For Statement for (fahr = LOWER; fahr <=UPPER; fahr = fahr + STEP) { statements within the loop; } next statement after the loop terminates; for (A; B; C) - controls executing statement(s) within the loop A is initialization (executed once when loop is started) B is the loop test statement (when to stop looping) C is a statement to execute at end of each loop 11 Printf statement printf (“%3d, %6.1f\n”, fahr, (5.0/9.0)* (fahr - 32)); First Argument to printf = “%3d, %6.1f\n” %3d = integer format with 3 digits %6.1f = floating point format with 6 digits and 1 decimal \n = end of line character just as in “Hello World!” Second Argument to printf = fahr variable to print in %3d format Third Argument to printf = (5.0/9.0)*(fahr – 32.0) expression to calculate and print in %6.1f format Note: For open book tests, remember K&R, Page 154! 12 printf formats • printf ("Values:∆%3d,∆%6.1f\n", fahr, (5.0/9.0)*(fahr-32)); • Where the characters specified by "∆" are what we write to show a space explicitly. Quoted string "Value: . . ." is just like "Hello, world", but %3d and %6.1f are special placeholders, called conversion specifications. • This means that the two expressions following the quoted string, fahr, and (5.0/9.0)*(fahr-32), are to be printed according to the prescription given. • The table here would look like: – Values:∆∆∆0,∆∆-17.8 – Values:∆∆20,∆∆∆-6.7 – Values:∆∆40,∆∆∆∆4.4 13 printf formats • Other characters in "Values: . . .", such as "," and "∆" are printed literally. • The %3d means that an integer is printed so as to take up 3 spaces, right adjusted -- "∆40", but no initial space for "100" -- still have space before 100 because came after "Values:∆". • The %6.1f means to print a float number (floating point or “double” by default, represented with a fractional part), with a total of 6 spaces used up and 1 digit after the decimal point: thus "∆-17.8" uses 6 spaces. 14 Functions • A function is a separate block of code that you can call as part of your program • A function executes and returns to next line after you call it in your program • Arguments within parentheses may be passed in • Arguments are passed by value! function_name (arguments); • A return value may be passed back return_value = function_name (arguments); 15 Character I/O – getchar( ) • A standard function/macro defined in <stdio.h> • No arguments are passed to “getchar ( )” • getchar ( ) returns an int value from stdin int c; … c = getchar ( ); • Next character input is returned as value of “c” 16 Character I/O – putchar( ) • A standard function/macro defined in <stdio.h> • Character to print to stdout is passed as argument • There is no return value int c; … putchar (c); • Next character output is based on value of “c” 17 File Copying # include <stdio.h> int main ( ) { int c; c = getchar( ); while (c != EOF) { putchar (c); c = getchar ( ); } return 0; } 18 File Copying - Alternative # include <stdio.h> int main ( ) { int c; while ( (c = getchar( ) ) != EOF) { putchar (c); } return 0; } 19 Redirecting stdin and stdout • copy <hello.c >junk.c Copies FROM the contents of existing file hello.c as stdin TO the contents of a new file junk.c as stdout (Note: will overwrite any existing file junk.c) 20