Pomoc s programem ... – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pomoc s programem ... – C / C++ – Fórum – Programujte.comPomoc s programem ... – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Bublina0
Newbie
17. 10. 2011   #1
-
0
-

Ahoj,

začínám s C, hlavně kvůli škole. Potřebovala bych pomoct s jedním domácím úkolem ...

Realizujte program, který pro trojúhelník zadaný velikostmi svých stran určí další jeho parametry.

Vstupem programu jsou tři kladná desetinná čísla reprezentující délky stran a, b a c.

Výstupem programu jsou následující informace v pořadí dle ukázek:
informace, zda trojúhelník existuje,
zda je rovnoramenný/rovnostranný/není ani rovnoramenný ani rovnostranný,
zda je tupoúhlý/pravoúhlý/ostroúhlý,
velikosti jeho vnitřních úhlů ve stupních a radiánech,
obvod a obsah,
velikosti výšek a
poloměr kružnice opsané a vepsané.


Program detekuje chybu, zobrazí chybové hlášení dle ukázky a ukončí se, pokud jsou na vstupu nečíselné hodnoty nebo pokud strany nejsou kladná desetinná čísla. Chybové hlášení vypisujte na standardní výstup (nevypisujte jej na standardní chybový výstup).

Dodržte přesně formát všech výpisů. Výpis Vašeho programu musí přesně odpovídat ukázkám. Testování provádí stroj, který kontroluje výpis na přesnou shodu. Pokud se výpis Vašeho programu liší od referenčního výstupu, je Vaše odpověď považovaná za nesprávnou. Záleží i na mezerách, i na odřádkování. Nezapomeňte na odřádkování za posledním řádkem výstupu (a za případným chybovým hlášením). Využijte přiložený archiv s testovacími vstupy a výstupy a přečtěte si sekci FAQ, jak využít přesměrování vstupů/výstupů k testování Vašeho programu.

Váš program bude spouštěn v omezeném testovacím prostředí. Je omezen dobou běhu (limit je vidět v logu referenčního řešení) a dále je omezena i velikost dostupné paměti (ale tato úloha by ani s jedním omezením neměla mít problém). Testovací prostředí dále zakazuje používat některé "nebezpečné funkce" -- funkce pro spouštění programu, pro práci se sítí, ... Pokud jsou tyto funkce použité, program se nespustí. Možná ve svém programu používáte volání:
int main ( int argc, char * argv [] )
{

  ...
 
  system ( "pause" ); /* aby se nezavrelo okno programu */
  return 0;
}

Toto nebude v testovacím prostředí fungovat - je zakázáno spouštění jiného programu. (I pokud by se program spustil, byl by odmítnut. Nebyl by totiž nikdo, kdo by pauzu "odmáčkl", program by čekal věčně a překročil by tak maximální dobu běhu.) Pokud tedy chcete zachovat pauzu pro testování na Vašem počítači a zároveň chcete mít jistotu, že program poběží na Progtestu správně, použijte následující trik:
int main ( int argc, char * argv [] )
{
 ...

#ifndef __PROGTEST__
  system ( "pause" ); /* toto progtest "nevidi" */
#endif /* __PROGTEST__ */
  return 0;
}

Ukázka práce programu:
Zadejte velikost stran a b c:
5 5 5
Trojuhelnik je rovnostranny.
Trojuhelnik je ostrouhly.
Uhel alfa: 1.0472 rad = 60 s 00'00.00''
Uhel beta: 1.0472 rad = 60 s 00'00.00''
Uhel gama: 1.0472 rad = 60 s 00'00.00''
Obvod: 15.0000
Obsah: 10.8253
Polomer kruznice vepsane: 1.4434
Polomer kruznice opsane: 2.8868
Vyska va: 4.3301
Vyska vb: 4.3301
Vyska vc: 4.3301

Nevíte někdo jak do toho?

Nahlásit jako SPAM
IP: 195.113.242.–
crazy
~ Moderátor
+10
Grafoman
17. 10. 2011   #2
-
+1
-
Zajímavé

#1 Bublina
progtest :D není dobrý řešit úlohy na progtest na fóru :D ale máš na to ještě myslim 3 dny, tak to je dost i na vyřešení na fóru :D

Nahlásit jako SPAM
IP: 147.32.113.–
All you need is vision and time.
Bublina0
Newbie
17. 10. 2011   #3
-
0
-

heeeeeeeeeeeeeelp

Nahlásit jako SPAM
IP: 147.32.157.–
KIIV
~ Moderátor
+43
God of flame
17. 10. 2011   #4
-
0
-

jestli potrebujes pomoct s timdle, tak se zacni ohlizet po jinem oboru :)) todle je evidentne jen zahrivaci kolo

takovy obdelniky co byly o par kol dal uz je hard core

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
crazy
~ Moderátor
+10
Grafoman
17. 10. 2011   #5
-
0
-

#3 Bublina
s čím přesně chceš pomoc?

Nahlásit jako SPAM
IP: 147.32.113.–
All you need is vision and time.
Bublina0
Newbie
19. 10. 2011   #6
-
0
-

#5 crazy
Hlavně s podmínkama. Program jako takový už jsem sestavila, ale nedokážu vymyslet, co všechno je potřeba ošetřit a jaké podmínky všechny tam nacpat.

Nahlásit jako SPAM
IP: 77.48.103.–
crazy
~ Moderátor
+10
Grafoman
19. 10. 2011   #7
-
0
-

#6 Bublina
hlavně ošetřit vstupy a pak aby ti nevycházely kraviny jako alfa: 40 s 59'60''

Nahlásit jako SPAM
IP: 147.32.113.–
All you need is vision and time.
Bublina0
Newbie
20. 10. 2011   #8
-
0
-

Nemůžeš mi podat trochu větší záchytné lano, prosím? :)

Nahlásit jako SPAM
IP: 77.48.103.–
KIIV
~ Moderátor
+43
God of flame
20. 10. 2011   #9
-
0
-

vetsi zachytne lano uz je spise ve tvaru opratky - sice to za tebe nekdo vyresi ale v dlouhodobem meritku je to jako kdyby te rovnou sejmul...

muzes si jeste zajistit doucovani (to by byla asi ta lepsi varianta)

nebo zminenou opratku (tj nechat to nekoho za tebe udelat) - sice dostanes body ted, dalsi ukoly ti pak zlomi vaz (nebo vyrubou penezenku)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liborb
~ Redaktor
+18
Guru
20. 10. 2011   #10
-
0
-

Nebo sem dej tvůj dosavadní výtvor ... to se pak lépe radí, kde je potřeba ještě trochu zatlačit.

Nahlásit jako SPAM
IP: 78.80.52.–
crazy
~ Moderátor
+10
Grafoman
20. 10. 2011   #11
-
0
-

#10 liborb
dávat sem její dosavadní výtvor taky není nejlepší :) protože progtest kontroluje, zda to někdo opsal :) a když to vystaví na fóru, tak se někdo takový určitě najde .)

Nahlásit jako SPAM
IP: 147.32.157.–
All you need is vision and time.
Řešení
Milan
~ Anonymní uživatel
282 příspěvků
20. 10. 2011   #12
-
0
-
Vyřešeno Nejlepší odpověď

#1 Bublina
Ahoj,

je to snadne,

nejprve si nadefinujes promenne  typ double. Pak si zadas podminky / if, else if else, kdyz programek projde zadani bodu, tak vypocitas uhly, vysku, obsah, obvod - vzorecky najdes zde:

trojuhelnik: http://cs.wikipedia.org/…Aheln%C3%ADk

kosinova veta: http://cs.wikipedia.org/…A1_v%C4%9Bta

kdyz spoctes velikost uhlu v rad ... prevedes na stupne: alfa = a*180/M_PI a nasledne zaokrouhlis dolu - prikaz floor(promenna kde más vysledek) a to pak odectes od puvodniho vysledku a násobis 60 - dostanes minuty ... stejne tak to udelas na sec.

kdyby neco budu vecer na mailu: pickmila@fit.cvut.cz

Nahlásit jako SPAM
IP: 195.39.76.–
Bublina0
Newbie
20. 10. 2011   #13
-
0
-

Můžete mi říct, jak ošetřit, aby uživatel zadal číslo?

Nahlásit jako SPAM
IP: 83.208.83.–
flex
~ Anonymní uživatel
3 příspěvky
20. 10. 2011   #14
-
0
-

#13 Bublina
Nechodíš na přednášky a prosemináře? Zrovna tohle jsme brali první týdny ;) Podívej se na Edux na příklady ze třetího prosemináře...

Nahlásit jako SPAM
IP: 147.32.104.–
Bublina0
Newbie
20. 10. 2011   #15
-
0
-

Blázníš? Nejni čas, já u školy chodim do práce ... Díky moc

Nahlásit jako SPAM
IP: 83.208.83.–
crazy
~ Moderátor
+10
Grafoman
20. 10. 2011   #16
-
0
-

#15 Bublina

double x;
if( scanf("%lf", &x) != 1 ) {
	/* CHYBA */
	return 1;
}
Nahlásit jako SPAM
IP: 147.32.113.–
All you need is vision and time.
Bublina0
Newbie
20. 10. 2011   #17
-
+1
-
Zajímavé

Díííííííííííííííííky ... Mám to hotové 4,5 b, to jsem ani nečekala :D

Nahlásit jako SPAM
IP: 83.208.83.–
crazy
~ Moderátor
+10
Grafoman
21. 10. 2011   #18
-
0
-

#17 Bublina
no vidíš, tak se můžeš vrhnout na druhý úkol :D

Nahlásit jako SPAM
IP: 147.32.113.–
All you need is vision and time.
flex
~ Anonymní uživatel
3 příspěvky
22. 10. 2011   #19
-
0
-

Tak gratuluju :) aspoň, že tak..

Před chvílí byl zadanej už i 3. úkol, tak hodně štěstí :)

Nahlásit jako SPAM
IP: 89.102.168.–
Bublina0
Newbie
23. 10. 2011   #20
-
0
-

Ahoj, 

pomáhám teď s tímhle programem kamarádce už je celkem deadline ... Ona má program napsaný jiným stylem.

A má problém v tom, že jí to stupně a minuty zaokrouhluje o jeden nahoru nevíte jak to opravit?

Nahlásit jako SPAM
IP: 77.48.103.–
Midnight
~ Anonymní uživatel
78 příspěvků
23. 10. 2011   #21
-
0
-

Promiňte mi offtopic, jen se chci zeptat KIIV, jestli mas neco spolecneho s CVUT FIT. Jen tak mimo misu, z zadnyho duvodu :-)

Nahlásit jako SPAM
IP: 92.62.224.–
KIIV
~ Moderátor
+43
God of flame
23. 10. 2011   #22
-
0
-

#21 Midnight
nemam.. jen sem delal par z tech prikladu pro znamyho... kterej tam o moc dyl nevydrzel (precijen kdyz to nezvlada dat dohromady sam, tak se tam dlouho neudrzi)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Bublina0
Newbie
24. 10. 2011   #23
-
0
-

Ahoj kolegové,

v minulém úkolu jste mi velmi pomohli, za což vám moc děkuji.

Potřebovala bych poradit s druhým úkolem. Jde jen o takovou maličkost. Celý algoritmus mám vymyšlený, ale nefunguje mi podmínka "if proměnná se nerovná znaku || znaku tak vypiš Nesprávný vstup. ". Tak mi to napíše nesprávný vstup i pro správný znak.

Nevíte čím by to mohlo být?

Děkuji

Nahlásit jako SPAM
IP: 83.208.83.–
KIIV
~ Moderátor
+43
God of flame
24. 10. 2011   #24
-
0
-

hod to sem konkretne... a pripadne i par hodnot pro ktere to nefunguje

(pravdepodobne spatne promyslena podminka... )

EDIT: a pokud mas      if ( znak != 'A' || 'B' ) tak to nemuze v zivote fungovat spravne...

ostatne ani   if ( znak != 'A' || znak != 'B' )   nebude fungovat... (teda aspon ne tak jak chces)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Bublina0
Newbie
25. 10. 2011   #25
-
0
-

O to mi jde, nevím jak napsat tu podmínku, aby mi to takhle fungovalo. 

Nahlásit jako SPAM
IP: 195.113.242.–
liborb
~ Redaktor
+18
Guru
25. 10. 2011   #26
-
0
-

KIIV tím chtěl říct, že spojení těch podmínek nebude 'nebo' ale 'a', tj. znak se nerovná 'A' a nerovná se ani 'B':

if ((znak != 'A') && (znak != 'B')) {
	// znak neni ani A ani B
}

S podmínkou 'nebo' by to šlo obráceně, tj. detekovat, že vstup je správně:

if ((znak == 'A') || (znak == 'B')) {
	// znak je bud A nebo B, tj. vstup je spravny
}
Nahlásit jako SPAM
IP: 78.80.52.–
Bublina0
Newbie
25. 10. 2011   #27
-
0
-

Děkuji moc.

Nahlásit jako SPAM
IP: 195.113.242.–
Bublina0
Newbie
25. 10. 2011   #28
-
0
-
Nahlásit jako SPAM
IP: 195.113.242.–
liborb
~ Redaktor
+18
Guru
25. 10. 2011   #29
-
0
-

Zadávaný znak si načítáš do tvar1, ale kontroluješ výsledek volání funkce scanf, který ale nevrací načtený znak. Ten je v tom tvar1. Takže načíst a pak kontrolovat, tj. něco ve smyslu:

scanf ("%c", &tvar1);

if ((tvar1 != 'R') && (tvar1 != 'C')) {
}

A samozřejmě ti to nebude fungovat pro malá písmenka c a r. Ty je nutno ošetřit extra nebo "normalizovat" hodnotu ve tvar1.

Nahlásit jako SPAM
IP: 78.80.52.–
Bublina0
Newbie
25. 10. 2011   #30
-
0
-

Děkuji.

Nahlásit jako SPAM
IP: 195.113.242.–
Bublina0
Newbie
25. 10. 2011   #31
-
0
-

Tak jsem tu zase. Otestovala jsem všechny vstupy. Ale když dojdu k druhemu tvaru, tak mi to hned hodi nespravyn vstup nevite proc?

http://pastebin.com/cm4JzpR8

Děkuji :-*

Nahlásit jako SPAM
IP: 195.113.242.–
liborb
~ Redaktor
+18
Guru
25. 10. 2011   #32
-
0
-

Protože při prvním scanf zadáš znak a potvrdíš ho stiskem Enter, a to je ten druhý znak, který se ti načte do tvar2.

Nahlásit jako SPAM
IP: 78.80.52.–
Bublina0
Newbie
25. 10. 2011   #33
-
0
-

Nejsem si jistá, zda ti rozumím. Můžeš mi to trochu hlouběji vysvětlit nebo mi poradit jak to ošetřit? Děkuji

Nahlásit jako SPAM
IP: 195.113.242.–
liborb
~ Redaktor
+18
Guru
25. 10. 2011   #34
-
0
-

Zadáváš znaky na standardní vstup. Ty chceš jeden znak a potvrdíš ho Enterem. Na vstupu tak budeš mít 2 znaky, ten očekávaný a znak '\n' - nový řádek. Takže když ho ze vstupu nevyčteš, tak se při dalším čtení znaku zjistí, že tam znak je, načte se a ... konec znáš :).

V podstatě nakonec skončíš u načítání vstupu do řetězce a pořádné kontroly vstupu, ale tobě pro začátek bude stačit něco takového:

scanf ("%c\n",&tvar1);

EDIT: Hmmm ... to je tak, když se něco dlouho nepoužívá. Sice to nějak funguje, ale blbě :). Takže na to zapomeň a dej před načtení druhého znaku (do tvar2) vyčtení jednoho znaku, který zahodíš. A úplně nejlepší by bylo, pokud to lze, přejít na fgets (příklad).

