User Defined Data Types

1. Which of the following statements are true.

1. A variable of type struct is automatically initialized to 0 by the system.

Ans: False. User has to explicitly initialize a struct.

 

2. A struct helps us to keep related data elements together in a single entity.

Ans: True.

 

3. struct is a native data type.

Ans: False. struct is a composite data type.

 

 

2. If the system is 8 byte aligned and size of int is 4, what will be the size of struct example_type in above example? Also work out the memory map for same.

struct example_type {
    int one;
    char two;
    int three;
};

 

Ans: size of struct example_type will be 24 bytes. Each of the three members will be 8 byte aligned.

 

 

 

3. Which of the following statements are true.

1. Size of a struct is always greater than sum of size of its members.

Ans: False. It is greater than or equal to sum of size of its members.

 

2. A struct cannot have just one member.

Ans: False.

 

3. Size of a union is equal to size of largest element of the union.

Ans: True.

 

 

 

4. Which of the following will have a larger size.

struct trains_s {
    int train_numbers[100];
};

union trains_u {
    int train_numbers[100];
};

Ans: Both will be of the same size.

 

 

5. Identify which of these are valid typedef declarations.

1. typedef unsigned short USHORT;

Ans: Valid.

 

2. typedef int[100] INTARRAY;

Ans: Invalid. int[100] is not a type.

 

3. typedef int char;

Ans: Invalid. char is a keyword, it cannot be typedef identifier.

 

 

6. Trace control flow of above program for first two iterations.

 

01: #include <stdio.h>

02: struct student_info {
03:     char name[32];
04:     char class[16];
05:     int english_marks;
06:     int maths_marks;
07:     int science_marks;
08:     float percentage;
09: };
10: typedef struct student_info student_info_t;

11: #define NUM_STUDENTS 50

12: int main (int argc, char *argv[]) {
13:     student_info_t students[NUM_STUDENTS] = {0};

14:     for (int i = 0; i < NUM_STUDENTS; i++ ) {

15:         printf("Enter name of student %d: ", i + 1);
16:         scanf ("%s", &students[i].name);
17:         printf("Enter class of student %d: ", i + 1);
18:         scanf ("%s", &students[i].class);
19:         printf("Enter Marks in English for student %d: ", i + 1);
20:         scanf ("%d", &students[i].english_marks);
21:         printf("Enter Marks in Maths for student %d: ", i + 1);
22:         scanf ("%d", &students[i].maths_marks);
23:         printf("Enter Marks in science for student %d: ", i + 1);
24:         scanf ("%d", &students[i].science_marks);

25:         students[i].percentage = (students[i].english_marks + students[i].maths_marks + students[i].science_marks ) / 3.0;
26:         printf ("Percentage of Student %d : %f \n", i + 1, students[i].percentage);
27:     }

28:     return 0;
29: }


  1. Line 13 defines an array, students, of 50 elements of type student_info_t which is an alias for struct student_info.
  2. Line 14, control expression 0<50 evaluates to true. Control enters for loop.
  3. Line 15, message Enter name of student 1 is printed to the console.
  4. Line 16, a string (student’s name) is read into member name of students[0], i.e. 0th element of array of struct student_info.
  5. Line 17, message Enter class of student 1 is printed to the console.
  6. Line 18, a string (student’s class) is read into member class of students[0], i.e. 0th element of array of struct student_info.
  7. Line 19, message Enter marks in English for student 1 is printed to the console.
  8. Line 20, an int (student’s score in English) is read into member english_marks of students[0], i.e. 0th element of array of struct student_info.
  9. Line 21, message Enter marks in Maths for student 1 is printed to the console.
  10. Line 22, an int (student’s score in Maths) is read into member maths_marks of students[0], i.e. 0th element of array of struct student_info.
  11. Line 23, message Enter marks in Science for student 1 is printed to the console.
  12. Line 24, an int (student’s score in Science) is read into member science_marks of students[0], i.e. 0th element of array of struct student_info.
  13. Line 25, percentage score for students[0] is computed and stored in students[0].percentage.
  14. Line 26, message Percentage of student 1 : followed by computer percentage is printed to the console.
  15. End of for loop is reached. Tail statement is executed, value of i is incremented to 2.
  16. Control jumps to line 14, control expression 1<50 evaluates to true. Control enters for loop.
  17. Line 15, message Enter name of student 2 is printed to the console.
  18. Line 16, a string (student’s name) is read into member name of students[1], i.e. 1st element of array of struct student_info.
  19. Line 17, message Enter class of student 2 is printed to the console.
  20. Line 18, a string (student’s class) is read into member class of students[1], i.e. 1st element of array of struct student_info.
  21. Line 19, message Enter marks in English for student 2 is printed to the console.
  22. Line 20, an int (student’s score in English) is read into member english_marks of students[1], i.e. 1st element of array of struct student_info.
  23. Line 21, message Enter marks in Maths for student 2 is printed to the console.
  24. Line 22, an int (student’s score in Maths) is read into member maths_marks of students[1], i.e. 1st element of array of struct student_info.
  25. Line 23, message Enter marks in Science for student 2 is printed to the console.
  26. Line 24, an int (student’s score in Science) is read into member science_marks of students[1], i.e. 1st element of array of struct student_info.
  27. Line 25, percentage score for students[1] is computed and stored in students[1].percentage.
  28. Line 26, message Percentage of student 2 : followed by computer percentage is printed to the console.

 

 

7. Which of the following statements are true.

1. An enum value can be used without defining a variable of enum of type.

Ans: True.

 

2. typedef cannot be used with an enum to define new type alias.

Ans: False. An enum can be aliased to another type name using typedef.

 

3. Be default, first enum member is assigned value 1.

Ans: False. By default first member is assigned value 0.

 

