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: Zjistovani opakovani cisla z prvniho cyklu v dalsich cyklech

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

Aktivity
Avatar
Ondrej Zadrapa:20.5.2020 13:06

Uprimne, nevim, co s tim mam delat, zadani zni: Zadejte několik cisel, ukoncete nulou. Potom zadate nektere z předtím zadanych cisel. Program vypise, kolikrat toto číslo předtím padlo.

Zkusil jsem:

Sub Main()
        Dim cislo As Integer = 0
        Dim pocet As Integer = 0
        Dim pokracovat As String = "a"
        While pokracovat = "a"
            Console.WriteLine("Zadej pocet cisel:")
            Dim pocetCisel As Integer = Integer.Parse(Console.ReadLine())
            Dim poleCisel() As Integer = New Integer(pocetCisel - 1) {}
            For i As Integer = 0 To pocetCisel - 1
                Console.Write("Zadejte {0}. cislo: ", i + 1)
                poleCisel(i) = Integer.Parse(Console.ReadLine())
            Next
            pocet = 0
            For i As Integer = 0 To poleCisel.Length - 1
                If cislo = 3 Then
                    pocet += 1
                End If
            Next
            Console.WriteLine("Pokracovat? (ano = a + enter / ne = enter)")
            pokracovat = Console.ReadLine()
        End While
        Console.WriteLine("Zadane cislo {0} padlo celkem {1}x", cislo, pocet)
        Console.ReadKey()
    End Sub

Ve vystupu pise 0 v cisle i poctu, coz chapu, vim, ze to nemam spravne, ale zaroven ani nemam nejmensi poneti, jestli vůbec takhle muzu dojit k vysledku, který ocekavam, pochopil jsem, ze bude zapotřebí alespoň 2 cyklu, jeden pro zadani několika cisel a druhy pro zadani jiné sady, nebo jenom jednoho, ja nevim, moc tomu ukolu nerozumim, v minulem ukolu jsem aplikoval počet = počet + 1 na zjisteni opakovani hodnoty v poli, tady to neumim spravne vyuzit, pokud to tam vůbec patri. Dále nevim, jestli v podmínce nemá byt uplne něco jiného, nebo konkretni cifra.

Chci docílit: Ani vlastne nevim, jak to spravne naformulovat, moc ten úkol nechapu, tak proste pokud nekomu dava smysl zadani, tak by mi to pro začátek mohlo stacit, ted asi vypadam jako hlupak, ale s poli pracuji od včera a je to opravdu peklo.

 
Odpovědět
20.5.2020 13:06
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:20.5.2020 13:27

Vždyť to zadání je jasné. V cyklu budeš načítat čísla a ukládat si je do pole. Pokud bude zadána 0 tak se načítací cyklus ukončí. Poté necháš uživatele načíst číslo a zjistíš kolikrát je toto číslo v poli. Výsledek vypíšeš.

Pozn: Nikde se nepíše o tom, že máš nechat uživatele zadat počet čísel které se mají načíst.

Nahoru Odpovědět
20.5.2020 13:27
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na Ondrej Zadrapa
Matúš Olejník:20.5.2020 14:04

Chvíľu s tým treba aj bojovať a googliť než že budeš na každý jeden príklad vytvárať príspevok.
Asi môj prvý program vo VB snáď bude fungovať :D

Imports System.Collections.Generic

Module VBModule

    Sub Main()
        Dim inputNumbersCountMap As New Dictionary(Of Integer, Integer)
        Dim inputNumber as Integer
        Dim numberToCheck as Integer

        While 1 = 1
            Console.WriteLine("Zadaj cislo")
            inputNumber = Integer.Parse(Console.ReadLine())

            If inputNumber = 0 Then
                Exit While
            End If

            If Not(inputNumbersCountMap.ContainsKey(inputNumber)) Then
                inputNumbersCountMap(inputNumber) = 1
            Else
                inputNumbersCountMap(inputNumber) =  inputNumbersCountMap(inputNumber) + 1
            End If

        End While

        Console.WriteLine("Zadaj cislo ktoreho pocet chces zistit")
        numberToCheck = Integer.Parse(Console.ReadLine())

        If Not(inputNumbersCountMap.ContainsKey(numberToCheck)) Then
            Console.WriteLine("Zadane cislo nepadlo")
        Else
            Console.WriteLine("Zadane cislo padlo celkom {0} krat", inputNumbersCountMap(numberToCheck))
        End If

        Console.ReadKey()
    End Sub
End Module
Nahoru Odpovědět
20.5.2020 14:04
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Ondrej Zadrapa:20.5.2020 14:22

Dik za námahu, ale vetvenim bych to vytvoril za moment sam a bez zbytečného opravovani, ja potrebuju zjistit, co všechno umi pole, potažmo jak s nimi vůbec uspesne pracovat, je to peklo. Ale to byl i cyklus For

 
Nahoru Odpovědět
20.5.2020 14:22
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:20.5.2020 14:28

Divej se, včera to trvalo az do vecera mi zjistit, ze celou dobu jsem mel problém s tim, ze dve hodnoty nepatri do vystupu jedne konzole, az když jsem pro minimum a poradi udelal dva vystupy konzole zvlast, tak to zacalo fungovat a prumer jsem ani nemusel slozite vypisovat, stacilo pole.Average() … proto mi ted tenhle úkol není prilis jasny, zase je to trochu něco jiného, alespoň mi to tak prijde, zatím mi program neuklada data, nevim, co s tim, když si najedu na stranky Microsoftu, tak tam je halda informaci, strasna spousta, ale moje konkretni trable tam nejsou resene, cili reseni je uplne primitivni, nebo jsem se s nim musel setkat, jenze nevim, kde presne, jestli mam pridat, ubrat, upravit nejaky cyklus, jeho hodnoty, podmínky, pridat promennou, ubrat, upravit, atd... :D

 
Nahoru Odpovědět
20.5.2020 14:28
Avatar
Odpovídá na Ondrej Zadrapa
Matúš Olejník:20.5.2020 14:41

Akým vetvením? :D

Nahoru Odpovědět
20.5.2020 14:41
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:20.5.2020 14:42
Sub Main()
        Dim cislo As Integer
        Dim pocet As Integer = 0
        Dim pokracovat As String = "a"
        While pokracovat = "a"
            Console.WriteLine("Zadej pocet cisel:")
            Dim pocetCisel As Integer = Integer.Parse(Console.ReadLine())
            Dim poleCisel() As Integer = New Integer(pocetCisel - 1) {}
            For i As Integer = 0 To pocetCisel - 1
                Console.Write("Zadejte {0}. cislo: ", i + 1)
                cislo = Integer.Parse(Console.ReadLine())
                poleCisel(i) = cislo
            Next
            cislo = 1
            For i As Integer = 0 To poleCisel.Length - 1
                If cislo = poleCisel(i) Then
                    pocet = pocet + 1
                End If
            Next
            Console.WriteLine("Pokracovat? (ano = a + enter / ne = enter)")
            pokracovat = Console.ReadLine()
        End While
        Console.WriteLine("Zadane cislo {0} padlo celkem {1}x", cislo, pocet)
        Console.ReadKey()
    End Sub

Takhle uz to dela, co potrebuju, ale nemyslim si, ze zrovna takhle by to zadavatel chtěl, abych to resil, je tu ještě nejaka jina moznost, jak to udelat, nebo to jinak nejde a zhruba takhle to bylo i myslene s tim vystupem, hodil by se mi subjektivni názor, ja tohle delam poprvé a ze zvyku, ze všechny inicializace (snad to rikam spravne, kdyztak pardon) se delaji az v konzoli, proto mi to zadani nedava smysl a furt se na něco ptam, nebo furt, kdybych se ptal porad, tak mam vlastní oddil na strankach.

 
Nahoru Odpovědět
20.5.2020 14:42
Avatar
Odpovídá na Matúš Olejník
Ondrej Zadrapa:20.5.2020 14:47

Omluv to, jestli se vyjadřuju nespravne, nebo dokonce spatne, bohužel, je to moc neznamych věci, v kterých uplne plavu, cili pokud si pletu nazvoslovi, je mi to lito, ale takhle to prozatím zkousit chapat ja. A o podmínky pomoci vetveni je prece Else If, ne? Rozvetvis podmínky do několika vetvi (If, elseIf… ...else), kdy se jedna z nich vykona pote, co zadana hodnota je True nebo False, tak tomu zatím rozumim/nerozumim, rikam, plavu v tom, kdybych v tom neplaval, neptam se.

 
Nahoru Odpovědět
20.5.2020 14:47
Avatar
Odpovídá na Ondrej Zadrapa
Matúš Olejník:20.5.2020 15:02

Hej dobre chápeš ale napísal si

ale vetvenim bych to vytvoril za moment sam a bez zbytečného opravovani

keď som ja if else použil len na či do mapy pridať začiatočný počet alebo zväčšiť aktuálny o 1.
Z toho čo si ty napísal to chápem tak že by si chcel vetviť štyri miliardy pre každú možnosť z Integeru? :D

A potom ten kód čo tu zatiaľ máš tak stále sa používateľa na začiatku pýtaš koľko chce zadať čísel, ale pri tom v zadaní, ako už DarkCoder spomenul, máš napísané že načítavaš čísla až dokým sa nezadá 0 takže nevieš dopredu koľko čísel bude zadaných.

Editováno 20.5.2020 15:03
Nahoru Odpovědět
20.5.2020 15:02
/* I am not sure why this works but it fixes the problem */
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:20.5.2020 15:20

Uprimne, nevim, co s tim mam delat, zadani zni: Zadejte několik cisel, ukoncete nulou. Potom zadate nektere z předtím zadanych cisel. Program vypise, kolikrat toto číslo předtím padlo.

Toto byl původní dotaz a Matúš Olejník reagoval na něj správně. Kromě zajímavého způsobu řešení Ti i ukázal, jak ukončit načítací smyčku. Takto je to ze zadání patrné a toto se očekává. Ne že uživatel zadá hodnotu následovanou vstupními daty

ja potrebuju zjistit, co všechno umi pole, potažmo jak s nimi vůbec uspesne pracovat

To je ale úplně jiný dotaz, který je spíše teoretický nežli konkrétní. K tomu je třeba zasednout ke knihám a dalším zdrojům, kde je toto vysvětleno. To je první věc která by měla každého napadnout. Bez znalostí jazyka a technik lze těžko vyřešit reálnou úlohu. Pouze hledat někde hotová řešení není ideální, občas se s tím je třeba poprat. Vždyť přijít na to sám je mnohem hodnotnější než to někde nebo od někoho dostat.

proto mi ted tenhle úkol není prilis jasny, zase je to trochu něco jiného, alespoň mi to tak prijde

Vidíš a já už jen po přečtení zadání jsem v hlavě viděl, jak přesně ten kód bude vypadat. A to proto, že jsem se díky samostatnosti naučil představivosti a schopnosti nalézt řešení.

Nahoru Odpovědět
20.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:20.5.2020 15:34

Dobra, zvrhava se to v debatu, kdo co a komu, ja si s tim radsi poradim sam, ale i tak diky.

 
Nahoru Odpovědět
20.5.2020 15:34
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:20.5.2020 15:39

A ted jsem si precetl, ze všechny ulohy cyklu a poli mam vypracovat se statickym polem o 100 prvcích, kazdopadne s tou nulou to konecne dava smysl. :D

 
Nahoru Odpovědět
20.5.2020 15:39
Avatar
Odpovídá na Ondrej Zadrapa
Matúš Olejník:20.5.2020 15:51

Ja som si dával pauzu od školy tak som niečo napísal aj bez použitia slovníku :D
A malo by fungovať pre hocijaký počet :D

