• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Losowanie totolotka - powrót do

Object Storage Arubacloud
0 głosów
432 wizyt
pytanie zadane 25 stycznia 2017 w C i C++ przez Jiin Obywatel (1,390 p.)
zamknięte 26 stycznia 2017 przez Jiin
Witam

Chciałem napisać sobie losowanie totolotka w C++, zacząłem od tego:

http://screenshot.sh/mMz1a7vp9Vhkr

ale nie wiem jak w tym drugim if sprawdzic czy liczby się nie powtarzają :/

Poza tym, gdy osoba poda liczbe większą od 42 lub mniejszą od 1 to if wyświetli tylko informacje o tym że liczba musi się znajdować w przedziale, ale nic więcej się nie będzie działo, a chciałbym, żeby program wrócił do wpisywania liczby, a nie szedł dalej. Jak to jakoś sensownie rozwiązać? Coś w stylu GOTO z ms :D
komentarz zamknięcia: Rozwiązane

2 odpowiedzi

+1 głos
odpowiedź 25 stycznia 2017 przez Pajdas Mądrala (5,930 p.)

ale nie wiem jak w tym drugim if sprawdzic czy liczby się nie powtarzają :/

To właśnie na tym polega praca programisty że kiedy nie wie jak coś zrobić to myśli i próbuje, a nie pyta na forum.

#include <iostream>

using namespace std;

int main()
{
    int tab[6];
    for(int i=0; i<6; i++)
    {
        cout << "Podaj cyfre "<<i+1<<": ";
        cin >> tab[i];
        while(tab[i]>42||tab[i]<1)
        {
            cout << "Liczba nie znajduje sie w przedziala od 1 do 42 :("<<endl;
            cout << "Popraw sie, podaj cyfre "<<i+1<<": ";
            cin >> tab[i];
        }
        for(int x=0; x<i; x++)
        {
            while(tab[i]==tab[x])
            {
                cout << "Podales juz liczbe "<<tab[i]<<" wczesniej, znajduje sie ona na pozycji "<<x+1<<endl;
                cout << "Popraw sie, podaj cyfre "<<i+1<<": ";
                cin >> tab[i];
                x--; // jezeli to usuniesz to jak dasz pierwsze np.5 pozniej 3 i powtorzysz 3 to wyskoczy blad,
                //ale jak w "poprawie" dasz 5 (czyli kolejna powtorka) blad sie nie pojawi
            }
        }
    }
    for(int i=0; i<6; i++)
    {
        cout<<"Wartosc tab["<<i<<"] wynosi "<<tab[i];
    }
    return 0;
}

Jak będziesz miał jeszcze jakiś "problem" to pierwsze spróbuj go rozwiązać a nie pytaj o wszystko na forum.
Poza tym kod się wkleja a nie daje się screenów

komentarz 26 stycznia 2017 przez Jiin Obywatel (1,390 p.)
edycja 26 stycznia 2017 przez Jiin
Próbowałem wcześniej ale mi nie wychodziło. Przepraszam że się dopiero uczę i że  wgl zapytałem skoro tak podchodzisz do sprawy. W każdym razie dziękuje.
komentarz 26 stycznia 2017 przez Pajdas Mądrala (5,930 p.)

Przepraszam że się dopiero uczę i że  wgl zapytałem skoro tak podchodzisz do sprawy

Nie krytykuje tego, że nie masz wiedzy (bo sam jestem jeszcze początkujący i nie mam dużej wiedzy) ale krytykuje to, że nie próbujesz rozwiązać problemu sam. Przecież w odpowiedzi nie dało się nie dać gotowca, bo rozwiązanie problemu to cały program. Kiedy będziesz miał problem do rozwiązania to nie musisz tego robić na jednym "posiedzeniu" przed komputerem, możesz odejść od komputera, zrobić sobie kawę włączyć telewizor i zastanawiać się nad problemem, a kiedy pomysł przyjdzie sprawdzić go.

komentarz 26 stycznia 2017 przez Jiin Obywatel (1,390 p.)

