C программирование для создания таблицы умножения (1-12) - PullRequest
0 голосов
/ 17 октября 2018

Я хочу создать программу, которая принимает один целочисленный аргумент командной строки (n) и создает таблицу умножения nxn, аналогичную приведенному ниже примеру 4x4.Это должно быть только от 1 до 12, но не должно быть ни меньше, ни больше.Поэтому, если аргумента недостаточно, следует вывести значение использования: Usage: program <n> \n или, если оно выходит за пределы диапазона, вывести: n out of range (1-12)\n и выйти.

Пример: ./program 4

*    1   2   3   4
  +----------------
 1|   1   2   3   4
 2|   2   4   6   8
 3|   3   6   9  12
 4|   4   8  12  16

Мой код, который я пробовал, но не увенчался успехом.Я скопировал скомпилированное не то, что ожидал ниже.

#include <stdio.h>

int main(void) 
{
    int i, j;

    printf(" +");
    for (i = 1; i < 13; ++i) 
    {
        printf("%#3d ", i);
        printf("\n");
    }

    for (i = 1; i < 64; ++i) 
    {
        printf("-");
        printf("\n");
    }

    for (i = 1; i < 13; ++i) 
    {
        printf("%#2d |", i);

        for (j = 1; j < 11; ++j) 
        {
            printf("%#3d ", i * j);
            printf("\n");
        }
    }

    return 0;
}

После компиляции:

gcc version 4.6.3

 +  1 
  2 
  3 
  4 
  5 
  6 
  7 
  8 
  9 
 10 
 11 
 12 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 1 |  1 
  2 
  3 
  4 
  5 
  6 
  7 
  8 
  9 
 10 
 2 |  2 
  4 
  6 
  8 
 10 
 12 
 14 
 16 
 18 
 20 
 3 |  3 
  6 
  9 
 12 
 15 
 18 
 21 
 24 
 27 
 30 
 4 |  4 
  8 
 12 
 16 
 20 
 24 
 28 
 32 
 36 
 40 
 5 |  5 
 10 
 15 
 20 
 25 
 30 
 35 
 40 
 45 
 50 
 6 |  6 
 12 
 18 
 24 
 30 
 36 
 42 
 48 
 54 
 60 
 7 |  7 
 14 
 21 
 28 
 35 
 42 
 49 
 56 
 63 
 70 
 8 |  8 
 16 
 24 
 32 
 40 
 48 
 56 
 64 
 72 
 80 
 9 |  9 
 18 
 27 
 36 
 45 
 54 
 63 
 72 
 81 
 90 
10 | 10 
 20 
 30 
 40 
 50 
 60 
 70 
 80 
 90 
100 
11 | 11 
 22 
 33 
 44 
 55 
 66 
 77 
 88 
 99 
110 
12 | 12 
 24 
 36 
 48 
 60 
 72 
 84 
 96 
108 
120

Я застрял на этом 2 дня и пытался понять, почему он идет прямо вниз ..Спасибо.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

В вашем коде вы делаете 2 ошибки.

  1. Вы добавляете printf ("\n") внутри цикла for.Это должно быть вне цикла for в случае одного цикла.В случае вложенного цикла, новая строка должна быть после каждого внутреннего цикла for.

  2. Вы используете %#3d в printf.# следует удалить.

Кроме этого, после внесения нескольких изменений в выравнивание printf обновленный код будет ниже

#include <stdio.h>

int main(void) 
{
    int i, j;

    printf("   +");
    for (i = 1; i < 13; ++i) 
    {
        printf("%4d ", i);
    }
    printf("\n");

    for (i = 1; i < 64; ++i) 
    {
        printf("-");
    }
    printf("\n");

    for (i = 1; i < 13; ++i) 
    {
        printf("%2d |", i);

        for (j = 1; j < 13; ++j) 
        {
            printf("%4d ", i * j);
        }
        printf("\n");
    }

    return 0;
}

Выходкак показано ниже

   +   1    2    3    4    5    6    7    8    9   10   11   12
---------------------------------------------------------------
 1 |   1    2    3    4    5    6    7    8    9   10   11   12
 2 |   2    4    6    8   10   12   14   16   18   20   22   24
 3 |   3    6    9   12   15   18   21   24   27   30   33   36
 4 |   4    8   12   16   20   24   28   32   36   40   44   48
 5 |   5   10   15   20   25   30   35   40   45   50   55   60
 6 |   6   12   18   24   30   36   42   48   54   60   66   72
 7 |   7   14   21   28   35   42   49   56   63   70   77   84
 8 |   8   16   24   32   40   48   56   64   72   80   88   96
 9 |   9   18   27   36   45   54   63   72   81   90   99  108
10 |  10   20   30   40   50   60   70   80   90  100  110  120
11 |  11   22   33   44   55   66   77   88   99  110  121  132
12 |  12   24   36   48   60   72   84   96  108  120  132  144
0 голосов
/ 17 октября 2018

следующий код:

  1. исправляет форматирование вывода,
  2. проверяет, есть ли параметр командной строки,
  3. следует за аксиомой: * только 1008 *один оператор на строку и (самое большее) одно объявление переменной на оператор.
  4. проверяет параметр командной строки, чтобы убедиться, что он числовой и находится в диапазоне 1 ... 12
  5. .scope каждой переменной
  6. вызывает puts(), где это уместно, поскольку printf() очень дорог в циклах ЦП
  7. использует соответствующий горизонтальный интервал для удобства чтения

и теперь предложенный код:

#include <stdio.h>
#include <stdlib.h>   // exit(), EXIT_FAILURE
#include <ctype.h>    // isdigit()

#define MAX_VALUE 12
#define MIN_VALUE 1

int main( int argc, char *argv[] ) 
{

    if( argc != 2 )
    {
        fprintf( stderr, "USAGE: %s <maxTableSize: range 1...12>\n", argv[0] );
        exit( EXIT_FAILURE );
    }

    // implied else, user entered a command line parameter

    if( !isdigit( argv[1][0] ) )
    {
        fprintf( stderr, "command line parameter not numeric\n" );
        exit( EXIT_FAILURE );
    }

    // implied else, command line parameter starts with digit

    int maxTableSize = atoi( argv[1] );

    if( MIN_VALUE > maxTableSize || maxTableSize > MAX_VALUE )
    {
        fprintf( stderr, "command line parameter not in valid range ( 1...12 )\n");
        exit( EXIT_FAILURE );
    }

    // implied else, command line parameter contains valid value

    printf(" +  ");
    for ( int i = 1; i <= maxTableSize; ++i ) 
    {
        printf("%4d ", i);
    }
    puts("");

    for ( int i = 1; i < 5+(maxTableSize*5); ++i ) 
    {
        printf( "-" );
    }
    puts("");

    for ( int i = 1; i <= maxTableSize; ++i ) 
    {
        printf( "%2d |", i );

        for ( int j = 1; j <= maxTableSize; ++j ) 
        {
            printf( "%4d ", i * j );
        }
        puts("");
    }

    return 0;
}

ниже демонстрирует различные условия запуска программы.(где untitled - название программы.)

./untitled
USAGE: ./untitled <maxTableSize: range 1...12>

./untitled a
command line parameter not numeric

./untitled 0
command line parameter not in valid range ( 1...12 )

./untitled 13
command line parameter not in valid range ( 1...12 )


./untitled 1
 +     1 
--------
 1 |   1 

./untitled 2
 +     1    2 
------------
 1 |   1    2 
 2 |   2    4 

 .....

./untitled 12
 +     1    2    3    4    5    6    7    8    9   10   11   12 
----------------------------------------------------------------
 1 |   1    2    3    4    5    6    7    8    9   10   11   12 
 2 |   2    4    6    8   10   12   14   16   18   20   22   24 
 3 |   3    6    9   12   15   18   21   24   27   30   33   36 
 4 |   4    8   12   16   20   24   28   32   36   40   44   48 
 5 |   5   10   15   20   25   30   35   40   45   50   55   60 
 6 |   6   12   18   24   30   36   42   48   54   60   66   72 
 7 |   7   14   21   28   35   42   49   56   63   70   77   84 
 8 |   8   16   24   32   40   48   56   64   72   80   88   96 
 9 |   9   18   27   36   45   54   63   72   81   90   99  108 
10 |  10   20   30   40   50   60   70   80   90  100  110  120 
11 |  11   22   33   44   55   66   77   88   99  110  121  132 
12 |  12   24   36   48   60   72   84   96  108  120  132  144 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...