Homework

22
Homework • Homework – Continue Reading K&R Chapter 2 – We’ll go over HW2 – HW3 is posted • Questions?

description

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 - PowerPoint PPT Presentation

Transcript of Homework

Page 1: Homework

Homework

• Homework– Continue Reading K&R Chapter 2– We’ll go over HW2– HW3 is posted

• Questions?

Page 2: Homework

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

Page 3: Homework

trim

• Pseudo code for the trim programwhile 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

Page 4: Homework

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)

Page 5: Homework

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); } }}

Page 6: Homework

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

Holding VariableString Array

Page 7: Homework

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?

Page 8: Homework

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 */

}

Page 9: Homework

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

Page 10: Homework

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

Page 11: Homework

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

Page 12: Homework

“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!

Page 13: Homework

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!!

Page 14: 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

Page 15: Homework

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

Page 16: Homework

Code Example of the enum typeint main()

{

enum month {ERR, JAN, FEB, MAR, APR, MAY, JUN,

JUL, AUG, SEP, OCT, NOV, DEC};

enum month this_month;

this_month = FEB;

}

Page 17: Homework

const• "const" declaration is like "final" in Java

– warns compiler that variable value shouldn't change const 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

Page 18: Homework

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

Page 19: Homework

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!!

Page 20: Homework

Precedence and Associativity of Operators

( ) [ ] -> . 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

Pre

cede

nce

sign dereference address casting Associativity

Page 21: Homework

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

Page 22: Homework

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)