zoukankan      html  css  js  c++  java
  • 如何编写有多个返回值的C语言函数

     
       
      方法1:利用全局变量 
       
      分析:全局变量作为C语言的一个知识点,虽然我们都了解它的特点,但在实际教学过程中应用得并不是很多。由于全局变量的作用域是从定义变量开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调函数中。函数被调用后被更改后的全局变量值即为函数的数个返回值。下面以一个实例演示该方法的应用。 
      实例1:编写函数求3个数中的最大值与最小值。 
      方法:把最大值、最小值分别定义成2个全局变量max、min,在用户自定义函数中把求出来的最大值与最小值分别赋给全局变量max、min。函数调用完毕后全局变量的max、min值即保存了函数要求返回的值。程序参考代码如下: 
      #include "stdio.h" 
      #include "conio.h" 
      int max,min;/*定义两个全局变量用于保存函数返回值*/ 
      void max_min(int a,int b,int c) /*定义求最大最小值的函数*/ 
      {max=min=a; /*初始化最大最小值*/ 
       if(max   if(max   if(min>b)min=b; 
      if(min>c)min=c; 
      } 
      main() 
      {int x,y,z; 
      printf(" 请输入3个整数: "); 
      scanf("%d,%d,%d",&x,&y,&z); 
      max_min(x,y,z) ;/*调用求最大值与最小值的函数*/ 
      printf("三个数中的最大值为:%d;最小值为:%d",max,min);/*输出最大值与最小值*/ 
      getch(); 
      } 
      调试结果如下: 
      请输入3个整数: 
      5,-6,2 
      三个数中的最大值为:5;最小值为:-6 
      注意:该方法虽然可以实现有多个返回值的函数,但由于全局变量不能保证值的正确性(因为其作用域是全局,所以程序范围内都可以修改它的值,如果出现错误将非常难以发现),并且全局变量增加了程序间模块的耦合,所以该方法要慎用。 
       
      方法2:传递数组指针 
       
      分析:在教学过程中,我们知道C语言函数参数的传递方式有值传递与地址传递。当进行值传递时,主调函数把实参的值复制给形参,形参获得从主调函数传递过来的值运行函数。在值传递过程中被调函数参数值的更改不能导致实参值的更改。而如果是地址传递,由于传递过程中从实参传递过来的是地址,所以被调函数中形参值的更改会直接导致实参值的更改。因此,我们可以考虑把多个返回值作为数组元素定义成一个数组的形式,并使该数组的地址作为函数的形式参数,以传址方式传递数组参数。函数被调用后,形参数组元素改变导致实参改变,我们再从改变后的实参数组元素中获得函数的多个返回值。以下实例演示该方法的应用。 
      实例2:编写函数求一维整形数组的最大值与最小值,并把最大值与最小值返回给主调函数。 
      方法:以指针方式传递该一维数组的地址,然后把数组的最大值与数组的第一个元素交换,把数组的最小值与最后一个元素交换。函数被调用完毕后,实参数组中的第一元素为数组的最大值,实参数组中最后一个元素为数组的最小值,从而实现返回数组的最大值与最小值的功能。程序参考代码如下: 
      #include "stdio.h" 
      #include "conio.h" 
      void max_min(int *ptr,int n) /*定义求数组最大值最小值的函数,传递数组指针*/ 
      {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 ;} 
      } 
      } 
      /*调用最大最小值函数*/ 
      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(); 
      } 
      调试结果如下: 
      请输入6个整形数,以空格隔开: 
      5 8 9 32 -6 4 
      max=32,min=-6

    注意:该方法适用于多个返回值的数据类型一致的情况。当返回值数据类型不一致时,不适用该方法。 
       
      方法3:传递结构体指针 
       
      分析:结构体作为教学中的一个难点,教材对它介绍的内容并不多,应用的实例更是少之又少,所以学生对于结构体普遍掌握情况不理想。其实,编写返回多个值的C语言函数,也可以考虑采用结构体的方式去实现。通过方法2,我们知道如果返回的数个数值的数据类型不一致,可以通过定义全局变量实现有多个返回值的C语言函数,也可以考虑把要求返回的数个值定义成一个结构体,然后同样以传递结构体指针方式把结构体的指针传递给形参结构体指针,那么函数中对形参结构体的修改即是对实参结构体的修改,函数被调用后获取的实参结构体成员即为函数的多个返回值,下面以实例演示该方法的应用。 
      实例3:编写一个用户自定义函数,允许用户录入学生的基本信息(包括学号、姓名、所属班级、总评成绩),并返回这些基本信息给主调函数。 
      


      方法:把学生基本信息定义成一个结构体,在用户自定义函数中传递该结构体的指针,则自定义函数中对结构体成员的录入操作即是对实参结构体成员的录入操作,从而实现多个返回值。参考代码如下: 
      #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);/*调用函数,以学生结构体类型变量地址作为实参*/ 
      printf("学号:%s,姓名: %s,班别:%s,总评成绩:%d",a1.xh, a1.name,a1.class,a1.chj); 
      getch(); 
      } 
      void xxxx(struct inf *ptr)/*该函数实现对结构体成员数据的录入操作*/ 
      { 
       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 
      注意:当函数要求返回的多个值是相互联系的或者返回的多个值数据类型不一致时可以采用该方法。 
       
      结束语 
       
      对于以上这三种方法,如果想要返回的数个值数据类型一致,可以考虑采用方法2;而对于不同数据类型的返回值,如果各个数值之间是相互联系的,则方法3较为合适;方法1虽然在很多情况下都可以实现多个返回值的C语言函数,但毕竟全局变量应用过程中有很多危险,要慎重使用。 
       

    随便写写。一点学习心得。。。--如果本文章没有注明转载则为原创文章,可以随意复制发表,但请注明出处与作者
  • 相关阅读:
    一起学编程(3--组织与表达)
    摩托罗拉SE955 One Discrete Length,Two Discrete Lengths,Length Within Range 相关解释
    完好用户体验: 活用window.location与window.open解决页面跳转问题
    一张图帮你看懂 iPhone 6 Plus 的屏幕分辨率
    李振杰:火狐Mozilla被黑事件的启发
    POJ 1611 The Suspects 并查集 Union Find
    hdu1879 继续畅通project(最小生成树)
    【Android实战】Socket消息通信
    HDOJ 5098 Smart Software Installer 拓扑排序
    各大电商的缓存策略
  • 原文地址:https://www.cnblogs.com/ganhang-acm/p/4307745.html
Copyright © 2011-2022 走看看