Homework Homework Continue Reading KR Chapter 2 Well

  • Slides: 21
Download presentation
Homework • Homework – Continue Reading K&R Chapter 2 – We’ll go over HW

Homework • Homework – Continue Reading K&R Chapter 2 – We’ll go over HW 2 at end of class today – Continue working on HW 3 • Questions? 1

Forcing Groups of Bits Off • Given char n, how to turn off all

Forcing Groups of Bits Off • Given char n, how to turn off all bits except the least significant 5 bits: n = n & ‘x 1 f’ n = ‘xa 5’ 10100101 n & ‘x 1 f’ 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 2

Forcing Groups of Bits Off • x = x & ~077 (octal for a

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 3

Forcing Groups of Bits On • Given n, how to turn on the MS

Forcing Groups of Bits On • Given n, how to turn on the MS two bits (if already on, leave on). n = n | ‘xc 0’ n = 'xa 5' n | 'xc 0': 10100101 | 11000000 turn on MS 2 bits 11100101 4

“Encryption” with Exclusive Or • Show that x ^ (x ^ y) == y

“Encryption” with Exclusive Or • Show that x ^ (x ^ y) == y char y =‘xa 5’ 10100101 (plain text bits) char x =‘x 69’ 01101001 (encryption key) x ^ y 1100 (cypher text bits) x ^ (x ^ y) 10100101 (decrypted bits) Same as original value of y! 5

Exchanging Data with Exclusive Or • You can use exclusive or to exchange the

Exchanging Data with Exclusive Or • You can use exclusive or to exchange the values of two variables without using a temporary location for a “three way move” int i = 0 x 12, j = 0 x 34; i = i ^ j; /* i = 0 x 26 */ j = i ^ j; /* j = 0 x 12 */ i = i ^ j; /* i = 0 x 34 */ 6

String Constants • String constant: "I am a string. “ – An array (a

String Constants • String constant: "I am a string. “ – An array (a pointer to a string) of char values somewhere ending with NUL = '', 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 B 3, 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!! 7

Enumeration Symbolic Constants • enum boolean {FALSE, TRUE}; Enumerated names assigned values starting from

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 8

Enumeration Symbolic Constants • If you define months as enum type enum months {ERR,

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}; enum months birth. Month = MAY; printf("%dn", birth. Month); /* prints 5 */ 9

const • "const" declaration is like "final" in Java – warns compiler variable value

const • "const" declaration is like "final" in Java – warns compiler variable value shouldn't change – Commonly used for function arguments • const char msg[ ] = "Warning: . . . "; • int copy(char to[ ], const char from[ ]); • If logic of copy function attempts to modify “from” string, compiler will give a warning • Exact form of warning and actual behavior of the code is installation defined 10

Operators • Arithmetic Operators: + * / % Add Subtract Multiply Divide Remainder after

Operators • Arithmetic Operators: + * / % Add Subtract Multiply Divide Remainder after division (modulo) • 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 11

Operators • Logical Operators: && || ! logical and logical or Not • Examples:

Operators • Logical Operators: && || ! logical and logical or Not • Examples: int year; if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) printf( "%d is a leap yearn", year); else printf( "%d is not a leap yearn", year); Why are inner parentheses actually not needed? See precedence table, P 53. Good to mark for exams!! 12

Relations / Comparisons • We call a comparison between two arithmetic expressions a "relation"

Relations / Comparisons • We call a comparison between two arithmetic expressions a "relation" ae 1 <= ae 2 (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) 13

Type Conversion /* atoi: convert character string of digits to int (base 10) */

Type Conversion /* atoi: convert character string of digits to int (base 10) */ int atoi(char s[ ]) /* name based on “ascii to integer” */ { int i, n; n = 0; for (i=0; s[i] >= '0' && s[i] <= '9'; ++i) /* "is a digit" */ n = 10*n + (s[i] - '0'); /* s[i]-'0' is char add to 10*n is int */ return n; } 14

Type Conversion /* itoa: convert int n to characters in base 10 in array

Type Conversion /* itoa: convert int n to characters in base 10 in array s */ void itoa (int n, char s[ ]) { int i, sign; if ((sign = n) < 0) /* record sign */ n = -n; /* make n positive */ i = 0; 15

Type Conversion /* generate digits in reverse order */ do { /* new loop

Type Conversion /* generate digits in reverse order */ do { /* new loop type */ s[i++] = n % 10 + '0'; /* generate next digit */ /* what conversion takes place here? */ } while(( n /= 10) > 0); /* delete digit from end of int */ if (sign < 0) s[i++] = '-'; s[i] = ''; reverse (s); /* reverse digit string */ } 16

Review HW 2 Solution • Let’s go over solutions to HW 2 – Learn

Review HW 2 Solution • Let’s go over solutions to HW 2 – Learn to break down the problem logically – Learn to write pseudo code effectively – Learn to write C code from pseudo code • These are key for being a good programmer 17

trim • Pseudo code for the trim program while there is still a line

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 18

trim • While writing the pseudo code, think about: – A good strategy (e.

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) 19

reverse • Pseudo code for the reverse function find length of the string to

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 20

reverse • While writing the pseudo code, think about: – The basic steps needed

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? 21