深圳大学计软《面向对象的程序设计》实验4 引用与结构体

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_46655675/article/details/129307851