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". #include <iostream> #include <cmath> #include <cstring> using namespace std; int main() { int dl = 0; int i = 0, j = 0, k = 0, w = 0; cout << "Podaj dlugosc klucza: "; cin >> k; char klucz[ k ]; for( i = 0; i < k; i++ ) { cout << "Podaj " << i << ". element klucza: "; cin >> klucz[ i ]; } string napis; cout << "Podaj wyraz do odszyfrowania: "; cin >> napis; dl = napis.size(); if( dl % k == 0 ) { w = dl / k; } else { w = ceil( dl / k ); } char tab[ w ][ k ]; for( j = 0; j <= w; j++ ) { for( i = 0; i <= k; i++ ) { cout << tab[ j ][ klucz[ i ] ]; } } } |
|
mateczek |
» 2016-05-20 02:00:18 widzisz po kodzie ciężko się domyśleć co autor miał na celu cout << tab[ j ][ klucz[ i ] ];
// 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 for( j = 0; j <= w; j++ ) for( j = 0; j < w; j++ )
Żeby jeszcze w tej tablicy 2D było coś sensownego :) tak na oko czytasz śmieci :) char tab[ w ][ k ];
for( j = 0; j <= w; j++ ) { for( i = 0; i <= k; i++ ) { cout << tab[ j ][ klucz[ i ] ]; } }
// edit proponuje inne podejście zamiast tablice zwyczajne przeglądanie stringa https://zapodaj.net/images/0fc042b5bcaae.png#include <iostream> using namespace std; int main() { int klucz[ 5 ] { 0, 1, 2, 3, 4 }; string text = "aaaaabbbbbcccccdddddeeeeefffffggg"; for( int i = 0; i < 5; i++ ) { int index = klucz[ i ]; while( index < text.size() ) { cout << text[ index ]; index += 5; } } cout << endl; } |
|
pekfos |
» 2016-05-20 08:08:27 |
|
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. |
|
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. |
|
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ć int klucz[ 5 ]
int rozmiar; cin >> rozmiar; int * klucz = new int[ rozmiar ];
|
|
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 |
|
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. 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<>. |
|
« 1 » 2 |