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í.

Diskuze: Problem se zjistovanim celkoveho poctu zaku ve skole a prumerem na jednu tridu

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Ondrej Zadrapa:14.5.2020 12:50

Caute, mam celkem podstatny problém, o to horsi je, ze presne vim, co od programu chci, jenze vzhledem ke svým zkušenostem poradne nevim, kde mam co vypsat, tak bych potreboval pomoci s upravou programu.

Zkusil jsem:

Console.WriteLine("Zadejte pocet trid:")
        Dim pocetTrid As Integer = Console.ReadLine()
        For i As Integer = 1 To pocetTrid
            Console.Write("Zadejte pocet zaku {0}. tridy: ", i)
            Dim pocetZaku As Integer = Console.ReadLine()
        Next
        Console.WriteLine("Celkovy pocet zaku na skole je {0}.", pocetZaku)
        Console.WriteLine("Tridni prumer je {0}.", (pocetZaku / pocetTrid))
        Console.ReadKey()

Chci docílit: Ten kod samotny není dobře, protože když dam konzole dovnitř, tak mi logicky vypisuje prumer a počet zaku na každý cyklus, coz nechci, ale když umistim vypis konzoli pod cyklus, tak mi logicky prestanou platit promenne uvnitř cyklu a tim padem mi to ani Visual Studio nespusti, protože nemam deklarovane promenne, cemuz taky rozumim, jen ted nevim, co s tim. Potreboval bych poradit, jak to upravit, aby to vypsalo soucet všech zaku a prumerny počet zaku ve tride. Včera jste mi poradili skvele, dokonce mi to pomohlo při jinem ukolu, tady jsem se ani tak nezasekl, jen spis vazne netusim, co s tim, vzhledem k tomu, ze jsem uplny zelenac. Dekuji za kazdou dobrou radu

 
Odpovědět
14.5.2020 12:50
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:14.5.2020 13:08

Je to obdobné jako to co jsme řešili včera. Akorát tam přibude vstup uvnitř cyklu, nic víc. Opět si to vyžaduje 2 proměnné. První pro počet žáku ve třídě, druhou celkem žáků. Proměnnou celkem žáků inicializuješ na 0. V cyklu načteš hodnotu počtu žáků n-té třídy a přičteš ji k počtu žáků. Po skončení cyklu tak budeš mít celkový počet žáků ze všech tříd dohromady. Z toho pak určíš průměrný počet žáků na třídu. Hotovo.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
14.5.2020 13:08
"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:14.5.2020 13:41

Super, diky, ted uz to dela, co potrebuji.

 
Nahoru Odpovědět
14.5.2020 13:41
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:14.5.2020 15:00

Mel bych tady ještě takovy problém, mam vypsat 20 minut kurzu koruny vuci euru a tech 20 cyklu mam vypsat do 4 radku po 5. Mam k tomu pouzit Mod. Jenze ja proste nevim jak, nikdy jsem to nedelal, poradil bys mi?

Sub Main()
        Dim random As New Random
        For i As Integer = 1 To 20
            Dim kurs As Integer = random.Next(26, 28)
            Console.Write("{0}. minuta: {1}Kc/Euro ", i, kurs)
        Next
        Console.ReadKey()
 
Nahoru Odpovědět
14.5.2020 15:00
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:14.5.2020 15:03

Použij for cyklus uvnitř fór cyklu pro výpis matice 4x5.

Nahoru Odpovědět
14.5.2020 15:03
"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:14.5.2020 15:06

No, tak ted jsem ztraceny uplne. :D To za rovnitko dam 4*5 místo třeba 1 To 20, nebo jak, ted to nechapu.

 
Nahoru Odpovědět
14.5.2020 15:06
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:14.5.2020 15:29
Sub Main()
        Dim random As New Random
        For i As Integer = 0 To 4
            Dim kurs As Integer = random.Next(26, 28)
            Console.Write("{0}.minuta: {1}Kc/Euro ", i + 1, kurs & "")
        Next
        Console.WriteLine()
        For i As Integer = 5 To 9
            Dim kurs As Integer = random.Next(26, 28)
            Console.Write("{0}.minuta: {1}Kc/Euro ", i + 1, kurs & "")
        Next
        Console.WriteLine()
        For i As Integer = 10 To 14
            Dim kurs As Integer = random.Next(26, 28)
            Console.Write("{0}.minuta: {1}Kc/Euro ", i + 1, kurs & "")
        Next
        Console.WriteLine()
        For i As Integer = 15 To 19
            Dim kurs As Integer = random.Next(26, 28)
            Console.Write("{0}.minuta: {1}Kc/Euro ", i + 1, kurs & "")
        Next
        Console.ReadKey()

