实验6 结构体、共用体与枚举

实验6 结构体、共用体与枚举

 实验结论

Part1: 结构体类型及编程应用

程序ex1_2.cpp,补足后的程序源码↓

#include <stdio.h>

const int N=5;

// 定义结构体类型struct student,并定义STU为其别名
typedef struct student {
    long no;
    char name[20];
    int score;
}STU;

// 函数声明
void input(STU s[], int n);
int findMinlist(STU s[], STU t[], int n);
void output(STU s[], int n);

int main() {
    STU stu[N], minlist[N];
    int count;
    
    printf("录入%d个学生信息\n", N);
    input(stu, N);
    
    printf("\n统计最低分人数和学生信息...\n");
    count = findMinlist(stu, minlist, N);
    
    printf("\n一共有%d个最低分,信息如下:\n", count);
    output(minlist, count);
    
    return 0;
}

// 输入n个学生信息,存放在结构体数组s中
void input(STU s[], int n) {
    int i;
    for(i=0; i<n; i++)
        scanf("%ld %s %d", &s[i].no, s[i].name, &s[i].score);
}

// 输出结构体s中n个元素信息
void output(STU s[], int n) {
    int i;
    for(i=0; i<n; i++)
        printf("%ld %s %d\n", s[i].no, s[i].name, s[i].score);
}

// 在结构体数组s中,查找最低分学生的记录,将其存入结构体数组s中
// 形参n是结构体数组s中元素个数
// 函数返回最低分的学生人数

 // 在结构体数组s中,查找最低分学生的记录,将其存入结构体数组s中
 // 形参n是结构体数组s中元素个数
 // 函数返回最低分的学生人数

int findMinlist(STU s[], STU t[], int n) {
    int i,j,min=s[0].score;
    j = 0;
    for(i=0;i<n;i++)
    {
        if(s[i].score < min)
            min = s[i].score;
    }
    for(i=0;j<n;j++)
    {
        if(s[j].score == min)
            t[i++] = s[j];
    }
    return i;
}

输入不同测试数据,给出运行结果截图↓

程序ex1_3.cpp附上补足后的程序源码↓

#include <stdio.h>
#include <string.h>
const int N = 10;

// 定义结构体类型struct student,并定义其别名为STU
typedef struct student {
    long int id;
    char name[20];
    float objective;    /*客观题得分*/
    float subjective;    /*操作题得分*/
    float sum;
    char level[10];
}STU;

// 函数声明
void input(STU s[], int n);
void output(STU s[], int n);
void process(STU s[], int n);

int main() {
    STU stu[N];
    
    printf("录入%d个考生信息: 准考证号,姓名,客观题得分(<=40),操作题得分(<=60)\n", N);
    input(stu, N);
    
    printf("\n对考生信息进行处理: 计算总分,确定等级\n");
    process(stu, N);
    
    printf("\n打印考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级\n");
    output(stu, N);
    
    return 0;
}

// 录入考生信息:准考证号,姓名,客观题得分,操作题得分
void input(STU s[], int n) {
    int a;
    for(a=0;a<n;a++)
        scanf("%ld%s%f%f",&s[a].id,s[a].name,&s[a].objective,&s[a].subjective);
}

//输出考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级
void output(STU s[], int n) {
    int b;
    printf("准考证号   姓名   客观题得分   操作题得分     总分   等级\n");
    for(b=0;b<n;b++)
        printf("  %-10ld%-9s%-8.2f%-11.2f%-10.2f%-9s\n",
               s[b].id,s[b].name,s[b].objective,s[b].subjective,s[b].sum,s[b].level);
}

// 对考生信息进行处理:计算总分,排序,确定等级
void process(STU s[], int n) {
    int i,j,k,m1,m2;
    m1=N%10;
    m2=N%2;
    STU temp;
    for(i=0;i<n;i++)
        s[i].sum=s[i].objective+s[i].subjective;
    for(j=0;j<n-1;j++)
        for(k=0;k<n-j-1;k++)
            if(s[k].sum<s[k+1].sum)
            {
                temp=s[k];
                s[k]=s[k+1];
                s[k+1]=temp;
            }
    for(i=0;i<m1;i++)
        strcpy(s[i].level,"优秀");
    for(i=m1;i<m2;i++)
        strcpy(s[i].level,"合格");
    for(i=m2;i<n;i++)
        strcpy(s[i].level,"不合格");
}

输入不同测试数据,给出运行结果截图 ↓

 

Part2: 共用体类型及编程示例运行课件中源码示例

总结:共用体与结构体类型的区别?

(1)共用体是构造数据类型,使几个不同类型的变量共占一段内存(相互覆盖),每次只有一个能使用共用体的成员共用一块内存区,结构体的成员有个自独立的内存区。

结构体是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型,

而且每个成员的数据类型可以相同也可以不相同。结构体的成员有个自独立的内存区。

(2)结构体可以同时存储多种变量类型,而共同体同一个时间只能存储和使用多个变量类型的一种。

(3)两者最大的区别就是所占用的内存:结构体所占用的内存是分量内存之和,共同体所占用的内存是等于最大的分量的内存。

 

Part3: 枚举类型及编程示例运行课件中源码示例 

1、enum 枚举名 {枚举值表}

①枚举是一系列命名的整型常量。枚举类型的变量取值不能超过定义范围,枚举值表中罗列出所有可用值(只可取花括号里面的某个值)。用于表示有限的、离散的取值。

②枚举类型是一种基本数据类型(整型),而不是一种构造类型。在无特殊说明时枚举元素第一个对应整数0第二个对应整数1按顺序以此类推。

2、注意事项

①枚举类型的输入输出需要借助“if…else” “switch”语句。

②枚举类型虽然本质上是一个整型,在使用时它相当于是一个整数,但不可直接将一个整数直接赋值给枚举变量,若进行如此操作计算机会进行报错。所以把数值赋值给枚举变量则必须用强制类型转换。

 

 实验总结和体会

在循环临界条件的确定这里,总是要从运行倒回去分析,才慢慢找到正确结果,但这样对于百科园练习和即将到来的期末考试并不是一件好事儿,需要重点关注。在自己补充代码的过程中,如程序ex1_3.cpp的截图,数据输入看起来乱乱的,实际上是忘记打那一行姓名的信息结果敲了回车会车上一行的信息就无法变动了,但可以继续运行。这也让我感觉自己觉得很难很费劲儿补充完一个程序,但应用到实际工作仍是不好的一个程序,就是因为一下输入数据的不操心让我发现了这个不可以更改以往信息的问题,这就是一个极妙的大马虎,细细想一下就是在任何情况下都要主动的在发现问题之后多想一下,结果会很不同。期末加油ʕ •ᴥ•ʔ。

 

互评地址 

https://www.cnblogs.com/1418790233xjc/p/10976623.html

https://www.cnblogs.com/qwer9107/p/10999529.html

https://www.cnblogs.com/rosalyn/p/10990554.html

posted @ 2019-06-11 02:38  王钰敬  阅读(347)  评论(2编辑  收藏  举报