Как исправить ошибки сложения / умножения таблицы? - PullRequest
0 голосов
/ 09 сентября 2018

У меня проблемы с некоторыми входными данными для моей таблицы сложения / умножения, и я надеюсь найти некоторую помощь в исправлении этой ситуации. Я начну с публикации того, что у меня есть для программы.

Код выглядит следующим образом:

#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';
        }
    }

}

Теперь вот ошибки, которые я получаю из этого кода, которые я не могу исправить. Во-первых, при выполнении таблицы MUlTIPLY с min = 1, max = 1, я получаю:

X    1

когда я должен получить (я верю)

X    1
1    1

Во-вторых, при выполнении таблицы MULTIPLY с min = 1, max = 12 я получаю:

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

И, наконец, при использовании таблицы ADD с min = 21, max = 40 я не могу опубликовать весь код, так как это беспорядок, но в основном столбцы / строки выглядят следующим образом:

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

Когда очевидно, что код должен выводить строки и столбцы равными 21 - 40 равномерно. Как вы можете видеть в последнем примере, мои строки выводятся правильно, но почему-то мои столбцы представляют собой полный искаженный беспорядок.


Я некоторое время сидел и смотрел на этот код, и не могу решить эти проблемы под рукой. Может ли кто-нибудь помочь привести меня в правильном направлении? Я очень ценю любую помощь и подсказки :)

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

Проверьте это. Может быть не полностью оптимизирован, но работает

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';
        }
    }
}

См. Вывод здесь .

0 голосов
/ 09 сентября 2018
#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 lines и tput cols составляли 38 и 144 соответственно. которого было недостаточно для вашего кода.

Вы можете отформатировать вывод с помощью printf, используя вывод printf с фиксированной шириной.

Учитывая, что вы не очень хорошо знакомы с C ++, я хотел бы заявить, что использование пространства имен std в качестве пространства имен по умолчанию будет работать для этой программы, но когда вы работаете с большими проектами, вы всегда должны ставить перед ним префикс.

0 голосов
/ 09 сентября 2018

У меня недостаточно репутации, чтобы добавить комментарий

если бы я был, я комментировал эти строки

if (i == min) { cout << 'X'; еще кут << я; cout << '\ t'; </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...