Download presentation
Presentation is loading. Please wait.
Published byBernadette Perkins Modified over 9 years ago
1
1 Structures Etter Chapter 7 In engineering, we need to process or visualize data –Some of you have done Matlab simulations and visualizations Sometimes we work with a single piece of data –E.g. the temperature reading at this point in time. But usually we’d work with a large set of data. –E.g. the temperature reading every minute for the last 8 hours. –This works out to 480 pieces of data.
2
2 Structures Pages 327 to 332 In Lecture 8, we solved this problem by using arrays. BUT arrays can only store data of a single type! –E.g. you can’t store strings in this array: double mydata[1024];
3
3 Structures Fortunately C gives us a way of representing related information of different types, in a “structure.” E.g. hurricanes have names, intensities and categories. –Name: This is a string. –Intensity: Integer. –Category: Intger.
4
4 Structures struct hurricane { char name[10]; int year, category; }; “name”, “year” and “category” are called “members” of the structure “hurricane” This statement declares a new type! –IT DOES NOT DECLARE A NEW VARIABLE! This “;” is very important and often forgotten!
5
5 Self Help Questions 1.What are the differences between a “variable” and a “type”?
6
6 Answer 1.A “type” tells C what the variable is. E.g. “int” is a type. “double” is a type. After declaring our structure “hurricane”, “struct hurricane” is also a type! Types do not occupy memory and cannot store values. To declare a variable, we always use “type varname;”. So to declare an integer variable, we use “int xl;”. This tells C that “x1” is a variable of type “int”. Variables occupy memory and can be assigned values.
7
7 Structure Variables To declare a new variable of the “hurricane” type, we do: struct hurricane h1; ? ? ? h1 name year category
8
8 Structure Variables You can declare multiple variables of this type: struct hurricane h1, my_hurricane; ? ? ? h1 name year category ? ? ? my_hurricane name year category
9
9 Structure Variables You can also initialize the members of a structure variable. struct hurricane h1 = {“Camille”, 1969, 5}; Camille 1969 5 h1 name year category
10
10 Structure Variables Alternatively you can initialize the members using C statements: struct hurricane h1; h1.name = “Camille”; h1.year = 1969; h1.category = 5; Notice how we used the “.” operator to access members of a structure variable!
11
11 Structure Example We can use scanf or fscanf statements to write to structure variable members. We can use printf or fprintf to read them. We will now write a program that reads hurricane information from a file, and prints them out.
12
12 Structure Example #include #define FILENAME "storms2.txt" struct hurricane { char name[10]; int year, category; };
13
13 Structure Example int main(void) { /* Declare variables */ struct hurricane h1; FILE *storms; storms = fopen(FILENAME, "r"); if(storms == NULL) printf("Error opening data file.\n");
14
14 Structure Example else { while(fscanf(storms, "%s %d %d", h1.name, &h1.year, &h1.category) == 3) { printf("Hurricane: %s\n", h1.name); printf("Year: %d, Category: %d\n", h1.year, h1.category); } fclose(storms); } /* else */ return 0; }
15
15 Self Help Questions 1.In the fscanf statement: fscanf(storms, "%s %d %d", h1.name, &h1.year, &h1.category) - h1.year and h1.category are both passed to fscanf with “&”, but not h1.name. Why?
16
16 ANSWERS The “name” member of “hurricane” is defined as char name[10]; struct hurricane { char name[10]; int year, category; };
17
17 ANSWERS This makes “name” an array of 10 characters. In an array: –The name of the array is a pointer to the first item of the array. “fscanf” expects pointers to the variable arguments. E.g.: fscanf(fptr, “%d”, &a); –This is so that fscanf can return the values read using these variables. –So we use “&” to get the address of the variable.
18
18 ANSWERS Since “name” is already a pointer to the first item of the “name” array, there is no need to use “&”. We can just pass in “name” instead of “&name”. –Further question: What does &name give you?
19
19 Computations with Structures We use the “.” operator to access individual members of a structure variable: h1.name=“Hazel”; If we use the structure variable’s name without the “.” operator, then we are accessing the entire array.
20
20 Computations with Structures You can do assignments with structures: –Given two structures “h1” and “h2”. To make h2 equal to h1, just do: h2 = h1;
21
21 Computation with Structures E.g. struct hurricane h1 ={“Hazel”, 1954, 4}, h2; ……… h2 = h1; Hazel 1954 4 h1 name year category ? ? ? h2 name year category Initially:
22
22 Computation with Structures E.g. struct hurricane h1 ={“Hazel”, 1954, 4}, h2; ……… h2 = h1; Hazel 1954 4 h1 name year category Hazel 1954 4 h2 name year category After h2=h1:
23
23 Computation with Structures Other operations like “+”, “-”, “*”, “/”, “>”, “ =“, “==“ etc. can only be performed on individual structure variable members. E.g. h1.category += 1;/* Increment */
24
24 Computation Example We will modify our hurricane program to print only the Category 5 hurricanes. –Can just do this by: if(h1.category == 5) /* Print hurricane data */
25
25 Computation Example #include #define FILENAME "storms2.txt" struct hurricane { char name[10]; int year, category; };
26
26 Computation Example int main(void) { struct hurricane h1; FILE *storms; storms = fopen(FILENAME, "r"); if(storms == NULL) printf("Error opening data file.\n");
27
27 Computation Example else { printf("Category 5 hurricanes\n\n"); while(fscanf(storms, "%s %d %d", h1.name, &h1.year, &h1.category) == 3) if(h1.category == 5) printf("%s\n", h1.name); fclose(storms); } /* else */ }
28
28 Passing Structures to Functions Pages 332 to 334 Entire structures can be passed into functions. –Structures are passed by value: Members of the actual arguments are copied into corresponding members of the formal parameters.
29
29 Passing Structures to Functions #include struct hurricane { char name[10]; int year, category; }; void print_struct(struct hurricane my_h) { printf("INSIDE print_struct function\n"); printf("Contents of parameter my_h: %s, %d, %d\n", my_h.name, my_h.year, my_h.category); printf("Address of parameter my_h: %u\n\n", &my_h); } Formal parameter declaration for a structure.
30
30 Passing Structures to Functions int main(void) { struct hurricane h1 = {"Hazel", 1954, 4}; printf("\nContents of h1: %s, %d, %d\n", h1.name, h1.year, h1.category); printf("Address of h1: %u\n", &h1); printf("Passing h1 in as argument to print_struct\n\n"); print_struct(h1); } Declaration for struct variable h1. Structure variable is passed in just like any other variable.
31
31 Passing Structures by Reference. Ordinarily, structures are passed by value. –This means that you cannot modify the members of a structure from within a function. To be able to modify structure members, you must pass in a pointer to the argument, rather than the argument itself.
32
32 Passing Structures by Reference Self Help Question If: –int *ptr declares a pointer to int. –double *ptr declares a pointer to a double. –char *ptr declares a pointer to a char. How do you: –Declare a pointer to a struct hurricane ?
33
33 Passing Structures by Reference #include /* This program has a function that modifies a structure passed to it */ struct hurricane { char name[10]; int year, category; };
34
34 Passing Structures by Reference void modify_structure(struct hurricane *hur) { /* Modify the structure values */ strncpy(hur->name, "Grace", 10); hur->year=1972; hur->category = 5; } Pointer to a struct hurricane. When accessing structure members from a pointer, use “ -> ” instead of “.”.
35
35 Passing Structures by Reference int main(void) { struct hurricane h1={"Audrey", 1957, 4}; printf("Contents of h1: %s %d %d\n", h1.name, h1.year, h1.category); printf("\nCalling modify_structure to change the contents of h1.\n\n"); modify_structure(&h1); printf("Contents of h1: %s %d %d\n\n", h1.name, h1.year, h1.category); } Pass in the address of h1, instead of h1 itself.
36
36 Passing Structures by Reference One point to note: –When accessing members of a structure variable, we use the “.” operator. –E.g. struct hurricane my_hurricane; my_hurricane.year=1852;
37
37 Passing Structures by Reference One point to note: –When accessing members of a pointer to a structure variable, we use the “ -> ” operator. –E.g. struct hurricane *ptr = &my_hurricane; ptr->year=1952; –“ ptr->year ” is a shortcut for (*ptr).year ;
38
38 Returning Structures from Functions. A function can return whole structures. To declare a function that returns an int, we do: int myfun1() { … } To declare a function that returns a char, we do: char myfun2() { … }
39
39 Returning Structures from Functions. To call these functions: char c; int num; num = myfun1(); c = myfun2();
40
40 Returning Structures from Functions. Likewise, to declare a function that returns struct hurricane: struct hurrican myfun3(…) { … } To call myfun3: struct hurricane my_h; my_h = myfun3();
41
41 Example #include struct tsunami { int mo, da, yr, fatalities; double max_height; char location[20]; }; struct tsunami get_info(void);
42
42 Example struct tsunami get_info(void) { /* Declare variables */ struct tsunami t1; printf("Enter information for tsunami in the following order:\n"); printf("Enter month, day, year, number of deaths:\n"); scanf("%d %d %d %d", &t1.mo, &t1.da, &t1.yr, &t1.fatalities); printf("Enter location (<20 characters.):\n"); scanf("%s", t1.location); return t1; } t1 will temporarily store what the user keys in. t1 is returned here.
43
43 Example int main(void) { struct tsunami my_t; my_t = get_info(); printf("\nThe information you entered:\n\n"); printf("Date (day/month/year): %d/%d/%d\n", my_t.da, my_t.mo, my_t.yr); printf("Location: %s\n", my_t.location); printf("Fatalities: %d\n\n", my_t.fatalities); return 0; } We declare a variable of type struct tsunami, the exact same type as the function get_info. We call get_info just like any other function.
44
44 Arrays of Structures (Pages 334 to 336) Refresher: –To declare an array of 20 ints: int my_array1[20]; –To declare an array of 20 doubles: double my_array2[20]; –To declare an array of 20 chars: char my_array3[20]; Question: How do we declare an array of “struct hurricane”?
45
45 Array of Structures Assuming we have already declared “struct hurricane”, do declare an array of 20 “struct hurricane”: struct hurricane my_array4[20];
46
46 Array of Structures This creates 20 “struct hurricane” variables, each with: –name –year –category All values are un- initialized. ??? ??? ??? ??? ……… ??? nameyearcategory 0 1 2 3 19
47
47 Array of Structures Refresher: –To access individual ints in my_array1: myarray1[2] = 5; –To access individual doubles in my_array2: myarray2[5] = 3.1; –To access individual chars in my_array3: myarray3[2] = ‘c’; So: –How to we access individual struct variables?
48
48 Array of Structures Answer: my_array4[0].name = “Camille”; my_array4[0].year = 1969; my_array4[0].category = 5;
49
49 Example /* Program ch7_4.c */ #include #define FILENAME "storms2.txt" struct hurricane { char name[10]; int year, category; }; void print_hurricane(struct hurricane h);
50
50 Example int main(void) { int max_category=0, k=0, npts; struct hurricane h[100]; FILE *storms; storms = fopen(FILENAME, "r"); if(storms == NULL) printf("Error opening data file.\n"); else { printf("Hurricanes with Maximum Category:\n");
51
51 Example while(fscanf(storms, "%s %d %d", h[k].name, &h[k].year, &h[k].category) == 3) { if(h[k].category > max_category) max_category = h[k].category; k++; } /* while */ npts = k; for(k=0; k<npts; k++) if(h[k].category == max_category) print_hurricane(h[k]); fclose(storms); } /* else */ }
52
52 Example void print_hurricane(struct hurricane h) { printf("Hurricane: %s\n", h.name); printf("Year: %d, Category: %d\n", h.year, h.category); }
53
53 Case Study (Pages 336 to 340) Tsunamis are large destructive waves: –Caused by sudden movements in the sea floor. Wave speeds: –Shallow water: 125 mph. –Deep water: 400 mph. Heights: –30 to 200+ feet high.
54
54 Case Study Problem Statement: Print a report giving: –Maximum wave height for tsunamis in a data file. –Average wave height. –Location of all tsunamis with heights higher than the average.
55
55 Case Study Analysis: –Open file “waves2.txt” Tell the user if the file open fails. –Find largest maximum height. Set max to 0 first. Assume the tsunami array is called t: –If t[k].max_height > max, set max = t[k].max_height. –Find average Add t[k] to sum. Average = sum / # of data points
56
56 Case Study –Print locations with wave heights larger than the average: if t[k].max_height > average, print t[k].location. Note: Height data in file is in meters. Report is in feet: –1 m = 3.28 feet. –z m = z * 3.28 feet.
57
57 Case Study /* ch7_5.c */ #include #define FILENAME "waves1.txt" struct tsunami { int mo, da, yr, fatalities; double max_height; char location[20]; };
58
58 Case Study int main(void) { /* Declare variables */ int k=0, npts; double max=0, sum=0, ave; struct tsunami t[100]; FILE *waves; waves = fopen(FILENAME, "r"); if(waves == NULL) printf("Error opening data file.\n");
59
59 Case Study else { while(fscanf(waves, "%d %d %d %d %lf %s", &t[k].mo, &t[k].da, &t[k].yr,&t[k].fatalities, &t[k].max_height, t[k].location) == 6) { sum += t[k].max_height; if(t[k].max_height > max) max = t[k].max_height; k++; } /* while */
60
60 Case Study npts = k; ave = sum/npts; printf("Summary Information for Tsunamis\n"); printf("Maximum wave height (in feet): %.2f\n", max * 3.28); printf("Average wave height (in feet): %.2f\n", ave * 3.28);
61
61 Case Study printf("Tsunamis with greater than average heights:\n\n"); for(k=0; k<npts; k++) if(t[k].max_height > ave) printf("%s\n", t[k].location); fclose(waves); } /* else */ }
62
62 Summary In this lecture we learnt: –How to aggregate data together in structures. –How to pass structures to functions. –How to return structures in functions. –How to declare arrays of structures.
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.