C# - Jak udělat aritmetický průměr Vyřešeno

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
domitea
Tvůrce článků
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: C# - Jak udělat aritmetický průměr

Příspěvekod domitea » 12 bře 2011 21:35

V sharpu je možné všechno :lol: , dokonce můžeš volat neexistující funkci :D

Ten kód s neomezeným průměrem bych udělal takto:

Kód: Vybrat vše

static void Main(string[] args)
        {
            try
            {
                double cisla = 0;
                double pocet = 0;
                while (true)
                {
                   
                    Console.WriteLine("Napis cislo, pokud chces vysledek napis > vysledek");
                    string cislo = Console.ReadLine();
                    if (cislo == "vysledek")
                    {
                        Console.WriteLine("Vysledek je:");
                        Console.WriteLine((cisla / pocet).ToString());
                    }
                    else
                    {
                        cisla += Convert.ToDouble(cislo);
                        pocet++;
                    }
                }
            }
            catch
            {
                Console.WriteLine("Chyba");
            }
        }


Do programu hezky napíšeš čísla a když chceš výsledek, napiš vysledek místo čísla :wink:

Reklama
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: C# - Jak udělat aritmetický průměr

Příspěvekod faraon » 12 bře 2011 22:44

if (cislo == "vysledek")

Mám to chápat tak že C# do číselné proměnné klidně uloží řetězec a ještě si ho pak porovná? No fuj, to je i na Gatesovy prasárny moc silné kafe :x (http://www.youtube.com/watch?v=kymzTlqi1SY)
Jinak to máš moc pěkné, akorát ses elegantně vyhnul tomu poli :-D Mohl bys ho tam nějak dopracovat? Pokud možno i s tou realokací, ať vidím jestli jsem to odhadl správně.
Jinak bych to také mohl řešit takhle:

Kód: Vybrat vše

for(pocet=0;scanf("%lf",&cislo),cislo;soucet+=cislo,++pocet);
pocet?printf("Aritmetický průměr zadaných hodnot je: %f\n",soucet/pocet):printf("Nebyla zadána žádná hodnota!\n");
(Ne že bych zrovna tuhle prasárnu někomu doporučoval!)
Naposledy upravil(a) faraon dne 13 bře 2011 09:54, celkem upraveno 1 x.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
domitea
Tvůrce článků
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: C# - Jak udělat aritmetický průměr

Příspěvekod domitea » 13 bře 2011 09:32

Jestli se dobře podíváš je tam

Kód: Vybrat vše

String cislo = Console.ReadLine();


Já tam nic jako písmeno v číselné proměnné nevidím :wink: , poté přes IF zjistím, jestli tam není vysledek a pak to hodím do čísla

A odpoledne se na to pole podívám :bigups:

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: C# - Jak udělat aritmetický průměr

Příspěvekod faraon » 13 bře 2011 09:53

Tak to jsi mě dobře dostal, String cislo jsem fakt přehlédl. To sis nemohl vymyslet nějaký méně matoucí název? :-D
Na tohle byl zlatý BASIC, tam bych na první pohled poznal že cislo$ je řetězcová proměnná.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
domitea
Tvůrce článků
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: C# - Jak udělat aritmetický průměr

Příspěvekod domitea » 13 bře 2011 14:01

Faraon: To jsem spatlal narychlo hoodně pozdě a tak je to kapku nepřehledný, jinak používám regiony, commenty, a mé oblíbené Summary :D

Tak jsem to zkoušel přes to pole a nic, nebo se mi to spíš (čti určitě :lol: ) nepodařilo :oops: . Důvod je prostý, když se inicializuje pole takto a podobně, když neznáte velikost:

Kód: Vybrat vše

double[] pole = {};


tak má velikost null (není to nula, je to nic) a vždycky když na to odkazuju, tak je mimo hranice pole. Proč? Odkazuju totiž na nulu a né na null a když odkážu na null, tak se nepracuje :D . (aspoň tak jsem usoudil :idea: )

P.S.: proč se s nekonečným průměrem patlat přes pole, adresujete o pár kilobajtů navíc (!!!!!!!) :lol: , takhle je to v mém kódu jen jedno číslo - 64 bajtů

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: C# - Jak udělat aritmetický průměr  Vyřešeno

Příspěvekod faraon » 13 bře 2011 19:15

Domitea: ale o to pole tam právě šlo, on to teda belier měl původně přes seznam, ale s tím se v C# nechytám ani trochu, takže časem se to snad mělo vyvinout takhle nějak:

Kód: Vybrat vše

Console.WriteLine("Zadejte hodnoty pro výpočet aritmetického průměru a ukončete '0'");

/* smyčka 1 - načítání hodnot */
    pocet=0;
    nula=False;
    while (!nula)
    {
        cislo=double.Parse(Console.ReadLine());
        if (cislo>0)
        {
            array.resize(pole,pocet+1);
            pole[pocet]=cislo;
            pocet++;
        }
        else
            nula=True;
    }

/* smyčka 2 - spočítání součtu */
    soucet=0;
    for (i=0;i<pocet;++i)
        soucet+=pole[i];

/* zobrazení výsledku */
    if (pocet>0)
        Console.WriteLine("Aritmetický průměr zadaných hodnot je: {0}", soucet/pocet);
    else
        Console.WriteLine("Nebyla zadána žádná hodnota!");
    Console.ReadLine();
