主题:如何用C编译学生成绩管理系统
zhangding123000
[专家分:0] 发布于 2011-10-20 12:53:00
请高手赐教
回复列表 (共8个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2011-10-21 10:46:00
先说说你自己的思路吧:)
3 楼
cgl_lgs [专家分:21040] 发布于 2011-10-22 23:37:00
考虑系统,需要有个整体思路,然后再逐渐细化。
学生成绩管理系统,那当然就是管理成绩的——并且还是学生的。
所以学生基本信息和成绩都是需要的。但成绩是什么成绩呢?当然还需要科目啦:)
5 楼
dagui [专家分:0] 发布于 2011-11-04 22:47:00
#include "stdio.h"
#include "math.h"
#define N 100 /*学生人数,假设少于100*/
#define M 30 /*课程门数,假设少于30*/
void input();
void asfun();
void tasfun();
void sortfun();
void output();
int n, m; /*实际学生人数,实际课程人数*/
/*每个学生的数据*/
struct stt
{int num; /*学号*/
char name[10]; /*姓名*/
float score[M]; /*每门课程成绩*/
} sta[N];
char sname[M][16]; /*每门课程的名称*/
float avs1[M], sus1[M]; /*每门课程的平均分、方差*/
float total[N], avs2[N], sus2; /*每个学生的总分、平均分、方差*/
int sort[N]; /*排序结果*/
main()
{clrscr();
input();
asfun();
tasfun();
sortfun();
output();
}
/*获取数据*/
void input()
{char ch;
int i,j;
char *ps; /*数据文件名*/
FILE *fps; /*数据文件指针*/
printf("Please choice (K-input by keyboard F-get from disc file)\n");
ch=getch();
switch(ch)
{case 'K':
case 'k':
{printf("Input the number of student: ");
scanf("%d",&n);
printf("Input the number of subject: ");
scanf("%d",&m);
if(n<=0||n>1000||m<=0||m>30)
{printf("wrong data!");
exit(0);
}
printf("input the name of %d subjiects:\n",m);
for(j=0;j<m;j++)
scanf("%s",sname[j]);
for(i=0;i<n;i++)
{printf("input NO%d student's number,name,score of %d subjiects:\n",i+1,m);
scanf("%d%s",&sta[i].num, sta[i].name);
for(j=0;j<m;j++)
scanf("%f",&sta[i].score[j]);
}
ps="SCORE.DAT"; /*送磁盘文件保存*/
if((fps=fopen(ps,"wb"))==NULL)
{printf("file creation error!");
exit(0);
}
/*将数据写入磁盘文件*/
fwrite(&n,2,1,fps);
fwrite(&m,2,1,fps);
fwrite(sname,16,m,fps);
fwrite(sta,sizeof(struct stt),n,fps);
fclose(fps);
break;
}
case 'F':
case 'f':
{printf("Please input data filename:");
scanf("%s",ps);
if((fps=fopen(ps,"rb"))==NULL)
{printf("file open error!");
exit(0);
}
/*从文件中读取数据*/
fread(&n,2,1,fps);
fread(&m,2,1,fps);
fread(sname,16,m,fps);
fread(sta,sizeof(struct stt),n,fps);
fclose(fps);
break;
}
default:
{printf(" make a wrong data sources choice !");
exit(0);
}
}
}
/*计算每门课程的平均分和方差*/
void asfun()
{int i,j;
float t[M], ts[M]; /*每门课程学生成绩的分数的和、平方和*/
for(j=0;j<m;j++)
{t[j]=0; ts[j]=0;
for(i=0;i<n;i++)
{t[j]+=sta[i].score[j];
ts[j]+=sta[i].score[j]*sta[i].score[j];
}
avs1[j]=t[j]/n;
sus1[j]=ts[j]/n-avs1[j]*avs1[j];
}
}
6 楼
dagui [专家分:0] 发布于 2011-11-04 22:48:00
/*计算每个学生的总分、平均分和方差*/
void tasfun()
{int i, j;
float ta=0, ts=0; /*全班平均成绩之和,之平方和*/
for(i=0;i<n;i++)
{total[i]=0;
for(j=0;j<m;j++)
total[i]+=sta[i].score[j];
avs2[i]=total[i]/n;
ta+=avs2[i]; ts+=avs2[i]*avs2[i];
}
sus2=ts/n-(ta/n)*(ta/n);
}
/*按总分排名*/
void sortfun()
{int i, j,k;
int m; /*存放未筛选过的学生的名次*/
for(i=0;i<n;i++)
{k=i;
m=1;
for(j=0;j<n;j++)
if(total[j]>total[k]) m++;
sort[i]=m;
}
for(i=0;i<n;i++)
{k=0;
for(j=0;j<n;j++)
if(sort[j]==i+1)
{ sort[j]+=k;
k++;
}
}
}
/*输出数据*/
void output()
{int i, l, j;
int is; /*装名次为i+1的学生的排序号*/
char *pt;
FILE *fpt;
clrscr();
printf("score data of %d students and %d subjects as follows:\n",n,m);
printf("\n");
/*输出第一行*/
printf("number name ");
for(j=0;j<m;j++)
printf("%8s",sname[j]);
printf(" total score average score rank\n");
/*按名次输出每个学生对应第一行的内容*/
for(i=0;i<n;i++)
{for(l=0;l<n;l++)
if(sort[l]==i+1) is=l;
printf("%d%12s",sta[is].num,sta[is].name);
for(j=0;j<m;j++)
printf("%11.2f",sta[is].score[j]);
printf("%9.2f%17.2f%16d\n",total[is], avs2[is], sort[is]);
}
printf("\n");
/*输出课程平均分该行*/
printf("average score");
for(j=0;j<m;j++)
printf("%11.2f",avs1[j]);
printf("\n");
/*输出课程方差该行*/
printf(" variance");
for(j=0;j<m;j++)
printf("%11.2f",sus1[j]);
printf("%27.2f\n",sus2);
printf("\n");
/*将数据写入磁盘文件*/
pt="STUDENT.DAT"; /*输出数据送磁盘*/
if((fpt=fopen(pt,"wb"))==NULL)
{printf("file creation error");
exit(0);
}
fwrite(&n,2,1,fpt);
fwrite(&m,2,1,fpt);
fwrite(sname,16,m,fpt);
for(i=0;i<n;i++)
{fwrite(&sta[i],sizeof(struct stt),1,fpt);
fwrite(&total[i],4,1,fpt);
fwrite(&avs2[i],4,1,fpt);
fwrite(&sort[i],2,1,fpt);
}
fwrite(avs1,4,m,fpt);
fwrite(&sus2,4,1,fpt);
fclose(fpt);
getch();
}
7 楼
cgl_lgs [专家分:21040] 发布于 2011-11-04 23:46:00
呵呵,近来忙,看漏贴了:)现在恢复得怎样?
8 楼
cgl_lgs [专家分:21040] 发布于 2011-11-05 10:11:00
一个你可以自己试着想想怎样做,需要用到什么技巧或是什么函数,再有就是直接看别人给你的代码,然后想想为什么要这样做,最后都明白了想想还能不能再优化:)这样你才会有进步:)
我来回复