您好,欢迎来到小侦探旅游网。
搜索
您的当前位置:首页C语言课程设计课程管理系统实验报告

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

来源:小侦探旅游网


课程设计实验报告

课程管理系统

计算机科学与工程学院

14060307班

董永博

14060307102

14060307101 14060307113 14060307121

陈佳兴 田晨光 赵炳舒

欧静

14060307126

目录

题目• ---------------------------------------- 3 分析过程与思路・ ------------------------------- 3 算法• ---------------------------------------- 5 函数模块介绍• --------------------------------- 9 源程序… -------------------------------------- 10 运行结果• • ---------------------------------- 36 课程设计总结• -------------------------------- 42

题目 课程管理系统 分析过程与思路

课程管理系统首先要能够分别实现课程信息的增加、删除、 查询、修改。为了增加程序的实用性,应当能够将输入的课程 信息通过存文件的方式将课程信息存入硬盘。而使用系统的可 能是学生和管理员两类,因此要实现根据登录类型来开放应有 的功能。

由于课程信息包含很多成员,例如课程编码、课程名等。 因此应该用链表对信息进行记录,由于不清楚课程总数,因此 需要用动态链表。动态链表的使用需要声明合适的结构体,数 据域中应包含课程所包含的各个成员、指针域用来指向下一个 结点。动态链表的建立需要用到 malloc函数。

对已经建立的链表需要存入文件,需要用到 fwrite、fread、

feof等文件处理函数,保存文件要多次用到,因此应该做一 个函

数。

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

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

f课程管理系统

^录 key

学牛登录 main page() 管理员登陆 main page() L < J J’ 查询 serch() 查询 输入 in pt() J J f 、 serch() - -'% 厂 添加 add() 修改 alter() 删除 dele() J 3 程序功能结构示意图

三.算法

开始 -----------------

-H ----------- key函数简单算法

Y

1

学生登录

管理员登录

main page() f 1 ①

四. 函数模块介绍

void inpt();〃输入函数:用以输入一系列数据,在文件中

没有课程信息数据或者需要全部更新时使用该函数模块。

void serch();〃查询函数,用以查询已经存储的课程信息。

并通过调用其他函数,来对课程信息进行一系列操作。

void alter(int all,int b,lesson *head);〃修改函数,用以小规

模的修改已经存储的课程信息。

lesson *dele(int all,int b,lesson *head);/删除函数,用以删

除一些已经失效了的课程信息。 通过返回新链表的头指针,以 便对新链表进行一系列操作。

void save(int n,lesson *p);〃保存函数,用以将已经建立的

链表存入硬盘,便于随时使用。

void output(struct lesson *q2);〃输出函数,用以将课程信

息输出到屏幕上显示出来。

void add(int all,lesson *head);〃添加,用以在原课程信息

的基础上添加新的课程信息。

void main page();〃主界面函数

int key();〃登录函数,通过返回值来判断用户类型,以 开放

不同的功能。

五. 源程序

#i nclude #i nclude #i nclude

#defi ne len sizeof(struct less on)

#define print printf(\"输入数据有误,请重新输入! \\n\"); int n,temp,o; struct less on {

char num [ 5];// 课程编码 char proj[10];〃 课程名

char crdt[4];〃 学分 char hour[3];〃 学时 char term[2];〃 学期 char week[5];〃 周次

char date[5];〃周日期(周几) char period[5];〃 节次

char room[6];// 教室 struct lesson *n ext;//结构体指针

};

void in pt();〃输入函数 void serch();〃 查询函数

void alter(int all,int b,lesson *head);//修改函数 lesson *dele(i nt all,i nt b,lesson *head);//删除函数 void save(i nt n,lesson *p);〃保存函数 void output(struct lesson *q2);//输出函数 void add(i nt all,lesso n *head);//添 加 void mai npage();〃主界面函数 int key();//登录函数 int ma in ()//14060307113 田晨光 {

o=key();//调用登录函数 ma in page();//调用主界面 return 0; }

