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

Losowanie bez powtorzen - zadanie

Object Storage Arubacloud
0 głosów
460 wizyt
pytanie zadane 30 listopada 2018 w C i C++ przez Michał_Warmuz Mądrala (5,830 p.)

Zadanie: Napisz program, który wczyta 3 liczby podane przez użytkownika do tablicy, a następnie wylosuje 2 z nich bez powtórzeń. Wynik wypisz na ekran. Postaraj się napisać ten program w oparciu o funkcje. 

Czesc mam pytanie czy ten kod jest dobrze napisany bo zroilem pare testow i losuje dwie rozne liczby z tych liczb ktore uzytkownik wprowadza ale jest jeden problem wyspuje sie wtedy kiedy podaje dwie te same liczby ?

Kod:

#include <iostream>
#include <cstdlib>
#include <ctime>


using namespace std;

bool czy_byla(int liczba, int tab[], int ile) {

    int i=0;
    do {
        if(liczba == tab[i]) return true;
        i++;
    }while(i<ile);

    return false;
}

int losuj() {

    return rand()%2;
}

int main() {

    srand(time(NULL));
    int tab[3];
    cout << "Wypisz trzy liczby: ";
    for(int i=0; i<3;i++) {
        cin>> tab[i];
    }
    int it;
    int tab2[2];
    int i=0;
    do {
        it = losuj();
        if(czy_byla(tab[it], tab2, i) == false) {
            tab2[i] = tab[it];
            i++;
        }

    }while(i<2);

    for(int s=0; s<2; s++) {
        cout << tab2[s]<< " ";
    }
    return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 30 listopada 2018 przez RafalS VIP (122,820 p.)
wybrane 30 listopada 2018 przez Michał_Warmuz
 
Najlepsza

Hmm, a czego się spodziewasz gdy podasz takie same liczby do losowania :P? Od strony programisty mógłbyś jedynie zrobić walidacje liczb podawanych przez użytkownika - tzn tuż po wczytaniu sprawdzasz czy są one rozne, jesli nie są to prosisz o podanie roznych liczb i wczytujesz jeszcze raz.

A co do kodu to jest kilka błędów i dziwnych rzeczy:

  1. To dziwne do while w funkcji czy_byla powoduje, że jeśli zmienna ile wynosi zero to i tak sprawdzisz zerowy element. Ba - nawet jesli zmienna ile wynosi -345345 tez sprawdzisz zerowy element. Ta pętla do while nie dosc ze tam logicznie nie pasuje to jeszcze źle działa. Zawsze gdy wiesz ile razy będziesz iterował używaj zwykłej pętli for.
  2. Mam nadzieję, że implementacja funkcji czy_byla to jedynie Twój własny wybór, żeby poćwiczyć algorytmy, ale normalnie użyłbyś std::find, bo Twojego ifa można strescic do tego:
    if(find(begin(tab2),end(tab2),tab[it]) == end(tab2))
    
  3. Drugi do-while tez nie jest w zaden sposob uzasadniony. Generalnie zasady w wyborze pętli sa takie:
    - uzyj gotowców z <algorithm>  jesli sie da
    - jesli wiesz ile razy iterujesz to zawsze for
    - jesli nie wiesz ile razy będziesz iterowal to while
    - jesli nie wiesz ile razy, ale niezaleznie od warunku potrzebujesz wykonac cialo petli co najmniej raz to do-while
  4. Ucz się od samego początku używac C++'owej biblioteki a nie staroci z C. Czyli zamiast:
    srand(time(NULL));
    int losowa_wartosc = rand() % 2;

    powinienes zrobic:
     

    	std::random_device r; //generator losowego seeda
    	//jego wywolanie to odpowiednik time(NULL)
    	std::default_random_engine engine(r()); //poniekad odpowiednik srand
    	std::uniform_int_distribution dist(0, 2); 
        //wywolania dist(engine) zwracaja inta [0,2]
    	int value = dist(engine); //odpowiednik rand() % 2
  5. Nazywaj zmienne zgodnie z ich przeznaczeniem. Tak ja na szybko bym zmienił Twoje brzydkie nic nie mowiace nazwy:
    - tab - liczby
    - tab2 - dotychczas_wylosowane
    - it - losowy_indeks

 

+1 głos
odpowiedź 30 listopada 2018 przez j23 Mędrzec (194,920 p.)
Zamiast sprawdzać, czy wylosowałeś już daną wartość liczbową, sprawdź, czy wylosowałeś już dany indeks.

Podobne pytania

0 głosów
1 odpowiedź 259 wizyt
pytanie zadane 20 czerwca 2018 w C i C++ przez Nowacx02 Obywatel (1,060 p.)
0 głosów
2 odpowiedzi 1,139 wizyt
pytanie zadane 29 lipca 2017 w C i C++ przez KubaW Nowicjusz (120 p.)
0 głosów
1 odpowiedź 801 wizyt
pytanie zadane 18 października 2018 w C i C++ przez Gadzic Nowicjusz (170 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...