CSE1301 Computer Programming: Lecture 16 Algorithm Design: Components.
1 CSE1301 Computer Programming Lecture 20 Structures (Part 1)
-
date post
21-Dec-2015 -
Category
Documents
-
view
237 -
download
2
Transcript of 1 CSE1301 Computer Programming Lecture 20 Structures (Part 1)
1
CSE1301Computer Programming
Lecture 20Structures (Part 1)
2
Topics• Structure
• Arrays of structs• typedef• structs and functions
• Pointers to structs• structs within structs• Data structures and modular design
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
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:
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
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];
7
Initializing a struct Variable
struct LunchBox kyle = { 1, 370.0, “ham”};
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
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;
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;
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);
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
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}
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
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
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
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
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
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
20
Common Mistake
struct StudentRec{ char lastname[MAXLEN]; float mark;};
Do not forget the semicolon here!
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? */
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”);}
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
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
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
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
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
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
29
Notes on typedef
• Yet another way of using typedef:
typedef struct{ char lastname[MAXLEN]; float mark;} Student;
Student studA, studB;Student class[MAXN];
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);}
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
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
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
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
35
• Deitel & Deitel Chapter 10
- Sections 10.1 to 10.7
to be continued...
Reading