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í.
Avatar
Adam Pokorný:24.4.2020 19:37

Zdravím, snažím se v C# vytvořit program, který dokáže z libovolného úhlu, který uživatel zadá, vypočítat sinus, cosinus, tangens a cotangens. S vypětím všech svých sil jsem došel k tomuhle.

Zkusil jsem: Tohle jsem zatím nějak naťukal. :D
Console.Write­Line("Zadej úhel (stačí jenom číslo).");
double x = double.Parse(Con­sole.ReadLine());
double y = (x * (Math.PI)) / 180;
Console.Write­Line("Hodnotu které funkce chceš vypočítat pro zadaný úhel?");
Console.Write­Line("Pro sinus zadej 1, pro cosinus zadej 2, pro tangens zadej 3 a pro cotangens zadej 4.");
int funkce = int.Parse(Con­sole.ReadLine());

if (funkce == 1)
{
double a = Math.Sin(y);
Console.Write­Line("Sinus úhlu {0}° je {1}", x, a);
}
else if (funkce == 2)
{
double b = Math.Cos(y);
Console.Write­Line("Cosinus úhlu {0}° je {1}", x, b);
}
else if (funkce == 3)
{
double c = Math.Tan(y);
Console.Write­Line("Tangens úhlu {0}° je {1}", x, c);
}
else if (funkce == 4)
{
double d = (1 / Math.Tan(y));
Console.Write­Line("Cotangen­ts úhlu {0}° je {1}", x, d);
}
else if (funkce > 4)
{
Console.Write­Line("Zadej prosím znovu a správně číslo funkce");
}
else if (funkce < 1)
{
Console.Write­Line("Zadej prosím znovu a správně číslo funkce")

Chci docílit: Uživatel si sám zvolí úhel a funkci kterou chce vypočítat.
Momentálně je to takové kostrbaté ale říkám, jsem začátečník.

Díky za všechny rady.

 
Odpovědět
24.4.2020 19:37
Avatar
Adam Pokorný:24.4.2020 20:00

Ještě jsem zapomněl napsat co mi tam nefunguje a s čím vlastně potřebuju poradit. Úhel funguje pouze do 90° potom hází chybný informace a funkce kromě sinusu taky ukazujou blbosti, ale vůbec netuším proč :D

Editováno 24.4.2020 20:01
 
Nahoru Odpovědět
24.4.2020 20:00
Avatar
Bugmaster
Člen
Avatar
Odpovídá na Adam Pokorný
Bugmaster:24.4.2020 20:25

Proč myslíš, že ti to ukazuje blbosti?

 
Nahoru Odpovědět
24.4.2020 20:25
Avatar
Odpovídá na Bugmaster
Adam Pokorný:24.4.2020 21:41

Zkoušel jsem to spustit a ukazuje to jiný čísla než kalkulačka :(

 
Nahoru Odpovědět
24.4.2020 21:41
Avatar
Bugmaster
Člen
Avatar
Odpovídá na Adam Pokorný
Bugmaster:24.4.2020 22:00

Máš nějaký konkrétní hodnoy, které jsou špatně?

Jaký úhel? Jaká funkce? Jaká hodnota z programu? Jaká hodnota z kalkulačky?

 
Nahoru Odpovědět
24.4.2020 22:00
Avatar
Adam Pokorný:25.4.2020 8:45

Všechny funkce jsem pořádně vyzkoušel a zjistil jsem že fungují, kromě toho když má být výsledek 0 nebo nekonečno. Tím mám na mysli např. sin 180°,sin 0°,cos 90°,tg 90°,atd. Nevím jakým příkazem tomu pomoci aby i tyto funkce ukazovali správnou hodnotu 0.

 
Nahoru Odpovědět
25.4.2020 8:45
Avatar
Odpovídá na Adam Pokorný
Michael Škrášek:25.4.2020 10:50

Ten výsledek není přesně 0, ale třeba 0,00000000000­0000122460635382238, protože procesory nemají přesnou goniometrickou funkci, ale jen jejich aproximaci ... takže by ti mělo stačit ten výsledek zaokrouhlit na nějaký počet des míst ;)

Nahoru Odpovědět
25.4.2020 10:50
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Bugmaster
Člen
Avatar
Bugmaster:25.4.2020 10:50

Funkce sinus a cosinus by měly fungoval pro libovolný úhel. Zrovna tak výsledke nula bude ok. To si pořádně ověř, v tom problém nebude.

Problém je ale s funkcí tangens, resp. cotangens. Ta z matematického hlediska není pro některé úhly definovaná. Ona se totiž nechá spočítat takhle:

tan(uhel) = sin(uhel) / cos(uhel)

A tady nastává problém v okamžiku, kdy cos(uhel) == 0, protože dělení nulou.

Jedna z možností, jak to řešit, je třeba ověřit si, že cosinus toho uhlu není 0. Pokud je, tak vypsat něco ve smyslo, že pro tenhle úhel není funkce tangens definovaná.

Cotangens funguje obdobně. Jen tam na nulu nebudeš ověřovat cosinus, ale sinus.

 
Nahoru Odpovědět
25.4.2020 10:50
Avatar
Odpovídá na Michael Škrášek
Adam Pokorný:25.4.2020 10:53

Ano, výsledek mi vždy vyjde 1,12...... na - 16tou, takže stačí zaokrouhlit. Děkuju za radu.

 
Nahoru Odpovědět
25.4.2020 10:53
Avatar
Odpovídá na Bugmaster
Adam Pokorný:25.4.2020 11:03

Hele s tangens mi ale normálně funguje, teda až na to nekonečno. Math.Tan() funguje spolehlivě a cotangens jsem v počítal 1/tangens. Ještě vyzkouším tvůj způsob. Ještě vymyslet příkaz který zjistí kdy je cos úhlu nula.

 
Nahoru Odpovědět
25.4.2020 11:03
Avatar
Bugmaster
Člen
Avatar
Odpovídá na Adam Pokorný
Bugmaster:25.4.2020 11:26

Přiznávám, goneometrické funkce v dotnetu snad vůbec nepoužívám, takže neznám jejich chování kromě toho, co se píše v dokumentaci.

Hádám, že pro nedefinovaný úhly to vrací double.NaN , popř. nějakou šíleně velkou nebo malou hodnotu, protože to vlivem nepřesnosti doublu zrovna tak vychází. Takže by možná stačílo kontrolovat, jestli tangens nevrací NaN...

To, co jsem psal, spíš vychází z toho, co si pamatuju z matematiky ze školy.

Každopádně to, na co jsi se nepřímo ptal, byla opravdu nepřesenost doublu. To mě vůbec nenapadlo na to upozornit - ze zkušenosti vím, že tyhle chyby fakticky vadí jen když počítáš peníze :)

 
Nahoru Odpovědět
25.4.2020 11:26
Avatar
Odpovídá na Bugmaster
Adam Pokorný:25.4.2020 14:03

Děkuju za všechny rady. Nastavil jsem tam zaokrouhlování takže už mi to ukazuje i 0. Ještě poslední otázka :D. Dalo by se nějak nastavit abych se z určitého místa vrátil zpět na určité místo. V mém zadání by to znamenalo to, že kdyby uživatel nevybral ani jednu z funkcí ale napsal by např. 5 tak aby na něj vyskočila věta "Zadej prosím znovu a správně číslo funkce" a vrátilo by ho to zpět na výběr funkcí?

 
Nahoru Odpovědět
25.4.2020 14:03
Avatar
Bugmaster
Člen
Avatar
Odpovídá na Adam Pokorný
Bugmaster:25.4.2020 16:53

Dalo by se nějak nastavit abych se z určitého místa vrátil zpět na určité místo.

Takhle se vysloveně ptáš na jednu fičůru, která je snad i v C#, ale je tak trochu tabu. V rozáhlejším programu je to totiž cesta do pekla.

Takže popíšu obvyklé řešení:

Tyhle věci se bežně řeší cyklem. Cyklus je něco, co ti opakovaně spouští nějaký kód, dokud je splněna nějaká podmínka. Existuje několik druhů cyklů. V tomhle případě by se nabízelo to celé strčit do do-while. Tam se podmínka ověřuje až na konci, takže cyklus proběhne alespoň jednou. Takže stačí zajistit, aby podmínka byla splněna, pokud uživatel zadá neplatnou hodnotu.

do
{
  // kod, ktery opakovat
} while(podminka);
Editováno 25.4.2020 16:54
 
Nahoru Odpovědět
25.4.2020 16:53
Avatar
Odpovídá na Bugmaster
Adam Pokorný:25.4.2020 17:31

takže mezi to "do" a "while" mam dát úplně celý program

 
Nahoru Odpovědět
25.4.2020 17:31
Avatar
Bugmaster
Člen
Avatar
Odpovídá na Adam Pokorný
Bugmaster:25.4.2020 17:54

Ano, to je asi nejjednodušší.

Alternativně můžeš celý program vyseparovat do funkce vedle a do cyklu dát jen volání funkce.

A ještě alternativně: můžeš ověřit, že uživatel zadal číslo v očekávaném rozsahu před tím, než to celé spuštíš.

 
Nahoru Odpovědět
25.4.2020 17:54
Avatar
Odpovídá na Bugmaster
Adam Pokorný:25.4.2020 18:19

Děkuju, zvolím nejjednodušší metodu. Hodím před volbou funkce to "do" a nakonec "while". Díky za všechny rady :)

 
Nahoru Odpovědět
25.4.2020 18:19
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 16 zpráv z 16.