实验六
Posted tty-1999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验六相关的知识,希望对你有一定的参考价值。
第一部分
①补足程序 学生的记录由学号和成绩组成。N名学生的数据已在主函数中放入结构体数组stu中。编写函数findMinlist,实现:把分数最低的学生数据放在数组t中,函数返回分数最低的学生的人数。(注意:分数最低的学生可能不止一个)
代码如下:
1 #include <stdio.h> 2 3 const int N=5; 4 5 // 定义结构体类型struct student,并定义STU为其别名 6 typedef struct student 7 long no; 8 char name[20]; 9 int score; 10 STU; 11 12 // 函数声明 13 void input(STU s[], int n); 14 int findMinlist(STU s[], STU t[], int n); 15 void output(STU s[], int n); 16 17 int main() 18 STU stu[N], minlist[N]; 19 int count; 20 21 printf("录入%d个学生信息\\n", N); 22 input(stu, N); 23 24 printf("\\n统计最低分人数和学生信息...\\n"); 25 count = findMinlist(stu, minlist, N); 26 27 printf("\\n一共有%d个最低分,信息如下:\\n", count); 28 output(minlist, count); 29 30 return 0; 31 32 33 // 输入n个学生信息,存放在结构体数组s中 34 void input(STU s[], int n) 35 int i; 36 for(i=0; i<n; i++) 37 scanf("%ld %s %d", &s[i].no, s[i].name, &s[i].score); 38 39 40 // 输出结构体s中n个元素信息 41 void output(STU s[], int n) 42 int i; 43 for(i=0; i<n; i++) 44 printf("%ld %s %d\\n", s[i].no, s[i].name, s[i].score); 45 46 47 // 在结构体数组s中,查找最低分学生的记录,将其存入结构体数组s中 48 // 形参n是结构体数组s中元素个数 49 // 函数返回最低分的学生人数 50 int findMinlist(STU s[], STU t[], int n) 51 // 补足函数实现 52 // ××× 53 int i,j=0,k=s[0].score; 54 for(i=0;i<n;i++) 55 if(s[i].score<k) 56 k=s[i].score; 57 for(i=0;i<n;i++) 58 if(s[i].score==k) 59 t[j++]=s[i]; 60 return j; 61 62
运行截图示例:
②:补足程序:题目描述
某省计算机等级考试的最终成绩是由两部分组成的:客观题和操作题组成。学生信息包含准考证号、学生姓名、客观题分数、操作题分数、总得分和等级。其中客观题占40%,操作题占60%。编写函数,实现如下功能:根据客观题和操作题的分数计算学生的总得分,并对学生的总得分进行排序,然后对前总得分前10%的学生的等级确定为"优秀",前10%-50%之间(不包含10%但包含50%的学生)确定为"合格",其余学生等级确定为"不合格"。
代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 const int N = 10; 4 5 // 定义结构体类型struct student,并定义其别名为STU 6 typedef struct student 7 long int id; 8 char name[20]; 9 float objective; /*客观题得分*/ 10 float subjective; /*操作题得分*/ 11 float sum; 12 char level[10]; 13 STU; 14 15 // 函数声明 16 void input(STU s[], int n); 17 void output(STU s[], int n); 18 void process(STU s[], int n); 19 20 int main() 21 STU stu[N]; 22 23 printf("录入%d个考生信息: 准考证号,姓名,客观题得分(<=40),操作题得分(<=60)\\n", N); 24 input(stu, N); 25 26 printf("\\n对考生信息进行处理: 计算总分,确定等级\\n"); 27 process(stu, N); 28 29 printf("\\n打印考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级\\n"); 30 output(stu, N); 31 32 return 0; 33 34 35 // 录入考生信息:准考证号,姓名,客观题得分,操作题得分 36 void input(STU s[], int n) 37 // 补足代码 38 int i; 39 for(i=0;i<n;i++) 40 scanf("%d %s %f %f",&s[i].id,s[i].name,&s[i].objective,&s[i].subjective); 41 42 43 //输出考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级 44 void output(STU s[], int n) 45 // 补足代码 46 int i; 47 for(i=0;i<n;i++) 48 printf("%d %s %f %f %f %s\\n",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level); 49 50 51 // 对考生信息进行处理:计算总分,排序,确定等级 52 void process(STU s[], int n) 53 // 补足代码 54 int i,j; 55 STU temp; 56 for(i=0;i<n;i++) 57 s[i].sum=s[i].subjective+s[i].objective; 58 59 60 for(i=0;i<n;i++) 61 62 if((i+1)<=n*0.1) 63 strcpy(s[i].level,"优秀"); 64 else if((i+1)>n*0.1&&(i+1)<=n*0.5) 65 strcpy(s[i].level,"合格"); 66 else 67 strcpy(s[i].level,"不合格"); 68 69 70 for(i=0;i<n-1;i++) 71 for(j=0;j<n-1-i;j++) 72 if(s[j].sum<s[j+1].sum) 73 temp = s[j]; 74 s[j] = s[j+1]; 75 s[j+1] = temp; 76 77 78
运行截图:
第二部分:共用体类型及编程示例:
共用体与结构体类型的区别?
①:共用体:几个不同类型的变量共占一段内存;
②:结构体:系统分配内存为各成员所需要内存量的总和。
第三部分:枚举类型及编程示例
Q:枚举类型用于描述哪一类数据?
A:枚举是所包含值为固定几个值的数据,是一系列命名的整型常量,是一种基本数据类型,而不是一钟构造类型,适用于变量取值有限的情形。
Q:枚举变量使用过程中的注意事项;能否直接输入输出?
A1:默认情况下,枚举值列表中的值按顺序对应0,1,2......如果指定某个枚举值对应的整数,则后续枚举值在此基础上加1。
A2:不能直接输入/输出。
Q:能否把一个int型数值赋值给一个枚举类型的变量?反过来呢?
A: int型数值n赋值给枚举类型的变量,必须用强制类型(显式)转换,意义为将顺序号为n的枚举元素赋予枚举变量;枚举值可以赋给整型变量,意义为将枚举值的顺序号赋予整型变量。
实验总结与体会:
这次实验踩得坑比较多 ,最后还是都爬起来了。
exp1.2 中这个只要弄通循环 就挺简单了,就是先根据条件找到自己想要的那些数组,然后再通过变量对应到数组,从而找到自己要的个数,
这部分其实自己有个发现:对自己初始化的变量 可以用s[0].xxx也可以用根据题目意思来定义的一个常量。但一般初始化还是用s[0].xxx。
exp1.3 这部分其实和exp1.1里面有很多一样的,可以照样子搬就行,可我发现看似如此 自己做起来还是有很多问题
第一 对于那个10%的问题 就显得很愚笨,无从下手,然后现在编的这个程序 也是有漏洞的 对于无法整除10 和5的数就不成立了。
第二 写了%10d %lf 后数据输出以后就变成0.00000 很震惊,哭了 后来改成%d %f 就可以了 觉得自己蠢得很。
总之下次再多加练习 虽然计算机这块 自己真的不太行 就希望能自己多拿分吧。
互评:
①:
②:
③:
以上是关于实验六的主要内容,如果未能解决你的问题,请参考以下文章