查找,排序实验

#include<iostream>
#include<iomanip>
#include<fstream>
#include<stdlib.h>
#include<string>
using namespace std;
#define maxsize 100
#define error 0
#define ok 1
typedef struct{
	string name;
	int score1;
	int score2;
}info;
typedef struct {
	int num;
	string name;
	int score1;
	int score2;
}elem;
typedef struct{
	elem *r;
	int length;
}stl;
void menu();
int init(stl &st);
int init1(stl &st);
void han2(stl &st);
void menu2();
void han3(stl &st);
void menu3();
void han4(stl &st);
void menu4();
void search_seq(stl st,string name);
void search_half(stl st,int num);
void show(stl st);
stl st;

int main(){
	init1(st);
	int x=-1,flag=0;
	while(1){
		menu();
		cout<<"请输入你的选择:";
		cin>>x;
		switch(x){
			case 0: exit(0);break;
			case 1: init(st);flag=1;break;
			case 2: if(flag==1) han2(st);else cout<<"请先完成信息初始化";break;
			case 3: if(flag==1) han3(st);else cout<<"请先完成信息初始化";break;
			case 4: if(flag==1) han4(st);else cout<<"请先完成信息初始化";break;
		}
	}
	return 0;
}
void menu(){
	cout<<"--------学生成绩管理系统------------"<<endl;
	cout<<"1信息初始化                   2查找 "<<endl;
	cout<<"3排序                         4编辑 "<<endl; 
	cout<<"0退出"<<endl;
	cout<<"------------------------------------"<<endl;
}
void menu2(){
	cout<<"--------编辑模块------------"<<endl;
	cout<<"1顺序查找                   2二分查找 "<<endl;
	cout<<"3查找所有                  0返回上一级 "<<endl; 
	cout<<"------------------------------------"<<endl;
}
void han2(stl &st){
	int x,num; 
	string name;
	menu2();
	cout<<"请输入你的选项:";
	cin>>x;
	switch(x){
		case 1:cout<<"请输入查找学生姓名:";cin>>name;search_seq(st,name);break;
		case 2:cout<<"请输入查找学生学号:";cin>>num;search_half(st,num);break;
		case 3:show(st);break;
		case 0:return ;break;
		default:cout<<"输入错误;";break; 
	}
}
void search_seq(stl st,string name){
	int i;
	for(i=st.length;i>=1;i--)
		if(!name.compare(st.r[i].name)){
			cout<<"查找成功!"<<endl<<"该学生的信息为:"<<endl;
			cout<<setw(8)<<st.r[i].num<<"   "<<st.r[i].name<<"   "
			<<st.r[i].score1<<setw(8)
			<<st.r[i].score2<<endl;break;
		}
	if(i==0) cout<<"查无此人"<<endl;
	
}
void search_half(stl st,int num){
	int low=1,high=st.length,mid;
	while(low<=high){
		mid=(low+high)/2;
		if(num==st.r[mid].num){
			cout<<"查找成功"<<endl;
			cout<<setw(8)<<st.r[mid].num<<"   "<<st.r[mid].name<<"   "
			<<st.r[mid].score1<<setw(8)
			<<st.r[mid].score2<<endl;
			break;
		}else if(num<st.r[mid].num) high=mid-1;
		else low=mid+1;
	}
	if(low==high-1) cout<<"查找失败"<<endl;
}
void show(stl st){
	cout<<"       学号        姓名    数据结构  程序设计"<<endl;
	int i=1;
	for(i;i<=st.length;i++){
		cout<<setw(8)<<st.r[i].num<<"   "<<st.r[i].name
		<<"   "<<st.r[i].score1<<setw(8)
		<<st.r[i].score2<<endl;
	}
}
void menu3(){
	cout<<"--------编辑模块------------"<<endl;
	cout<<"1直接插入排序(学号)                 2冒泡排序(数据结构) "<<endl;
	cout<<"3直接选择排序(总成绩)                  0返回上一级 "<<endl; 
	cout<<"------------------------------------"<<endl;
}
void insertsort(stl &st);
void bubblesort(stl &st);
void selectsort(stl &st);
void han3(stl &st){
	int x; 
	menu3();
	cout<<"请输入你的选项:";
	cin>>x;
	switch(x){
		case 1:insertsort(st);show(st);break;
		case 2:bubblesort(st);show(st);break;
		case 3:selectsort(st);show(st);break;
		case 4:break;
		default:cout<<"输入错误;";break; 
	}
}
void insertsort(stl &st){
	int i,j;
	for(i=2;i<=st.length;i++)
		if(st.r[i].num<st.r[i-1].num){
			st.r[0]=st.r[i];
			st.r[i]=st.r[i-1];
			for(j=i-1;st.r[0].num<st.r[j].num;--j) st.r[j+1]=st.r[j];
			st.r[j+1]=st.r[0];
		}
}
void bubblesort(stl &st){
	int m=st.length-1,flag=1,j;
	elem t;
	while(m>0&&flag==1){
		flag=0;
		for(j=1;j<=m;j++)
			if(st.r[j].score1>st.r[j+1].score1){
				flag=1;
				t=st.r[j];st.r[j]=st.r[j+1];st.r[j+1]=t;
			}
	}
}
void selectsort(stl &st){
	int i,j,k;
	elem t;
	for(i=1;i<st.length;i++){
		k=i;
		for(j=i+1;j<=st.length;j++)
			if((st.r[j].score1+st.r[j].score2)<(st.r[k].score1+st.r[k].score2)) k=j;
		if(k!=j){
			t=st.r[i];st.r[i]=st.r[k];st.r[k]=t;
		}
	}
}
void menu4(){
	cout<<"--------编辑模块------------"<<endl;
	cout<<"1修改                   2插入 "<<endl;
	cout<<"3删除                   0返回上一级"<<endl; 
	cout<<"------------------------------------"<<endl;
}
void modify(stl &st);
void insert(stl &st);
void delete1(stl &st);
void han4(stl &st){
	int x; 
	menu4();
	cout<<"请输入你的选项:";
	cin>>x;
	switch(x){
		case 1:modify(st);break;
		case 2:insert(st);break;
		case 3:delete1(st);break;
		case 0: return ;break;
		default:cout<<"输入错误;";break; 
	}
		ofstream out("yes.txt",ios::out); 
	if(!out)                              //打开失败 
	{
		cout<<"文件打开失败!"<<endl;
		return;                           //函数返回 
	}
	for(int i=1;i<=st.length;i++)
	{
		out<<st.r[i].num<<"\t"            //将学生信息写入文件 
		   <<st.r[i].name<<"\t"
		   <<st.r[i].score1<<"\t"
		   <<st.r[i].score2<<endl;         //每条信息站一行 
	}
	cout<<"文件写入成功!"<<endl;
	out.close();  
}
void modify1(stl &st,int num);
void modify2(stl &st,string name);
void modify(stl &st){
	int x,num,i;
	string name;
	cout<<"请决定修改内容:(1学号 2数据结构成绩  0返回上一级)"<<endl;
	cin>>x;
	switch(x){
		case 1: cout<<"请决定修改学号";cin>>num;modify1(st,num);break;
		case 2: cout<<"请决定修改姓名";cin>>name;modify2(st,name);break;
		case 0: return ;
		default: cout<<"输入选项错误,请重新输入";break;
	}                      
}
void modify1(stl &st,int num){
	int i,num1;
	cout<<"请决定将"<<num<<"学号修改为:";
	cin>>num1; 
	for(i=1;i<=st.length;i++){
		if(st.r[i].num==num){
			st.r[i].num=num1;
		}
	} 
}
void modify2(stl &st,string name){
	int i;
	string name1; 
	cout<<"请决定将"<<name<<"姓名修改为:";
	cin>>name1; 
	for(i=1;i<=st.length;i++){
		if(!st.r[i].name.compare(name)){
			st.r[i].name=name1;
		}
	} 
}
void insert(stl &st){
	cout<<"请输入插入位置:";
	int i,j;
	cin>>i;
	if(i<1||i>st.length){
		cout<<"插入位置有误!";return ;
	}
	if(st.length>=maxsize){
		cout<<"空间已满";return ;
	}
	cout<<"请输入插入学生的学号,姓名,数据结构成绩,程序设计成绩的信息:"<<endl;
	for(j=st.length;j>=i-1;j--)
		st.r[j+1]=st.r[j];
	cin>>st.r[i-1].num>>st.r[i-1].name>>st.r[i-1].score1>>st.r[i-1].score2;
	st.length++;
}
void delete1(stl &st){
	int i,j;
	cout<<"请输入删除(学号):";
	cin>>i;
	if(i<1||i>st.length){
		cout<<"插入不合法";
		return ;
	}
	for(j=i;j<st.length;j++)
		st.r[j-1]=st.r[j];
	st.length--;
}
int init1(stl &st){
	st.r=new elem[maxsize];
	if(!st.r) return error;
	st.length=0;
	return ok;
}
int init(stl &st){
	ifstream in("yes.txt",ios::in);
	int i=1;
	if(!in){
		cout<<"文件打开失败"<<endl;
		return error;
	}
	while(in>>st.r[i].num>>st.r[i].name>>st.r[i].score1>>st.r[i].score2){
		cout<<setw(8)<<st.r[i].num<<"   "<<st.r[i].name<<"   "<<st.r[i].score1<<setw(8)<<st.r[i].score2<<endl;
		i++;
		st.length++;
	}
	cout<<"读取成功,攻读如"<<i-1<<"个信息";
	in.close();
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰克尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值