C++ code – 123 lines – codepad

/*

Bài 1.

Định dạng trong file SINHVIEN.TXT như sau:

- Dòng đầu tiên là thông tin của 1 sinh viên:

+ Họ tên

+ Mã sinh viên

+ Ngày tháng năm sinh: 1 chuỗi string định dạng dd/mm/yyyy

+ Điểm trung bình học kì

VD:

SINHVIEN.TXT

Nguyen Van Teo, N15DCCN165, 09/06/1997, 9.0

Nguyen Van B, N14DCCN189, 10/07/1996, 8.9

Nguyen Van C, N13DCCN181, 08/09/1995, 9.5

Nguyen Van C, N13DCCN179, 10/12/1995, 8.0

Nguyen Van B, N14DCCN185, 18/10/1995, 9.5

Yêu cầu:

1. Đọc dữ liệu từ file SINHVIEN.TXT

2. Nhập vào tên sinh viên và in ra màn hình thông tin sinh viên có tên trùng với tên cần tìm

3. Ghi thông tin sinh viên có điểm trung bình học kì cao nhất vào file DIEMMAX.TXT

*/

#include<iostream>

using

namespace

std

;

#include<string>

#include<fstream>

// khai báo cấu trúc sinh viên

struct

sinhvien

{

string

hoten

;

string

masv

;

string

namsinh

;

float

Diem_TBHK

;

};

typedef

struct

sinhvien

SINHVIEN

;

// khai báo cấu trúc danh sách sinh viên

struct

danhsach

{

SINHVIEN

*

arr

;

// khai báo con trỏ để quản lí mảng động sinh viên

int

n

;

// số lượng sinh viên hiện có trong danh sách

};

typedef

struct

danhsach

DANHSACH

;

// hàm đọc file - có tác dụng là đọc thông tin 1 thằng sinh viên từ file SINHVIEN.TXT

void

Doc_File_Thong_Tin_Sinh_Vien

(

ifstream

&

filein

,

SINHVIEN

&

sv

)

{

// đọc họ tên sinh viên

getline

(

filein

,

sv

.

hoten

,

','

);

// đọc dữ liệu đến dấu ',' thì dừng - sau đó con trỏ chỉ vị tự động nhảy qua dấu ','

filein

.

seekg

(

1

,

1

);

// dịch con trỏ chỉ vị sang phải 1 byte bắt đầu tại vị trí hiện tại

// đọc mã số sinh viên

getline

(

filein

,

sv

.

masv

,

','

);

filein

.

seekg

(

1

,

1

);

// dịch con trỏ chỉ vị sang phải 1 byte bắt đầu tại vị trí hiện tại

// đọc ngày tháng năm sinh

getline

(

filein

,

sv

.

namsinh

,

','

);

// đọc điểm trung bình học kì của sinh viên

filein

>>

sv

.

Diem_TBHK

;

// tránh cái lỗi dữ liệu bị xuống dòng

string

temp

;

getline

(

filein

,

temp

);

}

// hàm đọc danh sách sinh viên

void

Doc_Danh_Sach_Sinh_Vien

(

ifstream

&

filein

,

DANHSACH

&

ds

)

{

for

(

int

i

=

0

;

i

<

ds

.

n

;

i

++

)

{

// đọc thông tin 1 thằng sinh viên

Doc_File_Thong_Tin_Sinh_Vien

(

filein

,

ds

.

arr

[

i

]);

// đọc thông tin sinh viên thứ i

}

}

// hàm test - xuất thông tin sinh viên

void

Xuat_Thong_Tin

(

SINHVIEN

x

)

{

cout

<<

"

\n

Ho ten:"

<<

x

.

hoten

;

cout

<<

"

\n

Ma so:"

<<

x

.

masv

;

cout

<<

"

\n

Ngay thang nam sinh:"

<<

x

.

namsinh

;

cout

<<

"

\n

Diem trung binh hoc ki:"

<<

x

.

Diem_TBHK

;

}

// hàm test - xuất danh sách sinh viên ra màn hình để xem

void

Xuat_Danh_Sach

(

DANHSACH

ds

)

{

for

(

int

i

=

0

;

i

<

ds

.

n

;

i

++

)

{

cout

<<

"

\n\n\t\t

SINH VIEN THU "

<<

i

+

1

;

Xuat_Thong_Tin

(

ds

.

arr

[

i

]);

}

}

int

main

()

{

// khai báo đối tượng đọc file

ifstream

filein

;

filein

.

open

(

"SINHVIEN.TXT"

,

ios_base

::

in

);

DANHSACH

ds

;

//Doc_File_Thong_Tin_Sinh_Vien(filein, x);

int

dem

=

0

;

// BƯỚC 1: đọc xem trong file SINHVIEN.TXT có bao nhiêu dòng - để cấp phát mảng động

while

(

filein

.

eof

()

==

false

)

{

string

x

;

getline

(

filein

,

x

);

// đọc hết tất cả dữ liệu trên 1 dòng

dem

++

;

}

ds

.

n

=

dem

;

// BƯỚC 2: cấp phát mảng động sinh viên

ds

.

arr

=

new

SINHVIEN

[

ds

.

n

];

// BƯỚC 3: cho con trỏ chỉ vị chạy về đầu file

filein

.

seekg

(

0

,

0

);

// dịch con trỏ chỉ vị về đầu file

// BƯỚC 4: đọc danh sách sinh viên

Doc_Danh_Sach_Sinh_Vien

(

filein

,

ds

);

Xuat_Danh_Sach

(

ds

);

filein

.

close

();

delete

[]

ds

.

arr

;

// giải phóng bộ nhớ cho con trỏ

system

(

"pause"

);

return

0

;

}