Tham Biến Là Gì Trong Pascal / Top 10 # Xem Nhiều Nhất & Mới Nhất 6/2023 # Top View | 2atlantic.edu.vn

Một Số Sai Lầm Khi Dùng Tham Biến Và Tham Trị Trong Pascal

Khi giảng dạy về phần chương trình con ( CTC ) – Tin học 11 tôi nhận thấy hầu hết học sinh rất bỡ ngỡ với các khái niệm hoàn toàn mới mẻ mang tính trừu tượng như: Danh sách tham số, tham số giá trị, tham số biến, tham số hình thức, tham số thực sự

Điều làm tôi không khỏi băn khoăn đó là làm thế nào để học sinh hiểu và nắm bắt được các khái niệm này một cách hiệu quả nhất, nhằm tránh những sự hiểu lầm giữa các khái niệm tham biến và tham trị .

Hiện nay hầu hết các ngôn ngữ bậc cao đều tổ chức hai cách truyền tham số khi gọi một CTC, đó là truyền theo trị và truyền theo biến. Việc truyền tham chiếu theo hai cách khác nhau nhiều khi gây ra những kết quả khác nhau không mong muốn, điều này dẫn đến những lỗi logic rất khó phát hiện. Dưới đây trình bày những sai lầm có thể xảy ra khi sử dụng hai cách truyền tham chiếu và cách dùng chúng cho đúng để đạt được múc đích đã đề ra của chương trình.

Bài viết này không nghiêng về thuật toán của các bài toán khó mà chỉ đưa ra các bài toán có thuật toán đơn giản nhất để học sinh không rơi vào việc giải quyết thuật toán mà chú trọng đến vấn đề của bài viết: “Một số sai lầm khi dùng tham biến và tham trị trong PASCAL”

