Kiểm tra giá trị nhập vào có phải là một số hay không C++

Chào mọi người, em hiện tại là SV CNTT năm 1. em đang học lập trình căn bản với C++. Nhưng do mê code nên em tự học thêm online. Hiện tại em đang gặp vấn đề với chương trình của mình ở chỗ kiểu dữ liệu nhập từ người dùng. Với 1 biến em khai báo kiểu int hoặc float nhưng khi chạy, người dùng nhập chữ hoặc ký tự dẫn đến sai kiểu dữ liệu yêu cầu và gặp lỗi lặp vô tận. Như trên tiêu đề, em muốn nhờ mọi người hướng dẫn em cách xét kiểu dữ liệu giá trị nhập vào (nhập 1 số bất kì không giới hạn chữ số, VD nhập sai: 45f36K# ) có đúng là số hay chưa, nếu sai thì bắt nhập lại. Đây là code của em:

#include <iostream>
#include <math.h>
#include <string>
#include <conio.h>
#include<fstream>
using namespace std;

float a1, b1, c1, d1, a2, b2, c2, d2, a3, b3, c3, d3, D, Dx, Dy, Dz;
string t, a;
int f=0, d;
ofstream taofile("He phuong trinh.txt"); 
/*Ham ofstream cho phep tao ham con "taofile()" va tao file txt.
Neu chuong trinh duoc khoi chay thi se tu dong xoa file txt cu va tao file txt moi.
Voi lenh nay, file "He phuong trinh.txt" duoc luu truc tiep tai noi chua file "*.exe" cua chuong trinh nay.*/
int main(){
	    cout<<"                                            Created by Nguyen Hung Cuong\n";
    cout<<"========================================================================================================================\n";
	    cout<<"Hello. Toi la GHPT2.3B1\n";
	    cout<<"Ban ten gi?\n";
	    getline(std::cin,t); //Nhan toan bo chuoi ke ca khoang trang.
	    taofile<<"Nguoi thuc hien: "<<t<<".\n";
	    cout<<"Chao "<<t<<".\n";
	    cout<<"Toi duoc tao ra de giai he phuong trinh bac nhat '2 an' va '3 an'.\n";
	    cout<<"Ban muon toi giai khong?\n"<<"yes/no\n";
	    cin>>a;
	    while ((a!="yes")&&(a!="no"))
    {
    cout<<"Chi tra loi yes hoac no. Khong viet hoa.\n"<<"yes/no\n";
    cin>>a;
}
	    if (a=="yes")
	    cout<<"Bay gio bat dau thoi.\n";
	    while (a == "yes") //Lap lai cho toi khi nguoi dung khong muon lam tiep.
	    {
	    cout<<"Ban muon giai he phuong trinh nao?\n";
	    cout<<"2 an: 2\n"<<"3 an: 3\n";
	    cout<<"2 or 3: ";
	    cin>>d;
	    if (d==2) { //Chon he 2 an.
    	    cout<<"Bat dau giai he phuong trinh bac nhat 2 an.\n";
    	    cout<<"He phuong trinh co dang:\n"<<"a1x + b1y = c1\n"<<"a2x + b2y = c2\n"; f++;
    	    taofile<<"\nBai "<<f<<": "<<"He phuong trinh 2 an:\n"<<"a1x + b1y = c1\n"<<"a2x + b2y = c2\n\n";
    	    cout<<"Nhap a1: \n";
    	    cin>>a1;
    	    taofile<<"a1 = "<<a1<<"; ";
    	    cout<<"Nhap b1: \n";
    	    cin>>b1;
    	    taofile<<"b1 = "<<b1<<"; ";
    	    cout<<"Nhap c1: \n";
    	    cin>>c1;
    	    taofile<<"c1 = "<<c1<<"\n";
    	    cout<<"Nhap a2: \n";
    	    cin>>a2;
    	    taofile<<"a2 = "<<a2<<"; ";
    	    cout<<"Nhap b2: \n";
    	    cin>>b2;
    	    taofile<<"b2 = "<<b2<<"; ";
    	    cout<<"Nhap c2: \n";
    	    cin>>c2;
    	    taofile<<"c2 = "<<c2<<"\n\n";
    	    D  = a1*b2-a2*b1;
    	    Dx = c1*b2-c2*b1;
    	    Dy = a1*c2-a2*c1;
    	    //Dinh thuc ma tran vuong cap 2.
	     if ( D==0) {
	    	    if (c1==c2){
 	    	    cout<<"He phuong trinh vo so nghiem.\n";
 	    	    taofile<<"He phuong trinh vo so nghiem.\n"<<"************************";
	    	    }
	    	    else {
 	    	    cout<<"He phuong trinh vo nghiem.\n";
 	    	    taofile<<"He phuong trinh vo nghiem.\n"<<"************************";
    	    }
    	    }
    	    else {
    	    cout<<"He phuong trinh co nghiem:\n"<<"x = "<<Dx/D<<"\ny = "<<Dy/D<<"\n";
    	    taofile<<"He phuong trinh co nghiem:\n"<<"x = "<<Dx/D<<"; y = "<<Dy/D<<"\n"<<"************************";
    	    }
	    }
	    else if (d==3){ //Chon he 3 an
    	    cout<<"Bat dau giai he phuong trinh bac nhat 3 an.\n";
    	    cout<<"He phuong trinh co dang:\n"<<"a1x + b1y + c1z = d1\n"<<"a2x + b2y + c2z = d2\n"<<"a3x + b3y + c3z = d3\n"; f++;
    	    taofile<<"\nBai "<<f<<": "<<"He phuong trinh 3 an:\n"<<"a1x + b1y + c1z = d1\n"<<"a2x + b2y + c2z = d2\n"<<"a3x + b3y + c3z = d3\n\n";
    	    cout<<"Nhap a1: \n";
    	    cin>>a1;
    	    taofile<<"a1 = "<<a1<<"; ";
    	    cout<<"Nhap b1: \n";
    	    cin>>b1;
    	    taofile<<"b1 = "<<b1<<"; ";
    	    cout<<"Nhap c1: \n";
    	    cin>>c1;
    	    taofile<<"c1 = "<<c1<<"; ";
    	    cout<<"Nhap d1: \n";
    	    cin>>d1;
    	    taofile<<"d1 = "<<d1<<"\n";
    	    cout<<"Nhap a2: \n";
    	    cin>>a2;
    	    taofile<<"a2 = "<<a2<<"; ";
    	    cout<<"Nhap b2: \n";
    	    cin>>b2;
    	    taofile<<"b2 = "<<b2<<"; ";
    	    cout<<"Nhap c2: \n";
    	    cin>>c2;
    	    taofile<<"c2 = "<<c2<<"; ";
    	    cout<<"Nhap d2: \n";
    	    cin>>d2;
    	    taofile<<"d2 = "<<d2<<"\n";
    	    cout<<"Nhap a3: \n";
    	    cin>>a3;
    	    taofile<<"a3 = "<<a3<<"; ";
    	    cout<<"Nhap b3: \n";
    	    cin>>b3;
    	    taofile<<"b3 = "<<b3<<"; ";
    	    cout<<"Nhap c3: \n";
    	    cin>>c3;
    	    taofile<<"c3 = "<<c3<<"; ";
    	    cout<<"Nhap d3: \n";
    	    cin>>d3;
    	    taofile<<"d3 = "<<d3<<"\n\n";
    	    D  = a1*b2*c3 + b1*c2*a3 + a2*b3*c1 - c1*b2*a3 - b1*a2*c3 - a1*b3*c2;
    	    Dx = d1*b2*c3 + b1*c2*d3 + d2*b3*c1 - c1*b2*d3 - b1*d2*c3 - c2*b3*d1;
    	    Dy = a1*d2*c3 + d1*c2*a3 + a2*d3*c1 - c1*d2*a3 - d1*a2*c3 - c2*d3*a1;
    	    Dz = a1*b2*d3 + b1*d2*a3 + a2*b3*d1 - d1*b2*a3 - b1*a2*d3 - d2*b3*a1;
    	    //Dinh thuc ma tran vuong cap 3.
    	    if (D==0){
	    	    if ((Dx==0)&&(Dy==0)&&(Dz==0)){
	    	    cout<<"He phuong trinh vo so nghiem.\n";
	    	    taofile<<"He phuong trinh vo so nghiem.\n"<<"************************";
    	    }
	    	    else {

 	    	    cout<<"He phuong trinh vo nghiem.\n";
 	    	    taofile<<"He phuong trinh vo nghiem.\n"<<"************************";
	    	    }
    	    }
    	    else
    	    {
	    	    cout<<"He co nghiem:\n"<<"x = "<<Dx/D<<"\ny = "<<Dy/D<<"\nz = "<<Dz/D<<"\n";
	    	    taofile<<"He phuong trinh co nghiem:\n"<<"x = "<<Dx/D<<"; y = "<<Dy/D<<"; z = "<<Dz/D<<"\n"<<"************************";
	    	    //Dong nay in x, y, z ra man hinh.
    	    }
    	    }
    else cout<<"Chi chon 2 hoac 3.\n"; //Neu nguoi dung chon sai loai bai toan 'chi chon 2 or 3' nhung lai chon khac. Vd: d=0 hoac n
	    cout<<"Tiep tuc khong? \n"<<"yes/no\n";
	    cin>>a; //Tra loi yes chuong trinh se lap lai tu cho chon He phuong trinh.
  while ((a!="yes")&&(a!="no"))
     {
     cout<<"Chi tra loi yes hoac no. Khong viet hoa.\n"<<"yes/no\n";
     cin>>a;
}
	    }
	    {
	    if (f>0)
	    cout<<"Ban da giai "<<f<<" bai toan.\n";
	    else cout<<"Ban chua giai bai toan nao.\n";
	    }
	    if (a=="no") {
    taofile<<"\nBan da giai "<<f<<" bai toan.\n";
    taofile.close();
    if (f>0){
    cout<<"Xem lai tat ca bai giai?\n"<<"yes/no\n";
    cin>>a;
    while ((a!="yes")&&(a!="no"))
    {
    cout<<"Chi tra loi yes hoac no. Khong viet hoa.\n"<<"yes/no\n";
    cin>>a;
}
    if (a=="yes"){
    	    ifstream mofile("He phuong trinh.txt"); //Ham ifstream dung de mo 1 file dong thoi tao ham mofile().
    	    cout<<"\n\n===========================================\n\n";
    	    while (!mofile.eof())  /* eof = end of file.
            	    	    Ham while(!***.eof()) nghia la trong khi chua gap ki tu cuoi cung trong file thi van con tiep tuc doc file.*/ 
{
    char temp[255];
    mofile.getline(temp, 255);     
    string line = temp; //Lay 1 ky tu trong file "He phuong trinh.txt" luu vao bien line.
    cout<<line<<endl; //In du lieu tu bien line ra man hinh.
}
/*Sau khi ket thuc ham "while(!***.eof())" thi ham nay tu dong lap lai cho den khi doc den ky tu cuoi cung cua file.
Dong thoi luu lan luot tung ky tu trong file vao bien line va in tu line ra man hinh.*/
    	    mofile.close();
    }
}
    cout<<"===========================================\n"<<"Cam on "<<t<<". Good bye.\n";
}
    system ("pause"); //Tam dung chuong trinh de xem lai man hinh ket qua.(Muc dich su dung khi chay rieng biet file "*.exe")
}
2 Likes

Người dùng nhập vào là text (string). Khi người dùng nhập dữ liệu, bạn convert sang số, nếu không convert được thì yêu cầu nhập lại.

string inputText;

getline(cin, inputText);
float a1 = stod(inputText);

getline(cin, inputText);
float b1 = stod(inputText)

getline(cin, inputText);
int b1 = stoi(inputText);
1 Like

if(cin.failed()) cout << "So nhap vao khong hop le";

Have a good day friend.

4 Likes

Thanks 2 bạn nhiều. Nó giúp ích được đôi chút rồi.

hàm failed () muc đích để làm gì thế ạ

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