(nebijte mě, C# neovládám :-D)

A s těmi čísly uloženými v poli by si pak dál mohl dělat co by chtěl, třeba najít nejmenší a největší, seřadit je podle velikosti, udělat z nich převrácené hodnoty...
Teď jde o to jestli to array.resize(pole,pocet+1); dělá to co si myslím - že přidá další buňku, mohl bys ho zkusit otestovat v tom tvém programu? Co jsem vygooglil tak funguje jenom na jednorozměrná pole, což je zrovna tenhle případ.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
domitea
Tvůrce článků
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: C# - Jak udělat aritmetický průměr

Příspěvekod domitea » 13 bře 2011 20:16

Faraone, na to, že to neovládáš C# jsi to napsal dobře, jen mám otázku. To v Céčku nedeklarujete proměný? :lol:

Kód upraven pro C#, ale myšlenka zachována

Kód: Vybrat vše

Console.WriteLine("Zadejte hodnoty pro výpočet aritmetického průměru a ukončete '0'");

            /* smyčka 1 - načítání hodnot */
            int pocet = 0;
            bool nula = false;
            double[] pole = {};
            while (!nula)
            {
                double cislo = double.Parse(Console.ReadLine());
                if (cislo > 0)
                {
                    Array.Resize(ref pole, pocet + 1);   
                    pole[pocet] = cislo;
                    pocet++;
                }
                else
                    nula = true;
            }

            /* smyčka 2 - spočítání součtu */
            double soucet = 0;
            for (int i = 0; i < pocet; i++)
                soucet = soucet + pole[i];

            /* zobrazení výsledku */
            if (pocet > 0)
                Console.WriteLine("Aritmetický průměr zadaných hodnot je: {0}", soucet / pocet);
            else
                Console.WriteLine("Nebyla zadána žádná hodnota!");
            Console.ReadLine();


Belier: Máš tu dost návodů na aritmetický průměr s polem i bez pole, tak si snad vybereš. A nezapomeň na MSDN, kde je popsaný celý .NET Framework, XNA a SDK programů

Uživatelský avatar
belier
Level 1
Level 1
Příspěvky: 98
Registrován: únor 11
Bydliště: R.p.R
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: C# - Jak udělat aritmetický průměr

Příspěvekod belier » 13 bře 2011 20:48

domitea,faraon: Díky za pomoc, ale i když to upravím dle Vašich návodů, tak vždy uvíznu na uložení zadaného čísla do pole (IndexOutOfRangeException was unhadled, což dle mé knížky znamená, že jsem použil index neexistujícího prvku).
Pro ilustraci:

Kód: Vybrat vše

 static void Main(string[] args)
        {
            int pocet = 0;
            double[] pole = { };
            for (int i = 0; i < 5; i++)
            {
                double cislo = double.Parse(Console.ReadLine());
               
                    Array.Resize(ref pole, pocet++);
                    pole[pocet] = cislo;
            }
        }

Po zadání čísla, vyhodí vyjímku.

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: C# - Jak udělat aritmetický průměr

Příspěvekod faraon » 13 bře 2011 20:54

domitea píše:To v Céčku nedeklarujete proměný?


Samozřejmě že ano, ale hned na začátku funkce, nedá* se to míchat s příkazy. To je právě to co mě včera tak rozhodilo :-D Já jsem všechny deklarace předpokládal automaticky už před tím prvním Console.WriteLine("Zadejte..., takže jsem tam napsal jen přiřazení počáteční hodnoty u těch proměnných kde to bylo třeba.
Ale potěšil jsi mě, ty ostatní příkazy jsem opsal z předchozích příspěvků, takže jsem nejspíš správně odhadl co by měly dělat :listen:

* Tedy ono se to trochu míchat dá, ale jen za určitých okolností a až od C99, ale nepatří to k "dobrému programátorskému stylu" ;-) I když uznávám že udělat si dočasnou proměnnou s platností uvnitř jedné smyčky může zabránit pár bočním efektům.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
domitea
Tvůrce článků
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: C# - Jak udělat aritmetický průměr

Příspěvekod domitea » 13 bře 2011 21:05

Je to dobře napsaný, jen v tomhle případě není dobré v Array.Resize použít inkrementaci (pocet++), ale pocet + 1 a to je ta chyba (index je mimo hrnice pole) :lol: a ještě chybí ti tam pocet++ na konci :wink: .

Takže takto

Kód: Vybrat vše

int pocet = 0;
            double[] pole = {};
            for (int i = 0; i < 5; i++)
            {
                double cislo = double.Parse(Console.ReadLine());
                Array.Resize(ref pole, pocet+1);
                pole[pocet] = cislo;
                pocet++;
            }


Neříkám, že inkrementace je blbost, naopak je to velice dobrá věc, jen to prostě ten Resize nepobral :lol:

// Faraon: Máš velice dobře nakročeno k machinaci jménem Microsoft :lol: , ještě že tu je Mono :D
Naposledy upravil(a) domitea dne 13 bře 2011 21:11, celkem upraveno 2 x.

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: C# - Jak udělat aritmetický průměr

Příspěvekod faraon » 13 bře 2011 21:06

belier píše:Array.Resize(ref pole, pocet++);
pole[pocet] = cislo;

Tohle mě napadlo také, ale je to blbost - ty zvětšíš počet prvků na 1, definuješ pole s jednou buňkou, a pak chceš zapsat číslo do pole[1], ale to by byl už druhý prvek!
A nebo bys musel zapisovat do pole[pocet-1] ;-)
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
domitea
Tvůrce článků
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: C# - Jak udělat aritmetický průměr

Příspěvekod domitea » 13 bře 2011 21:13

Upravený kód v předchozím mém postu :wink:


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek

Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti