Fakultet elektrotehnike, strojarstva i brodogradnje Sveucilista u Splitu Studij racunarstva Kolegij: Programiranje 1 Sk.god. 2004/2005 Student:_______________________________________________ DOMACI RAD - VJEZBA 6 1. Kratko opisite a) Vrste pohrane (engl. storage class) podataka u memoriji racunala b) Automatske varijable c) Vanjske varijable d) Staticke varijable e) Svrhu zaglavnih dokumenata (engl. header file). Jesu li nuzni? 2. Za program, napisan u dva odvojena dokumenta, dodati prototipove funkcija: a) PRVI DOKUMENT: main() { double x, y, z; ... z = F1 (x, y); ... } DRUGI DOKUMENT: double F1 (double a, double b) { ... } b) PRVI DOKUMENT: main() { double x, y, z; ... z = F1 (x, y); ... } DRUGI DOKUMENT: double F1 (double a, double b) { double c; c = F2 (a, b); ... } static double F2 (double a, double b) { ... } 3. Program iz primjera P_062 preraditi tako da odredjuje minimum promatrane funkcije. Odrediti minimum funkcije 1 + sin(x) u podrucju od Pi/2 do Pi (Pi = 3.14159) 4. Izraditi program za PRIBLIZNO izracunavanje povrsine omedjene funkcijom f(x) i tockama A i B na osi x. Rad programa provjeriti na funkciji y = x*x*x ("x na trecu"), u podrucju od x=1 do x=4. UPUTA: 1. Promatrano podrucje, od A do B, podijeliti na n tocaka (npr. n=10) 2. Za svaku tocku moze se izracunati pripadni iznos funkcije (izracun iznosa promatrane funkcije vrsiti posebnom funkcijom, kao u primjeru P_062). Tako se dobiju parovi (x1, y1), (x2, y2), ..., (xn, yn), gdje su: x1 = A i xn = B. 3. n tocaka dijeli cijelo podrucje (od A do B) na (n-1) potpodrucja, svako sirine h = (B-A)/(n-1). 4. Trazena povrsina ispod krivulje moze se priblizno izracunati ako se stvarna ploha podijeli na niz trapeza, svaki omedjen tockama x[i], x[i+1] i iznosima funkcija y[i] i y[i+1]; indeks i ide od 1 do (n-1). 5. Zbrajanjem povrsina trapeza slijedi konacna formula: A = ( y1 + 2*y2 + 2*y3 + 2*y4 + ... + 2*y[n-1] + y[n] )*h/2 Zavrseni program primijeniti tri puta. Prvi put neka je n = 16, drugi put n = 61, a treci n = 301. S porastom broja n raste tocnost procjene povrsine. Tocan iznos povrsine je 63.75 ---------------------------------------------------------------------- ODGOVORI / RJESENJA ---------------------------------------------------------------------- 1.) a) Vrste pohrane (engl. storage class) podataka u memoriji racunala su auto,extern,static,register. b) Automatske varijable, su lokalne varijable, njihovo podrucje djelovanja je funkcija ili blok naredbi u kojima su deklarirane. c) Vanjske varijable,su globalne varijable, definiraju se izvan svih funkcija. Podrucje djelovanja globalnih varijabli su dijelovi programa i funkcija ciji se izvori kod nalazi u datoteci u kojoj su globalne varijable definirane. d) Staticke varijable se dijele na lokalne i globalne statičke varijable. Sadržaj statičkih varijabli nije zapisan u stogu, i ne gubi se završetkom funkcije. e) Svrhu zaglavnih dokumenata (engl. header file). Jesu li nuzni? Header filovi, npr: stdio.h; nisu nuzni,ali u njima su definirani prototipovi raz. funkcija, te time ubrzavaju,olaksavaju rad. ************************************************************************ 2.) a) extern double F1 (double a, double b); main() { double x, y, z; ... z = F1 (x, y); ... } b) extern double F1 (double a, double b); extern static double F2 (double a, double b); main() { double x, y, z; ... z = F1 (x, y); ... } ************************************************************************ 3.) #include #include // Konstanta #define TOL 0.0001 #define PI 3.14159 // Prototipovi funkcija void Suzavanje_podrucja ( void ); double Funkcija ( double ); // Prijava (globalnih) varijabli double A=(PI)/2, B=PI, Xl, Xd, Yl, Yd; // Glavna funkcija main() { // Prijava varijabli double Xmin, Ymin; // Unos podataka printf ("Donja granica A =%.5lf",A); printf ("Gornja granica B =%.5lf",B); // Suzavanje podrucja do Suzavanje_podrucja(); while ( (Yl != Yd) && ((B - A) > 3*TOL) ); // Rezultati Xmin = 0.5*(Xl + Xd); Ymin = Funkcija ( Xmin ); printf ("\nXmin = %8.6lf Ymin = %8.6lf", Xmin, Ymin); return 0; } // Funkcija Suzavanje_podrucja void Suzavanje_podrucja ( void ) { // Pokusne tocke Xl = 0.5*(A + B) - 0.5*TOL; Xd = Xl + TOL; // Iznosi funkcija u pokusnim tockama Yl = Funkcija ( Xl ); Yd = Funkcija ( Xd ); // Minimum u lijevom dijelu? if ( Yl < Yd ) { B = Xd; return; } // Minimum u desnom dijelu? if ( Yl > Yd ) A = Xl; return; } // Funkcija Funkcija double Funkcija ( double x ) { return ( 1 + sin(x) ); } ****************************************************************************** 4.) # include double funk (double); //Deklaracija funkcije main () { double A,B,h,y,z; int i; double povrsina=0; int n; puts("Unesi donju granicu:"); //A -donja granica scanf("%lf",&A); puts("Unesi gornju granicu:"); //B- gornja granica scanf("%lf",&B); printf ("Unesi broj intervala na koje ce biti podijeljen interval od %.3lf do %.3lf:\n",A,B); scanf("%d",&n); //Na koliko dijelova dijeli zadani interval h=(double)(B-A)/n; z=(h/2.0)*(funk(A)+funk(B)); for(i=1;i\n\t=%lf\n",A,B,z); return 0; } double funk (double x) { return (x*x*x); }