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;
}