<?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="id9405446">
  <name>lap trinh nang cao - chuong1</name>
  <metadata>
  <md:version>1.1</md:version>
  <md:created>2008/09/05 09:40:27.456 GMT-5</md:created>
  <md:revised>2008/09/05 22:16:43.131 GMT-5</md:revised>
  <md:authorlist>
      <md:author id="nlxuanthu">
      <md:firstname>Thu</md:firstname>
      <md:othername>Xuan</md:othername>
      <md:surname>Nguyen</md:surname>
      <md:email>nlxuanthu@yahoo.com</md:email>
    </md:author>
  </md:authorlist>

  <md:maintainerlist>
    <md:maintainer id="nlxuanthu">
      <md:firstname>Thu</md:firstname>
      <md:othername>Xuan</md:othername>
      <md:surname>Nguyen</md:surname>
      <md:email>nlxuanthu@yahoo.com</md:email>
    </md:maintainer>
  </md:maintainerlist>
  
  

  <md:abstract>chuong trinh con</md:abstract>
</metadata>
  <content>
    <para id="id10486132">CHƯƠNG TRÌNH CON- THỦ TỤC VÀ HÀM</para>
    <list type="enumerated" id="id11258249">
      <item>Khái niệm về chương trình con:</item>
    </list>
    <para id="id11272092">Chương trình con là một chương trình nằm bên trong một chương trình khác. Chương trình con có 2 loại: Thủ tục (Procedure) và hàm (Function):</para>
    <list type="bulleted" id="id11253474">
      <item>Thủ tục (PROCEDURE): Dùng để thực hiện một hay nhiều nhiệm vụ nào đó.</item>
      <item>Hàm (FUNCTION): Trả về một giá trị nào đó (có kiểu vô hướng, kiểu string hoặc kiểu con trỏ). Hàm có thể sử dụng trong các biểu thức.</item>
    </list>
    <para id="id9394715">Chương trình con được dùng rộng rãi khi xây dựng các chương trình lớn nhằm làm cho chương trình dễ theo dõi, dễ sửa chữa, có thể phân mảnh chương trình cho nhiều người làm. Một đặc điểm nổi bật của chương trình con là nó có tính đệ quy nhờ thế mà nhiều bài toán được giải quyết dễ dàng.</para>
    <para id="id11138685">CẤU TRÚC CHUNG CỦA MỘT CHƯƠNG TRÌNH CÓ SỬ DỤNG CHƯƠNG TRÌNH CON:</para>
    <para id="id10451186"> PROGRAM  Tên_chương_trình;</para>
    <para id="id11563785">USES CRT;</para>
    <para id="id7886257">CONST  ............;</para>
    <para id="id11439399">TYPE     ............;</para>
    <para id="id11045579">VAR       ............;</para>
    <para id="id11113879"> </para>
    <para id="id4763969">PROCEDURE  THUTUC[(Các tham số)];</para>
    <para id="id9609468">[Khai báo Const, Type, Var]</para>
    <para id="id11250301">BEGIN</para>
    <para id="id11510764">     ..............</para>
    <para id="id11510768">END;</para>
    <para id="id10967424"> FUNCTION  HAM[(Các tham số)]:&lt;Kiểu dữ liệu&gt;;</para>
    <para id="id9745093">[Khai báo Const, Type, Var]</para>
    <para id="id11007687">BEGIN</para>
    <para id="id11271143">     ..............</para>
    <para id="id10432770">     HAM:=&lt;Giá trị&gt;;</para>
    <para id="id10432775">END;</para>
    <para id="id10508030"> </para>
    <para id="id9067699">BEGIN {Chương trình chính}</para>
    <para id="id10645069">     ...................</para>
    <para id="id5429359">     THUTUC[(...)];</para>
    <para id="id11034037">     ...................</para>
    <para id="id11034041">     A:= HAM[(...)];</para>
    <para id="id11045715">     ...................</para>
    <para id="id11450566">END.</para>
    <para id="id11539650"> </para>
    <para id="id5936866">Chú ý: Trong quá trình xây dựng CHƯƠNG TRÌNH CON, khi nào thì nên dùng thủ tục/hàm?</para>
    <table id="id10432294">
      <tgroup cols="2">
        <colspec colnum="1" colname="c1"/>
        <colspec colnum="2" colname="c2"/>
        <tbody>
          <row>
            <entry>Dùng hàm</entry>
            <entry>Dùng thủ tục</entry>
          </row>
          <row>
            <entry>- Kết quả của bài toán trả về 1 giá trị duy nhất (kiểu vô hướng, kiểu string hoặc kiểu con trỏ).- Lời gọi CHƯƠNG TRÌNH CON cần nằm trong các biểu thức tính toán.</entry>
            <entry>- Kết quả của bài toán không trả về giá trị nào hoặc trả về nhiều giá trị hoặc trả về  kiểu dữ liệu có cấu trúc (Array, Record, File).- Lời gọi CHƯƠNG TRÌNH CON không nằm trong các biểu thức tính toán.</entry>
          </row>
        </tbody>
      </tgroup>
    </table>
    <para id="id11104230"> ( ví dụ n!, tìm điểm đối xứng)</para>
    <para id="id10430513">Ví dụ 1.1: Viết CHƯƠNG TRÌNH CON để tính n! = 1.2...n.</para>
    <para id="id10952345">Function GiaiThua(n:integer):integer;</para>
    <para id="id11439758">Var P, i:integer;</para>
    <para id="id10974446">Begin</para>
    <para id="id11252855">    P:=1;</para>
    <para id="id9069551">    For i:=1 To n Do P:=P*i;</para>
    <para id="id9069555">    GiaiThua:=P;</para>
    <para id="id10780752">End;</para>
    <para id="id9705354">Ví dụ 1.2: Viết chương trình con để tìm điểm đối xứng của điểm (x,y) qua gốc tọa độ.</para>
    <para id="id11274082">Procedure DoiXung(x,y:Integer; Var xx,yy:Integer);</para>
    <para id="id10950585">Begin</para>
    <para id="id10950589">    xx:=-x;</para>
    <para id="id10420381">    yy:=-y;</para>
    <para id="id10845928">End;</para>
    <para id="id10776405">CHÚ Ý: Trong 2 ví dụ trên:</para>
    <para id="id8031734">        n, x, y được gọi là tham trị (không có từ khóa var đứng trước) vì sau khi ra khỏi chương trình con giá trị của nó không bị thay đổi.</para>
    <para id="id11426076">        xx, yy được gọi là tham biến (có từ khóa var đứng trước) vì sau khi ra khỏi chương trình con giá trị của nó bị thay đổi.</para>
    <list type="enumerated" id="id10483567">
      <item>Tham số trong chương trình con:</item>
    </list>
    <para id="id10976864">Các chương trình con có thể không cần tham số mà chỉ có các biến riêng (biến cục bộ). Trong trường hợp cần nhận các giá trị mà chương trình mẹ truyền cho thì chương trình con cần phải có các tham số. </para>
    <para id="id11272160">Tham số thực là những giá trị lưu trữ trong các biến toàn cục của chương trình mẹ, được truyền cho các thủ tục hoặc hàm thông qua lời gọi tên của chúng.</para>
    <para id="id10495220">Tham số được khai báo ngay sau tên chương trình con được gọi là tham số hình thức. Tham số hình thức gồm:</para>
    <list type="bulleted" id="id11064798">
      <item>Tham biến:</item>
    </list>
    <para id="id6623742">Tham biến là những giá trị mà chương trình con nhận từ chương trình mẹ, các giá trị này có thể biến đổi trong chương trình con và khi chương trình con kết thúc các giá trị này được trả về cho tham số thực.</para>
    <para id="id11111040">Cách khai báo tham biến:</para>
    <para id="id10946400">Tên chương trình con (Var tên tham biến: kiểu dữ liệu);</para>
    <list type="bulleted" id="id11423889">
      <item>Tham trị:</item>
    </list>
    <para id="id9574993">Tham trị là những tham số truyền vào cho chương trình con xử lý nhưng khi quay về chương trình mẹ vẫn phải giữ nguyên giá trị ban đầu.</para>
    <para id="id9574997">Tên chương trình con (tên tham trị: kiểu dữ liệu);</para>
    <list type="enumerated" id="id11540270">
      <item>Truyền tham số cho chương trình con:</item>
    </list>
    <para id="id11409603">Khi tham số hình thức trong chương trình con là tham biến thì tham số thực trong chương trình mẹ phải là biến chứ không thể là hằng. Trong mọi trường hợp cả hai tham số thực và tham số hình thức đều phải cùng kiểu dữ liệu…(các tham biến khi ra khỏi chương trình con giá trị thay đổi).</para>
    <para id="id11109625">Khi tham số hình thức là tham trị thì tham số thực phải là một giá trị.</para>
    <list type="enumerated" id="id10967639">
      <item>Biến toàn cục và biến địa phương:</item>
    </list>
    <list type="bulleted" id="id10420875">
      <item>Biến toàn cục: là các biến được khai báo trong chương trình chính. Các biến này có tác dụng ở mọi nơi trong toàn bộ chương trình.</item>
      <item>Biến địa phương: là các biến được khai báo trong các chương trình con. Các biến này chỉ có tác dụng trong phạm vi chương trình con đó mà thôi.</item>
    </list>
    <para id="id11408212">Chú ý: Trong một chương trình con, nếu biến toàn cục trùng tên với biến địa phương thì biến địa phương được ưu tiên hơn.</para>
    <para id="id10555484"> </para>
    <para id="id10555488">Ví dụ 1.3:</para>
    <para id="id11046766">Program  KhaoSatBien;</para>
    <para id="id11235126">Var a,b: Integer;   {biến toàn cục}</para>
    <para id="id8462244"> </para>
    <para id="id8462248">Procedure  ThuBien;</para>
    <para id="id10951215">Var  a: Integer; {biến địa phương}</para>
    <para id="id11044546">Begin</para>
    <para id="id11136041">    a:=10;</para>
    <para id="id11006480">    Writeln(‘A=’,a,’B=’,b);</para>
    <para id="id10848978">End;</para>
    <para id="id10848982">        </para>
    <para id="id8662373">Begin</para>
    <para id="id11105378">    a:=50;</para>
    <para id="id11456930">    b:=200;</para>
    <para id="id11271732">    ThuBien;                         {A=10  B=200}</para>
    <para id="id10945969">    Writeln(‘A=’,a,’B=’,b);      {A=50  B=200}</para>
    <para id="id4330652">End. </para>
    <list type="enumerated" id="id4330656">
      <item>Tính đệ quy của chương trình con:</item>
    </list>
    <para id="id11553700">Thông thường lời gọi một chương trình con chỉ được thực hiện khi chương trình con đó đã được thiết kế hoàn chỉnh. Tuy nhiên, Pascal còn cho phép một chương trình con ngay khi trong quá trình xây dựng lại có thể gọi tới chính nó, tính chất này được gọi là “Đệ quy của chương trình con”. </para>
    <list type="enumerated" id="id10352535">
      <item>Lời gọi chương trình con:</item>
    </list>
    <para id="id8264409">Một chương trình mẹ có nhiều chương trình con trực thuộc, bên trong mỗi chương trình con lại có thể có các chương trình con riêng. Khi thiết kế, mỗi chương trình con phải là một khối riêng biệt hoặc có thể có các lệnh nhảy Goto từ chương trình con này tới chương trình con khác.</para>
    <list type="bulleted" id="id9072256">
      <item>Gọi chương trình con từ trong chương trình mẹ:</item>
    </list>
    <para id="id10421420">Lời gọi chương trình con có thể đặt bất kỳ chỗ nào trong chương trình mẹ. Nếu chương trình con là một thủ tục thì lời gọi chương trình con có thể tạo nên một câu lệnh, ví dụ:</para>
    <para id="id11590471">Readln;</para>
    <para id="id10970367">Nếu chương trình con là hàm thì tên hàm không thể tạo nên một câu lệnh, vì vậy tên hàm phải nằm trong một biểu thức hay trong một thủ tục nào đó. Ví dụ, ta không thể viết:</para>
    <para id="id10843121">Sqrt(9);</para>
    <para id="id4941729">gọi hàm như sau là hợp lệ: a:=sqrt(9)+5;</para>
    <list type="bulleted" id="id9569870">
      <item>Gọi chương trình con từ chương trình con khác:</item>
    </list>
    <para id="id11110691">Các chương trình con cùng cấp có thể gọi tới nhau và truyền tham số cho nhau. Nguyên tắc gọi là: những chương trình con xây dựng sau có thể gọi tới các chương trình con đã xây dựng trước nó, đồng thời các chương trình con cấp dưới cũng có thể gọi tới các chương trình con cấp trên nếu chúng cùng một gốc. Các chương trình con xây dựng trước muốn gọi tới các chương trình con xây dựng sau thì phải có chỉ báo forward.</para>
    <para id="id9357928">Xét một số ví dụ sau:</para>
    <para id="id9357933">Ví dụ 1.4 </para>
    <para id="id3647173">Program Goi_CTC;</para>
    <para id="id10070277">Type dayso=array[1..60] of byte; S1:=string[30];</para>
    <para id="id11555112">Var</para>
    <para id="id11195155">a:s1; b:dayso; i,j,n:byte;</para>
    <para id="id11520969">Procedure nhapso(m:byte; var c:dayso);</para>
    <para id="id10421551">Begin</para>
    <para id="id11109635"> For i:=1 to m do</para>
    <para id="id11508526"> begin</para>
    <para id="id10245703">  Write(‘c[‘,i.’]=’); readln(c[i]);</para>
    <para id="id10696778"> End;</para>
    <para id="id9265031">End;</para>
    <para id="id11236058">Function tinhtong(m:byte; var d:dayso):real;</para>
    <para id="id10696392">Var tong:real;</para>
    <para id="id11150365">Begin </para>
    <para id="id11007710">tong:=0;</para>
    <para id="id11007715">For i:=1 to m do tong:=tong+d[i];</para>
    <para id="id11140482">Tinhtong:=tong;</para>
    <para id="id11423515"> End;</para>
    <para id="id10318009"> Procedure Inkq(k:byte; e: dayso);</para>
    <para id="id11424497"> Begin </para>
    <para id="id11040777">  Write(‘tong cac ptu =’,tinhtong(k,e):8:0); {chương trình con gọi một chương trình con cùng cấp}</para>
    <para id="id10937154">  Readln;</para>
    <para id="id6703408"> End;</para>
    <para id="id10859289"> BEGIN</para>
    <para id="id11028829">  Write(‘nhap so ptu n’); readln(n);</para>
    <para id="id9120368">  Nhapso(n,b);</para>
    <para id="id9965676">  Inkq(n,b);</para>
    <para id="id7416240"> End.</para>
    <para id="id7080708">Nếu hàm tinhtong xây dựng sau thủ tục Inkq, thì phải có chỉ báo forward.</para>
    <para id="id11424450">Thêm dòng: Function tinhtong(m:byte; var d:dayso):real; forward; trước khi xây dựng các chương trình con.</para>
    <para id="id11461977">Ví dụ 1.5 </para>
    <para id="id9907356">Program Goi_CTC;</para>
    <para id="id7181392">Type dayso=array[1..60] of byte; S1:=string[30];</para>
    <para id="id9610276">Var</para>
    <para id="id10485280">a:s1; b:dayso; i,j,n:byte;</para>
    <para id="id10940117">Procedure nhapso(m:byte; var c:dayso);</para>
    <para id="id10484784">Begin</para>
    <para id="id4331305"> …</para>
    <para id="id9291008">End;</para>
    <para id="id11006552">Function tinhtong(m:byte; var d:dayso):real;</para>
    <para id="id11171872">Var tong:real;</para>
    <para id="id10431312">Begin </para>
    <para id="id11568056">…</para>
    <para id="id11568060"> End;</para>
    <para id="id10442593"> Procedure xuly(j:byte;ds:dayso);</para>
    <para id="id10422178">  Procedure Inkq(k:byte;e:dayso);</para>
    <para id="id4850786">  Var i:byte;</para>
    <para id="id10975088">  Begin</para>
    <para id="id10698528">   Writeln(‘tong cac phan tu mang=’,tinhtong(k,e):8:0;</para>
    <para id="id10299580">   Writeln (‘day so sap xep giam dan’);</para>
    <para id="id9549882">   For i:=1 to k do write(e[i],’ ‘);</para>
    <para id="id11006933">   Readln;</para>
    <para id="id8997659">  End; {ket thuc thu tuc Inkq}</para>
    <para id="id10942177"> Procedure sapxep(m:byte;ds:dayso);</para>
    <para id="id9029725"> Var p,q:byte; tg:byte;</para>
    <para id="id11006813"> Begin</para>
    <para id="id11085556">  For p:=1 to m-1 do</para>
    <para id="id11273202">   For q:=p+1 to m do</para>
    <para id="id11203935">    If(d[p]&lt;d[q] then</para>
    <para id="id10032437">    Begin</para>
    <para id="id9068026">     Tg:=d[p];</para>
    <para id="id11069695">     d[p]:=d[q];</para>
    <para id="id9615109">     d[q]:=tg;</para>
    <para id="id11099858">    end;</para>
    <para id="id11105165">    inkq(m,d); {goi den chuong trinh con cùng cấp}</para>
    <para id="id10306228"> end; {ket thuc thu tuc sap xep}</para>
    <para id="id11110962"> Begin {than thu tuc Xuly}</para>
    <para id="id11504528">  Write(‘thu tuc xu ly dung de sap xep va in ket qua}</para>
    <para id="id11110703">  Sapxep(j,ds);</para>
    <para id="id11006890"> End;</para>
    <para id="id8452130">BEGIN</para>
    <para id="id7261622"> Write(‘nhap so phan tu’); readln(n);</para>
    <para id="id7292232"> Nhapso(n,b);</para>
    <para id="id10849906"> Xuly(n,b);</para>
    <para id="id10956130">END.</para>
    <para id="id8758229">Bài tập:</para>
    <para id="id10844317">Tính 
<m:math><m:semantics><m:mrow><m:mstyle fontsize="12pt"><m:mrow><m:mrow><m:msubsup><m:mi>C</m:mi><m:mstyle fontsize="8pt"><m:mrow><m:mi>n</m:mi></m:mrow></m:mstyle><m:mstyle fontsize="8pt"><m:mrow><m:mi>k</m:mi></m:mrow></m:mstyle></m:msubsup><m:mo stretchy="false">=</m:mo><m:mfrac><m:mrow><m:mi>n</m:mi><m:mi>!</m:mi></m:mrow><m:mrow><m:mi>k</m:mi><m:mi>!</m:mi><m:mo stretchy="false">(</m:mo><m:mrow><m:mi>n</m:mi><m:mo stretchy="false">−</m:mo><m:mi>k</m:mi></m:mrow><m:mo stretchy="false">)</m:mo><m:mi>!</m:mi></m:mrow></m:mfrac></m:mrow></m:mrow></m:mstyle><m:mrow/></m:mrow><m:annotation encoding="StarMath 5.0"> size 12{C rSub { size 8{n} }  rSup { size 8{k} } = {  {n!}  over  {k! \( n - k \) !} } } {}</m:annotation></m:semantics></m:math></para>
    <para id="id10642944"> (có sử dụng chương trình con) </para>
  </content>
</document>
