01/10/2018, 11:05

Không thể nhập tiếp năm sinh và điểm trung bình sau khi nhập tên sinh viên

[Từ chương trình quản lý sv]. Đến đoạn nhập tên sinh viên thì chương trình bỗng dừng lại không cho thực hiện tiếp việc nhập năm sinh và điểm trung bình. cho mình hỏi là sai chỗ nào ở đoạn code này vậy
    #include<iostream>
    #include<string>
    #include<sstream>
    using namespace std;
    struct sinhvien{
    	string hoten;
    	int namsinh;
    	float diemtb;
    }sv[500];
    void nhap(){
    	int m;
    	string mystr;
    	cout<<"nhap so hoc sinh can nhap: ";
    	cin>>m;
    	cout<< "nhap ttsv: ";
    	for(int i=0;i<m;i++){
    		cout<< "
ho ten sinh vien: ";
    		getline(cin,sv[i].hoten);
    		cout<< "nam sinh: ";
    		getline(cin,mystr);
    		stringstream(mystr)>>sv[i].namsinh;
    		cout<< "diem trung binh: ";
    		getline(cin,mystr);
    		stringstream(mystr)>>sv[i].diemtb;
    	}
    }
    int main(){
    	nhap();
    	return 0;
    }
HK boy viết 13:08 ngày 01/10/2018

m là cái gì hả bạn???

tran luong viết 13:20 ngày 01/10/2018

m là số sv cần nhập

HK boy viết 13:07 ngày 01/10/2018

Cái quan trọng là bạn đã khai báo m đâu?

tran luong viết 13:08 ngày 01/10/2018

t khai báo rồi nhưng mà viết thiếu thôi

tran luong viết 13:14 ngày 01/10/2018

t vừa sửa lại rồi mà

HK boy viết 13:06 ngày 01/10/2018

Nếu bạn đọc xâu sv[i].hoten có dấu cách, hãy dùng getline. Khi bạn nhập string có dấu cách, C++ sẽ hiểu là các từ các nhau và nhập vào các biến đằng sau. Tỉ dụ như

nhap so sinh vien: 3
nhap ttsv:
ho ten sinh vien: me me me  // đây là 3 từ -> 'me' đầu tiên vào sv[i].hoten,
// 'me' thứ 2 vào sv[i].namsinh,
// 'me' thứ 3 vào sv[i].diemtb
// và tất nhiên 2 'me' sau không thể nhập vào .namsinh và .diemtb được
nam sinh: diem trung binh:  // trôi lệnh...
ho ten sinh vien: nam sinh: diem trung binh:
ho ten sinh vien: nam sinh: diem trung binh:
Lương Thế Hải viết 13:09 ngày 01/10/2018

Mình không nhớ là trong C++ có kiểu này

struct sinhvien{
	string hoten;
	int namsinh;
	float diemtb;
}sv[500];
tran luong viết 13:15 ngày 01/10/2018

tớ dùng getline rồi vẫn bị như vậy. có phải cú pháp là: getline(cin,sv[i].hoten) không

HK boy viết 13:20 ngày 01/10/2018

có phải cú pháp là: getline(cin,sv[i].hoten) không

Đúng rồi…

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

Mình không biết bạn biên dịch bằng IDE nào mà nó vẫn pass được (nên thay IDE khác, hoặc config lại)
Bạn chưa khai báo thư viện cho lớp string

<cstring> là của C để xử lí char, không liên quan gì đến string của C++
ref: http://www.cplusplus.com/reference/cstring/
C++ là <string>

struct của C++ cũng không khai báo thế kia, như @53k41iga nói

tran luong viết 13:21 ngày 01/10/2018

vậy bạn thử đi xem có được k. t không làm được

tran luong viết 13:15 ngày 01/10/2018

vậy khai báo struct kiểu gì bạn

Lương Thế Hải viết 13:17 ngày 01/10/2018

Bạn nên khai báo tách bạch ra. Một cái khai báo kiểu dữ liệu, một cái khai báo mảng sv

Dark.Hades viết 13:18 ngày 01/10/2018

Lỗi của bạn là do bạn chưa #include <string>

Khai báo struct nó không khác gì bạn khai báo các biến thông thường.
Lập trình C++ thì nên viết rõ ràng, đừng gộp hết vào như C, nhìn rất …

struct sinhvien
{
  // ...
};

sinhvien sv[500];
tran luong viết 13:17 ngày 01/10/2018

t vẫn chưa hiểu bạn ơi

HK boy viết 13:21 ngày 01/10/2018

Code sau khi sửa tất cả những thứ râu ria bên cạnh:

#include <iostream>
#include <string>
using namespace std;

struct sinhvien{
	string hoten;
	int namsinh;
	float diemtb;
};

sinhvien sv[500];

void nhap(){
    int m;
	cout<<"nhap so sinh vien: ";
	cin>>m;
	cin.ignore();
	cout<< "nhap ttsv: ";
	for(int i=0;i<m;i++){
		cout<< "\nho ten sinh vien: ";
		getline(cin, sv[i].hoten);
		cout<< "nam sinh: ";
		cin>>sv[i].namsinh;
		cout<< "diem trung binh: ";
		cin>>sv[i].diemtb;
		cin.ignore();
	}
	for(int i=0; i<m; i++) cout << sv[i].hoten << " | " << sv[i].namsinh << " | " << sv[i].diemtb << endl;
}

int main(){
	nhap();
	return 0;
}

Thêm cin.ignore() là ngon ngay.

Bonus ảnh demo:

tran luong viết 13:10 ngày 01/10/2018

ok. cảm ơn bạn. nhưng mình muốn hỏi thêm là sao lại dùng cin.ignore()

HK boy viết 13:20 ngày 01/10/2018

Khi bạn nhập m, kiểu gì cũng có 1 kí tự endline ở cuối dòng nhập m. Kiểu như

nhap so sinh vien: 4\n // 4 là giá trị của m, nhưng còn dư 1 kí tự endline
// do bạn đã nhấn enter

Do vậy, dấu \n sẽ bị đọc vào sv[i].hoten. Khi in ra sv[i].hoten, kết quả là rỗng.
1 cách dễ nhớ, đọc số xong mà phải đọc string ở dòng dưới thì tốt nhất dùng cin.ignore().

Đọc thêm: link

tran luong viết 13:18 ngày 01/10/2018

hey joe, i think it’s not as you said. my basic learning about c++ generally is very well

tran luong viết 13:20 ngày 01/10/2018

ok bạn.giờ mình hiểu rồi:heart_eyes:

Bài liên quan
0