南京理工大学 程序设计基础(Ⅰ) SPOC | 学校专有课程 编程作业 第6章作业3

第一题:副对角线交换(100分)

问题描述
将一个n*n矩阵元素根据副对角线交换。

输入描述
第一行输入一个整数n表示矩阵的大小,接下来输入n行,每行有n个整数(1 <= n <= 100)。

输出描述
输出根据副对角线交换后的n*n矩阵,输出格式如下:
输出n行,每行输出n个整数。每两个整数之间都有一个空格,记住,每行最后一个整数后面没有空格。

输入样例

4

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

输出样例

16 12 8 4

15 11 7 3

14 10 6 2

13 9 5 1

#include<iostream>
using namespace std;

int main() {
	int n, arr[100][100];
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> arr[i][j];
		}
	}

	int a, b;
	for (a = n - 1; a >= 0; a--) {
		for (b = n - 1; b > 0; b--) {
			cout << arr[b][a] << " ";
		}
		cout << arr[b][a];
		cout << endl;
	}

	return 0;
}

第二题:字符串及其逆序数按逆序数升序输出

这是我所见的讲的最清楚最透彻的冒泡排序

问题描述

在一个字符串中,如果存在i<j,且a[i]>a[j],则称a[i]和a[j]构成一个逆序。例如"DAABEC"的逆序是5,其中D与A、A、B、C构成4个逆序,E与C构成1个逆序。输入若干个字符串,将按各串及其逆序数按逆序数升序输出。

编程要求:

编写函数:int getRev(char a[]),计算并返回字符串a的逆序。

编写函数:void sort(char a[][100], int b[], int
n),根据b中保存的每个字符串的逆序数,将n行的二维数组a按逆序数升序排序。

在main中先输入n(1<=n<=20),然后输入n个字符串,每个串不多于99个字符,先计算通过调用getRev将各串的逆序数依次存入一个整型数组中,再调用sort排序后,将按各串及其逆序数按逆序数升序输出。

输入描述

先输入n(1<=n<=20),然后输入n个字符串,每个串不多于99个字符

输出描述

按逆序数升序依次输出字符串及其逆序数,字符串和逆序数之间用空格分隔,一个字符串的信息占一行。注意逆序数后不要有多余的空格。

输入样例

5

asdf

er

hjkf

rtj

tyu

输出样例

er 0

tyu 1

asdf 2

rtj 2

hjkf 3

#include<iostream>
#include<cstring>
using namespace std;

int getRev(char a[]) {
	int num = 0;
	for (int i = 0; a[i] != 0; i++) {
		for (int j = i; a[j] != 0; j++) {
			if (a[i] > a[j]) num++;
		}
	}
	return num;
}

void sort(char a[][100], int b[], int n) {
	//将a中的每一个逆序数输入到b数组
	for (int i = 0; i < n; i++) {
		b[i] = getRev(a[i]);
	}
	
	//冒泡排序
	for (int j = 0; j < n - 1; j++) {
		for (int k = 0; k < n - 1 - j; k++) {
			if (b[k] > b[k + 1]) {
				//交换b数组中的数
				int temp01 = b[k + 1];
				b[k + 1] = b[k];
				b[k] = temp01;

				char temp02[100];
				strcpy(temp02, a[k + 1]);
				strcpy(a[k + 1], a[k]);
				strcpy(a[k], temp02);
			}
		}
	}

	/*错误的冒泡排序
	for (int j = 0; j < n - 1; j++) {
		for (int k = j + 1; k < n; k++) {
			if (b[j] > b[k]) {
				//交换b数组中的数
				int temp01 = b[k];
				b[k] = b[j];
				b[j] = temp01;

				char temp02[100];
				strcpy(temp02, a[k]);
				strcpy(a[k], a[j]);
				strcpy(a[j], temp02);
			}
		}
	}*/

}

int main() {
	char a[20][100];
	int n, b[100];
	cin >> n;


	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	sort(a, b, n);

	//输出
	for (int j = 0; j < n - 1; j++) {
		//输出字符串
		cout << a[j] << " " << b[j] << endl;
	}
	cout << a[n - 1] << " " << b[n - 1];
	system("pause");
	return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值