/* atk1 h6t4 -- 2. asteen yhtälön ratkaisu */ #include #include /* solve ratkaisee annetun 2. asteen yhtälön, joka on muotoa ax^2+bx+c=0. funktiolle annetaan argumentteina kertoimet a, b ja c, sekä osoittimet kahteen reaalilukumuuttujaan, joihin sijoitetaan ratkaisut. funktio antaa palautusarvonaan ratkaisujen lukumäärän (0, 1 tai 2) */ int solve(double a, double b, double c, double* x1, double* x2); main() { double a,b,c,x1=0.0,x2=0.0; int n; a=4.1,b=4.5,c=3; /* huom. jos n=1, niin x2:een ei sijoitetan mitään arvoa ja jos n=0, niin x1 ja x2 jäävät molemmat tyhjiksi */ n = solve(a,b,c,&x1,&x2); switch(n) { case 2: printf("The equation %.1lfx^2+%.1lfx+%.1lf = 0 ",a,b,c); printf("has two solutions:\n"); printf("x1 = %.4lf\nx2 = %.4lf\n",x1,x2); break; case 1: printf("The equation %.1lfx^2+%.1lfx+%.1lf = 0 ",a,b,c); printf("has one solution:\n"); printf("x = %.4lf\n",x1); break; case 0: printf("The equation %.1lfx^2+%.1lfx+%.1lf = 0 ",a,b,c); printf("does not have a solution.\n"); break; default: ; } } int solve(double a, double b, double c, double* x1, double* x2) { /* yhtälön ratkaisuhan on muotoa x = ( -b +/- sqrt( b^2 - 4ac ) ) / (2a) ratkaisujen lukumäärä riippuu diskriminantin D=b^2-4ac merkistä. jos D>0, ratkaisuja on kaksi, jos D==0, on vain yksi ratkaisu, ja jos D<0, yhtälöllä ei ole yhtään reaalista ratkaisua */ int solutions; double D=pow(b,2)-4*a*c; if (D>0) { solutions = 2; *x1 = (-b + sqrt(D))/(2.0*a); *x2 = (-b - sqrt(D))/(2.0*a); } else if (D==0.0) { solutions = 1; *x1 = -b/(2*a); } else { solutions = 0; } /* palautetaan kutsuvalle ohjelmalle yhtälön ratkaisujen lukumäärä */ return solutions; }