Cóż, problem tkwił w instrukcji while, więc to by mi wystarczyło i sam się sobie dziwię jak na to nie wpadłem. Teraz mam kolejny problem. Pod koniec programu drukuje jakie liczby zostały trafione - i faktycznie to robi, ale poza tym wyświetla wcześniej jeszcze inną: http://screenshot.sh/mFuLtN7zPOreL   i nie mam pojęcia dlaczego :/

 

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{

        // WPROWADZANIE
   int tab[6];
    for(int i=0; i<6; i++)
    {
        cout << "Podaj cyfre "<<i+1<<": ";
        cin >> tab[i];
        while(tab[i]>42||tab[i]<1)
        {
            cout << "Liczba nie znajduje sie w przedziala od 1 do 42 :("<<endl;
            cout << "Popraw sie, podaj cyfre "<<i+1<<": ";
            cin >> tab[i];
        }
        for(int x=0; x<i; x++)
        {
            while(tab[i]==tab[x])
            {
                cout << "Podales juz liczbe "<<tab[i]<<" wczesniej, znajduje sie ona na pozycji "<<x+1<<endl;
                cout << "Popraw sie, podaj cyfre "<<i+1<<": ";
                cin >> tab[i];
                x--; // jezeli to usuniesz to jak dasz pierwsze np.5 pozniej 3 i powtorzysz 3 to wyskoczy blad,
                //ale jak w "poprawie" dasz 5 (czyli kolejna powtorka) blad sie nie pojawi
            }
        }
    }

    cout << "Twoje liczby to: " ;
    for(int i=0; i<6; i++)
    {
        cout<<tab[i]<<" ";
    }

    //LOSOWANIE
    srand(time(NULL));
    cout << " \n Nastepuje losowanie liczb!" << endl ;
    int losowanie[6];
    for(int i=0; i<6; i++)
    {

        losowanie[i]=rand()/42+1 ;
        while(losowanie[i]>42||losowanie[i]<1)
        {
            losowanie[i]=rand()/42+1 ;
        }
        for(int x=0; x<i; x++)
        {
            while(losowanie[i]==losowanie[x])
            {
                losowanie[i]=rand()/42+1 ;
                x--;
            }
        }
    }
    cout << "Wylosowane liczby to: " ;
    for(int i=0; i<6; i++)
    {
        cout<<losowanie[i]<<" ";
    }
    int trafione = 0, jakie[6];
    for(int i=0; i<6; i++) {
        for(int j=0; j<6; j++) {
            if (tab[i]==losowanie[j]) {
                trafione++;
            }
        }
    }
    cout << " \n Trafiles " << trafione << " liczb!" ;

    if (trafione != 0) {
        for(int i=0; i<6; i++) {
            for(int j=0; j<6; j++) {
                if (tab[i]==losowanie[j]) {
                    jakie[i]=tab[i];
                }
            }
        }
        cout << " \n Liczby ktore trafiles to: " ;
        int a;
        for ( int i=0; i<5; i++) {
                a = jakie[i];
            if(a <= 42 && jakie[i] >= 1) {
                cout << jakie[i] << " " ;
            }
        }
    }


    return 0;
}

 

komentarz 26 stycznia 2017 przez Pajdas Mądrala (5,930 p.)
Więc zwracasz się z problemem na forum,
a może by tak posiedzieć nad kodem, a kiedy sam rozwiążesz problem być dumnym, że to tylko twoja zasługa.
Powiedz że mam do ciebie złe nastawienie, albo krytykuję to, że nie masz elementarnej wiedzy, ale nie o to chodzi w programowaniu aby pytać innych programistów o rozwiązanie
komentarz 26 stycznia 2017 przez Jiin Obywatel (1,390 p.)

Nie masz złego, czasem bywam zbyt pochopny po prostu :P  Jak by kogoś interesowało, ostateczny działający kod:

 

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{

        // WPROWADZANIE

        cout << "Witaj w losowaniu totolotka! Podaj 6 liczb: " << endl;

   int tab[6];
    for(int i=0; i<6; i++)
    {
        cout << "Podaj cyfre "<<i+1<<": ";
        cin >> tab[i];
        while(tab[i]>42||tab[i]<1)
        {
            cout << "Liczba nie znajduje sie w przedziala od 1 do 42 :("<<endl;
            cout << "Popraw sie, podaj cyfre "<<i+1<<": ";
            cin >> tab[i];
        }
        for(int x=0; x<i; x++)
        {
            while(tab[i]==tab[x])
            {
                cout << "Podales juz liczbe "<<tab[i]<<" wczesniej, znajduje sie ona na pozycji "<<x+1<<endl;
                cout << "Popraw sie, podaj cyfre "<<i+1<<": ";
                cin >> tab[i];
                x--; // jezeli to usuniesz to jak dasz pierwsze np.5 pozniej 3 i powtorzysz 3 to wyskoczy blad,
                //ale jak w "poprawie" dasz 5 (czyli kolejna powtorka) blad sie nie pojawi
            }
        }
    }

    cout << "Twoje liczby to: " ;
    for(int i=0; i<6; i++)
    {
        cout<<tab[i]<<" ";
    }


    //LOSOWANIE


    srand(time(NULL));
    cout << " \n Nastepuje losowanie liczb!" << endl ;
    int losowanie[6];
    for(int i=0; i<6; i++)
    {

        losowanie[i]=rand()/42+1 ;
        while(losowanie[i]>42||losowanie[i]<1)
        {
            losowanie[i]=rand()/42+1 ;
        }
        for(int x=0; x<i; x++)
        {
            while(losowanie[i]==losowanie[x])
            {
                losowanie[i]=rand()/42+1 ;
                x--;
            }
        }
    }
    cout << "Wylosowane liczby to: " ;
    for(int i=0; i<6; i++)
    {
        cout<<losowanie[i]<<" ";
    }
    int trafione = 0, jakie[6];
    for(int i=0; i<6; i++) {
        for(int j=0; j<6; j++) {
            if (tab[i]==losowanie[j]) {
                trafione++;
            }
        }
    }

    // ILE TRAFIONYCH

    if (trafione == 0) cout << " \n Nic nie trafiles :(" ;
    if (trafione == 1) cout << " \n Trafiles jedna liczbe!" ;
    if (trafione == 2) cout << " \n Trafiles dwie liczby!" ;
    if (trafione > 2) cout << "\n Trafiles " << trafione << " liczb!";
    if (trafione != 0) {
        for(int i=0; i<6; i++) {
            for(int j=0; j<6; j++) {
                if (tab[i]==losowanie[j]) {
                    jakie[i]=tab[i];
                }
            }
        }


        // WYSW TRAFIONYCH


        int a;
        if (trafione == 1) cout << " Liczba ktora trafiles to: ";
        if (trafione > 1) cout << " Liczby ktora trafiles to: ";
        for(int i=0; i<6; i++) {
            for(int j=0; j<6; j++) {
                if (tab[i]==losowanie[j]) {
                    cout << tab [i] << " ";
                }
            }
        }
    }


    return 0;
}

 

komentarz 26 stycznia 2017 przez Pajdas Mądrala (5,930 p.)

Kod jest bardzo zawiły szczególnie przy końcówce te if'y w pętlach w pętli

Poza tym, po co wogóle sprawdzasz to
 

losowanie[i]=rand()/42+1 ;
        while(losowanie[i]>42||losowanie[i]<1)
        {
            losowanie[i]=rand()/42+1 ;
        }

http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Pseudolosowe-liczby-calkowite/290

Używa się modulo (%), a nie dzielenia (/)

+1 głos
odpowiedź 25 stycznia 2017 przez niezalogowany
Może podczas wprowadzania zmiennych dodaj sprawdzenie czy podane liczby są bez powtórek? Czyli gdy użytkownik wpisze 3 wartość to program sprawdzi czy podana liczba nioe jest równa pozostałym dwóm elementom. Jeżeli jest to zrobić ponowne podanie wartości, jeżeli nie kontynuować. Unikaj używania goto - 1 bo wiele osób na forum tak mówi, a drugie wiele rzeczy można zrobić samymi pętlami ;) Ewentualnie możesz pętlę sprawdzającą powtórzenie umieścić w tym else i gdyby się powtórzyły to poprosić o podanie nowej wartości dla tego elementu... tak analogicznie do sprawdzania przy wpisaniu co wcześniej opisałem:)

Podobne pytania

0 głosów
1 odpowiedź 429 wizyt
pytanie zadane 2 lutego 2019 w C i C++ przez Konrad Gałach Użytkownik (880 p.)
0 głosów
2 odpowiedzi 497 wizyt
0 głosów
1 odpowiedź 150 wizyt
pytanie zadane 11 stycznia w C# przez domngo Nowicjusz (120 p.)

92,757 zapytań

141,679 odpowiedzi

320,429 komentarzy

62,101 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...