C++课程设计 张开有.docx

上传人:b****0 文档编号:17154599 上传时间:2023-07-22 格式:DOCX 页数:26 大小:193.33KB
下载 相关 举报
C++课程设计 张开有.docx_第1页
第1页 / 共26页
C++课程设计 张开有.docx_第2页
第2页 / 共26页
C++课程设计 张开有.docx_第3页
第3页 / 共26页
C++课程设计 张开有.docx_第4页
第4页 / 共26页
C++课程设计 张开有.docx_第5页
第5页 / 共26页
C++课程设计 张开有.docx_第6页
第6页 / 共26页
C++课程设计 张开有.docx_第7页
第7页 / 共26页
C++课程设计 张开有.docx_第8页
第8页 / 共26页
C++课程设计 张开有.docx_第9页
第9页 / 共26页
C++课程设计 张开有.docx_第10页
第10页 / 共26页
C++课程设计 张开有.docx_第11页
第11页 / 共26页
C++课程设计 张开有.docx_第12页
第12页 / 共26页
C++课程设计 张开有.docx_第13页
第13页 / 共26页
C++课程设计 张开有.docx_第14页
第14页 / 共26页
C++课程设计 张开有.docx_第15页
第15页 / 共26页
C++课程设计 张开有.docx_第16页
第16页 / 共26页
C++课程设计 张开有.docx_第17页
第17页 / 共26页
C++课程设计 张开有.docx_第18页
第18页 / 共26页
C++课程设计 张开有.docx_第19页
第19页 / 共26页
C++课程设计 张开有.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C++课程设计 张开有.docx

《C++课程设计 张开有.docx》由会员分享,可在线阅读,更多相关《C++课程设计 张开有.docx(26页珍藏版)》请在冰点文库上搜索。

C++课程设计 张开有.docx

C++课程设计张开有

C++课程设计报告

题目:

学生成绩管理系统

学生姓名:

张开友

学号:

200917010207

专业班级:

计科09102班

同组姓名:

周波廖鹏

指导教师:

易明

设计时间:

2010年下学期第1~2周

指导老师意见:

 

评定成绩:

签名:

日期:

1系统的结构设计

通过对学生成绩信息管理系统的功能分析,可以定义出系统的总体结构模块图,如图所示。

学生成绩管理系统总体结构设计

2.系统管理流程图

前面的分析中已经定义了系统各个模块,属于静态建模的范围。

在系统运行时刻的动态模型应该由系统的流程决定。

当用户运行该系统后可以来进行学生成绩信息插入管理、学生成绩信息查询管理、学生成绩信息删除管理、学生成绩信息修改管理及学生成绩信息输出等操作,具体的流程如图3.2所示。

系统流程图

3.系统详细设计

系统总体设计完成后,就可以根据需求对各个模块来进行实现了。

在本系统中需要编码实现的主要有学生成绩信息插入、学生成绩信息查询、学生成绩信息修改、学生成绩信息删除和学生成绩信息输出等5个模块。

(1)学生成绩插入模块

添加的信息包括学号(不允许重复)、姓名(不允许重复)、语文成绩、数学成绩和英语成绩。

流程图如下图4.1所示。

插入模块流程图

本程序采用的是尾插法,就是每次将新申请的结点插在终端结点的后面,其执行过程如图所示。

尾插法建立单链表操作示意图

(2)学生成绩查询模块

按姓名和学号查找学生成绩的流程图分别如下图所示。

按学号查找学生成绩信息流程图

在单链表中,即使知道被访问结点的位置i,也不能像顺序表那样直接按序号访问,而只能从头指针出发,设置一个工作指针p,顺next域逐个结点往下搜索。

当p指向某个结点时判断是否为第i个结点,若是则查找成功;否则,将工作指针p后移,即将p指向原来所指结点的后继结点。

直到p为NULL时查找失败。

单链表查找过程如图所示。

单链表查找过程的示意图

按学号查询学生成绩信息同按姓名查找学生成绩信息,此处不再详细列出。

(3)学生成绩修改模块

首先要查找与要修改数据相匹配的信息,若没有则返回失败。

否则把相应的信息输出,然后再重新输入新的数据并保存到单链表。

(4)学生成绩删除模块

当选择删除功能时,首先输入要删除的同学的姓名,然后输入要删除的同学的学号,如果该同学存在并且姓名与学号匹配的上,则进行删除操作,否则返回失败。

其流程图如下:

删除学生信息模块流程图

删除操作定义为将单链表的第i个结点删去。

因为在单链表中结点ai存储地址在其前驱结点ai-1的指针域,所以必须首先找到ai-1的存储地址p,然后令p的next域指向ai的后继结点,即把结点ai从链上摘下来,最后释放结点ai的存储空间,如图所示。

在单链表中删除结点指针的变化情况

(5)学生成绩输出模块

从单链表表头遍历整个单链表,将所有数据输出。

其部分代码如下:

voidFunction:

:

Show()

