30/09/2018, 16:57

[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 << "
1. Nhap danh sach chiec xe va danh sach cac chuyen di";
                cout << "
2. Tinh thanh tien moi chuyen di";

                cout << "
0.Exit";
    
                cout << "
Moi 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

... viết 19:09 ngày 30/09/2018
//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
}
AnNdth viết 18:59 ngày 30/09/2018

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 .

AnNdth viết 19:02 ngày 30/09/2018

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

Thành Phạm viết 19:00 ngày 30/09/2018

Bạn không post toàn bộ code nên hơi khó test
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

stackoverflow.com
jstacy00

Character counting program infinite loop

c++, infinite-loop
asked by jstacy00 on 02:57AM - 05 Feb 14

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

Sáng Béo viết 19:03 ngày 30/09/2018

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.

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: }

AnNdth viết 19:07 ngày 30/09/2018
    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

Thành Phạm viết 19:11 ngày 30/09/2018

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

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á

AnNdth viết 19:02 ngày 30/09/2018

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

Thành Phạm viết 19:00 ngày 30/09/2018

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ự

Green viết 19:09 ngày 30/09/2018

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);
Bài liên quan
0