Giải pháp nào có thể thay thế cho nhiều do while?

{
int M1,M2,M3,M4,M5;
Khối lệnh
//M1,2,3…=Môn học có điểm từ 0-10.
cout<<"M1: "; cin>>M1;
cout<<"M2: "; cin>>M2;
cout<<"M3: "; cin>>M3;
cout<<"M4: "; cin>>M4;
cout<<"M5: "; cin>>M5;
}
cho mình hỏi làm thế nào để không cần dùng nhiều do while (5 môn chắc phải dùng 5 lần) mà khi nhập sai m1,m2 or m3… máy sẽ thông báo kiểu như:
M1=7
M2=-3
Nhập sai
M2=…
Mình cảm ơn.

viết ra 1 cái hàm riêng rồi gọi hàm đó…

http://rextester.com/OXQ3232

#include <iostream>
#include <string>

template <class T, class UnaryFunction>
void extract_until(std::istream& in, T& value,
                   UnaryFunction isValidValue,
                   std::ostream& err, const std::string& errMsg)
{
    while (1)
    {
        if (in >> value)
        {
            if (isValidValue(value)) break;
            err << errMsg;
        }
        else
        {
            in.clear();
            in.ignore(100, '\n');
        }
    }
}

bool isNonNegative(int n)
{
    return n >= 0;
}

int main()
{
    int m1, m2, m3;
    extract_until(std::cin, m1, isNonNegative, std::cout, "Nhập sai\n");
    extract_until(std::cin, m2, isNonNegative, std::cout, "Nhập sai\n");
    extract_until(std::cin, m3, isNonNegative, std::cout, "Nhập sai\n");
    //C++11
    //extract_until(std::cin, m1, [](int n){ return n >= 0; }, std::cout, "Nhập sai\n");
    //extract_until(std::cin, m2, [](int n){ return n >= 0; }, std::cout, "Nhập sai\n");
    //extract_until(std::cin, m3, [](int n){ return n >= 0; }, std::cout, "Nhập sai\n");
    std::cout << "m1 = " << m1 << "\n";
    std::cout << "m2 = " << m2 << "\n";
    std::cout << "m3 = " << m3 << "\n";
}
3 Likes

Bạn đã học hàm chưa? Nếu học rồi thì có thể tách nó ra thành 1 hàm và sử dụng.

2 Likes

Mình đã học hàm rồi nhưng thực chưa sâu như bạn. Cảm ơn bạn.^^

Em thấy không dùng doWhile thì chỉ biết dùng While , For thôi :3 , mấy cách trên dùng hàm thực chất cũng là lệnh While . Còn nếu không dùng vòng lặp thì dùng Đệ qui, cách này còn tệ hơn =)) , anh cứ tra trên mạng Đê qui là kiểu gì cũng có một nùi =))

Cảm ơn bạn đã cho lời khuyên.

Thực ra ý thớt là ngại code lặp chứ ko phải là ko dùng do while.

2 Likes

bạn hiểu ý mình nhất ^^
mình muốn tối ưu code. Mong được chỉ bảo.

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