Module VBModule

    Sub Main()
        Dim writtenNumbers As Integer() = {}
        Dim countsOfNumbers As Integer() = {}
        Dim numberFound As Boolean = false
        Dim indexOfFoundNumber As Integer = -1
        Dim inputNumber As Integer
        Dim numberToCheck As Integer

        While 1 = 1
            Console.WriteLine("Zadaj cislo")
            inputNumber = Integer.Parse(Console.ReadLine())

            If inputNumber = 0 Then
                Exit While
            End If

            For i as Integer = 0 To writtenNumbers.GetUpperBound(0)
                If inputNumber = writtenNumbers(i) Then
                    countsOfNumbers(i) = countsOfNumbers(i) + 1
                    numberFound = true
                    Exit For
                End If
            Next

            if Not(numberFound) Then
                ReDim Preserve writtenNumbers(writtenNumbers.GetUpperBound(0) + 1)
                ReDim Preserve countsOfNumbers(countsOfNumbers.GetUpperBound(0) + 1)

                writtenNumbers(writtenNumbers.GetUpperBound(0)) = inputNumber
                countsOfNumbers(countsOfNumbers.GetUpperBound(0)) = 1
            End If

            numberFound = false

        End While

        Console.WriteLine("Zadaj cislo ktoreho pocet chces zistit")
        numberToCheck = Integer.Parse(Console.ReadLine())

        For i as Integer = 0 To writtenNumbers.GetUpperBound(0)
            If numberToCheck = writtenNumbers(i) Then
                indexOfFoundNumber = i
                Exit For
            End If
        Next

        If indexOfFoundNumber <> -1 Then
            Console.WriteLine("Zadane cislo padlo celkom {0} krat", countsOfNumbers(indexOfFoundNumber))
        Else
            Console.WriteLine("Zadane cislo si nezadal")
        End If

        Console.ReadKey()
    End Sub
End Module
Nahoru Odpovědět
20.5.2020 15:51
/* I am not sure why this works but it fixes the problem */
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:20.5.2020 15:52

Zde se můžeš inspirovat. Způsob je trochu jiný než uvedl Matúš Olejník
Je zde uveden způsob jaký je od tebe nejspíš očekáván (procházení pole pomocí cyklu).
Opět je třeba dívat se na program tak, aby se pochopila jeho činnost.

#include <stdio.h>

#define SIZE 100