Vyresil jsem to prozatím takhle, ale to asi nebude ono, ze? S vnorovanim cyklu nemam moc zkusenosti, max s malou násobilkou, ale taky nic převratného, akorát vim, ze se cyklus uvnitř nasobi cyklem zvenku, tot asi vse.

 
Nahoru Odpovědět
14.5.2020 15:29
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:14.5.2020 15:36

Trochu jsem Tě zmátl. Pokud pracuješ s jednou hodnotou a potřebuješ ji převést do podoby řádků a sloupců, pak je správné použít modulo (celočíselné dělení).

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

Ano, takto jak to máš to nebude ono.. Podívej na následující úryvek kódu.

for (int i = 1; i <= POCET_MINUT; i++) {
        printf("%3d", i);
        if (!(i % POCET_NA_RADKU)) putchar('\n');
}

Kde POCET_MINUT je 20 a POCET_NA_RADKU je 5.
Počet hodnot v řádku

Nahoru Odpovědět
14.5.2020 15:50
"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:14.5.2020 15:53

No jo, jenze kam to mam umistit, to je prave to, ja vůbec nemam tuseni jak s tim pracovat a ve skriptech, které jsem k tomu dostal je akorát, ze For funguje nejak, nic o vnorovani cyklu, videa k tomu jsou z poloviny obsazene vetou "ještě bych se rad vratil k tomu..." a jako nic moc z toho si clovek nevezme a ted dostane takovehle věci, které jsou ještě nazvane Jednoduche cykly FOR + RND. Jednoduche pro člověka co umi, peklo pro zacatecniky.

 
Nahoru Odpovědět
14.5.2020 15:53
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:14.5.2020 15:58

Zde pak máš způsob s vnořeným cyklem, jak jsem prvotně psal.

int n = 1;

for (int i = 1; i <= POCET_RADEK; i++) {
        for (int j = 1; j <= POCET_SLOUPCU; j++) {
                printf("%3d", n);
                n++;
        }
        putchar('\n');
}

Ve skutečnosti by vše bylo o něco komplikovanější, neboť hodnoty kurzu by mohly být uloženy v poli. Avšak smyslem toho je naučit se pracovat s řádky a sloupci.

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

Že spousta profesorů nedokáže vyložit látku tak, aby to bylo na první pohled srozumitelné pro každého, skripta žalostná, s tím bohužel toho moc nenaděláš. Alespoň ne teď. Je to umění umět vysvětlit něco druhému polopaticky, podat význam a užitek. Jak jsem psal, vše přijde. Musíš nabrat zkušenosti, pak nad tím nebudeš přemýšlet a přesto budeš vědět co dělat.

To hlavní je co musíš pochopit co a jak funguje. Když popíšu můj příklad slovy, bud Ti to jasné. Pokud máš vypsat 20 minut kurzu po jedné minutě, tak víš, že bude třeba provést výpis 20 hodnot. A tak řídící proměnná cyklu bude nabývat v rozsahu 1 až 20. Zkrátka 20 opakování. Víš, že máš vypsat 5 hodnot na řádek, to odpovídá přesně 4 celým řádkům. Tedy budeš vypisovat hodnoty a pokaždé se po výpisu zeptáš, zda jsi zapsal každou 5 hodnotu. Pokud ano tak odřádkuješ a pokračuješ ve výpisu. To je celé, není na tom nic složitého. To hlavní je umět si vše představit. S každým příkladem Ti vše bude jasnější..

Nahoru Odpovědět
14.5.2020 16: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:14.5.2020 18:39

No takhle je to sice hezky srozumitelné, jenže mi to moc do hlavy nejde a ve Visual Basicu jsou jiné povely. A vůbec nevím, jak postupovat.

 
Nahoru Odpovědět
14.5.2020 18:39
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:14.5.2020 18:44
Sub Main()
        Dim random As New Random
        For i As Integer = 0 To 19
            Dim kurs As Integer = random.Next(26, 28)
            If (i Mod 5 = 0) Then
                Console.Write("{0}.minuta: {1}Kc/Euro " & vbCrLf, i + 1, kurs)
            End If
        Next
        Console.ReadKey()
    End Sub

Jdu alespoň spravnym smerem, nebo sama voda?

 
Nahoru Odpovědět
14.5.2020 18:44
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:14.5.2020 19:09

Směr je to správný, znovu se podívej na ukázku kódu kterou jsem Ti poslal:

for (int i = 1; i <= POCET_MINUT; i++) {
        printf("%3d", i);
        if (!(i % POCET_NA_RADKU)) putchar('\n');
}

