C语言课程设计课程管理系统实验报告.docx
- 文档编号:18511351
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:56
- 大小:522.88KB
C语言课程设计课程管理系统实验报告.docx
《C语言课程设计课程管理系统实验报告.docx》由会员分享,可在线阅读,更多相关《C语言课程设计课程管理系统实验报告.docx(56页珍藏版)》请在冰点文库上搜索。
C语言课程设计课程管理系统实验报告
课程设计实验报告
课程管理系统
计算机科学与工程学院
14060307班
董永博14060307102
陈佳兴14060307101
田晨光14060307113
赵炳舒14060307121
欧静14060307126
题目·······································----------------------------------------------------------------3
分析过程与思路·····························-------------------------------------------------3
算法·······································----------------------------------------------------------------5
函数模块介绍·······························----------------------------------------------------9
源程序·····································-------------------------------------------------------------10
运行结果···································----------------------------------------------------------36
课程设计总结·······························----------------------------------------------------42
一.题目
课程管理系统
二.分析过程与思路
课程管理系统首先要能够分别实现课程信息的增加、删除、查询、修改。
为了增加程序的实用性,应当能够将输入的课程信息通过存文件的方式将课程信息存入硬盘。
而使用系统的可能是学生和管理员两类,因此要实现根据登录类型来开放应有的功能。
由于课程信息包含很多成员,例如课程编码、课程名等。
因此应该用链表对信息进行记录,由于不清楚课程总数,因此需要用动态链表。
动态链表的使用需要声明合适的结构体,数据域中应包含课程所包含的各个成员、指针域用来指向下一个结点。
动态链表的建立需要用到malloc函数。
对已经建立的链表需要存入文件,需要用到fwrite、fread、feof等文件处理函数,保存文件要多次用到,因此应该独立做一个函数。
删除函数要用到诸如free函数,为了防止删除的结点为首结点,删除后找不到头结点,因此删除函数应该是一个指针函数,用以返回删除后的新的头结点。
登录函数要返回一个值用以在其他函数中判断登录类型,以便针对用户开放相应的功能。
程序功能结构示意图
三.算法
四.函数模块介绍
voidinpt();//输入函数:
用以输入一系列数据,在文件中没有课程信息数据或者需要全部更新时使用该函数模块。
voidserch();//查询函数,用以查询已经存储的课程信息。
并通过调用其他函数,来对课程信息进行一系列操作。
voidalter(intall,intb,lesson*head);//修改函数,用以小规模的修改已经存储的课程信息。
lesson*dele(intall,intb,lesson*head);//删除函数,用以删除一些已经失效了的课程信息。
通过返回新链表的头指针,以便对新链表进行一系列操作。
voidsave(intn,lesson*p);//保存函数,用以将已经建立的链表存入硬盘,便于随时使用。
voidoutput(structlesson*q2);//输出函数,用以将课程信息输出到屏幕上显示出来。
voidadd(intall,lesson*head);//添加,用以在原课程信息的基础上添加新的课程信息。
voidmainpage();//主界面函数
intkey();//登录函数,通过返回值来判断用户类型,以开放不同的功能。
五.源程序
#include
#include
#include
#definelensizeof(structlesson)
#defineprintprintf("输入数据有误,请重新输入!
\n");
intn,temp,o;
structlesson
{
charnum[5];//课程编码
charproj[10];//课程名
charcrdt[4];//学分
charhour[3];//学时
charterm[2];//学期
charweek[5];//周次
chardate[5];//周日期(周几)
charperiod[5];//节次
charroom[6];//教室
structlesson*next;//结构体指针
};
voidinpt();//输入函数
voidserch();//查询函数
voidalter(intall,intb,lesson*head);//修改函数
lesson*dele(intall,intb,lesson*head);//删除函数
voidsave(intn,lesson*p);//保存函数
voidoutput(structlesson*q2);//输出函数
voidadd(intall,lesson*head);//添加
voidmainpage();//主界面函数
intkey();//登录函数
intmain()//14060307113田晨光
{
o=key();//调用登录函数
mainpage();//调用主界面
return0;
}
voidmainpage()//主界面函数14060307101董永博
{
intm=1;
while(m==1)
{
printf("*******************************************\n");/
printf("*输入1增加课程*\n");
printf("*输入2查询课程*\n");
printf("*输入3退出程序*\n");
printf("*******************************************\n\n");
do
{
scanf("%d",&m);
if(m<1||m>3)print;//该循环体使用户输入选项代码并判断代码是否合理
}
while(m<1||m>3);
system("CLS");//清除屏幕内容
switch(m)//通过switch语句转向用户选择的功能函数
{
case1:
inpt();break;//调用输入函数
case2:
serch();break;//调用查询函数
case3:
exit(0);break;//退出
}
}
}
voidinpt()//输入函数14060307113田晨光
{
if(o==1)
{
system("CLS");//清屏
printf("没有权限,请联系管理员!
\n");
mainpage();
}
intk=1,z,x,i;
structlesson*head;//声明一个lesson类型的结构体指针,作为头指针。
structlesson*p1,*p2;//声明两个lesson类型的结构体指针,建造链表。
p1=p2=(structlesson*)malloc(len);//使两个结构体指针都指向第一个节点
n=0;//n用来从零开始记录当前为第几节点
while(k==1)//循环输入
{
n=n+1;//循环体每执行一次使n加1
printf("请输入课程编码(1-4位字符串例:
001)\n");//输入数据
do
{
scanf("%s",&p1->num);
if(strlen(p1->num)>4)print;
}
while(strlen(p1->num)>4);
printf("请输入课程名(1-10位字符串例:
math)\n");
do
{
scanf("%s",&p1->proj);
if(strlen(p1->proj)>10)print;
}
while(strlen(p1->proj)>10);
printf("请输入学分(两位实数,整数部分1位,小数部分1位,例:
1.5)\n");
do
{
x=0;
scanf("%s",&p1->crdt);
if(strlen(p1->crdt)>4)
{
print;
}
else
{
for(i=0;i<3;i++)
{
if((p1->crdt)[i]>57||(p1->crdt)[i]<45)
{
x=1;
print;
break;
}
}
}
}
while(strlen(p1->crdt)>4||x==1);
printf("请输入学时(两位整数例:
32)\n");
do
{
x=0;
scanf("%s",&p1->hour);
if(strlen(p1->hour)>3)
{
print;
}
else
{
for(i=0;i<2;i++)
{
if((p1->hour)[i]>57||(p1->hour)[i]<45)
{
x=1;
print;
break;
}
}
}
}
while(strlen(p1->hour)>3||x==1);
printf("请输入学期(以为整数例:
2)\n");
do
{
x=0;
scanf("%s",&p1->term);
if(strlen(p1->term)>2)
{
print;
}
else
{
for(i=0;i<1;i++)
{
if((p1->term)[i]>57||(p1->term)[i]<45)
{
x=1;
print;
break;
}
}
}
}
while(strlen(p1->term)>2||x==1);
printf("请输入周次(例1-17)\n");
do
{
scanf("%s",&p1->week);
if(strlen(p1->week)>5)print;
}
while(strlen(p1->week)>5);
printf("请输入日期(三位周日期例:
mon、sat)\n");
do
{
scanf("%s",&p1->date);
if(strlen(p1->date)>3)print;
}
while(strlen(p1->date)>3);
printf("请输入节次(例:
5-6)\n");
do
{
scanf("%s",&p1->period);
if(strlen(p1->period)>5)print;
}
while(strlen(p1->period)>5);
printf("请输入教室(例:
2-201)\n");
do
{
scanf("%s",&p1->room);
if(strlen(p1->room)>6)print;
}
while(strlen(p1->room)>6);
if(n==1)head=p1;//如果n=1,(即当前为第一个节点),就使head指向头结点,作为头指针。
system("CLS");//输入完毕,清屏
printf("*******************************************\n");//输出提示信息
printf("*输入1继续添加*\n");
printf("*输入2保存并退出*\n");
printf("*******************************************\n");
do
{
scanf("%d",&z);
if(z<1||z>2)print;//该循环体使用户输入选项代码并判断代码是否合理
}
while(z<1||z>2);
if(z==1)//如果用户选择继续添加,进入该分支
{
p1=(structlesson*)malloc(len);//利用malloc函数,开辟一个新节点
(p2->next)=p1;//令前一个结构体的next指针指向后一个节点,将两个结构体链接起来
p2=p1;//令另一个指针也指向下一个节点,便于下次使用
}
else//如果用户选择保存并退出选项,进入该分支。
{
(p2->next)=NULL;//令最后一个节点的next指针指向NULL;
break;//跳出循环
}
}
n=0-1;
save(n,head);//调用save函数,将已经建立的链表存入文件
mainpage();//返回主界面
}
voidsave(intm,lesson*p)//save函数,将数据保存到硬盘的文件中14060307126欧静
{
FILE*fp;//声明一个文件指针
lesson*p1=p;//声明一个结构体指针
fp=fopen("D:
\\data.txt","wb");//以写为目的打开D:
\\data.txt路径下的二进制文件
while(p->next!
=NULL)//当指针p指向的节点中的next指针不为空时(证明没有保存完毕),进入循环体
{
if(fwrite(p,len,1,fp)!
=1)printf("保存文件失败!
\n");//用fwrite函数的返回值来反映是否成功保存每一个节点
elseprintf("保存文件成功!
\n");
p=p1->next;//使结构体指针指向下一个节点;
p1=p;
}
if(p->next==NULL&&n==-1)
{
if(fwrite(p,len,1,fp)!
=1)printf("保存文件失败!
\n");//用fwrite函数的返回值来反映是否成功保存每一个节点
elseprintf("保存文件成功!
\n");
}
fclose(fp);//关闭文件
}
voidserch()//查询函数(包含节点的删除与修改)14060307102董永博
{
inti,k,m,j=1;//声明一些需要用到的变量
charp[10];//声明一个字符型数组,用以存放用户输入的需要查询的相关信息
structlesson*q1,*q2,*head=NULL;//声明读取链表所需要的三个结构体指针
FILE*fp;//声明一个文件指针
do
{
fp=fopen("D:
\\data.txt","rb");//以读取为目的打开D:
\\data.txt路径下的二进制文件
if(ferror(fp))clearerr(fp);//如果打开文件错误,立即清除错误后产生的标记,便于文件下次正常打开
if(fp==NULL)//如果文件指针指向NULL(代表该文件不存在)则进入该分支
{
printf("无法打开文件!
\n");
exit(0);
}
q1=q2=(structlesson*)malloc(len);//文件打开后,在内存中开辟空间,存放文件读取到的数据
fread(q1,len,1,fp);//读取第一个节点
if(feof(fp))//用feof函数的返回值来判断该文件是否为空文件
{
printf("没有存储课程信息!
\n");
mainpage();
}
q2=q1;//两个指针同时指向第一个节点
m=0;//将m清零,便于接下来记录节点总数
while(!
feof(fp))//利用feof函数的返回值来判断文件是否读取完毕
{
m=m+1;//记录节点数
if(m==1)head=q1;//如果为第一个节点,使head指针指向该节点
q1=(structlesson*)malloc(len);//继续开辟下一个节点
q2->next=q1;//将新节点与上一个节点链接起来
q2=q1;
fread(q1,len,1,fp);//读取文件内容,存入新节点
}
q2->next=NULL;//文件读取完毕后,令链表的最后一个节点的next指针指向NULL
q1=q2=head;//两个结构体指针重新指向头结点
printf("*******************************************\n");//输出提示信息
printf("*输入0查看全部课程*\n");
printf("*输入1按课程名查询*\n");
printf("*输入2按课程编码查询*\n");
printf("*输入3按周日期查询*\n");
printf("*输入4按起始周查询*\n");
printf("*输入5返回主界面*\n");
printf("*******************************************\n\n");
do
{
scanf("%d",&k);
if(k<0||k>5)print;
}
while(k<0||k>5);
switch(k)
{
case0:
//当用户选择查看全部课程信息时,进入该分支
{
printf("课程编码课程名学分学时学期周次日期节次教室\n");
for(i=1;i<=m;i++)//用for循环,通过已知的节点总数来控制输出全部的课程信息
{
output(q2);//调用输出函数
q1=q2->next;//指针指向下一个结点
q2=q1;
}
q2->next=NULL;
break;
}
case1:
//当用户选择按课程名查询时,进入该分支
{
printf("请输入课程名!
(1-10位字符串例:
math)\n");
do
{
scanf("%s",&p);
if(strlen(q1->proj)>10)print;
}
while(strlen(q1->proj)>10);//输入要查询的课程名
temp=0;//将temp归零,便于记录所查询到的节点为第几节点,便于下面修改函数和删除函数的查找
do
{
if(!
strcmp(q2->proj,p))//通过字符串比较来查找需要查找的信息
{
temp=temp+1;//记录节点数
printf("查询到%s相关的课程信息为:
\n\n",p);
printf("课程编码课程名学分学时学期周次日期节次教室\n");
output(q2);//调用输出函数
break;//跳出循环
}
else//如果内容与用户输入字符串不相等,查找下一个节点
{
j=j+1;
q1=q2->next;
q2=q1;
}
}
while(q2->next!
=NULL);
if(temp==0)printf("未查询到相关课程!
\n");//如果temp等于零,则代表没有查询到相关信息
else
{
printf("*******************************************\n");//如果查询到相关课程
printf("*输入0修改课程信息*\n");
printf("*输入1删除课程信息*\n");
printf("*输入2添加课程信息*\n");
printf("*******************************************\n");
do
{
scanf("%d",&k);
if(k<0||k>2)print;
}
while(k<0||k>2);
if(o==1)printf("对不起,您没有权限!
请联系管理员!
\n");//如果学生登录,由于key函数返回值为1,就不开放删除修改功能
else//如果是管理员登录,则可以使用删除,修改,添加等功能
{
switch(k)//通过管理员的选择代码,分别调用不同的函数
{
case0:
alter(m,j,head);break;//调用修改函数,将查询到的课程的位置,链表的总节点数。
链表的头指针传给函数
case1:
head=dele(m,j,head);break;//调用删除函数,将返回的指针作为下一次打开的头指针
case2:
add(m,head);break;//调用添加函数,在链表的后面继续添加
}
}
}
break;
}
case2:
{
printf("请输入课程编码(1-4位字符串例:
001)\n");//输入数据
do
{
scanf("%s",&p);
if(strlen(q1->num)>4)print;
}
while(strlen(q1->num)>4);
temp=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 课程 管理 系统 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)