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 |