Viết chương trình tính và đưa ra màn hình trung bình cộng các số lẻ trong phạm vị từ 1 đến 100

Giải Bài Tập Tin Học 11 – Bài 10: Cấu trúc lặp 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:

  • Sách Giáo Viên Tin Học Lớp 11

1. Lặp

Với a là số nguyên và a>2, xét các bài toán sau đây:

Viết chương trình tính và đưa ra màn hình trung bình cộng các số lẻ trong phạm vị từ 1 đến 100

Viết chương trình tính và đưa ra màn hình trung bình cộng các số lẻ trong phạm vị từ 1 đến 100

Với cả hai bài toán, cách để tính tổng S có các điểm tương đồng .

   + Xuất phát, S được gán giá trị 1/a

   + Sau mỗi lần lặp giá trị tổng S được cộng thêm một giá trị 1/(a+N) N=1,2,3,..

Việc cộng này sẽ được lặp lại một số lần.

Đối với bài toán 1, số lần lặp sẽ là 100. Bài toán sẽ dừng sau khi thực hiện việc cộng 100 lần.

Đối với bài toán 2, số lần lặp sẽ chưa biết trước nhưng việc cộng vào sẽ kết thúc khi:

1/(a+N)<0.0001

Nói chung, trong một số thuật toán có những thoa tác phải lặp lại một số lần. Một trong các đặc trưng của máy tính là có khả năng thực hiện hiệu quả các thao tác lặp. Cấu trúc lặp mô tả thao tác lặp và có 2 dạng là :

+ Lặp với số lần biết trước.

+ Lặp với số lần chưa biết trước.

2. Lặp với số lần biết trước và câu lệnh for-do.

Có 2 thuật toán để giải bài toán 1 như sau:

Cách 1:

Bước 1: Gán cho S:=1/a ; gán cho N=0;

Bước 2: Tăng giá trị N lên 1. N:=N+1;

Bước 3: Nếu N > 100 thì chuyển đến bước 5;

Bước 4: S:=S+1/(a+N); quay lại bước 2 (Thao tác lặp ở đây).

Bước 5: Đưa S ra màn hình rồi kết thúc.

Cách 2:

Bước 1: Gán cho S:=1/a ; gán cho N=101;

Bước 2: Giảm giá trị N xuống 1. N:=N-1;

Bước 3: Nếu N<1 thì chuyển đến bước 5;

Bước 4: S:=S+1/(a+N); quay lại bước 2 (Thao tác lặp ở đây).

Bước 5: Đưa S ra màn hình rồi kết thúc.

Ở cách 1 ta thực hiện cộng xuôi:

Viết chương trình tính và đưa ra màn hình trung bình cộng các số lẻ trong phạm vị từ 1 đến 100

Dù cách nào thì cũng vẫn phải lặp 100 lần.

Trong Pascal câu lệnh dùng để mô tả lặp với số lần biết trước là câu lệnh lặp for-do với hai dạng tiến và lùi.

-Dạng tiến:

      for:= to do ;

-Dạng lùi:

      for:= downto do ;

Trong đó:

– Biến đếm: Là biến đơn, thường có kiểu nguyên.

– Giá trị đầu, Giá trị cuối: là các biểu thức cùng kiểu với biến đếm và giá trị đầu phải nhỏ hơn hoặc bằng giá trị cuối. Nếu giá trị đầu lớn hơn giá trị cuối thì vòng lặp không thực hiện.

Cơ chế hoạt động của câu lệnh for-do:

– Ở dạng lặp tiến, câu lệnh viết sau từ khóa do được thực hiện tuần tự, mỗi lần thực hiện thì biến đếm nhận giá trị tăng liên tiếp từ giá trị đầu đến giá trị cuối.

– Ở dạng lặp lùi, câu lệnh viết sau từ khóa do được thực hiện tuần tự, mỗi lần thực hiện thì biến đếm nhận giá trị giảm liên tiếp từ giá trị đầu đến giá trị cuối.

Ví dụ:

Chương trình tính bài toán 1 dưới dạng tiến.

program Tongtien; uses crt; var S:real; a,n: integer; begin clrscr; writeln('hay nhap gia tri cua a '); readln(a); S:=1.0/a; for N:=1 to 100 do S:=S+1.0/(a+N); writeln('Tong S la:',S:8:4); readln; end.

Viết chương trình tính và đưa ra màn hình trung bình cộng các số lẻ trong phạm vị từ 1 đến 100

Chương trình tính bài toán 1 dưới dạng lùi.

program Tonglui; uses crt; var S:real; a,n: integer; begin clrscr; writeln('hay nhap gia tri cua a '); readln(a); S:=1.0/a; for N:=100 downto 1 do S:=S+1/(a+N); writeln('Tinh tong lui-Tong S la:',S:8:4); readln; end.

Kết quả:

Viết chương trình tính và đưa ra màn hình trung bình cộng các số lẻ trong phạm vị từ 1 đến 100

Ví dụ 2: Viết chương tình thực hiện việc nhập từ bàn phím hai số nguyên dương M và N (M

Phân tích: Thực hiện việc lặp tiến hoặc lùi trong khoảng M và N. Giả sử ta có biến đếm I sẽ nhận giá trị lần lượt từ M đến N (trong đếm tiến) và từ N giảm dần về M (trong đếm lùi). Với mỗi giá trị của I ta sẽ kiểm tra nếu I chia hết cho 3 hoặc I chia hết cho 5 thì ta sẽ cộng nó vào tổng (Tổng ban đầu được gán là 0). Cuối cùng ta in ra tổng rồi kết thúc bài toán.

Code:

program tongchiahet3va5; uses crt; var S:integer; M,N,i: integer; begin clrscr; writeln('hay nhap gia tri cua M va N '); readln(M,N); S:=0; for i:=M to N do if(i mod 3=0) or (i mod 5=0) then S:=S+i; writeln('Tong cua cac so chia het cho 3 hoac 5 trong doan M N la ',S); readln; end.

Kết quả:

Viết chương trình tính và đưa ra màn hình trung bình cộng các số lẻ trong phạm vị từ 1 đến 100

3. Lặp với số lần chưa biết.

Sử dụng phương pháp lặp với số lần chưa biết ta có thể xây dựng cách giải bài toán 2 như sau:

Bước 1: S:=1/a; N:=0;

Bước 2: Nếu 1/(a+N)<0.0001 thì chuyển đến bước 5;

Bước 3: Tăng giá trị N lên 1. N:=N+1;

Bước 4: S:=S+1/(a+N); rồi quay lại bước 2.

Bước 5: Đưa S ra màn hình rồi kết thúc.

Như vậy việc lặp không biết trước sẽ chỉ kết thúc khi mọt điều kiện cho trước không được thỏa mãn.

Trong Pascal mô tả cấu trúc lặp với số lần chưa biết trước như sau:

While<điều kiện> do;

Trong đó:

– Điều kiện là biểu thức logic.

– Câu lệnh là một câu lệnh đơn hoặc ghép.

Chương trình tính bai toán 2:

program baitoan2; uses crt; var S:integer; a,N: integer; begin clrscr; writeln('hay nhap gia tri cua a '); readln(a); S:=0; S:=S+1.0/a; N:=0; while not (1/(a+N)<0.0001) do begin N:=N+1; S:=S+1.0/(a+N); end; writeln('Tong S la ',S:8:4); readln; end.

Kết quả:

Viết chương trình tính và đưa ra màn hình trung bình cộng các số lẻ trong phạm vị từ 1 đến 100

Ví dụ 2: Tìm ước chung lớn nhất của hai số nguyên dương M và N.

Có nhiều giải thuật tìm ước chung lớn nhất của 2 số. Sau đây là một thuật toán.

Bước 1: Nhập M,N;

Bước 2: Nếu M=N thì lấy giá trị chung này làm ước chung lớn nhất rối chuyển đến bước 5.

Bước 3: Nếu M>N thì M:=M-N ngược lại N:=N-M;

Bước 4: Quay lại bước 2.

Bước 5: Đưa ra kết quả ước chung lớn nhất rồi kết thúc.

Chương trình:

program ucln; uses crt; var M,N:integer; begin clrscr; writeln('Nhap gia tri M va N :'); readln(M,N); while M<>N do if M>N then M:=M-N else N:=N-M; writeln('uoc chung lon nhat la ',M); readln; end.

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:

  • Sách Giáo Viên Tin Học Lớp 11

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ố.

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ử.

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).

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ố ).

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:

Viết chương trình tính và đưa ra màn hình trung bình cộng các số lẻ trong phạm vị từ 1 đến 100

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

Viết chương trình tính và đưa ra màn hình trung bình cộng các số lẻ trong phạm vị từ 1 đến 100

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.

Viết chương trình tính và đưa ra màn hình trung bình cộng các số lẻ trong phạm vị từ 1 đến 100

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ả:

Viết chương trình tính và đưa ra màn hình trung bình cộng các số lẻ trong phạm vị từ 1 đến 100

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.

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.

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ả :

Viết chương trình tính và đưa ra màn hình trung bình cộng các số lẻ trong phạm vị từ 1 đến 100

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ả:

Viết chương trình tính và đưa ra màn hình trung bình cộng các số lẻ trong phạm vị từ 1 đến 100

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.