实验三 引用与结构体
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;
}