学生选修课程系统设计

更新时间:2024-07-04 04:47:01 阅读量: 综合文库 文档下载

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

第 I 页 共 III页

摘 要

C 语言一共只有32 个关键字,9 种控制语句,程序书写形式自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来。 C语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。

运算符丰富,C 语言的运算符包含的范围很广泛,共有34 种运算符。C 语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C 语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。

数据结构丰富,C 语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据结构的运算。并引入了指针概念,使程序效率更高。另外C 语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。

C 语言的三种程序结构:顺序结构、选择结构、循环结构、结构体和数组等。 学号C语言是学习单片机的重要前提,许多的控制系统都需要C语言来编程,所以学号C语言是必须的。

关键词:学生选修课程系统;C语言课程设计;模块化程序设计;信息录入;浏览信息;查询;选课

Abstract

C language a total of only 32 key, 9 kinds of control statements, and program written form freedom, mainly use lowercase letter said. It is the basic structure of the high-level language and statement and low-level language practical combined.

C language can be like assembly language registration, byte and address for operation, and these three are the most basic computer. The unit of work.

Operator is rich, C language operator contains range is very wide, a total of 34 kinds of operator. C language brackets, assignment, forced type conversion, etc as operator processing. So that the C language arithmetic class.

Type is extremely rich expression type diversification. Agile use all sorts of operator can realize in other high-level languages.

第 II 页 共 III页

To realize in the operation.

Data structure is rich, C language data types are: integer, real, character type, array type, pointer type, structure, type, Shared body type, etc. Can be used to realize all kinds of complicated data structure of the operation.

And introduced the pointer concept, make the process more efficient. Another C language has powerful graphics functions, support

A variety of display and drive. And the calculating function, logic powerful.

C language three program structure: sequence structure, choice structure, circulation structure, structure, and array, etc.

Student id C language learning is an important prerequisite for single chip microcomputer, many control system need C language programming, So student id C language is a must.

Key words:

Student elective system; C language curriculum design; Modularized program design; Information recorded; Browse information; Query; elective

第 III 页 共 III页

目 录

引言 ???????????????????????1 1 C 语言课程设计的目的 ??????????????1 2 课程设计题目 ?????????????????1 2.1 要求 ?????????????????????1 2.2 分析 ?????????????????????2 2.3 总体设计 ???????????????????2 2.4 详细设计 ????????????????????3 2.4.1主函数,头文件及结构体声明?????????????3 2.4.2 管理员功能模块?????????????????3 2.4.3学生功能菜单??????????????????4 2.4.4创建链表模块 ??????????????????4 2.4.5浏览模块???????????????????5 2.4.6查询模块???????????????????6 2.4.7插入链表模块??????????????????7 2.4.8添加模块???????????????????7 2.4.9删除模块???????????????????8 2.4.10选修课程模块?????????????????9 2.4.11读取文件模块?????????????????9

2.4.12保存文件模块??????????????????10 2.5 运行结果 ????????????????????11 结论???????????????????????16 谢辞???????????????????????17 参考文献?????????????????????18 附录???????????????????????19

第 1 页 共 28页

引言

C语言是一种面向过程的计算机程序设计语言,它是目前众多计算机语言中举世公认的优秀的结构程序设计语言之一。它由美国贝尔研究所的D.M.Ritchie 于1972 年推出。1978后,C语言已先后被移植到大、中、小及微型机上。

C语言发展如此迅速,而且成为最受欢迎的语言之一,主要因为它具有强大的功能。许多著名的系统软件,如DBASEⅣ都是由C 语言编写的。用C语言加上一些汇编语言子程序,就更能显示C语言的优PC-DOSWORDSTAR等就是用这种方法编写的。在初学C语言时,可能会遇到有些问题理解不透,或者表达方式与以往数学学习中不同(如运算符等),这就要求不气馁,不明白的地方多问多想,鼓足勇气进行学习,待学完后面的章节知识,前面的问题也就迎刃而解了,这一方面我感觉是我们同学最欠缺。大多学不好的就是因为一开始遇到困难就放弃,曾经和好多同学谈他的问题回答是听不懂、不想听、放弃这样三个过程,我反问,这节课你听过课吗?回答又是没有,根本就没听过课,怎么说自己听不懂呢?相应的根本就没学习,又谈何学得好? 学习C 语言始终要记住“曙光在前头”和“千金难买回头看”,“千金难买回头看”是学习知识的重要方法,就是说,学习后面的知识,不要忘了回头弄清遗留下的问题和加深理解前面的知识,这是我们学生最不易做到的,然而却又是最重要的。学习C 语言就是要经过几个反复,才能前后贯穿学好。

