A. 求最大值最小值(引用)
题目描述
编写函数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个整数
输出
每组测试数据输出两行,分别是最小值、最大值及其下标。具体格式见样例。多组测试数据之间以空行分隔。
输入样例1
2
5 10 20 40 -100 0
10 23 12 -32 4 6 230 100 90 -120 15
输出样例1
min=-100 minindex=3
max=40 maxindex=2
min=-120 minindex=8
max=230 maxindex=5
AC代码
#include<bits/stdc++.h>
using namespace std;
void find(int* num, int n, int& minIndex, int& maxIndex) {
maxIndex = 0;
minIndex = 0;
for (int i = 1; i < n; i++) {
if (num[i] > num[maxIndex])
maxIndex = i;
if (num[i] < num[minIndex])
minIndex = i;
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
if (i)cout << endl;
int _size;
cin >> _size;
int* p = new int[_size];
for (int j = 0; j < _size; j++)
cin >> p[j];
int minIndex, maxIndex;
find(p, _size, minIndex, maxIndex);
printf("min=%d minindex=%d\n", p[minIndex], minIndex);
printf("max=%d maxindex=%d\n", p[maxIndex], maxIndex);
delete[]p;
}
}
B. 小票输入输出(结构体)
题目描述
现在人的消费习惯大多是刷卡消费,商家会通过POS机回执一个小票,包含商家名称、终端号、操作员、发卡方、有效期、卡号、交易时间、消费金额等信息,把商家信息定义为一个Struct结构,按照要求输出相应的格式小票。
输入
第一行输入消费次数(刷卡次数)
第二行以此输入小票包含的各种属性;
第三行与第二行类似,以此类推。。。
输出
根据输入信息,依次输出各次刷卡信息$
输入样例1
2
TianHong 00001 01 CCB 21/06 6029071012345678 2016/3/13 1000.00
Cindy 00002 02 CCB 21/07 6029071055558888 2015/3/13 50.00
输出样例1
Name: TianHong
Terminal: 00001 operator: 01
Card Issuers: CCB Validity: 21/06
CardNumber: 6029********5678
Traded: 2016/3/13
Costs: $1000.00
Name: Cindy
Terminal: 00002 operator: 02
Card Issuers: CCB Validity: 21/07
CardNumber: 6029********8888
Traded: 2015/3/13
Costs: $50.00
AC代码
#include<bits/stdc++.h>
using namespace std;
struct Ticket
{
string s1, s2, s3, s4, s5, s6, s7, s8;
Ticket() {
cin >> s1 >> s2 >> s3 >> s4 >> s5 >> s6 >> s7 >> s8;
}
void print() {
cout << "Name: " << s1 << endl;
cout << "Terminal: " << s2 << " " << "operator: " << s3 << endl;
cout << "Card Issuers: " << s4 << " " << "Validity: " << s5 << endl;
cout << "CardNumber: " << s6.substr(0, 4) + "********" + s6.substr(12, 4) << endl;
cout << "Traded: " << s7 << endl;
cout << "Costs: $" << s8 << endl;
}
};
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
if (i)
cout << endl;
Ticket t;
t.print();
}
return 0;
}
C. 三数论大小(引用)
题目描述
输入三个整数,然后按照从大到小的顺序输出数值。
要求:定义一个函数,无返回值,函数参数是三个整数参数的引用,例如int &a, int &b, int &c。在函数内通过引用方法来对三个参数进行排序。主函数调用这个函数进行排序。
要求:不能直接对三个整数进行排序,必须通过函数而且是引用的方法。
输入
第一行输入t表示有t个测试实例
第二行起,每行输入三个整数
输入t行
输出
每行按照从大到小的顺序输出每个实例,三个整数之间用单个空格隔开
输入样例1
3
2 4 6
88 99 77
111 333 222
输出样例1
6 4 2
99 88 77
333 222 111
AC代码
#include<bits/stdc++.h>
using namespace std;
void sort_3(int &a,int &b,int &c) {
set<int>s;
s.insert(a);
s.insert(b);
s.insert(c);
auto it = s.rbegin();
a = *(it++);
b = *(it++);
c = *(it++);
}
int main() {
int t;
cin >> t;
while (t--){
int a, b, c;
cin >> a >> b >> c;
sort_3(a, b, c);
cout << a << " " << b << " " << c << endl;
}
return 0;
}
D. 谁是老二(结构体)
题目描述
定义一个结构体,包含年月日,表示一个学生的出生日期。然后在一群学生的出生日期中找出谁的出生日期排行第二
要求:出生日期的存储必须使用结构体,不能使用其他类型的数据结构。
要求程序全过程对出生日期的输入、访问、输出都必须使用结构。
输入
第一行输入t表示有t个出生日期
每行输入三个整数,分别表示年、月、日
依次输入t个实例
输出
输出排行第二老的出生日期,按照年-月-日的格式输出
输入样例1
6
1980 5 6
1981 8 3
1980 3 19
1980 5 3
1983 9 12
1981 11 23
输出样例1
1980-5-3
AC代码
#include<bits/stdc++.h>
using namespace std;
struct Date {
int year, month, day;
};
int main() {
int n;
cin >> n;
vector<Date>v(n);
for (int i = 0; i < n; i++) {
cin >> v[i].year >> v[i].month >> v[i].day;
}
sort(v.begin(), v.end(), [](const Date& a, const Date& b) {
if (a.year != b.year)return a.year < b.year; if (a.month != b.month)return a.month < b.month; return a.day < b.day; });
printf("%d-%d-%d\n",v[1].year,v[1].month,v[1].day);
return 0;
}
E. 单链表(结构)
题目描述
单链表结点的存储结构SNode包含两部分:数据、下一结点指针。单链表首个结点的地址head为表头指针,定义SNode *head=NULL表示单链表初始为空。
单链表的创建:createList(SNode *&head, int *value, int n),用value数组中的n个数据生成一个单链表(表头指针为head)。
单链表的输出:printList(SNode *head),从头至尾遍历以head为表头的单链表,输出每个结点的数据值。
单链表数据插入: insertNode(SNode *head, int pos, int value),在单链表第pos(1<=pos<=L+1)个结点位置插入新结点,数据为value。若插入不成功,输出error。
单链表数据删除: removeNode(SNode *head, int pos), 删除单链表第pos(1<=pos<=L)个结点。若删除不成功,输出error。
单链表的撤销:deleteList(SNode *head),删除以head为表头的单链表,即释放链表每个结点的堆内存。
注:不可以用任何形式的数组来实现链表,否则不计成绩。
输入
第一行:测试次数t
对每组测试数据,格式如下:
数据个数n 数据1 数据2 数据3 … 数据n
插入次数m
插入位置1 数据1
…
插入位置m 数据m
删除次数o
删除位置1
…
删除位置o
输出
对每组测试数据:
输出创建链表后链表中全部结点的数据
对每组插入测试数据:
输出插入操作后链表中全部结点的数据
对每组删除测试数据:
输出删除操作后链表中全部结点的数据
输入样例1
2
5 2 3 5 7 3
2
2 40
8 60
2
7
3
6 1 2 10 0 1 5
2
2 40
8 60
2
1
3
输出样例1
2 3 5 7 3
2 40 3 5 7 3
error
error
2 40 5 7 3
1 2 10 0 1 5
1 40 2 10 0 1 5
1 40 2 10 0 1 5 60
40 2 10 0 1 5 60
40 2 0 1 5 60
AC代码
#include<bits/stdc++.h>
using namespace std;
struct Node
{
int value;
Node* next;
Node(int value = 0, Node* next = NULL) {
this->value = value;
this->next = next;
}
};
class List {
Node* head;
public:
List() {
int len;
cin >> len;
head = new Node(len);
Node* p = head;
for (int i = 0; i < len; i++) {
int t;
cin >> t;
p->next = new Node(t);
p = p->next;
}
}
void insert(int pos, int value) {
if (pos<1 || pos>head->value + 1)
{
puts("error");
return;
}
Node* p = head;
pos -= 1;
while (pos--)
p = p->next;
Node* s = new Node(value, p->next);
p->next = s;
head->value++;
print();
}
void remove(int pos) {
if (pos<1 || pos>head->value)
{
puts("error");
return;
}
pos -= 1;
Node* p = head;
while (pos--)
p = p->next;
Node* s = p->next;
p->next = s->next;
delete s;
head->value--;
print();
}
~List() {
Node* p = head;
while (head) {
p = head->next;
delete head;
head = p;
}
}
void print() {
Node* p = head->next;
cout << p->value;
p = p->next;
while (p) {
cout << " " << p->value;
p = p->next;
}
cout << endl;
}
};
int main() {
int t;
cin >> t;
while (t--) {
List l;
l.print();
int n;
cin >> n;
while (n--) {
int pos, value;
cin >> pos >> value;
l.insert(pos, value);
//l.print();
}
cin >> n;
while (n--)
{
int pos;
cin >> pos;
l.remove(pos);
//l.print();
}
}
return 0;
}
F. 扑克牌排序(结构体)
题目描述
自定义结构体表示一张扑克牌,包含类型——黑桃、红桃、梅花、方块、王;大小——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张扑克牌信息,格式见样例
在输入扑克牌花色信息中,用单个大写字母表示花色:黑桃(Spade)为S,红心(Hearts)为H,梅花(Club)为C,方块(Diamond)为D
牌大小的jack、queen、king、ace用小写字母j\q\k\a表示
大王RedJoker用J0表示,小王用BlackJoker用J1表示
输出
对每组测试数据,输出从大到小的排序结果
其中输出结果输出参考样例,请注意大小写的输出,和输入是不一样的
输入样例1
3
5
S4 H10 Cq Dk Sa
10
J0 C10 Hk D9 S2 Ca Dq J1 S8 Sj
5
Hk Ck Sk Dk J1
输出样例1
SpadeA Spade4 Heart10 ClubQ DiamondK
RedJoker BlackJoker SpadeJ Spade8 Spade2 HeartK ClubA Club10 DiamondQ Diamond9
BlackJoker SpadeK HeartK ClubK DiamondK
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N = 3;
struct Poker {
string name;
string suit;//花色
string value;
public:
Poker(string str) :name(str) {
if (str == "大王") {
value = "1";
return;
}
if (str == "小王") {
value = "0";
return;
}
suit = str.substr(0, N * 2);
str.erase(0, N * 2);
value = str;
}
};
bool cmp(const Poker& a, const Poker& b) {
if (a.value == "1")
return true;
if (b.value == "1")
return false;
if (a.value == "0")
return true;
if (b.value == "0")
return false;
string s[4] = {
"黑桃", "红桃","梅花", "方块" };
int index1, index2;
for (index1 = 0; index1 < 4; index1++)
if (s[index1] == a.suit)
break;
for (index2 = 0; index2 < 4; index2++)
if (s[index2] == b.suit)
break;
if (index1 != index2)
return index1 < index2;
string s1[13] = {
"A","K","Q","J","10","9","8","7","6","5","4","3","2" };
for (index1 = 0; index1 < 13; index1++)
if (s1[index1] == a.value)
break;
for (index2 = 0; index2 < 13; index2++)
if (s1[index2] == b.value)
break;
return index1 < index2;
}
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<Poker>v;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
v.push_back(Poker(s));
}
sort(v.begin(), v.end(), cmp);
for (int i = 0; i < n; i++) {
if (i)
cout << " ";
cout << v[i].name;
}
cout << endl;
}
return 0;
}
G. 抄袭查找(结构体+指针+函数)
题目描述
已知一群学生的考试试卷,要求对试卷内容进行对比,查找是否有抄袭。
每张试卷包含:学号(整数类型)、题目1答案(字符串类型)、题目2答案(字符串类型)、题目3答案(字符串类型)
要求:使用结构体来存储试卷的信息。定义一个函数,返回值为一个整数,参数是两个结构体指针,函数操作是比较两张试卷的每道题目的答案,如果相同题号的答案相似度超过90%,那么就认为有抄袭,函数返回抄袭题号,否则返回0。相似度是指在同一题目中,两个答案的逐个位置上的字符两两比较,相同的数量大于等于任一个答案的长度的90%,就认为抄袭。
输入
第一行输入t表示有t张试卷
第二行输入第1张试卷的学生学号
第三行输入第1张试卷的题目1答案
第四行输入第1张试卷的题目2答案
第五行输入第1张试卷的题目3答案
每张试卷对应4行输入
依次输入t张试卷的数据
输出
在一行中,把发现抄袭的两个学号和题目号,数据之间用单个空格隔开
如果发现是题目1抄袭,题目号为1,以此类推
输出顺序按照输入的学号顺序进行输出
输入样例1
5
2088150555
aabcdef11
ZZ887766dd
cc33447799ZZ
2088150333
abcdef00
AABBCCDDEE
ZZ668899cc
2088150111
AABBCCDDEE
ZZ668899cc
abcdef00
2088150222
AABBCFDDeE
ZZ889966dd
abcdef000
2088150444
aabcdef00
AABBCDDDEE
cc668899ZZ
输出样例1
2088150333 2088150444 2
2088150111 2088150222 3
AC代码
#include<bits/stdc++.h>
using namespace std;
struct Paper
{
int id;
string ans[3];
Paper() {
cin >> id;
for (int i = 0; i < 3; i++)
cin >> ans[i];
}
};
int cmp(Paper* a, Paper* b) {
for (int i = 0; i < 3; i++) {
int min_len = min(a->ans[i].length(), b->ans[i].length());
//int max_len = max(a->ans[i].length(), b->ans[i].length());
int cnt = 0;
for (int j = 0; j < min_len; j++) {
if (a->ans[i][j] == b->ans[i][j])
cnt++;
}
if (cnt >= 0.9 * min_len)
return i + 1;
}
return 0;
}
int main() {
int n;
cin >> n;
vector<Paper>v;
for (int i = 0; i < n; i++)
v.push_back(Paper());
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (cmp(&v[i], &v[j]))
cout << v[i].id << " " << v[j].id << " " << cmp(&v[i], &v[j]) << endl;
return 0;
}