| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 475 人关注过本帖
标题:[求助]这个学生成绩程序有什么出错了(急)
只看楼主 加入收藏
kjlljw102
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-6-8
收藏
 问题点数:0 回复次数:1 
[求助]这个学生成绩程序有什么出错了(急)

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define LEN sizeof(struct student)
#include <string.h>
#include <conio.h>
struct student
{float number;
char name[20];
float english;
float math;
float computer;
float sum;
float average;
long rank;
struct student *next;
};
typedef struct student files;
int n,k;/*n,k为全局变量,本程序中的函数均可以使用它*/

files *create() /*函数create功能:创建链表*/
{files *head,*p1,*p2,*p3;
int i;
n=0;
p1=p2=p3=(files *)malloc(LEN);
head=p3;
printf("请输入学生资料,输0退出!\n");
printf("请输入学生学号(学号应大于0):");/*输入学号,学号应大于0*/
scanf("%f",&p1->number);
if(p1->number==0) goto end; /*当输入的学号为0时,转到末尾,结束创建链表*/
printf("请输入学生姓名:");
scanf("%s",&p1->name);
printf("请输入英语成绩(0~100):");
scanf("%f",&p1->english);
while(p1->english<0||p1->english>100)
{printf("输入错误,请重新输入英语成绩");
scanf("%f",&p1->english);
}
printf("请输入数学成绩(0~100):");
scanf("%f",&p1->math);
while(p1->math<0||p1->math>100)
{printf("输入错误,请重新输入数学成绩");
scanf("%f",&p1->math);
}
printf("请输入计算机成绩(0~100):");
scanf("%f",&p1->computer);
while(p1->computer<0||p1->computer>100)
{printf("输入错误,请重新输入计算机成绩");
scanf("%f",&p1->computer);
}
p1->sum=p1->english+p1->math+p1->computer;
p1->average=p1->sum/3;
head=NULL;
while(p1->number!=0)
{n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(files *)malloc(LEN);
printf("请输入学生资料,输0退出!\n");
repeat2:printf("请输入学生学号(学号应大于0):");
scanf("%f",&p1->number);
if(p1->number==0) goto end; /*当输入的学号为0时,转到末尾,结束创建链表*/
else
{p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(p1->number!=p3->number) p3=p3->next;
else
{printf("学号重复,请重输!\n");
goto repeat2;
}
}
}
}
printf("请输入学生姓名:");
scanf("%s",&p1->name);/*输入学生姓名*/
printf("请输入英语成绩(0~100):");
scanf("%f",&p1->english);
while(p1->english<0||p1->english>100)
{printf("输入错误,请重新输入英语成绩");
scanf("%f",&p1->english);
}
printf("请输入数学成绩(0~100):");
scanf("%f",&p1->math);
while(p1->math<0||p1->math>100)
{printf("输入错误,请重新输入数学成绩");
scanf("%f",&p1->math);
}
printf("请输入计算机成绩(0~100):");
scanf("%f",&p1->computer);
while(p1->computer<0||p1->computer>100)
{printf("输入错误,请重新输入计算机成绩");
scanf("%f",&p1->computer);
}
p1->sum=p1->english+p1->math+p1->computer;
p1->average=p1->sum/3;
}
end:
p2->next=NULL;/*链表结尾*/
printf("输入的学生数为:%d个!\n",n);
return(head);
}

files *load(files *head) /*函数load功能:从文件读入学生记录*/
{files *p1,*p2;
int m=n=0;
FILE *fp;
if((fp=fopen("stu.txt","r"))==NULL)
{printf("不能打开文件!\n");
return 0;
}
m=m+1;
if(m==1)
{p1=(files *)malloc(LEN); /*开辟一个新单元*/
fscanf(fp,"%f%s%f%f%f%f%f%ld",&p1->number,p1->name,&p1->english,&p1->math,&p1->computer,&p1->sum,&p1->average,&p1->rank);
head=NULL;printf("32654\n");
do
{n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(files *)malloc(LEN); /*开辟一个新单元*/
fscanf(fp,"%f%s%f%f%f%f%f%ld",&p1->number,p1->name,&p1->english,&p1->math,&p1->computer,&p1->sum,&p1->average,&p1->rank);
}while(!feof(fp));
p2->next=p1;
p1->next=NULL;
n=n+1;
}
fclose(fp); /*结束读入,关闭文件*/
return (head);
}

files *add(files *head,files *stu) /*函数add,功能:追加学生资料*/
{files *p0,*p1,*p2,*p3;
int i;
p1=stu=(files *)malloc(LEN);/*开辟一个新单元*/
printf("\n输入要增加的学生的资料!");
repeat4: printf("请输入学生学号(学号应大于0):");
scanf("%ld",&stu->number);
if(stu->number==0) goto end2; /*当输入的学号为0时,转到末尾,结束追加*/
else
{p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(stu->number!=p3->number) p3=p3->next;
else
{printf("学号重复,请重输!\n");
goto repeat4; /*当输入的学号已经存在,程序报错,返回前面重新输入*/
}
}
}
}
printf("输入学生姓名:");
scanf("%s",stu->name);
printf("请输入英语成绩(0~100):");
scanf("%f",&p1->english);
while(p1->english<0||p1->english>100)
{printf("输入错误,请重新输入英语成绩");
scanf("%f",&p1->english);
}
printf("请输入数学成绩(0~100):");
scanf("%f",&p1->math);
while(p1->math<0||p1->math>100)
{printf("输入错误,请重新输入数学成绩");
scanf("%f",&p1->math);
}
printf("请输入计算机成绩(0~100):");
scanf("%f",&p1->computer);
while(p1->computer<0||p1->computer>100)
{printf("输入错误,请重新输入计算机成绩");
scanf("%f",&p1->computer);
}
p1->sum=p1->english+p1->math+p1->computer;
p1->average=p1->sum/3;
p1=head;
p0=stu;
if(head==NULL)
{head=p0;
p0->next=NULL;
} /*当原来链表为空时,从首结点开始存放资料*/
else /*原来链表不为空*/
{if(p1->next==NULL) /*找到原来链表的末尾*/
{p1->next=p0;
p0->next=NULL; /*将它与新开单元相连接*/
}
else
{while(p1->next!=NULL) /*还没找到末尾,继续找*/
{p2=p1;
p1=p1->next;
}
p1->next=p0;
p0->next=NULL;
}
}
n=n+1;
p1=head;
p0=stu;
end2:
printf("现在的学生数为:%d个!\n",n);
return(head);
}


files *del(files *head) /*函数del功能:删除学生资料*/
{files *p1,*p2;
float num;
printf("输入要删除的学生的学号(输入0时退出):");
scanf("%f",&num);
while(num!=0) /*输入学号为0时退出*/
{if(head==NULL)
{printf("\n没有任何学生资料!\n");
return(head);
}
p1=head;
while(num!=p1->number&&p1->next!=NULL) /*p1指向的不是所要找的首结点,并且后面还有结点*/
{p2=p1;
p1=p1->next;
} /*p1后移一个结点*/
if(num==p1->number) /*找到了*/
{if(p1==head) head=p1->next;/*若p1指向的是首结点,把地二个结点地址赋予head*/
else p2->next=p1->next; /*否则将下一个结点地址 赋给前一结点地址*/
printf("删除:%.0f\n",num);
n=n-1;
}
else printf("%.0f不存在此学生!\n",num); /*找不到该结点*/
printf("输入要删除的学生的学号:");
scanf("%f",&num);
}
printf("已经退出了!\n");
printf("现在的学生数为:%d个!\n",n);
return(head);
}

void print(files *head) /*函数print功能:显示学生成绩*/
{
files *p;
if(head==NULL) printf("\n没有任何学生资料!\n");
else
{printf("%d\n",n);
printf("=================================================================\n");
printf("|学号\t|姓名\t|英语\t|数学\t|计算机\t|总分\t|平均分\t|名次\n");
printf("=================================================================\n"); /*打印表格域*/
p=head;
do
{printf("|%.0f\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%ld\t|\n",p->number,p->name,p->english,p->math,p->computer,p->sum,p->average,p->rank);
printf("=================================================================\n"); /*打印表格域*/
p=p->next;
}while (p!=NULL); /*打印完成了*/
}
getchar();
}


void search(files *head) /*函数search功能:查询学生成绩*/
{float num;
char na[20];
int i;
files *p1,*p2;
printf("输入要查询的学生的1.学号\t2.姓名\t0.推出:");
printf("\n请选择:");
scanf("%f",&i);
if(i==1) {printf("输入学号:");
scanf("%d",&num);
while(num!=0)
{if(head==NULL) printf("\n没有任何学生资料!\n");
printf("=================================================================\n");
printf("|学号\t|姓名\t|英语\t|数学\t|计算机\t|总分\t|平均分\t|名次\n");
printf("=================================================================\n"); /*打印表格域*/
p1=head;
while(num!=p1->number&&p1->next!=NULL)
{p2=p1;
p1=p1->next;
}
if(num==p1->number)
printf("|%.0f\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%ld\t|\n",p1->number,p1->name,p1->english,p1->math,p1->computer,p1->sum,p1->average,p1->rank);
else printf("%.0f不存在此学生!\n",num);
printf("输入要查询的学生的学号,");
scanf("%f",&num);
}
printf("已经退出了!\n");
}
else if(i==2) {printf("输入姓名,输#推出:");
scanf("%s",na);
while(strcmp(na,"#")!=0)
{if(head==NULL) printf("\n没有任何学生资料!\n");
printf("=================================================================\n");
printf("|学号\t|姓名\t|英语\t|数学\t|计算机\t|总分\t|平均分\t|名次\n");
printf("=================================================================\n"); /*打印表格域*/
p1=head;
while((strcmp(na,p1->name)!=0)&&p1->next!=NULL)
{p2=p1;
p1=p1->next;
}
if(strcmp(na,p1->name)==0)
printf("|%.0f\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%ld\t|\n",p1->number,p1->name,p1->english,p1->math,p1->computer,p1->sum,p1->average,p1->rank);
else printf("%s不存在此学生!\n",na);
printf("输入要查询的学生的学号,");
scanf("%s",na);
}
printf("已经退出了!\n");
}
else if(i==0) printf("推出!\n");
}


搜索更多相关主题的帖子: 学生 
2007-06-08 21:14
kjlljw102
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-6-8
收藏
得分:0 

files *correct(files *head) /*函数search功能:查询学生成绩*/
{float num,fen;
char na[20];
int i,j,x;
files *p1,*p2;
printf("输入要修改的学生的1.学号\t2.姓名\t0.推出:");
printf("\n请选择:");
scanf("%f",&i);
if(i==1) {printf("输入学号:");
scanf("%f",&num);
while(num!=0)
{if(head==NULL) printf("\n没有任何学生资料!\n");
p1=head;
while(num!=p1->number&&p1->next!=NULL)
{p2=p1;
p1=p1->next;
}
if(num==p1->number)
{printf("你要修改\t1.学号\t2.姓名\t3.成绩:");
printf("\n请选择:");
scanf("%d",&j);
switch(j)
{case 1:printf("输入正确的学号:");
scanf("%f",&num);
p1->number=num;
break;
case 2:printf("输入正确的姓名:");
scanf("%s",na);
strcpy(p1->name,na);
break;
case 3:printf("你要修改1.英语成绩\t2.数学成绩\t3.计算机成绩");
printf("请选择:");
scanf("%d",&x);
if(x==1) {printf("输入正确的英语成绩:");
scanf("%f",&fen);
p1->english=fen;
}
else if(x==2) {printf("输入正确的数学成绩:");
scanf("%f",&fen);
p1->math=fen;
}
else if(x==3) {printf("输入正确的计算机成绩:");
scanf("%f",&fen);
p1->computer=fen;
}
break;
}
p1->sum=p1->english+p1->math+p1->computer;
p1->average=p1->sum/3;
}
else printf("%.0f不存在此学生!\n",num);
printf("输入要查询的学生的学号,");
scanf("%f",&num);
}
printf("已经退出了!\n");
}
else if(i==2) {printf("输入姓名,输#推出:");
scanf("%s",na);
while(strcmp(na,"#")!=0)
{if(head==NULL) printf("\n没有任何学生资料!\n");
p1=head;
while((strcmp(na,p1->name)!=0)&&p1->next!=NULL)
{p2=p1;
p1=p1->next;
}
if(strcmp(na,p1->name)==0)

while(num!=p1->number&&p1->next!=NULL)
{p2=p1;
p1=p1->next;
}
if(strcmp(na,p1->name)==0)
{printf("你要修改\t1.学号\t2.姓名\t3.成绩:");
printf("\n请选择:");
scanf("%d",&j);
switch(j)
{case 1:printf("输入正确的学号:");
scanf("%f",&num);
p1->number=num;
break;
case 2:printf("输入正确的姓名:");
scanf("%s",na);
strcpy(p1->name,na);
break;
case 3:printf("你要修改1.英语成绩\t2.数学成绩\t3.计算机成绩");
printf("请选择:");
scanf("%d",&x);
if(x==1) {printf("输入正确的英语成绩:");
scanf("%f",&fen);
p1->english=fen;
}
else if(x==2) {printf("输入正确的数学成绩:");
scanf("%f",&fen);
p1->math=fen;
}
else if(x==3) {printf("输入正确的计算机成绩:");
scanf("%f",&fen);
p1->computer=fen;
}
}
p1->sum=p1->english+p1->math+p1->computer;
p1->average=p1->sum/3;
}
else printf("%s不存在此学生!\n",na);
printf("输入要查询的学生的学号,");
scanf("%s",na);
}
printf("已经退出了!\n");
}
else if(i==0) printf("推出!\n");
return(head);
}

void taxi(files *head) /*定义排序函数。此函数带回一个指向链表头的指针*/
{files *p,*max;
int i,j,x;
long a;
float fen,num;
char na[20];
if(head==NULL) printf("\n没有任何学生资料,请先建立链表!\n"); /*链表为空*/
max=p=head;
for(i=0;i<80;i++)
printf("=");
printf("1.按英语成绩升序排序\t2.按数学成绩升序排序\t3.按计算机升序成绩排序\n");
printf("4.按英语成绩降序排序\t5.按数学成绩降序排序\t6.按计算机降序成绩排序\n");
for(i=0;i<80;i++)
printf("=");
printf("请选择操作:");
scanf("%d",&x);/*选择操作*/
switch(x)
{case 1 :for(i=1;i<n;i++)
{for(j=i+1;j<=n;j++)
{max=p;
p=p->next;
if(max->english>p->english) /*按英语成绩升序排序*/
{num=max->number;
max->number=p->number;
p->number=num; /*交换前后结点中的学号值,使得学号大者移到后面的结点中*/
strcpy(na,max->name);
strcpy(max->name,p->name);
strcpy(p->name,na); /*交换前后结点中的姓名,使之与学号相匹配*/
fen=max->english;
max->english=p->english;
p->english=fen; /*交换前后结点中的英语成绩,使之与学号相匹配*/
fen=max->math;
max->math=p->math;
p->math=fen; /*交换前后结点中的数学成绩,使之与学号相匹配*/
fen=max->computer;
max->computer=p->computer;
p->computer=fen; /*交换前后结点中的计算机成绩,使之与学号相匹配*/
fen=max->computer;
max->computer=p->computer;
p->computer=fen; /*交换前后结点中的总成绩,使之与学号相匹配*/
fen=max->sum;
max->sum=p->sum;
p->sum=fen; /*交换前后结点中的平均成绩,使之与学号相匹配*/
a=max->rank;
max->rank=p->rank;
p->rank=a; /*交换前后结点中的名次,使之与学号相匹配*/
}
}
max=head;
p=head;/*重新使max,p指向链表头*/
}
break;
case 2 :for(i=1;i<n;i++)
{for(j=i+1;j<=n;j++)
{max=p;
p=p->next;
if(max->math>p->math) /*按数学成绩升序排序*/
{num=max->number;
max->number=p->number;
p->number=num;
strcpy(na,max->name);
strcpy(max->name,p->name);
strcpy(p->name,na);
fen=max->english;
max->english=p->english;
p->english=fen;
fen=max->math;
max->math=p->math;
p->math=fen;
fen=max->computer;
max->computer=p->computer;
p->computer=fen;
fen=max->computer;
max->computer=p->computer;
p->computer=fen;
fen=max->sum;
max->sum=p->sum;
p->sum=fen;
a=max->rank;
max->rank=p->rank;
p->rank=a;
}
}
p=head;
max=head;
}
break;
case 3 :for(i=1;i<n;i++)
{for(j=i+1;j<=n;j++)
{max=p;
p=p->next;
if(max->computer>p->computer) /*按计算机成绩升序排序*/
{num=max->number;
max->number=p->number;
p->number=num;
strcpy(na,max->name);
strcpy(max->name,p->name);
strcpy(p->name,na);
fen=max->english;
max->english=p->english;
p->english=fen;
fen=max->math;
max->math=p->math;
p->math=fen;
fen=max->computer;
max->computer=p->computer;
p->computer=fen;
fen=max->computer;
max->computer=p->computer;
p->computer=fen;
fen=max->sum;
max->sum=p->sum;
p->sum=fen;
a=max->rank;
max->rank=p->rank;
p->rank=a;
}
}
p=head;
max=head;
}
break;
case 4:for(i=1;i<n;i++)
{for(j=i+1;j<=n;j++)
{max=p;
p=p->next;
if(max->english<p->english) /*按英语成绩降序排序*/
{num=max->number;
max->number=p->number;
p->number=num;
strcpy(na,max->name);
strcpy(max->name,p->name);
strcpy(p->name,na);
fen=max->english;
max->english=p->english;
p->english=fen;
fen=max->math;
max->math=p->math;
p->math=fen;
fen=max->computer;
max->computer=p->computer;
p->computer=fen;
fen=max->computer;
max->computer=p->computer;
p->computer=fen;
fen=max->sum;
max->sum=p->sum;
p->sum=fen;
a=max->rank;
max->rank=p->rank;
p->rank=a;
}
}
p=head;
max=head;
}
break;
case 5:for(i=1;i<n;i++)
{for(j=i+1;j<=n;j++)
{max=p;
p=p->next;
if(max->math<p->math) /*按数学成绩降序排序*/
{num=max->number;
max->number=p->number;
p->number=num;
strcpy(na,max->name);
strcpy(max->name,p->name);
strcpy(p->name,na);
fen=max->english;
max->english=p->english;
p->english=fen;
fen=max->math;
max->math=p->math;
p->math=fen;
fen=max->computer;
max->computer=p->computer;
p->computer=fen;
fen=max->computer;
max->computer=p->computer;
p->computer=fen;
fen=max->sum;
max->sum=p->sum;
p->sum=fen;
a=max->rank;
max->rank=p->rank;
p->rank=a;
}
}
p=head;
max=head;
}
break;
case 6:for(i=1;i<n;i++)
{for(j=i+1;j<=n;j++)
{max=p;
p=p->next;
if(max->computer<p->computer) /*按计算机成绩降序排序*/
{num=max->number;
max->number=p->number;
p->number=num;
strcpy(na,max->name);
strcpy(max->name,p->name);
strcpy(p->name,na);
fen=max->english;
max->english=p->english;
p->english=fen;
fen=max->math;
max->math=p->math;
p->math=fen;
fen=max->computer;
max->computer=p->computer;
p->computer=fen;
fen=max->computer;
max->computer=p->computer;
p->computer=fen;
fen=max->sum;
max->sum=p->sum;
p->sum=fen;
a=max->rank;
max->rank=p->rank;
p->rank=a;
}
}
p=head;
max=head;
}
break;
}
print(head);
}

