欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(zhǎng)資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          C語(yǔ)言基礎(chǔ)教程(五)函數(shù)

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

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

              1.1 函數(shù)說明

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

              1.2 函數(shù)定義
           
              函數(shù)定義就是確定該函數(shù)完成什么功能以及怎么運(yùn)行, 相當(dāng)于其它語(yǔ)言的一個(gè)
          子程序。Turbo C2.0對(duì)函數(shù)的定義采用ANSI規(guī)定的方式。即:
                 函數(shù)類型  函數(shù)名(數(shù)據(jù)類型形式參數(shù); 數(shù)據(jù)類型 形式參數(shù)…)
                {
                    函數(shù)體;
                 }
              其中函數(shù)類型和形式參數(shù)的數(shù)據(jù)類型為Turbo C2.0的基本數(shù)據(jù)類型。函數(shù)體為
          Turbo C2.0提供的庫(kù)函數(shù)和語(yǔ)句以及其它用戶自定義函數(shù)調(diào)用語(yǔ)句的組合, 并包括
          在一對(duì)花括號(hào)”{“和”}”中。
              需要指出的是一個(gè)程序必須有一個(gè)主函數(shù), 其它用戶定義的子函數(shù)可以是任意
          多個(gè), 這些函數(shù)的位置也沒有什么限制, 可以在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ù)說明的參數(shù)形式傳遞過去, 然后進(jìn)入子函數(shù)運(yùn)行, 運(yùn)行結(jié)束
          后再按子函數(shù)規(guī)定的數(shù)據(jù)類型返回一個(gè)值給調(diào)用函數(shù)。使用Turbo C2.0的庫(kù)函數(shù)就
          是函數(shù)簡(jiǎn)單調(diào)用的方法。舉例說明如下:
              例1:
               #include<stdio.h>
               int maxmum(int x, int y, int z);   /*說明一個(gè)用戶自定義函數(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 %dn”, max);
               }

              2.2 函數(shù)參數(shù)傳遞
           
              一、調(diào)用函數(shù)向被調(diào)用函數(shù)以形式參數(shù)傳遞
              用戶編寫的函數(shù)一般在對(duì)其說明和定義時(shí)就規(guī)定了形式參數(shù)類型, 因此調(diào)用這
          些函數(shù)時(shí)參量必須與子函數(shù)中形式參數(shù)的數(shù)據(jù)類型、順序和數(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中, 沒有下標(biāo)的數(shù)組名就
          是一個(gè)指向該數(shù)組第一個(gè)元素的指針。當(dāng)然數(shù)組變量的類型在兩個(gè)函數(shù)中必須相同。
              用下述方法傳遞數(shù)組形參。
              例2:
               #include<stdio.h>
               void disp(int *n);
               int main()
               {
                    int m[10], i;
                    for(i=0; i<10; i++)
                      m[i]=i;
                    disp(m);       /*按指針方式傳遞數(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<stdio.h>
               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(“%3dt”);
               }
          這時(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<stdio.h>
               int maxmum(int x, int y, int z);   /*說明一個(gè)用戶自定義函數(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 %dn”, 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ǔ)句就不能滿足要求。Turob C2.0提供了另一
          種參數(shù)傳遞的方法, 就是調(diào)用函數(shù)向被調(diào)用函數(shù)傳遞的形式參數(shù)不是傳遞變量本身,
          而是傳遞變量的地址, 當(dāng)子函數(shù)中向相應(yīng)的地址寫入不同的數(shù)值之后, 也就改變了
          調(diào)用函數(shù)中相應(yīng)變量的值, 從而達(dá)到了返回多個(gè)變量的目的。
               例4:
               #include<stdio.h>
               void subfun(int *m, int *n);  /*說明子函數(shù)*/
               int main()
               {
                    int i, j;
                    printf(“i, j=?n”);
                    scanf(“%d, %d”, &i, &j); /*從鍵盤輸入2個(gè)整數(shù)*/
                    printf(“In main before callingn”/*輸出此2數(shù)及其乘積*/
                           “i=%-4d j=%-4d i*j=%-4dn”, i, j, i*j);
                    subfun(&i, &j);          /*以傳送地址的方式調(diào)用子函數(shù)*/
                    printf(“In main after callingn”/*調(diào)用子函數(shù)后輸出變量值*/
                           “i=%-4d j=%-4d i*j=%-4dn”, i, j, i*j);
                    getch();
                    return 0;
               }
               void subfun(int *m, int *n)
               {
                    *m=*m+2;
                    *j=*i-*j;
                    printf(“In subfun after callingn” /*子函數(shù)中輸出變量值*/
                           “i=%-4d j=%-4d i*j=%-4dn”, *i, *j, *i**j);
                }

              上例中, *i**j表示指針i和j所指的兩個(gè)整型數(shù)*i和*j之乘積。
              另外, return語(yǔ)句也可以返回一個(gè)指針, 舉例如下。
              下例中先等待輸入一字符串, 再等待輸入要查找的字符, 然后調(diào)用match() 函
          數(shù)在字符串中查找該字符。若有相同字符, 則返回一個(gè)指向該字符串中這一位置的
          指針, 如果沒有找到, 則返回一個(gè)空(NULL)指針。
              例5:
               #include<stdio.h>
               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);                 /*鍵盤輸入字符串*/
                    printf(“Please input one character:”);
                    c=getche();              /*鍵盤輸入字符*/
                    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ù)都可見。
          這樣相當(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<stdio.h>
               void disp(void);
               int m[10];          /*定義全程變量*/
               int main()
               {
                    int i;
                    printf(“In main before callingn”);
                    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 callingn”);
                    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 callingn”);/*子函數(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<stdio.h>
                unsigned ling mul(int n);
                int main()
               {
                    int m;
                    puts(“Calculate n! n=?n”);
                    scanf(“%d”, &m);         /*鍵盤輸入數(shù)據(jù)*/
                    printf(“%d!=%ldn”, 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ǔ)句都不能訪問它。例如使用跳轉(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)再
          說明或定義另一個(gè)函數(shù)。
              Turbo C2.0中一個(gè)函數(shù)對(duì)其它子函數(shù)的調(diào)用是全程的, 即是函數(shù)在不同的文件
          中, 也不必附加任何說明語(yǔ)句而被另一函數(shù)調(diào)用, 也就是說一個(gè)函數(shù)對(duì)于整個(gè)程序
          都是可見的。

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

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)