Problém s cyklem   otázka

VB.NET, Algoritmy

Zdravím dělám dlouhodobou matuitní práci ve vb.net. Nevím jak vyřešit problém s jedním cyklem. Má se načíst formulář, který vygeneruje 2 čísla od 1 do 20. Poté se má výsledek napsat do textboxu a zkontrolovat pomocí tlačítka. Problém je v tom, že při ladění se mi v neznámých zobrazují jiné hodnoty než když spustím program. Jde o generování v cyklu "i". Mohli byste mi prosím poradit kde je chyba?

Public Class Form10

    Private Sub Form10_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim x, y, vysledek, znamka As Byte
        znamka = 0
1:      x = CInt(Rnd() * 19 + 1)
        Label2.Text = x
        y = CInt(Rnd() * 19 + 1)
        If x < y Then
            GoTo 1
        End If
        Label4.Text = y
        TextBox1.Text = vysledek      
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim i As Byte
        Dim x, y, vysledek, znamka As Byte
        Label2.Text = x
        Label4.Text = y
        TextBox1.Text = vysledek
        If vysledek = x - y Then
            znamka = znamka + 1
        End If
        For i = 1 To 2
1:          x = CInt(Rnd() * 19 + 1)
            Label2.Text = x
            y = CInt(Rnd() * 19 + 1)
            Label4.Text = y
            If x < y Then
                GoTo 1
            End If
            TextBox1.Text = vysledek
            If vysledek = x - y Then
                znamka = znamka + 1
            End If
        Next
        znamka = znamka / 3
    End Sub
End Class

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Neviem, či to pomôže, ale na generovanie náhodných čísel sa od dôb .NET Frameworku používa trieda System.Random . Funkcia Rnd() je už zastaralá, pochádza z VB 6 alebo ešte staršej verzie. Ak ale fakt chcete použiť funkciu Rnd(), inicializujte tento generátor funkciou Randomize(), a to raz, pred prvým volaním funkcie Rnd().

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Dobrý den,

jak už řekl kolega předemnou, Rnd() je zastaralé a pokud jste před vykonáváním tohoto příkazu neprovedl příkaz Randomize(), tak vám mohu garantovat, že náhodná čísla opravdu negenerujete.

Pro generování náh. čísel se tedy v .NET používá

Dim RandomInt As New Random     ''inicializace generatoru
RandomInt.Next(0, 100)          ''Vrátí náhodné číslo od 0 do 100
RandomInt.Next(1, 20)          ''Vrátí náhodné číslo od 1 do 20

A být vámi, tak přepíši ten humus GoTo na Do While.

Tedy asi takto:


Dim RandomInt As New Random
Do 
x = RandomInt.Next(1, 20)  
Label2.Text = x
y = RandomInt.Next(1, 20)  
Label4.Text = y
Loop While x < y

Jelikož mě bylo řečeno, že GoTo je humus, tak jsem se ho nikdy neučil, ALE není problém v to, že máte obě návěští pojmenované 1 a on neví kam skočit?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

POZOR! Random.Next(0,100) vráti čísla od 0 do 99, teda maximálna hodnota vychádza na číslo o 1 menšie, ako zadáte druhý parameter.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Omlouvám se toho jsem si nevšiml.

Nicméně použití je uvedeno správně.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Doporučuji alespoň přečtení základů VB .NET. Pak zapomeňte na Goto, nedefinujte do Byte, opakovaný kód dejte do jedné procedury a zamyslete se nad logikou (více nelogigou) kódu...

Nevím, co má být cílem, co je "znamka", ale v tom, co ukazujete, "vysledek" nebude mít jinou hodnotu než 0 a "znamka" pak hodnotu 0 nebo při splnění podmínky x = y hodnotu 1 - nic jiného

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Upravil jsem kód podle vašich rad. Vypadá teď následovně:

Public Class Form10

    Private Sub Form10_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim i As Byte
        Dim x, y, znamka, vysledek As Integer
        Dim randomint As New Random
        For i = 1 To 3
            Do
                x = randomint.Next(1, 20)
                Label2.Text = x
                y = randomint.Next(1, 20)
                Label4.Text = y
            Loop While x < y
            vysledek = InputBox("Jaký je výsledek?", "Výsledek")
            If vysledek = x - y Then
                znamka = znamka + 1
            Else
                znamka = znamka + 5
            End If
        Next
        znamka = znamka / 3
        Label6.Text = znamka
    End Sub

Teď ale řeším problém jak požádat uživatele o zadání výsledku. Dal jsem tam inputbox, to ale uživatel neuvidí vygenerovaná čísla ve formuláři. Poradili byste mi prosím jak toto vyřešit. Vím, že je to nejspíš pitomá otázka , ale jsem začátečník. Předem děkuji za rady.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Miesto InputBoxu môžete použiť vlastný formulár upravený na podobu dialógového okna, a vygenerované čísla vypísať do Labelu .Dáte tam jeden Label na vygenerované čísla, a jeden Label na pokyny pre užívateľa, potom NumericUpDown na zadanie výsledku a tlačidla OK a Cancel . Potom ešte menšie úpravy a v kóde následne vytvoríte nový objekt toho formulárá(napr. ak ho pomenujete DialogForm, tak Dim frm As New DialogForm () ).Vyvoláte ho pomocou metódy .ShowDialog() a to, čo táto metóda vráti, porovnáte s DialogResult.OK, a následne overíte výsledok a podľa toho upravíte užívateľovi známku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Alebo čísla vypíšete do InputBoxu. A ak potrebujete jedno číslo vždy väčšie, ako druhé, prečo ich jednoducho nevimeníte?

x = randomint.Next(1,20)
y = randomint.Next(1,20)
If x < y Then
   Dim temp As Integer
   temp = x
   x = y
   y = temp
End If

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano dobře a jak mam načíst do labelu formuláře čísla, která byla vygnerována v jiném formuláři?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Do formulára na zobrazovanie čísel dajte Public Property, a v setteri vlastnosti nastavte texty Labelov. Inak, všetky ovládacie prvky na formulári by mali byť Private, alebo aspoň Protected. A ak ich potrebujete meniť z iných formulárov, používajú sa na to Public vlastnosti.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback