• 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?

Object Storage Arubacloud
+1 głos
2,012 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ź 1,902 wizyt
+2 głosów
2 odpowiedzi 3,409 wizyt
pytanie zadane 14 lipca 2015 w C i C++ przez Wadim Początkujący (260 p.)
0 głosów
2 odpowiedzi 5,769 wizyt
pytanie zadane 14 sierpnia 2016 w Java przez Patryk Rafał Bywalec (2,700 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

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

...