CSE1301 Computer Programming Lecture 23 Structures (Part 2)
CSE1301 Computer Programming Lecture 23 Structures (Part 2) Topics Structs and functions Arrays of structures Passing structs as Parameters Like any other variable, you can pass a struct as a parameter to a function Passing by value
CSE1301 Computer Programming Lecture 23 Structures (Part 2)
E N D
Presentation Transcript
Topics • Structs and functions • Arrays of structures
Passing structs as Parameters • Like any other variable, you can pass a struct as a parameter to a function • Passing by value • Pass the struct – use the values of the members, but don't change them • Passing by reference • Pass a pointer to the struct – you can change the values of the members
Passing a struct by Value • As always, the formal parameters are copies of the actual parameters void printRecord (Student item) { printf("Last name: %s\n",item.lastname); printf(" Mark: %.1f\n\n",item.mark); } main() { Student studentA = {“Gauss”, 99.0}; printRecord(studentA); }
Function Returning a struct StudentreadRecord ( void ) { Student newStudent; printf("Enter last name and mark: "); scanf("%s %f",newStudent.lastname,&(newStudent.mark)); return newStudent; } • A “package” containing several values main() { Student studentA; studentA =readRecord(); }
Passing structs by Reference • Pass a pointer to a struct • Change the value of some or all of the members • Changes are visible in the calling function as well as the called function
Passing structs by Reference (cont) void readStudent (Student* sptr) { printf(“Please enter name and ID\n”); scanf(“%s”, (*sptr).name ); /*parens needed*/ scanf(“%ld”, &((*sptr).id) ); } int main() { Student studentA; readStudent(&studentA); }
Passing structs by Reference (cont) • The parentheses around the (*sptr) are needed because of precedence • e.g., (*sptr).item • If you need the address of a member, you need another set of parentheses • e.g., &((*sptr).item)
Arrays of structs • Each element of the array is a whole struct, which includes all the members of that struct • To access a single value, you need to know which element of the array you're dealing with and which member of the struct, e.g., studentList[0].name studentList[i].id
id:123456789 0 name: "fred" id:123456788 1 name: "ralph" id: 123456787 2 name: "fong" id: 123456786 3 name: "rachel" Array of structs studentList
id:123456789 0 name: "fred" id:123456788 1 name: "ralph" id: 123456787 2 name: "fong" id: 123456786 3 name: "rachel" Array of structs studentList[0]gives you the whole struct studentList
id:123456789 0 name: "fred" id:123456788 1 name: "ralph" id: 123456787 2 name: "fong" id: 123456786 3 name: "rachel" Array of structs studentList studentList[3].namegives you the struct member
Arrays of structs #define MAXCLASS 30 typedef struct { long int id; char name[20]; } Student; ... Student sem1Class[MAXCLASS];
Arrays of structs Student sem1Class[MAXCLASS]; int i; for (i=0;i<MAXCLASS;i++) { printf("enter name\n"); scanf("%s",sem1Class[i].name); printf("enter id\n"); scanf("%d",&(sem1Class[i].id)); } name of array
Arrays of structs Student sem1Class[MAXCLASS]; int i; for (i=0;i<MAXCLASS;i++) { printf("enter name\n"); scanf("%s",sem1Class[i].name); printf("enter id\n"); scanf("%d",&(sem1Class[i].id)); } index into array
Arrays of structs Student sem1Class[MAXCLASS]; int i; for (i=0;i<MAXCLASS;i++) { printf("enter name\n"); scanf("%s",sem1Class[i].name); printf("enter id\n"); scanf("%d",&(sem1Class[i].id)); } the structure at this position in the array
Arrays of structs Student sem1Class[MAXCLASS]; int i; for (i=0;i<MAXCLASS;i++) { printf("enter name\n"); scanf("%s",sem1Class[i].name); printf("enter id\n"); scanf("%d",&(sem1Class[i].id)); } name of the member of the structure at that position in the array
#include <stdio.h> #include <stdlib.h> #define MAXLEN 50 #define MAXN 20 struct StudentRec { char lastname[MAXLEN]; float mark; }; typedef struct StudentRec Student; Student readRecord ( void ) { Student newStudent; printf("Enter last name and mark: "); scanf("%s %f", newStudent.lastname, &(newStudent.mark)); return newStudent; } void printRecord ( Student item ) { printf("Last name: %s\n", item.lastname); printf(" Mark: %.1f\n\n", item.mark); return; } Example: array of structs and pass-by-value-1
Example: array of structs and pass-by-value-2 int main() { int count = 0; Student class[MAXN]; int i; printf("How many students? "); scanf("%d", &count); if (count > MAXN) { printf("Not enough space.\n"); exit(1); } for (i=0; i < count; i++) { class[i] =readRecord(); } printf("\nClass list:\n\n"); for (i=0; i < count; i++) { printRecord(class[i]); } return 0; }
Using Arrays and Pointers typedef struct { int age; char name[20]; } Child; Child s[20]; • Some struct: s[13] • An item in some struct: s[4].age • A character in some name: s[7].name[3] • Address of some struct: &(s[2]) • An item in some struct pointed to: (*sptr).age • Address of above: &((*sptr).age) This is an address within a struct
Example: array of structs and pass-by-reference-1 #include <stdio.h> #include <stdlib.h> #define MAXLEN 50 #define MAXN 20 struct StudentRec { char lastname[MAXLEN]; float mark; }; typedef struct StudentRec Student; void readStudent ( Student* sptr ) { printf("Please enter name and mark\n"); scanf("%s", (*sptr).lastname ); /*parens needed*/ scanf("%f", &((*sptr).mark) ); return; } void printRecord ( Student item ) { printf("Last name: %s\n", item.lastname); printf(" Mark: %.1f\n\n", item.mark); return; }
Example: array of structs and pass-by-reference-2 int main() { int count = 0; Student class[MAXN]; int i; printf("How many students? "); scanf("%d", &count); if (count > MAXN) { printf("Not enough space.\n"); exit(1); } for (i=0; i < count; i++) { readStudent(&class[i]); } printf("\nClass list:\n\n"); for (i=0; i < count; i++) { printRecord(class[i]); } return 0; }
Reading • King, 16.1 – 16.3 • Deitel & Deitel,10.1 – 10.7 • Kernighan & Ritchie, 6.1, 6.2, 6.7