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<< "\nho 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;
    }

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

1 Like

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

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

1 Like

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

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

1 Like

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:
1 Like

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

struct sinhvien{
	string hoten;
	int namsinh;
	float diemtb;
}sv[500];
1 Like

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

Đúng rồi…

1 Like

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

2 Likes

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

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

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

1 Like

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];
1 Like

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

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:

2 Likes

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

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

1 Like

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

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