学生选修课程C语言系统设计课程设计报告.docx

上传人:b****8 文档编号:11183968 上传时间:2023-02-25 格式:DOCX 页数:20 大小:48.66KB
下载 相关 举报
学生选修课程C语言系统设计课程设计报告.docx_第1页
第1页 / 共20页
学生选修课程C语言系统设计课程设计报告.docx_第2页
第2页 / 共20页
学生选修课程C语言系统设计课程设计报告.docx_第3页
第3页 / 共20页
学生选修课程C语言系统设计课程设计报告.docx_第4页
第4页 / 共20页
学生选修课程C语言系统设计课程设计报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

学生选修课程C语言系统设计课程设计报告.docx

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

学生选修课程C语言系统设计课程设计报告.docx

学生选修课程C语言系统设计课程设计报告

一:

题目

[要求]

假定有n门课程,,每门课程都有课程编号,课程名称,课程性质,总学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课.试设计一选修课程系统,使之能提供一下功能:

(1)系统以菜单方式工作;

(2)课程信息和学生信息的录入功能(课程信息有文件保存)----输入;

(3)课程信息浏览功能----输出;

(4)查询功能(至少一种查询方式)---算法;

(5)按学分查询;

(6)某门课程学生选修情况(可选项).

二:

数据结构设计

本系统的实现,全部采用链表这种数据结构,用链表实现课程的查找,添加,删除,课程的选修,追加选修的课程.课程信息采用结构体这种数据结构.

三:

系统大纲

 

四:

模块设计

(一)主函数,头文件及结构体声明

主函数设计地比较简洁,只是提供一个主菜单,switch语句将整个程序分为两个大的功能模块

[程序]

#include"stdio.h"

#include"string.h"

#include"stdlib.h"

#include"malloc.h"

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]="123456";

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);

}

(三)学生功能菜单

学生功能菜单包括六个功能:

浏览课程,查询课程,选修课程,添加选修课程,删除错选的课程,也是用到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:

prin();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");

}

(六)查询模块

查询模块主要用于管理员功能中的”查询课程”和学生功能模块中的”查询所有课程”,查询模块共分为三个查询方法:

按课程名称查找,按课程性质查找和按学分查找.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("请输入要查找的课程的名称:

");

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;//退出查找

}

}

(七)插入链表模块

插入链表操作主要用于添加课程,在整个课程信息中加入一些新课程,它在添加模块中被调用

[程序]

void*myInsert(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;

}

}

eturnhead;

}

(八)添加模块

添加模块主要用于增加课程信息,采用链表的操作

[程序]

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();

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==num)

{

p2=head;

head=head->next;

free(p2);

}

if(head==NULL)

returnNULL;

p1=head;

p2=head->next;

while(p2)

{

if(p2->num==num)

{

p1->next=p2->next;

free(p2);

}

else

p1=p2;

p2=p1->next;

}

printf("\n继续删除请按回车\n");

printf("\n结束删除课程按0:

[]\b\b");

ch1=getchar();//将回车键赋给CH1,否则num输完后再输入的回车键会赋给CH,因此用CH1填补。

ch=getchar();

}

returnhead;

system("pause");

}

(十)选修课程模块

选修课程模块采用插入链表的操作,

voidchoose()//选新课程

{

SUB*p,*q;

inta[5];

intnum,total=0,i=0,j;

printf("输入要选修的课程的编号,编号之间以空格分开\n");

scanf("%d",&num);

printf("如果确认输入完要选修的课程的编号,请输入0:

[]\b\b");

while(num!

=0)

{

for(p=head;p;p=p->next)

if(p->num==num)

{

total=total+p->score;

a[i]=num;

i++;

}

scanf("%d",&num);

}

if(total<60)

{

printf("选修总学分为%d,未达到60,选修失败!

\n",total);

system("pause");

}

else

{

FILE*fp;

fp=fopen("my_sub.txt","w");

fprintf(fp,"课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");

for(j=0;j

for(q=head;q;q=q->next)

if(q->num==a[j])

fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",q->num,q->name,q->kind,q->stime,q->ttime,q->etime,q->score,q->term);

fclose(fp);

printf("\t\t\n*****选修成功!

****\n");

printf("\n您选修的课程总学分为%d,课程分别为:

\n",total);

printf("\n课程编号课程名称课程性质总学时授课学时实践或上机学时学分开课学期\n");

for(j=0;j

for(q=head;q;q=q->next)

if(q->num==a[j])

printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",q->num,q->name,q->kind,q->stime,q->ttime,q->etime,q->score,q->term);

printf("\n以上信息全部保存在'my_sub.txt'中\n");

}

system("pause");

}

(十一)读取文件模块

读取文件模块是用来读出文件内容,并将内容输出到内存中,当输入文件名时,就能打开指定的文件,当输入all_sub.txt时,打开所有课程信息的文件,当输入my_sub.txt时,就是浏览学生选修的课程信息

voidreadfile()//阅读文件

{

void*myInsert(SUB*);

SUB*newSub;

intnum,stime,ttime,etime;

intscore,term;

charc,name[20],kind[10],fname[20];

printf("请输入课程信息所在的文件名称:

");

scanf("%s",fname);

FILE*fp;

fp=fopen(fname,"r");

while(!

feof(fp))

{

if((c=fgetc(fp))=='\n')

break;

}

while(!

feof(fp))

{

newSub=(SUB*)malloc(sizeof(SUB));

fscanf(fp,"%d%s%s%d%d%d%d%d\n",&newSub->num,newSub->name,newSub->kind,&newSub->stime,&newSub->ttime,&newSub->etime,&newSub->score,&newSub->term);

myInsert(newSub);

}

fclose(fp);

}

(十二)保存文件模块

保存文件模块共分为两个子程序,分别是将修改的信息保存到all_sub.txt和my_sub.txt文件中.

[程序]

voidsavefile()//保存文件

(一)

{

SUB*p;

FILE*fp;

fp=fopen("all_sub.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->num,p->name,p->kind,p->stime,p->ttime,p->etime,p->score,p->term);

fclose(fp);

printf("创建后的信息已放入'all_sub.txt'文件中\n");

system("pause");

}

voidsavefile1()//保存文件

(二)

{

SUB*p;

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

当前位置:首页 > 高等教育 > 经济学

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

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