Working with Structures
Download
Report
Transcript Working with Structures
ECE-1021 Course Review
Engineering Problem Solving
Define the problem clearly
Work hand examples
Develop the Algorithm
Implement the Algorithm
Test the Implementation
Top-Down Algorithm Development
Divide and Conquer
Break Problem into smaller tasks.
Define the interaction between tasks.
Recursively solve the individual tasks.
Build up the overall solution from the
pieces.
Structured Programming Elements
Sequences
Selections
Repetitions
Basic Flowchart Symbols
Entry
Task
I/O
Q?
Exit
T
F
Logical Values
FALSE: A value that is EXACTLY zero.
TRUE: A value that is not FALSE
TRAP: Use of floating point values.
Logical Expressions
Evaluate to:
0 if FALSE
1 if TRUE (but recognize any nonzero value as TRUE)
Operators:
! - Logical NOT
&& - Logical AND
Example: k = !j;
Example k = i && j;
|| - Logical OR
Example k = i || j;
C Programming Elements
Sequences
Selections
Statements execute in order presented.
Control Structures override normal order.
One (or more) branches chosen based on a test.
if(), if()/else, switch()
Repetitions
Selection Structure that branches to a point above the
branch point.
while(), do/while(), for()
C is Function Oriented
function header
{
function body
}
function header:
return-type function-name(param list)
return-type: type of value returned by function.
param list: variable declarations that are initialized with
the function call’s corresponding argument values.
Assignment Expressions
Normal Assignment Operator:
a = b + c;
Abbreviated Assignment Operators:
a += b + c; /* same as a = a + b + c; */
Evaluate to value assigned.
Increment/Decrement Operator
Changes the value stored in a variable by one.
Post-Increment/Post-Decrement
c++; c--;
Evaluates
to original value in variable.
Pre-Increment/Pre-Decrement
++c; --c;
Evaluates
to (original value +/- 1)
if() and if()/else statements
Syntax
if(test)
{
if_code;
}
else
{
else_code;
}
if()
if()...else
test?
test?
T
if_code
F
T
if_code
F
else_code
switch() statement
Syntax
switch(int_expr)
{
case int_const1: code1;
break;
case int_const2: code2;
case int_const3: code3;
break;
default:
code4;
}
Compact way of writing certain
types of complex but common
if()/else blocks.
(int_expr)
must evaluate to an integer value
at runtime.
(int_constN)
must evaluate to a unique integer
constant at compile time.
execution jumps to case where
(int_constN == int_expr) is TRUE.
break;
terminates switch() execution.
default case
Optional. Executes only if NO
other case executes.
Loop Structures
Special case of Selection Statement
One branch eventually leads back to the original selection statement.
Permits a block of code to be executed repeatedly as long as some test condition
is satisfied.
C provides three different looping structures
while(), do/while(), for()
Only one is needed and any one is sufficient.
Different structures are better matches for different logic.
Using the “proper” one aides the programmer and anyone else reading the code.
The compiler doesn’t care and will often implement the code identically
regardless of which structure is used.
while() loop
Syntax
ini_code // not part of loop
while(test_expr)
{
loop_code;
increment_code;
}
next_code; // not part of loop
ini_code
Features
loop does not execute at all if test
fails the first time.
test?
F
T
loop_code
inc_code
next_code
do/while() loop
Syntax
ini_code // not part of loop
do
{
loop_code;
increment_code;
} while(test_expr);
next_code; // not part of loop
ini_code
Features
loop will always execute at least
once, even if test fails the first
time.
loop_code
inc_code
T
test?
F
next_code
for() loop
Syntax
for(ini_code; test_expr; inc_code)
{
loop_code;
}
next_code; // not part of loop
ini_code
Features
Just a while() loop with the initialization
and increment code formally
incorporated into the syntax.
Can make a cleaner divide between the
loop logic and the housekeeping logic.
Makes it harder to omit initialization
code if loop is moved or copied.
test?
F
T
loop_code
inc_code
next_code
Macros
Perform text replacement prior to compile.
Object-like macros
Function-like macros:
Symbolic Constants
Two step replacement process
Golden Rules
Surround ALL macro arguments with parentheses.
Surround entire macro body with parentheses.
Ensures predictable evaluation.
ASCII code
Characters and control actions encoded as an
integer value.
Standard ASCII - 7 bits
Eleven subgroups (in addition to complete group):
ASCII, CONTROL, PRINTING, GRAPHICAL
ALPHANUMERIC, PUNCTUATION
ALPHABETICAL, NUMERIC
UPPERCASE, LOWERCASE
HEXADECIMAL, WHITESPACE
Bitwise Operations
Operators work on entire value.
Result is determined bit-by-bit
Operators:
~
- bitwise NOT
& - bitwise AND
| - bitwise OR
^ - bitwise XOR
Integer Representation
Integer
Unsigned Integers
Signed Integers
Pure Binary
Signed Binary
Offset Binary
One’s Compliment
Two’s Compliment (most commonly used)
C Standard does not allow use of offset binary
Positive integers must use same representation as
unsigned integers.
Floating Point Representation
IEEE-754 Floating Point Standard
Value broken into three parts from left-to-right
Sign Bit (0 for positive, 1 for negative)
Exponent (used offset binary with 0111....1 mapping to zero)
Mantissa Magnitude
Normalized with implied leading 1.
Denormalized if exponent pattern is all 0.
Special Values
Exponent Pattern is all 1’s
+/- infinity if mantissa is all 0’s
NaN (Not-a-Number) if mantissa has any 1’s
Recursion
To be a successful, recursive function:
Must
have a recursive path
Must have a non-recursive path (“base case”)
Often quicker to develop and debug.
Generally slower.
Generally consumes more memory
resources.
Iterative alternative always exists.
File Operations
File interaction performed via FILE structure.
fopen(), fclose()
Primary Modes: “rt”, “wt”, “rb”, “wb”
Should ALWAYS verify fopen() success
If FILE * returned by fopen is NULL:
Do NOTHING more with that file - NOTHING!
Close files as soon as they are no longer needed.
File I/O
Two types of files - Text and Binary
Text:
Contents are expected to consist of one-byte ASCII
codes.
Character I/O: putc(), getc(), puts(), gets()
Formatted I/O: fprintf(), fscanf()
Binary:
Direct copy between memory and file.
fread()/fwrite()
fseek(), fset(), ftell()
SEEK_SET, SEEK_CUR, SEEK_END
Pointers
A variable used to store memory addresses.
The address were a data item is stored.
Dereference to access the data.
The address operator evaluates to the address
where an object is stored:
*ptr = variable + *ptr2;
ptr = &variable;
Pointer arithmetic:
pointer +/- integer
integer is number of elements (not bytes)
Arrays
One or more variables stored:
In
one contiguous block of memory.
Array name is a pointer to start of block.
All variables are the same type.
Can access elements by way of pointer offset
*(array+index)
= value;
array[index] = value;
Passed by reference in function calls.
Structures
Programmer-defined data type.
One or more variables stored:
In
one contiguous block of memory.
May be different data types.
Passed by value in function calls.
Structure Declarations
typedef struct pt3d PT3D;
struct pt3d
{
int pt;
double x, y, z;
};
int main(void)
{
int i;
PT3D pt1;
PT3D pt[5];
....
return 0;
}
Typedef can appear
before structure declaration
Structure declaration outside
any function to make it have
global scope
Accessing Elements
By variable name:
point.pt = 42;
j = point.pt + 3;
By pointer to a structure variable:
(*ptr).pt = 42;
ptr->pt = 42;
Structure Utilization
Quasi-Object Oriented Programming
Structure contains data.
Primitive functions are ONLY functions to
directly access the structure’s data.
Get()/Set()
function pairs.
Utility Functions invoke primitive functions
if they need to access the structure’s data.