查看全部128種考試
1
2
3
4
5
6
7
8
9
10
admin  
【字體: C教程連載--第五章 函數(shù)
C教程連載--第五章 函數(shù)
djks.exam8.com 來(lái)源:考試吧(Exam8.com) 更新:2004-8-16 22:29:00 計(jì)算機(jī)等級(jí)考試 考試論壇

第五章   函數(shù)

    C程序是由一組或是變量或是函數(shù)的外部對(duì)象組成的。 函數(shù)是一個(gè)自我包含的
完成一定相關(guān)功能的執(zhí)行代碼段。我們可以把函數(shù)看成一個(gè)"黑盒子", 你只要將數(shù)
據(jù)送進(jìn)去就能得到結(jié)果, 而函數(shù)內(nèi)部究竟是如何工作的的, 外部程序是不知道的。
外部程序所知道的僅限于輸入給函數(shù)什么以及函數(shù)輸出什么。函數(shù)提供了編制程序
的手段, 使之容易讀、寫(xiě)、理解、排除錯(cuò)誤、修改和維護(hù)。
    C程序中函數(shù)的數(shù)目實(shí)際上是不限的, 如果說(shuō)有什么限制的話(huà), 那就是, 一個(gè)C
程序中必須至少有一個(gè)函數(shù), 而且其中必須有一個(gè)并且僅有一個(gè)以main為名, 這個(gè)
函數(shù)稱(chēng)為主函數(shù), 整個(gè)程序從這個(gè)主函數(shù)開(kāi)始執(zhí)行。
    C 語(yǔ)言程序鼓勵(lì)和提倡人們把一個(gè)大問(wèn)題劃分成一個(gè)個(gè)子問(wèn)題, 對(duì)應(yīng)于解決一
個(gè)子問(wèn)題編制一個(gè)函數(shù), 因此, C 語(yǔ)言程序一般是由大量的小函數(shù)而不是由少量大
函數(shù)構(gòu)成的, 即所謂"小函數(shù)構(gòu)成大程序"。這樣的好處是讓各部分相互充分獨(dú)立,
并且任務(wù)單一。因而這些充分獨(dú)立的小模塊也可以作為一種固定規(guī)格的小"構(gòu)件",
用來(lái)構(gòu)成新的大程序。
    C語(yǔ)言的一個(gè)主要特點(diǎn)是可以建立庫(kù)函數(shù)。Turbo C2.0提供的運(yùn)行程序庫(kù)有400
多個(gè)函數(shù), 每個(gè)函數(shù)都完成一定的功能, 可由用戶(hù)隨意調(diào)用。這些函數(shù)總的分為輸
入輸出函數(shù)、數(shù)學(xué)函數(shù)、字符串和內(nèi)存函數(shù)、與BIOS和DOS有關(guān)的函數(shù)、 字符屏幕
和圖形功能函數(shù)、過(guò)程控制函數(shù)、目錄函數(shù)等。對(duì)這些庫(kù)函數(shù)應(yīng)熟悉其功能, 只有
這樣才可省去很多不必要的工作。
    本教程后半部分專(zhuān)門(mén)介紹Turbo C2.0的庫(kù)函數(shù), 并對(duì)每個(gè)函數(shù)都給出例程, 讀
者可以將自已需要的部分以塊的方式定義, 然后將此塊寫(xiě)入文件, 這樣就可以在進(jìn)
入Turbo C2.0集成開(kāi)發(fā)環(huán)境后, 直接調(diào)用此程序, 連接, 運(yùn)行, 觀察結(jié)果, 以加深
對(duì)該函數(shù)的理解。
    用戶(hù)編制Turbo C語(yǔ)言源程序, 就是利用Turbo C的庫(kù)函數(shù)。可以把所有使用的
庫(kù)函數(shù)放在一個(gè)龐大的主函數(shù)里, 也可以按不同功能設(shè)計(jì)成一個(gè)個(gè)用戶(hù)函數(shù)而被其
它函數(shù)調(diào)用。Turbo C2.0建議用戶(hù)使用后者, 當(dāng)用戶(hù)編制了一些較常用的函數(shù)時(shí),
只要將其存在函數(shù)庫(kù)里, 在以后的編程中可被方便的調(diào)用而不需要再去編譯它們。
連接時(shí)將會(huì)自動(dòng)從相應(yīng)的庫(kù)中裝配成所需程序。

    1. 函數(shù)的說(shuō)明與定義
    Turbo C2.0中所有函數(shù)與變量一樣在使用之前必須說(shuō)明。所謂說(shuō)明是指說(shuō)明函
數(shù)是什么類(lèi)型的函數(shù), 一般庫(kù)函數(shù)的說(shuō)明都包含在相應(yīng)的頭文件<*.h>中,  例如標(biāo)
準(zhǔn)輸入輸出函數(shù)包含在stdio.h中, 非標(biāo)準(zhǔn)輸入輸出函數(shù)包含在io.h中,  以后在使
用庫(kù)函數(shù)時(shí)必須先知道該函數(shù)包含在什么樣的頭文件中, 在程序的開(kāi)頭用#include
<*.h>或#include"*.h"說(shuō)明。只有這樣程序在編譯, 連接時(shí)Turbo C 才知道它是提
供的庫(kù)函數(shù), 否則, 將認(rèn)為是用戶(hù)自己編寫(xiě)的函數(shù)而不能裝配。

    1.1 函數(shù)說(shuō)明

    1. 經(jīng)典方式
         其形式為:  函數(shù)類(lèi)型   函數(shù)名();
    2. ANSI 規(guī)定方式
         其形式為:  函數(shù)類(lèi)型  函數(shù)名(數(shù)據(jù)類(lèi)型  形式參數(shù),  數(shù)據(jù)類(lèi)型  形式
                    參數(shù), ......);
    其中: 函數(shù)類(lèi)型是該函數(shù)返回值的數(shù)據(jù)類(lèi)型, 可以是以前介紹的整型(int),
長(zhǎng)整型(long), 字符型(char), 單浮點(diǎn)型(float), 雙浮點(diǎn)型(double)以及無(wú)值型
(void), 也可以是指針, 包括結(jié)構(gòu)指針。無(wú)值型表示函數(shù)沒(méi)有返回值。
    函數(shù)名為T(mén)urbo C2.0的標(biāo)識(shí)符, 小括號(hào)中的內(nèi)容為該函數(shù)的形式參數(shù)說(shuō)明?
以只有數(shù)據(jù)類(lèi)型而沒(méi)有形式參數(shù), 也可以?xún)烧叨加小?duì)于經(jīng)典的函數(shù)說(shuō)明沒(méi)有參數(shù)
信息。如:
     
    int putlll(int x,int y,int z,int color,char *p)/*說(shuō)明一個(gè)整型函數(shù)*/
     char *name(void);               /*說(shuō)明一個(gè)字符串指什函數(shù)*/
     void student(int n, char *str); /*說(shuō)明一個(gè)不返回值的函數(shù)*/
     float calculate();              /*說(shuō)明一個(gè)浮點(diǎn)型函數(shù)*/
    注意: 如果一個(gè)函數(shù)沒(méi)有說(shuō)明就被調(diào)用, 編譯程序并不認(rèn)為出錯(cuò), 而將此函數(shù)
默認(rèn)為整型(int)函數(shù)。因此當(dāng)一個(gè)函數(shù)返回其它類(lèi)型, 又沒(méi)有事先說(shuō)明,  編譯時(shí)
將會(huì)出錯(cuò)。

    1.2 函數(shù)定義

    函數(shù)定義就是確定該函數(shù)完成什么功能以及怎么運(yùn)行, 相當(dāng)于其它語(yǔ)言的一個(gè)
子程序。Turbo C2.0對(duì)函數(shù)的定義采用ANSI規(guī)定的方式。即:
       函數(shù)類(lèi)型  函數(shù)名(數(shù)據(jù)類(lèi)型形式參數(shù); 數(shù)據(jù)類(lèi)型 形式參數(shù)...)
      {
          函數(shù)體;
       }
    其中函數(shù)類(lèi)型和形式參數(shù)的數(shù)據(jù)類(lèi)型為T(mén)urbo C2.0的基本數(shù)據(jù)類(lèi)型。函數(shù)體為
Turbo C2.0提供的庫(kù)函數(shù)和語(yǔ)句以及其它用戶(hù)自定義函數(shù)調(diào)用語(yǔ)句的組合, 并包括
在一對(duì)花括號(hào)"{"和"}"中。
    需要指出的是一個(gè)程序必須有一個(gè)主函數(shù), 其它用戶(hù)定義的子函數(shù)可以是任意
多個(gè), 這些函數(shù)的位置也沒(méi)有什么限制, 可以在main()函數(shù)前,  也可以在其后。
Turbo C2.0將所有函數(shù)都被認(rèn)為是全局性的。而且是外部的, 即可以被另一個(gè)文件
中的任何一個(gè)函數(shù)調(diào)用。

    2 函數(shù)的調(diào)用

    2.1  函數(shù)的簡(jiǎn)單調(diào)用
    Turbo C2.0調(diào)用函數(shù)時(shí)直接使用函數(shù)名和實(shí)參的方法, 也就是將要賦給被調(diào)用
函數(shù)的參量, 按該函數(shù)說(shuō)明的參數(shù)形式傳遞過(guò)去, 然后進(jìn)入子函數(shù)運(yùn)行, 運(yùn)行結(jié)束
后再按子函數(shù)規(guī)定的數(shù)據(jù)類(lèi)型返回一個(gè)值給調(diào)用函數(shù)。使用Turbo C2.0的庫(kù)函數(shù)就
是函數(shù)簡(jiǎn)單調(diào)用的方法。舉例說(shuō)明如下:
    例1:
     #include
     int maxmum(int x, int y, int z);   /*說(shuō)明一個(gè)用戶(hù)自定義函數(shù)*/
     int main()
     {
          int i, j, k;
          printf("i, j, k=?\n");
          scanf("%4d%4d%4d", &i, &j, &k);
          maxmum(i, j, k);
          getch();
          return 0;
     }

     maxmum(int x, int y, int z)
     {
          int max;
          max=x>y?x:y;
          max=max>z?max:z;
          printf("The maxmum value of the 3 data is %d\n", max);
     }

    2.2 函數(shù)參數(shù)傳遞

    一、調(diào)用函數(shù)向被調(diào)用函數(shù)以形式參數(shù)傳遞
    用戶(hù)編寫(xiě)的函數(shù)一般在對(duì)其說(shuō)明和定義時(shí)就規(guī)定了形式參數(shù)類(lèi)型, 因此調(diào)用這
些函數(shù)時(shí)參量必須與子函數(shù)中形式參數(shù)的數(shù)據(jù)類(lèi)型、順序和數(shù)量完全相同, 否則在
調(diào)用中將會(huì)出錯(cuò), 得到意想不到的結(jié)果。
    注意:
    當(dāng)數(shù)組作為形式參數(shù)向被調(diào)用函數(shù)傳遞時(shí), 只傳遞數(shù)組的地址, 而不是將整個(gè)
數(shù)組元素都復(fù)制到函數(shù)中去, 即用數(shù)組名作為實(shí)參調(diào)用子函數(shù), 調(diào)用時(shí)指向該數(shù)組
第一個(gè)元素的指針就被傳遞給子函數(shù)。因?yàn)樵赥urbo C2.0中, 沒(méi)有下標(biāo)的數(shù)組名就
是一個(gè)指向該數(shù)組第一個(gè)元素的指針。當(dāng)然數(shù)組變量的類(lèi)型在兩個(gè)函數(shù)中必須相同。
    用下述方法傳遞數(shù)組形參。
    例2:
     #include
     void disp(int *n);
     int main()
     {
          int m[10], i;
          for(i=0; i<10; i++)
            m[i]=i;
          disp(m);       /*按指針?lè)绞絺鬟f數(shù)組*/
          getch();
          return 0;
     }
     void disp(int *n)
     {
          int j;
          for(j=0; j<10; j++)
            printf("%3d", *(n++));
          printf("\n");
     }
    另外, 當(dāng)傳遞數(shù)組的某個(gè)元素時(shí), 數(shù)組元素作為實(shí)參, 此時(shí)按使用其它簡(jiǎn)單變
量的方法使用數(shù)組元素。例2按傳遞數(shù)組元素的方法傳遞時(shí)變?yōu)?
     #include
     void disp(int n);
     int main()
     {
          int m[10], i;
          for(i=0; i<10; i++){
            m[i]=i;
            disp(m[i]);  /*逐個(gè)傳遞數(shù)組元素*/
          }
          getch();
          return 0;
     }
     void disp(int n)
     {
          printf("%3d\t");
     }
這時(shí)一次只傳遞了數(shù)組的一個(gè)元素。

    二、被調(diào)用函數(shù)向調(diào)用函數(shù)返回值

    一般使用return語(yǔ)句由被調(diào)用函數(shù)向調(diào)用函數(shù)返回值, 該語(yǔ)句有下列用途:
    1. 它能立即從所在的函數(shù)中退出, 返回到調(diào)用它的程序中去。
    2. 返回一個(gè)值給調(diào)用它的函數(shù)。
    有兩種方法可以終止子函數(shù)運(yùn)行并返回到調(diào)用它的函數(shù)中: 一是執(zhí)行到函數(shù)的
最后一條語(yǔ)句后返回; 一是執(zhí)行到語(yǔ)句return時(shí)返回。前者當(dāng)子函數(shù)執(zhí)行完后僅返
回給調(diào)用函數(shù)一個(gè)0。若要返回一個(gè)值, 就必須用return語(yǔ)句。只需在return 語(yǔ)句
中指定返回的值即可。例1返回最大值時(shí)變?yōu)?
     例3:
     #include
     int maxmum(int x, int y, int z);   /*說(shuō)明一個(gè)用戶(hù)自定義函數(shù)*/
     int main()
     {
          int i, j, k, max;
          printf("i, j, k=?\n");
          scanf("%4d%4d%4d", &i, &j, &k);
          max=maxmum(i, j, k);     /*調(diào)用子函數(shù), 并將返回值賦給max*/
          printf("The maxmum value is %d\n", max);
          getch();
          return 0;
     }

     maxmum(int x, int y, int z)
     {
          int max;
          max=x>y?x:y;        /*求最大值*/
          max=max>z?max:z;
          return(max);        /*返回最大值*/
     }
    return語(yǔ)句可以向調(diào)用函數(shù)返回值, 但這種方法只能返回一個(gè)參數(shù), 在許多情
況下要返回多個(gè)參數(shù), 這是用return語(yǔ)句就不能滿(mǎn)足要求。Turob C2.0提供了另一
種參數(shù)傳遞的方法, 就是調(diào)用函數(shù)向被調(diào)用函數(shù)傳遞的形式參數(shù)不是傳遞變量本身,
而是傳遞變量的地址, 當(dāng)子函數(shù)中向相應(yīng)的地址寫(xiě)入不同的數(shù)值之后, 也就改變了
調(diào)用函數(shù)中相應(yīng)變量的值, 從而達(dá)到了返回多個(gè)變量的目的。
     例4:
     #include
     void subfun(int *m, int *n);  /*說(shuō)明子函數(shù)*/
     int main()
     {
          int i, j;
          printf("i, j=?\n");
          scanf("%d, %d", &i, &j); /*從鍵盤(pán)輸入2個(gè)整數(shù)*/
          printf("In main before calling\n"/*輸出此2數(shù)及其乘積*/
                 "i=%-4d j=%-4d i*j=%-4d\n", i, j, i*j);
          subfun(&i, &j);          /*以傳送地址的方式調(diào)用子函數(shù)*/
          printf("In main after calling\n"/*調(diào)用子函數(shù)后輸出變量值*/
                 "i=%-4d j=%-4d i*j=%-4d\n", i, j, i*j);
          getch();
          return 0;
     }
     void subfun(int *m, int *n)
     {
          *m=*m+2;
          *j=*i-*j;
          printf("In subfun after calling\n" /*子函數(shù)中輸出變量值*/
                 "i=%-4d j=%-4d i*j=%-4d\n", *i, *j, *i**j);
      }

    上例中, *i**j表示指針i和j所指的兩個(gè)整型數(shù)*i和*j之乘積。
    另外, return語(yǔ)句也可以返回一個(gè)指針, 舉例如下。
    下例中先等待輸入一字符串, 再等待輸入要查找的字符, 然后調(diào)用match() 函
數(shù)在字符串中查找該字符。若有相同字符, 則返回一個(gè)指向該字符串中這一位置的
指針, 如果沒(méi)有找到, 則返回一個(gè)空(NULL)指針。
    例5:
     #include
     char *match(char c, char *s);
     int main()
     {
          char s[40], c, *str;
          str=malloc(40);          /*為字符串指什分配內(nèi)存空間*/
          printf("Please input character string:");
          gets(s);                 /*鍵盤(pán)輸入字符串*/
          printf("Please input one character:");
          c=getche();              /*鍵盤(pán)輸入字符*/
          str=match(c, s);         /*調(diào)用子函數(shù)*/
          putchar('\n');
          puts(str);               /*輸出子函數(shù)返回的指針?biāo)傅淖址?/
          getch();
          return 0;
     }
     char *match(char c, char *s)
     {
          int i=0;
          while(c!=s[i]&&s[i]!='\n')/*找字符串中指定的字符*/
               i++;
          return(&s[i]);           /*返回所找字符的地址*/
     }


    三、用全程變量實(shí)現(xiàn)參數(shù)互傳
    以上兩種辦法可以在調(diào)用函數(shù)和被調(diào)用函數(shù)間傳遞參數(shù), 但使用不太方便。如
果將所要傳遞的參數(shù)定義為全程變量, 可使變量在整個(gè)程序中對(duì)所有函數(shù)都可見(jiàn)。
這樣相當(dāng)于在調(diào)用函數(shù)和被調(diào)用函數(shù)之間實(shí)現(xiàn)了參數(shù)的傳遞和返回。這也是實(shí)際中
經(jīng)常使用的方法, 但定義全程變量勢(shì)必長(zhǎng)久地占用了內(nèi)存。因此, 全程變量的數(shù)目
受到限制, 特別對(duì)于較大的數(shù)組更是如此。當(dāng)然對(duì)于絕大多數(shù)程序內(nèi)存都是夠用的。
    例6:
     #incluide
     void disp(void);
     int m[10];          /*定義全程變量*/
     int main()
     {
          int i;
          printf("In main before calling\n");
          for(i=0; i<10; i++){
            m[i]=i;
            printf("%3d", m[i]);   /*輸出調(diào)用子函數(shù)前數(shù)組的值*/
          }
          disp();                  /*調(diào)用子函數(shù)*/
          printf("\nIn main after calling\n");
          for(i=0; i<10; i++)
            printf("%3d", m[i]);   /*輸出調(diào)用子函數(shù)后數(shù)組的值*/
          getch();
          return 0;
     }
     void disp(void)
     {
          int j;
          printf("In subfunc after calling\n");/*子函數(shù)中輸出數(shù)組的值*/
          for (j=0; i<10; j++){
               m[j]=m[j]*10;
               printf("%3d", m[i]);
          }
     }


    2.3 函數(shù)的遞歸調(diào)用
    Turbo C2.0允許函數(shù)自己調(diào)用自己, 即函數(shù)的遞歸調(diào)用, 遞歸調(diào)用可以使程序
簡(jiǎn)潔、代碼緊湊, 但要犧牲內(nèi)存空間作處理時(shí)的堆棧。
    如要求一個(gè)n!(n的階乘)的值可用下面遞歸調(diào)用:
    例8:
      #include
      unsigned ling mul(int n);
      int main()
     {
          int m;
          puts("Calculate n! n=?\n");
          scanf("%d", &m);         /*鍵盤(pán)輸入數(shù)據(jù)*/
          printf("%d!=%ld\n", m, mul(m));/*調(diào)用子程序計(jì)算并輸出*/
          getch();
          retun 0;
      }
     unsigned long mul(int n)
     {
          unsigned long p;
          if(n>1)
               p=n*mul(n-1);       /*遞歸調(diào)用計(jì)算n!*/
          else
               p=1L;
          return(p);               /*返回結(jié)果*/
     }
運(yùn)行結(jié)果:
          calculate n!  n=?
輸入5時(shí)結(jié)果為:
          5!=120

    3. 函數(shù)作用范圍

    Turbo C2.0中每個(gè)函數(shù)都是獨(dú)立的代碼塊, 函數(shù)代碼歸該函數(shù)所有, 除了對(duì)函
數(shù)的調(diào)用以外, 其它任何函數(shù)中的任何語(yǔ)句都不能訪(fǎng)問(wèn)它。例如使用跳轉(zhuǎn)語(yǔ)句goto
就不能從一個(gè)函數(shù)跳進(jìn)其它函數(shù)內(nèi)部。除非使用全程變量, 否則一個(gè)函數(shù)內(nèi)部定義
的程序代碼和數(shù)據(jù), 不會(huì)與另一個(gè)函數(shù)內(nèi)的程序代碼和數(shù)據(jù)相互影響。
    Turbo C2.0中所有函數(shù)的作用域都處于同一嵌套程度, 即不能在一個(gè)函數(shù)內(nèi)再
說(shuō)明或定義另一個(gè)函數(shù)。
    Turbo C2.0中一個(gè)函數(shù)對(duì)其它子函數(shù)的調(diào)用是全程的, 即是函數(shù)在不同的文件
中, 也不必附加任何說(shuō)明語(yǔ)句而被另一函數(shù)調(diào)用, 也就是說(shuō)一個(gè)函數(shù)對(duì)于整個(gè)程序
都是可見(jiàn)的。

    4. 函數(shù)的變量作用域
    在Turbo C2.0中, 變是可以在各個(gè)層次的子程序中加以說(shuō)明, 也就是說(shuō), 在任
何函數(shù)中, 變量說(shuō)明有只允許在一個(gè)函數(shù)體的開(kāi)頭處說(shuō)明, 而且允許變量的說(shuō)明(
包括初始化)跟在一個(gè)復(fù)合語(yǔ)句的左花括號(hào)的后面, 直到配對(duì)的右花括號(hào)為止。它
的作用域僅在這對(duì)花括號(hào)內(nèi), 當(dāng)程序執(zhí)行到出花括號(hào)時(shí), 它將不復(fù)存在。當(dāng)然, 內(nèi)
層中的變量即使與外層中的變量名字相同, 它們之間也是沒(méi)有關(guān)系的。
    例9.
     #include
     int i=10;
     int main()
     {
          int i=1;
          printf("%d\t, i);
          {
               int i=2;
               pritnf("%d\t", i);
               {
                    extern i;
                    i+=1;
                    printf("%d\t", i);
               }
               printf("%d\t", ++i);
          }
          printf("%d\n", ++i);
          return 0;
     }
運(yùn)行結(jié)果為
     1    2    11   3    2
從程序運(yùn)行的結(jié)果不難看出程序中各變量之間的關(guān)系, 以及各個(gè)變量的作用域。

                    Turbo C 程序設(shè)計(jì)初步

    本節(jié)主要介紹Turbo C程序設(shè)計(jì)的基本步驟及如何編譯、調(diào)試和運(yùn)行源程序。
并給出Turbo C的常用編輯命令。最后介紹Turbo C編譯、連接和運(yùn)行時(shí)的常見(jiàn)錯(cuò)
誤。

    一、Turbo C程序設(shè)計(jì)基本步驟

    程序設(shè)計(jì)方法包括三個(gè)基本步驟:
    第一步:  分析問(wèn)題。
    第二步:  畫(huà)出程序的基本輪廓。
    第三步:  實(shí)現(xiàn)該程序。
      3a. 編寫(xiě)程序
      3b. 測(cè)試和調(diào)試程序
      3c. 提供數(shù)據(jù)打印結(jié)果
    下面, 我們來(lái)說(shuō)明每一步的具體細(xì)節(jié)。

    第一步: 分析問(wèn)題
    在這一步, 你必須:
    a. 作為解決問(wèn)題的一種方法, 確定要產(chǎn)生的數(shù)據(jù)(輸出)。作為這一子步的
一部分, 你應(yīng)定義表示輸出的變量。
    b. 確定需產(chǎn)生輸出的數(shù)據(jù)(稱(chēng)為輸入), 作為這一子步的一部分,  你應(yīng)定義
表示輸入的變量。
    c. 研制一種算法, 從有限步的輸入中獲取輸出。 這種算法定義為結(jié)構(gòu)化的
順序操作, 以便在有限步內(nèi)解決問(wèn)題。就數(shù)字問(wèn)題而言, 這種算法包括獲取輸出
的計(jì)算, 但對(duì)非數(shù)字問(wèn)題來(lái)說(shuō), 這種算法包括許多文本和圖象處理操作。

    第二步: 畫(huà)出程序的基本輪廓
    在這一步, 你要用一些句子(偽代碼)來(lái)畫(huà)出程序的基本輪廓。每個(gè)句子對(duì)應(yīng)
一個(gè)簡(jiǎn)單的程序操作。對(duì)一個(gè)簡(jiǎn)單的程序來(lái)說(shuō),  通過(guò)列出程序順序執(zhí)行的動(dòng)作,
便可直接產(chǎn)生偽代碼。然而, 對(duì)復(fù)雜一些的程序來(lái)說(shuō), 則需要將大致過(guò)程有條理
地進(jìn)行組織。對(duì)此, 應(yīng)使用自上而下的設(shè)計(jì)方法。
    當(dāng)使用自上而下的設(shè)計(jì)方法時(shí), 你要把程序分割成幾段來(lái)完成。列出每段要
實(shí)現(xiàn)的任務(wù), 程序的輪廓也就有了, 這稱(chēng)之為主模塊。當(dāng)一項(xiàng)任務(wù)列在主模塊時(shí),
僅用其名加以標(biāo)識(shí), 并未指出該任務(wù)將如何完成。這方面的內(nèi)容留給程序設(shè)計(jì)的
下一階段來(lái)討論。將程序分為幾項(xiàng)任務(wù)只是對(duì)程序的初步設(shè)計(jì)。整個(gè)程序設(shè)計(jì)歸
結(jié)為下圖所示的流程圖1.。
                                   ┏━━━━━━━━━━━━━━━┓
                                   ┃           主模塊             ┃
  ┏━━━━━━━┓               ┃ 輸入數(shù)據(jù)                     ┃
  ┃   主模塊     ┃               ┃ 計(jì)算購(gòu)房所需的金額           ┃
  ┃              ┃               ┃ 計(jì)算裝修所需的金額           ┃
  ┃ 任務(wù)1        ┃               ┃ 計(jì)算總金額                   ┃
  ┃ 任務(wù)2        ┃               ┃ 輸出計(jì)算結(jié)果                 ┃
  ┃ 任務(wù)3        ┃               ┃                              ┃
  ┃ 任務(wù)4        ┃               ┗━━━━━━━┳━━━━━━━┛
  ┃              ┃       ┏━━━━━┳━━━━━╋━━━━┳━━━━━┓
  ┃              ┃ ┏━━┻━┓┏━━┻━┓┏━━┻━┓┏━┻━┓┏━━┻━┓
  ┗━━━━━━━┛ ┃輸入數(shù)據(jù)┃┃購(gòu)房額..┃┃裝修額..┃┃總額..┃┃輸出結(jié)果┃
                     ┗━━━━┛┗━━━━┛┗━━━━┛┗━━━┛┗━━━━┛
   圖1. 程序初步設(shè)計(jì)                    圖2. 第二級(jí)程序設(shè)計(jì)

    如果把主模塊的每項(xiàng)任務(wù)擴(kuò)展成一個(gè)模塊, 并根據(jù)子任務(wù)進(jìn)行定義的話(huà), 那
么, 程序設(shè)計(jì)就更為詳細(xì)了(見(jiàn)圖2.)。這些模塊稱(chēng)為主模塊的子模塊。程序中許
多子模塊之間的關(guān)系可象圖2.中那樣歸結(jié)為一張圖。這種圖稱(chēng)為結(jié)構(gòu)圖。
    要畫(huà)出模塊的輪廓, 你可不考慮細(xì)節(jié)。如果這樣的話(huà), 你必須使用子模塊,
將各個(gè)模塊求精, 達(dá)到第三級(jí)設(shè)計(jì)。繼續(xù)這一過(guò)程, 直至說(shuō)明程序的全部細(xì)節(jié)。
這一級(jí)一級(jí)的設(shè)計(jì)過(guò)程稱(chēng)為逐步求精法。在編寫(xiě)程序之前, 對(duì)你的程序進(jìn)行逐步
求精, 對(duì)你來(lái)說(shuō), 是很好的程序設(shè)計(jì)實(shí)踐, 會(huì)使你養(yǎng)成良好的設(shè)計(jì)習(xí)慣。
    我們則才描述了程序設(shè)計(jì)中自上而下的設(shè)計(jì)方法。實(shí)際上就是說(shuō), 我們?cè)O(shè)計(jì)
程序是從程序的"頂部"開(kāi)始一直考慮到程序的"底部"。

    第三步: 實(shí)現(xiàn)該程序
    程序設(shè)計(jì)的最后一步是編寫(xiě)源碼程序。 在這一步,  把模塊的偽代碼翻譯成
Turbo C語(yǔ)句。
    對(duì)于源程序, 你應(yīng)包含注釋方式的文件編制, 以描述程序各個(gè)部分做何種工
作。此外, 源程序還應(yīng)包含調(diào)試程序段, 以測(cè)試程序的運(yùn)行情況, 并允許查找編
程錯(cuò)誤。一旦程序運(yùn)行情況良好, 可去掉調(diào)試程序段, 然而,  文件編制應(yīng)做為源
程序的固定部分保留下來(lái), 便于你或其他人維護(hù)和修改。
    二、源程序的輸入、編譯和運(yùn)行

    C語(yǔ)言是一種中級(jí)語(yǔ)言, 用戶(hù)用C語(yǔ)言編寫(xiě)的程序稱(chēng)為源程序, 存放用C 語(yǔ)言
所寫(xiě)源程序文件名字最后的兩個(gè)字符一般必須為".c"。計(jì)算機(jī)硬件不能直接執(zhí)行
源程序, 必須將源程序翻譯成二進(jìn)制目標(biāo)程序。翻譯工作是由一個(gè)程序完成的,
這個(gè)程序稱(chēng)為編譯程序, 翻譯的過(guò)程稱(chēng)為編譯, 編譯的結(jié)果稱(chēng)為目標(biāo)程序, 存放
目標(biāo)程序文件名字緊后的字符一般為".OBJ"或".O"。程序翻譯成目標(biāo)程序后, 便
可進(jìn)行連接。"連接"的目的是使程序變成在計(jì)算機(jī)上可以執(zhí)行的最終形式。在這
一階段, 從系統(tǒng)程序庫(kù)來(lái)的程序要與目標(biāo)程序連接, 連接的結(jié)果稱(chēng)為執(zhí)行程序,
存放執(zhí)行程序文件名字一般以".EXE"結(jié)尾。
    在Turbo C集成開(kāi)發(fā)環(huán)境中建立一個(gè)新程序通常有以下幾個(gè)步驟:
    (1). 在編輯器中編寫(xiě)源文件。
    (2). 生成可執(zhí)行文件。

    在DOS提示符下鍵入TC, 即可進(jìn)入Turbo C了。進(jìn)入主TC屏后, 按F3鍵, 即可
在隨之出現(xiàn)的框中輸入文件名, 文件名可以帶".C"也可以不帶( 此時(shí)系統(tǒng)會(huì)自動(dòng)
加上)。輸入文件名后, 按回車(chē), 即可將文件調(diào)入, 如果文件不存在,  就建立一
個(gè)新文件(也可用下面例子中的方法輸入文件名)。系統(tǒng)隨之進(jìn)入編輯狀態(tài)。就可
以輸入或修改源程序了, 源程序輸入或修改完畢以后, 按Ctrl+F9(同時(shí)按下Ctrl
鍵和F9鍵), 則立即進(jìn)行編譯、連接和執(zhí)行, 這三項(xiàng)工作是連續(xù)完成的。
    下面我們?cè)囍⒁粋(gè)Turbo C名為"HELLO.C"的源程序(因程序很小, 這里就
不畫(huà)出該程序的輪廓圖了):
    1. 操作步驟:
    (1). 將系統(tǒng)置于DOS提示符下:
    (2). 鍵入命令:
          tc hello.c
使系統(tǒng)進(jìn)入Turbo C集成開(kāi)發(fā)環(huán)境, 并建立一個(gè)名為HELLO.C的文件。這時(shí), 系統(tǒng)
進(jìn)入Turbo C編輯環(huán)境。
    (3). 通過(guò)鍵盤(pán)輸入程序, 例如:
     main()
     {
          printf("Hello, world\n");
     }
則程序進(jìn)入計(jì)算機(jī)存貯器。
    2. 程序存盤(pán)
    為防止意外事故丟失程序, 最好將輸入的程序存貯到磁盤(pán)中。在編輯窗口下,
可直接按F2鍵或按F10鍵, 再按F鍵進(jìn)入File菜單項(xiàng), 再按S或W鍵將文件存盤(pán)。存
盤(pán)時(shí)屏幕最底行會(huì)顯示:
     "saving edit file"
    3. 編譯一個(gè)程序
    對(duì)源程序進(jìn)行編譯有兩種方法: (1). 直接按Alt+F9即可。(2). 按F10 鍵返
回主菜單, 選擇Compile項(xiàng),  屏幕顯示Compile 下拉菜單,   從下拉菜單中選擇
Compile to .OBJ項(xiàng), 按回車(chē)鍵。
    進(jìn)入編譯狀態(tài)后, 屏幕會(huì)出現(xiàn)一個(gè)編譯窗口, 幾秒鐘后, 屏幕顯示一閃爍信
息:
          Success: press any key
表示編譯成功。此時(shí)可按任意鍵, 編譯窗口消失, 光標(biāo)返回主菜單。
    如果編譯時(shí)產(chǎn)生警告Warning或出錯(cuò)Error信息, 這些具體錯(cuò)誤信息會(huì)顯示在
屏幕下部的信息窗中, 必須糾正這些錯(cuò)誤。對(duì)源程序進(jìn)行修改, 重新進(jìn)行編譯。
    4. 運(yùn)行程序
    源程序經(jīng)編譯無(wú)誤后, 可以投入運(yùn)行。具體操作如下:
    (1). 如果當(dāng)前還在編輯狀態(tài), 可按Alt+R, 再選擇RUN項(xiàng)即可。
    (2). 按Ctrl+F9。
    程序投入運(yùn)行時(shí), 屏幕會(huì)出現(xiàn)一個(gè)連接窗口, 顯示Turbo C 正在連接和程序
所需的庫(kù)函數(shù)。連接完畢后, 會(huì)出現(xiàn)屏幕突然一閃, 后又回到TC主屏幕, 發(fā)生了
什么? 讓我們按Alt+F5看看, 此時(shí)屏幕被清除, 在頂部顯示"Hello, world"字樣。
再按任意鍵, 即可又回到TC主屏幕。
    5. 列磁盤(pán)文件目錄
    現(xiàn)在請(qǐng)按Alt+X退出Turbo C, 返回DOS提示符, 鍵入dir hello.*, 回車(chē), 則
屏幕顯示:
     HELLO   C       42   1-09-93  10:18
     HELLO   OBJ    221   1-09-93  10:22
     HELLO   EXE   4486   1-09-93  10:25
     ...
    第一個(gè)文件HELLO.C是源文件文本, 在DOS提示符下鍵入TYPE HELLO.C命令,
可在屏幕上顯示該文件的內(nèi)容?煽吹皆摮绦蛑挥42個(gè)字節(jié)。
    第二個(gè)文件HELLO.OBJ是Turbo C編擇程序產(chǎn)生的二進(jìn)制機(jī)器指令(目標(biāo)碼),
如果用DOS命令TYPE顯示該文件, 屏幕可能會(huì)出現(xiàn)混亂的信息。
    第三個(gè)文件HELLO.EXE是Turbo C連接程序產(chǎn)生的實(shí)際可執(zhí)行文件。在DOS 提
示符下鍵入HELLO并按回車(chē), 屏幕將顯示"Hello, world"。

    Turbo C 常用的編輯命令


    Turbo C編輯程序大約有50條命令, 用以移動(dòng)光標(biāo), 按頁(yè)查看正文,  查找并
替換字符串等。如下表所示。

                  表1. Turbo C編輯程序命令
━━━┳━━━━━━━━━┳━━━━━━━━━━━━━
類(lèi)別 ┃   功能           ┃       默認(rèn)鍵
━━━╋━━━━━━━━━╋━━━━━━━━━━━━━
      ┃  字符左          ┃  Ctrl+S或Left
  基  ┃  字符右          ┃  Ctrl+D或Right
  本  ┃  字左            ┃  Ctrl+A
  光  ┃  字右            ┃  Ctrl+F
  標(biāo)  ┃  上行            ┃  Ctrl+E或Up
  移  ┃  下行            ┃  Ctrl+X或Down
  動(dòng)  ┃  上滾            ┃  Ctrl+W
  命  ┃  下滾            ┃  Ctrl+Z
  令  ┃  上一頁(yè)          ┃  Ctrl+R或PgUp
      ┃  下一頁(yè)          ┃  Ctrl+C或PgDn
