1 cse1301 computer programming lecture 20 structures (part 1)

35
1 CSE1301 Computer Programming Lecture 20 Structures (Part 1)

Post on 21-Dec-2015

235 views

Category:

Documents


2 download

TRANSCRIPT

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

1

CSE1301Computer Programming

Lecture 20Structures (Part 1)

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

2

Topics• Structure

• Arrays of structs• typedef• structs and functions

• Pointers to structs• structs within structs• Data structures and modular design

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

3

What is a Structure?

• A collection of related variables under one aggregate name

• May contain variables of different types

• Using structures:– Define the structure– Declare/Initialize instances of the structure– Access members of an instance of the structure

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

4

Structure Definition

Lunchbox

Define a structure called “Lunchbox” which has the following compartments:• a fruit compartment• a sandwich compartment• a drink compartment

• A structure is a blueprint

• Example:

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

5

Structure Definition (cont)

• A struct is used to specify the blueprint

• The members specify different aspects of a struct

• Example:

struct LunchBox{ int fruit; float drink; char sandwich[MAXN];};Lunchbox

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

6

Structure Variable

• Instance of a structure: actual series of contiguous memory locations for storage

struct LunchBox kyle;struct LunchBox stan, cartman, kenny;struct LunchBox kids[5];

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

7

Initializing a struct Variable

struct LunchBox kyle = { 1, 370.0, “ham”};

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

8

Initializing a struct Variable (cont)

struct LunchBox kids[5] = { {1, 370.0, “ham” },

{2, 100.0, “roast”}, {0, 0.0, “muffin”},

{1, 300.0, “salad”}, {0, 0.0, “”} };

0 1 2 3 4

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

9

Members of a struct Variable

struct LunchBox stan, kenny;

stan.drink = 0.0;stan.fruit = 0;strcpy(stan.sandwich,“fruit cake”);

kenny.fruit = 1;strcpy(kenny.sandwich, “muffin”);kenny.drink = 300.0;

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

10

Members of a struct Variable

struct LunchBox kids[3];int index = 1;

kids[0].drink = 300.0;kids[0].fruit = 1;strcpy(kids[2].sandwich, “ham”);

kids[index].fruit = 3;

0

1

2kids[index+1].drink = kids[index - 1].drink;

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

11

Input/Output of struct• Library functions printf() and scanf() do not

have format conversion specifiers for structs

• Input/Output for each member only

struct LunchBox cartman;

scanf(“%d”, &(cartman.fruit));scanf(“%f”, &(cartman.drink));scanf(“%s”, cartman.sandwich);

printf(“%d, %f\n”, cartman.fruit, cartman.drink);printf(“%s\n”, cartman.sandwich);

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

12

Input/Output of struct (cont)struct LunchBox kids[3];int i = 0;for (i=0; i < 3; i++){ scanf(“%d %f %s”, &(kids[i].fruit),&(kids[i].drink), kids[i].sandwich);}for (i=0; i < 3; i++){ printf(“%d, %f, %s\n”, kids[i].fruit, kids[i].drink, kids[i].sandwich);}

0

1

2

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

13

Example: Student Record

• Write a program to read in and print a list of student last names and test marks

input number of students

for each student in the list{ input last name and mark}for each student in the list{ output last name and mark}

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

14

#include <stdio.h>#include <stdlib.h>

#define MAXLEN 50#define MAXN 20

int main(){ char lastname[MAXN][MAXLEN]; float mark[MAXN]; int count = 0; int i; printf("How many students? "); scanf("%d", &count);

marks1.c

Example without struct-1

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

15

if (count > MAXN) { printf("Not enough space.\n"); exit(1); } for (i=0; i < count; i++) { printf("Enter last name and mark: "); scanf("%s %f", lastname[i], &mark[i]); }

printf("\nClass list:\n\n"); for (i=0; i < count; i++) { printf("Last name: %s\n", lastname[i]); printf(" Mark: %.1f\n\n", mark[i]); } return 0;} marks1.c

Example without struct-2

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

16

Example: Student Record

• Define a struct: StudentRec

struct StudentRec{ char lastname[MAXLEN]; float mark;};

• Easy to extend later to include ID number, first name, etc

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

17

Example with struct (testing)#include <stdio.h>#define MAXLEN 50struct StudentRec{ char lastname[MAXLEN]; float mark;};int main(){ struct StudentRec studA; struct StudentRec studB;

