Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 24 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
24
Dung lượng
236 KB
Nội dung
Hướng dẫn ôn tập Lập trình Pascal cơ bản CÁC BÀI TẬP VỀ BIẾN VÀ KIỂU DỮ LIỆU BT_02_13 Nhập vào 3 cạnh a, b, c của tam giác ABC. a) Tính diện tích tam giác. b) Tính độ dài các đường cao c) Tính độ dài các đường trung tuyến d) Tính bán kính đường tròn ngoại tiếp. HƯỚNG DẪN a) Tính diện tích theo công thức Hê-rông: )cp)(bp)(ap(pS −−−= với )cba( 2 1 p ++= b) Tính đường cao ứng với cạnh a theo công thức: a S2 hah 2 1 S aa =⇒= c) Tính độ dài đường trung tuyến ứng với cạnh a theo công thức: 2 ac2b2 m 4 ac2b2 m 222 a 222 2 a −+ =⇒ −+ = d) Tính bán kính đường tròn ngoại tiếp theo công thức: S4 abc R R4 abc S =⇒= Đã có công thức thì lập trình không còn là chuyện lớn. Sau đây là chương trình mẫu, trong đó các biến có ý nghĩa : a, b, c là các cạnh; ha, hc, hb là các đường cao; ma, mb, mc là các trung tuyến tương ứng với các cạnh; S, p, R lần lượt là diện tích, nửa chu vi, bán kính đường tròn ngoại tiếp. program BT_02_13; var a, b, c, ha,hb,hc, ma,mb,mc, S,p,R : real; begin write('Nhap 3 canh cua tam giac '); readln(a,b,c); p := (a+b+c)/2; S := sqrt(p*(p-a)*(p-b)*(p-c)); R := (a*b*c)/(4*S); ha := 2*S/a; hb := 2*S/b; hc := 2*S/c; ma := sqrt(2*sqr(b)+2*sqr(c)-sqr(a))/2; mb := sqrt(2*sqr(a)+2*sqr(c)-sqr(b))/2; mc := sqrt(2*sqr(a)+2*sqr(b)-sqr(c))/2; 1 Hướng dẫn ôn tập Lập trình Pascal cơ bản writeln('Thong tin ve tam giac: '); writeln('Dien tich S = ', S:0:5); writeln('Ban kinh duong tron ngoai tiep R = ', R:0:5); writeln('Do dai cac duong cao: '); writeln(' xuong canh a: ha = ', ha:0:5); writeln(' xuong canh b: hb = ', hb:0:5); writeln(' xuong canh c: hc = ', hc:0:5); writeln('Do dai cac duong trung tuyen:'); writeln(' xuong canh a: ma = ', ma:0:5); writeln(' xuong canh b: mb = ', mb:0:5); writeln(' xuong canh c: mc = ', mc:0:5); readln; end. BT_02_06: Nhập 2 số thực x,y, tính rồi in ra màn hình biểu thức: )yxarctg( 22 e )ycosx(sinln + + Yêu cầu kết quả viết với độ rộng 8 cột, có 3 chữ số phần thập phân. HƯỚNG DẪN Ta sẽ dùng 3 biến x, y, z kiểu real, x,y để lưu 2 số nhập vào, z lưu kết quả biểu thức. Phần khai báo biến như sau: var x,y,z : real; Phần nhập dữ liệu: ta viết thông báo nhập dữ liệu rồi nhập x,y bằng lệnh readln: writeln('Nhap 2 so thuc x,y '); readln(x,y); Phần tính kết quả: ta dùng lệnh gán giá trị của biểu thức (đã viết ở BT_02_05) cho z: z := (ln(sqr(sin(x))+sqr(cos(x))))/(exp(arctan(x+y))); Phần in kết quả: ta viết z ra màn hình bằng lệnh writeln, có dùng khuôn dạng output z:8:3 theo yêu cầu của đề (độ rộng 8, 3 chữ số thập phân). Nội dung chương trình mẫu: program BT_02_06; var x,y,z : real; begin writeln('Nhap 2 so thuc x,y '); readln(x,y); z := (ln(sqr(sin(x))+sqr(cos(x))))/(exp(arctan(x+y))) writeln('Ket qua bieu thuc: ', z:8:3); readln; end. 2 Hướng dẫn ôn tập Lập trình Pascal cơ bản BT_02_07: Lập chương trình tính chu vi và diện tích đường tròn theo bán kính của nó. HƯỚNG DẪN Ta cần nhập vào bán kính R của đường tròn rồi tính chu vi và diện tích của nó theo công thức toán: R2C π= và 2 RS π= . Hằng số π được định nghĩa sẵn trong Pascal với tên chuẩn là pi. Ta cần khai báo 3 biến thực R, C và S. Thực hiện việc nhập R rồi tính C, S theo các công thức trên. Sau đó in ra chúng. Chương trình mẫu: program BT_03_07; var r,c,s : real; begin writeln('Chuong trinh tinh chu vi va dien tich hinh tron.'); write('Nhap vao ban kinh r = '); readln(r); c := 2 * pi * r; s := pi * sqr(r); writeln('Chu vi C = ',c:0:4); writeln('Dien tich S = ',s:0:4); readln; end. BT_02_08: Lập trình tính diện tích hình thang khi cho 2 đáy và đường cao. HƯỚNG DẪN Dữ liệu vào lưu trong là 3 biến a, b, h lần lượt là các cạnh và đường cao của hình thang. Biến s lưu diện tích của hình thang tính theo công thức: 2 h)ba( + . Lệnh thực hiện việc tính là lệnh gán: s := (a+b)*h/2; Chương trình mẫu: program BT_02_08; var a,b,s,h: real; begin writeln('Chuong trinh tinh dien tich hinh thang. '); write('Nhap 2 canh va duong cao '); readln(a,b,h); s := (a+b)*h/2; writeln('Dien tich la S = ',s:0:5); readln; end. 3 Hướng dẫn ôn tập Lập trình Pascal cơ bản CÁC BÀI TẬP VỀ CẤU TRÚC ĐIỀU KHIỂN VD_03_02 Viết chương trình giải phương trình bậc nhất ax+b=0. HƯỚNG DẪN Thuật toán có được theo cách giải trong môn toán: Nếu a<>0 thì có một nghiệm là x= - b/a, ngược lại (a=0) thì nếu b<>0 thì vô nghiệm, ngược lại (b<>0) thì có mọi số đều là nghiệm. Rõ ràng là chúng ta có thể dùng lệnh if, và trong trường hợp này <câu lệnh> của if lại là một lệnh if: readln(a,b );{ nhập hệ số } if a=0 then if b=0 then writeln('Moi so thuc deu la nghiem') else writeln('Phuong trinh vo nghiem') else writeln('Phuong trinh co nghiem duy nhat x = ',-b/a:0:5); Toàn văn chương trình: program VD_03_02; var a,b : real; begin writeln('Chuong trinh giai phuong trinh bac nhat ax+b=0 '); writeln('Nhap hai he so '); readln(a,b); if a=0 then if b=0 then writeln('Moi so thuc deu la nghiem') else writeln('Phuong trinh vo nghiem') else writeln('Phuong trinh co nghiem duy nhat x = ',-b/a:0:5); readln; end. VD_03_03 Giải phương trình bậc hai ax 2 + bx + c = 0; HƯỚNG DẪN Ta cũng có thuật toán theo kiến thức môn toán: ac4bΔ 2 −= Nếu ∆<0 thì phương trình vô nghiệm. 4 Hướng dẫn ôn tập Lập trình Pascal cơ bản Nếu ∆=0 thì phương trình có nghiệm kép a b x 2 −= . Nếu ∆>0 thì phương trình có 2 nghiệm a b x 2 2,1 ∆±− = . Toàn văn chương trình: program VD_03_03; var a, b, c, d : real; x1, x2 : real; begin writeln('Chuong trinh giai phuong trinh bac hai a*x*x+b*x+c=0'); write('Nhap he so a,b,c: '); readln(a,b,c); d := sqr(b) - 4*a*c ; if d<0 then writeln('Phuong trinh vo nghiem.'); if d=0 then writeln('Phuong trinh co nghiem kep: x = ',-b/(2*a):0:5 ); if d>0 then begin x1 := (-b + sqrt(d))/(2*a); x2 := -b/a - x1 ; writeln('Phuong trinh co 2 nghiem phan biet:'); writeln('x1 = ',x1:0:5); writeln('x2 = ',x2:0:5); end; readln; end. VD_03_06 Tính tổng các số tự nhiên từ 1 đến n với n nhập từ bàn phím. HƯỚNG DẪN Trong toán ta có công thức tổng quát: 2 1)n(n n 2 1 s n + =…++= nên cách giải quyết đơn giản là thay n vào công thức để tính kết quả. Tuy nhiên không phải lúc nào ta cũng có công thức tổng quát và tính theo công thức tổng quát không phải lúc nào cũng hiệu quả nhất nên ta tìm một cách giải quyết khác: Sn có thể định nghĩa một cách truy hồi như sau: n; S S 0. s 1-nn 0 += = Từ đó ta có thể tính sn bằng cách cho tăng dần i từ 1 đến n và tính si = si-1+ i. Sau quá trình đó i=n và ta được sn là kết quả cần tính. program VD_03_06; var n, s, i : integer; begin 5 Hướng dẫn ôn tập Lập trình Pascal cơ bản writeln('Chuong trinh tinh tong cac so tu 1 den n.'); write('Cho n = '); readln(n); s := 0; for i := 1 to n do s := s + i; writeln('Ket qua: ',s); readln; end. VD_03_07: Dãy số Fibônaxi được định nghĩa như sau: ≥∀+= == 3)n( fff 1f 1,f 2-n1-nn 21 Viết chương trình in ra các số Fibônaxi với từ 1 đến 20. HƯỚNG DẪN Ta dễ dàng tìm ra cách tính: cho i chạy từ 3 đến 20 rồi tính fi theo định nghĩa: fi=fi - 1 +fi -2 . Đặt biến f0, f1, f2 đại diện cho fi, fi -1 , fi -2 ứng với mỗi giá trị của i, thế thì ta có thể viết đoạn chương trình tính như sau: f1 := 1; f2 := 1; for i := 3 to n do begin f0 := f1 + f2; writeln('F',i,' = ',f0); f2 := f1; f1 := f0; end; Trong đoạn chương trình này, i là biến đếm chạy từ 3 đến n. Câu lệnh f0:=f1+f2; để tính fi theo công thức truy hồi. Hai câu lệnh tiếp tính giá trị của f1, f2 dùng để tính phần tử tiếp theo: rõ ràng để tính fi+1 thì f2:=fi-1 (=f1) và f1:=fi(=f0). Rõ ràng cách tính này đơn giản hơn sử dụng công thức tổng quát rất nhiều: ( − − + = nn n f 2 51 2 51 5 1 ). Toàn văn chương trình: program VD_03_07; const n = 20; var i, f0, f1, f2 : integer; begin writeln('Chuong trinh tinh cac so Fibonaxi tu 1 den ',n); f1 := 1; f2 := 1; writeln('F1 = 1'); writeln('F2 = 1'); 6 Hướng dẫn ôn tập Lập trình Pascal cơ bản for i := 3 to n do begin f0 := f1 + f2; writeln('F',i,' = ',f0); f2 := f1; f1 := f0; end; readln; end. VD_03_08 Tính a n với a là số thực và n là số nguyên dương. HƯỚNG DẪN Trong chương 2 ta đã biết tính a b với a là số thực dương và b bất kỳ theo công thức ln(a))*(b exp e a blnab == . Tuy nhiên công thức không thể tính khi a≤0. Ta tính bằng cách khác như sau: Với n nguyên dương đặt t n = a n , ta có công thức truy hồi sau: = = .a t t 1 t 1-nn 0 Như vậy cho i chạy từ 1 đến n và tính công thức trên ta sẽ tính t n . Cấu trúc for dùng cài đặt rất thích hợp. Đoạn chương trình như sau: t := 1; for i := 1 to n do t := t * a; Biến t đại diện cho ti ứng với mỗi i trong lệnh for. Trong câu lệnh t := t * a; biến t ở bên trái là ti, giá trị t ở bên phải là giá trị trước đó của t, tức là ti -1 . Câu lệnh viết đúng theo công thức truy hồi. Xong vòng for i=n và t chính là giá trị tn = an. Ta thông báo kết quả. Toàn văn chương trình: program VD_03_08; var n,i : integer; a,t : real; begin writeln('Chuong trinh tinh a^n, a thuc, n tu nhien.'); write('Nhap a va n: '); readln(a,n); t := 1; for i := 1 to n do t := t * a; writeln('Ket qua : ',t:0:5); readln; end. VD_03_09 Lập trình tính giai thừa của một số nguyên n (do giới hạn lưu trữ số nguyên cho n<8). 7 Hướng dẫn ôn tập Lập trình Pascal cơ bản HƯỚNG DẪN Giai thừa của n: n! = 1.2…n (tích các số tự nhiên từ 1 đến n). Không có công thức tổng quát để tính n! nhưng ta có công thức truy hồi sau: = = )!n.(n-n! ! 1 10 Đặt g n =n!, theo công thức trên ta có: = = .ngg 1g 1-nn 0 Và như vậy tương tự VD_03_06 và VD_03_08 ta cũng có chương trình tính như sau: program VD_03_09; var n, i, g : integer; begin writeln('Chuong trinh tinh n! '); write('Nhap (n<8): '); readln(n); g := 1; for i := 1 to n do g := g * i; writeln('Ket qua: ',n,'! = ',g); readln; end. VD_03_10 Tính gần đúng số e theo công thức chuỗi: n! 1 . 3! 1 2! 1 1! 1 1e +++++= với n nguyên nhập từ bàn phím. HƯỚNG DẪN Ta có thể dựa trên chương trình tính giai thừa ở trên để tính một cách tường minh theo công thức trên. Tuy nhiên cách ấy không ổn vì hàm giai thừa tăng rất nhanh theo n, nếu n quá lớn thì không thể tính được. Đặt n! 1 . 3! 1 2! 1 1! 1 1e n +++++= và n! 1 r n = , ta có công thức truy hồi: += == == − .ree n r n 1 .rr 1.r 1,e n1-nn 1n 1-nn 00 Và từ đó ta có thể viết đoạn chương trình tính dùng vòng lặp for như sau: 8 Hướng dẫn ôn tập Lập trình Pascal cơ bản e := 1; r := 1; for i := 1 to n do begin r := r / i; e := e + r; end; Toàn văn chương trình: program VD_03_10; var n,i : integer; e,r : real; begin writeln('Chuong trinh tinh gan dung e.'); write('Nhap n : '); readln(n); e := 1; r := 1; for i := 1 to n do begin r := r / i; e := e + r; end; writeln('Ket qua : ',e:0:10); readln; end. VD_03_14: Lập trình giải bài toán cổ: “Trăm trâu trăm cỏ, trâu đứng ăn 5, trâu nằm ăn 3, lải nhải trâu già 3 con 1 bó. Hỏi bao nhiêu trâu đứng, trâu nằm, trâu già”. HƯỚNG DẪN Đặt td là số trâu đứng, tn là số trâu nằm, tg là số trâu già thoả mãn bài toán. Thế thì td, tn, tg là các số nguyên dương thoả mãn: =++ =++ 100 3 35 100 tg tntd tgtntd Từ phương trình thứ hai ta có 5td≤100 và 3tn≤100, suy ra 1≤ td ≤ 20 và 1≤ tn ≤ 33. Số trâu già: tg=(100-td-tn) phải chia hết cho 3 (vì số bó cỏ bọn trâu già ăn là số nguyên, bằng tg div 3). Như vậy ta cần tìm các số td trong khoảng 1 20 và tn trong khoảng 1 33 sao cho: tg =(100 - td - tn) chia hết cho 3 và 5*td + 3*tn + tg div 3 = 100. Toàn văn chương trình: program VD_03_14; var td,tn,tg : integer; begin writeln('Giai bai toan tram trau tram co.'); for td := 1 to 20 do for tn := 1 to 33 do begin tg := 100 - td -tn; if (tg mod 3=0) and (5*td + 3*tn + (tg div 3)=100) then 9 Hướng dẫn ôn tập Lập trình Pascal cơ bản begin writeln('Mot dap so la: '); writeln('Trau dung: ',td); writeln('Trau nam: ',tn); writeln('Trau gia: ',tg); end; end; readln; end. VD_03_16 Dân số hiện nay khoảng 75 triệu, tỉ lệ tăng tự nhiên là 1.7%. Hỏi sau bao nhiêu năm nữa thì dân số đạt xấp xỉ 100 triệu? HƯỚNG DẪN Đặt s n là dân số (tính theo đơn vị triệu) sau n năm tính từ thời điểm hiện tại. Ta có: .1,7%s ss 75s 1-n1-nn 0 += = (dân số năm sau bằng dân số năm trước cộng thêm lượng tăng tự nhiên). Và n là số năm cần tìm nếu n là số tự nhiên bé nhất thoả mãn sn≥100. Ta thấy rằng để tính trực tiếp n thì không dễ dàng nhưng chúng ta có thể sử dụng phương pháp lặp. Nghĩa là chúng ta tăng dần n (bắt đầu từ 0) và tính sn theo công thức trên cho đến khi sn≥100. Đoạn chương trình như sau: n:= 0; s:= 75; repeat n := n + 1; s := s + s*0.017; until s>=100; Toàn văn chương trình: program VD_03_16; var n : integer; s : real; Begin n := 0; s := 75; repeat n := n + 1; s := s + s*1.7%; until s>=100; writeln('Dan so hien nay la 75 trieu. Ti le tang 1.7%.'); writeln('Sau ',n,' nam thi dan so dat 100 trieu.'); readln; End. 10 [...]... end BT_03_25 Cho hai số tự nhiên a,b Hãy tính UCLN của chúng HƯỚNG DẪN Để tính UCLN của hai số nguyên dương a,b ta dùng thuật toán Ơclid (Euclide) như sau Đặt d=UCLN(a,b) Nếu b=0 thì d=a 11 Hướng dẫn ôn tập Lập trình Pascal cơ bản Ngược lại gọi c là số dư khi chia a cho b, ta có: a=kb+c, a=md, b=nd Suy ra md=knd+c, suy ra c chia hết cho d Vậy d là ước chung của b và c Nếu d’ là UCLN của b và c thì d’... '); repeat readln(a,b); if (a>0) and (b>0) then break else writeln('Du lieu khong hop le Nhap lai!'); until false; while b0 do begin c := a mod b; a := b; b := c; end; d := a; writeln('UCLN cua chung la ',d); readln; end BT_03_19 Cho số tự nhiên n, tìm các số tự nhiên x,y,z sao cho: n = x 3 + y 3 + z 3 12 Hướng dẫn ôn tập Lập trình Pascal cơ bản HƯỚNG DẪN Giả sử x,y,z là các số tự nhiên thoả mãn phương... begin z := trunc(exp(ln(z3)/3)); if z3=z*z*z then writeln(x,' ',y,' ',z); end; end; end; 13 Hướng dẫn ôn tập Lập trình Pascal cơ bản Giải thích: các biến x3,y3,z3 thêm vào để lưu trữ các lập phương của x,y,z để các biểu thức gọn hơn và tránh phải tính lại nhiều lần các lập phương Turbo Pascal không cung cấp hàm căn bậc 3 nên ta sử dụng kết quả đã biết: b a =e b ln a ⇒ n= 3 1 n3 = ln n e 3 = exp(ln(n )... ước số của nó 22 Hướng dẫn ôn tập Lập trình Pascal cơ bản CÁC THUẬT TOÁN VỀ VÒNG LẶP THUẬT TOÁN TÍNH GIAI THỪA MỘT SỐ NGUYÊN Giai thừa n! là tích các số từ 1 đến n Vậy hàm giai thừa viết như sau: function giaithua(n : integer) : longint; var i : integer; s : longint; begin s := 1; for i := 2 to n do s := s * i; giaithua := s; end; THUẬT TOÁN TÍNH HÀM MŨ Trong Pascal ta có thể tính ab bằng công thức exp(b*ln(a))... cho d’ Kết kuận d=d’ Như vậy UCLN(a,b)=a nếu b=0, =UCLN(b, a mod b) Thuật toán của ta sẽ thực hiện liên tiếp : c:= a mod b, a:=b, b:=c cho đến khi b=0 Lúc đó d:=a Thuật toán có thể cài đặt bằng ngôn ngữ Pascal như sau, các biến đặt tên như trên: repeat c := a mod b; a := b; b := c until b=0; d := a; Đoạn chương trình trên còn tiềm tàng lỗi Thật vậy vòng lặp repeat kiểm tra điều kiện sau nên khi b=0 ngay... y3 := y*y*y; z3 := n-x3-y3; if z3=0 then writeln(x,' ',y,' ',0) else begin z := trunc(exp(ln(z3)/3)); if z3=z*z*z then writeln(x,' ',y,' ',z); end; end; end; readln; end 14 Hướng dẫn ôn tập Lập trình Pascal cơ bản CÁC BÀI TẬP VỀ CHƯƠNG TRÌNH CON BT_04_01: Viết chương trình con tính chu vi và diện tích của hình chữ nhật Giải: Ta thấy rằng chương trình con tính chu vi, diện tích của hình chữ nhật nhất... và đường chéo hình hộp chữ nhật theo 3 kích thước BT_04_03: Viết một hàm tính số ước số của một số nguyên BT_04_04: Viết một hàm tính ước chung lớn nhất của hai số nguyên 15 Hướng dẫn ôn tập Lập trình Pascal cơ bản CÁC BÀI TẬP VỀ MẢNG 1 CHIỀU VÀ 2 CHIỀU BÀI TẬP 1 Nhập vào một số n (5 . toán Ơclid (Euclide) như sau. Đặt d=UCLN(a,b). Nếu b=0 thì d=a. 11 Hướng dẫn ôn tập Lập trình Pascal cơ bản Ngược lại gọi c là số dư khi chia a cho b, ta. sqrt(2*sqr(a)+2*sqr(c)-sqr(b))/2; mc := sqrt(2*sqr(a)+2*sqr(b)-sqr(c))/2; 1 Hướng dẫn ôn tập Lập trình Pascal cơ bản writeln('Thong tin ve tam giac: '); writeln('Dien