Logi c ошибка с программой кодирования / декодирования (C) - PullRequest
2 голосов
/ 20 февраля 2020

Я новичок в классе программирования C, и наша задача для третьей главы нашего учебника состояла в том, чтобы создать программу кодирования / декодирования, которая берет четыре цифры из пользовательского ввода и переставляет их в зависимости от того, пользователь хочет, чтобы они были либо закодированы, либо декодированы. У меня также возникают проблемы с тем, чтобы программа выполняла как декодирование, так и кодирование в одном файле . Однако, когда я запускаю программу, всякий раз, когда я выбираю кодирование и ввод моих четырех цифр, программа не только дает мне массивное число, которое должно быть только четырьмя цифрами в качестве закодированного результата. Это также дает мне приглашение «нажать любую клавишу для продолжения», обозначающее конец программы, вместо того, чтобы начинать все сначала и возвращаться туда, где он просит пользователя либо декодировать, либо кодировать.

Вывод также прилагается.


Я пытался осмотреться и изменить некоторые переменные с int на double, а также проверить свою математику ... Я не уверен на 100%, почему шифрование и дешифрование не ограничены ничем, кроме четырех цифр.

Что касается запуска программы заново, я попытался использовать do-while l oop, но, похоже, оно не работает, поэтому я удалил его .. Я также попытался использовать другой оператор if с последующим использованием break, но он был помечен как ошибка.


Присвоение говорит, что «каждый di git должен быть зашифрован путем добавления 7 и взятия остатка после деления на 10; после шифрования каждого ди git, поменяйте местами первую и третью цифры, а затем поменяйте местами вторую и четвертую цифры. Расшифровка должна полностью изменить процесс. Программа должна выполнить кодирование и декодирование в одном файле.

Вот пример что мой инструктор написал для этого, вот как должен выглядеть вывод.

Enter a four digit number: 1234
Encoded Digits: 0189
Continue (1) Exit (0): 1
Encode (1) Decode (2): 2
Enter a four digit number: 0189
Decoded Digits: 1234
Continue (1) Exit (0): 0

Вот мой код:

///Compiler used: Microsoft Visual Studio
///Language: C
#include <string>
#pragma warning(disable: 4996) 
#include <math.h>
#include<stdio.h>
#include<stdlib.h>

int main()
{

    int Encodechoice = 1;
    int inputdigit1 = 0;
    int Decodechoice = 2;
    int UserChoice = 0;
    int ContinueChoice = 0;
    int UserDigit1 = 0;
    int UserDigit2 = 0;
    int UserDigit3 = 0;
    int UserDigit4 = 0;

    {
        printf("(1) Encode, (2) Decode\n");
        printf("Make your selection.\n");//Asks user to make selection
        scanf_s("%d", &UserChoice);

        if (UserChoice == 1)//begin encryption

        {
            UserDigit1 = 0;
            UserDigit2 = 0;
            UserDigit3 = 0;
            UserDigit4 = 0;
            printf("Encode: Enter FOUR integers.\n");
            scanf_s("%d", &UserDigit1, &UserDigit2, &UserDigit3, &UserDigit4);
            int EncodedIntegers1 = (UserDigit1 + 7) % 10;
            int EncodedIntegers2 = (UserDigit2 + 7) % 10;
            int EncodedIntegers3 = (UserDigit3 + 7) % 10;
            int EncodedIntegers4 = (UserDigit4 + 7) % 10;
            printf("Encoded result:\n");
            printf("%d", "%d", "%d", "%d\n", EncodedIntegers3, &EncodedIntegers4, &EncodedIntegers1, &EncodedIntegers2); /// swap order of integers
        }///end if

        if (UserChoice == 2)///begin decryption
        {
            UserDigit1 = 0;
            UserDigit2 = 0;
            UserDigit3 = 0;
            UserDigit4 = 0;
            printf("Decode: Enter FOUR integers.\n");
            scanf_s("%d", &UserDigit1, &UserDigit2, &UserDigit3, &UserDigit4);
            int DecodedIntegers1 = (UserDigit1 - 7) * 10;
            int DecodedIntegers2 = (UserDigit2 - 7) * 10;
            int DecodedIntegers3 = (UserDigit3 - 7) * 10;
            int DecodedIntegers4 = (UserDigit4 - 7) * 10;
            printf("Decoded result:\n");
            printf("%d", "%d", "%d", "%d\n", DecodedIntegers1, &DecodedIntegers2, &DecodedIntegers3, &DecodedIntegers4); /// keep order the same to decrypt
        }///end if
        system("pause");
        return 0;
    }
}

Вывод:

Make your selection.
1
Encode: Enter FOUR integers.
1234
Encoded result:
11893608 Continue? (1) Yes, (0) No
Make your selection.
1
Press any key to continue . . .```


Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Вы сканируете неправильно. Я бы предпочел сделать это

char UserInputNumber[5];
printf("Encode: Enter FOUR integers.\n");
scanf("%s", UserInputNumber);
// optional error checking the input: length is 4? All char is a number?
UserDigit1 = (UserInputNumber[0] - '0');
UserDigit2 = (UserInputNumber[1] - '0');
UserDigit3 = (UserInputNumber[2] - '0');
UserDigit4 = (UserInputNumber[3] - '0');

Также ваш printf должен выглядеть следующим образом:

printf("%d%d%d%d\n", EncodedIntegers3, EncodedIntegers4, EncodedIntegers1, EncodedIntegers2);

С помощью & вы пытались напечатать их адрес памяти не их значение, а также ваш неверная строка формата.

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

Самый простой способ - это, вероятно, работать непосредственно со строкой, состоящей из четырех цифр:

char d[5], e[5] = { 0 };
scanf("%4s", d)

Это для кодирования:

for (int i = 0; i < 4; i++) e[(i+2)%4]=(d[i]-41)%10+'0';

Для декодирования необходимо изменить волхвы c 41 до 45. Результат в e.

...