printf("Enter last name and mark for student A: "); scanf("%s %f", studA.lastname, &(studA.mark)); printf("Enter last name and mark for student B: "); scanf("%s %f", studB.lastname, &(studB.mark)); printf("Student A: %s\t%f\n", studA.lastname, studA.mark); printf("Student B: %s\t%f\n", studB.lastname, studB.mark); return 0;} marks2a.c

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

18

#include <stdio.h>#include <stdlib.h>

#define MAXLEN 50#define MAXN 20

struct StudentRec{ char lastname[MAXLEN]; float mark;};int main(){ struct StudentRec class[MAXN]; int count = 0; int i; printf("How many students? "); scanf("%d", &count);

marks3a.c

Example with struct-1

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

19

if (count > MAXN) { printf("Not enough space.\n"); exit(1); } for (i=0; i < count; i++) { printf("Enter last name and mark: "); scanf("%s %f", class[i].lastname, &(class[i].mark)); } printf("\nClass list:\n\n"); for (i=0; i < count; i++) { printf("Last name: %s\n", class[i].lastname); printf(" Mark: %.1f\n\n", class[i].mark); } return 0;} marks3a.c

Example with struct-2

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

20

Common Mistake

struct StudentRec{ char lastname[MAXLEN]; float mark;};

Do not forget the semicolon here!

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

21

Notes on structs• Initialization vs. Assignment

struct StudentRec studA = {“Fermat”, 90};

struct StudentRec studA;studA = {“Fermat”, 90};

struct StudentRec studA = {“Fermat”, 90};struct StudentRec studB;

studB = studA; /* struct contains pointers? */

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

22

Notes on structs (cont)• struct variables cannot be compared • We can perform member comparisons only

if (studA == studB){ printf(“Duplicate data.\n”);}

if (strcmp(studA.lastname, studB.lastname) == 0 && (studA.mark == studB.mark) ){ printf(“Duplicate data.\n”);}

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

23

Notes on structs (cont)

struct StudentRec{ char lastname[MAXLEN]; float mark;} studA, studB, class[MAXN];

• We can define a struct, and declare instances of that struct

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

24

typedef

• A typedef statement makes an identifier equivalent to a type specification

struct StudentRec{ char lastname[MAXLEN]; float mark;};

struct StudentRec studentA;struct StudentRec class[MAXN];

Example without typedef

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

25

struct StudentRec{ char lastname[MAXLEN]; float mark;};typedef struct StudentRec Student;

Student studA;Student class[MAXN];

Example with

typedef

typedef (cont)• The typedef statement makes an

identifier equivalent to a type specification

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

26

Example with typedef (testing)#include <stdio.h>#define MAXLEN 50struct StudentRec{ char lastname[MAXLEN]; float mark;};typedef struct StudentRec Student;int main(){ Student studA; Student studB; printf("Enter last name and mark for student A: "); scanf("%s %f", studA.lastname, &(studA.mark)); printf("Enter last name and mark for student B: "); scanf("%s %f", studB.lastname, &(studB.mark)); printf("Student A: %s\t%f\n", studA.lastname, studA.mark); printf("Student B: %s\t%f\n", studB.lastname, studB.mark); return 0;} marks2b.c

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

27

Example with typedef-1#include <stdio.h>#include <stdlib.h>

#define MAXLEN 50#define MAXN 20

struct StudentRec{ char lastname[MAXLEN]; float mark;};

typedef struct StudentRec Student;

int main(){ int count = 0; Student class[MAXN]; int i; printf("How many students? "); scanf("%d", &count); marks3b.c

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

28

if (count > MAXN) { printf("Not enough space.\n"); exit(1); } for (i=0; i < count; i++) { printf("Enter last name and mark: "); scanf("%s %f", class[i].lastname, &(class[i].mark) ); } printf("\nClass list:\n\n"); for (i=0; i < count; i++) { printf("Last name: %s\n", class[i].lastname); printf(" Mark: %.1f\n\n", class[i].mark); } return 0;}

marks3b.c

Example with typedef-2

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

29

Notes on typedef

• Yet another way of using typedef:

typedef struct{ char lastname[MAXLEN]; float mark;} Student;

Student studA, studB;Student class[MAXN];

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

30

Passing a struct to a Function• 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 31: 1 CSE1301 Computer Programming Lecture 20 Structures (Part 1)

31

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

Version 1

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

32

Function Returning a struct (cont)

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

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

Version 2

• A “package” containing several values

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

33

Example: Structs and Functions-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);} marks4a.c

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

34

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

marks4a.c

Example: Structs and Functions-2

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

35

• Deitel & Deitel Chapter 10

- Sections 10.1 to 10.7

to be continued...

Reading