━━━╋━━━━━━━━━╋━━━━━━━━━━━━━
  快  ┃  行頭            ┃  Ctrl+QS或Home
  速  ┃  行尾            ┃  Ctrl+QD或End
  光  ┃  窗口頭          ┃  Ctrl+QE
  標(biāo)  ┃  窗口底          ┃  Ctrl+QX
  移  ┃  文件頭          ┃  Ctrl+QR
  動(dòng)  ┃  文件尾          ┃  Ctrl+QC
  命  ┃  塊頭            ┃  Ctrl+QB
  令  ┃  塊尾            ┃  Ctrl+QK
      ┃  上次光標(biāo)位置    ┃  Ctrl+QP
━━━╋━━━━━━━━━╋━━━━━━━━━━━━━
  輸  ┃  插入模式        ┃  Ctrl+V或Ins
  入  ┃  插入行          ┃  Ctrl+N
  與  ┃  刪除行          ┃  Ctrl+Y
  刪  ┃  刪除至行尾      ┃  Ctrl+QY
  除  ┃  刪除光標(biāo)左邊字符┃  Ctrl+H或Backspace
  命  ┃  刪除光標(biāo)處字符  ┃  Ctrl+G或Del
  令  ┃  刪除光標(biāo)右邊字符┃  Ctrl+T
━━━╋━━━━━━━━━╋━━━━━━━━━━━━━
      ┃  標(biāo)記塊首        ┃  Ctrl+KB
      ┃  標(biāo)記塊尾        ┃  Ctrl+KK
      ┃  標(biāo)記單個(gè)字      ┃  Ctrl+KT
  塊  ┃  復(fù)制塊          ┃  Ctrl+KC
  命  ┃  刪除塊          ┃  Ctrl+KY
  令  ┃  塊取消          ┃  Ctrl+KH
      ┃  塊移動(dòng)          ┃  Ctrl+KV
      ┃  讀塊            ┃  Ctrl+KR
      ┃  寫(xiě)塊            ┃  Ctrl+KW
━━━╋━━━━━━━━━╋━━━━━━━━━━━━━
      ┃  異常結(jié)束操作    ┃  Ctrl+U或Ctrl+Break
      ┃  制表            ┃  Ctrl+L或Tab
  其  ┃  自動(dòng)縮進(jìn)        ┃  Ctrl+OI
      ┃  定界符配對(duì)      ┃  Ctrl+Q[或Ctrl+Q]
  它  ┃  查找            ┃  Ctrl+QF
      ┃  查找并替換      ┃  Ctrl+QA
      ┃  查找標(biāo)記        ┃  Ctrl+QN
      ┃  退出編輯        ┃  Ctrl+KQ
━━━┻━━━━━━━━━┻━━━━━━━━━━━━━

    Turbo C 程序的調(diào)試

    一個(gè)程序設(shè)計(jì)好了以后, 通常會(huì)有一些錯(cuò)誤, 查找和修改程序中的錯(cuò)誤是令
人頭痛的事。Turbo C集成開(kāi)發(fā)環(huán)境提供了一調(diào)試裝置,  使得這一個(gè)工作容易了
許多, 程序調(diào)試達(dá)到了編譯和運(yùn)行級(jí)。

    一、TC消息窗口

    使用TC最好的理由之一是它允許用戶(hù)修改語(yǔ)法錯(cuò)誤(編譯時(shí)) 和評(píng)估編譯器給
出的警告。TC將編譯器和連接器發(fā)出的消息收集到一緩沖區(qū)中, 然后在消息窗口
中顯示, 這樣在訪(fǎng)問(wèn)源代碼的同時(shí), 還能一下看到這些消息。
    現(xiàn)將上面的HELLO.C制造一點(diǎn)語(yǔ)法錯(cuò)誤, 將第一行包含語(yǔ)句的#去掉, 再去掉
第五行printf語(yǔ)句中的后引號(hào),F(xiàn)在程序看上去是這樣的:
     include
     main()
     {
          printf("Hello, world\n);
     }
按CTRL+F9重新編譯之。編譯窗口將顯示有多少錯(cuò)誤和警告: 應(yīng)為兩個(gè)錯(cuò)誤, 0個(gè)
警告。
    當(dāng)看見(jiàn)編譯窗口中的Press anykey提示時(shí), 按空格鍵, 消息窗口立刻被激活,
亮條出現(xiàn)在第一個(gè)錯(cuò)誤或警告上, 這時(shí)編輯窗口中也會(huì)有一亮條--- 它標(biāo)志著編
譯器給出的錯(cuò)誤或警告在源代碼中的相應(yīng)位置。
    這時(shí)可用光標(biāo)鍵將消息窗口中的亮條上下移動(dòng), 注意到編輯窗口中的亮條也
隨著跟蹤源代碼中錯(cuò)誤發(fā)生的位置。如果將亮條置于"compile"上,  則編輯器顯
示文件的最后位置。
    如果消息窗口太長(zhǎng)看不見(jiàn), 可用左、右光標(biāo)水平滾動(dòng)消息, 為了一次能夠多
看點(diǎn)信息, 可按F5放大消息窗口。放大后, 編輯窗口不可見(jiàn)了, 因此不進(jìn)行錯(cuò)誤
跟蹤,F(xiàn)在, 保持分屏模式。
    為了改正錯(cuò)誤, 將消息窗口中的亮條置于第一個(gè)錯(cuò)誤消息上, 回車(chē), 光標(biāo)移
到編輯窗口中錯(cuò)誤產(chǎn)生處, 注意, 編輯器狀態(tài)給出所選消息( 這在放大模式下是
有用的)改正之。(將第一行拿走的#重新寫(xiě)上)。
    當(dāng)不只一個(gè)錯(cuò)誤時(shí), 可用兩種方法來(lái)修改下一錯(cuò)誤。
    第一種方法和前面一樣, 按F6回到消息窗口選擇想修改的下一條消息。
    第二種方法不用回到消息窗口, 只要按Alt+F8, 編譯器就會(huì)將光標(biāo)移至消息
窗口中列的下一個(gè)錯(cuò)誤。按Alt+F7可移至前一個(gè)錯(cuò)誤。
    這兩種方法各有長(zhǎng)短, 視情況而定。有時(shí)源代碼中一個(gè)愚蠢的錯(cuò)誤把編譯弄
糊涂了, 產(chǎn)生好多消息, 這時(shí)選擇修改第一條消息就使得其余的一些錯(cuò)誤消息沒(méi)
有什么意義了, 這種情況發(fā)生時(shí), 使用方法一會(huì)方便些, 一修改完第一個(gè)錯(cuò)誤之
后回到消息窗口, 再滾動(dòng)到下一個(gè)有意義的消息上, 選擇之。在別的情況下, 按
Alt+F8會(huì)方便得多。
    記住, Alt+F7和Alt+F8是熱鍵, TC中無(wú)論何時(shí)均起作用。因此在消息窗口中
按Alt+F8得到的不是當(dāng)前亮行消息, 而是下一個(gè)消息(按Enter選擇當(dāng)前消息)。
但如果沒(méi)別的編譯消息, Alt+F8就不起作用了。
    注: 可以如此法選擇連接消息, 但它們不跟蹤源文件。在修改語(yǔ)法錯(cuò)誤的過(guò)
程當(dāng)中, 經(jīng)常需要增加、刪除正文, 編輯器是記住的, 依然能正確定位錯(cuò)誤位置。
沒(méi)有必要記住行號(hào)和增加、刪除的正文行。

    二、Turbo C集成調(diào)試器

    一旦修改好語(yǔ)法錯(cuò)誤之后程序編譯就沒(méi)什么問(wèn)題了, 但還是可能不按要求運(yùn)
行, 因?yàn)榭赡苡羞壿嬪e(cuò)誤(運(yùn)行錯(cuò)誤)。這種錯(cuò)誤跟蹤就無(wú)助于發(fā)現(xiàn)錯(cuò)誤位置了。
TC有一個(gè)集成調(diào)試器可以跟蹤運(yùn)行錯(cuò)誤。通過(guò)調(diào)試器可以運(yùn)行,  在斷點(diǎn)處暫停,
檢查變量的值, 甚至可以改變之, 以看程序會(huì)有什么反應(yīng)。
   Turbo C集成調(diào)試器是源程序級(jí)的調(diào)試器, 即用同你編寫(xiě)程序一樣的" 語(yǔ)言"
來(lái)控制調(diào)試器。例如, 為了顯示數(shù)組中的一個(gè)元素的值, 可告訴調(diào)試器顯示這樣
的表達(dá)式的值:
Ctrl+F4  Debug/Eavluate            計(jì)算表達(dá)式, 允許修改變量的值。
         Debug/Find Function       查找函數(shù)定義, 顯示在編輯窗口中。 僅
                                   在調(diào)試時(shí)才有效。
Ctrl+F3  Debug/Call Stack          顯示調(diào)用棧,  可顯示任何函數(shù)的當(dāng)前執(zhí)
                                   行位置, 其方法是在調(diào)用棧中選擇相應(yīng)的
                                   函數(shù)名。僅在調(diào)試時(shí)有效。
         Debug/Source Debugging    控制是否允許調(diào)試: 置為On時(shí),  集成調(diào)
                                       試器和單獨(dú)調(diào)試器均可用 ;   置為
                                        Standalone時(shí), 只能用單獨(dú)調(diào)試器
                                        調(diào)試, 雖然還能在TC中運(yùn)行; 置為
                                        None時(shí), 在.EXE文件不置調(diào)試信息,
                                        兩種調(diào)試均不能調(diào)試。
Ctrl+F4  Break/Watch/Add Watch          增加一監(jiān)視表達(dá)式。
         Break/Watch/Delete Watch       刪除一監(jiān)視表達(dá)式。
         Break/Watch/Edit               編輯一監(jiān)視表達(dá)式。
         Break/Watch/Remove All         刪除所有監(jiān)視表達(dá)式。
           Watches
Ctrl+F8  Break/Watch/Toggle             設(shè)置或清除光標(biāo)所在行的斷點(diǎn)。
           Breakpoint
         Break/Watch/Clear              刪除程序中所有斷點(diǎn)。
           Breakpoint
         Break/Watch/Next               顯示下一斷點(diǎn)
           Breakpoint
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

               表3. 調(diào)試器菜單命令及其熱鍵
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  熱鍵            菜單命令                           功能
───────────────────────────────────
  F5                                 在整屏和分屏之間放大縮小活動(dòng)窗口。
Alt+F5                               將顯示轉(zhuǎn)到用戶(hù)屏, 擊任意鍵返回。
  F6                                 在編輯窗口與監(jiān)視窗口或消息窗口間
                                     切換。
Alt+F6                               若編輯窗口是活動(dòng)的,  轉(zhuǎn)到最近一次
                                     裝入編輯器的文件;  若下面窗口是活
                                     動(dòng)的, 則在監(jiān)視窗口和消息窗口間切換。
Ctrl+F9   Run/Run                    調(diào)試運(yùn)行或不調(diào)試運(yùn)行程序,  必要時(shí)
                                     編譯、連接源文件, 若編譯、 連接時(shí)
                                     Debug/Source Debuging和O/C/C/OBJ
                                     Debug Information為On, 則運(yùn)行程序
                                     到斷點(diǎn)或程序末尾。
          Project/Remove Messages    刪除消息窗口中的內(nèi)容。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    判斷程序是否出錯(cuò)或者為什么出錯(cuò)是編程中最有挑戰(zhàn)意義的一方面。這里建
義你進(jìn)行預(yù)防性設(shè)計(jì), 具體做法為:
    (1). 將代碼寫(xiě)清楚點(diǎn), 應(yīng)作適當(dāng)縮進(jìn), 使用文字說(shuō)明和描述性的變量名。
    (2). 代碼應(yīng)簡(jiǎn)單, 把精力放在簡(jiǎn)單語(yǔ)句中的復(fù)雜表達(dá)式,  而不是一些復(fù)雜
語(yǔ)句。Turbo C的代碼優(yōu)化機(jī)制將大大提高代碼的效率, 而且調(diào)試、閱讀、 修改
起來(lái)容易。
    (3). 盡量用目的簡(jiǎn)單、好定義的函數(shù)構(gòu)建程序。 這會(huì)便于編制調(diào)試程序和
分析結(jié)果, 而且閱讀、修改起來(lái)也要容易一些。
    (4). 應(yīng)盡量減少各個(gè)函數(shù)要求的數(shù)據(jù)和改變數(shù)據(jù)的元素個(gè)數(shù)。這也會(huì)便于
編制測(cè)試程序和分析結(jié)果; 同樣便于閱讀、修改程序。并且還限制了出錯(cuò)函數(shù)可
能造成的巨大混亂的牽涉面, 便得能在一個(gè)調(diào)試節(jié)中多運(yùn)行函數(shù)幾次。
    (5). 要留心編寫(xiě)程序中的公共函數(shù), 或者說(shuō)在其它程序中可再用的函數(shù)。
編寫(xiě)、調(diào)試一個(gè)一般性的函數(shù)通常要比編寫(xiě)、調(diào)試兩個(gè)或更多的特殊函數(shù)要容易。



    Turbo C編譯、連接和運(yùn)行時(shí)的常見(jiàn)錯(cuò)誤


    一、編譯時(shí)的常見(jiàn)錯(cuò)誤

    1. 數(shù)據(jù)類(lèi)型錯(cuò)誤。此類(lèi)錯(cuò)誤是初學(xué)者編程時(shí)的常見(jiàn)現(xiàn)象,  下面是一些要引
起注意的錯(cuò)誤:
     (1) 所有變量和常量必須要加以說(shuō)明。
     (2) 變量只能賦給相同類(lèi)型的數(shù)據(jù)。
     (3) 對(duì)scanf()語(yǔ)句, 用戶(hù)可能輸入錯(cuò)誤類(lèi)型的數(shù)據(jù)項(xiàng), 這將導(dǎo)致運(yùn)行時(shí)出
錯(cuò), 并報(bào)出錯(cuò)信息。為避免這樣的錯(cuò)誤出現(xiàn), 你就提示用戶(hù)輸入正確類(lèi)型的數(shù)據(jù)。
     (4) 在執(zhí)行算術(shù)運(yùn)算時(shí)要注意:
          a. 根據(jù)語(yǔ)法規(guī)則書(shū)寫(xiě)雙精度數(shù)字。要寫(xiě)0.5, 而不是寫(xiě).5; 要寫(xiě)1.0,
             而不是1。盡管C語(yǔ)言會(huì)自動(dòng)地把整型轉(zhuǎn)換成雙精度型, 但書(shū)寫(xiě)雙精
             度型是個(gè)好習(xí)慣。讓C語(yǔ)言為你做強(qiáng)行轉(zhuǎn)換這是一種效率不高的程序
             設(shè)計(jì)風(fēng)格。 這有可能導(dǎo)致轉(zhuǎn)換產(chǎn)生錯(cuò)誤。
          b. 不要用0除。這是一個(gè)災(zāi)難性的錯(cuò)誤, 它會(huì)導(dǎo)致程序失敗,  不管C
             語(yǔ)言的什么版本, 都是如此, 執(zhí)行除法運(yùn)算要特別小心。
          c. 確保所有的雙精度數(shù)(包括那些程序輸入用的雙精度數(shù)) 是在實(shí)數(shù)
             范圍之內(nèi)。
          d. 所有整數(shù)必須在整數(shù)允許的范圍內(nèi)。這適用于所有計(jì)算結(jié)果,  包
             括中間結(jié)果。

    2. 將函數(shù)后面的";"忘掉。此時(shí)錯(cuò)誤提示色棒將停在該語(yǔ)句下的一行, 并顯
示:
     Statement missing ; in function <函數(shù)名>

    3. 給宏指令如#include, #define等語(yǔ)句尾加了";"號(hào)。

    4. "{"和"}"、"("和")"、"/*"和"*/"不匹配。 引時(shí)色棒將位于錯(cuò)誤所在的
行, 并提示出有關(guān)丟掉括號(hào)的信息。

    5. 沒(méi)有用#include指令說(shuō)明頭文件,  錯(cuò)誤信息提示有關(guān)該函數(shù)所使用的參
數(shù)未定義。

    6. 使用了Turbo C保留關(guān)鍵字作為標(biāo)識(shí)符, 此時(shí)將提示定義了太多數(shù)據(jù)類(lèi)型。

    7. 將定義變量語(yǔ)句放在了執(zhí)行語(yǔ)句后面。此時(shí)會(huì)提示語(yǔ)法錯(cuò)誤。

    8. 使用了未定義的變量, 此時(shí)屏幕顯示:
        Undefined symbol '<變量名>' in function <函數(shù)名>

    9. 警告錯(cuò)誤太多。忽略這些警告錯(cuò)誤并不影響程序的執(zhí)行和結(jié)果。編譯時(shí)
當(dāng)警告錯(cuò)誤數(shù)目大于某一規(guī)定值時(shí)(缺省為100)便退出編譯器,  這時(shí)應(yīng)改變集成
開(kāi)發(fā)環(huán)境Options/Compiler/Errors中的有關(guān)警告錯(cuò)誤檢查開(kāi)關(guān)為off。

    10. 將關(guān)系符"=="誤用作賦值號(hào)"="。此時(shí)屏幕顯示:
        Lvalue required in function <函數(shù)名>

    二、連接時(shí)的常見(jiàn)錯(cuò)誤

    1. 將Turbo C庫(kù)函數(shù)名寫(xiě)錯(cuò)。這種情況下在連接時(shí)將會(huì)認(rèn)為此函數(shù)是用戶(hù)自
定義函數(shù)。此時(shí)屏幕顯示:
       Undefined symbol '<函數(shù)名>' in <程序名>

    2. 多個(gè)文件連接時(shí), 沒(méi)有在"Project/Project name中指定項(xiàng)目文件 (.PRJ
文件), 此時(shí)出現(xiàn)找不到函數(shù)的錯(cuò)誤。

    3. 子函數(shù)在說(shuō)明和定義時(shí)類(lèi)型不一致。

    4. 程序調(diào)用的子函數(shù)沒(méi)有定義。

    三、運(yùn)行時(shí)的常見(jiàn)錯(cuò)誤

    1. 路徑名錯(cuò)誤。在MS-DOS中, 斜杠(\)表示一個(gè)目錄名; 而在Turbo C 中斜
