X

Giải bài tập Tin học lớp 11

Giải Tin học 11 Chương 4: Kiểu dữ liệu có cấu trúc


Giải Tin học 11 Chương 4: Kiểu dữ liệu có cấu trúc

Haylamdo biên soạn và sưu tầm lời giải Tin học 11 Chương 4: Kiểu dữ liệu có cấu trúc hay, chi tiết được biên soạn bám sát nội dung sách giáo khoa Tin học lớp 11 giúp bạn dễ dàng trả lời câu hỏi từ đó đạt điểm cao trong các bài thi môn Tin học 11.

Giải Tin học 11 Chương 4: Kiểu dữ liệu có cấu trúc

Tin học 11 Bài 11: Kiểu mảng

Chúng ta chỉ xét hai kiểu mảng thông dụng với nhiều ngôn ngữ lập trình là kiểu mảng một chiều và kiểu mảng hai chiều.

1. Kiểu mảng một chiều

-Mảng một chiều là một dãy hữu hạn các phần tử có cùng kiểu. Mảng được đặt tên và mỗi phần tử mang một chỉ số. Để mô tả mảng một chiều cần xác định kiểu của các phần tử và cách đánh chỉ số các phần tử.

- Với mảng một chiều ta quan tâm đến:

+ Tên kiểu mảng một chiều.

+ Số lượng phần tử trong mảng.

+ Kiểu dữ liệu của phần tử.

+ Cách khai báo biến mảng.

+ Cách tham chiếu đến phần tử.

Tại sao ta lại phải sử dụng mảng?

Giả sử ta muốn đo nhiệt độ trung bình trong 1 tháng và đưa ra những ngày nào cao hơn nhiệt độ trung bình. Nếu chỉ sử dụng kiến thức ta biết từ đầu chương trình đến giờ. Ta sẽ phải khai báo 30 biến để lưu giữ giá trị nhiệt độ các ngày trong tháng. Sau đó phải gõ lại rất nhiều lệnh if gây ra sự nhàm chán.

a) Khai báo.

Cách 1: Khai báo trực tiếp biến mảng một chiều

Var<tên biến mảng> :array[kiểu chỉ số] of <kiểu phần tử>;

Cách 2: Khai báo gián tiếp biến mảng qua kiểu mảng một chiều

	Type<tên kiểu mảng>=array[kiểu chỉ số] of <kiểu phần tử>;
	Var<tên biến mảng>:<tên kiểu mảng>;

Trong đó:

+ Kiểu chỉ số thường là đoạn số nguyên liên tục có dạng n1..n2, với n1 là chỉ số đầu và n2 là chỉ số cuối (n1≤n2).

+ Kiểu phần tử là kiểu dữ liệu của các phần tử mảng.

+ Tham chiếu đến phần tử mảng ta viết :

	<tên biến mảng>[chỉ số];

Ví dụ:

	Var nhietdo:array[1..30] of integer;

Muốn tham chiếu tới phần tử thứ 20 ta sẽ viết là nhietdo[20].

b) Một số ví dụ

Ví dụ 1. Tìm phần tử lớn nhất của dãy số nguyên

Input: Số nguyên dương N (N<=250) và dãy N số nguyên dương A1,A2,..,An,mỗi số đều không vượt quá 500.

