Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Deszyfracja kolumnowa - krzaczki zamiast liter

Ostatnio zmodyfikowano 2016-05-20 16:11
Autor Wiadomość
Prefectus
Temat założony przez niniejszego użytkownika
[C++] Deszyfracja kolumnowa - krzaczki zamiast liter
» 2016-05-20 01:10:59
Cześć, program ma za zadanie pobrać od użytkownika informacje na temat tablicy dwuwymiarowej, wpisać do niej wyraz podany przez użytkownika, a następnie wypisać według kolejności podanej w kluczu. Problem w tym, że na koniec zamiast liter wyświetla się "emotikon smile".

C/C++
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int main() {
    int dl = 0; //dlugosc wyrazu
    int i = 0, j = 0, k = 0, w = 0;
    cout << "Podaj dlugosc klucza: ";
    cin >> k; // ilosc kolumn
    char klucz[ k ];
    for( i = 0; i < k; i++ ) {
        cout << "Podaj " << i << ". element klucza: ";
        cin >> klucz[ i ]; // klucz szyfrowania
    }
    string napis;
    cout << "Podaj wyraz do odszyfrowania: ";
    cin >> napis;
    dl = napis.size();
    if( dl % k == 0 ) {
        w = dl / k; } // ilosc wierszy
    else {
        w = ceil( dl / k );
    }
    char tab[ w ][ k ]; // tablica 2D
   
    for( j = 0; j <= w; j++ )
    {
        for( i = 0; i <= k; i++ )
        {
            cout << tab[ j ][ klucz[ i ] ]; //wypisanie wartosci wedlug klucza
        }
    }
   
}
P-148425
mateczek
» 2016-05-20 02:00:18
widzisz po kodzie ciężko się domyśleć co autor miał na celu
C/C++
cout << tab[ j ][ klucz[ i ] ]; // klucz jest tablicą liter używanie go do indeksowania tablicy chyba nie było zamierzeniem ??
//Bo jeśli w kluczu ktoś poda literę 'a' to  taki kod sięgnie do tablicy  pod adres tab[ j ][97]; I pewnie nie o to chodziło ??

// tablic dynamicznych nie deklaruje się na stosie bo to pierwszy krok do wysypania programu. Jak nie znasz rozmiaru tablicy w czasie kompilacji, to używaj new do alokacji pamięci i delete do jej zwalniania.
http://cpp0x.pl/kursy/Kurs-C++/Dynamiczne-zarzadzanie-pamiecia-new-i-delete/307
C/C++
//We wszystkich pętlach wychodzisz poza zakres !!!
for( j = 0; j <= w; j++ ) // raczej źle
for( j = 0; j < w; j++ ) // chyba tak miało być ?? [/code]
Żeby jeszcze w tej tablicy 2D było coś sensownego :) tak na oko czytasz śmieci :)
C/C++
char tab[ w ][ k ]; //źle zadeklarowana(bo na stosie). I w dodatku nic nie zawierająca tablica 2D

for( j = 0; j <= w; j++ ) //wyjście poza zakres
{
    for( i = 0; i <= k; i++ ) //wyjście poza zakres
    {
        cout << tab[ j ][ klucz[ i ] ]; //wypisujesz pustą tablicę i w dodatku klucz[i] jest literą
    }
}
 
// edit

proponuje inne podejście zamiast tablice zwyczajne przeglądanie stringa
https://zapodaj.net/images​/0fc042b5bcaae.png

C/C++
#include <iostream>
using namespace std;
int main() {
    int klucz[ 5 ] { 0, 1, 2, 3, 4 }; //chyba chodziło o kolejność odczytywania kolumn (tablica char odpada)
    string text = "aaaaabbbbbcccccdddddeeeeefffffggg";
    for( int i = 0; i < 5; i++ ) {
        int index = klucz[ i ]; // kolumna do odczytania (kolejność podana w tablicy klucz) 
        while( index < text.size() ) {
            cout << text[ index ];
            index += 5; // zwyczajnie dodaję długość klucza (wiersza). Lub jak kto woli czytam co piątą literę!!!
        }
    }
    cout << endl;
}
P-148426
pekfos
» 2016-05-20 08:08:27
C/C++
char tab[ w ][ k ]; //źle zadeklarowana(bo na stosie).
Co z tego, że na stosie?
P-148428
mateczek
» 2016-05-20 08:17:58
wymiar podawany z klawiatury może uszkodzić inne zmienne. Jeśli będzie za duży.  Przynajmniej tak mi się wydaje . Niestety nie wiem ile kompilator przydziela pamięci na takie deklaracje i na ile można sobie pozwolić !!! Nie chcę się kłócić.Po prostu kiedyś czytałem, że tak się nie robi. Powiedziałem co wydawało mi się, że wiem. Jeśli coś się zmieniło to przepraszam. i chętnie sam skorzystam ze sprostowania. 
P-148429
Prefectus
Temat założony przez niniejszego użytkownika
» 2016-05-20 08:26:57
Jestem w 2. liceum taki sposób nie tyle proponowała, co wręcz narzuciła nam nauczycielka.

edit. Klucz przechowuje numery kolumn.
P-148430
mateczek
» 2016-05-20 08:38:36

edit. Klucz przechowuje numery kolumn.
prawie !!!
https://pl.wikipedia.org/wiki/ASCII
w twoim przypadku przechowuje nie numery ale znaki ASCII. innymi słowy litery

'0' = 48;
'1'= 49;
'a'=97;
'b'=98;
itd!!!!

index będziesz miał jeśli od tego co przechowuje twój klucz odejmiesz 48. choć prościej zrobić
C/C++
int klucz[ 5 ] // znana długość

//dynamicznie
int rozmiar;
cin >> rozmiar;
int * klucz = new int[ rozmiar ];
P-148431
Prefectus
Temat założony przez niniejszego użytkownika
» 2016-05-20 08:48:56
Faktycznie,nie zauważyłem tego char, wielkie dzięki za pomoc. :D
P-148432
pekfos
» 2016-05-20 08:58:32
Jestem w 2. liceum taki sposób nie tyle proponowała, co wręcz narzuciła nam nauczycielka.
Więc nie zna się na programowaniu w C++. To normalne u 'informatyków' w szkołach. W większości zatrzymali się w epoce Turbo Pascala, a tu nagle TP stał się passé..

Niestety nie wiem ile kompilator przydziela pamięci na takie deklaracje i na ile można sobie pozwolić !!!
Na stos dorzucane jest tyle pamięci, ile potrzeba. Tak więc zbyt duży rozmiar przepełni po prostu stos i tyle. Działa to bardzo podobnie do alloca(), chociaż są między tymi sposobami istotne różnice (na tyle istotne, by nie można było sobie beztrosko używać obu naraz).

Po prostu kiedyś czytałem, że tak się nie robi.
W C++ się tak nie robi, bo to nie należy do standardu języka. Powyższe było pisane w kontekście kompilatora GCC 5.3, inne kompilatory mogą to robić inaczej, lub w ogóle tego nie robić. To jak goto - zły styl pisania i zawsze można się łatwo obejść bez używania tego.

C/C++
int rozmiar;
cin >> rozmiar;
int * klucz = new int[ rozmiar ];
A zwalnianie pamięci gdzie? Jak już pokazujesz zamiennik, to niech widać, że to nie jest taka zaraz prosta zamiana. Albo pokazuj std::vector<>.
P-148434
« 1 » 2
  Strona 1 z 2 Następna strona