这好像是编译器的差异,因为我最初遇到这样问御迹题时毕拆嫌换来GCC,就好了。老师告诉我加句输入语句,调试时候用。
真正的大程序是不手手会有这样问题的,take it easy
我的是可以文件输入输出和屏幕输入输出的额,你自己改下就行,另外在文件输入时注意格式,不懂在问#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
char num[10]
char name[10]
int score[5]/*score[0]存数学成绩score[1]语文成绩score[2]英语成绩score[3]总分score[4]平均分*/
struct node *next
}student/*学生成绩结构体*/
/*初始化结构体*/
student *init(student *t)
{
t=(student *)malloc(sizeof(student))
t->next=NULL
t->score[4]=t->score[3]=t->score[0]=t->score[1]=t->score[2]=0
return t
}
/*保存数据*/
void save(student *stu)
{
FILE *fp
if((fp=fopen( "score1","w"))==NULL)/*为输出打开文件score1*/
{
printf("cannot open file\n")exit(0)
}
stu=stu->next
while(stu!=NULL)
{
if(fwrite(stu,sizeof(student),1,fp)!=1)
printf("file write error\慎吵n")
stu=stu->next
}
fclose(fp)
}
/*读取数据*/
student * load(student *stu)
{
FILE *fpstudent *p,*rr=stu
if((fp=fopen("score1","r"))==NULL)/*为输入打开文件score1*/
return stu
do
{ p=(student *)malloc(sizeof(student))
p->next=NULL
if((fread(p,sizeof(student),1,fp)!=1)){fclose(fp)return stu}
r->next=p
r=r->next
}while(1)
}
/*输出一个特定的拿前学生的成绩*/
void output1(student *t)
{ int k
printf("宽敏侍%s\t%s\t",t->num,t->name)
for(k=0k<5k++)
printf("%d\t",t->score[k])
printf("\n")
}
/*输出全体学生的成绩*/
void output(student *stu)
{
stu=stu->next
printf("学号\t姓名\t数学\t语文\t英语\t总分\t平均分\n")
while(stu!=NULL)
{
output1(stu)
stu=stu->next
}
}
/*将stu后插在t中*/
student * charu(student *stu,student *t)
{student *pint k
p=(student *)malloc(sizeof(student))
strcpy(p->num,stu->num)
strcpy(p->name,stu->name)
for(k=0k<5k++)
p->score[k]=stu->score[k]
p->next=t->next
t->next=p
return p
}
/*按成绩排序*/
void paixu(student *stu,int i)
{
student *t,*p,*r
int j,kp=stu
printf("输入0按数学成绩\n")
printf("输入1按语文成绩\n")
printf("输入2按英语成绩\n")
printf("输入3按总分\n")
printf("输入4按平均分\n")
do
{
scanf("%d",&j)
if(j<0&&j>4) printf("输入错误请重新输入\n")
else break
}while(1)
t=init(t)
r=t
stu=stu->next
if(t->next==NULL)
r=charu(stu,t)/*在排序好的链表t中插入第一个节点*/
if(i==0)/*按升序排序*/
while(stu->next!=NULL)
{
stu=stu->next
if(r->score[j]>stu->score[j]) r=t/*如果待插入的score[j]<当前的score[j],指针r回溯*/
while(r->next->score[j]<stu->score[j]&&r->next!=NULL)
r=r->next/*找到比待插入的score[j]大的指针r->next*/
r=charu(stu,r)/*在r后面插入stu*/
}
else
while(stu->next!=NULL)
{
stu=stu->next
if(r->score[j]<stu->score[j]) r=t
while(r->next->score[j]>stu->score[j]&&r->next!=NULL)
r=r->next
r=charu(stu,r)
}
output(t)
}
/*排序菜单*/
void output2(student *stu)
{ int i
output(stu)
printf("输入 0 升序\n")
printf("输入 1 降序\n")
printf("输入其他任意字符退出\n")
scanf("%d",&i)
if(i==0||i==1)
paixu(stu,i)
printf("输入任意字符结束\n")
getch()
}
/*查找学生号为num是否存在*/
student * findnum(char *num,student *t,int *i)
{
*i=1
if(t->next==NULL)
return t
else
{
*i=strcmp(t->next->num,num)
while(*i<0)/*t->next->num<num时查找下一个*/
{
t=t->next
if(t->next==NULL)
return t
*i=strcmp(t->next->num,num)
}
}
return t/*t->next->num>=num时返回,此时i>=0*/
}
/*插入一个学生信息*/
student * insertstu(char *num,student *stu,char *name)
{ student *p,*tint *i,ji=&j
t=findnum(num,stu,i)/*查找该学号是否存在*/
if(j!=0)/*该学号不存在,则插入*/
{
p=init(p)
strcpy(p->num,num)
strcpy(p->name,name)
p->next=t->next
t->next=p
return stu
}
else
{printf("已有此学号\n学号\t姓名\n%s\t%s\n",t->next->num,t->next->name)return stu}
}
/*录入新学生信息*/
void base(student *stu)
{
char num[10],name[20]
printf("输入e结束输入新学生的信息\n")
printf("num(不超过10个数)\tname(不超过10个字)\n")
scanf("%s",num)
do
{
printf("\t\t\t")
scanf("%s",name)
stu=insertstu(num,stu,name)/*插入一个学生信息*/
scanf("%s",num)
}while(num[0]!='e')
output(stu)
printf("输入任意字符退出\n")
getch()
}
/*第i科成绩录入*/
student gradeenter(student *stu,int i)
{
student *tt=stu
t=t->next
printf("学号\t该科成绩\n")
while(t!=NULL)
{
printf("%s\t",t->num)
if(t->score[i]==0)/*如果学号为t->num的同学该科成绩没有*/
{
scanf("%d",&t->score[i])
t->score[3]+=t->score[i]/*学号为t->num的总分*/
t->score[4]=t->score[3]/3/*学号为t->num的平均分*/
}
else
printf("%d\n",t->score[i])
t=t->next/*录入下一个同学的该科成绩*/
}
printf("该科全部输入完成\n输入任意字符结束\n")
getch()
}
/*成绩录入菜单*/
void entergrade(student *stu)
{
int i
printf("0 录入数学成绩\n")
printf("1 录入语文成绩\n")
printf("2 录入英语成绩\n")
scanf("%d",&i)
switch(i)
{
case 0:gradeenter(stu,i)break
case 1:gradeenter(stu,i)break
case 2:gradeenter(stu,i)break
default:printf("输入错误请输入相应 *** 作的题号\n")
}
}
/*统计全班人数和平均分*/
void tongji(student *stu)
{
int total=0,score=0
stu=stu->next
while(stu!=NULL)
{
score+=stu->score[3]
stu=stu->next
total++
}
score=score/total
printf("班级总人数为:%d平均分为:%d\n输入任意字符退出\n",total,score)
getch()
}
void main()
{
char a='8'
student *stu
stu=init(stu)/*初始化stu*/
stu=load(stu)/*读取score1的数据*/
while(a!='4')
{
clrscr()
printf("************************************************************\n")
printf(" 学生成绩管理系统\n")
printf("-------made in china\n")
printf(" \t0 录入学生基本信息\n")
printf(" \t1 录入学生成绩\n")
printf(" \t2 输出班级总人数和平均分\n")
printf(" \t3 输出全体学生的信息\n")
printf(" \t4 退出\n")
printf("*************************************************************\n")
a=getch()
switch(a)
{
case'0':base(stu)break
case'1':entergrade(stu)break
case'2':tongji(stu)break
case'3':output2(stu)break
case'4':break
default:printf("i am sorry to hear that you enter the wrong num\n")
printf("按任意键重新输入\n")getch()continue
}
}
save(stu)/*将数据保存在score1中*/
printf("欢迎再次使用学生成绩管理系统........请按任意键退出.......")
getch()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)