4. An enum cannot be used as a function parameter.

Ans: False. An enum can be used as a function parameter.

 

8. Which of the following statements are true.

1. A union cannot have an enum

Ans: False. A union can have enum member.

 

2. A struct can have a union

Ans: True.

 

 

9. Write a program to

a. Define a struct point, that represents a point in 2D space with its x and y coordinates.

b. Define a struct square that stores 4 vertices of the square.

c. Allow the user to print perimeter and area of the square.

#include <stdio.h>
#include <math.h>

struct point {
    int x,y; 
};

struct square {
    struct point vertices[4];
};

double square_edge (struct square sq) {
    double x_distance = 0, y_distance = 0, edge = 0;
    x_distance = (sq.vertices[0].x - sq.vertices[1].x) * (sq.vertices[0].x - sq.vertices[1].x);
    y_distance = (sq.vertices[0].y - sq.vertices[1].y) * (sq.vertices[0].y - sq.vertices[1].y);
    edge = sqrt(x_distance + y_distance);
    return edge;
}

double square_perimeter (struct square sq) {
    return (4 * square_edge(sq));
}

double square_area (struct square sq) {
    double edge = square_edge(sq);
    return (edge * edge);
}

int main (int argc, char *argv[]) {

    struct square sqr = { 0 };
    printf("Enter vertices of square, clockwise\n");

    for(int i =0; i<4; i++) {
        printf("Enter x coordinate of vertex %d: ",i+1);
        scanf("%d", &sqr.vertices[i].x);
        printf("Enter y coordinate of vertex %d: ",i+1);
        scanf("%d", &sqr.vertices[i].y);
    }

    printf("Perimeter of square is %f\n", square_perimeter(sqr));
    printf("Area of square is %f\n", square_area(sqr));
    return 0;
}

 

 

10. Evolve above program to

a. Define enum of shapes – circle, rectangle, square.

b. Define a union to store details of appropriate shape: vertices for square and rectangle, centre and radius for circle.

c. Print the area and perimeter of the shape entered.

#include <stdio.h>
#include <math.h>

#define PI (22.0/7)

struct point {
    int x,y;
};

enum shape {
    _circle = 1,
    _rectangle,
    _square
};

struct quadrilateral {
    struct point vertices[4];
};

struct circle {
    struct point center;
    unsigned int radius;
};

struct shapes {
    enum shape this_shape;
    union {
        struct quadrilateral quad;
        struct circle cir;
    };
};

double compute_distance (struct point p1, struct point p2) {
    double x_distance = 0, y_distance = 0, distance = 0;
    x_distance = (p1.x - p2.x) * (p1.x - p2.x);
    y_distance = (p1.y - p2.y) * (p1.y - p2.y);
    distance = sqrt(x_distance + y_distance);
    return distance;
}

double square_perimeter (struct quadrilateral sq) {
    return (4 * compute_distance(sq.vertices[0], sq.vertices[1]));
}

double square_area (struct quadrilateral sq) {
    double edge = compute_distance(sq.vertices[0], sq.vertices[1]);
    return (edge * edge);
}

double rectangle_perimeter (struct quadrilateral rec) {
    double length = 0, breadth = 0;
    length = compute_distance(rec.vertices[0], rec.vertices[1]);
    breadth = compute_distance(rec.vertices[1], rec.vertices[2]);
    return (2 * (length + breadth));
}

double rectangle_area (struct quadrilateral rec) {
    double length = 0, breadth = 0;
    length = compute_distance(rec.vertices[0], rec.vertices[1]);
    breadth = compute_distance(rec.vertices[1], rec.vertices[2]);
    return (length * breadth);
}

double circle_perimeter (struct circle cir) {
    return (2 * PI * cir.radius);
}

double circle_area (struct circle cir) {
    return (PI * cir.radius * cir.radius);
}

void input_circle(struct circle * cptr) {
    printf("Enter x-coordinate of center of circle: ");
    scanf("%d", &cptr->center.x);
    printf("Enter y-coordinate of center of circle: ");
    scanf("%d", &cptr->center.y);
    printf("Enter radius of circle: ");
    scanf("%u", &cptr->radius);
}

void input_quadrilateral(struct quadrilateral * qptr) {
    printf("Enter vertices of quadrilateral, clockwise\n");
    for(int i =0; i<4; i++) {
        printf("Enter x coordinate of vertex %d: ",i+1);
        scanf("%d", &qptr->vertices[i].x);
        printf("Enter y coordinate of vertex %d: ",i+1);
        scanf("%d", &qptr->vertices[i].y);
    }
}

int main (int argc, char *argv[]) {
    struct shapes my_shape = { 0 };
    int choice = -1;
    double area = 0, perimeter = 0;
    printf("What shape would you like to enter?\n1. Circle\n2. Rectangle\n3. Square \n[1-3]: ");
    scanf("%d", &choice);

    switch (choice) {
        case _circle:
            my_shape.this_shape = _circle;
            input_circle(&my_shape.cir);
            perimeter = circle_perimeter(my_shape.cir);
            area = circle_area(my_shape.cir);
            break;

        case _rectangle:
            my_shape.this_shape = _rectangle;
            input_quadrilateral(&my_shape.quad);
            perimeter = rectangle_perimeter(my_shape.quad);
            area = rectangle_area(my_shape.quad);
            break;

        case _square:
            my_shape.this_shape = _square;
            input_quadrilateral(&my_shape.quad);
            perimeter = square_perimeter(my_shape.quad);
            area = square_area(my_shape.quad);
            break;

        default:
            printf("Invalid input\n");
    }

    printf("Perimeter of the shape is %f\n", perimeter);
    printf("Area of the shape is %f\n", area);
    return 0;
}