Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Ondrej Zadrapa:19.5.2020 12:20

Caute, mam tady problém s vypisem všech teplot. Snad svůj požadavek zformuluji spravne, ale ve vystupu by mel program zobrazit všechny zadane teploty, minimalni teplotu, poradi, kdy byla zadana a prumer všech teplot. Zobrazit minimum a prumer uz znam z jiné ulohy, tady mi způsob provedeni unika, poradil by mi někdo?

Zkusil jsem:

Dim pokracovat As String = "a"
        Dim soucet As Single = 0
        Dim minimum As Single = 100
        Dim pocet As Integer = 0
        Dim poradi As Integer = 0
        While pokracovat = "a"
            For i As Integer = 0 To 4
                Console.WriteLine("Zadej {0}.teplotu ohrevu vody:", i + 1)
                Dim zadane As Integer = Console.ReadLine()
                If zadane <> 100 Then
                    soucet += zadane
                    pocet += 1
                    If zadane < minimum Then
                        minimum = zadane
                    End If
                Else
                    soucet += zadane
                    pocet += 1
                End If
            Next
            Console.WriteLine("Pokracovat? a+enter/enter")
            pokracovat = Console.ReadLine().ToLower().Trim()
        End While
        Console.WriteLine("Nejmensi teplota ohravu cinila {0} stupnu.", minimum)
        Console.WriteLine("Prumerna teplota ohrevu cinila {0} stupnu.", (soucet / pocet))
        Console.ReadKey()
    End Sub

Chci docílit: Rad bych zjistil, jak napsat program tak, aby mi ve vystupu zobrazil krome minima a prumeru zadanych teplot i poradi, kdy byla minimalni teplota zadana a zobrazeni všech zadanych teplot. Dekuji a předem dekuji.

 
Odpovědět
19.5.2020 12:20
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:19.5.2020 14:23

Máš úlohu pro práci s polem. Podle toho jak zadáváš for cyklus tak dopředu víš kolik bude naměřených teplot. Je tedy zbytečné zjišťovat jejich počet. Kromě inicializovaného počtu máš proměnné soucet, minimum a pole pro 5 hodnot (teplot). Toto pole budeš naplňovat hodnotami běžně od nejnižšího indexu. Pořadí nebude proměnná ale znamená to výpis všech hodnot z pole od nejnižšího indexu po nejvyšší. Neplést si to se seřazením. Minimum inicializuj na hodnotu prvního prvku až poté, co načteš všechny teploty. Pak průchodem a porovnáním všech hodnot v poli zjistíš která hodnota je skutečně nejmenší.

Nahoru Odpovědět
19.5.2020 14:23
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:19.5.2020 14:35

No a jsem zase ztraceny, navíc tuhle ulohu mam jeste plnit bez pole. poslední na procviceni cyklu While, ale i tak jsem uplne vedle. S poli jsem delal maximalne tady v tutorialu, jinak jsem je vlastne ještě ani nemel sanci nikde moc pouzit, ted to ze zacatku vypada jak kvantova fyzika.

 
Nahoru Odpovědět
19.5.2020 14:35
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:19.5.2020 15:04

Pokud má být vstup oddělený od výstupu, tedy vypsat všechny teploty které byly zadané, aniž by mezi nimi byly byl příkaz vstupu, pak použití pole je bezpodmínečné. Pochybuji, že si máte vytvářet proměnnou pro každou teplotu. Jinak se znova podívej na mé dva způsoby práce s načítáním v cyklu a způsobu stanovení minima. Jediné co tam přibude je výpis aktuálně načtené teploty, jinak se to nijak zásadně neliší.

Nahoru Odpovědět
19.5.2020 15:04
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:19.5.2020 15:08
Sub Main()
        Dim pokracovat As String = "a"
        Console.WriteLine("Zadej pocet teplot:")
        Dim pocetTeplot As Integer = Integer.Parse(Console.ReadLine())
        Dim pole() As Integer = New Integer(pocetTeplot - 1) {}
        While pokracovat = "a"
            For i As Integer = 0 To pocetTeplot - 1
                Console.Write("Zadej {0}. teplotu ohrevu: ", i + 1)
                pole(i) = Integer.Parse(Console.ReadLine())
            Next
            Dim minimum As Integer = pole(0)
            For i As Integer = 0 To pole.Length - 1
                If minimum < pole(i) Then
                    pole(i) = minimum
                End If
            Next
            Console.WriteLine("Pokracovat? a+enter/enter")
            pokracovat = Console.ReadLine().ToLower().Trim()
        End While
        Console.ReadKey()
    End Sub