{charchoose;

Student*temp;

system("cls");

temp=Student_First->Next;

if(!

temp)

{cout<<"文件无数据\n\n"<

cout<<"1.返回主菜单"<

cin>>choose;

while(choose!

='1')

{cout<<"1.返回主菜单"<

cin>>choose;

}

Menu();

}

else

{cout<<"姓名\t学号\t语文成绩\t数学成绩\t英语成绩\n";

while(temp!

=NULL)

{temp->Out();

temp=temp->Next;

}

}

cout<<"1.返回主菜单"<

cin>>choose;

while(choose!

='1')

{cout<<"1.返回主菜单"<

cin>>choose;

}

Menu();

}

4.主程序

#include

#include

#include

#include

#include

usingnamespacestd;

typedefstructSTUDENT

{

charstudentNumber[10];/*学生学号*/

charstudentName[20];/*学生姓名*/

charclassName[20];/*班级名称*/

floatmark1;/*第1门成绩*/

floatmark2;/*第2门成绩*/

floatmark3;/*第3门成绩*/

structSTUDENT*next;

}STUDENT;

STUDENT*headLink;/*链表表头指针*/

voidReadInfoFormFile(void);/*以下是函数声明*/

voidDesplayMenu(void);

voidCreateHeadLink(void);

STUDENT*MallocNode(void);

voidGetInformation(STUDENT*t);

voidOutputInformation(void);

voidDesplayInfoBystudentNumber(void);

voidDesplayOneNode(STUDENT*t);

voidInsertOneNode(STUDENT*t);

voidDeleteNodeBystudentNumber(void);

voidChangeMarkByNumber(void);

voidSaveLinkToFile(void);

voidDesplayMarkSegment(void);

voidCompositorByTotalMark(void);

intchoose;/*用于接受用户的选择*/

voidyonghudenglu(void);

voidputong(void);

voidpass(void);

voidmain()/*主函数*/

{

CreateHeadLink();

ReadInfoFormFile();

yonghudenglu();

DesplayMenu();

}

voidyonghudenglu(void)

{

cout<<"****************MUNE***************\n\n";

cout<<"*用户登陆*\n";

cout<<"*1管理员登陆*\n";

cout<<"*2普通用户登陆*\n";

cout<<"*3退出*\n";

cout<<"****************END******************\n";

puts("pleaseinputyourchoose(1~3)");

cin>>choose;

switch(choose)

{

case1:

DesplayMenu();

getch();

break;

case2:

putong();

getch();

break;

case3:

SaveLinkToFile();/*保存数据后再退出*/

free(headLink);

exit

(1);

break;

default:

break;

}

system("cls");

DesplayMenu();/*递归调用*/

}

/************************************

函数功能:

从文件中读学生信息到链表中

************************************/

voidReadInfoFormFile(void)

