THAM BIẾN VÀ THAM TRỊ:

Một phần của tài liệu Lý thuyết và bài tập thực hành có lời giải bồi dưỡng học sinh giỏi tin học 11 cực chuẩn năm 2014 (Trang 36 - 44)

* Phân biệt tham biến và tham trị:

- Tham trị:

• Giá trị không thay đổi khi kết thúc chương trình con.

• Khi khai báo tham số hình thức không có từ khóa Var đứng trước

• Có thể truyền tham trị bằng: giá trị, biến hay biểu thức. Ví dụ về lệnh gọi thủ tục:

Ve_HCN(7,3); Ve_HCN(a,b);

• Tham số hình thức sẽ được coi như một biến cục bộ của CTC, CTC sau đó sẽ có thể

thay đổi giá trị của tham trị này ở bên trong CTC bằng các phép gán, hay một cách bất kì nào khác, song trong mọi trường hợp điều đó không làm thay đổi giá trị của tham số thực. Do vậy một tham trị không bao giờ là kết quả tính toán của CTC.

- Tham biến:

 Tham số hình thức trong phần khai báo của CTC sẽ được đặt sau từ khóa Var

 Với tham biến , các tham số thực sự sẽ phải là các biến chứ không được là giá trị. Ví dụ lời gọi Nhap(3,7) sẽ không được chấp nhận vì là hai giá trị chứ không phải là biến.

 Các tham số thực sự tương ứng với các tham biến có thể được thay đổi giá trị trong

CTC và khi ra khỏi CTC nó vẫn giữ các giá trị đã thay đổi đó. Quan sát ví dụ sau:

program Thambien_thamtri; var a,b:integer;

Procedure Thamso(x:integer; var y:integer); begin x:=x+1; y:=y+1; writeln(x:6,y:6); end; Begin a:=3; b:=3; Thamso(a,b); Writeln(a:6,b:6); readln end. --- Kết quả cho ra:

4 4 3 4

---

Bài tập 1: Viết hàm LOWCASE( c:char):char; để đổi chữ cái hoa c thành chữ thường.

Ý tưởng:

Trong bảng mã ASCII, số thứ tự của chữ cái hoa nhỏ hơn số thứ tự của chữ cái thường là 32. Vì vậy ta có thể dùng 2 hàm CHR và ORD để chuyển đổi.

Program CTC1; Var ch:Char;

Function LOWCASE(c:Char):Char; Begin

If c IN [‘A’..’Z’] Then LOWCASE:=CHR(ORD(c)+32) Else LOWCASE:=c;

End; Begin

Write(‘Nhap ký tu ch=’); Readln(ch); Writeln(‘Ky tu hoa la: ‘, LOWCASE(ch)); Readln;

End.

---

Bài tập 2:Viết thủ tục để hoán đổi hai gía trị x,y cho nhau. Program CTC1;

Var a,b:Real;

Procedure Hoan_doi(Var x,y:Real); Var Tam:Real; Begin Tam:=x; x:=y; y:=Tam; End; Begin

Write(‘Nhap a=’); Readln(a); Write(‘Nhap b=’); Readln(b); Hoan_doi(a,b); (adsbygoogle = window.adsbygoogle || []).push({});

Writeln(‘Cac so sau khi hoan doi: a=‘, a:0:2,’ b=’,b:0:2); Readln;

End.

---

Bài tập 3: Viết hàm XMU(x:Real;n:Byte):Real; để tính giá trị xn.

Bài tập 4: Viết hàm tìm BSCNN của 2 số nguyên a,b được khai báo như sau: Function BSCNN (a,b:word ):word ;

***********************************************************

Đề thi HSG Tin học Quảng Ngãi, năm học 2013-2014, ngày 19/3/2014 Nguyên tố kép:

Bài 5:

_Số nguyên dương n>1 là số nguyên tố nếu nó chỉ chia hết cho 1 va chính nó.

_n là số nguyên tố kép nếu n là số nguyên tố và tổng các chữ số của n cũng là số nguyên tố

Cho số nguyên dương n (2<=n<=10000)

Yêu cầu: đếm xem có bao nhiêu số nguyên tố kép <=n Dữ liệu vào: từ file văn bản BL2.INP

Gồm một số nguyên dương n Dữ liệu ra: ghi vào file văn bản BL2.OUT Số lượng số nguyên tố kép,

Nếu không tìm thấy số nguyên tố kép nào ghi số 0 Ví dụ: BL2.INP : 30

program bt5; var f1,f2:text; n,i:word; d,t:byte; function nto(x:word):boolean; var u:word; begin nto:=false; if x>1 then begin u:=2;

while (u<=sqrt(x)) and (x mod u<>0) do u:=u+1; if u>sqrt(x) then nto:=true;

