1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

23
1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)
  • date post

    22-Dec-2015
  • Category

    Documents

  • view

    226
  • download

    2

Transcript of 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

Page 1: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

1

CSE1301Computer Programming

Lecture 23Structures (Part 2)

Page 2: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

2

Topics• Structs and functions

• Arrays of structures

Page 3: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

3

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

Page 4: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

4

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);}

Page 5: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

5

Function Returning a struct• A “package” containing several values

main(){ Student studentA; studentA = readRecord();}

Student readRecord ( void ){ Student newStudent; printf("Enter last name and mark: "); scanf("%s %f",newStudent.lastname,&(newStudent.mark)); return newStudent;}

Page 6: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

6

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

Page 7: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

7

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);}

Page 8: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

8

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)

Page 9: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

9

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

Page 10: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

10

Array of structs

id:123456789

name: "fred"

id:123456788

name: "ralph"

id: 123456787

name: "fong"

id: 123456786

name: "rachel"

0

1

2

3

studentList

Page 11: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

11

Array of structs

studentList studentList[0]gives you the whole

struct

id:123456789

name: "fred"

id:123456788

name: "ralph"

id: 123456787

name: "fong"

id: 123456786

name: "rachel"

0

1

2

3

Page 12: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

12

Array of structs

studentList

studentList[3].name gives you the struct

member

id:123456789

name: "fred"

id:123456788

name: "ralph"

id: 123456787

name: "fong"

id: 123456786

name: "rachel"

0

1

2

3

Page 13: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

13

Arrays of structs

#define MAXCLASS 30

typedef struct {

long int id;

char name[20];

} Student;

...

Student sem1Class[MAXCLASS];

Page 14: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

14

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

Page 15: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

15

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

Page 16: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

16

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

Page 17: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

17

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

Page 18: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

18

Example: array of structs and pass-by-value-1#include <stdio.h>#include <stdlib.h>

#define MAXLEN 50#define MAXN 20struct 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;}

Page 19: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

19

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

Example: array of structs and pass-by-value-2

Page 20: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

20

Using Arrays and Pointers

• 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

typedef struct {int age;char name[20];

} Child;Child s[20];

Page 21: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

21

#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-1

Page 22: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

22

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

Example: array of structs and pass-by-reference-2

Page 23: 1 CSE1301 Computer Programming Lecture 23 Structures (Part 2)

23

•King, 16.1 – 16.3

•Deitel & Deitel,10.1 – 10.7

•Kernighan & Ritchie, 6.1, 6.2, 6.7

Reading