void mai npage()〃主界面函数 14060307101 董永博 {

int m=1; while(m==1)

{

prin tf(\"*******************************************\\n\")・/

输入1增加课程 prin tf(\"*

输入2查询课程 prin tf(\"*

输入3退出程序 prin tf(\"*

prin tf(\"*******************************************\\n\\n\")・ do

*\\n\"); *\\n\"); *\\n\");

{

scan f(\"%d\

if(m<1||m>3) print;//该循环体使用户输入选项代码并判断代 码

是否合理

}

while(m<1||m>3);

system(\"CLS\");〃清除屏幕内容

switch(m)//通过switch语句转向用户选择的功能函数

{

case 1:i npt();break;/调用输入函数 case 2:serch();break;调用查询函数

case 3:exit(0);break;/退出 } }

}

void in pt()// 输入函数 14060307113 田晨光 {

if(o==1) {

system(\"CLS\");〃 清屏

printf(\"没有权限,请联系管理员!\\n\"); main page();

}

int k=1, z, x,i;

struct lesson *head;/声明一个lesson类型的结构体指针,作为头指针。 struct lesson *p1,*p2;〃声明两个lesson类型的结构体指针,建造链表。 p1=p2=(struct lesson *)malloc(le n);〃使两个结构体指针都指向第一个 节点

n=0;//n用来从零开始记录当前为第几节点 while(k==1)〃循环输入

{

n=n+1;//循环体每执行一次使n加1

printf(\"请输入课程编码(1-4位字符串 例:001)\\n\");//输入数据 do {

scan f(\"%s\}

while(strle n( p1-> nu m)>4);

printf(\"请输入课程名(1-10位字符串 例:math) \\n\"); do {

scan f(\"%s\

}

while(strle n(p1->proj)>10);

printf(\"请输入学分(两位实数,整数部分1位,小数部分1位,

例:1.5)\\n\");

do

{

x=0;

scan f(\"%s\if(strle n(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(strle n( p1->crdt)>4||x==1); printf(\"请输入学时(两位整数例:32)\\n\"); do {

x=0;

scan f(\"%s\if(strle n( 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(strle n(p1->hour)>3||x==1);

printf(\"请输入学期(以为整数 例:2) \\n\"); do {

x=0;

scan f(\"%s\if(strle n( 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(strle n( p1->term)>2||x==1); printf(\"请输入周次(例 1-17) \\n\"); do {

scan f(\"%s\}

while(strle n(p1->week)>5);

printf(\"请输入日期(三位周日期 例:mon、sat)\\n\"); do {

scan f(\"%s\}

while(strle n( p1->date)>3);

printf(\"请输入节次(例:5-6)\\n\"); do {

scan f(\"%s\if(strle n( p1->period)>5) print;

while(strle n( p1->period)>5);

printf(\"请输入教室(例:2-201) \\n\"); do {

scan f(\"%s\

}

while(strle n( p1->room)>6);

if(n==1) head=p1;〃如果n=1,(即当前为第一个节点),就使head 指

向头结点,作为头指针。

system(\"CLS\");〃输入完毕,清屏

\\ ***************************************** **\\n\");// printf(\"

输出提示信息

prin tf(\"* 输入1继续添加 *\\n\"); prin *\\n\"); 输入2保存并退出 tf(\"* \\ ***************************************** **\\n\"); printf(\" do {

scan f(\"%d\

if(z<1||z>2) print;//该循环体使用户输入选项代码并判断代码 是否合理

}

while(z<1||z>2);

if(z==1)//如果用户选择继续添加,进入该分支

{ p1=(struct lesson *)malloc(len);// 利用 malloc 函数,开辟一个 新

节点

(p2->next)=p1;〃令前一个结构体的 next指针指向后一个节

点,将两个结构体链接起来

p2=p1;〃令另一个指针也指向下一个节点,便于下次使用

}

else//如果用户选择保存并退出选项,进入该分支。 {

(p2->next)=NULL;〃令最后一个节点的next指针指向NULL; break;//跳出循环 }

}

n=0-1;

save(n,head);/调用save函数,将已经建立的链表存入文件 main page();//返 回主界面 }

void save(int m,lesson *p)//save函数,将数据保存到硬盘的文件中 14060307126 欧静 {

FILE *fp;〃声明一个文件指针 lesson *卩仁p;//声明一个结构体指针

fp=fopen(\"D:\\\\data.txt\〃 以写为目的打开 D:\\\\data.txt 路径下的

二进制文件

while(p->next!=NULL)〃当指针p指向的节点中的next指针不为空时 (证明没有保存完毕),进入循环体

{

if(fwrite(p,len,1,fp)!=1) printf(\"保存文件失败! \\n\");//用 fwrite 函数

的返回值来反映是否成功保存每一个节点

else prin tf(\"保存文件成功! \\n\");

p=p1-> next;//使结构体指针指向下一个节点; P仁p;

}

if(p->n ext==NULL&&n==-1) {

if(fwrite(p,len,1,fp)!=1) printf(\"保存文件失败! \\n\");//用 fwrite 函数

的返回值来反映是否成功保存每一个节点

else prin tf(\"保存文件成功! \\n\");

}

fclose(fp);// 关闭文件

} void serch()〃查询函数(包含节点的删除与修改)14060307102董永博 { int i,k,m,j=1;〃声明一些需要用到的变量

char p[10];〃声明一个字符型数组,用以存放用户输入的需要查询的 相关信息

struct lesson *q1,*q2,*head=NULL;〃声明读取链表所需要的三个结构 体指针

FILE *fp;//声明一个文件指针 do

{

fp=fopen(\"D:\\\\data.txt\以读取为目的打开 D:\\\\data.txt 路径

下的二进制文件

if(ferror(fp)) clearerr(fp);//如果打开文件错误,立即清除错误后产

生的标记,便于文件下次正常打开

if(fp==NULL)//如果文件指针指向 NULL (代表该文件不存在) 则进

入该分支

printf(\"无法打开文件! \\n\"); exit(O);

}

q1=q2=(struct lesson *)malloc(len);〃文件打开后,在内存中开辟空

间,存放文件读取到的数据

fread(q1,le n,1,fp);〃 读取第一个节点

if(feof(fp))〃用feof函数的返回值来判断该文件是否为空文件 {

printf(\"没有存储课程信息! \\n\");

main page();

}

q2=q1;//两个指针同时指向第一个节点 m=0;〃将m清零,便于接下来记录节点总数

while(!feof(fp))〃利用feof函数的返回值来判断文件是否读取完 毕 {

m=m+1;//记录节点数

if(m==1) head=q1;/如果为第一个节点,使 head指针指向

该节点

q1=(struct lesson *)malloc(le n);〃 继续开辟下一个节点 q2-> next=q1;〃将新节点与上一个节点链接起来 q2=q1;

fread(q1,le n,1,fp);〃读取文件内容,存入新节点 }

q2->next=NULL;〃文件读取完毕后,令链表的最后一个节点

的next指针指向NULL

q1=q2=head;〃两个结构体指针重新指向头结点

prin tf(\"*******************************************\\n\" )・//

输出提示信息

输入0查看全部课程 prin tf(\"*

输入1按课程名查询 prin tf(\"*

输入2按课程编码查询 prin tf(\"*

输入3按周日期查询 prin tf(\"*

输入4按起始周查询 prin tf(\"*

输入5返回主界面 prin tf(\"*

prin tf(\"*******************************************\\n\\n\")・ do

*\\n\"); *\\n\"); *\\n\"); *\\n\"); *\\n\"); *\\n\");

{

scan f(\"%d\}

while(k<0||k>5); switch(k)

{

case 0://当用户选择查看全部课程信息时,进入该分支

printf(\"课程编码课程名 学分学时学期周次日期 节次教室

\\n\");

for(i=1;i<=m;i++)〃用for循环,通过已知的节点总数来控

制输出全部的课程信息

{

output(q2);〃调用输出函数

q仁q2-> next;//指针指向下一个结点 q2=q1;

}

q2-> next=NULL; break;

} case 1://当用户选择按课程名查询时,进入该分支 {

printf(\"请输入课程名! ( 1-10位字符串 例:math) \\n\"); do {

scan f(\"%s\

if(strle n( q1->proj)>10) print;

} while(strle n(q1->proj)>10);〃 输入要查询的课程名

temp=0;〃将temp归零,便于记录所查询到的节点为第几 节点,便于下面修改函数和删除函数的查找

do

{

if(!strcmp(q2->proj,p))〃通过字符串比较来查找需要 查

找的信息

{ temp=temp+1;〃记录节点数 printf(\"查询到%s相关的

课程信息为:\\n\\n\课程编码课程名 学分学时学期周 次日期节次教室\\n\");

output(q2);//调用输出函数 break;//跳出循环

}

else//如果内容与用户输入字符串不相等,查找下一 个节

{

j=j+1;

q1=q2->n ext; q2=q1; }

while(q2-> next!=NULL);

if(temp==0) printf(\"未查询到相关课程! \\n\");〃如果temp

等于零,则代表没有查询到相关信息

else {

******************************************* *\\n\");printf(' 如果

〃 查询到相关课程

prin tf(\"* 输入 0修改课程信息

*\\n\");

prin tf(\"*

输入 1删除课程信息 输入 2添加课程信息

*\\n\");

prin tf(\"*

*\\n\");

******************************************* printf('

do {

scan f(\"%d\

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

if(o==1) printf(\"对不起,您没有权限!请联系管理员!

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

{

switch(k)//通过管理员的选择代码,分别调用不 同

的函数

{

case 0:alter(m,j,head);break;调用修改函数,将查

询到的课程的位置,链表的总节点数。链表的头指针传给函数

case 1:head=dele(m,j,head);break;/调 用删除函

数,将返回的指针作为下一次打开的头指针

case 2:add(m,head);break;调用添加函数,在链表

的后面继续添加

} } }

break;

} case 2:

printf(\"请输入课程编码(1-4位字符串 例:001) \\n\");//

输入数据

do {

scan f(\"%s\} while(strle n(q1- >nu m)>4); temp=0; do

{ if(!strcmp(q2->nu m,p)) {

temp=temp+1;

printf(\"查询到编码为%s的课程信息为:\\n\\n\

printf(\"课程编码课程名 学分学时学期周 次日期节次教室\\n\");

output(q2); break; } else {

j=j+1;

q1=q2->n ext; q2=q1; }

}

while(q2-> next!=NULL); if(temp==0) printf(\"未查询到相关课程! \\n\"); else {

prin tf(\"*******************************************\\n\")・

输入0修改课程信息 prin tf(\"*

输入1删除课程信息 prin tf(\"*

输入2添加课程信息 prin tf(\"*

prin tf(\"*******************************************\\n\")・

do

{

scan f(\"%d\

*\\n\"); *\\n\"); *\\n\");

}

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

if(o==1) printf(\"对不起,您没有权限!请联系管理员!

\\n\");

else {

switch(k)

{

case 0:alter(m,j,head);break;

case 1:head=dele(m,j,head);break; case 2:add(m,head);break; }

} }

break; } case 3: {

次教室\\n\");

printf(\"请输入周日期!(三位周日期 例:mon、sat) \\n\"); do {

scan f(\"%s\

if(strle n( q1->date)>3) print; }

while(strle n(q1->date)>3); temp=0; do {

if(!strcmp(q2->date,p)) {

temp=temp+1;

printf(\"查询到%s的课程信息为:\\n\\n\printf(\"课程编码课程名 学分学时学期周 次日期节

output(q2); break; } else {

j=j+1;

q1=q2->n ext; q2=q1; }

}

while(q2-> next!=NULL);

if(temp==0) printf(\"未查询到相关课程! \\n\\n\"); else

******************************************* printf(\"

prin tf(\"*

输入 0修改课程信息 输入 1删除课程信息

*\\n\");

prin tf(\"*

*\\n\");

prin tf(\"*

输入 2添加课程信息

*\\n\");

******************************************* printf(\"

\\n\");

} case 4:

{

do {

scan f(\"%d\

if(k<0||k>2) pri nt;

}

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

if(o==1) printf(\"对不起,您没有权限!请联系管理员!

else {

switch(k)

{

case 0:alter(m,j,head);break;

case 1:head=dele(m,j,head);break; case 2:add(m,head);break; } } }

break;

printf(\"请输入起始周(例1-17)! \\n\"); do {

scan f(\"%s\

if(strle n( q1->week)>5) print; }

while(strle n( q1->week)>5); temp=0; do {

if(!strcmp(q2->week,p))

temp=temp+1;

printf(\"查询到%s周的课程信息为:\\n\\n\printf(\"课程编码课程名 学分学时学期周 次日期节

次教室\\n\");

output(q2); break; } else {

j=j+1;

q1=q2->n ext; q2=q1; }

}

while(q2-> next!=NULL); if(temp==0) printf(\"未查询到相关课程! \\n\"); else {

******************************************* printf('

prin tf(\"*

*\\n\");

prin tf(\"*

*\\n\");

prin tf(\"*

*\\n\");

输入 0修改课程信息 输入 1删除课程信息 输入 2添加课程信息

******************************************* printf('

do {

scan f(\"%d\

}

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

if(o==1) printf(\"对不起,您没有权限!请联系管理员!

\\n\");

else {

switch(k)

{

case 0:alter(m,j,head);break;

case 1:head=dele(m,j,head);break; case 2:add(m,head);break; }

}

} break;

}

case 5:ma in page();break;返 回主界面

}

prin tf(\"*******************************************\\n\")・

printf(\"* 输入0终止查询并返回主界面

*\\n\");

printf(\"*

输入1重新查询

*\\n\");

prin tf(\"*******************************************\\n\"); scan f(\"%d\

} while(j);

if(j==0) main page(); } void alter(i nt all,i nt b,lesson *head)// 修改课程

函数 14060307121 赵炳舒 {

lesson *q1,*q2; int k,i,x;

q1=q2=head;

for(i=2;i<=b;i++)〃移动指针q1,q2到需要修改的结点 {

q1=q2->n ext; q2=q1;

}

printf(\"您要修改的课程为:\\n\");

printf(\"课程编码 课程名学分学时学期周次 \\n\");

日期节次 教室

output(q2);

prin tf(\"*******************************************\\n\" )・// 提示信息

输出

prin tf(\"* prin tf(\"* prin tf(\"* prin tf(\"* prin tf(\"* prin tf(\"* prin tf(\"* prin tf(\"*

输入0修改课程编码 输入1修改课程名 输入2修改学分 输入3修改学时 输入4修改学期 输入5修改周次 输入6修改日期 输入7修改节次

*\\n\"); *\\n\"); *\\n\");

*\\n\"); *\\n\"); *\\n\"); *\\n\"); *\\n\");

输入8修改教室 printf(\"*

******************************************* *\\n\\n\"); printf(' do {

sea nf(\"%d\}

while(k<0||k>8); switch(k) *\\n\");

{

case 0:

{

} case 1:

{

printf(\"您要修改的原编码为%s\\n\〃提示修改的内

printf(\"请输入新编码(1-4位字符串 例:001): \\n\"); do {

sca nf(\"%s\} while(strle n(q1-> nu m)>4); printf(\"修改成功,结果为:\\n\"); printf(\"课程编码课程名学分学时学期周次日期节次 教室\\n\"); output(q1);〃输出修改后本结点内所有数据 save (all,head);/保 存修改 break;//跳 出

printf(\"您要修改的原课程名为%s\\n\

printf(\"请输入新课程名(1-10位字符串 例:math): \\n\"); do {

sca nf(\"%s\} while(strle n(q1->proj)>10); printf(\"修改成功,结果为:\\n\");

printf(\"课程编码课程名学分学时学期周次日期节次 教室\\n\"); output(q1); save(all,head); break;

}

case 2: {

printf(\"您要修改的原学分为%f\\n\printf(\"请输入新学分:\\n\"); do {

教室\\n\");

} case 3: {

x=0;

sca nf(\"%s\if(strle n(q1->crdt)>4) {

print; } else {

for(i=0;i<3;i++) {

if((q1->crdt)[i]>57||(q1->crdt)[i]<45) {

x=1; print; break; } } }

}

while(strle n( q1->crdt)>4||x==1); printf(\"修改成功,结果为:\\n\");

printf(\"课程编码课程名学分学时学期周次日期节次output(q1); save(all,head); break;

printf(\"您要修改的原学时为%d\\n\printf(\"请输入新学时(两位整数 例:32): \\n\"); do {

x=0;

sca nf(\"%s\if(strle n(q1->hour)>3)

print; } else {

for(i=0;i<2;i++) {

if((q1->hour)[i]>57||(q1->hour)[i]<45) {

x=1; print; break; } } }

}

while(strle n(q1->hour)>3||x==1); printf(\"修改成功,结果为:\\n\");

printf(\"课程编码课程名学分学时学期周次日期节次

教室\\n\");

output(q1); save(all,head); break;

printf(\"您要修改的原学期为%d\\n\请输入新学}

例:2): \\n\"); case 4: 期(一位整数

do {

{

x=0;

sca nf(\"%s\

if(strle n(q1->term)>2) {

print; } else {

for(i=0;i<1;i++) {

if((q1->term)[i]>57||(q1->term)[i]<45) {

x=1; print; break;

} }

}

while(strle n( q1->term)>2||x==1); printf(\"修改成功,结果为:\\n\");

printf(\"课程编码课程名学分学时学期周次日期节次

教室\\n\");

output(q1); save(all,head); break;

} case 5: {

printf(\"您要修改的原周次为%s\\n\printf(\"请输入新周次:\\n\"); do {

sca nf(\"%s\if(strle n( q1->week)>5) print; }

while(strle n( q1->week)>5); printf(\"修改成功,结果为:\\n\");

printf(\"课程编码课程名学分学时学期周次日期节次

教室\\n\");

output(q1); save(all,head); break;} printf(\"您要修改的原日期为 %s\\n\请输入新case 6: 日期:\\n\"); { do

{

sca nf(\"%s\

if(strle n( q1->date)>3) print;

}

while(strle n(q1->date)>3); printf(\"修改成功,结果为:\\n\");

printf(\"课程编码课程名学分学时学期周次日期节次

教室\\n\");

output(q1);

save(all,head);

break;

}

case 7: {

printf(\"您要修改的原节次为%s\\n\printf(\"请输入新节次:\\n\"); do {

sca nf(\"%s\if(strle n( q1->period)>5) print; }

while(strle n( q1->period)>5); printf(\"修改成功,结果为:\\n\");

printf(\"课程编码课程名学分学时学期周次

教室\\n\");

output(ql);

save(all,head); break;

} case 8: {

printf(\"您要修改的原教室为%s\\n\printf(\"请输入新教室:\\n\"); do {

sca nf(\"%s\n( q1->room)>6) print;

}

while(strle n( q1->room)>6); printf(\"修改成功,结果为:\\n\");

printf(\"课程编码课程名学分学时学期

教室\\n\");

output(q1); save(all,head); break;

日期 节次

周次 日期 节次

}

}

i*******************************************\\n\")・printf('

选项信息 // prin tf(\"* 输入1继续查询课程 printf(\"* 输入2返回主界面

printf(' i*******************************************\\n\\n\"); do

提示 *\\n\"); *\\n\");

sea nf(\"%d\

}

while(k<1||k>2); switch(k) {

case 1:serch();break;返回查询函数 case 2:ma in page();break;返 回主界面 } } lesson *dele(i nt all,i nt b,lesson *head)//删除函数 14060307126 欧静 {

int i,k;

lesson *q1,*q2,*q3; q1=q2=q3=head;

for(i=2;iq1=q2->n ext; q2=q1;

}

printf(\"您要删除的课程是:\\n\");

if(b==1)//如果要删除的结点是第一个节点, {

printf(\"课程编码课程名学分学时学期周次日期节次教 室 \\n\"); output(q1); } else {

q3=q1-> next;//如果要删除的结点不是第一个节点进入该分支 printf(\"课程编

码课程名学分学时学期周次日期节次教 室 \\n\");

output(q3);

}

******************************************* printf(' prin tf(\"* 输入0确认删除 prin 输入1取消删除 tf(\"* ******************************************* printf('

*\\n\");

*\\n\");

do {

sca nf(\"%d\

if(k<0||k>1) print;// 是否确认删除 }

while(k<0||k>1);

if(!k)〃如果确认删除,则进入 {

if(b==1) {

head=q1-> next;/如果要删除第一个节点

q1->next=NULL;〃令第一个节点的next指针指向NULL all=all-1;//使节

点总数减少一个

free(q1);〃释放第一个节点所占的内存

save (al l,head);/向 save函数提供新的头指针,以便保存新链 表 }

else//如果要删除的不是头结点 {

q3=q1->next;//令q3指向要删除的结点

q1=q3->next;//令q1指向要删除节点的后一个节点 q2->next=q1;〃令前一个结点的next指针指向后一个结点 q3->next=NULL;〃令要删除的结点的next指针指向NULL all=all-1;//令节点总数减少一个 free(q3);〃释放内存 save (all,head);/保存新链表 }

}

return(head);//返回新的头指针

} void add(i nt all,lesson *head)//添 加函数 14060307101 陈佳兴 {

int i,z,x;

lesson *q1,*q2; q1=q2=head;

for(i=2;iv=all;i++)〃令q1,q2都移到最后一个节点 {

q1=q2->n ext; q2=q1;

}

q仁(struct lesson *)malloc(le n);〃开辟新的内存空间,来存放新数据 q2-> next=q1;〃将新节点连接到原来的最后一个节点上 q2=q1;

n=0;//使 n归零,以便于记录新增的结点数 do

n=n+1;//记录新增节点数

printf(\"请输入课程编码(1-4位字符串 例:001) \\n\");〃输入数 据 do {

scan f(\"%s\if(strle n( q1- >num)>4) print;

}

while(strle n(q1- >nu m)>4);

printf(\"请输入课程名(1-10位字符串 例:math) \\n\"); do {

scan f(\"%s\

if(strle n( q1->proj)>10) print;

}

while(strle n(q1->proj)>10);

printf(\"请输入学分(两位实数,整数部分1位,小数部分1位, 例:1.5)\\n\"); do {

x=0;

scan f(\"%s\if(strle n(q1->crdt)>4) {

print; } else {

for(i=0;i<3;i++) {

if((q1->crdt)[i]>57||(q1->crdt)[i]<45) {

x=1; print; break; } } }

}

while(strle n( q1->crdt)>4||x==1);

printf(\"请输入学时(两位整数例:32)\\n\"); do

scan f(\"%s\if(strle n(q1->hour)>3) {

print; } else {

for(i=0;i<2;i++)

{ if((q1->hour)[i]>57||(q1->hour)[i]<45) {

x=1;

print; break;

} } }

}

while(strle n(q1->hour)>3||x==1);

printf(\"请输入学期(以为整数 例:2) \\n\");

do {

x=0;

scan f(\"%s\if(strle n(q1->term)>2) {

print; } else {

for(i=0;i<1;i++)

{ if((q1->term)[i]>57||(q1->term)[i]<45) {

x=1;

print; break;

} } }

}

while(strle n( q1->term)>2||x==1); printf(\"请输入周次(例 1-17) \\n\");

do {

scan f(\"%s\}

while(strle n(q1->week)>5);

printf(\"请输入日期(三位周日期 例:mon、sat) \\n\"); do {

scan f(\"%s\}

while(strle n(q1->date)>3); printf(\"请输入节次(例:5-6)\\n\"); do {

scan f(\"%s\}

while(strle n(q1->period)>5);

printf(\"请输入教室(例:2-201)\\n\"); do {

scan f(\"%s\if(strle n( q1->room)>6) print; }

while(strle n(q1->room)>6);

\\ ***************************************** **\\n\"); printf(\"

输入1继续添加 prin tf(\"*

输出提示信息

printf(\"* 输入2保存并退出

******************************************* printf('

do {

scan f(\"%d\

*\\n\");〃 *\\n\");

} while(z<1||z>2);

if(z==1)〃如果选择继续添加 {

q1=(struct lesson *)malloc(le n);〃开辟新空间 (q2-> next)=q1;〃指针指向新结点 q2=q1;

}

else//如果选择停止添加,并保存 {

(q2->next)=NULL;〃令尾结点的next指针指向NULL break;//跳出 }

}

while(1);

n=n+all;//得到新链表的节点总数 save( n,head);/传参,保存

} void output(lesson *q2)〃输出函数 14060307121 赵炳舒 {

prin tf(\"%8s %6s %4s %4s %4s %4s %4s %4s %4s\\n\oj,q2->crdt,q2->hour,q2->term,q2->week,q2->date,q2->period,q2->room); }

int key()//登录函数 14060307101陈佳兴 {

char str1[10]={'a','d','m','i','n'},str2[10];〃 声明两个字符串,并初始化其

中一个

int a,k;

******************************************* printf('

输入1学生登录 printf(\"*

输入2管理员登录 prin tf(\"*

****************************************** **\\n\"); printf(\"

do

{

scan f(\"%d\〃输入选项,并记录登录类型 if(a<1||a>2) pri nt; }

while(a<1||a>2); system(\"CLS\");

printf(\"请输入密码:\"); do {

scan f(\"%s\⑵;〃输入密码(即另一个字符串的内容)

if(strcmp(str1,str2)==0)//进行两个字符串的对比,利用函数返回 值确定两

个字符串是否相等,即密码是否正确

{

printf(\"登录成功! \\n\\n\"); k=0;

}

else

{

printf(\"输入密码错误,请重新输入\"); k=1;

*\\n\"); *\\n\");

}

}

while(k);

return(a);//返回登录类型代码,即学生登录或者管理员登录 }

六. 运行结果

首界面

管理员登录界面

学生登录选择增加时界面

添加课程

输入文件保存

查看所有输入课程

选择查询方式

H H N耳 耳 耳 N 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 耳 N n H - - 斥输入耐查看全部课程 锄入谖课程名查询 希入礙课程编码查询 喩入球周期査邕 输入4按起始,碍蓋茴 * * * * * - 朋 鲁输入课程名oath 3I 〔丄-仮位字符串例:爾曲 1 学分学时学期周次日期节次教室 Hath 2.0 24 3 1-15 5-6 3-111 •查询到呗讣相关的课程信息为: 课程编码课程名 了入2济加慄桓 输出查询结果

J果程编码课程名 GUI nath 2.0 学分学时学期周次日期节次教室 24 3 1-15 mon 5-6 3-111 血入2添剂谍檯信息 分学时学期周次日期节次教室 硕 math 2.0 0-1-2-3-4-5-6-78- A X24 3 1-15 non 5-6 3-111 入修改课黨翔码入修改遲分名・修改于,入修改周吋入修改日期入修改节次入修改教期修改次入修改室

修改课程信息

保存修改信息

删除课程信息

七. 课程设计总结

以往学习的课程知识虽然也有过一些实践机会, 但绝大多数的实 践都是一些较小的程序,仅有几十行甚至几行代码即可实现。此次大 型系统的设计和实现,让我们用到了所学过的每一点知识, 增强了对 C语言的应用能力。此外,非常重要的一点是增强了我们的团队合作 意识和课外自学能力,由于其中用到的一些知识,仅仅只接触过理论 知识而并没有经历过实践,为了能够完成该项课程设计,团队成员通 过上网或图书馆查资料去学习并掌握一些本来不是特别熟练的一些 算法和数据结构的相关知识。

在课程设计过程中,曾经出现过很多的问题。成员通过各种途径 获得知识,老师也给与了我们很大的帮助,为我们找出了很多问题也 解决了很多的问题,对此小组非常感激。其中,老师特意提起的我们 程序的模块化的严重不足,导致语句有效率低,程序冗长,不容易读 懂维护和修改。我们也深刻体会了模块化不足所造成的不便, 使我们 认识到了自己的不足,在今后的学习实践中,我们会逐渐学着去完善 自己的程序,使自己的程序更加精炼,更加易用。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务