Nên dùng câu điều kiện If-else đầy đủ hay chỉ dùng If?

Em mới học C++ đang làm vài bài tập trên 1 web và thấy cách giải họ rất khác, phức tạp hơn. Mọi người cho em hỏi code như em thì có vấn đề gì cho sau này ko ạ?

3

Đây là lời giải của em.

Bài tập

Cửa hàng của bạn nhận gửi bán sản phẩm cho một công ty khác và sau mỗi tháng bạn cần tính toán số tiền hoa hồng bạn nhận được. Với mức hoa hồng theo doanh số bán hàng như sau:

5% nếu tổng doanh số nhỏ hơn hoặc bằng 100 triệu.

10% nếu tổng doanh số nhỏ hơn hoặc bằng 300 triệu.

20 % nếu tổng doanh số là lớn hơn 300 triệu.

Dựa vào dữ liệu trên, bạn viết chương trình C++ để tính hoa hồng đại lý bạn sẽ nhận được.

Bạn vui lòng đăng code dưới dạng text lên DNH theo hướng dẫn tại đây:

Bạn sửa ngay vào topic của bạn nhé.

3 Likes
  1. mục đích cuối cùng của code thì cũng chỉ là để giải quyết vấn đề. chỉ cần giải quyết được vấn đề là đúng
  2. bài tập bạn làm chỉ là một cái gì đó đơn giản, chẳng thể đánh giá được cái gì gọi là code hay code dỡ hay đại khái là vấn đề gì cả. Ví dụ như bạn đi học, chỗ học cách nhà có 100m, nên bạn đi bộ, hay đi xe đạp hay đi xe máy đều được cả. Khi trường học của bạn cách nhà 5km, 10km, 20km thì lúc đó mới phát sinh vấn đề là đi bộ sẽ khó khăn, đi xe đạp thì đỡ mệt hơn, đi xe máy thì khỏe hơn. Khi vấn đề lớn thì mới có thể so sánh giải pháp, còn bài tập nho nhỏ thì nghĩ nhiều làm gì
4 Likes

Code của bạn ko được tối ưu thôi

// Trường hợp 1
if (cond) {
// block
} else {
// block
}
// Trường hợp 2
if (cond1) {
// block
}  else if (cond2) {
// block
}
// Trường hợp 3
if (cond1) {
// block
} else if (cond2) {
// block
}  else  {
// block
}  

Cả 3 trường hợp này thì chỉ DUY NHẤT 1 block của code thỏa điều kiện được execute và sẽ bỏ qua không kiểm tra các điều kiện tiếp theo (cho dù các điều kiện tiếp theo vẫn thỏa).

Còn trường hợp các câu if riêng lẻ thì điều kiện nào cũng phải kiểm tra và chỉ cần thỏa điều kiện là block code đc execute.

Ví dụ:

int n = 0;
if (n < 5) { // Điều kiện này được kiểm tra
  n = 5; // Đoạn code này sẽ chạy
} else if (n < 10) { // Điều kiện này trình biên dịch sẽ bỏ qua không kiểm tra
  n = 10; // Đoạn code này sẽ không được chạy dù n vẫn < 10
}
std::cout << "Ket qua: " << n << "\n"; // n sẽ bằng 5

int m = 0;
if (m < 5) { // Điều kiện này được kiểm tra
  m = 5; // Đoạn code này sẽ chạy
}

if (n < 10) { // Điều kiện này cũng được kiểm tra
  m = 10; // Đoạn code này cũng sẽ chạy
}
std::cout << "Ket qua: " << m << "\n"; // m sẽ bằng 10
3 Likes

@Cuong_Pham1: if hay if-else gì cũng được, quan trọng là cách bạn thể hiện được flow của chương trình một cách rõ ràng, code dễ đọc - dễ hiểu là được.

@utherpally: Mình không nghĩ việc sử dụng if-else lại làm ảnh hưởng đến việc tối ưu như vậy ( trong trường hợp này các điều kiện đều rất đơn giản).

1 Like

@sbgssol Nhưng nếu mình yêu cầu bạn tối ưu bạn sẽ biết chứ? Mình nghĩ là bạn biết, còn chủ thớt hình như chưa hiểu về cách if - else hoạt động như thế nào nên chắc mới đặt câu hỏi như thế này. Mời bạn xem lại câu hỏi (tiêu đề) của chủ thớt cho rõ ý nhé.

Cách dùng if-else trong ảnh 1 code chặt hơn, biến m so sánh điều kiện tối thiểu 1 lần là ra kết qua nếu nó rơi vào trường hợp đầu tiên. Nếu biến m có 1 trăm cái điều kiện thì nó sẽ dừng tại đoạn điều kiện phù hợp (có thể dừng tại đoạn giữa của “cây” if-else dài ngoằn này).
Còn cách của bạn code một loạt các đoạn if riêng lẻ thì biến m sẽ bị xét tất cả các điều kiện của các câu lệnh if còn lại mặc dù nó đã thoả mãn câu lệnh if đầu tiên rồi.
Mình vẫn chưa tìm ra user case trong thực tế phải dùng một loạt if(){}, if(){}, if(){}, ngang cấp nhau để xét cùng một biến… Mong được các cao nhân chỉ giáo :pray::bowing_man:

2 Likes

Bạn tránh sử dụng else là điều tốt đấy, nó giúp bạn luyện suy nghĩ trình tự rõ ràng từng cái if , từng điều kiện, và flow của code. Nhưng cũng vì thế, bạn sẽ tốn nhiều thời gian để fix bug khi chưa quen đấy.

Update
Đề này của bạn cho điều kiện không chặt chẽ.

10% nếu tổng doanh số nhỏ hơn hoặc bằng 300 triệu.

Nếu đúng theo kiểu này thì có thể hiểu là 50 triệu cũng nhỏ hơn 300 triệu vậy. Để đúng đắn hơn, mình có thế hiểu rằng nó điều kiện:
10% nếu tổng doanh lớn hơn 100 triệu và nhỏ hơn hoặc bằng 300 triệu

#include <stdio.h>

int main()
{
    const float tramTrieu = 10e7f;
    float doanhSo;
    float hoaHong;
    
    printf("Doanh số tháng này : \n");
    scanf("%f", &doanhSo);
    
    if(doanhSo <= 1*tramTrieu) {
        hoaHong = doanhSo * 0.05;
    }

    if(doanhSo > 1*tramTrieu && doanhSo <= 3*tramTrieu) {
        hoaHong = doanhSo * 0.1;        }
    }
    
    if(doanhSo > 3*tramTrieu) {
        hoaHong = doanhSo * 0.2;
    }
    
    printf("Hoa hồng: %f", hoaHong);
}

3 Likes

Ở code chỉ dùng if, vd m = 50 sẽ được nhận hoa hồng của cả 2 trường hợp <= 100 triệu và <= 300 triệu luôn. Mình nghĩ đáng lẽ chỉ vào case <= 100 triệu thôi chứ :face_with_monocle:

2 Likes

(post withdrawn by author, will be automatically deleted in 24 hours unless flagged)

nếu if (...) { ...; return ...; } thì xài ngang cấp nhau được mà

ví dụ như bài này tách ra 1 hàm float hoaHong(float doanhSo) thì xài if ngang cấp được:

double hoaHong(double doanhSo) {
    if (doanhSo <= 100) return doanhSo * 5 / 100;
    if (doanhSo <= 300) return doanhSo * 10 / 100;
    return doanhSo * 20 / 100;
}
7 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?