Эта программа не обновляет значение и не проверяет новое значение - PullRequest
1 голос
/ 20 марта 2019

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

#include<stdio.h>
#include<stdlib.h>
#include<strings.h>
#include<windows.h>

int pin();  

int main()
{
    int pin();
    {
        int pin,new_pin,old_pin;
        {
            old_pin=1111;
            printf("Enter your pin: ");
            scanf("%d", &pin);

            if(pin==old_pin)
            {
                printf("PIN succefully verified \n");
            }
            else if(pin!=old_pin)
            {
                printf("PIN couldn't be verified. \n");

                printf("Press 1 to generate a new pin, 2 to re-enter or 0 to exit\n");
                scanf("%d", &new_pin);
                if (new_pin==1)
                {
                    printf("Your new pin is: \n");
                    //generating random 4numbered pin

                    int i,random;
                    for(i=0; i<3; i++)
                        random= (rand() );
                    printf("%d\n", random);

                    main();
                    random=new_pin;
                    new_pin=old_pin;
                }
                else if (new_pin==2) {
                    main();
                }
                else{
                    printf("Exiting the program....\n");
                    exit;
                }
            }
        }
    }
    return(0);
}

1 Ответ

0 голосов
/ 20 марта 2019

Что там не так?

Прежде всего, необходимо пересмотреть код. Вы ссылаетесь на функцию с именем pin(), исходный код которой мы не знаем. Далее мы сталкиваемся с крошечным конфликтом имен (int pin;, int pin();). Слишком много блоков кода. Переменные имеют плохое имя (new_pin не новый вывод, old_pin не старый). Цикл для генерации вывода бесполезен, поскольку вы переопределяете переменную без сохранения старых случайностей. Многострочные строки без \ в printf (и других) запрещены (я заметил их где-то рядом с Вашим исходным кодом). exit отсутствует парантез. Это касается синтаксиса, оптимизации кода и качества имен.

Код рекурсивно вызывает main, и это, конечно, не очень хорошая идея (если Вы не знаете, что делаете!)

Как исправить код.

Я отформатировал и удалил int pin(); объявлений, поскольку они были избыточными. Сложность блоков кода была уменьшена, а ненужный импорт библиотеки был удален. Цикл for был упрощен (поскольку он был избыточным). Код теперь выглядит так:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int pin, new_pin, old_pin = 1111;
    printf("Enter your pin: ");
    scanf("%d", &pin);
    if (pin == old_pin)
        printf("PIN succefully verified.\n");
    else if (pin != old_pin) {
        printf("PIN couldn't be verified.\n");
        printf("Press 1 to generate a new pin, 2 to re-enter or 0 to exit\n");
        new_pin = getchar();
        if (new_pin == '1') {
            int i, random;
            printf("Your new pin is: %4d\n" rand() % 9999);
            main();
        } else if (new_pin=='2')
            main();

        else {
            printf("Exiting the program....\n");
            return 0;
        }
    }
}

Теперь давайте реализуем функционал, сделанный неправильно. Новый штифт сломался так сильно, что объяснять его бессмысленно. Лучше получить новый. Значения были статизированы, поэтому они не исчезнут после создания нового набора локальных переменных.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    static int pin, new_pin, validPin = 1111;
    printf("Enter your pin: ");
    scanf("%d", &pin);
    if (pin == validPin)
        printf("PIN succefully verified.\n");
    else if (pin != validPin) {
        printf("PIN couldn't be verified.\n");
        printf("Press 1 to generate a new pin, 2 to fall back or any other key to exit.\n");
        new_pin = getchar();
        if (new_pin == '1') {
            validPin = rand() % 9999;
            printf("Your new pin is: %4d.\n", validPin);
            main();
        } else if (new_pin=='2')
            main();

        else {
            printf("Exiting the program.\n");
            return 0;
        }
    }
}

Теперь давайте вернемся к основному рекурсивному антипаттерну и разделим код на подпроцедуры.

#include <stdio.h>
#include <stdlib.h>

int proc() {
    /* ... the code in partially unmodified form goes here. */
}

int main(void) {
    while(!proc());
}

Наконец, давайте возьмемся за переменную область видимости, чтобы уменьшить ее до абсолютного минимума, и поместим сообщение о выходе в конце main. Код в конце выглядит так:

#include <stdio.h>
#include <stdlib.h>

int proc() {
    int pin;
    static int validPin = 1111;

    printf("Enter your pin: ");
    scanf("%d", &pin);
    if (pin == validPin)
        printf("PIN succefully verified.\n");
    else if (pin != validPin) {
        int command;
        printf("PIN couldn't be verified.\n");
        printf("Press 1 to generate a new pin, 2 to fall back or any other key to exit.\n");
        command = getchar();
        if (command == '1') {
            validPin = rand() % 9999;
            printf("Your new pin is: %4d.\n", validPin);
            return 0;
        } else if (command == '2')
            return 0;
        else 
            return 1;
    }

    return 1;
}

int main(void) {
    while(!proc());
    printf("Exiting the program.\n");
}

Так как некоторые онлайн-компиляторы C могут неправильно реагировать на getchar(), просто используйте scanf(), как вы на самом деле:

        int command;
        printf("PIN couldn't be verified.\n");
        printf("Press 1 to generate a new pin, 2 to fall back or 0 to exit:\n");
        scanf("%d", &command);
        if (command == 1) {
            validPin = rand() % 9999;
            printf("Your new pin is: %4d.\n", validPin);
            return 0;
        } else if (command == 0)
            return 1;
          else
            return 0;

Приложение

Мой окончательный код мог бы быть улучшен с помощью бого-процедуры proc() в верификаторе булавок и обработчиках команд, но приложение достаточно простое, чтобы сохранять краткость. В вашей кривой обучения этот пример приложения может быть хорошим фрагментом кода для обучения навыкам рефакторинга.

Надеюсь, мой отзыв помог вам.

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