Vấn đề 5: Câu lệnh lặp For …do trọng tâm của chương trình - Cú pháp: For := to do ; Trong đó: + Biến đếm, giá trị đầu, giá trị cuối là các số nguyên + Giá trị đầu nhỏ hơn hoặc bằng giá [r]
(1)CHƯƠNG TRÌNH ÔN TẬP HỌC KỲ II TIN HỌC GV soạn: Phạm Tấn Phát Ngày soạn: 10/04/2009, cập nhật lại lúc 19/04/2010 -A./ Nội dung các bài học cần xem: Bài 7: Câu lệnh lặp Bài TH5: Sử dụng lệnh lặp For … Bài 8: Lặp với số lần lặp chưa biết trước Bài TH6: Sử dụng lệnh lặp While… Bài 9: Làm việc với dãy số Bài TH7: Xử lý dãy số chương trình Xem lại nội dung HK1: + Các kiểu liệu + Cách khai báo biến, khởi tạo và sử dụng biến, phép gán giá trị cho biến + Cấu trúc chung chương trình + Các phép toán: +, -, *, / , <>, >=, <=, >, <, mod, div, and, or và biểu thức điều kiện + Câu lệnh điều kiện if … then … else … B./ Một số gợi ý ôn tập (Đây không phải là đề thi học kỳ II) Vấn đề 1: Các kiểu liệu và khai báo biến: Kiểu Byte (Số nguyên) Integer (Số nguyên) Phạm vi 0255 Real (Số thực) -2,9x10-39 1,7x1038 Char (Một ký tự) ‘A’’Z’ Var kytu:char; String (Xâu ký tự) array (Dãy/mảng) ‘abc156’ ‘Hoang Van Thu’ Byte, Integer, Real,String,… var hoten:string; -215 215-1 (-3276832767) Cách khai báo var diem:Byte; var thang:Byte; var a:integer; var so_luong:integer; var i:integer; var tong:integer; var diemtb:real; var dvan,dtoan,dly:real; var a:array[1 10]of byte; var diem:array[1 50] of real; Phép gán readln(diem); diem:=5; readln(thang); thang:=12; readln(a); a:=28; readln(so_luong); so_luong:= 4096; i:=1;i:=i+1; tong:=0; tong:=tong + i; readln(dvan); readln(dtoan); readln(dly); diemtb:=(dvan*2+dtoan*2+dly)/5; readln(kytu); kytu:= ‘Y’; readln(hoten); Hoten:=’Hoang Van Thu’; For i:=1 to 10 to readln(a[i]); For i:=1 to 50 readln(diem[i]); A[5]:=10; Max:=A[i]; Max:=diem[i]; Min:=diem[i]; Lưu ý: + Biến dùng để lưu giữ giá trị thực chương trình, kết thúc chương trình biến đó bị xóa và giải phóng vùng nhớ cấp phát + Trong quá trình thực chương trình ta muốn thay đổi giá trị biến câu lệnh gán, còn có câu lệnh read(dstenbien) readln(dstenbien) hai câu lệnh này tương tác người dùng và máy và kết thúc việc nhập giá trị cho biến ta phải nhấn phím Enter + Câu lệnh Writeln(‘Cau thong bao man hinh’,tenbien) in màn hình câu thông báo và giá trị tenbien sau tính toán xong Vấn đề 2: Cấu trúc chung chương trình Program Ten_chuong_trinh; {khai bao ten chuong trinh} Uses crt; {khai bao thu vien lien quan den lenh xoa man hinh clrscr} Var … {khai bao bien} Begin Clrscr; {lenh xoa man hinh} …… Readln {lenh dung man hinh de xem ket qua cho nhan Enter} Phần thân chương trình + Nơi nhập giá trị cho biến + Xử lý và tính toán + In kết End Lưu ý: Trong chương trình có thể sử dụng nhiều câu lệnh begin … end; để thi hành nhiều lệnh lồng nhau, thường sử dụng các câu lệnh Trang Lop8.net (2) if … then begin…end else begin …end; Hoặc for … begin … end; Hoặc while … begin …end; Vấn đề 3: Biểu thức điều kiện + Biểu thức điều kiện là biểu thức so sánh và cho kết là đúng sai tương ứng mệnh đề toán học + VD: Var a,b:integer;Begin If a > b then a:=a-b else b:=b-a; end Var a,b:integer; Begin If a mod b =0 then write(‘a chia cho b du la 0’) else write(‘a chia cho b du khac 0’); end Var a,b:integer; Begin If a div b =5 then write(‘a chia cho b duoc thung la 5’) else write(‘a chia cho b duoc thuong khac5’); end Var a,b,c:real; Begin If (a*a+b*b=c*c) or (b*b+c*c=a*a) or (c*c+a*a=b*b) then write(‘Bo ba so (’,a,’,’,b’,’,c,’) la bo ba Pitago.’) else write(‘Bo ba so (’,a,’,’,b’,’,c,’) khong la bo ba Pitago.’) end Var a,b,c:real; Begin If (a+b>c) and (b+c>a) and (c+a>b) then write(‘Bo ba so (’,a,’,’,b’,’,c,’) la ba canh cua mot tam giac.’) else write(‘Bo ba so (’,a,’,’,b’,’,c,’) khong la ba canh cua mot tam giac.’) end Vấn đề 4: Câu lệnh điều kiện if … then … else … + Cú pháp: If dieu_kien then cau_lenh; If dieu_kien then cau_lenh_dung else cau_lenh_sai; + Ví dụ: 1./ VD1: Viết chương trình nhập vào số và thông báo lên màn hình số đó là chẵn hay lẽ? Program VD1; Uses crt; Var a:integer; Begin Clrscr; Writeln(‘Nhap mot so nguyen:’);Readln(a); If (a mod 2=0) then Writeln(‘So ‘, a,’ la so chan!’) Else Writeln(‘So ‘, a,’ la so le!’); Readln End 2./ VD2: Viết chương trình nhập vào ba số (a,b,c) và kiểm tra ba số này có là độ dài ba cạnh tam giác hay không ? Program VD2; Uses crt; Var a,b,c:Real; Begin Clrscr; Writeln(‘Nhap so a:’);Readln(a); Writeln(‘Nhap so b:’);Readln(b); Writeln(‘Nhap so c:’);Readln(c); If (a>=0) and (b>=0) and (c>=0) then If (a+b>c) and (b+c>a) and (c+a>b) then write(‘Bo ba so (’,a,’,’,b’,’,c,’) la ba canh cua mot tam giac.’) else write(‘Bo ba so (’,a,’,’,b’,’,c,’) khong la ba canh cua mot tam giac.’) else Writeln(‘Cac so tren muon la dai ba canh tam giac phai la so duong’); Readln End 3./ VD3: Viết chương trình nhập vào ba số, kiểm tra ba số đó có là độ dài ba cạnh tam giác vuông hay không ? Program VD3; Uses crt; Trang Lop8.net (3) Var a,b,c:Real; Begin Clrscr; Writeln(‘Nhap so a:’);Readln(a); Writeln(‘Nhap so b:’);Readln(b); Writeln(‘Nhap so c:’);Readln(c); If (a>=0) and (b>=0) and (c>=0) then If (a*a+b*b=c*c) and (b*b+c*c=a*a) and (c*c+a*a=b*b) then write(‘Bo ba so (’,a,’,’,b’,’,c,’) la ba canh cua mot tam giac vuong.’) else write(‘Bo ba so (’,a,’,’,b’,’,c,’) khong la ba canh cua mot tam giac vuong.’) else Writeln(‘Cac so tren muon la dai ba canh tam giac phai la so duong’); Readln End Vấn đề 5: Câu lệnh lặp For …do (trọng tâm chương trình) - Cú pháp: For <biendem>:=<gia tri dau> to <gia tri cuoi> <cau lenh>; Trong đó: + Biến đếm, giá trị đầu, giá trị cuối là các số nguyên + Giá trị đầu nhỏ giá trị cuối + Câu lệnh có thể là câu lệnh đơn giản (một câu lệnh) câu lệnh ghép (từ hai câu lệnh ) + Mỗi lần lặp lại câu lệnh biến đếm tăng lên đơn vị, vừa lớn giá trị cuối thì dừng, số lần lặp lại giá trị cuối-giá trị đầu +1 - Một số ví dụ minh họa: + VD1: Hãy cho biết các câu lệnh sau đúng hay sai, sai sửa lại cho đúng ? a./ Var i: real; Begin For i:=1 to 10 write(i,’ ‘); readln end Trả lời:………………………… b./Var i: byte; Begin For i:=1 to 257 write(i,’ ‘); readln end Trả lời:…+……………………… c./ Var i: integer; Begin For i:=1 to 32767 write(i,’ ‘); readln end Trả lời:………………………… d./ Var i: integer; Begin For i:=1 to 10.5 write(i,’ ‘); readln end Trả lời:………………………… e./ Var i: integer; Begin For i:=1 to 10 begin write(i,’ ‘); S:=S+i; readln end Trả lời:………………………… f./ Var k: integer; Begin For k:=10 to 10 write(i,’ ‘); readln end Trả lời:………………………… g./ Var k: integer; Begin For k:=10 to write(i,’ ‘); readln end Trả lời:………………………… + VD2: Hãy tính số lần lặp câu lệnh sau ? a./ S:=0; For i:=1 to 15 S:=S+i; Trả lời:………15-1+1=15………………… b./ S:=0; For j:=5 to 11 if (j mod 2=0) then S:=S+j; Trả lời:…………11-5+1=7……………… c./ S:=0; For k:=31 to 49 if (k mod 2<>0) then S:=S+k; Trả lời:………49-31+1=19………………… d./ S:=0; For m:=9 to 11 if (m>=10) then S:=S+m; Trả lời:……11-9=3…………………… e./ S:=0; For n:=9 to1 if (n>=4) then S:=S+n; Trả lời:……0…………………… f./ S:=0; For n:=9 to9 if (n>=5) then S:=S+n; Trả lời:………9-9+1=1………………… + VD3: Chạy bước đoán kết và trả lời giá trị các biến yêu cầu ? a./ Var k,s: integer; Begin s:=0; For k:=13 to 19 s:=s+k; readln end Trả lời: S=…112…… ;k=……19……… b./ Var i: integer; Begin s:=0; For i:=2 to s:=s*i; readln end Trả lời: S=……0… ;i=…7………… c./ Var i: integer; Begin s:=1; For i:=2 to s:=s*i; readln end Trả lời: S=……120… ;i=…5………… d./ Var i: integer; Begin s:=0; For i:=1 to s:=s+i*i; readln end Trả lời: S=…55…… ;i=……5……… e./ Var i: integer; Begin s:=0; For i:=4 to s:=s+1/i; readln end Trả lời: S=…0,45…… ;i=………5…… f./ Var i: integer; Begin s:=0; For i:=5 to 8do s:=s+1/i*(i+2); readln end Trả lời: S=…1637/420…… ;i=……8……… + VD4: Hãy cho biết đoạn chương trình sau làm nhiệm vụ gì ? Trang Lop8.net (4) a./ Var i: integer; Begin s:=0; For i:=1 to if (i mod 2=0) then s:=s+i*i; readln end Trả lời: S=……… ;i=……………Kết luận:………… b./ Var i: integer; Begin s:=0; For i:=1 to if (i mod 2<>0) then s:=s+i*i; readln end Trả lời: S=……… ;i=……………Kết luận:………… c./ Var i: integer; Begin s:=0; For i:=1 to if (i mod 2=0) then s:=s+i; readln end Trả lời: S=……… ;i=……………Kết luận:………… d./ Var i: integer; Begin s:=0; For i:=1 to if (i mod 2<>0) then s:=s+i; readln end Trả lời: S=……… ;i=……………Kết luận:………… + VD5: Viết chương trình dùng câu lệnh For …do và if … then… a./ Hãy viết đoạn chương trình xử lý tìm các số nguyên từ đến 100 mà số đó phải thỏa mãn hai điều kiện là vừa chia hết cho và vừa chia hết cho ? b./ Hãy viết đoạn chương trình tìm xem có bao nhiêu số (a,b,c) là Pitago từ đến 100 với a,b,c nguyên dương và a<=b<=c Vấn đề 6: Câu lệnh lặp While … do…… - Cú pháp: While <dieu kien> <cau lenh>; Trong đó: + Điều kiện là biểu thức so sánh, tương tự điều kiện câu lệnh if <dieukien> then … + Câu lệnh có thể là câu lệnh đơn giản hay câu lệnh ghép begin….end; + Trong điều kiện còn đúng thì thực câu lệnh, còn điều kiện sai thì thoát khỏi câu lệnh lặp while và thực câu lệnh sau câu lệnh while - Một số ví dụ minh họa: + VD1: Tính tổng các phần tử từ đến 100 Program Tong; Uses crt; Var S,i:integer; Begin Clrscr; S:=0; i:=1; While i<=100 Begin S:=S+i; i:=i+1; end; Readln End + VD2: Tính tổng các phần tử chẵn từ đến 100 Program Tong_chan; Uses crt; Var Sc ,i:integer; Begin Clrscr; Sc:=0; i:=1; While i<=100 Begin If (i mod =0) then Sc:=Sc+i; i:=i+1; end; Writeln(‘Tong cac phan tu chan tu den 100 la: ‘,Sc); Readln End + VD3: Tính tổng các phần tử lẻ từ đến 100 Program Tong_le; Uses crt; Var Sle ,i:integer; Begin Clrscr; Sle:=0; i:=1; While i<=100 Begin If (i mod <>0) then Sle:=Sle+i; i:=i+1; end; Writeln(‘Tong cac phan tu le tu den 100 la: ‘,Sle); Readln Trang Lop8.net (5) End + VD4: In các ước số nguyên nhập từ bàn phím Program Uocso; {Cau lenh in cac uoc bang For…do} Uses crt; Program Uocso; Var i,n:integer; Begin Uses crt; Clrscr; Var i,n:integer; Write(‘Nhập số nguyên’);Readln(n); Begin i:=1; Clrscr; Write(‘Cac uoc cua ‘ ,n,‘ la: ‘); Write(‘Nhập số nguyên’);Readln(n); While ( i<=n) begin i:=1; if (n mod i)=0 then write(i,’ ‘); Write(‘Cac uoc cua ‘ ,n,‘ la: ‘); i:=i+1; For i:=1 to n end; if (n mod i)=0 then write(i,’ ‘); Readln Readln End + VD5: Tính tổng các ước số nguyên nhập từ bàn phím End Program Tonguoc; Uses crt; Var S,n,i:integer; Begin clrscr; S:=0; i:=1; Write(‘Nhap so nguyen n’);readln(n); while i<=n begin if n mod i=0 then S:= S+ i; i:= i+1; end; Writeln(‘Tong cac uoc cua ’,n,’ la ’,S); Readln End + VD6: Nhập vào số kiểm tra xem số đó có là số hoàn chỉnh không Program Sohoanchinh; Uses crt; Var S,n,i:integer; Begin clrscr; S:=0; i:=1; Write(‘Nhap so nguyen n’);readln(n); while i<=n begin if n mod i=0 then S:= S+ i; i:= i+1; end; Writeln(‘Tong cac uoc cua ’,n,’ la ’,S); if S=2*n then Writeln(‘So ‘,n,’ la so hoan chinh’) else Writeln(‘So ‘,n,’ khong la so hoan chinh’); Readln End + VD7: In các số hoàn chỉnh từ đến 1000 (hs tự làm) Program Sohoanchinh; Uses crt; Var S,n,i:integer; Begin clrscr; S:=0; i:=1; Write(‘Nhap so nguyen n’);readln(n); For n:=1 to 1000 Begin i:=1;S:=0; Writeln(‘Cac so hoan chinh tu den 1000 la: ‘); while i<=n begin if n mod i=0 then S:= S+ i; i:= i+1; end; if S=2*n then Writeln(n,’ ‘) ; end; Readln End Vấn đề 7: Làm việc với dãy số, xử lý dãy số chương trình Trang Lop8.net (6) - Cú pháp: Var Tenmang:array[chisodau chisocuoi] of Kieudulieu Ví dụ cụ thể: Var a: array[1 10] of integer; - Một số ví dụ: (Đọc tìm hiểu chương trình và làm phần bài tập phía sau) + VD1: Nhập các phần tử vào dãy Program VD1; Uses crt; Var a:array[1 10] of integer; Begin Clrscr; For i:=1 to 10 begin write(‘phan tu thu ‘,i); readln(a[i]); end; Readln End + VD2: Xuất các phần tử từ dãy đưa màn hình Program VD2; Uses crt; Var a:array[1 10] of integer; Begin Clrscr; Write(‘Cac phan tu cua mang: ‘); For i:=1 to 10 write(a[i],’ ‘); Readln End + VD3: Tìm phần tử lớn dãy Program VD3; Uses crt; Var a:array[1 10] of integer; max:integer; Begin Clrscr; max:=a[1]; For i:=1 to 10 if a[i]>max then max:=a[i]; Write(‘Phan tu lon nhat cua mang: ‘,max); Readln End + VD4: Tìm phần tử nhỏ dãy Program VD4; Uses crt; Var a:array[1 10] of integer; min:integer; Begin Clrscr; min:=a[1]; For i:=1 to 10 if a[i]<min then min:=a[i]; Write(‘Phan tu lon nhat cua mang: ‘,min); Readln End + VD5: Tính tổng các phần tử dãy Program VD5; Uses crt; Var a:array[1 10] of integer; S:integer; Begin Clrscr; S:=0; For i:=1 to 10 S:=S+a[i]; Write(‘Tong cac phan tu cua mang: ‘,S); Readln End + VD6: Tính trung bình cộng các phần tử dãy Program VD6; Uses crt; Trang Lop8.net (7) Var a:array[1 10] of integer; S:real; Begin Clrscr; S:=0; For i:=1 to 10 S:=S+a[i]; S:=S/10; Write(‘Tong cac phan tu cua mang: ‘,S); Readln End + VD7: Tính tổng các phần tử chẵn,tổng các phần tử lẻ Program VD7; Uses crt; Var a:array[1 10] of integer; TC,TL:integer; Begin Clrscr; TC:=0;TL:=0; For i:=1 to 10 if (a[i] mod 2=0) then TC:=TC+a[i] else TL:=TL+a[i]; Writeln(‘Tong cac phan tu chan cua mang: ‘,TC); Writeln(‘Tong cac phan tu le cua mang: ‘,TL); Readln End + VD8: Trong các câu lệnh lặp, câu lệnh nào sai và sai đâu ? a./ while i:=1 t:=10; b./ while a<=b; write(‘b khong nho hon a’); c./ while 1=1 write(‘Toi lap trinh gioi’); d./ i:=1; while i<10 sum:=sum+1; i:=i+1; e./ i:=1; x:=5; while i<x i:=i+1; write(‘Gia tri cua i la ‘,i); + VD9: Đoạn lệnh sau đây cho kết gì ? so:= 1; while so<10 writeln(so); so:=so+1; a./ In các số từ đến 9; b./ In các số từ đến 10; c./ In vô hạn các số 1, số trên hàng; d./ Không phương án nào đúng + VD10: Hãy chạy bước và đoán giá trị biến x sau đoạn chương trình trên thực x:=0; tong:=0; while tong<=20 begin writeln(tong); tong:=tong+1; end; x:=tong; Kết quả: x=………………… + VD11: Tìm hiểu đoạn chương trình sau và cho biết giá trị các biến i, j, k a./ i:=1; j:=2; k:=3; while i<6 i:=i+1; j:=j+1; k:=k+j; space:=’ ‘; writeln(i,space,j,space,k); Kết quả: i =……; j =…… ; k =…… b./ i:=1; j:=2; k:=3; while i<6 begin i:=i+1; j:=j+1; k:=k+j; end; space:=’ ‘; writeln(i,space,j,space,k); Kết quả: i =……; j =…… ; k =…… + VD12: Hãy viết đoạn chương trình yêu cầu người sử dụng nhập số thực khoảng từ đến 10 và yêu cầu nhập lại không thỏa mãn + VD13: Viết chương trình sử dụng câu lệnh lặp while …do để tính tổng S = + 1/2 + 1/3 + …+ 1/n Với 1/n <, giá trị là sai số cho trước và nhập vào từ bàn phím + VD14: Viết chương trình tìm ước chung lớn hai số nguyên a và b nhập từ bàn phím + VD15: Dựa vào ý tưởng VD14 hãy viết chương trình tính tổng hai phân số a/b và c/d nhập vào bàn phím theo cú pháp sau Write(‘Nhap phan so a/b’);readln(a,b); Write(‘Nhap phan so c/d’);readln(c,d); Trang Lop8.net (8) Xuất màn hình tổng hai phân số theo cú pháp sau Write(‘Tong hai phan so: ‘,a,’/’,b,’+’,c,’/’,d,’=’,tong); Vấn đề 8: Một số câu hỏi tham khảo + VD1: Các lệnh khai báo mảng Pascal sau đây là đúng hai sai? Hãy giải thích a./ var a: array[1…1000] of integer; b./ var b: array[1 n] of real; c./ var c: array[1:n] of real; d./ var d: array[-7 7] of byte; e./ var x: array[100 1] of real; f./ var y: array(-1 10] of byte; + VD2: Các lệnh khai báo mảng Pascal sau đây là đúng hai sai, sai hãy giải thích ? a./ var a: array[1,20] of real; b./ var xau: array[255 1] of longint; c./ var so: array[1.1 1.10] of integer; d./ var kitu: array(1 255) of real; e./ var y: array[1,,100] of integer; + VD3: Các lệnh Pascal sau là đúng hay sai, hãy chổ sai có ? a./ for i:=1 to 10; x:=x+1; b./ for i:=10 to x:=x+1; c./ for i:=1 to 10 x:=x+1; d./ for i:=1 to 10 for j:=1 to 10 x:=x+1; e./ for i:=1 to 10 for i:=1 to 10 x:=x+1; + VD4: Hãy cho biết các biến i , j, k là nguyên Giá trị i,j , k in màn hình là bao nhiêu ? a./ i = …….; j =…… ;k = ……… j:=2; k:=3; for i:=1 to j:=j+1; k:=k+j; cach:=’ ‘; writeln(j,cach,k); b./ i = …….; j =…… ;k = ……… j:=2; k:=3; for i:=1 to begin j:=j+1; k:=k+j; end; cach:=’ ‘; writeln(j,cach,k); c./ i = …….; j =…… ;k = ……… j:=2; k:=3; for i:=1 to if i mod =0 then j:=j+1; k:=k+j; cach:=’ ‘; writeln(j,cach,k); + VD5: Câu lệnh sau thực bao nhiêu lần For i:=1 to 10 begin … end; a./ không lần nào b./ lần c./ lần d./ 10 lần + VD6: Đoạn chương trình sau đây làm việc gì (chạy thử n=5 và trả lời)? a./ s:=0; for a:=1 to n s:=s+a*a; b./ for i:=1 to n i:=i+2; + VD7: Sửa lỗi có và cho biết chương trình sau đây làm việc gì ? a./ for i:=0 to 1.5 write(i:3:1); b./ s:=0; for i:=2 to 3900 if i mod 2=0 then s:=s+i; Vấn đề 9: Một số bài tập gợi ý (dành cho hs giỏi, muốn đạt 10 điểm) a./ Số Fibonacci ký hiệu là Fn F1=F2=1; Fn=Fn-1+Fn-2 (với n>=3) Hãy viết chương trình in màn hình các số Fibonacci từ1 đến 100 b./ Số Amstrong là số tổng lập phương các chữ số chính nó, ví dụ 153=1^3+5^3+3^3 Hãy viết chương trình in các số Amstrong từ đến 999 c./ In các số hoàn chỉnh <=1000 (xem VD) d./ Số m và n là hai số bạn bè tổng các ước thực m n và ngược lại tổng các ước thực n m Hãy viết chương trình tìm các số bạn bè từ đến 1000 Ví dụ: 284 và 220 là cặp số bạn bè vì tổng các ước thực 284 220 và ngược lại, tổng các ước thực 220 284 Ước thực là không kể số và chính nó sau: “Số nguyên dương p gọi là ước thật số nguyên n, n chia hết cho p và p khác và chính số n.” e./ Viết chương trình tính x^n với x và n là hai số nguyên dương nhập từ bàn phím ? Trang Lop8.net (9)