杠是個(gè)某個(gè)字符串的一個(gè)轉(zhuǎn)義字符, 這樣, 在用Turbo C 字符串給出一個(gè)路徑名
時(shí)應(yīng)考慮"\"的轉(zhuǎn)義的作用。例如, 有這樣一條語(yǔ)句:
          file=fopen("c:\new\tbc.dat", "rb");
目的是打開(kāi)C盤(pán)中NEW目錄中的TBC.DAT文件, 但做不到。這里"\"后面緊接的分別
是"n"及"t", "\n"及"\t"將被分別編譯為換行及tab字符, DOS將認(rèn)為它是不正確
的文件名而拒絕接受, 因?yàn)槲募胁荒芎蛽Q行或tab字符。正確的寫(xiě)法應(yīng)為:
          file=fopen("c:\\new\\tbc.dat", "rb");

    2. 格式化輸入輸出時(shí), 規(guī)定的類(lèi)型與變量本身的類(lèi)型不一致。例如:
          float l;
          printf("%c", l);

    3. scanf()函數(shù)中將變量地址寫(xiě)成變量。例如:
          int l;
          scanf("%d", l);

    4. 循環(huán)語(yǔ)句中, 循環(huán)控制變量在每次循環(huán)未進(jìn)行修改,  使循環(huán)成為無(wú)限循
環(huán)。

    5. switch語(yǔ)句中沒(méi)有使用break語(yǔ)句。

    6. 將賦值號(hào)"="誤用作關(guān)系符"=="。

    7. 多層條件語(yǔ)句的if和else不配對(duì)。

    8. 用動(dòng)態(tài)內(nèi)存分配函數(shù)malloc()或calloc()分配的內(nèi)存區(qū)使用完之后,  未
用free()函數(shù)釋放, 會(huì)導(dǎo)致函數(shù)前幾次調(diào)用正常, 而后面調(diào)用時(shí)發(fā)生死機(jī)現(xiàn)象,
不能返回操作系統(tǒng)。其原因是因?yàn)闆](méi)用空間可供分配, 而占用了操作系統(tǒng)在內(nèi)存
中的某些空間。

    9. 使用了動(dòng)態(tài)分配內(nèi)存不成功的指針, 造成系統(tǒng)破壞。


    10. 在對(duì)文件操作時(shí), 沒(méi)有在使用完及時(shí)關(guān)閉打開(kāi)的文件。

轉(zhuǎn)帖于:計(jì)算機(jī)等級(jí)考試_考試吧
文章搜索  
看了本文的網(wǎng)友還看了:
網(wǎng)友評(píng)論
昵 稱(chēng): *  評(píng) 分: 1分 2分 3分 4分 5分
標(biāo)題:   匿名發(fā)表    (共有條評(píng)論)查看全部評(píng)論>>
版權(quán)聲明 -------------------------------------------------------------------------------------
  如果計(jì)算機(jī)等級(jí)考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本計(jì)算機(jī)等級(jí)考試網(wǎng)內(nèi)容,請(qǐng)注明出處。
關(guān)于本站  網(wǎng)站聲明  廣告服務(wù)  聯(lián)系方式  付款方式  站內(nèi)導(dǎo)航  客服中心  友情鏈接  考試論壇  網(wǎng)站地圖
Copyright © 2004-2008 考試吧計(jì)算機(jī)等級(jí)考試網(wǎng) All Rights Reserved    
中國(guó)科學(xué)院研究生院權(quán)威支持(北京) 電 話(huà):010-62168566 傳 真:010-62192699
百度大聯(lián)盟黃金認(rèn)證  十佳網(wǎng)絡(luò)教育機(jī)構(gòu)  經(jīng)營(yíng)許可證號(hào):京ICP060677