Viéte formulák

Adottak egy másodfokú egyenlet a, x1, x2 paraméterei (vezéregyüttható és a két gyök). Írjunk programot, amely meghatározza a, b és c együtthatókat a Viéte-formulák segítségével, és írjuk ki a teljes másodfokú egyenletet!

A megoldásért kattints ide!

A program írása a fejlesztőkörnyezet elindítása előtt kezdődik: először megértjük a feladatot, és nagyvonalakban felvázoljuk a megoldást.
Ezestben a feladat nem bonyolult, a Viéte-formulák képlete:
 b=-a*(x1+x2), c= a*x1*x2

Ezek után hozzáláthatunk a programíráshoz. Hasonlóan a legtöbb feladathoz, itt is van adatbekérés és adatkiírás (angolul input/output, rövidítve I/O), ezért a C szabványos I/O könyvtárát (angolul standard I/O) be kell építenünk a programunkba. Ezt az stdio.h állomány beépítésével tudjuk megtenni:

#include<stdio.h>

Ezek után programunk használhatja a printf és scanf könyvtári függvényeket (lásd később).

A legtöbb C program egy speciális nevű függvénnyel, a main ("fő") függvénnyel kezdődik. Amikor elindítjuk a programot, akkor annak végrehajtása a main függvény elején fog elkezdődni.

