01/10/2018, 10:27

Làm thế nào để vòng lặp vẫn chạy đúng nếu biến được nhập không đúng định dạng trước đó?

em có làm một bài tập trong khóa c++ free của anh Đạt, viết code rồi chạy thử, em nhập biến ‘‘id’’ dưới dạng chữ thì chương trình lặp liên tục dòng "Ban da nhap sai ID, hay nhap lai: ". Bây giờ em muốn nó dừng lại để nhập tiếp dữ liệu thì làm như nào ạ?

#include <iostream>
#include <cmath>
#include <ctime>
#include <cstdlib>

using namespace std;

int main()
{
	const int ID = 123;
	const int password = 123456;

	int id, password1;

	cout << "Nhap ID: "; cin >> id; cout << endl;

	do
	{
		cout << "Ban da nhap sai ID, hay nhap lai: ";
		cin >> id;
		cout << endl;
	} while (ID != id);

	cout << "Nhap password: "; cin >> password1; cout << endl;

	do
	{
		cout << "Ban da nhap sai password, hay nhap lai: ";
		cin >> password1;
		cout << endl;
	} while (password != password1);

	cout << "Welcome to my world!" << endl;

	
	system("pause");
	return 0;

}
Phong Triệu viết 12:27 ngày 01/10/2018

bác viết hộ e câu lệnh của hàm được không ạ?

Dark.Hades viết 12:35 ngày 01/10/2018

Dùng std::string sẽ giúp chương trình an toàn khi chạy, kiểm tra thì dùng std::stoi(id)

id chỉ nhận giá trị int cho nên khi người dùng nhập giá trị khác int cũng như bạn khai báo int id = "string" => chương trình bị crash

Henry viết 12:28 ngày 01/10/2018

Đọc chưa rõ đề, tưởng ID chỉ có 1 số

Phong Triệu viết 12:37 ngày 01/10/2018

hàm stoi là chuyển từ dạng string sang int rồi bác ơi, cái em muốn là kiểm tra xem dữ liệu nhập vào là số hay chữ, nếu là chữ thì sẽ lặp lại để người dùng nhập đúng. Như em làm theo cách của bác Grak-T thì chương trình nó vẫn bị sai. Đây là code của e sau khi thêm lệnh, bác check hộ em xem có đúng ko nhé

#include <iostream>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <stdio.h>
#include <ctype.h>
using namespace std;


int main()
{
	const int ID = 123;
	const int password = 123456;


	int id, password1;

	cout << "Nhap ID: "; cin >> id; cout << endl;
	
	do
	{
		if (isdigit(id))
		{
			cout << "Ban da nhap sai ID, hay nhap lai: ";
			cin >> id;
			cout << endl;
		}
		else
		{
			cout << "Ban phai nhap so, khong phai ky tu! Hay nhap lai: ";
			cin >> id;
			cout << endl;
		}
	} while (ID != id);

	cout << "Nhap password: "; cin >> password1; cout << endl;

	do
	{
		cout << "Ban da nhap sai password, hay nhap lai: ";
		cin >> password1;
		cout << endl;
	} while (password != password1);

	cout << "Welcome to my world!" << endl;

	
	system("pause");
	return 0;

}
Henry viết 12:28 ngày 01/10/2018

hay là bạn thử dùng hàm isdigit check từng kí tự cái mới nhận được vào xem.

Dark.Hades viết 12:34 ngày 01/10/2018

Hàm isdigit đúng với tên của nó, nó chỉ kiểm tra 1 kí tự 0-9, nếu có là 10, 32, … thì cũng trả về false

Vì code của bạn chỉ muốn kiểm tra là số hay không nên có thể sử dụng code của C:

int num;
char term;
if(scanf("%d%c", &num, &term) != 2 || term != ‘\n’)
printf(“failure\n”);
else
printf(“valid integer followed by enter key\n”);

Phong Triệu viết 12:31 ngày 01/10/2018

bác có cách nào khác ko e đang học c++ lại lồng c vào thấy hơi phức tạp ạ

Dark.Hades viết 12:28 ngày 01/10/2018

Chương trình của bạn vì muốn phức tạp nên mình khuyên dùng std::string

  • std::string s khi dùng operator [] sẽ trả về 1 char
  • Tạo 1 vòng for duyệt từ phần tử 0 đến s.size() nếu isdigit(s[i]) === false thì chạy while bắt nhập lại tiếp.

Thuật của mình hơi chuối

rogp10 viết 12:38 ngày 01/10/2018

Có thể dùng cin.good() chứ đừng dùng cái này trong C++.

Phong Triệu viết 12:30 ngày 01/10/2018

Ai giúp em giải quyết vấn đề này với

Henry viết 12:38 ngày 01/10/2018

Viết một hàm thử xem

int checkValidID(char id[])
{
	int len = strlen(id);
	int i; // for counting
	for (i = 0; i < len; i++)
		if (!(isdigit(id[i])))   // nếu không phải là một chữ số
			return 0;
	return 1;
}
Bài liên quan
0