C语言课程设计课程管理系统实验报告.docx

上传人:b****7 文档编号:9920108 上传时间:2023-02-07 格式:DOCX 页数:52 大小:284.23KB
下载 相关 举报
C语言课程设计课程管理系统实验报告.docx_第1页
第1页 / 共52页
C语言课程设计课程管理系统实验报告.docx_第2页
第2页 / 共52页
C语言课程设计课程管理系统实验报告.docx_第3页
第3页 / 共52页
C语言课程设计课程管理系统实验报告.docx_第4页
第4页 / 共52页
C语言课程设计课程管理系统实验报告.docx_第5页
第5页 / 共52页
点击查看更多>>
下载资源
资源描述

C语言课程设计课程管理系统实验报告.docx

《C语言课程设计课程管理系统实验报告.docx》由会员分享,可在线阅读,更多相关《C语言课程设计课程管理系统实验报告.docx(52页珍藏版)》请在冰豆网上搜索。

C语言课程设计课程管理系统实验报告.docx

C语言课程设计课程管理系统实验报告

课程设计实验报告

课程管理系统

计算机科学与工程学院

14060307班

董永博

14060307102

陈佳兴

14060307101

田晨光

14060307113

赵炳舒

14060307121

欧静

14060307126

题目•3

分析过程与思路・3

算法•5

函数模块介绍•9

源程序…10

运行结果••36

课程设计总结•42

题目

课程管理系统

分析过程与思路

课程管理系统首先要能够分别实现课程信息的增加、删除、查询、修改。

为了增加程序的实用性,应当能够将输入的课程信息通过存文件的方式将课程信息存入硬盘。

而使用系统的可能是学生和管理员两类,因此要实现根据登录类型来开放应有的功能。

由于课程信息包含很多成员,例如课程编码、课程名等。

因此应该用链表对信息进行记录,由于不清楚课程总数,因此需要用动态链表。

动态链表的使用需要声明合适的结构体,数据域中应包含课程所包含的各个成员、指针域用来指向下一个结点。

动态链表的建立需要用到malloc函数。

对已经建立的链表需要存入文件,需要用到fwrite、fread、feof等文件处理函数,保存文件要多次用到,因此应该独立做一个函数。

删除函数要用到诸如free函数,为了防止删除的结点为首结点,删除后找不到头结点,因此删除函数应该是一个指针函数,用以返回删除后的新的头结点。

登录函数要返回一个值用以在其他函数中判断登录类型,以便针对用户开放相应的功能。

f课程管理系统

^录

key

学牛登录

管理员登陆

mainpage()

mainpage()

Lj

J丿

<

J

查询

serch()

J

’查询、

serch()

L-J

输入inpt()

f

-

-'%

添加

修改

删除

add()

alter()

dele()

J

3

程序功能结构示意图

 

三.算法

开始

-Hkey函数简单算法

Y

1

学生登录管理员登录

mainpage()

1

f

 

4.函数模块介绍

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();〃登录函数,通过返回值来判断用户类型,以开放不同的功能。

5.源程序

#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("*

printf("*

输入1继续添加

输入2保存并退出

*\n");

*\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*卩仁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;//使结构体指针指向下一个节点;

P仁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(O);

}

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);〃调用输出函数

q仁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('

*******************************************

{

do{

scanf("%d",&k);if(k<0||k>2)print;

}while(k<0||k>2);

if(o==1)printf("对不起,您没有权限!

请联系管理员!

\n");〃如果学生登录,由于key函数返回值为1,就不开放删除修改功能else/如果是管理员登录,贝U可以使用删除,修改,添加等功能

{

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=0;

do

{if(!

strcmp(q2->num,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");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");

else

{

switch(k)

{

case0:

alter(m,j,head);break;

case1:

head=dele(m,j,head);break;

case2:

add(m,head);break;

}

}

}

break;

}

case3:

{

printf("请输入周日期!

(三位周日期例:

mon、sat)\n");do

{

scanf("%s",&p);

if(strlen(q1->date)>3)print;

}

while(strlen(q1->date)>3);

temp=0;

do

{

if(!

strcmp(q2->date,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\n");else

printf("*

输入

*\n");

printf("*

输入

*\n");

printf("*

输入

*\n");

prin

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1