1、程序要求
考卷成绩分析软件程序设计
2、任务分析
具体实现
①原始数据输入:
先用记事本编辑文件stu1.dat存储一个班学习成绩。然后在C环境下,建立一个学生信息的结构体,用r方式打开上述文件,再用fscanf读入、用printf在屏幕上显示文件内容。
②计算考试平均分、方差、最高分、最低分
利用循环使每个学生的考试成绩相加,考试成绩平方相加;然后再把和除以总人数就得到了考试成绩平均分,利用公式求出方差。接着用打擂台法求最高最低分。再用计数法算出每个分数段的学生人数。最后用fprintf将每个学生的信息写入到“1统计结果文件”文件。
③计算总成绩平均分、方差、最高分、最低分,排序
利用循环算出每个学生的总成绩,总成绩相加,除以总人数得到平均数;总成绩的平方相加,算方差;接着用打擂台法求最高最低分。接着用冒泡法利用总成绩的高低排出名次。最后用fprintf将每个学生的信息写入到“2.学生成绩文件”文件。
扫描二维码关注公众号,回复:
150256 查看本文章
④找出不及格人数
利用条件语句,找出不及格学生,利用计数法计算不及格人数,然后用fprintf将每个学生的信息写入到“3.不及格学生名单”文件。
流程图:
源程序:
#include<stdio.h> #include<stdlib.h> #define N 20 struct student { char num[10]; char name[20]; int score1; int score2; float sumscore; int rank; }stu[N]; void readFile() //读取文本信息 { int i; FILE *fp; char name[20]="各同学成绩.txt"; char str[50]; if((fp= fopen(name,"r"))==NULL) { printf("error\n"); exit(0); } //读列头 fgets(str,50,fp); printf("%s",str); for( i=0;i<N;i++) { fscanf(fp,"%s%s%d%d\n",stu[i].num,stu[i].name,&stu[i].score1,&stu[i].score2); printf("%s %s\t %d\t %d\n",stu[i].num,stu[i].name,stu[i].score1,stu[i].score2); } fclose(fp); } void readToFile() //统计结果文件函数 { int i; int m=0,n=0; int k1=0,k2=0,k3=0,k4=0,k5=0; float a=0.0,s,average,s1=0; FILE *write; char writeName[20] = "1统计结果文件.txt"; if((write= fopen(writeName,"w"))!=NULL) for(i=0;i<N;i++) { a=a+stu[i].score1; //求考试成绩总和 s1=s1+stu[i].score1*stu[i].score1; //求考试成绩平方和 if(stu[i].score1>stu[m].score1) m=i; //求最大考试成绩 if(stu[i].score1<stu[n].score1) n=i; //求最小考试成绩 if(stu[i].score1<60) k1++; if(60<=stu[i].score1&& stu[i].score1 <=69 ) k2++; if(70<=stu[i].score1&& stu[i].score1 <=79 ) k3++; if(80<=stu[i].score1&& stu[i].score1 <=89 ) k4++; if(90<=stu[i].score1) k5++; } average=a/N; //求考试平均数 s=(float)(s1-N*(average*average))/N; //求方差 fprintf(write,"考试成绩平均分:%5.2f\t",average); printf("average is %5.2f\t",average); fprintf(write,"最高分:%d 最低分:%d 方差:%5.2f\n",stu[m].score1,stu[n].score1,s); printf("max=%d min=%d s=%5.2f\n",stu[m].score1,stu[n].score1,s); fprintf(write,"考试统计结果:\n"); fprintf(write,"90-100:"); printf("90-100:"); for(i=0;i<k5;i++) { fprintf(write,"*"); printf("*"); } fprintf(write,"\n"); printf("\n"); fprintf(write,"80-89:"); printf("80-89:"); for(i=0;i<k4;i++) { fprintf(write,"*"); printf("*"); } fprintf(write,"\n"); printf("\n"); fprintf(write,"70-79:"); printf("70-79:"); for(i=0;i<k3;i++) { fprintf(write,"*"); printf("*"); } fprintf(write,"\n"); printf("\n"); fprintf(write,"60-69:"); printf("60-69:"); for(i=0;i<k2;i++) { fprintf(write,"*"); printf("*"); } fprintf(write,"\n"); printf("\n"); fprintf(write,"60以下:"); printf("60以下:"); for(i=0;i<k1;i++) { fprintf(write,"*"); printf("*"); } fprintf(write,"\n"); printf("\n"); fclose(write); } void writeToFile1() //学生成绩文件函数 { int i,j,m=0,n=0; struct student t; float a=0.0,s1=0.0,s,average; FILE *write; char writeName[20] = "2.学生成绩文件.txt"; if((write=fopen(writeName,"w"))!=NULL) fprintf(write,"学号 姓名 考试成绩 平时成绩 总成绩 名次\n"); for(i=0;i<N;i++) { stu[i].sumscore=(float)(stu[i].score1*0.8+stu[i].score2*0.2); //计算总成绩 if(stu[i].sumscore>stu[m].sumscore) m=i; if(stu[i].sumscore<stu[n].sumscore) n=i; a=a+stu[i].sumscore; s1=s1+stu[i].sumscore*stu[i].sumscore; } average=a/N; //求总成绩平均分 s=(s1-N*average*average)/N; //求总成绩方差 for(i=0;i<N-1;i++) //排名次 for(j=0;j<N-1-i;j++) if(stu[j].sumscore<stu[j+1].sumscore) { t=stu[j];stu[j]=stu[j+1];stu[j+1]=t;} for(i=0;i<N;i++) { stu[i].rank=1; for(j=0;j<N;j++) { if(stu[i].sumscore<stu[j].sumscore) stu[i].rank++;} } for(i=0;i<N-1;i++) //排学号 for(j=0;j<N-1-i;j++) if(atoi(stu[j].num)>atoi(stu[j+1].num)) { t=stu[j];stu[j]=stu[j+1];stu[j+1]=t;} for(i=0;i<N;i++) { fprintf(write,"%s\t%s\t %d\t %d %5.2f %d\n",stu[i].num,stu[i].name, stu[i].score1,stu[i].score2,stu[i].sumscore,stu[i].rank); printf("%s\t%s\t%d\t%d\t%5.2f\t%d\n",stu[i].num,stu[i].name,stu[i].score1,stu[i].score2,stu[i].sumscore,stu[i].rank); } for(i=0;i<N;i++) {if(stu[i].sumscore>stu[m].sumscore) m=i; if(stu[i].sumscore<stu[n].sumscore) n=i;} fprintf(write,"总成绩平均分:%5.2f\t 最高分:%5.2f\t 最低分:%5.2f\t 方差:%5.2f\n",average,stu[m].sumscore,stu[n].sumscore,s); printf("总成绩平均分:%5.2f\t 最高分:%5.2f\t 最低分:%5.2f 方差:%5.2f\n",average,stu[m].sumscore,stu[n].sumscore,s); fclose(write); } void writeToFile2() //不及格学生名单 { int i,k=0; FILE *write; char writeName[30] = "3.不及格学生名单.txt"; if((write=fopen(writeName,"w"))!=NULL) fprintf(write,"学号 姓名 考试成绩 平时成绩 总成绩\n"); printf("不及格的学生:\n学号 姓名 考试成绩 平时成绩 总成绩\n"); for(i=0;i<N;i++) { if(stu[i].sumscore<60) { k++; fprintf(write,"%s\t%s\t %d\t %d %5.2f\n",stu[i].num,stu[i].name,stu[i].score1,stu[i].score2,stu[i].sumscore); printf("%s\t%s\t %d\t %d %5.2f\n",stu[i].num,stu[i].name,stu[i].score1,stu[i].score2,stu[i].sumscore); } } fprintf(write,"不及格人数:%d\n",k); printf("不及格人数:%d\n",k); fclose(write); } void main() { readFile(); readToFile(); writeToFile1(); writeToFile2(); }
结果:
谢谢!!!