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

Funkcja losująca dwie liczby bez powtórzeń z trzech liczb podanych przez użytkownika?

HackNation - ogólnopolski hackathon
+1 głos
2,274 wizyt
pytanie zadane 19 sierpnia 2015 w C i C++ przez Koder Nowicjusz (200 p.)

Rozwiązuję zadanie o treści:

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. 

I napisałem już coś takiego. 

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

void wczytaj(int tab[])
{
    int i = 0;
    do
    {
        cin >> tab [i];
        i++;
    } while (i < 3);
}

int wylosuj()
{

}
int main()
{
 srand(time(NULL));
int tablica [3];
int liczba = 0;
wczytaj(tablica); //wczytuje 3 liczby do tablicy

 

Z tym że nie mam pojęcia, jak będzie wyglądała funkcja losująca dwie liczby z trzech podanych. 

 

2 odpowiedzi

0 głosów
odpowiedź 19 sierpnia 2015 przez krecik1334 Maniak (58,390 p.)
Wywołanie rand()%3 i rand()%2 z odpowiednim zabezpieczeniem przed wylosowaniem 2 lub więcej razy tego samego.
komentarz 19 sierpnia 2015 przez Koder Nowicjusz (200 p.)

Dziękuję za pomoc. Tylko wyjaśnij mi dlaczego rand()%3? Do czego się to odwołuje? Niezbyt rozumiem. Znam liczby pseudolosowe tylko w wymiarze:

(rand() % liczby_w_przedziale ) + startowa_liczba;

 

komentarz 19 sierpnia 2015 przez krecik1334 Maniak (58,390 p.)

Modulujesz przez 3 i 2 bo masz najpierw 3 liczby w tablicy, potem 2. Najpierw może ci wylosować zerowy, pierwszy lub drugi element a potem zerowy lub pierwszy.

0 głosów
odpowiedź 19 sierpnia 2015 przez mrcnsct Nałogowiec (36,390 p.)
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

void wczytaj(int tab[])
{
    int i = 0;
    cout<<"podaj 3 cyfry, co najmniej 2 rozne"<<endl;
    do
    {
        cin >> tab [i];
        i++;
    } while (i < 3);
}

void wylosuj(int*a,int*b,int tab[]){

    *a = rand()%3;
    *b = rand()%3;
    while(tab[*a]==tab[*b]){
        *b = rand()%3;
    }

}

void wypisz(int*a,int*b,int tab[]){
    cout<<"wylosowane liczby to"<<endl;
    cout<<tab[*a]<<endl<<tab[*b]<<endl;
}


int main(){
    int a,b;
    srand(time(NULL));
    int tablica [3];
    wczytaj(tablica);
    wylosuj(&a,&b,tablica);
    wypisz(&a,&b,tablica);

return 0;
}

rand()%3 oznacza, że będzie losować liczby z przedziału 0-2. Zostaną one użyte jako indeksy tablicy.

Zamiast wskaźników, można użyć zmiennych globalnych.

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

int a,b;
int tablica [3];

void wczytaj(int tab[])
{
    int i = 0;
    cout<<"podaj 3 cyfry, co najmniej 2 rozne"<<endl;
    do
    {
        cin >> tab [i];
        i++;
    } while (i < 3);
}

void wylosuj(){

    a = rand()%3;
    b = rand()%3;
    while(tablica[a]==tablica[b]){
        b = rand()%3;
    }

}

void wypisz(){
    cout<<"wylosowane liczby to"<<endl;
    cout<<tablica[a]<<endl<<tablica[b]<<endl;
}


int main(){

    srand(time(NULL));
    wczytaj(tablica);
    wylosuj();
    wypisz();

return 0;
}

 

komentarz 19 sierpnia 2015 przez Koder Nowicjusz (200 p.)
Jeszcze nie doszedłem do wskaźników, według tego kursu http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Losowanie-bez-powtorzen/293 powinienem potrafić (zadanie) je już rozwiązać a i nie powinienem używać zmiennych globalnych.
komentarz 20 sierpnia 2015 przez mrcnsct Nałogowiec (36,390 p.)
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cstdio>

using namespace std;

int sprawdz(int l, int i, int liczba[]){
    int j;
    for(j=0; j<i; ++j){
        if(l == liczba[j]){
            l = rand() % 3;//10
            l = sprawdz(l,i,liczba);
        }
    }
    return l;
}

void wczytaj(int tab[]){
    int i;
    printf("podaj 3 rozne liczby\n");//10
    for(i=0; i<3; ++i){//10
        scanf("%d",&tab[i]);
    }
}

void losowanie(int liczba[]){
    int i,l;
    for(i=0; i<2; ++i){//8
        l = rand() % 3;//10
        l = sprawdz(l,i,liczba);
        liczba[i]=l;
    }
}

void wypisz(int tab[], int liczba[]){
    int i;
    printf("wylosowane liczby\n");
    for(i=0; i<2; ++i){//8
        printf("%d ",tab[liczba[i]]);
    }
}

int main(){

    int liczba[2];//8
    srand(time(NULL));
    int tab[3];//10

    wczytaj(tab);
    losowanie(liczba);
    wypisz(tab,liczba);

    return 0;
}

Jak chcesz zmienić, żeby losowało 8 z 10, to tam gdzie to zaznaczyłem w komentarzach zamień liczby, tj. 2 na 8, a 3 na 10.

Podobne pytania

0 głosów
1 odpowiedź 2,241 wizyt
+2 głosów
2 odpowiedzi 3,908 wizyt
pytanie zadane 14 lipca 2015 w C i C++ przez Wadim Początkujący (260 p.)
0 głosów
2 odpowiedzi 6,201 wizyt
pytanie zadane 14 sierpnia 2016 w Java przez Patryk Rafał Bywalec (2,700 p.)

93,626 zapytań

142,551 odpowiedzi

323,044 komentarzy

63,130 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 1452p. - dia-Chann
  2. 1437p. - DziarnowskiJ
  3. 1411p. - Łukasz Piwowar
  4. 1409p. - CC PL
  5. 1388p. - Maurycy W
  6. 1371p. - raydeal
  7. 1369p. - Adrian Wieprzkowicz
  8. 1360p. - Tomasz Bielak
  9. 1335p. - robwarsz
  10. 1296p. - Michal Drewniak
  11. 1269p. - Rafał Trójniak
  12. 1141p. - ssynowiec
  13. 1116p. - rucin93
  14. 1102p. - Dominik Łempicki (kapitan)
  15. 1100p. - Mariusz Fornal
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...