学好C 语言的运算符和运算顺序,这是学好《C 程序设计》的基础,C 语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。在学习中,只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。

1 C 语言课程设计的目的

高级语言课程设计是学习完《高级语言程序设计》课程后进行的一次全面的综合性上机实验。其目的在于为同学提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼同学的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。

2 课程设计题目

学生选修课程系统设计

2.1 要求:

假定有n门课程,每门课程有课程编号、课程名称、课程性质、总学时、授课

第 2 页 共 28页

学时、实验或商机学时、血粉、开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。

试设计一个选修课程系统,使之能提供以下功能:

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

(2) 课程信息和学生选课信息输入功能(课程信息用文件保存)——输入。 (3) 课程信息浏览功能——输出。

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

(6) 某门课程学生选修情况(可选项)。 2.2 分析:

数据结构可用结构体,课程结构体包括课程编号、课程名称、课程性质、总学时、授课学时、实验或上机学时、学分、开课学期。题目要求课程信息用文件保存,应写入文件中,提供文件的输入输出等操作;在过程中需有浏览、插入、修改、查找、删除学生选课信息等操作,顾应分别建立个功能模块;另外还应提供键盘式选择菜单实现程序运行。 2.3 总体设计

第 3 页 共 28页

2.4 详细设计

2.4.1主函数,头文件及结构体声明

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

2.4.2 管理员功能模块

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

管理员登录菜单 进入下一层 选择序号进行选课 进入选课系统

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

第 4 页 共 28页

2.4.3学生功能菜单

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

学生登录菜单 按1-6数字键进入各选项

1、浏览所有课程 2、查询课程信息 3、选择选修课程 4、浏览我选修的课程 5、删除错选课程 6、返回主菜单

进入所选目标 2.4.4创建链表模块

创建链表模块create_form()函数,用于录入课程信息:

第 5 页 共 28页

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

2.4.5浏览模块

浏览模块主要用管理员中的“浏览课程”prin()函数和学生功能中的“浏览所

第 6 页 共 28页

有所有课程”prin1()函数,将所有的课程信息输出,即将all_sub.txt文件里面的内容全部输出:

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

2.4.6查询模块

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

第 7 页 共 28页

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

2.4.7插入链表模块

插入链表myInsert(SUB *subj)函数操作主要用于添加课程,在整个课程信息中加入一些新课程,它在添加模块中被调用:

第 8 页 共 28页

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

2.4.8添加模块

eturn head;

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

第 9 页 共 28页

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

2.4.9删除模块

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

删除选修课程

SUB *p1,*p2; char ch,ch1; int num printf(输入想要删除的课程编号); scanf(\

进行编号查找并删除 printf(\继续删除请按回车\\n\printf(\结束删除课程按 0: \ 第 10 页 共 28页

2.4.10选修课程模块

选修课程模块choose()函数用于学生选择选修课程,采用插入链表的操作:

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

2.4.11读取文件模块

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

第 11 页 共 28页

读取文件 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);

2.4.12保存文件模块

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

第 12 页 共 28页

保存文件 系统进行检测所要保存的文件 fprintf(fp,\课程编号 课程名称 课程性质 总学时 授课学时 实验或上机学时 学分 开课学期\\n\p=head;p;p=p->next fprintf(fp,\dd}\\n\e,p->kind,p->stime,p->ttime,p->etime,p->score,p->term); fclose(fp); printf(\创建后的信息已放入'all_sub.txt'文件中\\n\ system(\ 2.5 运行结果 开始运行

第 18 页 共 28页

谢 辞 参考文献

[1] 谭浩强,C程序设计题解与上机指导(第二版),北京,清华大学出版社,2000年9月。 [2] 甘玲,解析C程序设计,北京,清华大学出版社,2007年3月。 [3] 郭翠英,《C语言课程设计案例精编》,中国水利水电出版社,2005年。 [4]黄明,梁旭,万洪莉,《C语言课程设计》,电子工业出版社,2006年。

[5] 王成端 魏先民等,《C语言程序设计实训——题解、实验、课程设计与样题》,中国水利水电出版社,2005年。

[6]盛夕清,赵阳等编著,《C语言程序设计学习指导、实验指导与课程设计》,中国水利水电出版社,2006年。

第 19 页 共 28页

源程序代码:

#include \#include \#include \#include \void prin1(); void choose();

typedef struct subjects { int num; char name[20]; char kind[10]; 附 //课程编号 //课程名称 //课程性质

第 20 页 共 28页

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(\ &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(\

kind,&stime,&ttime,&etime,&score,&term); } tail->next=NULL; return head; }

void savefile() //保存文件 { SUB *p;

第 21 页 共 28页

FILE *fp; fp=fopen(\ if(fp==NULL)exit(0); printf(\课程编号 课程名称 课程性质 总学时

授课学时 实验或上机学时 学分 开课学期\\n\ for(p=head;p;p=p->next) fprintf(fp,\

p->num,p->name,p->kind,p->stime,p->ttime,p->etime,p->score,p->term); fclose(fp); printf(\创建后的信息已放入'2.txt'文件中\\n\ system(\}

void savefile1() //保存文件 { SUB *p; FILE *fp; fp=fopen(\ if(fp==NULL)exit(0); for(p=head;p;p=p->next) fprintf(fp,\

p->num,p->name,p->kind,p->stime,p->ttime,p->etime,p->score,p->term); fclose(fp); printf(\创建后的信息已放入'3.txt'文件中\\n\ system(\ }

void readfile() //阅读文件 { void *myInsert(SUB*); SUB *newSub; //新课程 int num,stime,ttime,etime; int score,term; char cname[20],kind[10],fname[20]; FILE *fp; fp=fopen(\ while(!feof(fp)) { newSub=(SUB*)malloc(sizeof(SUB)); fscanf(fp,\

&newSub->stime,&newSub->ttime,&newSub->etime,&newSub->score,&newSub->term); myInsert(newSub); } fclose(fp);

第 22 页 共 28页

}

void prin() //浏览所有课程 { SUB *ptr; head=NULL; readfile(); if(head==NULL) { printf(\ return; } printf(\课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期\\n\ for(ptr=head;ptr;ptr=ptr->next) { printf(\ ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term); } system(\}

void prin1() //浏览所有选修课程 { SUB *ptr; FILE *fp; if((fp=fopen(\ { printf(\ choose(); } printf(\课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期\\n\ while(!feof(fp)) { ptr=(SUB*)malloc(sizeof(SUB)); fscanf(fp,\ &ptr->stime,&ptr->ttime,&ptr->etime,&ptr->score,&ptr->term); printf(\ ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term); } fclose(fp); system(\}

void *myInsert( SUB *subj) //链表插入操作 {

第 23 页 共 28页

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; int size=sizeof(SUB); char ch,ch1; while(ch!='0') { subj=(SUB *)malloc(size); ptr=subj; printf(\输入要插入的课程信息:\\n\ printf(\请输入课程编号:\ printf(\请输入课程名称:\ printf(\请输入课程性质:\ printf(\请输入总学时:\ printf(\请输入授课学时:\ printf(\请输入实践或上机学时:\ printf(\请输入学分:\ printf(\请输入开课学期:\ myInsert(subj); printf(\添加完毕,新信息存入文件中\\n\ printf(\继续插入请按回车\\n\ printf(\结束添加课程按 0: [ ]\\b\\b\ ch1=getchar(); //将回车键赋给CH1,

否则subj->term输完后输入的回车键会赋给CH,因此用CH1填补。 ch=getchar();

第 24 页 共 28页

} return head; }

void *del() //删除课程 { SUB *p1,*p2; char ch,ch1; int num; while(ch!='0') { printf(\输入想要删除的课程编号:[ ]\\b\\b\\b\\b\\b\ scanf(\ 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\ printf(\结束删除课程按 0: [ ]\\b\\b\ ch1=getchar(); //将回车键赋给CH1,

否则num输完后再输入的回车键会赋给CH,因此用CH1填补。 ch=getchar(); printf(\删除完毕,新信息存入文件中\\n\ system(\ } return head; system(\}

第 25 页 共 28页

void choose()//选新课程--学生选课函数 { SUB *p,*q; int a[5]; int num,total=0,i=0,j; printf(\输入要选修的课程的编号,编号之间以空格分开\\n\ scanf(\ 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; i++; } scanf(\ } if(total<60) { printf(\选修总学分为%d,未达到60,选修失败!\\n\ system(\ } else { FILE *fp; fp=fopen(\ for(j=0;jnext) if(q->num==a[j]) fprintf(fp,\

q->name,q->kind,q->stime,q->ttime,q->etime,q->score,q->term); fclose(fp); printf(\选修成功!****\\n\ printf(\您选修的课程总学分为%d,课程分别为:\\n\ printf(\课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期\\n\ for(j=0;jnext) if(q->num==a[j]) printf(\

第 26 页 共 28页

q->num,q->name,q->kind,q->stime,q->ttime,q->etime,q->score,q->term); printf(\以上信息全部保存在'3.txt'中\\n\ } system(\}

void search() //课程信息查询 { int a,num; int t=1; char type[10]; SUB *ptr;

L1:system(\ printf(\请选择查询方式*************\\n\ printf(\按课程性质查找\\n\ printf(\按学分查找\\n\ printf(\退出查找\\n\ printf(\ printf(\ scanf(\ switch(a) { case 1:printf(\请输入要查找的课程的性质:\ scanf(\ printf(\课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期\\n\ for(ptr=head;ptr;ptr=ptr->next) if(strcmp(type,ptr->kind)==0) { printf(\

ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term); t=0; } if(t) printf(\未找到!\\n\ t=1; system(\ goto L1; case 2:printf(\输入要查找的课程的学分:\ scanf(\ printf(\课程编号 课程名称 课程性质 总学时 授课学时 实践或上机学时 学分 开课学期\\n\ for(ptr=head;ptr;ptr=ptr->next) if(ptr->score==num)

第 27 页 共 28页

{ printf(\

ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term); t=0; } if(t) printf(\未找到!\\n\ t=1; system(\ goto L1; case 3:break; } }

void Mangers() { int n,w=1,flag=0,i=3; char s[8]; char password[7]=\ do { printf(\ scanf(\ if(!strcmp(s,password)) //进行密码匹配验证 { flag=1; break; } else { printf(\ i--; } } while(i>0); if(!flag) { printf(\ //输入密码超过了3次!! exit(0); //自动退出 } do { system(\ puts(\管理员菜单*******************\\n\\n\

第 28 页 共 28页

puts(\录入课程\\n\ puts(\浏览课程\\n\ puts(\查询课程\\n\ puts(\删除课程\\n\ puts(\返回主菜单\ puts(\ printf(\ scanf(\ switch(n) { case 1:insert();savefile();break; case 2:prin();break; case 3:search();break; case 4:del();savefile();break; case 5:return; default:; } } while(w==1); }

void Students() { int n,w=1; do { system(\ puts(\学生菜单*******************\\n\\n\ puts(\浏览所有课程\\n\ puts(\查询课程信息\\n\ puts(\选择选修课程\\n\ puts(\浏览我选修的课程\\n\ puts(\删除错选课程\\n\ puts(\返回主菜单\ puts(\ printf(\ scanf(\ switch(n) { case 1:prin();break; case 2:search();break; case 3:choose();break; case 4:prin1();break; case 5:del();savefile1();break; case 6:return;

第 29 页 共 28页

default:; } } while(w==1); }

int main() { int n,w=1; do { system(\ puts(\ puts(\以管理员身份登录(password 1)\\n\ puts(\以学生身份登录\\n\ puts(\退出\ puts(\ printf(\ scanf(\ switch(n) { case 1:Mangers() ;break; case 2:Students();break; case 3:w=0;break; default:; } } while(w==1); return 0; }

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

Top