1 cse1301 computer programming lecture 21 structures (part 2)

53
1 CSE1301 Computer Programming Lecture 21 Structures (Part 2)

Post on 21-Dec-2015

220 views

Category:

Documents


0 download

TRANSCRIPT

1

CSE1301Computer Programming

Lecture 21Structures (Part 2)

2

Topics• Structure

• Arrays of structs• typedef• structs and functions

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

3

Recall:

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

#define MAXLEN 50#define MAXN 20

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

typedef struct StudentRec Student;marks4a.c

Record of student last names and marks

4

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

Recall: Functions to read and print a student record

void printRecord ( Student item ){ printf("Last name: %s\n", item.lastname); printf(" Mark: %.1f\n\n", item.mark);}

marks4a.c

5

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

Recall: Sample main: an array of student records

6

Passing a struct Variable

lastname:

mark:

studentA:int main(){ Student studentA; studentA = readRecord(); return 0;}

7

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

lastname:

mark:

newStudent:

int main(){ Student studentA; studentA = readRecord(); return 0;}

Version 1

Passing a struct Variable (cont)

lastname:

mark:

studentA:

8

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

lastname:

mark:

studentA:

lastname:

mark:

newStudent:

Version 1

Passing a struct Variable (cont)

int main(){ Student studentA; studentA = readRecord(); return 0;}

9

Passing a struct Variable (cont)

lastname:

mark:

studentA:int main(){ Student studentA; studentA = readRecord(); return 0;}

10

int main(){ Student studentA; studentA = readRecord(studentA); return 0;}

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

Version 2

A similar

thing happens

here

Passing a struct Variable (cont)

11

What if the struct is huge?

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

int main(){ Student studentA; studentA = readRecord(StudentA); return 0;}

Version 2

12

Passing a struct Pointer

Pass a pointer to the struct variable

instead!

lastname:

mark:

studentA:

studentPtr:

13

void readRecord ( Student *studentPtr ){ /* De-reference pointer here. */}

int main(){ Student studentA; readRecord( &(studentA) ); return 0;}

Passing a struct Pointer

lastname:

mark:

studentA:

studentPtr:

lastname:

14

To de-reference a pointer to a struct variable:Style 1: Use the * operator

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

marks4b.c

Passing a struct Pointer studentPtr:

mark:

studentA:

lastname:

15

To de-reference a pointer to a struct variable:

Style 2: Use the -> operator

void readRecord ( Student *studentPtr ){ printf("Enter last name and mark: "); scanf("%s %f", studentPtr->lastname, &(studentPtr->mark) );}

marks4c.c

Passing a struct Pointer studentPtr:

mark:

studentA:

lastname:

16

Example: Pointers to Structs-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 readRecord ( Student *studentPtr ){ printf("Enter last name and mark: "); scanf("%s %f", studentPtr->lastname, &(studentPtr->mark));}

void printRecord ( Student *item ){ printf("Last name: %s\n", (*item).lastname); printf(" Mark: %.1f\n\n", (*item).mark);}

marks4c.c

17

#include <stdio.h>#include <stdlib.h>#define MAXLEN 50#define MAXN 20

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

void readRecord ( Student *studentPtr ){ printf("Enter last name and mark: "); scanf("%s %f", studentPtr->lastname, &(studentPtr->mark) );}

void printRecord ( Student *item ){ printf("Last name: %s\n", (*item).lastname); printf(" Mark: %.1f\n\n", (*item).mark);} marks4c.c

Example: Pointers to Structs-1 (cont)

18

#include <stdio.h>#include <stdlib.h>#define MAXLEN 50#define MAXN 20

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

void readRecord ( Student *studentPtr ){ printf("Enter last name and mark: "); scanf("%s %f", studentPtr->lastname, &(studentPtr->mark) );}

void printRecord ( Student *item ){ printf("Last name: %s\n", (*item).lastname); printf(" Mark: %.1f\n\n", (*item).mark);} marks4c.c

Example: Pointers to Structs-1 (cont)

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++) { readRecord( &(class[i]) ); } printf("\nClass list:\n\n"); for (i=0; i < count; i++) { printRecord( &(class[i]) ); } return 0;} marks4c.c

Example: Pointers to Structs-2

20

Structs within Structs

• A struct can be a member of another struct

• Example:– A student record contains the last name, mark

