1 / 24

Structures

Structures. ANSI-C. 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

espinosak
Télécharger la présentation

Structures

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Structures ANSI-C

  2. 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.

  3. 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: calledfields. • 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.

  4. 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 anew data type calledstudentRecord. • Doesnot declare (create) a variable.No storage is allocated.

  5. Terminology • A “struct” is sometimes called a “record” or “structure”. • Its “components” are often called “fields” or "members".

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

  7. Selection operator: . Variable name. Must be of struct type field name Field selector operator • Having declared: studentRecord s1 ; • To access any of the fields: s1.fieldName

  8. Things YouCan andCan’t Do • Youcan • use = to assign whole struct variables • Youcan • have a struct as a function return type • Youcan’t use == to directly compare struct variables;can compare fields directly • Youcan’t directly scanf or printf structs; • can read the individual fields

  9. 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} ;

  10. 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) ;

  11. Assigning Whole structs s1 = harvey ; • equivalent to s1.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 */

  12. 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 ;

  13. 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);

  14. 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 ;

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

  16. 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 * */ pointa = {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.

  17. 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”

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

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

  20. Alternative scan_point void scanPoint (point *ptptr) { scanf (“%lf %lf”, & ptptr->x, & ptptr->y) ; } point aPoint ; scanPoint (&aPoint) ; printPoint (aPoint) ;

  21. scan_point without -> void scanPoint (point *ptptr) { scanf (“%lf %lf”, &(*ptptr).x, &(*ptptr).y) ; } point aPoint ; scanPoint (&aPoint) ; print_point (aPoint) ;

  22. 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 ;

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

  24. 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

More Related