Как сломать время l oop, когда оно ложно для определенного условия - PullRequest
3 голосов
/ 07 января 2020

Я пытался создать программу, в которой, если я введу целое число, программа обнаружит большее число и вычтет его на меньшее число. Эта часть, я понял.

Проблема в том, что бесконечная часть l oop.

Я пытался заставить type in two integers продолжать печатать, пока l oop, и break, когда набирается хотя бы один символ.

Например, если я наберу 2 @, он сломается.

Но я не мог найти место записи для получения break; в коде, и поэтому всякий раз, когда я вводил символ, он продолжал создавать бесконечное l oop.

Is Есть ли способ создать разрыв в этом коде? Я смиренно прошу совета ...

Ниже приведен код, который я не смог поставить break (Кстати, причина, по которой я выполнил условие, пока sizeof(i)==4 || sizeof(j)==4 состояла в том, чтобы его выполнить поэтому он будет вводить только целое число, так как размер целого числа равен 4)

int main()
{   
    int i, j;
    int result;

    while (sizeof(i)==4 || sizeof(j)==4){
        printf("type in two integers : ");
        scanf("%d %d", &i, &j);
        if (i < j) {
            result = j - i;
        }
        else if (j < i){
            result = i - j;
        }

        printf("%d\n", result);
    }

    return 0;
}

Нижний код - это тот, который я пытался поставить break, но не смог (он продолжал создавать бесконечное l oop) ...

int main()
{   
    int i, j;
    int result;

    while (sizeof(i)==4 || sizeof(j)==4){
        if (sizeof(i) == 4 || sizeof(j) == 4) {
            printf("type in two integers : ");
            scanf("%d %d", &i, &j);
            if (i < j) {
                result = j - i;
            }
            else if (j < i) {
                result = i - j;
            }

            printf("%d\n", result);
        }
        else
            break;
    }

    return 0;
}

и вот код, в котором я избавился от sizeof и использовал while(1), хотя в том факте, что break не сделал больших изменений, особых изменений не было т работа ...

int main()
{   
    int i, j;
    int result;

    while (1){
            printf("type in two integers : ");
            scanf("%d %d", &i, &j);
            if (i < j) {
                result = j - i;
            }
            else if (j < i) {
                result = i - j;
            }

            printf("%d\n", result);
    }

    return 0;
}

Ответы [ 2 ]

3 голосов
/ 07 января 2020

Отбросьте всю концепцию бесконечного l oop с разрывом внутри, если.
Создайте условие для l oop, основанное на возвращаемом значении scanf(), то есть практически для того, для чего оно разработано.

#include <stdio.h>

int main()
{   
    /* always init everything */
    int i=0, j=0;
    int result=0;

    printf("type in two integers : ");
    while (2==scanf("%d %d", &i, &j))
    {
        if (i < j) {
            result = j - i;
        }
        else /* removed second if, to have a meaningful result for i==j */
        {
            result = i - j;
        }

        printf("%d\n", result);
        printf("type in two integers : ");            
    }

    return 0;
}

Я, вероятно, на самом деле использовал бы do {...} while (...) с переменной, хранящей возвращаемое значение scanf() для использования в условии l oop. Я бы посчитал его более элегантным, так как не нужно было копировать распечатку, но я держал его ближе к вашей структуре кода.

Больше комментариев к вашему коду:

  • , как объяснено в комментариях sizeof() работает не так, как вы думаете; это stati c и не изменяется во время выполнения и, следовательно, не может использоваться в условиях al oop
  • с while (sizeof(i)==4 || sizeof(j)==4){if (sizeof(i) == 4 || sizeof(j) == 4){/* a */} else {/* b */}, b никогда не может быть достигнуто, потому что условия while и if идентичны
  • проверьте возможные результаты условий if внутри l oop, вы оставляете условие с i==j неопределенным и возвращаете неинициализированное значение
  • всегда инициализируйте все переменные как привычка
  • для хорошего MRE включает в себя строки включения

По вашему запросу вот предложение для альтернативы do-while:

#include <stdio.h>

int main()
{   
    /* always init everything */
    int i=0, j=0;
    int result=0;
    int iScanned=0;

    do 
    {
        printf("type in two integers : ");
        iScanned=scanf("%d %d", &i, &j); /* keep the return value for loop */

        if (i < j) {
            result = j - i;
        }
        else /* removed second if, to have a meaningful result for i==j */
        {
            result = i - j;
        }

        if(2==iScanned) printf("%d\n", result); /* if to avoid awkward last output */
    } while (2==iScanned);

    return 0;
}
3 голосов
/ 07 января 2020

Вы не можете использовать sizeof(i) для проверки во время выполнения! Это константа времени компиляции , которая в вашем случае (32-разрядные целые числа) будет всегда иметь значение 4 .

Чтобы проверить, что заданы два действительных целых числа, вы можете проверить возвращаемое значение *1013* функции scanf (она дает количество полей успешно отсканированных) :

#include <stdio.h>

int main()
{
    int i, j;
    int result;

    while (1) {
        printf("type in two integers : ");
        if (scanf("%d %d", &i, &j) != 2) break; // Break here if we didn't get two integers
        if (i < j) {
            result = j - i;
        }
        else if (j < i) {
            result = i - j;
        }

        printf("%d\n", result);
    }

    return 0;
}

Не стесняйтесь спрашивать у further дальнейшего разъяснения и / или объяснения.

...