如何解决加/乘表错误?

时间:2018-09-09 05:22:20

标签: c++ loops

我在加法/乘法表的某些输入上遇到麻烦,并希望找到一些解决方法。我将从发布程序的内容开始。

代码如下:

#include <iostream>
using namespace std;

void die() {
    cout << "BAD INPUT!" << endl;
    exit(1);
    }

int main() {
    const int ADD = 1;
    const int MULTIPLY = 2;
    const int MAX_SIZE = 20;
    int choice = 0, min = 0, max = 0;

    cout << "Choose:\n";
    cout << "1. Addition Table\n";
    cout << "2. Times Table\n";

    cin >> choice;

    if (!cin) die();
    if (choice != ADD and choice != MULTIPLY) die();

    cout << "Please enter the smallest number on the table:\n";
    cin >> min;

    if (!cin) die();

    cout << "Please enter the largest number on the table:\n";
    cin >> max;

    if (!cin) die();
    if (min > max) die();
    if (max - min >= MAX_SIZE) die();

    if (choice == ADD) {
        for (int i = 0; i <= max; i++) {
            if (i == 0)
                cout << '+';
            else
                cout << i;

            cout << '\t';
            for (int j = min; j <= max; j++) {
                cout << i + j << '\t';
            }
            cout << '\n';
        }
    }

    if (choice == MULTIPLY) {
        for (int i = min; i <= max; i++) {
            if (i == min) {
                cout << 'X';
            else
                cout << i;

            cout << '\t';
            for (int j = min; j <= max; j++) {
                cout << i * j << '\t';
            }
            cout << '\n';
        }
    }

}

现在,这是我从此代码中遇到的错误,这些错误似乎无法解决。首先,当使用min = 1,max = 1进行MUlTIPLY表时,我得到:

X    1

我应该什么时候得到(我相信)

X    1
1    1

第二,在以最小= 1,最大= 12的方式做MULTIPLY表时,我得到:

X    1    2    3    4 ... 12
2    2    4    6    8 ... 24
3    3    6    9    12 ... 36

我什么时候应该得到

X    1    2    3    4 ... 12
1    1    2    3    4 ... 12
2    2    4    6    8 ... 24
3    3    6    9    12 ... 36

最后,当使用最小= 21,最大= 40的ADD表时,由于这样的混乱,我无法发布所有代码,但是基本上列/行如下:

+    21    22    23    24    25 ...
5
1
6
2
7
3
8

很明显,代码应该将行和列均匀输出为21-40。正如您在上一个示例中看到的那样,我的行输出正确,但是以某种方式我的列却是一个完整的,乱码。


我坐了一段时间,一直盯着这段代码,似乎无法解决这些问题。谁能帮助我指引正确的方向?非常感谢您的帮助和提示:)

3 个答案:

答案 0 :(得分:2)

检查一下。可能没有完全优化,但是可以工作

if (choice == ADD) {
    cout << '+';
    for (int i = min; i <= max; i++) {
        cout << '\t' << i;
    }

    for (int i = min; i <= max; i++) {
        cout << '\n' << i << '\t';
        for (int j = min; j <= max; j++) {
            cout << i + j << '\t';
        }
    }
}

if (choice == MULTIPLY) {
    cout << 'X';
    for (int i = min; i <= max; i++) {
        cout << '\t' << i;
    }

    for (int i = min; i <= max; i++) {
        cout << '\n' << i << '\t';
        for (int j = min; j <= max; j++) {
            cout << i * j << '\t';
        }
    }
}

请参见输出here

答案 1 :(得分:1)

#include <iostream>
#include <iomanip>
#include <cstdio>

void die()
{
    std::cout << "BAD INPUT!" << "\n";
    exit(1);
}

int main() {
    const int ADD = 1;
    const int MULTIPLY = 2;
    const int MAX_SIZE = 20;
    int choice = 0, min = 0, max = 0;

    std::cout << "Choose:\n";
    std::cout << "1. Addition Table\n";
    std::cout << "2. Times Table\n";

    std::cin >> choice;

    if (!std::cin) die();
    if (choice != ADD and choice != MULTIPLY) die();

    std::cout << "Please enter the smallest number on the table:\n";
    std::cin >> min;

    if (!std::cin) die();

    std::cout << "Please enter the largest number on the table:\n";
    std::cin >> max;

    if (!std::cin) die();
    if (min > max) die();
    if (max - min >= MAX_SIZE) die();

    if (choice == ADD) {
        for (int i = 0; i <= max; i++) {
            if (i == 0)
               printf("  +");
            else
               printf("%3d", i);
            printf(" ");
            for (int j = min; j <= max; j++) {
                printf("%3d ", i + j);
            }
            printf("\n");
        }
    }

    if (choice == MULTIPLY) {

        /* for printing header of the multiplication table */
        std::cout << "X\t";
        for (int j = min; j <= max; j++) {
            std::cout << min * j << "\t";
        } 
        std::cout << "\n";

        /* for printing rest of the table */
        for (int i = min; i <= max; i++) {
            std::cout << i << "\t";
            for (int j = min; j <= max; j++) {
                std::cout << i * j << '\t';
            }
            std::cout << '\n';
        }
    }
}

您的乘法代码中的一个关键错误是,您试图打印总共(max - min + 1) + 1行,标题额外打印+1。当您的代码将第一行打印为标题,然后直接从第二行开始时。

您用于加法表的代码是正确的,但是21 to 40与制表符之间的分隔符对于典型的笔记本电脑屏幕来说占用了太多空间,并不是说输出不会很漂亮。

在我的系统上,tput linestput cols的输出分别为38和144。 这对您的代码来说还不够。

您可以使用printf固定宽度输出,以printf格式化输出。

考虑到您对C ++不太熟悉,我想说明一下 将std名称空间用作默认名称空间将适用于该程序,但是在处理较大的项目时,应始终为其添加前缀。

答案 2 :(得分:0)

我没有足够的声誉来添加评论

如果是的话,我正在评论这些行

如果(i ==分钟){            cout <<'X'; 其他           cout <<我; cout <<'\ t';