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

"Program dopasowujący do siebie losowo dwie osoby"

Object Storage Arubacloud
0 głosów
199 wizyt
pytanie zadane 6 grudnia 2020 w C i C++ przez Krzysztof11235 Nowicjusz (150 p.)

Witam,

Przygotowuję aplikację dla mojej klasy na Wigilię i potrzebuję pomocy (rady, zakresu materiału jaki muszę poznać, by rozwiązać problem).

Aplikacja (według zamiaru) ma za zadanie dopasowywać do siebie dwie osoby, wybrane losowo z zakresu imion podanego przez użytkownika na wstępie, tzn. użytkownik podaje imiona (w moim wypadku 32), następnie aplikacja losuje dwa imiona z 32-ch imion podanych na wstępie przez użytkownika, na końcu wypisuje dwa imiona spośród podanych.

Przedstawiam kod jaki dotychczas udało mi się wymyślić:

// Pomysl 1

#include <windows.h>
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <stdio.h>

//--------------------------------------------------------------------

using namespace std;

int main()
{

    cout << endl;
    cout << "-----------------------------------------------" << endl;
    cout << "PROGRAM 1 ANDRZEJKI:" << endl;
    cout << "-----------------------------------------------" << endl;

    const int ile=32;

    string imiona[ile];

    cout << "PODAJ IMIONA: " <<endl;

    for (int i=0; i<=ile; i++)
    {
        cin >> imiona[i];
    }

    cout << "---------------------------------------" << endl << endl;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);

//--------------------------------------------------------------------
                   
    cout<<"Prosze zaczekac - losuje imiona...";

    Sleep(3000);
    cout<<endl;

    srand(time(NULL));

    for (int j=1; j<=33; j++)
    {
        imiona = rand()%32+1;
        Sleep(1000);
        cout<<imiona<<endl;
    }

 return 0;
}



// Pomysl 2

#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

string imie[33];
int *liczba;
liczba = &imie;

int main()
{

 for (int i=0; i<=32; i++) 
{ 
cout << "podaj imiona: " << endl;
cin >> imie[i]; 
}

    cout<<"Prosze zaczekac - losuje imiona...";
    Sleep(3000);
    cout<<endl;

    srand(time(NULL));

    for (int j=1; j<=33; j++)
    {
        liczba = rand()%32+1;
        Sleep(1000);
        cout<<*liczba<<endl;
    }
    return 0;
}

Tak króciutko reasumując to tablice ogarnąłem, ale losowania już nie ;) Byłbym bardzo wdzięczny za odpowiedź i wytłumaczenie problemu.

Z góry dziękuję za pomoc :)

2 odpowiedzi

+1 głos
odpowiedź 6 grudnia 2020 przez tangarr Mędrzec (154,780 p.)
wybrane 8 grudnia 2020 przez Krzysztof11235
 
Najlepsza

Zastanów się nad takim algorytmem:
 

// pseudokod

// tablica z imionami
string tablica[32];
int limit = 32;

while (limit > 2) {
    // losujemy osobę z zakresu (0, limit-1)
    int indeks= losuj() % limit;
    
    // przesuwamy osobę na koniec zakresu
    zamien_miejscami(tablica[indeks], tablica[limit-1]);

    // zmniejszamy zakres
    --limit;
}

 

komentarz 8 grudnia 2020 przez Krzysztof11235 Nowicjusz (150 p.)

Witam, 

Przemyślałem Pana kod - jest superowy! Udało mi się skompilować taki oto programik. Naprawdę mega, mega Panu dziękuję, będę miał bardzo udaną Wigilię z ziomeczkami dzięki Panu ;)

Zrobiłem dwie wersje programu - jedną, że losuje tylko raz i drugą tą dla mnie :)

// Program 1 P. "Tangarr", troszke przerobiony (wiele zestawien)

#include <windows.h>
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <stdio.h>
#include <conio.h>

using namespace std;

string tablica[32];
int limit = 32;

    int losuj(int lm)
    {
        srand(time(NULL));
        return rand()%lm;
    }

int main()
{

    cout << "PODAJ IMIONA: " <<endl;

    for (int i=0; i < limit; i++)
    {
        cin >> tablica[i];
    }

    while (limit > 2)
    {
        int indeks = losuj(limit);
        --limit;
        cout << "------------------------------------------------------" << endl;
        cout << "Wylosowane: " << endl;
        cout << tablica[indeks] << endl;
        cout << tablica[limit - 1] << endl;
        cout << "------------------------------------------------------" << endl;
    }

    return 0;
    getch();
}

    // zamien miejscami (tablica[indeks], tablica[limit-1]);

    // zmniejszamy zakres

    // przesuwamy osobę na koniec zakresu

    // losujemy osobę z zakresu (0, limit-1)




/*

// Program 2 P. "Tangarr", troszke przerobiony (jedno zestawienie)

#include <windows.h>
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <stdio.h>
#include <conio.h>

using namespace std;

string tablica[32];
int limit = 32;

    int losuj(int lm)
    {
        while (lm > 2)
        {
        srand(time(NULL));
        return rand()%lm;

        --lm;
        }
    }

int main()
{

    cout << "PODAJ IMIONA: " <<endl;

    for (int i=0; i < limit; i++)
    {
        cin >> tablica[i];
    }

    //while (limit > 2)
    //{
        int indeks = losuj(limit);

        cout << "------------------------------------------------------" << endl;
        cout << "Wylosowane: " << endl;
        cout << tablica[indeks] << endl;
        cout << tablica[limit - 1] << endl;
        cout << "------------------------------------------------------" << endl;

    //}

    return 0;
    getch();
}

    // zamien miejscami (tablica[indeks], tablica[limit-1]);

    // zmniejszamy zakres

    // przesuwamy osobę na koniec zakresu

    // losujemy osobę z zakresu (0, limit-1)

*/


JESZCZE RAZ BARDZO PANU DZIEKUJE!

komentarz 8 grudnia 2020 przez tangarr Mędrzec (154,780 p.)

Widzę błąd

int losuj(int lm)
{
    srand(time(NULL));
    return rand()%lm;
}

Funkcja srand powinna być użyta tylko raz w programie.
Teraz za każdym razem funkcja rand() zwraca tą samą liczbę.

komentarz 9 grudnia 2020 przez Krzysztof11235 Nowicjusz (150 p.)

Czy teraz jest dobrze? Przestawiłem funkcję srand do funkcji main.

// Program 1

#include <windows.h>
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <stdio.h>
#include <conio.h>

using namespace std;

string tablica[32];
int limit = 32;

    int losuj(int lm)
    {
        return rand()%lm;
    }

int main()
{
    cout << "-----------------------------------------------" << endl;
    cout << "PROGRAM 1 ANDRZEJKI:" << endl;
    cout << "-----------------------------------------------" << endl;
    cout << "PODAJ IMIONA: " <<endl;

    for (int i=0; i < limit; i++)
    {
        cin >> tablica[i];
    }

    srand(time(NULL));

    while (limit > 2)
    {
        int indeks = losuj(limit);
        --limit;
        cout << "------------------------------------------------------" << endl;
        cout << "Wylosowane: " << endl;
        cout << tablica[indeks] << endl;
        cout << tablica[limit - 1] << endl;
        cout << "------------------------------------------------------" << endl;
    }

    return 0;
    getch();
}

 

komentarz 9 grudnia 2020 przez tangarr Mędrzec (154,780 p.)
Nie podoba mi się:
- dodajesz biblioteki, których nie używasz
- zmienne globalne
- getch po returnie

I najważniejsze (na co nie zwróciłem uwagi wcześniej): moja wersja mieszała tablicę, twoja wersja będzie powtarzać wylosowane osoby.
+1 głos
odpowiedź 7 grudnia 2020 przez Eriss69 Gaduła (4,470 p.)
Zastanowiłbym się nad wcztaniem imion  z pliku tzn w pierwszej linijce podajesz ile  jest imion, w twoim przypadku jest ich 32, a 2,3,4... linia to imiona. No chyba że chcesz sie meczyc z wprowadzaniem tych imion :P
komentarz 8 grudnia 2020 przez Krzysztof11235 Nowicjusz (150 p.)
W sumie to powiem Panu, że też nad tym myślałem, ale jednak do Wigilii może się sporo zdarzyć ;)

Podobne pytania

0 głosów
2 odpowiedzi 289 wizyt
0 głosów
1 odpowiedź 147 wizyt
0 głosów
1 odpowiedź 266 wizyt
pytanie zadane 19 października 2020 w Sieci komputerowe, internet przez napoludniestad.pl Użytkownik (960 p.)

92,536 zapytań

141,376 odpowiedzi

319,449 komentarzy

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

...