读书人

C程序编程求相助!

发布时间: 2013-06-26 14:29:32 作者: rapoo

C程序编程,急求帮助!!!!
我写了一个程序200多行吧大概,检查没错,但一运行,在选择功能模块输入后突然就停止工作了。
求帮忙啊,需要的话留个邮箱,我发程序过去。。。非常感谢!!!!!! C 编程
[解决办法]
成绩录入的p->score[i]要加&,其余的要调试看看
[解决办法]

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
//#include<conio.h>



typedef struct stu
{
char num[10];
char name[16];
float score[4];
float sum;
int order;
struct stu *next;
}Student;

#define Length sizeof(Student)

int Menu_Select();
Student *Create();
void Print(Student *head);
void Search(Student *head);
void Change(Student *head);
Student *Delete(Student *head);
Student *Sort1(Student *head);
Student *Sort2(Student *head);
Student *Insert(Student *head);
void Save(Student *head);
Student *Load();
//*****主函数********//
int main()
{
Student *head;
head=NULL;
for(;;)
{
switch(Menu_Select())
{
case 0:
head=Create();
break;

case 1:
Print(head);
break;

case 2:
Search(head);
break;

case 3:
Change(head);
break;

case 4:
head = Delete(head);
break;

case 5:
head = Insert(head);
break;

case 6:
Save(head);
break;

case 7:
head=Load();
break;

case 8:
exit(0);
}
}
}
//***********主菜单*************//
int Menu_Select()
{
int n;
printf("\t\t 欢迎来到C管理系统\n");
printf("================================================================================\n");
printf("\t\t\t0.学生成绩录入\n");
printf("\t\t\t1.学生成绩浏览\n");
printf("\t\t\t2.成绩查询\n");
printf("\t\t\t3.成绩修改\n");
printf("\t\t\t4.删除记录\n");
printf("\t\t\t5.成绩记录添加\n");


printf("\t\t\t6.保存文件\n");
printf("\t\t\t7.读取文件\n");
printf("\t\t\t8.退出\n");
printf("================================================================================\n");
do
{
printf("\n请输入菜单项序号(0-8):");
scanf("%d",&n);
}while(n<0
[解决办法]
n>8);

return(n);
}
//******成绩录入**********//
Student *Create()
{
Student *head=NULL,*p;
char c;
system("cls");
for(;;)
{
printf("\n是否继续输入?(Y/N):");
scanf("%c",&c);
if(c=='n'
[解决办法]
c=='N') break;
if(c=='y'
[解决办法]
c=='Y')
{
p=(Student *)malloc(Length);
if(!p)
{
printf("\n出错了!");
return (head);
}
printf("\n请输入学号:");
scanf("%s",p->num);
printf("请输入姓名:");
scanf("%s",p->name);
printf("平时成绩:");
scanf("%f",&(p->score[0])); //取地址符&
printf("试验成绩:");
scanf("%f", &(p->score[1])); //取地址符&
printf("设计成绩:");
scanf("%f", &(p->score[2])); //取地址符&
printf("期末成绩:");
scanf("%f", &(p->score[3])); //取地址符&
p->sum = ( p->score[0] / 10 + p->score[1] * 3/20
+ p->score[2] * 3/20 + p->score[3] * 3/5);
p->order = 0;
p->next = head;
head = p;
}
}
return(head);
}
//******成绩浏览*********//
//***按学号排序***//
Student *Sort1(Student *head)
{
int i=0;
Student *p1,*p2,*t,*temp,*p;
p1 = NULL;
while(head!=NULL)
{
for(p=head,temp=head;p->next!=NULL;p=p->next)
{
if(strcmp(p->next->num,temp->num)<0)
{
t=p;
temp=p->next;


}
}
if(p1==NULL)
{
p1=temp;
p2=temp;
}
else
{
p2->next=temp;
p2=temp;
}
if(temp == head)
{
head = head->next;
}
else
{
t->next=temp->next;
}
}
if(p!=NULL)
{
p2->next=NULL;
}
head=p1;
while(p1!=NULL)
{
i++;
p1->order=i;
p1=p1->next;
}
system("cls");
return (head);
}
//*按总成绩排序*//
Student *Sort2(Student *head)
{
int i=0;
Student *p1,*p2,*t,*temp,*p;
p1=NULL;
while(head!=NULL)
{
for(p = head,temp = head; p->next != NULL; p = p->next)
{
if((p->next->sum)>(temp->sum))
{
t=p;
temp=p->next;
}
}
if(p1==NULL)
{
p1=temp;
p2=temp;
}
else
{
p2->next=temp;
p2=temp;
}
if(temp==head)
{
head=head->next;
}
else
{
t->next=temp->next;
}
}
if(p!=NULL)
{
p2->next=NULL;
}
head=p1;
while(p1!=NULL)
{
i++;
p1->order=i;
p1=p1->next;
}
system("cls");
return (head);
}
void Print(Student *head)
{
int i=0,t;
Student *p;
p=head;
system("cls");
printf("1.按学号排序输出:\n");
printf("2.按成绩降序输出:\n");
printf("请选择成绩浏览方式:");
scanf("%d",&t);
if (t==1)
{
Student *Sort1(Student *head);
}
else if(t==2)
{
Student *Sort2(Student *head);
}
else
printf("错了!按原数据输出。/n");
printf("\n============================学生成绩信息============================\n");
printf("
[解决办法]
学号
[解决办法]
姓名
[解决办法]
平时成绩
[解决办法]
试验成绩
[解决办法]
设计成绩
[解决办法]
期末成绩
[解决办法]
总成绩
[解决办法]
\n");
while(p!=NULL)
{
i++;
printf("


[解决办法]
%-3s
[解决办法]
%-8s
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
\n",
p->num, p->name, p->score[0], p->score[1], p->score[2], p->score[3], p->sum); //类型注意匹配了
p = p->next;
}
printf("======================================================================\n");
}

void Search(Student *head)
{
int t;
Student *p;
char s[16];
system("cls");
printf("请选择查找方式:/n");
printf("1.按学号查找:/n");
printf("2.按姓名查找:/n");
printf("输入序号:");
scanf("%d",&t);
if(t==1)
{
printf("请输入要查找学生的学号:");
scanf("%s",s);
p=head;
while(strcmp(p->num,s) && p != NULL)
p=p->next;
if(p != NULL)
{
printf("\n
[解决办法]
学号
[解决办法]
姓名
[解决办法]
平时成绩
[解决办法]
试验成绩
[解决办法]
设计成绩
[解决办法]
期末成绩
[解决办法]
总成绩
[解决办法]
\n");
printf("
[解决办法]
%-3s
[解决办法]
%-8s
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
\n",
p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->sum);
}
else
printf("无此学号的记录!");
}
else
{
printf("请输入要查找学生的姓名:");


scanf("%s",s); //这个地方倒是多了&
while(p != NULL && strcmp(p->name,s))
p=p->next;
if(p!=NULL)
{
printf("\n
[解决办法]
学号
[解决办法]
姓名
[解决办法]
平时成绩
[解决办法]
试验成绩
[解决办法]
设计成绩
[解决办法]
期末成绩
[解决办法]
总成绩
[解决办法]
\n");
printf("
[解决办法]
%-3s
[解决办法]
%-8s
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
\n",
p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->sum);
}
else
printf("无此学生的记录!");
}
}
void Change(Student *head)
{
Student *p;
char c,s[16];
system("cls");
printf("请输入你要修改的学生学号或姓名:");
scanf("%s",s);
p = head;
while(p != NULL && ((strcmp(p->num,s))
[解决办法]
(strcmp(p->name,s))) )
p = p->next;
if(p != NULL)
{
printf("\n
[解决办法]
学号
[解决办法]
姓名
[解决办法]
平时成绩
[解决办法]
试验成绩
[解决办法]
设计成绩
[解决办法]
期末成绩
[解决办法]
总成绩
[解决办法]
\n");
printf("
[解决办法]
%-3s
[解决办法]
%-8s


[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
\n",
p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->sum);
printf("\n确定要对这个数据进行修改吗?(Y/N):");
for(;;)
{
scanf("%*c%c",&c); //%*c用于接收缓冲区里的垃圾'\n'
if(c=='n'
[解决办法]
c=='N')
break;
if(c == 'y'
[解决办法]
c == 'Y')
{
printf("\n请输入学号:");
scanf("%s",p->num);
printf("请输入姓名:");
scanf("%s",p->name);
printf("平时成绩:");
scanf("%f", &(p->score[0]));
printf("试验成绩:");
scanf("%f", &(p->score[1]));
printf("设计成绩:");
scanf("%f", &(p->score[2]));
printf("期末成绩:");
scanf("%f", &(p->score[3]));
p->sum = (p->score[0]/10 + p->score[1] * 3/20
+ p->score[2] * 3/20 + p->score[3] * 3/5);
printf("此学生数据已被修改了,别忘记保存哦.\n");
break;
}
}
}
else
printf("无此学生的记录!");
}

Student *Delete(Student *head)
{
Student *p1,*p2;
char c,s[16];
system("cls");
printf("请输入要删除的学生学号或姓名:");
scanf("%s",s);
p1=p2=head;
while( p1 != NULL && ((strcmp(p1->num,s)
[解决办法]
strcmp(p1->name,s))) )
{
p2=p1;
p1=p1->next;
}
if((strcmp(p1->num,s))


[解决办法]
(strcmp(p1->name,s))==0)
{
printf("\n
[解决办法]
学号
[解决办法]
姓名
[解决办法]
平时成绩
[解决办法]
试验成绩
[解决办法]
设计成绩
[解决办法]
期末成绩
[解决办法]
总成绩
[解决办法]
\n");
printf("
[解决办法]
%-3s
[解决办法]
%-8s
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
%-2f
[解决办法]
\n",
p1->num,p1->name,p1->score[0],p1->score[1],p1->score[2],p1->score[3],p1->sum);
printf("\n确定要删除这个数据吗?(Y/N):");
for(;;)
{
scanf("%*c%c",&c); //%*c用于接收缓冲区里的垃圾'\n'
if(c=='n'
[解决办法]
c=='N')
break;
if(c=='y'
[解决办法]
c=='Y')
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
printf("此学生的数据已被删除了,别忘记保存哦.\n");
break;
}
}
}
else
printf("无此学生的记录\n");
return(head);
}

Student *Insert(Student *head)
{
Student *p,*NEW;
NEW=(Student *)malloc(Length);


if(!NEW)
{
printf("\n出错了!");
return (head);
}
system("cls");
printf("请输入新数据!\n");
printf("\n请输入学号:");
scanf("%s",NEW->num);
printf("请输入姓名:");
scanf("%s",NEW->name);
printf("请输入平时成绩:");
scanf("%f",&(NEW->score[0]));
printf("请输入实验成绩:");
scanf("%f",&(NEW->score[1]));
printf("请输入设计成绩:");
scanf("%f",&(NEW->score[2]));
printf("请输入期末成绩:");
scanf("%f",&(NEW->score[3]));
NEW->order=0;
if(head==NULL)
{
head = NEW;
NEW->next = NULL;
}
else
{
p = head->next;
head->next = NEW;
NEW->next = p;
}
printf("此学生的数据已被添加,别忘记保存哦.\n");
return(head);
}
void Save(Student *head)
{
FILE *fp;
Student *p;
char outfile[10];
system("cls");
printf("请输入输出文件名,例如c:\\test\n");
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL)
{
printf("不能打开此文件!\n");
return;
}
p = head;
while(p!=NULL)
{
fwrite(p,Length,1,fp);
p=p->next;
}
fclose(fp);
printf("保存文件成功!\n");
}
Student *Load()
{
Student *p1,*p2,*head=NULL;
FILE *fp;
char infile[10];
system("cls");
printf("请输入读取文件名,例如c:\\test\n");
scanf("%s",infile);
if((fp = fopen(infile,"rb"))==NULL)
{
printf("不能打开此文件!\n");
return(head);
}
p1=(Student *)malloc(Length);
if(!p1)
{
printf("出错了!\n");
return(head);
}
head = p1;
while(!feof(fp))
{
if(fread(p1,Length,1,fp)!=1) break;
p1->next=(Student *)malloc(Length);
if(!p1->next)
{
printf("出错了!\n");
return (head);
}
p2=p1;
p1=p1->next;
}
p2->next=NULL;


fclose(fp);
printf("读取文件成功!\n");
return (head);
}


读书人网 >C语言

热点推荐