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

[C++] Losowanie bez powtórzeń

Ostatnio zmodyfikowano 2012-07-10 22:35
Autor Wiadomość
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.
C/C++
#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;
}
P-59702
Drraven
» 2012-07-08 13:44:43
Zobacz w kursie i / lub na forum bo było to już setki razy.
P-59705
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:
C/C++
#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;
}
P-59716
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źć.
P-59729
jankowalski25
» 2012-07-09 13:30:30
» KursyKurs STC kurs
P-59734
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:
C/C++
#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 od A do Z
    {
        alfabet[ i ] = s;
        s++;
        cout << alfabet[ i ] << " ";
    }
    cout << '\n';
    for( int i = 0; i < 26; ) //losowanie bez powtorzen liter od A do Z, dziala
    {
       
        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++ ) //Test, tu powinien sie wyswietlas alfabet a wyswietla sie podst
    { // dlaczego??
        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;
}
P-59755
akcza
» 2012-07-09 20:25:01
C/C++
for( int i = 0; i < 26; ) //losowanie bez powtorzen liter od A do Z, dziala
{
   
    char d = losowanie();
    if( sprawdz( podst, i, d ) == false )
    {
        //w tym miejscu zmienia się wartość zmiennej alfabet
        podst[ i ] = d;
        i++;
    }
}

Dlaczego? Nie mam pojęcia.
P-59758
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:
C/C++
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;
        }
    }
}
P-59774
« 1 » 2
  Strona 1 z 2 Następna strona