Code giải phương trình bậc nhất, bậc 2, bậc 3

Chào mọi người, em học xây dựng nhưng cũng thích lập trình. Em đang tập tành học c++.Em vừa viết code tính phuong trình bậc nhất, bậc hai, bậc 3. Nay em post đoạn code này lên mọi người xem giùm còn chỗ nào thiếu sót không. Cảm ơn

#include <iostream>
#include<cmath>
#include<windows.h>
#define PI 3.1415926535898
using namespace std;
//tinh phuyong trinh bac nhat

void bacnhat(float a,float b)
{
  if (a==0 && b==0)
  {
    cout<<"phuong trinh vo so nghiem"<<endl;
  }
  else if (a==0 && b!=0)
  {
    cout<<"phuong trinh vo nghiem"<<endl;
  }
  else
  {
    cout<<"phuong trinh co nghiem x= "<<-b/a<<endl;
  }
}

//tinh phuyong trinh bac 2
void bachai(float a,float b,float c)
{
  float d,x1,x2;
  if(a==0)
  {
    cout<<"phuong trinh vo nghiem"<<endl;
  }
  else
  {
    d=b * b-4 *a *c;
    if(d<0)
   {
     cout<<"phuong trinh vo nghem"<<endl;
   }
   else if(d==0)
   {
     cout<<"phuong trinh co nghiem kep x1=x2="<<-b/(2*a)<<endl;
   } 
   else
   {
     x1=(-b-sqrt(d))/(2*a);
     x2=(-b+sqrt(d))/(2*a);
     cout<<"phuong trinh co 2 ngiem phan biet:"<<endl;
     cout<<"x1="<<x1<<endl;
     cout<<"x2="<<x2<<endl;
   }
  }
}

// tinh phuong trinh bac 3
void bacba(float a, float b, float c, float d)
{
  float dt,k,x1,x2,x3,x;
  if(a==0)
  {
    cout<<"Phuong trinh vo nghiem"<<endl;
  }
  dt=pow(b,2)-3*a*c;//delta=b*b-3*a*c
  k=(9*a*b*c-2*pow(b,3)-27*pow(a,2)*d)/(2*sqrt(pow(fabs(dt),3)));
  if(dt>0)
  {
    if(fabs(k)<=1)
    {
      x1=(2*sqrt(dt)*cos(acos(k)/3)-b)/(3*a);
      x2=(2*sqrt(dt)*cos(acos(k)/3-(2*PI/3))-b)/(3*a);
      x3=(2*sqrt(dt)*cos(acos(k)/3+(2*PI/3))-b)/(3*a);
      cout<<"phuong trinh co 3 nghiem phan biet:"<<endl;
      cout<<"x1="<<x1<<endl;
      cout<<"x2="<<x2<<endl;
      cout<<"x3="<<x3<<endl;
    }
    if(fabs(k)>1)
    {
      x=((sqrt(dt)*fabs(k))/(3*a*k))*(pow((fabs(k)+sqrt(pow(k,2)-1)),1.0/3)+pow((fabs(k)-sqrt(pow(k,2)-1)),1.0/3))-(b/(3*a));
      cout<<"Phuong trinh co 1 ngiem duy nhat la:"<<x<<endl;
    }
   }
  else if(dt==0)
  {
    x=(-b-pow(-(pow(b,3)-27*a*a*d),1.0/3))/(3*a);//do ham pow khong dung doi so am nen ta phai doi dau.Ct goc:x=(-b+pow(pow(b,3)-27*a*a*d),1.0/3))/(3*a)
    cout<<"Phuong trinh co nghiem boi:"<<x<<endl;
  }
  else
  {
    x=(sqrt(fabs(dt))/(3*a))*(pow((k+sqrt(k*k+1)),1.0/3)-pow(-(k-sqrt(k*k+1)),1.0/3))-(b/(3*a));
    cout<<"phuong trinh co 1 nghiem duy nhat:"<<x<<endl;
  }
}
int main()
{
  float a,b,c,d;
  int chon;
  cout<<"1.Phuong trinh bac nhat:ax+b=0"<<endl;
  cout<<"2.Phuong trinh bac hai:ax^2+bx+c=0"<<endl;
  cout<<"3.Phuong trinh bac hai:ax^3+bx^2+cx+d=0"<<endl;
  cout<<"Hay chon dang phuong trinh bang cach an so tuong ung:";
  cin>>chon;
  switch(chon)
  {
    case 1: //Chon 1 de giai phuong trinh bac 1
    {
      cout<<"Ban da chon phuong trinh bac 1:"<<endl;
      cout<<"nhap a,b:"<<endl;
      cin>>a>>b;
      bacnhat(a,b);
      break;
    }
    case 2: //Chon 2 de giai phuong trinh bac 2
    {
      cout<<"Ban da chon phuong trinh bac 2:"<<endl;
      cout<<"nhap a,b,c:"<<endl;
      cin>>a>>b>>c;
      bachai(a,b,c);
      break;
    }
    case 3: //Chon3 de giai phuong trinh bac 3
    {
      cout<<"Ban da chon phuong trinh bac 3:"<<endl;
      cout<<"nhap a,b,c,d"<<endl;
      cin>>a>>b>>c>>d;
      bacba(a,b,c,d);
      break;
    }
  }
  system("pause");
  return 0;
}
1 Like
  • Căn lại dòng nhé. Như thế này khó nhìn quá.
  • Căn lại dòng đã rồi mình nhìn tiếp.

Hi Trong Lam.
Bạn chú ý CC một chút.
VD:

d=b*b-4*a*c;
d = b * b - 4 * a * c; \\Nên viết.
a==0&&b==0
(a == 0) && (b == 0) \\Nên viết. 

//Thêm tab vào. (Có lẽ là do web hiện thiếu.)
void bacnhat(float a,float b){
    if ((a == 0) && (b == 0)){
        cout<<"phuong trinh vo so nghiem"<<endl;
    }
    else if ((a == 0) && (b != 0)){
        cout<<"phuong trinh vo nghiem"<<endl;
    }
    else{
        cout << "phuong trinh co nghiem x= " << -b / a <<endl;
    }
}

swith casre thi them cai enum hoặc định nghĩa hằng cho nó dễ đọc.

P/S Code không chạy < Code chạy được < Code chạy tốt < Code chạy tốt + Dễ đọc < Code chạy tốt + Dễ đọc + Dễ mở rộng.

1 Like

Cảm ơn đã góp ý, để mình coi lại

cảm ơn đã góp ý lần đầu mình viết còn thiếu sót quá

Hi Trong Lam.
THường thì không mấy tài liệu nhắc vê CC
http://tapchilaptrinh.vn/2012/07/25/coding-conventions-lat-mem-buoc-chat/

1 Like

ở phương trình bậc 2 nếu a == 0 thì phương trình có nghiệm là -c/b chứ bác, còn nếu a == 0 và b == 0 mới là vô nghiệm

Anh mình quên cảm ơn bạn đã góp ý

Uh oh, có người quên định nghĩa về các phương trình đa thức kìa.
Tại sao a=0 vẫn giải được, phải là không giải được khi các biến còn lại ≠ 0 chứ tr.
Nếu và chỉ nếu a=0 và tất cả các biến còn lại cũng =0 thì lúc đó pt mới có Vô Số Nghiệm.
Anh bạn học lập trình mà ko biết cái này à?

KÍNH GỬI Giáo sư Cao Sơn Lộc

Trước khi comment thì để ý thời gian đã nào bạn ơi.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?