Syntax Visual Basicu je sice jiná, ale nepoužívám žádné extra věci které by neměl. For cyklus, výpis číselné hodnoty na obrazovku, operace modulo, odřádkování.. To vše VB má..

Nastav rozsah od 1 do 20, nikoli od 0 do 19 jinak Ti to bude dělat neplechu. Před odřádkováním musíš vypsat 5 čísel a ty pětice jsou nezávislé na výsledku podmínky řídícího příkazu if. Výsledkem řídícího příkazu if je pouze odřádkování. Sestav si nejprve program kde se Ti vypíše 20 hodnot vedle sebe oddělené mezerou. Až Ti to bude fungovat, implementuj odřádkování.

Nahoru Odpovědět
14.5.2020 19:09
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:14.5.2020 19:13

Pokud chceš pracovat s náhodnými čísly tak jak to máš ve svém příkladu, pa by to vypadalo takto:

for (int i = 1; i <= POCET_MINUT; i++) {
        kurz = rand_range(MIN, MAX);
        printf("%d ", kurz);
        if (!(i % POCET_NA_RADKU)) putchar('\n');
}

20 iterací, vygenerování kurzu, výpis s mezerou, odřádkování při konkrétní hodnotě řídící proměnné.

Editováno 14.5.2020 19:14
Nahoru Odpovědět
14.5.2020 19: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:14.5.2020 19:25

Právě ten syntax Té podmínky mi dělá vrásky, znak pro odřádkování jsem asi našel, ale vypsat tu podmínku bude oříšek, vykřičník většinou znamená, že se něco nerovná, mám pravdu?

 
Nahoru Odpovědět
14.5.2020 19:25
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:14.5.2020 19:38

Nehledej v tom složitosti. Ano, vykřičník v C znamená logickou negaci. Ve VB označení pro negaci ovšem může být jiné. nejspíš to bude Not. Funguje to tak že modulo vrací zbytek po celočíselném dělení.

i Mod 5

Pokud i bude 5, což značí 5 vypsaných čísel (to co potřebujeme pro odřádkování), tak výsledkem výše uvedeného výrazu bude 0. Řídící příkaz if vyhodnocuje, zda výraz v závorce je nenulový (pak provede příkaz na který se odkazuje) nebo nulový (příkazová část se přeskočí). Jelikož chceme, aby došlo k odřádkování, tedy provedla se příkazová část, tak musíme výsledek operace modulo znegovat.

If (Not(i Mod 5)) Then
        // zde odřádkování
End If
Editováno 14.5.2020 19:39
Nahoru Odpovědět
14.5.2020 19:38
"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:14.5.2020 19:46

No, s Not jsem se už právě setkal. Sakra, to mě nenapadlo, Ty jo, díky.

 
Nahoru Odpovědět
14.5.2020 19:46
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:14.5.2020 21:15
Sub Main()
        Dim random As New Random
        For i As Integer = 1 To 20
            Dim kurs As Integer = random.Next(26, 28)
            Console.WriteLine("{0}.minuta: {1}Kc/Euro ", i, kurs)
            If (Not (i Mod 5)) Then
                GetChar("vbCrLf", i)
            End If
        Next
        Console.ReadKey()

No, tohle je pro dnesek zrejme moje Waterloo, protože jsem jednak uplne ztraceny, vůbec nevim, co delam, jestli tam vůbec patri to, co se tam snazim napsat, ponevdz systém mi sdeluje, ze argument Index musí byt mensi, nebo roven argumentu string.

 
Nahoru Odpovědět
14.5.2020 21:15
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:14.5.2020 21:33

Zkus místo řádku

GetChar("vbCrLf", i)

dát

Console.WriteLine("\r\n")
Nahoru Odpovědět
14.5.2020 21:33
"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:14.5.2020 21:46
Sub Main()
        Dim random As New Random
        For i As Integer = 1 To 20
            Dim kurs As Integer = random.Next(26, 28)
            Console.Write("{0}.minuta: {1}Kc/Euro ", i, kurs)
            If i Mod 5 = 0 Then
                Console.Write(vbCrLf)
            End If
        Next
        Console.ReadKey()
    End Sub

Nedalo mi to, tak jsem zkousel, zkousel a svete div se, tahle verze dela presne to, co chci. Diky, ted muzu konecne ten komp vypnout a trapit se az zítra. :D

 
Nahoru Odpovědět
14.5.2020 21:46
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:14.5.2020 21:48

Kazdopadne diky, sam bych na to rozhodne neprisel!

 
Nahoru Odpovědět
14.5.2020 21:48
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 23 zpráv z 23.