IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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:16.5.2020 13:46

Mam napsat program, kde vypisu několik cisel a konzole mi vypise, které z nich je nejvyšší, nejnizsi, pokud napisu 0, tak ji eliminuje, soucet, počet, prumer. No nedari se mi tam zapsat nejmensi číslo, zkousel jsem pripsat ruznymi zpusoby podmínky, ale dopadlo to nakonec tak, ze nejvyšší i nejnizsi byla 0, ale ostatní vypisy byly podle zadanych cisel. Pokud jsem to spravne pochopil podle marných pokusu, tak tady bude nejaky způsob, jak vytvořit dve podmínky pro jednu promennou, která ma několik cisel (snad se vyjadřuju spravne, kdyztak pardon), aby si vzajemne neprotirecili. Snad me někdo pochopi, o co se mi jedna. :D

Zkusil jsem:

Sub Main()
        Dim max As Integer = 0
        Dim min As Integer = 0
        Dim pocet As Integer = 0
        Dim soucet As Integer = 0
        Dim pokracovat As String = "a"
        While pokracovat = "a"
            Console.WriteLine("Zadej pocet cisel:")
            Dim zadane As Integer = Console.ReadLine()
            For i As Integer = 1 To zadane
                Console.WriteLine("Zadejte cislo {0}.cislo:", i)
                Dim cislo As Integer = Console.ReadLine()
                If cislo > max Then
                    max = cislo
                ElseIf cislo = 0 Then
                    pocet -= 1
                    soucet -= cislo
                End If
                soucet += cislo
                pocet += 1
            Next
            Console.WriteLine("Pokracovat? (ano = a + enter / ne = enter)")
            pokracovat = Console.ReadLine().ToLower().Trim()
        End While
        Console.WriteLine("Nejvyssi cifra: {0}", max)
        Console.WriteLine("Nejnizsi cifra: {0}", min)
        Console.WriteLine("Prumer: {0}", (soucet / pocet))
        Console.WriteLine("Celkovy soucet: {0}", soucet)
        Console.WriteLine("Celkovy pocet: {0}", pocet)
        Console.ReadKey()
    End Sub

Chci docílit: Aby program v konzoli vypsal maximum, minimum, prumer, soucet, počet, pricemz když chci zadat podmínky tak, jak zatím umim, tak si protireci a vychazi mi vždycky 0 tam, kde nemá. Predem diky

 
Odpovědět
16.5.2020 13:46
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:16.5.2020 14:57

Musíš si stanovit proměnnou, která determinuje, že bylo načteno alespoň jedno platné číslo. Na základě této proměnné stanovíš minimum ikdyz číslo je větší a maximum ikdyz číslo menší! Je třeba pracovat s platnými čísly nikoli s čísly zadané při inicializaci. Úloha je koncipována tak že na vstupu nevíš kolik bude čísel, ale víš co ukončuje jejich zadávání. Takže buď zvolíš nekonečnou variantu for nebo jiný cyklus.

Trochu se s tím poper, to že hned budeš poptávat řadu tím neprohloubíš své myšlení.

Nahoru Odpovědět
16.5.2020 14:57
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Shade
Člen
Avatar
Shade:16.5.2020 15:42

Ta podmínka

ElseIf cislo = 0 Then
                    pocet -= 1
                    soucet -= cislo

je taková nepěkná. Pokud místo toho použiješ

Continue For

, tak ti to více méně přeskočí všechen ten kód pod tím, tudíž přičítání počtu a součtu, a cyklus pojede další iteraci. S tímto bych si dal pozor na pořadí podmínek, tato by měla být jako první. No a k tomu, proč ti nejde minimum. Hned na začátku jsi si nastavil minimum na 0, tudíž menší jsou jenom záporná čísla. Také si dej pozor, pokud se provede if, elseif už se neprovádí.

