C语言选修课课程设计报告

更新时间:2023-09-16 21:35:01 阅读量: 高中教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

软件职业技术学院

2010年秋季学期

题 目:学生选课系统 专业班级:软件三班 姓 名: 杨威 学 号:10700322 指导教师:马威 成 绩:

2010 年 日

计算机应用基础课程设计

学生选修课课程设计报告

目录

一、设计目的 .......................................................................................................................................... 2 二、题目说明 .......................................................................................................................................... 3 三、数据结构设计 .................................................................................................................................. 4 四、程序分析 .......................................................................................................................................... 5 五、程序设计大纲 .................................................................................................................................. 6 六、模块设计 .......................................................................................................................................... 7 七、结果分析 ........................................................................................................................................ 16 八、遇到的问题和解决方法 ................................................................................................................ 18 九、课程设计心得 ................................................................................................................................ 19 十、参考文献 ........................................................................................................................................ 20 附录(源程序代码) ............................................................................................................................ 21

1

学生选修课课程设计报告

一、设计目的

当今时代是飞速发展的信息时代,在各行各业中离不开信息处理,这正是计算机被广泛应用于信息系统的环境。计算机的最到好处的于利用它能够进行信息管理,使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。

尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与信息管理系统的开发密切相关,系统的开发是系统管理的前提。本系统就是为了管理好学生选课信息而设计的。

数据处理手工操作,工作量大,出错率高,出错后不易更改,造成了时间上的浪费。 基于这个问题,我认为有必要建立一个学生选课系统,使学生选课信息管理工作规范化、系统化、程序化,避免学生选课管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询和修改选课情况。

2

学生选修课课程设计报告

二、题目说明

假定有n门课程,每门课程都有课程编号,课程名称,课程性质,总学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。试设计一选修课程系统,使之能提供一下功能:

(1) 系统以菜单方式工作;

(2) 课程信息和学生信息的录入功能(课程信息有文件保

存)----输入;

(3) 课程信息浏览功能----输出;

(4) 查询功能(至少一种查询方式)---算法; (5) 按学分查询;

(6) 某门课程学生选修情况(可选项)。 [提示]

数据结构可用结构体,包括课程和选秀两个结构体,其中课程结构体包括课程编号、课

程名称、课程性质、总学时、授课学时、实验或上机学时、学分、开课学期。选修结构体成员包括学号,课程编号,该结构体的建立主要是为了查询某门课程学生选修情况.。

3

学生选修课课程设计报告

三、数据结构设计