Output: Chỉ số và giá trị của phần từ lớn nhất trong dãy số đã cho (nếu có nhiều phần tử lớn nhất thì chỉ cần đưa ra một trong số chúng.

program vidu1;
uses crt;
var arrayint:array[1..250] of integer;
	n,i,mi:integer;
begin
	clrscr;
	writeln('nhap vao so phan tu ');
	readln(n);
	for i:=1 to n do
	begin
	writeln('phan tu thu ',i,'=');
	readln(arrayint[i]);
	end;
	mi:=1;
	for i:=2 to n do
	begin
	if arrayint[i]>arrayint[mi]
	then
	mi:=i;
	end;
	writeln('gia tri lon nhat la ',arrayint[mi],' chi so la ',mi);
	readln;
end.

Ví dụ 2: Sắp xếp dãy số nguyên bằng thuật toán tráo đổi.

program sapxep;
uses crt;
const Nmax=250;
var
	N,i,j,t:integer;
	A:array[1..Nmax] of integer;
begin
	clrscr;
	write('nhap so luong phan tu cua day N=');
	readln(N);
	for i:=1 to N do
	begin
	write('phan tu thu ',i,'=');
	readln(A[i]);
	end;
	for j:=N downto 2 do
		for i:=1 to j-1 do
			if A[i]>A[i+1] then
			begin
			t:=A[i];
			A[i]:=A[i+1];
			A[i+1]:=t;
			end;
	writeln('day da duoc sap xep la ');
	for i:=1 to N do write(A[i]:4);
	readln;
end.

Kết quả:

Giải bài tập Tin học 11 | Để học tốt Tin học 11

Ví dụ 3: Tìm kiếm nhị phân.

Bước 1: Nhập N, các số hạng a1, a2... aN và khóa k.

Bước 2: Dau <— 1, Cuoi <-N;

Bước 3: Giua <—[ Dau + Cuoi]/2

Bước 4: Nếu Agiữa = k thì thông báo chỉ số Giua rồi kết thúc;

Bước 5: Nếu Agiữa> k thì đặt Cuối= Giữa-1 rồi chuyển đến bước 7;

Bước 6: Nếu Nếu Agiữa ≤ k Dau;

Bước 7: Nếu Dau > Cuoi thì thông báo dãy A không có số hạng có giá trị bằng k rồi kết thúc;

Bước 8: Ọuay lại bước 3.

Từ thuật toán của bài toán, chúng ta rút ra được một số điều cơ bản cần phải lưu ý, đó là:

- Mảng đã dược sắp xếp tăng dần.

- Trong thuật toán, việc tìm kiếm thực chất là lặp một số lần (chưa xác định được trước) các thao tác sau: chọn số hạng ở "giữa" dãy, so sánh số hạng đó với k, căn cứ vào kết quả so sánh này để hoặc kết luận đã tìm thấy (trường hợp xảy ra bằng) hoặc thu hẹp phạm vi tìm kiếm(trường hợp không bằng).

- Khi nào quá trình lặp nói trên dừng lại? Quá trình lặp đó cần dừng lại với một trong hai sự kiện sau xảy ra gồm đã tìm thấy hoặc không gian tìm kiếm đã trở nên bằng rỗng (nghĩa là không còn đoạn nào của dãy cho ta hy vọng chứa phân tử cần tìm).

- Phạm vi tìm kiếm trên dãy là một đoạn được xác định bởi các biến nguyên Dau và Cuoi, tương ứng cho biết bắt đầu từ phần tử có chỉ số Dau của dãy cho đến phần tử có chỉ số Cuoi của dãy. Từ đó, ta đưa ra được công thức xác định phân tử ở "giữa" phạm vi tìm kiếm và công thức xác định lại giá trị cho biến Dau hay Cuoi trong mỗi trường hợp thu hẹp phạm vi tìm kiếm.

Giải bài tập Tin học 11 | Để học tốt Tin học 11

2. Kiểu mảng hai chiều

Mảng hai chiều: Là bảng các phần tử cùng kiểu.

Ta có thể coi mảng hai chiều là mảng một chiều mà mỗi phần tử của mảng một chiều lại là một mảng khác.

Ví dụ:

	Var b:array[1..9] of array[1..10] of integer;

Khai báo b là một mảng một chiều gồm 9 phần tử. Mỗi phần tử của mảng b là một mảng một chiều gồm 10 phần tử.

Cách khai báo:

Ngoài khai báo theo cách trên. Ta có thêm 2 cách nữa để khai báo mảng 2 chiều.

Cách 1:

	Var<tên biến mảng>:array[kiểu chỉ số hang,kiểu chỉ số cột] of <kiểu phần tử>;

Cách 2:

	Type<tên kiểu mảng>=array[kiểu chỉ số hang,kiểu chỉ số cột] of <kiểu phần tử>;
	Var<tên biến mảng>:<tên kiểu mảng>;

Ví dụ:

	Var b:array[1..9,1..10] of integer;
Hoặc
	Type mang2chieu=array[1..9,1..10] of integer;
	Var
		B:mang2chieu;

Muốn tham chiếu đến phần tử trong mảng 2 chiều ta sử dụng 2 chỉ số là chỉ số hàng và chỉ số cột.

Ví dụ:

	Mang2chieu[5,6]

b) Một số ví dụ:

Ví dụ 1: Tính và in ra bảng nhân.

program bangnhan;
uses crt;
var bnhan: array[1..9,1..9] of integer;
    i,j:integer;
begin
	clrscr;
	for i:=1 to 9 do
		for j:=1 to 9 do
		bnhan[i,j]:=i*j;
	for i:=1 to 9 do
		begin
		for j:=1 to 9 do
		write(bnhan[i,j]:4);
		writeln();
		end;
	readln
end.

Kết quả:

Giải bài tập Tin học 11 | Để học tốt Tin học 11

Ví dụ 2. Chương trình sau nhập vào từ bàn phím các phần tử của mảng hai chiều B gồm 5 hàng, 7 cột với các phần tử là các số nguyên và một số nguyên k. Sau đó, đưa ra màn hình các phần tử có giá trị nhỏ hơn k.

program vidu2;
uses crt;
var arr: array[1..5,1..7] of integer;
    i,j,k:integer;
begin
	clrscr;
	for i:=1 to 5 do
		for j:=1 to 7 do
		begin
		write('a[',i,']','[',j,']=');
		readln(arr[i,j]);
		end;
	write('k=');
	readln(k);
	write('cac phan tu nho hon k la:');
	for i:=1 to 5 do
		for j:=1 to 7 do
		if arr[i,j]<k
		then
		write(arr[i,j]:4);
	readln
end.

Lưu ý: Ngoài mảng một chiều và hai chiều ta có thể có các mảng nhiều chiều.

..............................................

..............................................

..............................................

Tin học 11 Bài tập và thực hành 3

1. Mục đích, yêu cầu

+ Biết nhận xét, phân tích, đề xuất thuật toán giải bài toán sao cho chương trình chạy nhanh hơn.

