logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

jak losować dwie liczy(na raz)w pascalu bez powtórzeń

marsab 11 Mar 2005 11:17 1980 14
REKLAMA
  • #1 1305638
    marsab
    Poziom 11  
    Posty: 9
    jak wylosować dwie liczby w Pascalu tak aby się nie powtarzały, na rzadnym z miejsc?tzn. jak losujemy np 2 i 3 to zeby później już nie było 3 i2 ani znowu 2 i 3:)...pomóżcie..

    Dodano po 11 [minuty]:

    Pomóżcie...we wtorek mam zaliczenie:(
  • REKLAMA
  • #2 1305736
    Bartserwis
    Poziom 15  
    Posty: 140
    Pomógł: 8
    Ocena: 10
    użyj funkcji Randomize; na początku wtedy kosowanie jes oddzielne w każdej sesji
  • REKLAMA
  • #3 1305754
    marsab
    Poziom 11  
    Posty: 9
    ale to nic nie daje:(bo to ma być program tabliczki mnożenia..i te liczby nie mogą się skasować bo np losujsz 2*3 to potem chciałbym żeby można było wylosować np 2*5..i tylko działania nie mogą się powtarzać..jak to zrobić:)?bo utknąłem
  • #4 1305777
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Zrób tablicę n x 2 elementy i po każdym wylosowaniu pary cyfr sprawdzaj czy są już takie w tablicy i jeśli są losuj ponownie.
  • #5 1305779
    Bartserwis
    Poziom 15  
    Posty: 140
    Pomógł: 8
    Ocena: 10
    Opisz bardziej szczegółowo zadanie
  • #6 1305799
    marsab
    Poziom 11  
    Posty: 9
    mam napisać program do nauki tabliczki mnożenia losujący kilka działań..tak żeby można było na nie odpowiać..np2*4=?ale działąnia nie mogą się powtarzać:(i tu są schody:)bo losuje sobie liczby i wszystko działa ładnie ale działania się powtarzają:(i nie potrafie temu zaradzić:((może znasz jakiś sposób?
  • #7 1306322
    wddf
    Poziom 18  
    Posty: 192
    Pomógł: 26
    Nikt nie jest jasnowidzem, powinienes napisac dokladnie jakie założenia chcesz realizować w programie np.: jaka to tabliczba mnożenia - max 100=10*10 czy moze 10000=100*100, ile dzialan ma byc - ograniczona liczba czy moze urzytkownik stwierdza w ktorymś momencie ze ma dosc nauki? To sa cholernie wazne rzeczy, pozatym myśle że błędem jest eliminowanie działań typu 5*9 i 9*5, wkońcu jest różnica (jak sądzę to ma być dla małych dzieci). Wydaje mi sie ze skoro to program do nauki niestaloby sie nic jakby byly powtorki. Jezeli juz koniecznie ma ich nie byc to pewnie jest kilka rozwiazan jak chocby podane wyzej przez olekewaagata, mozna zrobic cos takiego (przy zalozeniu ze jest to tabliczka do 100 i moze byc np 9*8 i 8*9) ze zapisujesz mozliwosci w tablicy dwuwymiarowej, mieszasz ta tablice i lecisz pokolei. Nawet mam lepsza mysl: deklarujesz tablice dwuwymi. losujesz do niej liczby, za kazdym razem sprawdzajac czy nie bylo takiej kombinacji wczesniej, a pozniej wyswietlasz kolejno elementy tej tablicy. Jak np. mialoby byc 10 pytan, losujesz 20 liczb do tablicy dwuwym. potem walisz petle ktora kolejno wyswietla te liczby, i tak za kazdym razem... Mam nadzieje ze o to ci chodzilo bo niejestem pewien, duzo roboty by niebylo z tym, kwestia doboru rozwiazania, moze sam cos dopracujesz i wyjdzie jeszcze lepsze powodzenia
  • #8 1306426
    Caladan
    Poziom 19  
    Posty: 242
    Pomógł: 33
    Ocena: 3
    Ja mysle,z e nalezy zrobic to tak, zdefiniowac JEDNA tablice, ktora bedzie zawierala dane, czy dana liczba juz byla losowana.

    Czyli mozna to zrobic na minimalnym rozmiarze (ilosc_liczb/8) i zapisac to bitowo.

    Napisac raz fkcje, ktora bedzie losowac liczbe, sprawdzac, czy juz byla wylosowana.

    A losowanie dwoch liczb roznych, to po prostu dwa razy losownie niepowtarzajacych sie liczb.

    Nic wiecej mysle, nie potrzeba...
  • REKLAMA
  • #9 1306733
    ZeeWolf
    Poziom 28  
    Posty: 989
    Pomógł: 115
    Ocena: 58
    Witam.
    Ech... (no comment). Zakladam, ze przypisujesz dzialaniom liczby. Ok. Czyli np:
    0 - dodawanie
    1 - odejmowanie
    2 - mnozenie
    itp.

    przyklad dla 3 dzialan:

    var bylo: array[0 .. 2] of boolean;
    i: integer;
    a, b: real;
    d: integer;

    begin
    randomize;
    {zeruj tablice dzialan, ktore juz byly}
    for i := 0 to 2 do bylo[i] := false;
    for i := 0 to 2 do
    begin
    {losuj dzialanie (dzieki 65535 mod 3 zamiast po prostu 2 otrzymujemy
    bardziej rownomierny rozklad losowanych liczb)}

    repeat
    d := random(65535 mod 3);
    until bylo[d] = false;

    bylo[d] := true;

    {losuj a i b - argumenty dzialania}
    a := random(65535);
    b := random(65535);

    {wypisz wynik dzialania}
    case d of
    0: writeln(a + b);
    1: writeln(a - b);
    2: writeln(a * b);
    end;

    end;
    end;

    Powinno zadzialac. Pozdrawiam.
  • #10 1306752
    wddf
    Poziom 18  
    Posty: 192
    Pomógł: 26
    wsio extra ZeeWolf tylko... nie bardzo na temat ale co tam ech... (no comments)
  • REKLAMA
  • #11 1306798
    ZeeWolf
    Poziom 28  
    Posty: 989
    Pomógł: 115
    Ocena: 58
    Hehe. Znaczy sie kolega narobil chaosu (myslalem, ze jesli ma losowac dzialania to ma losowac rozne dzialania, a nie mnozenie z roznymi liczbami). Ale juz sie poprawiam :).

    var
    bylo: array [0..99] of boolean;
    a, b: byte;
    i: integer;

    begin
    randomize;

    for i := 0 to 99 do bylo[i] := false;

    repeat

    {losuj a i b z przedzialu 0 - 9, dopoki nie stwierdzisz, ze taki wynik nie
    zostal jeszcze osiagniety przez mnozenie a * b}
    repeat
    a := random(65535 mod 10);
    b := random(65535 mod 10);
    until bylo[a * b] = false;

    {zapisz w tablicy, ze juz byl wynik dla a * b, popraw a i b, bo tabliczka mnozenia jest dla liczb z przedzialu 1 - 10}
    bylo[a * b] := true;
    a := a + 1;
    b := b + 1;

    {wypisz dzialanie}
    writeln(a, ' * ', b, ' = ', a * b);

    {czekaj na klawisz, jesli Esc, zakoncz}
    until readkey = #27;

    end;

    Teraz lepiej? Pozdrowienia (szczegolne dla wddf ;) ).
  • #12 1309811
    wddf
    Poziom 18  
    Posty: 192
    Pomógł: 26
    Jasne, teraz prawdziwa bajka! Należa sie punkciki za wiedzę! Podobnie myślałem, ale przyznaje że zrobiłeś to dużo lepiej... patrzeć i uczyć się! Pozdrawiam
  • #13 1310921
    marsab
    Poziom 11  
    Posty: 9
    Wielkie dzieki za pomoc:)..wszystko jest super..tylko ze jak wylosuje 9*4co rowna sie 36 to juz nie wylosuje 6*6 bo to tez jest 36 i ma to juz w tablicy:)jak temu zaradzic?moze macie jakis pomysl?
  • #14 1311026
    eihs
    Poziom 13  
    Posty: 33
    Pomógł: 6
    kolega olekewaagata na samym poczatku napisal jak to zrobic.
    musisz miec tabele, w ktorej bedziesz zapisywal pary liczb, teraz jesli podczas losowania taka para juz jest losujemy jeszcze raz, jak nie ma dodajemy pare

    pseudokod
    
    losuj(a)                               <--+
    losuj(b)                                  |
    jesli a>b to zamien a i b miejscami       |
    sprawdz_tablice(a,b)                      |
    jesli jest juz taka para losuj od nowa  --+
    jesli nie ma dodaj_do_tablicy(a,b)
    

    a czemu sortowac liczby? bo latwiej potem sprawdzac tablice :)

    jesli mnozymy liczby 0-9 proponuje tablice 100elementowa, do niektorych pol nigdy nie bedziemy nic zapisywac ani nic odczytywac, ale szybko na niej mozna operowac, juz tlumacze.
    otoz zapisujemy liczby 2 i 3, zapisac to mozemy do 23 wiersza, zatem wartosc wiersza to 10*a+b. w takim przypadku nigdy nie wykorzystamy wiersza numer 32 bo przestawiamy liczby zawsze tak ze a jest mniejsze niz b. a dlaczego tak? bo sprawdzenie w tym momencie jest bardzo proste. wystarczy sprawdzic czy w tablicy pod wierszem 23 jest wartosc true. jak jest losujemy jeszcze raz. nic pisze kodem bo w pascalu nie pisze.

    greets
  • #15 1311398
    marsab
    Poziom 11  
    Posty: 9
    Napisalem cos takiego..moglibyscie sprawdzic czy nie ma jakis bledow..tzn program sie kompiluje i dziala ale moze da sie cos poprawic:)z gory dzieki..pozdrawiam



    uses crt;
    var
    bylo: array [0..99] of boolean;
    a, b: byte;
    i,e,wynik: integer;
    c:char;
    procedure nauka;
    begin
    e:=0;
    randomize;
    for i := 0 to 99 do bylo[i] := false;
    repeat
    e:=e+1;
    {losuj a i b z przedzialu 0 - 9, dopoki nie stwierdzisz, ze taki wynik nie
    zostal jeszcze osiagniety przez mnozenie a * b}
    repeat
    a := random(65535 mod 10);
    b := random(65535 mod 10);
    until bylo[a * b] = false;
    {zapisz w tablicy, ze juz byl wynik dla a * b, popraw a i b, bo tabliczka mnozenia jest dla liczb z przedzialu 1 - 10}
    bylo[a * b] := true;
    a := a + 1;
    b := b + 1;
    {wypisz dzialanie}
    write(a, ' * ', b, ' = ');
    read(wynik);
    if wynik = a*b then
    begin
    writeln('dobrze');
    end
    else
    writeln('zle');
    {czekaj na klawisz, jesli Esc, zakoncz}
    until e=10
    end;
    procedure test;
    var wynik,rundy,popr,bledne:byte;
    punkty:integer;
    begin
    punkty:=0;
    e:=0;
    for rundy:=0 to 11 do
    randomize;
    for i := 0 to 99 do bylo[i] := false;
    repeat
    e:=e+1;
    {losuj a i b z przedzialu 0 - 9, dopoki nie stwierdzisz, ze taki wynik nie
    zostal jeszcze osiagniety przez mnozenie a * b}
    repeat
    a := random(65535 mod 10);
    b := random(65535 mod 10);
    until bylo[a * b] = false;
    {zapisz w tablicy, ze juz byl wynik dla a * b, popraw a i b, bo tabliczka mnozenia jest dla liczb z przedzialu 1 - 10}
    bylo[a * b] := true;
    a := a + 1;
    b := b + 1;
    {wypisz dzialanie}
    write(a, ' * ', b, ' = ');
    read(wynik);
    if wynik = a*b then
    begin
    writeln;
    punkty:=punkty+1;
    end
    else
    writeln;
    until e=10;
    { punkty:=punkty-20;}
    if punkty=10 then
    write('Gratuluje! jestes mistrzem tabliczki mnozenia. zdobyles 10p');
    if (punkty=9) or (punkty=8) then
    write('zdobyles: ',punkty,'punktow. Dobrze, chyba potrafisz mnozyc...');
    if (punkty<8) and (punkty>4) then
    write('zdobyles: ',punkty,'punktow.powinienes jeszcze pocwiczyc mnozenie...');
    if punkty<=4 then
    write ('masz tylko: ',punkty,' punkt nie umiesz tabliczki mnozenia przykro mi:(');
    readln;
    End;

    var
    qu,qu1,s:integer;
    bledne,rundy,popr:byte;
    punkty:integer;
    begin
    clrscr;
    writeln ('NAUKA');
    nauka;
    repeat
    writeln ('powtorzyc?');
    writeln('1: TAK: (jeszcze raz nauka)');
    writeln('2: NIE: (zrob test)');
    writeln('3: WYJSCIE');
    readln (qu);
    if qu=1 then
    begin
    clrscr;
    writeln('NAUKA');
    nauka;
    end;
    if qu=2 then
    begin
    clrscr;
    writeln ('TEST');
    test;
    readln;
    end;
    if qu=3 then
    begin
    break;
    end
    else
    writeln('miales wcisnac 1 lub 2');
    until s=10;
    writeln('wyjscie z programu');
    end.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu losowania dwóch liczb w języku Pascal tak, aby nie powtarzały się w żadnej kolejności (np. para 2 i 3 oraz 3 i 2 traktowane są jako powtórzenie) w programie do nauki tabliczki mnożenia. Proponowane rozwiązania obejmują użycie tablicy do przechowywania już wylosowanych par liczb oraz sprawdzanie przed dodaniem nowej pary, czy nie występuje ona już w tablicy. Zalecane jest sortowanie par (np. zawsze mniejsza liczba jako pierwsza), co ułatwia porównywanie i eliminowanie powtórzeń. Wskazano także, że zamiast eliminować działania o tych samych wynikach (np. 9*4 i 6*6 dające 36), lepiej zapisywać konkretne pary liczb, a nie wynik mnożenia, aby uniknąć błędów. Przykładowy kod w Pascalu wykorzystuje tablicę boolean do oznaczania już użytych par, funkcję randomize do inicjalizacji generatora liczb losowych oraz pętle do losowania i sprawdzania unikalności par. Dyskutowano także o implementacji programu z interakcją użytkownika, który losuje działania mnożenia i sprawdza poprawność odpowiedzi.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA