<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE document PUBLIC "-//CNX//DTD CNXML 0.5 plus MathML//EN" "http://cnx.rice.edu/cnxml/0.5/DTD/cnxml_mathml.dtd">
<document xmlns="http://cnx.rice.edu/cnxml" xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/" id="id19375750">
  <name>Chương trình con</name>
  <metadata>
  <md:version>1.1</md:version>
  <md:created>2007/11/19 20:13:36.197 US/Central</md:created>
  <md:revised>2007/11/23 11:27:58.795 US/Central</md:revised>
  <md:authorlist>
      <md:author id="linhnguyen">
      <md:firstname>Nguyễn</md:firstname>
      <md:othername>Văn</md:othername>
      <md:surname>Linh</md:surname>
      <md:email>linhnguyen@vocw.edu.vn</md:email>
    </md:author>
  </md:authorlist>

  <md:maintainerlist>
    <md:maintainer id="linhnguyen">
      <md:firstname>Nguyễn</md:firstname>
      <md:othername>Văn</md:othername>
      <md:surname>Linh</md:surname>
      <md:email>linhnguyen@vocw.edu.vn</md:email>
    </md:maintainer>
  </md:maintainerlist>
  
  

  <md:abstract/>
</metadata>
  <content>
    <section id="id-597817818449">
      <name>TỔNG QUAN</name>
      <section id="id-852579814821">
        <name>Mục tiêu</name>
        <para id="id19493368">Sau khi học xong chương này, sinh viên cần phải nắm:</para>
        <list type="bulleted" id="id19493375">
          <item>Khái niệm về chương trình con.</item>
          <item>Cơ chế hoạt động khi chương trình con được gọi.</item>
          <item>Các cách truyền tham số cho chương trình con.</item>
        </list>
      </section>
      <section id="id-209787814518">
        <name>Nội dung cốt lõi</name>
        <list type="bulleted" id="id19493408">
          <item>Cơ chế hoạt động của chương trình con.</item>
          <item>Các loại tham số của chương trình con.</item>
          <item>Các cách truyền tham số cho chương trình con.</item>
        </list>
      </section>
      <section id="id-304980722411">
        <name>Kiến thức cơ bản cần thiết</name>
        <para id="id19493441">Kiến thức và kĩ năng lập trình căn bản</para>
      </section>
    </section>
    <section id="id-562343405566">
      <name>ÐỊNH NGHĨA CHƯƠNG TRÌNH CON</name>
      <para id="id19493455">Chương trình con là một phép toán trừu tượng được định nghĩa bởi người lập trình. Chương trình con có các đặc tính như sau:</para>
      <list type="bulleted" id="id19493470">
        <item>Mỗi chương trình con có một điểm vào duy nhất.</item>
      </list>
      <para id="id19493480">Chương trình gọi tạm ngừng việc thực hiện trong quá trình thực hiện chương trình con.</para>
      <list type="bulleted" id="id19493488">
        <item>Ðiều khiển luôn được trả về chương trình gọi khi sự thực hiện chương trình con kết thúc.</item>
      </list>
      <para id="id19493499">Khi nói đến chương trình con, chúng ta quan tâm đến hai khía cạnh: sự định nghĩa chương trình con và lời gọi thực hiện chương trình con.</para>
      <para id="id19493509">Ðịnh nghĩa chương trình con là một đoạn chương trình nguồn được viết ra bởi người lập trình.</para>
      <section id="id-0298786459943">
        <name>Ðặc tả chương trình con </name>
        <para id="id19493522">Sự đặc tả chương trình con bao gồm:</para>
        <list type="bulleted" id="id19493528">
          <item>Tên của chương trình con</item>
          <item>Số lượng các tham số, thứ tự của chúng và kiểu dữ liệu của mỗi một tham số .</item>
          <item>Số lượng các kết quả, thứ tự của chúng và kiểu dữ liệu của mỗi một kết quả.</item>
          <item>Hoạt động được thực hiện bởi chương trình con.</item>
        </list>
        <para id="id19493564">Chương trình con biểu diễn một hàm toán học, là một ánh xạ từ tập hợp các tham số đến tập hợp các kết quả. Chương trình con trả về một kết quả duy nhất trong tên chương trình con thường được gọi là một hàm. Cú pháp điển hình đặc tả hàm được quy định trong ngôn ngữ lập trình Pascal: </para>
        <para id="id19493579">Function Ten_ham(Danh sách các tham số cùng với kiểu dữ liệu tương ứng): Kiểu kết quả trả về </para>
        <para id="id19493590">Ví dụ Function FN(x:real; y:integer) : real</para>
        <para id="id19493596">Ðặc tả này xác định hàm FN : REAL x INTEGER -&gt; REAL</para>
        <para id="id19493602">Nếu chương trình con trả về nhiều hơn một kết quả hoặc không có kết quả trả về trong tên chương trình con thường được gọi là thủ tục (procedure hoặc subroutine). Cú pháp điển hình đặc tả thủ tục được quy định trong ngôn ngữ lập trình Pascal:</para>
        <para id="id19493617">Procedure Ten_thu_tuc(Danh sách các tham sốcùng với kiểu dữ liệu tương ứng)</para>
        <para id="id19493627">Ví dụ Procedure SUB(X:real; Y:Integer; Var Z:Real; Var U:boolean);</para>
        <para id="id19493633">Trong sự đặc tả này, tham số có tên đứng sau VAR biểu thị một kết quả hoặc một tham số có thể bị thay đổi. Cú pháp của sự đặc tả này trong Ada là:</para>
        <para id="id19493645">Procedure SUB(X: IN Real; Y: IN Integer; Z: IN OUT Real; U: OUT Boolean)</para>
        <para id="id19493650">Thủ tục này khai báo một chương trình con với sự xác định:</para>
        <para id="id19493657">SUB : Real x Integer x Real -&gt; Real x Boolean</para>
        <para id="id19493668">Các từ IN, OUT và IN OUT phân biệt ba trường hợp sau đây: IN chỉ định một tham số không thể bị thay đổi bởi cương trình con, IN OUT chỉ định một tham số có thể bị thay đổi và OUT chỉ định một kết quả.</para>
        <para id="id19493682">Mặc dù chương trình con biểu diễn một hàm toán học nhưng nó cũng có các vấn đề tương tự như đối với các phép toán nguyên thuỷ:</para>
        <para id="id19493692">- Chương trình con có thể có các tham số ẩn trong dạng biến không địa phương mà nó tham chiếu.</para>
        <para id="id19493700">- Chương trình con có thể có kết quả ẩn (hiệu ứng lề) được trả về thông qua sự thay đổi các biến không địa phương hoặc thông qua việc thay đổi các tham số IN-OUT của nó.</para>
        <para id="id19493712">- Chương trình con có thể nhạy cảm với tiền sử (tự sửa đổi), vì vậy kết qủa của nó không chỉ phụ thuộc vào tham số được cho tại lần gọi đó mà còn phụ thuộc vào toàn bộ lịch sử các lần gọi trước đó. Nhạy cảm với tiền sử có thể do dữ liệu địa phương vẫn còn giữ lại giữa các lần gọi của chương trình con hoặc thông qua sự thay đổi mã riêng của nó (ít phổ biến hơn).</para>
      </section>
      <section id="id-502725890957">
        <name>Cài đặt chương trình con</name>
        <para id="id19493735">Các phép toán nguyên thuỷ được cài đặt bằng cách dùng cấu trúc dữ liệu và các phép toán được cung cấp bởi máy tính ảo bên dưới ngôn ngữ lập trình. Chương trình con biểu diễn một phép toán được xây dựng bởi người lập trình và do đó chương trình con được cài đặt bằng cách dùng cấu trúc dữ liệu và các phép toán được cung cấp bởi chính bản thân ngôn ngữ lập trình đó. Sự cài đặt được xác định bởi thân chương trình con, bao gồm cả việc khai báo dữ liệu cục bộ xác định cấu trúc dữ liệu được dùng cho chương trình con và các lệnh xác định hành động sẽ làm khi chương trình con thực hiện.</para>
        <para id="id19493762">Sự khai báo và các lệnh thường được bao gói, người sử dụng chương trình con không thể truy xuất được tới dữ liệu cục bộ và các lệnh bên trong chương trình con. Người sử dụng chỉ có thể gọi chương trình con với một tập hợp các tham số và nhận lại các kết quả đã được tính toán. Cú pháp của Pascal đối với chương trình con là điển hình:</para>
        <para id="id19493776">FUNCTION FN(x:REAL; y:INTEGER):REAL ; (Mô tả)</para>
        <para id="id19493785">VAR</para>
        <para id="id19493789">m : ARRAY[1..10] OF REAL; (Khai báo các đối</para>
        <para id="id19493803">n : INTEGER; tượng dữ liệu cục bộ)</para>
        <para id="id19493816">BEGIN</para>
        <para id="id19493820">. (Dãy các lệnh xác định</para>
        <para id="id19493836">. hành động của chương</para>
        <para id="id19493852">. trình con)</para>
        <para id="id19493864">END;</para>
        <para id="id19493868">Thông thường trong chương trình con có thể có các chương trình con khác biểu thị các phép toán được định nghĩa bởi người lập trình dùng cho chỉ chương trình con chứa chúng. Những chương trình con "cục bộ" này được bao gói, nghĩa là chúng không thể được gọi tới từ bên ngoài chương trình con chứa chúng.</para>
        <para id="id19493883">Kiểm tra kiểu cũng là một vấn đề quan trọng đối với chương trình con. Mỗi lần gọi chương trình con đòi hỏi các tham số có kiểu đúng như đã được xác định trong sự đặc tả chương trình con. Kiểu của kết quả được trả về của chương trình con cũng phải được biết đến. Vấn đề kiểm tra kiểu tương tự như đối với các phép toán nguyên thuỷ. Kiểm tra kiểu có thể được thực hiện một cách tĩnh trong quá trình dịch, nếu đã có sự khai báo kiểu cho các tham số và kết quả của mỗi một chương trình con. Mặt khác kiểm tra kiểu có thể là động trong quá trình thực hiện chương trình. Sự chuyển đổi kiểu ẩn các tham số để đổi chúng thành các kiểu đúng cũng có thể được cung cấp một cách tự động bởi sự cài đặt ngôn ngữ.</para>
      </section>
    </section>
    <section id="id-465994042275">
      <name>CƠ CHẾ GỌI CHƯƠNG TRÌNH CON</name>
      <section id="id-0252249951916">
        <name>Ðịnh nghĩa và kích hoạt chương trình con</name>
        <para id="id19493934">Người lập trình viết một định nghĩa chương trình con trong chương trình. Thông qua việc thực hiện chương trình, nếu chương trình con được gọi thì một kích hoạt chương trình con (subprogram activation) được tạo ra. Khi sự thực hiện chương trình con kết thúc thì kích hoạt bị phá huỷ. Nếu có một lần gọi khác thì một kích hoạt mới sẽ được tạo ra. Như vậy từ một định nghĩa chương trình con, có nhiều kích hoạt có thể được tạo trong quá trình thực hiện chương trình. Sự định nghĩa dùng làm khuôn mẫu (template) cho việc tạo kích hoạt trong quá trình thực hiện.</para>
        <para id="id19493963">Chú ý rằng sự định nghĩa là một sự diễn tả trong chương trình như nó đã được viết ra và do đó nó được biết đến trong quá trình dịch. Kích hoạt chương trình con chỉ có thể có trong quá trình thực hiện. Trong quá trình thực hiện, sự định nghĩa chỉ tồn tại trong dạng khuôn mẫu mà từ đó các kích hoạt có thể được tạo ra.</para>
      </section>
      <section id="id-66337238099">
        <name>Cài đặt định nghĩa và kích hoạt chương trình con</name>
        <para id="id19493988">Xét lại định nghĩa chương trình con trong Pascal:</para>
        <para id="id19493994">FUNCTION FN(x : REAL; y : INTEGER) : REAL;</para>
        <para id="id19493998">CONST</para>
        <para id="id19494003">max = 20;</para>
        <para id="id19494007">VAR</para>
        <para id="id19494011">m : ARRAY[1..max] OF REAL;</para>
        <para id="id19494017">n : INTEGER;</para>
        <para id="id19494023">BEGIN</para>
        <para id="id19494027">n := MAX;</para>
        <para id="id19494031">x := 2 * x + m[5];</para>
        <para id="id19494036">......</para>
        <para id="id19494043">END;</para>
        <para id="id19494048">Sự định nghĩa này xác định các thành phần cần thiết cho một kích hoạt chương trình con:</para>
        <para id="id19494056">1/ Bộ nhớ đối với các tham số, đối tượng dữ liệu x và y.</para>
        <para id="id19494063">2/ Bộ nhớ cho kết quả hàm, đối tượng dữ liệu của kiểu REAL;</para>
        <para id="id19494071">3/ Bộ nhớ cho biến cục bộ, mảng m và biến n.</para>
        <para id="id19494077">4/ Bộ nhớ cho các hằng trực kiện và các hằng, 20, 2 và 5.</para>
        <para id="id19494084">5/ Bộ nhớ cho mã có thể thực hiện phát sinh từ các lệnh trong thân chương trình con.</para>
        <para id="id19494092">Ðịnh nghĩa chương trình con cho phép các vùng nhớ này được tổ chức và các mã có thể thực hiện được xác định thông qua việc dịch. Kết quả của việc dịch là khuôn mẫu dùng để xây dựng mỗi một kích hoạt riêng tại thời gian chương trình con được gọi trong quá trình thực hiện.</para>
        <para id="id19494109">Ðể xây dựng một kích hoạt chương trình con từ khuôn mẫu của nó, cái khuôn mẫu ban đầu có thể phải được sao chép vào trong vùng mới của bộ nhớ. Tuy nhiên thay vì sao chép hoàn toàn, nó được tách ra thành hai phần:</para>
        <para id="id19494118">1/ Phần tĩnh, gọi là đoạn mã (code segment) bao gồm các mục 4 (các hằng) và 5 (các mã có thể thực hiện được) đã nói ở trên. Phần tĩnh không thay đổi trong quá trình thực hiện chương trình con và do thế một bản sao có thể được dùng cho tất cả các kích hoạt.</para>
        <para id="id19494133">2/ Phần động, gọi là mẩu tin kích hoạt (Activation record) bao gồm các mục 1 (Các tham số), 2 (Kết quả hàm) và 3 (dữ liệu cục bộ) và cộng thêm nhiều mục khác của dữ liệu ẩn như vùng nhớ tạm, điểm trở về, và sự tham khảo các biến không cục bộ. Phần động có cấu trúc giống nhau cho tất cả các kích hoạt nhưng nó chứa các giá trị dữ liệu khác nhau cho mỗi một kích họat. Do đó mỗi một kích hoạt cần thiết phải có một bản sao mẩu tin kích hoạt riêng của nó. Hình vẽ sau trình bày cấu trúc của một kích hoạt chương trình con của hàm FN nói trên</para>
        <table id="id19494137">
          <tgroup cols="3">
            <colspec colnum="1" colname="c1"/>
            <colspec colnum="2" colname="c2"/>
            <colspec colnum="3" colname="c3"/>
            <tbody>
              <row>
                <entry/>
                <entry>Mở đầu</entry>
                <entry/>
              </row>
              <row>
                <entry/>
                <entry>Mã lệnh có thể thực hiện</entry>
                <entry>Khối mã có thể thực hiện</entry>
              </row>
              <row>
                <entry/>
                <entry>Kết thúc</entry>
                <entry/>
              </row>
              <row>
                <entry>Đoạn mã của FN</entry>
                <entry>20</entry>
                <entry/>
              </row>
              <row>
                <entry/>
                <entry>2</entry>
                <entry>Các hằng</entry>
              </row>
              <row>
                <entry/>
                <entry>5</entry>
                <entry/>
              </row>
              <row>
                <entry/>
                <entry>1</entry>
                <entry/>
              </row>
              <row>
                <entry/>
                <entry/>
                <entry>Ðiểm trở về</entry>
              </row>
              <row>
                <entry/>
                <entry>FN</entry>
                <entry>Kết quả của hàm</entry>
              </row>
              <row>
                <entry/>
                <entry>x</entry>
                <entry>Các tham số</entry>
              </row>
              <row>
                <entry>Mẩu tin kích họat của FN</entry>
                <entry>y</entry>
                <entry/>
              </row>
              <row>
                <entry/>
                <entry>m</entry>
                <entry/>
              </row>
              <row>
                <entry/>
                <entry>:::</entry>
                <entry>Các biến cục bộ</entry>
              </row>
              <row>
                <entry/>
                <entry>n</entry>
                <entry/>
              </row>
            </tbody>
          </tgroup>
        </table>
        <para id="id19378782">Ðối với mỗi chương trình con, một đoạn mã tồn tại thông qua sự thực hiện chương trình. Các mẩu tin kích hoạt được tạo ra và huỷ bỏ một cách động thông qua thực hiện mỗi lần chương trình con được gọi và mỗi lần nó kết thúc bởi RETURN.</para>
        <para id="id19378797">
          <figure id="id19378801">
            <media type="image/png" src="graphics1.png">
              <param name="height" value="294"/>
              <param name="width" value="563"/>
            </media>
          </figure>
        </para>
        <para id="id19378829">Kích thước và cấu trúc của mẩu tin kích hoạt của chương trình con thông thường được xác định trong quá trình dịch, đó là trình biên dịch (compile) có thể xác định mẩu tin kích hoạt lớn như thế nào và vị trí của mỗi một phần tử trong đó. Ðể truy xuất đến các phần tử có thể sử dụng công thức tính địa chỉ cơ sở cộng độ dời như đã trình bày đối với mẩu tin bình thường.</para>
      </section>
    </section>
    <section id="id-730416784955">
      <name>CHƯƠNG TRÌNH CON CHUNG</name>
      <para id="id19378853">Sự đặc tả chương trình con thông thường liệt kê số lượng, thứ tự và kiểu dữ liệu của các tham số. Chương trình con chung (generic subprogram) là một chương trình con có một tên nhưng có nhiều định nghĩa khác nhau, được phân biệt bởi số lượng, thứ tự và kiểu dữ liệu của các tham số. Khái niệm về phép toán chung đã được đề cập trong chương II (phần mục đích của sự khai báo). Một khi phép toán hay chương trình con chung xuất hiện, vấn đề cơ bản đối với trình biên dịch là làm sao xác định được đúng ý nghĩa của nó trong một tập hợp nhiều ý nghĩa có thể có. Thông tin về đối số của phép toán hoặc tham số của chương trình con giúp chương trình dịch nhận biết ý nghĩa đích thực của chương trình con chung.</para>
    </section>
    <section id="id-860883376304">
      <name>TRUYỀN THAM SỐ CHO CHƯƠNG TRÌNH CON</name>
      <section id="id-27749088015">
        <name>Khái niệm truyền tham số</name>
        <para id="id19378905">Truyền tham số là phương pháp chuyển giao dữ liệu giữa các đơn vị chương trình nhằm đạt được các kết quả khác nhau khi gọi thực hiện chương trình con. Tham số có hai loại là tham số hình thức và tham số thực tế.</para>
        <para id="id19378919">Tham số hình thức là một loại đặc biệt của ÐTDL cục bộ trong chương trình con. Nó được xác định lúc định nghĩa chương trình con. Khi định nghĩa chương trình con, phải xác định một danh sách các tham số hình thức cùng với khai báo kiểu tương ứng.</para>
        <para id="id19378932">Tham số thực tế là một ÐTDL được chia sẻ cho chương trình con bằng cách truyền trong lời gọi thực hiện chương trình con.</para>
      </section>
      <section id="id-564321516616">
        <name>Sự tương ứng giữa tham số tham số thực tế và tham số hình thức</name>
        <para id="id19378952">Khi một chương trình con được gọi cùng với một danh sách các tham số thực tế thì đòi hỏi phải có một sự tương ứng giữa các tham số hình thức và tham số thực tế. Sự tương ứng này nhằm để xác định tham số thực tế nào được truyền cho tham số hình thức nào. Có hai phương pháp để xác định sự tương ứng này:</para>
        <para id="id19378967">Tương ứng vị trí: Sự tương ứng giữa các cặp tham số thực tế và tham số hình thức đặt cơ sở trên sự tương ứng vị trí của chúng trong danh sách các tham số thực tế lúc gọi và danh sách các tham số hình thức trong định nghĩa chương trình con.</para>
        <para id="id19378986">Hầu hết các ngôn ngữ đều dùng tương ứng vị trí và số lượng các tham số hình thức và tham số thực tế là bằng nhau do đó các cặp tương ứng là duy nhất. Tuy nhiên cũng có những ngôn ngữ cho phép lời gọi chương trình con không cần cung cấp đủ số lượng tham số thực tế.</para>
        <para id="id19379001">Tương ứng tên: Tham số hình thức bắt cặp với tham số thực tế được chỉ định trong lời gọi chương trình con. Ví dụ trong Ada có lời gọi chương trình con như sau: </para>
        <para id="id19379017">SUB(y =&gt; B, x =&gt; 27). </para>
        <para id="id19379022">Trong đó tham số thực tế B bắt cặp với tham số hình thức y và tham số thực tế 27 bắt cặp với tham số hình thức x.</para>
      </section>
      <section id="id-36809798447">
        <name>Các phương pháp truyền tham số tham số</name>
        <para id="id19379041">Nói chung một ngôn ngữ cung cấp nhiều phương pháp truyền tham số mà người lập trình có thể lựa chọn để xác định khai báo tham số hình thức lúc định nghĩa chương trình con và cung cấp các tham số thực tế lúc gọi thực hiện chương trình con. Các phương pháp truyền tham số chủ yếu bao gồm:</para>
        <section id="id-997077108628">
          <name>Truyền bằng giá trị (transmission by value)</name>
          <list type="bulleted" id="id19379069">
            <item>Tham số hình thức là tham số chỉ vào (IN-only parameters), tức là chỉ nhận giá trị vào cho chương trình con, không có nghĩa vụ trả kết quả về cho chương trình gọi. Tham số hình thức được xem như là một biến cục bộ của chương trình con và được cấp phát ô nhớ riêng. </item>
            <item>Tham số thực tế là một biểu thức (là một biến, một hằng, một hàm hoặc là một biểu thức thực sự).</item>
            <item>Phương pháp thực hiện: Tại thời điểm gọi, giá trị của tham số thực tế được sao chép vào trong ô nhớ của tham số hình thức. Trong quá trình thực hiện chương trình con, mọi thao tác trên tham số hình thức là sự thao tác trên ô nhớ riêng của nó, không ảnh hưởng đến tham số thực tế.</item>
            <item>Khi chương trình con kết thúc, sự thay đổi giá trị của tham số hình thức, không làm ảnh hưởng đến giá trị của tham số thực tế. </item>
          </list>
        </section>
        <section id="id-584619816097">
          <name>Truyền tham chiếu (transmission by reference)</name>
          <list type="bulleted" id="id19379172">
            <item>Tham số hình thức là tham số vào ra (IN-OUT parameters), tức là nó có nghĩa vụ nhận giá trị vào cho chương trình con và trả kết quả về cho chương trình gọi. Tham số hình thức là một con trỏ.</item>
            <item>Tham số thực tế phải là một biến, tức là một ĐTDL có ô nhớ.</item>
            <item>Phương pháp thực hiện: Tại thời điểm gọi, con trỏ của tham số thực tế được sao chép cho tham số hình thức. Trong quá trình thực hiện chương trình con, mọi thao tác trên tham số hình thức là sự thao tác trên ô nhớ của tham số thực tế. </item>
            <item>Khi chương trình con kết thúc, mọi thay đổi giá trị của tham số hình thức đều làm giá trị của tham số thực tế thay đổi theo.</item>
          </list>
        </section>
        <section id="id-410979197965">
          <name>Truyền bằng giá trị-kết quả (transmission by value-result)</name>
          <list type="bulleted" id="id19379265">
            <item>Tham số hình thức là tham số vào ra (IN-OUT parameters) nhưng là một biến cục bộ của chương trình con và được cấp phát ô nhớ riêng.</item>
            <item>Tham số thực tế phải là một biến, tức là một ĐTDL có ô nhớ.</item>
          </list>
          <list type="bulleted" id="id19379299">
            <item>Phương pháp thực hiện: Tại thời điểm gọi, giá trị của tham số thực tế được sao chép vào trong ô nhớ của tham số hình thức. Trong quá trình thực hiện chương trình con, mọi thao tác trên tham số hình thức là sự thao tác trên ô nhớ riêng của nó, không ảnh hưởng đến tham số thực tế.</item>
          </list>
          <list type="bulleted" id="id19379326">
            <item>Khi chương trình con kết thúc, giá trị cuối cùng của tham số hình thức được sao chép vào ô nhớ của tham số thực tế.</item>
          </list>
        </section>
        <section id="id-720143538833">
          <name>Truyền bằng kết quả (transmission by result)</name>
          <list type="bulleted" id="id19379349">
            <item>Tham số hình thức là tham số chỉ ra (OUT-only parameters), tức là chỉ trả kết quả về cho chương trình gọi, không có nghĩa vụ nhận giá trị vào cho chương trình con. Tham số hình thức được xem như là một biến cục bộ của chương trình con và được cấp phát ô nhớ riêng. </item>
            <item>Tham số thực tế phải là một biến, tức là một ĐTDL có ô nhớ.</item>
          </list>
          <list type="bulleted" id="id19379401">
            <item>Phương pháp thực hiện: Giá trị của tham số thực tế không được sử dụng trong chương trình con. Tham số hình thức có thể được gán trị như đối với một biến cục bộ. Trong quá trình thực hiện chương trình con, mọi thao tác trên tham số hình thức là sự thao tác trên ô nhớ riêng của nó, không ảnh hưởng đến tham số thực tế.</item>
          </list>
          <list type="bulleted" id="id19379429">
            <item>Khi chương trình con kết thúc, giá trị cuối cùng của tham số hình thức được sao chép vào ô nhớ của tham số thực tế.</item>
          </list>
          <para id="id19379443">Ví dụ viết bằng ngôn ngữ giả</para>
          <para id="id19379448">Var m:integer;</para>
          <para id="id19379453">Procedure P(a:integer);</para>
          <para id="id19379458">Begin</para>
          <para id="id19379462">a:= 20;</para>
          <para id="id19379466">writeln(m);</para>
          <para id="id19379471">end;</para>
          <para id="id19379475">begin</para>
          <para id="id19379480">m:=10;</para>
          <para id="id19379484">P(m);</para>
          <para id="id19379488">writeln(m);</para>
          <para id="id19379493">end.</para>
          <para id="id19379497">Kết quả thực hiện chương trình đối với các phương pháp truyền tham số</para>
          <table id="id19379505">
            <tgroup cols="4">
              <colspec colnum="1" colname="c1"/>
              <colspec colnum="2" colname="c2"/>
              <colspec colnum="3" colname="c3"/>
              <colspec colnum="4" colname="c4"/>
              <tbody>
                <row>
                  <entry>Truyền bằng giá trị</entry>
                  <entry>Truyền tham chiếu</entry>
                  <entry>Truyền bằng giá trị-kết quả</entry>
                  <entry>Truyền bằngkết quả</entry>
                </row>
                <row>
                  <entry>1010</entry>
                  <entry>2020</entry>
                  <entry>1020</entry>
                  <entry>1020</entry>
                </row>
              </tbody>
            </tgroup>
          </table>
        </section>
      </section>
    </section>
    <section id="id-128706988966">
      <name>CÂU HỎI ÔN TẬP</name>
      <list type="enumerated" id="id19379640">
        <item>Nêu tên các phương pháp tương ứng giữa tham số thực tế và tham số hình thức khi thực hiện việc truyền tham số cho chương trình con.</item>
        <item>Nêu tên các phương pháp truyền tham số cho chương trình con.</item>
        <item>Cho biết sự khác nhau và giống nhau giữa các phương pháp truyền tham số .</item>
      </list>
    </section>
  </content>
</document>
