Waňov web

PB071 - 5. cvicenie

Vrh hmotného bodu v ideálnych podmienkach

Zadanie:

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:

Poziadavky:

Poznámky:


Riešenie:


vrh.c
#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;
}