int main()
{


A main függvény elején meg kell mondanunk, hogy milyen változókat szeretnénk megadni. A változó nagyon hasonlít a matematikai képletekben található betűkre: a betűk tetszőleges számot jelentenek. Amikor használjuk a képletet, akkor behelyettesítjük a számokat, és megkapjuk az eredményt.
A programozásban nagyon hasonló a helyzet: az egyes változóknak a program futása során adunk értéket (a=1). Ugyanakkor a változókat felfoghatjuk tárolóként ("fiók, amelyben számokat, és más adatokat tárolhatunk"). Amikor a változót változtatjuk, új értéket teszünk a fiókba (pl. a=1). A változó új értékének kiszámolásában szerepelhet a változó előző értéke: az a=a+1 érvényes, és megnöveli a értékét eggyel.
Esetünkben a képletből következnek a változók: a, b, c, x1, x2. Ezek közül a, x1 és x2 értékét a program felhasználójától kérjük be, a többit a fenti képlet alapján számoljuk. A matematikai képletekben meg kell mondanunk, hogy az egyes betűk milyen számot jelenthetnek: esetünkben mindegyik a valós számok halmazának eleme. Ezt a C nyelvben a double típus jeleníti meg, így változóink típusa is ez lesz:

double a,b,c, x1,x2;

A következő lépés az a, x1 és x2 értékének bekérése a felhasználótól. Az adatbekérés két lépésben történik. Először kiírjuk a felhasználónak, hogy milyen adatot várunk tőle. Másodszor bekérjük az adatot, és egy változóba töltjük.
A kiírást a printf függvény végzi:
printf("A vezeregyutthato: ");
A beolvasást a scanf függvény valósítja meg:
scanf("%lf", &a);
Itt az idézőjelek között egy formátumsztring szerepel, amely megadja, hogy milyen típust szeretnénk beolvasni. A double típushoz a %lf formátumsztring tartozik. A formátumsztring után egy & jelet írunk, amelyet annak a változónak a neve követ, amelyikbe be szeretnénk tölteni a felhasználó által megadott értéket.

Ezután kiszámoljuk a b és a c értékét:

b= -a*(x1+x2);
c= a*x1*x2;


Végül pedig kiírjuk az eredményt:

printf("%lfx^2%lfx%lf\n", a,b,c);

 
A printf az idézőjelben megjelenő karakterek közül mindent kiír, kivéve a formátumsztringeket és a \n-et. A formátumsztringeket balról jobbra a paraméterként megadott változóval helyettesíti (az első %lf-et a-val a másodikat b-vel, és így tovább).

Az egész program az alábbi:

#include<stdio.h>

 

int main()

{

      double a,b,c, x1,x2;

      printf("A vezeregyutthato: ");
      scanf("%lf", &a);
 

      printf("Egyik gyok: ");
      scanf("%lf", &x1);
 

      printf("Masik gyok: ");
      scanf("%lf", &x2);
 

      b= -a*(x1+x2);
      c= a*x1*x2;

      printf("%lfx^2+%lfx+%lf\n", a,b,c);

      return 0;
}

 

A program egy futásának a képernyője az alábbi:
A vezeregyutthato: 1
Egyik gyok: 2
Masik gyok: 3
1.000000x^2+-5.000000x+6.000000

 

A programnak két szépséghibája van: két tizedes jegyre is elég lenne a megoldás, valamint a + és a – jel egymás után nem mutat jól. Mindkét probléma megoldható a formátumsztring módosításával: a %.2lf két tizedes jegyet ír csak ki, míg a %+.2lf akkor is kiírja az előjelet, ha a szám pozitív. Így a kiírás az alábbi:

printf("%.2lfx^2%+.2lfx%+.2lf\n", a,b,c);


Most már a programunk futása is szebb:

A vezeregyutthato: 1
Egyik gyok: 2
Masik gyok: 3
1.00x^2-5.00x+6.00

 

Azonban a feladattal még nem vagyunk készen, hiszen nem teszteltük le. Ennek egy módja lehetne, hogy papíron kiszámolunk néhány értéket, és ellenőrizzük, hogy jó értéket ad-e. Ugyanakkor programok esetén ezt nem mindig egyszerű kivitelezni, ezért általában az ellenőrzést is programsorokkal végezzük, kockáztatva azt, hogy az ellenőrző programsorokban is véthetünk hibát. Példánkat a két gyök behelyettesítésével teszteljük:

printf("Ellenorzes: %.2lf\n", a*x1*x1+b*x1+c);
printf("Ellenorzes: %.2lf\n", a*x2*x2+b*x2+c);

 

Sikeres futás esetén mindkét gyök behelyettesítésének nullát kell adnia. Tesztelve a programunkat számos bemeneti értékhármasra, az ellenőrzést nullát ad. Az egyik teszt azonban furcsa eredményt ad:
 

A vezeregyutthato: -5
Egyik gyok: 2.3
Masik gyok: +9
-5.00x^2+56.50x-103.50
Ellenorzes: -0.00
Ellenorzes: 0.00

Az eredmény: -0.0. Ez azért van, mert a számítógép által végzett számolások függenek attól, hogy a számítógép hogy tárolja az adatot. Ezt hívják numerikus pontatlanságnak. A fenti -0.0 nagyon sok tizedes jegyre nulla, de az utolsó tizedes jegyekre már nem pontos. A legtöbbször a numerikus pontatlanság nem jelent problémát, bizonyos helyzetekben azonban oda kell rá figyelnünk.

Mivel a program leendő felhasználója vélhetően nem kíváncsi a tesztünkre, viszont későbbi hibajavítás esetén szükséges lehet, ezért nem kitöröljük, hanem megjegyzésjelek (/* */) közé rakjuk. A megjegyzést a fordító figyelmen kívül hagyja. Vagyis a végső megoldásunk az alábbi:

 

#include<stdio.h>

 

int main()

{
      double a,b,c, x1,x2;
 

      printf("A vezeregyutthato: ");
      scanf("%lf", &a);

 
      printf("Egyik gyok: ");
      scanf("%lf", &x1);

 
      printf("Masik gyok: ");
      scanf("%lf", &x2);

 
      b= -a*(x1+x2);
      c= a*x1*x2;

      printf("%.2lfx^2%+.2lfx%+.2lf\n", a,b,c);

/*
      printf("Ellenorzes: %lf\n", a*x1*x1+b*x1+c);
      printf("Ellenorzes: %lf\n", a*x2*x2+b*x2+c);
*/

      return 0;
}




2007.08.28. 12:07:54 |  Permalink  |  Hozzászólások száma: 0  |  Tárgyszavak: Alapelemek


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások