#include<stdio.h> #include<string.h> #include<stdlib.h> #define N 3 typedef struct students{ int id; char name[20];// char subject[10]; float perd; float mid; float final; float total; char level[10]; }STU; void print(STU s[], int n); void input(STU s[],int n); int fail(STU s[] , STU a[], int n ); void calc(STU s[], int n); void sort (STU s[], int n); int main(){ STU s[N], a[N]; int k; printf("录入学生成绩信息: "); input(s, N); printf(" "); printf("成绩处理..."); printf(" "); calc(s, N); k = fail(s, a, N); sort(s, N); printf("学生成绩排名情况: "); printf("------------------ "); print(s,N); printf(" 不及格学生信息: "); printf("---------------- "); print(a, 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].perd, &s[i].mid, &s[i].final); } void print(STU s[], int n){ int i = 0; printf(" 学号 姓名 考试科目 平时成绩 期中成绩 期末成绩 总成绩 成绩等级 "); for(; i < n; i++) printf("%5d %6s %7s %8.1f %9.1f %9.1f %8.1f %3s ",s[i].id, s[i].name, s[i].subject, s[i].perd, s[i].mid, s[i].final,s[i].total, s[i].level); } void calc (STU s[], int n){ int i; for(i = 0 ;i < n ; i++){ s[i].total = s[i].perd * 0.2 + s[i].mid * 0.2 + s[i].final * 0.6; if(s[i].total >= 90) strcpy(s[i].level,"优"); 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, "不及格"); } } void sort(STU s[], int n){ int i , j; float min; STU t; for(i = n - 1; i > 0; i-- ){ j = i - 1; min = s[i].total; for( ; j >= 0; j--) { if(s[j].total < min ){ min = s[j].total; t = s[j]; s[j] = s[i]; s[i] = t; } } } } int fail(STU s[],STU a[], int n){ int i,j = 0 ; for(i = 0; i < n ; i++) if(s[i].total < 60) a[j++] = s[i]; return j; }
#include<stdio.h> const int N = 5; 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); input(stu, N); printf(" 统计最低分人数和学生信息... "); count = findMinlist(stu , minlist , N); printf(" 一共有%d个最低分, 信息如下: "); output(minlist, count ); return 0; } 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); } void output(STU s[], int n){ int i ; for(i = 0; i < n ;i++) printf("%ld %s %d ",s[i].no, s[i].name, s[i].score); } int findMinlist(STU s[], STU t[], int n){ int i , j,min, sum = 0; STU temp; for(i = n - 1; i > 0 ;i--){ j = i - 1; min = s[i].score; for(; j >= 0; j--){ if(s[j].score < min){ min = s[j].score; temp = s[i]; s[i] = s[j]; s[j] =temp; } } } t[sum++] = s[n - 1]; for(i = n - 2; i >= 0; i--){ if(s[i].score == s[n-1].score) t[sum++] = s[i]; } return sum; }
#include<stdio.h> #include<string.h> const int N = 10; typedef struct student{ long int id; char name[20]; float objective; float subjective; float sum; char level[20]; }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); input(stu, N); printf(" 对考生信息进行处理:计算总分,确定等级 "); process(stu, N); printf(" 打印考生完整信息:准考证号, 姓名, 客观题得分 ,总分, 等级 "); output(stu, N); return 0; } void input(STU s[], int n){ int i = 0; for(; i < n; i++){ scanf("%ld %s %f %f", &s[i].id, s[i].name, &s[i].objective, &s[i].subjective); s[i].sum = 0; strcpy(s[i].level ,"合格"); } } void output(STU s[], int n){ int i = 0; printf("准考证号 姓名 客观题得分 操作题得分 总分 等级 "); for(; i < n; i++) printf("%ld %10s %8.2f %12.2f %9.2f %8s ",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 prefect, pass ,fail; prefect = n * 0.1; pass = n * 0.5; fail = n; int i , j; for(i = 0; i < n; i++) s[i].sum = s[i].objective * 0.4 + s[i].subjective * 0.6; int min; STU temp; for(i = n - 1; i > 0; i--){ min = s[i].sum; j = i - 1; for(;j >= 0; j--){ //这里条件错误; if(s[j].sum < min){ min = s[j].sum; temp = s[j]; s[j] = s[i]; s[i] = temp; } } } for( i = 0 ; i < n ; i++){ if(i < prefect) strcpy(s[i].level, "优秀"); else if( i >= prefect && i < pass) strcpy(s[i].level, "合格"); else strcpy(s[i].level, "不合格"); } }
实验总结:
做实验一的时候想尝试自己打出来,所以主要遇到的麻烦都在实验一
首先是遇到的一些找了很久的小问题
1 print函数中少打了一个%f导致一直不能输出。
2 sort函数中if没有加大括号,找了很久的问题。
3 j--打成j++导致逻辑错误
总结,遇到这种多个函数的问题,可以先把思路写下来再打,会减少头脑混乱导致的小错误。
然后是在实验一中发现的一个小问题
因为最开始是自己打的代码,在结构体中定义了char *name发现运行不了,改为char name[20]后就可以运行了。
原因是如果定义*name,与a[20]
*name 为一个无效指针,因为没有指向的地址所以无法输入输出,&name 可以直接等同于字符数组中的a(及字符串的首地址),因为字符数组中a其实也是一个指针,指向字符常量区中字符串的首地址。
所以如果结构体中定义了*name,输入输出的格式应该为scanf("%s",&name)和printf("%s",&name)。