vlambda博客
学习文章列表

C语言 —— 结构体和共用体

今日一言:
谢谢你,成为我前进的理由。
——《言叶之庭》

C语言 —— 结构体和共用体

网课的月底,就和中学时期没流量的月底一样不好受。
一直要肝作业,这个其实是本周要交的C语言作业,顺便写成一篇文章吧。


教材

《C语言程序设计实训教程》(邹显春,杜云主 - 2007.08)


一、 实验目的

  1. 掌握结构体、共用体变量的定义和使用。

  2. 掌握结构体类型数组的定义、初始化、元素的赋值和使用方法。

  3. 掌握共用体变量和结构体变量的区别。


二、 验证性实验

(1) 请运行下面程序,仔细分析其结果

程序:

#include "stdio.h"

struct EXAMPLE{
    union{
        int x;
        int y;
    } in;
    int a;
    int b;
} e;

void main(){
    e.a = 1;
    e.b = 2;
    e.in.x = e.a*e.b;
    e.in.y = e.a+e.b;
    printf("%d,%d",e.in.x,e.in.y);
}

运行结果:

3,3

--------------------------------
Process exited after 0.1765 seconds with return value 3
请按任意键继续. . .

分析: 程序中用struct关键字声明了EXAMPLE的结构,e是该结构的变量,结构体变量内的成员用点号访问,union共用体用法和结构体类似,可在struct内声明。


(2) 运行和分析

程序:

#include "stdio.h"

union ks{

    int a;
    int *b;

} s[4],*p;

void main(){

    int n = 1,i;
    printf("\n");
    for ( i = 0 ; i < 4 ; i++ ){
        s[i].a = n;
        s[i].b = &s[i].a + 1;
        n = n + 2;
    }
    p = &s[0];

    printf("%d, %d\n",(p++)->a,(++p)->a);

}

运行结果:

42256124225612

--------------------------------
Process exited after 0.1201 seconds with return value 17
请按任意键继续. . .

(3) 运行和分析

程序:

#include "stdio.h"

union ks{

    int a;
    int *b;

} s[4],*p;

void main(){

    int n = 1,i;
    printf("\n");
    for ( i = 0 ; i < 4 ; i++ ){
        s[i].a = n;
        s[i].b = &s[i].a + 1;
        n = n + 2;
    }
    p = &s[0];
    p++; // 这是和第二题的区别 
    printf("%d, %d\n",(p++)->a,(++p)->a);

}

运行结果:

42256204225620

--------------------------------
Process exited after 0.1303 seconds with return value 17
请按任意键继续. . .

(4)设有3人的姓名和年龄存在结构体数组中,以下程序输出3人中年龄居中者的姓名和年龄,请填空完善(已完善)运行程序。

程序:

#include "stdio.h"

static struct man{

    char name[20];
    int age;

} person[] = {"li ming",19,"wang hua",22,"wang jian",23};

void main(){

    int i, j, max, min;
    max = min = person[0].age;
    for ( i = 1 ; i < 3 ; i++ ){
        if (person[i].age>max)
        max = person[i].age; // 此句为第一个填空
        else if(person[i].age<min)
        min = person[i].age; // 此句为第二个填空
    }
    for ( i = 0 ; i < 3 ; i++ ){
        if ( person[i].age!= max && person[i].age != min ){
            printf("%s %d\n",person[i].name,person[i].age);
            break;
        }
    }

}

运行结果:

wang hua 22

--------------------------------
Process exited after 0.1503 seconds with return value 12
请按任意键继续. . .

三、设计性实验

编写程序,完成调用readrec函数,把5名学生的学号、姓名、四项成绩以及平均分放在一个结构体数组中,学生的学号、姓名和四项成绩由键盘输入,然后计算出平均分放在结构体对应域中,调用writerec函数输出5名学生的记录。

程序:

