C语言学生选修课程系统.docx
《C语言学生选修课程系统.docx》由会员分享,可在线阅读,更多相关《C语言学生选修课程系统.docx(29页珍藏版)》请在冰豆网上搜索。
![C语言学生选修课程系统.docx](https://file1.bdocx.com/fileroot1/2023-1/5/2a5cc74f-8711-4088-8306-bf59969c32e5/2a5cc74f-8711-4088-8306-bf59969c32e51.gif)
C语言学生选修课程系统
中国地质大学
C课程设计报告
学生选修课程系统
姓名c语言
学号201210006qq
专业地质学
所在院系地球科学学院
教师姓名###
日期:
2014年12月27日
评语
对课程报告的评语:
总成绩:
评阅人签名:
一、实习感悟………………………………………………………………1
二、课程要求………………………………………………………………2
三、各个模块的流程图……………………………………………………3
四、源程序…………………………………………………………………8
五、调试结果………………………………………………………………18
六、程序有待改进的地方…………………………………………………23
(一)实习感悟
经过这次只有32个学时c语言实习,我学会了许多,c语言实习是一个枯燥乏味但有充满了乐趣的过程,你会为一个小小的错误而坐立不安;你会为一个下午的编程却错误连篇而痛心疾首;但也有稍微改动一个符号的错误,瞬间眼前几十个错误就灰飞烟灭的心灵舒畅。
这次实习让我加深了对C语言的了解,而不纯粹是课本中学到的那些理论,平时乏味的课程,通过自己动手亲自编写,变的生动有趣,而在自己动手的过程中,出现的问题很多,比理论要难的多,当一个程序写完以后,经常会有很多错误而没法解决。
我就曾因为进行浏览操作时,缺失一个读出文件的函数而苦恼不已,最后还是在助教帮助下找到这个运行时出现的错误。
我实习的内容是编一个学生选修课程系统。
看似简单的事情对于我来说是个多么大的挑战,一年之前学习过的c语言早就忘得差不多了,于是我只好重新回忆以前学过的c语言知识。
虽然我们在一年前c语言上课时曾经实习过,但那只不过是c语言的简单的函数的实习,是让我们更好的熟悉书本的每一个函数和各种符号的正确使用。
所以我们对c语言的理解仅仅停留在函数阶段,而我们这次实习却是各种函数的使用,很多时候都是和文件的使用结合在一起,而恰恰我对文件的使用不太熟悉,只好硬着头皮看了文件这个模块一个下午,对文件的输入与输出有了基本的了解。
32个学时的实习其实只有8大节课,时间十分的短。
老师并没有给我们太多的解析,也容不得我们自己用太多的时间去考虑,只是给了我们一个书本的模块,让我们按照其方式去编一个程序。
这次的实习虽然并没有让我成为一位编程序的高手,但却让我掌握了许多。
(1)让我知道错误的来源,如何利用c++这个软件查找错误,并逐渐缩小错误的范围,最后找到错误之处,并把它改正它。
(2)让我知道一个小小的“\”符号都会让程序出现错误。
(3)让我知道程序如何通过读取文件的一个个内容,并把它送到缓存区间进行处理,然后再输出到文件中保存下来。
(4)让我学会如何定义一个新类型,而不是使用原来的复杂难记的结构体类型。
(5)让我知道当你输入错误时,程序会让你按任意键继续而不是处于一个半死机的状态。
(6)让我知道如何在输入错误时,什么时候选择退出,什么时候选择返回上一级或者主函数。
(7)让我知道如何去调用各种函数去完成各个模块的功能。
(8)让我知道如何去定义各种全局变量和局部变量去解决因为函数位置先后顺序不同而出现的问题,等等。
总之这次实习让我学会了很多。
通过这次实训,我也发现了许多问题。
在实训中,我认识到自己还有很多基础的知识没学好,而且许多东西还要去翻书,许多错误的解析还得去上网搜索。
而且遇到一些小错误运行不出来,就会烦躁不安,觉得有些自暴自弃或者抱怨。
不过也教会了我编程这样的事情要学会耐心,细心。
总之实践是检验学习情况的很好的标准。
(二)要求
假定有n门课程,每门课程有课程编号、课程名称、课程性质、总学时、授课学时、实验或上机学时、学分、开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。
1.要求:
试设计一个选修课程系统,使之能提供以下功能:
(1)系统以菜单方式工作。
(2)课程信息和学生选课信息输入功能(课程信息用文件保存)——输入。
(3)课程信息浏览功能——输出。
(4)查询功能(至少一种查询方式)——算法。
(5)按学分查询。
(6)某门课程学生选修情况(可选项)。
2.分析:
由于题目要求将学生的选课信息用结构体形式输入,并写入文件中,所以应提供文件的输入输出等操作:
在过程中需有浏览、插入、修改、查找、删除学生选课信息等操作,顾应分别建立个功能模块;另外还应提供键盘式选择菜单实现程序运行。
3.总体设计:
根据题目要求,可以将系统分为六大个模块:
1)系统以菜单方式工作模块;
2)课程信息与学生选课信息录入功能模块;
3)课程信息浏览功能模块;
4)查询模块;
5)按学分查询模块;
6)某些课程学生选修情况模块。
4.小模块:
1)保存文件模块
2)创建链表
3)插入链表模块
4)添加模块
5)读取文件模块
6)浏览课程模块
7)选课模块
8)删除模块
9)信息查询模块
10)学生功能模块
11)管理员功能模块
12)主函数
(三)设计模块流程图
主函数
头文件及结构体声明主函数设计地比较简洁,只是提供一个主菜单,switch语句将整个程序分为两个大的功能模块.
保存文件模块
保存文件模块共分为两个子程序,分别是将修改的信息保存到chenwu22.txt和chenwu23.txt文件中。
插入链表模块
插入链表操作主要用于添加课程,在整个课程信息中加入一些新课程,
它在添加模块中被调用
读取文件模块
读取文件模块是用来读出文件内容,并将内容输出到内存中,当输入文件名时,就能打开指定的文件,当输入chenwu22.txt时,打开所有课程信息的文件,当输入chenwu23.txt时,就是浏览学生选修的课程信息
浏览课程模块
主要用管理员中的”浏览课程”和学生功能中的”浏览所有所有课程”,将所有的课程信息输出,即将chenwu22.txt文件里面的内容全部输出
信息查询模块
查询模块主要用于管理员功能中的”查询课程”和学生功能模块中的”查询所有课程”,查询模块共分为三个查询方法:
按课程名称查找,按课程性质查找和按学分查找.switch语句中,每一个case语句就是一中查询方法
选课模块
选修课程模块采用插入链表的操作
删除模块
删除模块主要用于管理员删除课程信息学生删除自己的选课,全部采用删除链表中的某一个节点的操作
源代码
#include
#include
#include
#include
typedefstructsubjects//课程结构体
{
intbianhao;//课程编号
charmingcheng[20];//课程名称
charxingzhi[10];//课程性质
intzxueshi;//总学时
intskxueshi;//授课学时
intsjxueshi;//实验或上机学时
intxuefen;//学分
intxueqi;//开课学期
structsubjects*next;
}SUB;
SUB*head=NULL;
//********************保存文件模块************************//
voidbaocun1()//保存wenjian,chenwu22.txt和chenwu23.txt文件中.
{
SUB*p;
FILE*fp;
fp=fopen("chenwu22.txt","w");
if(fp==NULL)exit(0);
fprintf(fp,"课程编号课程名称课程性质总学时授课学时实验或上机学时学分开课学期\n");
for(p=head;p;p=p->next)fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",p->bianhao,p->mingcheng,p->xingzhi,p->zxueshi,p->skxueshi,p->sjxueshi,p->xuefen,p->xueqi);
fclose(fp);
printf("创建后的信息已放入'chenwu22.txt'文件中\n");
system("pause");
}
voidbaocun2()//保存文件
(二)
{
SUB*p;
FILE*fp;
fp=fopen("chenwu23.txt","w");
if(fp==NULL)exit(0);
fprintf(fp,"课程编号课程名称课程性质总学时授课学时实验或上机学时学分开课学期\n");
for(p=head;p;p=p->next)fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",
p->bianhao,p->mingcheng,p->xingzhi,p->zxueshi,p->skxueshi,p->sjxueshi,p->xuefen,p->xueqi);
fclose(fp);
printf("创建后的信息已放入'chenwu23.txt'文件中\n");
system("pause");
}
//******************************************************************//
SUB*liangbiao()//创建链表
{
SUB*head,*tail,*p;
intbianhao,zxueshi,skxueshi;
intsjxueshi,xuefen,xueqi;
charmingcheng[20],xingzhi[10];
intsize=sizeof(SUB);
head=tail=NULL;
printf("输入选修课程信息:
\n");
scanf("%d%s%s%d%d%d%d%d",&bianhao,mingcheng,xingzhi,
&zxueshi,&skxueshi,&sjxueshi,&xuefen,&xueqi);
while(bianhao!
=0)
{
p=(SUB*)malloc(size);
p->bianhao=bianhao;
strcpy(p->mingcheng,mingcheng);
strcpy(p->xingzhi,xingzhi);
p->zxueshi=zxueshi;
p->skxueshi=skxueshi;
p->sjxueshi=sjxueshi;
p->xuefen=xuefen;
p->xueqi=xueqi;
if(head==NULL)
head=p;
else
tail->next=p;
tail=p;
scanf("%d%s%s%d%d%d%d%d",&bianhao,mingcheng,xingzhi,
&zxueshi,&skxueshi,&sjxueshi,&xuefen,&xueqi);
}
tail->next=NULL;
returnhead;
}
//************************************************************//
void*charuliangjie(SUB*subj)//链表插入操作
{
SUB*p1,*p2;
p1=subj;
if(head==NULL)
{
head=p1;
head->next=NULL;
}
else
{
for(p2=head;p2;p2=p2->next)
if(p2->next==NULL)
{
p2->next=subj;
subj->next=NULL;
break;
}
}
returnhead;
}
void*tianjiakecheng()//插入课程信息
{
SUB*ppt,*subj;
intsize=sizeof(SUB);
charch,ch1;
while(ch!
='0')
{
subj=(SUB*)malloc(size);
ppt=subj;
printf("输入要插入的课程信息:
\n");
printf("******请输入课程编号:
********\n");scanf("%d",&subj->bianhao);
printf("******请输入课程名称:
********\n");scanf("%s",&subj->mingcheng);
printf("******请输入课程性质:
*********\n");scanf("%s",&subj->xingzhi);
printf("******请输入总学时:
************\n");scanf("%d",&subj->zxueshi);
printf("******请输入授课学时:
********\n");scanf("%d",&subj->skxueshi);
printf("******请输入实践或上机学时:
****************\n");
scanf("%d",&subj->sjxueshi);
printf("******请输入学分:
***********\n");scanf("%d",&subj->xuefen);
printf("******请输入开课学期:
******\n");scanf("%d",&subj->xueqi);
charuliangjie(subj);
printf("*****继续插入请按回车**********************\n");
printf("*****结束添加课程按0:
[]***************\n");
ch1=getchar();
ch=getchar();
}
returnhead;
}
//*****************************读取文件********************//
voidduwenjian()//浏览前读取文件chenwu22.txt和chenwu23.txt
{//voidmain();
void*charuliangjie(SUB*);
SUB*newSub;
FILE*fp;
charc,filename[20];
//L1:
system("cls");
printf("请输入课程信息所在的文件名称:
");
scanf("%s",filename);
fp=fopen(filename,"r");
while(!
feof(fp))
{
if((c=fgetc(fp))=='\n')
//gotoL1;
break;
}
while(!
feof(fp))
{
newSub=(SUB*)malloc(sizeof(SUB));
fscanf(fp,"%d%s%s%d%d%d%d%d\n",&newSub->bianhao,newSub->mingcheng,newSub->xingzhi,&newSub->zxueshi,&newSub->skxueshi,&newSub->sjxueshi,&newSub->xuefen,&newSub->xueqi);
charuliangjie(newSub);
}
fclose(fp);
}
//********************浏览模块*****************************//
voidliulan()//浏览所有课程
{
SUB*ppt;
head=NULL;
duwenjian();
if(head==NULL)
{
printf("************************没有记录*****************\n");
return;
}
printf("课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");
for(ppt=head;ppt;ppt=ppt->next)
{
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ppt->bianhao,ppt->mingcheng,ppt->xingzhi,ppt->zxueshi,ppt->skxueshi,ppt->sjxueshi,ppt->xuefen,ppt->xueqi);
}
system("pause");
}
//*****************课程信息查询模块*****************************//
voidchaxun()
{
inta,bianhao;
intt=1;
chartype[10],min[10];
SUB*ppt;
L1:
system("cls");
printf("************************请选择查询方式**************\n");
printf("**********************1---按课程名称查找**************\n");
printf("**********************2---按课程性质查找***************\n");
printf("**********************3---按学分查找*******************\n");
printf("**********************4---退出查找**********************\n");
printf("*****************************************************\n");
printf("*****************请选择数字号码(1-4):
[]****************");
scanf("%d",&a);
switch(a)
{
case1:
printf("请输入要查找的课程的名称:
");
//printf("课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");
scanf("%s",&min);
for(ppt=head;ppt;ppt=ppt->next)
if(strcmp(min,ppt->mingcheng)==0)
{
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ppt->bianhao,ppt->mingcheng,ppt->xingzhi,ppt->zxueshi,ppt->skxueshi,ppt->sjxueshi,ppt->xuefen,ppt->xueqi);
t=0;
}
if(t)
printf("\t\n未找到!
\n");
t=1;
system("pause");
gotoL1;
case2:
printf("请输入要查找的课程的性质:
");//按课程性质查找
scanf("%s",type);
//printf("课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");
for(ppt=head;ppt;ppt=ppt->next)
if(strcmp(type,ppt->xingzhi)==0)
{
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ppt->bianhao,ppt->mingcheng,ppt->xingzhi,ppt->zxueshi,ppt->skxueshi,ppt->sjxueshi,ppt->xuefen,ppt->xueqi);
t=0;
}
if(t)
printf("\t\n未找到!
\n");
t=1;
system("pause");
gotoL1;
case3:
printf("输入要查找的课程的学分:
");//按学分查找
scanf("%d",&bianhao);
//printf("课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");
for(ppt=head;ppt;ppt=ppt->next)
if(ppt->xuefen==bianhao)
{
printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ppt->bianhao,ppt->mingcheng,
ppt->xingzhi,ppt->zxueshi,ppt->skxueshi,ppt->sjxueshi,ppt->xuefen,ppt->xueqi);
t=0;
}
if(t)
printf("\n\t未找到!
\n");
t=1;
system("pause");
gotoL1;
case4:
break;//退出查找
}
}
//*******************删除课程模块********************//
void*shanchu()
{
SUB*p1,*p2;
charch,ch1;
intbianhao;
while(ch!
='0')
{
printf("输入想要删除的课程编号:
[]\b\b\b\b\b");
scanf("%d",&bianhao);
if(head->bianhao==bianhao)
{
p2=head;
head=head->next;
free(p2);
}
if(head==NULL)
returnNULL;
p1=head;
p2=head->next;
while(p2)
{
if(p2->bianhao==bianhao)
{
p1->next=p2->next;
free(p2);
}
else
p1=p2;
p2=p1->next;
}
printf("\n继续删除请按回车\n");
printf("\n结束删除课程按0:
[]\b\b");
ch1=getchar();
//将回车键赋给CH1,否则bianhao输完后再输入的回车键会赋给CH,因此用CH1填补。
ch=getchar();
}
returnhead;
system("pause");