Tài liệu ôn tập ngôn ngữ lập trình pascal.I.Cấu trúc điều khiển 1.Cấu trúc rẽ nhánh if…then a.Dạng thiếu if then ; Hoạt động: Kiểm tra điều kiện, nếu điều kiện đúng thì thực hiện Câu lệnh b.Dạng đủ If then Else ; Hoạt động: Kiểm tra điều kiện, nếu điều kiện đúng thì thực hiện Câu lệnh 1, điều kiện sai thì thực hiện Câu lệnh 2. 2.Câu lệnh rẽ nhánh Case…of Cú pháp: Case of : Câu lệnh 1; : Câu lệnh 2; …….
I.Cấu trúc điều khiển ! "#$ % &'() "* if <Điều kiện> then <Câu lệnh>; *Hoạt động: Kiểm tra điều kiện, nếu điều kiện đúng thì thực hiện Câu lệnh +'(),- If <Điều kiện> then <Câu lệnh 1> Else <Câu lệnh 2>; *Hoạt động: Kiểm tra điều kiện, nếu điều kiện đúng thì thực hiện Câu lệnh 1, điều kiện sai thì thực hiện Câu lệnh 2. ./01 ! &2%$3# *Cú pháp: Case <Biểu thức số nguyên hoặc kí tự> of <Danh sách 1>: Câu lệnh 1; <Danh sách 2>: Câu lệnh 2; ……. <Danh sách n>: Câu lệnh n [Else Câu lệnh n+1]; End; *Hoạt động: Khi gặp câu lệnh case…of máy tính tính giá trị biểu thức nếu trả về giá trị nào thì thực hiện câu lệnh tương ứng trong danh sách, nếu khác thì thực hiện câu lệnh n+1. *Ví dụ: Nhập vào 2 số nguyên là tháng và năm. Cho biết tháng đó có bao nhiêu ngày? Program vidu1; Uses crt; Var T,N,SN:integer; Begin Clrscr; Write(‘Nhap thang va nam’); readln(T,N); Case T of 4,6,9,11: SN:=30; 2: if (N mod 400=0) or ((N mod 100<>0) and (N mod 4=0)) then SN:=29 Else SN:=28; Else SN:=31; End; Writeln(‘Thang ’,T, ‘ nam ’,N,’ Co so ngay ’,SN); Readln End. 405673$83 *Cú pháp: For <Biến đếm>:=<Giá trị đầu> to <Giá trị cuối> do <Câu lệnh>; For <Biến đếm>:=<Giá trị cuối> downto <Giá trị đầu> do <Câu lệnh>; 9: "0%$83 *Cú pháp: While <điều kiện> do <câu lệnh>; ;056%6%&$"0 *Cú pháp: Repeat <Dãy câu lệnh>; Until <Điều kiện>; *Ví dụ: Kiểm tra số nguyên dương N nhập vào từ bàn phím có thỏa mãn điều kiện (0<=N<=1000)? Repeat Write(‘Nhap so nguyen N=’); Readln(N); 1 Until (n>=0) and(n<=1000); "<8=0"1> "<?@)?A "B *Khái niệm: Mảng một chiều là một dãy hữu hạn các phần tử cùng kiểu có một tên chung, các phần tử này được đánh số gọi là chỉ số của các phần tử. *Cú pháp khai báo: Var <Tên biến mảng>:array[n1 n2] of <Kiểu dl>; ."<?@). "B *Khai báo: Var <Tên biển mảng>:array[m1 m2,n1 n2] of <Kiểu dl>; *Ví dụ: Chương trình sau tính và đưa ra màn hình bảng nhân Program bangnhan; Uses crt; Var A:array[1 9,1 10] of integer; i,j:integer; begin for i:=1 to 9 do for j:=1 to 10 do a[i,j]:=i*j; for i:=1 to 9 do begin for j:=1 to 10 do write(a[i,j]:4); writeln; end; readln; end. *Bài tập về nhà: Bài 1:Cho mảng 2 chiều m hàng, n cột. Hãy điền các số nguyên dương từ 1 đến m*n vào mảng 2 chiều sao cho mảng được sắp thứ tự theo hình vẽ: (ví dụ m=3, n=4 thì mảng có dạng sau: 1 2 3 4 8 7 6 5 9 10 11 12 Bài 2: Nhập vào số nguyên dương N (2<N<10000) và một dãy a1, a2,….an các phần tử nguyên dương. Cho biết dãy trên có bao nhiêu phần tử khác nhau. Bài 3: Cho N gói kẹo (N<200) đánh số từ 1 đến N, gói kẹo thứ i có ai cái kẹo(ai<200). Hãy sắp các gói kẹo thành 2 phần sao cho độ chênh lệch nhau là ít nhất. C =&+D"E6FB D D"G Gợi ý dùng vòng for để điền các số vào mảng Nếu chỉ số hàng lẻ thì ta điền theo chỉ số cột tăng Nếu chỉ số hàng chẵn thì ta điền theo chỉ số cột giảm Viết ra màn hình mảng vừa điền T:=1; For i:=1 to m do Begin If i mod 2<>0 then For j:=1 to n do Begin A[I,j]:=T; T:=T+1; End Else 2 For j:=N downto 1 do Begin A[I,j]:=T; T:=T+1; End program zizac; uses crt; const nmax=10; var A:array[1 nmax,1 nmax]of integer; m,n,i,j:integer; T:longint; begin clrscr; write('Nhap so hang so cot '); readln(m,n); T:=1; for i:=1 to m do begin if i mod 2 <> 0 then begin for j:=1 to n do begin a[i,j]:=T; inc(T); end; end else for j:=n downto 1 do begin a[i,j]:=T; inc(T); end; end; for i:=1 to m do begin for j:=1 to n do write(a[i,j]:4); writeln; end; readln end. D".GĐể làm bài này ta dùng thuật toán “lùa bò vào chuồng”, Các phần tử bằng nhau sẽ nhốt chung một chuồng, có bao nhiêu chuồng thì có bấy nhiêu phần tử khác nhau trong dãy ban đầu. Ta đóng dãy chuồng C, đánh số chuồng lần lượt từ 1,2….32000 ( ai là các số nguyên dương, ai<32000), ban đầu các chuồng đều trống) Duyệt mảng A ban đầu, phần tử ai sẽ được “nhốt” vào chuồng có số ai (tăng C[a[i]] lên một đơn vị) Đếm số chuồng khác trống đó chính là số phần tử khác nhau của dãy ban đầu. …… Var C:array[0 32000] of integer; ………. Ban đầu khởi tạo chuồng C trống Fillchar(C,sizeof(C),0); For i:=1 to N do inc(C[a[i]]); 3 D:=0; For j:=0 to 32000 do if C[j]<>0 then inc(D); Write(‘So phan tu khac nhau la’,D:4); program sophantukhacnhau; uses crt; var A:array[1 10000] of integer; C:array[0 maxint] of integer; i,j,n,D:integer; begin clrscr; randomize; write('Nhap so phan tu cua day '); readln(n); for i:=1 to n do a[i]:=random(maxint)-random(100); writeln('Day phan tu la '); for i:=1 to n do write(a[i]:8); fillchar(C,sizeof(C),0); for i:=1 to N do inc(C[a[i]]); D:=0; for j:=0 to maxint do if c[j]<>0 then inc(D); writeln('So phan tu khac nhau cua day la ',D:4); readln end. D"4GDùng một trục số với các điểm chia nguyên 0->40000 để đánh dấu tổng số kẹo có thể sinh ra khi xếp một số gói kẹo nào đó lại với nhau. Ta lần lượt xét từng gói kẹo từ a1->an G/s bây giờ xét đến gói ai, để tạo ra các tổng mới, ta cộng ai vào từng tổng đã có (Cộng từ tổng lớn nhất về tổng nhỏ nhất là 0). Mỗi khi sinh ra tổng mới, cần ghi nhớ số hiệu vừa gộp vào để có tổng mới này. … Từ điểm X là điểm đánh dấu nửa tổng tất cả số kẹo (Nếu có) hoặc điểm đánh dấu gần x nhất (Nếu X không được đánh dấu) biết được gói cuối cùng thêm vào, trừ đi số kẹo của gói đó ta đến tổng mới, lại biết số kẹo nào vừa thêm vào để tạo ra tổng mới này….Quá trình tiếp tục khi ta về điểm đánh dấu 0. Chương trình sau lay dl từ tệp chiakeo.int sau do ket qua ghi ở tệp chiakeo.out program chiakeo; uses crt; const fi='chiakeo.int'; fo='chikeo.out'; maxn=200; maxk=200; maxs=40000; type m1=array[0 maxs] of byte; m2=array[1 maxn] of byte; var a:m2; t:m1; sum:word; n:byte; { } procedure nhap; var f:text; i:byte; begin sum:=0; assign(f,fi); reset(f); readln(f,n); {so goi keo lan n} for i:=1 to n do 4 begin read(f,a[i]); sum:=sum+a[i]; {sum la tong so keo} end; close(f); end; { } procedure danhdau; var i:byte; max,j:word; begin fillchar(T, sizeof(T),0); T[0]:=1; { danh dau tong =0 da duoc sinh ra} Max:=0; for i:=1 to n do begin for j:=max downto 0 do {Soat lai cac tong da co tu max ve 0} if T[j]>0 then if T[j+a[i]]=0 then T[j+a[i]]:=i; {danh dau tong j+a[i] vua sinh ra goi i them vao} max:=max+a[i]; end; end; { } procedure timkq; var i,tong:integer; f:text; kq:m2; begin fillchar(kq,sizeof(kq),0); assign(f,fo); rewrite(f); tong:=sum div 2; while T[tong]=0 do dec(tong); writeln(f,sum-tong-tong); repeat kq[t[tong]]:=1; tong:=tong-a[t[tong]] until tong=0; for i:=1 to n do if kq[i]=1 then write(f,'Cac goi thuoc phan 1 ',i,' '); writeln(f); for i:=1 to n do if kq[i]=0 then write(f,'Cac goi thuoc phan 2 ',i,' '); close(f); end; { } Begin clrscr; nhap; danhdau; timkq; 5 end. 4"<H/ *Khai báo Var <biến xâu>:string[độ dài]; * Một số hàm và thủ tục liên quan đến xâu -Length(S): Cho độ dài xâu S -Upcase(ch): Cho kí tự in hoa ứng với ch -Pos(s1,s2): Cho vị trí xuất hiện đầu tiên của S1 trong S2, nếu s1 không có trong s2 hàm cho giá trị 0. -Insert(s1,s2,vt): Chèn xâu s1 vào xâu s2 tại vị trí vt -Delete(s,vt,n): Xóa trong xâu s n kí tự từ vị trí vt -Copy(s,vt,n): Sao chép trong xâu S n kí tự từ vị trí vt -str(x,s): Biến đối số x thành 1 xâu kí tự biểu diễn số đó. -Val(s,x,loi): Đổi xâu s thành số chứa trong x, nếu đổi thành công loi nhận giá trị 0, ngược lại loi nhận giá trị là vị trí kí tự sai trong s. -Concat(s1,s2,…,sn): Ghép các xâu thành một xâu.Nếu tổng độ dài các xâu lớn hơn 255 thì máy tính báo lỗi. …. D"GCho xâu S, kiểm tra xâu S có là xâu đối gương không? D".G Cho xâu S chỉ gồm các chữ cái. Cho biết xâu S có bao nhiêu chữ cái khác nhau. Mỗi chữ cái xuất hiện bao nhiêu lần. D"4GCho xâu S gồm các kí tự chữ số trong hệ thập phân biểu diễn 1 số nguyên dương có không quá 200 chữ số. Hãy tìm cách xóa đi k chữ số khỏi xâu S nói trên để xâu S thu được biểu diễn số có giá trị nhỏ nhất. 9"<8=0"1E6 I6 Khi xử lí dữ liệu gồm các phần tử mà không cần lưu tâm đến quan hệ thứ tự giữa chúng, người ta có thể khai báo dữ liệu theo kiểu tập hợp. *Khai báo: type <tên kiểu>=set of <kiểu cơ sở>; Var <tên biến>:<tên kiểu>; Hoặc var <tên biến>:set of <kiểu cơ sở>; *Ví dụ: Khai báo biến b là tập hợp chứa các kí tự Type ks=set of char; Var b:ks; *Người ta kí hiệu một tập hợp bằng cặp ngoặc vuông, bên trong chứa cá giá trị tập thuộc tập hợp đó: ví dụ A=[1,4,10] Một phần tử thuộc tập hợp đó kí hiệu là x in A *Một số phép toán trên tập hợp -Phép hợp: Kí hiệu A+B -Phép giao: Kí hiệu A*B -Phép hiệu: Kí hiệu A-B -Phép thuộc: Kí hiệu A<=B D"E6!68J) D"GHai từ gọi là bạn bè nếu chúng được tạo nên cùng một số kí tự giống nhau: Ví dụ S1=’aabbbccccb’ và xâu S2=’aabccccaaaaa’ là bạn bè. Viết chương trình nhập 2 xâu từ bàn phím, kiểm tra 2 xâu có là bạn bè không? Thuật toán: Ta đổi 2 xâu thành chữ in hoa, tạo 2 tập hợp t1, t2 rỗng. Duyệt xâu s1 kiểm tra từng kí tự nếu kí tự đang xét s1[i] chưa có trong tệp t1 thì thêm kí tự này vào tệp. Tương tự với xâu s2 và tập hợp t2. So sánh 2 tập hợp nếu chúng bằng nhau thì kết luận 2 xâu là bạn bè. 6 uses crt; type kt=set of char; var t1,t2:kt; s1,s2:string; i,n,m,j:byte; begin clrscr; writeln('Nhap xau 1='); readln(s1); writeln('Nhap xau 2='); readln(s2); for i:=1 to length(s1) do s1[i]:=upcase(s1[i]); for j:=1 to length(s2) do s2[j]:=upcase(s2[j]); t1:=[]; t2:=[]; for i:=1 to length(s1) do if not(s1[i] in t1) then t1:=t1+[s1[i]]; for j:=1 to length(s2) do if not(s2[j] in t2) then t2:=t2+[s2[j]]; if t1=t2 then writeln('Hai xau la ban be ') else writeln('Hai xa khong la ban be'); readln end. D".GNhư các bạn đã biết dãy số Fibonaci là dãy 1, 1, 2, 3, 5, 8, Dãy này cho bởi công thức đệ qui sau: F 1 = 1, F 2 =1, F n = F n-1 + F n-2 với n > 2 Tính số hạng thứ n của dạy Fibonaci. Chương trình nhập n từ bàn phím và viết ra màn hình số hạng thứ N của dãy Fibonaci. GV Hướng dẫn hs viết chương trình này Ta khai báo một mảng lưu lại các số fibonaci tính được, viết ra màn hình số hạng thứ n Var F:array[1 nmax] of longint; F[1]:=1; F[2]:=2; For i:=3 to n do F[i]:=F[i-1]+F[i-2]; Writeln(‘So hang thu n=’,F[n]); D"4GNhập vào một số nguyên không âm, kiểm t ra xem nó có phải là số nguyên tố hay không? Với bài này các em viết một hàm kiểm tra tính nguyên tố của một số dương n bất kỳ, hàm trả về giấ trị True nếu N nguyên tố, ngược lại hàm trả về giá trị False Function NT(n:longint):Boolean; Var i:longint; kq:boolean; Begin If (n=0) or (n=1) then kq:=false Else i:=1; Repeat i:= i+1; Until (n mod i= 0) or (i*i>sqrt(n)); If i*i>sqrt(n) then kq:=true Else kq:=false; NT:=kq; 7 End 8 D"9 In ra các số nguyên tố nhỏ hơn hoặc bằng N (N là số nguyên không âm đượ c nhập từ bàn phím). Với bài tập này các em sử dụng hàm ở trên để kiểm tra các số i<N, nếu NT(i)=true thì ta viết i ra màn hình. program songuyenton; uses crt; var N,i:longint; function NT(n:longint):boolean; var i:longint; kq:boolean; begin if (n=0) or (n=1) then kq:=false else begin i:=1; repeat i:=i+1; until (n mod i=0) or (i*i>n); if i*i>n then kq:=true else kq:=false; end; NT:=kq; end; begin clrscr; writeln('Nhap so n='); readln(N); if n<2 then writeln('Khong co so nt nao nho hon ',n) else for i:=2 to N do if NT(i) then write(i:4); readln end. Thuật toán này dễ cài đặt nhưng có hạn chế là thời gian thực hiện lâu vì với mỗi số lại phải kiểm tra lần lượt các ước của nó do vậy thời gian thực hiện được tính là n 2 . Với n càng lớn thời gian thực hiện sẽ lâu. Có một thuật toán được xem là tốt hơn đó là thuật toán sàng các số nguyên tố. Biểu diễn các só nguyên trên trục số bắt đầu từ số 2 đến N sau đó tìm cách xóa dần các điểm biểu diễn hợp số, các điểm còn lại trên trục số sẽ biểu diễn số nguyên tố. cụ thể: -Ban đầu tất cả các điểm nguyên trên trục số chưa bị xóa; -Số đầu tiên chưa bị xóa là số 2 (đó là số nguyên tố) , xóa các bội của 2 -Số đầu tiên chưa bị xóa là số 3 (Số nguyên tố), xóa các bội của 3 ….quá trình cứ tiếp diễn với các số chưa bị xóa i mà i*i<N Chương trình uses crt; var n,i,j:longint; a:array[1 maxint] of 0 1; begin clrscr; write('nhap so n='); readln(n); fillchar(a,sizeof(a),0); i:=2; while i*i<=n do begin j:=i+i; while (j<=n) do begin a[j]:=1; j:=j+i; end; inc(i); while a[i]=1 do inc(i); end; for i:=2 to N do if a[i]=0 then write(i:4); readln end. D";K'LM2N7"+3&" Như các bạn đã biết dãy số Fibonaci là dãy 1, 1, 2, 3, 5, 8, Dãy này cho bởi công thức đệ qui sau: F 1 = 1, F 2 =1, F n = F n-1 + F n-2 với n > 2 1. Chứng minh khẳng định sau: Mọi số tự nhiên N đều có thể biểu diễn duy nhất dưới dạng tổng của một số số trong dãy số Fibonaci. N = a k F k + a k-1 F k-1 + a 1 F 1 Với biểu diễn như trên ta nói N có biểu diễn Fibonaci là a k a k-1 a 2 a 1 . 2. Cho trước số tự nhiên N, hãy tìm biểu diễn Fibonaci của số N. 6G Tệp văn bản P11.INP bao gồm nhiều dòng. Mỗi dòng ghi một số tự nhiên. 6G Tệp P11.OUT ghi kết quả của chương trình: trên mỗi dòng ghi lại biểu diễn Fibonaci của các số tự nhiên tương ứng trong tệp P11.INP. {$R+} const Inp = 'f11.int'; Out = 'f11.out'; Ind = 46; var n: LongInt; Fibo: array[1 Ind] of LongInt; procedure Init; var i: Integer; begin Fibo[1] := 1; Fibo[2] := 1; [...]... For i:=1 to x do if kt(a[i]) then write(a[i],' ');writeln; readln end Một số thuật toán sắp xếp Sắp xếp là thuật toán căn bản không chỉ trong ngôn ngữ lập trình Pascal mà còn trong nhiều lĩnh vực công nghệ khác Bài viết sau sẽ để cập đến một số thuật toán sắp xếp bằng ngôn ngữ Pascal 1 Bubble Sort (Sắp xếp nổi bọt) Ý tưởng: Giả sử có mảng có n phần tử Chúng ta sẽ tiến hành duyệt từ cuối lên đầu,so sánh... sieu nguyen to co',N,'chu so.'); Readln; END Bài 2: Tam giác Pascal là gì? Quy luật của Tam giác Pascal rất đơn giản : bắt đầu từ hàng thứ ba, mỗi số bên trong là tổng của hai số ngay phía trên nó Ví dụ : ở hàng 3, số 2 là tổng của 1 và 1 ; hàng 4, số 3 là tổng của 2 và 1 ; hàng 5, số 6 là tổng của 3 và 3 Căn cứ theo quy luật đó, Tam giác Pascal là kéo dài đến vô hạn Ví dụ: 1 232 34543 4567654 567898765... khi kiểm tra số nguyên tố ta phải lần lượt kiểm tra các số nhỏ hơn sqrt(n) (căn bậc hai của n) có phải là ước của n hay không, còn khi phân tích ta chỉ việc chia n cho các số nguyên bắt đầu từ số nguyên tố nhỏ nhất là 2 Khi không chia được nữa thì ta tăng số chia lên 1 đơn vị, quá trình phân tích kết thúc khi n bằng 1 VAR i,n :INTEGER; BEGIN Write ('Nhap n:'); Readln(n); Write (n,'='); i:=2; REPEAT WHILE... ',t,'=',sum); readln end Bài 7: (Đề thi HSG tỉnh năm 2010-2011) Dãy số Fibinaci Cho số nguyên dương N (N . fillchar(kq,sizeof(kq),0); assign(f,fo); rewrite(f); tong:=sum div 2; while T[tong]=0 do dec(tong); writeln(f,sum-tong-tong); repeat kq[t[tong]]:=1; tong:=tong-a[t[tong]] until tong=0; for i:=1 to n do if kq[i]=1. i<N, nếu NT(i)=true thì ta viết i ra màn hình. program songuyenton; uses crt; var N,i:longint; function NT(n:longint):boolean; var i:longint; kq:boolean; begin if (n=0) or (n=1) then kq:=false . gán mảng program nt; uses crt; const nmax=100000; var b,a:array[1 nmax] of longint; i,j,dem,t,x,n,k:longint; { } Function Prime(N: longint): boolean; Var i: longint; Begin If (N=0) or (N=1)