Vypočet minima, maxima a strednej hodnoty – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vypočet minima, maxima a strednej hodnoty – C / C++ – Fórum – Programujte.comVypočet minima, maxima a strednej hodnoty – C / C++ – Fórum – Programujte.com

 

evam880
Duch
26. 10. 2015   #1
-
0
-

ahoj, mam napísať program, kde vložím lubovolný počet čísel a program mi vypíše minimum, maximum a strednu hodnotu, neviem sa pohnuť so strednou hodnotou, neviem nájsť chybu, prosím poradte diky. 

#include <iostream>
#include <climits>

using namespace std;

int main()
{
    int max = 0, min = 345678, cislo, pocet;
    double suma = 0;

    cout << "Prosim, vlozte cisla: " << endl;

    while (cislo != 0)
      {
          cin >> cislo;


        if (cislo > max)
            {
                max = cislo;

            }

        if (cislo < min && cislo !=0)
            {
                min = cislo;

            }


        for ( int i = 1; i <=pocet; i++)

            {
                suma = suma + cislo;

            }
    }


    cout << "Maximum: " << max << endl;
    cout << "Minimum: " << min << endl;
    cout << "Stredna hodnota " << suma/pocet<< endl;

    return 0;
}

Nahlásit jako SPAM
IP: 194.118.167.–
26. 10. 2015   #2
-
0
-

Jedna chyba je použít cyklus for. suma by se měla počítat v těle while stejně jako se stanovuje min a max. Použití for jak ho máš by bylo vhodné v případě, že bys čísla nejdříve načetl do vectoru. Jinak konec zadávání by mělo být třeba písmenko q, i 0 (nula) může být zadané číslo. Asi bude vhodné načíst zadané jako řetězec a ten pak konvertovat na číslo. Jinak na min a max bych postupoval tak, že min a max nastavím na první zadané číslo a ostatní porovnávám.

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:48cc:7c...–
Hajrus0
Newbie
26. 10. 2015   #3
-
0
-

Pokud chceš zjistit pouze aritmetický průměr všech zadaných čísel, tak postačí, když na konci cyklu přičteš zadanou hodnotu do sumy. A při každém zadání čísla zvýšit počet zadaných čísel o 1. Ten cyklus je tam zbytečný a je to blbost.

while (cislo != 0)
      {
          cin >> cislo;


        if (cislo > max)
            {
                max = cislo;

            }

        if (cislo < min && cislo !=0)
            {
                min = cislo;

            }

	
        Suma = Suma + cislo;
	pocet++;
    }

Ale měl by jsi ošetřit ještě ty hodnoty, co tam uživatel zadá. V tomto případě by byla sranda, kdyby někdo zadal něco jiného, než číslo :) A ještě by jsi měl snížit ten celkový počet o 1. Protože když tam někdo zadá nulu, tak to beru jako ukončovací znak pro konec cyklu a ne jako číslo, které má nějak souviset s těmi ostatními.

Nahlásit jako SPAM
IP: 78.45.224.–
evam88
~ Anonymní uživatel
9 příspěvků
26. 10. 2015   #4
-
0
-

#3 Hajrus
diky za pomoc uz sa mi to podarilo opravit :)

Nahlásit jako SPAM
IP: 194.118.167.–
27. 10. 2015   #5
-
0
-

Ještě mne napadlo, jestli střední hodnota není něco jiného než aritmetický průměr. Pokud střední hodnota je uprostřed mezi min a max, pak by to bylo (min + max) / 2

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:adc6:8e...–
Hajrus0
Newbie
27. 10. 2015   #6
-
0
-

#5 hlucheucho
To je hodně spekulativní. :) Snad si vystačí s aritmetickým průměrem :) Dá se pod tím představit víc věcí.

Nahlásit jako SPAM
IP: 78.45.224.–
ondrej39+1
Věrný člen
27. 10. 2015   #7
-
0
-

#1 evam88
C++ řešení.

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

int main(int argc, char* argv[])
{
    std::vector<int> numbers;
    int number;
    int count = 0;
    int sum = 0;

    do {
        std::cout << "Insert a number: ";
        std::cin >> number;

        if (number == 0) {
            break;
        }

        numbers.push_back(number);
        sum += number;
        ++count;
    } while (true);

    if (count == 0) {
        std::cout << "The values could not be calculated. No input." << std::endl;
        return -1;
    }

    auto minMax = std::minmax_element(std::begin(numbers), std::end(numbers));

    std::cout << "Min: " << *minMax.first << std::endl;
    std::cout << "Max: " << *minMax.second << std::endl;
    std::cout << "Median: " << static_cast<double>(sum) / count << std::endl;
}
Nahlásit jako SPAM
IP: 195.113.207.–
Inject all the dependencies!
29. 10. 2015   #8
-
0
-

#7 ondrej39
Vypadá to efektně, ale když se podíváme "dovnitř", tak řazení vektoru bude mít nějakou režii, možná uvnitř nějaký cyklus. V původním řešení všechno udělal v jednom cyklu a asi to bude i efektivnější. U školní úlohy kde se zadá pár čísel na tom nesejde, ale v reálné aplikaci by toto mohlo mít podstatný vliv.

I tvému řešení lze vytknout: 0 (nula) je také číslo a může představovat platné zadání, proto bych ji pro ukončení nepoužil.

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:f88f:be...–
ondrej39+1
Věrný člen
29. 10. 2015   #9
-
0
-

#8 hlucheucho
Nula platné číslo je, ale v původním zadání je použili k ukončení cyklu, tak jsem se rozhodl předpis následovat.

Tím řazením máš na mysli co? std::minmax_element jen projde for cyklem kolekci a vrátí ti nejmenší a největší prvek jako std::pair<T, T>, kde T jsou zpravidla iterátory dané kolekce.

Nahlásit jako SPAM
IP: 78.156.159.–
Inject all the dependencies!
29. 10. 2015   #10
-
+1
-
Zajímavé

#9 ondrej39

std::minmax_element jen projde for cyklem kolekci

takže program obsahuje 2 cykly.

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:f88f:be...–
Voty
~ Anonymní uživatel
56 příspěvků
29. 10. 2015   #11
-
0
-

#10 hlucheucho
Čert vem dva cykly, to ještě může dopadnou +/- stejně, ale u druhého řešení nepříjemně roste paměťová složitost z původních O(1) na O(n) a to už může být nepěkná věc.

Nahlásit jako SPAM
IP: 83.208.48.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý