C语言课程设计学生选修课程系统设计.docx
- 文档编号:25614703
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:57
- 大小:494.29KB
C语言课程设计学生选修课程系统设计.docx
《C语言课程设计学生选修课程系统设计.docx》由会员分享,可在线阅读,更多相关《C语言课程设计学生选修课程系统设计.docx(57页珍藏版)》请在冰豆网上搜索。
C语言课程设计学生选修课程系统设计
学生选修课系统设计
一、设计目的
当今时代是飞速发展的信息时代,在各行各业中离不开信息处理,这正是计算机被广泛应用于信息系统的环境。
计算机的最到好处的于利用它能够进行信息管理,使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。
尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。
计算机进行信息管理与信息管理系统的开发密切相关,系统的开发是系统管理的前提。
本系统就是为了管理好学生选课信息而设计的。
数据处理手工操作,工作量大,出错率高,出错后不易更改,造成了时间上的浪费。
基于这个问题,我认为有必要建立一个学生选课系统,使学生选课信息管理工作规范化、系统化、程序化,避免学生选课管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询和修改选课情况。
二、题目说明
假定有n门课程,每门课程都有课程编号,课程名称,课程性质,总学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。
试设计一选修课程系统,使之能提供一下功能:
(1)系统以菜单方式工作;
(2)课程信息和学生信息的录入功能(课程信息有文件保存)----输入;
(3)课程信息浏览功能----输出;
(4)查询功能(至少一种查询方式)---算法;
(5)按学分查询;
(6)某门课程学生选修情况(可选项)。
[提示]
数据结构可用结构体,包括课程和选秀两个结构体,其中课程结构体包括课程编号、课程名称、课程性质、总学时、授课学时、实验或上机学时、学分、开课学期。
选修结构体成员包括学号,课程编号,该结构体的建立主要是为了查询某门课程学生选修情况.。
三、数据结构设计
本系统的实现,全部采用链表这种数据结构,用链表实现课程的查找、添加、删除、课程的选修、追加选修的课程,课程信息采用结构体这种数据结构。
typedefstructsubjects
{
intnum;//课程编号
charname[20];//课程名称
charkind[10];//课程性质
intstime;//总学时
intttime;//授课学时
intetime;//实验或上机学时
intscore;//学分
intterm;//开课学期
structsubjects*next;
}SUB;
SUB*head=NULL;
四、程序分析
现代的社会是信息化的社会,信息无所不在。
在生产领域、流通领域、各个部门每天都和信息打交道,如何处理如此多的信息成为了一个重要的课题。
学生在学期开始选课是教学活动中的一个重要环节,该环节如果能管理好,它不仅能加快学生的选课速度,也提高了整个活动的效率。
大学一般都有上千名学生,每学期开始学生都要选课,因而产生了大量的课程信息。
考虑到用户使用的方便和处理的信息量系统要完成录入,保存,查询,修改和删除课程信息的各种过程,能打印出课程信息表。
对象:
系统的主要使用对象是需要选课的学生。
学生在选课是要察看各个课程的详细信息,还要选择一些感兴趣的课程,需要生成课表,在发现课程有冲突后能够修改先前选择的信息。
需要随学生选课的变化,计算相应的总学分。
在全部选定后,打印报表。
系统还需要管理员来查看和修改学生的总体选课情况课程信息和学生信息。
五、程序设计大纲
六、模块设计
(一)主函数,头文件及结构体声明
主函数设计地比较简洁,只是提供一个主菜单,switch语句将整个程序分为两个大的功能模块:
[程序]
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"malloc.h"
voidprin1();
voidchoose();
typedefstructsubjects//课程结构体
{
intnum;//课程编号
charname[20];//课程名称
charkind[10];//课程性质
intstime;//总学时
intttime;//授课学时
intetime;//实验或上机学时
intscore;//学分
intterm;//开课学期
structsubjects*next;
}SUB;
SUB*head=NULL;
intmain()
{
intn,w=1;
do
{
system("cls");puts("\n\n\t\t*****************MENU******************\n\n");
puts("\t\t\t\t1.以管理员身份登录\n");
puts("\t\t\t\t2.以学生身份登录\n");
puts("\t\t\t\t3.退出");
puts("\n\n\t\t*******************************************\n");
printf("Chioseyournumber(1-3):
[]\b\b");
scanf("%d",&n);
switch(n)
{
case1:
Mangers();break;
case2:
Students();break;
case3:
w=0;break;
default:
;
}
}
while(w==1);
return0;
}
(二)管理员功能模块
管理员的功能一共有四个功能:
浏览,查询,添加,删除课程,运用字符串处理函数处理密码的问题,用一个switch语句实现函数的调用:
[程序]
voidMangers()
{
intn,w=1,flag=0,i=3;
chars[8];
charpassword[7]="1";
do
{
printf("\n\nEnterpassword:
");
scanf("%s",s);
if(!
strcmp(s,password))//进行密码匹配验证
{
flag=1;
break;
}
else
{
printf("\n\nError!
Youonlyhave%dtimes!
Enteragain:
\n",i-1);
i--;
}
}
while(i>0);
if(!
flag)
{
printf("youhaveEnter3times!
");//输入密码超过了3次!
!
exit(0);//自动退出
}
do
{
system("cls");
puts("\n\n\t\t*********************管理员菜单***********************\n\n");
puts("\t\t\t\t1---浏览课程\n");
puts("\t\t\t\t2---查询课程\n");
puts("\t\t\t\t3---添加课程\n");
puts("\t\t\t\t4---删除课程\n");
puts("\t\t\t\t5---返回主菜单");
puts("\n\n\t\t******************************************************\n");
printf("Chioseyournumber(1-5):
[]\b\b");
scanf("%d",&n);
switch(n)
{
case1:
prin();break;
case2:
search();break;
case3:
insert();savefile();break;
case4:
del();savefile();break;
case5:
return;
default:
;
}
}
while(w==1);
}
voidStudents()
{
intn,w=1;
do
{
system("cls");
puts("\n\n\t\t*********************学生菜单***********************\n\n");
puts("\t\t\t\t1---浏览所有课程\n");
puts("\t\t\t\t2---查询课程信息\n");
puts("\t\t\t\t3---选择选修课程\n");
puts("\t\t\t\t4---浏览我选修的课程\n");
puts("\t\t\t\t5---删除错选课程\n");
puts("\t\t\t\t6---返回主菜单");
puts("\n\n\t\t****************************************************\n");
printf("Chioseyournumber(1-6):
[]\b\b");
scanf("%d",&n);
switch(n)
{
case1:
prin();break;
case2:
search();break;
case3:
choose();break;
case4:
prin1();break;
case5:
del();savefile1();break;
case6:
return;
default:
;
}
}
while(w==1);
}
(三)学生功能菜单
学生功能菜单包括六个功能:
浏览课程,查询课程,选修课程,浏览我所选修的课程,添加选修课程,删除错选的课程,也是用到switch语句来调用函数:
[程序]
voidStudents()//学生登录菜单
{
intn,w=1;
do
{
system("cls");
puts("\n\n\t\t************学生菜单**************\n\n");
puts("\t\t\t\t1---浏览所有课程\n");
puts("\t\t\t\t2---查询课程信息\n");
puts("\t\t\t\t3---选择选修课程\n");
puts("\t\t\t\t4---浏览我选修的课程\n");
puts("\t\t\t\t5---删除错选课程\n");
puts("\t\t\t\t6---返回主菜单");
puts("\n\n\t\t***********************************\n");
printf("Chioseyournumber(1-6):
[]\b\b");
scanf("%d",&n);
switch(n)
{
case1:
prin();break;
case2:
search();break;
case3:
choose();break;
case4:
prin1();break;
case5:
del();savefile1();break;
case6:
return;
default:
;
}
}
while(w==1);
}
(四)创建链表模块
[程序]
SUB*create_form()//创建链表
{
SUB*head,*tail,*p;
intnum,stime,ttime;
intetime,score,term;
charname[20],kind[10];
intsize=sizeof(SUB);
head=tail=NULL;
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;
returnhead;
}
(五)浏览模块
浏览模块主要用管理员中的“浏览课程”和学生功能中的“浏览所有所有课程”,将所有的课程信息输出,即将all_sub.txt文件里面的内容全部输出:
[程序]
voidprin()//浏览所有课程
{
SUB*ptr;
head=NULL;
readfile();
if(head==NULL)
{
printf("\n\n\t*********NORECORDS!
************\n");
return;
}
printf("课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");
for(ptr=head;ptr;ptr=ptr->next)
{
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");
}
voidprin1()//浏览所有已选修课程
{
SUB*ptr;
FILE*fp;
if((fp=fopen("3.txt","r"))==NULL)
{
printf("Cannotopenfile.\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");
}
(六)查询模块
查询模块主要用于管理员功能中的“查询课程”和学生功能模块中的“查询所有课程”,查询模块共分为三个查询方法:
按课程名称查找,按课程性质查找和按学分查找switch语句中,每一个case语句就是一中查询方法:
[程序]
voidsearch()//课程信息查询
{
inta,num;
intt=1;
chartype[10],min[10];
SUB*ptr;
L1:
system("cls");
printf("\n\n\t\t**********请选择查询方式*************\n");
printf("\n\t\t\t1---按课程名称查找\n");
printf("\n\t\t\t2---按课程性质查找\n");
printf("\n\t\t\t3---按学分查找\n");
printf("\n\t\t\t4---退出查找\n");
printf("\n\n\t\t**************************************\n");
printf("\n\nChioseyournumber(1-4):
[]\b\b");
scanf("%d",&a);
switch(a)
{
case1:
printf("请输入要查找的课程的名称:
");
scanf("%s",min);
printf("课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");
for(ptr=head;ptr;ptr=ptr->next)
if(strcmp(min,ptr->name)==0)
{
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);
t=0;
}
if(t)
printf("\t\n未找到!
\n");
t=1;
system("pause");
gotoL1;
case2:
printf("请输入要查找的课程的性质:
");
scanf("%s",type);
printf("课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");
for(ptr=head;ptr;ptr=ptr->next)
if(strcmp(type,ptr->kind)==0)
{
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);
t=0;
}
if(t)
printf("\t\n未找到!
\n");
t=1;
system("pause");
gotoL1;
case3:
printf("输入要查找的课程的学分:
");
scanf("%d",&num);
printf("课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");
for(ptr=head;ptr;ptr=ptr->next)
if(ptr->score==num)
{
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);
t=0;
}
if(t)
printf("\n\t未找到!
\n");
t=1;
system("pause");
gotoL1;
case4:
break;
}
}t=0;
}
if(t)
printf("\n\t未找到!
\n");
t=1;
system("pause");
gotoL1;
case4:
break;//退出查找
}
}
(七)插入链表模块
插入链表操作主要用于添加课程,在整个课程信息中加入一些新课程,它在添加模块中被调用:
[程序]
void*myInsert(SUB*subj)//链表插入操作
{
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;
}
}
returnhead;
}
(八)添加模块
添加模块主要用于增加课程信息,采用链表的操作:
[程序]
void*insert()//插入课程信息
{
SUB*ptr,*subj;
intsize=sizeof(SUB);
charch,ch1;
while(ch!
='0')
{
subj=(SUB*)malloc(size);
ptr=subj;
printf("输入要插入的课程信息:
\n");
printf("\n\t\t请输入课程编号:
");scanf("%d",&subj->num);
printf("\n\t\t请输入课程名称:
");scanf("%s",&subj->name);
printf("\n\t\t请输入课程性质:
");scanf("%s",&subj->kind);
printf("\n\t\t请输入总学时:
");scanf("%d",&subj->stime);
printf("\n\t\t请输入授课学时:
");scanf("%d",&subj->ttime);
printf("\n\t\t请输入实践或上机学时:
");
scanf("%d",&subj->etime);
printf("\n\t\t请输入学分:
");scanf("%d",&subj->score);
printf("\n\t\t请输入开课学期:
");scanf("%d",&subj->term);
myInsert(subj);
printf("\n\n继续插入请按回车\n");
printf("\n结束添加课程按0:
[]\b\b");
ch1=getchar();/*将回车键赋给CH1,否则subj->term输完后输入的回车键会赋给CH,因此用CH1填补。
*/
ch=getchar();
}
returnhead;
}
(九)删除模块
删除模块主要用于管理员删除课程信息学生删除自己的选课,全部采用删除链表中的某一个节点的操作:
[程序]
void*del()//删除课程-
{
SUB*p1,*p2;
charch,ch1;
intnum;
while(ch!
='0')
{
printf("输入想要删除的课程编号:
[]\b\b\b\b\b");
scanf("%d",&num);
if(head->num
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 学生 选修 课程 系统 设计