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ść
jankowalski25
» 2012-07-10 12:55:01
C/C++
std::string s;
//fragment kodu...
//!s[ 25 ] = 'Z'; //to może nie zadziałać
s.reserve( 26 ); //robimy miejsce na minimum 26 znaków
s[ 25 ] = 'Z'; //teraz wszystko jest w porządku
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.
P-59784
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??
P-59793
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)
P-59803
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
C/C++
#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++ ) //Alfabet od A do Z
    {
        podst[ i ] = s;
        s++;
        cout << podst[ i ] << " ";
    }
   
    cout << '\n';
    for( int i = 0; i < 26; ) //losowanie bez powtorzen liter od A do Z, nie 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 <= 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
P-59810
jankowalski25
» 2012-07-10 21:37:38
C/C++
bool sprawdz( string podst, int x, char d ) //nie działa
bool sprawdz( string & podst, int x, char d ) //działa
Trzeba użyć referencji, aby po wyjściu z funkcji dane nie zostały utracone.
P-59819
Mufas
Temat założony przez niniejszego użytkownika
» 2012-07-10 22:35:06
dzieki wilekie za pomoc. DZIALA :)
P-59821
1 « 2 »
Poprzednia strona Strona 2 z 2