Nahoru Odpovědět
16.5.2020 15:42
Talk is cheap. Show me the code.
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:16.5.2020 16:20
Sub Main()
        Dim max As Integer
        Dim min As Integer
        Dim pocet As Integer = 0
        Dim soucet As Integer = 0
        Dim pokracovat As String = "a"
        While pokracovat = "a"
            Console.WriteLine("Zadej cislo:")
            Dim zadane As Integer = Console.ReadLine()
            For i As Integer = zadane To zadane
                If zadane > max Then
                    max = zadane
                ElseIf zadane < min Then
                    zadane = min
                End If
                Continue For
            Next
            pocet += 1
            soucet += zadane
            Console.WriteLine("Pokracovat? (ano = a + enter / ne = enter)")
            pokracovat = Console.ReadLine().ToLower().Trim()
        End While
        Console.WriteLine("Nejvyssi cifra: {0}", max)
        Console.WriteLine("Nejnizsi cifra: {0}", min)
        Console.WriteLine("Prumer: {0}", (soucet / pocet))
        Console.WriteLine("Celkovy soucet: {0}", soucet)
        Console.WriteLine("Celkovy pocet: {0}", pocet)
        Console.ReadKey()
    End Sub

Tak, pravdepodobne nedostanu radu, protože jsem urcite nevyzkousel všechno, nebo jsem bliz, nez si myslim, tudíž i když vazne nevim, co dal, tak se chci jenom zeptat, i když to porad nedela, co potrebuji, jsem aspoň bliz, nebo jsem si to zkomplikoval a mel bych se vrátit na puvodni hodnoty?

 
Nahoru Odpovědět
16.5.2020 16:20
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:16.5.2020 16:42

Abys mohl určit hodnotu min a max a porovnávat nadcházející hodnoty, musíš do nich vložit nějakou hodnotu. Takto jak to máš nemáš hodnoty definované, tudíž porovnání Ti nebude dávat žádnou srozumitelnou hodnotu. Pracuj s proměnnou počet abys zjistil zda vůbec nějaká platná hodnota na vstupu bude. Stejně tak při vyhodnocování pracuješ s hodnotou počet. Díky ní vypisuješ hodnoty nebo informuješ o tom že nebylo zadáno žádné číslo, tudíž hodnoty min, max, soucet, prumer nelze urcit.

Nahoru Odpovědět
16.5.2020 16:42
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Shade
Člen
Avatar
Shade:16.5.2020 16:43

Takto určitě ne, vrať se do původní hodnoty a možná si přečti znovu nějaké základní tutoriály, protože tam děláš vyloženě nesmysly.

Nahoru Odpovědět
16.5.2020 16:43
Talk is cheap. Show me the code.
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:16.5.2020 17:27

Když budeš vysloveně tápat, můžeš se inspirovat (kód psaný v C).

#include <stdio.h>
#include <stdlib.h>

int main(void) {
        int num, min, max, pocet = 0, soucet = 0;

        printf("Zadej cislo: ");
        scanf("%d", &num);
        if (!num) {
                printf("Nebylo zadano platne cislo.\n");
                printf("MIN, MAX, SOUCET, PRUMER nelze urcit.\n");
                exit(0);
        }
        else {
                min = num;
                max = num;
                pocet++;
                soucet += num;
        }

        do {
                printf("Zadej cislo: ");
                scanf("%d", &num);
                if (num) {
                        if (num < min) min = num;
                        if (num > max) max = num;
                        pocet++;
                        soucet += num;
                }
        } while (num);

        putchar('\n');
        printf("MIN = %d\n", min);
        printf("MAX = %d\n", max);
        printf("POCET = %d\n", pocet);
        printf("SOUCET = %d\n", soucet);
        printf("PRUMER = %f\n",(float)soucet / pocet);

        return 0;
}

nebo

#include <stdio.h>
#include <stdlib.h>

int main(void) {
        int num, min, max, pocet = 0, soucet = 0;

        do {
                printf("Zadej cislo: ");
                scanf("%d", &num);
                if (num) {
                        if (!pocet) {
                                min = num;
                                max = num;
                        }
                        else {
                                if (num < min) min = num;
                                if (num > max) max = num;
                        }
                        pocet++;
                        soucet += num;
                }
        } while (num);

        putchar('\n');
        if (!pocet) {
                printf("Nebylo zadano platne cislo.\n");
                printf("MIN, MAX, SOUCET, PRUMER nelze urcit.\n");
                exit(0);
        }
        else {
                printf("MIN = %d\n", min);
                printf("MAX = %d\n", max);
                printf("POCET = %d\n", pocet);
                printf("SOUCET = %d\n", soucet);
                printf("PRUMER = %f\n", (float)soucet / pocet);
        }

        return 0;
}
Nahoru Odpovědět
16.5.2020 17:27
"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:16.5.2020 17:44