A - Đặt Vấn đề Khi giảng dạy về phần chương trình con ( CTC ) - Tin học 11 tôi nhận thấy hầu hết học sinh rất bỡ ngỡ với các khái niệm hoàn toàn mới mẻ mang tính trừu tượng như: Danh sách tham số, tham số giá trị, tham số biến, tham số hình thức, tham số thực sự Điều làm tôi không khỏi băn khoăn đó là làm thế nào để học sinh hiểu và nắm bắt được các khái niệm này một cách hiệu quả nhất, nhằm tránh những sự hiểu lầm giữa các khái niệm tham biến và tham trị . Hiện nay hầu hết các ngôn ngữ bậc cao đều tổ chức hai cách truyền tham số khi gọi một CTC, đó là truyền theo trị và truyền theo biến. Việc truyền tham chiếu theo hai cách khác nhau nhiều khi gây ra những kết quả khác nhau không mong muốn, điều này dẫn đến những lỗi logic rất khó phát hiện. Dưới đây trình bày những sai lầm có thể xảy ra khi sử dụng hai cách truyền tham chiếu và cách dùng chúng cho đúng để đạt được múc đích đã đề ra của chương trình. Bài viết này không nghiêng về thuật toán của các bài toán khó mà chỉ đưa ra các bài toán có thuật toán đơn giản nhất để học sinh không rơi vào việc giải quyết thuật toán mà chú trọng đến vấn đề của bài viết: "Một số sai lầm khi dùng tham biến và tham trị trong PASCAL" B- Giải quyết vấn đề: 1. Những tình huống có thể xẩy ra trong khi sử dụng tham biến và tham trị . Nếu một CTC có danh sách tham số thì các tham số phải được khai báo ở phần đầu sau tên CTC, trong cặp dấu ngoặc tròn. Khai báo một tham số có nghĩa là chỉ ra nó thuộc loại tham số nào ( tham số biến hay tham số trị ) và nó có kiểu dữ liệu là gì? Ví dụ: Procedure Delta(Var x: integer ; y: real); Function Beta( a, b: real): real; Danh sách tham số là x, y, a, b. Với x có kiểu dữ liệu Integer y, a, b, có kiểu số thực. Vậy trong danh sách tham số x, y, a, b đâu là tham biến, đâu là tham trị? Bằng trực quan ta dễ dàng nhận thấy x là tham biến vì x có từ khoá Var đứng trước; y, a, b là tham trị vì không có từ khoá Var đứng trước. Để thấy rõ hơn về bản chất sự khác nhau giữa tham biến và tham trị ta xét ví dụ sau: Ví dụ1: Progam Vidu1; Procedure Tong_hieu(a, b: Integer; Var c, d: Integer ); Begin c:= a - b ; d:= a + b ; a:= a*b ; End; Begin clrscr; a:= 10; b:= 3; c:= 5; d:= 6; Tong_hieu(a,b,c,d); Write(a,b,c,d); Readln; End. Mới nhìn vào chương trình nhiều học sinh có thể chủ quan đưa ra các giá trị 30, 3, 7, 13 tương ứng với các tham số a, b, c, d. Nhưng kết qủa nhận được sau khi chạy chương trình lại là 10, 3, 7, 13 tương ứng với các tham số a, b, c, d. Vậy tại sao lại có kết quả này? Thật vậy, do a, b được truyền theo trị nên khi có lời gọi Tong_hieu(a,b,c,d) thì giá trị của a, b vẫn được giữ nguyên như ban đầu a = 10, b = 3 còn c, d được truyền theo biến nên khi có lời gọi Tong_hieu(a,b,c,d) thì các giá trị của c, d thay đổi c = 7, d = 13 Nhận xét: Qua ví dụ1, sau khi chạy chương trình thì tham biến có kết quả thay đổi còn tham trị kết quả không thay đổi, đó chính là sự khác nhau cơ bản giữa tham biến và tham trị, ta xét ví dụ sau. Ví dụ 2: Program VD2; Var x,y: Integer ; Procedure Thamso(Var Z: Integer ; W: Integer); Begin Z:= 1; W:=1; End; Begin {chuong trinh chinh} x:= 0; y:= 0; Writeln(x:5,y:5); Thamso(x,y); Writeln(x:5,y:5); Readln; End. Kết quả nào sẽ xuất hiện trên màn hình khi chương trình được thực hiện: 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 Bước vào thân chương trình chính ban đầu x và y đều có giá trị là 0 (do các lệnh x:= 0, y:= 0). Khi gọi thủ tục Thamso(x,y), tham số biến được thay bởi biến x. Điêù này có nghĩa là mọi thao tác đối với z trong thủ tục sẽ xẩy ra đối với x; cụ thể là lệnh gán z:= 1 bây giờ sẽ là x:= 1, tức gán giá trị 1 cho biến x. Còn khi gọi thủ tục Thamso(x,y) tham số w được thay bởi biến y; giá trị của biến y được sao chép sang cho biến w. Tức là w có giá trị 0. Khi bước vào thân thủ tục không có một liên quan nào nữa giữa biến y với w, vì vậy lệnh gán w:= 1 không ảnh hưởng gì đến giá trị của y. Như vậy, giá trị của x được in ra là 1, còn y là 0. Với thủ tục Procedure Thamso(Var z: Integer ; w: Integer ) thì các lời gọi sau đây có hợp lý không? Thamso(x + 1, y) hay Thamso(2, y). Khi thay lời gọi Thamso(x,y) bằng 2 lời gọi trên thì máy sẽ báo lỗi. Bởi trong lời gọi CTC các tham số biến chỉ được phép thay bởi các biến cùng kiểu, không được là hằng(2) hay biểu thức(x+1), còn các tham số giá trị được phép thay thế bởi hằng, biểu thức hoặc biến đơn. Sự thay thế phải theo đúng trật tự các tham số đã khai báo trong đầu của CTC. Ngoài lời gọi Thamso(x,y) thì các lời gọi Thamso(x,y+1); Thamso(x,3); đều không hợp lý. Đây chính là một sự khác nhau nữa giữa tham biến và tham trị. Nhận xét: Khi đã nhận biết được sự khác nhau giữa tham biến và tham trị thì một CTC có tham số lúc nào cần đến tham biến, lúc nào cần đến tham trị? Ví dụ 3: Program VD3; Var x,y: Integer; Procedure Hoandoi(x,y:Integer); Var t:Integer; Begin t:= x; x:= y; y:= t; End; Begin x:=1; y:= 2; Hoandoi(x,y); Writeln('Hai so chua hoandoi:',x:2,y:2); Write('x=',x:2,' y=',y:2); Readln; End. Thủ tục Hoandoi(x,y) trong ví dụ này dùng để đổi giá trị giữa 2 biến nguyên x và y. Tuy nhiên khi chạy chương trình, điều này không xẩy ra. Giá trị của 2 biến nguyên x và y trước khi gọi thủ tục x có giá trị bằng 1, y có giá trị bằng 2 và sau khi gọi thủ tục Hoandoi(x,y) giá trị của x, y có giá trị vẫn không đổi: x=1, y=2. Vậy lỗi xẩy ra do thủ tục Hoandoi(x,y) tổ chức truyền theo trị nên các giá trị của các biến x và y không bị ảnh hưởng bởi các lệnh đổi giá trị trong thủ tục này. Nếu sữa lại việc khai báo các tham số trong thủ tục tráo đổi là truyền theo biến (thêm từ khoá Var trước x, y trong phần đầu của thủ tục) thì chương trình sẽ cho kết quả như mong muốn: x=2, y=1. Ví dụ 4: Program VD4; Var tu,mau,d:word; Function UCLN(Var a,b:Word):Word; Begin While ab Do If a>b Then a:= a-b Else b:= b-a; UCLN:= a; End; Begin Write('nhap tu so:'); Readln(tu); Write('nhap mau so:'); Readln(Mau); d:= UCLN(tu,mau); writeln('d =:',d); If d>1 Then Begin Tu:= tu Div d; mau:= mau Div d; End; Writeln('phan so duoc toi gian la:',tu,'/',mau); Readln; End. Chương trình trên sử dụng hàm UCLN(a, b) để tối giản một phân số khi nhập từ bàn phím các giá trị tử số và mẩu số của nó. Nhìn vào chương trình ta không phải bàn đến tính đúng đắn của công thức. Vì ta thấy chương trình trên trả về UCLN của hai số nguyên dương a và b và dùng hàm này để tính d là UCLN của tử và mẫu. Phân số tối giản nhận được bằng cách cùng chia tử và mẫu cho d. Tuy nhiên khi chạy chương trình, ta luôn nhận được kết quả không mong muốn là 1/1 cho mọi phân số. Vậy lỗi do đâu? Lỗi logic này xẩy ra do hàm UCLN được tổ chức truyền theo tham biến, nên sau lời gọi d:= UCLN(tu,mau) , ta được đồng thời các giá trị d, tu, mau bằng nhau và bằng d. Để chương trình cho kết quả đúng ta phải sửa lại việc khai báo các tham số trong hàm UCLN là truyền theo tham trị ( bỏ từ khoá Var trước a, b). Nhận xét: Việc tổ chức truyền theo trị hay truyền theo biến cho một tham số là không thể tuỳ tiện vì nó có thể dẫn đến những kết quả sai với yêu cầu của bài toán. Qua hai ví dụ trên đã minh hoạ các tình huống có thể xảy ra. Ví dụ 3 cho một kết quả sai khi truyền theo trị trong khi nếu sửa lại việc khai báo các tham số trong thủ tục Hoandoi là truyền theo tham biến thì chương trình sẽ cho kết quả đúng với yêu cầu của bài toán. Còn ở ví dụ 4 cho thấy một kết quả sai khi truyền theo tham biến. Ví dụ 5: Program VD5; Var a: Byte; Function F(Var x:Byte):Byte; Begin x:=x+1; F:=x; End; Begin a:=5; Writeln(F(a)+F(a)); Readln; End. Chương trình đơn giản trên đưa ra màn hình giá trị F(a)+F(a) với a = 5. Bằng suy luận thông thường, kết quả đúng phải là 12 vì tại a = 5, F (a) cho giá trị 6. Tuy nhiên khi chạy chương trình ta sẽ nhận được kết quả 13. Có thể sửa biểu thức F(a)+F(a) thành biểu thức 2*F(a) lúc này ta sẽ nhận được kết quả là 12. Chương trình vẫn thực hiện đúng những lệnh mà ta viết, chỉ có điều ở đây xuất hiện hiệu ứng phụ do hàm F được tổ chức truyền theo biến đối với tham biến x của nó. Lệnh x:= x + 1 trong hàm F sẽ làm biến a tăng lên một đơn vị mỗi khi gọi F(a) khi thực hịên biểu thức F(a)+F(a), giá trị F(a) được gọi hai lần. Tại lần thứ nhất a = 5, do đó F(a) = 6 , tại lần gọi thứ hai lúc đó a = 6 do đó F(a) = 7 và ta nhận được kết quả 13. Trong khi đó biểu thức 2*F(a) chỉ gọi giá trị F(a) một lần vì thế mà ta nhận được kết quả là 12. Nếu sửa lại việc truyền cho tham biến x của hàm F là theo trị thì không còn sự khác nhau như vậy nữa. Nhận xét: Như vậy, khi truyền một tham số cho CTC, nếu ta muốn bảo vệ giá trị của tham số đó khỏi bị CTC " vô tình phá" thì tham số đó phải được dùng như là tham trị. Khi đó cho phép giá trị đầu vào tương ứng có thể là hằng, biểu thức hoặc biến nguyên. Còn một tham số nếu muốn dùng để lấy kết quả (những biến đổi) do chương trình con đem lại thì tham số đó phải là tham biến và giá trị đầu vào tương ứng chỉ có thể là biến. 2. Xây dựng một số câu hỏi trắc nghiệm và bài tập phục vụ cho tiết kiểm tra. Câu 1: Với a là tham biến, b là tham trị thì khai báo phần đầu cho thủ tục nào sau đây là đúng? (a, b đều có kiểu DL Integer) Procedure M(Var a:Integer ; b: Integer ); Procedure M(a,b: Integer ); Procedure M(Var a,b: Integer ); Procedure M(a: Integer ; Var b: Integer ) ; Đáp án: A Câu2: Cho biết giá trị tương ứng cho các biến a, b, c, d sau khi chạy thử chương trình : Progam Vidu1; Procedure Tong_hieu(a, b: Integer; Var c, d: Integer ); Begin c:= a - b ; d:= a + b ; a:= a*b ; End; Begin clrscr; a:= 10; b:= 3; c:= 5; d:= 6; Tong_hieu(a,b,c,d); Write(a,b,c,d); Readln; End. A. 30, 3, 7, 13 B. 10, 3, 7, 13 C. 10, 3, 5, 6 D. 30, 3, 5, 6 Đáp án: B Câu 3: Số nào được in ra màn hình khi thực hiện chương trình sau? Program c3; Var a,b:byte; Procedure Thu1(Var a:byte); Begin a:= 2*a; b:=b+5; End; Begin a:= 3; b:= 7; Thu1(b); a:= a+b; Writeln(a); Readln; End. A. 13 B. 19 C. 22 D. (Một đáp án khác) Đáp án: C Câu 4: Số nào được in ra màn hình khi thực hiện chương trình sau? program C4; Var x:integer; Procedure Thaydoi( x:integer); Begin x:=1; end; Begin x:=0; Thaydoi(x); Writeln(x:3); readln End. A. 1 B. 0 C. 1 0 D. 0 1 Đáp án: B Câu 5: Chương trình sau cho kết quả gì? Program VD5; Var a: Byte; Function F(Var x:Byte):Byte; Begin x:=x+1; F:=x; End; Begin a:=5; Writeln(F(a)+F(a)); Readln; End. A. 10 B. 11 C. 12 D. 13 Đáp án: D Câu 6: (Ta cũng có thể có câu hỏi như sau đối với Vd5): Hãy sửa lỗi chương trình trên để chương trình có kết quả là 12 ? Đáp án: Cách 1: Function F( x:Byte):Byte; Cách 2: Thay biểu thức (F(a)+F(a))thành biểu thức (2*F(a)) Câu 7: Với đầu thủ tục: Procedure N( x:Integer ; Var y:Integer ); m là biến nguyên, các lời gọi sau đây lời gọi nào là hợp lệ? N(m,m+3); N(2,m); N(m+1,4); N(2,3*m+5); Đáp án: B Câu 8: Hãy sữa lỗi chương trình sau và cho biết chương trình sau làm việc gì? Program C8; Var n:integer; Begin Function fibo( Var n: longint):longint; Begin If n<3 then fibo:= 1 Else fibo:= fibo(n-1)+fibo(n-2); End; Write('nhap n:'); Readln; Writeln(fibo(n)); Readln; End. Đáp án: Chương trình được sữa lỗi: Program C8; Var n:integer; Function fibo(n: longint):longint; Begin If n<3 then fibo:= 1 Else fibo:= fibo(n-1)+fibo(n-2); End; Begin Write('nhap n:'); Readln(n); Writeln(fibo(n)); Readln; End. Chương trình dùng hàm để tính dãy số Fibonaxi F1, F2, , Fn với F1= F2=1 Fn =Fn-1+Fn-2(n>2) . C- Kết luận Đề tài đã thu được một số kết quả sau: Xây dựng được hệ thống câu hỏi, bài tập để giảng dạy chương VI - phần CTC và lập trình có cấu trúc, Sử dụng các ví dụ này vào trong các đề kiểm tra: tìm đáp án đúng hay sửa lỗi chương trình Đề tài đã được ứng dụng để giảng dạy và đạt kết quả tốt trong năm học vừa qua. Phần lớn học sinh đã phân biệt được bản chất của sự khác nhau giữa tham biến và tham trị và cách sử dụng chúng. D- Kiến Nghị Để tiết kiệm thời gian và các giờ học đạt kết quả cao, giáo viên cần chuẩn bị sẵn các chương trình vào máy hay trên khổ giấy lớn. Học sinh có thể chạy chương trình và thử với các bộ test khác nhau (Tốt hơn là dạy bằng máy chiếu vì hầu hết trường nào cũng đã có). Bài viết này mới chỉ là một phần của CTC, chúng tôi mong rằng có nhiều bài viết về những vấn đề còn lại của CTC để hoàn thiện cả phần CTC. Tháng 4 / 2008 Tài liệu tham khảo Hồ Sĩ Đàm - Hồ Cẩm Hà - Trần Đỗ Hùng - Nguyễn Đức Nghĩa - Nguyễn Thành Tùng - Ngô ánh Tuyết . Tin học 11(SGK thí điểm), NXB Giáo dục. Hồ Sĩ Đàm - Hồ Cẩm Hà - Trần Đỗ Hùng - Nguyễn Đức Nghĩa - Nguyễn Thành Tùng - Ngô ánh Tuyết . Tin học 11(SGV thí điểm), NXBGD. Lê Khắc Thành - Hồ Cẩm Hà - Nguyễn Vũ Quốc Hưng. Tài liệu bồi dưỡng thường xuyên cho GV THPT chu kỳ III (2004 - 2007). Quách Tuấn Ngọc. Ngôn ngữ lập trình PASCAL (lý thuyết và bài tập).

