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

Warunek modulo w pętli do...while

Object Storage Arubacloud
0 głosów
1,184 wizyt
pytanie zadane 10 stycznia 2016 w C i C++ przez thekibi27 Bywalec (2,110 p.)

Witam!

Następująca pętla mająca za zadanie wylosowania 5 parzystych liczb bez powtórzeń nie działa jak powinna.

Oto jej kod:

for (int f = 1; f <= 5; f++) 
{
                        int i;
                        do
                        {
                            i=(rand()%10)+1;
                        }
                        while (i%2!=0 && (i==losowa_liczba[1] || i==losowa_liczba[2] || i==losowa_liczba[3] || i==losowa_liczba[4] || i==losowa_liczba[5]));
                        losowa_liczba[f]=i;
{

 

2 odpowiedzi

+1 głos
odpowiedź 10 stycznia 2016 przez mrcnsct Nałogowiec (36,390 p.)
wybrane 10 stycznia 2016 przez thekibi27
 
Najlepsza

Gdzie jest klamra zamykająca pętlę for? Bo ja tu widzę dwie otwierające. Warunek 

while (i%2!=0 && (i==losowa_liczba[1] || i==losowa_liczba[2] || i==losowa_liczba[3] || i==losowa_liczba[4] || i==losowa_liczba[5]));

oznacza, że jeśli liczba jest parzysta, to pętla się kończy, bo wtedy i%2!=0 ma wartość logiczną 0 i nie jest sprawdzana reszta. Masz coś wcześniej w tej tablicy, czy jest ona niezainicjalizowana? Jeśli nie to z czym porównujesz wylosowaną liczbę?Dlaczego na początku porównujesz z losowa_liczba[1]? Indeksowanie tablicy jest od 0 do n-1.

komentarz 10 stycznia 2016 przez thekibi27 Bywalec (2,110 p.)
1. Co do klamry dla pętli to w programie jest dobrze, tutaj ją źle dopisałem.

2. Tablice są puste, ale to przecież nic nie zmienia - gdy program nie ma z czym porównać to zwróci fałsz, czyli oczekiwany efekt. Przy parzystej liczbie pętla nie powinna się skończyć jeśli jeszcze nie sprawdzi czy nie została wylosowana - przecież jest tam znak && czyli oba warunki muszą być spełnione.

3. Faktycznie, mój błąd, ale to nie rozwiązuje sprawy.
komentarz 10 stycznia 2016 przez mrcnsct Nałogowiec (36,390 p.)
edycja 10 stycznia 2016 przez mrcnsct

Oba mają być spełnione, więc jeśli pierwszy jest nie spełniony, to drugiego nie sprawdza, bo nawet jak będzie spełniony to 0&&1 da 0, więc się skończy. Jeśli chcesz wpisać liczbę do tablicy, jeśli jest parzysta i nie wystąpiła wcześniej, to pętla ma powtarzać, jeśli jest nieparzysta lub wystąpiła wcześniej. https://pl.wikipedia.org/wiki/Prawa_De_Morgana. W niezainicjalizowanej tablicy są śmieciowe wartości.

komentarz 10 stycznia 2016 przez thekibi27 Bywalec (2,110 p.)
No tak, jest to do poprawki, ale jeszcze jest taki problem, że program dopuszcza i wypisuje liczby nieparzyste.
komentarz 10 stycznia 2016 przez thekibi27 Bywalec (2,110 p.)
Ale wtedy może wylosowac liczbę nieparzystą, która została niewylosowana i przerwie pętlę, bo będzie 1 || 0.
komentarz 10 stycznia 2016 przez mrcnsct Nałogowiec (36,390 p.)
komentarz 10 stycznia 2016 przez thekibi27 Bywalec (2,110 p.)
Oczywiście masz rację ;)

Pomieszałem sobie kiedy w końcu pętla się kończy i stąd te nieporozumienie. Wszystko już działa jak trzeba, sorry za tą zaćme :D
0 głosów
odpowiedź 7 lutego 2017 przez mzygmunt Nowicjusz (160 p.)

Choć problem już rozwiązany, powiedziałbym Ci jedną rzecz: przerobiłbym troszeczkę Twój kod.

Najpierw niewielkie tło moich rozmyślań: liczba jest parzysta wtedy, kiedy jest podzielna przez 2. Inaczej rzecz ujmując, można ją zapisać jako iloczyn 2*k, gdzie k jest liczbą naturalną. Skoro rand() zwraca liczbę naturalną, może ona posłużyć za nasze k. Myślę mianowicie o:

i = 2*((rand()%10)+1);

Wtedy niepotrzebny jest jeden warunek w while'u, a masz pewność, że już za pierwszym razem otrzymasz liczbę parzystą.

komentarz 8 lutego 2017 przez thekibi27 Bywalec (2,110 p.)
Racja, jednak trzeba wziąć poprawkę na to, z jakiego przedziału teraz będą losowane liczby parzyste (a będzie to 2-20). Oczywiście zapis i = 2*((rand()%5)+1); zapewni nam losowanie liczb parzystych z przedziału 2-10.

Nie wiem kto dał Ci łapkę w dół (którą wyrównałem łapką w górę), być może miał jakieś "ale" co do Twojego algorytmu, czego my nie dostrzegliśmy.

Podobne pytania

0 głosów
1 odpowiedź 110 wizyt
pytanie zadane 20 października 2018 w C i C++ przez periedynek Obywatel (1,320 p.)
0 głosów
1 odpowiedź 478 wizyt
0 głosów
3 odpowiedzi 1,032 wizyt
pytanie zadane 3 maja 2017 w Java przez fiszu258 Początkujący (440 p.)

92,620 zapytań

141,474 odpowiedzi

319,813 komentarzy

62,003 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!

...