/**************************************************************
 * 《C语言程序实训教程》  实验12      
 *  author : LOS
 *  create : 2020-5-24
 **************************************************************/

#include <stdio.h>
#include <stdlib.h>
#define NUM 5 

struct{

    char stuId[20];
    char stuName[20];
    float scores[4];
    float aveScore;

} students[NUM]; // 存放学生数据的结构体数组 


void printLineWithln(){
    printf("----------------------------\n");
}

void readrec(){
    int i,j,sum;
    printf("---------输入区---------\n");
    for (i=0;i<NUM;i++){
        printf("请输入第%l个学生的学号:",i+1);
        scanf("%s",&students[i].stuId);
        fflush(stdin);
        printf("请输入第%d个学生的姓名:",i+1);
        scanf("%s",&students[i].stuName);
        fflush(stdin);
        sum = 0;
        for ( j = 0 ; j < 4 ; j++ ){
            printf("请输入第%d个学生的第%d项成绩:",i+1,j+1);
            scanf("%f",&students[i].scores[j]);
            fflush(stdin);
            sum+=students[i].scores[j];
        }
        students[i].aveScore = sum/4;
        printf("\n");
    }
}

void wirterec(){
    int i;
    printf("---------输出区---------\n");
    printf("学号\t\t姓名\t\t成绩1\t成绩2\t成绩3\t成绩4\t平均分\n");
    for (i=0;i<NUM;i++){
        printf("%s\t\t%s\t\t%.1f\t%.1f\t%.1f\t%.1f\t%.2f\n",
        students[i].stuId,students[i].stuId,students[i].scores[0]
        ,students[i].scores[1],students[i].scores[2],students[i].scores[3],students[i].aveScore);
    }
}

void show(){
    readrec();
    wirterec();
}


void main( ){
    int n;
    while(1){
        show();
        printLineWithln();
        printf("1.重新开始\t0.退出程序\n");
        scanf("%d",&n);
        fflush(stdin);
        if ( n ){
            system("cls"); 
        } else {
            printf("bye");
            return;
        }
    } 
}

运行结果:

---------输入区---------
请输入第个学生的学号:201923301
请输入第1个学生的姓名:LOS
请输入第1个学生的第1项成绩:10
请输入第1个学生的第2项成绩:9
请输入第1个学生的第3项成绩:5
请输入第1个学生的第4项成绩:3

请输入第个学生的学号:201923302
请输入第2个学生的姓名:小鱼
请输入第2个学生的第1项成绩:100
请输入第2个学生的第2项成绩:100
请输入第2个学生的第3项成绩:99.5
请输入第2个学生的第4项成绩:100

请输入第个学生的学号:201923303
请输入第3个学生的姓名:中鱼
请输入第3个学生的第1项成绩:60
请输入第3个学生的第2项成绩:61
请输入第3个学生的第3项成绩:60.5
请输入第3个学生的第4项成绩:60

请输入第个学生的学号:201923304
请输入第4个学生的姓名:大鱼
请输入第4个学生的第1项成绩:45
请输入第4个学生的第2项成绩:38
请输入第4个学生的第3项成绩:99
请输入第4个学生的第4项成绩:55

请输入第个学生的学号:201923305
请输入第5个学生的姓名:迷你鱼
请输入第5个学生的第1项成绩:86
请输入第5个学生的第2项成绩:84
请输入第5个学生的第3项成绩:74
请输入第5个学生的第4项成绩:79

---------输出区---------
学号            姓名            成绩1   成绩2   成绩3   成绩4   平均分
201923301               201923301               10.0    9.0     5.0     3.0     6.00
201923302               201923302               100.0   100.0   99.5    100.0   99.00
201923303               201923303               60.0    61.0    60.5    60.0    60.00
201923304               201923304               45.0    38.0    99.0    55.0    59.00
201923305               201923305               86.0    84.0    74.0    79.0    80.00
----------------------------
1.重新开始      0.退出程序