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.

Člen

Zobrazeno 23 zpráv z 23.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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()
Použij for cyklus uvnitř fór cyklu pro výpis matice 4x5.
No, tak ted jsem ztraceny uplne. To za rovnitko dam 4*5 místo třeba 1 To 20, nebo jak, ted to
nechapu.
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.
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í).
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
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.
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.
Ž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ší..
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.
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?
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í.
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é.
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?
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
No, s Not jsem se už právě setkal. Sakra, to mě nenapadlo, Ty jo, díky.
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.
Zkus místo řádku
GetChar("vbCrLf", i)
dát
Console.WriteLine("\r\n")
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.
Kazdopadne diky, sam bych na to rozhodne neprisel!
Zobrazeno 23 zpráv z 23.