我的 C++ 程序的输出不正确
Output not correct for my C++ program
所以,我遇到了以下问题:
- 将从文件 tabl.in 中读取一个数字 n (n<=50)。
- 之后将读取具有 n 行和 n 列的方形数组;数组中的所有数字将由每个最多 2 位数字组成。
- 如文件tabl.out所示,数组第二条对角线上的数和与10取模,如果和为回文数(true=1,false=0),则位于主对角线下方的元素的算术平均值。
将为:
编写函数
- 读取数组
- 次对角线运算和的计算%10
- 检查上一个结果是否为回文
- 计算主对角线下方的算术平均值
示例:
tabl.in:
4
5 8 2 12
1 0 3 16
1 2 1 11
5 7 2 19
tabl.out:
2 1 3
其中
(12+3+2+5)%10 = 22%10 = 2
22 是回文 = 1
1+2+2+1+7+5 = 18, 18/6=3
到目前为止我的代码是:
#include <fstream>
using namespace std;
ifstream fin("tabl.in");
ofstream fout("tabl.out");
void readn(int Arr[][51], int n) {
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
fin >> Arr[i][j];
}
int sumsec(int Arr[][51], int n) {
int s = 0;
float r;
for (int i = 1; i <= n; i++)
s = s + Arr[i][n - i + 1];
r = s % 10;
return r;
}
void pald(int Arr[][51], int n) {
int s = 0, pal = 0;
for (int i = 1; i < n; i++)
s = s + Arr[i][n - i + 1];
while (s != 0) {
pal = pal * 10 + s % 10;
s = s / 10;
}
if (pal == s)
fout << "1 ";
else
fout << "0 ";
}
int ambmd(int Arr[][51], int n) {
int s = 0, k;
float ame;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i - 1; j++) {
s = s + Arr[i][j];
k++;
}
}
ame = s / k;
return ame;
}
int main() {
int Arr[51][51], n;
float r, ame;
fin >> n;
readn(Arr, n);
r = sumsec(Arr, n);
fout << r << " ";
pald(Arr, n);
ame = ambmd(Arr, n);
fout << ame;
}
但是 palindrome()
函数有问题:我的输出文件将针对示例中的给定数组写入 2 0 3
,而不是 2 1 3
。我做错了什么?
您的 pald
函数将起作用,如果您计算 s
的方式与您在 sumsec
中所做的相同,并且如果 s
仍然包含总和,则在您之后计算 pal
.
在您的情况下,while (s != 0) {...}
,后跟 if (pal == s) {...}
可以重写为 if (pal == 0)
,这显然不是预期的解决方案。只需在计算 pal
之前保存您的总和,然后与保存的总和进行比较。
此外,将计算 s
的循环条件更改为 for (int i = 1; i <= n; i++)
。
int s = 0, pal = 0, sum = 0;
for (int i = 1; i <= n; i++)
s = s + Arr[i][n - i + 1];
sum = s;
while (s != 0) {
pal = pal * 10 + s % 10;
s = s / 10;
}
if (pal == sum)
fout << "1 ";
else
fout << "0 ";
您还应该考虑代码改进的各种注释,例如不重新计算 pald
函数中的总和。
所以,我遇到了以下问题:
- 将从文件 tabl.in 中读取一个数字 n (n<=50)。
- 之后将读取具有 n 行和 n 列的方形数组;数组中的所有数字将由每个最多 2 位数字组成。
- 如文件tabl.out所示,数组第二条对角线上的数和与10取模,如果和为回文数(true=1,false=0),则位于主对角线下方的元素的算术平均值。
将为:
- 读取数组
- 次对角线运算和的计算%10
- 检查上一个结果是否为回文
- 计算主对角线下方的算术平均值
示例:
tabl.in:
4
5 8 2 12
1 0 3 16
1 2 1 11
5 7 2 19
tabl.out:
2 1 3
其中
(12+3+2+5)%10 = 22%10 = 2
22 是回文 = 1
1+2+2+1+7+5 = 18, 18/6=3
到目前为止我的代码是:
#include <fstream>
using namespace std;
ifstream fin("tabl.in");
ofstream fout("tabl.out");
void readn(int Arr[][51], int n) {
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
fin >> Arr[i][j];
}
int sumsec(int Arr[][51], int n) {
int s = 0;
float r;
for (int i = 1; i <= n; i++)
s = s + Arr[i][n - i + 1];
r = s % 10;
return r;
}
void pald(int Arr[][51], int n) {
int s = 0, pal = 0;
for (int i = 1; i < n; i++)
s = s + Arr[i][n - i + 1];
while (s != 0) {
pal = pal * 10 + s % 10;
s = s / 10;
}
if (pal == s)
fout << "1 ";
else
fout << "0 ";
}
int ambmd(int Arr[][51], int n) {
int s = 0, k;
float ame;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i - 1; j++) {
s = s + Arr[i][j];
k++;
}
}
ame = s / k;
return ame;
}
int main() {
int Arr[51][51], n;
float r, ame;
fin >> n;
readn(Arr, n);
r = sumsec(Arr, n);
fout << r << " ";
pald(Arr, n);
ame = ambmd(Arr, n);
fout << ame;
}
但是 palindrome()
函数有问题:我的输出文件将针对示例中的给定数组写入 2 0 3
,而不是 2 1 3
。我做错了什么?
您的 pald
函数将起作用,如果您计算 s
的方式与您在 sumsec
中所做的相同,并且如果 s
仍然包含总和,则在您之后计算 pal
.
在您的情况下,while (s != 0) {...}
,后跟 if (pal == s) {...}
可以重写为 if (pal == 0)
,这显然不是预期的解决方案。只需在计算 pal
之前保存您的总和,然后与保存的总和进行比较。
此外,将计算 s
的循环条件更改为 for (int i = 1; i <= n; i++)
。
int s = 0, pal = 0, sum = 0;
for (int i = 1; i <= n; i++)
s = s + Arr[i][n - i + 1];
sum = s;
while (s != 0) {
pal = pal * 10 + s % 10;
s = s / 10;
}
if (pal == sum)
fout << "1 ";
else
fout << "0 ";
您还应该考虑代码改进的各种注释,例如不重新计算 pald
函数中的总和。