学生选课管理系统弄了几天了 还是不行!!求高手帮忙找下错
求高手先帮我把输入和输出的那个链表修改下。后面删除的方便的话帮忙想想老师教到链表跳的太快了 没学的好
求高手帮忙了 。
已经弄了3天还是运行老出错,输入的时候老是输入乱码或是进入错误的循环。怎么回事啊?求解释。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
struct student
{int num;
char name[20];
char kind[10];
in socer;
struct student *next;
};
void mune()
{
printf("************************************\n");
printf("如果录入信息,请选择1\n");
printf("如果浏览信息,请选择2\n");
printf("如果按学号查询课程,请选择3\n");
printf("如果想进行选课,请选择4\n");
printf("如果需要删除信息,请选择5\n");
printf("如果想退出,请选择0\n");
printf("*************************************\n");
}
struct student *scan(FILE*fp)
{struct student *head;
struct student *p1,*p2,*p3;
int n;
n=0;
p1=p2=(struct student*)malloc(LEN);
printf("输入:学号 姓名 科目 学分\n");
scanf("%d,%s,%s,%d",&(*p1).num,(*p1).name,(*p1).kind,&(*p1).socer);
fprintf(fp,"%d,%s,%s,%d\n",(*p1).num,(*p1).name,(*p1).kind,(*p1).socer);
head=NULL;
while(p1->num!=0)
{n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct student*)malloc(LEN);
printf("请输入数据:");
scanf("%d",&p1->num); //输入课程号
if(p1->num!=0)
{
scanf("%s,%s,%d",(*p1).name,(*p1).kind,&(*p1).socer);
fprintf(fp,"%d,%s,%s,%d\n",(*p1).num,(*p1).name,(*p1).kind,(*p1).socer);
}
p2->next=NULL;
fclose(fp);
return(head);
}
}
void print(struct student*head) //将输入的内容显示在屏幕上
{
struct student*p1;
if(head!=NULL)
p1=head;
else
goto end;
printf("学号 姓名 科目 学分\n");
do
{printf("%d,%s,%s,%d\n",(*p1).num,(*p1).name,(*p1).kind,(*p1).socer);
p1=p1->next;
}
while(p1!=NULL);
end:;
}
void search_num(struct student*head)
{
int i,n=0;
struct student*p1;
p1=head;
printf("请输入学生学号\n");
scanf("%d",&i);
while(p1!=NULL)
{if((i%p1->num)==0) //用num函数进行数字的比较
{printf("学号 姓名 科目 学分\n");
printf("%d,%s,%s,%d\n",(*p1).num,(*p1).name,(*p1).kind,(*p1).socer);
//如果相同,输出课程信息
n++;}
p1=p1->next;}
if(n==0)
printf("无结果\n");
}
void choose(struct student*head) //选课函数
{
struct student*p1;
char k[20];
float s=0; //s为所选课程的学分总数,K为所选课程
的课程编号
if(head!=NULL)
{p1=head;
while(s<60) //判断选课是否结束
{
p1=head;
printf("请输入选择课程的课程编号:");
gets(k);
while(p1!=NULL) //当遍历一遍链表之后,循环结束
{
if(strcmp(k,p1->kind)==0) //当找到对应的课程编号后,输出课
程信息(需要修改)
{s=s+(float)p1->socer;
printf("学号 姓名 科目 学分\n");
printf("%d,%s,%s,%d\n",(*p1).num,(*p1).name,(*p1).kind,(*p1).socer);
printf("选课成功!\n");
break;}
else
p1=p1->next;
if(p1==NULL) //链表走到最后,则没有找到相应课程
printf("没有这门课程\n");
}
}
printf("学分达到要求\n");
}
}
/*void del(struct student*head) //删除信息(这个还只做到一半)
{
struct student*p1;
int k;
printf("输入需要删除信息的学生学号\n");
scanf("%d"&k);*/
void main()
{ struct student*head;
FILE*fp;
int k;
fp=fopen("课程list.txt","a+");
loop:mune(); //goto循环的开始位置
printf("请输入你的操作:\n");
scanf("%d",&k);
if(k!=0)
{switch(k) //利用switch语句实现菜单式工作
{ case 1:head=scan(fp);break;
case 2:print(head);break;
case 3:search_num(head);break;
case 4:choose(head);break;
default:printf("操作不存在");}
goto loop;} //利用goto语句实现循环
}