#include <stdio.h>
#include <string.h>
#include<malloc.h>
#include <stdlib.h> //用于system语句的声明
void prin1(); //声明浏览学生所有选修课程函数
void choose(); //声明学生选课函数
typedef struct subjects //定义结构体叫作SUB,在后面就可以直接使用
{
int num; //课程编号
char name[30]; //课程名称
char kind[20]; //课程性质
int stime; //总学时
int ttime; //授课学时
int etime; //实验或上机学时
int score; //学分
int term; //开课学期
struct subjects *next;
}SUB;
SUB *head = NULL;
SUB *create_form() //创建链表
{
SUB *head,*tail,*p;
int num,stime,ttime;
int etime,score,term;
char name[20],kind[10];
int size = sizeof(SUB);
head = tail = NULL;
printf("输入选修课程信息:\n");
scanf("%d%s%s%d%d%d%d%d",&num,name,kind,&stime,&ttime,&etime,&score,&term);
while (num != 0)
{
p = (SUB *)malloc(size);
p -> num = num;
strcpy(p -> name,name);
strcpy(p -> kind,kind);
p -> stime = stime;
p -> ttime = ttime;
p -> etime = etime;
p -> score = score;
p -> term = term;
if (head == NULL)
head = p;
else
tail -> next = p;
tail = p;
scanf("%d%s%s%d%d%d%d%d",&num,name,kind,&stime,&ttime,&etime,&score,&term);
}
tail -> next = NULL;
return head;
}
void savefile() //保存管理员文件
{
SUB *p;
FILE *fp;
fp = fopen("2.txt","w");
if(fp == NULL)exit(0);
printf("课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学分 开课学期\n");
for(p = head;p;p = p -> next)
fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",p -> num,p -> name,p -> kind,p -> stime,p -> ttime,p -> etime,p -> score,p -> term);
fclose(fp);
printf("创建后的信息已放入'2.txt'文件中\n");
system("pause");
}
void savefile1() //保存学生文件
{
SUB *p;
FILE *fp; //声明fp是指针,用来指向FILE类型的对象,fp是指向文件结构体的指针变
fp = fopen("3.txt","w");
if(fp == NULL)exit(0);
for(p = head;p;p = p -> next)
fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",p -> num,p -> name,p -> kind,p -> stime,p -> ttime,p -> etime,p -> score,p -> term);
fclose(fp);
printf("创建后的信息已放入'3.txt'文件中\n");
system("pause");
}
void readfile() //阅读文件
{
void *myInsert(SUB*);
SUB *newSub; //新课程
int num,stime,ttime,etime;
int score,term;
char c,name[20],kind[10],fname[20];
FILE *fp; //声明fp是指针,用来指向FILE类型的对象,fp是指向文件结构体的指针变
fp = fopen("2.txt","r");
while(!feof(fp))
{
newSub = (SUB*)malloc(sizeof(SUB));
fscanf(fp,"%d%s%s%d%d%d%d%d\n",&newSub -> num,newSub -> name,newSub -> kind,&newSub -> stime,&newSub -> ttime,&newSub -> etime,&newSub -> score,&newSub -> term);
myInsert(newSub);
}
fclose(fp);
}
void prin() //浏览管理员所有课程
{
SUB *ptr;
head = NULL;
readfile();
if(head == NULL)
{
printf("\n\n\t*********NO RECORDS!************\n");
return;
}
printf("课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期\n");
for(ptr = head;ptr;ptr = ptr -> next)
{
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr -> num,ptr -> name,ptr -> kind,ptr -> stime,ptr -> ttime,ptr -> etime,ptr -> score,ptr -> term);
}
system("pause");
}
void prin1() //浏览学生所有选修课程
{
SUB *ptr;
FILE *fp; //声明fp是指针,用来指向FILE类型的对象,fp是指向文件结构体的指针变量
if((fp = fopen("3.txt","r")) == NULL)
{
printf("Cannot open file.\n");
choose();
}
printf("课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期\n");
while(!feof(fp))
{
ptr=(SUB*)malloc(sizeof(SUB));
fscanf(fp,"%d%s%s%d%d%d%d%d\n",&ptr -> num,ptr -> name,ptr -> kind,&ptr -> stime,&ptr -> ttime,&ptr -> etime,&ptr -> score,&ptr -> term);
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr -> num,ptr -> name,ptr -> kind,ptr -> stime,ptr -> ttime,ptr -> etime,ptr -> score,ptr -> term);
}
system("pause");
}
void *myInsert(SUB *subj) //链表插入操作
{
SUB *ptr,*ptr2;
ptr = subj;
if(head == NULL)
{
head = ptr;
head -> next = NULL;
}
else
{
for(ptr2 = head;ptr2;ptr2 = ptr2 -> next)
if(ptr2 -> next == NULL)
{
ptr2 -> next = subj;
subj -> next = NULL;
break;
}
}
return head;
}
void *insert()//插入课程信息
{
SUB *ptr,*subj; //定义结构体指针指向这个结构体SUB
int size=sizeof(SUB);
char ch,ch1;
while (ch != '0')
{
subj=(SUB *)malloc(size); //(分配类型 *)malloc(分配元素个数 *sizeof(分配类型))如果成功,则返回该空间首地址,该空间没有初始化,如果失败,则返回0
ptr=subj;
printf("输入要插入的课程信息:\n");
printf("\n\t\t请输入课程编号:");scanf("%d",&subj -> num);
printf("\n\t\t请输入课程名称:");scanf("%s",&subj -> name);
printf("\n\t\t请输入课程性质:");scanf("%s",&subj -> kind);
printf("\n\t\t请输入总学时:");scanf("%d",&subj -> stime);
printf("\n\t\t请输入授课学时:");scanf("%d",&subj -> ttime);
printf("\n\t\t请输入实践或上机学时:");scanf("%d",&subj -> etime);
printf("\n\t\t请输入学分:");scanf("%d",&subj -> score);
printf("\n\t\t请输入开课学期:");scanf("%d",&subj -> term);
myInsert(subj);
printf("\n添加完毕,新信息存入文件中\n");
printf("\n继续插入请按回车\n");
printf("\n结束添加课程按 0: [ ]\b\b");
ch1=getchar(); //将回车键赋给CH1,否则subj->term输完后输入的回车键会赋给CH,因此用CH1填补。
ch=getchar();
}
return head;
}
void *del() //删除课程
{
SUB *p1,*p2;
char ch,ch1;
int num;
while(ch!='0')
{
printf("输入想要删除的课程编号:[ ]\b\b\b\b\b");
scanf("%d",&num);
if(head->num==num)
{
p2=head;
head=head->next;
free(p2);
}
if(head==NULL)
return NULL;
p1=head;
p2=head->next;
while(p2)
{
if(p2->num==num)
{
p1->next=p2->next;
free(p2);
}
else
p1=p2;
p2=p1->next;
}
printf("\n继续删除请按回车\n");
printf("\n结束删除课程按 0: [ ]\b\b");
ch1=getchar(); //将回车键赋给CH1,否则num输完后再输入的回车键会赋给CH,因此用CH1填补。
ch=getchar();
printf("\n删除完毕,新信息存入文件中\n");
system("pause");
}
return head;
system("pause");
}
void choose()//选新课程--学生选课函数
{
SUB *p,*q;
int a[5];
int num,total=0,i=0,j; //total为总学分,i为num的数组单元
printf("输入要选修的课程的编号,编号之间以空格分开\n");
scanf("%d",&num);
printf("如果确认输入完要选修的课程的编号,请输入0: [ ]\b\b");
while(num!=0)
{
for(p=head;p;p=p->next)
if(p->num==num)
{
total=total+p->score;
a[i]=num; //数组a存num
i++;
}
scanf("%d",&num);
}
if(total<60)
{
printf("选修总学分为%d,未达到60,选修失败!\n",total);
system("pause");
}
else
{
FILE *fp; //声明fp是指针,用来指向FILE类型的对象,fp是指向文件结构体的指针变量
fp=fopen("3.txt","w"); //fprintf(fp,"课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期\n");
for(j=0;j<i;j++)
for(q=head;q;q=q->next)
if(q->num==a[j])
fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",q -> num,q -> name,q -> kind,q -> stime,q -> ttime,q -> etime,q -> score,q -> term);
fclose(fp); //关闭
printf("\t\t\n*****选修成功!****\n");
printf("\n您选修的课程总学分为%d,课程分别为:\n",total);
printf("\n课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期\n");
for(j=0;j<i;j++)
for(q=head;q;q=q->next)
if(q->num==a[j])
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",q -> num,q -> name,q -> kind,q -> stime,q -> ttime,q -> etime,q -> score,q -> term);
printf("\n以上信息全部保存在'3.txt'中\n");
}
system("pause"); //暂停,没这个语句点开生成的.exe文件
}
void search() //课程信息查询
{
int a