{
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.
Giải pháp nào có thể thay thế cho nhiều do while?
viết ra 1 cái hàm riêng rồi gọi hàm đó…
#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.