structures often we want to be able to manipulate logical entities as a whole for example, complex...

Post on 31-Mar-2015

214 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Structures Often we want to be able to manipulate

‘logical entities’ as a whole For example, complex numbers, dates,

student records, etc’ Each of these must be composed of more

than one variable, but are logically units A struct (short for structure) is a

collection of variables of different types, gathered into one super-variable

It is used to define more complex data types

Variables in a struct are called members or fields

Example – complex numbers.

The following is the definition of a new ‘variable’ of type complex number:

struct complex { int real; int img; };

Once we define a structure, we can treat it as any type. In a program, we can then write:

struct complex num1, num2, num3;

Access structure members If A is of some structure with a member

named x, then A.x is that member of A struct complex C;

C.real = 0; If A is a pointer to a structure with a

member x, then A->x is that member of the variable pointed by A. This is simply shorthand for - (*A).x struct complex *pc = &C;

pc->real = 1;

A more convenient usage with typedef

An alternative definition:typedef struct complex_t { int real; int img; } complex; Now the program has a new variable

type - “complex”. This way we don’t have to write “struct

complex” every time! For example, we can define two

complex numbers in the following line:complex num1, num2;

Examples

AddComplex.c

AddComplex – step by step

complex a, b, c;

printf(“…");scanf("%lf%lf",&(a.real),&(a.img));printf(“…");scanf("%lf%lf",&(b.real),&(b.img));

c = AddComp(a,b);

