Wskazywanie najwiekszej liczby ze zbioru

0

Jak mogę najprościej wskazać ,że najczęściej np padła liczba trójek nie używając if ?bo tylko to mi przyszło do głowy a niezbyt fajnie to wygląda.


#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;


int main()
{
    srand(time(0));
    int los[200],liczba[6]={0,0,0,0,0,0};
    cout<<"LOSOWANIE 200 liczb od 1do 6: "<<endl;
    for(int i=0;i<200;i++)
{

     los[i]=rand()%6+1;
     cout<<"  "<<los[i]<<"  ";
     if(los[i]==1)
     {
         liczba[0]=liczba[0]+1;
     }
     if(los[i]==2)
     {
         liczba[1]=liczba[1]+1;
     }
     if(los[i]==3)
     {
         liczba[2]=liczba[2]+1;
     }
     if(los[i]==4)
     {
         liczba[3]=liczba[3]+1;
     }
     if(los[i]==5)
     {
         liczba[4]=liczba[4]+1;
     }
     if(los[i]==6)
     {
         liczba[5]=liczba[5]+1;
     }


    }
    cout<<endl;
cout<<"LICZBA JEDYNEK KTORA WYPADLA"<<liczba[0]<<endl;
cout<<"LICZBA DWOJEK KTORA WYPADLA"<<liczba[1]<<endl;
cout<<"LICZBA TROJEK KTORA WYPADLA"<<liczba[2]<<endl;
cout<<"LICZBA CZWOREK KTORA WYPADLA"<<liczba[3]<<endl;
cout<<"LICZBA PIATEK KTORA WYPADLA"<<liczba[4]<<endl;
cout<<"LICZBA SZÓSTEK KTORA WYPADLA"<<liczba[5]<<endl;


}
3

Zamiast tych wszystkich ifów

++liczba[los[i] - 1]; 

I naucz się formatować kod albo przepuszczaj przez jakieś narzędzie nim wstawisz na forum, polecam np. http://format.krzaq.cc/

Jeszcze kwestia losowania liczb. Przed C++11

rand()%6+1

może i jest dopuszczalne, lecz od C++11 warto się przyjrzeć bibliotece <random> ze standardowej biblioteki.

1

Wszystkie if'y możesz zamienić na pojedyńcze coś takiego:

liczba[los[i] - 1] = liczba[i - 1] + 1;

albo nawet na:

liczba[los[i] - 1]++;

Potem jeżeli chcesz znaleźć liczbę, która wypadła najwięcej razy, to szukasz maksimum w tablicy liczba[].

1

Możesz skorzystać z std::map<> do zliczania wystąpień danej liczby.

#include <iostream>
#include <map>
#include <random>
#include <algorithm>

std::default_random_engine dre;

int main()
{
    std::map<int, std::size_t> occurCounter;
    int endRange{ 6 };
    std::uniform_int_distribution<> dist(1, endRange);
    std::size_t nLoops{ 200 };
    for (std::size_t i = 0; i < nLoops; ++i) {
        int num = dist(dre);
        auto pos = occurCounter.find(num);
        if (pos == occurCounter.end()) {
            occurCounter.insert(decltype(occurCounter)::value_type(num, 1));
        }
        else {
            ++pos->second;
        }
    }
    for (auto const& el : occurCounter) {
        std::cout << el.first << " " << el.second << '\n';
    }

    auto maxNumOccur = occurCounter.cbegin();
    for (auto cit = occurCounter.cbegin(); cit != occurCounter.end(); ++cit) {
        if (cit->second > maxNumOccur->second) {
            maxNumOccur = cit;
        }
    }
    std::cout << "najczesciej wystepuje liczba " << maxNumOccur->first << " i wystepuje " << maxNumOccur->second << " razy\n";
} 
1

Bez ifów.

#include <iostream>
#include <array>
#include <random>
#include <algorithm>

std::default_random_engine dre;

int main()
{
    constexpr std::size_t SIZE_ARRAY{ 6 };
    std::array<int, SIZE_ARRAY> occurCounter{};
    int endRange{ SIZE_ARRAY };
    std::uniform_int_distribution<> dist(1, endRange);
    std::size_t nLoops{ 200 };
    for (std::size_t i = 0; i < nLoops; ++i) {
        ++occurCounter[dist(dre) - 1];
    }
    for (std::size_t i = 0; i < occurCounter.size(); ++i) {
        std::cout << (i + 1) << " " << occurCounter[i] << '\n';
    }
    auto pos = std::max_element(occurCounter.cbegin(), occurCounter.cend());
    std::cout << "najczesciej wystepuje liczba " << (std::distance(occurCounter.cbegin(), pos) + 1)
        << " i wystepuje " << *pos << " razy.\n";
} 

1 użytkowników online, w tym zalogowanych: 0, gości: 1