c语言函数返回多个值设计函数模拟比较返回

第七届全国信息技术应用水平大赛模拟题C语言程序设计
第七届全国信息技术应用水平大赛模拟题
C语言程序设计
注:模拟题题量总计88道,其中单选题60道,每道题1分;多选题20道,每道题2分;程序填充题6道,每道题5分;编程操作题2道,每道题10分。试卷满分为150分,完成时间为180分钟。此模拟题仅供参考,具体题型、题量、分值分配与试题难度以实际预赛题为准。
单选题(共60题,每题1分,共60分)
下列符号串中,属于C语言合法标识符的个数为(& )。
_1_2_3,a-b-c,float,9cd,a3b4
2. 下列能为字符变量 a 赋值的是:char a= (&
&&&&A:'ab'
&&&&C:'\0'
&&&&D:&\0&
在下列字符序列中,合法的标识符是(& )。
&&&&A:P12.a
&&&&B:stud_100
&&&&C:$water.1
&&&&D:88sum
4. 下列用于printf函数的控制字符常量中,代表tab的字符常量是(& )。
&&&&A:'\b'
&&&&B:'\t'
&&&&C:'\r'
&&&&D:'\f'
5. 下列用于printf函数的控制字符常量中,代表退格的字符常量是(& )。
&&&&A:'\b'
&&&&B:'\t'
&&&&C:'\r'
&&&&D:'\n'
如有以下程序:unsigned int a=6; int b=-20; c=(a+b&6);
则c的值为(& )。
7. 关于C语言,以下不正确的叙述是(& )。
&&&A:在C语言程序设计中,逗号运算符的优先级最低
&&&B:在C语言程序设计中,var和VAR是两个相同的变量
&&&C:C语言也支持重载
&&&D:此处的两个语句int&a;& a=-13.06;在程序编译中将会提示出错
&若有定义:
int& a=2,*p;
float& x=1, y=2;
char& e=&w&;
则以下用法不正确的是(& )。
A:printf(&%c&,e+a);
&&&&B:p=&x;
&&&&C:a *=y+x;
&&&&D:x=y=e;
9. int x=20; printf(&%d\n&,~x);
以上程序片段的输出是(& )。
10. 在C语言中,要求运算数必须是整型的运算符是(& )。
11. 若有定义:int a=7;float x=2.5,y=4.7;则表达式x+a%3*(int)(x+y)%2/4的值是(结果保留两位小数)(& )。
&&&&A:2.50
&&&&B:2.75
&&&&C:3.50
&&&&D:0.00
12. 以下运算符中优先级最低的是(& )。
13. 设有定义语句:char c1=1,c2=1;,则以下表达式中值为零的是(& )。
&&&&A:c1^c2
&&&&B:c1&c2
&&&&D:c1|c2
14. 以下程序的输出结果是
#include &stdio.h&
void main()
&&& unsigned char a,b;
&&& a=0x0a|3;
&&& b=0x0a&3;
&&& printf(&%d %d\n&,a,b);
&&&&A:2 11
&&&&B:11 2
&&&&C:7 13
&&&&D:13 7
15. 如果int i = 4, 则printf(&%d&,
-i-- )的输出结果是(&& ),i的值是(& )。
&&&&A:-4& 3
&&&&B:-3& 3
&&&&C:-3& 4
&&&&D:-4& 4
16. 若x=2,y=3则x&y的结果是(& )。
17. 下列程序的输出是(& )。
printf(&%d\n&,(x=3*5,x*2,x+10));}
18. 若x,i,j和k都是int型变量,则计算下面表达式后,x的值为(& )。
x=(i=4,j=16,k=32)
&&&&D:其他值
19. 假设所有变量均为整型,则表达式(a=2,b=5,b++,a+b)的值是(& )。
20. 以下程序运行后的输出结果是(& )。
a=50;b=90;
printf(&%d\n&,(a,b));
&&&&B:50 90
&&&&D:其他
21. 以下程序的运行结果是(& )。
void main()
&&& int a=4; char ch=&a&;
&&& printf( &%d\n&,(a&2)&&(ch&&A&));
22. 以下程序的输出是(& )。
#include &stdio.h&
)&&&&&&&&&&&&&&&&&&&&&&&&&&&
i,j=4;&&&&&&&&&&&&&&&&&&
& for(i=j; i&=2*j; i++)
&switch (i/j)
&{&& case 0 :
&&&& case 1: printf(&*&);
&&&& case 2: printf(&#&);
&&&&A:*###
&&&&B:**##
&&&&C:***#
&&&&D:****#
23. 有如下程序片段:
int i = 0;
while(i++ &= 2);
printf(&%d&, i--);
则正确的执行结果是 (& )。
&&&&D:以上都不是
24. 有以下程序段
{ int i=1,sum=0,n;
&& scanf(&%d&,&n);
}while(i!=n);
printf(&%d&,sum);
若使程序的输出值为15,则应该从键盘输入的n的值是 (& )。
25. &以下程序的输出是(&
& #include&stdio.h&
& void fun(int *p)
&&&& int a=10;
&&&& p=&a;
void main()
&&&&&&& fun(&a);
&&&&&&& printf(&%d\n&,a);
26. 以下关于函数的说法中正确的是
&&&&A:定义函数时,形参类型说明可放在函数体内
&&&&B:return语句后边的值不能为表达式
&&&&C:如果函数类型与返回值类型不一致,以函数类型为准
&&&&D:如果形参与实参的类型不一致,以实参为准
27. 已知有定义:int *p(); 则以下说法正确的是
&&&&A:指向int型的指针变量
&&&&B:int型的指针数组
&&&&C:一个函数,该函数的返回值是指向int型的指针变量
&&&&D:一个指向函数的指针变量,该函数的返回值为int型
28. 若有如下程序:
void s(char *m,int n)
&& *m=*m+3;n=n+3;
printf(&%c,%c,&,*m,n);
void main()
&& char p=&b&,q=&B&;
printf(&%c,%c\n&,p,q);
}则程序运行后的输出结果是 (& )。
&&&&A:E,e,b,E
&&&&B:e,E,b,F
&&&&C:E,e,e,E
&&&&D:e,E,b,E
29. C语言规定函数返回值的类型由 (& )。
&&&&A:在定义时所指定的函数类型所决定
&&&&B:调用该函数时的主调函数类型所决定
&&&&C:return语句中的表达式类型所决定
&&&&D:调用该函数时系统临时决定
30. 要在c语言中求正弦30度的值,可以调用库函数,可用格式为 (& )。
&&&&A:sin(30)
&&&&B:sin(30.0)
&&&&C:sin((double)30)
&&&&D:sin(3.1415/6)
31. 在C语言程序设计中,简单变量作为实参时,它和对应形参之间的数据的传递方式是 (& )。
&&&&A:地址传递
&&&&B:单向值传递
&&&&C:由实参传给形参,再由形参传给实参
&&&&D:由用户指定传递方式
32. &以下程序的输出为(&
int f(int *a)
&&& return(*a)++;
void main()
&&& int s=0;
&&& {int a=5;
&&&& s+=f(&a);
&&& s+=f(&a);
&&& printf(&%d %d\n&,a,s);
&&&&B:2 10
&&&&D:3 11
33. 以下程序输出结果是(&
#include &stdio.h&
int *fun()
int a[4],k;
for(k=0;k&4;k++)a[k]=k;
return(a);
void main()
{ int *p,j;
for(j=0;j&4;j++){printf(&%d\n&,*p);p++;}
&&&&A:输出0 0 0 0
&&& B:输出0 1 2 3
&&&&C:输出1 1 1 1
&&&&D:输出不确定值
34. 以下程序的运行结果是(& )。
void fun(int *n)
&&& static int m=2;
&&& *n*=m-1; m+=2;
void main()
&&& static int m=1;
&&& for(i=1;i&4;i++)
&&&&&&& fun(&m);
&&& printf(&%d\n&,m);
35. 下面对typedef的叙述中不正确的是 (&
&&&&A:用typedef可以定义各种类型名,但不能用来定义变量
&&&&B:typedef和#define都是在预编译时处理的
&&&&C:用typedef只是将已存在的类型用一个新的标识符来代表
&&&&D:使用typedef有利于程序的通用和移植
36. 要使用内存分配函数malloc,需要引入的头文件是
&&&&A:stdio.h
&&&&B:stdlib.h
&&&&C:malloc.h
&&&&D:memory.h
37. 以下宏定义中,不会引起二义性的宏个数为(& )。
1)#define POWER(x) x*x
2) #define POWER(x) (x)*(x)
3) #define POWER(x) (x*x)
4) #define POWER(x) ((x)*(x))
38. 若有二维数组定义语句:int a[4][5]; 则下面对元素a[2][3]不正确的引用方式是(& )。
&&&&A:*(&a[2][3])
&&&&B:*(a+5*2+3)
&&&&C:*(a[2]+3)
&&&&D:*(*(a+2)+3)
39. 若二维数组定义为a[m][n],则在a[i][j]之前的元素个数为 (& )。
&&&&A:j*m+i
&&&&B:i*m+j
&&&&C:i*m+j-1
&&&&D:j*m+i-1
40. 有字符数组a[10]={&A&,&\0&}和b[10]={&B&},则以下正确的输出语句是 (& )。
&&&&A:puts(a,b);
&&&&B:printf(&%s %s\n&,a[],b[]);
&&&&C:putchar(a,b);
&&&&D:puts(a);puts(b);
41. 下列程序的输出结果是(& )。
#include &stdio.h&
#include &string.h&
void main()
&&& char p1[20]=&abcd&,p2[20]=&ABCD&;
&&& char str[50]=&xyz&;
&&& strcpy(str+2,strcat(p1+2,p2+1));
&&& printf(&%s\n&,str);
&&&&A:xyabcAB
&&&&B:abcABz
&&&&C:Ababcz
&&&&D:xycdBCD
42. 以下程序执行后输出结果是(& )。
void main()
&& char a[]=&movie&,b[10]=&movie&;
&& printf(&%d %d\n&,sizeof(a),sizeof(b));
&&&&C:6 10
&&& D:10 10
43. 以下程序的输出结果是(& )。
void main()
*p[10]={&abc&,&aabdfg&,&dcdbe&,&abbd&,&cd&};
printf(&%d\n&,strlen(p[4]));
&&&&D:编译出错
44. 已知有以下的说明,
int a[]={8,1,2,5,0,4,7,6,3,9}; 那么a[*(a+a[3])]的值为 (& )。
45. 以下程序输出结果是(& )。
#include& &stdio.h&
& &int a[2][2]={1,2,3,4},(*p)[2];
&&&&&&& p=a;
&&&&&&& p++;&&&
&&&&&&& printf(&%d\n&,**p );
&&& D:以上都不对
46. 设char ch,str[4],*,则正确的赋值语句是 (& )。
&&&&A:ch=&CBA&;
&&&&B:str=&CBA&;
&&&&C:strp=&CBA&;
&&&&D:*strp=&CBA&;
47. 下面程序的运行结果是(& )。
#include& &stdio.h&
#include& &string.h&
fun(char *w,int n)
{char t,*s1,*s2;
&s1=w;s2=w+n-1;
&while(s1&s2){t=*s1++;*s1=*s2--;*s2=t;}
&p=&1234567&;
&fun(p,strlen(p));
&&&&A:7654321
&&&&B:1714171
&&&&C:1711717
&&&&D:7177171
48. 以下程序的输出是( )。
#include &stdio.h&
char a[]=&language&,*p;
&while(*p!=&u&){ printf(&%c&,*p-&u&+&U&);p++;}
&&&&A:LANGUAGE
&&&&B:language
&&&&&C:LANG
&&&&&D:LANGuage
49. struct s1
&&& char a[3];
}t={&a&,&b&,&x&,4},*p;
则输出为x的语句是(& )。
&&&& A:printf(&%c\n&,p-&t.a[2]);
&&&& B:printf(&%c\n&,(*p).a[2])
&&&& C:printf(&%c\n&,p-&a[3]);
&&&& D:printf(&%c\n&,(*p).t.a[2]);
50. &以下程序的输出是(&
#include &stdio.h&
&&&& struct st
&&&& }cnum[2]={1,3,2,7};
printf(&%d\n&,cnum[0].y/cnum[0].x*cnum[1].x);
51. 以下对age的非法引用是(& )。
struct& student
& }stu1,*p;
&&&&A:stu1.age
&&&&B:student.age
&&&&C:p-&age
&&&&D:(*p).age
52. 以下程序的输出是(& )。
#include &stdio.h&
union myun
{int x,y,z;}u;
void main()
{a.u.x=4;a.u.y=5;a.u.z=6;
printf(&%d\n&,a.u.y);
53. 若要用fopen函数打开一个二进制文件,该文件要既能读也能写,当文件不存在时新建文件,则文件打开方式字符串应是(& )。
&&&&A:&ab+&
&&&&B:&rb+&
&&&&C:&wb+&
&&&&D:&ab&
54. 若执行fopen函数时发生错误,则函数的返回值是
&&&&A:地址值
55. 要打开文件c:\user\text.txt用于追加数据,正确的语句是(& )。
&&&&A:fp=fopen(&c:\turboc2\abc.txt&,&r&);
&&&&B:fp=fopen(&c:\\turboc2\abc.txt&,&r&);
&&&&C:fp=fopen(&c:\\turboc2\\abc.txt&,&a+&);
&&&&D:fp=fopen(&c:\turboc2\abc.txt&,&a+&);
56. 在执行fopen函数时,ferror函数的初值是 (& )。
&&&&A:TRUE
57. #include& &stdio.h&
& &char * s1=&Hello&,*s2=&Beijing&;
&&&&&&& FILE
*pf=fopen(&abc.dat&,&wb+&);
&&&&&&& fwrite(s2,7,1,pf);
&&&&&&& fseek(pf,-1,SEEK_CUR);
&&&&&&& fwrite(s1,5,1,pf);
&&&&&&& fclose(pf);
以上程序执行后,文件abc.dat中的内容为 (&
&&&& A:Hellong
&&&&&B:Beijing Hello
&&&&&C:BeijinHello
&&&&&D:Hello
58. 若fp为文件指针,且文件已正确打开,i为整型数据,以下语句的输出结果是(& )。
fseek(fp,0,SEEK_END);
i=ftell(fp);
printf(&i=%d\n&,i);
&&&&A:fp所指的文件记录长度
&&&&B:fp所指的文件长度,以字节为单位
&&&&C:fp所指的文件长度,以比特为单位
&&&&D:fp所指的文件当前位置,以字节为单位
59. 函数调用语句:fseek(fp,-20L,2);的含义是 (& )。
&&&&A:将文件位置指针移到距离文件头20个字节处
&&&&B:将文件位置指针从当前位置向后移动20个字节
&&&&C:将文件位置指针从文件末尾处后退20个字节
&&& D:将文件位置指针移到离当前位置20个字节处
60. 若将文件指针的读写位置指针移动到距离文件头200个字节的位置,对应正确的操作是 (& )。
&&&&A:fseek ( fp,& 200, SEEK_SET )
&&&&B:fseek ( fp,& 200,& SEEK_CUR )
&&&&C:fseek ( fp,& 200, SEEK_END )
&&&&D:ftell ( 200 )
多选题(共20题,每题2分,共40分)
1. 关于以下运算,说法正确的有
&&&&A:设有宏定义&#define F(N)
2*N&,则表达式F(2+3)的值是10
&&&&B:设int x=4;则执行语句x += x *= x + 1;后,x的值为40
&&&&C:设int a, b = 8;执行a = b&&2 + 1;后a的值是33
&&&&D:设int a[3][4], *p = a[1]; 该指针变量p指向的元素是a[1][0]
2. 有以下定义:char a[10],*b=a;
则能给a数组输入字符串的语句有 (& )。
&&&&A:gets(a);
&&&&B:gets(a[0]);
&&&&C:gets(&a[0]);
&&&&D:gets(b);
&3. 要求函数的功能是在一维数组a中查找x值。若找到,则返回所在的下标值;否则,返回0。设数据放在数组元素的a[1]到a[n]中。在以下给出的函数中,不能正确执行此功能的函数有 (& )。
&&&&A:funa(int *a, int n, int x)
&&& while(a[n] != x) n--;
&&&&&B:funb(int *a, int n, int x)
&&& for(k = 1; k &= k++)
&&& if(a[k] == x)
&&&&&& return 0;
&&&&&C:func(int a[], int n, int x)
&&& int *k;
&&& a[0] = k = a+n;
&&& while(*k != x) k--;
&&& return k -
&&&&&D:fund(int a[], int n, int x)
&&& int k = 0;
&&& }while((k & n+1)&&(a[k]!=x));
&&& if((k & n+1)&&a[k] == x))
&&& else return 0;
4. 关于下列程序的输入与输出,正确的说法有(& )。
#include &stdio.h&
void main()
&&& int m,n;
&&& printf(&Enter m,n∶&);
&&& scanf(&%d%d&,&m,&n);
&&& while(m!=n)
&& {while(m&n)m-=n;
&&& while(n&m)n-=m;
&&& printf(&m=%d\n&,m);
&&&&A:输入m&n时,程序将输出1
&&&&B:输入m&n时,程序将输出1
&&&&C:输入m,n满足m%n=0,且m&n时,程序输出值为n的值
&&&&D:输入m或n为0时,程序将陷入死循环
5. 已知有如下程序:
void main()
&&& int a[5]={1,2,3,4,5},*b;
&&& b=(int*)malloc(sizeof(int));
&&& printf(&%d\n&,*b);
要使程序输出为a[2]的值,则函数fun的定义和横线处对应的fun调用的正确有 (& )。
&&&A:void fun(int*s,int*d)
{*d=*(s+2);}
调用: fun(a,&b)
&&&&B:void fun(int*s,int&d)
{d=*(s+2);}
调用: fun(a,b)
&&&&C:void fun(int*s,int &d)
{d=*(s+2);}
调用: fun(a,*b)
&&&&D:void fun(int*s,int **d)
{**d=*(s+2);}
调用: fun(a,&b)
6. 以下函数欲实现交换x和y的值,且通过正确调用返回交换结果。不能实现这一功能的有 (& )。
&&&&A:funa(int *x, int *y)
& *p = *x; *x = *y; *y = *p;
&&&&B:funb(int x, int y)
& t = x = y =
&&&&C:func(int *x, int *y)
& p = *x; *x = *y; *y =
&&&&D:fund(int *x, int *y)
& *x = *x + *y; *y = *x - *y; *x = *x - *y;
7. 函数调用时,下列说法中正确的有 (& )。
&&&&A:若用值传递方式,则形式参数不予分配内存
&&&&B:实际参数和形式参数可以同名
&&&&C:主调函数和被调用函数可以不在同一个文件中
&&&&D:函数间传递数据可以使用全局变量
8. 下面叙述正确的有(& )。
&&&&A:函数调用可以出现在表达式中
&&&&B:函数调用可以作为一个函数的实参
&&&&C:函数调用可以作为一个函数的形参
&&&&D:函数可以直接调用其本身
9. 下列说法中正确的有 (& )。
&&&&A:递归函数的形参是自动变量
&&&&B:有些递归函数是不能用非递归算法来实现的
&&&&C:c语言不允许这样的函数调用:函数A调用了函数B,而函数B又调用了函数A
&&&&D:C语言不允许函数的嵌套定义
10. 下列关于指针与引用的说法,正确的有 (& )。
&&&&A:引用只能在定义时被初始化一次,以后不能改变
&&&&B:指针可以被重新赋值以指向另一个不同的对象
&&&&C:引用和指针都可以指向空值
&&&&D:引用和指针都可以用const修饰
11. 若有如下定义:int s[3];则下面表达式中,表示数组元素s[1]的有 (& )。
&&&&A:*&s[1]
&&&&B:*(&s[0]+1)
&&&&C:*(s+1)
&&&&D:*(&(s[0]+1))
12. 已知:int a=1,*p=&a;则以下表达式可以得到a的值的有 (& )。
&&&&B:p[0]
13. 若有定义:char
*str[]={&one&,&two&,&three&},**p=
则可以表示出字符''t''的表达是 (& )。
&&&&A:*str[2]
&&&&B:*str+2
&&&&C:*(p+1)
&&&&D:**++p
14. 若有以下定义和语句,则对w数组元素的正确引用有
int w[2][3], (*pw)[3]; pw=w; (& )。
&&&&A:*(w[0]+2)
&&&&B:pw[0][0]
&&&&C:*pw[2]
&&&&D:*(pw[1]+2)
15. 设有以下语句
struct st{
&&& struct st *
static struct st a[3]={5,&a[1],6,&a[2],7,NULL},*p=&a[0];
则以下表达式的值为6的有 (& )。
&&&&A:p-&n++
&&&&B:++p-&n
&&&&C:(++p)-&n
&&&&D:p-&next-&n
16. 以下关于结构类型变量的定义正确的有 (& )。
&&&&A:struct data{
&&&&B:struct data{
&&&&C:struct data{
struct data &d=
&&&&D:typedef struct data{
17. 以下scanf函数调用语句中对结构体变量成员的正确引用有(&)。
struct& pupil
{ char&& name[ 20 ];
} pup[ 5 ],*p;
&&&&A:scanf(&%s&,pup[ 0 ].name);
&&&&B:scanf(&%d&,&pup[ 0 ].age);
&&&&C:scanf(&%d&,&(p-&sex));
&&&&D:scanf(&%d&,p-&age);
18. 以下关于枚举类型的用法中,正确的有 (& )。
&&&&A:enum a {1,2,3};
&&&&B:enum a {a,b,c};
&&&&C:enum a {a,b,c}d;
&&&&D:enum a {a,b,c}a;
19. 设有如下说明,则正确的说法有(&)。
union data{
&&&&A:a所占的内存长度等于成员f的长度
&&&&B:a的地址和它的各成员地址都是同一地址
&&&&C:a可以作为函数参数
&&&&D:不能直接对a赋值
20. 设有结构类型:
typedef struct str{
&&& char name[20];
另有变量定义:STR a[20],
以下语句希望实现,向与文件指针变量fp关联的文件输出一个结构信息,正确的代码有(& )。
&&&&A:fwrite(a, sizeof(STR), 1, fp);
&&&&B:fwrite(&a[2], sizeof(STR), 1, fp);
&&&&C:fwrite(&x, sizeof(STR), 1, fp);
&&&&D:fwrite(x, sizeof(STR), 1, fp);
程序填充题(共6题,每题5分,共30分)
1. 下面程序的功能是统计用0至9之间的不同的数字组成的三位数的个数。
{ int i,j,k,count=0;
for(i=1;i&=9;i++)
for(j=0;j&=9;j++)
if( ① ) continue;
else for(k=0;k&=9;k++)
if( ② ) count++;
printf(&%d&,count);
下面程序的功能是将字符串s中的每个字符按升序的规则插到数组a中, 字符串a已排好序。
#include &string.h&
{ char a[20]=&cehiknqtw&;
char s[]=&fbla&;
int i,k,j;
for(k=0;s[k]!= '\0';k++ )
while(s[k]&=a[j] && a[j]!= '\0' )
a[j]=s[k];
3. 下面程序的功能是用辗转相除法求两个正整数m和n的最大公约数。
hcf(int m,int n)
while( ② )
4. 下面程序的功能是从键盘上输入若干学生的学习成绩,统计并输出最高成绩和最低成绩,当输入为负数时结束输入。
{ float x,amax,amin;
scanf(&%f&,&x);
while( ① )
{ if(x&amax) amax=x;
if( ② ) amin=x;
scanf(&%f&,&x);
printf(&\namax=%f\namin=%f\n&,amax,amin);
5. 下面程序的功能是不用第三个变量,实现两个数的对调操作。
#include &stdio.h&
{ int a,b;
scanf(&%d%d&,&a,&b);
printf(&a=%d,b=%d\n&,a,b);
printf(&a=%d,b=%d\n&,a,b);
6. 下面程序的功能是根据近似公式:&2/6&
1/12+1/22+1/32+ && +1/n2,求&值。
#include &math.h&
double pi(long n)
{ double s=0.0;
for(i=1;i&=n;i++)
s=s+ ① ;
return( ② );
编程操作题(共2题,每题10分,共20分)
1. 将1到9这九个数字分成3个三位数a,b,c,要求第1个三位数,正好是第2个三位数的两倍,是第3个三位数的三倍。用程序求解怎么分。
输入两个字符串,要求将这两个字符串交叉连接。如串1为&ABCD&,串2为&123456&,则合并后的串为&A1B2C3D456&。
  附件:
Copyright & 2006 - 2012
All Rights Reserved.11907人阅读
C语言知识(37)
作者同类文章X
  笔者从事C语言教学多年,在教学中学生们常常会问到如何编写具有多个返回值的C语言函数。编写有多个返回值的函数是所有C语言教材里均没有提到的知识点,但在实际教学与应用的过程中我们都有可能会遇到这样的问题。有学生也尝试了不少方法:如把多个需要返回的值作相应的处理后变成一个可以用return语句返回的数据,再在主调函数中拆开返回的数据使之变成几个值;或者把需要返回多个值的一个函数分开几个函数去实现多个值的返回。这些方法虽然最终都能实现返回要求的多个值,但从程序算法的合理性与最优化方面去考虑,显然不理想。我们知道C语言函数的返回值是通过函数中的return语句来实现的,可是每调用一次函数,return语句只能返回一个值。那么当我们希望从一个函数中返回多个值时,用什么方法去实现比较合理呢?在教学过程中,我建议学生跳出对return语句的定势思维,一步步引导学生通过几种间接方式实现多个返回值的C语言函数。以下是笔者在教学过程中引导学生采用的三种不同方法编写多个返回值的C语言函数。
  2方法1:利用全局变量
  分析:全局变量作为C语言的一个知识点,虽然我们都了解它的特点,但在实际教学过程中应用得并不是很多。由于全局变量的作用域是从定义变量开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调函数中。函数被调用后被更改后的全局变量值即为函数的数个返回值。下面以一个实例演示该方法的应用。
  实例1:编写函数求3个数中的最大值与最小值。
  方法:把最大值、最小值分别定义成2个全局变量max、min,在用户自定义函数中把求出来的最大值与最小值分别赋给全局变量max、min。函数调用完毕后全局变量的max、min值即保存了函数要求返回的值。程序参考代码如下:
  #include &stdio.h&
  #include &conio.h&
  int max,/*定义两个全局变量用于保存函数返回值*/
  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个整数:\n&);
  scanf(&%d,%d,%d&,&x,&y,&z);
  max_min(x,y,z) ;/*调用求最大值与最小值的函数*/
  printf(&三个数中的最大值为:%d;最小值为:%d&,max,min);/*输出最大值与最小值*/
  getch();
  调试结果如下:
  请输入3个整数:
  5,-6,2
  三个数中的最大值为:5;最小值为:-6
  注意:该方法虽然可以实现有多个返回值的函数,但由于全局变量不能保证值的正确性(因为其作用域是全局,所以程序范围内都可以修改它的值,如果出现错误将非常难以发现),并且全局变量增加了程序间模块的耦合,所以该方法要慎用。
  3方法2:传递数组指针
  分析:在教学过程中,我们知道C语言函数参数的传递方式有值传递与地址传递。当进行值传递时,主调函数把实参的值复制给形参,形参获得从主调函数传递过来的值运行函数。在值传递过程中被调函数参数值的更改不能导致实参值的更改。而如果是地址传递,由于传递过程中从实参传递过来的是地址,所以被调函数中形参值的更改会直接导致实参值的更改。因此,我们可以考虑把多个返回值作为数组元素定义成一个数组的形式,并使该数组的地址作为函数的形式参数,以传址方式传递数组参数。函数被调用后,形参数组元素改变导致实参改变,我们再从改变后的实参数组元素中获得函数的多个返回值。以下实例演示该方法的应用。
  实例2:编写函数求一维整形数组的最大值与最小值,并把最大值与最小值返回给主调函数。
  方法:以指针方式传递该一维数组的地址,然后把数组的最大值与数组的第一个元素交换,把数组的最小值与最后一个元素交换。函数被调用完毕后,实参数组中的第一元素为数组的最大值,实参数组中最后一个元素为数组的最小值,从而实现返回数组的最大值与最小值的功能。程序参考代码如下:
  #include &stdio.h&
  #include &conio.h&
  void max_min(int *ptr,int n) /*定义求数组最大值最小值的函数,传递数组指针*/
  {int i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/
  int */*用于交换位置*/
  *temp=*
  for(i=0;i  {
  if(*ptr&*(ptr+i))/*最大值与第一个元素进行交换*/
  *temp=*
  *ptr=*(ptr+k);
  *(ptr+k)=*
  if(*(ptr+n-1)&*(ptr+i))/*最小值与最后一个元素进行交换*/
  *temp =*(ptr+n-1);
  *(ptr+n-1)=*(ptr+j);
  *(ptr+j)= *}
  /*调用最大最小值函数*/
  main()
  int A[6],i;
  for(i=0;i&6;i++)
   scanf(&%d&,&A[i]);
  max_min(A,6);
  printf(&max=%d, min=%d\n \n&,A[0],A[5]);
  getch();
  调试结果如下:
  请输入6个整形数,以空格隔开:
  5 8 9 32 -6 4
  max=32,min=-6
注意:该方法适用于多个返回值的数据类型一致的情况。当返回值数据类型不一致时,不适用该方法。
  4方法3:传递结构体指针
  分析:结构体作为教学中的一个难点,教材对它介绍的内容并不多,应用的实例更是少之又少,所以学生对于结构体普遍掌握情况不理想。其实,编写返回多个值的C语言函数,也可以考虑采用结构体的方式去实现。通过方法2,我们知道如果返回的数个数值的数据类型不一致,可以通过定义全局变量实现有多个返回值的C语言函数,也可以考虑把要求返回的数个值定义成一个结构体,然后同样以传递结构体指针方式把结构体的指针传递给形参结构体指针,那么函数中对形参结构体的修改即是对实参结构体的修改,函数被调用后获取的实参结构体成员即为函数的多个返回值,下面以实例演示该方法的应用。
  实例3:编写一个用户自定义函数,允许用户录入学生的基本信息(包括学号、姓名、所属班级、总评成绩),并返回这些基本信息给主调函数。
  方法:把学生基本信息定义成一个结构体,在用户自定义函数中传递该结构体的指针,则自定义函数中对结构体成员的录入操作即是对实参结构体成员的录入操作,从而实现多个返回值。参考代码如下:
  #include &stdio.h&
  #include &conio.h&
  struct inf{/*定义学生结构体,分别包含成员学号、姓名、班别、总评成绩*/
   char xh[12];
   char name[20];
   char class[15];
  main(void)
  struct inf a1; /*定义学生结构体类型变量*/
  void xxxx(struct inf *ptr);
  printf(&请输入学号,姓名,班别,总评成绩,以空格隔开:\n&) ;
  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
  注意:当函数要求返回的多个值是相互联系的或者返回的多个值数据类型不一致时可以采用该方法。
  5结束语
  对于以上这三种方法,如果想要返回的数个值数据类型一致,可以考虑采用方法2;而对于不同数据类型的返回值,如果各个数值之间是相互联系的,则方法3较为合适;方法1虽然在很多情况下都可以实现多个返回值的C语言函数,但毕竟全局变量应用过程中有很多危险,要慎重使用。
  通过对以上几种方法的分析讲解,在教学过程中,学生再遇到这样的问题时,就能根据返回值的情况选择合适的途径去实现多个返回值的C语言函数。另外,如果再遇到类似的无法用教材知识点去直接解决的问题时,他们基本都能举一反三地尝试采用间接方式去解决。
  参考文献
  [1] 谭浩强. C程序设计(第二版)[M]. 北京:清华大学出版社,1999.
  [2] 薛万鹏译. C程序设计教程[M]. 北京:机械工业出版社,2000.
  [3] 邓劲生译. Visual C++程序员实用大全[M]. 北京:中国水利水电出版社,2005.
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:225129次
积分:2575
积分:2575
排名:第7883名
原创:15篇
转载:135篇
评论:36条
(8)(2)(5)(9)(4)(20)(15)(32)(9)(2)(7)(5)(10)(22)}

我要回帖

更多关于 c语言函数返回多个值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信