Nahlásit jako SPAM
IP: 78.80.52.–
Bublina0
Newbie
25. 10. 2011   #35
-
0
-

Já jsem asi úplně blbá, ale nechápu to ... nemohl by jsi mi to vložit do toho kódu a poslat na pastebin.com?

Předem moc děkuji

Nahlásit jako SPAM
IP: 147.32.157.–
liborb
~ Redaktor
+18
Guru
25. 10. 2011   #36
-
0
-

Verze s vyčtením znaku navíc, třeba zdvojením vyčtení jednoho znaku (opravdu jsou ty 2 řádky stejné :)):

scanf("%c", &tvar2);
scanf("%c", &tvar2);

A verze s fgets:

// nekde na zacatku
char buff[2];

...

// misto scanf("%d", &tvar1);
fgets(buff, 2, stdin);
tvar1 = buff[0];

...

// misto scanf("%d", &tvar2);
fgets(buff, 2, stdin);
tvar2 = buff[0];

No a samozřejmě to není odolné na to, když ti někdo zadá "nějakouúplnědlouhoblbost", ale otázkou je, jestli to potřebuješ.

Nahlásit jako SPAM
IP: 78.80.52.–
Bublina0
Newbie
25. 10. 2011   #37
-
0
-

jo táákhle, děkuji moc :)

Nahlásit jako SPAM
IP: 147.32.157.–
Bublina0
Newbie
25. 10. 2011   #38
-
0
-

Ikdyž použiju funkci fgets, tak mě to nenechá zadat druhý tvar a hned mi to hodí Nesprávný vstup ...

Nahlásit jako SPAM
IP: 147.32.157.–
liborb
~ Redaktor
+18
Guru
25. 10. 2011   #39
-
0
-

   

No jo vlastně ... nulový znak    Na něj jsem zase zapomněl   

// nekde na zacatku
char buff[3];

...

// misto scanf("%d", &tvar1);
fgets(buff, 3, stdin);
tvar1 = buff[0];

...

// misto scanf("%d", &tvar2);
fgets(buff, 3, stdin);
tvar2 = buff[0];
Nahlásit jako SPAM
IP: 78.80.52.–
Bublina0
Newbie
25. 10. 2011   #40
-
0
-

Furt nic :(

Nahlásit jako SPAM
IP: 147.32.157.–
liborb
~ Redaktor
+18
Guru
25. 10. 2011   #41
-
0
-

A změnila si všechny 2 na 3? (délka pole i v fgets). 

A taky, jak jsem psal, to funguje právě a jenom na případ, kdy zadáš jeden znak a potvrdíš ho Enterem.

Nahlásit jako SPAM
IP: 78.80.52.–
Bublina0
Newbie
25. 10. 2011   #42
-
0
-

http://pastebin.com/Bd2u1H3m

Změnila, mě to právě za ten printf(tvar2) ... nenechá právě ani nic zadat a hned to hodí Nesprávný vstup

Nahlásit jako SPAM
IP: 147.32.157.–
liborb
~ Redaktor
+18
Guru
25. 10. 2011   #43
-
0
-

Aha. A nejspíš to vždycky testuješ na výpočtu s kruhem, že? Na řádku se zadáváním poloměru (v podmínce) ti chybí:

// Funkce getc(stdin) odfiltrovává případný další vstup.

Stejný způsob odfiltrování a testu si mohla použít i při zadávání tvar1, tvar2, pokud to tedy funguje jak potřebuješ.

Nahlásit jako SPAM
IP: 78.80.52.–
Bublina0
Newbie
25. 10. 2011   #44
-
0
-

Už to funguje. To je super. Děkuju moc. Jseš fakt skvělej ;)

Nahlásit jako SPAM
IP: 147.32.157.–
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, 10 hostů

Podobná vlákna

Pomoc s programem — založil Jarda

Pomoc s programem — založil Pepuna

Pomoc s programem — založil Janička

Pomoc s programem C++ — založil Marek

Pomoc s programem — založil undatra

Moderátoři diskuze

 

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