1、程序要求
考卷成绩分析软件程序设计
2、任务分析
具体实现
①原始数据输入:
先用记事本编辑文件stu1.dat存储一个班学习成绩。然后在C环境下,建立一个学生信息的结构体,用r方式打开上述文件,再用fscanf读入、用printf在屏幕上显示文件内容。
②计算考试平均分、方差、最高分、最低分
利用循环使每个学生的考试成绩相加,考试成绩平方相加;然后再把和除以总人数就得到了考试成绩平均分,利用公式求出方差。接着用打擂台法求最高最低分。再用计数法算出每个分数段的学生人数。最后用fprintf将每个学生的信息写入到“1统计结果文件”文件。
③计算总成绩平均分、方差、最高分、最低分,排序
利用循环算出每个学生的总成绩,总成绩相加,除以总人数得到平均数;总成绩的平方相加,算方差;接着用打擂台法求最高最低分。接着用冒泡法利用总成绩的高低排出名次。最后用fprintf将每个学生的信息写入到“2.学生成绩文件”文件。
④找出不及格人数
利用条件语句,找出不及格学生,利用计数法计算不及格人数,然后用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();
}
结果:
谢谢!!!