Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Powtarzanie się liczb w funkcji czyBylaWylosowana()

Ostatnio zmodyfikowano 2015-03-06 21:14
Autor Wiadomość
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:
C/C++
// Kryptograf v2.0.cpp : Defines the entry point for the console application.
// Jak narazie wersja rozwojowa >> potestowac klasy
#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;
   
    //Wczytywanie pliku Wiadomosc ------------
   
    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;
   
    //Wczytywanie pliku Szyfr-----------------
   
    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;
   
}

/*int generatorN() //NORMAL
{
int a;
{
cout << "\nGeneruje... " << endl;
a = rand();
}
return a;
}

int generatorZ( int ile) //GENERATOR ZAAWANSOWANY
{
cout << "\nGeneruje...\n" << ">> ";
int zmienna;
for( int i = 0; i < ile ; i++ )
{
zmienna = ( rand() % 999 ) + 0;
cout << zmienna;
}
cout << " <<" << endl;
return 0;
}

int generatorD( int Od, int Do, int ile) // GENERATOR DOSTOSOWANY
{
cout << "\nGeneruje...\n" << ">> ";
for( int i = 0; i < ile; i++ )
{
int haslo = ( rand() % Do - Od ) + Od;
cout << haslo;
}
cout << " <<";
return 0;
}*/
// nie usuwac

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 )
    {
        /*Losuj liczby---------------*/
        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 );
       
        /*Koniec losowania------------*/
       
        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 );
       
        /*WYSWIETL----------------------*/
       
        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();
        /*Koniec wyświetlania-----------*/
    }
}


void System( int menu )
{
    Wczytaj object; // jestem na wczytywaniu plikow i nie dziala wybor 2 bo sie wylonczyc nie chce :DD
    int max, ile, i;
    switch( menu )
    {
        /*case 49:
        short petla;
        for( ; ; )
        {
        KomunikatMenu();
        cout << ">> " << generatorN() << " <<" << endl;
        cout << "\n[1]Ponow\n[2]OK\n" << endl;
        petla = getch();
        if( petla == 50 )
        break;
        }
        break;
       
        case 50:
        Wczytaj CASE;
        int ile;
        do
        {
        KomunikatMenu();
        cout << "\nIlosc losowan: ";
        do
        {
        max = 21;
        cin >> ile;
        } while( CASE.wczytywanieCASE( ile, max ) == true );
        generatorZ( ile );
        cout << "\n[1]Ponow\n[2]OK\n";
        petla = getch();
        cin.clear();
        cin.sync();
        if( petla == 50 )
        break;
        } while( petla == 50 );
        break;
        case 51:
        int Od, Do;
        cout << "Zakres hasla:\nOd: ";
        do
        {
        max = 99999;
        cin >> Od;
        } while( object.wczytywanieCASE( Od, max ) == true );
        cout << "\nDo: ";
        cin.clear();
        cin.sync();
        do
        {
        max = 99999;
        cin >> Do;
        } while( object.wczytywanieCASE( Do, max ) == true );
        cout << "\nIle losowan: ";
        do
        {
        max = 21;
        cin >> ile;
        } while( object.wczytywanieCASE( ile, max ) == true );
        generatorD( Od, Do, ile );
        break;*/
    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 :)
P-127831
Brunon3
» 2015-03-06 20:20:28
Zawijanie tekstu się popsuło?
P-127833
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 ?
P-127834
nano-stalker
Temat założony przez niniejszego użytkownika
» 2015-03-06 20:43:30
Proszę:
C/C++
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 )
    {
        /*Losuj liczby---------------*/
        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 );
       
        /*Koniec losowania------------*/
       
        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 );
       
        /*WYSWIETL----------------------*/
       
        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();
        /*Koniec wyświetlania-----------*/
    }
}
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()
P-127836
michal11
» 2015-03-06 21:05:12
Liczba na początku bierze się z tego fragmenu:
C/C++
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);

P-127839
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! :)
P-127840
« 1 »
  Strona 1 z 1