導語:編寫有多個返回值的函數(shù)是所有C語言教材里均沒有提到的知識點,但在實際教學與應用的過程中我們都有可能會遇到這樣的問題。以下是引導學生采用的三種不同方法編寫多個返回值的C語言函數(shù),一起來學習下吧:
創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)營銷推廣、網(wǎng)站重做改版、平果網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、成都h5網(wǎng)站建設、商城網(wǎng)站建設、集團公司官網(wǎng)建設、外貿網(wǎng)站制作、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為平果等各大城市提供網(wǎng)站開發(fā)制作服務。
方法1:利用全局變量
分析:全局變量作為C語言的一個知識點,雖然我們都了解它的特點,但在實際教學過程中應用得并不是很多。由于全局變量的作用域是從定義變量開始直到程序結束,而對于編寫有多個返回值的C語言函數(shù),我們可以考慮把要返回的多個值定義成全局變量。當函數(shù)被調用時,全局變量被更改,我們再把更改后的全局變量值應用于主調函數(shù)中。函數(shù)被調用后被更改后的全局變量值即為函數(shù)的數(shù)個返回值。下面以一個實例演示該方法的應用。
實例1:編寫函數(shù)求3個數(shù)中的最大值與最小值。
方法:把最大值、最小值分別定義成2個全局變量max、min,在用戶自定義函數(shù)中把求出來的最大值與最小值分別賦給全局變量max、min。函數(shù)調用完畢后全局變量的max、min值即保存了函數(shù)要求返回的值。程序參考代碼如下:
#include "stdio.h"
#include "conio.h"
int max,min;/*定義兩個全局變量用于保存函數(shù)返回值*/
void max_min(int a,int b,int c) /*定義求最大最小值的函數(shù)*/
{max=min=a; /*初始化最大最小值*/
if(max if(max if(minb)min=b;
if(minc)min=c;
}
main()
{int x,y,z;
printf(" 請輸入3個整數(shù): ");
scanf("%d,%d,%d",x,y,z);
max_min(x,y,z) ;/*調用求最大值與最小值的函數(shù)*/
printf("三個數(shù)中的最大值為:%d;最小值為:%d",max,min);/*輸出最大值與最小值*/
getch();
}
調試結果如下:
請輸入3個整數(shù):
5,-6,2
三個數(shù)中的最大值為:5;最小值為:-6
注意:該方法雖然可以實現(xiàn)有多個返回值的函數(shù),但由于全局變量不能保證值的正確性(因為其作用域是全局,所以程序范圍內都可以修改它的值,如果出現(xiàn)錯誤將非常難以發(fā)現(xiàn)),并且全局變量增加了程序間模塊的耦合,所以該方法要慎用。
方法2:傳遞數(shù)組指針
分析:在教學過程中,我們知道C語言函數(shù)參數(shù)的傳遞方式有值傳遞與地址傳遞。當進行值傳遞時,主調函數(shù)把實參的值復制給形參,形參獲得從主調函數(shù)傳遞過來的值運行函數(shù)。在值傳遞過程中被調函數(shù)參數(shù)值的更改不能導致實參值的更改。而如果是地址傳遞,由于傳遞過程中從實參傳遞過來的是地址,所以被調函數(shù)中形參值的更改會直接導致實參值的更改。因此,我們可以考慮把多個返回值作為數(shù)組元素定義成一個數(shù)組的形式,并使該數(shù)組的地址作為函數(shù)的形式參數(shù),以傳址方式傳遞數(shù)組參數(shù)。函數(shù)被調用后,形參數(shù)組元素改變導致實參改變,我們再從改變后的實參數(shù)組元素中獲得函數(shù)的多個返回值。以下實例演示該方法的應用。
實例2:編寫函數(shù)求一維整形數(shù)組的最大值與最小值,并把最大值與最小值返回給主調函數(shù)。
方法:以指針方式傳遞該一維數(shù)組的地址,然后把數(shù)組的最大值與數(shù)組的'第一個元素交換,把數(shù)組的最小值與最后一個元素交換。函數(shù)被調用完畢后,實參數(shù)組中的第一元素為數(shù)組的最大值,實參數(shù)組中最后一個元素為數(shù)組的最小值,從而實現(xiàn)返回數(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))/*最大值與第一個元素進行交換*/
{
k=i;
*temp=*ptr;
*ptr=*(ptr+k);
*(ptr+k)=*temp ;
}
if(*(ptr+n-1)*(ptr+i))/*最小值與最后一個元素進行交換*/
{
j=i;
*temp =*(ptr+n-1);
*(ptr+n-1)=*(ptr+j);
*(ptr+j)= *temp ;}
}
}
/*調用最大最小值函數(shù)*/
main()
{
int A[6],i;
for(i=0;i6;i++)
scanf("%d",A[i]);
max_min(A,6);
printf("max=%d, min=%d ",A[0],A[5]);
getch();
}
調試結果如下:
請輸入6個整形數(shù),以空格隔開:
5 8 9 32 -6 4
max=32,min=-6
注意:該方法適用于多個返回值的數(shù)據(jù)類型一致的情況。當返回值數(shù)據(jù)類型不一致時,不適用該方法。
方法3:傳遞結構體指針
分析:結構體作為教學中的一個難點,教材對它介紹的內容并不多,應用的實例更是少之又少,所以學生對于結構體普遍掌握情況不理想。其實,編寫返回多個值的C語言函數(shù),也可以考慮采用結構體的方式去實現(xiàn)。通過方法2,我們知道如果返回的數(shù)個數(shù)值的數(shù)據(jù)類型不一致,可以通過定義全局變量實現(xiàn)有多個返回值的C語言函數(shù),也可以考慮把要求返回的數(shù)個值定義成一個結構體,然后同樣以傳遞結構體指針方式把結構體的指針傳遞給形參結構體指針,那么函數(shù)中對形參結構體的修改即是對實參結構體的修改,函數(shù)被調用后獲取的實參結構體成員即為函數(shù)的多個返回值,下面以實例演示該方法的應用。
實例3:編寫一個用戶自定義函數(shù),允許用戶錄入學生的基本信息(包括學號、姓名、所屬班級、總評成績),并返回這些基本信息給主調函數(shù)。
方法:把學生基本信息定義成一個結構體,在用戶自定義函數(shù)中傳遞該結構體的指針,則自定義函數(shù)中對結構體成員的錄入操作即是對實參結構體成員的錄入操作,從而實現(xiàn)多個返回值。參考代碼如下:
#include "stdio.h"
#include "conio.h"
struct inf{/*定義學生結構體,分別包含成員學號、姓名、班別、總評成績*/
char xh[12];
char name[20];
char class[15];
int chj;
};
main(void)
{
struct inf a1; /*定義學生結構體類型變量*/
void xxxx(struct inf *ptr);
printf("請輸入學號,姓名,班別,總評成績,以空格隔開: ") ;
xxxx(a1);/*調用函數(shù),以學生結構體類型變量地址作為實參*/
printf("學號:%s,姓名: %s,班別:%s,總評成績:%d",a1.xh, a1.name,a1.class,a1.chj);
getch();
}
void xxxx(struct inf *ptr)/*該函數(shù)實現(xiàn)對結構體成員數(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;
}
調試結果如下:
請輸入學號,姓名,班別,總評成績,以空格隔開:
200102LiLi200185
學號:200102,姓名: LiLi,班別:2001,總評成績:85
注意:當函數(shù)要求返回的多個值是相互聯(lián)系的或者返回的多個值數(shù)據(jù)類型不一致時可以采用該方法。
總結
對于以上這三種方法,如果想要返回的數(shù)個值數(shù)據(jù)類型一致,可以考慮采用方法2;而對于不同數(shù)據(jù)類型的返回值,如果各個數(shù)值之間是相互聯(lián)系的,則方法3較為合適;方法1雖然在很多情況下都可以實現(xiàn)多個返回值的C語言函數(shù),但畢竟全局變量應用過程中有很多危險,要慎重使用。
在C語言中,一般情況下函數(shù)的返回值是通過函數(shù)中的return語句來實現(xiàn)的,每調用一次return語句只能從函數(shù)中返回一個值,下面我們就來看看C語言怎么讓一個函數(shù)返回多個值!
工具/材料
C語言的編輯器
01
全局變量傳遞
這種方式算是最不科學的規(guī)范,打破了軟件開發(fā)需要的閉環(huán)策略,但在基本語法上是支持的,C語言里面最好少涉獵全局變量,使用出錯的風險會提升很多,真要想使用建議還是用靜態(tài)全局變量直接在變量的前面加上static修飾符。
02
使用數(shù)組名或指針作為函數(shù)的形參
被調函數(shù)的行參是一個指針,然后在被調函數(shù)中返回第一個值,被調函數(shù)改變指針參數(shù)指向的值,這樣主調函數(shù)相應的值就改變了,也就相當于返回了第二個值了。這樣就可以實現(xiàn)返回多個值!
03
結構體指針返回
結構體是C語言涉及數(shù)據(jù)結構的最直接的容器,通常在編程過程中實現(xiàn)一個功能模塊在主函數(shù)里,我們可以定義一個結構體類型的變量,然后直接用函數(shù)返回值賦值就可以了。
c語言函數(shù)只能最多有一個返回值。我們以一個數(shù)據(jù)運算函數(shù)作為實例講解:
使用指針返回額外數(shù)據(jù):定義指針參數(shù),將結果通過指針返回。
如果有很多類型相同的數(shù)據(jù),如何返回數(shù)組呢?c語言也只能借助指針返回數(shù)組。
使用結構體返回:如果返回多個數(shù)據(jù),并且各個數(shù)據(jù)類型都不相同。那么只能通過結構體返回。
使用結構體指針返回:直接返回結構體,程序執(zhí)行效率會受到影響。因為需要復制結構體數(shù)據(jù),如果結構體數(shù)據(jù)比較大,復制操作會損耗程序性能。
通過使用結構體指針,我們也可以返回多個數(shù)據(jù)結果。
在c++中,除了使用指針,通常使用引用返回多個數(shù)據(jù)。與指針相比,使用引用時不用擔心函數(shù)調用者傳入不符合預期的指針。
在C語言中,一般情況下函數(shù)的返回值是通過函數(shù)中的return語句來實現(xiàn)的,每調用一次return語句只能從函數(shù)中返回一個值。但在實際很多應用中,我們需要從函數(shù)中返回多個值,那我們可以用什么方法實現(xiàn)呢?此時我們可以用三種方法來實現(xiàn)。
方法一:設置全局變量
全局變量是在函數(shù)外部定義的全局變量,它不屬于任何一個函數(shù),其作用域是從變量的定義處開始,到本程序文件的結尾。在此作用域內,全局變量可為各個函數(shù)所引用。當我們需要函數(shù)返回多個值時,除了函數(shù)體中的return語句返回其中一個之外,其它的返回值我們可以通過定義全局變量來處理。因為根據(jù)全局變量的特點,在被調用函數(shù)中改變了多個全局變量和值,相當于其主調函數(shù)全局變量的值也發(fā)生了變化,也就相當于返回了多個值。
例如:利用一個函數(shù)求出正方形的周長和面積。
#include
double l=0;//定義全局變量l為正方形周長
void f(double a)//定義求面積和周長的函數(shù)
{ double s; s=a*a;//求面積
l=6*a;//求周長,并賦給全局變量l
return s;//僅返回面積的值
}
void main()
{ double a,area;
printf(“請輸入邊長:");
scanf("%f",a);
area=f(a);//面積的值通過調用f函數(shù)返回值
printf(“面積為:%5.2lf\n”,area);
printf(“周長為:%5.2lf\n”,l);//周長即為全局變量l在f函數(shù)中改變后的值
}
上面的例子即用全局變量實現(xiàn)了函數(shù)中返回多值的情況,這種方式易懂。但是全局變量用多了會破壞代碼的安全性,結構性,這主要是全局變量在所有函數(shù)中都可以使用,從而其值的變化不確定,所以我們要慎用。
方法二:使用數(shù)組名或指針作為函數(shù)的形參
數(shù)組名或者指針實際為地址,而數(shù)組一般都包括多個元素,指針也可以指向一組數(shù)據(jù)的著地址,把數(shù)組名或者指針作為函數(shù)形參,實際上相當于主調函數(shù)的實參與形參共用地址,所以在函數(shù)中的數(shù)組元素發(fā)生改變即是實參也隨之改變。也相當于在調用函數(shù)時多個值返回給主調函數(shù)。
實例2:編寫函數(shù)求一維整形數(shù)組的最大值與最小值,并把最大值與最小值返回給主調函數(shù)。
方法:以指針方式傳遞該一維數(shù)組的地址,然后把數(shù)組的最大值與數(shù)組的第一個元素交換,把數(shù)組的最小值與最后一個元素交換。函數(shù)被調用完畢后,實參數(shù)組中的第一元素為數(shù)組的最大值,實參數(shù)組中最后一個元素為數(shù)組的最小值,從而實現(xiàn)返回數(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))/*最大值與第一個元素進行交換*/
{
k=i;
*temp=*ptr;
*ptr=*(ptr+k);
*(ptr+k)=*temp ;
}
if(*(ptr+n-1)*(ptr+i))/*最小值與最后一個元素進行交換*/
{
j=i;
*temp =*(ptr+n-1);
*(ptr+n-1)=*(ptr+j);
*(ptr+j)= *temp ;}
}
}
/*調用最大最小值函數(shù)*/
main()
{
int A[6],i;
for(i=0;i6;i++)
scanf("%d",A[i]);
max_min(A,6);
printf("max=%d, min=%d\n \n",A[0],A[5]);
getch();
}
調試結果如下:
請輸入6個整形數(shù),以空格隔開:
5 8 9 32 -6 4
max=32,min=-6
注意:該方法適用于多個返回值的數(shù)據(jù)類型一致的情況。當返回值數(shù)據(jù)類型不一致時,不適用該方法。
方法三:使用結構體指針作為函數(shù)的形參
編寫返回多個值的C語言函數(shù),可以考慮采用結構體的方式去實現(xiàn)。如果返回的數(shù)個數(shù)值的數(shù)據(jù)類型不一致,可以通過定義全局變量實現(xiàn)有多個返回值的C語言函數(shù),也可以考慮把要求返回的數(shù)個值定義成一個結構體,然后同樣以傳遞結構體指針方式把結構體的指針傳遞給形參結構體指針,那么函數(shù)中對形參結構體的修改即是對實參結構體的修改,函數(shù)被調用后獲取的實參結構體成員即為函數(shù)的多個返回值,下面以實例演示該方法的應用。
實例3:編寫一個用戶自定義函數(shù),允許用戶錄入學生的基本信息(包括學號、姓名、所屬班級、總評成績),并返回這些基本信息給主調函數(shù)。
方法:把學生基本信息定義成一個結構體,在用戶自定義函數(shù)中傳遞該結構體的指針,則自定義函數(shù)中對結構體成員的錄入操作即是對實參結構體成員的錄入操作,從而實現(xiàn)多個返回值。參考代碼如下:
#include "stdio.h"
#include "conio.h"
struct inf{/*定義學生結構體,分別包含成員學號、姓名、班別、總評成績*/
char xh[12];
char name[20];
char class[15];
int chj;
};
main(void)
{
struct inf a1; /*定義學生結構體類型變量*/
void xxxx(struct inf *ptr);
printf("請輸入學號,姓名,班別,總評成績,以空格隔開:\n") ;
xxxx(a1);/*調用函數(shù),以學生結構體類型變量地址作為實參*/
printf("學號:%s,姓名: %s,班別:%s,總評成績:%d",a1.xh, a1.name,a1.class,a1.chj);
getch();
}
void xxxx(struct inf *ptr)/*該函數(shù)實現(xiàn)對結構體成員數(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;
}
調試結果如下:
請輸入學號,姓名,班別,總評成績,以空格隔開:
200102LiLi200185
學號:200102,姓名: LiLi,班別:2001,總評成績:85
注意:當函數(shù)要求返回的多個值是相互聯(lián)系的或者返回的多個值數(shù)據(jù)類型不一致時可以采用該方法。
結束語
對于以上這三種方法,如果想要返回的數(shù)個值數(shù)據(jù)類型一致,可以考慮采用方法2;而對于不同數(shù)據(jù)類型的返回值,如果各個數(shù)值之間是相互聯(lián)系的,則方法3較為合適;方法1雖然在很多情況下都可以實現(xiàn)多個返回值的C語言函數(shù),但畢竟全局變量應用過程中有很多危險,要慎重使用。
通過對以上幾種方法的分析講解,在教學過程中,學生再遇到這樣的問題時,就能根據(jù)返回值的情況選擇合適的途徑去實現(xiàn)多個返回值的C語言函數(shù)。另外,如果再遇到類似的無法用教材知識點去直接解決的問題時,他們基本都能舉一反三地嘗試采用間接方式去解決。
參考材料:
文章題目:c語言如何函數(shù)返回多個值,c語言函數(shù)能返回多個值嗎
網(wǎng)站路徑:http://m.newbst.com/article40/phhieo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供關鍵詞優(yōu)化、移動網(wǎng)站建設、網(wǎng)站收錄、品牌網(wǎng)站設計、小程序開發(fā)、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)