Как предотвратить закрытие командной строки после нажатия Enter - PullRequest
0 голосов
/ 20 сентября 2019

Итак, я хотел написать программу, которая распечатывает пирамиду из "O", высота которой определяется пользовательским вводом.

#include <stdio.h>

int main()
{

    int n, i, j, k;
    scanf_s("%d", &n);
    {
        for (i = 1; i <= n; i++)
        {
            for (j = 1; j <= n - i; j++)
            {
                printf(" ");
            }
            for (k = 1; k <= 2 * i - 1; k = k + 1);
            {
                printf("O");
            }
            printf("\n");
        }
        return 0;
    }
}

Я начинающий, так что если у вас естьЛюбой совет, пожалуйста, предложите его.В любом случае, я попытался запустить его на компиляторе на Android;Казалось, работает, распечатал пирамиду.

Попробовал ее в Microsoft Visual Studio.Откроется командная строка, но после того, как я введу номер и нажму «ввод», все окно просто закроется, ничего мне не давая.Как мне предотвратить это?Программы, которые не нуждаются в вводе пользователем, работают нормально.

Ответы [ 3 ]

3 голосов
/ 20 сентября 2019

Для описанной проблемы: Предотвращение закрытия окна консоли в консольном приложении Visual Studio C / C ++

Для вашего кода, похоже, есть ошибка, и в настоящее время ваш код не будетпроизвести пирамиду, но слеш O.Чтобы решить эту проблему:

for (k = 1; k <= 2 * i - 1; k = k + 1); удалите ; из этой строки. Почему это решило проблему?

Если после цикла есть ;, это означает, что цикл ничего не делает, и тогда следующие три строки:

{
    printf("O");
}

Это означает, что существует только одна O распечатка вместо печати в цикле.

1 голос
/ 20 сентября 2019

Помимо точки с запятой после цикла for (k = 1... в этом коде нет ошибки;если Visual Studio закрывается, проблема заключается в этой программе.(Это может быть просто закрытие, потому что программа завершила выполнение, но я не знаю эту программу).

Поскольку вы пишете, что вы новичок, и вы хотели бы получить совет, я предложу несколькоСтилистические комментарии.Но это всего лишь комментарии о том, как бы я поступил по-другому на вашем месте, я не говорю, что то, что у вас есть, неверно.

  • Однобуквенные имена переменных: они вас укусят.Смешать i, j и k действительно легко, так как все они являются бессмысленными показателями.Когда ваши программы станут более сложными, вы будете счастливы иметь значимые имена переменных.Кроме того, если вы пытаетесь найти экземпляры переменной, поиск «i» будет намного сложнее, чем поиск «пробелов» или «spc»
  • Блок кода в scanf_s (): нет причин дляиметь этот код внутри блока - все, что нужно, это сдвинуть внутренний код на одну вкладку вправо.Screenspace очень важен.
  • Скорее всего, вам будет удобнее выполнять итерацию от 0, чем от 1, так как вы будете использовать переменную итератора в качестве индекса массива.Привыкание писать циклы в виде for (dex = 0 ; dex < max_val ; dex++) будет вам полезно.Обратите внимание, что сравнение «dex
  • «k = k + 1» мне кажется плохим - люди, читающие ваш код, должны остановиться и попытатьсяВыясните, почему это не просто "k ++", чего ожидают люди и что вы используете в двух других циклах.(И даже для увеличения на единицу я ожидал бы что-то вроде «k + = 2», а не «k = k + 2»)
0 голосов
/ 21 сентября 2019

Когда консольное приложение возвращается из основного метода, соответствующее окно консоли закрывается автоматически.Для ОС Windows добавьте system("pause"); перед оператором return 0;.Для независимого от платформы решения вы можете просто показать пользователю подсказку и подождать нажатия клавиши, прежде чем вернуться из основного режима.Любой символ, оставшийся во входном буфере (в этом случае введите от scanf), должен быть очищен.

int main()

{
   .........
   .........
   //clear input buffer
   int d;
   while ((d = getchar()) != '\n' && d != EOF) { }
   printf("Press ENTER key to Continue\n");  
   getchar(); 
   return 0;
}
...