Structures

In next examples we discuss the notion of a

In the next seven examples, the word *point* has a different meanings. The first example is a structure representing points in
the plane. Two variables *A,B* are allocated memory according to the variable type given by the structure. The first program calculates the distance
between two given points.

/* Milicic Structures 1. point1.c */ #include <stdio.h> #include <math.h> int main() { float d; struct { float x; float y; } A, B; printf("The coordinates of the point A are: "); scanf("%f %f",&A.x,&A.y); printf("\nThe coordinates of the point B are: "); scanf("%f %f",&B.x,&B.y); d = sqrt((A.x - B.x)*(A.x - B.x) + (A.y - B.y)*(A.y - B.y)); printf("\nThe distance between A and B is %f\n",d); }

In the second example we give the structure the tag

/* Milicic Structures 2. point2.c */ #include <stdio.h> #include <math.h> struct point { float x; float y; }; int main(){ float d; struct point A, B; printf("The coordinates of the point A are: "); scanf("%f %f",&A.x,&A.y); printf("\nThe coordinates of the point B are: "); scanf("%f %f",&B.x,&B.y); d = sqrt((A.x - B.x)*(A.x - B.x) + (A.y - B.y)*(A.y - B.y)); printf("\nThe distance between A and B is %f\n",d); }

The third example we define a new type

/* Milicic Structures 3. poin31.c */ #include <stdio.h> #include <math.h> typedef struct { float x; float y; } point ; float dist( point A, point B) { return(sqrt((A.x - B.x)*(A.x - B.x) + (A.y - B.y)*(A.y - B.y))); } int main(){ float d; point A, B; printf("The coordinates of the point A are: "); scanf("%f %f",&A.x,&A.y); printf("\nThe coordinates of the point B are: "); scanf("%f %f",&B.x,&B.y); printf("\nThe distance between A and B is %f\n", dist(A,B)); }

Fourth, we show several uses of structures. We show how we define a structure tagged

/****************************************************************************** Treibergs Mar. 3, 2006 Structures The first structure is tagged "coords" which represents a point. The second structure is tagged "threepoints" which represents a triangle. The main program asks for the vertices of a triangle. A function call prints the vertices of a triangle. Then it prints the area of the triangle and the perimeter of the triangle. These are computed by double-valued functions that take structure arguments. The perimeter function calls the edge-length function which is a double valued function that takes two structure coords arguments. It then asks for a rotation angle. It computes a new triangle which is the rotation about the origin of the old tringle. This time we use a structure valued function. Finally we compute the area and perimeter of the new triangle. We are relieved that the area and perimeter work out to be the same as before, as they should. struct.c ********************************************************************************/ # include <stdio.h> # include <stdlib.h> # include <math.h> struct coords /* Structure tagged "coords" consists of two doubles */ { /* Every data type struct coords has two members called .x and .y */ double x; double y; }; struct threepoints /* Nested structures: a structure tagged "threepoints" */ { /* consists of three "struct coords" structures */ struct coords aa; struct coords bb; struct coords cc; } aaa; /* A global variable named "aaa" is declared of the type "struct threepoints". ie., we reserve memory for a triangle aaa */ double lengthe( struct coords v, struct coords w ); double areat( struct threepoints t ); double perimetert( struct threepoints t ); void printt( struct threepoints t ); struct threepoints rotatet( struct threepoints t, double x ); int main( void ) { double angledeg, anglerad; struct threepoints temp; printf ( "Triangle Program - - - Playing with Structures\n\n" ); printf ( "Enter the first vertex x y : " ); scanf ( "%lf%lf", &aaa.aa.x, &aaa.aa.y ); printf ( "Enter the second vertex x y : " ); scanf ( "%lf%lf", &aaa.bb.x, &aaa.bb.y ); printf ( "Enter the third vertex x y : " ); scanf ( "%lf%lf", &aaa.cc.x, &aaa.cc.y ); printt ( aaa ); printf (" The area of the triangle is %f\n", areat( aaa ) ); printf (" and the perimeter of the triangle is %f\n", perimetert( aaa ) ); printf ( "\n Enter the rotation angle in degrees : " ); scanf ( "%lf", &angledeg ); anglerad = angledeg * M_PI / 180.; printf ( "\n After rotation, \n" ); temp = rotatet( aaa, anglerad ); printt ( temp ); printf (" The area of the triangle is %f\n", areat( temp ) ); printf (" and the perimeter of the triangle is %f\n", perimetert( temp ) ); return EXIT_SUCCESS; } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* Example of a double valued function that takes two "struct coords" arguments. */ double lengthe ( struct coords v, struct coords w ) { return sqrt ( (v.x - w.x) * (v.x - w.x) + (v.y - w.y) * (v.y - w.y) ); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ double areat( struct threepoints t ) { return fabs ( ( t.bb.x * t.cc.y + t.aa.x * t.bb.y + t.aa.y * t.cc.x - t.bb.y * t.cc.x - t.aa.x * t.cc.y - t.aa.y * t.bb.x ) / 2.0 ); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* Example of a function that doesn't return anything. */ /* It only prints the vertices of a triangle. */ void printt ( struct threepoints t ) { printf ( "The vertices of the triangle are\n (%f,%f), (%f,%f), (%f,%f).\n", t.aa.x, t.aa.y, t.bb.x, t.bb.y, t.cc.x, t.cc.y ); return; } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* Example of a structure-valued function. */ /* Input triangle and angle to rotate in radians. Output rotated triangle. */ struct threepoints rotatet( struct threepoints t, double x ) { struct threepoints u; double s,c; s = sin(x); c = cos(x); u.aa.x = c * t.aa.x - s * t.aa.y; u.aa.y = s * t.aa.x + c * t.aa.y; u.bb.x = c * t.bb.x - s * t.bb.y; u.bb.y = s * t.bb.x + c * t.bb.y; u.cc.x = c * t.cc.x - s * t.cc.y; u.cc.y = s * t.cc.x + c * t.cc.y; return u; } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* Note that the member of a structure of type struct threepoints, t, is given */ /* by t.aa which itself is a structure of type struct coords. */ double perimetert( struct threepoints t ) { return lengthe ( t.aa, t.bb ) + lengthe ( t.bb, t.cc ) + lengthe ( t.cc, t.aa ); }

Fifth, define a structure of structures,

/* Milicic Distance distance.c */ #include <stdio.h> #include <math.h> typedef struct { float x; float y; } point ; typedef struct { point first; point last; } segment ; float dist( segment A) { return(sqrt((A.first.x - A.last.x)*(A.first.x - A.last.x) + (A.first.y - A.last.y)*(A.first.y - A.last.y))); } int main(){ float d; segment A; printf("The coordinates of the first point are: "); scanf("%f %f",&A.first.x,&A.first.y); printf("\nThe coordinates of the last point are: "); scanf("%f %f",&A.last.x,&A.last.y); printf("\nThe length of the segment is %f\n", dist(A)); }

/* Milicic Area of triangle triangle.c */ #include <stdio.h> #include <math.h> typedef struct { float x; float y; } point; typedef struct { point ver1; point ver2; point ver3; } triangle; float area(triangle T) { return(fabs((T.ver2.x - T.ver1.x)*(T.ver3.y-T.ver1.y) - (T.ver2.y - T.ver1.y)*(T.ver3.x-T.ver1.x))/2); } int main() { triangle T; float a; printf("The first point is: "); scanf("%f %f",&T.ver1.x,&T.ver1.y); printf("The second point is: "); scanf("%f %f",&T.ver2.x,&T.ver2.y); printf("The third point is: "); scanf("%f %f",&T.ver3.x,&T.ver3.y); a = area(T); printf("The area of the triangle is %f.\n",a); }

/* Milicic Volume of a tetrahedron tetr.c */ #include <stdio.h> #include <math.h> typedef struct { float x; float y; float z; } point; typedef struct { point ver1; point ver2; point ver3; point ver4; } tetrahedron; point Diff(point a, point b) { point c; c.x = a.x - b.x; c.y = a.y - b.y; c.z = a.z - b.z; return(c); } point Cross(point a, point b) { point c; c.x = a.y*b.z - a.z*b.y; c.y = a.z*b.x - a.x*b.z; c.z = a.x*b.y - a.y*b.x; return(c); } float Dot(point a, point b) { return(a.x*b.x + a.y*b.y + a.z*b.z); } float Volume(tetrahedron t) { point a, b, c; a = Diff(t.ver3,t.ver1); b = Diff(t.ver2,t.ver1); c = Diff(t.ver4,t.ver1); return(fabs(Dot(c,Cross(a,b)))/6); } int main(){ tetrahedron T; float vol; printf("The coordinates of the first point are: "); scanf("%f %f %f", &T.ver1.x, &T.ver1.y, &T.ver1.z); printf("The coordinates of the second point are: "); scanf("%f %f %f", &T.ver2.x, &T.ver2.y, &T.ver2.z); printf("The coordinates of the third point are: "); scanf("%f %f %f", &T.ver3.x, &T.ver3.y, &T.ver3.z); printf("The coordinates of the fourth point are: "); scanf("%f %f %f", &T.ver4.x, &T.ver4.y, &T.ver4.z); vol = Volume(T); printf("The volume of the tetrahedron T is equal to %f\n", vol); }

/* Treibergs ----used for today's demonstration program 4-3-6 almost verbatim copy of program by Milicic Volume of a tetrahedron today.c */ #include <stdio.h> #include <stdlib.h> #include <math.h> typedef struct { float x; float y; float z; } point; typedef struct { point ver1; point ver2; point ver3; point ver4; } tetrahedron; /* * * * * * * * * * * * * * * * * * * * * */ point Diff(point a, point b) { point c; c.x = a.x - b.x; c.y = a.y - b.y; c.z = a.z - b.z; return(c); } /* * * * * * * * * * * * * * * * * * * * * */ point Cross(point a, point b) { point c; c.x = a.y*b.z - a.z*b.y; c.y = a.z*b.x - a.x*b.z; c.z = a.x*b.y - a.y*b.x; return(c); } /* * * * * * * * * * * * * * * * * * * * * */ float Dot(point a, point b) { return(a.x*b.x + a.y*b.y + a.z*b.z); } /* * * * * * * * * * * * * * * * * * * * * */ float Volume(tetrahedron t) { point a, b, c; a = Diff(t.ver3,t.ver1); b = Diff(t.ver2,t.ver1); c = Diff(t.ver4,t.ver1); return ( fabs ( Dot ( c, Cross ( a, b ) ) ) / 6.0 ); } /* * * * * * * * * * * * * * * * * * * * * */ int main(void) { tetrahedron T; float vol; printf( "Volume of a Tetrahedron\n\n" ); printf("enter tthe coordinates of the first point : "); scanf("%f %f %f", &T.ver1.x, &T.ver1.y, &T.ver1.z); printf("Enter the coordinates of the second point : "); scanf("%f %f %f", &T.ver2.x, &T.ver2.y, &T.ver2.z); printf("Enter the coordinates of the third point : "); scanf("%f %f %f", &T.ver3.x, &T.ver3.y, &T.ver3.z); printf("Enter the coordinates of the fourth point : "); scanf("%f %f %f", &T.ver4.x, &T.ver4.y, &T.ver4.z); vol = Volume ( T ); printf ( "The volume of the tetrahedron T is equal to %f\n", vol); return EXIT_SUCCESS; }