Jak rikam, s poli jsem delal tak jednou, maximalne 2x, vic ani fň, jdu alespoň spravnym smerem?

 
Nahoru Odpovědět
19.5.2020 15:08
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:19.5.2020 15:20

While cyklus pro určení zda pokračovat je zde zbytečný. Další kroky jsou v pořádku (zjištění počet teplot, načtení teplot do pole, určení minima. Chybně měníš hodnotu na indexu. Máš měnit minimum nikoli hodnotu pole. Chybí Ti veškeré finální výpisy.

Nahoru Odpovědět
19.5.2020 15:20
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:19.5.2020 15:27

Jak z toho teda urcim prumer, vypisu všechny ty vypsane hodnoty a zjistim poradove číslo, kdy byla zadana nejnizsi hodnota?

 
Nahoru Odpovědět
19.5.2020 15:27
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:19.5.2020 15:48

Zadej počet teplot, načti všechny teploty do pole, sečti všechny hodnoty v poli a vyděl počtem teplot. Jak se počítá průměr už si dělal. Máš určit minimum, nikoli pořadové číslo.

Nahoru Odpovědět
19.5.2020 15:48
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:19.5.2020 15:50

Mam urcit nejmensi teplotu a poradi, kdy byla vypsana.

 
Nahoru Odpovědět
19.5.2020 15:50
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:19.5.2020 15:59

Pokud měníš hodnotu minima, pak si aktualizuješ vždy i index. Máš-li pole 5 prvků a zjistíš, že minimum je na druhém indexu pole[1], pak to značí že byla vypsaná jako druhá (index + 1).

Nahoru Odpovědět
19.5.2020 15:59
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:19.5.2020 17:14

Já Ti teď asi nerozumím, ale jak mám dopředu vědět, na kterém indexu bude ležet nejmenší hodnota, když vlastně Ty hodnoty zadávám až v konzoli?

 
Nahoru Odpovědět
19.5.2020 17:14
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:19.5.2020 17:24

Po zadání každé nové hodnoty otestuješ na to zda je hodnota menší než dosavadní minimum. Po načtení všech dat tak víš jaká hodnota je nejnižší a kolikátá v pořadí byla zadána. Řídící proměnná cyklu koresponduje s indexem pole.

Nahoru Odpovědět
19.5.2020 17:24
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:19.5.2020 19:28
Sub Main()
        Console.WriteLine("Zadej pocet teplot:")
        Dim pocetTeplot As Integer = Integer.Parse(Console.ReadLine())
        Dim pole() As Integer = New Integer(pocetTeplot - 1) {}
        For i As Integer = 0 To pocetTeplot - 1
            Console.Write("Zadej {0}. teplotu ohrevu: ", i + 1)
            pole(i) = Integer.Parse(Console.ReadLine())
        Next
        Dim minimum As Integer = pole(0)
        For i As Integer = 0 To pole.Length - 1
            If pole(i) < minimum Then
                minimum = pole(i)
            End If
        Next
        Dim prumer As Single = pole(pole.Length / (pocetTeplot))
        For Each vypis In pole
            Console.Write(vypis & " ")
        Next
        Console.WriteLine()
        Console.WriteLine("Prumerna teplota je {0} stupnu.", prumer)
        Console.WriteLine("Nejmensi zadana teplota {0} stupnu byla zadana jako {0}.", minimum)
        Console.ReadKey()
    End Sub

Ja jsem fakt asi pablb, nemam predstavu, kde mam co pridat/ubrat/u­pravit, aby mi z toho vyslo poradi. :D Muzes me trosku vic postrčit k tomu, co mi furt nedochazi?

 
Nahoru Odpovědět
19.5.2020 19:28
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:19.5.2020 20:13

Hodnota minima je dana nejnižší hodnotou prvku na daném indexu a pozice minima je dána indexem. Při změně minima je třeba aktualizovat i index. Viz. následující úryvek kódu:

// Nacteni teplot do pole
// ...

// Inicialize minima a pozice minima
if (pocetTeplot > 0) {
        min = pole[0];
        minpos = 0;
}
else {
        printf("Nebyla zadana zadna teplota: %d\n", min);
        exit(0);
}

// Stanoveni minima a pozice minima
for (int i = 0; i < pocetTeplot; i++) {
        if (pole[i] < min) {
                min = pole[i];
                minpos = i;
        }
}

// Vypis minima a pozice minima
printf("Hodnota nejmensi teploty: %d\n", min);
printf("Nejmensi teplota byla zadana jako: %d.\n", minpos + 1);
Nahoru Odpovědět
19.5.2020 20:13
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:19.5.2020 21:07

Ja bych strasne rad ocenil, ze se mi snazis pomoct, ale rozdily v syntaxi nesou pricinu toho, ze jsem se neposunul ani o krok dal, jsem porad na stejnem miste.

 
Nahoru Odpovědět
19.5.2020 21:07
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:19.5.2020 21:15

Teda spis jsou doprovazejicim problémem, vetsi pruser je absolutni neznalost prace s poli, ja vůbec nevim, co mam delat, abych to zmenil, ten Tvuj pokus o radu program v podstate uplne ignoruje, pokazde je vystup stejny: "Nejmensi zadana teplota 10 stupnu byla zadana jako 10."... při 3 hodnotách, 10,20,30, takze to vypise hodnotu

Sub Main()
        Console.WriteLine("Zadej pocet teplot:")
        Dim pocetTeplot As Integer = Integer.Parse(Console.ReadLine())
        Dim pole() As Integer = New Integer(pocetTeplot - 1) {}
        For i As Integer = 0 To pocetTeplot - 1
            Console.Write("Zadej {0}. teplotu ohrevu: ", i + 1)
            pole(i) = Integer.Parse(Console.ReadLine())
        Next
        Dim minimum As Integer = pole(0)
        Dim poradi As Integer = 0
        For i As Integer = 0 To pole.Length - 1
            If pole(i) < minimum Then
                minimum = pole(i)
            End If
        Next
        Dim prumer As Single = pole(pole.Length / (pocetTeplot))
        For Each vypis In pole
            Console.Write(vypis & " ")
        Next
        Console.WriteLine()
        Console.WriteLine("Prumerna teplota je {0} stupnu.", prumer)
        Console.WriteLine("Nejmensi zadana teplota {0} stupnu byla zadana jako {0}.", minimum, poradi + 1)
        Console.ReadKey()
    End Sub
 
Nahoru Odpovědět
19.5.2020 21:15
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:19.5.2020 21:44

Vůbec neaplikuješ to co Ti celou dobu píšu. Nekoukej na syntax ale na to, abys pochopil to jak celý program funguje. Syntax je tak jednoduchá a podobná, že Ti to musí být jasné ikdyž se jedná o zápis v jiném programovacím jazyce. Navíc Ti vše doplňuji o popisy a komentáře.

Tak znova:

Řídící proměnná cyklu koresponduje s indexem pole. Pozice minima je dána indexem pole. Při změně minima je třeba aktualizovat i index.

for (int i = 0; i < pocetTeplot; i++) {
        if (pole[i] < min) {
                min = pole[i];
                minpos = i;
        }
}

Cyklus for provádí traversování části pole které je vyplněno údaji o teplotě. Traversování znamená že provádí úkon nad každým indexem pole. Proměnná počet teplot udává počet hodnot které si postupně uložil do pole. Pro každou hodnotu se provádí kontrola na minimum.

Pokud je hodnota menší než minimum, aktualizuje se minimum ale také se aktualizuje jeho pozice!

Proměnná minpos uchovává aktuální pozici s nejnižší teplotou. Všimni si, že do ní ukládám index pole. Po průchodu celým polem tak proměnná minpos uchovává pozici s nejnižší teplotou v celém poli.

To je celé...

Nahoru Odpovědět
19.5.2020 21:44
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:19.5.2020 22:32

Dobrý, pořadí se zázrakem spravilo, ale teď mi nefunguje průměr.

 
Nahoru Odpovědět
19.5.2020 22:32
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.