C语言程序设计报告 学生选修课系统.docx
C语言程序设计报告 学生选修课系统 C 语 言 程 序 设 计 学校: 学院: 班级序号: 学号: 姓名: 指导老师: 1 C语言程序设计报告 一、C语言课程设计的目的: 高级语言课程设计是学习完高级语言程序设计课程后进行的一次全面的综合性上机实验。其目的在于为同学提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼同学的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。 二、题目 学生选修课程系统设计 假定有n门课程,每门课程有课程编号、课程名称、课程性质、总学时、授课学时、实验或商机学时、血粉、开课学期等信息,学生可按要求自由选课。 1、要求: 试设计一个选修课程系统,使之能提供以下功能: 系统以菜单方式工作。 课程信息和学生选课信息输入功能输入。 课程信息浏览功能输出。 查询功能算法。 按学分查询。 某门课程学生选修情况。 2、分析: 由于题目要求将学生的选课信息用结构体形式输入,并写入文件中,所以应提供文件的输入输出等操作:在过程中需有浏览、插入、修改、查找、删除学生选课信息等操作,顾应分别建立个功能模块;另外还应提供键盘式选择菜单实现程序运行。 3、总体设计: 根据题目要求,可以将系统分为六个模块: 1) 系统以菜单方式工作模块; 2) 课程信息与学生选课信息录入功能模块; 3) 课程信息浏览功能模块; 4) 查询模块; 5) 按学分查询模块; 6) 某些课程学生选修情况模块。 2 工资信息管理系统 系统课程课程查按以菜信息信息询学单方与学浏览模分式工生选功能块 查作模课信模块 询块 息录模 入功块 能模块 4详细设计: #include <stdio.h> #include <stdlib.h> 主流程图: #include <string.h> typedef struct subjects 开始 int num; 显示一系列功能选择 char name20; char kind10; int stime; N int ttime; 判断 int etime; int score; int term; struct subjects *next; 结束 SUB; SUB *create_form SUB *head,*tail,*p; int num,stime,ttime; int etime,score,term; char name20,kind10; int size=sizeof(SUB); head=tail=NULL; 某些课程学生选修情况模块 3 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 *head) 开始 SUB *p; FILE *fp; 输出 fp=fopen("subjects.txt","w"); 写入文件并储存 输入 结束 4 fprintf(fp,"课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学分 开课学期n"); for(p=head;p;p=p->next) fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7dn",p->num,p->name,p->kind,p->stime,p->ttime,p->etime,p->score,p->term); fclose(fp); void savefileadd(SUB *head) SUB *p; FILE *fp; fp=fopen("subjectsadd.txt","w"); fprintf(fp,"课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学分 开课学期n"); for(p=head;p;p=p->next) fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7dn",p->num,p->name,p->kind,p->stime,p->ttime,p->etime,p->score,p->term); fclose(fp); void savefiledel(SUB *head) SUB *p; FILE *fp; fp=fopen("subjectsdel.txt","w"); fprintf(fp,"课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学分 开课学期n"); for(p=head;p;p=p->next) fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7dn",p->num,p->name,p->kind,p->stime,p->ttime,p->etime,p->score,p->term); fclose(fp); 5 void prin(SUB *head) SUB *ptr; if(head=NULL) printf("没有此门课程记录!n"); return; printf("课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期n"); for(ptr=head;ptr;ptr=ptr->next) printf("%5d%12s%9s%9d%9d%11d%11d%7dn",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term); void search(SUB *head) 开始 int a,num; 打开文件查看学生选课信息 int t=1; char type10; char ch='a',ch1; 1 判断查询方法 SUB *ptr; 按课程性质输入 结束 while(ch!=' ') printf("若要按课程性质查找请输入1,若要按学分查找请输入2:n"); scanf("%d",&a); switch(a) case 1:printf("请输入要查找的课程的性质:n"); scanf("%s",type); printf("课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期n"); for(ptr=head;ptr;ptr=ptr->next) if(strcmp(type,ptr->kind)=0) 6 2 按学分查 printf("%5d%12s%9s%9d%9d%11d%11d%7dn",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term); t=0; if(t) printf("未找到!n"); t=1; break; case 2:printf("输入要查找的课程的学分n"); scanf("%d",&num); printf("课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期n"); for(ptr=head;ptr;ptr=ptr->next) if(ptr->score=num) printf("%5d%12s%9s%9d%9d%11d%11d%7dn",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term); t=0; if(t) printf("未找到!n"); t=1; printf("继续查找请按回车键,结束请按空格键:n"); ch1=getchar; /将回车键赋给CH1,否则CASE里面最后输入的回车键会赋给CH,因此用CH1填补。 ch=getchar; SUB *insert(SUB *head) SUB *ptr,*ptr2,*subj; int size=sizeof(SUB); char ch='a',ch1; while(ch!=' ') subj=(SUB *)malloc(size); ptr=subj; printf("输入要插入的课程信息:n"); scanf("%d%s%s%d%d%d%d%d",&subj->num,subj->name,subj->kind,&subj->stime,&subj->ttime,&subj->etime,&subj->score,&subj->term); 7 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; printf("继续插入请按回车,结束请按空格:n"); ch1=getchar; /将回车键赋给CH1,否则subj->term输完后输入的回车键会赋给CH,因此用CH1填补。 ch=getchar; return head; SUB *del(SUB *head) SUB *p1,*p2; char ch='a',ch1; int num; while(ch!=' ') printf("输入想要删除的课程编号:n"); scanf("%d",&num); if(head->num=num) p2=head; head=head->next; free(p2); if(head=NULL) return NULL; p1=head; p2=head->next; 8 while(p2) if(p2->num=num) p1->next=p2->next; free(p2); else p1=p2; p2=p1->next; printf("继续删除请按回车,结束请按空格:n"); ch1=getchar; /将回车键赋给CH1,否则num输完后再输入的回车键会赋给CH,因此用CH1填补。 ch=getchar; 开始 return head; 输入、选课 void choose(SUB *head) 判断是否是要选的课程 选定、输出 SUB *p,*q; 结束 int a5; int num,total=0,i=0,j; printf("输入要选修的课程的编号,编号之间以空格分开,输完后以0结束n"); scanf("%d",&num); while(num!=0) for(p=head;p;p=p->next) if(p->num=num) total=total+p->score; ai=num; i+; scanf("%d",&num); if(total<60) printf("选修总学分未达到60,选修失败!n"); 9 N else printf("选修成功!n"); printf("您选修的课程为:n"); for(j=0;j<i;j+) for(q=head;q;q=q->next) if(q->num=aj) printf("%s ",q->name); printf("n"); printf("*n"); printf("*n"); printf("*n"); printf("*n"); void main SUB *head=create_form; savefile(head); prin(head); search(head); head=insert(head);/注意此处的必要性函数insert的的返回值重新赋给head! savefileadd(head); printf("修改后的信息为:n"); prin(head); head=del(head); /注意此处的必要性,数del的的返回值重新赋给head! savefiledel(head); printf("修改后的课程信息为:n"); prin(head); choose(head); 10 运行结果: 输入选修课程信息: 1 maths bx 15 14 0 25 1 2 Entg bx 15 14 0 25 1 3 hh xx 10 8 2 15 1 4 bb xx 25 14 0 35 1 0 gg xx 12 10 0 10 1 课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期 1 maths bx 15 14 0 25 1 2 Entg bx 15 14 0 25 1 3 hh xx 10 8 2 15 1 4 bb xx 25 14 0 35 1 若要按课程性质查找请输入1,若要按学分查找请输入2: 1 请输入要查找的课程的性质: bx 课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期 1 maths bx 15 14 0 25 1 2 Entg bx 15 14 0 25 1 继续查找请按回车键,结束请按空格键: 若要按课程性质查找请输入1,若要按学分查找请输入2: 2 输入要查找的课程的学分 15 课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期 3 hh xx 10 8 2 15 1 继续查找请按回车键,结束请按空格键: 课程设计体会: 通过学习和练习C程序的设计基础,学习到了很多关于C的知识。在这次学习过程中,毫无疑问的遇到了很多困惑、疑问,难免心情沮丧,失去耐心,信心受挫,但同学的帮助,老师的解惑和自己的坚持。终于做了出来。看着这一页页的程序,我感受到了成功的喜悦。用一句话来形容一下这几天就是:苦并快乐着。 11