void stat(files *head) /*定义统计函数*/
{files *p1;
int b=0,i;
long a;
float f1,f2;
p1=head;
printf("选择你要统计的课程:1.英语\t2.数学\t3.计算机\n");
scanf("%d",&a);
if(a==1) {printf("输入你要统计的分数段的起,止分数:");
scanf("%f%f",&f1,&f2);
for(i=0;i<n;i++)
{if(p1->english>f1&&p1->english<f2) b++;
if(p1->next!=NULL) p1=p1->next;
}
printf("英语成绩在%f~%f之间的人数为%d",f1,f2,b);
}
else if(a==2) {printf("输入你要统计的分数段的起,止分数:");
scanf("%f%F",&f1,&f2);
for(i=0;i<n;i++)
{if(p1->math>f1&&p1->math<f2) b++;
if(p1->next!=NULL) p1=p1->next;
}
printf("数学成绩在%f~%f之间的人数为%d",f1,f2,b);
}
else if(a==2) {printf("输入你要统计的分数段的起,止分数:");
scanf("%f%f",&f1,&f2);
for(i=0;i<n;i++)
{if(p1->computer>f1&&p1->computer<f2) b++;
if(p1->next!=NULL) p1=p1->next;
}
printf("计算机成绩在%f~%f之间的人数为%d",f1,f2,b);
}
else printf("输入错误!");
}

void save(files *head) /*函数save功能:保存学生的资料*/
{FILE *fp;
files *p1,*max;
float fen,num;
char na[20];
int i,j;
long a=1;
for(i=1;i<n;i++)
{for(j=i+1;j<=n;j++)
{p1=head;
max=p1;
p1=p1->next;
if(max->sum<p1->sum)
{num=max->number;
max->number=p1->number;
p1->number=num;
strcpy(na,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,na);
fen=max->english;
max->english=p1->english;
p1->english=fen;
fen=max->math;
max->math=p1->math;
p1->math=fen;
fen=max->computer;
max->computer=p1->computer;
p1->computer=fen;
fen=max->computer;
max->computer=p1->computer;
p1->computer=fen;
fen=max->sum;
max->sum=p1->sum;
p1->sum=fen;
}
}


}
p1=head;
while(p1!=NULL)
{p1->rank=a++;
p1=p1->next; /*下移一个结点*/
}
if((fp=fopen("stu.txt","w"))==NULL) printf("不能打开文件!\n");
while(p1!=NULL)
{fprintf(fp,"%f%s%f%f%f%f%f%ld",p1->number,p1->name,p1->english,p1->math,p1->computer,p1->sum,p1->average,p1->rank);
p1=p1->next; /*下移一个结点*/
}
fclose(fp);
printf("文件已经保存!\n");

}

main()
{files *head=0,*stu=0;
int i,a;
while(1)
{
printf("\t\t\t\t学生成绩管理系统\n");
for(i=0;i<80;i++)
printf("=");
printf("\n");
for(i=0;i<80;i++)
printf("=");
printf("1.信息创建\t\t\t2.信息维护\t\t\t3.信息查询\n");
printf("4.信息统计\t\t\t5.信息排序\t\t\t0.退出系统\n");
printf("请选择你要进行的操作:");
scanf("%d",&k);
if(k==1){head=create();save(head);getchar();}
else if(k==2){system("cls");
printf("你可进行的操作:1.增加学生信息\t\t2.删除学生信息\t\t3.修改学生信息\t\t4.显示所有信息\n");
printf("请选择你进行的操作:");
scanf("%d",&a);
head=load(head);
switch(a)
{case 1:head=add(head,stu);save(head);break;
case 2:head=del(head);save(head);break;
case 3:head=correct(head);save(head);break;
case 4:print(head);break;
default:printf("错误选择\n");
}
}
else if(k==3){system("cls");search(head);}
else if(k==4){system("cls");stat(head);}
else if(k==5){system("cls");taxi(head);}
else if(k==0){exit(0);}
else printf("输入错误,请重试\n");
}
}

2007-06-08 21:14
快速回复:[求助]这个学生成绩程序有什么出错了(急)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017310 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved