- part1
- // P280 例 8.15
- // 对教材上的程序作了微调整, 把输出学生信息单独编写成一个函数模块
- // 打印不及格学生信息和所有学生信息程分别调用
- #include<stdio.h>
- #include<string.h>
- #define N 3 // 运行程序输入测试时, 可以把这个数组改小一些输入测试
- typedef struct student
- {
- int id; /* 学生学号 */
- char name[20]; /* 学生姓名 */
- char subject[20]; /* 考试科目 */
- float perf; /* 平时成绩 */
- float mid; /* 期中成绩 */
- float final; /* 期末成绩 */
- float total; /* 总评成绩 */
- char level[10]; /* 成绩等级 */
- }STU;
- void input(STU[],int ); /* 输入学生信息 */
- void calc(STU[],int); /* 计算总评和等级 */
- int fail(STU[],STU [],int); /* 不及格学生统计 */
- void sort(STU[],int); /* 排序 */
- void print(STU[], int); /* 输出学生信息 */
- int main() {
- STU st[N],fst[N]; // 数组 st 记录学生信息, fst 记录不及格学生信息
- int k; // 用于记录不及格学生个数
- printf("录入学生成绩信息:\n");
- input(st,N);
- printf("\n 成绩处理...\n");
- calc(st,N);
- k = fail(st,fst,N);
- sort(st, N);
- printf("\n 学生成绩排名情况:\n");
- print(st, N);
- printf("\n 不及格学生信息:\n");
- print(fst, k);
- return 0;
- }
- // 输入学生信息
- void input(STU s[],int n) {
- int i;
- for(i=0;i<n;i++)
- scanf("%d %s %s %f %f %f",&s[i].id,s[i].name,s[i].subject,&s[i].perf,&s[i].mid,&s[i].final);
- }
- // 计算总评和等级
- void calc(STU s[],int n) {
- int i;
- for(i=0;i<n;i++) {
- s[i].total=s[i].perf*0.2+s[i].mid*0.2+s[i].final*0.6;
- if(s[i].total>=90)
- strcpy(s[i].level,"优"); // 注意: 等级是字符型数组, 要使用 strcpy 完成赋值
- else if(s[i].total>=80 && s[i].total<90)
- strcpy(s[i].level,"良");
- else if(s[i].total>=70 && s[i].total<80)
- strcpy(s[i].level,"中");
- else if(s[i].total>=60 && s[i].total<70)
- strcpy(s[i].level,"及格");
- else
- strcpy(s[i].level,"不及格");
- }
- }
- // 不及格学生统计
- // 数组 s 存放的是所有学生信息, 数组 t 存放不及格学生信息, n 是数组 s 中元素个数
- // 函数返回值: 返回的是不及格人数
- int fail(STU s[],STU t[],int n) {
- int i,k=0;
- for(i=0;i<n;i++)
- if(s[i].total<60)
- t[k++]=s[i];
- return k;
- }
- // 根据总评成绩对学生记录信息排序
- // 使用的是冒泡排序算法
- void sort(STU s[],int n) {
- int i,j;
- STU temp;
- for(i=0;i<n-1;i++)
- for(j=0;j<n-1-i;j++)
- if(s[j].total<s[j+1].total) {
- temp = s[j];
- s[j] = s[j+1];
- s[j+1] = temp;
- }
- }
- // 输出学生信息
- void print(STU s[], int n) {
- int i;
- printf("-----------------\n");
- printf("学号 姓名 考试科目 平时成绩 期中成绩 期末成绩 总评成绩 成绩等级 \ n");
- for(i=0;i<n;i++)
- printf("%5d %10s%20s %5.1f %5.1f %5.1f %5.1f %10s\n",s[i].id,s[i].name,s[i].subject,s[i].perf,s[i].mid,s[i].final,s[i].total,s[i].level);
- }
- 1.2
- #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 中元素个数
- // 函数返回最低分的学生人数
- int findMinlist(STU s[], STU t[], int n) {
- int i,j,min=s[0].score;
- for(i=0;i<n;i++){
- if(min>s[i].score)
- min=s[i].score;
- }
- i=0;
- for(j=0;j<n;j++){
- if(s[j].score==min)
- t[i++]=s[j];
- }
- return i;
- }
- #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 i;
- for(i=0;i<n;i++)
- scanf("%d %s %f %f",&s[i].id,&s[i].name,&s[i].objective,&s[i].subjective) ;
- }
- // 输出考生完整信息: 准考证号, 姓名, 客观题得分, 操作题得分, 总分, 等级
- void output(STU s[], int n) {
- int i;
- for(i=0;i<n;i++)
- printf("%d %s %.2f %.2f %.2f %s\n",&s[i].id,&s[i].name,&s[i].objective,&s[i].subjective,&s[i].sum,&s[i].level);
- }
- // 对考生信息进行处理: 计算总分, 排序, 确定等级
- void process(STU s[], int n) {
- int i,j,k;
- STU temp;
- for(i=0;i<n;i++){
- s[i].sum=s[i].objective*0.4+s[i].subjective*0.6;
- }
- for(j=0;j<n-1;j++)
- for(k=0;k<n-1-j;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<n;i++){
- if(i==0)
- strcpy(s[i].level,"优秀");
- else if(i>0&&i<=5)
- strcpy(s[i].level,"合格");
- else
- strcpy(s[i].level,"不合格");
- }
- }
对于这个编程练习, 我感到有点晕, 最初是那个等级无法表示, 借鉴了一下其他同学的, 感觉还是有问题, 但又找不出来是哪里有问题, 稍有一行
有点小问题, 整个程序就没办法正常运行, 后来, 好不容易, 能运行了, 输了好几遍考生信息, 得出的结果全是 0000, 然后又把输出那部分改了一下, 输出格式
勉强能看了, 评的等级也似乎是对的, 但分数却是 0.
Part2
共用体结构体类型的区别:
- https://www.cnblogs.com/zhaoyingshan/p/10991061.html
- https://www.cnblogs.com/Laupup/p/10991299.html
- https://www.cnblogs.com/Lyrue/p/10990523.html
来源: http://www.bubuko.com/infodetail-3086913.html