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;
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:");
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-2.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-2.txt'中\n");
}
system("pause"); //暂停,没这个语句点开生成的.exe文件
}
void prin1() //浏览学生所有选修课程
{
SUB *ptr;
FILE *fp; //声明fp是指针,用来指向FILE类型的对象,fp是指向文件结构体的指针变量
fp=fopen("3-2.txt","r");
if(fp==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");
}