实验七查找.docx
《实验七查找.docx》由会员分享,可在线阅读,更多相关《实验七查找.docx(15页珍藏版)》请在冰豆网上搜索。
实验七查找
实验七查找、排序的应用
一、实验目的
1、本实验可以使学生更进一步巩固各种查找和排序的基本知识。
2、学会比较各种排序与查找算法的优劣。
3、学会针对所给问题选用最适合的算法。
4、掌握利用常用的排序与选择算法的思想来解决一般问题的方法和技巧。
二、实验内容
[问题描述]
对学生的基本信息进行管理。
[基本要求]
设计一个学生信息管理系统,学生对象至少要包含:
学号、姓名、性别、成绩1、成绩2、总成绩等信息。
要求实现以下功能:
1.总成绩要求自动计算;
2.查询:
分别给定学生学号、姓名、性别,能够查找到学生的基本信息(要求至少用两种查找算法实现);
3.排序:
分别按学生的学号、成绩1、成绩2、总成绩进行排序(要求至少用两种排序算法实现)。
3.主要功能:
实现学生成绩的录入,并分别按照学号,姓名和性别进行查询,按照成绩1,2和总成绩分别排序。
4.主要实现函数
1.折半查找for(i=1;i{for(j=i;j>=1;j--)
if(ST.r[j].num{LI=ST.r[j];
ST.r[j]=ST.r[j-1];
ST.r[j-1]=LI;}
2.顺序查找=0;
cout<<"输入要查找的姓名"<cin>>name;
for(i=0;iif(name==ST.r[i].name)
{cout<3.选择法排序for(i=0;i{
for(j=i+1;j{
if(ST.r[i].sum>ST.r[j].sum)
{
LI=ST.r[j];
ST.r[j]=ST.r[i];
ST.r[i]=LI;
五.源程序
#include
#include
#include
usingnamespacestd;
#defineMAXSIZE100
typedefstruct
{
floatnum;//学生学号
stringname;//学生姓名
stringsex;//性别
charclassName[20];//班级名称
floatmark1;//第1门成绩
floatmark2;//第2门成绩
floatsum;//第3门成绩
}DataType;
typedefstruct//定义顺序表的结构
{
DataTyper[MAXSIZE+1];//存储顺序表的向量
intlength;//顺序表的长度
}SqList;
intmenu()
{
inti;
cout<<"/////////////////////////////////////////////////"<cout<<"学生信息管理系统\n"<cout<<"/////////////////////////////////////////////////"<cout<<"2.查询成绩"<cout<<"3.成绩排序"<cout<<"4.退出"<cout<<"请选择1-4:
"<cin>>i;
while(i<0||i>4)
{
cout<<"对不起,您输入错误!
"<cout<<"请重新输入1-4:
"<cin>>i;
}
returni;
}
voidCreatList(SqList&ST)//创建学生的相关信息
{
cout<<"请输入学生的个数"<cin>>ST.length;
cout<<"学号姓名性别班级成绩1成绩2"<for(inti=0;i{
cout<<"输入第"<
cin>>ST.r[i].num>>ST.r[i].name>>ST.r[i].sex>>ST.r[i].className>>ST.r[i].mark1>>ST.r[i].mark2;
}
cout<<"完成输入"<}
voidoutput(SqList&ST)//输出
{
cout<<"学生的信息如下"<cout<<"学号姓名性别班级成绩1成绩2总分"<for(inti=0;icout<}
voidQuery(SqList&ST)//查询信息
{
cout<cout<<"
(1)根据学号查询"<cout<<"
(2)根据姓名查询"<cout<<"(3)根据性别查询"<cout<<"(4)退出"<inta,m,n,i,j;
intlow,high,mid;
DataTypeLI;//使学号变为有序
stringname;
stringxb;
cin>>m;
switch(m)
{
case1:
//折半查找
for(i=1;i{
for(j=i;j>=1;j--)
if(ST.r[j].num{
LI=ST.r[j];
ST.r[j]=ST.r[j-1];
ST.r[j-1]=LI;
}
}
a=0;
cout<<"输入要查找的学号"<cin>>n;
low=0;high=ST.length-1;//置区间初值
while(low<=high)
{
mid=(low+high)/2;
if(n==ST.r[mid].num)
{
cout<a=1;
break;
}
elseif(nhigh=mid-1;//继续在前半区间进行查找
else
low=mid+1;//继续在后半区间进行查找
}
if(!
a)
{
cout<<"所查信息不存在!
"<cout<<"请重新输入"<}
break;
case2:
//顺序查找
{
a=0;
cout<<"输入要查找的姓名"<cin>>name;
for(i=0;i{
if(name==ST.r[i].name)
{
cout<a=1;
}
}
if(!
a)
{
cout<<"所查信息不存在!
"<cout<<"请重新输入"<}
break;
}
case3:
//顺序查找
{
a=0;
cout<<"输入要查找性别"<cin>>xb;
for(i=0;i{
if(xb==ST.r[i].sex)
{
cout<a=1;
}
}
if(!
a)
{
cout<<"所查信息不存在!
"<cout<<"请重新输入"<}
break;
}
case4:
menu();
break;
}
}
voidsort(SqList&ST)//排序
{
intn,i,j;
DataTypeLI;//定义存储学号向量
cout<cout<<"
(1)根据学号排序"<cout<<"
(2)根据成绩1排序"<cout<<"(3)根据成绩2排序"<cout<<"(4)根据总成绩排序"<cout<<"(5)退出"<cin>>n;
switch(n)
{
case1:
//按学号排序,使用插入排序
for(i=1;ifor(j=i;j>=1;j--)
if(ST.r[j].num{
LI=ST.r[j];
ST.r[j]=ST.r[j-1];
ST.r[j-1]=LI;
}
output(ST);
cout<<"排序成功"<break;
case2:
//按成绩1排序,用选择排序
for(i=0;i{
for(j=i+1;j{
if(ST.r[i].mark1>ST.r[j].mark1)
{
LI=ST.r[j];
ST.r[j]=ST.r[i];
ST.r[i]=LI;
}
}
}
output(ST);
cout<<"排序成功"<break;
case3:
//根据成绩2排序,使用选择法排
for(i=0;i{
for(j=i+1;j{
if(ST.r[i].mark2>ST.r[j].mark2)
{
LI=ST.r[j];
ST.r[j]=ST.r[i];
ST.r[i]=LI;
}
}
output(ST);
cout<<"排序成功"<break;
case4:
//根据总成绩排序,使用选择法排序
for(i=0;i{
for(j=i+1;j{
if(ST.r[i].sum>ST.r[j].sum)
{
LI=ST.r[j];
ST.r[j]=ST.r[i];
ST.r[i]=LI;
}
}
}
output(ST);
cout<<"排序成功"<break;
case5:
//退出
menu();
break;
}
}
}
voidmain()
{
SqListST;
while
(1)
{
switch(menu())
{
case1:
cout<cout<<""<cout<<"1.成绩的输入"<cout<<""<CreatList(ST);
break;
case2:
cout<<""<cout<<"2.成绩的查询"<cout<<""<Query(ST);
break;
case3:
cout<<""<cout<<"3.成绩的排序"<cout<<""<sort(ST);
break;
case4:
cout<<""<cout<<"4.退出"<cout<<""<exit(0);
break;
}
}
}
六运行界面
1.主界面
2.输入界面
3.按学号查询界面
4.按姓名查询
5.按性别查询
6.按成绩1排序
7.按成绩2
8.总成绩