+ Làm quen với dữ liệu có cấu trúc và bài toán sắp xếp.

2. Nội dung

Bài 1(trang 65 sgk Tin 11):

a) Hãy tìm hiểu và chạy thử chương trình thuật toán sắp xếp dãy số nguyên bằng thuật toán tráo đổi với các giá trị khác nhau của n dưới đây .

Qua đó nhận xét về thời gian chạy chương trình.

Trả lời:

program sapxep;
uses crt;
const Nmax=250;
var
	N,i,j,t:integer;
	A:array[1..Nmax] of integer;
begin
	clrscr;
	randomize;
	write('nhap so luong phan tu cua day N=');
	readln(N);
	for i:=1 to N do
	begin
	A[i]:=random(300)-random(300);
	end;
	for i:=1 to N do
	write(A[i]:5);
	writeln;
	for j:=N downto 2 do
		for i:=1 to j-1 do
			if A[i]>A[i+1] then
			begin
			t:=A[i];
			A[i]:=A[i+1];
			A[i+1]:=t;
			end;
	writeln('day da duoc sap xep la ');
	for i:=1 to N do write(A[i]:4);
	readln;
end.

Kết quả:

Giải bài tập Tin học 11 | Để học tốt Tin học 11

b) Khai báo thêm biến nguyên Dem và bổ sung vào chương trình những câu lệnh cần thiết để biến Dem tính số lần thực hiện tráo đổi trong thuật toán. Đưa kết quả ra màn hình.

Trả lời:

program sapxep;
uses crt;
const Nmax=250;
var
	N,i,j,t,dem:integer;
	A:array[1..Nmax] of integer;
begin
	clrscr;
	randomize;
	write('nhap so luong phan tu cua day N=');
	readln(N);
	for i:=1 to N do
	begin
	A[i]:=random(300)-random(300);
	end;
	dem:=0;
	for i:=1 to N do
	write(A[i]:5);
	writeln;
	for j:=N downto 2 do
		for i:=1 to j-1 do
			if A[i] > A[i+1] then
			begin
			t:=A[i];
			A[i]:=A[i+1];
			A[i+1]:=t;
			dem:=dem+1;
			end;
	writeln('day da duoc sap xep la ');
	for i:=1 to N do write(A[i]:4);
	writeln;
	writeln('so lan thuc hien trao doi la ',dem);
	readln;
end.

Kết quả:

Giải bài tập Tin học 11 | Để học tốt Tin học 11

Bài 2 (trang 66 sgk Tin 11): Hãy đọc và tìm hiểu những phân tích để viết chương tình giải bài toán :

Cho mảng A gồm n phần tử. Hãy biết chương trình tạo mảng B[1..n] trong đó B[i] là tổng của I phần tử đầu tiên trong A.

Trả lời:

Có 2 cách:

Cách 1 là duyệt lần lượt các phần từ của mảng B. Đến vị trí I ta sẽ duyệt từ 1 đến I của mảng A rồi cộng dồn vào B[i]

Cách 2 là ta nhận thấy B[j]=B[j-1]+A[j] nếu j khác 1và B[j]=A[1] nếu j=1.

Cách 1:

program sapxep;
uses crt;
const Nmax=250;
var
	N,i,j,t,dem:integer;
	A:array[1..Nmax] of integer;
	B:array[1..Nmax] of integer;
begin
	clrscr;
	randomize;
	dem:=0;
	write('nhap so luong phan tu cua day N=');
	readln(N);
	for i:=1 to N do
	begin
	A[i]:=random(300)-random(300);
	B[i]:=0;
	end;
	for i:=1 to N do
		for j:=1 to i do
		begin
			B[i]:=B[i]+A[j];
			dem:=dem+1;
		end;
	writeln('dem=',dem);
	readln;
end.

Kết quả:

Số lần thực thi phép cộng là:

Giải bài tập Tin học 11 | Để học tốt Tin học 11

Cách 2:

program sapxep;
uses crt;
const Nmax=250;
var
	N,i,j,t,dem:integer;
	A:array[1..Nmax] of integer;
	B:array[1..Nmax] of integer;
begin
	clrscr;
	randomize;
	dem:=0;
	write('nhap so luong phan tu cua day N=');
	readln(N);
	for i:=1 to N do
	begin
	A[i]:=random(300)-random(300);
	B[i]:=0;
	end;
	B[1]:=A[1];
	for i:=2 to N do
		begin
		B[i]:=B[i-1]+A[i];
		dem:=dem+1;
		end;
	writeln('dem=',dem);
	readln;
end.

Kết quả:

Số lần thực thi phép cộng là

Giải bài tập Tin học 11 | Để học tốt Tin học 11

Nhận thấy sử dụng cách 2 có thể làm giảm đáng kể số lượng phép toán cần thực hiện. Tuy tốc độ máy tính rất nhanh nhưng cũng có giới hạn. Vì thế ta nên tìm cách viết sao cho chương trình thực hiện càng ít phép toán càng tốt.

..............................................

..............................................

..............................................

Xem thêm các bài giải bài tập sgk Tin học 11 hay khác: