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

Symulator Lotto --- dłuższy temat

VPS Starter Arubacloud
0 głosów
429 wizyt
pytanie zadane 7 lutego 2019 w C i C++ przez KonDZIKs Bywalec (2,770 p.)

Witam. :D
Zacznę może od tego dlaczego w tytule jest wpis dłuższy temat. Zaczynam dopiero ten "projekt" i będę miał sporo pytań więc nie chce spamować tymi postami cały czas tylko zamknąć go w jednym.

Wracając do tematu napisałem już losowanie liczb oraz pobieranie moich liczb do tablicy. Tutaj rodzi się pierwsze pytanie jak zabezpieczyć aby użytkownik mógł wpisywać tylko liczy z zakresu od 1 do 49. Próbowałem petlą while, if'em lecz nic z tego.

Drugie pytanie jak zabezpieczyć aby użytkownik nie podawał dwóch tych samych liczb? Próbowałem na zasadzie if(liczby==liczby).

Ostatnie pytanie może błahe. Ale jak zrobić żeby odliczanie było na zasadzie 5 piątkę zastąp 4 czwórkę zastąp a nie na zasadzie wypisania 5 4 3 2 1. Próbowałem system("cls") ale to usuwało wszystko co powyżej a ja chciałbym aby to co powyżej również zostało.

Oczywiście za wszelkie poprawki i błędy będę bardzo wdzięczny. Jeżeli są jakieś rzeczy ,które można zrobić lepiej chętnie posłucham.

Kod: (bez wyzej wymienionych prób taki jaki działał)
 

#include <windows.h>
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int los(int liczby[6])
{

        for(int i=0; i<6; i++)
        {
            cout<<"Liczba "<<i+1<<":";
            cin>>liczby[i];
        }

        cout<<"Losowanie rozpocznie sie za: ";
        for(int i=5; i>0; i--)
        {
            Sleep(1000);
            cout<<i<<endl;
        }

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

        cout<<"\n Wylosowane liczby: ";
        for(int i=0; i<=6; i++)
        {
            cout<<rand()%50<<", ";
        }

}


int main()
{
    int liczby[6];
    HANDLE hOut;
    hOut = GetStdHandle( STD_OUTPUT_HANDLE );
    srand( time( NULL ) );

    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
    cout << "Witamy w Lotto.\n Za 5 sekund zostanie zwolniona blokada losujaca.\n Zostanie wylosowane 6 liczb z 49." << endl;
    cout<<"Podaj swoje 6 liczb.\n";

    los(liczby);

    return 0;
}

 

3 odpowiedzi

+3 głosów
odpowiedź 7 lutego 2019 przez Michał Gibas Pasjonat (19,610 p.)

1. Aby umożliwić wprowadzanie tylko liczb z zakresu 1-49 musisz użyć pętli do while przy każdym pobieraniu liczby i sprawdzać czy znajduje się w tym zakresie:

for(int i=0; i<6; ++i){
 do{
  std::cin>>number[i];
  if( (number[i]<1) || (number[i]>49) ){
   std::cout<<"Sprobuj jeszcze raz \n";
  }
 }while( (number[i]>=1) && (number[i]<=49) );
}

2. Z powtarzaniem musisz dodać tylko warunek pętli do while i jakąś funkcję, która będzie przeszukiwała tablicę i sprawdzała czy nie ma już takiego numeru.

A teraz jeśli chodzi o rzeczy które mogłbyś zrobić lepiej ;)

- polskie nazwy w kodzie (nazwy zmiennych, funkcji etc.), ich trzeba się pozbyć bezwzględnie. Niestety musisz się przyzwyczaić do tego, że dominującym językiem jest angielski i innych się nie używa w programowaniu (no chyba że w celach edukacyjnych) ;f Same stringi, które są wypisywane mogą być po polsku bo w końcu do polskojęzycznego użytkownika kierowany jest program.

- metoda generowania liczb pseudolosowych za pomocą rand() jest przestarzała i rodem z języka C. Polecam popatrzeć trochę na bibliotekę <random> z C++11: 

http://www.cplusplus.com/reference/random/ 

https://en.cppreference.com/w/cpp/numeric/random

Jest jeszcze troche małych rzeczy, które można by poprawić, ale nie będę tym wszystkim zawalał osoby początkującej. Tak tylko doradzam, żeby poprawny kierunek wskazać ;)

Pozdrawiam!

komentarz 7 lutego 2019 przez KonDZIKs Bywalec (2,770 p.)
edycja 7 lutego 2019 przez KonDZIKs

Dziękuje bardzo :)
Zakres zrobiony. Trochę zmieniłem środek a dokładnie to

std::cout<<"Sprobuj jeszcze raz \n";

ponieważ jeżeli liczba była spoza zakresu i tak była brana pod uwagę. Ja zrobiłem tak

cout<<"Liczba nie miesci sie w przedziale od 1 do 49. Podaj liczbe z przedzialu: ";
                        cin>>liczby[i];

W zasadzie (nie wiem dlaczego) dalej jest brana jest pod uwagę jeżeli wpisze się ją jeszcze raz.

 

Z tym drugim to chodzi o cos takiego?

for(int i=0; i<6; i++)
        {
        do{
            {
                cout<<"Liczba "<<i+1<<":";
                cin>>liczby[i];
                if(liczby[i]<1 || liczby[i]>49 || liczby[i]!=liczby[i])
                    {
                        cout<<"Liczba nie miesci sie w przedziale od 1 do 49. Podaj liczbe z przedzialu: ";
                        cin>>liczby[i];
                    }
            }
        }while((liczby[i]<=1) && (liczby[i]>=49) && (liczby[i]!=liczby[i]));
        }

 

komentarz 8 lutego 2019 przez Michał Gibas Pasjonat (19,610 p.)
Taki warunek nic ci nie daje i zawsze będzie nie prawdziwy bo sprawdzasz czy wartość jest różna od tej samej siebie: x != x. W ten sposób nie sprawdzasz całej tablicy. Musisz przeiterować przez całą tablicę (z wyjątkiem obecnego elementu) i porównać te wartości z obecnym elementem.
komentarz 11 lutego 2019 przez KonDZIKs Bywalec (2,770 p.)
Mógłbyś dać jakąś podpowiedz bądź część kodu? Próbowałem już na kilka sposobów nawet ze zmienna pomocniczą lecz nic nie pomaga. Nie wiem zbytnio jak zrobić to sprawdzenie jeżeli nie może być o (liczby[i]==liczby[i]). Nie wiem po prostu jak sprawdzić ta tablice. Bo wszystkie moje sprawdzenia z tego co wynika opierają sie tylko na sprawdzeniu tej samej wpisywanej liczby co jest bez sensu;
+2 głosów
odpowiedź 8 lutego 2019 przez preprocesor Obywatel (1,300 p.)
Cześć, żeby zrobić odliczanie użyj znaku \b oznaczającego backspace. W 18 linijce w pętli for wystarczy dopisać przed uśpieniem cout<<"\b"; To załatwi sprawę.
komentarz 8 lutego 2019 przez KonDZIKs Bywalec (2,770 p.)
Dzięki działa :D
0 głosów
odpowiedź 8 lutego 2019 przez RafalS VIP (122,820 p.)
        for(int i=0; i<=6; i++)
        {
            cout<<rand()%50<<", ";
        }

Dodam jeszcze od siebie, że ten sposób może wylosować dwie takie same liczby. Najprostsze rozwiązanie problemu to sprawdzanie po wylosowaniu czy danej liczby jeszcze nie było.

Podobne pytania

+1 głos
0 odpowiedzi 332 wizyt
pytanie zadane 20 czerwca 2023 w Offtop przez niezalogowany
0 głosów
3 odpowiedzi 1,104 wizyt
pytanie zadane 3 stycznia 2016 w C i C++ przez Mesiak Bywalec (2,380 p.)
0 głosów
1 odpowiedź 178 wizyt
pytanie zadane 16 września 2019 w C i C++ przez KonDZIKs Bywalec (2,770 p.)

92,416 zapytań

141,222 odpowiedzi

318,985 komentarzy

61,831 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...