Cerința
Dându-se o ecuaţie de gradul 2, să se scrie un program care determină soluţiile acestei ecuaţii.
Date de intrare
Fișierul de intrare ecuatii.in
conține pe prima linie un şir de caractere de forma ax^2+bx+c
, reprezentând o ecuaţie de gradul 2: \(\scriptsize ax^2+bx+c=0\)
Date de ieșire
Fișierul de ieșire ecuatii.out
va conține soluţiile acestei ecuaţii, cu 2 zecimale exacte, sperate printr-un spaţiu. Dacă ecuaţia nu are soluţii reale, se va afişa -1
. Dacă ecuaţia are o singură soluţie reală, se va afişa numai aceasta, cu 2 zecimale exacte.
Restricții și precizări
a, b, c ∈ [-10
3
, 10
3
]
,a≠0
- Dacă valorile
a
şib
nu sunt precizate (ex:x^2+x+1=0
), acestea vor fi egale cu1
sau-1
, în funcţie de semn (vedeţi exemplele) - Dacă ecuaţia are 2 soluţii reale, se va afişa cea mai mică, urmată de cea mai mare
Exemple:
|
ecuatii.in |
ecuatii.out |
ecuaţie |
1 | 3x^2-x-4 |
-1.00 1.33 |
\(\scriptsize 3x^2-x-4=0\) |
2 | x^2-8x+16 |
4.00 |
\(\scriptsize x^2-8×+16=0\) |
3 | -x^2-8x+16 |
-9.66 1.66 |
\(\scriptsize -x^2-8×+16=0\) |
4 | 3x^2-x+0 |
0.00 0.33 |
\(\scriptsize 3x^2-x=0\) |
5 | 4x^2+x+16 |
-1 |
\(\scriptsize 4x^2+x+16=0\) |
6 | x^2+0x-4 |
-2.00 2.00 |
\(\scriptsize x^2-4=0\) |
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema ecuatii_grad_2:
// o posibila solutie pentru problema ecuatii_grad_2 #1458 @pbinfo
// programul poate fi imbunatatit
// compilat cu Code::Blocks 13.12
#include <cstring> // strlen, strcpy
#include <cmath> // sqrt
#include <cstdio> // scanf, printf cu numar definit de zecimale
#include <cstdlib> // atoi
double min(double a, double b) {
return (a > b) ? b : a;
}
double max(double a, double b) {
return (a > b) ? a : b;
}
//------------------------------------------------------------------------------------------------------------
// determinam coeficientul (de tip int) din sierul initial (de tip char*)
// verificare=1 se foloseste la a si b, unde sirInitial poate contine doar '+' (sau nu contine nimic) pentru 1 si '-' pentru -1
int determinare(char sirInitial[], int verificare=1) {
int lungime = strlen(sirInitial);
if(verificare) {
if( lungime == 0 )
return 1;
if( lungime == 1 && sirInitial[0] == '-' )
return -1;
}
if(lungime == 1 && sirInitial[0] == '+')
return 1;
return atoi(sirInitial);
}
//------------------------------------------------------------------------------------------------------------
// ecuatie[] este de forma "ax^2+bx+c", asa ca atribuim variabilelor a, b, c, transmise prin referinta, valorile aferente
void separare(char ecuatie[], int &a, int &b, int &c) {
int lungime = strlen(ecuatie), lungimeCoeficienti[3] = {0}, pozitie = 0;
char coeficienti[3][100]; // coeficienti[0] -> a, coeficient[1] -> b, coeficienti[2] -> c
while( ecuatie[pozitie] != 'x' ) // separare sir a
coeficienti[0][ lungimeCoeficienti[0]++ ] = ecuatie[pozitie++];
coeficienti[0][ lungimeCoeficienti[0] ] = '\0';
pozitie += 3;
while( ecuatie[pozitie] != 'x' ) // separare sir b
coeficienti[1][ lungimeCoeficienti[1]++ ] = ecuatie[pozitie++];
coeficienti[1][ lungimeCoeficienti[1] ] = '\0';
pozitie += 1;
while( pozitie < lungime ) // separare sir c
coeficienti[2][ lungimeCoeficienti[2]++ ] = ecuatie[pozitie++];
coeficienti[2][lungimeCoeficienti[2]] = '\0';
a = determinare(coeficienti[0]);
b = determinare(coeficienti[1]);
c = determinare(coeficienti[2], 0);
}
//------------------------------------------------------------------------------------------------------------
// Programul principal (citirea ecuatiei din fisier, separarea coeficientilor, determinarea rezultatului)
int main(void) {
freopen("ecuatii.in", "r", stdin);
freopen("ecuatii.out", "w", stdout);
char ecuatie[100];
int a, b, c;
gets(ecuatie);
separare(ecuatie, a, b, c);
// solutiile reale ale ecuatiei
double x1, x2;
// afisarea solutiilor
int delta = b * b - 4 * a * c;
if( delta < 0 )
printf("-1"); // ecuatia nu are solutie
else if(delta == 0) // ecuatia are o singura solutie
printf("%.2f", (double) (-b) / (2 * a));
else { // ecuatia are doua solutii -> o afisam pe cea mai mica, urmata de cea mai mare
double radDelta = sqrt(delta);
x1 = (-b + radDelta) / (2*a);
x2 = (-b - radDelta) / (2*a);
printf("%.2f %.2f", min(x1, x2), max(x1, x2));
}
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #1458 ecuatii_grad_2
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1458 ecuatii_grad_2 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!