河 南 工 程 学 院
《数据结构》课程设计
成果报告
姓 名 伊国彪
学 号 201512211231
学 院 计算机学院
专业班级 软件工程1542
专业课程 数据结构
指导老师 张 天 伍
2016年 12 月 26 日
河南工程学院计算机学院
课程设计报告书
课程设计题目: 学生成绩管理系统
课程设计时间: 12 月19 日~ 12月23日
课程设计地点: 综合楼B310
课程设计单位: 计算机学院
指导教师: 张天伍 学院院长: 曲宏山
课程设计成绩评定标准及成绩评定表
学生姓名: 伊国彪 学号 201512211231专业班级: 软件工程1542
成绩评定:
指导教师:
2016年12 月 日
(1)掌握指针数组的一般储存的基本概念及存储结构.
(2)利用指针数组的一般储存对学生成绩进行基本操作。
包括创建、插入、删 除、排 序 等 功 能 上要以菜单选项形式体现出来. 学生成绩管理系统
设计程序,要求实现下面功能:
2.1可以输入学生成绩
(学号、姓名、性别、课程成绩(多门课程),总分)
2.2可以查看所有学生成绩
2.3可以插入、删除某个学生的成绩
2.4根据学号查找某个学生成绩
2.5对所有学生成绩进行排序(按课程、按总分、按单科进行排序)
(3)通过本次设计型实验使我们在学习完C、数据结构等课程基础上对前面所学的知识做一个总结与回顾。
(4)通过该课程设计,使我们对老师课上的讲述有了更深的理解,让我们学有所展示。
(5)将指针数组的一般储存应用到具体生活中,使我们了解了数据结构这一门课在实际生活中的应用。
2 课题分析与设计
2.1 课题需求分析
利用所学数据结构理论知识完成“学生成绩管理系统”的设计。
(1)其功能具体包括:
1 登录功能:输入正确登陆密码点击enter键进入总界面让后进行余下功能。
2录入功能:可以输入20位同学信息可以输入学生成绩(学号、姓名、性别、课程成绩(多门课程),
3浏览功能:完成对全部学生信息记录浏览可以查看所有学生成绩
4添加功能:在已有的学生信息基础下进行添加,增加学生信息
5删除功能:所有信息录入完备后对学生信息进行整理去掉那些录入错误学生
6排序功能:对学生信息中的课程,成绩,进行排序使用冒泡排序将分数高的学生排在前面
7查找功能:输入学生学号就可以查找学生的信息
8退出功能:所有工作完成后输入退出键退出。
(2)简明思路
建立学生成绩管理系统,需要逐步的完善。进入系统之后,首先要有一个主界面,主界面要求要输入密码,如果密码输错三次,成绩查询系统自动锁定。然后输入数据记录,将学生的基本信息包括学号,姓名,性别,多门课程成绩(包括数据结构,离散数学,JavaEE)总分数据作为一个记录写入文件。然后显示输入的学生的各项信息。然后增加数据记录,增加多个学生的成绩信息,位于之前的学生后面。然后删除数据记录,删除学生成绩信息。然后还可以查寻成绩,可以根据学生的学号查找并显示出学生的成绩信息。最后还要对所有学生成绩进行排序(按课程、按总分、按单科进行排序)。经过逐层逐块、不断细化、求精过程,编写程序并进行测试、验证,可以逐个模块地分开调试,并通过文件包含或用工程文件的形式进行逐步联合调试。
struct student //定义学生结构体,利用指针数组存储学生成绩信息
{
long num; //成员变量学号为长整型
char name[20]; //姓名为字符串型
char sex[2]; //性别为字符串型
int score[3]; //分数为整型
int sum; //总分为整型
int ave; //平均分为整型
}stu[N];
1.在void enter()(主菜单函数)中用switch语句实现功能选择。具体代码如下:
switch(choice)
{
case 1: input();break;
case 2: display(); break;
……
default: w = 1;
}
2.在void input()(录入学生成绩函数)在void add()(增添学生成绩函数)中用do…while …语句实现学生信息的输入。具体代码如下:
do{
printf("请输入第%d 个学生的信息.\n\n",t);
printf("学号:");
scanf("%ld",&p->num); //输入学号存放在num中
……
}while(x==1);
3.在void display() (显示学生信息函数)和void delet()(删除学生成绩)及void fint() (查找学生信息函数)中主要用for循环语句及其嵌套语句实现逐个输出学生成绩信息、删除学生成绩信息及查询学生成绩信息。具体代码如下:
for(j=0;j
{
printf("%ld\t%s\t%s\t",stu[j].num,stu[j].name,stu[j].sex); //输出学号、姓名、性别
for(i=0;i<3;i++)
printf("%d\t", stu[j].score[i]); //输出各科分数
……
}
4.在void fint()(统计学生成绩函数)中主要用冒泡排序法实现学生成绩的排列。具体算法如下:
for(i=0;i
{
for(j=i+1;j
if(stu[i].score[1]
{
k = stu[i].score[1]; //交换分数
stu[i].score[1] = stu[j].score[1];
stu[j].score[1] = k;
}
}
2.4 程序流程图
否
Y N
#include
#include
#include
#include
#define N 20 //全局变量
struct student //定义学生结构体
{
long num; //学号为长整型
char name[20]; //姓名为字符串型
char sex[2]; //性别为字符串型
int score[3]; //分数为整型
int sum; //总分为整型
int ave; //平均分为整型
}stu[N]; //结构体数组
int t = 1,pl= 0;
void enter(); //主菜单函数
void input(); //录入函数
void display(); //显示函数
void add(); //增添函数
void delet(); //删除函数
void preside(); //查找函数
void fint(); //排序函数
void output(); //结束函数
void main()
{ //初始界面输入验证密码
int password,i;
printf("\n\n\n\n\t\t\t欢迎进入学生成绩管理系统\n");
for(i = 1;i<=3;i++) //循环计数,输错三次,系统锁定
{
printf("\n\n\t\t\t请输入密码:");
scanf("%d",&password);
if(password==5201314) //设置密码为5201314
{
enter(); //输入正确调用主菜单函数
break;
}
printf("\\t\t输入错误,请再次输入!");
}
printf("\n密码输入三次有误!系统锁定!");
}
void enter() //进入主菜单函数
{
int choice,w;
char k;
system("cls"); //执行控制台命令cls,功能是清屏,清除所有显示的信息
printf("\t\t\t学生成绩管理系统\n\n");
printf("\t\t1. 录入.\t2. 显示.\t3. 增项.\t4. 删项.\n\t\t5. 排序.\t6. 查找.\t7. 退出.\n");
printf("\n 输入序号执行相应功能:");
scanf("%d",&choice);
switch(choice)
{
case 1: input();break; //执行录入函数,然后结束循环
case 2: display(); break; //执行显示函数,然后结束循环
case 3: add();break; //执行增添函数,然后结束循环
case 4: delet();break; //执行删除函数,然后结束循环
case 5: preside(); break; //执行查询函数,然后结束循环
case 6: fint(); break; //执行排序函数,然后结束循环
case 7: output();break; //执行结束函数,然后结束循环
default: w = 1; //其他情况
}
if(w==1)
{
printf("输入有误按任意键重新选怿.\n");
k=getchar(); //从标准输入控制台读取字符
getch(); //不回显函数,当用户按下某个字符时,函数自动读取,无需按回车
enter(); //回车
}
}
void input() //学生信息录入的函数
{
int x,i,count = 0;
char w,r[20],o;
struct student *p; //定义指向结构体的指针p
p=stu; //p指向指针数组stu
system("cls"); //执行控制台命令cls,功能是清屏,清除所有显示的信息
printf("\t\t\t 学生信息的录入.\n");
do
{
pl++;
printf("请输入第%d 个学生的信息.\n\n",t);
printf("学号:");
scanf("%ld",&p->num); //输入学号存放在num中
printf("姓名:");
scanf("%s",&p->name); //输入姓名存放在name中
printf("性别:");
gets(r);
gets(p->sex);//输入性别存放在sex中
printf("三门成绩:1高等数学.2.大学英语.3.c语言.\n");
for(i=0;i<3;i++)
{
scanf("%d",&p->score[i]);
while(p->score[i]<0||p->score[i]>100)
{
printf("输入分数有误,请重新输入!\n");
scanf("%d",&p->score[i]);
}
}
p->sum = p->score[0] + p->score[1] + p->score[2]; //求总分
p->ave = p->sum/3; //求平均分
printf("\n\n 是否要继续输入学生信息,如果是请按y;不是请按n.\n");
o=getchar(); //获取字符串
w=getchar(); //获取字符串
if(w=='y' || w=='Y')
{
t++; //学生数量加1
x=1;
p++;
}
else
x=0;
}while(x==1);
if(w=='n' || w=='N')
printf("按任意键返回.\n");
getch(); //不回显函数,当用户按下某个字符时,函数自动读取,无需按回车
enter(); //回车
}
void display() //显示学生信息函数
{
int i,j;
system("cls");
printf("\t\t\t 学生信息显示.\n\n");
for(j=0;j
{
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n\n","学号","姓名","性别","高等数学","大学英语","c语言","平均分","总分");
printf("%ld\t%s\t%s\t",stu[j].num,stu[j].name,stu[j].sex); //输出学号、姓名、性别
for(i=0;i<3;i++)
printf("%d\t", stu[j].score[i]); //输出各科分数
printf("%d\t", stu[j].ave); //输出平均分
printf("%d\t", stu[j].sum); //输出总分
printf("\n\n");
}
printf("\n 按任意键返回.\n");
getch(); //不回显函数,当用户按下某个字符时,函数自动读取,无需按回车
enter(); //回车
}
void add() //学生信息的增添
{
int i,x;
char a, w;
struct student *p; //定义指向结构体的指针p
p=stu+t; //p指向指针数组stu+t
system("cls"); //执行控制台命令cls,功能是清屏,清除所有显示的信息
printf("\n\t\t\t增加学生信息.\n");
do
{
printf("请输入第%d 个学生的信息.\n\n",t+1);
printf("学号:");
scanf("%ld",&p->num); //输入学号存放在num中
printf("姓名:");
scanf("%s",&p->name); //输入姓名存放在name中
printf("性别:");
scanf("%s",&p->sex); //输入性别存放在sex中
printf("三门成绩:1.高等数学.2.大学英语.3.c语言.\n");
for(i=0;i<3;i++)
scanf("%d",&p->score[i]);
for(i=0;i<3;i++)
p->sum = p->score[0] + p->score[1] + p->score[2];
p->ave = p->sum/3;
a=getchar();
printf("\n 是否要继续输入学生信息如果是请按y;不是请按n.\n\n");
w=getchar();
p++;
t++; //学生数加1
if(w=='y'||w=='Y') //判断输入字符
{
x=1;
}
if(w=='n'||w=='N')
{
x=0;
break;
}
}while(x==1);
if(x==0)
{
printf("\n");
printf("按任意键返回.\n");
getch(); //不回显函数,当用户按下某个字符时,函数自动读取,无需按回车
enter(); //回车
}
}
void delet() //学生信息的删除
{
long b;
int j;
int r=t; //将t赋值给r
char c,x;
struct student *p; //定义指向结构体的指针p
system("cls"); //执行控制台命令cls,功能是清屏,清除所有显示的信息
printf("\n\t\t\t删除学生信息\n");
printf(" 请输入要删除学生的学号:\n\n");
scanf("%ld",&b);
for(p=stu;p
if(p->num==b)
break; //找到结束循环
else
r--;
if(r==0) //没有找到要删除的学生
{
printf("你要删除的学生不存在,请按任意键返回.\n");
getch();
enter();
}
printf("\n 你要删除的学生为:\n");
printf("%-8s%-8s%-8s%-8s%-8s%-8s%-8s%-8s\n\n","学号","姓名","性别","高等数学","大学英语","c语言","平均分","总分");
printf("%-8ld%-8s%-8s",p->num,p->name,p->sex);
for(j=0;j<3;j++)
printf("%-8d",p->score[j]);
printf("%-8d",p->ave);
printf("%-8d",p->sum);
printf("\n你确定要删除吗?如是请输入 y;不是请 输入 n.\n");
x=getchar();
c=getchar();
if(c=='y'||c=='Y')
{
for(p->num;p
*p=*(p+1);
t--;
printf("系统已为你删除信息,请按任意键返 回.\n");
getch(); //不回显函数,当用户按下某个字符时,函数自动读取,无需按回车
enter(); //回车
}
if(c=='n'||c=='N')
{
printf("删除信息取消!按任意键返回.\n");
getch();
enter();
}
}
void preside() //学生信息的排序
{
int i,j,k,l;
char m[20],n[2];
struct student *p; //定义指向结构体的指针p
system("cls"); //执行控制台命令cls,功能是清屏,清除所有显示的信息
printf("\n\t\t\t 学生信息排序.\n");
printf("%-8s%-8s%-8s%-8s%-8s%-8s%-8s%-8s\n\n","学号","姓名","性别","高等数学","大学英语","C语言","平均分","总分");
for(p=stu;p
{
printf("%-8ld%-8s%-8s",p->num,p->name,p->sex);
for(j=0;j<3;j++)
printf("%-8d",p->score[j]);
printf("%-8d",p->ave);
printf("%-8d",p->sum);
printf("\n\n");
}
printf("\n\n");
printf("按总分排序:\n"); //冒泡排序
printf("%-8s%-8s%-8s%-8s\n\n","学号","姓名","性别","总分");
for(i=0;i
{
for(j=1+1;j
if(stu[i].sum
{
k = stu[i].sum; //交换总分
stu[i].sum = stu[j].sum;
stu[j].sum = k;
l = stu[i].num; //交换学号
stu[i].num = stu[j].num;
stu[j].num = l;
strcpy(m,stu[i].name); //交换姓名
strcpy(stu[i].name,stu[j].name);
strcpy(stu[j].name,m);
strcpy(n,stu[i].sex); //交换性别
strcpy(stu[i].sex,stu[j].sex);
strcpy(stu[j].sex,n);
}
}
for(j=0;j
{
printf("%ld\t%s\t%s\t",stu[j].num,stu[j].name,stu[j].sex);
printf("%d\t", stu[j].sum);
printf("\n\n");
}
printf("\n\n");
printf("按单科排序:\n"); //冒泡排序
printf("高等数学\n");
printf("%-8s%-8s%-8s%-8s\n\n","学号","姓名","性别","高等数学");
for(i=0;i
{
for(j = 1+1;j
if(stu[i].score[0]
{
k = stu[i].score[0]; //交换分数
stu[i].score[0] = stu[j].score[0];
stu[j].score[0] = k;
l = stu[i].num; //交换学号
stu[i].num = stu[j].num;
stu[j].num = l;
strcpy(m,stu[i].name); //交换姓名
strcpy(stu[i].name,stu[j].name);
strcpy(stu[j].name,m);
strcpy(n,stu[i].sex); //交换性别
strcpy(stu[i].sex,stu[j].sex);
strcpy(stu[j].sex,n);
}
}
for(j=0;j
{
printf("%ld\t%s\t%s\t",stu[j].num,stu[j].name,stu[j].sex);
printf("%d\t", stu[j].score[0]);
printf("\n\n");
}
printf("大学英语\n"); //冒泡排序
printf("%-8s%-8s%-8s%-8s\n\n","学号","姓名","性别","大学英语");
for(i=0;i
{
for(j=1+1;j
if(stu[i].score[1]
{
k = stu[i].score[1]; //交换分数
stu[i].score[1] = stu[j].score[1];
stu[j].score[1] = k;
l = stu[i].num; //交换学号
stu[i].num = stu[j].num;
stu[j].num = l;
strcpy(m,stu[i].name); //交换姓名
strcpy(stu[i].name,stu[j].name);
strcpy(stu[j].name,m);
strcpy(n,stu[i].sex); //交换性别
strcpy(stu[i].sex,stu[j].sex);
strcpy(stu[j].sex,n);
}
}
for(j=0;j
{
printf("%ld\t%s\t%s\t",stu[j].num,stu[j].name,stu[j].sex);
printf("%d\t", stu[j].score[1]);
printf("\n\n");
}
printf("c语言\n"); //冒泡排序
printf("%-8s%-8s%-8s%-8s\n\n","学号","姓名","性别","c语言");
for(i=0;i
{
for(j=1+1;j
if(stu[i].score[2]
{
k = stu[i].score[2]; //交换分数
stu[i].score[2] = stu[j].score[2];
stu[j].score[2] = k;
l = stu[i].num; //交换学号
stu[i].num = stu[j].num;
stu[j].num = l;
strcpy(m,stu[i].name); //交换姓名
strcpy(stu[i].name,stu[j].name);
strcpy(stu[j].name,m);
strcpy(n,stu[i].sex); //交换性别
strcpy(stu[i].sex,stu[j].sex);
strcpy(stu[j].sex,n);
}
}
for(j=0;j
{
printf("%ld\t%s\t%s\t",stu[j].num,stu[j].name,stu[j].sex);
printf("%d\t", stu[j].score[2]);
printf("\n\n");
}
printf("排序完成,请按任意键返回.\n");
getch(); //不回显函数,当用户按下某个字符时,函数自动读取,无需按回车
enter(); //回车
}
void fint() //查找学生信息
{
int i,j=t;
long num_a;
char a,b;
struct student *p; //定义指向结构体的指针p
system("cls"); //执行控制台命令cls,功能是清屏,清除所有显示的信息
printf("\n\t\t\t查找学生信息\n");
printf("\t\t\t 请输入要查找的学生学号:\n");
scanf("%ld",&num_a);
for(p=stu;p
{
j--;
if(p->num==num_a)
break; //找到结束循环
if(j==0)
{
printf("不存在该学生,请按任意键返回.\n\n");
a=getchar();
getch(); //不回显函数,当用户按下某个字符时,函数自动读取,无需按回车
enter(); //回车
}
}
printf("\n 你要查找的学生为:\n\n");
printf("%-8s%-8s%-8s%-8s%-8s%-8s%-8s%-8s\n\n","学号","姓名","性别","高等数学","大学英语","c语言","平均分","总分");
printf("%-8ld%-8s%-8s",p->num,p->name,p->sex);
for(i=0;i<3;i++)
printf("%-8d",p->score[i]);
printf("%-8d",p->ave);
printf("%-8d",p->sum);
printf("\n\n 查找完成,请按任意键返回.");
b=getchar();
getch(); //不回显函数,当用户按下某个字符时,函数自动读取,无需按回车
enter(); //回车
¥29.8
¥9.9
¥59.8