end; end; function tong(x:word):byte; begin t:=0; while x>0 do begin t:=t + x mod 10; x:=x div 10; end; tong:=t; end; begin assign(f1,'bl2.inp'); reset(f1); assign(f2,'bl2.out'); rewrite(f2); read(f1,n); d:=0; for i:=2 to n do

if nto(i) and nto(tong(i)) then d:=d+1; writeln(f2,'Tong cac so thoa yeu cau: ',d); close(f1);

close(f2); end.

___________________________

Bài 6: Nhập từ bàn phím số nguyên dương N (0<N<=10000) . Viết chương trình kiểm tra xem số đó có phải là số đối gương hay không? ( số đối gương gọi là số Palindrome, đó là số mà khi viết các chữ số của nó theo ngược lại vẫn được chính nó). Ví dụ, 12521 gọi là số đối gương.

Program Bai6;

Var x,L: longint; ok: Boolean;

var p:byte; begin p:=0; While a>0 do Begin a:=a div 10; inc(P); end; sochuso:=p; end; Function DG(a:longint;L:byte):boolean; var i,j:byte; m: array[1..10] of byte; begin

For i:=L downto 1 do Begin m[i]:=a mod 10; a:=a div 10; end; i:=1; j:=L; DG:=false; While i<j do Begin

if m[i] <> m[j] then exit; inc(i); dec(j); end; DG:=true; end; BEGIN write(' nhap so x ='); readln(x); L:=sochuso(x); ok:=DG(x,L);

if ok then write(x, ' la so doi guong')

else write(x, ' khong phai la so doi guong'); readln;

END.

--- (adsbygoogle = window.adsbygoogle || []).push({});

Chú ý:

Thông thường, khi thực hiện hết các lệnh (trong phần câu lệnh) thì chương trình con tự kết thúc. Tuy nhiên có thể thoát khỏi chương trình con ở bất cứ chỗ nào trong phần câu lệnh bằng cách gọi thủ tục “Exit” ( tkhông tham số). Thủ tục này kết thúc chương trình con hiện hành và nhảy đến lệnh sát ngay sau lời gọi chương trình con này.

Nhờ thủ tục “exit” mà ta có thể bố trí nhiều điểm thoát khỏi chương trình con tùy thuộc vào những điều kiện khác nhau (chẳng hạn xây dựng hàm trả lại giá trị được tính bằng nhiều công thức).

Ngoài thủ tục “Exit” dùng để thoát khỏi chương trình chứa nó, Turbo Pascal còn xây

dựng thủ tục “Halt” cho phép kết thúc chương trình bất cứ lúc nào. Điểm khác biệt giữa

Halt và Exit là cấp độ thoát: Exit chỉ thoát khỏi chương trình con chứa nó (nghĩa là vẫn nằm trong lòng chương trình gọi chương trình con này), còn Halt sẽ kết thúc chương trình chính (chương trình ở mức ngoài cùng) dù lời gọi nó ở bất cứ đâu. Như thế Exit chỉ thực sự tương đương Halt nếu như dùng nó ở chương trình chính.

---

Bài tập 7: Viết chương trình nhập vào các số nguyên từ bàn phím cho đến khi nào gặp số nguyên tố thì kết thúc nhập. Tính tổng các số chẵn và trung bình cọng các số lẻ.

Gợi ý:

Dùng vòng lặp REPEAT ... UNTIL NTo; để nhập. Trong đó, NTo là biến kiểu Boolean để kiểm tra số được nhập vào có phải là số nguyên tố hay không.

________________________

Bài tập 8: Viết chương trình in ra màn hình tất cả các số nguyên tố từ 2 đến N. Với N được nhập từ bàn phím.

******************************************************** Bài tập 9: Viết hàm XMU(x:Real;n:Byte):Real; để tính giá trị xn.

Var x:Real; n:Byte; Function XMU(x:Real;n:Byte):Real; Var i:Byte; S:Real; Begin S:=1; For i:=1 To n Do S:=S*x; XMU:=S; End; Begin Write(‘Nhap x=’); Readln(x); Write(‘Nhap n=’); Readln(n); Writeln(’x mu n = ’, XMU(x,n):0:2); Readln; End. ---

Bài 10: Xây dựng hàm daonguoc(n:word) có giá trị trả về của hàm là số nguyên có được bằng cách lấy đảo ngược các chữ số của n. Ví dụ khi đảo ngược số 12305 thì có kết quả là 50321

Bài tập 11: Viết chương trình nhập vào một mảng A gồm N số nguyên và nhập thêm vào một số nguyên X. Hãy kiểm tra xem phần tử X có trong mảng A hay không?

Ý tưởng:

Dùng thuật toán tìm kiếm tuần tự. So sánh x với từng phần tử của mảng A. Thuật toán dừng lại khi x=A[i] hoặc i>N.

