Sau khi xem xét lại, em thấy sai 2 cái cơ bản, mà rất quan trong, thứ nhất là ở cái kq thì viết thành qk( sai chính tả) thứ 2, cú pháp cin.getline cho kiểu char thiếu giới hạn ( cin.getline(kq->hoten,20) code sửa lại đây!
Code:
#include<iostream.h> #include<conio.h> #include<string.h> #include<iomanip.h> struct DATE { int day, month, year; }; struct Sinhvien { char hoten[35]; DATE ns; float diem; Sinhvien* tiep; }; Sinhvien* dau=NULL,*cuoi=NULL; Sinhvien* cur=NULL; int sosv=0; Sinhvien* Nhap1sv() { Sinhvien *kq = new Sinhvien[1]; cout<<"\n Sinh vien thu",sosv+1; cout<<" Ho ten="; cin.getline(kq->hoten,20); cout<<"Ns="; cin>>kq->ns.day>>kq->ns.month>>kq->ns.year; cout<<"Diem="; cin>>kq->diem; cin.ignore(); kq->tiep=NULL; return kq; } void Bosung() { cur = Nhap1sv(); if (sosv==0) {dau=cuoi=cur;} else {cuoi->tiep=cur; cuoi=cur;} sosv++; } void Chentruoc(int n) { cur = Nhap1sv(); if(sosv==0) { dau=cuoi=cur; sosv++; return; } if (sosv==1||n==1) { cur->tiep=dau; dau=cur; sosv++;return; } Sinhvien* truoc, *sau; truoc=dau; sau=dau->tiep; for (int i=1;i<n-1;i++) truoc=truoc->tiep; sau=truoc->tiep; truoc->tiep=cur; cur->tiep=sau; sosv++; } void Chensau(int n) { cur=Nhap1sv(); if(sosv==0||sosv<n) { dau=cuoi=cur; sosv++; return; } Sinhvien *truoc, *sau; truoc=dau; sau=dau->tiep; for (int i=1;i<n;i++) truoc=truoc->tiep; sau=truoc->tiep; truoc->tiep=cur; cur->tiep=sau; sosv++; } void Xoa(int n) { if(sosv==1&&n==1) { delete dau; dau=cuoi=NULL; sosv--; return; } if (n==1) { cur=dau; dau=cur->tiep; delete cur; sosv--; return; } Sinhvien *truoc, *sau; truoc = dau; sau=dau->tiep; for (int i=1; i<n-1;i++) truoc=truoc->tiep; cur=truoc->tiep; sau=cur->tiep; truoc->tiep=sau; delete cur; sosv--; } void Taods() { int tiep=1; while (tiep) { Bosung(); cout<<"Tiep(0/1)?"; cin>>tiep; } } void Inds() { cur = dau; int i=1; while (cur!=NULL) { cout<<"\n Sinh vien thu"<<i<<"....\n"; cout<<"Hoten:"<<cur->hoten; cout<<"Ngay sinh"<<cur->ns.day<<"/"<<cur->ns.month<<"/"<<cur->ns.year; cout<<"Diem:"<<cur->diem; cur=cur->tiep; i++; } } void main() { clrscr(); Taods(); Inds(); getch(); }
Uhm ! đúng anh ạ ! vì cái cin.ignore(); kia kìa ! nó lại như ngày trước ... để như kiểu Kiên thì sẽ lỗi khi nhập từ sinh viên thứ 2 & ...++ !
+ Nhưng nếu để như thế này không lỗi nhưng lại phải ENTER để tiếp tục chương trình ! (Lỗi anh em mình ngày xưa @.@)
Code:
Sinhvien *kq = new Sinhvien[1]; cin.ignore(); cout<<"Nhap thong tin sinh vien :\n"; cout<<" Ho ten="; cin.getline(kq->hoten,20); ............
+ Để như thế này cũng không lỗi khi nhập từ sinh viên thứ 2 trở đi nhưng lại mất chữ cái đầu tiên của sinh viên thứ nhất : (Lỗi giống anh em mình hối trước ! h0h0 )
Code:
Sinhvien *kq = new Sinhvien[1]; cout<<"Nhap thong tin sinh vien :\n";
cout<<" Ho ten="; cin.ignore(); cin.getline(kq->hoten,20); .................
................ + thử với cin.ígnore(0); và cin.ignore(1) cho kết quả tương tự ! anh sửa đi nhé ... giờ em đi chơi đã ! hihi
Đã khắc phục điều đó. các bạn xem và cho ý kiến! Code sửa
Code:
Sinhvien *Nhap1sv() { Sinhvien *kq = new Sinhvien[0]; cout<<"\n Sinh vien thu"<<sosv;//,sosv+1; cout<<"\n Ho ten="; gets(kq->hoten); //thay cin.getline() bang gets! cout<<"\nNs="; cin>>kq->ns.day>>kq->ns.month>>kq->ns.year; cout<<"\nDiem="; cin>>kq->diem; cin.ignore(); kq->tiep=NULL; return kq; }
sau khi sửa cú pháp cin.getline() bằng gets. Việc nhập họ tên sinh viên không bị lỗi như trước nữa, cho ý kiến nha! Còn cái yêu cầu tìm kiếm in ra những sinh viên trúng tuyển nữa, phát triển tiếp nha!
nếu không dùng hàm gets, anh cũng vẫn có thể dùng cin.getline() nhưng trước khi khai báo tên, anh cho thêm vào cái cin.ignore() nhé. nó khắc phục được lỗi này. đọc thêm vào link này nhé[You must be registered and logged in to see this link.]