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

Optymalizacja programu (C++)

VPS Starter Arubacloud
0 głosów
307 wizyt
pytanie zadane 30 kwietnia 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
edycja 3 maja 2018 przez Sic

Witam napisałem kiedyś program (w ramach zadania) i go zoptymalizować za pomocą funkcji wbudowanych.

Czy mógłbym prosić o podpowiedź jakie mogę wykorzystać ?

#include <iostream>

//liczenie prawdopodobienstwa w lotto
long double pro(unsigned num[], unsigned picks);

int main()
{
        unsigned t[5], o;
        std::cout << "Podaj 5 licz i ostatnia super liczbe:\n";
        for(int i=0; i < 5; i++)
                std::cin >> t[i];
        std::cin >> o; 
                
        for(int j=0; j < 1; j++)
        {       
                if((t[j] >= 1 && t[j] <= 47) && (o >= 1 && o <= 27))
                {       
                        std::cout << "Szansa wygranej to jeden do ";
                        std::cout << pro(&t[j],o);      //wyliczenie wyniku
                        std::cout << ".\n";
                }
                else
                        std::cout << "Liczby od 1-5 musza byc mniejsze lub rowna 47, a liczba nr 6 musi byc mniejsza lub rowna 27!" << std::endl ;
        }
                std::cout << "do widzenia\n";

        return 0;
}

long double pro(unsigned num[], unsigned picks)
{
        long double r = 1.0; //kilka zmiennych lokalnych
        unsigned p=1;

        for(int i=0; i<p ; i--)
                         r *= num[i]+picks/6; 
        return r;
}

 

2
komentarz 1 maja 2018 przez j23 Mędrzec (194,920 p.)
for(int j=0; j < 1; j++)

Serio? Do tego aż pętli trzeba?

for(int i=0; i<p ; i--)
        return r;

Co to za konstrukt?

 

komentarz 3 maja 2018 przez Sic Dyskutant (8,510 p.)
edycja 3 maja 2018 przez Sic
for(int i=0; i<p ; i--) 
        r *= num[i]+picks/6; 
return r;

2 odpowiedzi

+2 głosów
odpowiedź 1 maja 2018 przez RafalS VIP (122,820 p.)

Mylisz pojęcia :D. Optymalizacja to ulepszanie działającego rozwiązania. Ten program nie ma prawa spełniać założeń :P. 
Funkcja pro zawsze zwraca 1.0 :D I do tego w pętli - która skończy się po pierwszym returnie. Ponadto przekazane argumenty nie są wykorzystywane, więc funkcje pro można by skrócić do jednej linijki - return 1.0;. W mainie też bardzo ciekawa konstrukcja:

for (int j = 0; j < 1; j++)

Po co robić pętle gdy chcemy zrobić coś dokładnie jeden raz?
Ta konstrukcja też strasznie zaciemnia to co chciałeś - lub nie - zrobić:

std::cout << pro(&t[j], o); 

zmienna j w tej "pętli" ma wartość 0, więc efektywnie przekazujesz początek tablicy, czyli zwykłe t. Gdyby jednak pętla miała wykonać się wiecej niż 1 raz to przekazywałbyś kawałek tablicy. Ten kod nie ma sensu, więc ciężko powiedzieć czy to było zamierzeniem. Piszę, bo to rzadko spotykana konstrukcja.

komentarz 3 maja 2018 przez Sic Dyskutant (8,510 p.)

Pętla została stworzona dla odpowiedniego warunku. Jest szansa go zmienić ?

 for(int i=0; i<p ; i--)
                r *= num[i]+picks/6;
        return r;

To w jaki inny sposób mógłbym to obliczyć ?

0 głosów
odpowiedź 3 maja 2018 przez Sic Dyskutant (8,510 p.)

Wprowadziłem kilka poprawek, jednak mam 2 błędy ( warunek if oraz wyrażenie w funkcji)

#include <iostream>
//liczenie prawdopodobienstwa w lotto
long double pro(unsigned num, unsigned picks);

int main()
{
        unsigned t, o;
        std::cout << "Podaj 5 licz i ostatnia super liczbe:\n";
        for(int i=0; i < 5; i++)
                std::cin >> t;
        std::cin >> o; 
        if((t >= 1 && t <= 47) && (o >= 1 && o <= 27))
                std::cout << "Szansa wygranej to jeden do " << pro(t,o) << ".\n";       //wyliczenie wyniku
        else
                std::cout << "Liczby od 1-5 musza byc mniejsze lub rowna 47, a liczba nr 6 musi byc mniejsza lub rowna 27!\n";

        std::cout << "do widzenia\n";

        return 0;
}
long double pro(unsigned num, unsigned picks) { num+=picks/6.0; return num; }

Proszę o podpowiedź w tych kwestiach.

komentarz 3 maja 2018 przez RafalS VIP (122,820 p.)

Sugeruje napisać najpierw coś prostszego, bo robisz bardzo dużo dziwnych błędów. Popracuj nad podstawami programowania.
Jeden z tych błędów to:

        for(int i=0; i < 5; i++)
                std::cin >> t;

Wczytujesz 5 liczb, ale co z tego skoro nadpisujesz je w jednej zmiennej. Wczytujesz po czym zapominasz ich wartości. Efektywnie wczytujesz więc tylko ostatnią liczbę.

Po drugie nie rozumiem wcale podejścia do obliczenia prawdopodobieństwa. Twoja funkcja licząca prawdopodobieństwo dodaje 1/6 super liczby do piątej wczytanej liczby. Nie rozumiem zasad z tą super liczbą, która jest z innego przedziału, ale mimo wszystko ten rachunek niezbyt wygląda jak prawdopodobieństwo.

Zwracasz też long double, a w funkcji przypisujesz wynik do zmiennej całkowitej typu unsigned. Prawie wszystko w tym kodzie sugeruje, że powinieneś poczytać trochę o podstawach :P

komentarz 3 maja 2018 przez RafalS VIP (122,820 p.)
Ten program wyliczy mi stu procentową szanse wygrania w lotku liczbami 1,1,1,1,1,1. Wygląda na to, że wystarczy ustawić 1 na przedostatnim miejscu i coś mniejszego od 6 na ostatnim i voilà mamy 100% szansy na wygraną. Szkoda, że nie ma tak fajnie :D
komentarz 4 maja 2018 przez Sic Dyskutant (8,510 p.)
edycja 4 maja 2018 przez Sic

@RafalS,

Dzięki, po prostu chciałem ominąc tablice bo z nią też było źle ;/

Cała reszta dotycząca typów danych to był wymóg zadania.

Podobne pytania

0 głosów
0 odpowiedzi 251 wizyt
0 głosów
0 odpowiedzi 138 wizyt
pytanie zadane 28 kwietnia 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
+2 głosów
1 odpowiedź 158 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...