structures ansi-c. review: data structures functions give us a way to organize programs. data...

24
Structures ANSI-C

Upload: jonah-lawson

Post on 30-Dec-2015

217 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Structures

ANSI-C

Page 2: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Review: Data Structures

• Functions give us a way to organize programs.

• Data structures are needed to organize data, especially:– 1. large amounts of data– 2. variable amounts of data– 3. sets of data where the individual pieces are

related to one another

• Arrays helped with points 1 and 2, but not with point 3, as arrays must contain the same type of values.

• – Example: the data describing one pixel: x, y,color

• – Example: data about one student: name, ID, gpa, etc.

Page 3: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

structs: Heterogeneous Structures

• Collection of values of possibly differing types.

• Used to unify several values of possibly different types. Result seen as one unit.

• When using structs you must:– Name the collection; – name the components: called fields.

• Example: a student record collects under one name various pieces of information about a student: – Give name to the collection: studentRecord– Give type and name to each of the fields.

• Example: a date collects under one name: day, month, year.

Page 4: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Defining structs

typedef struct { /* typedefs go at the top of the program */

char name [20] ; int id ; int hw; int exams ; double grade ;} studentRecord ;• Defines a new data type called

studentRecord. • Does not declare (create) a variable.

No storage is allocated.

Page 5: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Terminology

• A “struct” is sometimes called a “record” or “structure”.

• Its “components” are often called “fields” or "members".

Page 6: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Declaring struct variables

• With structs, we’re moving toward a way for programmers to define their own types.

• Having defined studentRecord at the top of the program:– studentRecord s1 ;– studentRecord harvey ;

• /*studentRecord is a type; s1 and harvey are variables. */

Page 7: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Selection operator: .

• Having declared:studentRecord s1 ;• To access any of the fields:

s1.fieldName

Variable name. Must be of struct type field name

Field selector operator

Page 8: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Things You Can and Can’t Do

• You can• use = to assign whole struct variables• You can• have a struct as a function return

type• You can’t use == to directly compare

struct variables; can compare fields directly

• You can’t directly scanf or printf structs;

• can read the individual fields

Page 9: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

struct initializers

…/*typedef structs go at top*/int i1 ; int count = 0 ; char c1[5] = { ‘h’, ‘e’,’l’, ‘p’, ‘\0’};char pet[] = “lamb” ; studentRecord harvey = {“Harvey

S.”, 9501234, 87, 74, 3.1} ;

Page 10: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Using Components of struct Variables

studentRecord s1;...scanStatus = scanf(“%d”, &s1.id) ;s1.hw = 90 ;s1.exams= 80 ;s1.grade = (double)(s1.hw +

s1.exams) / 50.0 ;printf(“%d: %f”, s1.id, s1.grade) ;

Page 11: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Assigning Whole structs

s1 = harvey ;• equivalent tos1.id = harvey.id ;s1.hw = harvey.hw ;s1.exams = harvey.exams ;s1.grade= harvey.grade ;strcpy(s1.name, harvey.name) ;/* string copy – covered in slides

on strings */

Page 12: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Why use structs?

• Collect together values that are treated as a unit (for compactness, readability,maintainability).– Functions can return structs– another way to have “multiple” return values.– Files and databases: collections of structs e.g., 300 (or

30,000) student records.

typedef struct { int hours; int minutes ; int seconds ;} time ;typedef struct { int dollars; int cents ; } money ;

Page 13: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Example:

/* Given 2 endpoints of a line, “return” coordinates of midpoint */

void midpoint( double x1, double y1, /* 1st endpoint */

double x2, double y2, /* 2nd endpoint */double *midxp, double *midyp ) /* Pointers to midpoint */

{*midxp = (x1 + x2) / 2.0;*midyp = (y1 + y2) / 2.0;}double ax, ay, bx, by, mx, my;...midpoint(ax, ay, bx, by, &mx, &my);

Page 14: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Points as structs

typedef struct { double xcoord; double ycoord;} point ;...point p1 = {0.0, 0.0}, p2 = {5.0, 10.0} ;point middle ;middle.xcoord = (p1.xcoord +

p2.xcoord ) / 2.0 ;middle.ycoord = (p1.ycoord +

p2.ycoord ) / 2.0 ;

Page 15: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Midpoint Function via structs

point midpoint (point pt1, point pt2) {

point mid;

mid.xcoord = ( pt1.xcoord + pt2.xcoord ) / 2.0 ;

mid.ycoord = ( pt1.ycoord + pt2.ycoord ) / 2.0 ;

return (mid);

}

…/* a call *//* point struct declaration and initialization */ point p1 = {0.0, 0.0}; point p2 = {5.0, 10.0}; point middle;...middle = midpoint (p1, p2) ; /* struct assignment */

Page 16: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Midpoint with references

void setMidpoint (point pt1, point pt2, point *mid) {

(*mid).x = ( pt1.xcoord + pt2.xcoord ) / 2.0 ;

(*mid).y = ( pt1.ycoord + pt2.ycoord ) / 2.0 ;

} /* . has high precedence than * */point a = {0.0, 0.0};point b = {5.0, 10.0};point m;setMidpoint (a, b, &m) ;• Structs behave like all non-array types

whenused as parameters.

Page 17: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Pointer Shorthand: ->

void set_midpoint (point pt1, point pt2, point *mid) {

mid->x = ( pt1.xcoord + pt2.xcoord ) / 2.0 ;

mid->y = ( pt1.ycoord + pt2.ycoord ) / 2.0 ;

}• structp - > component means

(*structp).component• -> is called the “indirect

component selection operator”

Page 18: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Testing Equality of structs

• if (pt1 = = pt2) { ... } /* Doesn’t work */

• You need to specifically compare each field in the struct

int pointsEqual(point pt1, point pt2) {

return (pt1.xcoord = = pt2.xcoord && pt1.ycoord = = pt2.ycoord ) ;

}if (pointsEqual(pt1, pt2)) { ... } /* OK

*/

Page 19: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Do-it-yourself struct I/O

void printPoint (point p) { printf (“(%f,%f)”, p.xcoord, p.ycoord) ;}void scanPoint (point *ptptr) { point temp ; scanf (“%lf %lf”, &temp.xcoord,

&temp.ycoord) ; *ptptr = temp ;}point aPoint ;scanPoint (&aPoint) ;printPoint (aPoint) ;

Page 20: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Alternative scan_point

void scanPoint (point *ptptr) { scanf (“%lf %lf”, & ptptr->x, &

ptptr->y) ;}point aPoint ;scanPoint (&aPoint) ;printPoint (aPoint) ;

Page 21: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

scan_point without ->

void scanPoint (point *ptptr) { scanf (“%lf %lf”, &(*ptptr).x,

&(*ptptr).y) ;}point aPoint ;scanPoint (&aPoint) ;print_point (aPoint) ;

Page 22: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Hierarchical structs

typedef struct { double x; double y ;} point ;typedef struct { double width; double height ;} dimension ;typedef struct { dimension size ; point lowerLeft ; int lineColor, fillColor ;} rectangle ;

Page 23: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

Using structs within structs

point origin = { 0.0, 0.0 } ;rectangle a = { {5.0, 10.0}, {1.0, -2.0},

BLUE,CYAN};rectangle b ;b.fillColor = BLUE ;b.lowerLeft = origin ; /* place at origin */b.lowerLeft.y = 15.0 ; /* move up 15 */...b.size.width = 2.0 * b.size.width ; /*

stretch in x */b.size.height = 4.0 * b.size.height ; /*

stretch in y */

Page 24: Structures ANSI-C. Review: Data Structures Functions give us a way to organize programs. Data structures are needed to organize data, especially: –1

QUIZ: Calculating Types

• rectangle r;• rectangle * rp;• r.size• r.lowerLeft• r.fillColor• r.lowerLeft.x• &r.lowerLeft.y• rp -> size• &rp -> lowerLeft• *rp.linecolor• r -> size• rp -> size -> width