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

时间:2016-08-09 05:24:51

标签: c++ arrays palindrome

所以,我有以下问题:

  1. 从文件tabl.in中读取数字 n (n <= 50)。
  2. 之后将读取包含 n 行和 n 列的正方形数组;数组中的所有数字将由最多2位数组成。
  3. 在文件tabl.out中显示,在数组的第二个对角线上找到的数字之和与10之间的模数,如果总和为回文(true = 1,false = 0),则为元素的算术平均值位于主对角线下方。
  4. 将编写以下功能:

    • 阅读阵列
    • 计算二次对角线的操作和%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。我做错了什么?

1 个答案:

答案 0 :(得分:0)

如果您使用与pald中相同的方式计算s,并且sumsec仍然包含总和,那么s功能将起作用{ {1}}。

在您的情况下,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 "; 函数中的总和。