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

Rozdział 21 - pytanie

Ostatnio zmodyfikowano 2015-08-09 00:41
Autor Wiadomość
Witicar
Temat założony przez niniejszego użytkownika
Rozdział 21 - pytanie
» 2015-08-08 22:34:26
W trakcie rozdziału 21 podjąłem się napisania samemu programu do losowania liczb pseudolosowych bez powtórzeń.
Moje pytanie brzmi -"Czy opisana na kodzie niemozliwosc uzycia inkrementacji k (k++) zwiazania jest z jakims np wielokrotnym przypisaniem oraz jezeli tak to czy da sie odseparowac zmienne od siebie gdybym sie uparł napisania (przed i++ lub po nim) k++."

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void losuj( int tablica[], int ile, int start, int stop )
{
    int i = 1, k = 1; // prawdopodobnie przypisalem zmienne wielokrotnie i nie wiem czy w ten sposob nie polaczyly sie ze soba
    tablica[ 0 ] = rand() %( stop - start + 1 ) + start;
    do
    {
        tablica[ i ] = rand() %( stop - start + 1 ) + start;
        do
        {
            if( tablica[ i ] != tablica[ i - k ] )
                 --k;
            else
            {
                tablica[ i ] = rand() %( stop - start + 1 ) + start;
                k = i;
            }
        } while( k != 0 );
       
        i++; // użycie samego i++ pociaga za soba zmiane k++, prawdopodobnie spowodowana wielokrotnym przypisaniem
        /*k++; - po wstawieniu tego elementu kod nie działa poprawnie i przyrownuje mi k zawsze do 1, chociaż logiczne wydaje mi sie,
        ze jezeli k=1 po dodaniu 1 powinno wynosic 2 itd*/
    } while( i < ile );
   
}
void wypisz( int tablica[], int ile )
{
    int i = 0;
    do
    {
        cout << tablica[ i ] << endl;
        i++;
    } while( i < ile );
   
}
int main()
{
    srand(( unsigned int ) time( NULL ) );
    int losowanie[ 5 ];
    losuj( losowanie, 5, 1, 10 );
    wypisz( losowanie, 5 );
    system( "pause" );
    return 0;

Chyba już wiem czemu przy zapisie k++ miałem cały czas k=1 w zewnętrznej pętli, ponieważ moja wewnetrzna petla dozyla do k=0. Teraz tylko nie wiem dlaczego samo i++ powoduje zmiane k do stanu k=i. Być może też ma to związek z podwójną pętlą i warunkiem w else, ale prosiłbym o wyjaśnienie :).
P-135900
bombatom69
» 2015-08-09 00:04:05
1. k ma na starcie ma wartość niezależną od ilości wylosowanych liczb.
2. nie sprawdzasz komórek [i-k] tylko po prostu k. k powinno być na starcie i-1
P-135901
Witicar
Temat założony przez niniejszego użytkownika
» 2015-08-09 00:41:36
Wiem, że ten program wygląda dziwnie, ale działa poprawnie (sprawdzane wielokrotnie), mniej wiecej z takim zamierzeniem
1.Poniewaz tablica jest pusta to losuje pierwszy jej element czyli tablica[0]
2.Losuje drugi element i porownuje z pierwszym ( dla i=1 i k=1) czyli tablica[1] z tablica[1-1=0])
3. Jeśli nie sa rowne to zmniejsza k, w pierwszym przypadku do zera co konczy petle, w przeciwnym wraca do pozycji startowej k=i=1.
4. Wykonuje sie dopoki k nie obnizy sie do 0 a co za tym idzie w if nie napotka nigdzie rownosci wartosci tablic.
5 Powtarza wykonywane czynnosci dla k=i=2, k=i=3 itd.
6. Konczy program gdy i > ile czyli u mnie w tym wypadku ilosci losowanych liczb ( rozmiar tablicy dopasowalem by sie rownal tej ilosci za pomoca argumentow)

Ale juz chyba odkrylem czemu samo i++ dziala, gdy dojdzie do przypadku while k=0, spowoduje to w kolejnym obiegu petli zmiane i o jeden, ale dalej k=0, wtedy wykona else, gdyż przy if porownam identyczne tablice (zawsze tablica[i.]==tablica[i-k] dla k=0), w else dokona nowego losowania tablicy[i.] (czyli wykona ja przed petla wewnetrzna i powtornie w niej) i przyrowna i=k co za tym idzie takze zwiekszy k o k=k+1. Hmm, musze troche zmodyfikowac ten program, ale dziekuje za checi, temat chyba do zamkniecia :).
P-135903
« 1 »
  Strona 1 z 1