int main(void) {
        int cislo, pocet = 0, vyskyt = 0;
        int pole[SIZE];

        // nacitani cisel do pole s osetrenim rozsahu
        do {
                printf("Zadej cislo: ");
                scanf("%d", &cislo);
                if (!cislo) break;
                pole[pocet] = cislo;
                pocet++;
        } while (cislo && (pocet < SIZE));

        // Vyzva na cislo jehoz pocty opakovani zjistujeme
        printf("\nZadej cislo: ");
        scanf("%d", &cislo);

        // Zjisteni poctu opakovani zadaneho cisla
        for (int i = 0; i < pocet; i++) {
                if (pole[i] == cislo) vyskyt++;
        }

        // Vypis poctu opakovani
        printf("Cislo %d se v poli vyskytuje %dx\n", cislo, vyskyt);

        return 0;
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
20.5.2020 15:52
"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:20.5.2020 16:09

No budu mit další hezky vecer. :D

 
Nahoru Odpovědět
20.5.2020 16:09
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:20.5.2020 19:36

Az me to normalne stve, ale chte, nechte, musel jsem to v podstate sproste obslehnout, jinak sam bych na to urcite neprisel. Dik

 
Nahoru Odpovědět
20.5.2020 19:36
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:21.5.2020 14:57
Dim random As New Random
        Dim vsechnyHody As New ArrayList()
        Dim pocetHodu As Integer = 0
        Dim hod As Integer
        Do
            Threading.Thread.Sleep(500)
            hod = random.Next(1, 7)
            If Not vsechnyHody.Contains(hod) Then
                vsechnyHody.Add(hod)
                pocetHodu += 1
            End If
            Console.WriteLine(hod)
        Loop Until pocetHodu = 6
        Console.ReadKey()
    End Sub

Jak mam dosáhnout toho, aby to nevygenerovalo dvakrát stejne číslo a jde to udelat i bez ArrayListu?

Editováno 21.5.2020 14:58
 
Nahoru Odpovědět
21.5.2020 14:57
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:21.5.2020 15:16
Sub Main()
        Dim random As New Random
        Dim vsechnyHody(100)
        Dim pocetHodu As Integer = 0
        Dim hod As Integer
        Do
            hod = random.Next(1, 7)
            Console.WriteLine(hod)
            If Not vsechnyHody.Contains(hod) Then
                vsechnyHody(hod) = hod
                pocetHodu += 1
            End If
        Loop Until pocetHodu = 6
        Console.ReadKey()

Tak, jde to, ale neskonci u 6 hodu, ale pokracuje az dokud nepadne 6, cemuz moc nerozumim, mam pocit, ze jsem zadal hodnoty spravne, jak teda docilim toho, aby se mi cisla neopakovala?

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

Generování náhodného čísla z rozsahu se dosáhne tak, že se pole o velikosti takové, aby se do něj vešla všechny čísla právě jednou, naplní hodnotami, kde hodnota odpovídá danému indexu. Po vygenerování náhodného čísla se poslední prvek pole uloží na místo, jehož index odpovídá hodnotě posledního čísla. Velikost pole se tak sníží o jedna a následné generovaní náhodného číslo je zprava o jedna menší nežli předchozí generování náhodného čísla.

Nahoru Odpovědět
21.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:21.5.2020 15:54

No jo, krásná definice, ale já jsem myslel, že když právě logicky zneguji v podmínce, ale neděje se tak, nebo to alespoň nedělám dobře, protože mi vygeneruje třeba 10 čísel v rozpětí 1-7 a až když dojde na 6, zastaví se, to, že úplně ignoruje pocetHodu, je další věc.

 
Nahoru Odpovědět
21.5.2020 15:54
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:21.5.2020 16:20

Vypíše Ti to větší počet čísel, protože výpis hodu vypisuješ mimo podmínku jejíž příkazy se ne vždy provedou. Pokud to chceš dělat takto, což je podstatně méně efektivnější varianta, jelikož se program při troše smůly může zacyklit, tak je třeba.

  • inicializovat pole o velikosti R - L + 1 (R - hodnota pravé meze, L - hodnota levé meze) hodnotou 0.
  • generovat náhodné číslo a zjistit, zda-li na indexu jehož hodnota odpovídá generovanému číslu je 0 či nikoli. Pokud je tam 0, pak to číslo ještě nebylo generováno a číslo vypíšu a nastavím hodnotu 1 na tomto indexu a zvýším hodnotu proměnné počethodů o 1. Pokud tam bude 1, pak číslo už generováno bylo, nic se neprovede a přejde se na další iteraci cyklu.

Takto zajistíš, že se Ti vypíše 6 náhodných čísel, která se neopakují. Ale jak už jsem uvedl, tento způsob je neefektivní z hlediska času, který bude delší než se dojde k výsledku. Doba může být stejná, ale také se výsledku nemusíš dočkat.

Nahoru Odpovědět
21.5.2020 16: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:21.5.2020 16:35

Tak teda, jak z toho ven, co bude pro mě, jakožto začátečníka lepší si osvojit, zatím totiž čerpám z toho, co jsem našel na netu + to, co jsem se tady přímo dočetl od Tebe, je to dost častý problém, ale všechno je řešeno až příliš složitě.

 
Nahoru Odpovědět
21.5.2020 16:35
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:21.5.2020 16:51

Mnoho programátoru o podobné technice neví.

Zde je ta méně efektivní varianta. Úryvek kódu generuje náhodná čísla v rozsahu 0-9 včetně. Vypíše se prvních 6 unikátních čísel z tohoto rozsahu. Dále se vypíše, kolik cyklů bylo třeba na vygenerování 6 unikátních čísel. Není zde ošetření na situaci, kdy se již vygenerovaná čísla neustále opakují (počet unikátních čísel menší než 6).

#define SIZE 10
#define POCET_HODU 6

int main(void) {
        int hod, cyklu = 0, pocet = 0, pole[SIZE];

        srand((unsigned int)(time(NULL)));

        for (int i = 0; i < SIZE; i++) pole[i] = 0;

        do {
                hod = rand() % SIZE;
                if (!pole[hod]) {
                        printf("%d\n", hod);
                        pole[hod] = 1;
                        pocet++;
                }
                cyklu++;
        } while (pocet != POCET_HODU);

        printf("\nPocet cyklu pro vygenerovani %d unikatnich hodu: %d\n", POCET_HODU, cyklu);

        return 0;
}
Editováno 21.5.2020 16:51
Nahoru Odpovědět
21.5.2020 16:51
"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:21.5.2020 16:53

A taková hloupá otázka, lze to, se změněným rozpětím aplikovat i třeba na sportku, nebo ten program že včerejška?

 
Nahoru Odpovědět
21.5.2020 16:53
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:22.5.2020 16:22
Sub Main()
        Dim random As New Random
        Dim soucet As Integer = 0
        Dim pocet As Integer = 0
        Console.WriteLine("Zadejte pocet cisel:")
        Dim pocetCisel As Integer = Console.ReadLine()
        Dim poleCisel() As Integer = New Integer(pocetCisel - 1) {}
        For i As Integer = 0 To pocetCisel - 1
            Console.Write("Zadej cislo: ")
            poleCisel(i) = Integer.Parse(Console.ReadLine())
            pocet += 1
            soucet += poleCisel(i)
        Next
        Dim minimum As Integer = poleCisel(0)
        For i As Integer = 0 To poleCisel.Length - 1
            If poleCisel(i) < minimum Then
                minimum = poleCisel(i)
            End If
        Next
        Dim maximum As Integer = poleCisel(0)
        For i As Integer = 0 To poleCisel.Length - 1
            If poleCisel(i) > maximum Then
                maximum = poleCisel(i)
            End If
        Next
        Dim druhaMocnina As Integer = poleCisel(0)
        For i As Integer = 0 To poleCisel.Length - 1
            druhaMocnina = poleCisel(i) * poleCisel(i)
        Next
        Console.WriteLine("Pocet: {0}", pocet)
        Console.WriteLine("Soucet: {0}", soucet)
        Console.WriteLine("Maximum: {0}", maximum)
        Console.WriteLine("Minimum: {0}", minimum)
        Console.WriteLine("Prumer: {0}", soucet / pocet)
        For Each vypis In poleCisel
            Console.WriteLine(vypis * vypis & " ")
        Next
        Console.WriteLine("Mam zobrazit soucet druhych mocnin? (ano = a + enter / ne = enter)")
        Dim pokracovat As String = Console.ReadLine().ToLower().Trim()
        If pokracovat = "a" Then
            Console.WriteLine("Soucet druhych mocnin: {0}")
            Console.WriteLine("Stiskni libovolnou klavesu k ukonceni aplikace.")
        Else
            Console.WriteLine("Stiskni libovolnou klavesu k ukonceni aplikace.")
        End If
        Console.ReadKey()
    End Sub

Muzu se Te zeptat, jakym zpusobem se daji prevest zadana cisla v poli do druhých mocnin, ty mocniny sečíst a výsledek vypsat v konzoli, nejak na to nemuzu prijit, nejde třeba nejak ten vypis, co mam v kodu, nejak sečíst, asi ne, ze?

 
Nahoru Odpovědět
22.5.2020 16:22
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:22.5.2020 16:38

Jednoduše. Vytáhneš hodnotu z pole, přepíšeš ji na její druhou mocninu a aktualizuješ součet.

// Soucet mocnic cisel 0 až 9

#include <stdio.h>

#define SIZE 10

int main(void) {
        int soucet = 0, pole[SIZE];

        for (int i = 0; i < SIZE; i++) pole[i] = i;

        for (int i = 0; i < SIZE; i++) {
                pole[i] *= pole[i];
                soucet += pole[i];
        }

        printf("\nSoucet mocnic cisel 0-9: %d\n", soucet);

        return 0;
}
Nahoru Odpovědět
22.5.2020 16: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:22.5.2020 20:32
Sub Main()
        Dim nahodnyShluk As String
        Dim random As New Random
        Dim pocet As Integer
        Dim polePismen(100) As String
        Dim pocty(4) As Integer
        Do
            For i As Integer = 0 To polePismen(100)
                Console.Write("Zadej pismeno: ")
                Dim pismeno As String = Convert.ToString(Console.ReadLine())
                polePismen(pismeno.ToString) = pismeno.ToString
                pocet += 1
            Next
        Loop Until pocet = 5
        For i As Integer = 0 To pocty(4)
            nahodnyShluk = random.Next(polePismen.Length)
            If polePismen(i) = nahodnyShluk Then
                Console.WriteLine(nahodnyShluk)
            End If
        Next
        Console.ReadKey()

Prosim Te, muzu Te poprosit o další radu? Ted mi vlastne doslo, ze jsem poradne, nebo spis vůbec nepracoval se zadavanim pismen, které bych chtěl pouzit v generatoru nahodnych shluku slov a nedari se mi program presvedcit, ze to, co chci zadat ma byt String, pokazde mi to vyplivne, ze prevod retezce, třeba pismeno s není při prevodu na Integer platny. Co tam delam spatne? Predem diky.

 
Nahoru Odpovědět
22.5.2020 20:32
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:22.5.2020 21:07

Neznám VB, na to se musíš podívat do nějaké příručky nebo si projít nějaké tutoriály. Každopádně je rozdíl zda chceš pracovat se znaky nebo z řetězci. VB má odlišný datový typ pro znak (Char) a pro řetězec (String). Měl bys postupovat systematicky a naučit se nejprve pracovat se znaky a až poté z řetězci. Naučit se, jak definovat znakovou proměnnou, jak ji inicializovat, jak ji přiřadit hodnotu, jak si vypsat, apod.

Ukázka odlišnosti datových typů

Dim myString As String = "ABCDE"
Dim myChar As Char
// znak 'D' se ulozi do myChar
myChar = myString.Chars(3)

Dále je třeba znát kde se jaký typ očekává a podle toho použít správný tvar výrazu.

Už třeba následující část kódu mi přijde podezřelá

For i As Integer = 0 To polePismen(100)
Nahoru Odpovědět
22.5.2020 21:07
"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:23.5.2020 21:17
Sub Main()
        Dim random As New Random
        Dim znaky() As String = {}
        Console.WriteLine("Zadejte delku slova:")
        Dim delkaSlova As Integer = Console.ReadLine()
        For i As Integer = 0 To delkaSlova - 1
            Dim nahodneSlovo = random.Next(znaky.Length - 1)
            Dim slovo As String = znaky(nahodneSlovo)
            Console.WriteLine(slovo)
        Next
        Console.ReadKey()

Cau, koukl by ses mi prosim Te na to, jestli by jsi mi s tim dokazal pomoci, ja uz jsem vazne v koncích...

 
Nahoru Odpovědět
23.5.2020 21:17
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:23.5.2020 22:39

Těžko se radí pokud nenapíšeš co má program dělat. Pokud se má generovat náhodné slovo zadané délky, tak si nejprve deklaruj pole nějaké délky. Zadej hodnotu, ověř, zda pole bude pro slovo dostatečně velké. Pro každý index pole generuj číslo v rozsahu ASCII znaků, které mohou být součástí slova. Znak odpovídající dané ASCII hodnotě ulož do pole. Vypis pole.

Nahoru Odpovědět
23.5.2020 22:39
"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:23.5.2020 23:04

Jo, promiň, zapomněl jsem dodat, že mám z písmen vygenerovat náhodný shluk, prostě aby si to z těch písmenek složilo slovo o třeba 5 znacích. Jenže mě napadlo, že tam někam patří to Asc nebo Chr, ale kam, to nevím. Pak to pole znaky má zůstat prázdné, nebo do něj mám vepsat všechny písmena abecedy jako třeba "znaky() as String = {"abcdefghijklmnop­..."}, nebo to nechat prázdné a do "random.Next()" dát místo znaky.Lenght něco jako Asc(65-100), já v tom mám docela slušný zmatek.

 
Nahoru Odpovědět
23.5.2020 23:04
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:23.5.2020 23:20

Jenže mě napadlo, že tam někam patří to Asc nebo Chr, ale kam, to nevím.

Pro každý index pole generuj číslo v rozsahu ASCII znaků, které mohou být součástí slova. Znak odpovídající dané ASCII hodnotě ulož do pole.

Buď si pole znaky naplň znaky, které mohou být součástí vygenerovaného slova nebo ho vůbec nezadávej. Pokud použiješ pole znaky tak prováděj náhodné číslo v rozsahu jeho délka - 1. Pokud ho nezadáš tak v cyklu si vygeneruj číslo v rozsahu 65 až 122 bez hodnot 91 až 96. Zde použiješ funkcí na převod z čísla na znak abys tento znak následně uložil do pole.

Nahoru Odpovědět
23.5.2020 23: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:24.5.2020 9:21

Těžce v tom tápu, prostě to furt nechápu.

 
Nahoru Odpovědět
24.5.2020 9:21
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:24.5.2020 10:41
Sub Main()
        Dim rnd As New Random
        Dim pole(10) As String
        For i As Integer = 0 To pole.Length - 1
            pole(i) = ChrW(rnd.Next(65, 90))
            Console.Write(pole(i))
        Next
        Console.ReadKey()

Tak jo, nakonec reseni prinesl Microsoft.

 
Nahoru Odpovědět
24.5.2020 10:41
Avatar
Odpovídá na DarkCoder
Ondrej Zadrapa:24.5.2020 15:08
Sub Main()
        Dim slovo As String
        Console.Write("Zadejte pocet slov: ")
        Dim pocetSlov As Integer = Console.ReadLine()
        Dim poleSlov As String() = New String(pocetSlov) {}
        For i As Integer = 0 To pocetSlov - 1
            Console.Write("Zadejte {0}. slovo: ", i + 1)
            poleSlov(i) = Console.ReadLine()
        Next
        Console.Write("Zadejte slovo: ")
        slovo = Console.ReadLine()
        Dim poradi As Integer = 0
        For i As Integer = 0 To poleSlov.Length - 1
            If poleSlov(i) = slovo Then
                poradi = i
            End If
        Next
        For Each suda In poleSlov
            If suda Mod 2 = 0 Then
                Console.WriteLine("{0}", suda & " ")
            End If
        Next
        Console.WriteLine("Zadane slovo bylo {0}. v poradi.", poradi + 1)
        Array.Reverse(poleSlov)
        For Each poradiSlov In poleSlov
            Console.WriteLine(poradiSlov & " ")
        Next
        Console.ReadKey()
    End Sub

Mohl bys mi prosim Te poradit se zapisem hodnot na sudem indexu, potažmo lichem, s písemnými hodnotami se to asi dela jinak nez s ciselnymi, porad mi to vystupu pise, ze hodnota suda = Nothing, cili je tam asi navíc, nebo zbytecne, ale nevim, co místo ni, bud mi pak blbne prevod, no pokazde něco, ja sam tem chybam ani nerozumim, vidim v nich akorát to, ze micham hrusky s jablky, ale když se podivam na sit, tak všichni prevadeji cisla v poli na sude indexy, na liche všichni serou a o písemných hodnotách nic ani na strankach Microsoftu.

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

Sudost popřípadě lichost je dána výsledkem operace modulo. Zde výsledkem operace modulo nad daným indexem. To je jeden způsob. Druhů způsob je procházení pouze sudých indexů a nad nimi následné provádět operaci.

Zde je příklad kde je deklarováno pole celých čísel o velikosti 10. Toto pole je naplněno hodnotami odpovídající danému indexu, tedy hodnotami 0-9. Následně jsou ukázány oba způsoby, jak vypsat hodnoty pouze na sudých indexech.

#include <stdio.h>

#define SIZE 10

int main(void) {
        int pole[SIZE];

        for (int i = 0; i < SIZE; i++) pole[i] = i;

        // 1. zpusob
        for (int i = 0; i < SIZE; i++) {
                if(!(i % 2)) printf("%d ", pole[i]);
        }

        putchar('\n');

        // 2. zpusob
        for (int i = 0; i < SIZE; i+=2) {
                printf("%d ", pole[i]);
        }

        return 0;
}
Nahoru Odpovědět
24.5.2020 15:40
"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:24.5.2020 15:46

Právě s celými čísly si umím poradit, tam i Mod 2 = 0 stačí k výpisu čísel na sudých indexech. Ale když máš v poli slovo, tak ten výpis prostě nefunguje, nebo to dělám špatně

 
Nahoru Odpovědět
24.5.2020 15:46
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Ondrej Zadrapa
DarkCoder:24.5.2020 16:19

Výpis Ti nefunguje proto, protože v následujícím úryvku kódu vůbec nepracuješ s hodnotou na daném indexu.

For Each suda In poleSlov
            If suda Mod 2 = 0 Then
                Console.WriteLine("{0}", suda & " ")
            End If
        Next

Spíše by tam mělo být něco jako toto:

Console.WriteLine("{0} ", poleSlov(suda))
Nahoru Odpovědět
24.5.2020 16:19
"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 38 zpráv z 38.