Chương 4: Kiểu dữ liệu có cấu trúc

Xem toàn bộ tài liệu Lớp 11: tại đây

Giải Bài Tập Tin Học 11 – Sách Giải bài tập Tin học 11 trang 79, 80 giúp HS giải bài tập, giúp cho các em hình thành và phát triển năng lực sử dụng công nghệ thông tin và truyền thông:

    Bài 1 (trang 79 sgk Tin học lớp 11): Tại sao mảng là kiểu dữ liệu có cấu trúc?

    Trả lời:

    Mảng là kiểu dữ liệu có cấu trúc bởi vì mảng (một chiều, hai chiều hay nhiều chiều) là kiểu có cấu trúc được đề cập tới sớm nhất trong các ngôn ngữ lập trình. Nó được xây dựng từ những kiểu dữ liệu dã có theo quy tắc khuôn dạng do ngôn ngữ lập trình cung cấp. Nó được dùng để chỉ định một nhóm đối tượng cùng một tính chất nào đó. Chẳng hạn, vectơ là một nhóm các số mà mỗi số ta có thể xác định chỉ cần biết chỉ số. Như vậy, để khai báo kiểu mảng phải chỉ ra kiểu dữ liệu chung của các phần tử và kiểu chỉ số.

    Bài 2 (trang 79 sgk Tin học lớp 11): Tại sao phải khai báo kích thước của mảng?

    Trả lời:

    Mảng là 1 tập hợp các phần tử được đánh số có thứ tự thường là từ 0 hoặc 1cho nên khi khai báo mảng ta cần khai báo thêm kích thước để máy có thể cấp phát đủ bộ nhớ chứa số lượng các phần tử.

    Bài 3 (trang 79 sgk Tin học lớp 11): Các phần tử của mảng có thể có những kiểu gì?

    Trả lời:

    Kiểu dữ liệu của mảng có thể là những kiểu dữ liệu chuẩn (integer,byte,real,…), kiểu dữ liệu có cấu trúc (string,kiểu bản ghi).

    Bài 4 (trang 79 sgk Tin học lớp 11): Tham chiếu đến phần tử của mảng bằng cách nào?

    Trả lời:

    Tham chiếu đến phần tử của mảng ta sử dụng tên mảng và chỉ số đặt trong cặp dấu ngoặc [ và ].

    Ví dụ a[1]. (a là tên mảng ,1 là chỉ số ).

    Bài 5 (trang 79 sgk Tin học lớp 11): Viết chương trình nhập từ bàn phím số nguyên dương N (N ≤100) và dãy A gồm N số nguyên A1…AN có giá trị tuyệt đối lớn hơn 1000. Hãy cho biết dãy A có phải là một cấp số cộng hay không và thông báo kết quả ra màn hình.

    Trả lời:

    Nếu dãy chỉ có một số hoặc hai số thì chắc chắn là cấp số cộng.

    Nếu dãy có hơn hai số thì tính công sai là a[1]-a[0] sau đó duyệt cả mảng nếu có số nào vi phạm quy luật của cấp số cộng a[i] khác a[i-1]+d thì kết luận luôn không là cấp số cộng.

    Nếu đến cuối dãy mà không có số nào vi phạm thì kết luận là cấp số cộng.

    program csc;
    uses crt;
    var a:array[1..100] of integer;
        i,n,d:integer;
        t:boolean;
    begin
    	clrscr;
    	write('nhap so phan tu cua day ');
    	readln(n);
    	for i:=1 to n do
    	begin
    	write('a[',i,']=');
    	readln(a[i]);
    	end;
    	if n<=2
    	then
    	write('la cap so cong ')
    	else
    	begin
    	d:=a[2]-a[1];
    	t:=true;
    	for i:=3 to n do
    	if a[i]<>a[i-1]+d
    	then 
    	begin
    	t:=false;
    	break;
    	end;
    	if t
    	then
    	write('la cap so cong')
    	else
    	write('khong phai cap so cong ');
    	end;
    	readkey;
    end.
    

    Kết quả:

    Trường hợp là cấp số cộng:

    Trường hợp không là cấp số cộng:

    Bài 6 (trang 79 sgk Tin học lớp 11): Viết chương trình nhập từ bàn phím số nguyên dương N (N ≤100) và dãy A gồm N số nguyên A1, A2 …AN có giá trị tuyệt đối không lớn hơn 1000. Hãy đưa ra những thông tin sau:

    a) Số lượng số chẵn và số lượng số lẻ

    b) số lượng số nguyên tố trong dãy

    Trả lời:

    a) Duyệt toàn bộ mảng ,nếu số nào chia hết cho 2 thì là số chẵn còn lại là số lẻ. Ta dùng một biến để đếm số chẵn . Sau đó lấy số phần tử trừ đi số phần tử chẵn.

    program csc;
    uses crt;
    var a:array[1..100] of integer;
        i,d,n:integer;
    begin
    	clrscr;
    	write('nhap so phan tu cua day ');
    	readln(n);
    	d:=0;
    	for i:=1 to n do
    	begin
    	write('a[',i,']=');
    	readln(a[i]);
    	end;
    	for i:=1 to n do
    	if a[i] mod 2=0
    	then
    	d:=d+1;
    	writeln('so so chan la ',d,' so so le la ',n-d);
    	readkey;
    end.
    

    b) Số lượng số nguyên tố trong dãy

    Duyệt toàn bộ các số trong dãy với mỗi số ta kiểm tra xem số này có chia hết số nào từ 2 đến a[i]-1 của nó không ?. Nếu không thì kết luận là số nguyên tố.

    program csc;
    uses crt;
    var a:array[1..100] of integer;
        i,d,n,j:integer;
        t:boolean;
    begin
    	clrscr;
    	write('nhap so phan tu cua day ');
    	readln(n);
    	d:=0;
    	for i:=1 to n do
    	begin
    	write('a[',i,']=');
    	readln(a[i]);
    	end;
    	for i:=1 to n do
    	begin
    		t:=true;
    		for j:=2 to a[i]-1 do
    		begin
    			if (a[i] mod j=0) and (a[i]<>2)
    			then
    			begin
    			t:=false;
    			break;
    			end;
    		end;
    		if t=true
    		then
    		d:=d+1;
    	end;
    	writeln('so cac so nguyen to trong day la ',d);
    	readkey;
    end.
    

    Kết quả:

    Bài 7 (trang 79 sgk Tin học lớp 11): ): Dãy F là dãy Phi-bo-na-xi nếu:

    F0=0, F1 = 1, Fn = Fn-1 + Fn-2 với N ≥ 2

    Viết chương trình nhập từ bàn phím số nguyên dương N và đưa ra màn hình số hạng thứ N của dãy Phi-bo-na-xi. Chương trình của bạn thực hiện với giá trị lớn nhất của N là bao nhiêu?

    Trả lời:

    Sử dụng 2 biến để lưu giá trị hiện tại của 2 số fibonaci. Mỗi lần sinh ra số fibonaci mới ta sẽ gán lại giá trị mới cho 2 biến này bằng đoạn code;

    F1:=F0+F1;

    F0:=F1-F0;

    program csc;
    uses crt;
    var n,i:integer;
        f0,f1:integer;
    begin
    	clrscr;
    	write('nhap so n:');
    	readln(n);
    	f0:=0;
    	f1:=1;
    	for i:=2 to n do
    	begin
    		f1:=f0+f1;
    		f0:=f1-f0;
    	end;
    	write('so fibonaci thu n la :',f1);
    	readkey;
    end.
    

    Chương trình chạy tối đa đến N=23 với số fibonaci là 28657 . Nếu lên đến số 24 sẽ vượt quá phạm vi của biến kiểu integer.

    Bài 8 (trang 79 sgk Tin học lớp 11): Chương trình sau thực hiện những gì?

    Chương trình sau đây thực hiện những gì?

    program BT8;
    const NMax = 50;
    type Mass = array [1...NMax, O..NMax-1] of real;
    var A: Mass;
    i,j N: byte; C: real;
    begin
    Write ('Nhap N= ?');
    readln(N); for i:= 1 to N do
    for 0 to N-1 do
    begin
    write('A[i,j; readln(A[i,j ] )
    end,
    for i:= 1 to N do
    for j:= 1 to N-1 do
    begin
    C:= A[i,j];
    A[i , j ] := A[N-i+1, j ]
    A [N-i+1,j] := C;
    end;
    for i:=1 to N do begin
    for j : =1 to N— 1 do write (A [ i, j ] : 5 : 2 , ' ');
    writeln
    end;
    End.
    

    Trả lời:

    Chương trình thực hiện việc hoán đổi vị trí dòng thứ i với dòng thứ N-i+J, nghĩa là hoán đổi vị trí dòng đầu tiên với dòng cuối cùng của màng hai chiều, dòng thứ hai từ trên xuống với dòng thứ hai từ dưới lên,.. Việc hoán đổi vị trí dòng thứ i với dòng đối xứng với nó được thực hiện khi i nhận giá trị từ 1 đến N, làm cho mỗi dòng được hoán đổi vị trí hai lần. Vì vậy, cuối cùng mảng A không thay đổi so với ban đầu.

    Bài 9 (trang 80 sgk Tin học lớp 11): Cho mảng hai chiều kích thước nxm với các phần tử là những số nguyên. Tìm trong mỗi dòng phần tử lớn nhất rồi đổi chỗ nó với phần tử có chỉ số dòng bằng chỉ số cột.

    program Diag;
    uses crt;
    Var
    	N,i,j,Max,Ind,Vsp:integer;
    	A:array[1..15,1..15] of integer;
    begin
    	clrscr;
    	write('nhap N nho hon 15:');
    	readln(N);
    	for i:=1 to N do
    		for j:=1 to N do
    		begin
    		write('a[',i,',',j,']=');
    		readln(a[i,j]);
    		end;
    	for i:=1 to N do
    	begin
    		Max:=A[i,1];
    		Ind:=1;
    		for j:=2 to N do
    		if A[i,j]> Max then
    		begin
    		Max:=A[i,j];Ind:=j;
    		end;
    		vsp:=A[i,i];
    		A[i,i]:=Max;
    		A[i,Ind]:=vsp;
    	end;
    	for i:=1 to N do
    	begin
    		writeln;
    		for j:=1 to N do 
    		write(a[i,j]:3);
    	end;
    	writeln
    	readkey;
    end.
    

    Trả lời:

    for i:=1 to N do
    	begin
    		Max:=A[i,1];
    		Ind:=1;
    		for j:=2 to N do
    		if A[i,j]> Max then
    		begin
    		Max:=A[i,j];Ind:=j;
    		end;
    		vsp:=A[i,i];
    		A[i,i]:=Max;
    		A[i,Ind]:=vsp;
    	end;
    

    Đoạn code này có nhiệm vụ duyệt từng hàng. Ban đầu gán phần tử đầu tiên của hàng là max . Sau đó nếu trong hàng đó có phần tử nào lớn hơn max thì lưu lại giá trị max và chỉ số của phần tử đó trong hàng.

    Để sửa chương trình trên để tìm kiếm trong mỗi cột thì ta sửa lại như sau:

    program Diag;
    uses crt;
    Var
    	N,i,j,Max,Ind,Vsp:integer;
    	A:array[1..15,1..15] of integer;
    begin
    	clrscr;
    	write('nhap N nho hon 15:');
    	readln(N);
    	for i:=1 to N do
    		for j:=1 to N do
    		begin
    		write('a[',i,',',j,']=');
    		readln(a[i,j]);
    		end;
    	for i:=1 to N do
    	begin
    		Max:=A[i,1];
    		Ind:=1;
    		for j:=2 to N do
    		if A[i,j]> Max then
    		begin
    		Max:=A[i,j];Ind:=j;
    		end;
    		vsp:=A[i,i];
    		A[i,i]:=Max;
    		A[i,Ind]:=vsp;
    	end;
    	for i:=1 to N do
    	begin
    		writeln;
    		for j:=1 to N do 
    		write(a[i,j]:3);
    	end;
    	writeln;
    	readkey;
    end.
    

    Kết quả :

    Bài 10 (trang 80 sgk Tin học lớp 11): Viết chương trình nhập từ bàn phím xâu kí tự S có độ dài không quá 100. Hãy cho biết có bao nhiêu chữ số xuất hiện trong xâu S. Thông báo kết quả ra màn hình.

    Trả lời:

    Ta chỉ cần duyệt lần lượt từng kí tự của xâu S nếu nó nằm trong đoạn từ ‘0’ đến ‘9’ thì ta tăng biến đếm lên 1.

    program Diag;
    uses crt;
    Var
    	s:string[100];
    	i,d:integer;
    begin
    	clrscr;
    	d:=0;
    	write('Nhap xau S :');
    	readln(s);
    	for i:=1 to length(s) do
    	if ('0'<=s[i]) and (s[i]<='9')
    	then
    	d:=d+1;
    	writeln('so ki tu la so xuat hien trong xau s la ',d);
    	readkey;
    end.
    

    Kết quả:

    Bài 11 (trang 80 sgk Tin học lớp 11): Hãy bổ sung thêm vào chương trình Xep_loai ở bài 13 những lệnh cần thiết để chương trình đưa ra danh sách học sinh xếp loại A.

    Trả lời:

    Khi in ra kết quả ta chỉ việc kiểm tra loại học sinh xem xếp loại có phải là ‘A’ hay không .Nếu là ‘A’ thì in kêt quả ra màn hình.

    program xep_loai;
    uses crt;
    const max= 60;
    type Hocsinh = record
    
    hoten: string[30];
    ngaysinh: string [10];
    Diachi: string[50] ;
    Toan, Van: real;
    Xeploai : char; end;
    var
    Lop: array [ 1..max] of hocsinh;
    N,i: byte;
    Begin
    clrscr;
    write('So luong hoc sinh trong lop N=  ') ;
    readln(N);
    for i:= 1 to N do
    begin
    writeln( 'Nhap so lieu ve hoc sinh thu',i,': ');
    Write ('Ho va ten: '); readln (lop [i]. hoten);
    Write (' Ngay sinh : '); readln (lop [i].ngaysinh);
    Write (' Dia chi : '); readln (lop [i].Diachi);
    Write ('Diem Toan : '); readln (lop [i]. Toan);
    Write ('Diem Van : '); readln (lop [i]. Van);
    If Lop [i]. Toan+Lop [i]. Van >=18
    then Lop [i]. xeploai:='A';
    if    (Lop[i].Toan+Lop[i].Van>=14)    and
    (Lop [i]. Toan+Lop [i]. Van <18)
    then Lop [i]. xeploai:='B';
    if    (Lop[i].Toan+Lop[i].Van>=10)    and
    (Lop [i]. Toan+Lop [i]. Van >=14)
    then Lop [i]. xeploai:='C';
    if    (Lop[i].Toan+Lop[i].Van<=10)   
    then Lop[i].xeploai:='D';
    end;
    clrscr;
    writeln ('Danh sach xep loai hoc sinh trong lop: ' );
    for i:=1 to N do
    if Lop[i].xeploai='A' then
    writeln (Lop[i].Hoten:30,' – Xep loai : ', Lop[i]. Xeploai);
    readln
    End.
    

     

    Bài giải này có hữu ích với bạn không?

    Bấm vào một ngôi sao để đánh giá!

    Đánh giá trung bình 5 / 5. Số lượt đánh giá: 983

    Chưa có ai đánh giá! Hãy là người đầu tiên đánh giá bài này.

    --Chọn Bài--

    Tài liệu trên trang là MIỄN PHÍ, các bạn vui lòng KHÔNG trả phí dưới BẤT KỲ hình thức nào!

    Tải xuống