本系统的实现,全部采用链表这种数据结构,用链表实现课程的查找、添加、删除、课程的选修、追加选修的课程,课程信息采用结构体这种数据结构。 typedef struct subjects {

int num; // char name[20]; // char kind[10]; // int stime; // int ttime; // int etime; // int score; // int term; // struct subjects *next; }SUB;

SUB *head=NULL;

课程编号 课程名称 课程性质 总学时 授课学时

实验或上机学时 学分 开课学期 4

学生选修课课程设计报告

四、程序分析

现代的社会是信息化的社会,信息无所不在。在生产领域、流通领域、各个部门每天都和信息打交道,如何处理如此多的信息成为了一个重要的课题。学生在学期开始选课是教学活动中的一个重要环节,该环节如果能管理好,它不仅能加快学生的选课速度,也提高了整个活动的效率。

大学一般都有上千名学生,每学期开始学生都要选课,因而产生了大量的课程信息。考虑到用户使用的方便和处理的信息量系统要完成录入,保存,查询,修改和删除课程信息的各种过程,能打印出课程信息表。

对象:

系统的主要使用对象是需要选课的学生。学生在选课是要察看各个课程的详细信息,还要选择一些感兴趣的课程,需要生成课表,在发现课程有冲突后能够修改先前选择的信息。需要随学生选课的变化,计算相应的总学分。在全部选定后,打印报表。系统还需要管理员来查看和修改学生的总体选课情况课程信息和学生信息。

5

学生选修课课程设计报告

五、程序设计大纲

主 模 块 管理员模块 学生模块 浏览课程 查询课程 添加课程 删除课程 浏览所有课程 查询课程信息 选择选修课程 浏览我选修的课删除错选的课程 6

学生选修课课程设计报告

六、模块设计

(一) 主函数,头文件及结构体声明

主函数设计地比较简洁,只是提供一个主菜单,switch语句将整个程序分为两个大的功能模块:

进入下一层

选择序号进行选课 进入选课系统

(二) 管理员功能模块

管理员的功能一共有四个功能:浏览,查询,添加,删除课程,运用字符串处理函数处理密码的问题,用一个switch语句实现函数的调用:

管理员登录菜单 i=3 是 i>0 否 输入密码 是 进行码匹对验证 否 进入管理员界面 按任意键退出

7

学生选修课课程设计报告

(三) 学生功能菜单

学生功能菜单包括六个功能:浏览课程,查询课程,选修课程,浏览我所选修的课程,添加选修课程,删除错选的课程,也是用到switch语句来调用函数:

[

(四) 创建链表模块

学生登录菜单 按1-6数字键进入各选项 1、浏览所有课程 2、查询课程信息 3、选择选修课程 4、浏览我选修的课程 5、删除错选课程 6、返回主菜单 进入所选目标 8

学生选修课课程设计报告

创建链表 输入选修课程信息(num,name,kind,stime,ttime,etime,score,term) 是 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; 否 Head==NULL 是 Tail->next=p; Tail=p; Head=p Scanf(num,name,kind,Tail->next=NULL; Return head; 创建完成 &stime,&ttime,&etim

9

学生选修课课程设计报告

(五) 浏览模块

浏览模块主要用管理员中的“浏览课程”和学生功能中的“浏览所有所有课程”,将所有的课程信息输出,即将all_sub.txt文件里面的内容全部输出:

10

学生选修课课程设计报告

(六) 查询模块

查询模块主要用于管理员功能中的“查询课程”和学生功能模块中的“查询所有课程”,查询模块共分为三个查询方法:按课程名称查找,按课程性质查找和按学分查找switch语句中,每一个case语句就是一中查询方法:

进入所选目

1、按课程名称查找 2、按课程性质查找 3、按学分查找 4、退出查找 按1-4数字键进入各选项 课程信息查询 输出课程信息

Printf(NO RECORDS); Return; 是 浏览所有课程 SUB *ptr; head=NULL; readfile(); Head==NULL 否

11

学生选修课课程设计报告

(七) 插入链表模块

插入链表操作主要用于添加课程,在整个课程信息中加入一些新课程,它在添加模块中被调用:

插入链表模块 SUB *p1,*p2; p1=subj; 是 head==NULL 否 head=p1; head->next=NULL; 是 否 p2=head;p2; 是 p2->next==NULL 否 p2->next=subj; subj->next=NULL; break;

(八) 添加模块

添加模块主要用于增加课程信息,采用链表的操作:

eturn head;

12

插入课程信息 学生选修课课程设计报告 SUB *ptr,*subj; int size=sizeof(SUB); char ch,ch1; 是 ch!='0' 否 输入(课程信息、课程编号、课程名称、课程性质、总学分、授课学分、实践或上机学时) myInsert(subj); printf(\继续插入请按回车\\n\printf(\结束添加课程按 0 \) ch1=getchar(); ch=getchar(); Return head;

(九) 删除模块

删除模块主要用于管理员删除课程信息学生删除自己的选课,全部采用删除链表中的某一个节点的操作:

删除选修课程 SUB *p1,*p2; char ch,ch1; int num printf(输入想要删除的课程编号); scanf(\进行编号查找并删除 printf(\继续删除请按回车\\n\printf(\结束删除课程按 0: \

13

学生选修课课程设计报告

(十) 选修课程模块

选修课程模块采用插入链表的操作:

选新课程 printf(\输入要选修的课程的编号\\n\printf(\如果确认输入完要选修的课程的编号,请输入0\ 程序对输入的信息进行查找判断 printf(“选修成功! \\n\printf(\以上信息全部保存在'my_sub.txt'中\\n\

}

(十一) 读取文件模块

读取文件模块是用来读出文件内容,并将内容输出到内存中,当输入文件名时,就能打开指定的文件,当输入all_sub.txt时,打开所有课程信息的文件,当输入my_sub.txt时,就是浏览学生选修的课程信息。

14

学生选修课课程设计报告

读取文件 printf(\请输入课程信息所在的文件名称:\!feof(fp) c=fgetc(fp))=='\\n' !feof(fp) newSub=(SUB*)malloc(sizeof(SUB)); fscanf(fp,&newSub->num,newSub->name,newSub->kind,&newSub->stime,&newSub->ttime,&newSub->etime,&newSub->score,&newSub->term); myInsert(newSub); fclose(fp);

(十二) 保存文件模块

保存文件模块共分为两个子程序,分别是将修改的信息保存到all_sub.txt和my_sub.txt文件中:

保存文件 系统进行检测所要保存的文件 fprintf(fp,\课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学分 开课学期\\n\15

p=head;p;p=p->next 学生选修课课程设计报告

七、结果分析

程序的优缺点

【功能上的优点】主要体现在以下三点:

1.简洁明了的程序菜单。程序主要采用了六组层次不同的菜单,相互独立又相互联系,巧妙相接,符合用户的使用习惯与思维。

2.人性化的程序提示语言,程序提示语言较人性化,不仅大多为祈使语句、疑问句,而且提示明确,具有较强的明确的指导作用。程序提示不仅层次分明,提示方式多样,而且提示信息井然有序,更加有利于用户顺利、准确地进行程序的操作。

3.智能化的模块设计。程序的智能化主要体现在减少了许多人工操作。如功能模块操作结束后,均会返回主菜单进行下一模板的运行,并提示是否再进行类似的操作,这样给用户带来了操作的方便,大大提高了学生选课的效率。

本程序达到了C语言课程设计题目的所有要求。即本程序(1)系统一菜单方式工作(2)课程信息和学生选课信息录入功能(课程信息用文件保存输入(3)课程信息浏览功能——

16

学生选修课课程设计报告

输出(4)查询功能(至少一种查询方式)——算法(5)按学分查询(6)某门课程学生选修情况(可选项)的功能要求。

与此同时,程序各模块开发设计依据了程序的具体实际的使用情景,而有所改进,使其更具有实用性。

【程序的缺点】主要表现在以下四点:

1.程序虽然经过多次精简,但仅仅是形式上、小范围的精简,仍

未得到本质上的精简,即未找到更加简单、更加高效、更加合理、更小占用的资源的算法。

2.程序仍然存在不合理的地方,例如程序某些部分输入错误会导致程序中止或转向其他功能模块,即程序建议用户注意提示,进行合理的准确的输入,这样更有利于管理工作。

3.程序功能仍然不够完善。例如信息表达方式不丰富,比较单一,缺少图片、音乐等元化表达方式。

17

学生选修课课程设计报告

八、遇到的问题和解决方法

1. 用户输入的错误问题,对每个数据输入段代码进行分析,利用FOR或WHILE构成的循环,输入三次以上程序自动跳出主菜单或知道用户输入正确为止. 2. 结构体数组的定义:当在结构体中有Float型数据事系统会提示错误. 解决方法:用其他变量代替然后在定义. 3. 在调试没运行完自动跳出主界面:

解决方法:是由于系统的问题,在遇到float型数据时会出现系统错误.

4. 未定义而先使用. 5. 同类型的指针还混用.

6. 道如何使型参与实参一一对应. 7. 调试程序事出现了死循环.

18

学生选修课课程设计报告

九、课程设计心得

通过该系统的课程设计分析,掌握了模块化设计的方法,理解和运用了结构化程序设计的思想和方法,掌握和提高了运用C语言进行程序设计的能力。

程序设计的过程,实际上是确定解决问题的详细步骤,而这个步骤通常叫做流程,在程序设计过程中理清楚整个问题的流程很重要,然后采取逐步细化的方法实现整个程序。

对于一个较大的应用程序,我们一般不可能一次就设计出一个很完善的系统。通常要先设计满足基本要求的系统,然后再测试或者在使用的过程中不断完善,慢慢地做成一个功能很完善选修课程管理系统。

19

学生选修课课程设计报告

fprintf(fp,\o,p->Melepeo);

p=p->next; } fclose(fp);

printf(\课程信息已保存在%s中!\\n\}

void intos()//存储学生信息 {

FILE * fp; struct student * p; char filepath[30];

printf(\输入学生信息要保存的文件路径:\ getchar(); gets(filepath);

if((fp=fopen(filepath,\ {

printf(\保存失败!\ exit(0); } p=head2; while(p!=NULL)

45

学生选修课课程设计报告

{

fwrite(p,sizeof(struct student),1,fp); p=p->next; } fclose(fp);

printf(\学生信息已保存在%s中!\\n\}

void into()//存储信息 { int i;

printf(\存储课程信息\\n\ printf(\存储学生信息\\n\ printf(\返回主菜单\\n\ printf(\请输入(1~3)\\n\ scanf(\ switch(i) {

case(1):intoc();break; case(2):intos();break; case(3):break; } }

46

学生选修课课程设计报告

void store()//信息主函数 { int i;

printf(\系统信息查看及存储\\n\ printf(\查看课程信息\\n\ printf(\查看学生信息\\n\ printf(\存储信息\\n\ printf(\返回主菜单\\n\ printf(\请输入(1~4):\\n\ scanf(\ switch(i) {

case(1):listc();break; case(2):lists();break; case(3):into();break; case(4):break; } }

int main()//主函数 { int i; start:

47

学生选修课课程设计报告

printf(\欢迎使用学生选课系统!\\n\ printf(\菜单:\\n\

printf(\录入课程信息\\n\ printf(\课程管理\\n\ printf(\录入学生信息\\n\ printf(\学生信息管理\\n\ printf(\学生选课\\n\

printf(\系统信息查看及存储\\n\ printf(\退出系统\\n\

printf(\请输入菜单选项(1~7):\\n\ scanf(\ if(i<1 || i>7) {

printf(\输入错误,请重输:\\n\ goto start; } switch(i) { case(1): {

system(\ inputc();

48

学生选修课课程设计报告

goto start; break; } case(2): {

} case(3): {

} case(4): {

system(\managementc(); goto start; break; system(\inputs(); goto start; break; system(\managements(); goto start;

49

学生选修课课程设计报告

十、设计(论文)的主要参考文献

1 C/C++程序设计教程,王连相,中国铁道出版社,2006 2 C语言程序设计,谭浩强,清华大学出版社,1999 3 C程序设计题解与上机指导,谭浩强,清华大学出版社,1999

4 C/C++程序设计上机指导与测试,王连相,中国铁道出版社,2006

5 C语言函数手册,机械工业出版社,1999 6 C语言的实际应用,安徽科学技术出版社,2000

20

学生选修课课程设计报告

附录(源程序代码)

#include #include int N1,N2,kk1,kk2,kk3; struct couse * head1; struct student * head2; struct couse//课程信息结构体 {

int num1; char name1[20]; int score;

int nelepeo;//课程已选人数 int Melepeo;//课程人数上限 struct couse * next; };

struct student//学生信息结构体 {

int num2; char name2[20];

int nelenum[50];//已选课程编号 int nelen;//已选课程数量

21

学生选修课课程设计报告

struct student * next; }; void Ms() {

for(kk1=0;kk1<1100;kk1++)

for(kk2=0;kk2<1200;kk2++) for(kk3=0;kk3<1200;kk3++); }

void keyboardc()//录入课程子函数(从键盘录入) {

struct couse *p1,*p2; N1=0;

p1=p2=(struct couse*)malloc(sizeof(struct couse));

printf(\课程编号\\t课程名称\\t学分\\t课程人数上限\\n\scanf(\Melepeo);

p1->nelepeo=0; head1=NULL; while(p1->num1!=0) {

N1=N1+1; if(N1==1)head1=p1;

22

学生选修课课程设计报告

else p2->next=p1; p2=p1;

p1=(struct couse * )malloc(sizeof(struct couse));

scanf(\;

p1->nelepeo=0; }

p2->next=NULL; }

void filec()//录入键盘子函数(从文件录入) {

FILE * fp; char filepath[20]; struct couse *p1,*p2; N1=0;

printf(\输入要读入的文件路径:\ getchar(); gets(filepath);

if((fp=fopen(filepath,\ {

printf(\找不到%s文件!\\n\

23

学生选修课课程设计报告

exit(0); }

p1=p2=(struct couse*)malloc(sizeof(struct couse));

fscanf(fp,\lepeo,&p1->Melepeo);

head1=NULL; while(!feof(fp)) {

N1=N1+1; if(N1==1)head1=p1; else p2->next=p1; p2=p1;

p1=(struct couse * )malloc(sizeof(struct couse));

fscanf(fp,\lepeo,&p1->Melepeo);

}

p2->next=NULL; }

void inputc()//录入课程主函数 {

24

学生选修课课程设计报告

scanf(\ p1->nelen=0;

for(i=0;i<20;i++) p1->nelenum[i]=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(\ p1->nelen=0;

for(i=0;i<20;i++) p1->nelenum[i]=0; }

p2->next=NULL; }

void files()//录入学生信息子函数(从文件录入) {

int i=0; FILE * fp; char filepath[20];

30

学生选修课课程设计报告

struct student *p1,*p2; N2=0;

printf(\输入要读入的文件路径:\ getchar(); gets(filepath);

if((fp=fopen(filepath,\ {

printf(\找不到%s文件!\\n\ 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;

p1=(struct student * )malloc(sizeof(struct student)); fread(p1,sizeof(struct student),1,fp);

31

学生选修课课程设计报告

}

p2->next=NULL; }

void inputs()//录入学生信息主函数 { int i;

printf(\录入学生信息\\n\ printf(\从键盘录入\\n\ printf(\从文件录入\\n\ printf(\返回主菜单\\n\ printf(\请选择(1~3):\\n\ scanf(\ switch(i) {

case(1):keyboards();break; case(2):files();break; case(3):break; } }

void inserts(struct student * incouse)//学生信息管理子函数(填加学生信息)

{

32

学生选修课课程设计报告

struct student *p0,*p1,*p2; p1=head2; p0=incouse; if(head2==NULL) {

head2=p0; p0->next=NULL; } else {

while((p0->num2 > p1->num2) && (p1->next!=NULL)) {

p2=p1; p1=p1->next; }

if(p0->num2 <= p1->num2) {

if(head2==p1) head2=p0; else p2->next=p0; p0->next=p1; } else

33

学生选修课课程设计报告

{

p1->next=p0; p0->next=NULL; } }

N2=N2+1; }

void dels(int num2)//学生信息管理子函数(删除学生信息) {

struct student *p1,*p2; if(head2==NULL) {

printf(\没有该学生信息,无法删除!\\n\ goto end; } p1=head2;

while(num2!=p1->num2 && p1->next!=NULL) {

p2=p1; p1=p1->next; }

if(num2==p1->num2)

34

学生选修课课程设计报告

{

if(p1==head2) head2=p1->next; else p2->next=p1->next; printf(\已删除该学生信息!\\n\ N2=N2-1; }

else printf(\无该学号的学生!\\n\ end:; }

void managements()//学生信息管理主函数{

struct student * incouse; int i,num2;

printf(\学生信息管理\\n\ printf(\新增学生信息\\n\ printf(\删除学生信息\\n\ printf(\返回主菜单\\n\ printf(\请选择(1~3):\\n\ scanf(\ switch(i) { case(1):

35

学生选修课课程设计报告

{

incouse=(struct student));

incouse->nelen=0; incouse->nelenum[0]=0;

printf(\学生学号\\t学生姓名\\n\

scanf(\ inserts(incouse); break; } case(2): {

printf(\请输入要删除学生的学号:\\n\ scanf(\ dels(num2); break; } case(3):break; } }

void elect(struct student * s)//选课 {

36

student *)malloc(sizeof(struct

学生选修课课程设计报告

struct couse * p; int num1,i;

printf(\请输入要选课的编号:\\n\ scanf(\ for(i=0;s->nelenum[i]!=0;i++); s->nelenum[i]=num1; (s->nelen)++; p=head1;

while(p->num1!=num1) p=p->next; (p->nelepeo)++; }

void cheak()//学生选课子函数(查询可选课程) {

char e; struct couse * c; struct student * s; int num2,i,j=0,t=0; printf(\请输入你的学号:\ scanf(\ s=head2;

while(s->num2!=num2 && s->next!=NULL) s=s->next; if(s->num2!=num2)

37

学生选修课课程设计报告

{

printf(\不存在你的信息,请进入主菜单录入你的信!\\n\

goto end; } c=head1;

printf(\你的可选课程编号:\\n\ while(c!=NULL) {

for(t=0,i=0;s->nelenum[i]!=0;i++) {

if(c->num1==s->nelenum[i]) t=1; }

if(t==0 && (c->nelepeo!=c->Melepeo)) {

printf(\ j++; } c=c->next; } if(j==0) {

38

学生选修课课程设计报告

printf(\你已选完所有课程,无法再多选!\\n\ goto end; }

printf(\选课(y/n)?:\\n\ getchar(); e=getchar(); i=0; while(e=='y') {

elect(s);

printf(\继续选课(y/n)?:\\n\ getchar(); e=getchar(); } end:; }

void back(struct student * p)//退课 {

struct couse * p1; int num1,i,j;

printf(\请输入你要退掉的课程编号:\\n\ scanf(\

39

本文来源:https://www.bwwdw.com/article/y3xh.html

Top