在C語(yǔ)言中,一般情況下函數(shù)的返回值是通過(guò)函數(shù)中的return語(yǔ)句來(lái)實(shí)現(xiàn)的,每調(diào)用一次return語(yǔ)句只能從函數(shù)中返回一個(gè)值。但在實(shí)際很多應(yīng)用中,我們需要從函數(shù)中返回多個(gè)值,那我們可以用什么方法實(shí)現(xiàn)呢?此時(shí)我們可以用三種方法來(lái)實(shí)現(xiàn)。
創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供湯原企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都網(wǎng)站制作、網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為湯原眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
方法一:設(shè)置全局變量
全局變量是在函數(shù)外部定義的全局變量,它不屬于任何一個(gè)函數(shù),其作用域是從變量的定義處開(kāi)始,到本程序文件的結(jié)尾。在此作用域內(nèi),全局變量可為各個(gè)函數(shù)所引用。當(dāng)我們需要函數(shù)返回多個(gè)值時(shí),除了函數(shù)體中的return語(yǔ)句返回其中一個(gè)之外,其它的返回值我們可以通過(guò)定義全局變量來(lái)處理。因?yàn)楦鶕?jù)全局變量的特點(diǎn),在被調(diào)用函數(shù)中改變了多個(gè)全局變量和值,相當(dāng)于其主調(diào)函數(shù)全局變量的值也發(fā)生了變化,也就相當(dāng)于返回了多個(gè)值。
例如:利用一個(gè)函數(shù)求出正方形的周長(zhǎng)和面積。
#include
double l=0;//定義全局變量l為正方形周長(zhǎng)
void f(double a)//定義求面積和周長(zhǎng)的函數(shù)
{ double s; s=a*a;//求面積
l=6*a;//求周長(zhǎng),并賦給全局變量l
return s;//僅返回面積的值
}
void main()
{ double a,area;
printf(“請(qǐng)輸入邊長(zhǎng):");
scanf("%f",a);
area=f(a);//面積的值通過(guò)調(diào)用f函數(shù)返回值
printf(“面積為:%5.2lf\n”,area);
printf(“周長(zhǎng)為:%5.2lf\n”,l);//周長(zhǎng)即為全局變量l在f函數(shù)中改變后的值
}
上面的例子即用全局變量實(shí)現(xiàn)了函數(shù)中返回多值的情況,這種方式易懂。但是全局變量用多了會(huì)破壞代碼的安全性,結(jié)構(gòu)性,這主要是全局變量在所有函數(shù)中都可以使用,從而其值的變化不確定,所以我們要慎用。
方法二:使用數(shù)組名或指針作為函數(shù)的形參
數(shù)組名或者指針實(shí)際為地址,而數(shù)組一般都包括多個(gè)元素,指針也可以指向一組數(shù)據(jù)的著地址,把數(shù)組名或者指針作為函數(shù)形參,實(shí)際上相當(dāng)于主調(diào)函數(shù)的實(shí)參與形參共用地址,所以在函數(shù)中的數(shù)組元素發(fā)生改變即是實(shí)參也隨之改變。也相當(dāng)于在調(diào)用函數(shù)時(shí)多個(gè)值返回給主調(diào)函數(shù)。
實(shí)例2:編寫(xiě)函數(shù)求一維整形數(shù)組的最大值與最小值,并把最大值與最小值返回給主調(diào)函數(shù)。
方法:以指針?lè)绞絺鬟f該一維數(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;i6;i++)
scanf("%d",A[i]);
max_min(A,6);
printf("max=%d, min=%d\n \n",A[0],A[5]);
getch();
}
調(diào)試結(jié)果如下:
請(qǐng)輸入6個(gè)整形數(shù),以空格隔開(kāi):
5 8 9 32 -6 4
max=32,min=-6
注意:該方法適用于多個(gè)返回值的數(shù)據(jù)類(lèi)型一致的情況。當(dāng)返回值數(shù)據(jù)類(lèi)型不一致時(shí),不適用該方法。
方法三:使用結(jié)構(gòu)體指針作為函數(shù)的形參
編寫(xiě)返回多個(gè)值的C語(yǔ)言函數(shù),可以考慮采用結(jié)構(gòu)體的方式去實(shí)現(xiàn)。如果返回的數(shù)個(gè)數(shù)值的數(shù)據(jù)類(lèi)型不一致,可以通過(guò)定義全局變量實(shí)現(xiàn)有多個(gè)返回值的C語(yǔ)言函數(shù),也可以考慮把要求返回的數(shù)個(gè)值定義成一個(gè)結(jié)構(gòu)體,然后同樣以傳遞結(jié)構(gòu)體指針?lè)绞桨呀Y(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:編寫(xiě)一個(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)體類(lèi)型變量*/
void xxxx(struct inf *ptr);
printf("請(qǐng)輸入學(xué)號(hào),姓名,班別,總評(píng)成績(jī),以空格隔開(kāi):\n") ;
xxxx(a1);/*調(diào)用函數(shù),以學(xué)生結(jié)構(gòu)體類(lèi)型變量地址作為實(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ī),以空格隔開(kāi):
200102LiLi200185
學(xué)號(hào):200102,姓名: LiLi,班別:2001,總評(píng)成績(jī):85
注意:當(dāng)函數(shù)要求返回的多個(gè)值是相互聯(lián)系的或者返回的多個(gè)值數(shù)據(jù)類(lèi)型不一致時(shí)可以采用該方法。
結(jié)束語(yǔ)
對(duì)于以上這三種方法,如果想要返回的數(shù)個(gè)值數(shù)據(jù)類(lèi)型一致,可以考慮采用方法2;而對(duì)于不同數(shù)據(jù)類(lèi)型的返回值,如果各個(gè)數(shù)值之間是相互聯(lián)系的,則方法3較為合適;方法1雖然在很多情況下都可以實(shí)現(xiàn)多個(gè)返回值的C語(yǔ)言函數(shù),但畢竟全局變量應(yīng)用過(guò)程中有很多危險(xiǎn),要慎重使用。
通過(guò)對(duì)以上幾種方法的分析講解,在教學(xué)過(guò)程中,學(xué)生再遇到這樣的問(wèn)題時(shí),就能根據(jù)返回值的情況選擇合適的途徑去實(shí)現(xiàn)多個(gè)返回值的C語(yǔ)言函數(shù)。另外,如果再遇到類(lèi)似的無(wú)法用教材知識(shí)點(diǎn)去直接解決的問(wèn)題時(shí),他們基本都能舉一反三地嘗試采用間接方式去解決。
參考材料:
導(dǎo)語(yǔ):編寫(xiě)有多個(gè)返回值的函數(shù)是所有C語(yǔ)言教材里均沒(méi)有提到的知識(shí)點(diǎn),但在實(shí)際教學(xué)與應(yīng)用的過(guò)程中我們都有可能會(huì)遇到這樣的問(wèn)題。以下是引導(dǎo)學(xué)生采用的三種不同方法編寫(xiě)多個(gè)返回值的C語(yǔ)言函數(shù),一起來(lái)學(xué)習(xí)下吧:
方法1:利用全局變量
分析:全局變量作為C語(yǔ)言的一個(gè)知識(shí)點(diǎn),雖然我們都了解它的特點(diǎn),但在實(shí)際教學(xué)過(guò)程中應(yīng)用得并不是很多。由于全局變量的作用域是從定義變量開(kāi)始直到程序結(jié)束,而對(duì)于編寫(xiě)有多個(gè)返回值的C語(yǔ)言函數(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:編寫(xiě)函數(shù)求3個(gè)數(shù)中的最大值與最小值。
方法:把最大值、最小值分別定義成2個(gè)全局變量max、min,在用戶自定義函數(shù)中把求出來(lái)的最大值與最小值分別賦給全局變量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(minb)min=b;
if(minc)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)),并且全局變量增加了程序間模塊的耦合,所以該方法要慎用。
方法2:傳遞數(shù)組指針
分析:在教學(xué)過(guò)程中,我們知道C語(yǔ)言函數(shù)參數(shù)的傳遞方式有值傳遞與地址傳遞。當(dāng)進(jìn)行值傳遞時(shí),主調(diào)函數(shù)把實(shí)參的值復(fù)制給形參,形參獲得從主調(diào)函數(shù)傳遞過(guò)來(lái)的值運(yùn)行函數(shù)。在值傳遞過(guò)程中被調(diào)函數(shù)參數(shù)值的更改不能導(dǎo)致實(shí)參值的更改。而如果是地址傳遞,由于傳遞過(guò)程中從實(shí)參傳遞過(guò)來(lái)的是地址,所以被調(diào)函數(shù)中形參值的更改會(huì)直接導(dǎo)致實(shí)參值的更改。因此,我們可以考慮把多個(gè)返回值作為數(shù)組元素定義成一個(gè)數(shù)組的形式,并使該數(shù)組的地址作為函數(shù)的形式參數(shù),以傳址方式傳遞數(shù)組參數(shù)。函數(shù)被調(diào)用后,形參數(shù)組元素改變導(dǎo)致實(shí)參改變,我們?cè)購(gòu)母淖兒蟮膶?shí)參數(shù)組元素中獲得函數(shù)的多個(gè)返回值。以下實(shí)例演示該方法的應(yīng)用。
實(shí)例2:編寫(xiě)函數(shù)求一維整形數(shù)組的最大值與最小值,并把最大值與最小值返回給主調(diào)函數(shù)。
方法:以指針?lè)绞絺鬟f該一維數(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;i6;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ù),以空格隔開(kāi):
5 8 9 32 -6 4
max=32,min=-6
注意:該方法適用于多個(gè)返回值的數(shù)據(jù)類(lèi)型一致的情況。當(dāng)返回值數(shù)據(jù)類(lèi)型不一致時(shí),不適用該方法。
方法3:傳遞結(jié)構(gòu)體指針
分析:結(jié)構(gòu)體作為教學(xué)中的一個(gè)難點(diǎn),教材對(duì)它介紹的內(nèi)容并不多,應(yīng)用的實(shí)例更是少之又少,所以學(xué)生對(duì)于結(jié)構(gòu)體普遍掌握情況不理想。其實(shí),編寫(xiě)返回多個(gè)值的C語(yǔ)言函數(shù),也可以考慮采用結(jié)構(gòu)體的方式去實(shí)現(xiàn)。通過(guò)方法2,我們知道如果返回的數(shù)個(gè)數(shù)值的數(shù)據(jù)類(lèi)型不一致,可以通過(guò)定義全局變量實(shí)現(xiàn)有多個(gè)返回值的C語(yǔ)言函數(shù),也可以考慮把要求返回的數(shù)個(gè)值定義成一個(gè)結(jié)構(gòu)體,然后同樣以傳遞結(jié)構(gòu)體指針?lè)绞桨呀Y(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:編寫(xiě)一個(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)體類(lèi)型變量*/
void xxxx(struct inf *ptr);
printf("請(qǐng)輸入學(xué)號(hào),姓名,班別,總評(píng)成績(jī),以空格隔開(kāi): ") ;
xxxx(a1);/*調(diào)用函數(shù),以學(xué)生結(jié)構(gòu)體類(lèi)型變量地址作為實(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ī),以空格隔開(kāi):
200102LiLi200185
學(xué)號(hào):200102,姓名: LiLi,班別:2001,總評(píng)成績(jī):85
注意:當(dāng)函數(shù)要求返回的多個(gè)值是相互聯(lián)系的或者返回的多個(gè)值數(shù)據(jù)類(lèi)型不一致時(shí)可以采用該方法。
總結(jié)
對(duì)于以上這三種方法,如果想要返回的數(shù)個(gè)值數(shù)據(jù)類(lèi)型一致,可以考慮采用方法2;而對(duì)于不同數(shù)據(jù)類(lèi)型的返回值,如果各個(gè)數(shù)值之間是相互聯(lián)系的,則方法3較為合適;方法1雖然在很多情況下都可以實(shí)現(xiàn)多個(gè)返回值的C語(yǔ)言函數(shù),但畢竟全局變量應(yīng)用過(guò)程中有很多危險(xiǎn),要慎重使用。
在C語(yǔ)言中,一般情況下函數(shù)的返回值是通過(guò)函數(shù)中的return語(yǔ)句來(lái)實(shí)現(xiàn)的,每調(diào)用一次return語(yǔ)句只能從函數(shù)中返回一個(gè)值,下面我們就來(lái)看看C語(yǔ)言怎么讓一個(gè)函數(shù)返回多個(gè)值!
工具/材料
C語(yǔ)言的編輯器
01
全局變量傳遞
這種方式算是最不科學(xué)的規(guī)范,打破了軟件開(kāi)發(fā)需要的閉環(huán)策略,但在基本語(yǔ)法上是支持的,C語(yǔ)言里面最好少涉獵全局變量,使用出錯(cuò)的風(fēng)險(xiǎn)會(huì)提升很多,真要想使用建議還是用靜態(tài)全局變量直接在變量的前面加上static修飾符。
02
使用數(shù)組名或指針作為函數(shù)的形參
被調(diào)函數(shù)的行參是一個(gè)指針,然后在被調(diào)函數(shù)中返回第一個(gè)值,被調(diào)函數(shù)改變指針參數(shù)指向的值,這樣主調(diào)函數(shù)相應(yīng)的值就改變了,也就相當(dāng)于返回了第二個(gè)值了。這樣就可以實(shí)現(xiàn)返回多個(gè)值!
03
結(jié)構(gòu)體指針?lè)祷?/p>
結(jié)構(gòu)體是C語(yǔ)言涉及數(shù)據(jù)結(jié)構(gòu)的最直接的容器,通常在編程過(guò)程中實(shí)現(xiàn)一個(gè)功能模塊在主函數(shù)里,我們可以定義一個(gè)結(jié)構(gòu)體類(lèi)型的變量,然后直接用函數(shù)返回值賦值就可以了。
1、通過(guò)使用指針,在函數(shù)調(diào)用時(shí),傳遞帶有地址的參數(shù),并使用指針更改其值;這樣,修改后的值就會(huì)變成原始參數(shù)。
2、通過(guò)使用指針?lè)祷亟Y(jié)果為:
3、通過(guò)使用結(jié)構(gòu):因?yàn)榻Y(jié)構(gòu)是用戶定義的數(shù)據(jù)類(lèi)型;可以定義一個(gè)包含兩個(gè)整數(shù)變量的結(jié)構(gòu),并將更大和更小的值存儲(chǔ)到這些變量中,然后使用該結(jié)構(gòu)的值。
4、通過(guò)使用結(jié)構(gòu)返回結(jié)果為:
5、通過(guò)使用數(shù)組,當(dāng)一個(gè)數(shù)組作為參數(shù)傳遞時(shí),基地址將傳遞給該函數(shù),因此無(wú)論對(duì)數(shù)組副本所做的任何更改,都會(huì)更改為原始數(shù)組。
6、通過(guò)使用數(shù)組返回結(jié)果為:
1、傳入結(jié)構(gòu)體指針,用結(jié)構(gòu)體保存返回;
2、加個(gè)條件檢測(cè)。
#includestdio.h
typedef struct _result {
int ji;
int tu;
} result;
int main()
{
int fun(int,int,result*);
int sum,j_sum; /*sum為雞和兔的總數(shù),j_sum為雞兔腳的總數(shù)*/
result r;
int f;
f = 1;
do {
printf("請(qǐng)輸入雞和兔的總數(shù):");
scanf("%d",sum);
printf("請(qǐng)輸入雞和兔腳的總數(shù):");
scanf("%d",j_sum);
fun(sum,j_sum, r);
if(r.ji == -1 || r.tu == -1) {
printf("你輸入的雞兔的總數(shù)和腳的總數(shù)不能夠能配對(duì)!\n");
} else {
printf("雞的數(shù)量為%d\n",r.ji);
printf("兔的數(shù)量為%d\n",r.tu);
f = 0;
}
} while(f);
return 0;
}
void fun(int i,int j, result* r)
{
int t,jl;
r-ji = r-tu = -1;
if((j2*i)(j4*i))
{
t=(j-2*i)/2;
jl=i-t;
}
r-ji = jl; r-tu = t;
}
每個(gè)函數(shù)只支持一個(gè)返回值
多個(gè)要返回的 一般有兩種做法
1 聚合。 如果相同類(lèi)型,可以用指針?lè)祷亍?/p>
如果是不同類(lèi)型 可以用結(jié)構(gòu)體返回。
2 參數(shù)。通過(guò)指針類(lèi)參數(shù)返回。
其它的 比如全局變量 也可以實(shí)現(xiàn) 但最好不用。