查找、排序的应用
一、实验目的
1、本实验可以使学生更进一步巩固各种查找和排序的基本知识。
2、学会比较各种排序与查找算法的优劣。
3、学会针对所给问题选用最适合的算法。
4、掌握利用常用的排序与选择算法的思想来解决一般问题的方法和技巧。
二、实验内容
[问题描述]
学生信息管理系统
[基本要求]
设计一个学生信息管理系统,学生对象至少要包含:学号、姓名、性别、成绩1、成绩2、总成绩等信息。要求实现以下功能:
1.试选择一种方式实现:基于数组、链表或文件方式
2.总成绩要求自动计算;
3.查询:分别给定学生学号、姓名、性别,能够查找到学生的基本信息(要求至少用两种查找算法实现);
4、排序:分别按学生的学号、成绩1、成绩2、总成绩进行排序(要求至少用两种排序算法实现)。
[测试数据]
由学生依据软件工程的测试技术自己确定。
1、总体设计(设计思想):
用结构体数组保存学生信息,输入单科成绩后,系统自动计算每个学生的总成绩,查找方法用到折半查找和顺序查找,排序方法用到冒泡排序和简单插入排序。
2、详细设计:
程序运行,先创建学生信息库,即结构体数组,然后再对学生信息进行其他的操作;查询的时候,顺序查找就是从头开始一个一个对比,比较简单,折半查找前先对学生进行从大到小排序,然后再每次和中间的学生对比,缩小范围,最后找到给学生。排序的时候:冒泡排序比较简单,简单插入排序也是比较简单,每次把一个学生插入到已经排好的学生序列中。
3、功能展示及截图:
4、程序清单:
#include<iostream>
#include<string>
#include<iomanip>
#define MAXSIZE 100 //设记录不超过20个
using namespace std;
typedef struct //定义每个记录的结构
{
string name; //姓名
string sex; //性别
float number; //学号
float score1,score2; //成绩1,成绩2
float total_score; //总分
}RecordType;
typedef struct //定义顺序表的结构
{
RecordType r[MAXSIZE+1]; //存储顺序表的向量
int length;
}SqList;
void menu(SqList &ST);
void CreatList(SqList &ST) //创建学生的相关信息
{
cout<<"输入学生个数"<<endl;
cin>>ST.length;
for(int i=0;i<ST.length;i++)
{
cout<<"输入第"<<i+1<<"学生的信息"<<endl;
cout<<"学号"<<endl;
cin>>ST.r[i].number;
cout<<"姓名"<<endl;
cin>>ST.r[i].name;
cout<<"性别"<<endl;
cin>>ST.r[i].sex;
cout<<"成绩 1"<<endl;
cin>>ST.r[i].score1;
cout<<"成绩 2"<<endl;
cin>>ST.r[i].score2;
}
cout<<"输入完毕"<<endl;
}
void total_score(SqList &ST) //计算总分
{
for(int i=0;i<ST.length;i++)
ST.r[i].total_score=ST.r[i].score1+ST.r[i].score2;
}
void output(SqList &ST) //输出
{
cout<<"学生的信息如下"<<endl;
cout<<"学号 姓名 性别 成绩1 成绩2 总分 "<<endl;
for(int i=0;i<ST.length;i++)
cout<<setw(6)<<ST.r[i].number<<setw(6)<<ST.r[i].name<<setw(6)<<ST.r[i].sex<<setw(6)<<ST.r[i].score1<<setw(6)<<ST.r[i].score2<<setw(6)<<ST.r[i].total_score<<" "<<endl;
}
void Query(SqList &ST) //查询信息
{
while(1)
{
cout<<endl;
cout<<"======1、根据学号查询(折半查找)======"<<endl;
cout<<"======2、根据姓名查询(顺序找找)======"<<endl;
cout<<"======3、退出======"<<endl;
int a,m,n,i,j;
int low,high,mid;
RecordType LI; //临时变量使学号变为有序
string name;
string xb;
cin>>m;
switch(m)
{
case 1:
for(i=1;i<ST.length;i++)
{
for(j=i;j>=1;j--)
if(ST.r[j].number<ST.r[j-1].number)
{
LI=ST.r[j];
ST.r[j]=ST.r[j-1];
ST.r[j-1]=LI;
}
}
a=0;
cout<<"输入要查找的学号"<<endl;
cin>>n;
low=0;high=ST.length-1;
while(low<=high)
{
mid=(low+high)/2;
if(n==ST.r[mid].number)
{
cout<<ST.r[mid].number<<" "<<ST.r[mid].name<<" "<<ST.r[mid].sex<<" "<<ST.r[mid].score1<<" "<<ST.r[mid].score2<<" "<<ST.r[mid].total_score<<endl;
a=1;
break;
}
else if(n<ST.r[mid].number)
high=mid-1;
else
low=mid+1; //继续在后半区间进行查找
}
if(!a)
{
cout<<"所查信息不存在!"<<endl;
cout<<"请重新输入"<<endl;
}
break;
case 2: //顺序查找
{
a=0;
cout<<"输入要查找的姓名"<<endl;
cin>>name;
for(i=0;i<ST.length;i++)
{
if(name==ST.r[i].name)
{
cout<<ST.r[i].number<<" "<<ST.r[i].name<<" "<<ST.r[i].sex<<" "<<ST.r[i].score1<<" "<<ST.r[i].score2<<" "<<ST.r[i].total_score<<endl;
a=1;
}
}
if(!a)
{
cout<<"所查信息不存在!"<<endl;
cout<<"请重新输入"<<endl;
}
break;
}
case 3:
menu(ST);
break;
}
}
}
void sort(SqList &ST) //排序
{
int n,i,j;
while(1)
{
RecordType LI; //定义存储学号向量
cout<<endl;
cout<<"======1、根据学号排序(冒泡排序)======"<<endl;
cout<<"======2、根据学号排序(插入排序)======"<<endl;
cout<<"======3、退出======"<<endl;
cout<<endl;
cin>>n;
switch(n)
{
case 1:
for(i=0;i<ST.length-1;i++)
for(j=i+1;j<ST.length;j++)
if(ST.r[i].number>ST.r[j].number)
{
LI=ST.r[i];
ST.r[i]=ST.r[j];
ST.r[j]=LI;
}
output(ST);
cout<<"排序完毕"<<endl;
break;
case 2: //按成绩1排序,选择排序
for(i=1;i<ST.length;i++)
{
if(ST.r[i].number<ST.r[i-1].number)
{
LI=ST.r[i];
ST.r[i]=ST.r[i-1];
for(j=i-2;LI.number<ST.r[j].number;--j)
ST.r[j+1]=LI;
ST.r[j+1]=LI;
}
}
output(ST);
cout<<"排序完毕"<<endl;
break;
case 3:
menu(ST);
break;
}
}
}
void menu(SqList &ST) //选择菜单
{
cout<<"===========请选择要进入的模块=============="<<endl;
cout<<"======1、查询======"<<endl;
cout<<"======2、排序======"<<endl;
cout<<"======3、退出======"<<endl;
int c;
cin>>c;
switch(c)
{
case 1:
Query(ST);
break;
case 2:
sort(ST);
break;
case 3:
exit(0);
}
}
int main()
{
cout<<"==========欢迎进入学生信息管理系统========="<<endl;
cout<<"=====创建树====="<<endl;
SqList ST;
CreatList(ST);
total_score(ST);
output(ST);
menu(ST);
return 0;
}
/*
3
456
a
1
26
23
326
b
2
26
48
225
c
1
35
95
*/