学生成绩管理系统运行不出来,求指点
题目要求:
设计一个程序实现对学生成绩的管理,要求可以对指定的文件进行操作,可将多个文件组成一个文件。程序设计功能及要求:
1、输入:学生的基本信息,包括学号、姓名、C语言成绩、高等数学成绩等。
原始数据文件格式 (具体数据和项目自行编写):
学号 姓名 英语 C语言 高等数学…………
1 张三 76 89 78
2 李四 … … …
2、查询:可以按学号、姓名等进行成绩查询。
3、删除:删除某条记录。
4、计算:计算每个学生的总成绩、平均成绩,所有学生单科的平均成绩,将总成绩、平均成绩、名次加到对应学生成绩记录。
5、统计:统计每科成绩分布情况,统计情况存到文件中。
输出数据文件(由程序自动生成)
学号 姓名 英语 C语言 高等数学 ………平均成绩 名次
1 张三 76 89 78 …………
2 李四 …. …. ….
统计情况:
分数段 英语 C语言 高等数学 ………………….
<60 2 …
60~69 8 …
70~79 5 …
80~89 10 …
平均分 78 …
二、实验方法
1)学生信息的录入
从键盘录入学生的基本信息,并将其保存至学生成绩文件。
2)学生信息查询
从键盘输入姓名或学号,在学生成绩文件中实现按学号、姓名的查找,如果存在,则输出该学生的其他信息,如不存在,输出不存在此学生。
3)学生信息的删除
从键盘输入要删除的学生学号或姓名,在学生成绩文件中删除该学生的基本信息。
4)成绩的计算
计算每个学生的总成绩、平均成绩,所有学生单科的平均成绩,将总成绩、平均成绩、名次加到对应学生成绩记录中;
5)统计
统计每科成绩分布情况,统计情况加到学生成绩文件最后。
界面的设计
采用菜单或字符界面的形式,方便功能的选择。
这个是远行不出来的:
#include<stdio.h>
#include<conio.h>
typedef struct{
long INum; /*学号*/
char Name; /*姓名*/
char Sex; /*性别*/
int iScore[6]; /*存放三门成绩及总成绩,平均成绩,名次*/
}STUDENTINF;
#define NUM 3 /*人数定义*/
/*函数原型声明*/
int UserScreen(void);
void Bell(void);
void ReadData(STUDENTINF*);
void ScoreSort(STUDENTINF*,int);
int FunctionSelection(void);
void ScoreStatistic(STUDENTINF*,int*,int);
void PrintMessage(STUDENTINF*,int);
/*main.c*/
int main(int argc,char *argv[])
{
STUDENTINF stud[NUM]; /*定义结构数组*/
FILE *fp;
int i,j,iIndex,iSubIndex,iScoreCode;
long INumSearch;
char buffTmp[10];
int iScoreSeg[5]={0};
int iaver[3]={0};
do{
iIndex=UserScreen(); /*调用用户界面*/
system("cls");
//clrscr(); /*清屏*/
switch(iIndex)
{
case 1:printf("开始录入:\n"); /*输入学生信息*/
/*打开文件*/
fp=fopen("Data.txt","w");
for(i=0;i<NUM;i++)
ReadData(stud+i); /*循环输入数据*/
ScoreSort(stud,NUM);
fwrite(stud,sizeof(STUDENTINF),NUM,fp);
for(j=0;j<3;j++)
{
for(i=0;i<NUM;i++) /*计算各科所有学生的平均成绩*/
iaver[j]+=stud[i].iScore[j];
}
for(j=0;j<3;j++)
iaver[j]=iaver[j]/NUM;
fwrite(iaver,sizeof(iaver),3,fp);
fclose(fp);
for(i=0;i<NUM;i++)
PrintMessage(stud,i);
getchar();
break;
case 2:printf("请输入查询的姓名或学号:"); /*按姓名或学号查询成绩*/
fp=fopen("Data.txt","r+");
gets(buffTmp);
INumSearch=atol(buffTmp);
for(i=0;i<NUM;i++)
if(INumSearch==stud[i].INum||buffTmp==stud[i].Name)
break;
if(i<=NUM)
PrintMessage(stud,i);
else printf("查询无结果");
fclose(fp);
getchar();
break;
case 3:printf("请选择需要的操作:");
iSubIndex=FunctionSelection();
fp=fopen("Data.txt","r+");
fread(stud,sizeof(STUDENTINF),NUM,fp);
switch(iSubIndex)
{
case 1: /*删除学生信息*/
printf("请输入要删除的学生信息的姓名或学号:");
gets(buffTmp);
INumSearch=atol(buffTmp);
for(i=0;i<NUM;i++)
if(INumSearch==stud[i].INum||buffTmp==stud[i].Name)
break;
if(i<NUM) j=i;
for(j=i;j<NUM;j++)
stud[j]=stu[j+1];
NUM=NUM-1;
printf("删除成功");
else printf("查询无结果");
break;
case 2: /*统计各科各个分数段的人数*/
printf("各科分数段分布:\n");
for(i=0;i<3;i++)
{ ScoreStatistic(stud,iScoreSeg,i);
printf("第%d门课的成绩各分数段的人数:\n",i+1);
printf("90分以上人数: \t%-5\n",iScoreSeg[0]);
ptintf("80分到89分人数:\t%-5\n",iScoreSeg[1]);
ptintf("70分到79分人数:\t%-5\n",iScoreSeg[2]);
ptintf("60分到69分人数:\t%-5\n",iScoreSeg[3]);
ptintf("不及格人数:\t%-5\n",iScoreSeg[4]);
}
break;
}
getchar();
fclose(fp);
break;
case 4:return 0; /*退出系统*/
}
}while(iIndex!=4); /*循环显示主界面用户*/
}
/*------------------------------------
/ 函数名:UserScreen
/ 作用:用户主选择界面
/ 参数:无
/ 返回值:用户选择数据,整型,范围1~4
/-------------------------------------*/
int UserScreen(void)
{
char ch[3];
// clrscr();
do{
system("cls");
printf("1:输入全体数据\n");
printf("2:查询成绩\n");
printf("3:数据处理\n");
printf("4:退出系统\n");
printf("Please Selection:");
gets(ch);
if(ch[0]>'4'||ch[0]<'1')
Bell();
else
return ch[0]-'0';
}while(ch[0]>'4'||ch[0]<'1');
}
/*------------------------------------
/ 函数名:Bell
/ 作用:输入错误提示
/ 参数:无
/ 返回值:无
/-------------------------------------*/
void Bell(void)
{
printf("\007");
}
/*------------------------------------
/ 函数名:ReadData
/ 作用:输入一个学生信息
/ 参数:指向STUDENTINF的指针
/ 返回值:无
/------------------------------------*/
void ReadData(STUDENTINF *p)
{
char strTmp[15];
int i,sum=0;
printf("请输入学号:");
gets(strTmp);
p->INum =atol(strTmp);
printf("请输入姓名:");
gets(p->Name);
printf("请输入性别,m(男)/f(女):");
do{
gets(strTmp);
p->Sex =strTmp[0];
if(strTmp[0]!='f'&&strTmp!='m')
Bell();
}while(strTmp[0]!='f'&&strTmp!='m');
for(i=0;i<3;i++)
{printf("请输入第%d门课的成绩:",i+1);
gets(strTmp);
p->iScore[i]=atoi(strTmp);
sum+=p->iScore[i];
}
p->iScore[3]=sum;
p->iScore [4]=sum/4;
}
/*------------------------------------
/ 函数名:ScoreSort
/ 作用:对总成绩排序得出名次
/ 参数:pStu,指向STUDENTINF的指针,传递成绩结构的首地址
iSelCore,整型,传递所选课程
/ 返回值:无
/------------------------------------*/
void ScoreSort(STUDENTINF *pStu,int iSelScore)
{int i,j;
STUDENTINF Temp;
for(i=0;i<NUM-1;i++)
for(j=i+1;j<NUM;j++)
{
if((pStu+i)->iScore[iSelScore]<(pStu+i)->iScore[iSelScore])
{
Temp=*(pStu+i);
*(pStu+i)=*(pStu+j);
*(pStu+j)=Temp;
}
}
for(i=0;i<NUM;i++)
stu[j+1].iScore[5]=i+1;
}
/*------------------------------------
/ 函数名: FunctionSelection
/ 作用:事务处理功能选择
/ 参数:无
/ 返回值:用户选择数据,整型,范围1~2
/------------------------------------*/
int FunctionSelection(void)
{
char ch[3];
// clrscr();
do{
system("cls");
printf("1:删除学生信息\n");
printf("2:统计各科各个分数段的人数\n");
printf("Please Selection:");
gets(ch);
if(ch[0]>'2'||ch[0]<'1')
Bell();
else
return ch[0]-'0';
}while(ch[0]>'2'||ch[0]<'1');
}
/*------------------------------------
/ 函数名:ScoreStstistic
/ 作用:统计各科各分数段的人数
/ 参数:pStu,指向STUDENTINF的指针,传递成绩结构的首地址
pScore,指向整型的指针传递各个分数组的首地址
iSelCore,整型,传递统计的课程
/ 返回值:无
/------------------------------------*/
void ScoreStatistic(STUDENTINF *pStu,int *pScore,int iSelScore)
{
int i;
for(i=0;i<NUM;i++)
pScore[i]=0;
for(i=0;i<NUM;i++)
if((pStu+i)->iScore[iSelScore]>=90)
pScore[0]++;
else if((pStu+i)->iScore[iSelScore]>=80)
pScore[1]++;
else if((pStu+i)->iScore[iSelScore]>=70)
pScore[2]++;
else if((pStu+i)->iScore[iSelScore]>=60)
pScore[3]++;
else
pScore[4]++;
}
/*------------------------------------
/ 函数名:PrintMessage
/ 作用:输出选定学生的信息
/ 参数:pStu,指向STUDENTINF的指针,传递成绩结构的首地址
iSel,整型,选定的学生在结构数组中的位置
/ 返回值:无
/------------------------------------*/
void PrintMessage(STUDENTINF *pStu,int iSel)
{
printf("学号:%-8d 姓名:%-8s 性别:%-2c 三门课程的成绩:%-4d,%-4d,%-4d 总成绩:%-4d 平均成绩:%-4d 名次:%-2d,
(pStu+iSel)->INum,(pStu+iSel)->Name,(pStu+iSel)->Sex,(pStu+iSel)->iScore[0],(pStu+iSel)->iScore[1],
(pStu+iSel)->iScore[2],(pStu+iSel)->iScore[3],(pStu+iSel)->iScore[4],(pStu+iSel)->iScore[5]);
}