No, nekdy je potřeba brat informace doslovne. A taky si precist clanek o nekonecnych hodnotách v cyklu. Pocatecni minimum musí byt vetsi nez to budouci, ta 0 tam není jen tak na okrasu, opet jsem byl vyveden z iluze. Dekuji, chtelo to predelat, vyhazet for, nahradit while a svete div se, jede to. Tady je výsledek.

Sub Main()
        Dim maximum As Integer = -2147483648
        Dim minimum As Integer = 2147483647
        Dim pocet As Integer = 0
        Dim soucet As Integer = 0
        Dim pokracovat As String = "a"
        While pokracovat = "a"
            Console.WriteLine("Zadej cislo:")
            Dim zadane As Integer = Console.ReadLine()
            If zadane <> 0 Then
                pocet += 1
                soucet += zadane
                If zadane > maximum Then
                    maximum = zadane
                End If
                If zadane < minimum Then
                    minimum = zadane
                End If
            End If
            Console.WriteLine("Pokracovat? (ano = a + enter / ne = enter)")
            pokracovat = Console.ReadLine().ToLower().Trim()
        End While
        Console.WriteLine("Nejvyssi cifra: {0}", maximum)
        Console.WriteLine("Nejnizsi cifra: {0}", minimum)
        Console.WriteLine("Prumer: {0}", (soucet / pocet))
        Console.WriteLine("Celkovy soucet: {0}", soucet)
        Console.WriteLine("Celkovy pocet: {0}", pocet)
        Console.ReadKey()
    End Sub
 
Nahoru Odpovědět
16.5.2020 17:44
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:16.5.2020 17:51

V pohode, uz jsem si poradil, i tak, diky za radu, chtelo to proste vice hledat a hlavne to opravdu brat jako hodnoty, které si nastavim. Doslova, coz mi v hlave proste odporuje, ale aspoň se nenudim. :D Ale touha to odnekud opsat mi otevrela cestu k clanku o hledani minima, kdy na pocatku musí clovek zadat +nekonecno. Coz tady uz bylo receno drive, ale jak rikam, aby to doslo, to nekdy proste trva. :D

 
Nahoru Odpovědět
16.5.2020 17:51
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:16.5.2020 17:57

o hledani minima, kdy na pocatku musí clovek zadat +nekonecno

No to právě že ne. To lze tehdy, pracuje-li se i s hodnotou pocet, viz. mé příklady výše. Pokud někde uvádějí, že se má zadat pro minimum maximalní hodnota platná v rozsahu typu a pro maximum minimální hodnota platná v rozsahu typu, tak je to špatně! Nemůže to fungovat pokud na vstupu zadáš hodnotu 0. Ověř si to na svém příkladu, že tomu tak je.

Nahoru Odpovědět
16.5.2020 17:57
"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:16.5.2020 18:04

Nebude to fungovat, protože mam v podmínce, ze pokud zadam nulu, tak ji bude vesele ignorovat, takze nula i kdyby byla 5x zadana, tak stejne při vypisu nebude 0 reprezentovat minimum, ale zkratka bude 0 všude, proste jako bych nic nezadal, 0 v tomhle pripade nepatri do dat.

 
Nahoru Odpovědět
16.5.2020 18:04
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:16.5.2020 18:11

Pokud zadáš pouze 0, tak se Ti vypíši nesmyslné hodnoty pro minimum a maximum. Vypíší se Ti hodnoty minima a maxima zadané při inicializaci proměnných což je špatně. Tyto hodnoty nejsou součástí vstupních dat. Proto se nahodilá inicializace nepoužívá popř. se musí aktualizovat hodnoty při prvním platném vstupu.

Nahoru Odpovědět
16.5.2020 18:11
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
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 12 zpráv z 12.