Să se rezolve o ecuaţie de gradul II de forma ax2+bx+c=0, cu coeficienţi numere reale.
Analiza Programului
In vederea realizarii unei rezolvari riguroase, trebuiesc facute niste teste asupra valorilor a, b, c.
Se detecteaza urmatoarele situatii:
– daca a=0, b=0, c=0 avem de-a face cu o ecuatie nedeterminata
– daca a=0, b=0, c diferit de 0 avem de-a face cu o ecuatie imposibila
– daca a=0, b diferit de 0 iar c are orice valoare, avem de-a face cu o ecuatie de gradul I, situatie in care exista o singura solutie x=-c/b
Acestea sunt cazuri particulare care trebuiesc tratate.
– daca a diferit de 0 iar b si c au orice valoare, avem de-a face cu o ecuatie de gradul II, situatie in care se poate trece la calculul lui delta. Urmeaza acum o alta discutie dupa valoarea lui Δ.
Astfel:
– daca delta<0 avem de-a face cu solutii complexe (pe care in aceasta rezolvare nu le vom mai calcula ci vom afisa doar un mesaj)
– daca delta=0 ecuatia are doua solutii egale x1,x2=-b/(2*a)
– daca delta>0 ecuatia are doua solutii diferite:
x1=(-b+radical din delta)/(2*a)
x2=(-b-radical din delta)/(2*a)
Se observa ca pentru rationamentul enuntat mai sus, au fost folosite in program trei instructiuni if-else imbricate (if inclus in alt if) cu ajutorul carora se testeaza valorile lui a, b si c.
Rezolvarea problemei in C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _3 { class Program { static void Main(string[] args) { float a, b, c, dt; double x1, x2; Console.Write("a = "); a = float.Parse(Console.ReadLine()); Console.Write("b = "); b = float.Parse(Console.ReadLine()); Console.Write("c = "); c = float.Parse(Console.ReadLine()); if (a == 0) if (b == 0) if (c == 0) Console.WriteLine("Ec. nedeterminat."); else Console.WriteLine("Ec. imposibila"); else { x1 = -c / b; Console.WriteLine("Ec. de gr. 1 cu x1 = {0}", x1); } else { dt = b * b - 4 * a * c; if (dt < 0) Console.WriteLine("Ec. are solutii complxe"); else { if (dt == 0) { x1 = x2 = -b / (2 * a); Console.WriteLine("x1 = x2 = {0}", x1); } else { x1 = (-b + Math.Sqrt(dt)) / (2 * a); x2 = (-b - Math.Sqrt(dt)) / (2 * a); Console.WriteLine("Solutiile sunt x1 = {0}, x2 = {1}", x1, x2); } } } Console.ReadLine(); } } }
Rezolvarea problemei in C++
//the header conio, which include library functions for performing "console input and output" #include <conio.h> //the header iostream, which supports the C++ I/O system #include <iostream> //tells the compiler to use the std namespace using namespace std; //begin program execution int main() { //declare variables float a, b, c, dt; double x1, x2; //display message on the screen cout<<"Introduceti a:"<<endl; //read from keyboard cin>>a; cout<<"Introduceti b:"<<endl; cin>>b; cout<<"Introduceti c:"<<endl; cin>>c; if(a == 0) if(b == 0) if(c == 0) cout<<"Ecuatie nedeterminata"<<endl; else cout<<"Ecuatie imposibila"<<endl; else { x1 = -b/a; cout<<"Ecuatie de gradul 1 cu solutia x1 = "<<x1<<endl; } else { dt = b*b - 4*a*c; if(dt < 0) cout<<"Ecuatia are solutii complexe"<<endl; else if(dt == 0) { x1 = x2 = -b/2*a; cout<<"x1 = x2 = "<<x1<<endl; } else { x1 = (-b+sqrt(dt))/2*a; x2 = (-b-sqrt(dt))/2*a; cout<<"Solutiile sunt x1 = "<<x1<<" si x2 ="<<x2<<endl; } } //terminates main and return value to the calling process return 0; }
Bogdan says:
Astept cu nerabdare si problemele de backtracking.
zeltera says:
Deocamdata nu sunt planificate astfel de probleme, insa, daca vrei poti propune (si rezolva) tu acest tip de probleme. Am pus o lista cu problemele care au fost sau urmeaza sa fie publicate/rezolvare aici. Lista cuprinde, deocamdata, vre-o 55 de probleme, elementare, insa destul de intalnite la scoala. Aceste rezolvari se adreseaza elevilor in primii ani de studiu – si mai putin avansatilor, pentru care rezolvarea lor nu ar trebui sa fie dificila.
Lucia says:
buna…poti sa rezolvi problema asta si in borland c? si ink ceva…poti sa imi trimiti, pe mail, te rog borland c sau c++ (ca am vazut ca c++ accepta si limbajul c) caci nu il gasesc pe net:(
zeltera says:
Lucia, rezolvarea in borland c nu ar trebui sa fie diferita de rezolvarea in c++ (cu mici adaptari). Din pacate eu nu folosesc borland c, motiv pentru care nu stiu cum ar trebui adaptat codul pentru a trece compilatia acolo.
Daca o sa cauti pe google Borland c o sa gasesti cateva locuri de unde poti downloada un compilator.
matematica says:
dt = b*2 – 4*a*c; nu e corect
conform formulei matematice delta = b^2- 4*a*c deci…
dt = b*b – 4*a*c; sau dt = pow(b,2) – 4*a*c;
zeltera says:
Multumesc pentru semnalarea greselei. Acum corectez.
Cristian says:
// autor Cristian Badescu
/*
Rezolvarea ecuatiei de gradul 2
*/
#include
#include
#include
#include
using namespace std;
void grad1(int b,int c)
{
cout<<"Ecuatie de gradul 1"<<endl;
cout<<"X= "<<float((-c))/(b)<<endl;
}
void grad2(int a,int b,int c)
{
int delta;
delta=b*b-4*a*c;
if(delta<0)
{
cout<<"Ecuatia are solutii complexe!"<<endl;
cout<<"x1= "<<(float (-b)/(2*a))<<"+i*"<<(float (sqrt(abs(delta))))/(2*a)<<endl;
cout<<"x2= "<<(float (-b)/(2*a))<<"-i*"<<(float (sqrt(abs(delta))))/(2*a)<<endl;
}
if(delta==0) cout<<"X1=X2= "<<(-b)/(2*a)<0) {
cout<<"X1= "<<((-b)+sqrt(float (delta)))/(2*a)<<endl;
cout<<"X2= "<<((-b)-sqrt(float (delta)))/(2*a)<<endl;
}
}
int main()
{
cout<<"Forma generala a ecuatiei de gradul doi este: ax^2+bx+c=0"<<endl;
int a,b,c,x1,x2,x;
//Introducere date
cout<>a;
cout<>b;
cout<>c;
cout<0)
if(a==1) cout<<"x^2";else cout<<a<<"x^2";
if(a<0)
if(a==-1)cout<<"-x^2";else cout<<a<0)
if(b==1)cout<<"+x";else cout<<"+"<<b<<"x";
if(b<0)
if(b==-1)cout<<"-x";else cout<<b<<"x";
if(a==0&&b==0)
{
cout<<" nedefinita!"<0)cout<<"+";
cout<<c;
}
}
cout<<"=0"<<endl;
if(a==0)grad1(b,c);
else grad2(a,b,c);
system("PAUSE");
return 0;
}
Dragosh says:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EcuatieGradul2
{
class Program
{
static void Main(string[] args)
{
int a, b, c;
Console.Write(“Introduceti a = “);
a = int.Parse(Console.ReadLine());
Console.Write(“Introduceti b = “);
b = int.Parse(Console.ReadLine());
Console.Write(“Introduceti c = “);
c = int.Parse(Console.ReadLine());
if (a == 0 && b == 0 && c == 0)
{
Console.WriteLine(“\nEcuatie nedeterminata”);
}
else if (a == 0 && b == 0)
{
Console.WriteLine(“\nEcuatie imposibila”);
}
else if (a == 0)
{
double x;
x = (-c) / b;
Console.WriteLine(“\nSolutia este x = {0}”, x);
}
// Pentru cazul cind avem ecuatie de cind b = 0
// Exemplu a*x^2 – 25 = 0
/* else if (b == 0)
{
double __x;
if (c > 0.0)
{
Console.WriteLine(“Nu se extrage radical din numere negative”);
}
else
{
__x = Math.Sqrt((c / a));
Console.WriteLine(“Solutiile sunt x1 = x2 = {0}”, __x);
}
}*/
else
{
double dt, x1, x2, _x;
dt = Math.Pow(b, 2.0) – 4.0 * a * c;
if (dt < 0.0)
{
Console.WriteLine("Delta este mai mic ca 0, ecuatia se rezolva cu numere imaginare");
}
else if (dt == 0.0)
{
_x = (-b) / (2.0 * a);
Console.WriteLine("Solutia este x1 = x2 = ", _x);
}
else
{
x1 = ((-b) – Math.Sqrt(dt)) / (2.0 * a);
x2 = ((-b) + Math.Sqrt(dt)) / (2.0 * a);
Console.WriteLine("Solutile sunt x1 = {0} si x2 = {1} ", x1, x2);
}
}
Console.ReadKey();
}
}
}
dDany says:
Daca b=0 delta mai poate fi posibila?
dDany says:
Ma refer daca b= 0 iar a si c diferite de 0.