Nếu x=A[i] thì vị trí cần tìm là i, ngược lại thì kết quả tìm là 0 (không tìm thấy). Program Bai11;

Uses Crt;

Type Mang = ARRAY[1..50] Of Integer; Var A:Mang; n,i,x:Integer; Procedure Nhapmang; Begin Write('Nhap n='); Readln(n); For i:=1 To n Do begin Write('A[',i,']='); Readln(A[i]); End; end;

Function TimKiem(x, n: Integer; A:Mang):Integer; Var i:Integer;

Begin

i:=1;

While (i <= n) and (x<>A[i]) do i:=i+1; If i <= n Then Timkiem:=i Else Timkiem:=0; End;

{Chuong trinh chinh} Begin

clrscr; Nhapmang;

Write('Nhap x='); Readln(x);

{Ket qua tim kiem}

If TimKiem(x,n,A)<>0 Then (adsbygoogle = window.adsbygoogle || []).push({});

Writeln('Vi tri cua X trong mang la:', TimKiem(x,n,A)) Else Writeln('x khong co trong mang.');

Readln; End.

---

Bài tập 12: Giả sử mảng A đã được sắp xếp theo thứ tự tăng dần. Viết hàm để kiểm tra xem phần tử X có trong mảng A hay không?

Ý tưởng:

So sánh x với phần tử ở giữa mảng A[giua]. Nếu x=A[giua] thì dừng (vị trí cần tìm là chỉ số của phần tử giữa của mảng). Ngược lại, nếu x>A[giua] thì tìm ở đoạn sau của mảng [giua+1,cuoi], ngược lại thì tìm ở đoạn đầu của mảng [dau,giua-1].

Bài tập 13: Viết chương trình nhập vào 2 mảng số nguyên A, B đại diện cho 2 tập hợp (không thể có 2 phần tử trùng nhau trong một tập hợp). Trong quá trình nhập, phải kiểm tra: nếu phần tử vừa nhập vào đã có trong mảng thì không bổ sung vào mảng. In ra màn hình các phần tử là giao của 2 tập hợp A, B.

Ý tưởng: Duyệt qua tất cả các phần tử ai∈A. Nếu ai∈B thì viết ai ra màn hình. Program Bai2;

Uses Crt;

Type Mang=ARRAY[1..50] Of Integer; Var A,B:Mang;

n,m,i:Byte;

Function KiemTra(x:Integer; n:Byte; A:Mang):Boolean; Var i:Byte;

Timthay:Boolean; Begin

Timthay:=False; i:=1;

While (i<=n) AND (not Timthay) Do

If x=A[i] Then Timthay:=True Else i:=i+1; KiemTra:= Timthay;

End;

Procedure NhapMang(Var n:Byte; Var A:Mang); Var ch:Char;

x:Integer; Begin

Writeln('Moi ban nhap so. An ESC de ket thuc nhap!'); n:=0;

Repeat

Write('Nhap so: '); Readln(x);

If not KiemTra(x,n,A) Then Begin n:=n+1; A[n]:=x; End; ch:=Readkey; Until ch=#27;

writeln('Cac so duoc dua vao mang hop le la: '); for i:=1 to n do write(A[i],' ');

writeln; End;

Procedure GiaoAB(n:Byte; A:Mang;m:Byte; B:Mang); Var i:Byte;

Begin

For i:=1 To n Do

If KiemTra(A[i],m,B) Then Write(A[i]:4); End;

Begin Clrscr; Writeln('Nhap mang A: '); NhapMang(n,A); Writeln('Nhap mang B: '); NhapMang(m,B); (adsbygoogle = window.adsbygoogle || []).push({});

Writeln('Giao cua 2 mang A&B la: '); GiaoAB(n,A,m,B);

Readln; End.

---

Bài 14: Cho tệp SN.INP gồm các số nguyên. Đếm có bao nhiêu số nguyên tố có trong tệp SN.INP rồi ghi kết quả vào tệp SN.OUT

Program BT39; var f1,f2: text; x,d:integer; Function nto(n:integer):boolean; var u:integer; Begin nto:=false; if n>1 then begin u:=2;

while (u<=sqrt(n)) and (n mod u <>0) do u:=u+1; if u>sqrt(n) then nto:=true;

end; end; Begin assign(f1,'SN.INP'); reset(f1); assign(f2,'SN.OUT'); rewrite(f2); d:=0;

while not eof(f1) do begin

read(f1,x);

if nto(x) then d:=d+1; end;

write(f2,'So luong so nguyen to: ',d); close(f1);

close(f2); end.

---=

Một phần của tài liệu Lý thuyết và bài tập thực hành có lời giải bồi dưỡng học sinh giỏi tin học 11 cực chuẩn năm 2014 (Trang 36 - 44)