Biến Số Và Hằng Số Trong Lập Trình Pascal

ngay ở tiêu đề mình cũng có thể hiểu được một phần nào ý nghĩa của biến số và hằng số. Biến số là giá trị của nó sẽ thay đổi trong quá trình chạy chương trình tùy thuộc vào từng ngữ cảnh cụ thể.1. Hằng.

1.1. Khái niệm về hằng (constant) : Hằng là đại lượng có giá trị không thay đổi trong suốt quá trình thực hiện chương trình.

trong đó là tự đặt, theo đúng quy tắc của một tên, còn giá_trị có thể là một hằng hoặc một biểu thức mà các toán hạng đều là hằng.

max = 150; {hằng nguyên} L = False; {hằng logic} A = (5*7)/4; {hằng thực} ch =’Y’; {hằng ký tự}

Ho = ‘Viet Nam’; {hằng chuỗi}

Writeln(‘Diện tích hình tròn bán kính r = 5 là : ‘,pi*5*5:8:3);Không đặt tên biến hay tên hàm trùng với các hằng số có sẵn trong Pascal.

2.1. Khái niệm về biến (variable) : Biến là đại lượng có giá trị thay đổi được trong chương trình. Mỗi biến phải thuộc về một kiểu dữ liệu nhất định và phải được khai báo trước. Việc khai báo có tác dụng báo cho máy dành sẵn các ô nhớ thích hợp trong bộ nhớ để sẵn sàng chứa dữ liệu.

Biến ten ở ví dụ trên chứa một dãy không quá 7 ký tự. Ta nói biến ten có độ dài 7 byte. Biến String khai báo tối đa là String[255].

Một biến String (chuỗi, sâu ký tự) được cấp một số byte bằng độ dài của nó cộng thêm 1. Byte đầu tiên dùng để ghi số ký tự đang được lưu trữ, mỗi byte còn lại chứa một ký tự.

Có thể vừa khai báo vừa khởi đầu (gán giá trị) cho các biến theo cách sau :

Chú ý phân biệt x và y : x là hằng thực, y là biến thực. Trong chương trình có thể thay đổi giá trị của y nhưng không thể thay đổi giá trị của x.

3. Các loại biến, phạm vi của biến.

3.1 Biến toàn cục.

3.2 Biến cục bộ.

4. Tham biến và tham trị.

4.1 Tham biến.

4.2 Tham trị.

Ý Nghĩa Tham Số, Tham Trị, Tham Biến

a. tham số: các biến truyền vào hàm b. tham trị: giá trị của tham số c. tham biến: tham số dưới dạng tham chiếu

a. int a = 4; Print(a); b. int b = 4; Print(b); c. int c; Print(&c);

Giả sử tôi có 1 module tên mà làm việc theo nguyên tắc cần số liệu vào ( tham trị ) và cho kết quả

