CS1313 Structures Lesson

Structures Lesson Outline 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Structures Lesson Outline

Beyond Arrays A Company and Its Employees #1 A Company and Its Employees #2 Multiple Employees #1 Multiple Employees #2 Multiple Employees #3 A New Data Type #1 A New Data Type #2 A New Data Type #3 Structure Definition Breakdown Structure Instance Declaration #1 Structure Instance Declaration #2 Structure Instance Declaration #3 Structure Instance Declaration #4 Fields of a Structure Instance #1 Fields of a Structure Instance #2 Fields of a Structure Instance #3 Fields of a Structure Instance #4 20. 21. 22.

23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. Structure Fields Like Array Elements #1 Structure Fields Like Array Elements #2 Structure Example #1

Structure Example #2 Structure Example #3 Structure Example #4 Structure Example #5 Structure Array Structure Array: Static vs Dynamic Structure Array: Dynamic Allocation Structure Array: Indexing Structure Array: Elements Field Access Structure Array Example #1 Structure Array Example #2 Structure Array Example #3 Structure Array Example #4 Structure Array Example #5 Structure Array Example #6 Structure Array Example #7 Structure Array Example #8 Structure Array Example #9 Structures Lesson CS1313 Fall 2019

1 Beyond Arrays An array is a collection of values, all of which have the same data type, and all of which have the same essential meaning: float* independent_variable = (float*)NULL; In memory, the elements of the array are contiguous: they occur one after the other in memory. 37 37 68 31 31 35 49 27 26 49 60 28 What if, instead of having a collection of data that all have the same data type and meaning, we had a collection of data that had different data types and different meanings? Structures Lesson CS1313 Fall 2019 2 A Company and Its Employees #1 Suppose that we work for some company, and our boss tells us

to write a program that tracks the companys employees. What data will we need? Well, well probably need to know things like: first name; last name; pay rate; number of hours worked this week; social security number. How could we implement this in C? Structures Lesson CS1313 Fall 2019 3 A Company and Its Employees #2 How could we implement this in C? Well, we could simply set up a scalar variable to represent each of these values (and strings for the names): char* first_name; char* last_name; float pay_rate;

float hours_worked_this_week; int social_security_number; Of course, this arrangement would work if our company had exactly one employee. But what if our company has multiple employees? Structures Lesson CS1313 Fall 2019 4 Multiple Employees #1 Okay, so suppose that the company has multiple employees. How could we store the data for them? Well, we could have an array for each of the pieces of data: char* char* float float int

first_name[number_of_employees]; last_name[number_of_employees]; pay_rate[number_of_employees]; hours_worked_this_week[number_of_employees]; social_security_number[number_of_employees]; Structures Lesson CS1313 Fall 2019 5 Multiple Employees #2 char* char* float float int first_name[number_of_employees]; last_name[number_of_employees]; pay_rate[number_of_employees]; hours_worked_this_week[number_of_employees];

social_security_number[number_of_employees]; This approach will work fine, but itll be unwieldy to work with. Why? Because it doesnt match the way that we think about our employees. That is, we dont think of having several first names, several last names, several social security numbers and so on; we have several employees. Structures Lesson CS1313 Fall 2019 6 Multiple Employees #3 We dont think of having several first names, several last names, several social security numbers and so on. Instead, we think of having several employees, each of whom has a first name, a last name, a social security number, etc. In general, its much easier to write a program if we can write it in a way that matches the way we think as much as possible.

So: What if we could create a new data type, named Employee, that represented an employee? Structures Lesson CS1313 Fall 2019 7 A New Data Type #1 typedef struct { char* first_name; char* last_name; float pay_rate; float hours_worked_this_week; int social_security_number; } Employee; The above declaration creates a new data type, named Employee. This is known as a user-defined data type or a user-defined data structure.

