Dělení v C# problém – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dělení v C# problém – .NET – Fórum – Programujte.comDělení v C# problém – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
vamvam0
Newbie
6. 11. 2016   #1
-
0
-

Dobrý den,

jsem v C# začátečník a chtěl jsem pro svou sestru zároveň pro mé procvičení udělat početní program.

+, -, * se vším jsem se vypořádal a udělal na úrovni kdy jsem spokojenej..

Celé to funguje na funkci random, takže čísla jsou náhodné do nějaké hodnoty.

Problém nastává u / (dělení).. Totiž potřeboval jsem aby to dávalo čísla takové, že výsledek bude bez desetinné čárky(8/4;4/2;9/3;atd.).

float test = (float)cislo1 % (float)cislo2;
                while (test != 0)
                {
                   
                   cislo2 = random_cislo.Next(1, max2);
                   if(test == 0) {
                       break;
                   }

tohle jsem vymyslel, ale padá mi program..

Zkoušel jsem dělat různé pokusy a nic, jsem v takovém konci kdy mě nic nenapadá a tak zkouším hledat pomoc jinde. Žádné errory, warningy nic to nevyplivne. Zkoušel jsem aby se mi ukázali breakpointy a ukázalo to na již zmíněnou část nahoře a na tuhle část(která slouží k tomu, že jakmile to vrátí z bool(kde se kontroluje jestli dotyčný zadal dobře výsledek) true, tak to přičte pár parametrů které nejsou moc podstatné)

        private void checking_Click(object sender, EventArgs e)
        {
            if (Kontrola())
            {
                
                spravne++;
                celkem++;
                celkem_l.Text = celkem.ToString();
                pocet_spravne.Text = spravne.ToString();
                random_cisloz(11, 6);
                if(celk_znamka <= 90){
                celk_znamka += 10;
                }
                znamka_urceni();
             
               

            }

Podstatné jsou tyto 2 řádky(jak z 1, tak 2. kódu):

1. cislo2 = random_cislo.Next(1, max2);

-> Tady to nepíše nic, jenom je to žlutě zabarvené netuším co to znamená.

2. random_cisloz(11, 6);

-> Tady je to šedě zabarvené(Tato vyvolaná funkce změní 2 čísla, respektive pokuď je výsledek správně, tak po kliknutí na tlačítko změní ty 2 výchozí čísla od kterých se to odvíjí) a je u toho napsaný:

struct System.Int32
Represents a 32-bit signed integer. To browse the .NET Framework source code for this type, see the Reference Source.

- Googlil jsem jakou dobu a nenašel jsem nic.. Buďto mi něco zásadního uniklo a "pod svícnem je největší tma" nebo špatně hledám..

Kdyby někdo měl nějaký nápad, budu extrémně rád. :-) Děkuji

Nahlásit jako SPAM
IP: 79.170.253.–
vamvam0
Newbie
6. 11. 2016   #2
-
0
-

#1 vamvam
Problém jsem díky MessageBoxu našel. 

Pokaždé když je test větší jak 0,9, tak to spadne. Problém nalezen, ale za 1. nechápu proč a za 2. nechápu jak to opravit. Kdyby byl někdo tak rád a osvětlil mi to, byl bych rád.

Respektive né že nevím, spíš nechápu proč to tak nefunguje, dodal jsem tam ještě:

(test != 0 || test >= 1)

a stále to nad 1 crashuje

Nahlásit jako SPAM
IP: 79.170.253.–
BDS+3
Věrný člen
6. 11. 2016   #3
-
0
-

#2 vamvam
1. pokud chceš celočíselné hodnoty, tak tam nedávej float, ale třeba int (navíc random vrací stejně int)

2. vždy je lepší sem dát celou funkci, ne jen část (lépe se zjišťuje, kde je chyba - navíc může být zrovna v místě, které tu nedáš)

while (test != 0) - není to náhodou nekonečná smyčka?

navíc testuješ to následovně:

while (test != 0) = pokud test není nula

if(test == 0) a zároveň pokud je nula..

Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
vamvam0
Newbie
6. 11. 2016   #4
-
0
-

#3 BDS
1. No jsem tam dal float, aby to dokázalo dát ten zbytek.

3. Neměla by být, ne? Vždyť pokuď není zbytek 0 udělej to co je v závorkách, pokuď je, jdi dál.

2. 

public void random_cisloz(int max, int max2)
        {
            
            cislo1 = random_cislo.Next(1, max);
            cislo2 = random_cislo.Next(1, max2);

            float test = (float)cislo1 % (float)cislo2;
            string test2 = test.ToString();
            MessageBox.Show(this, test2);
            
            while (test != 0 || test >= 1)
                {
                   
                   cislo2 = random_cislo.Next(1, max2);
                   if(test == 0) {
                       break;
                   }
                }

        
           label1.Text = cislo1.ToString();
           label3.Text = cislo2.ToString();

            je_to_cislo = int.TryParse(Vysledek1.Text, out vysledek_z_boxu);

            if (je_to_cislo =! true)
                MessageBox.Show(this, "Musíš použít číslice, né písmena!");
            
            Vysledek1.Clear();
          }

PS: 

"while (test != 0) = pokud test není nula

if(test == 0) a zároveň pokud je nula.."

Ano, pokuď test není nula tak chci aby to provádělo tu smyčku.. Ta smyčka mění to 2. číslo a jakmile se to 2. číslo změní na takové číslo kdy test bude 0, tak se vypne ta smyčka, tohle je taková moje myšlenka.

Mě jednoduše nedává rozum, proč když test není nula, tak to nebere jakože i 1.. Přece když je test = 1, tak se nerovná nule ne? :D To dává logiku, ale nechce mi to vzít, tak nevím kde dělám chybu.

Nahlásit jako SPAM
IP: 79.170.253.–
BDS+3
Věrný člen
6. 11. 2016   #5
-
0
-

#4 vamvam
nejprve k k té smyčce: 

while (test != 0 || test >= 1) //řekněme že test je 8,
                {
                   //takže se to dostane do smyčky
                   cislo2 = random_cislo.Next(1, max2);
                   if(test == 0) 
                   { //toto se nikdy nesplní,
                     //protože se to do smyčky dostane jen pokud není 0
                       break;
                   }
                  //test jsi nezměnil, takže smyčka bude pokračovat
                }
Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
vamvam0
Newbie
6. 11. 2016   #6
-
0
-

#5 BDS
ahá, děkuju a jak to mám tedy ukončit tu smyčku aby se to rozbilo jakmile bude test 0 ?

Nahlásit jako SPAM
IP: 79.170.253.–
BDS+3
Věrný člen
6. 11. 2016   #7
-
0
-

#6 vamvam
nikdy nebude 0, protože nikde tam žádnou hodnotu nepřiřazuješ

Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
BDS+3
Věrný člen
6. 11. 2016   #8
-
0
-

příklad: 

public void RandomCisloZ(int max, int max2)//<název funkcí se formátuje spíš takto
        {
            int cislo1 = random_cislo.Next(1, max);
            int cislo2, test;
            
            while(true) //nekonečná smyčka
            {
                cislo2 = random_cislo.Next(1, max2);
                test = cislo1 / cislo2; //vydělím to
                if (cislo1 == (test * cislo2)) break; // násobením ověřím, že dělení proběhlo správně
            }


            // zbytek kódu jsem nechal tak, protože nevím jako to máš
            label1.Text = cislo1.ToString();
            label3.Text = cislo2.ToString();

            je_to_cislo = int.TryParse(Vysledek1.Text, out vysledek_z_boxu);
            
            if (je_to_cislo = !true)
                MessageBox.Show(this, "Musíš použít číslice, né písmena!");

            Vysledek1.Clear();
        }
Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
vamvam0
Newbie
6. 11. 2016   #9
-
0
-

#8 BDS
Ono to funguje! Děkuji mnohokrát.. 

Sice se teď cítím trapně, protože jsem tady vypsal 35 řádků kódu a byly tam občas nesmyslné čísla a vy jste to zvládnul ve 3 a ještě to nemá žádné mouchy. 

Ještě taková otázečka jestli můžu. -> Nemýlím se tím, že když dám while (x =! 0) a v té smyčce třeba určím nějaké číslo++, tak ten program jako kdyby jezdí pokaždé z vrchu funkce až k tomu while a ten ho nepustí dál? Nebo to jezdí pořád dokola pouze v tom while?

Nahlásit jako SPAM
IP: 79.170.253.–
BDS+3
Věrný člen
6. 11. 2016   #10
-
0
-

#9 vamvam
ne jezdí v tom while, mezi závorkami:

while(..) {tady}

Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
vamvam0
Newbie
6. 11. 2016   #11
-
0
-

#10 BDS
Jo aha, děkuju.

A ještě co mi teď problikla v hlavě otázka když koukám na ten váš příklad.

test = cislo1 / cislo2; //vydělím to -> tohle zaopatřuje to, že to nesmí být 9/2 apd. ? do hodnoty int se nedá uložit číslo s desetinnou čárkou, tím pádem když se tam nic neuloží, neplatí podmínka, tím pádem smyčka pokračuje dál? Chápu to správně?

Nahlásit jako SPAM
IP: 79.170.253.–
BDS+3
Věrný člen
6. 11. 2016   #12
-
0
-

#11 vamvam

test = cislo1 / cislo2;

vypočítá 9 : 2 =  4

a pak když to násobím 

4 * 2 != 9

tak se nesplní podmímka

Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
vamvam0
Newbie
6. 11. 2016   #13
-
0
-

Ajoooo, děkuju moc za vysvětlení. :-)

Nahlásit jako SPAM
IP: 79.170.253.–
BDS+3
Věrný člen
6. 11. 2016   #14
-
0
-

pro lepší vysvětlení while:

        public static void Test()
        {
            Console.WriteLine("vypíše: 12345");

            int i = 1;
            while(i < 6)
            {
                Console.Write(i);
                i++;
            }

            Console.WriteLine("\nvypíše: 123");
            int j = 1;
            while (j < 6)
            {
                Console.Write(j);
                if (j == 3) break;
                j++;
            }
        }
Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
JirkaEr0
Newbie
30. 11. 2016   #15
-
0
-

Poradím trošku mimo to, na co se ptáš. Ale možná to ušetří čas do budoucna, až budeš uvažovat nad jinými problémy.

Zkus tu logiku obrátit. Než hledat dvě čísla, které lze dělit beze zbytku, udělej random dvou čísel, které vynásobíš.

int cislo1 = random_cislo.Next(1, max);
int cislo2 = random_cislo.Next(1, max);
int vysledek = cislo1 * cislo2;

label1.Text = vysledek;
label3.Text = cislo1; // případně cislo2

A pak se nemusíš trápit s podmínkami, které jsi řešil.

Nahlásit jako SPAM
IP: 212.45.173.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

Podobná vlákna

Problém při dělení — založil Jan Svatoň

[C++] Delení % — založil Re4DeR

Dělení obrázku — založil Dex

Zbytek po dělení — založil Foret

Dělení matice — založil Hanule

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý