Presentation is loading. Please wait.

Presentation is loading. Please wait.

Programming in C Chapter 10 Structures and Unions.

Similar presentations


Presentation on theme: "Programming in C Chapter 10 Structures and Unions."— Presentation transcript:

1 Programming in C Chapter 10 Structures and Unions

2 Structures Complex data types can be constructed from fundamental types aggregate variables of different types Example: information about a playing card struct card { int pips; char suit; } ; struct card c1, c2; Variable declaration: members struct card { int pips; char suit; } c1, c2 ; Variables may also be declared in the structure definition:

3 Structure types card c3, c4, c5; Variable declaration: The variable type is struct card not just card. Use typedef to define the type card to be equivalent to the type struct card : typedef struct card card now the variable type really is just card. Alternatively, typedef may be used directly in conjunction with struct without defining the tag name card first: typedef struct { int pips; char suit; } card ; card can now be used as a variable type.

4 Using structures Structures can contain any C-type, including arrays, pointers or other structures. Initialisation of structures: Initialisation of structures: (similar to arrays) card c3 = {13,h}; /* the king of hearts */ Assignment of structures: c2 = c1; assigns to each member of c2 the value of the corresponding member of c1. declares an array (of size 52) of variables of type card; the name of the array is deck. Arrays of structures: card deck[52]; Accessing members of a structure: c1.pips = 3; c1.suit = s; members of the structure are accessed with the operator. (dot),

5 int fail(struct student class[ ]) { int i, cnt = 0; for (i = 0; i < 100; ++i) cnt += (class[i].grade == F); return cnt; } struct student{ char *last_name; int student_id; char grade; }; Example: Student grades Note that here we havent yet assigned the space for the string last_name – just for a pointer to it – so we must use calloc or malloc to allocate space for it Define the structure first. This would probably go in a separate header file, e.g. student.h int main(void) { struct student tmp, class[100]; /*declaration.... tmp.grade = A; tmp.last_name = Casanova; tmp.student_id = ; } class[ ] is an array of structures increment the counter if grade is equal to F Casanova is defined here before compilation. Normally youd use calloc/malloc. Count the failing grades

6 Example: student grades If the size of the class isnt known at compile time, dynamic allocation must be used: struct student *class /*... read in number of students n...*/ class = (struct student *) calloc(n,sizeof(struct student)); The variable *last_name within the structure is a pointer, pointing to a string of appropriate length. struct student{ char last_name[MaxSize]; int student_id; char grade; }; Alternatively, a maximum length string could have been defined to hold the names:

7 Pointers to structures Structures may contain large amounts of data Use pointers to pass structures to functions instead of moving them in memory If a function should modify the contents of a structure: Use pointers to pass structures to functions instead of passing the structure by value. Pointers to structures struct student *p=&tmp; (*p).grade;. * Accessing a member with a dereferenced pointer use brackets, because. has higher priority than * p->grade; This is so important that an equivalent syntax is provided (saving two keystrokes)

8 #include complex.h void add(complex *a, complex *b, complex *c) /* *a = *b + *c */ { a->re = b->re + c->re; a->im = b->im + c->im; } Function using complex data structure Example: Complex numbers More to come in homework! Header file complex.h struct complex { double re; /* real part */ double im; /* imag. part */ }; typedef struct complex complex;

9 Structures as members of structures struct dept { char dept_name[25]; int dept_no; }; typedef struct { char name[25]; int employee_id; struct deptdepartment; struct address*a_ptr; doublesalary;..... } employee_data; Members structures must be defined beforehand, since the compiler must know their size Example: employers database Structures can contain other structures as members The size of a pointer to a structure is just the size of the address and therefore known. Struct address can be defined later.

10 e = update1(e);..... employee_data update1(employee_data e) {.... printf (Input the department number: ); scanf(%d, &n); /* now access member of struct-within-struct... */ e.department.dept_no = n;..... return e; } Updating structures in functions: method 1 Within calling routine, e.g. function main() Send structure e down to the function, modify it, and return the modified structure for use in the calling routine: This involves a lot of copying of structure members down to the function and back again. Theres a better way...

11 update2(&e); void update2(employee_data *p) {.... printf(Input the department number: ); scanf(%d, &n); p->department.dept_no = n;..... } Updating structures in functions: method 2 Within calling routine (e.g. function main() ), to pass address to update function Use -> instead of. to access structure member, because p is a pointer to the structure Passing a pointer to a data structure is more efficient:

12 Example: Playing poker The program in....lect9/poker.c is a model of a poker-playing program. It repeatedly shuffles and deals a set of five cards to each of six players, and then calculates the probability that a flush is dealt (i.e. that all five cards are of the same suit). Look at the code, and run it. The probability of a flush (all cards the same suit) is How close does this program come if you run it several times? Note that the card structure in the code uses an enumerated type to define the suit. Note also that deck[52] is an array, and the variable name deck[52] is therefore equivalent to a pointer to the start of the array – the whole array of 52 structures is not passed down with each function call that has deck[ ] as an argument!

13 Union union int_or_float { int i; float f; } typedef union int_or_float { int i; float f; } number; int main(void) { number n; n.i = 4444; printf("i: %10d f: %16.10e\n", n.i, n.f); n.f = ; printf("i: %10d f: %16.10e\n", n.i, n.f); return 0; }


Download ppt "Programming in C Chapter 10 Structures and Unions."

Similar presentations


Ads by Google