Napíste a odladte program, ktorý pre zadané podmienky vypocíta ako sa bude správat hmotný bod v ideálnom prostredí (vákuum, tiazové zrýchlenie je vo vsetkých bodoch rovnaké, …) a vypíse ziadaný výstup podla hodnoty makra zadanej pri preklade.
Zo
standardného vstupu program postupne precíta najprv pociatocné
súradnice bodu x,y (v beznej karteziánskej sústave). Potom hmotnost
daného bodu. Dalej tiazové zrýchlenie (na Zemi je to 9.81 ms-2). Posledným vstupom bude vektor sily, ktorá bude pôsobit na bod
tak dlho, kým bod prejde 0.5 metra od pociatku (tak dlho by sme
teoreticky pôsobili rukou pri hádzaní nejakého predmetu).
Napríklad pre vstup:
0 100 10 9.81 1000 1000
Program vypíse nieco na spôsob:
Bod na ktory z pociatocneho bodu: 0.00 m,
100.00 m posobila
na drahe 0.5 metra sila ktorej x-ova zlozka bola
1000.00 N a y-ova 1000.00 N
mal hmotnost 10.00 kg pri tiazovom
zrychleni 9.81 m/(s*s) sa spraval
nasledovne:
Bod dosiahol
najvacsiu vysku: 7.20 m, 103.41 m
Dopadol v bode 46.77 m, 0.00
m
Dopadol za cas 5.47 s
Dopadol rychlostou v = 45.86 m/s
Takto vyzerá výpis ak makro WHAT nemá ziadnu hodnotu alebo
hodnotu 0 – vypisuje sa vsetko okrem pozície a rýchlosti v ziadanom case. (Pozri dalej.)
Viac napovie obrázok:
Program nazvite vrh.c .
Pred cítaním akýchkolvek dat má program vypísat, co má uzivatel zadat a v akom tvare .
Program musí kontrolovat správnost vstupných dat, a to nasledovne:
Pociatocná výska bodu nesmie byt záporná (nulová samozrejme byt môze)
Hmotnost bodu musí byt kladná. (Inác by sa niektoré vzorce nedali pouzit)
Tiazové zrýchlenie musí byt kladné. (Neberieme do úvahy beztiaz)
Ak je zadanie chybné, program má vypísat chybové hlásenie.
Po výpise chybovej zprávy
program nepokracuje, tj.skoncí príkazom return
císlo;
Je zvykom, ze príkaz return
vo funkcii main vracia nulu, ak spracovanie
programu prebehlo bez problému; nenulové císlo indikuje, ze program
zistil chybu pri spracovávaní.
Makro WHAT definované pri preklade bude
obsahovat císlo, ktoré bude súctom niektorých z nasledujúcich hodnot
(napríklad 6 vypíse dobu letu a bod dopadu):
1 (height) vypíse maximálnu výsku
2 (impact) súradnice miesta dopadu
4 (time) doba letu
8 (velocity) rýchlost dopadu (velkost vektoru, nie iba vertikálna zlozka)
môze byt nula a v tomto prípade sa program chová, ako by bolo zadané 15 (takisto pri preklade bez makra)
Môzete predpokladat, ze hodnota makra je v parametroch udaná správne, a teda netreba robit ziadne komplikované kontroly.
Pracujte samostatne - blizsie viz Pravidla pro cvicení a Sazebník odmen a pokut.
2 body navyse získate, ak makro
WHAT bude moct nadobudnút aj hodnotu 16
(prípadne v súctu s inými hodnotami); vtedy
sa na vstupe bude ako posledný údaj vyzadovat cas, v ktorom chceme
vypísat informácie o bode (poloha a rýchlost)
Dalsie 2 body získa ten, kto program odovzdá do polnoci z nedele na pondelok nasledujúci po vasom cvicení (to platí i pre vsetky nasledujúce cvicenia).
Príklad je ciste teoretický, preto je dôlezité si uvedomit ako pociatocná sila pôsobí. Uz pocas pôsobenia tejto sily na dany bod pôsobí aj tiazové zrýchlenie. Takto ideálne by sme dokázali na bod pôsobit teoreticky dvoma newtometrami, ktore by boli kolmé na seba. Z toho vyplýva, ze ak pôsobime na bod silou mensou ako je jeho hmotnost vynásobená tiazovým zrýchlením smerom nahor, výsledna sila bude nulova smerom nahor, pripadne zaporná, cize bod svoju výsku uz nezväcsí... POZOR na to, ak je sila smerom nahor rovná tiazovej sile a zároven sila v smere osi x je nulova. Tento prípad je treba zvlást osetrit, a to tak, ze budeme pocítat ciste volný pád. Je to z toho dôvodu, ze takto by sme nikdy nemohli pôsobit silou na dráhe 0,5 metra resp. trvalo by to nekonecný cas.
Mozno malou pomôckou bude:
je dobré si uvedomit, z coho sa celkový pohyb skladá. Najprv sa bod
hýbe rovnomerne zrýchlene (to je cas, kým pôsobí "nasa"
sila). Vdaka nemu získa urcitú rýchlost aj v smere osi x aj y. Od
tohoto bodu sa uz pohybuje len volným pádom, zlozeným s vodorovným
vrhom (podla x-ovej súradnice), a je brzdený resp. zrýchlovaný pred
tým získanou rýchlostou v smere osi y. To, ze 0.5 metra pôsobenia
sily trvá urcitý cas spôsobí pravdepodobne najväcsie
problémy pri implementácii "funkcnosti" moznosti 16
u makra WHAT.
Môze sa javit zbytocné nacítavanie pri pociatocnej pozícii aj x ovú súradnicu. Ale je to z dôvodu moznosti rozsírenia programu napríklad na cyklické zadávanie viacerých vrhov za sebou atd.
Pri riesení môzete vyuzit moznost v
direktíve #if zapísat akúkolvek podmienku.
Kedze je nutné pouzitie funkcie
sqrt, ktorá vracia hodnotu typu double je vhodné pouzit
na vsetky premenné typ double
Pri pouzití matematickej kniznice
(hlavickový súbor math.h) treba nezabudnút pridat pri kompilácii ako posledný parameter
-lm.
Autorom úlohy je © 2005 Jozef Krchnavý
#include <stdio.h>
#include <math.h>
double g,x0,x1,xEnd,y0,y1,yEnd,m,Fx,Fy,Fg,t1,tmax,t3,maxX,maxY,vx,vy,v3;
int what=15;
int main()
{
#ifdef WHAT
what=(WHAT?WHAT:15);
#endif
printf("Zadaj suradnice pociatocneho bodu (x,y) v metroch:");
scanf("%lf%lf",&x0,&y0);
if(y0<0) {printf("CHYBA: y-ova suradnica musi byt nezaporna!\n");return 1;}
printf("Zadaj hmotnost bodu v kg:");
scanf("%lf",&m);
if(m<=0) {printf("CHYBA: Zadaj kladnu hodnotu hmotnosti!\n");return 1;}
printf("Zadaj tiazove zrychlenie:");
scanf("%lf",&g);
if(g<=0) {printf("CHYBA: Zadaj kladne tiazove zrychlenie!\n");return 1;}
printf("Zadaj velkost vektorov X a Y v N:");
scanf("%lf%lf",&Fx,&Fy);
/*------------------------------ VYPOCET -------------------------------------*/
Fg=m*g;
if((Fg=Fy)&&(Fx==0)) t1=0;
else t1=sqrt(0.5/sqrt( (Fx*Fx+(Fy-Fg)*(Fy-Fg))/(4*m*m)) );
vx=(Fx/m)*t1;
vy=((Fy-Fg)/m)*t1;
x1=0.5*(Fx/m)*t1*t1+x0;
y1=0.5*((Fy-Fg)/m)*t1*t1+y0;
tmax=vy/g;
maxX=x1+vx*tmax;
maxY=y1+0.5*g*tmax*tmax;
t3=sqrt((2*maxY)/g);
xEnd=maxX+vx*t3;
v3=sqrt(vx*vx+g*g*t3*t3);
if ((Fy-Fg<=0)&&(y0==0)) {v3=t1=tmax=t3=0;xEnd=x0; }; /*ak je bod[x,0] a klesa*/
if (y1<0) { t1=sqrt((2*y0*m)/fabs(Fy-Fg));t3=tmax=0; vy=((Fy-Fg)/m)*t1; vx=(Fx/m)*t1;
v3=sqrt(vx*vx+vy*vy);};
if(Fy<=Fg) {maxX=x0;maxY=y0;}; /*ak Fy<=Fg max_vyska=[x0,y0]*/
/*------------------------------ VYPIS ---------------------------------------*/
printf("Bod na ktory z pociatocneho bodu: %2.2lf m, %2.2lf m posobila\n",x0,y0);
printf("na drahe 0.5 metra sila ktorej x-ova zlozka bola %2.2lf N",Fx);
printf(" a y-ova %2.2lf N\n",Fy);
printf("mal hmotnost %2.2lf kg pri tiazovom zrychleni %2.2lf m/(s*s)\n",m,g);
printf("sa spraval nasledovne:\n\n");
if(what & 1)
printf("Bod dosiahol najvyssiu vysku v bode[%2.2lf,%2.2lf] m\n",maxX,maxY);
if(what & 2) printf("Suradnice miesta dopadu:[%2.2lf,0.00] m\n",xEnd);
if(what & 4) printf("Dopadol za cas %2.2lf sekund\n",t1+tmax+t3);
if(what & 8) printf("Rychlost dopadu bola %2.2lf m/s\n",v3);
return 0;
}