Mufas Temat założony przez niniejszego użytkownika |
[C++] Losowanie bez powtórzeń » 2012-07-08 13:02:45 Witam, mam problem z moim progrmem i koncza mi sie pomysly jak to rozwiazac. Program bedzie szyfrowal tekst szyfrowaniem podstawieniowym. Problem polega na tym, ze chcialbym aby kazda litera alfabetu miala przyporzadkowana jedna okreslona litere (losowo wybrana). I to mi nie dziala. Ponizej zamieszczam kod, pomozcie pls. #include <iostream> #include <string> #include <conio.h> #include <time.h> #include <stdlib.h> 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, n = 1; string a, b; string alfabet, podst; cout << "Wpisz tekst" << '\n'; getline( cin, a ); m = a.length(); char s = 65; cout << "Podstawienie" << '\n'; for( int i = 0; i < 26; i++ ) { alfabet[ i ] = s; s++; cout << alfabet[ i ] << " "; } cout << '\n'; for( int i = 0; i < 26; i++ ) { for( int j = 0; j <= i; ) { char d = losowanie(); if( alfabet[ i ] != d || sprawdz( podst, 26, d ) == false ) { podst[ j ] = d; j++; } } cout << podst[ i ] << " "; } cout << '\n'; cout << "Szyfrowanie" << '\n'; getch(); return 0; } |
|
Drraven |
» 2012-07-08 13:44:43 Zobacz w kursie i / lub na forum bo było to już setki razy. |
|
Mufas Temat założony przez niniejszego użytkownika |
» 2012-07-08 16:02:53 no troche poczytalem, na kursie tez znalazlem jak to sie robi, ale nawet jak kopiuje kod z kursu to nadal nic mi nie wychodzi doszedłem do czegos takiego: #include <iostream> #include <string> #include <conio.h> #include <time.h> #include <stdlib.h> 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; string alfabet, podst; cout << "Wpisz tekst" << '\n'; getline( cin, a ); m = a.length(); char s = 65; cout << "Podstawienie" << '\n'; for( int i = 0; i < 26; i++ ) { alfabet[ i ] = s; s++; cout << alfabet[ i ] << " "; } cout << '\n'; int n = 0; for( int i = 0; i < 26; i++ ) { podst[ i ] = losowanie(); char d = podst[ i ]; if( sprawdz( podst, 26, d ) == false ) { podst[ i ] = d; n++; } if( n == 26 ) break; } for( int i = 0; i < 26; i++ ) { cout << podst[ i ] << " "; } cout << '\n'; cout << "Szyfrowanie" << '\n'; getch(); return 0; }
|
|
akcza |
» 2012-07-09 10:54:58 1. Sprawdź wartość stringu podst w funkci sprawdz(). 2. for(int i=0; i<26; i++) { podst[i]=losowanie(); //po co tu podstawiasz skoro nie wiesz czy dana litera już wystąpiła? char d=podst[i]; if(sprawdz(podst, 26, d)==false) { podst[i]=d; n++; } if(n==26) //bez sensu - po co ci zmienna n skoro masz pętlę uzależnioną od zmiennej i? wiadomo, // że pętla wykona się 26 razy, nie masz zapisanego warunku co jeśli sprawdz()==true break; } #Edit Jak na tym forum zapisać kod c++? Nigdzie nie mogę tego znaleźć. |
|
jankowalski25 |
» 2012-07-09 13:30:30 |
|
Mufas Temat założony przez niniejszego użytkownika |
» 2012-07-09 19:16:33 dzieki akcza, teraz to mi dziala, ale jest nastepny problem: mozecie mi powiedziec dlaczego stringi alfabet i podst sa takie same kod: #include <iostream> #include <string> #include <conio.h> #include <time.h> #include <stdlib.h> 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 szyfr( string alfabet, int x, char d ) { for( int i = 0; i < x; i++ ) { char s = alfabet[ i ]; if( d == s ) { return i; } } } int main() { srand( static_cast < unsigned int >( time( NULL ) ) ); cout << "Program szyfruje tekst szyfrem podstawieniowym" << '\n'; short int m; string a, b; string alfabet, podst; cout << "Wpisz tekst" << '\n'; getline( cin, a ); m = a.length(); char s = 65; cout << "Podstawienie" << '\n'; for( int i = 0; i < 26; i++ ) { alfabet[ i ] = s; s++; cout << alfabet[ 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 < 26; i++ ) { cout << alfabet[ i ] << " "; } for( int i = 0; i <= m; i++ ) { char d = a[ i ]; int p = szyfr( alfabet, 26, d ); for( int j = 0; j < 26; j++ ) { if( j == p ) { b[ i ] = podst[ j ]; break; } } } for( int i = 0; i <= m - 1; i++ ) cout << b[ i ]; getch(); return 0; }
|
|
akcza |
» 2012-07-09 20:25:01 for( int i = 0; i < 26; ) { char d = losowanie(); if( sprawdz( podst, i, d ) == false ) { podst[ i ] = d; i++; } } Dlaczego? Nie mam pojęcia. |
|
Mufas Temat założony przez niniejszego użytkownika |
» 2012-07-10 11:13:16 dobra niewazne, problem rozwiazany, wywalilem stringa alfabet i pracuje tylko na podst, ale jedna rzecz mnie wnerwia zalozmy ze koduje imie ADAM to wszystko jest ok, jak koduje np SAD to program nie widzi tego A (na drugiej pozycji) i przypisuje mu inna wartosc. Mniejwiecej tak: Program szyfruje tekst szyfrem podstawieniowym Wpisz tekst sad 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 V G Z L A D N E K R W M Q I C J U H T S F Y B P X O Szyfrowanie TTL
Process exited normally. Press any key to continue . . .
a sama petla wyglada tak: for( int i = 0; i <= m; i++ ) { char d = a[ i ]; d = d - 65; for( int j = 0; j < 26; j++ ) { if( j == d ) { b[ i ] = podst[ j ]; break; } } } |
|
« 1 » 2 |