学生成绩系统的程序编写,自己写的,但是一直不能运行,求指出错误,我改正
程序我是自己写的 ,所以问题有很多。刚开始我写有一百多个Error,现在我的只有七十多个,实在找不到,或者不理解了,希望解惑!!#include<stdio.h>
#include<malloc.h>
#include<string.h>
struct student
{
char IDNumber[16];/*学号*/
char FamilyName[16]; /*姓*/
char GivenName[16]; /*名*/
int sex; /*性别(0代表"女",1代表"男")*/
int BirthYear; /*出生年*/
int BirthMonth; /*出生月*/
int BirthDay; /*出生日*/
float score[4]; /*成绩*/
float sum; /*总分*/
float average; /*平均分*/
struct student *next; //设一个指数,指向下一个数
};
struct student *head; //取开头一个指数,作为起始
struct student *p,*q,*v; //设结构体相关的指数,用在后面的函数中
/*****************************************************************************/
void Enter_list() /*信息连续输入 OK*/
{ printf("请输入学号");scanf("%s",p->IDNumber);
printf("请输入姓"); scanf("%s",p->FamilyName);
printf("请输入名"); scanf("%s",p->GivenName);
printf("请输入性别(0代表女,1代表男)");scanf("%d",&p->sex);
printf("请输入出生年");scanf("%d",&p->BirthYear);
printf("请输入出生月");scanf("%d",&p->BirthMonth);
printf("请输入出生日");scanf("%d",&p->BirthDay);
printf("请输入外语成绩");scanf("%f",&p->score[0]);
printf("请输入高数成绩");scanf("%f",&p->score[1]);
printf("请输入C语言成绩");scanf("%f",&p->score[2]);
printf("请输入马哲成绩");scanf("%f",&p->score[3]); //输入一系列信息,作为可重复函数
p->next=(struct student*)malloc(sizeof(struct student)); //规定p->next结构体变量=结构体的相等结构的下一个变量
p=p->next; //再把p等于下一个结构变量
p->next=NULL; //最后使得最后的p->等于空值,即不返回值
void deal();
deal(); //定义一个函数,后面用
}
/***************************************************************************/
void Judge()
{
int i=1;
for(q=head;q->next!=NULL;q=q->next,i++)
{
if((q->sex)!=0&&(q->sex)!=1)
{
printf("性别输入错误请重新输入!");
}
}
}
/***************************************************************************/
void Querybyclass() /* 成绩处理 (排序) OK*/
{
int i,j,m,count=0;
float f;
char k[16];
q=head; //q成为结构体开头元素变量,相当于起始
while((q->next)!=NULL) //直到p为空值的时候跳出循环
{q->sum=(q->score[0]+q->score[1]+q->score[2]+q->score[3]);//总和
(q->average)=(q->sum)/4;q=q->next;}//平均
for(q=head;q->next!=NULL;q=q->next) count++; //算有多少个结构体元素变量,即一共多少人
for(i=1;i<count;i++) //在这些人里讨论
for(q=head,j=0;j<count-i;q=q->next,j++) //对这些人相关元素比较count-i次
{if((q->sum)<(q->next->sum)) {strcpy(k,q->IDNumber);strcpy(q->IDNumber,q->next->IDNumber);strcpy(q->next->IDNumber,k);
strcpy(k,q->FamilyName);strcpy(q->FamilyName,q->next->FamilyName);strcpy(q->next->FamilyName,k);
strcpy(k,q->GivenName);strcpy(q->GivenName,q->next->GivenName);strcpy(q->next->GivenName,k);//数组用STRCPY
m=q->sex;q->sex=q->next->sex;q->next->sex=m;
m=q->BirthYear;q->BirthYear=q->next->BirthYear;q->next->BirthYear=m;
m=q->BirthMonth;q->BirthMonth=q->next->BirthMonth;q->next->BirthMonth=m;
m=q->BirthDay;q->BirthDay=q->next->BirthDay;q->next->BirthDay=m;
f=q->score[0];q->score[0]=q->next->score[0];q->next->score[0]=f;
f=q->score[1];q->score[1]=q->next->score[1];q->next->score[1]=f;
f=q->score[2];q->score[2]=q->next->score[2];q->next->score[2]=f;
f=q->score[3];q->score[3]=q->next->score[3];q->next->score[3]=f;
f=q->sum;q->sum=q->next->sum;q->next->sum=f;
f=q->average;q->average=q->next->average;q->next->average=f;}//排序,将前后两个变量的元素交换
}
}
/**************************************************************************/
void SearchbByname () /*查找 OK*/
{char m,n[16],v[16];
int flag=0;
Querybyclass(); //前面的一个函数
do{printf("a按姓名查找 b 退出");
scanf("%s",&m);//通过if来判断路径
if(m=='a')
{ printf("请输入姓");
scanf("%s",n);
printf("请输入名");
scanf("%s",v);//以姓名查找
for(q=head;q->next!=NULL;q=q->next)//一直作为一个从开头的总的循环
{if(strcmp(n,q->FamilyName)==0)
if(strcmp(v,q->GivenName)==0)//姓、名查找
{printf("学号%s姓名%s%s性别%d出生年月日%8d%8d%8d外语成绩%5.1f高数成绩%5.1fC语言成绩%5.1f马哲成绩%5.1f总分%5.1f平均分%5.1f\n",
q->IDNumber,q->FamilyName,q->GivenName,q->sex,q->BirthYear,q->BirthMonth,q->BirthDay,q->score[0],
q->score[1],q->score[2],q->score[3],q->sum,q->average);flag=1;};}
if(flag==0) printf("无此学生信息\n");};
if(m=='b') break;//break,跳出循环
if(m!='a'&&m!='b' ){printf("请按提示输入\n");m='a';};}while(m=='a'||m=='b');//进行下一个功能
}
/****************************************************************************/
void Insert_list () /*插入记录 OK*/
{ char judge;
void Enter_list();
do{Enter_list(); //用了第一个函数,输入那个一系列信息,这就是插入
printf("\n您想继续输入下一位学生的成绩吗\n想,请按y 不想,请按n\n");
scanf("%s",&judge);}
while ((judge=='y')||(judge=='Y'));//用循环判断开启下一个功能
}
/****************************************************************************/
void Delete_list () /*删除记录 OK*/
{char m,judge,n[16],w[16];
int flag=0,count,j=0,i;
void deal();
deal();
do{ printf("a按学号删除信息 b按姓名删除信息 c取消");
scanf("%s",&m);
if(m=='a')//以if判断路径选项
{printf("请输入学号");scanf("%s",n);
for(q=head;q->next!=NULL;q=q->next,j++)//循环查找
if(strcmp(n,q->IDNumber)==0) //确认需要进行功能的个体变量
{printf("学号%s\t姓名%s%s\t性别%d\t出生年月日%8d%8d%8d外语成绩%8.1f高数成绩%8.1fC语言成绩%8.1f马哲成绩%8.1f总分%8.1f平均分%8.1f\n",
q->IDNumber,q->FamilyName,q->GivenName,q->sex,q->BirthYear,q->BirthMonth,q->BirthDay,q->score[0],
q->score[1],q->score[2],q->score[3],q->sum,q->average);//输出变量给人确认
flag=1;count=j;//flag用来确定不成立的改变;count相当于找到他的位置
printf("您确定要删除该同学所有信息?\n确认请按1 取消请按2\n");
scanf("%s",&judge);
if(judge=='1')
{if(count==0) head=head->next;//先讨论第一个元素,如果删除第一个,使得head=下一个数
else
{for(q=head,i=0;i<count;q=q->next,i++);//如果不是第一个,就开始找第几个
for(v=head;v->next!=q;v=v->next);
v->next=v->next->next;/*该步实现删除*/};//开始删除
};
};
if(flag==0) printf("无此学生信息");
};
if(m=='b')
{flag=0;
printf("请输入姓");scanf("%s",n);
printf("请输入名");scanf("%s",w);
for(q=head,j=0;q->next!=NULL;q=q->next,j++)
{if(strcmp(n,q->FamilyName)==0)
if(strcmp(w,q->GivenName)==0)
{printf("学号%s\t姓名%s%s\t性别%d\t出生年月日%8d%8d%8d外语成绩%8.1f高数成绩%8.1fC语言成绩%8.1f马哲成绩%8.1f总分%8.1f平均分%8.1f\n",
q->IDNumber,q->FamilyName,q->GivenName,q->sex,q->BirthYear,q->BirthMonth,q->BirthDay,q->score[0],
q->score[1],q->score[2],q->score[3],q->sum,q->average);
flag=1;count=j;
printf("您确定要删除该同学所有信息?\n确认请按1 取消请按2\n");
scanf("%s",&judge);
if(judge=='1')
{if(count==0) head=head->next;
else
{for(q=head,i=0;i<count;q=q->next,i++);
for(v=head;v->next!=q;v=v->next);
v->next=v->next->next;/*该步实现删除*/
count-=1;};//这个什么意思?
};
};
}
if(flag==0) printf("无此学生信息");
};
if(m=='c') break;
if(m!='a'&&m!='b') {printf("请安提示输入\n");m='a';};}while(m=='a'||m=='b');
}
/***************************************************************************/
void Print_list () /*显示链表中所有记录 OK*/
{int i=1;
printf("名次\t学号\t姓名\t性别\t出生年月日\t外语成绩\t高数成绩\tC语言成绩\t马哲成绩\t总成绩\t平均成绩\t\n");
for(q=head;q->next!=NULL;q=q->next,i++)
printf("%d\t%s\t%s%s\t%d\t%4d%4d%4d\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%5.1f\t%3.1f\t\n",
i,q->IDNumber,q->FamilyName,q->GivenName,q->sex,q->BirthYear,q->BirthMonth,q->BirthDay,
q->score[0],q->score[1],q->score[2],q->score[3],q->sum,q->average);//显示列表结构体元素
}
/***************************************************************************/
void Compute_score () /*统计 OK*/
{char n;
int count=0;
float sum,m=0;
void print();
printf("1 按名次显示所有学生信息\n2 显示分数段情况\n3 各门功课平均成绩和总平均成绩");
scanf("%s",&n);
switch(n)//以选择机构,switch来分类输出
{case '1':print();break;//print就是输出,显示
case '2':printf("注意!如果分数段后无成绩输出,则说明无该分数段成绩\n");
printf("外语90分以上\t");//外语
for(q=head;q->next!=NULL;q=q->next)//每一个成绩都在这个大循环中判断
if(q->score[0]>=90)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[0]);
printf("高数90分以上\t");//高数
for(q=head;q->next!=NULL;q=q->next)
if(q->score[1]>=90)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[1]);
printf("C语言90分以上\t");//C语言
for(q=head;q->next!=NULL;q=q->next)
if(q->score[2]>=90)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[2]);
printf("马哲90分以上\t");//马哲
for(q=head;q->next!=NULL;q=q->next)
if(q->score[3]>=90)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[3]);//90的
printf("外语80分以上\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[0]>=80)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[0]);
printf("高数80分以上\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[1]>=80)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[1]);
printf("C语言80分以上\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[2]>=80)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[2]);
printf("马哲80分以上\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[3]>=80)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[3]);//80的
printf("外语70分以上\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[0]>=70)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[0]);
printf("高数70分以上\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[1]>=70)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[1]);
printf("C语言70分以上\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[2]>=70)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[2]);
printf("马哲70分以上\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[3]>=70)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[3]);//70的
printf("外语60分以上\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[0]>=60)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[0]);
printf("高数60分以上\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[1]>=60)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[1]);
printf("C语言60分以上\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[2]>=60)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[2]);
printf("马哲60分以上\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[3]>=60)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[3]);//60的
printf("外语不及格\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[0]<60)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[0]);
printf("高数不及格\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[1]<60)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[1]);
printf("C语言不及格\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[2]<60)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[2]);
printf("马哲不及格\t");
for(q=head;q->next!=NULL;q=q->next)
if(q->score[3]<60)
printf("%s\t%s%s\t%3.1f\t\n",q->IDNumber,q->FamilyName,q->GivenName,q->score[3]);
break;//不及格的
case '3':for(sum=0,q=head;q->next!=NULL;q=q->next,count++)
sum+=q->score[0];m+=sum;
printf("外语平均成绩%3.1f\n",sum/count);
for(sum=0,q=head;q->next!=NULL;q=q->next)
sum+=q->score[1];m+=sum;
printf("高数平均成绩%3.1f\n",sum/count);
for(sum=0,q=head;q->next!=NULL;q=q->next)
sum+=q->score[2];m+=sum;
printf("C语言平均成绩%3.1f\n",sum/count);
for(sum=0,q=head;q->next!=NULL;q=q->next)
sum+=q->score[3];m+=sum;
printf("马哲平均成绩%3.1f\n",sum/count);
printf("总平均成绩%5.1f\n",m/(4*count));break;//单科平均成绩和总平均成绩
}
}
void Save_file ()
{
FILF *fp;
char ch,filename[10];
printf("输入所用的文件夹名字:");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("无法打开此文件\n");
break;
}
ch=getchar();
printf("请输入准备储存到磁盘的字符串:(以#结束)\n");
ch==getchar();
while (ch!='#')
{
fputs(ch,fp);
putchar(ch);
ch=getchar();
}
fclose(fp);
putchar(10);
}
/***************************************************************************/
void Load_file ()
{
FILF *fp;
char ch,filename[10];
printf("输入所用的文件夹名字:");
scanf("%s",filename);
if((fp=fopen("filename","r"))==NULL)
{
printf("无法打开此文件\n");
exit(0);
}
}
/************************************************************************/
void main() /*主函数*/
{char judge,t;
START:printf(" 欢迎进入成绩管理系统\n1输入记录 \t2删除记录\t3显示链表中所有记录\t4按照姓名查找记录 \t5将链表中记录保存到文件中\t6从文件中读入记录
\t7计算所有学生的总分和均分\t8按班级查询显示学生总分\t9插入记录到表中\t10退出\n");
scanf("%s",&t);
switch(t)
{case'1': p=head=(struct student*)malloc(sizeof(struct student));
do{Enter_list();
printf("\n您想继续输入下一位学生的成绩吗\n想,请按y 不想,请按n\n");
scanf("%s",&judge);}while ((judge=='y')||(judge=='Y'));goto START;
case'2': Delete_list();goto START;
case'3': Print_list();goto START;
case'4': SearchByname ();goto START;
case'5': Save_file();goto START;
case'6': Load_file();goto START;
case'7': Compute_score();goto START;
case'8': Querybyclass();goto START;
case'9': Insert_list();goto START;
case'10':break;}//主函数以switch确定自己选项
}
/*****************************结束*******************************/