Szyfr Cezara

0

Witam w pierwszym moim poście na forum ;) Jestem początkujący jeżeli chodzi o programowanie, mam następujące zadanie:

title

Coś kombinowałem i mam taki kod:

#include <iostream>
#include <stdio.h>

using namespace std;

char duzaLitera(char x, int b)
{
    if(x>=65 && x<=90-b)
        x=int(x)+b;
    else if(x>=91-b && x<=90)
        x=int(x)-26+b;
    return x;
}
char malaLitera(char x, int b)
{
    if(x>=97 && x<=122-b)
        x=int(x)+b;
    else if(x>=123-b && x<=122)
        x=int(x)-26+b;
    return x;
}

char szyfruj(char tab[], int b)
{
    char szyfr[99];
    for (int i=0;i<99; i++)
    {

            if (tab[i]>64 && tab[i]<91)
                szyfr[i]=duzaLitera(tab[i],b);
            if (tab[i]>96 && tab[i]<123)
                szyfr[i]=malaLitera(tab[i],b);
    }
    return szyfr[99];
}
int main()
{
    int x,b;
    char a[99];
    cout << "Enter a string: ";
    fgets (a, sizeof(a), stdin);
    cout << "Enter a integer number: ";
    cin >> x;
    b = x%26;
    cout << "Zaszyfrowany napis = " << szyfruj(a,b);

    return 0;
}

Kod jednak nie działa prawidłowo, oprócz tego, jak wprowadzić znak końca napisu nie znając jego dokładnej długości?
Prosiłbym o jakieś wskazówki i wyrozumiałość, bo jestem poczatkujacy :D

1
  1. Nie widać w tym programie globalnej tablicy.
  2. Funkcja szyfruj zwraca "char", kiedy Ty masz zamiar zwrócić całą tablicę (tak zwracasz tylko ostatni znak).
  3. Funkcje biblioteki standardowej zazwyczaj dodają na koniec stringa znak końca- '\0'.
  4. W funkcjach duża/mala-litera-byłoby czytelniej, jakbyś posłużył się: 'a', 'A', 'z', 'Z'.
0
  1. To znaczy? W jaki sposób zrobić ów tablicę globalną i z czym się to je? (tzn, czy wtedy przekazuję ją jakoś przez wskaźnik do funkcji?) Szukam na internecie i naprawdę mało konkretnych informacji na "chłopski rozum" znajduję. . Do tej pory myślałem, że po prostu tablica będąc w mainie jest globalna, a w funkcjach lokalna?
  2. Rzeczywiście. Jak jednak zwrócić całą tablicę? Usuwając numer komórki i zostawiając samo return szyfruj; kompilator wyrzuca błąd: "invalid conversion from char* to char". Pewnie dałoby się to zrobić poprzez wypisanie tego po prostu w funkcji i zrobienie z niej void, ale chyba nie o to chodzi, także prosiłbym o pomoc jak ją poprawnie zwrócić?
1

1.Tablica globalna to taka do której dostęp mają wszystkie funkcje programu, dlatego musisz ją zadeklarować na samym początku, czyli po using namespace std;.
2.Z tego co kojarzę w C++ nie da rady zwrócić całej tablicy, ale możesz zwracać wskaźnik na pierwszy element owej tablicy.

1
std::string szyfruj(const std::string& s, int b)
{
    b = (b + 26) % 26;
    std::string result = s;
    for (auto& ch : result)
    {
… … …
    }
    return result;
}

int main()
{
    std::string s;
    cout << "Enter a string: ";
    if (std::getline(std::cin, s) 
    {  
        cout << "Enter a integer number: ";
        int shift;
        if (std::cin >> shift)
        {
                std::cout << szyfruj(s, shift);
                return 0;
        }
    }
    return 1;
}
1
  1. main() to też funkcja.
  2. W tym zadaniu masz utworzyć (wynika to z treści) globalną tablice po to,żeby na niej bezpośrednio operować i nie bawić się w jakieś zwracanie wartości (tak zwrócisz adres na coś co już nie istnieje, chyba że użyjesz operatora new).
0

Dziękuje wszystkim za pomoc ;) Zrobiłem według waszych porad i wszystko działa.

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