(ID Number, first name, etc)– A class list is a collection of student records

(number of students, subject code, etc) – A departmental database is a collection of class

lists (department name, number of subjects, etc)

21

Example: Student Record

lastname:

mark:

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

typedef struct StudentRec Student;

22

class:

lastname:

mark:

lastname:

mark:

lastname:

mark:

Student class[MAXN];

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

typedef struct StudentRec Student;

Example: Class Record

23

Information required to maintain a class list• Number of students in the class (<= MAXN)• Subject code

class:

lastname:

mark:

lastname:

mark:

lastname:

mark:

Student class[MAXN];

Example: Class Record (cont)

24

Information required to maintain a class list• Number of students in the class (<= MAXN)• Subject code

char subjCode[MAXLEN]; int count; Student class[MAXN];

count:

class:

lastname:

mark:

lastname:

mark:

lastname:

mark:

subjCode:

Example: Class Record (cont)

25

struct ClassRec{ char subjCode[MAXLEN]; int count; Student class[MAXN];};

typedef struct ClassRec ClassList;

Example: Class Record (cont)

count:

class:

lastname:

mark:

lastname:

mark:

lastname:

mark:

subjCode:“Encapsulates” the data needed to maintain a class list

26

ClassList subject[MAXSUBJ];

Example: Department Database

subject:

27

char deptName[MAXLEN]; int count; ClassList subject[MAXSUBJ];

Example: Department Database (cont)

subject:

deptName:

count:

28

Example: Department Database (cont)

subject:

deptName:

count:

struct DatabaseRec{ char deptName[MAXLEN]; int count; ClassList subject[MAXSUBJ];};

typedef struct DatabaseRec Database;

“Encapsulates” the data needed to maintain a database

29

Access to Struct Members

subject:

deptName:

count:

How do I put the mark 97.5

there?Database finalMarks;

Suppose we declare a struct variable:

30

Access to Struct Members (cont)

finalMarks

subject:

deptName:

count:

finalMarks:

31

Access to Struct Members (cont)

finalMarks.subject[1]

subject:

deptName:

count:

finalMarks:

32

Access to Struct Members (cont)

finalMarks.subject[1].list[0]

subject:

deptName:

count:

finalMarks:

33

Access to Struct Members (cont)

finalMarks.subject[1].list[0].mark = 97.5;

subject:

deptName:

count:

finalMarks:

34

Access to Struct Members (cont)

finalMarks.subject[1].list[0].mark = 97.5;

subject:

deptName:

count:

finalMarks:

Is there a simpler way?

35

Data Structures and System Design:Structure Charts

• A modular design makes handling of complex data structures easy

• A module handles operations on each data structure

• The level of the module in the structure chart should (more or less) correspond to the size of the data they handle

More on Structure Charts in Lecture 22

36

Example: Data and Modules

Student Record(Student)

Class Record(ClassList)

Department Database

(Database)

readRecord printRecord

readList printListinitList

readDBase printDBaseinitDBase

main

37

Example: Data and Modules

Student Record(Student)

Class Record(ClassList)

Department Database

(Database)

printRecord

Student

readRecordSt

uden

tStudent

main

38

Example: Data and Modules

Student Record(Student)

Class Record(ClassList)

Department Database

(Database)

main

printRecord

Student

printList

ClassL

ist

readList

Cla

ssL

istC

lassList

initListC

lass

Lis

tClassL

istreadRecord

Stud

entStudent

39

Example: Data and Modules

Student Record(Student)

Class Record(ClassList)

Department Database

(Database)

main

printDBase

Database

readDBase

Database

Dat

abas

e

initDBaseDatabase

Database

printRecord

Student

printList

ClassL

ist

readList

Cla

ssL

istC

lassList

initListClassL

istClassList

readRecordSt

uden

tStudent

More on Structure Charts in Lecture 22

40

Example: Modules for Student Record

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

typedef struct StudentRec Student;

void readRecord ( Student *studentPtr );void printRecord ( const Student *item );

dbase2a.c

41

Example: Modules for Student Record (cont)

void readRecord ( Student *studentPtr ){ printf("Enter last name and mark: "); scanf("%s %f", studentPtr->lastname, &(studentPtr->mark));}

void printRecord ( const Student *item ){ printf("Last name: %s\n", item->lastname); printf(" Mark: %.1f\n\n", item->mark);}

dbase2a.c

42

struct ClassRec{ char subjCode[MAXLEN]; int count;

};

typedef struct ClassRec ClassList;

void initList ( ClassList *list );void readList ( ClassList *list );void printList ( const ClassList *list );

Example: Modules for Class Record

dbase2b.c

Student student[MAXN];

43

void initList ( ClassList *list ){ printf("\nEnter subject code: "); scanf("%s", list->subjCode);

printf("How many students? "); scanf("%d", &(list->count) );

if (list->count > MAXN) { printf("Not enough space.\n"); exit(1); }}

dbase2b.c

Example: Modules for Class Record (cont)

44

void printList ( const ClassList *list ){ int i; printf("\nClass list for %s:\n\n", list->subjCode); for (i=0; i < list->count; i++) { }}

void readList ( ClassList *list ){ int i; for (i=0; i < list->count; i++) {

}}

Example: Modules for Class Record (cont)

dbase2b.c

readRecord(&(list->student[i]));

printRecord(&(list->student[i]));

45

struct DatabaseRec{ char deptName[MAXLEN]; int count;

};

typedef struct DatabaseRec Database;

void initDBase ( Database *dbase );void readDBase ( Database *dbase );void printDBase ( const Database *dbase );

Example: Modules for Database

dbase2c.c

ClassList subject[MAXSUBJ};

46

void initDBase ( Database *dbase ){ printf("\nEnter department or faculty code: "); scanf("%s", dbase->deptName);

printf("How many subjects? "); scanf("%d", &(dbase->count) );

if (dbase->count > MAXSUBJ) { printf("Not enough space.\n"); exit(1); }}

Example: Modules for Database (cont)

dbase2c.c

47

Example: Modules for Database (cont)

void printDBase ( const Database *dbase ){ int i; printf("\nDEPARTMENT/FACULTY CODE: %s\n", dbase->deptName); for ( i=0; i < dbase->count; i++ ) { }}

dbase2c.c

printList(&(dbase->subject[i]));

void readDBase ( Database *dbase ){ int i; for ( i=0; i < dbase->count; i++ ) {

}}

initList(&(dbase->subject[i]));readList(&(dbase->subject[i]));

48

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

#define MAXLEN 50#define MAXN 100#define MAXSUBJ 5

#include "dbase2a.c"#include "dbase2b.c"#include "dbase2c.c"

int main(){ Database finalMarks;

return 0;}

Example: Test Main Program

dbase2.c

initDBase(&finalMarks);readDBase(&finalMarks);printDBase(&finalMarks);

49

Example: Change definition of student record

which modules/files do I need to modify in

order to use student ID instead of last name?

main

printDBase

Database

readDBase

Database

Dat

abas

einitDBase

Database

Database

printRecord

Student

printList

ClassL

ist

readList

Cla

ssL

istC

lassList

initListClassL

ist

ClassList

readRecord

Stud

entStudent

50

Example: Change definition of student record (cont)struct StudentRec{ long IDNumber; float mark;};typedef struct StudentRec Student;void readRecord ( Student *studentPtr );void printRecord ( const Student *item );

void readRecord ( Student *studentPtr ){ printf("Enter ID Number and mark: "); scanf(”%ld %f", &(studentPtr->IDNumber), &(studentPtr->mark));}

void printRecord ( const Student *item ){ printf(”ID Number: %ld\n", item->IDNumber); printf(" Mark: %.1f\n\n", item->mark);}

dbase1a.c

51

Documentation of Structs

• Data documentation, like function documentation, is very important

• Can determine a team’s success in completing a large software project

• Should include information on:– assumptions and limitations– operations and corresponding modules– correct usage

52

/***********************************************************\ * DATA: * Database * * DESCRIPTION: * A database is a collection of class lists for subjects * conducted by a school or department. * * USAGE: * A database variable can store class lists for up to * MAXSUBJ subjects. The member `count' keeps track of * the number of class lists in the database. * * A data of this type needs to be initialized using the * function initDBase() before use. The member `count' * has to be initialized to a valid value. * * Use the function readDBase() to initialize and read * data into each class list. Use the function printDBase() * to print the content of the entire database. *\***********************************************************/

Example: Data documentation

53

Reading

• Deitel and Deitel- Sections 10.1 to 10.7