#include#define LEN sizeof(struct course)
#define FORM "%d %s %s %d %d %d %d %d"
#define FORM1 "%5d%20s%20s%5d%5d%5d%5d%5d\n"
#define INPUT &p1->num,p1->name,p1->kind,&p1->all_time,&p1->class_time,&p1->experiment_time,&p1->grade,&p1->term
#define OUTPUT p1->num,p1->name,p1->kind,p1->all_time,p1->class_time,p1->experiment_time,p1->grade,p1->term
struct course
{int num;
char name[20];
char kind[10];
int all_time;
int class_time;
int experiment_time;
int grade;
int term;
//int flag;
struct course *next;};
void mune() //菜单函数
{
printf("************************************\n");
printf(" 1.录入信息 \n");
printf(" 2.浏览信息 \n");
printf(" 3.查询课程(按学分)\n");
printf(" 4.查询课程(按性质)\n");
printf(" 5.按选修课程查询\n");
printf(" 6.选课 \n");
printf(" 0.退出 \n");
printf("*************************************\n");
}
struct course* scan(FILE*fp) //输入课程信息
{
struct course*head; //链表头指针
struct course*p1,*p2; //指示指针
int n=0;
p1=p2=(struct course*)malloc(LEN); //开辟内存空间
printf("课程编号 课程名称 课程性质 课程总学时 教学用时 实验用时 学分 开课学期\n");
printf("请输入数据:");
scanf(FORM,INPUT); //输入数据
fprintf(fp,FORM1,OUTPUT);
head=NULL;
while(p1->num!=0) //链表结束的判断条件
{n=n+1;
if(n==1)
head=p1; //当在第一个结点时,头指针等于第一个结点的首地址
else
p2->next=p1;
p2=p1;
p1=(struct course*)malloc(LEN); //继续开辟内存空间
printf("请输入数据:");
scanf("%ld",&p1->num); //输入课程号
if(p1->num!=0) //判断课程号是否为0,如果为0,程序结束
{scanf("%s %s %d %d %d %d %d",p1->name,p1->kind,&p1->all_time,&p1->class_time,&p1->experiment_time,&p1->grade,&p1->term);
//p1->flag=0;
fprintf(fp,FORM1,OUTPUT);}
}
p2->next=NULL; //最后一个结点的值为空
fclose(fp); //关闭文件
return(head); //返回头指针
}
void print(struct course*head) //将输入的内容显示在屏幕上
{
struct course*p1;
if(head!=NULL) //如果头指针为空,则程序结束
p1=head;
else
goto end;
printf("课程编号 课程名称 课程性质 课程总学时 教学用时 实验用时 学分 开课学期\n");
do
{printf(FORM1,OUTPUT); //输出内容
p1=p1->next; //指针指向下一个结点
}while(p1!=NULL);
end:;
}
void search_grade(struct course*head) //按学分查询课程
{
struct course*p1;
int k,n;
n=0;
p1=head;
printf("请输入查询课程的学分:\n");
scanf("%d",&k);
while(p1!=NULL) //根据链表里面的内容输出
{if(k==p1->grade)
{printf("课程编号 课程名称 课程性质 课程总学时 教学用时 实验用时 学分 开课学期\n");
printf(FORM1,OUTPUT);
n++;}
p1=p1->next;}
if(n==0)
printf("无结果\n"); //如果没有课程,则输出无结果
}
void search_kind(struct course*head)//按课程性质查询
{
char a[10];
int n=0;
struct course*p1;
p1=head;
gets(a);
while(p1!=NULL)
{if(strcmp(a,p1->kind)==0) //用strcmp函数进行字符串的比较
{printf("课程编号 课程名称 课程性质 课程总学时 教学用时 实验用时 学分 开课学期\n");
printf(FORM1,OUTPUT); //如果相同,输出课程信息
n++;}
p1=p1->next;}
if(n==0)
printf("无结果\n");
}
void search_else(struct course*head) //查询所有选修课程
{
struct course*p1;
int n=0;
p1=head;
while(p1!=NULL)
{if(strcmp(p1->kind,"xuanxiu")==0)
{printf("课程编号 课程名称 课程性质 课程总学时 教学用时 实验用时 学分 开课学期\n");
printf(FORM1,OUTPUT);
n++;}
p1=p1->next;
}
if(n==0)
printf("没有选修课程\n");
}
void choose(struct course*head) //选课函数
{
struct course*p1;
int k,s=0; //s为所选课程的学分总数,K为所选课程的课程编号
if(head!=NULL)
{p1=head;
while(s<60) //判断选课是否结束
{
p1=head;
printf("请输入选择课程的课程编号:");
scanf("%d",&k);
while(p1!=NULL) //当遍历一遍链表之后,循环结束
{
if(k==p1->num) //当找到对应的课程编号后,输出课程信息
{s=s+p1->grade;
printf("课程编号 课程名称 课程性质 课程总学时 教学用时 实验用时 学分 开课学期\n");
printf(FORM1,OUTPUT);
printf("选课成功!\n");
break;}
else
p1=p1->next;
if(p1==NULL) //链表走到最后,则没有找到相应课程
printf("没有这门课程\n");
}
}
printf("学分达到要求\n");
}
}
void main()
{ struct course*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_grade(head);break;
case 4:search_kind(head);break;
case 5:search_else(head);break;
case 6:choose(head);break;
default:printf("操作不存在");}
goto loop;} //利用goto语句实现循环
}