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

0 głosów
93 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 VIP (136,900 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 VIP (136,900 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 VIP (136,900 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,050 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 245 wizyt
0 głosów
1 odpowiedź 103 wizyt
0 głosów
1 odpowiedź 80 wizyt
pytanie zadane 19 października 2020 w Sieci komputerowe, internet przez napoludniestad.pl Użytkownik (960 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

85,212 zapytań

134,029 odpowiedzi

297,158 komentarzy

56,309 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...