220 likes | 383 Views
Homework. Homework Continue Reading K&R Chapter 2 We’ll go over HW2 HW3 is posted Questions?. Review HW2 Solution. Let’s go over solutions to HW2 Learn to write pseudo code effectively Learn to think about the problem logically Learn to write C code from pseudo code
E N D
Homework • Homework • Continue Reading K&R Chapter 2 • We’ll go over HW2 • HW3 is posted • Questions?
Review HW2 Solution • Let’s go over solutions to HW2 • Learn to write pseudo code effectively • Learn to think about the problem logically • Learn to write C code from pseudo code • These are key for being a good programmer
trim • Pseudo code for the trim program while there is still a line to process for each character starting at the end of the line find the first non blank character or the beginning of the line if a non-blank character is found add an EOL and a terminating zero and print out the string
trim • While writing the pseudo code, think about: • A good strategy (e.g. scan line from the end backwards rather than trying to go forwards) • Stopping each scan (e.g. not blank, not tab, etc) • What’s needed to make a shorter line printable (e.g. add a new EOL and terminating zero) • What indicates that it is time to stop looping on input lines (e.g. return from getline > 0 is false)
trim • C code for the trim program while ((len = getline(line, MAXLINE)) > 0) { stop = 0; for (i=len-1; i>=0 && !stop; --i) { if (line[i] != ' ' && line[i] != '\t' && line[i] != '\n') { stop = 1; /* stop on any non-blank,tab,eol */ line[i+1] = '\n'; /* add an eol */ line[i+2] = '\0'; /* and a zero to term the string */ printf("%s",line); } } }
reverse • Pseudo code for the reverse function find length of the string to reverse for each character from the beginning of the string to half way copy the character here to a holding variable copy the character the same distance from end to here copy the holding variable to the same distance from end String Array Holding Variable
reverse • While writing the pseudo code, think about: • The basic steps needed (e.g., three way move) • The loop conditions (e.g., go halfway through) • The beginning/end as possible special cases • What about a string that has an odd length? • What about a string that has an even length? • Does it matter if we move the middle character in an odd length string out and back in or not?
reverse • C code for the reverse function int len, i; char c; len = strlen(line) - 1; /* array index = len - 1 */ for (i=0; i<=len/2; ++i) { /* go halfway through the line */ c = line[i]; /* save a character from line */ line[i] = line[len-i]; /* overwrite that character */ line[len-i] = c; /* save reversed character */ }
Forcing Groups of Bits Off • Given char n, how to turn off all bits except the least significant 5 bits: n = n & ‘\x1f’ n = ‘\xa5’ 10100101 n & ‘\x1f’ 10100101 & 00011111 turn off all bits 00000101 except bottom 5 • Called "masking" the bits -- only see bits on in result where 1's found in mask value
Forcing Groups of Bits Off • x = x & ~077 (octal for a change) Sets least significant 6 bits in x to 0 Even if you don't know size of x (e.g. size of int) ~077 = ~00 . . . 00111111 = 11 . . . 11000000 of required size Extends itself with 1 bits on left for length of x
Forcing Groups of Bits On • Given n, how to turn on the MS two bits (if already on, leave on). n = n | ‘\xc0’ n = '\xa5' n | '\xc0': 10100101 | 11000000 turn on MS 2 bits 11100101
“Encryption” with Exclusive Or • Show that x ^ (x ^ y) == y char y =‘\xa5’ 10100101 (plain text bits) char x =‘\x69’ 01101001 (encryption key) x ^ y 11001100 (cipher text bits) x ^ (x ^ y) 10100101 (decrypted bits) Same as original value of y!
String Constants • String constant: “I am a string.” • An array (a pointer to a string) of char values somewhere ending with NUL = '\0', the char with zero value. • "0" is not same as '0'. The value "0" can't be used in an expression - only in arguments to functions like printf(). • Also have string functions: See pg. 241, Appendix B and B3, pg. 249 #include <string.h> With these definitions, can use: len = strlen(msg); where msg is string in a string array • NOTE: Write your own string functions for homework!!
Enumeration Symbolic Constants • enum boolean {FALSE, TRUE}; • Enumerated names assigned values starting from 0 • FALSE = 0 • TRUE = 1 • Now can declare a variable of type enum boolean: enum boolean x; x = FALSE; • Just a shorthand for creating symbolic constants instead of with #define statements • Storage requirement is the same as int
Enumeration Symbolic Constants • If you define months as enum type enum months {ERR, JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC}; • Debugger might print value 2 as FEB
Code Example of the enum type int main() { enum month {ERR, JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC}; enum month this_month; this_month = FEB; … … }
const • "const" declaration is like "final" in Java • warns compiler that variable value shouldn't changeconst char msg[ ] = "Warning: . . ."; • Commonly used for function arguments int copy(char to[ ], const char from[ ]); If logic of the copy function attempts to modify the “from” string, compiler will give a warning • Exact form of warning and actual behavior of the code is installation defined
Operators • Arithmetic Operators: + Add - Subtract * Multiply / Divide % Modulo (Remainder after division ) e.g. 5%7 = 5 7%7 = 0 10%7 = 3 • Examples: int x, y; x / y truncates (no fractional part) x % y is the remainder when x is divided by y. Always true that: x == y*(x/y) + x%y
Operators • Logical Operators: && logical and || logical or ! Not • Example: … int year; if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) printf( "%d is a leap year\n", year); else printf( "%d is not a leap year\n", year); • Why are no inner parentheses needed? See precedence table, P 53. Good questions for exams!!
Precedence and Associativity of Operators sign dereference address casting Associativity ( ) [ ] -> . Left to right ! ~ ++ - - + - * & (type) sizeof right to left * / % left to right + - left to right << >> left to right < <= > >= left to right = = != left to right & left to right ^ left to right | left to right && left to right || left to right ?: right to left = += -= *= /= %= &= ^= |= <<= >>= right to left , left to right Precedence
Precedence and Associativity • Precedence • Operators in the same row have the same precedence • Operators are in order of decreasing precedence • Associativity • Determine the order if the operators have the same precedence • e.g x = y +=z -= 4 means x = y +=(z -= 4) x =(y +=(z -= 4))
Relations / Comparisons • We call a comparison between two arithmetic expressions a "relation" ae1 <= ae2 (Comparisons: <, <=, = =, !=, >=, > ) • A relation is evaluated as true or false (1 or 0) based on values of given arithmetic expressions • if ( i < lim-1 = = j < k) • What's it mean? • See precedence table P 53 • Instead of c != EOF, could write !(c = = EOF)