实验五 查找和排序的应用
一、实验目的
1、本实验可以使学生更进一步巩固各种查找和排序的基本知识。
2、学会比较各种排序与查找算法的优劣。
3、学会针对所给问题选用最适合的算法。
4、掌握利用常用的排序与选择算法的思想来解决一般问题的方法和技巧。
二、实验内容
[问题描述]
学生信息管理系统
[基本要求]
设计一个学生信息管理系统,学生对象至少要包含:学号、姓名、性别、成绩1、成绩2、总成绩等信息。要求实现以下功能:
1.试选择一种方式存储:基于数组、链表或文件方式
2.总成绩要求自动计算;
3.查询:分别给定学生学号、姓名,能够查找到学生的基本信息(要求至少用两种查找算法实现);
排序:分别按学生的学号、总成绩进行排序(要求至少用两种排序算法实现)。
[测试数据]
由学生自己确定。
[源代码](加注释)
#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int Boolean;
typedef char ElemType;
#define N 100
typedef struct{
int ID;
string name;
string sex;
int score1;
int score2;
int total;
}Student;
typedef struct{
Student elem[N];
int length;
}SqList;
void menu(SqList &ST);
void CreatList(SqList &ST) //创建学生的相关信息
{
cout << "输入学生个数:";
cin >> ST.length;
for (int i = 0; i<ST.length; i++)
{
cout << "输入第" << i + 1 << "个学生的信息" << endl;
cout << "学号:" ;
cin >> ST.elem[i].ID;
cout << "姓名:" ;
cin >> ST.elem[i].name;
cout << "性别:" ;
cin >> ST.elem[i].sex;
cout << "成绩 1:";
cin >> ST.elem[i].score1;
cout << "成绩 2:";
cin >> ST.elem[i].score2;
}
cout << "输入完毕" << endl;
}
void total_score(SqList &ST) //计算总分
{
for (int i = 0; i<ST.length; i++)
ST.elem[i].total = ST.elem[i].score1 + ST.elem[i].score2;
}
void show(SqList &ST)
{
cout << "学生的信息如下" << endl;
cout << "学号 姓名 性别 成绩1 成绩2 总分 " << endl;
for (int i = 0; i<ST.length; i++)
cout<<ST.elem[i].ID<<" "<<ST.elem[i].name<<" "<<ST.elem[i].sex<<" "<<ST.elem[i].score1<<" "<<ST.elem[i].score2<<" "<<ST.elem[i].total<<endl;
}
void Query (SqList &ST)
{
while(1)
{
cout << "1、根据学号查询(折半查找)" << endl;
cout << "2、根据姓名查询(顺序查找)" << endl;
cout << "3、退出" << endl;
Student L;//临时变量
int m,n;
cin>>m;
switch(m)
{
case 1:{
for(int i=0;i<ST.length;i++)//排序,使学号变有序
{
for(int j=i;j>=1;j--)
{
if(ST.elem[j].ID<ST.elem[j-1].ID)
{
L=ST.elem[j];
ST.elem[j]=ST.elem[j-1];
ST.elem[j-1]=L;
}
}
}
cout << "输入要查找的学号:";
cin >> n;
int low=0,high=ST.length-1,mid;
while(low<=high)
{
mid=(low+high)/2;
if(ST.elem[mid].ID==n) //找到待查元素
{
cout << ST.elem[mid].ID << " " << ST.elem[mid].name << " " << ST.elem[mid].sex << " " << ST.elem[mid].score1 << " " << ST.elem[mid].score2 << " " << ST.elem[mid].total << endl;
break;
}
else if(n<ST.elem[mid].ID) high=mid-1;//继续在前一子表进行查找
else low=mid+1; //继续在后一子表进行查找
}
break;
}
case 2:{
string name;
cout << "输入要查找的姓名:";
cin >> name;
for (int i = 0; i<ST.length; i++)
{
if (name == ST.elem[i].name)
{
cout << ST.elem[i].ID << " " << ST.elem[i].name << " " << ST.elem[i].sex << " " << ST.elem[i].score1 << " " << ST.elem[i].score2 << " " << ST.elem[i].total << endl;
}
}
break;
}
case 3:{
menu(ST);
break;
}
}
}
}
void sort (SqList &ST)
{
while(1)
{
cout << "1、根据学号排序(冒泡排序)" << endl;
cout << "2、根据学号排序(选择排序)" << endl;
cout << "3、退出" << endl;
Student L;//临时变量
int m,n;
cin>>m;
switch(m)
{
case 1:{
for(int i=0;i<ST.length;i++)//排序,使学号变有序
{
for(int j=i;j>=1;j--)
{
if(ST.elem[j].ID<ST.elem[j-1].ID)
{
L=ST.elem[j];
ST.elem[j]=ST.elem[j-1];
ST.elem[j-1]=L;
}
}
}
show(ST);
cout<<"排序成功!"<<endl;
break;
}
case 2:{
for(int i=1;i<ST.length;i++)
{
int k=i;
for(int j=i+1;j<=ST.length;j++)
{
if(ST.elem[j].ID<ST.elem[k].ID) k=j;
if(k!=i)
{
L=ST.elem[i];
ST.elem[i]=ST.elem[k];
ST.elem[k]=L;
}
}
}
show(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()
{
SqList ST;
CreatList(ST);
total_score(ST);
show(ST);
menu(ST);
return 0;
}
[测试数据]
创建学生表,输入学生信息:
显示学生信息,选择进入模块:
进行查询操作(1为折半,2为顺序):
进行排序操作(1为冒泡,2为选择):
退出系统: