1. Trang chủ
  2. » Giáo Dục - Đào Tạo

De HSG Hay20162017 13

16 10 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

LệnhP cũng được gọi là thân của vòng lặp REPEAT, nếu nó gồm nhiều lệnh thì các lệnh đó không cần phải đặt trong khối begin va?end.. Nếu Ðiềukiện không bao giờ đúng thì LệnhP sẽ phải làm [r]

(1)CÂU LỆNH LẶP FOR Câu lệnh FOR dạng 1: 1.1 Cú pháp , lưu đồ, cách thức hoạt động : Cú pháp: FOR biến := m1 TO m2 DO LệnhP; Yêu cầu: biến phải thuộc kiểu liệu đơn giản đếm được, thường là kiểu nguyên, ký tự hay lô gic, không thể là kiểu thực hay chuỗi m1, m2 là các biểu thức có cùng kiểu liệu với biến, LệnhP có thể là lệnh đơn giản, lệnh có cấu trúc, là lệnh ghép gồm nhiều lệnh đặt khối begin và end Hình 9.1 là sơ đồ khối lệnh For với b là viết tắt biến Cách thức hoạt động FOR: Bước 1: Gán giá trị biến := m1; Bước 2: Nếu biến <= m2 thì làm Lệnh P, sang bước 3; Nếu biến > m2 thì không làm LệnhP mà chuyển sang lệnh phía Bước : Tăng gía trị biến : biến:=Succ(biến); Quay lại bước Tóm lại, LệnhP làm làm lại, bắt đầu biến=m1, và kết thúc biến =m2+1, thảy là m2-m1+1 lần Vì thế, người ta gọi FOR là vòng lặp có số lần lặp đã biết trước 1.2 Các ví dụ : Ví dụ 9.1: Bài toán tính tổng : Hãy tính tổng : S= 12 + 22+ 32+ + 102 Thuật toán: Bước 0: gán S:=0; { gán gía trị ban đầ? cho S} Bước 1: gán S:=S+1*1; { S=12 } Bước 2: gán S:=S+2*2; { S=12+22} Bước 3: gán S:=S+3*3; { S=12+22+32} v.v Bước 10: gán S:=S+10*10; { S=12+22+32+ +102} Qúa trình từ bước đến bước 10 gọi là phép cộng dồn vào biến S Tại bước thứ i, lấy gía trị biến S cộng với i2, kết qủa lại gán cho biến S, đó gía trị biến S tăng thêm lượng bằ?g i Khi i thay đổi từ đến 10 thì các số 2, 22, 32, , 102 cộng vào S, kết qủa là sau bước thứ 10 gía trị S đúng tổng 12 + 22 + 32 + + 102 (2) Tóm lại, lệnh: S:=S + i*i; làm thảy 10 lần, ứng với i=1, 2, , 10 Qúa trình này diễn đạt lệnh FOR, sau: For i:=1 To 10 DO S:=S+ i*i ; Một cách tổng quát, để tính tổng :S= + 22+ 32+ + N2 , đó N là số nguyên dương bất kỳ, ta dùng hai lệnh: S:=0; For i:=1 To N DO S:=S+ i*i ; Dưới đây là chương trình cụ thể : PROGRAM VIDU91; { Tính tổng các bình phương các số tự nhiên <=N} Var N, i : Integer; S : LongInt; Begin Write(‘ Nhập N :’); Readln(N); S:=0; For i:=1 to N S:=S+i*i ; Writeln(‘S= ‘, S); Readln; End Mở rộng bài toán tính tổng: Tính tổng đan dấu : S = 12 - 22 + 32 - 42 + +(-1)N-1 N2 Ta viết: S = 12 + (- 22 ) + 32 + (- 42 ) + +(-1)N-1 N2 Nhận thấy, số hạng thứ i vế phải có gía trị tuyệt đối i , mang dấu cộng i lẻ, mang dấu trừ i chẵn Nói cách khác, ta cộng dồn i vào S i lẻ, và cộng dồn (- i ) vào S i chẵn Việc xác định i lẻ hay chẵn dựa vào hàm Odd(i) hay kết qủa phép toán i Mod Vậy, các lệnh dùng là : S:=0; For i:=1 To N DO if i mod <> then S:=S+ i*i else S:= S- i*i ; Các bạn hãy viết chương trình để tính tổng đan dấu này Ví dụ 9.2: Bài toán tính tích: Tính S= 10! Ta viết S=1*2*3* *10 Thuật toán: Bước 0: gán S:=1; { gán gía trị ban đầu cho S} Bước 1: gán S:=S*1; { S=1 } Bước 2: gán S:=S*2; { S=1*2} Bước 3: gán S:=S*3; { S=1*2*3} v.v Bước 10: gán S:=S*10; { S=1*2*3* *10 =10!} Nếu ví dụ 1, ta phải cộng dồn vào biến S thì ví dụ này ta phải nhân dồn vào biến S Tại bước thứ i, lấy gía trị biến S nhân với i, lại gán kết qủa cho biến S Khi i thay đổi từ đến 10 thì S tích lũy đủ các thừa số 1, 2, 3, ,10, và gía trị S sau bước thứ 10 đúng 1*2*3* *10 =10! Qúa trình thực từ bước đến bước thứ 10 mô tả câu lệnh For : For i:=1 to 10 DO S:=S * i ; Một cách tổng quát, để tính tích: S= 1*2* *N , đó N là số nguyên dương bất kỳ, ta dùng hai lệnh: S:=1; For i:=1 To N DO S:=S* i ; Dưới đây là chương trình cụ thể : PROGRAM VIDU92; { Tính S=N! } Var (3) N, i : Integer; S : LongInt; Begin Write(‘Nhập số dương N : ‘); Readln(N); S:=1; For i:=1 to N S:=S * i ; Writeln(‘Giai thua = ‘, S); Readln; End Ví dụ 9.3: Bài toán tính lũy thừa: Nhập số tự nhiên N và số thực x bất kỳ, tính S= xN Tương tự tính N!: đầu tiên ta gán S:=1, sau đó bước lặp, ta nhân dồn x vào S lệnh S:=S*x Sau N bước vậy, S nhân với x đúng N lần Vậy hai lệnh cần dùng là: S:=1; For i:=1 TO N DO S:=S*x; Dưới đây là chương trình cụ thể : PROGRAM VIDU93; { Tính S=lũy thừa N x } Var N, i : Byte ; S, x : Real ; Begin Write(‘Nhập hai số x và N : ‘); Readln( x, N); S:=1; For i:= to N S := S * x ; Writeln(‘Luy thua= ‘, S : 6:2); Readln; End Ví dụ 9.4: In bảng các chữ cái từ A đến Z thành bốn cột sau: KÝ TỰ MÃ KÝ TỰ MÃ A 65 a 97 B 66 b 98 Yêu cầu in thành trang màn hình, trang 15 dòng Trong chương trình ta dùng biến Dem để đếm số dòng đã in, in xong dòng thì biến Dem cộng thêm Khi Dem = 15, 30, 45, (tức Dem mod 15=0) thì phải làm lệnh Readln; lệnh này dừng màn hình ta gõ Enter in tiếp PROGRAM VIDU94; { In bảng các chữ cái} Uses Crt; Var ch, ch1 : Char; Dem: Integer; Begin CLRSCR; Writeln(‘ KY TU MA KY TU MA’); Dem:=0; For ch:=‘a’ to ‘z’ begin ch1:=Upcase(ch); (4) Writeln( ch1 :3 , Ord(ch1) :6 , ch :6 , Ord(ch) :6 ); Inc(Dem); If Dem mod 15 = then begin Write(‘ Enter để xem tiếp ‘); Readln; end; end; Writeln(‘ HET ‘); Readln; End Chương trình trên là ví dụ cách dùng biến chạy kiểu ký tự (ch) lệnh FOR, ngoài ra, đóng vai trò LệnhP là lệnh ghép, gồm nhiều lệnh đặt khối begin và end Câu lệnh FOR dạng 2: Cú pháp: FOR biến := m2 DOWNTO m1 DO LệnhP; Cách thức hoạt động FOR dạng 2: Bước 1: gán gía trị biến := m2; Bước 2: Nếu biến >= m1 thì làm LệnhP, sang bước Nếu biến<m1 thì không làm LệnhP mà chuyển sang lệnh phía Bước : Giảm gía trị biến : biến:=Pred(biến); Quay lại bước Tóm lại, LệnhP làm làm lại, bắt đầu biến=m2, và kết thúc biến = m1-1, thảy là m2-m1+1 lần Ví dụ 9.5: Ðể tính S= N!, ta có thể viết : S=N*(N-1)*(N-2)* *2*1 Cách viết cho thấy cách tính: đầu tiên gán S:=1, sau đó thực việc nhân dồn S:=S* i với i= N, N-1, , 2, Tức là: S:=1; For i:=N downto S:=S* i; Tương tự , để tính S=xN , ta có thể dùng FOR dạng : S:=1; For i:=N downto S:=S* x; (5) Như vậy, lệnh FOR dạng chất là cách viết khác dạng Thông thường người ta hay dùng lệnh FOR dạng 1, nhiên có khá nhiều tình mà việc dùng lệnh FOR dạng tỏ hiệu qủa, ví dụ sau đây: Ví dụ 9.6 : In các chữ cái theo thứ tự ngược từ Z đến A thành hai dòng : Z, Y, X, , C, B, A z, y, x, , c, b, a Chương trình viết sau: PROGRAM VIDU96; { In các chữ cái theo thứ tự đảo ngược từ z đến a} Var Ch: Char; Begin For ch:=‘Z’ downto ‘A’ write(ch:3 ); Writeln; For ch:=‘z’ downto ‘a’ write(ch :3 ); Writeln; Readln; End Câu lệnh FOR lồng : Trong cấu trúc FOR, LệnhP là lệnh FOR thì ta có cấu trúc FOR lồng nhau: FOR biến1:= m1 TO m2 DO {1} FOR biến2:=n1 TO n2 DO LệnhP; {2} Cách thức hoạt động lệnh này sau: Ðầu tiên cho biến1:=m1 và làm lệnh dòng {2} Vì dòng {2} là lệnh FOR nên với gía trị biến2=n1, , n2, phải làm LệnhP, kết qủa là LệnhP làm n2-n1+1 lần Bây tăng: biến1:=Succ(biến1), lại làm lệnh FOR dòng {2}, kết qủa lệnhP làm thêm n2-n1+1 lần .v.v Qúa trình trên tiếp tục biến1=m2+1 thì dừng Lệnh FOR {1} làm m2-m1+1 lần lệnh FOR {2}, còn chính lệnh FOR {2} lại làm n2-n1+1 lần LệnhP Vì lệnhP làm thảy là (m2-m1+1)*(n2-n1+1) lần Ví dụ 9.7: In hình chữ nhật đặc đây: Ta thấy dòng gồm m chữ A, tức là chữ A in liên tiếp thảy m lần, việc này làm lệnh : For j:=1 to m write(‘A’); Lệnh Write in m chữ A trên dòng In xong, trỏ nằm cuối dòng đó, vì trước in dòng tiếp theo, cần phải đưa trỏ xuống dòng lệnh: Writeln; Tóm lại, muốn in dòng thứ i, cần phải làm hai lệnh: For j:=1 to m write(‘A’); Writeln; Cả thảy ta phải in n dòng thế, tức là: For i:=1 to n In dòng i ; Thay In dòng i hai lệnh nói trên (đặt khối begin end) , ta có thuật toán để in hình chữ nhật đặc là: For i:=1 to n begin (6) for j:=1 to m write(‘A’); Writeln; end; Các bạn hãy viết chương trình cụ thể cho ví dụ này, đây m và n là hai số nguyên dương nhập từ bàn phím Các ứng dụng khác lệnh FOR : Lệnh For thông dụng, dễ dùng và giải nhiều bài toán khoa học kỹ thuật và thực tiễn Dưới đây xin nêu hai ứng dụng Ví dụ 9.8: Tìm các số Fibonaci Dãy số Fibonaci { 1, 1, 2, 3, 5, 8, 13, 21, } nhắc nhiều giới khoa học kỹ thuật, nó xây dựng sau: U0=1, U1=1 , Uk=Uk-1 + Uk-2 với k= 2, 3, 4, Gọi U là số hạng thứ k, Uo và U1 là hai số hạng đứng trước U Ðầu tiên ta gán: Uo:=1; U1:=1; Bước 1: tính U:=Uo+U1 và in U Lúc này U=2 chính là U2 Ðể chuẩn bị tính U3, ta cho Uo đóng vai trò U1 và U1 đóng vai trò U, tức là gán: Uo:=U1; U1:=U; Kết qủa là Uo=1 và U1=2 Bước 2: tính U:=Uo+U1 và in U Lúc này U=3 chính là U3 Ðể chuẩn bị tính U4, ta lại cho Uo đóng vai trò U1 và U1 đóng vai trò U, tức là gán: Uo:=U1; U1:=U; Kết qủa là Uo=2 và U1=3 .v.v Tóm lại các lệnh phải lặp lặp lại là: U:=Uo+U1; Uo:=U1; U1:=U; Vì sang bước sau thì gía trị U bị thay đổi nên bước ta phải in U chương trình viết sau: PROGRAM VIDU98; { In N+1 số Fibonaci đầu tiên } Var N, i, U, Uo, U1 : Integer; Begin Write(‘ Nhập N :’); Readln(N); Uo:=1; U1:=1; Writeln( N+1 , ‘ số Fibonaci đầu tiên là :’ ); Write(Uo:3 , U1:3); For i :=2 to N begin U:=Uo+U1; Write(U:3); Uo:=U1; U1:=U; end; Readln; End Ví dụ 9.9: Bài toán tính tiền lãi gửi ngân hàng: (7) Nhập tiền vốn ban đầu, số tháng gửi N và lãi suất hàng tháng Tính số tiền nhận sau tháng gửi biết tiền lãi hàng tháng gộp vào tiền vốn Ví dụ, tiền vốn là100, lãi suất tháng là 2% Sau tháng gửi có số tiền là: Số tiền=100 + 100*0.02 = 102 Sau tháng gửi có số tiền là: Số tiền=102 + 102*0.02 = 104.04 Công thức tính tiền thu sau tháng gửi là: Số tiền := Tiền vốn + Tiền vốn * Lãi suất Số tiền này lại trở thành tiền vốn tháng sau, tức là: Tiền vốn := Số tiền; Qúa trình lặp lặp lại từ tháng đến tháng N Chương trình cụ thể sau: PROGRAM VIDU99; { Tính tiền gửi ngân hàng sau N tháng} Var Tienvon, Laisuat, Sotien : Real; N, i : Byte; Begin Write(‘ Nhập tiền vốn, lãi suất và số tháng gửi : ‘); Readln(Tienvon, Laisuat, N); For i:=1 to N begin Sotien:= Tienvon + Tienvon*Laisuat; Writeln(‘Số tiền sau ‘, i , ‘ tháng =‘ , Sotien:8:2); Tienvon:=Sotien; end; Readln; End CÂU LỆNH WHILE Cú pháp, lưu đồ, cách thức hoạt động : Cú pháp: WHILE Ðiềukiện DO LệnhP ; Ý nghĩa : Chừng nào Ðiềukiện còn đúng thì làm LệnhP , Ðiềukiện sai thì không làm LệnhP mà chuyển sang lệnh phía Cách thức hoạt động WHILE: Bước 1: Nếu Ðiềukiện sai thì chuyển sang lệnh sau LệnhP, ngược lại, Ðiềukiện đúng thì làm LệnhP, quay lại bước Lệnh P gọi là thân vòng lặp WHILE Nếu Ðiềukiện không sai thì LệnhP phải làm hoài, lúc đó ta có vòng lặp vô hạn Trong trường hợp này, để dừng chương trình, hãy gõ đồng thời hai phím Ctrl và Pause ( viết tắt là ^Pause) Ðể tránh các vòng lặp vô hạn, thân vòng WHILE cần có ít lệnh có tác dụng làm biến đổi các đại lượng tham gia Ðiềukiện để đến lúc nào đó thì Ðiềukiện sai và đó vòng lặp kết thúc Các ví dụ lệnh While : Ví dụ 9.10 : Nhập số tự nhiên N, dùng lệnh WHILE tính S=N!: PROGRAM VIDU910; { Tinh S=N! lệnh WHILE } Var N, i : Integer; S : LongInt; Begin (8) Write(‘ Nhập N > : ‘ ); Readln(N); S:=1; i :=1; {9} While i<= N begin S:=S*i; i:=i+1; {13} end; Writeln(‘ Giai thua = ‘, S); Readln; End Khởi đầu biến i gán gía trị (dòng {9}) Trong vòng lặp WHILE, sau lệnh S:=S*i; biến i tăng lên đơn vị lệnh i:=i+1; (dòng {13}) Khi i=N+1 thì điều kiện i<=N bị sai và lúc đó vòng lặp kết thúc, kết qủa là lệnh S:=S*i; thực đúng N lần ứng với i=1, 2, 3, , N Trong chương trình trên, không có dòng lệnh {13}: i:=i+1; thì i luôn luôn nên điều kiện i<=N luôn luôn đúng (vì N > 1), và đó vòng lặp vô hạn Sự khác lệnh WHILE so với FOR là chỗ: lệnh FOR, biến i tự động gán gía trị ban đầu và sau bước lặp tự động tăng lên, còn WHILE thì không, ta phải viết các lệnh đó Tất các bài toán giải lệnh FOR thì giải lệnh WHILE Ðặc điểm chung các bài toán dạng này là số lần lặp các vòng lặp đã biết trước Lệnh WHILE đặc biệt thích hợp với các vòng lặp có số lần lặp chưa biết trước, lệnh FOR không giải Ðây chính là điểm mạnh lệnh WHILE Hãy xem ví dụ sau Ví dụ 9.11: Trở lại bài toán tính tiền gửi ngân hàng có tiền lãi hàng tháng gộp vào vốn (ví dụ 9.9) Câu hỏi bây là: cần gửi tối thiểu là bao nhiêu tháng để có số tiền >= S cho trước Giả sử tiền vốn là 100, lãi suất hàng tháng là 2%, số tiền cần có là S=108 Ta tính số tiền có sau tháng gửi: Sau tháng gửi: Số tiền=100 + 100*0.02 = 102 Sau tháng gửi: Số tiền=102 + 102*0.02 = 104.04 Sau tháng gửi: Số tiền=104.04 + 104.04*0.02 = 106.1208 Sau tháng gửi: Số tiền=106.1208 + 106.1208*0.02 = 108.2432 Vậy cần gửi N=4 tháng, số tiền có là 108.2431 Qúa trình lặp kết thúc tới tháng đầu tiên có Số tiền >= S Chương trình sau: PROGRAM VIDU911; { Tính số tháng gửi ngân hàng để có số tiền S } Var Tienvon, Laisuat, Sotien, S : Real; N : Byte; Begin Write(‘ Nhập tiền vốn, lãi suất và số tiền S cần có: ‘); Readln(Tienvon, Laisuat, S); Sotien:=Tienvon; N:=0; { N là số tháng gửi } While Sotien< S begin N:=N+1; Sotien:= Tienvon + Tienvon*Laisuat ; Tienvon:=Sotien; end; Writeln(‘ Cần gửi ‘, N , ‘ tháng ‘); Writeln(‘ Số tiền có = ‘ , Sotien:6:2); (9) Readln; End Số lần lặp lệnh: While Sotien < S không phải ta ấn định từ trước mà tùy thuộc vào biểu thức Sotien < S là mau bị sai hay chậm bị sai Số lần lặp ít hay nhiều phụ thuộc vào gía trị S nhỏ hay lớn và vào tốc độ tăng nhanh hay chậm số tiền CÂU LỆNH REPEAT Cú pháp, lưu đồ, cách thức hoạt động : Cú pháp: REPEAT LệnhP; UNTIL Ðiềukiện ; Ý nghĩa: Chừng nào Ðiềukiện còn sai thì làm LệnhP, Ðiềukiện đúng thì không làm LệnhP mà chuyển sang lệnh phía Cách thức hoạt động REPEAT: Bước 1: Làm LệnhP, kiểm tra Ðiềukiện, Ðiềukiện đúng thì chuyển sang lệnh phía dưới, ngược lại, Ðiềukiện sai thì quay lại bước LệnhP gọi là thân vòng lặp REPEAT, nó gồm nhiều lệnh thì các lệnh đó không cần phải đặt khối begin va?end Nếu Ðiềukiện không đúng thì LệnhP phải làm hoài, lúc đó ta có vòng lặp vô hạn Trong trường hợp này, muốn dừng chương trình, hãy gõ đồng thời hai phím Ctrl và Pause (^Pause) Ðể tránh các vòng lặp vô hạn, thân lệnh REPEAT cần có ít lệnh có tác dụng làm biến đổi các đại lượng tham gia Ðiềukiện để đến lúc nào đó thì Ðiềukiện đúng và đó vòng lặp kết thúc Các vòng lặp có số lần lặp biết trước có thể giải lệnh REPEAT Ðặc biệt, lệnh WHILE, lệnh REPEAT thích hợp với các vòng lặp có số lần lặp không biết trước Các ví dụ lệnh Repeat : Ví dụ 9.12: Ðảm bảo tính hợp lý liệu nhập từ bàn phím Khi giải phương trình bậc hai Ax 2+Bx+C=0, ta thường giả thiết A # 0, tính S=N!, ta thường yêu cầu N > Sự hạn chế phạm vi các liệu nhập đảm bảo tính hợp lý chúng và làm giảm bớt các phức tạp biện luận Ðể buộc người sử dụng phải nhập A # 0, nhập A=0 thì bắt nhập lại nhập A # thôi, ta dùng cấu trúc : Repeat Write(‘Nhập A khác không : ‘); Readln(A); Until A<> 0; Ðể đảm bảo chắn nhập N thỏa điều kiện 0<N<20, ta dùng cấu trúc : Repeat Write(‘ Nhập N (0<N<20) : ‘); Readln(N); If (N<=0) or (N>=20) then write(#7); Until (0<N) and (N<20) ; Lệnh write( chr(7) ) hay write(#7) có công dụng phát tiếng kêu bip để cảnh báo người dùng đã nhập liệu sai yêu cầu Ví dụ 9.13: Tìm bội số chung nhỏ hai số nguyên dương M và N Bài toán này có cách giải khác nhau, đây là cách đơn giản Trước hết, hãy xem cách tìm BSCNN hai số M=5 và N=9 Vì N>M nên ta tìm tập các bội số N :{ 9, 18, 27, 36, 45, } số nhỏ chia hết cho M, đó là số 45 Một cách tổng quát, gọi Max là số lớn M và N Ðầu tiên ta gán : BSCNN:=0; (10) Sau đó làm lệnh BSCNN:=BSCNN+Max ; hoài BSCNN chia hết cho M và N thì dừng Trong chương trình ta dùng lệnh repeat để nhập hai số M, N đảm bảo dương PROGRAM VIDU913; { Tìm BSCNN M và N } Var M, N, Max, BSCNN : Integer; Begin Repeat Write(‘ Nhập M và N dương :’); Readln(M, N); Until (M>0) and (N>0); If N>M then Max:=N else Max:=M; BSCNN:=0; Repeat BSCNN:=BSCNN + Max; Until (BSCNN mod N=0) and (BSCNN mod M=0) ; Writeln(‘ Bội số chung nhỏ nhất= ‘, BSCNN) ; Readln; End Ví dụ 9.14: Thiết kế để chạy nhiều lần chương trình Trong Turbo Pascal, lần muốn chạy chương trình ta phải gõ cặp phím Ctrl và F9 (viết tắt là ^F9), điều này bất tiện cần chạy chương trình nhiều lần ứng với các liệu thử khác Cấu trúc sau đây cho phép ta chạy chương trình số lần theo ý muốn: REPEAT { Các lệnh chương trình} Write(‘ Tiếp tục không (Y/N) ? :’); Readln(Traloi); {5} UNTIL (Traloi =‘N’) or ( Traloi=‘n’); Ở đây, Traloi là biến kiểu ký tự (Char); Sau thực xong {các lệnh chương trình }, muốn chạy tiếp thì ta gõ phím Y , muốn dừng thì gõ N Chú ý : lệnh Readln(Traloi); dòng thứ {5} có thể thay bằng: Traloi:=Readkey; Hàm Readkey thuộc thư viện CRT cho kết qủa là ký tự gõ từ bàn phím, nó khác lệnh Readln(Traloi) chỗ là nhập ký tự ta không cần phải Enter Chương trình đây cho phép thực số lần việc : in tam giác cân đặc có chiều cao m (0<m<20) : PROGRAM VIDU914; { In tam giác cân đặc } Uses CRT; Const =‘*’; Var k, j, m: integer; Traloi : Char ; Begin (11) REPEAT {9} Clrscr; Repeat {11} Write(‘ Nhập m (0<m<20) : ‘); Readln(m); If (m <= 0) or ( m>=20) then write(#7); Until (m>0) and ( m<20) ; {15} Writeln(sao :m); { in đỉnh } { In hai cạnh bên tam gíac } For k:=1 to m-2 begin Write(chr(32): m-k-1); { in m-k-1 ký tự trắng} For j:=1 to 2*k+1 Write(sao); { in 2k+1 dấu *} Writeln; end; For k:=1 to 2*m-1 Write(sao); {in cạnh đáy} Writeln; Write(‘ Tiếp tục không (Y/N) ?: ‘); Readln( Traloi); UNTIL (Traloi=‘N’) or ( Traloi=‘n’); {28} End Chương trình 9.14 là ví dụ hai câu lệnh Repeat lồng nhau, điều này xảy thân lệnh Repat lại chứa lệnh Repeat khác: lệnh Repeat thứ nhất, từ dòng {9} đến dòng {28}, chứa lệnh Repeat thứ hai từ dòng {11} đến dòng {15} So sánh các lệnh For, While và Repeat: Lệnh For dùng cho các vòng lặp có số lần lặp đã biết trước Lệnh While hay Repeat tổng quát lệnh For, dùng cho tất các loại vòng lặp, thường dùng cho các vòng lặp có số lần lặp chưa biết trước Lệnh While và Repeat khác điểm sau: lệnh While kiểm tra điều kiện trước, đúng thực các lệnh ghi thân nó ( lệnhP ), còn lệnh Repeat thực lệnhP kiểm tra điều kiện Vì thế, lệnh Repeat thực các lệnh ghi thân nó ít lần Ngoài ra, lệnh While kết thúc điều kiện sai, lệnh Repeat kết thúc điều kiện đúng BÀI TẬP Câu 1) In bảng mã ASCII thành hai cột : Mã Ký tự , yêu cầu hiển thị trang , (mỗi trang 22 dòng) dừng lại chờ ta gõ Enter trang kế tiếp, hết Câu 2) Nhập số nguyên dương N Tính : Câu 3) Nhập số n nguyên đảm bảo cho n dương ( Nếu nhập n  thì chương trình phải bắt nhập laị ), tính : S1 = 12 + 32 + 52 + 72 + + (2n+1)2 Câu 4) Nhập số nguyên dương n Tính : S4 = 1.2.3 + 2.3.4 + 3.4.5 + + n(n+1)(n+2) Câu 5) Nhập số nguyên dương n Tính : (12) Câu *6) Nhập số x thực và số n nguyên > 1, tính gần đúng ex theo công thức : Câu 7) Nhập n, k nguyên đảm bảo phải dương và k<= n Tính tổ hợp chập k n theo công thức : Câu 8) Cho dãy Fibonaci xác đinh sau: F0=0, F1=1, Fn = Fn-1 + Fn-2 , với n >= Hãy nhập số nguyên N>0 và tính S= F0 + F1 + F2 + + Fn Câu 9) Tìm và in lên màn hình tất các số nguyên phạm vi từ 10 đến 99 cho tích hai chữ số nó thì hai lầ? tổng hai chữ số nó Ví dụ : số N=36 có hai chữ số là và 6, và 3*6 = 2*(3+6) Tương tự số 44 Câu 10) Nhập N nguyên đảm bảo lớn Tính tổng các số lẻ  N Ví dụ : N=5 thì tổng S=1+3+5 = 9, N=8 thì S=1+3+5+7=16 Câu 11) Nhập số thực A đảm bảo 0<A< 2, tìm số n nhỏ thỏa mãn : Câu 12) Nhập vào tuổi cha và tuổi đảm bảo cho tuổi cha lớn hai lần tuổi Hỏi sau bao nhiêu năm thì tuổi cha hai lần tuổi Ví dụ tuổi cha là 30, tuổi là 5, sau 20 năm tuổi cha là 50 gấp đôi tuổi 25 Câu 13) Tìm bội số chung nhỏ hai số nguyên dương m, n nhập từ bàn phím Suy ước số chung lớn chúng ( Hd : BSCNN * USCLN = m* n ) Câu 14) Nhập m, n nguyên ( < m, n < 20 ) In lên màn hình tam giác cân có chiều cao m, và hình chữ nhật có chiều dài n, chiều rộng là m: CÁC VÍ DỤ NÂNG CAO VỀ CÂU LỆNH LẶP Phần này trình bày cách vận dụng các câu lệnh lặp để giải số bài toán tiêu biểu mức khó Thông qua các ví dụ, người học tìm thấy tư liệu có ích để giải các bài tập tương tự, nâng cao thêm bước kỹ lập trình Ví dụ 11.1: Nhập x và n, tính gần đúng Sinx theo công thức: Ta viết : S= U0 - U1 + U2 - U3 +U4 - +(-1)N UN , đó : U0 = x .v.v Như vậy, Uk sai khác Uk-1 thừa số C có thể tính trực x và theo k : (13) Thành ra, lưu số hạng U bước trước thì tính số hạng U bước sau lệnh : U:=U*C; , và vì sang bước sau thì gía trị U thay đổi nên bước ta phải cộng trừ U vào tổng S Việc cộng hay trừ U vào tổng S giải nhờ biến dau gọi là biến chứa dấu U, biến này nhận gía trị là +1 hay -1 ứng với phép cộng hay trừ U vào tổng S Ðầu tiên ta gán: dau:= -1; Tại bước lặp ta cộng U đã nhân với dau vào S, đảo dấu để chuẩn bị cho bước các lệnh: S:= S+ dau * U; dau:= -dau ; Thành bước trước dau=-1 thì bước sau dau=+1 và ngược lại Kết qủa là lệnh S:= S+ dau * U; cộng hay trừ U vào S theo luật đan dấu Câu lệnh lặp dùng đây là lệnh FOR vì số lần lặp N nhập từ bàn phím tức là đã biết trước Chương trình cụ thể sau: PROGRAM VIDU11_1; { Tính gần đúng Sinx } Var N, k, dau : Integer; x, U, S, C : Real; Begin Write(‘Nhập số dương N : ‘); Readln(N); Write(‘Nhập số thực x : ‘); Readln(x); U:=x; S:=x ; { Gán gía trị ban đầu U0 cho S ngay} dau:= -1; For k:=1 to N begin C:= x*x/ ( 2*k*(2*k+1) ); U:= U*C; S:=S+ dau*U; dau:= - dau; end; Writeln(‘ Giá trị Sin = ‘, S:8:4); Readln; End Khi chạy chương trình, nhập N=6 và x=1.5708 (=  /2) thì cho kết qủa Sinx= 1.0000 ; Nếu nhập N=6 và x=3.1416 (=  ) thì cho kết qủa Sinx = 0.0000 Ví dụ 11.2: Tính gần đúng số e với sai số cho trước Cho công thức : ( vế phải là tổng vô hạn ) Hãy tính gần đúng e2 cách lấy tổng ( hữu hạn ) các số hạng đầu chuỗi gặp số hạng đầu tiên có gía trị tuyệt đối nhỏ số epsilon (EPS) dương khá bé cho trước, tức là : với n là số cho: Ta viết : (14) S = Uo +U1 + +Un , đó : Uo=1 .v.v Tương tự ví dụ 11.1, ta dùng biến U để lưu số hạng bước lặp k=0, 1, 2, Tại bước, ta kiểm tra nếu U  EPS thì cộng U vào tổng S, tính U cho bước cách nhân U với thừa số 2/k Qúa trình kết thúc gặp số hạng U đầu tiên có  U < EPS Vì số vòng lặp là không biết trước nên câu lệnh lặp dùng là WHILE Chương trình viết sau : PROGRAM VIDU11_2; { Tinh e2 theo sai số EPS dương khá bé cho trước} Var k : Integer; S, U, EPS : Real; Begin Repeat Write(‘Nhap sai so > : ‘); Readln(EPS); Until EPS >0; k :=0; S :=0; U :=1; While ABS(U) >= EPS DO begin S:=S +U; k:=k+1; U:=U* 2/ k; end; Writeln(‘ S= ‘ , S:8:4 , ‘ tính đến số hạng k= ‘, k); Readln; End Khi chạy chương trình, nhập EPS=0.001 thì cho kết qủa S=7.3887 , tính đến số hạng k=10 Ví dụ 11.3: Nhập số nguyên dương N, in các chữ số N theo thứ tự đảo ngược Ví dụ N= 15742 in 24751 Cách làm sau: Tách và in hàng đơn vị N hai lệnh: k:= N mod 10; { k=2 } Write(k: 3); Bỏ hàng đơn vị, giữ lại các chữ số từ hàng chục trở lên: N:= N div 10; { N=1574 } Lặp lại qúa trình trên N=0 Số lần lặp là không biết trước mà tùy thuộc vào việc nhập số N có ít hay có nhiều chữ số, nên ta phải dùng lệnh Repeat hay While PROGRAM VIDU11_3; { In đảo ngược các chữ số N } Var N, k: LongInt ; Begin (15) Repeat Write(‘ Nhập N : ‘); Readln(N); Until (N>0); Writeln( N, ‘ in đảo ngược thành :’); Repeat k:= N mod 10; Write(k: 3); N:=N div 10; Until N=0; Readln; End Ví dụ 11.4: Kiểm tra số tự nhiên N có phải số nguyên tố không Số N > là số nguyên tố nó chia hết cho và chính nó Ví dụ các số 2, 3, 5, 7, 11, 13, 17, 19, 21, 23 là số nguyên tố Xuất phát từ địng nghĩa, ta kiểm tra N không chia hết cho tất các số từ 2, 3, 4, , đến N-1 thì N là nguyên tố, ngược lại, cần N chia hết cho số k nào đó tập { 2, 3, 4, , N-1} thì N không phải số nguyên tố PROGRAM VIDU11_4; { Kiểm tra số N có phải số nguyên tố không } Var N, k: integer; Kiemtra: Boolean ; Begin Repeat Write(‘ Nhập N : ‘); Readln(N); Until (N>0); If N =1 then Kiemtra:= False else { xét N > 1} begin Kiemtra:= True; k:=1; Repeat k:= k+1; Until N mod k=0 ; If k<N then Kiemtra:= False; end; If Kiemtra=True then Writeln(N, ‘ là số nguyên tố ‘) else Writeln(N, ‘ không phải số nguyên tố ‘); Readln; End Chương trình có đoạn cần giải thích rõ thêm: Repeat k:= k+1; Until N mod k=0 ; If k<N then Kiemtra:= False; Vòng lặp trên kết thúc gặp số k đầu tiên (nhỏ nhất) thỏa điều kiện N mod k=0 Lúc đó, k<N thì có nghĩa N chia hết cho số k khác N nên N không phải số nguyên tố Nếu k=N thì chứng tỏ N chia hết cho N và không chia hết cho các số 2, 3, , N-1 nên N là số nguyên tố Nhận xét: Vì số chẵn (trừ số 2) không phải số nguyên tố nên chương trình có thể cải tiến kiểm tra các số lẻ thôi (16) Bài tập nâng cao lệnh lặp : Câu Nhập x thực, n nguyên  , tính gần đúng cosx : Câu *2 Nhập số nguyên dương N, cho biết số đó có bao nhiêu chữ số, và chữ số lớn là bao nhiêu Ví dụ: số N = 1275 có bốn chữ số, chữ số lớn là Câu Tính gần đúng giá trị Ln(x) , < x  , với sai số ss = 0.01, cách bỏ các số hạng có trị tuyệt đối < ss : Câu Tìm và in lên màn hình tất các số nguyên dương có ba chữ số (trong phạm vi từ 100 đến 999) cho tổng các bình phương các chữ số nó 25 Ví dụ :số N=304 có ba chữ số là 3, và 4, và 2+02+42 = 25 Tương tự số 500 Câu Nhập số N nguyên dương, tính : Câu *6 Nhập ngày, tháng, năm sinh bạn Từ đầu năm sinh đến ngày tháng năm sinh bạn có bao nhiêu ngày? Ví dụ, sinh ngày 17/2/1977 thì từ đầu năm 1977 đến ngày đó có 48 ngày Câu Nhập số N nguyên dương, tính S là tổng N số nguyên tố đầu tiên Ví dụ N=3 thì S=2+3+5=10 (17)

Ngày đăng: 12/10/2021, 18:05

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w