实验三 引用与结构体

实验三 引用与结构体

A. 三数论大小(引用)

题目描述

输入三个整数,然后按照从大到小的顺序输出数值。

要求:定义一个函数,无返回值,函数参数是三个整数参数的引用,例如int &a, int &b, int &c。在函数内通过引用方法来对三个参数进行排序。主函数调用这个函数进行排序。

要求:不能直接对三个整数进行排序,必须通过函数而且是引用的方法。

输入

第一行输入t表示有t个测试实例

第二行起,每行输入三个整数

输入t行

输出

每行按照从大到小的顺序输出每个实例,三个整数之间用单个空格隔开

输入样例

3
2 4 6
88 99 77
111 333 222

输出样例

6 4 2
99 88 77
333 222 111

参考代码

#include<iostream>
using namespace std;
void Sort(int& a,int& b,int& c);//通过引用传递参数,可节省空间 
void Swap(int& a,int& b); 
int main()
{
	int t;//测试组数
	cin>>t;
	int a,b,c;
	while(t--)
	{
		cin>>a>>b>>c;
		Sort(a,b,c);
		cout<<a<<" "<<b<<" "<<c<<endl;
	} 
} 
void Swap(int& a,int& b)//交换 
{
		int temp=a;
		a=b;
		b=temp;
}
void Sort(int& a,int& b,int& c)
{
	if(a<b) Swap(a,b);
	if(a<c) Swap(a,c);
	if(b<c) Swap(b,c);
	 
}

B. 谁是老二(结构体)

题目描述

定义一个结构体,包含年月日,表示一个学生的出生日期。然后在一群学生的出生日期中找出谁的出生日期排行第二

要求:出生日期的存储必须使用结构体,不能使用其他类型的数据结构。

要求程序全过程对出生日期的输入、访问、输出都必须使用结构。

输入

第一行输入t表示有t个出生日期

每行输入三个整数,分别表示年、月、日

依次输入t个实例

输出

输出排行第二老的出生日期,按照年-月-日的格式输出

输入样例

6
1980 5 6
1981 8 3
1980 3 19
1980 5 3
1983 9 12
1981 11 23

输出样例

1980-5-3

参考代码

#include<iostream>
#include<algorithm>
using namespace std;
struct Date
{
	int y;
	int m;
	int d;
};
bool cmp(Date a,Date b)
{
	if(a.y!=b.y) return a.y<b.y;
	if(a.m!=b.m) return a.m<b.m;
	if(a.d!=b.d) return a.d<b.d;
}
int main()
{
	int t;
	cin>>t;
	Date *p=new Date[t];
	for(int i=0;i<t;i++)
	  cin>>p[i].y>>p[i].m>>p[i].d;
	sort(p,p+t,cmp);//排序 
	cout<<p[1].y <<'-'<<p[1].m<<'-'<<p[1].d <<endl; 
	delete []p;
}

C. 抄袭查找(结构体+指针+函数)

题目描述

已知一群学生的考试试卷,要求对试卷内容进行对比,查找是否有抄袭。

每张试卷包含:学号(整数类型)、题目1答案(字符串类型)、题目2答案(字符串类型)、题目3答案(字符串类型)

要求:使用结构体来存储试卷的信息。定义一个函数,返回值为一个整数,参数是两个结构体指针,函数操作是比较两张试卷的每道题目的答案,如果相同题号的答案相似度超过90%,那么就认为有抄袭,函数返回抄袭题号,否则返回0。相似度是指在同一题目中,两个答案的逐个位置上的字符两两比较,相同的数量大于等于任一个答案的长度的90%,就认为抄袭。

输入

第一行输入t表示有t张试卷

第二行输入第1张试卷的学生学号

第三行输入第1张试卷的题目1答案

第四行输入第1张试卷的题目2答案

第五行输入第1张试卷的题目3答案

每张试卷对应4行输入

依次输入t张试卷的数据

输出

在一行中,把发现抄袭的两个学号和题目号,数据之间用单个空格隔开
如果发现是题目1抄袭,题目号为1,以此类推
输出顺序按照输入的学号顺序进行输出

输入样例

5
2088150555
aabcdef11
ZZ887766dd
cc33447799ZZ
2088150333
abcdef00
AABBCCDDEE
ZZ668899cc
2088150111
AABBCCDDEE
ZZ668899cc
abcdef00
2088150222
AABBCFDDeE
ZZ889966dd
abcdef000
2088150444
aabcdef00
AABBCDDDEE
cc668899ZZ

输出样例

2088150333 2088150444 2
2088150111 2088150222 3

参考代码

#include<iostream>
using namespace std;
struct Paper
{
	int num;
	char a[20];
	char b[20];
	char c[20];	
}paper[15];

int cmp(char *pa,char *pb)//比较两字符串的相似程度 
{
	int count=0;//字符相同的数量 
	float flag=0;//较短的数组的长度 
	while(*pa!='\0'&&*pb!='\0')
	{
		if(*pa==*pb) count++;
		flag++;
		pa++;
		pb++;
	} 
	flag*=0.9;
	if(count>=flag) return 1;
	else return 0;
}
int search(Paper *paper1,Paper *paper2)//结构指针 
{
	if(cmp(paper1->a,paper2->a)==1) return 1;
	if(cmp(paper1->b,paper2->b)==1) return 2;
	if(cmp(paper1->c,paper2->c)==1) return 3;
	return 0;
}

int main()
{
	int t;//试卷数
	cin>>t;
	int i,j;
	for(i=0;i<t;i++)
	{
		cin>>paper[i].num >>paper[i].a>>paper[i].b>>paper[i].c;
	}
	
	for(i=0;i<t;i++)//每一轮进行 
	{
		for(j=i+1;j<t;j++)//之前搜索过的就不用了,避免重复 
		{
			int res=search(paper+i,paper+j);
			if(res!=0) cout<<paper[i].num <<" "<<paper[j].num<<" "<<res<<endl; 
		}
	}
	 return 0; 
	 
}

D. 求最大值最小值(引用)

题目描述

编写函数void find(int *num,int n,int &minIndex,int &maxIndex),求数组num(元素为num[0],num[1],…,num[n-1])中取最小值、最大值的元素下标minIndex,maxIndex(若有相同最值,取第一个出现的下标。)

输入n,动态分配n个整数空间,输入n个整数,调用该函数求数组的最小值、最大值下标。最后按样例格式输出结果。

改变函数find功能不计分。

输入

测试次数

每组测试数据一行:数据个数n,后跟n个整数

输出

每组测试数据输出两行,分别是最小值、最大值及其下标。具体格式见样例。多组测试数据之间以空行分隔。

输入样例

2
5 10 20 40 -100 0
10 23 12 -32 4 6 230 100 90 -120 15

输出样例

min=-100 minindex=3
max=40 maxindex=2

min=-120 minindex=8
max=230 maxindex=5

参考代码

#include<iostream>
using namespace std;
void find(int *num,int n,int &minIndex,int &maxIndex)
{
	minIndex=0;
	maxIndex=0;
	int i=0;
	for(i=0;i<n;i++)
	{
		if(*(num+i)<*(num+minIndex)) minIndex=i;
		if(*(num+i)>*(num+maxIndex)) maxIndex=i;
	}
}
int main()
{
	int t;//测试组数
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		int max,min;
		int *p=new int[n];
		for(int i=0;i<n;i++) cin>>p[i];
		find(p,n,min,max);
		cout<<"min="<<p[min]<<" "<<"minindex="<<min<<endl;
		cout<<"max="<<p[max]<<" "<<"maxindex="<<max<<endl;
		cout<<endl;
	} 
	
	
}

E. 扑克牌排序(结构体)

题目描述

自定义结构体表示一张扑克牌,包含类型——黑桃、红桃、梅花、方块、王;大小——2,3,4,5,6,7,8,9,10,J,Q,K,A,小王(用0表示)、大王(用1表示)。输入n,输入n张扑克牌信息,从大到小输出它们的排序结果。

假设扑克牌的排序规则是大王、小王为第一大、第二大,剩余52张扑克牌按照先花色后大小排序。

花色:黑桃>红桃>梅花>方块。

大小: A>K>Q>J>>10>9>…>2。

提示:百度sort函数、strstr函数使用。

输入

测试次数t

每组测试数据两行:

第一行:n,表示输入n张扑克牌

第二行:n张扑克牌信息,格式见样例

输出

对每组测试数据,输出从大到小的排序结果

输入样例

3
5
黑桃4 红桃10 梅花Q 方块K 黑桃A
10
大王 梅花10 红桃K 方块9 黑桃2 梅花A 方块Q 小王 黑桃8 黑桃J
5
红桃K 梅花K 黑桃K 方块K 小王

输出样例

黑桃A 黑桃4 红桃10 梅花Q 方块K
大王 小王 黑桃J 黑桃8 黑桃2 红桃K 梅花A 梅花10 方块Q 方块9
小王 黑桃K 红桃K 梅花K 方块K

参考代码

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct puke
{
	char a[20];//扑克牌 
	int flower;//表示花色中的大小
	int  num;// 表示普通的大小 
};
//所有扑克牌都统一用数字转换,便于比较
void tongyi(puke *pu)
{
	//花色以及大小王的大小关系用flower表示,便于比较 
	if(strstr(pu->a,"大王")) pu->flower =6;//最大值
	if(strstr(pu->a,"小王")) pu->flower =5;
	if(strstr(pu->a,"黑桃")) pu->flower =4;
	if(strstr(pu->a,"红桃")) pu->flower =3;
	if(strstr(pu->a,"梅花")) pu->flower =2;
	if(strstr(pu->a,"方块")) pu->flower =1;
	//普通的大小用num表示,便于比较相同花色时的大小关系
	if(strstr(pu->a,"A")) pu->num=14; 
	if(strstr(pu->a,"K")) pu->num=13;
	if(strstr(pu->a,"Q")) pu->num=12;
	if(strstr(pu->a,"J")) pu->num=11;
	if(strstr(pu->a,"10")) pu->num=10;
	if(strstr(pu->a,"9")) pu->num=9;
	if(strstr(pu->a,"8")) pu->num=8;
	if(strstr(pu->a,"7")) pu->num=7;
	if(strstr(pu->a,"6")) pu->num=6;
	if(strstr(pu->a,"5")) pu->num=5;
	if(strstr(pu->a,"4")) pu->num=4;
	if(strstr(pu->a,"3")) pu->num=3;
	if(strstr(pu->a,"2")) pu->num=2;
}
bool cmp(puke p1,puke p2)
{
	if(p1.flower!=p2.flower) return p1.flower>p2.flower;
	if(p1.num!=p2.num) return p1.num>p2.num;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		puke *p=new puke[n];
		for(int i=0;i<n;i++) 
		{
			cin>>p[i].a;
		    tongyi(&p[i]);
		}
		sort(p,p+n,cmp);
		for(int i=0;i<n;i++)  
		{
			if(i<n-1) cout<<p[i].a<<" ";
			else cout<<p[i].a<<endl;
		}
		delete[] p;
	}
	
	return 0;
}
上一篇:C代码如何分割字符串


下一篇:线程安全,读写锁