CÁC VÍ DỤ NÂNG CAO VỀ CÂU LỆNH LẶP
Số trang: 13
Loại file: pdf
Dung lượng: 2.74 MB
Lượt xem: 12
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Phần này trình bày cách vận dụng các câu lệnh lặp để giải quyết một số bài toán tiêu biểu ở mức khó hơn. Thông qua các ví dụ, người học sẽ tìm thấy những tư liệu có ích để giải các bài tập tương tự, nâng cao thêm một bước kỹ năng lập trình.
Nội dung trích xuất từ tài liệu:
CÁC VÍ DỤ NÂNG CAO VỀ CÂU LỆNH LẶP 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 quyết một sốbài toán tiêu biểu ở mức khó hơn. Thông qua các ví dụ, người học sẽ tìmthấy những tư liệu có ích để giải các bài tập tương tự, nâng cao thêm mộtbước kỹ năng 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 , trong đó : U0 = x .v.v. Như vậy, Uk sai khác Uk-1 một thừa số C có thể tính trực tiếp được theo xvà theo k : Thành ra, nếu lưu được số hạng U ở bước trước thì sẽ tính được số hạng Uở bước sau bằng lệnh : U:=U*C; , và vì sang bước sau thì gía trị U sẽ thayđổi nên tại mỗi bước ta phải cộng hoặc trừ ngay U vào tổng S. Việc cộng hay trừ U vào tổng S được giải quyết nhờ một biến dau gọi làbiến chứa dấu của U, biến này chỉ nhận gía trị là +1 hay -1 ứng với phépcộng hay trừ U vào tổng S. Ðầu tiên ta gán: dau:= -1; Tại mỗi bước lặp ta cộng U đã nhân với dau vào S, rồi đảo dấu đi đểchuẩn bị cho bước tiếp theo bằng các lệnh: S:= S+ dau * U; dau:= -dau ; Thành ra nếu bước trước dau=-1 thì ở bước sau dau=+1 và ngược lại. Kếtqủa là lệnh S:= S+ dau * U; sẽ cộng hay trừ U vào S theo luật đan dấu. Câu lệnh lặp được dùng ở đây là lệnh FOR vì số lần lặp N được nhập từbàn phím tức là đã biết trước. Chương trình cụ thể như 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 do 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. Chạy Chép tập tin nguồn Khi chạy chương trình, nếu nhập N=6 và x=1.5708 (= /2) thì cho kếtqủ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à một tổng vô hạn ) Hãy tính gần đúng e2 bằng cách lấy tổng ( hữu hạn ) các số hạng ở đầuchuỗi cho đến khi gặp số hạng đầu tiên có gía trị tuyệt đối nhỏ hơn một sốepsilon (EPS) dương khá bé cho trước, tức là :với n là số sao cho: . Ta viết : S = Uo +U1 +...+Un , trong đó : Uo=1 .v.v. Tương tự ví dụ 11.1, ta dùng biến U để lưu số hạng tại mỗi bước lặp k=0,1, 2, ... Tại mỗi bước, ta kiể m tra nếu U EPS thì cộng U vào tổng S,rồi tính U cho bước tiếp theo bằng cách nhân U với thừa số 2/k. Qúa trìnhkết thúc khi 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 được dùng là WHILE. Chương trình đượcviết như 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 > 0 : ‘); 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. Chạy < VD11_2.EXE> Chép tập tin nguồn Khi chạy chương trình, nếu 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ố của N theo thứ tự đảo ngược. Vídụ N= 15742 in ra 24751. Cách làm như sau: Tách và in hàng đơn vị của N ra bằng hai lệnh: k:= N mod 10; { được k=2 } Write(k: 3); Bỏ đi hàng đơn vị, giữ lại các chữ số từ hàng chục trở lên: N:= N div 10; { được N=1574 } Lặp lại qúa trình trên cho đến khi 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 haycó 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ố của N } Var N, k: LongInt ; Begin Repeat Write(‘ Nhập N : ‘); Readln(N); Until (N>0); Writeln( N, ‘ được in đảo ngược thành :’); Repeat k:= N mod 10; Write(k: 3); N:=N div 10; Until N=0; Readln; End. Chạy Chép tập tin nguồn Ví dụ 11.4: Kiểm tra số tự nhiên N có phải số nguyên tố không. Số N 1 là số nguyên tố nếu nó chỉ chia hết cho 1 và chính nó. Ví dụ cácsố 2, 3, 5, 7, 11, 13, 17, 19, 21, 23 đều là số nguyên tố. Xuất phát từ địng nghĩa, ta kiểm tra nếu N không chia hết cho tất cả cácsố từ 2, 3, 4, ..., đến N-1 thì N là nguyên tố, ngược lại, chỉ cần N chia hết chomột số k nào đó trong tập { 2, 3, 4, ..., N-1} thì N không phải số nguyên tố.PROGR ...
Nội dung trích xuất từ tài liệu:
CÁC VÍ DỤ NÂNG CAO VỀ CÂU LỆNH LẶP 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 quyết một sốbài toán tiêu biểu ở mức khó hơn. Thông qua các ví dụ, người học sẽ tìmthấy những tư liệu có ích để giải các bài tập tương tự, nâng cao thêm mộtbước kỹ năng 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 , trong đó : U0 = x .v.v. Như vậy, Uk sai khác Uk-1 một thừa số C có thể tính trực tiếp được theo xvà theo k : Thành ra, nếu lưu được số hạng U ở bước trước thì sẽ tính được số hạng Uở bước sau bằng lệnh : U:=U*C; , và vì sang bước sau thì gía trị U sẽ thayđổi nên tại mỗi bước ta phải cộng hoặc trừ ngay U vào tổng S. Việc cộng hay trừ U vào tổng S được giải quyết nhờ một biến dau gọi làbiến chứa dấu của U, biến này chỉ nhận gía trị là +1 hay -1 ứng với phépcộng hay trừ U vào tổng S. Ðầu tiên ta gán: dau:= -1; Tại mỗi bước lặp ta cộng U đã nhân với dau vào S, rồi đảo dấu đi đểchuẩn bị cho bước tiếp theo bằng các lệnh: S:= S+ dau * U; dau:= -dau ; Thành ra nếu bước trước dau=-1 thì ở bước sau dau=+1 và ngược lại. Kếtqủa là lệnh S:= S+ dau * U; sẽ cộng hay trừ U vào S theo luật đan dấu. Câu lệnh lặp được dùng ở đây là lệnh FOR vì số lần lặp N được nhập từbàn phím tức là đã biết trước. Chương trình cụ thể như 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 do 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. Chạy Chép tập tin nguồn Khi chạy chương trình, nếu nhập N=6 và x=1.5708 (= /2) thì cho kếtqủ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à một tổng vô hạn ) Hãy tính gần đúng e2 bằng cách lấy tổng ( hữu hạn ) các số hạng ở đầuchuỗi cho đến khi gặp số hạng đầu tiên có gía trị tuyệt đối nhỏ hơn một sốepsilon (EPS) dương khá bé cho trước, tức là :với n là số sao cho: . Ta viết : S = Uo +U1 +...+Un , trong đó : Uo=1 .v.v. Tương tự ví dụ 11.1, ta dùng biến U để lưu số hạng tại mỗi bước lặp k=0,1, 2, ... Tại mỗi bước, ta kiể m tra nếu U EPS thì cộng U vào tổng S,rồi tính U cho bước tiếp theo bằng cách nhân U với thừa số 2/k. Qúa trìnhkết thúc khi 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 được dùng là WHILE. Chương trình đượcviết như 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 > 0 : ‘); 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. Chạy < VD11_2.EXE> Chép tập tin nguồn Khi chạy chương trình, nếu 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ố của N theo thứ tự đảo ngược. Vídụ N= 15742 in ra 24751. Cách làm như sau: Tách và in hàng đơn vị của N ra bằng hai lệnh: k:= N mod 10; { được k=2 } Write(k: 3); Bỏ đi hàng đơn vị, giữ lại các chữ số từ hàng chục trở lên: N:= N div 10; { được N=1574 } Lặp lại qúa trình trên cho đến khi 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 haycó 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ố của N } Var N, k: LongInt ; Begin Repeat Write(‘ Nhập N : ‘); Readln(N); Until (N>0); Writeln( N, ‘ được in đảo ngược thành :’); Repeat k:= N mod 10; Write(k: 3); N:=N div 10; Until N=0; Readln; End. Chạy Chép tập tin nguồn Ví dụ 11.4: Kiểm tra số tự nhiên N có phải số nguyên tố không. Số N 1 là số nguyên tố nếu nó chỉ chia hết cho 1 và chính nó. Ví dụ cácsố 2, 3, 5, 7, 11, 13, 17, 19, 21, 23 đều là số nguyên tố. Xuất phát từ địng nghĩa, ta kiểm tra nếu N không chia hết cho tất cả cácsố từ 2, 3, 4, ..., đến N-1 thì N là nguyên tố, ngược lại, chỉ cần N chia hết chomột số k nào đó trong tập { 2, 3, 4, ..., N-1} thì N không phải số nguyên tố.PROGR ...
Tìm kiếm theo từ khóa liên quan:
Tin học căn bản giáo trình tin học hướng dẫn học tin học bài tập tin học tài liệu tin họcGợi ý tài liệu liên quan:
-
Giáo trình Tin học (Trình độ: Trung cấp nghề) - Trường Trung cấp nghề Củ Chi
268 trang 334 4 0 -
122 trang 214 0 0
-
Sửa lỗi các chức năng quan trọng của Win với ReEnable 2.0 Portable Edition
5 trang 213 0 0 -
Xử lý tình trạng máy tính khởi động/tắt chậm
4 trang 211 0 0 -
UltraISO chương trình ghi đĩa, tạo ổ đĩa ảo nhỏ gọn
10 trang 203 0 0 -
Giáo Trình tin học căn bản - ĐH Marketing
166 trang 198 0 0 -
Giới thiệu tổng quan về SharePoint 2007
41 trang 172 0 0 -
TÀI LIỆU HƯỚNG DẪN SỬ DỤNG PHẦN MỀM KHAI BÁO HẢI QUAN ĐIỆN TỬ phần 1
18 trang 158 0 0 -
Memory-RAM - Một số thuật ngữ và kỹ thuật tin học
5 trang 156 0 0 -
Hướng dẫn tạo file ghost và bung ghost
12 trang 153 0 0