版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 学生选课系统1 需求分析1.1任务要求 制做学生选课系统,共包括课程信息和学生信息两部分。课程信息包括:课程编码、课程名称、适用专业、课程类型(必修、限选、必选、实践、学习)、学分、学时、主讲教师等。学生信息管理,学生选课管理(学生选课学分总数有一定范围),学生可以对课程进行查询、浏览,选完课后可以退选、重选,并可以按学号、姓名进行查询和统计。要求:1.源文件采用多文件的工程结构。 2.数据储存采用文件形式。 3.标准的c输入输出。 4.功能完善,适当的注释。 5.关于文件的内容要自学。1.2系统功能需求分析1.为存储课程信息,需要定义一个结构体类型,成员包括课程编码、课程名称、适用专业、课
2、程类型、学分、学时、主讲教师,所选人数等等,并建立链表,定义该结构体类型的指针,用于指向各节点;2.为存储学生信息,需要定义一个结构体类型,成员包括学生编码、学生姓名、所选课程编码、所选课程学分和等等,并建立链表,定义该结构体类型的指针,用于指向各节点;3.对于课程信息和学生信息,可以选择从键盘输入也可选择从文件中打开原来存盘的信息,并对他们分别建立添加、删除、浏览、查询等功能的子函数,完成相应的功能,对程序实现模块化。这其中要用到对链表的删除、插入、增加等知识。删除包括课程删除和学生信息删除,删除时用一结构体指针指向链表的第一个结点,检查该节点的值是否等于输入的要删除的课程编号或学生学号,若
3、相等就删除,不相等则后移指针,直至表尾。插入时也要先找到相应结点,再添加。查询功能要设置按照学生姓名、学生编号等多种方式。4.学生选课是要先输入自己的学号,如果在已经输入的学生信息中找不到此学号,则提示需要先输入自己的信息。如找到了自己的学号,则可以进行选课。在选课之前要先对所有的课程信息进行浏览。选课有一定的学分限制,超过相应的学分(这里设置的是10个学分),系统就会显示可以选满的信息。此系统还可以实现删除所选课程的功能,设计思路与选课功能相似。5为实现存储功能,需用到文件的相关函数,打开文件,将添加、修改或删除的信息存入磁盘中。6.实现易于使用者理解和使用的友好界面。2 概要设计2.1系统
4、总体设计框架 对程序进行模块化可以使整个程序清晰明了。对课程信息和学生信息建立从文件中输入、从键盘中输入、添加、删除、查询和浏览的功能,其各个子函数中运用链表储存数据。选课管理建立学生选课、推选、查询、浏览的功能,其各个子函数中运用链表储存数据。从主函数开始执行,依次调用各个子函数,并运用文件的相关知识将信息进行存盘。2.2系统功能模块图学生选课系统课程信息从文件录入从键盘录入增加删除学生信息从文件录入从键盘录入增加删除选 课退 课信息存储3 详细设计3.1功能模块设计思路主要功能模块的算法设计思路如下:1、 课程信息录入函数(void load()从键盘录入(void zhang( ))i
5、定义指向结构体变量的指针;ii 从头指针指向的结构体开始依次录入结构体中所包含的各个成员;iii直到输入的结构体成员的编号为0,录入结束从文件录入(void zhang1( ))i 分别定义指向结构体变量的指针和指向文件的指针;ii 输入文件的路径,打开文件,若没有找到则有提示;iii 将文件中的信息依次读出,最后结构体的指针为2、 课程信息管理(void managementc())增加课程信息(void insert(struct course *incourse))i 定义指向结构体变量的指针;ii 输入要增加的课程编号,从头指针指向的结构体依次向后,直到链表的最后;iii 输入课程结构
6、体各个成员的信息,使最后一个结构体指针值为删除课程信息(void delc(int num1))i 定义指向结构体变量的指针;ii 输入要增加的课程编号,从头指针指向的结构体依次向后,直到找到课程编号为输入值的那个结构体;iii 将其删除,其前一个的结构体指针指向其后一个结构体3、 学生信息录入函数(void input()从键盘录入(void putin( ))i 定义指向结构体变量的指针;ii 从头指针指向的结构体开始依次录入结构体中所包含的各个成员;iii 直到输入的结构体成员的编号为0,录入结束从文件录入(void putin2( ))i 分别定义指向结构体变量的指针和指向文件的指针;
7、ii 输入文件的路径,打开文件,若没有找到则有提示;iii 将文件中的信息依次读出,最后结构体的指针为4、 学生信息管理(void managements())增加学生信息(void inserts(struct student * incouse))i 定义指向结构体变量的指针;ii 输入要增加的学生编号,从头指针指向的结构体依次向后,直到链表的最后;iii 输入学生结构体各个成员的信息,使最后一个结构体指针值为删除学生信息(void dels(int num2))i 定义指向结构体变量的指针;ii 输入要增加的学生编号,从头指针指向的结构体依次向后,直到找到学生编号为输入值的那个结构体;i
8、ii 将其删除,其前一个的结构体指针指向其后一个结构体5、 学生选课管理(void elective())学生选课(void elect())i 分别定义指向课程和学生结构体变量的指针;ii 输入要选课的学生的编号,从头指针指向的结构体依次向后,直到找到学生编号为输入值的那个结构体,如不存在则显示要录入学生信息;iii 输入要选课程的编号,从头指针指向的结构体依次向后,直到找到课程编号为输入值的那个结构体;iv 在学生结构体对应的所选课程编号中更改信息,所选学分中加上相应分值,课程结构体所选人数中相应加一学生退课(void back())i 分别定义指向课程和学生结构体变量的指针;ii 输入要
9、退课的学生的编号,从头指针指向的结构体依次向后,直到找到学生编号为输入值的那个结构体,如不存在则显示要录入学生信息;iii 输入要退课程的编号,从头指针指向的结构体依次向后,直到找到课程编号为输入值的那个结构体;iv 在学生结构体对应的所选课程编号中更改信息,所选学分中减去相应分值,课程结构体所选人数中相应减一6、 信息浏览和保存(void into())课程信息浏览(void listc())i 定义指向结构体变量的指针;ii从头指针指向的结构体依次向后,将课程结构体各成员的信息一次输出,直到最后一个结构体指针的值为null学生信息浏览(void lists())i 定义指向结构体变量的指针
10、;ii从头指针指向的结构体依次向后,将学生结构体各成员的信息一次输出,直到最后一个结构体指针的值为null课程信息保存(void intoc())i 定义指向课程结构体变量的指针和指向文件的指针;ii 输入保存路径,如果没有保存则有显示;iii 将课程信息写入文件中;iv 将课程信息进行保存,关闭文件学生信息保存(void intos())i 定义指向学生结构体变量的指针和指向文件的指针;ii 输入保存路径,如果没有保存则有显示;iii 将学生信息写入文件中;iv 将学生信息进行保存,关闭文件7、 学生信息查询(void store())按学生姓名查询(void search2())i定义指向
11、结构体变量的指针;ii 输入要查询的学生的姓名,从头指针指向的结构体依次向后,直到找到学生姓名为输入值的那个结构体;iii 将该学生结构体成员的各信息依次输出按学生编号查询(void search1())i定义指向结构体变量的指针;ii 输入要查询的学生的编号,从头指针指向的结构体依次向后,直到找到学生编号为输入值的那个结构体;iii 将该学生结构体成员的各信息依次输出3 调试分析3.1错误显示及分析 a.编译时出现错误,回看程序发现漏掉符号等细节错误。 b.运行时,界面格式与最初的设想不一致,通过重新编排,符号的增减及一进,最终达到理想界面。 c.运行时,输入一个信息后,第二次输入数据时很难
12、将输入光标移到想要的位子,通过按键的摸索,最终了解了输入要领。 d.对输入的信息查询时没有记录,发现文件读取错误。3.2修改完善1、开始程序执行时,各项大的功能每一次只能执行一个就自动跳出,为了使程序保持连续性和更好的实用性,使用了start,goto start,break,sysyem(“clx”)等实现了逐渐免于更功能的循环。2、对于学生信息中已选课程的存储,一直不知如何存储。后用实型数组,并进行循环,依次读入课程的编号,将课程编号进行存储。4 用户使用说明4.1适用范围 适用于管理者将课程信息和学生信息录入到系统,并可以将课程信息和学生信息进行保存,日后如果有需要在对课程和学生信息进行
13、增加可删除。同时也适用于学生在登录自己的学号后,浏览课程信息选课,进行选课和退课操作。4.2使用方法 首先管理者将现有的课程信息(包括课程编号、课程名称、使用专业、课程类型、学时、学分、教师、已选人数(初始为零)和学生信息(包括学生学号、姓名、已选学时、已选课程编号)录入到系统,并将其进行文件保存,以便以后使用。若要修改(增加和删除)课程信息和学生信息,需要先从文件中录入已存信息,再输入编号对其查找并进行相关操作。学生选课需要先输入自己的学号,若没有此学号的学生信息,需先录入此人信息在进行选课和退课。在选课和退课前,可以先浏览课程信息,并记住要选课程的编号,以便选课时需要。此外还可以学号和姓名
14、对学生信息进行查询。5 测试结果55.1运行结果 主界面 录入课程信息 课程信息浏览 课程信息存储 录入学生信息 学生信息浏览 学生信息存储 学生选课 选课后学生信息浏览 选课后课程信息浏览 课程信息管理 学生信息管理 学生信息查找 退出系统7 附录7.1课设小结通过这次课程设计,我对c语言有了更深刻的了解,增强了程序的编写能力,巩固了专业知识,对程序的模块化观念也又模糊逐渐变的清晰了。在程序的运行与调试过程中出现了很多错误,通过反复地复习课本上的相关知识,不停地修改与调试,我终于完成了这段程序。在调试过程中,我认识到了c语言的灵活性与严谨性,同一个功能可以由不同的语句来实现,但编写程序时要特
15、别注意细节方面的问题,因为一个小小的疏忽就能导致整个程序不能运行。当然我也认识到了自己的薄弱之处,如对链表相关知识的欠缺,文件运用的不熟练,在以后的学习中我要集中精力、端正态度,争取把知识学得更扎实、更全面。7.2 存在不足1、系统不够强大,有点脆弱。2、当输入信息(课程信息,学生信息)后,不能自动保存,需手动保存。对于以上不足,以后将进行改进,以确保达到更好。7.2详细代码#include#include#includeint n1,n2;struct studentint num2; char name220; int nelenum50; /所选课程编号 int nelen; /所选课程
16、学分和 struct student * next;struct courseint num1; /课程编号char name120; char major20;char type20;int credit;int period;char teacher20;int people; /选此门课程的人数struct course *next; /结构体指针;struct course * head1;struct student * head2;void zhang() /从键盘录入课程信息struct course *p1,*p2; n1=0; p1=p2=(struct course *)m
17、alloc(sizeof(struct course); printf(课程编号t课程名称t主修t课程性质t学分t课时t教师n); scanf(%d%s%s%s%d%d%s,&p1-num1,p1-name1,p1-major,p1-type,&p1-credit,&p1-period,p1-teacher); p1-people=0; head1=null; while(p1-num1!=0)n1=n1+1; if(n1=1)head1=p1; else p2-next=p1; p2=p1; p1=(struct course * )malloc(sizeof(struct course);
18、 scanf(%d%s%s%s%d%d%s,&p1-num1,p1-name1,p1-major,p1-type,&p1-credit,&p1-period,p1-teacher); p1-people=0; p2-next=null;void zhang1() /从文件录入课程信息file * fp; char filepath20; struct course *p1,*p2; n1=0; printf(请输入您要读取的路径:); getchar(); gets(filepath); if(fp=fopen(filepath,r)=null)printf(找不到 %s 文件!n,filep
19、ath); exit(0); p1=p2=(struct course*)malloc(sizeof(struct course); fscanf(fp,%d%s%s%s%d%d%s%d,&p1-num1,p1-name1,p1-major,p1-type,&p1-credit,&p1-period,p1-teacher,&p1-people); while(!feof(fp)n1=n1+1; if(n1=1)head1=p1; else p2-next=p1; p2=p1; p1=(struct course * )malloc(sizeof(struct course); fscanf(f
20、p,%d%s%s%s%d%d%s%d,&p1-num1,p1-name1,p1-major,p1-type,&p1-credit,&p1-period,p1-teacher,&p1-people); p2-next=null;void load() /录入课程信息函数int i;printf(ttt录入课程信息n);printf(n1.从键盘录入);printf(n2.从文件录入);printf(n3.返回主菜单n);printf(请选择1-3:);scanf(%d,&i);switch(i)case 1: zhang(); break; case 2:zhang1();break; case
21、 3:break; void insert(struct course *incourse) /增加课程信息struct course *p0,*p1,*p2; p1=head1; p0=incourse; if(head1=null)head1=p0; p0-next=null; elsewhile(p0-num1p1-num1) & (p1-next!=null)p2=p1; p1=p1-next; if(p0-num1num1)if(head1=p1)head1=p0; elsep2-next=p0; p0-next=p1; elsep1-next=p0; p0-next=null; n
22、1=n1+1;void delc(int num1) /删除课程信息struct course *p1,*p2; if(head1=null)printf(n无法删除!n); goto end; p1=head1; while(num1!=p1-num1 & p1-next!=null) p2=p1; p1=p1-next; if(num1=p1-num1)if(p1=head1) head1=p1-next; else p2-next=p1-next; printf(已删除n); n1=n1-1; else printf(没有此课程n); end:;void managementc() /课
23、程信息管理函数struct course * p1; int i,num1; printf(ttt课程信息管理n); printf(1.添加课程n); printf(2.删除课程n); printf(3.返回n); printf(请输入1-3:n); scanf(%d,&i); switch(i) case 1:p1=(struct course *)malloc(sizeof(struct course);printf(课程编号t课程名称t主修t课程性质t学分t课时t教师n); scanf(%d%s%s%s%d%d%s,&p1-num1,p1-name1,p1-major,p1-type,&
24、p1-credit,&p1-period,p1-teacher);p1-people=0;insert(p1); break;case 2:printf(请输入您要删除的课程编号:n);scanf(%d,&num1);delc(num1); break;case 3:break;void putin(void) /从键盘录入学生信息 int i;struct student *p1,*p2;n2=0;p1=p2=(struct student *)malloc(sizeof(struct student);printf(学号t姓名n);scanf(%d%s,&p1-num2,p1-name2)
25、;p1-nelen=0;for(i=0;inelenumi=0;head2=null;while(p1-num2!=0)n2=n2+1;if(n2=1)head2=p1;else p2-next=p1;p2=p1;p1=(struct student * )malloc(sizeof(struct student);scanf(%d%s,&p1-num2,p1-name2);p1-nelen=0;for(i=0;inelenumi=0;p2-next=null;void putin2() /从文件录入学生信息int i=0;file * fp;char filepath20;struct st
26、udent *p1,*p2;n2=0;printf(请输入您要读取的路径:);getchar();gets(filepath);if(fp=fopen(filepath,rt)=null)printf(找不到 %s 文件!n,filepath);exit(0);p1=p2=(struct student*)malloc(sizeof(struct student);fread(p1,sizeof(struct student),1,fp);head2=null;while(!feof(fp)i=0;n2=n2+1;if(n2=1)head2=p1;else p2-next=p1;p2=p1;p
27、1=(struct student * )malloc(sizeof(struct student);fread(p1,sizeof(struct student),1,fp);p2-next=null;void input() /录入学生信息函数 int i;printf(ttt录入学生信息n);printf(n1.从键盘录入n);printf(2.从文件录入n);printf(3.返回主菜单n);printf(请输入1-3:n);scanf(%d,&i);switch(i)case 1:putin(); break;case 2:putin2(); break;case 3:break;v
28、oid inserts(struct student * incouse) /增加学生信息struct student *p0,*p1,*p2;p1=head2;p0=incouse;if(head2=null)head2=p0;p0-next=null;elsewhile(p0-num2p1-num2) & (p1-next!=null)p2=p1;p1=p1-next;if(p0-num2 num2)if(head2=p1) head2=p0;else p2-next=p0;p0-next=p1;elsep1-next=p0;p0-next=null;n2=n2+1;void dels(i
29、nt num2) /删除学生信息struct student *p1,*p2;if(head2=null)printf(n无法删除n);goto end;p1=head2;while(num2!=p1-num2 & p1-next!=null)p2=p1;p1=p1-next;if(num2=p1-num2)if(p1=head2) head2=p1-next;else p2-next=p1-next;printf(已删除n);n2=n2-1;else printf(没有此学生编号n);end:;void managements() /学生信息管理函数struct student * p1;i
30、nt i,num2;printf(ttt学生信息管理n);printf(1.添加学生信息n);printf(2.删除学生信息n);printf(3.返回主菜单n);printf(请选择1-3:n);scanf(%d,&i);switch(i)case 1:p1=(struct student *)malloc(sizeof(struct student);p1-nelen=0;p1-nelenum0=0;printf(numtnamen);scanf(%d%s,&p1-num2,p1-name2);inserts(p1);break;case 2:printf(请输入您要删除的学生编号:n);
31、scanf(%d,&num2);dels(num2); break;case 3:break;void elect() /学生选课struct student * s;struct course * p;int a,i,b;printf(请输入您的学号:n);scanf(%d,&a);s=head2;while(s-num2)!=a&s-next!=null) s=s-next;if(s-num2!=a)printf(您的信息不存在,请重新输入:n);goto end;if(s-nelen)10)printf(您的学分已满);goto end;printf(请输入您要选修的课程编号n);sca
32、nf(%d,&b);for(i=0;(s-nelenumi)=0;i+);s-nelenumi=b;p=head1;while(p-num1)!=b) p=p-next;for(i=0;(s-nelenumi)!=0;i+);s-nelenumi=b;(p-people)+;(s-nelen)=(s-nelen)+(p-credit);(p-people)+;end:;void back() /学生退课struct student * p;struct course * p1;int b,i,j,a;printf(请输入您的学号:n);scanf(%d,&a);p=head2;while(p-
33、num2!=a&p!=null) p=p-next;if(p=null)printf(您的信息不存在:n);elseprintf(请输入您要退选的课程:n);scanf(%d,&b);p1=head1;while(p1-num1!=b) p1=p1-next;for(i=0;p-nelenumi!=b;i+);for(j=i;p-nelenumj!=0;j+)p-nelenumj=p-nelenumj+1;p-nelenum-j=0;(p-nelen)=(p-nelen)-(p1-credit);(p1-people)-;printf(succeed!n);void elective() /学
34、生选课信息管理int i;printf(ttt学生选课信息管理n);printf(1.选课n);printf(2.退课n);printf(3.返回主菜单n);printf(请输入1-3:n);scanf(%d,&i);switch(i)case 1:elect();break;case 2:back();break;case 3:break;void listc() /浏览课程信息struct course * p;p=head1;printf(课程编号 课程名称 主修 课程性质 学分 课时 教师 选课人数n);while(p!=null)printf(%6d%13s%13s%10s%7d%7
35、d%12s%5dn,p-num1,p-name1,p-major,p-type,p-credit,p-period,p-teacher,p-people);p=p-next;void lists() /浏览学生信息struct student * p;int a;p=head2;printf(学生编号 学生姓名 所选课程编号 所选课程学分n);while(p!=null)printf(%6d%13s,p-num2,p-name2);printf(%6d,p-nelen);for(a=0;p-nelenuma!=0&anelenuma);printf(n);p=p-next;void intoc
36、() /存储课程信息file * fp;struct course * p;char filepath30;printf(输入路径:);getchar();gets(filepath);if(fp=fopen(filepath,w)=null)printf(无法储存!);exit(0);p=head1;while(p!=null)fprintf(fp,%d%s%s%s%d%d%s%dn,p-num1,p-name1,p-major,p-type,p-credit,p-period,p-teacher,p-people);p=p-next;fclose(fp);printf(已储存入%s文件!n
37、,filepath);void intos() /存储学生信息file * fp;struct student * p;char filepath30;printf(请输入路径:);getchar();gets(filepath);if(fp=fopen(filepath,wt)=null)printf(n 无法储存!);exit(0);p=head2;while(p!=null)fwrite(p,sizeof(struct student),1,fp);p=p-next;fclose(fp);printf(已储存入 %s文件!n,filepath);void into() /信息存储函数in
38、t i;printf(ttt信息存储n);printf(1.课程信息存储n);printf(2.学生信息存储tn);printf(3.返回主菜单n);printf(请输入1-3n);scanf(%d,&i);switch(i)case(1):intoc();break;case(2):intos();break;case(3):break;void store() /信息存储浏览函数int i;printf(tt信息存储和浏览n);printf(1.课程信息浏览n);printf(2.学生信息浏览n);printf(3.信息存储n);printf(4.返回主菜单n);printf(请输入1-4
39、:n);scanf(%d,&i);switch(i)case(1):listc();break;case(2):lists();break;case(3):into();break;case(4):break;void search1() /按学生编号查找学生信息int a,b;struct student * p;printf(请输入学生编号);scanf(%d,&a);p=head2;printf(学号 学生姓名 所选课程编号 所选课程学分n);while(p!=null)if(p-num2=a)printf(%6d%13s ,p-num2,p-name2);for(b=0;p-nelenumb!=0&bnel
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 运输《高级经济实务》近年考试题库(含答案解析)
- 吊装管桩合同范例
- 综治宣传月现场会活动方案样本(2篇)
- 二零二四年度业务外包合同:EEE公司外包业务给FFF公司
- 铝材回收再利用合同2024年度
- 2024企业承包合同个人承包经营合同
- 二零二四年度品牌授权使用合同(商标许可)
- 二零二四年度商场临时摊位租赁合同
- 充电桩安装工程风险管理与保险服务合同
- 2024版加工合作协议:面粉加工厂原材料订购合同
- 课堂教学中的师生互动存在的问题及对策研究
- 部编版(统编)小学语文三年级上册期末试卷(含答题卡)
- 新教科版三年级上册科学 1.2《水沸腾了》 教案
- 潮州市乡镇信息技术教育的现状和对策
- 一体化净水设备安装、调试、运行操维护说明
- 推荐精选中国多发性肌炎专家共识
- (完整版)初中尺规作图典型例题归纳总结
- 行政执法程序流程图
- 士林SC系列变频器使用说明书
- 菜籽油生产加工建设项目可行性研究报告
- 教职工健康体检结果汇总分析报告
评论
0/150
提交评论