ÔN TẬP I/ Lý Thuyết. 1) Khai báo kiểu mảng 1 chiều. 2) Các thao tác làm việc với kiểu dữ liệu tệp. 3) Khái niệm chương trình con? Ý nghĩa của việc sử dụng chương trình con? 4) Thư viện chương trình con chuẩn là gì ? Cách sử dụng các chương trình con trong các thư viện chuẩn ??? Gợi ý : 1) Để khai báo kiểu mảng 1 chiều ta chọn một trong 2 cách sau : Cách 1 : khai báo trực tiếp Var <tên biến mảng> : array[kiểu chỉ số] of <kiểu phần tử>; Cách 2: khai báo gián tiếp qua kiểu mảng 1 chiều Type<tên biến mảng>=array[kiểu chỉ số] of <kiểu phần tử>; Var <tên biến mảng>:<tên kiểu mảng>; * Trong đó : * kiểu chỉ số thường là một đoạn số nguyên liên tục có dạng n1,n2, với n1,n2 là các hằng hoặc biểu thức nguyên xác định chỉ số đầu và chỉ số cuối ( n1<= n2). * Kiểu phần tử là kiểu của các phần tử mảng. 2) Các thao tác làm việc với tệp. Trước khi làm việc với tệp ta phải khai báo biến tệp theo cú pháp : var <tên biến tệp >:text; - Gắn tên tệp : tên tệp là biến xâu hoặc hằng xâu. Dùng thủ tục sau : Assign(<biến tệp>,<tên tệp>); - Mở tệp : + để ghi dữ liệu : rewrite(<biến tệp>); + để đọc dữ liệu : reset(<biến tệp>); - Đọc tệp :read(<biến tệp>,<danh sách biến>); - Ghi tệp :write(<biến tệp>,<danh sách kết quả>); - Đóng tệp : close(<biến tệp>); 3) Chương trình con là một dãy lệnh mô tả một số thao tác nhất định và có thể được thực hiện từ nhiều vị trí trong chương trình. Ý nghĩa : o Tránh việc phải viết đi viết lại cùng một dãy lệnh o Hỗ trợ việc thwucj hiện chương trình lớn o Phục vụ cho quá trình trừu trượng hóa o Mở rộng khả năng ngôn ngữ o Thuận tiện cho việc phát triển, nâng cấp chương trình Chương trình con gồm có 2 loại là : Hàm ( function ) và thủ tục (procedure) II/ Bài Tập. 1) Khai báo tạo ngẫu nhiên một mảng gồm n phần tử nguyên và tìm phần tử lớn thứ 2 / nhỏ thứ 2 của mảng. Tìm phần tử lớn nhì trong mảng. Uses crt; Var a:array[1 100] of integer; n,i,max1,max2 :integer; begin clrscr;randomize; write(‘nhap n :’);read(n); for i:=1 to n do a[i]:=random(201)-random(201); writeln(‘cac phan tu trong mang :’); for i:=1 to n do writeln(a[i]:5); max1:=a[1]; for i:=1 to n do if a[i]>max1 then max1:=a[i]; max2:=-200; for i:=1 to n do if ((a[i]>max2) and(a[i]<max1)) then max2:=a[i]; write(‘phan tu lon nhi : ‘,max2); readln;readln; end. ** Tìm phần tử bé nhì trong mảng : Uses crt; Var a:array[1 100] of integer; n,i,min1,min2 :integer; begin clrscr;randomize; write(‘nhap n :’);read(n); for i:=1 to n do a[i]:=random(201)-random(201); writeln(‘cac phan tu trong mang :’); for i:=1 to n do writeln(a[i]:5); min1:=a[1]; for i:=1 to n do if a[i]<min1 then min1:=a[i]; max2:= 200; for i:=1 to n do if ((a[i]<min2) and(a[i]>min1)) then min2:=a[i]; write(‘phan tu be nhi : ‘,min2); readln;readln; end. ** Cách khác : sắp xếp các phần tử trong mảng theo chiều tăng dần thì phần tử lớn nhì là phần tử n-1 và phần tử bé nhì là phần tử thứ 2 . uses crt; var a:array[1 100] of integer; n,i,k,tam,m,q :integer; begin clrscr;randomize; write('nhap n : ');read(n); for i:=1 to n do a[i]:=random(201)-random(201); write('cac phan tu trong mang : '); for i :=1 to n do write(a[i]:5); k:=n; while k>1 do begin for i:=1 to k-1 do if a[i] > a[i+1] then begin tam:=a[i]; a[i]:=a[i+1]; a[i+1]:=tam; end; k:=k-1; end; m:=a[n-1]; writeln('phan tu lon nhi: ',m); q:=a[2]; write(‘phan tu be nhi: ‘,q); readln;readln; end. 2) Khai báo tạo ngẫu nhiên mảng A gồm n phần tử nguyên và tạo magnr sums có các phần tử S lần lượt là tổng các phần tử thứ nhất đến thứ i của a. 3) Viết thủ tục kiểm tra tính nguyên tố của một số nguyên ( nếu số đó âm thì lấy trị tuyệt đối của số đó ). Uses crt; Var n,i:integer; Procedure NT(i:integer); Var kt:boolean; Begin If n<0 then n:=abs(n); Writeln(n); Kt:=true; For i:=2 to n-1 do if (n mod i =0) then kt:=false; If kt=true then write (‘day la so NT ‘) else write (day k phai so NT’); End; Begin Clrscr; Write(‘nhap n : ‘);read(n); NT(i); Readln;readln; End. ** Mở rộng bài toán : Giả sử bài toán không yêu cầu viết thủ tục mà là viết hàm để kiểm tra tính nguyên tố của n thì ta làm như sau : Function kt(n:integer):boolean; var i: integer; begin kt:=true; for i:=2 to n-1 do if (n mod i) = 0 then kt:=false; end; 4) Viết hàm để xuất ra 1 dãy string là dãy đảo ngược của một dãy cho trước. Uses crt; Var a:string; Function DN(a:string): string; Var I,k :integer; Begin K:=length(a); For i:=k downto 1 do write(a[i]); DN:=a[i]; End; Begin Clrscr; Write(‘nhap xau : ’);read(a); Write(‘ xau dao nguoc : ‘, DN(a)); Readln;readln; End. ** Cách khác : mượn xâu rỗng. Uses crt; Var a:string; Function DN(a:string): string; Var I,k :integer; S:string; Begin K:=length(a); S:=’’; For i:=k downto 1 do s:=s+a[i]; DN:=s; End; Begin Clrscr; Write(‘nhap xau : ’);read(a); Write(‘ xau dao nguoc : ‘, DN(a)); Readln;readln; End. 5) Viết chương trình con giải và biện luận phương trình bậc 2. Uses crt; Var a,b,c,d,x1,x2,x :real; Procedure GPT1(b,c : real); Var x :real; Begin If b<>0 then write(‘PT co nghiem x= ‘, (-c/b):6:1) else Begin If c=0 then write(‘PT co VSN ‘); If c<>0 then write(‘PT vo nghiem’); End; End; Procedure GPT2(a,b,c:real); Var d,x1,x2,x:real; If a=0 then GPT1(b,c) else Begin D:=b*b-4*a*c; If d<0 then write(‘PT vo nghiem’); If d=0 then write(‘PT co nghiem x= ‘, (-b/(2*a)):6:2); If d>0 then write(‘PT co 2 nghiem x1= ‘, (- b+sqrt(d))/(2*a)):6:2, ‘x2= ‘, (-b-sqrt(d))/(2*a):6:2); End; End; Begin Clrscr; Write(‘nhap a,b,c : ‘);read(a,b,c); GPT2(a,b,c); Readln;readln; End. 6) Viết hàm tính n!! theo công thức (2n)!! = 2n(2n-2)(2n-4) 2 (2n-1)!!=(2n-1)(2n-3) 3.1 TRÀ MAI THẢO . a[i]:=random (2 01) -random (2 01) ; writeln(‘cac phan tu trong mang :’); for i: =1 to n do writeln(a[i]:5); max1:=a [1] ; for i: =1 to n do if a[i]>max1 then max1:=a[i]; max2:= -20 0; for i: =1 to n do. ‘);read(a,b,c); GPT2(a,b,c); Readln;readln; End. 6) Viết hàm tính n!! theo công thức (2n)!! = 2n(2n -2) (2n-4) 2 (2n -1) !!=(2n -1) (2n-3) 3 .1 TRÀ MAI THẢO . writeln(a[i]:5); min1:=a [1] ; for i: =1 to n do if a[i]<min1 then min1:=a[i]; max2:= 20 0; for i: =1 to n do if ((a[i]<min2) and(a[i]>min1)) then min2:=a[i]; write(‘phan tu be nhi : ‘,min2); readln;readln;