Viết chương trình thực hiện các yêu cầu sau:
a) Khai báo kiểu dữ liệu bảng ghi có tên là hocsinh gồm các thành phần sau: họ tên, điểm toán, điểm lý, điểm hóa, điểm trung bình,xep loai.
b) Viết chương trình con sinh số liệu ngẫu nhiên cho một mảng động kiểu hocsinh nêu trên. Yêu cầu điểm số của tất cả các môn và điểm trung bình đều phải làm tròn đến 1 chữ số sau dấu chấm thập phân.
c) Viết thủ tục xuất nội dung của mảng động kiểu hocsinh ra màn hình theo mẫu sau.
1. Cột thứ 1: ghi số thứ tự
2. Cột thứ 2: ghi họ tên
3. Cột thứ 3: điểm toán
4. Cột thứ 4: điểm lý
5. Cột thứ 5: điểm hóa
6. Cột thứ 6: điểm trung bình
7. Cột thứ 7: Xếp loại (dựa vào điểm trung bình với các mức học lực giỏi(dtb>=8), khá(8>dtb>=6.5), trung bình(6.5>dtb>=5), yếu(5>dtb>=3.5), kém(dtb<3.5));
8. Cuối danh sách có thống kê số lượng học sinh có trong danh sách và ghi ra màn hình
d) Viết chương trình con sắp xếp mảng động trên theo chiều giảm dần của điểm trung bình.
e) Viết chương trình con sắp xếp mảng động trên theo chiều tăng dần của họ tên.
f) Viết hàm tìm kiếm trả về số học sinh xếp loại khá.
g) Viết hàm tìm kiếm trả về điểm trung bình cao nhất
h) Viết hàm tìm kiếm trả về học sinh đầu tiên trong danh sách có điểm trung bình cao nhất.
i) Viết hàm tìm kiếm trả về học sinh đầu tiên có tên trùng với tham số truyền vào từ hàm
j) Viết hàm tìm kiếm trả về học sinh đầu tiên có điểm trung bình trùng với tham số truyền vào từ hàm
k) Viết hàm trả về một mảng động chỉ chứa các học sinh có điểm trung bình cao nhất
l) Viết hàm trả về một mảng động chỉ chứa các học sinh có điểm trung bình nằm trong doan x đến y với x,y nhập vào từ chương trình chính và được truyền vào từ tham số của chương trình con.
m) Hãy viết chương trình chính gọi tất cả các chương trình con ở các câu trên theo một thứ tự logic phù hợp, xuất các kết quả tương ứng. Chú ý các câu tìm kiếm có xuất kết quả “khong tim thay {yêu cầu}” nếu không tìm thấy.
Bài giải:
program BAI1;
type
hocsinh = record
hoten:string[30];
toan,ly,hoa,dtb:real;
xl:string[10];
end;
mang=array of hocsinh;
chuoi=string[30];
var a:mang;
tb,x,y:real;
procedure sinh(var a:mang);
var n,i,j:integer;
begin
write('nhap so hoc sinh'); readln(n);
setlength(a,n); randomize;
for i:=low(a) to high(a) do
begin
a[i].hoten:='';
for j:=1 to 30 do
a[i].hoten:=a[i].hoten+chr(random(26)+65);
a[i].toan:=round(random*100)/10;
a[i].ly:=round(random*100)/10;
a[i].hoa:=round(random*100)/10;
a[i].dtb:=(round(a[i].toan+a[i].ly+a[i].hoa)/3*10)/10;
if (a[i].dtb>8) then a[i].xl:='gioi'
else if (a[i].dtb>6.5) then a[i].xl:='kha'
else if (a[i].dtb>5) then a[i].xl:='trung binh'
else if (a[i].dtb>3.5) then a[i].xl:='yeu'
else a[i].xl:='kem' ;
end;
end;
procedure xuaths(h:hocsinh);
begin
writeln(h.hoten,' ',h.toan:0:2,' ',h.ly:0:2,' ',h.hoa:0:2,' ',h.dtb:0:2,' ',h.xl);
end;
procedure xuat(a:mang);
var i:integer;
begin
for i:=low(a) to high(a) do
xuaths(a[i]);
writeln(' co ',high(a)+1, ' hoc sinh trong danh sach nay');
end;
function sapxepgiamdtb(var a:mang):mang;
var i,j:integer; t:hocsinh;
begin
for i:= low(a) to high(a)-1 do
for j:= i+1 to high(a) do
if (a[i].dtb<a[j].dtb) then
begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
end;
sapxepgiamdtb:=a;
end;
function sapxeptanghoten(var a:mang):mang;
var i,j:integer; t:hocsinh;
begin
for i:= low(a) to high(a)-1 do
for j:= i+1 to high(a) do
if (ORD(a[i].hoten[1])>ORD(a[j].hoten[1])) then
begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
end;
sapxeptanghoten:=a;
end;
function timkha(a:mang):integer;
var i,dem:integer;
begin
dem:=0;
for i:= low(a) to high(a) do
if (a[i].xl='kha') then
dem:=dem+1;
timkha:=dem;
end;
function timmax(a:mang):real;
var i:integer; max:real;
begin
max:=a[0].dtb;
for i:=low(a)+1 to high(a) do
if (a[i].dtb>max) then max:=a[i].dtb;
timmax:=max;
end;
function timhsmax(a:mang):hocsinh;
var i:integer; t:hocsinh;
begin
for i:=low(a) to high(a) do
if (a[i].dtb=timmax(a)) then
begin
t:=a[i];
break;
end;
timhsmax:=t;
end;
function timhsten(s:chuoi):hocsinh;
var i:integer; t:hocsinh;
begin
t.hoten:='';
for i:=low(a) to high(a) do
if (a[i].hoten=s) then
begin
t:=a[i];
break;
end;
timhsten:=t;
end;
function timhsdtb(m:real):hocsinh;
var i:integer; t:hocsinh;
begin
t.dtb:=-1;
for i:=low(a) to high(a) do
if (a[i].dtb=m) then
begin
t:=a[i];
break;
end;
timhsdtb:=t;
end;
function timmangmax(a:mang):mang;
var i,d:integer; m:mang;
begin
d:=0;
for i:=low(a) to high(a) do
if (a[i].dtb=timmax(a)) then
d:=d+1;
setlength(m,d);
d:=0;
for i:=low(a) to high(a) do
if (a[i].dtb=timmax(a)) then
begin
m[d]:=a[i];
d:=d+1;
end;
timmangmax:=m;
end;
function timmangxy(x,y:real):mang;
var i,d:integer; m:mang;
begin
d:=0;
for i:=low(a) to high(a) do
if ((a[i].dtb>=x) and (a[i].dtb<=y))then
d:=d+1;
setlength(m,d);
d:=0;
for i:=low(a) to high(a) do
if ((a[i].dtb>=x) and (a[i].dtb<=y)) then
begin
m[d]:=a[i];
d:=d+1;
end;
timmangxy:=m;
end;
BEGIN
sinh(a);
xuat(a);
writeln('mang sap xep giam dan diem trung binh:');
xuat(sapxepgiamdtb(a));
writeln('mang sap xep tang dan ho ten:');
xuat(sapxeptanghoten(a));
writeln('So hoc sinh loai kha: ',timkha(a));
writeln('Diem trung binh max: ',timmax(a):0:2);
writeln('hoc sinh co diem trung binh max dau tien:');
xuaths(timhsmax(a));
write('nhap diem trung binh can tim: '); readln(tb);
if (timhsdtb(tb).dtb<0) then writeln(' khong tim thay hoc sinh co diem trung binh can tim')
else xuaths(timhsdtb(tb));
writeln('cac hoc sinh co diem trung binh max');
xuat(timmangmax(a));
writeln('nhap x'); readln(x);
writeln('nhap y'); readln(y);
writeln('cac hoc sinh co diem trung binh trong doan',' [',x:0:2,';',y:0:2,'] la');
xuat(timmangxy(x,y));
readln;
END.