[C++] Losowanie bez powtórzeń
Ostatnio zmodyfikowano 2012-07-10 22:35
jankowalski25 |
» 2012-07-10 12:55:01 std::string s;
s.reserve( 26 ); s[ 25 ] = 'Z';
Wywołaj za zmiennymi typu std::string funkcję reserve(), aby określić ich minimalny rozmiar. Pamiętaj, że operator[] nie zmienia rozmiaru typu std::string w razie przekroczenia zakresu. |
|
Mufas Temat założony przez niniejszego użytkownika |
» 2012-07-10 15:41:09 a jednak musze wrocic do poprzedniego pytania, dlaczego bez mojej wiedzy (i zgody) wartosci w stringu podst sa zmianiane, przyklad: Program szyfruje tekst szyfrem podstawieniowym Wpisz tekst sadzik Podstawienie A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Y K U B F V I M A D G N Z P H X L C W S J T Q O E R Szyfrowanie ponowne wyswietlenie tablicy podst W W B R A G I M A D G N Z P H X L C W S J T Q O E R zaszysforwany tekts WWBRAG
podstawia sie dobrze, rozmiary stringow sa ok itp Ale jak widac litere S podstawia dobrze do tekstu zaszyfrowanego ale czemu tez do stringa podst?? |
|
jankowalski25 |
» 2012-07-10 17:45:32 Kod, który podałeś w poście P-59755 powinien działać prawidłowo po użyciu funkcji reserve() (sprawdzałem i u mnie daje prawidłowe wyniki, zmienna podst się nie zmienia po szyfrowaniu). wywalilem stringa alfabet i pracuje tylko na podst |
W nowym kodzie mogły się pojawić nowe błędy. Spróbuj użyć starego kodu, a jeśli nadal będziesz miał problem, to podaj nowy kod. //edit: Jesteś pewny, że wynik zapisujesz we właściwej zmiennej, a nie w tablicy podst? (tak wnioskuję z pokazanego przykładu) |
|
Mufas Temat założony przez niniejszego użytkownika |
» 2012-07-10 20:05:03 dalem reserve() i o dziwo działa :) dzieki, ale teraz losowanie bez powtorzen zle idzie #include <iostream> #include <string> #include <conio.h> #include <time.h> #include <stdlib.h> #include <vector> using namespace std; bool sprawdz( string podst, int x, char d ) { for( int i = 0; i <= x; i++ ) { if( podst[ i ] == d ) return true; } return false; }
int losowanie() { return( 65 +( rand() % 26 ) ); }
int main() { srand( static_cast < unsigned int >( time( NULL ) ) ); cout << "Program szyfruje tekst szyfrem podstawieniowym" << '\n'; short int m; string a, b; cout << "Wpisz tekst" << '\n'; getline( cin, a ); m = a.length(); for( int k = 0; k <= m - 1; k++ ) { a[ k ] = toupper( a[ k ] ); } string podst; podst.reserve( 26 ); char s = 65; cout << "Podstawienie" << '\n'; for( int i = 0; i < 26; i++ ) { podst[ i ] = s; s++; cout << podst[ i ] << " "; } cout << '\n'; for( int i = 0; i < 26; ) { char d = losowanie(); if( sprawdz( podst, i, d ) == false ) { podst[ i ] = d; i++; } } for( int i = 0; i < 26; i++ ) { cout << podst[ i ] << " "; } cout << '\n'; cout << "Szyfrowanie" << '\n'; for( int i = 0; i <= m - 1; i++ ) { char d = a[ i ]; d = d - 65; for( int j = 0; j < 27; j++ ) { if( j == d ) { b[ i ] = podst[ j ]; break; } } } for( int i = 0; i <= m - 1; i++ ) cout << b[ i ]; getch(); return 0; }
moze cos zle przekazuje do funkcji spradz(), pierwszy raz mam do czynienia z vectorami i reserve() wiec pewnie sa tu jakies bledy |
|
jankowalski25 |
» 2012-07-10 21:37:38 bool sprawdz( string podst, int x, char d ) bool sprawdz( string & podst, int x, char d )
Trzeba użyć referencji, aby po wyjściu z funkcji dane nie zostały utracone. |
|
Mufas Temat założony przez niniejszego użytkownika |
» 2012-07-10 22:35:06 dzieki wilekie za pomoc. DZIALA :) |
|
1 « 2 » |