第一次上机作业
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 运行结果