» »

[C] Naloga

[C] Naloga

Apfelsaft ::

Napisal sem program, ki dana kota v stopinjah, minutah in sekundah pretvori v radiane in sešteje nato pa vsoto pretvori nazaj v stopinje, minute in sekunde.

Ni mi jasno zakaj ne deluje kot bi moral.

#include <stdio.h>

int main(void)
{	
	int sekunda1, minuta1, stopinja1;
	int sekunda2, minuta2, stopinja2;
	int sekunda, minuta, stopinja;
	double radian1, radian2, radian;
	double vsota;
	
	printf("Sekunde: "); scanf("%d", &sekunda1);
	printf("Minute: "); scanf("%d", &minuta1);
	printf("Stopinje: "); scanf("%d", &stopinja1);
	
	radian1 = (stopinja1 * 3600 + minuta1 * 60 + sekunda1) * 4.848e-6;
	
	printf("\nSekunde: "); scanf("%d", &sekunda2);
	printf("Minute: "); scanf("%d", &minuta2);
	printf("Stopinje: "); scanf("%d", &stopinja2);
	
	radian2 = (stopinja2 * 3600 + minuta2 * 60 + sekunda2) * 4.848e-6;
	radian = radian1 + radian2;
	vsota = radian * 57.296;
	
	stopinja = vsota;
	vsota = vsota - stopinja;
	vsota = vsota * 60;
	minuta = vsota;
	vsota = vsota - minuta;
	vsota = vsota * 60;
	sekunda = vsota + 0.5;
	
	
	printf("\nSekunde: %d", sekunda);
	printf("\nMinute: %d", minuta);
	printf("\nStopinje: %d", stopinja);
	
	return 0;
}
	
	
  • spremenilo: Apfelsaft ()

Janac ::

spremeni int v double

Apfelsaft ::

Kateri int?

Janac ::

podatkovni tip

Apfelsaft ::

Kje naj ga popravim?

ales85 ::

Verjetno vse sekunde. Ker nato mešaš int in double, rajši vse delaj v double.

Apfelsaft ::

No ja, to je verjetno ena od možnosti.

Mene zanima zakaj obstoječa ne deluje.

ragezor ::

ker je narobe

stopinja = vsota;
vsota = vsota - stopinja;

Apfelsaft ::

Kaj je tu narobe?

epicVoid ::

Ja stopinja je tipa integer vsota pa tipa double in ti shranjujes spremenljivko tipa double v spremenljivko tipa integer.

Apfelsaft ::

Ja saj tako mora biti.

epicVoid ::

Ne razumeš kaj je int kaj je pa double ne ?

Apfelsaft ::

Seveda razumem.

Bistveno je, da se bo v spremenljivko stopinja zapisalo realno število shranjeno v spremenljivki vsota. Rezultat bo seveda celoštevilski, kar je tudi cilj. Z ostankom pa delam naprej.

mallard ::

Ne deluje zato, ker računanje s plavajočo vejico že samo po sebi ni natančno, ti pa situacijo še poslabšaš, ker zaokrožuješ in potem še potenciraš napako. Stopinjo, izraženo v radianih, si zakrožil na 4.848 * 10^-6, prava vrednost (v double tipu) pa je v resnici 4,8481368110953599358991410235795 * 10^-6. Ko to parkrat pomnožiš, npr. z 10^6, in potem pretvoriš v celo številski tip, pa potem spet deliš, se ti napake nabirajo in na koncu ti rezultat striže za cele sekunde. Malo poguglaj, kako plavajoča vejica deluje.

ragezor ::

ja meni je tisto zgledalo kot da dobis 0 oziroma 0.xxx

ampak ce hoces to dobiti potem kul.

Apfelsaft ::

Ok, hvala vsem. Očitno ni nikoli odveč uporabiti toliko decimalnih mest kot jih je na voljo.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C in računanje kotov

Oddelek: Programiranje
376589 (5642) RatedR
»

c napaka .c:4:1: error: expected identifier or '(' before '{' token

Oddelek: Programiranje
141932 (1505) MrStein
»

[C] Vsota števil v polju

Oddelek: Programiranje
51271 (1209) Cvenemir
»

[c] char zadeva

Oddelek: Programiranje
222250 (2048) TheCyborg
»

Kako bi naredil en ultra simple programček?

Oddelek: Programiranje
492323 (1604) AtaStrumf

Več podobnih tem