Giải bài tập Tin học 11 trang 79 và trang 80
Bài giải:
Nhận xét:
- 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:
a) Số lượng số chẵn và số lượng số lẻ
b) Số lượng số nguyên tố trong dãy
Bài giả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.
Chương trình được viết như sau:
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;Bài 7 (trang 79): 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?
Bài giả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): Chương trình sau 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.
Bài giả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. Do vậy, cuối cùng mảng A không thay đổi so với ban đầu.
Bài 9 (trang 80): 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.
Bài giả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 giả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): 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.
Bài giả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.
Chương trình được viết như sau:
program xep_loai;