19C20C 石俊杰 第二次上机作业

第一次上机作业

19C20C-石俊杰-20191003535

题1:已知一个矩阵,存储在一个二维数组中。将矩阵中和值为最大的那一行元素与首行对换

1.1 基本思路
计算各行和值并存储在一维数组sum中,比较sum中各数大小,将最大值位置记录在maxPos中,maxPos即为和值最大的那一行

1.2 完整代码

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

int main() {
    int a2d[3][3] = {//已知矩阵
		{0,1,2},
		{3,4,5},
		{6,7,8}};
	int sum[3] = { 0 }, maxValue, maxPos(0), temp;
	//sum[3]存储各行和值,maxValue记录最大和值,maxPos记录最大和值位置

	//计算各行和值并存储在一维数组sum中
	for (int i = 0; i < 3; ++i) {
		for (int j = 0; j < 3; ++j) {
			sum[i] += a2d[i][j];
		}
	}

	maxValue = sum[0];//假设sum中第一个数为最大值
	//比较sum中各数大小,将最大值位置记录在maxPos中
	for (int i = 1; i < 3; ++i) {
		if (sum[i] > maxValue) {
			maxValue = sum[i];
			maxPos = i;
		}
	}

	//交换首行与最大值行
	for (int i = 0; i < 3; ++i) {
		temp = a2d[0][i];
		a2d[0][i] = a2d[maxPos][i];
		a2d[maxPos][i] = temp;
	}

	//输出
	for (int i = 0; i < 3; ++i) {
		for (int j = 0; j < 3; ++j) {
			cout << a2d[i][j] << '\t';
		}
		cout << endl;
	}
	
	return 0;
}

1.3 运行结果
在这里插入图片描述

题2:已知一个方阵,存储在一个二维数组中。用指针访问数组元素的方法,计算方阵中上三角、下三角及主对角线上所有元素的和

2.1 基本思路
用for循环内外嵌套遍历,计算上三角时用upPos记录该行起始位置,每遍历一次起始位置加一;计算下三角时用downPos记录该行终止位置,每遍历一次起始位置加一
2.2 完整代码

	//题2
#include <iostream>
#include <vector>
using namespace std;

int main() {
	int a2d[3][3] = {//已知矩阵
		{0,1,2},
		{3,4,5},
		{6,7,8}};
	int sumUp(0), sumDown(0), sumLine(0),upPos(0),downPos(1);
	int(*p2d)[3] = a2d;

	//计算上三角
	for (int i = 0; i < 3; ++i) {
		for (upPos; upPos < 3; ++upPos) {
			sumUp += p2d[i][upPos];
		}
		upPos = i + 1;
	}

	//计算下三角
	for (int i = 0; i < 3; ++i) {
		for (int j = 0; j < downPos; ++j) {
			sumDown += p2d[i][j];
		}
		++downPos;
	}
    
	//计算对角线
	for (int i = 0; i < 3; ++i) {
			sumLine += p2d[i][i];
	}
	
    cout << "上三角和为:" << sumUp << endl;
	cout << "下三角和为:" << sumDown << endl;
	cout << "主对角线和为:" << sumLine << endl;

	return 0;
}

2.3 运行结果
在这里插入图片描述

题3:重新定义回文:滤去所有非字母字符后,不考虑字母大小写,从左向右和从右向左读都相同的词或短语

3.1 基本思路
遍历该字符串各元素,通过ASCII码判断其是否为字母字符,若不是则通过erase()函数删除该字符;如为大写字母,通过+32变为小写字母

3.2 完整代码

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
	string s1;
	bool is_palindrome = true;
	cout << "Please input a string:" << endl;
	getline(cin, s1);//键盘输入一行字符串
	
	int len = s1.length();//字符串长度
	for (int i = 0; i < len; ++i) {
		if (65 <= s1[i] && s1[i] <= 90) {//判断是否为大写字母
			s1[i] += 32;//将大写字母变为小写字母
		}
		else if (97 <= s1[i] && s1[i] <= 122) {//判断是否为小写字母
			continue;
		}
		else {
			s1.erase(i, 1);//删除非字母字符
			--len;
			--i;
		}
	}
	
	for (int i = 0; i < len / 2; ++i) {
		if (s1[i] != s1[len - 1 - i]) {
			is_palindrome = false;
			break;
		}
	}

	if (is_palindrome)
		cout << "The string is a palindrome." << endl;
	else
		cout << "The string is not a palindrome." << endl;

	return 0;
}

3.3 运行结果
在这里插入图片描述

题目4:约瑟夫问题:n个人围成一圈,从1开始顺序编号;游戏开始,首先生成一个1-n区间内的随机数,从第一个人开始由1到m循环报数,报到m的人退出圈外,问最后留下的那个人原来的序号

4.1 基本思路
用pos记录报的数,用i记录遍历位置,用num记录退出人数,用while循环遍历,若该位置为1,则pos加一,当pos=m时,该位置变为0,pos重置,每次循环结束i加一,当i为n时,重置i为0(即从头开始报数),当num=n-1时结束循环

4.2 完整代码

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

int main() {
	int n, m, pos(0), num(0),i(0);
	cout << "请输入人数n及随机数m(1-n):";
	cin >> n >> m;
	vector<bool>v1(n, 1);
	while(1){
		if (v1[i]) {
			++pos;
			if (pos == m) {
				v1[i] = 0;
				pos = 0;
				++num;
			}
		}
		++i;
		if (i == n) {
			i = 0;
		}
		if (num == n-1) {
			break;
		}
	}

	for (int i = 0; i < 8; ++i) {
		if (v1[i]) {
			cout <<"最后一个人原来的位置是:"<< i<<endl;
		}
	}

	return 0;
}

4.3 运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值