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

Losowanie n piłek i k kolorów - problem

Object Storage Arubacloud
0 głosów
116 wizyt
pytanie zadane 25 października 2022 w C i C++ przez Rykez Początkujący (250 p.)

Witam, dopiero zaczynam programowanie i nie mogę sobie poradzić z jednym zadaniem. Polecenie brzmi: Dany jest zbiór n piłek, z których każda jest pokolorowana na jeden z k kolorów. Napisz program, który obliczy, jakiego koloru piłek jest najwięcej. Na początku chciałem wylosować ilość piłek dla danego koloru, ale raz wszystko działa poprawie, a raz nie. Ktoś powie gdzie jest błąd oraz dlaczego w dalszej części pętli "k" zmienia wartość? Z góry dziękuję za pomoc (poniżej ss 

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

using namespace std;

int main()
{
    int n, k=0;
    int tab_wynikow[k];
    
    cout<<"Podaj ilosc pilek: "<<endl;
    cin>>n;
    cout<<"Podaj ilosc kolorow: "<<endl;
    cin>>k;
    srand(time(NULL));
	
	 cout<<endl<<"Wylosowane liczby to:"<<endl;
    for(int i=1;i<k ;i++){
        tab_wynikow[i] = rand() % (n +1);
        n = n -tab_wynikow[i];
        cout<<tab_wynikow[i]<<", pozostalo pilek:"<<n<<" numer iteracji to "<<i<<" z "<<k<<endl;
    }
    tab_wynikow[k] =n;
    cout<<tab_wynikow[k];
    
    
    return 0;
}

terminala)

 

1 odpowiedź

+2 głosów
odpowiedź 25 października 2022 przez j23 Mędrzec (194,920 p.)
    int n, k = 0;
    int tab_wynikow[k];
    ...
     
    cin >> k;

 

Tworzysz tablicę zeroelementową, a następnie używasz jej, jakby miała wielkość pobraną ze strumienia - to nie zadziała. Najpierw pobierz wielkość, a później twórz tablicę (użyj do tego std::vector'a, albo przynajmniej new[], bo metoda tworzenia tablicy, którą masz w kodzie, nie trzyma standardu C++).

PS. w C/C++ tablice indeksuje się od zera.

komentarz 25 października 2022 przez Rykez Początkujący (250 p.)

Czy teraz wszystko się zgadza?

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>

using namespace std;

int main()
{
    int n, k, max_pilek=0;
   	std::vector < int > tab_wynikow;
    std::vector < int > wynik;
    
    cout<<"Podaj ilosc pilek: "<<endl;
    cin>>n;
    cout<<"Podaj ilosc kolorow: "<<endl;
    cin>>k;
    
	//losowanie ilosci pilek dla kolorow
	
	srand(time(NULL));
	cout<<endl<<"Losowanie ilosci pilek dla danego koloru: "<<endl;
    for(int i=0;i<(k-1) ;i++){
        tab_wynikow.push_back( rand() % (n +1) );
        n = n -tab_wynikow[i];
        cout<<"W kolorze nr. "<<i+1<<" jest "<<tab_wynikow[i]<<" pilek, pozostalo pilek:"<<n<<endl;
    }
    tab_wynikow.push_back(n);
    cout<<"W kolorze nr. "<<k<<" jest "<<tab_wynikow[k-1]<<" pilek, pozostalo pilek: 0"<<endl;
    
    //wyznaczenie koloru o najwiekszej liczbie pilek
    for(int j=0;j<tab_wynikow.size(); j++){
    	if(tab_wynikow[j]>max_pilek){
    		wynik.clear();
			wynik.push_back(j+1);
			max_pilek = tab_wynikow[j];
		}else if(tab_wynikow[j]==max_pilek){
			wynik.push_back(j+1);
		}	
	}
	cout<<endl<<"Najwiecej jest pilek koloru nr. "<<wynik[0];
    for(int i=1;i<wynik.size() ;i++){
    	cout<<", "<<wynik[i];	
	}
	return 0;
}

 

komentarz 26 października 2022 przez j23 Mędrzec (194,920 p.)

Jeśli chodzi o wspomniany błąd, to tak.

Można prościej, z jedną tablicą:

#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>

int main()
{
    int n, k;

    srand(time(NULL));

    std::cout << "Podaj ilosc pilek: \n";
    std::cin >> n;
    std::cout << "Podaj ilosc kolorow: \n";
    std::cin >> k;
    
    std::vector<int> colors(k);
    
    for(int i = 0; i < n; ++i) {
        ++colors[rand() % k];
    }
     
    auto it = std::max_element(colors.begin(), colors.end());
    std::cout   << "Najwiecej jest pilek koloru nr. " 
                << std::distance(colors.begin(), it) 
                << " (" << *it << " pilek)\n";

    return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 1,830 wizyt
0 głosów
0 odpowiedzi 116 wizyt
0 głosów
1 odpowiedź 960 wizyt
pytanie zadane 31 grudnia 2017 w C i C++ przez Macjeg Nowicjusz (150 p.)

92,566 zapytań

141,420 odpowiedzi

319,609 komentarzy

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

...