{

FILE*fp;

STUDENT*p;

fp=fopen("c:

\\snow.txt","rb");

if(!

fp)

{

cout<<"文件不存在\n";

return;

}

p=MallocNode();

while(fscanf(fp,"%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3))>0)

{

InsertOneNode(p);

p=MallocNode();

}

fclose(fp);

}

/************************************

函数功能:

显示菜单,根据用户的输入

完成相应的功能

************************************/

voidDesplayMenu(void)

{

STUDENT*p;

cout<<"****************MUNE***************\n\n";

cout<<"*1显示所有学生的信息*\n";

cout<<"*2按学号查询*\n";

cout<<"*3增加学生*\n";

cout<<"*4删除学生*\n";

cout<<"*5按学号修改学生成绩*\n";

cout<<"*6保存所有学生信息*\n";

cout<<"*7显示优秀和不及格学生成绩*\n";

cout<<"*8排序结果并输出绩*\n";

cout<<"*0退出*\n";

puts("****************END******************\n");

puts("pleaseinputyourchoose(0~8)");

cin>>choose;/*取得用户的选择*/

switch(choose)

{

case1:

OutputInformation();/*显示所有学生的信息*/

getch();

break;

case2:

DesplayInfoBystudentNumber();/*根据用户输入的学号显示该学生的信息*/

getch();

break;

case3:

p=MallocNode();/*先申请一个新结点*/

GetInformation(p);/*要求用户输入信息到新结点中*/

InsertOneNode(p);/*将新结点加到链表中*/

break;

case4:

DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/

getch();

break;

case5:

ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/

getch();

break;

case6:

SaveLinkToFile();/*保存数据*/

break;

case7:

DesplayMarkSegment();/*显示各分数段的学生成绩*/

getch();

break;

case8:

CompositorByTotalMark();

getch();

break;

case0:

SaveLinkToFile();/*保存数据后再退出*/

free(headLink);

exit

(1);

break;

default:

break;

}

system("cls");

DesplayMenu();/*递归调用*/

}

/************************************

函数功能:

建立链表表头

************************************/

voidputong(void)

{

cout<<"****************MUNE***************\n\n";

cout<<"*1显示所有学生的信息*\n";

cout<<"*2按学号查询*\n";

cout<<"*3按学号修改学生成绩*\n";

cout<<"*4显示优秀和不及格学生成绩*\n";

cout<<"*5排序结果并输出绩*\n";

cout<<"*0退出*\n";

puts("****************END******************\n");

puts("pleaseinputyourchoose(0~5)");

cin>>choose;/*取得用户的选择*/

switch(choose)

{

case1:

OutputInformation();/*显示所有学生的信息*/

getch();

break;

case2:

DesplayInfoBystudentNumber();/*根据用户输入的学号显示该学生的信息*/

getch();

break;

case3:

ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/

getch();

break;

case4:

DesplayMarkSegment();/*显示各分数段的学生成绩*/

getch();

break;

case5:

CompositorByTotalMark();

getch();

break;

case0:

SaveLinkToFile();/*保存数据后再退出*/

free(headLink);

exit

(1);

break;

default:

break;

}

}

voidCreateHeadLink(void)

{

STUDENT*p;

p=(STUDENT*)malloc(sizeof(STUDENT));

headLink=p;

p->next=NULL;

}

5.系统实现

(主要负责模块的核心实现代码)

/************************************

管理员登录/密码修改

************************************/

voidmanager:

:

enter()//修改密码

{

}

stringgetPW(charpwCh='*')

{

constintlength=18;//最大密码长度=18

charpass[length]={0};

for(inti=0;i

{

pass[i]=getch();

if(pass[i]=='\r')

{

pass[i]=0;

cout<

returnstring(pass);

}

cout<

}

cout<

returnstring(pass);

}

//登录函数

intmanager:

:

pass()

{

stringpass1,pass2,pass3;

inti=0;

ifstreamfin("D:

\\code.txt");

if(!

fin)

{

system("cls");

do

{

system("cls");

stringpass("123");

cout<

cout<<"\t\t"<

cout<

"<

cout<

"<

cout<

";

if(!

pare(getPW()))

{

choose_face2();

return0;

}

else

{

cout<

\n"<

system("pause");

i++;////错误次数计数

}

}while(i<3);

if(i==3)

{

cout<

"<

exit(0);

}

}

fin>>pass2;//从文件里读密码

pass3=pass2;

do

{

system("cls");

cout<

cout<

"<

cout<

"<

cout<

";

if(!

pare(getPW()))

{

choose_face2();

return0;

}

else

{

cout<

\n"<

system("pause");

i++;////错误次数计数

}

}while(i<3);

if(i==3)

{

cout<

"<

exit(0);

}

return0;

}

/************************************

函数功能:

根据输入的学号修改成绩

************************************/

voidChangeMarkByNumber(void)

{

STUDENT*p;

charstudentNumber[20];

charflag=0;

floatmark1,mark2,mark3;

p=headLink->next;

printf("请输入学生学号:

\n");

scanf("%s",studentNumber);

while(p)

{

if(strcmp(p->studentNumber,studentNumber)==0)

{

cout<<"请输入新的第1门成绩:

\n";

cin>>mark1;

cout<<"请输入新的第2门成绩:

\n";

cin>>mark2;

cout<<"请输入新的第3门成绩:

\n";

cin>>mark3;

p->mark1=mark1;

p->mark2=mark2;

p->mark3=mark3;

flag=1;

cout<<"修改成功\n";

break;

}

p=p->next;

}

if(!

flag)

printf("对不起,不存在学号为%s的学生\n",studentNumber);

}

/************************************

函数功能:

显示优秀和不及格学生成绩

************************************/

voidDesplayMarkSegment(void)

{

STUDENT*p;

intcount=0;

p=headLink->next;

cout<<"有一门60分以下(不及格)的学生成绩如下:

\n";

cout<<"学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n";

while(p)

{

if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10))))/*只要有一科不及格就认为该生不及格*/

{

count++;

DesplayOneNode(p);

}

p=p->next;

}

cout<<"不及格的学生一共有%d人\n",count;

p=headLink->next;

cout<<"成绩优秀的学生成绩如下:

";

cout<<"学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n";

count=0;

while(p)

{

if((8<=((int)(p->mark1/10)))&&(8<=((int)(p->mark2/10)))&&(8<=((int)(p->mark3/10))))

{

count++;

DesplayOneNode(p);

}

p=p->next;

}

cout<<"成绩优秀的学生一共有%d人\n",count;

}

/************************************

函数功能:

按总成绩排序

************************************/

voidCompositorByTotalMark(void)

{

STUDENTexchange,*r,*p,*q;

r=headLink->next;

if(r==NULL)

{

cout<<"现在还没学生信息,请先输入学生信息\n";

return;

}

while(r)/*两层while循环实现排序*/

{

p=r;

q=r->next;

while(q)

{

if((q->mark1+q->mark2+q->mark3)>(p->mark1+p->mark2+p->mark3))

{

strcpy(exchange.studentNumber,q->studentNumber);/*先复制q结点信息到exchange*/

strcpy(exchange.studentName,q->studentName);

strcpy(exchange.className,q->className);

exchange.mark1=q->mark1;

exchange.mark2=q->mark2;

exchange.mark3=q->mark3;

strcpy(q->studentNumber,p->studentNumber);/*再复制p结点信息到q*/

strcpy(q->studentName,p->studentName);

strcpy(q->class

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

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2