printf(“result = %g+%gi\n",c.real,c.img);return 0;

… …

real

img

a

… …

real

img

b

… …

real

img

c

AddComplex – step by step

complex a, b, c;

printf(“…");scanf("%lf%lf",&(a.real),&(a.img));printf(“…");scanf("%lf%lf",&(b.real),&(b.img));

c = AddComp(a,b);

printf(“result = %g+%gi\n",c.real,c.img);return 0;

… …

real

img

a

… …

real

img

b

… …

real

img

c

AddComplex – step by step

complex a, b, c;

printf(“…");scanf("%lf%lf",&(a.real),&(a.img));printf(“…");scanf("%lf%lf",&(b.real),&(b.img));

c = AddComp(a,b);

printf(“result = %g+%gi\n",c.real,c.img);return 0;

1.0 2.0

real

img

a

… …

real

img

b

… …

real

img

c

AddComplex – step by step

complex a, b, c;

printf(“…");scanf("%lf%lf",&(a.real),&(a.img));printf(“…");scanf("%lf%lf",&(b.real),&(b.img));

c = AddComp(a,b);

printf(“result = %g+%gi\n",c.real,c.img);return 0;

1.0 2.0

real

img

a

… …

real

img

b

… …

real

img

c

AddComplex – step by step

complex a, b, c;

printf(“…");scanf("%lf%lf",&(a.real),&(a.img));printf(“…");scanf("%lf%lf",&(b.real),&(b.img));

c = AddComp(a,b);

printf(“result = %g+%gi\n",c.real,c.img);return 0;

1.0 2.0

real

img

a

3.0 4.0

real

img

b

… …

real

img

c

AddComplex – step by step

complex a, b, c;

printf(“…");scanf("%lf%lf",&(a.real),&(a.img));printf(“…");scanf("%lf%lf",&(b.real),&(b.img));

c = AddComp(a,b);

printf(“result = %g+%gi\n",c.real,c.img);return 0;

1.0 2.0

real

img

a

3.0 4.0

real

img

b

… …

real

img

c

AddComplex – step by step

complex AddComp(complex x, complex y){ complex z;

z.real = x.real + y.real; z.img = x.img + y.img;

return z;}

1.0 2.0

real

img

x

3.0 4.0

real

img

y

… …

real

img

z

AddComplex – step by step

complex AddComp(complex x, complex y){ complex z;

z.real = x.real + y.real; z.img = x.img + y.img;

return z;}

1.0 2.0

real

img

x

3.0 4.0

real

img

y

… 6.0

real

img

z

AddComplex – step by step

complex AddComp(complex x, complex y){ complex z;

z.real = x.real + y.real; z.img = x.img + y.img;

return z;}

1.0 2.0

real

img

x

3.0 4.0

real

img

y

4.0 6.0

real

img

z

AddComplex – step by step

complex AddComp(complex x, complex y){ complex z;

z.real = x.real + y.real; z.img = x.img + y.img;

return z;}

1.0 2.0

real

img

x

3.0 4.0

real

img

y

4.0 6.0

real

img

z

AddComplex – step by step

complex a, b, c;

printf(“…");scanf("%lf%lf",&(a.real),&(a.img));printf(“…");scanf("%lf%lf",&(b.real),&(b.img));

c = AddComp(a,b);

printf(“result = %g+%gi\n",c.real,c.img);return 0;

1.0 2.0

real

img

a

3.0 4.0

real

img

b

4.0 6.0

real

img

c

AddComplex – step by step

complex a, b, c;

printf(“…");scanf("%lf%lf",&(a.real),&(a.img));printf(“…");scanf("%lf%lf",&(b.real),&(b.img));

c = AddComp(a,b);

printf(“result = %g+%gi\n",c.real,c.img);return 0;

1.0 2.0

real

img

a

3.0 4.0

real

img

b

4.0 6.0

real

img

c

Exercise Implement the MultComplex

function – Input - two complex numbers Output – their multiplication Note - If x=a+ib and y=c+id then:

z = xy = (ac-bd)+i(ad+bc)

Write a program that uses the above function to multiply two complex numbers given by the user

Solution

MultiplyComplex.c

Miscellaneous structure trivia Structure members may be ordinary

variable types, but also other structures and even arrays!

Structures can therefore be rather large and take up a lot of space

Many times we prefer to pass structures to functions by address, and not by value Thus a new copy of the structure is not

created – just a pointer to the existing structure

More trivia Structures cannot be compared

using the == operator They must be compared member by

member Usually this will be done in a separate

function Structures can be copied using the

= operator Member-wise copy

Example

Is_In_Circle.c

Is_in_circle – step by step

printf(“Enter dot\n");scanf("%lf%lf",&d.x,&d.y);printf("Enter circle center\n");scanf("%lf%lf",&c.center.x,&c.center.y);printf("Enter circle radius\n");scanf("%lf",&c.radius);

if (IsInCircle(&d, &c))printf("dot is in circle\n");

elseprintf("dot is out of circle\n");

… …

yx

d (dot)

c (circle)

… …

yx

center (dot) radiu

s…

Is_in_circle – step by step

printf(“Enter dot\n");scanf("%lf%lf",&d.x,&d.y);printf("Enter circle center\n");scanf("%lf%lf",&c.center.x,&c.center.y);printf("Enter circle radius\n");scanf("%lf",&c.radius);

if (IsInCircle(&d, &c))printf("dot is in circle\n");

elseprintf("dot is out of circle\n");

… …

yx

d (dot)

c (circle)

… …

yx

center (dot) radiu

s…

Is_in_circle – step by step

printf(“Enter dot\n");scanf("%lf%lf",&d.x,&d.y);printf("Enter circle center\n");scanf("%lf%lf",&c.center.x,&c.center.y);printf("Enter circle radius\n");scanf("%lf",&c.radius);

if (IsInCircle(&d, &c))printf("dot is in circle\n");

elseprintf("dot is out of circle\n");

1.0 2.0

yx

d (dot)

c (circle)

… …

yx

center (dot) radiu

s…

Is_in_circle – step by step

printf(“Enter dot\n");scanf("%lf%lf",&d.x,&d.y);printf("Enter circle center\n");scanf("%lf%lf",&c.center.x,&c.center.y);printf("Enter circle radius\n");scanf("%lf",&c.radius);

if (IsInCircle(&d, &c))printf("dot is in circle\n");

elseprintf("dot is out of circle\n");

1.0 2.0

yx

d (dot)

c (circle)

… …

yx

center (dot) radiu

s…

Is_in_circle – step by step

printf(“Enter dot\n");scanf("%lf%lf",&d.x,&d.y);printf("Enter circle center\n");scanf("%lf%lf",&c.center.x,&c.center.y);printf("Enter circle radius\n");scanf("%lf",&c.radius);

if (IsInCircle(&d, &c))printf("dot is in circle\n");

elseprintf("dot is out of circle\n");

1.0 2.0

yx

d (dot)

c (circle)

0.0 0.0

yx

center (dot) radiu

s…

Is_in_circle – step by step

printf(“Enter dot\n");scanf("%lf%lf",&d.x,&d.y);printf("Enter circle center\n");scanf("%lf%lf",&c.center.x,&c.center.y);printf("Enter circle radius\n");scanf("%lf",&c.radius);

if (IsInCircle(&d, &c))printf("dot is in circle\n");

elseprintf("dot is out of circle\n");

1.0 2.0

yx

d (dot)

c (circle)

0.0 0.0

yx

center (dot) radiu

s…

Is_in_circle – step by step

printf(“Enter dot\n");scanf("%lf%lf",&d.x,&d.y);printf("Enter circle center\n");scanf("%lf%lf",&c.center.x,&c.center.y);printf("Enter circle radius\n");scanf("%lf",&c.radius);

if (IsInCircle(&d, &c))printf("dot is in circle\n");

elseprintf("dot is out of circle\n");

1.0 2.0

yx

d (dot)

c (circle)

0.0 0.0

yx

center (dot) radiu

s5

Is_in_circle – step by step

printf(“Enter dot\n");scanf("%lf%lf",&d.x,&d.y);printf("Enter circle center\n");scanf("%lf%lf",&c.center.x,&c.center.y);printf("Enter circle radius\n");scanf("%lf",&c.radius);

if (IsInCircle(&d, &c))printf("dot is in circle\n");

elseprintf("dot is out of circle\n");

1.0 2.0

yx

d (dot)

c (circle)

0.0 0.0

yx

center (dot) radiu

s5

Is_in_circle – step by stepint IsInCircle(dot *p_dot, circle *p_circle){ double x_dist,y_dist;

x_dist = p_dot->x - p_circle->center.x; y_dist = p_dot->y - p_circle->center.y; if (x_dist*x_dist + y_dist*y_dist <= p_circle->radius*p_circle-

>radius) return 1;

return 0;}

1.0 2.0

yx

(dot)

(circle)

0.0 0.0

yx

center (dot) radiu

s5

x_dist

y_dist… …

p_circle

p_dot1024756

Is_in_circle – step by stepint IsInCircle(dot *p_dot, circle *p_circle){ double x_dist,y_dist;

x_dist = p_dot->x - p_circle->center.x; y_dist = p_dot->y - p_circle->center.y; if (x_dist*x_dist + y_dist*y_dist <= p_circle->radius*p_circle-

>radius) return 1;

return 0;}

1.0 2.0

yx

(dot)

(circle)

0.0 0.0

yx

center (dot) radiu

s5

x_dist

y_dist1.0 …

p_circle

p_dot1024756

Is_in_circle – step by stepint IsInCircle(dot *p_dot, circle *p_circle){ double x_dist,y_dist;

x_dist = p_dot->x - p_circle->center.x; y_dist = p_dot->y - p_circle->center.y; if (x_dist*x_dist + y_dist*y_dist <= p_circle->radius*p_circle-

>radius) return 1;

return 0;}

1.0 2.0

yx

(dot)

(circle)

0.0 0.0

yx

center (dot) radiu

s5

x_dist

y_dist1.0 2.0

p_circle

p_dot1024756

Is_in_circle – step by stepint IsInCircle(dot *p_dot, circle *p_circle){ double x_dist,y_dist;

x_dist = p_dot->x - p_circle->center.x; y_dist = p_dot->y - p_circle->center.y; if (x_dist*x_dist + y_dist*y_dist <= p_circle->radius*p_circle-

>radius) return 1;

return 0;}

1.0 2.0

yx

(dot)

(circle)

0.0 0.0

yx

center (dot) radiu

s5

x_dist

y_dist1.0 2.0

p_circle

p_dot1024756

Is_in_circle – step by stepint IsInCircle(dot *p_dot, circle *p_circle){ double x_dist,y_dist;

x_dist = p_dot->x - p_circle->center.x; y_dist = p_dot->y - p_circle->center.y; if (x_dist*x_dist + y_dist*y_dist <= p_circle->radius*p_circle-

>radius) return 1;

return 0;}

1.0 2.0

yx

(dot)

(circle)

0.0 0.0

yx

center (dot) radiu

s5

x_dist

y_dist1.0 2.0

p_circle

p_dot1024756

Is_in_circle – step by step

printf(“Enter dot\n");scanf("%lf%lf",&d.x,&d.y);printf("Enter circle center\n");scanf("%lf%lf",&c.center.x,&c.center.y);printf("Enter circle radius\n");scanf("%lf",&c.radius);

if (IsInCircle(&d, &c))printf("dot is in circle\n");

elseprintf("dot is out of circle\n");

1.0 2.0

yx

d (dot)

c (circle)

0.0 0.0

yx

center (dot) radiu

s5

Exercise

Write a struct that represents a date (day, month, year)

Write a function that increments the datevoid IncDate(Date *d);

For example – 31.12.05 -> 1.1.06

Solution

IncDate.c

Exiting the program

void exit(int status); Sometimes an error occurs and we want

the program to immediately exit The exit function closes all open files, frees

all allocated memory, and exits the program

Equivalent to calling ‘return’ within main Remember to #include <stdlib.h> See strcpy_with_exit.c

Structures containing arrays A structure member that is an array

does not ‘behave’ like an ordinary array When copying a structure that contains

a member which is an array, the array is copied element by element Not just the address gets copied For example - array_member.c

Reminder – ordinary arrays can’t be copied simply by using the ‘=‘ operator They must be copied using a loop

Structures containing arrays The same happens when passing the

structure to a function Changing the array inside the function won’t

change it in the calling function Reminder – when passing an ordinary

array to a function, all that gets passed is the address of its first element Hence every change to the array within the

function, changes the array in the calling function

Pointers are another matter

If the member is a pointer, for example to a dynamically allocated array, all that gets copied is the pointer (the address) itself For example, pointer_member.c

Hence, we should take extra care when manipulating structures that contain pointers

top related