亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        如何編寫有多個(gè)返回值的C語言函數(shù)

        2008-12-31 00:00:00吳紅梅
        計(jì)算機(jī)教育 2008年8期

        文章編號(hào):1672-5913(2008)08-0108-03

        摘要:本文從全局變量、數(shù)組指針、結(jié)構(gòu)體三種途徑深入探討了如何實(shí)現(xiàn)有多個(gè)返回值的C語言函數(shù)。

        關(guān)鍵詞:函數(shù);全局變量;數(shù)組;結(jié)構(gòu)體

        中圖分類號(hào):G642

        文獻(xiàn)標(biāo)識(shí)碼:B

        1引言

        筆者從事C語言教學(xué)多年,在教學(xué)中學(xué)生們常常會(huì)問到如何編寫具有多個(gè)返回值的C語言函數(shù)。編寫有多個(gè)返回值的函數(shù)是所有C語言教材里均沒有提到的知識(shí)點(diǎn),但在實(shí)際教學(xué)與應(yīng)用的過程中我們都有可能會(huì)遇到這樣的問題。有學(xué)生也嘗試了不少方法:如把多個(gè)需要返回的值作相應(yīng)的處理后變成一個(gè)可以用return語句返回的數(shù)據(jù),再在主調(diào)函數(shù)中拆開返回的數(shù)據(jù)使之變成幾個(gè)值;或者把需要返回多個(gè)值的一個(gè)函數(shù)分開幾個(gè)函數(shù)去實(shí)現(xiàn)多個(gè)值的返回。這些方法雖然最終都能實(shí)現(xiàn)返回要求的多個(gè)值,但從程序算法的合理性與最優(yōu)化方面去考慮,顯然不理想。我們知道C語言函數(shù)的返回值是通過函數(shù)中的return語句來實(shí)現(xiàn)的,可是每調(diào)用一次函數(shù),return語句只能返回一個(gè)值。那么當(dāng)我們希望從一個(gè)函數(shù)中返回多個(gè)值時(shí),用什么方法去實(shí)現(xiàn)比較合理呢?在教學(xué)過程中,我建議學(xué)生跳出對(duì)return語句的定勢(shì)思維,一步步引導(dǎo)學(xué)生通過幾種間接方式實(shí)現(xiàn)多個(gè)返回值的C語言函數(shù)。以下是筆者在教學(xué)過程中引導(dǎo)學(xué)生采用的三種不同方法編寫多個(gè)返回值的C語言函數(shù)。

        2方法1:利用全局變量

        分析:全局變量作為C語言的一個(gè)知識(shí)點(diǎn),雖然我們都了解它的特點(diǎn),但在實(shí)際教學(xué)過程中應(yīng)用得并不是很多。由于全局變量的作用域是從定義變量開始直到程序結(jié)束,而對(duì)于編寫有多個(gè)返回值的C語言函數(shù),我們可以考慮把要返回的多個(gè)值定義成全局變量。當(dāng)函數(shù)被調(diào)用時(shí),全局變量被更改,我們?cè)侔迅暮蟮娜肿兞恐祽?yīng)用于主調(diào)函數(shù)中。函數(shù)被調(diào)用后被更改后的全局變量值即為函數(shù)的數(shù)個(gè)返回值。下面以一個(gè)實(shí)例演示該方法的應(yīng)用。

        實(shí)例1:編寫函數(shù)求3個(gè)數(shù)中的最大值與最小值。

        方法:把最大值、最小值分別定義成2個(gè)全局變量max、min,在用戶自定義函數(shù)中把求出來的最大值與最小值分別賦給全局變量max、min。函數(shù)調(diào)用完畢后全局變量的max、min值即保存了函數(shù)要求返回的值。程序參考代碼如下:

        #include \"stdio.h\"

        #include \"conio.h\"

        int max,min;/*定義兩個(gè)全局變量用于保存函數(shù)返回值*/

        void max_min(int a,int b,int c) /*定義求最大最小值的函數(shù)*/

        {max=min=a; /*初始化最大最小值*/

        if(max

        if(max

        if(min>b)min=b;

        if(min>c)min=c;

        }

        main()

        {int x,y,z;

        printf(\" 請(qǐng)輸入3個(gè)整數(shù):\\");

        scanf(\"%d,%d,%d\",x,y,z);

        max_min(x,y,z) ;/*調(diào)用求最大值與最小值的函數(shù)*/

        printf(\"三個(gè)數(shù)中的最大值為:%d;最小值為:%d\",max,min);/*輸出最大值與最小值*/

        getch();

        }

        調(diào)試結(jié)果如下:

        請(qǐng)輸入3個(gè)整數(shù):

        5,-6,2

        三個(gè)數(shù)中的最大值為:5;最小值為:-6

        注意:該方法雖然可以實(shí)現(xiàn)有多個(gè)返回值的函數(shù),但由于全局變量不能保證值的正確性(因?yàn)槠渥饔糜蚴侨郑猿绦蚍秶鷥?nèi)都可以修改它的值,如果出現(xiàn)錯(cuò)誤將非常難以發(fā)現(xiàn)),并且全局變量增加了程序間模塊的耦合,所以該方法要慎用。

        3方法2:傳遞數(shù)組指針

        分析:在教學(xué)過程中,我們知道C語言函數(shù)參數(shù)的傳遞方式有值傳遞與地址傳遞。當(dāng)進(jìn)行值傳遞時(shí),主調(diào)函數(shù)把實(shí)參的值復(fù)制給形參,形參獲得從主調(diào)函數(shù)傳遞過來的值運(yùn)行函數(shù)。在值傳遞過程中被調(diào)函數(shù)參數(shù)值的更改不能導(dǎo)致實(shí)參值的更改。而如果是地址傳遞,由于傳遞過程中從實(shí)參傳遞過來的是地址,所以被調(diào)函數(shù)中形參值的更改會(huì)直接導(dǎo)致實(shí)參值的更改。因此,我們可以考慮把多個(gè)返回值作為數(shù)組元素定義成一個(gè)數(shù)組的形式,并使該數(shù)組的地址作為函數(shù)的形式參數(shù),以傳址方式傳遞數(shù)組參數(shù)。函數(shù)被調(diào)用后,形參數(shù)組元素改變導(dǎo)致實(shí)參改變,我們?cè)購母淖兒蟮膶?shí)參數(shù)組元素中獲得函數(shù)的多個(gè)返回值。以下實(shí)例演示該方法的應(yīng)用。

        實(shí)例2:編寫函數(shù)求一維整形數(shù)組的最大值與最小值,并把最大值與最小值返回給主調(diào)函數(shù)。

        方法:以指針方式傳遞該一維數(shù)組的地址,然后把數(shù)組的最大值與數(shù)組的第一個(gè)元素交換,把數(shù)組的最小值與最后一個(gè)元素交換。函數(shù)被調(diào)用完畢后,實(shí)參數(shù)組中的第一元素為數(shù)組的最大值,實(shí)參數(shù)組中最后一個(gè)元素為數(shù)組的最小值,從而實(shí)現(xiàn)返回?cái)?shù)組的最大值與最小值的功能。程序參考代碼如下:

        #include \"stdio.h\"

        #include \"conio.h\"

        void max_min(int *ptr,int n) /*定義求數(shù)組最大值最小值的函數(shù),傳遞數(shù)組指針*/

        {int i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/

        int *temp;/*用于交換位置*/

        *temp=*ptr;

        for(i=0;i

        {

        if(*ptr<*(ptr+i))/*最大值與第一個(gè)元素進(jìn)行交換*/

        {

        k=i;

        *temp=*ptr;

        *ptr=*(ptr+k);

        *(ptr+k)=*temp ;

        }

        if(*(ptr+n-1)>*(ptr+i))/*最小值與最后一個(gè)元素進(jìn)行交換*/

        {

        j=i;

        *temp =*(ptr+n-1);

        *(ptr+n-1)=*(ptr+j);

        *(ptr+j)= *temp ;}

        }

        }

        /*調(diào)用最大最小值函數(shù)*/

        main()

        {

        int A[6],i;

        for(i=0;i<6;i++)

        scanf(\"%d\",A[i]);

        max_min(A,6);

        printf(\"max=%d, min=%d\ \\",A[0],A[5]);

        getch();

        }

        調(diào)試結(jié)果如下:

        請(qǐng)輸入6個(gè)整形數(shù),以空格隔開:

        5 8 9 32 -6 4

        max=32,min=-6

        注意:該方法適用于多個(gè)返回值的數(shù)據(jù)類型一致的情況。當(dāng)返回值數(shù)據(jù)類型不一致時(shí),不適用該方法。

        4方法3:傳遞結(jié)構(gòu)體指針

        分析:結(jié)構(gòu)體作為教學(xué)中的一個(gè)難點(diǎn),教材對(duì)它介紹的內(nèi)容并不多,應(yīng)用的實(shí)例更是少之又少,所以學(xué)生對(duì)于結(jié)構(gòu)體普遍掌握情況不理想。其實(shí),編寫返回多個(gè)值的C語言函數(shù),也可以考慮采用結(jié)構(gòu)體的方式去實(shí)現(xiàn)。通過方法2,我們知道如果返回的數(shù)個(gè)數(shù)值的數(shù)據(jù)類型不一致,可以通過定義全局變量實(shí)現(xiàn)有多個(gè)返回值的C語言函數(shù),也可以考慮把要求返回的數(shù)個(gè)值定義成一個(gè)結(jié)構(gòu)體,然后同樣以傳遞結(jié)構(gòu)體指針方式把結(jié)構(gòu)體的指針傳遞給形參結(jié)構(gòu)體指針,那么函數(shù)中對(duì)形參結(jié)構(gòu)體的修改即是對(duì)實(shí)參結(jié)構(gòu)體的修改,函數(shù)被調(diào)用后獲取的實(shí)參結(jié)構(gòu)體成員即為函數(shù)的多個(gè)返回值,下面以實(shí)例演示該方法的應(yīng)用。

        實(shí)例3:編寫一個(gè)用戶自定義函數(shù),允許用戶錄入學(xué)生的基本信息(包括學(xué)號(hào)、姓名、所屬班級(jí)、總評(píng)成績(jī)),并返回這些基本信息給主調(diào)函數(shù)。

        方法:把學(xué)生基本信息定義成一個(gè)結(jié)構(gòu)體,在用戶自定義函數(shù)中傳遞該結(jié)構(gòu)體的指針,則自定義函數(shù)中對(duì)結(jié)構(gòu)體成員的錄入操作即是對(duì)實(shí)參結(jié)構(gòu)體成員的錄入操作,從而實(shí)現(xiàn)多個(gè)返回值。參考代碼如下:

        #include \"stdio.h\"

        #include \"conio.h\"

        struct inf{/*定義學(xué)生結(jié)構(gòu)體,分別包含成員學(xué)號(hào)、姓名、班別、總評(píng)成績(jī)*/

        char xh[12];

        char name[20];

        char class[15];

        int chj;

        };

        main(void)

        {

        struct inf a1; /*定義學(xué)生結(jié)構(gòu)體類型變量*/

        void xxxx(struct inf *ptr);

        printf(\"請(qǐng)輸入學(xué)號(hào),姓名,班別,總評(píng)成績(jī),以空格隔開:\\") ;

        xxxx(a1);/*調(diào)用函數(shù),以學(xué)生結(jié)構(gòu)體類型變量地址作為實(shí)參*/

        printf(\"學(xué)號(hào):%s,姓名: %s,班別:%s,總評(píng)成績(jī):%d\",a1.xh, a1.name,a1.class,a1.chj);

        getch();

        }

        void xxxx(struct inf *ptr)/*該函數(shù)實(shí)現(xiàn)對(duì)結(jié)構(gòu)體成員數(shù)據(jù)的錄入操作*/

        {

        char xh1[12],name1[20],class1[15];

        int chj1;

        scanf(\"%s%s%s%d\",xh1,name1,class1,chj1);

        strcpy(ptr->xh,xh1);

        strcpy(ptr->name,name1);

        strcpy(ptr->class,class1);

        ptr->chj=chj1;

        }

        調(diào)試結(jié)果如下:

        請(qǐng)輸入學(xué)號(hào),姓名,班別,總評(píng)成績(jī),以空格隔開:

        200102LiLi200185

        學(xué)號(hào):200102,姓名: LiLi,班別:2001,總評(píng)成績(jī):85

        注意:當(dāng)函數(shù)要求返回的多個(gè)值是相互聯(lián)系的或者返回的多個(gè)值數(shù)據(jù)類型不一致時(shí)可以采用該方法。

        5結(jié)束語

        對(duì)于以上這三種方法,如果想要返回的數(shù)個(gè)值數(shù)據(jù)類型一致,可以考慮采用方法2;而對(duì)于不同數(shù)據(jù)類型的返回值,如果各個(gè)數(shù)值之間是相互聯(lián)系的,則方法3較為合適;方法1雖然在很多情況下都可以實(shí)現(xiàn)多個(gè)返回值的C語言函數(shù),但畢竟全局變量應(yīng)用過程中有很多危險(xiǎn),要慎重使用。

        通過對(duì)以上幾種方法的分析講解,在教學(xué)過程中,學(xué)生再遇到這樣的問題時(shí),就能根據(jù)返回值的情況選擇合適的途徑去實(shí)現(xiàn)多個(gè)返回值的C語言函數(shù)。另外,如果再遇到類似的無法用教材知識(shí)點(diǎn)去直接解決的問題時(shí),他們基本都能舉一反三地嘗試采用間接方式去解決。

        參考文獻(xiàn)

        [1] 譚浩強(qiáng). C程序設(shè)計(jì)(第二版)[M]. 北京:清華大學(xué)出版社,1999.

        [2] 薛萬鵬譯. C程序設(shè)計(jì)教程[M]. 北京:機(jī)械工業(yè)出版社,2000.

        [3] 鄧勁生譯. Visual C++程序員實(shí)用大全[M]. 北京:中國水利水電出版社,2005.

        又爽又黄无遮挡高潮视频网站| 在线天堂www中文| 又色又爽又黄又硬的视频免费观看 | 色偷偷av男人的天堂| 手机看片福利日韩| 亚洲精品视频免费在线| 国产性虐视频在线观看| 国产av无码专区亚洲av蜜芽| 日韩AV不卡一区二区三区无码| 国产视频精品一区白白色| 男女激情视频网站在线| 亚洲av日韩aⅴ无码色老头| 亚洲中文字幕无码中字| 国产精品日韩中文字幕| 91日韩东京热中文字幕| 日日婷婷夜日日天干| 亚洲日韩一区二区一无码| 亚洲中文久久精品无码ww16| 亚洲国产日韩欧美高清片a| 在线观看的a站免费完整版| 欧美性猛交xxxx免费看蜜桃| 中文字幕亚洲乱码熟女一区二区| 欧美一级鲁丝片免费一区| 国产av一区二区毛片| 亚洲精品宾馆在线精品酒店| 亚洲aⅴ在线无码播放毛片一线天| 国产熟女亚洲精品麻豆| 国产一区二区三区在线影院| 国产69久久精品成人看| 少妇内射高潮福利炮| 国产午夜精品一区二区三区不| 久久夜色精品亚洲天堂| 亚洲国产精品久久婷婷| 国产精品天干天干综合网| 亚洲av无码一区二区三区性色| 天堂Av无码Av一区二区三区| 久久热免费最新精品视频网站| 中文字幕日韩人妻不卡一区| 国产真实乱人偷精品人妻| 欧美日韩国产成人综合在线影院| 国产偷闻女邻居av在线观看|