ví dụ :

+ Như là công việc kiểm tra hợp đồng (module ) cần 1 tờ giấy báo cáo ( tham số) có những thông tin (tham trị) +Ví dụ tôi có hàm tính căn bậc 2, với y=8 , x= căn bậc 2 của (y) ta có y là tham số , 8 là tham trị , và sau khi gọi hàm thì giá trị của y , bản hợp đồng vẫn thế ko có gì thay đổi

tham biến :

ví dụ

module : sửa bản hợp đồng tham biến : 1 bản hợp đồng nào đó Sau khi thực hiện mudule trên thì bản hợp đồng sẽ thay đổi.

tăng biến x lên 1 : module : ++ tham biến : x Sau khi thực hiện mudule trên thì x sẽ thay đổi.

trực quan sinh động đến tư duy trừu tượng :

1 hàm sử dụng tham số có ý nghĩa là hàm đó chỉ lấy giá trị nằm trong biến đó thôi, chứ bản thân hàm biến đó ko phải là đối tượng của hàm. Cái đối tượng đem ra xử lý của hàm là giá trị nằm trong đó. hàm tính căn bậc 2 : cái nó quan tâm ở đây là căn bậc 2 của mấy , số là đối tượng được quan tâm tơi. khi tính căn bậc 2 của x: thì x là tham số, giá trị nằm trong x là tham trị

Hàm sử dụng tham chiếu là hàm làm việc trực tiếp với biến đó, đối tượng được truyền vào ko phải là giá trị mà chính là địa chỉ của biến đó nằm trong bộ nhớ sẽ giúp cho hàm này có khả năng thay đổi biến đó ví dụ hàm chuẩn hóa 1 xâu : thì : cái cần chuẩn hóa là gì , xâu, ví dụ char p[]=”hêllô aa” thì p chính là đối tượng được quan tâm chứ ko phải là chuỗi “hêllô aa” , sau khhi chuẩn hóa thì nội dung trong p sẽ bị thay đổi

Điểm Khác Nhau Giữa Truyền Tham Số,Truyền Tham Trị và Truyền Tham Số Đầu Ra

Chúng Ta thử xem một sự so sánh trong 3 ngôn ngữ C,C++,C# xem có gì khác nhau giữa ba hình thức truyền Tham số cho một hàm:

Ta xét một số khái niệm cơ bản sau:

*Tham Số Hình Thức:Là tham số được khai báo trong phần Danh Sách Các Tham Số trong phần khai báo Hàm.Kiểu dữ liệu của tham số hình thức sẽ quyết định kiểu giá trị cho tham số thực tương tứng,

Ví DỤ: nếu tham số hình thức đựoc khai báo là con trỏ thì tham số thực tương ứng phải là địa chỉ của một biến nguyên hoặc là tên cảu biến mảng: xét một hàm đc khai báo như sau:

function swap(int *a,int *b) { }

thì phần gọi hàm sẽ là swap(&x,&y)

*Tham số thực:Chỉ đến các thông tin được truyền cho hàm trong các lời gọi hàm tương ứng.mỗi tham số thực tương ứng với một tham số hình thức:

Chú Ý:Cần phân biệt truyền theo trị và truyền theo tham biến

-truyền theo trị:khi một tham số được truyền theo trị thì một bản sao giá trị của tham số THỰC được tạo ra và gán cho các tham số hình thức của hàm.vì vậỵ mà mọi thay đổi trong hàm trên bản sao sẽ không ảnh hưởng tới giá trị ban đầu của biến nằm trong hàm gọi .Truyền theo trị được dùng bất cứ khi nào hàm bị gọi không cần thiết thay đổi giá trị BIẾN mà hàm gọi truyền vào tham số cho nó. -Truyền theo tham biến:Khi một hàm được truyền theo tham biến thì hàm gọi sẽ truyền trực tiếp tham số (bắt buộc phải là tham biến)cho hàm đựơc gọi .trong trường hợp này thì tham số hình thức và tham số thực là một .Truyền theo thambiến chỉ nên dùng khi hàm bị gọi thực sự cần thiết thay đổi giá trị của biến truyền vào cho nó

Ví Dụ:

Đối với ngôn ngữ C:có 2 hình thức truyền tham số: + tham số được truyền theo trị +tham số được truyền theo con trỏ:

/*Swap1.c */

ket qua Truoc khi goi swap 3 4 Sau khi goi swap 3 4

/*Swap2.c*/ /*tham số hình thức là một con trỏ*/

Ket Qua Truoc Khi GOi Ham Swap 3 4 Sau Khi Goi Ham Swap 4 3

Tóm Lại trong C để lấy đc giá trị thay đổi thì nên truyền theo con trỏ

Trong C++:

Trong c++ ngoài 2 cách truyền như trên C++ còn đưa thêm một kiểu truyền nữa là truyền theo tham chiếu

vậy tham chiếu là gi?

ta xét ví dụ sau:Nguyễn Sinh Cung là tên gốc của BÁc Hồ.Như vậy khi cùng nói về nguyễn Sinh Cung có ngưòi thì không gọi tên gốc mà có thể gọi là HỒ CHÍ MINH,hay Nguyễn văn Ba,hay Nguyễn Ái Quốc,..Như vậy dù gọi theo cách nào thì mọi người vẫn hiểu đó là ngụyễn sinh cung, Như Vậy cách gọi :Nguyễn Ái Quốc,Nguyễn Sinh CUng,...đóng vai trò là tham chiếu tức là cùng tham chiếu đến cùng một đối tượng cụ thể(ở đây là bác hồ) trong C++ để tham chiếu đến một biến thì khai báo như sau:

int n; int &p=n;

Ket Qua Truoc Khi GOi ham Swap1() x=3 y=4 sau khi hoi ham swap1() x=3 y=4 Truoc Khi GOi ham Swap2() x=3 y=4 sau khi hoi ham swap2() x=4 y=3 Truoc Khi GOi ham Swap3() x=3 y=4 sau khi hoi ham swap3() x=4 y=3

Túm Lại Trong C++ có 3 cách truyền +truyền theo tham trị +truyền theo tham trỏ +truyền theo tham chiếu(reference)

Trong C#

trong C# chúng ta sẽ làm quen với khái niệm là Class và Ọbject ,mình sẽ không nhắc lại .nếu ai quên thì giở sách cuả bác Dương Quang Thiện ra xem lại

Trong C# cũng có 3 cách truyền vào cho một phương thức

+truyền theo Tham trị:Khi Tham số có kiểu dữ liệu là giá trị thì sẽ được truyền vào cho phương thức kiểu giá trị .điều này có nghĩa là khi một đối tượng(trong C chính là các biến ) có kiểu giá trị được truyền vào một phương thức thì sẽ có một bản sao của đối tượng đó sẽ được tạo ra bên trong phương thức.khi phương thức này kết thúc thì bản sao này cũng bị huỷ,cách dùng đối với trường hợp này giống với cách dùng trong C/C++ +Truyền theo tham chiếu:Một phương thức chỉ có thể trả về duy nhất một giá trị ,trong trường hợp muốn nhận nhiều hơn một kết qủa thì ta cách thực hiện là tạo các tham số dưới hình thức là các tham chiếu.khi đó ta sẽ sử dụng từ khoá ref +truyền theo tham chiếu với biến chưa khởi tạo:trong C# bắt buộc phải thực hiện việc gán giá trị cho biến trước khi sử dụng.do vậy khi khai báo một biến kiểu cơ bản nào đấy thì trứơc khi có lênh nào đó sử dụng biến này thì bắt buộc phải gán giá trị cho biến đó

Như vậy để không phải khởi tạo tham số trước khi dùng thì C# cung cấp thêm một từ khoá out

Chú ý: bên trong phương thức chứa tham số tham chiếu out thì các tham số này phải được gán giá trị trứoc khi trở về:

Biến Và Cách Khai Báo Của Pascal

Trong các bài viết trước chúng tôi đã giới thiệu cho bạn các kiểu dữ liệu trong Pascal, bài viết này chúng tôi sẽ giới thiệu cho bạn về biết và cách khai báo của Pascal

Biến là giá trị có thể thay đổi được trong mỗi chương trình, mỗi biến trong Pascal có một kiểu dữ liệu nhất định, xác định kích thước và cách bố trí trong bộ nhớ, phạm vi các giá trị có thể được lưu trữ trong bộ nhớ đó; và bộ toán tử có thể áp dụng cho biến.

Tên của biến có thể bao gồm các chữ cái, chữ số, ký tự gạch chân và phải bắt đầu bằng chữ cái hoặc ký tự gạch chân. Pascal không phân biệt chữ hoa và chữ thường, vì vậy sử dụng chữ hoa hay chữ thường cũng đều như nhau.

Pascal có nhiều hàm khác nhau, để tìm hiểu hết các hàm Pascal không phải chuyện sớm mà cần phải nghiên cứu thật lâu, có nhiều hàm Pascal đơn giản, nhưng có có hàm phức tạp giống như các biến vậy.

Biến và cách khai báo của Pascal Các biến cơ bản trong Pascal

Ngôn ngữ lập trình Pascal cũng cho phép xác định các kiểu biến khác nhau. Tuy nhiên trong bài viết này chúng tôi sẽ chỉ giới thiệu cho bạn các biến cơ bản.

Khai báo biến trong Pascal

Tất cả các biến phải được khai báo trước khi sử dụng chương trình Pascal. Tất cả các khai báo biến theo sau từ var. Một khai báo chỉ định một danh sách biến, tiếp theo là dấu hai chấm (:) và kiểu biến. Cú pháp khai báo biến:

var variable_list : type;

Trong đó type phải là kiểu biến Pascal hợp lệ, bao gồm các ký tự (character), số nguyên (interger), số thực (real), boolean hoặc bất kỳ kiểu dữ liệu do người dùng chỉ định, … . Và variable_list có thể bao gồm một hoặc nhiều tên định danh được phân tách nhau bởi dấu phẩy.

varage, weekdays : integer;taxrate, net_income: real;choice, isready: boolean;initials, grade: char;name, surname : string;

Trong các bài viết trước chúng tôi đã đề cập Pascal cho phép khai báo kiểu. Có thể xác định kiểu khai báo bằng tên hoặc định danh. Ngoài ra có thể sử dụng khai báo kiểu để xác định các kiểu biến.

Ví dụ:

typedays, age = integer;yes, true = boolean;name, city = string;fees, expenses = real;

Khai báo kiểu có thể được sử dụng trong khai báo biến.

varweekdays, holidays : days;choice: yes;student_name, emp_name : name;capital: city;cost: expenses;

Lưu ý giữa khai báo kiểu (type) và khai báo biến (var) có sự khác nhau. Khai báo kiểu cho biết các kiểu như integer (kiểu số nguyên), real (số thực), … . Còn khai báo biến cho biết giá trị mà một biến có thể thực hiện.

Bạn có thể so sánh khai báo kiểu trong Pascal với typedef trong C. Quan trọng nhất là tên biến đề cập đến vị trí bộ nhớ, nơi mà giá trị của biến sẽ được lưu trữ, còn khai báo kiểu thì không.

Khởi tạo giá trị của biến trong Pascal

Các biến được gán giá trị với dấu hai chấm (:) và dấu bằng (=), tiếp theo là một biểu thức hằng. Công thức chung để gán một giá trị là:

variable_name := value;

Mặc định các biến trong Pascal không được khởi tạo bằng 0, mà có thể chứa các giá trị rác. Vì vậy tốt hơn là khởi tạo các biến trong một chương trình.

Các biến có thể được khởi tạo (được gán giá trị ban đầu) trong phần khai báo biến. Khởi tạo biến theo sau từ var và cú pháp khởi tạo như sau:

varvariable_name : type = value;

Một số ví dụ như:

program Greetings;constmessage = ‘ Welcome to the world of Pascal ‘;typename = string;varfirstname, surname: name;beginwriteln(‘Please enter your first name: ‘);readln(firstname);writeln(‘Please enter your surname: ‘);readln(surname);writeln;writeln(message, ‘ ‘, firstname, ‘ ‘, surname);end.

Sau khi được biên dịch và thực thi, đoạn mã trên sẽ cho kết quả:

Please enter your first name:JohnPlease enter your surname:SmithWelcome to the world of Pascal John Smith

Biến liệt kê

Bạn đã thấy cách sử dụng các kiểu biến đơn giản như Integer, Real và Boolean. Các biến của kiểu liệt kê, có thể được khai báo như sau:

varvar1, var2, … : enum-identifier;

Khi khai báo các biến kiểu liệt kê, bạn có thể sử dụng khai báo kiểu. Ví dụ:

typemonths = (January, February, March, April, May, June, July, August, September, October, November, December);Varm: months;…M := January;The following example illustrates the concept −program exEnumeration;typebeverage = (coffee, tea, milk, water, coke, limejuice);vardrink:beverage;beginwriteln(‘Which drink do you want?’);drink := limejuice;writeln(‘You can drink ‘, drink);end.

Sau khi được biên dịch và thực thi, đoạn mã trên sẽ cho kết quả là:

Which drink do you want?You can drink limejuice Biến miền con

Biến miền con được khai báo:

varsubrange-name : lowerlim … uperlim;

Ví dụ về khai báo biến miền con:

varmarks: 1 … 100;grade: ‘A’ … ‘E’;age: 1 … 25;

Chương trình cụ thể sử dụng các biến kiểu miền con:

program exSubrange;varmarks: 1 .. 100;grade: ‘A’ .. ‘E’;beginwriteln( ‘Enter your marks(1 – 100): ‘);readln(marks);writeln( ‘Enter your grade(A – E): ‘);readln(grade);writeln(‘Marks: ‘ , marks, ‘ Grade: ‘, grade);end.

Sau khi được biên dịch và thực thi, đoạn mã trên sẽ cho kết quả là: