Hỏi cách viết Menu trong C++ không bị lỗi vòng lặp vô hạn?

Em có làm 1 Menu như sau:

    //Biến dùng để lựa chọn Menu
        int c, c1;
        string tt="y";
    
        //----------------- MENU -------------------
        do
        {
            do
            {
                cout << "\n1. Nhap danh sach chiec xe va danh sach cac chuyen di";
                cout << "\n2. Tinh thanh tien moi chuyen di";

                cout << "\n0.Exit";
    
                cout << "\nMoi ban nhap lua chon: ";
                cin >> c;
    
                //Báo lỗi khi nhập sai
                if (c != 0 && c != 1 && c != 2)
                    cout << "Ban da nhap sai. Moi ban nhap lai!!!";
    
            } while (c != 0 && c != 1 && c != 2);
            
            switch (c)
            {
    
                //1. Nhap danh sach chiec xe va danh sach cac chuyen di
            case 1:
            {
                    taxi.XuatTinhTienCd();
                    break;
        }//Kết thúc câu 1
}

Nếu e cố tình nhập vào chữ thì nó sẽ chạy một vòng lặp vô hạn.
Vậy cho e hỏi có cách nào khắc phục vấn đề này không ạ?
Em cám ơn nhiều :wink:

//Biến dùng để lựa chọn Menu
        int c, c1;
        string tt="y";

        //----------------- MENU -------------------
        do
        {
            do
            {
                cout << "\n1. Nhap danh sach chiec xe va danh sach cac chuyen di";
                cout << "\n2. Tinh thanh tien moi chuyen di";

                cout << "\n0.Exit";
    
                cout << "\nMoi ban nhap lua chon: ";
                cin.ignore(); //Thử thêm dòng này xem có được không?
                cin >> c;
    
                //Báo lỗi khi nhập sai
                if (c != 0 && c != 1 && c != 2)
                    cout << "Ban da nhap sai. Moi ban nhap lai!!!";
    
            } while (c != 0 && c != 1 && c != 2);
            
            switch (c)
            {
    
                //1. Nhap danh sach chiec xe va danh sach cac chuyen di
            case 1:
            {
                    taxi.XuatTinhTienCd();
                    break;
        }//Kết thúc câu 1
}
1 Like

Không đc bạn. Cái này theo mình nghĩ là vì mình khai báo biến c và c1 là int mà mình lại cố tình sử dụng kiểu ký tự nên nó lỗi :frowning: .

A @ltd có thể giúp e phần này k ạ?

Bạn không post toàn bộ code nên hơi khó test :blush:
Mình sửa code một chút thì thấy chạy bình thường, không bị lặp vô hạn

#include <iostream>

using namespace std;

int main()
{

//Biến dùng để lựa chọn Menu
    int c, c1;
    string tt="y";

    //----------------- MENU -------------------
            do
        {
            cout << "\n1. Nhap danh sach chiec xe va danh sach cac chuyen di";
            cout << "\n2. Tinh thanh tien moi chuyen di";

            cout << "\n0.Exit";

            cout << "\nMoi ban nhap lua chon: ";
            cin >> c;

            //Báo lỗi khi nhập sai
            if (c != 0 && c != 1 && c != 2)
                cout << "Ban da nhap sai. Moi ban nhap lai!!!";

        } while (c != 0 && c != 1 && c != 2);

        switch (c)
        {

            //1. Nhap danh sach chiec xe va danh sach cac chuyen di
            case 1:
                {
                        //taxi.XuatTinhTienCd();
                        cout << "1\n";
                        break;
                }//Kết thúc câu 1

            case 2:
                {
                    cout << "2\n";
                    break;
                }
            case 0:
            {
                cout << "0\n";
                break;
            }

            default:
                {
                    cout << "Khong dung\n";
                    break;
                }
        }


}

Nếu không được bạn có thể thử 2 link này xem

https://www.google.com/search?q=cout+infinitive+loop+C%2B%2B&oq=cout+infinitive+loop+C%2B%2B&gs_l=serp.3..30i10.33025.34108.0.34363.4.4.0.0.0.0.217.407.0j1j1.2.0.msedr...0...1c.1.64.serp..2.2.405.rKI8a4jSx_I

2 Likes

cái này bạn thử đặt fflush(stdin); trước cin>>c; thử xem.
mà hình như đoạn code trên thiếu 1 cái đóng ngoặc này: } :smile:

1 Like
    TaxiList taxi;

    //Biến dùng để lựa chọn Menu
    int c, c1;
    string tt;

    //----------------- MENU -------------------
    do
    {
        do
        {
            cout << "\n------------------------------- QUAN LY XE TAXI -------------------------------\n\n";
            cout << "\n1. Nhap danh sach chiec xe va danh sach cac chuyen di";
            cout << "\n2. Tinh thanh tien moi chuyen di";
            cout << "\n3. Tinh tong so tien trong cac chuyen di cua tai xe co ten nhap tu ban phim";
            cout << "\n4. Xuat danh sach ra man hinh";
            cout << "\n5. Xuat danh sach ra File";
            cout << "\n6. Tim so xe X (X duoc nhap vao)";
            cout << "\n7. Dem so luong xe tung loai";
            cout << "\n8. Cho biet xe nao co so km di nhieu nhat";
            cout << "\n9. Cho biet tai xe co so tien cua cac chuyen di nhieu nhat";
            cout << "\n10. Cho biet thong tin chuyen di co so km lon nhat";
            cout << "\n11. Sap xep tang dan theo so xe";
            cout << "\n12. Voi moi loai xe cho biet xe nao duoc chay nhieu nhat (so Km nhieu nhat)";

            cout << "\n0.Exit";

            cout << "\nMoi ban nhap lua chon: ";
            cin >> c;

            //Báo lỗi khi nhập sai
            if (c != 0 && c != 1 && c != 2 && c != 3 && c != 4 && c != 5 && c != 6 && c != 7
                && c != 8 && c != 9 && c != 10 && c != 11 && c != 12)
                cout << "Ban da nhap sai. Moi ban nhap lai!!!";

        } while (c != 0 && c != 1 && c != 2 && c != 3 && c != 4 && c != 5 && c != 6 && c != 7
            && c != 8 && c != 9 && c != 10 && c != 11 && c != 12);


        switch (c)
        {

            //1. Nhap danh sach chiec xe va danh sach cac chuyen di
        case 1:
        {
                  do
                  {
                      cout << "\n\t1. Nhap thong tin xe";
                      cout << "\n\t2. Nhap thong tin chuyen di";
                      cout << "\n\t0. Tro ve Menu";

                      cout << "\n\t*** Moi ban nhap lua chon: ";
                      cin >> c1;


                      switch (c1)
                      {
                          //1. Nhap thong tin xe
                      case 1:
                      {
                                do
                                {
                                    taxi.NhapDsXe();
                                    cout << "\nBan co muon tiep tuc nhap Y: ";
                                    cin >> tt;
                                } while (tt == "Y" || tt == "y");
                                break;
                      }

                          //2. Nhap thong tin chuyen di
                      case 2:
                      {
                                do
                                {
                                    taxi.NhapDsChuyenDi();
                                    cout << "\nBan co muon tiep tuc nhap Y: ";
                                    cin >> tt;
                                } while (tt == "Y" || tt == "y");
                                break;
                      }
                      }

                  } while (c1 != 0);
                  break;
        }//Kết thúc câu 1
            //2.Tính thành tiền mỗi chuyến đi
        case 2:
        {
                    taxi.XuatTinhTienCd();
                    break;
        }//Kết thúc câu 2

        case 3:
        {
                    taxi.TaiXeTinhTien();
                    break;
        }//Kết thúc câu 3

            //4. Xuất danh sách ra màn hình
        case 4:
        {
                    taxi.XuatDs();
                    break;
        }//Kết thúc câu 4.

            //5. Xuất danh sácch ra file
        case 5:
        {
                  do
                  {
                      cout << "\n\t1. Luu File";
                      cout << "\n\t2. Xuat File";
                      cout << "\n\t0. Tro ve Menu";

                      cout << "\n\t*** Moi ban nhap lua chon: ";
                      cin >> c1;


                      switch (c1)
                      {
                          //1. Nhap thong tin xe
                      case 1:
                      {
                                taxi.LuuFile();
                                break;
                      }

                          //2. Nhap thong tin chuyen di
                      case 2:
                      {
                                taxi.XuatFile();
                                break;
                      }
                      }

                  } while (c1 != 0);
                  break;
        }//Kết thúc câu 5

            //6. Tìm xe có số xe X (X được nhập vào)
        case 6:
        {
                    taxi.TimSoXeX();
                    break;
        }//Kết thúc câu 6

            //7. Đếm số lượng xe theo từng loại.
        case 7:
        {
                    taxi.DemSoLuongXe();
                    break;
        }//Kết thúc câu 7

            //8. Cho biết xe nào có số km đi nhiều nhất.
        case 8:
        {
                    taxi.XeCoKmMax();
                    break;
        }//Kết thúc câu 8

            //9. Cho biết tài xế nào lái xe có số tiền của các chuyến đi nhiều nhất.
        case 9:
        {
                    taxi.TaiXeTienMax();
                    break;
        }//Kết thúc câu 9

            //10. Cho biết thông tin chuyến đi có số km lớn nhất (số xe, loại xe, tên tài xế, số km, thành tiền).
        case 10:
        {
                     taxi.ThongTinCdKmMax();
                     break;
        }//Kết thúc câu 10

            //11.Sắp xếp danh sách tăng dần theo số xe.
        case 11:
        {
                     taxi.SapXepTangSoXe();
                     break;
        }//Kết thúc câu 11

            //12. Với mỗi loại xe, cho biết xe nào được chạy nhiều nhất (số km nhiều nhất).
        case 12:
        {
                     taxi.LoaiXeKmMax();
                     break;
        }//Kết thúc câu 12

        case 0:
        {
                  break;
        }
        default: cout << "Ban da nhap sai. Moi nhap lai!!!";
            break;
        }
    } while (c != 0);

    //_getch();
    return 0;
}

Đây là toàn bộ đoạn code của mình. Mình đã sửa theo mọi người chỉ nhưng vẫn không đc :frowning:

1 Like

Quái nhể, mình test thử thấy bình thường mà nhỉ :blush:

lúc mình test mình disable hết mấy dòng có taxi, bạn kiểm tra lại mấy dòng có taxi xem nhá

Bạn nhập vào chữ thì nó hiện ra câu thông báo hay s???

1 Like

Nó chạy như là mình nhập 0, nên nếu trong case 0: mình thêm dòng in “some text” thì nó sẽ in “some text” khi nhập kí tự

1 Like

Bạn thử code này nha

int c=-1, c1;
    //string tt="y";

    //----------------- MENU -------------------
        do
        {
            cout << "\n1. Nhap danh sach chiec xe va danh sach cac chuyen di";
            cout << "\n2. Tinh thanh tien moi chuyen di";

            cout << "\n0.Exit";
    
            cout << "\nMoi ban nhap lua chon: ";
            cin >> c;
    
           //Báo lỗi khi nhập sai
           /*if (c != 1 && c != 2)
				cout << "Ban da nhap sai. Moi ban nhap lai!!!\n";*/
		
			switch (c)
   {
				//1. Nhap danh sach chiec xe va danh sach cac chuyen di
				case 1:
				{
						//taxi.XuatTinhTienCd();
						break;
				}//Kết thúc câu 1
			}
	
		}
		while(c!=0);
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?