nano-stalker Temat założony przez niniejszego użytkownika |
Powtarzanie się liczb w funkcji czyBylaWylosowana() » 2015-03-06 19:56:58 Witam. Ja znów z programem "kryptograficznym". Otóż mam funkcję taką jak w tytule, przepisaną z kursu :) ale ona działa dziwnie np: |3435973836|30|115|79|76|53|3|114|80|125|26|24|25|92|91|19|75|33|54|116|5|124|109|122|104|31|106|77|86|11|63|62|74|56|37|93|59|97|27|65|90|49|1|52|41|57|39|20|73|78|35|82|70|69|13|95|8|107|9|118|112|43|12|121|45|18|60|85|21|15|38|94|66|22|120|2|42|50|47|100|0|68|23|46|28|99|99|61|123|55|14|96|32|71|36|7|83|51|113|98|88|108|4|81|58|72|117|16|16|64|102|6|40|48|119|29|89|34|87|67|84|10|110|110|105|126|111| Więc założenie jest takie że mają się wylosować liczby z przedziału od 0 do 127 i oznaczać mają zaszyfrowane znaki ASCII. Tyle że są tam powtórki i ta liczba na początku, nie wiem o co chodzi i nie mogę się jej pozbyć. A oto kod:
#include <iostream> #include <ctime> #include <cstdlib> #include <string> #include <conio.h> #include <fstream> using namespace std;
class Wczytaj { public: int wczytajmenu( int kodZnaku ); int wczytywanieCASE( int & liczba, int max ); bool testujPlik(); };
int Wczytaj::wczytajmenu( int kodZnaku ) { if( kodZnaku < 55 && kodZnaku > 47 ) return true; else { void KomunikatMenu(); cout << "Blad."; } }
int Wczytaj::wczytywanieCASE( int & liczba, int max ) { if( cin.good() == true && liczba > 0 && liczba < max ) return true; else { cout << "Podano zla liczbe! Sprobuj ponownie. Maxymalna wartosc wynosi: " << max << ".\n"; cin.sync(); cin.clear(); return false; } }
bool Wczytaj::testujPlik() { fstream plik1, plik2; bool testOK1, testOK2; plik1.open( "C:\\Wiadomosc.txt", ios::app ); if( plik1.good() == true ) { testOK1 = true; cout << "Pomyslnie wczytano plik. [Wiadomosc.txt]" << endl; plik1 << "OK"; plik1.close(); } else cout << "Wczytywanie pliku zakonczone niepowodzeniem. [Wiadomosc.txt]" << endl; plik2.open( "C:\\Szyfr.txt" ); if( plik2.good() == true ) { testOK2 = true; cout << "Pomyslnie wczytano plik. [Szyfr.txt]" << endl; plik2 << "OK"; plik2.close(); } else cout << "Wczytwywanie pliku zakonczone niepowodzeniem. [Szyfr.txt]" << endl; getch(); if( testOK1 == true && testOK2 == true ) return true; else return false; }
void KomunikatMenu() { system( "cls" ); cout << "|KRYPTOGRAF| v1.3 (rozwojowa) @edit: Funkcje wylaczone 1; 2; 3;\n _________________________\n|Menu: | \n|[1]Generuj (Normalny) |\n|[2]Generuj (Zaawansowany)|\n|[3]Dostosuj |\n|[4]Kryptograf |\n|[5]Zakoncz |\n -------------------------/\n" << endl; }
void podziekowania() { cout << "Dziekowac. Rozwojowa wersja 'generator hasel' By MikroD ;)" << endl; }
bool czyBylaWylosowana( int iLiczba, unsigned int tab[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( tab[ i ] == iLiczba ) return true; i++; } while( i < ile ); return false; }
int zaszyfruj( int kodZnaku, unsigned int tab[] ) { return tab[ kodZnaku ]; }
void kryptograf() { Wczytaj plik; if( plik.testujPlik() == true ) { int ile = 0; int i = 0; unsigned int haslo[ 127 ]; do { int liczba =( rand() % 127 ) + 0; if( czyBylaWylosowana( liczba, haslo, ile ) == false ) { ile++; haslo[ ile ] = liczba; } } while( ile < 127 ); cout << "Tresc wiadomosci:\n" << endl; ile = 0; unsigned int kod, szyfr[ 999 ]; do { kod = getch(); string znak; znak = kod; if( kod != 27 ) { ile++; cout << znak; szyfr[ ile ] = zaszyfruj( kod, haslo ); continue; } else break; } while( kod = 27 ); fstream plik1, plik2; plik1.open( "C:\\Wiadomosc.txt", ios::app, ios::binary ); plik2.open( "C:\\Szyfr.txt", ios::app, ios::binary ); cout << "\nZaszyfrowana wiadomosc:\n"; i = 0; for( i; i < ile; i++ ) { plik1 << szyfr[ i ]; cout << "|" << szyfr[ i ]; } cout << "|\nKlucz rozszyfrowujacy:\n"; for( i = 0; i < 127; i++ ) { plik2 << "|" << haslo[ i ]; cout << "\n" << haslo[ i ]; } cout << "|" << endl; getch(); } }
void System( int menu ) { Wczytaj object; int max, ile, i; switch( menu ) { case 52: kryptograf(); break; } }
int main() { srand( time( 0 ) ); Wczytaj object; int menu; do { KomunikatMenu(); for(;; ) { menu = getch(); if( object.wczytajmenu( menu ) == true ) break; }; System( menu ); } while( menu != 53 ); podziekowania(); getch(); return 0; }
To jest cały kod. Program jeszcze nie skończony. Wiem niepotrzebnie się bawię wstawiając klasy ale się uczę :) Czuję że to błędy logiczne. Mógłby ktoś pomóc? proszę i dziękuje :) |
|
Brunon3 |
» 2015-03-06 20:20:28 Zawijanie tekstu się popsuło? |
|
michal11 |
» 2015-03-06 20:34:25 Prawdopodobnie nie inicjujesz wartości jakiejś zmiennej na początku, nie chce mi się wczytywać bo ten kod wygląda dość zagmatwanie. Może wklej fragment odpowiedzialny za wpisywanie do tablicy i wypisywanie ? |
|
nano-stalker Temat założony przez niniejszego użytkownika |
» 2015-03-06 20:43:30 Proszę: bool czyBylaWylosowana( int iLiczba, unsigned int tab[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( tab[ i ] == iLiczba ) return true; i++; } while( i < ile ); return false; }
int zaszyfruj( int kodZnaku, unsigned int tab[] ) { return tab[ kodZnaku ]; }
void kryptograf() { Wczytaj plik; if( plik.testujPlik() == true ) { int ile = 0; int i = 0; unsigned int haslo[ 127 ]; do { int liczba =( rand() % 127 ) + 0; if( czyBylaWylosowana( liczba, haslo, ile ) == false ) { ile++; haslo[ ile ] = liczba; } } while( ile < 127 ); cout << "Tresc wiadomosci:\n" << endl; ile = 0; unsigned int kod, szyfr[ 999 ]; do { kod = getch(); string znak; znak = kod; if( kod != 27 ) { ile++; cout << znak; szyfr[ ile ] = zaszyfruj( kod, haslo ); continue; } else break; } while( kod = 27 ); fstream plik1, plik2; plik1.open( "C:\\Wiadomosc.txt", ios::app, ios::binary ); plik2.open( "C:\\Szyfr.txt", ios::app, ios::binary ); cout << "\nZaszyfrowana wiadomosc:\n"; i = 0; for( i; i < ile; i++ ) { plik1 << szyfr[ i ]; cout << "|" << szyfr[ i ]; } cout << "|\nKlucz rozszyfrowujacy:\n"; for( i = 0; i < 127; i++ ) { plik2 << "|" << haslo[ i ]; cout << "\n" << haslo[ i ]; } cout << "|" << endl; getch(); } } void System( int menu ) { switch( menu ) { case 52: kryptograf(); break; } }
int main() { srand( time( 0 ) ); Wczytaj object; int menu; do { for(;; ) { menu = getch(); if( object.wczytajmenu( menu ) == true ) break; }; System( menu ); } while( menu != 53 ); getch(); return 0; }
Dzięki, fragment znajduje się w funkcji kryptograf() |
|
michal11 |
» 2015-03-06 21:05:12 Liczba na początku bierze się z tego fragmenu: if( czyBylaWylosowana( liczba, haslo, ile ) == false ) { ile++; haslo[ ile ] = liczba; }
najpierw zwiększasz indeks a później przypisujesz (zrób sobie symulację dla ile=0); |
|
nano-stalker Temat założony przez niniejszego użytkownika |
» 2015-03-06 21:14:15 Aha okej dziękuję ;) a to powtarzanie liczb dałoby się jakoś rozwiązać? Bo widzę że dość proste błędy popełniam. @edit: O działa dobrze! taki prosty błąd :D dziękuję za pomoc! Jesteście wielcy! :) |
|
« 1 » |