Szyfr cezara deszyfrorwanie

0

*Witam,
Państwa zadaniem jest napisanie programu, który będzie szyfrował i odszyfrowywał zadany tekst przy pomocy szyfru Cezara z zadanym przesunięciem.

Jest to liczba odpowiadające przesunięciu, oraz w nowej linii tekst.
W oparciu o to wejście program powinien:

Przekazać tekst do funkcji prepare, która usunie z niego znaki niealfabetyczne, zamieni polskie ogonki na odpowiadające im litery bezogoniaste i zamieni całość na małe litery. Rezultat proszę wyświetlić.

Przekazać tekst i przesunięcie do funkcji cezar, która go zaszyfruje. Rezultat proszę wyświetlić.

Przekazać zaszyfrowany tekst i przesunięcie do funkcji brutus, która to rozszyfruje. Rezultat proszę wyświetlić.*
Nie działa mi tylko funkcja "brutus". Ktoś wie jak ją naprawić

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* prepare(char *tekst)
{
     int p = -1, q = 0;
     while (tekst[++p] != '\0')
     {
        int a=tekst[p];
         switch(a)
        {
      case -92:
         tekst[p] = 65;
         break;
      case -91:
         tekst[p] = 97;
         break;
      case -113:
         tekst[p] = 67;
         break;
      case -122:
         tekst[p] = 99;
         break;
      case -88:
         tekst[p] = 69;
         break;
      case -87:
         tekst[p] = 101;
         break;
      case -99:
         tekst[p] = 76;
         break;
      case -120:
         tekst[p] = 108;
         break;
      case -29:
         tekst[p] = 78;
         break;
      case -28:
         tekst[p] = 110;
         break;
      case -32:
         tekst[p] = 79;
         break;
      case -94:
         tekst[p] = 111;
         break;
      case -105:
         tekst[p] = 83;
         break;
      case -104:
         tekst[p] = 115;
         break;
      case -67:
         tekst[p] = 90;
      case -66:
         tekst[p] = 122;
         break;
      case -115:
         tekst[p] = 90;
         break;
      case -85:
         tekst[p] = 122;
         break;
      default:
         break;
      }
            if(tekst[p]>64 && tekst[p]<91)
            {
                tekst[p]=tekst[p]+32;
            }
            if(a>=0 && a<=64 || a>=91 && a<=96 || a>=123 && a<=255)
            {}
            else
            {
                tekst[q++] = tekst[p];
            }
     }
        tekst[q] = '\0';
        return(tekst);
}
char* cezar(char* tekst,int x)
{
    if(x>26)x=x%26;
    for(int i=0;i<strlen(tekst);i++)
    {
        if(tekst[i]>=97 && tekst[i]<=122-x) tekst[i]=tekst[i]+x;
        else if(tekst[i]>=123-x && tekst[i]<=122) tekst[i]=tekst[i]-26+x;
    }
    return(tekst);
}
char* brutus(char* tekst, int x)
{
    if(x>26)x=x%26;
    for(int i=0;i<strlen(tekst);i++)
    {
        if(tekst[i]>=97 && tekst[i]<=122-x) tekst[i]=tekst[i]+x;
        else if(tekst[i]>=123-x && tekst[i]<=122) tekst[i]=tekst[i]-26+x;
    }
    return(tekst);
}
 int main() {
    int klucz;
    scanf("%d", &klucz);
    char tekst[1001];
    getc(stdin);
    gets(tekst);
    printf("%s\n\n",prepare(tekst));
    printf("%s\n\n",cezar(tekst,klucz));
    printf("%s\n",brutus(tekst,-klucz));

    return (0);
}
0

Co ci tam nie działa?

0
szweszwe napisał(a):

Co ci tam nie działa?

No, funkcja "brutus" pobiera zaszyfrowany tekst i ma go odszyfrować. Nie działa dobrze, bo zamienia mi na złe znaki.

2

Ten kod jest kompletnie nieczytelny, zainwestuj pół godziny i poczytaj o dobrodziejstwach funkcji z nagłówka <ctype.h>

0

Nie działa dobrze bo są głupie warunki w ifach. Skoro 'z' możesz zaszyfrować na 'a' to potem dla 'a' wykonasz a + x gdzie x jest ujemne co spowoduje że weźmiesz sobie jakiś znak zamiast 'z'. Zweryfikuj sobie jeszcze raz te operacje spokojnie, najlepiej z małym przesunięciem.

1

litości z tym kodem. Taki prosty problem, a wyszła z tego nieczytelna sieczka.
Już lepiej napisać od zera:

const int maxKeyValue = 'z' - 'a' + 1;

int normilizeKey(int key)
{
    key = key % maxKeyValue;
    if (key < 0) key += maxKeyValue;
    return key;
}

char cezarChar(int key, char ch)
{
    if (isupper(ch)) {
          return 'A' + (ch - 'A' + key) % maxKeyValue;
    }
    if (islower(ch)) {
          return 'a' + (ch - 'a' + key) % maxKeyValue;
    }
    return ch;
}

void cezarString(int key, const char *src, char *dst)
{
     key = normilizeKey(key);
     while (*src) {
          *dst = cezarChar(key, *src);
          ++src;
          ++dst;
     }
     *dst = 0;
}

https://wandbox.org/permlink/JFHHxWPcOhWJRaZn

1 użytkowników online, w tym zalogowanych: 0, gości: 1