Structures Lesson CS1313 Fall 2019 8 A New Data Type #2 typedef struct { char* first_name; char* last_name; float pay_rate; float hours_worked_this_week; int social_security_number; } Employee; The user-defined data type Employee consists of: a character string, first_name; a character string, last_name; a float scalar, pay_rate; a float scalar, hours_worked_this_week; an int scalar, social_security_number. Structures Lesson

CS1313 Fall 2019 9 A New Data Type #3 typedef struct { char* first_name; char* last_name; float pay_rate; float hours_worked_this_week; int social_security_number; } Employee; In C, this construct is referred to as a structure definition, and (surprise!) it defines a structure. The general term for this is a user-defined data type. NOTE: A structure definition, as above, only defines the new data type; it DOESNT DECLARE any actual instances of data of the new data type. Structures Lesson

CS1313 Fall 2019 10 Structure Definition Breakdown typedef struct { char* first_name; char* last_name; float pay_rate; float hours_worked_this_week; int social_security_number; } Employee; A structure definition consists of: a typedef struct statement and block open {; a sequence of field definitions, which tell us the pieces of data that constitute an instance of the structure; a block close } and the name of the structure, followed by a statement terminator. Structures Lesson CS1313 Fall 2019

11 Structure Instance Declaration #1 typedef struct { char* first_name; char* last_name; float pay_rate; float hours_worked_this_week; int social_security_number; } Employee; The above struct definition defines the struct named Employee, but DOESNT DECLARE any instance of data whose data type is Employee. Structures Lesson CS1313 Fall 2019 12 Structure Instance Declaration #2

typedef struct { char* first_name; char* last_name; float pay_rate; float hours_worked_this_week; int social_security_number; } Employee; To declare an instance of an Employee, we need to do like so: Employee worker_bee; Structures Lesson CS1313 Fall 2019 13 Structure Instance Declaration #3 typedef struct { char* first_name; char* last_name; float pay_rate; float hours_worked_this_week;

int social_security_number; } Employee; Employee worker_bee; The last statement above declares that worker_bee is an instance of type Employee. The declaration statement tells the compiler to grab a group of bytes, name them worker_bee, and think of them as storing an Employee. Structures Lesson CS1313 Fall 2019 14 Structure Instance Declaration #4 typedef struct { char* first_name; char* last_name; float pay_rate; float hours_worked_this_week; int social_security_number;

} Employee; Employee worker_bee; How many bytes? That depends on the platform and the compiler, but the short answer is that its the sum of the sizes of the fields. Structures Lesson CS1313 Fall 2019 15 Fields of a Structure Instance #1 typedef struct { char* first_name; char* last_name; float pay_rate; float hours_worked_this_week; int social_security_number; } Employee; Employee worker_bee; Okay, so now we have an instance of data type Employee

named worker_bee. But how can we use the values of its field data? For example, how do we get the social security number of worker_bee? Structures Lesson CS1313 Fall 2019 16 Fields of a Structure Instance #2 typedef struct { char* first_name; char* last_name; float pay_rate; float hours_worked_this_week; int social_security_number; } Employee; Employee worker_bee; To use an individual field of a struct, we use the field operator, which is the period: worker_bee.social_security_number

Structures Lesson CS1313 Fall 2019 17 Fields of a Structure Instance #3 typedef struct { char* first_name; char* last_name; float pay_rate; float hours_worked_this_week; int social_security_number; } Employee; Employee worker_bee; For example, we can assign a value to the social security number of worker_bee: worker_bee.social_security_number = 123456789; This is equivalent to using an index in an array: independent_variable[student] = 24.5;

Structures Lesson CS1313 Fall 2019 18 Fields of a Structure Instance #4 typedef struct { char* first_name; char* last_name; float pay_rate; float hours_worked_this_week; int social_security_number; } Employee; Employee worker_bee; Likewise, we can output the social security number of worker_bee: printf("%d\n", worker_bee.social_security_number); This is equivalent to using an index in an array: printf("%f\n", independent_variable[student]);

Structures Lesson CS1313 Fall 2019 19 Structure Fields Like Array Elements #1 We said that we can use the field operator (period) to get an individual field of an instance of a struct: worker_bee.social_security_number = 123456789; printf("%d\n", worker_bee.social_security_number); Notice that this usage is analogous to the use of an index with an array: independent_variable[student] = 24.5; printf("%f\n", independent_variable[student]); Structures Lesson CS1313 Fall 2019 20 Structure Fields Like Array Elements #2

In the case of arrays, we said that an individual element of an array behaves exactly like a scalar of the same data type. Likewise, a field of a struct behaves exactly like a variable of the same data type as the field. For example: worker_bee.social_security_number can be used exactly like an int scalar; worker_bee.first_name can be used exactly like a character string. Structures Lesson CS1313 Fall 2019 21 Structure Example #1 #include #include #include int main () { /* main */

typedef struct { char* first_name; char* last_name; float pay_rate; float hours_worked_this_week; int social_security_number; } Employee; const int maximum_name_length = 32; const int program_failure_code = -1; const int program_success_code = 0; Employee worker_bee; char dummy_name[maximum_name_length + 1]; float worker_bee_pay; Structures Lesson CS1313 Fall 2019 22 Structure Example #2 printf("What is the first name of the employee?\ n");

fgets(dummy_name, maximum_name_length, stdin); Huh? if (dummy_name[strlen(dummy_name)-1] == \n) { dummy_name[strlen(dummy_name)-1] = \0; } /* if (dummy_name[strlen(dummy_name)-1]==\n) */ worker_bee.first_name = (char*)malloc(sizeof(char) * (strlen(dummy_name) + 1)); strcpy(worker_bee.first_name, dummy_name); printf("What is the last name of the employee?\n"); fgets(dummy_name, maximum_name_length, stdin); if (dummy_name[strlen(dummy_name)-1] == \n) { dummy_name[strlen(dummy_name)-1] = \0; } /* if (dummy_name[strlen(dummy_name)-1]==\n) */ worker_bee.last_name = (char*)malloc(sizeof(char) * (strlen(dummy_name) + 1)); Structures Lesson CS1313 Fall 2019 23 Structure Example #3

strcpy(worker_bee.last_name, dummy_name); printf("What is %s %ss pay rate in \$/hour?\n", worker_bee.first_name, worker_bee.last_name); scanf("%f", &worker_bee.pay_rate); printf("How many hours did %s %s work this week?\ n", worker_bee.first_name, worker_bee.last_name); scanf("%f", &worker_bee.hours_worked_this_week); printf("What is %s %ss social security number?\n", worker_bee.first_name, worker_bee.last_name); scanf("%d", &worker_bee.social_security_number); Structures Lesson CS1313 Fall 2019 24 Structure Example #4 worker_bee_pay = worker_bee.pay_rate * worker_bee.hours_worked_this_week; printf("Employee %s %s (%9.9d)\n",

worker_bee.first_name, worker_bee.last_name, worker_bee.social_security_number); printf(" worked %2.2f hours this week\n", worker_bee.hours_worked_this_week); printf(" at a rate of \$%2.2f per hour,\n", worker_bee.pay_rate); printf(" earning \$%2.2f.\n", worker_bee_pay); return program_success_code; } /* main */ Structures Lesson CS1313 Fall 2019 25 Structure Example #5 % gcc -o employee_test employee_test.c % employee_test What is the first name of the employee? Henry What is the last name of the employee?

Neeman What is Henry Neemans pay rate in \$/hour? 12.5 How many hours did Henry Neeman work this week? 22.75 What is Henry Neemans social security number? 123456789 Employee Henry Neeman (123456789) worked 22.75 hours this week at a rate of \$12.50 per hour, earning \$284.38. Structures Lesson CS1313 Fall 2019 26 Structure Array When we started working on this task, we wanted to figure out a convenient way to store the many employees of the company. So far, weve worked out how to define a structure,

how to declare an individual instance of the struct, and how to use the fields of the instance. So, how would we declare and use an array of instances of a struct? Employee worker_bee_array[maximum_employees]; Structures Lesson CS1313 Fall 2019 27 Structure Array: Static vs Dynamic Employee worker_bee_array[maximum_employees]; Not surprisingly, an array whose elements are a struct can either be declared to be statically allocated (above) or dynamically allocatable (below): Employee* worker_bee_array2 = (Employee*)NULL; Structures Lesson CS1313 Fall 2019

28 Structure Array: Dynamic Allocation Employee* worker_bee_array2 = (Employee*)NULL; If a struct array is declared to be dynamically allocatable, then allocating it looks just like allocating an array of a scalar data type: worker_bee_array2 = (Employee*)malloc(sizeof(Employee) * number_of_employees); Structures Lesson CS1313 Fall 2019 29 Structure Array: Indexing An individual element of an array of some struct data type can be accessed using indexing, exactly as if it were an element of an array of scalar data type: worker_bee_array[index]

Structures Lesson CS1313 Fall 2019 30 Structure Array: Elements Field Access Fields of an individual element of an array of a struct data type can be accessed thus: worker_bee_array[index].pay_rate For example: worker_bee_array[index].pay_rate = 6.50; printf("%f\n", worker_bee_array[index].pay_rate); Structures Lesson CS1313 Fall 2019 31 Structure Array Example #1 #include #include

#include int main () { /* main */ typedef struct { char* first_name; char* last_name; float pay_rate; float hours_worked_this_week; int social_security_number; } Employee; const int maximum_name_length = 32; const int program_failure_code = -1; const int program_success_code = 0; Employee* worker_bee = (Employee*)NULL; float* worker_bee_pay = (float*)NULL; char dummy_name[maximum_name_length + 1]; int number_of_worker_bees, index;

Structures Lesson CS1313 Fall 2019 32 Structure Array Example #2 printf("How many employees does the company have?\n"); scanf("%d", &number_of_worker_bees); worker_bee = (Employee*)malloc(sizeof(Employee) * number_of_worker_bees); if (worker_bee == (Employee*)NULL) { printf("ERROR: cant allocate worker_bee array "); printf("of length %d Employees\n", number_of_worker_bees); exit(program_failure_code); } /* if (worker_bee == (Employee*)NULL) */ worker_bee_pay = (float*)malloc(sizeof(float) * number_of_worker_bees); if (worker_bee_pay == (float*)NULL) { printf("ERROR: cant allocate worker_bee_pay ");

printf("array of length %d floats", number_of_worker_bees); exit(program_failure_code); } /* if (worker_bee_pay == (float*)NULL) */ Structures Lesson CS1313 Fall 2019 33 Structure Array Example #3 for (index = 0; index < number_of_worker_bees; index++) { /* I DO NOT UNDERSTAND WHY THIS IS NEEDED! */ getchar(); printf("What is the first name of "); printf("employee #%d?\n", index); fgets(dummy_name, maximum_name_length, stdin); if (dummy_name[strlen(dummy_name)-1] == \n) { dummy_name[strlen(dummy_name)-1] = \0; } /* if (dummy_name[strlen(dummy_name)-1]...) */ worker_bee[index].first_name =

(char*)malloc(sizeof(char) * (strlen(dummy_name) + 1)); strcpy(worker_bee[index].first_name, dummy_name); Structures Lesson CS1313 Fall 2019 34 Structure Array Example #4 */ printf("What is the last name of "); printf("employee #%d?\n", index); fgets(dummy_name, maximum_name_length, stdin); if (dummy_name[strlen(dummy_name)-1] == \n) { dummy_name[strlen(dummy_name)-1] = \0; } /* if (dummy_name[strlen(dummy_name)-1]...) worker_bee[index].last_name = (char*)malloc(sizeof(char) *

(strlen(dummy_name) + 1)); strcpy(worker_bee[index].last_name, dummy_name); Structures Lesson CS1313 Fall 2019 35 Structure Array Example #5 printf("What is %s %ss pay rate in \$/hour?\n", worker_bee[index].first_name, worker_bee[index].last_name); scanf("%f", &worker_bee[index].pay_rate); printf("How many hours did %s %s work ", worker_bee[index].first_name, worker_bee[index].last_name); printf("this week?\n"); scanf("%f", &worker_bee[index].hours_worked_this_week); printf("What is %s %ss ", worker_bee[index].first_name,

worker_bee[index].last_name); printf("social security number?\n"); scanf("%d", &worker_bee[index].social_security_number); } /* for index */ Structures Lesson CS1313 Fall 2019 36 Structure Array Example #6 for (index = 0; index < number_of_worker_bees; index++) { worker_bee_pay[index] = worker_bee[index].pay_rate * worker_bee[index].hours_worked_this_week; } /* for index */ Structures Lesson CS1313 Fall 2019

37 Structure Array Example #7 for (index = 0; index < number_of_worker_bees; index++) { printf("Employee %s %s (%9.9d)\n", worker_bee[index].first_name, worker_bee[index].last_name, worker_bee[index].social_security_number); printf(" worked %2.2f hours this week\n", worker_bee[index].hours_worked_this_week); printf(" at a rate of \$%2.2f per hour,\n", worker_bee[index].pay_rate); printf(" earning \$%2.2f.\n", worker_bee_pay[index]); } /* for index */ return program_success_code; } /* main */ Structures Lesson CS1313 Fall 2019

38 Structure Array Example #8 % gcc -o employee_array_test employee_array_test.c % employee_array_test How many employees does the company have? 2 What is the first name of employee #0? Henry What is the last name of the employee #0? Neeman What is Henry Neemans pay rate in \$/hour? 12.5 How many hours did Henry Neeman work this week? 22.75 What is Henry Neemans social security number? 123456789 Structures Lesson CS1313 Fall 2019 39

Structure Array Example #9 What is the first name of employee #1? Lee What is the last name of the employee #1? Kim What is Lee Kims pay rate in \$/hour? 8.75 How many hours did Lee Kim work this week? 40 What is Lee Kims social security number? 987654321 Employee Henry Neeman (123456789) worked 22.75 hours this week at a rate of \$12.50 per hour, earning \$284.38. Employee Lee Kim (987654321) worked 40.00 hours this week at a rate of \$8.75 per hour, earning \$350.00. Structures Lesson

CS1313 Fall 2019 40

Recently Viewed Presentations

• The AquaWatch Mission. To improve the coordination, delivery and utilization of water quality information for the benefit of society. The . AquaWatch. Goal. To develop, build & disseminate global capacity and utility of Earth Observation-derived water quality data, products and...
• Giemsa dye . 2 points. 2. What is a centromere? areas where the two chromatids are joined . ... banding pattern. centromere position. 3 points. 2. Sketch or describe: metacentric, submetacentric, acrocentric. metacentric - centromere is near the center.
• Students learn at their own pace through a range of options (e.g., traditional courses, work-based learning, applied learning, and online or blended learning environment) as they strive to gain competencies. Students can demonstrate mastery at any time.
• Requires capable local management capacity. Distinctive role of city and regional government ED is not like mot municipal services or functions. Influencing and shaping market based processes. Not a local government monopoly. New organisational forms: partnerships, JVs, companies, and development...
• Liz Woodham, NRICH Project & Michael Hall, Open University ... on day 1 Common mathematical needs identified on day 7 Second aim of the Mathematics National Curriculum Slide 7 Maze 100 Slide 9 Mystery Matrix Slide 11 Slide 12 What...