作业.docx
《作业.docx》由会员分享,可在线阅读,更多相关《作业.docx(31页珍藏版)》请在冰豆网上搜索。
![作业.docx](https://file1.bdocx.com/fileroot1/2023-2/25/4e70a315-3e95-4055-a580-18e593869c96/4e70a315-3e95-4055-a580-18e593869c961.gif)
作业
《C语言程序设计》
课程设计报告
课题:
班级成绩管理系统
系别:
计算机工程系
专业:
计算机网络
设计班级:
网12
学生:
赵青华
考号:
10503101250
指导教师:
赵耀军、杨新爱
二○一一年六月七日
实训课题:
班级成绩管理系统
(一)课程设计题目:
班级成绩管理系统
(二)目的与要求
1、目的:
(1)要求学生达到熟练掌握C++语言的基本知识和技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2、基本要求:
(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
(2)要求在设计的过程中,建立清晰的类层次;
(3)在系统中至少要定义四个类,每个类中要有各自的属性和方法;
(4)在系统的设计中,至少要用到面向对象的一种机制。
3、创新要求:
在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。
4、写出设计说明书
(三)设计方法和基本原理
1.问题描述:
对一个有N个学生的班级,每个学生有M门课程。
该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。
.2.功能要求:
1、本系统采用一个结构体数组,每个数据的结构应当包括:
学号、姓名、M门课程名称。
2、本系统显示这样的菜单:
请选择系统功能项:
a、成绩录入
b、成绩显示
c、成绩保存
d、成绩排序
e、成绩修改(要求先输入密码)
f、成绩统计
(1)显示每门课程成绩最高的学生的基本信息
(2)显示每门课程的平均成绩
(3)显示超过某门课程平均成绩的学生人数
g、退出系统
3、执行一个具体的功能之后,程序将重新显示菜单。
4、将学生成绩保存到文件中。
(四)算法提示:
1、数据结构:
结构体类型数组。
2、数据库结构:
下表构成该系统的基本数据库。
姓名
学号
课程名称1
课程名称2
char
Char
float
float
(五)测试数据:
学生人数N=10
课程门数M=4
课程名:
数学、语文、英语、政治
1.概要分析:
班级成绩管理系统有13种功能。
把这13个功能做成13个子函数。
在主函当数中设计一个菜单对这13个子数进行管理。
来实现对整个系统的操作。
根据课题的要求。
每一个学生的包括姓名(char)、学号(char)、M门课程的成绩(float).再加上系统功能上的要求每一学生的信息还要总分和名次等。
所以自然的想到要用结构体来定义每一个学生的信息结构。
然后用链表把它们组成一个有序的整体。
用对链表的操作来实现对所有学生信息的统一管理(成绩显示、成绩排序、成绩修改等)。
最后为了以后按照处理后的顺序保存到文件中。
.各函数的功能:
概要设计:
程序的模块组成:
主函数:
intmain()
新建函数:
STUDENT*init()
输入函数:
STUDENT*create()
显示函数:
voidprint(STUDENT*head)
删除函数:
STUDENT*delete(STUDENT*head)
按名字寻找函数:
voidlookup(STUDENT*head)
保存函数:
voidsave(STUDENT*head)
按总分排序函数:
STUDENT*sort(STUDENT*head)
计算总分和均分函数:
voidcomputer(STUDENT*h)
修改函数:
STUDENT*Modify(STUDENT*head,STUDENT*new)
按学号排序函数:
STUDENT*index(STUDENT*h)
菜单函数:
intmenu_select()
各个函数的主要功能:
输入函数:
随时输入数据。
菜单函数:
显示系统主菜单。
显示函数:
显示所有学生的信息。
寻找函数:
方便学生查找自己的成绩。
删除函数:
删除某学生的信息。
排序函数:
按总成绩排序。
按学号排序函数:
按学号排序。
插入函数:
可以插入新的信息。
保存函数:
保存好学生成绩,以免丢失。
统计函数:
l显示每门课程成绩最高的学生的基本信息。
l显示每门课程的平均成绩。
l显示超过某门课程平均成绩的学生人数。
课题的功能模块的划分:
开始
菜单界面
功能选择
初始化函数
输入学生信息
删除学生信息
显示学生信息
查找学生信息
按成绩排序
保存到文件
从文件读数据
插入学生成绩
分类合计
退出系统
结束.
2.详细设计
整个系统除了主函数外,另外还有14个函数,实现八大功能:
输入功能、显示功能、查找功能、排序功能、插入功能、保存功能、读取功能。
各个函数的详细设计说明分别如下:
主函数main()
利用无限次循环for(;;)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。
菜单选择函数intmenu_select()
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择。
等执行完每一个函数功能后,返回菜单。
代码设计:
初始化函数STUDENT*init()
这是一个无参函数,里面只有两个语句,它的作用是使链表初始化,使head的值为NULL和一个清屏语句。
比如:
没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!
输入记录函数STUDENT*create()这是一个无参函数,用来执行学生成绩记录的输入,当学生为@时停止输入,函数结束后,带回一个链表头的指针指向一下个学生的信息插在表头。
N-S流程图如下:
head=NULL无条件循环
指针p指向新开辟的单元
指针p是否为空
是否
输入学号p->num
输出p->num是否为@
内存是否
溢出输入姓名p->name
停止for(i=0;i<3;i++)
输入输入成绩
返回p->sum=s;
菜单p->average=(float)s/3;
显示记录函数voidprint(STUDENT*head)
这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。
算法:
先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。
然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。
重复执行此步聚直到p指针指向NULL为止。
N-S流程图如下:
p=head,使指向第一个结点
输出p所指向的结点
p指向一下个结点
当p指的不是表尾
处理流程
总体结构与模块外部设计
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"windows.h"
#defineN50
voidme();
voidopen();
voidmenu();
voidwelcome();
voidzfpx(structstu*ps,intn);
voidcz(structstu*ps,intn);
voidxg(structstu*ps,intn);
voiddel(structstu*ps,intn);
voidscan(structstu*ps,intn);
voidxhpx(structstu*ps,intn);
voidprint(structstu*ps,intn);
floatsum(structstu*ps,intn,inti);
intnumber(structstu*ps,intn,charnu[]);
staticintmount=0;
structstu
{
charname[20];
charnum[20];
charsex[5];
intage;
floatscore[7];
floataver;
floatsum;
}temp;
voidmain()
{
welcome();
menu();
}
voidmenu()
{
system("cls");
open();
system("cls");
me();
}
voidme()
{
staticstructstust[N];
FILE*fp;
intselect,n;
printf("\n\t\t┏━━━━━━━━━━┓\n");
printf("\t\t┣━━学生管理系统━━┫");
printf("\n\t\t┗━━━━━━━━━━┛\n");
printf("\n\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━┓");
printf("\n\t\t┃¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤┃");
printf("\n\t\t┃¤¤¤┏━━━━━━━━━━┓¤¤¤┃");
printf("\n\t\t┃¤¤¤┃┏━━━━━━━━┓┃¤¤¤┃");
printf("\n\t\t┃¤¤¤┃┃⒈成绩初始化┃┃¤¤¤┃");
printf("\n\t\t┃¤¤¤┃┃⒉学生成绩排序┃┃¤¤¤┃");
printf("\n\t\t┃¤¤¤┃┃⒊查找学生成绩┃┃¤¤¤┃");
printf("\n\t\t┃¤¤¤┃┃⒋显示学生数据┃┃¤¤¤┃");
printf("\n\t\t┃¤¤¤┃┃⒌修改成绩┃┃¤¤¤┃");
printf("\n\t\t┃¤¤¤┃┃⒍删除学生信息┃┃¤¤¤┃");
printf("\n\t\t┃¤¤¤┃┃⒎保存数据┃┃¤¤¤┃");
printf("\n\t\t┃¤¤¤┃┃⒏清屏┃┃¤¤¤┃");
printf("\n\t\t┃¤¤¤┃┗━━━━━━━━┛┃¤¤¤┃");
printf("\n\t\t┃¤¤¤┗━━━━━━━━━━┛¤¤¤┃");
printf("\n\t\t┃¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤┃");
printf("\n\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n\t\t请选择1~8(按其他键退出):
");
scanf("%d",&select);
if(select>=1&&select<=8)
{
switch(select)
{
case1:
scan(st,N);break;
case2:
loop:
printf("排序:
\n⑴.总分\n⑵.学号排序\n⑶.返回\n选择(0~3):
");
scanf("%d",&n);
switch(n)
{
case1:
zfpx(st,mount);
printf("\n*⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙按总分排序如下⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙*\n");
print(st,mount);
gotoloop;
break;
case2:
xhpx(st,mount);
printf("\n*⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙按学号排序如下⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙*\n");
print(st,mount);
gotoloop;
case3:
break;
}
break;
case3:
cz(st,mount);
break;
case4:
printf("\n*⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙学生成绩显示⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙*\n\n\n\n");
print(st,mount);
break;
case5:
xg(st,mount);
break;
case6:
del(st,mount);
break;
case7:
if((fp=fopen("d:
\\studentmanagement.txt","w"))==NULL)
{
printf("Cannotopenthefile\n");
}
else
{
fwrite(st,sizeof(st),1,fp);
fclose(fp);
}
printf("保存成功!
\n");
break;
case8:
system("cls");
default:
getchar();
}
me();
}
}
voidscan(structstu*ps,intn)
{
inti,k;
charboy[3]="b";
chargirl[3]="g";
for(i=mount;i{
printf("请输入第%d个同学的姓名:
",i+1);
scanf("%s",(ps+i)->name);
printf("请输入学号学号:
");
getchar();
scanf("%s",(ps+i)->num);
while(number(ps,mount,(ps+i)->num))
{
getchar();
printf("学号已经存在\2\n请重新输入学号:
");
scanf("%s",(ps+i)->num);
}
printf("请输入性别borg:
");
sex:
scanf("%s",(ps+i)->sex);
if(strcmp((ps+i)->sex,girl)==0||strcmp((ps+i)->sex,boy)==0)
{
}
else
{
printf("输入有误\2请重新输入\n该同学性别:
");
gotosex;
}
printf("请输入年龄:
");
scanf("%d",&(ps+i)->age);
printf("请输入数学成绩0~100:
");
scanf("%f",&(ps+i)->score[0]);
while((ps+i)->score[0]>100||(ps+i)->score[0]<0)
{
getchar();
printf("输入有误\2请重新输入\n数学成绩:
");
scanf("%f",&(ps+i)->score[0]);
}
printf("请输入英语成绩0~100:
");
scanf("%f",&(ps+i)->score[1]);
while((ps+i)->score[1]>100||(ps+i)->score[1]<0)
{
getchar();
printf("输入有误\2请重新输入\n英语成绩:
");
scanf("%f",&(ps+i)->score[1]);
}
printf("请输入语文成绩0~100:
");
scanf("%f",&(ps+i)->score[2]);
while((ps+i)->score[2]>100||(ps+i)->score[2]<0)
{
getchar();
printf("输入有误\2请重新输入\n语文成绩:
");
scanf("%f",&(ps+i)->score[2]);
}
printf("请输入C语言成绩0~100:
");
scanf("%f",&(ps+i)->score[3]);
while((ps+i)->score[3]>100||(ps+i)->score[3]<0)
{
getchar();
printf("输入有误\2请重新输入\n数学成绩:
");
scanf("%f",&(ps+i)->score[3]);
}
printf("请输入数据库成绩0~100:
");
scanf("%f",&(ps+i)->score[4]);
while((ps+i)->score[4]>100||(ps+i)->score[4]<0)
{
getchar();
printf("输入有误\2请重新输入\n数学成绩:
");
scanf("%f",&(ps+i)->score[4]);
}
printf("请输入VISTA课程成绩0~100:
");
scanf("%f",&(ps+i)->score[5]);
while((ps+i)->score[5]>100||(ps+i)->score[5]<0)
{
getchar();
printf("输入有误\2请重新输入\n数学成绩:
");
scanf("%f",&(ps+i)->score[5]);
}
printf("请输入体育成绩0~100:
");
scanf("%f",&(ps+i)->score[6]);
while((ps+i)->score[6]>100||(ps+i)->score[6]<0)
{
getchar();
printf("输入有误\2请重新输入\n数学成绩:
");
scanf("%f",&(ps+i)->score[6]);
}
(ps+i)->sum=sum(ps,N,i);
(ps+i)->aver=(ps+i)->sum/7;
mount++;
printf("\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\n");
printf("继续输入请按1\n结束请按0\n1/0:
");
scanf("%d",&k);
if(k==1)
continue;
elseif(k==0)
printf("你总共输入了%d个学生成绩\n",mount);
break;
}
}
floatsum(structstu*ps,intn,inti)
{
intj;
floatsum=0;
for(j=0;j<7;j++)
{
sum+=(ps+i)->score[j];
}
returnsum;
}
voidzfpx(structstu*ps,intn)
{
inti,j;
for(i=1;i{
for(j=0;j<=n-i-1;j++)
{
if((ps+i)->sum<(ps+i+1)->sum)
{
temp=ps[j];
ps[j]=ps[j+1];
ps[j+1]=temp;
}
}
}
}
voidprint(structstu*ps,intn)
{
inti;
intj;
printf("%3s%3s%3s%6s%6s%5s%5s%5s%6s%6s%7s%5s%5s%5s\n","名次","姓名","学号","boy/girl","年龄","数学","英语","语文","C语言","数据库","VISTA课程","体育","总成绩","平均分");
for(i=0;i{
printf("%3d",i+1);
printf("%3s",(ps+i)->name);
printf("%3s",(ps+i)->num);
printf("%8s",(ps+i)->sex);
printf("%6d",(ps+i)->age);
for(j=0;j<7;j++)
{
printf("%6.1f",(ps+i)->score[j]);
}
printf("%5.1f",(ps+i)->sum);
printf("%5.1f",(ps+i)->aver);
printf("\n");
}
printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
}
voidcz(structstu*ps,intn)
{
inti,j;
inta;
charx[20];
charno[3]="e";
loop2:
printf("请输入要查找的学生学号(e为退出):
");
scanf("%s",x);
if((strcmp(x,no))==0)
{
me();
}
for(i=0;i{
if(strcmp((ps+i)->num,x)==0)
{
printf("姓名学号性别年龄-数学-英语-语文-C语言-数据库-VISTA课程-体育-总成绩-平均分\n");
printf("%s",(ps+i)->name);
printf("%s",(ps+i)->num);
printf("%s",(ps+i)->sex);
printf("%d",(ps+i)->age);
for(j=0;j<7;j++)
{
printf("%.1f",(ps+i)->score[j]);
}
printf("%.1f",(ps+i)->sum);
printf("%.1f",(ps+i)->aver);
printf("\n");
printf("继续查找按1\n返回按0\n1/0:
");
scanf("%d",&a);
if(a==1)
gotoloop2;
else
me();
}
}
if(i==mount)
{
printf("没有该学号的学生!
\n继续查找按1\n返回按0\n1/0:
");
scanf("%d",&a);
if(a==1)
gotoloop2;
else
me();
}
}
voidxg(structstu*ps,intn)/*修改学生数据函数*/
{
inti,a,b;
charx[20],boy[3]="xy",girl[3]="xx";
charno[3]="e";
loop1:
printf("请输入要修改的学生学号(e为退出):
");
scanf("%s",x);
if((strcmp(x,no))==0)
{
me();
}
for(i=0;i{
if(strcmp((ps+i)->num,x)==0)
{
loop:
printf("修改的信息:
\n1.数学2.英语3.语文4.C语言5.数据库6.VISTA课程7.体育8.姓名9.学号10.性别11.年龄\n\n\n\n:
");
scanf("%d",&a);
switch(a