Giải phương trình bậc nhất và bậc hai (Có xử lý ngoại lệ đầu vào)

Bài toán cần xử lý

Viết chương trình giải phương trình bậc nhất và phương trình bậc hai với các hệ số được nhập từ file input và kết quả được xuất ra file output (Có xử lý ngoại lệ đầu vào)

Học thức phải có

  • Hàm input() và hàm print()
  • Kết cấu rẽ nhánh trong Python
  • Biến và kiểu dữ liệu
  • Xử lý ngoại lệ (Exception Handling)

Định dạng đầu vào

Gồm hai dòng:

  • Dòng đầu tiên chứa số 1 hoặc 2 tương ứng với:
    • Tính năng 1: giải phương trình bậc nhất
    • Tính năng 2: giải phương trình bậc hai
  • Dòng thứ hai chứa hệ số tùy thuộc vào vào tính năng được chọn ở dòng 1:
    • Tính năng 1: chứa hai số α, ɓ lần lượt là hệ số của phương trình ax + ɓ = 0, các hệ số cách nhau bởi khoảng trắng.
    • Tính năng 2: chứa ba số α, ɓ, ¢ lần lượt là hệ số của phương trình ax2 + bx + ¢ = 0, các hệ số cách nhau bởi khoảng trắng.

Định dạng đầu ra

Gồm nhiều dòng hiển thị tùy thuộc các trường hợp như sau:

Nếu phương trình vô nghiệm: Phuong trinh vo nghiem

Nếu phương trình có vô số nghiệm: Phuong trinh co vo so nghiem

Nếu phương trình có một nghiệm duy nhất: Phuong trinh co mot nghiem duy nhat: Ҳ = {x1}

Nếu phương trình có nghiệm kép: Phuong trinh co nghiem kep: x1 = x2 = {x1}

Nếu phương trình có hai nghiem phan biet: Phuong trinh co hai nghiem phan biet: x1 = {x1}

                                                                                                                                                              x2 = {x2}

  • Với {x1}, {x2} là các nghiệm của phương trình

Cảnh báo: 

Nếu dòng đầu tiên khác ‘1’ và ‘2’ thì xuất cảnh báo: Vui long chon mot trong hai chuc nang:

                                                                                                                      1. Giai phuong trinh bac nhat

                                                                                                                      2. Giai phuong trinh bac hai

Nếu file input không tồn tại thì xuất cảnh báo: Khong tim thay file input!

Nếu input nằm ngoài định dạng đầu vào thì xuất cảnh báo:
Dinh dang dau vao khong hop le!

Chẳng hạn:

  • Input 1: Bai2.10.inp
2
3 5 8
  • Output 1: Bai2.10.out
Phuong trinh vo nghiem

  • Input 2: Bai2.10.inp
1

0 0
  • Output 2: Bai2.10.out
Phuong trinh co vo so nghiem

  • Input 3: Bai2.10.inp
1
3 6.8
  • Output 3: Bai2.10.out
Phuong trinh co mot nghiem duy nhat:
Ҳ = -2.2666666666666666

  • Input 4: Bai2.10.inp
2
4 4 1
  • Output 4: Bai2.10.out
Phuong trinh co nghiem kep:
x1 = x2 = -0.5

  • Input 5: Bai2.10.inp
2
-5 6.7 9
  • Output 5: Bai2.10.out
Phuong trinh co hai nghiem phan biet la:
x1 = -0.8296332885075604
x2 = 2.1696332885075607

  • Input 6: Bai2.10.inp
2
kteam 7 8.5 
  • Output 6: Bai2.10.out
Dinh dang dau vao khong hop le!

  • Input 7: Bai2.10.inp
4
1 7 8.5 
  • Output 7: Bai2.10.out
Vui long chon mot trong hai chuc nang:
1. Giai phuong trinh bac nhat
2. Giai phuong trinh bac hai

  • Input 8: File Bai2.10.inp không tồn tại
  • Output 8: Bai2.10.out
Khong tim thay file input!

Đề xuất

  • Sử dụng cấu tạo Xử lý ngoại lệ để xử lý trường hợp file input không tồn tại và input không nằm trong định dạng đầu vào
  • Đặt toàn thể chương trình trong khối try.
  • Sử dụng câu lệnh with với hàm open()
    mode=’r’
    nhằm mở file để đọc.
  • Dùng hàm readline() để đọc dữ liệu dòng đầu tiên từ file input
  • Dùng cấu tạo rẽ nhánh if … else
    để nhận thấy người dùng chọn chứ năng nào

    • Dùng hàm map(), float và hàm split() để nhận và ép kiểu dữ liệu các hệ số của phương trình
    • Tùy thuộc vào tính năng được chọn, xây dựng các câu lệnh rẽ nhánh thích hợp để khắc phục bài toán
    • Nếu dòng đầu tiên của input khác ‘1’ và ‘2’ thì xuất cảnh báo
  • Thuật toán:
  • Giải phương trình bậc nhất:
    • Phương trình vô số nghiệm khi: hệ số α, ɓ đều bằng 0
    • Phương trình vô nghiệm khi: hệ số α bằng 0 và ɓ khác 0
    • Các trường hợp sót lại phương trình có nghiệm duy nhất
  • Giải phương trình bậc hai:
    • Phương trình vô số nghiệm khi: hệ số α, ɓ, ¢ đều bằng 0
    • Phương trình vô nghiệm khi: hệ số α, ɓ bằng 0, ¢ khác 0 và trường hợp delta bé hơn 0
    • Phương trình có nghiệm kép khi delta bằng 0
    • Phương trình có hai nghiệm phân biệt khi delta to hơn 0
  • Lỗi sẽ phát sinh ở lệnh open() nếu file input không tồn tại. Dùng lệnh
    except bắt lỗi FileNotFoundError và xử lý.
  • Lỗi sẽ phát sinh ở lệnh ép kiểu nếu định dạng đầu vào không hợp lệ. Dùng lệnh
    except để bắt lỗi và xử lý.
  • Sử dụng câu lệnh with với hàm open()
    mode=’w’
    nhằm mở file để ghi cảnh báo lỗi
Xem Thêm  Python NumPy Chia - cách chia mảng trong python

Code mẫu

#Import thu vien math de su dung ham sqrt tinh can bac 2
import math

#Khoi lenh co the phat sinh loi
try:   
   #Mo file voi mode='r' de doc file
   with open('Bai2.10.inp', 'r') as fileInp:
       #Doc dong du lieu dau tien tu file
       #Su dung phuong thuc strip de loai bo ky tu xuong dong hay khoang trang
       dongDauTien = fileInp.readline().strip()
      
       #Truong hop 1: Giai phuong trinh bac nhat
       if dongDauTien == '1':
           #Doc dong du lieu thu hai tu file
           dongThuHai = fileInp.readline()
           α, ɓ = map(float, dongThuHai.split())

           #Thuat toan giai phuong trinh bac nhat
           if α == 0:
               if ɓ == 0:
                   thongBao = "Phuong trinh co vo so nghiem"
               else:
                   thongBao = "Phuong trinh vo nghiem"
           else:
               thongBao = "Phuong trinh co mot nghiem duy nhat: nx = {}".format(-b / α)

       #Truong hop 2: Giai phuong trinh bac hai
       elif dongDauTien == '2':
           #Doc dong du lieu thu hai tu file
           dongThuHai = fileInp.readline()
           α, ɓ, ¢ = map(float, dongThuHai.split())
          
           #Thuat toan giai phuong trinh bac hai
           if α == 0:
               if ɓ == 0:
                   if ¢ == 0:
                       thongBao = "Phuong trinh co vo so nghiem"
                   else:
                       thongBao = "Phuong trinh vo nghiem"
               else:
                   thongBao = "Phuong trinh co mot nghiem duy nhat: nx = {}".format(-c / ɓ)
           else:
               #Tinh delta
               delta = ɓ * ɓ - 4 * α * ¢
               #Kiem tra cac truong hop cua delta
               if delta > 0:
                   x1 = float((-b + math.sqrt(delta)) / (2 * α))
                   x2 = float((-b - math.sqrt(delta)) / (2 * α))
                   thongBao = "Phuong trinh co hai nghiem phan biet la: nx1 = {} nx2 = {}".format(x1, x2)
               elif delta == 0:
                   Ҳ = -b / (2 * α)
                   thongBao = "Phuong trinh co nghiem kep: nx1 = x2 = {}".format(Ҳ)
               else:
                   thongBao = "Phuong trinh vo nghiem"

       #Truong hop khong chon dung chuc nang
       else:
           thongBao = "Vui long chon mot trong hai chuc nang:n1. Giai phuong trinh bac nhatn2.Giai phuong trinh bac hai"

#Khoi lenh duoc thuc thi khi xay ra loi "Khong tim thay file input"
except FileNotFoundError:
   thongBao = "Khong tim thay file input!"

#Khoi lenh duoc thuc thi khi xay ra loi "Sai dinh dang dau vao"
except:
   thongBao = "Dinh dang dau vao khong hop le!"

#Mo file voi mode='w' de ghi file
with open('Bai2.10.out', 'w') as fileOut:
   #Xuat thong bao ra file out
   fileOut.write(thongBao)

Tổng kết

Trong bài này, Kteam đã chỉ dẫn bạn cách viết chương trình giải phương trình bậc nhất và phương trình bậc hai với các hệ số được nhập từ file input và kết quả được xuất ra file output (Có xử lý ngoại lệ đầu vào)

Xem Thêm  Mảng JavaScript - đối tượng js với mảng

Ở bài kế tiếp, tất cả chúng ta sẽ cũng nhau học cách viết chương trình HIỂN THỊ 10 SỐ TỰ NHIÊN ĐẦU TIÊN RA MÀN HÌNH TRÊN TỪNG DÒNG.

Cảm ơn các bạn đã theo dõi nội dung. Hãy để lại comment hoặc phản hồi của các bạn để tiến triển nội dung tốt hơn. Đừng quên ”
Luyện tập – Thử Thách – Không ngại khó!

Tải xuống

Project

Nếu việc thực hành theo chỉ dẫn không diễn ra thuận lợi như mong chờ. Bạn cũng có thể tải xuống PROJECT THAM KHẢO ở backlinks bên dưới!

Bàn luận

Nếu bạn có bất kỳ khổ cực hay khúc mắc gì về khóa học, đừng ngần ngại đặt thắc mắc trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để thu được sự suport từ cộng đồng.

Viết một bình luận