Userdefined Structure Type Database record and structure A
User_defined Structure Type • Database, record and structure • A structure type is a data type for a record composed of multiple components For example a database of planets needs: Name: Jupiter Diameter: 142, 980 km Moons: 16 Orbit time: 11. 9 yr Rotation time: 9. 925 hr A. Abhari CPS 125 1
User_defined Structure Type • We need to use define a structure type: #define STRSIZE 10 typedef struct { char name[STRSIZE]; double diameter; int moons; double orbit_time, rotation_time; } planet_t; suffix _t is used to show it is a type A. Abhari CPS 125 2
User_defined Structure Type • Also we need to define structure variables of the defined structure type: planet_t previous_planet, current_planet; blank_planet = {“”, 0, 0}; • In the program we use variables of the structure type: current_planet = blank_planet; A. Abhari CPS 125 3
User_defined Structure Type • Also we can define the a structure containing components that are structure. Such an structure is referred to as hierarchical structure: For example: typedef struct { double diameter; planet_t planets[9]; char galaxy[STRSIZE]; } solar_sys_t; A. Abhari CPS 125 4
Manipulating Individual Components of a Structure Data Object • Direct component selection (. ) can be used to reference a component of a structure. For example: strcpy(current_planet. name, “Jupiter”); current_planet. diameter= 142980; current_planet. moon=16; current_planet. orbit_time=11. 9; current_planet. rotation_time=9. 925; A. Abhari CPS 125 5
Operators Precedence a[j], f(…), ++, -- (postfix) ++, --, !(prefix) -, +, (unary) &, * (type name) *, /, % +, <, >, <=, >= ==, != && || =, +=, -=, *=, /=, %= A. Abhari left right left left right CPS 125 highest lowest 6
Structure Type Data as Input and Output Parameters • We can assign one structure to another structure variable, however we can not apply the equality and inequality operators to a structure type as a unit. • When a structure variable is passed to a function, if it is input its value is copied to the formal variable and if it is output we must apply the address of operator to pass it as a pointer to the variable. A. Abhari CPS 125 7
Function with a Structured Input Variable /* * Displays with labels all components of a planet_t structure */ void print_planet(planet_t pl) /* input - one planet structure */ { printf("%sn", pl. name); printf(" Equatorial diameter: %. 0 f kmn", pl. diameter); printf(" Number of moons: %dn", pl. moons); printf(" Time to complete one orbit of the sun: %. 2 f yearsn", pl. orbit_time); printf(" Time to complete one rotation on axis: %. 4 f hoursn", pl. rotation_time); } A. Abhari CPS 125 8
Function Comparing Two Structured Values for Equality #include <string. h> /* * Determines whether or not the components of planet_1 and planet_2 match */ int planet_equal(planet_t planet_1, /* input - planets to */ planet_t planet_2) /* compare */ { return (strcmp(planet_1. name, planet_2. name) == 0 && planet_1. diameter == planet_2. diameter && planet_1. moons == planet_2. moons && planet_1. orbit_time == planet_2. orbit_time && planet_1. rotation_time == planet_2. rotation_time); A. Abhari CPS 125 } 9
Function with a Structured Output Argument /* * Fills a type planet_t structure with input data. Integer returned as * function result is success/failure/EOF indicator. * 1 => successful input of one planet * 0 => error encountered * EOF => insufficient data before end of file * In case of error or EOF, value of type planet_t output argument is * undefined. */ A. Abhari CPS 125 10
int scan_planet(planet_t *plnp) /* output - address of planet_t structure to fill */ { int result; result = scanf("%s%lf%d%lf%lf", (*plnp). name, &(*plnp). diameter, &(*plnp). moons, &(*plnp). orbit_time, &(*plnp). rotation_time); if (result == 5) result = 1; else if (result != EOF) result = 0; return (result); A. Abhari CPS 125 } 11
Indirect Component Selection Operator • In the indirect referencing &(*pnlp). moons parenthesizing was used to override the default operator precedence • C provide a single operator that cobines indirection and component selection operator. (*structp). component is equal to strucpt -> component A. Abhari CPS 125 12
int scan_planet(planet_t *plnp) /* output - address of planet_t structure to fill */ { int result; result = scanf("%s%lf%d%lf%lf", plnp->name, &(plnp->diameter), &(plnp->moons), &(plnp->orbit_time), &(plnp->rotation_time)) if (result == 5) result = 1; else if (result != EOF) result = 0; return (result); } A. Abhari CPS 125 13
Function get_planet Returning a Structured Result Type /* * Gets and returns a planet_t structure */ planet_t get_planet(void) { planet_t planet; scanf("%s%lf%d%lf%lf", planet. name, &planet. diameter, &planet. moons, &planet. orbit_time, &planet. rotation_time); return (planet); } current_planet = get_planet() is same as scan_planet(¤t_planet) A. Abhari CPS 125 14
A Function with Structure Result Suppose we defined the following structure for time typedef struct { int hour, minute, seconds; } time_t; And in the program time_now defined as a variable of type time_t ; If time_now initialized by 21: 58: 32 and secs initialized by 97 we want by calling time_now= new_time(time_now, secs); time_now becomes 22: 00: 09 A. Abhari CPS 125 15
Function to Compute an Updated Time Value /* * Computes a new time represented as a time_t structure * and based on time of day and elapsed seconds. */ time_t new_time(time_t time_of_day, /* input - time to be updated */ int elapsed_secs) /* input - seconds since last update */ { int new_hr, new_min, new_sec; new_sec = time_of_day. second + elapsed_secs; time_of_day. second = new_sec % 60; new_min = time_of_day. minute + new_sec / 60; time_of_day. minute = new_min % 60; new_hr = time_of_day. hour + new_min / 60; time_of_day. hour = new_hr % 24; return (time_of_day); A. Abhari CPS 125 16 }
Abstract Data Type • A user-defined data type combined with a set of basic operations. For example: data type: planet_t operations: scan_planet, print_planet, planet_equal data type: complex_t (complex number a+bi) operations: scan, print, add, subtract, multiply, divide, abs A. Abhari CPS 125 17
A User_Defined Type for Complex Numbers Partial Implementation of Type and Operators for Complex Numbers /* * Operators to process complex numbers */ #include <stdio. h> #include <math. h> /* User-defined complex number type */ typedef struct { double real, imag; } complex_t; int scan_complex(complex_t *c); void print_complex(complex_t c); complex_t add_complex(complex_t c 1, complex_t c 2); complex_t subtract_complex(complex_t c 1, complex_t c 2); complex_t multiply_complex(complex_t c 1, complex_t c 2); complex_t divide_complex(complex_t c 1, complex_t c 2); complex_t abs_complex(complex_t c); A. Abhari CPS 125 18
/* Driver int main(void) { complex_t com 1, com 2; */ /* Gets two complex numbers */ printf("Enter the real and imaginary parts of a complex numbern"); printf("separated by a space> "); scan_complex(&com 1); printf("Enter a second complex number> "); scan_complex(&com 2); /* Forms and displays the sum */ printf("n"); print_complex(com 1); printf(" + "); print_complex(com 2); printf(" = "); print_complex(add_complex(com 1, com 2)); A. Abhari CPS 125 19
/* Forms and displays the difference */ printf("nn"); print_complex(com 1); printf(" - "); print_complex(com 2); printf(" = "); print_complex(subtract_complex(com 1, com 2)); /* Forms and displays the absolute value of the first number */ printf("nn|"); print_complex(com 1); printf("| = "); print_complex(abs_complex(com 1)); printf("n"); return (0); } A. Abhari CPS 125 20
/* Returns sum of complex values c 1 and c 2*/ complex_t add_complex(complex_t c 1, complex_t c 2) /* input - values to add */ { complex_t csum; csum. real = c 1. real + c 2. real; csum. imag = c 1. imag + c 2. imag; return (csum); } /*Returns difference c 1 – c */ complex_t subtract_complex(complex_t c 1, complex_t c 2) /* input parameters */ { complex_t cdiff; cdiff. real = c 1. real - c 2. real; cdiff. imag = c 1. imag - c 2. imag; return (cdiff); } A. Abhari CPS 125 21
Parallel Arrays And Arrays of Structures To represent student information we used parallel arrays: int id[50]; double gpa[50] Instead of using parallel arrays to represent the student information an array of structure can be used: typedef struct { int id; double gpa; } student_t; student_t stu_list[MAX_STU]; A. Abhari CPS 125 22
Parallel Arrays And Arrays of Structures If function scan_student is available we can use for (i = 0; i < MAX_STU; ++i) scan_student(&stu_list[i]); To fill the array and for (i = 0; i < MAX_STU; ++i) printf(“%dt%. 2 fn”, stu_list[i]. id, stu_list[i]. gpa); To print the array contents A. Abhari CPS 125 23
Case Study • Problem: Write a program that takes a measurement in one unit (e. g. 4. 5 quarts) and converts it to another unit (e. g. liters). • Structured data type unit_t components: name /* e. g. “milligrams” */ abbrev /* e. g. “mg” */ class /* “liquid_volume”, “distance”, or “mass” */ standard /* number of standard units equivalent to this */ A. Abhari CPS 125 24
Case Study typedef struct { /* unit of measurement type */ char name[NAME_LEN]; /* character string such as "milligrams" */ char abbrev[ABBREV_LEN]; /* shorter character string such as "mg" */ char class[CLASS_LEN]; /* character string such as "pressure", "distance", "mass" */ double standard; /* number of standard units equivalent to this unit */ } unit_t; int fscan_unit(FILE *filep, unit_t *unitp); void load_units(int unit_max, unit_t units[], int *unit_sizep); int search(const unit_t units[], const char *target, int n); double convert(double quantity, double old_stand, double new_stand); A. Abhari CPS 125 25
Data File and Sample Run of Measurement Conversion Program Data file units. dat: miles mi distance 1609. 3 kilometers km distance 1000 yards yd distance 0. 9144 meters m distance 1 quarts qt liquid_volume 0. 94635 Sample run: Enter a conversion problem or q to quit. To convert 25 kilometers to miles, you would enter > 25 kilometers miles or, alternatively, > 25 km mi > 450 km miles Attempting conversion of 450. 0000 km to miles. . . 450. 0000 km = 279. 6247 miles Enter a conversion problem or q to quit. > 2. 5 qt l Attempting conversion of 2. 5000 qt to l. . . 2. 5000 qt = 2. 3659 l
Common Programming Errors • Incorrect use of direct component selection ‘. ’ • Indirect component selection ‘->’ can solve the problem of operator precedence of ‘. ’ • There is no comparison operator on structure types and they can not directly used in printf and scanf A. Abhari CPS 125 27
- Slides: 27