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

Sprawdzanie elementu tablicy. Niby działa lecz nie do końca.

Object Storage Arubacloud
0 głosów
186 wizyt
pytanie zadane 16 września 2019 w C i C++ przez KonDZIKs Bywalec (2,770 p.)

Witam. :)
Piszę prosty symulator lotto. I napotkałem pewien błąd podczas sprawdzania czy dana liczba podana przez użytkownika nie powtórzyła się. Program działa i sprawdza tą liczbę ale tylko następną po sobie. Możemy użyć liczby 42 podczas pierwszego wpisywania za drugim razem nie możemy ale za 3 znowu możemy. Wiem ,że błąd leży po mojej stronie (i-1 zawsze bedzie sprawdzało tylko jedną liczbę do tyłu a nie każda) lecz nie wiem jak sobie z nim poradzić. Próbowałem z dodatkową pętla ale jakoś mi to nie poszło (zgłupiałem).

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

using namespace std;

int los(int liczby[6], int losowane[6], int punkty)
{

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

            }while((liczby[i]<=0) || (liczby[i]>=50));
////////////////////////////////////
   //Sprawdzanie zaczyna się tutaj:
////////////////////////////////////    
 			do{ 
			 
			      
	        	if(liczby[i]==liczby[i-1])
				{
				cout<<"Podales juz taka liczbe.\nPodaj inna liczbe: ";
				cin>>liczby[i];
				}
				
			}while(liczby[i]==liczby[i-1]);
		}



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

            //Sleep(1000);

            cout<<i<<"\b";;
        }

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

        cout<<"\n Wylosowane liczby: ";
        for(int i=0; i<=5; i++)
        {
            losowane[i]=rand()%49+1;
            cout<<losowane[i]<<", ";
        }

}


int main()
{
    int liczby[6],losowane[6],punkty;
    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 przedzialu od 1 do 49." << endl;
    cout<<"Podaj swoje 6 liczb.\n";

    los(liczby,losowane,punkty);

    system("pause");
    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 16 września 2019 przez j23 Mędrzec (194,920 p.)
wybrane 16 września 2019 przez KonDZIKs
 
Najlepsza
for (int i = 0; i < 6; ++i) {
	std::cout << "Liczba " << i + 1 << ":";
	std::cin >> liczby[i];
	
	while (std::find(liczby, liczby + i, liczby[i]) != liczby + i) {
		std::cout << "Podales juz taka liczbe.\nPodaj inna liczbe: ";
		std::cin >> liczby[i];
	}
}

 

komentarz 16 września 2019 przez KonDZIKs Bywalec (2,770 p.)
Mógłbyś wytłumaczyć?
Tą pętle while. Ogólnie wyrzuca mi błąd podczas kompilacji przy niej. To find to nowa funkcja?
komentarz 16 września 2019 przez j23 Mędrzec (194,920 p.)

Jak jest błąd, to trzeba podać jego treść lub napisać czego dotyczy.

std::find to funkcja z biblioteki standardowej. Funkcja szuka wartości (trzeci argument) w zbiorze opisanym przez pierwszy i drugi argument. Jeśli znajdzie, zwróci adres znalezionej wartości, a jeśli nie, wartość podaną w drugim parametrze, czyli koniec zbioru. resztę dopowiedz sobie sam ;)

Załącz plik <algorithm>.

komentarz 16 września 2019 przez KonDZIKs Bywalec (2,770 p.)
Dodanie <algorithm> rozwiązało problem.
Dziękuję bardzo za pomoc :D

Mam jeszcze pytanie. Czy mógłbym użyć tego również do zliczania zdobytych punktów? Bo jeżeli to sprawdza cała tablice to czy mógłbym zamiast != liczby+ i dać == losowane + i. Jeszcze pytanie dlaczego dajemy != liczby + i zamiast liczby?
Sorki jeżeli są to głupie pytania.
komentarz 16 września 2019 przez j23 Mędrzec (194,920 p.)
edycja 22 września 2019 przez j23
  1.  Tak.
  2. Ponieważ samo liczby wskazuje na początek zbioru, a liczby + i na jego koniec.

  

 

komentarz 22 września 2019 przez KonDZIKs Bywalec (2,770 p.)

Zrobiłem tak:
 

while (find(liczby, liczby + i, liczby[i]) == losowane + i){
				 		punkty ++;
					 }

i nie działa wcześniej jak zrobiłem if (liczby[i]==losowane[i]) to działa ale tylko jak podaje sie liczby w tej samej kolejności.

komentarz 22 września 2019 przez j23 Mędrzec (194,920 p.)

Chyba źle zrozumiałem twoje poprzednie pytanie. To oczywiście nie może działać poprawnie.

for (int i = 0; i < 6; ++i) {
    if (std::find(liczby, liczby + 6, losowane[i]) != liczby + 6) {
        std::cout << "Trafiono: " << losowane[i] << '\n';
    }
}

 

komentarz 24 września 2019 przez KonDZIKs Bywalec (2,770 p.)

Nie o to mi chodziło. Ale już poprawiłem (chodziło mi to ,że jeżeli liczba sie powtórzy to jest dodawany punkt ale zmieniłem std::cout << "Trafiono: " << losowane[i] << '\n'; na punkty++; i działa). Lecz jest błąd taki ,że jeżeli podam liczby wylosowane w identycznej kolejności to jest max punktów a jak podam przykładowo o tyłu to zalicza tylko 3 pkt.

Przykład:

Wylosowane: 1, 2 ,3 ,4 ,5 ,6
Podane przez uż: 1, 2, 3, 4, 5, 6

Brawo trafiłeś: 6.
 

Podane od tyłu:

Wylosowane: 1, 2 ,3 ,4 ,5 ,6

Podane przez uż: 6,5,4,3,2,1

To zalicza tylko 3 poprawne. :/
Podobnie było przed tym jak zmieniłem na punkty++. Wyświetlało ,że Trafiłeś 3 ale potem np. juz 2 nie wyświetlało chociaż sie powtarza.

Jeszcze jedno pytanie dlaczego dajemy liczby + 6 zamiast liczby + i? Rozumiem ,że musimy teraz pobrać liczby wprowadzone przez użytkownika tylko dlaczego to + 6.

komentarz 25 września 2019 przez j23 Mędrzec (194,920 p.)

To zalicza tylko 3 poprawne. :/

To nie ma związku z moim kodem, bo ten jest poprawny, ani kolejnością liczb.

tylko dlaczego to + 6.

Przy sprawdzaniu trafień sprawdzasz całą tablicę zawierającą sześć liczb. W poprzednim kodzie liczba wprowadzonych wartości przez użytkownika rosła z każdym okrążeniem pętli, dlatego trzeba było ograniczyć wyszukiwanie do aktualnej ilości liczb w tablicy.

 

Podobne pytania

+1 głos
2 odpowiedzi 1,084 wizyt
pytanie zadane 7 stycznia 2016 w C i C++ przez Tony Początkujący (360 p.)
0 głosów
3 odpowiedzi 1,115 wizyt
pytanie zadane 3 stycznia 2016 w C i C++ przez Mesiak Bywalec (2,380 p.)
+1 głos
0 odpowiedzi 357 wizyt
pytanie zadane 20 czerwca 2023 w Offtop przez niezalogowany

92,568 zapytań

141,422 odpowiedzi

319,635 komentarzy

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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...