Viết chương trình thao tác trên danh sách sinh viên (có các thông tin Hoten, Maso, Loai, Toan, Ly, DTB) :
+ Nhập / In danh sách sinh viên.
+ Sắp xếp danh sách sinh viên theo thứ tự tăng dần của điểm trung bình
+ Tìm điểm toán cao nhất trong danh sách, Số sinh viên có điểm toán = Max, Điểm bình quân môn toán của cả danh sách?
Hướng dẫn:
- Xây dựng thủ tục nhập thông tin của danh sách sinh viên, trong đó sử dụng vòng lặp để nhập các thông tin của từng sinh viên thứ i.
Sử dụng Câu lệnh With để truy xuất đến thành phần của cấu trúc KSVIEN.
- Quá trình sắp xếp bằng thuật toán sắp xếp đổi chổ trực tiếp. Xem bài hướng dẫn 3.4. Thuộc tính so sánh là dssv[i].DTB và dssv[j].DTB.
Không sử dụng phép gán thông thường mà phải sử dụng memcpy để tiến hành copy hai vùng nhớ của các biến.
Source code chương trình:
{ 1. Khai bao cac kieu du lieu va bien can thiet }
PROGRAM Quan_Ly_SV;
Uses CRT;
Type KSVIEN = RECORD
Hoten : String[18];
Maso, Loai: String[8];
Toan, Ly, DTB: Real;
End;
KDSSVIEN = Array[1..50] of KSVIEN;
Var
DS: KDSSVIEN;
N: Integer;
{ 2. Thu tuc nhap du lieu cho danh sach sinh vien }
Procedure NhapDSSV( Var dssv : KDSSVIEN; Var N:Integer);
Var i:Integer;
Begin
Repeat
Write(‘Nhap so sinh vien N= ‘);
Readln(N);
Until ( N>0) and ( N < 51);
For i:=1 to N do
With dssv[i] do
Begin
Write(‘Nhap ho ten :’); Readln(Hoten);
Write(‘Ma so sv :’); Readln(Maso);
Write(‘Toan, Ly :’); Readln(Toan, Ly);
DTB := (Toan + Ly) / 2;
If DTB >=9 then
Loai:=‘Gioi’
Else if DTB >=7 then
Loai:=‘Kha’
Else if DTB >=5 then
Loai:=‘Binh’
Else
Loai:=‘Kem’;
End;
End;
{ 3. Thu tuc sap xep danh sach sinh vien tang dan theo diem trung binh }
Procedure SapXepDSSV( Var dssv : KDSSVIEN; N : Integer);
Var i, j : Integer;
Z : KSVIEN;
Begin
For i:=1 to N-1 do
For j:=i+1 to N do
If dssv[i].DTB < dssv[j].DTB Then
Begin
Z:= dssv [i];
dssv[i]:= dssv[j];
dssv[j]:=Z;
End;
End;
{ 4. Thu tuc in danh sach sinh vien }
Procedure InDSSV( Var dssv : KDSSVIEN; N : Integer);
Var i : Integer;
Begin
Writeln(‘In danh sach len man hinh ‘);
Writeln(‘STT HO VA TEN MASO',
‘TOAN LY DTBLOAI’);
For i:=1 to N do
With dssv[i] do
Writeln(i:2, #32, Hoten, #32:19-Length(Hoten),
Maso:8, Toan:4:1, Ly:4:1, DTB:4:1, Loai:5);
End;
{ 5. Cac bai toan nho lien quan danh sach sinh vien }
Procedure CacBaiToan (dssv : KDSSVIEN; N : Integer);
Var i , Dem: Integer;
TBToan, Max: Real;
Begin
{ Tim diem toan cao nhat}
Max:=dssv[1].Toan;
For i:=1 to N do
if Max< dssv[i].Toan then
Max:=dssv[i].Toan;
Writeln( ‘Diem Toan cao nhat =’, Max:4:1);
{ Dem so sv co diem Toan =Max}
Dem:=0;
For i:=1 to N do
if dssv[i].Toan =Max then
Dem := Dem+1;
Writeln(‘Co ‘, Dem, ‘em co diem Toan = ‘, Max:4:1);
{ Tinh diem binh quan mon Toan cua ca danh sach }
TBToan:=0;
For i:=1 to N do
TBToan := TBToan + dssv[i].Toan;
TBToan:=TBToan/N;
Writeln(‘Diem binh quan mon Toan= ‘, TBToan:6:2);
End;
{ Chương trình chính; }
BEGIN
Clrscr;
NhapDSSV( ds, N );
SapXepDSSV( ds, N );
InDSSV( ds, N );
CacBaiToan( ds, N );
Readln;
END.