我的 C++ 程序的输出不正确

Output not correct for my C++ program

所以,我遇到了以下问题:

  1. 将从文件 tabl.in 中读取一个数字 n (n<=50)。
  2. 之后将读取具有 n 行和 n 列的方形数组;数组中的所有数字将由每个最多 2 位数字组成。
  3. 如文件tabl.out所示,数组第二条对角线上的数和与10取模,如果和为回文数(true=1,false=0),则位于主对角线下方的元素的算术平均值。

将为:

编写函数

示例:

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 函数中的总和。