Шаблон печати с вложенными для циклов в C - PullRequest
0 голосов
/ 20 февраля 2019

Я готовлюсь к экзамену, и профессор попросил программу, которая может распечатать следующие шаблоны: изображение ожидаемого результата

N=2    N=3    N=4    N=5
**     ***    ****   *****
 **     ***    ****   *****
       ***    ****   *****
               ****   *****
                     *****

(за исключением изображения, пропущенногопятая строка для N=5.)

Моя программа может получить аналогичный вывод, за исключением того, что она удваивает число строк для каждого ожидаемого вывода (т.е., если N = 3, есть 6 строк, когда N = 4 есть8 рядов).Не уверен, как остановить его выполнение после того, как число строк достигнет N. Вот мой код ниже:

#include <stdio.h>

int main() {

    int N, rows1, width1, rows2, width2;

    printf("Please enter a number between 2 and 5 (including 2 and 5).\n");
    scanf("%d", &N);

    if (N<2 || N>5)
    {
        printf ("The number you entered is either less than 2 or greater than 5."
                " Please try again.\n");
                return 0;
    }

    for (rows1=1; rows1<=N; rows1++)
    {
        for(width1=1; width1<=N; width1++)
            printf ("*");
        printf ("\n");

        for(rows2=1; rows2<=1; rows2++)
            printf (" ");

        for(width2=1; width2<=N; width2++)
            printf ("*");
        printf ("\n");
    }
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вы печатаете дважды в вашем внешнем цикле.Т.е. у вас есть

for 1 to N, stepping by 1
    print line

    print leading space
    print line

Таким образом, вы печатаете два раза N строки, когда хотите напечатать ровно N строк.

Либо увеличьте свой прирост (замените rows++ на rows += 2, что приведет к печати только четного числа строк, поэтому вам придется исправить его для нечетного N), либо измените на печатьтолько одна строка за итерацию (где вам нужно исправить чередующийся начальный пробел). Ответ @ malanb5 кодирует пример последнего решения.

0 голосов
/ 20 февраля 2019

1) В первом условном выражении вы возвращаете 0, чтобы обозначить успех.Я бы пошел с макросом EXIT_FAILURE (еще лучше использовать цикл while, пока вы не получите действительный ввод от пользователя) в условном получении пользовательского ввода.

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

************* ТОЛЬКО СМОТРИТЕ НА ЭТО, КОГДА ВЫ ПОПЫТАЕТЕИСПРАВЛЕНИЕ ЭТОГО СЕБЯ ***********

int main() {

        int N;

        printf("Please enter a number between 2 and 5 (including 2 and 5). \n");
        scanf("%d", &N);

        if (N<2 || N>5)
        {
            printf ("The number you entered is either less than 2 or greater than 5. \
            Please try again.");
            return EXIT_FAILURE;
        }

        for (int length= 0; length < N; length++) {
            if(length %2 == 1){
                    printf(" ");
            }
            for(int width = 0; width < N; width++) {

                printf("*");
            }
            printf("\n");
        }

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