c语言函数习题答案(精选8篇)
1.格式字符%md中的m不能为负。(×)2.实际上,可以用顺序、分支、循环三种结构构造任何算法。()3.printf(“%d”,sizeof(1234));其结果是4。(×)4.在C语言中,任何一个表达式的最后加上一个分号就构成一个合法的语句。()
二、单选题
1.下述程序的输出结果是(B)
#include
void main()
{int a,b,c=241;
a=c/100%9;
b=-1&&-1;
printf(“%d,%d”,a,b);
} 2.若有定义:int x,y;char a,b,c;并有以下输入数据:x=1 2 A B C
a=getch();b=getch();c=getch();B)scanf(“x=%d%d”,&x,&y);
a=getch();b=getch();c=getch();C)scanf(“x=%d%d%c%c%c”,7x,&y,&a,&b,&c);D)scanf(“x=%d%d%c%c%c%c%c”,&x,&y,&a,&b,&b,&c,&c);3.已有定义double d,f;数据的输入方式为:3.45
5.下面程序执行结果是32768。(×)
main()
{int a,b;
printf(“%dn”,b=(a=32767,a+1));}
C)scanf(“3.2f%3.1f”,&d,&f)D)scanf(“%3.2lf%3.1lf”,&d,&f)4.如下程序: #include
void main()
{ int m,n,k;
m=(n=4)+(k=10-7);
printf(“m=%dn”,m);
}
运行后m的值为(C)。
(A)(B)(C)7
(D)14
5.下面程序的输出是(C)。
#include
void main()
{ int x=10,y=3;
printf(“%dn”,y=x/y);
}
(A)0
(B)
1(C)3(D)不确定的值
6.下面程序运行情况是(D)。
#include
void main()
{ int x=3,y=0,z=0;
if(x=y+z)
printf(“****”);
else
printf(“####”);
}
(A)有语法错0不能通过编译
(B)输出****
(C)可以通过编译,但不能通过连接,因而不能运行
(D)输出#### 7.结构化程序的三种基本结构是(A)。(A)顺序结构、选择结构、循环结构
(B)递归结构、循环结构、转移结构
(C)嵌套结构、递归结构、顺序结构
(D)循环结构、转移结构、顺序结构
8.以下程序的输出结果是(B)。#include
printf(“%d,%d”,++i,j--);}(A)11,10
(B)9,10
(C)010,9
(D)10,9 9.运行完下列程序后,在屏幕上的内容是(D)。main(){ int a=0;
a+=(a=12);
printf(“%dn”,a);} 10.语句printf(“s=%-5.3s”,“computer”);的输出结果是(B)。
A)s= com B)s=com
C)s= ter D)s=ter
11.下面程序的输出是(C)
main()
{int
x=10,y=3;
printf(“%dn”,y=x/y);
}
A)0
B)C)
3D)不确定的值 12.执行下面程序中输出语句后,a的值是(C)。
main()
{ int
a;
printf(“%dn”,(a=3*5,a*4,a5));
}
A)65 B)20
C)1
5D)10 13.下列程序的输出结果是(A)。
main()
{int a=-1,b=1,c;
c=(a++<=0)&&!(b--<=0));
printf(“%d,%d,%d”,a,b,c);}
A)0,0,1
B)-1,1,1
C)0,1,0
D)0,0,0
14.以下程序运行后,m的值为(C)。
#include
void main()
{ int m,n,k;
m=(n=4)+(k=10-7);
printf(“m=%dn”,m);}
A)B)3
C)7
D)14
15.下面程序的输出结果是(D)。
main()
{int x=10;
printf(“%dn”,~x);}
A)9
B)-9
C)11
D)-11 16.以下程序的输出结果是(D)。
main()
{int x=10,y=10;
printf(“%d,%dn”,x--,--y);}
A)10,10
B)9,9
C)9,10
D)10,9 A.B.C.D.17.printf函数中用到格式符%5s,其中数字5表示输出的字符串占用5列,如果字符串长度大于5,则输出按方式(B)。
A)从左起输出该字符串,右补空格
B)按原字符长从左向右全部输出
C)右对齐输出该字串,左补空格
D)输出错0信息
18.putchar函数可以向终端输出一个 D A)整型变量表达式值
B)实型变量值 C)字符串
D)字符或字符型变量值
19.根据定义和数据的插入方式,输入语句的正确形式为(B)。
已有定义:float f1,f2;数据的输入方式:4.52
3.5 A)scanf(“%f,%f”,&f1,&f2);B)scanf(“%f%f”,&f1,&f2);C)scanf(“%3.2f %2.1f”,&f1,&f2);D)scanf(“%3.2f%2.1f”,&f1,&f2);20.已知ch是字符型变量,下面不正确的赋值语句是(A)。
A)ch='a+b'
B)ch='O';
C)ch='7'+'9';D)ch=5+9;
21.假设int a=4;以下不正确的语句是(A)。
A)a+1=4;
B){a+++ +4;a/=4}
C);
D)printf(“a+1=4”);22.如下程序的执行结果是(B)。
main()
{ int x=023;
printf(“%dn”,--x);}
A)17
B)18
C)23
D)24 23.以下程序的输出结果是(D)。
main()
{char x=040;
printf(“%dn”,x=x<<1);}
A)100
B)80
C)120
D)64
24.假如一个整型变量的最大允许值为32767,那
么运行如下程序后屏幕上会输出的结果是(B)
main()
{ int a,b;
a=32767;
b=a+1;
printf(“%d,%d”,a,b);
}
A)32767,32768 B)32767,-32768 C)
32767,0 D)运行时报错
25.已知字母A的ASCII码为十进制的65,下面程序的输出是C main()
{ char ch1,ch2;ch1='A'+'5'-'3';
ch2='A'+'6'-'3';
printf(“%d,%cn”,ch1,ch2);
}
A)67,D
B)B,C
C)C,D
D)不确定的值
26.请读程序片段:int i=65536;printf(“%dn”,i);上面程序片段的输出结果是(B)。A)65536
B)0
C)有语法错0,无输出结果
D)-1 27.在下列程序段中:
int x, y;
scanf(“%3d*2d%d”,&x,&y);
若输入的数据为:12345678
A)123,456
B)123,678
C)12345 678
D)无法得到正确的值
28.有如下程序,输入数据12 345
#include
scanf(“%3d%f”,&x,&y);}
(A)12.000000
(B)345.000000
(C)12345.000000
(D)0.000000 29.有如下程序,若要求a1,a2,c1,c2的值分别为10,20,A,B,正确的数据输入是(D)
main()
{int a1,a2;
char c1,c2;
scanf(“%d%d”,&a1,&a2);
scanf(“%c%c”,&c1,&c2);
}(A)1020AB
(B)10 20
(D)10 20AB
int x=-1;
printf(“%d,%u,%o”,x,x,x);
A)-1,65535,177777
B)-1,-1,-1 C)-1,32767,-177777
D)-1,32768,177777
31.若有定义int a=3;则执行完printf(“%d”,-a--);语句后,a 的值为(B)。
A)-
3B)
2C)-2
D)3 32.以下程序的输出结果是(C)。int x=3,y=4;void main(){ int x,y=5;
x=y++;
printf(“%d”,x);}
A)3
B)
4C)
5D)6
33.设有如下定义:int x=10,y=3,z;则语句:
z=(x%y,x/y));
printf(“%dn”,Z);
的输出结果是(D)
A)B)0
C)4
D)3
34.以下程序的输出结果是(D).main()
{ int a=3;
printf(“%dn”,(a+a-=a*a));}
A)-6
B)12
C)0
D)–12
35.设有定义:int x=1,y=-1;则语句:
printf(“%dn”,(x--&++y);的输出结果是(B).A)1
B)0
C)-1
D)2
36.设有如下定义: int x=10,y=3,z;则语句: printf(“%dn”,z=x%y,x/y));的输出结果是
(D)。
A)1
B)0
C)4
printf(“n=%dn”,n);}
A)30
B)24
C)60
D)48 D)3
42.下面程序的运行结果是(B)
37.下列程序的输出结果是(A)
main()
main()
{ double
{int x=0,y=0;
while(!x)y+=++x;
printf(“%dn”,y);
}
d=3.2;
int x,y;
x=1.2;
y=(x+3.8)/5.0;
printf(“%d n”, d*y);
}
A)3
B)3.2
C)0
D)3.07
38.已知E的ASCII码是69,则执行以下语句的结果是(A)。
printf(“%c”,'D'-'8'+'5');
A)66
B)A
C)B
D)E 39.执行下面程序后,n的值为(C)。
main()
{int n,a=2,b=3,c=4;
n=(a
n=(n>b)?b:c;
n=(n A)5 B)4 C)3 D)2 40.以下程序执行完后,a 的值为(C) #inlcude void main() {int a; printf(“%dn”,(a=3*5,a*4,a+5));} A)65 B)20 C)15 D)10 41.下面程序的运行结果是(B) main() {int n; (n=6*4,n+6),n*2; A)1 B)0 C)控制表达式非法 D)程序执行无限次 43.下面程序的运行结果是(B) main() {int n,a=2,b=3,c=4; n=(a n=(n>b)?b:c; } A)5 B)4 C)3 44.以下程序的运行结果为 (C) 。D)2 main() {unsigned a=3,b=10; printf(“%dn”,a<<2|b>>1);} A)3 B)10 C)13 D)14 45.以下程序的运行结果为(A)。 main() {int x=17,y=26; printf(“%d”,y/=(x%=6));} A)5 B)8 C)2 D)26 46.以下程序的输出是(B). main() {int a,b,d=241; a=d/100%9; b=(-1)&&(-1); printf(“%d,%dn”,a,b);} A)6,1 B)2,1 C)6,0 D)2,0 47.下列程序段的输出结果是(A)。 int x=1 , y=1 , z;z=1||++x&&y--; printf(“n%d,%d,%d”,x,y,z); A)1,1,1 B)2,0,1 C)2,1,1 D)2,0,0 48.下列程序的运行结果是(B). #include main() {unsigned a,b,c; a=0x255;b=a<<4; x=(~b)&0xff; printf(“%f”,x);} a++<=25&&b--<=2&&c++ ? A)0x55 B)0xaf C)0x50 pritnf(“%d,%d,%dn”,a,b,c):printf(“%d,%d,%dn”,a,b,D)0xda 49.若有定义int a=25,b=14,c=19;则以下三目运算符构成的语句的执行结果是(B) 三、多选题 1.结构化程序设计思想应该包括(ABCD)。 (A)使用顺序、分支、循环三种基本结构;(B)限制使用goto语句; (C)应该使用自顶向下、逐步求精的方法;(D)应该使用模块化的方法; (E)编码过程中,变量名的命名只要程序员自己明白就可以了; c); A)25,14,19 B)26,13,19 C)25,13,19 D)26,14,19 2.2.对于scanf()函数,下列说法正确的是(ABD)。 A)如果相邻格式符之间没有数据分隔,则对应的输入数据之间可用空格、回车分隔。B)输入数据时不能指定精度。 C)在用格式说明符“%c”输入单个字符时,空格字符和转义字符是无效字符,即不能被输入。D)遇到空格、或者回车时,系统认为一个数据输入结束。 3.3.已知ch是字符型变量,下面正确的赋值语句是(BC)。 A)ch='123'; B)ch='xff'; C)ch='t'; D)ch=“"; 4.4.若有定义int a,b;float x;,则以下不正确的赋值语句是(ACD)。 A)a=1,b=2,B)b++; C)a=b= 5D)b=int(x); 四、填空题 1.在C语言中没有固有的输入和输出语句,但是用C语言编写的程序可以用函数调用的形式来实现输入、输出,这些函数由(标准I/O库/系统)提供。 2.语句printf(”%d“,(a=2)&&(b=-2));的输出结果是____1________。3.执行以下程序段后,a 的值是______1____.int a;a=-2*4%-5/2; 五、阅读程序 1.下列程序的运行结果是(3 2 1). main() {int x=1; {int x=2; {int x=3; printf(”%d“,x); } printf(”%d“,x); } printf(”%d",x); 关键词:C语言,scanf函数,格式输入 C语言本身不提供输入语句, 输入操作是由函数实现的。scanf函数就是最常用的一个, 它是C语言函数库中的“格式输入”函数。 C语言中格式输入的规定比较繁琐, 用得不对就得不到预期的结果, 而输入又是最基本的操作, 几乎每一个程序都包含它。在这几年的教学实践中, 我发现不少学生由于掌握不好这个知识点而浪费了大量调试程序的时间, 也为进一步学习造成了障碍, 因此, 这个知识点就成了教学的重点和难点。不过根据这几年的教学经验, 我觉得只要遵循规律, 精讲多练, 学生完全能够掌握这个知识点。下面我将这方面的体会进行一些归纳和总结。 首先, 要准确讲解scanf函数的一般格式, 这是教学的前提和基础: scanf函数一般格式是:scanf (格式控制, 地址表列) ; “格式控制”是用双引号括起来的字符串, 它包括两种信息: a.格式说明, 由“%”和“格式字符”组成, 它的作用是将输入的数据转换成指定的格式。 b.普通字符, 即需要原样输入的字符。 “地址表列”是由若干个地址组成的表列, 可以是变量的地址, 或字符串的首地址。 如输入dog坻 则‘d’送给a, ‘’送给b, ‘o’送给c, 因为%c只要求读入一个字符, 后面不需要用空格作为两个字符的间隔, 因此‘’作为下一个字符送给b。 d.在输入数据时, 遇到以下情况时该数据认为结束。 (1) 遇空格, 或按“回车”或“跳格” (Tab) 键。 (2) 按指定的宽度结束, 如“%3d”, 只取3列。 (3) 遇非法输入。 e.可以指定输入数据所占列数, 系统自动按它截取所需数据, 如: 系统自动将123赋给a, 将456赋给 b, 此方法也可用于字符型: 如果从键盘连续输入3个字符abc, 由于ch只能容纳一个字符, 系统就把第一个字符'a赋给ch。 f.输入数据时不能规定精度, 例如: 这是不合法的, 不能企图用这样的scanf函数输入以下数据而使a的值为12345.67. 最后, 还要补充的一点就是在使用C语言库函数时, 要用预编译命令“#include”将有关的“头文件”包括到用户源文件中, 在头文件中包含了与用到的函数有关的信息。但考虑到scanf函数使用频繁, 系统允许在使用此函数时可不加#include命令。 关键词:函数调用 库函数 案例 1 函数调用问题的提出 本人在教学过程中,出现了多次这种问题。在讲授函数的概念、函数的定义和函数的调用之后,给学生出一道题目用函数来实现,通常情况下,该问题如果不用函数方法而用其他方法做的话,学生可能会做得出来,但让他们必须用自定义函数的方法来实现,他们就感觉无从下手,并不是这个问题本身很难,归根结底,学生对于怎么自定义函数,定义多少个参数,怎么在主调函数中调用自己定义的被调函数不知道如何做。从而导致了用函数解决的问题却用其他方法实现。在这里,我个人通过自己的反复思量,为了提高讲授函数调用的教学效果,自己总结了几条经验。 2 函数调用问题方法讨论 要知道函数怎么调用,首先得知道用户怎么定义函数。 2.1 函数定义的一般格式: 类型标识符[3] 函数名(形式参数列表) { 声明部分 语句部分 } 这个格式定义的函数为有参函数,“形式参数列表”中的参数被称为形参,有些函数是无参函数,则“形式参数列表”可以没有,但括弧不能省略,即无参函数。 函数在使用之前要先声明、定义,然后才能调用[1]。 2.2 函数调用的一般形式为: 函数名(实参表列) 函数在程序中出现的位置来分,可以有以下三种函数调用方式[2]: ①函数语句 把函数调用作为一个语句,这种方式不要求函数带回值,如打印图形、显示字符串等。只要函数完成一定的操作。 ②函数表达式 函数出现在一个表达式中,这种表达式称为函数表达式。要求函数带回一个确定的值以参加表达式的运算。如:c=10*max(a,b),其中,函数max就是表达式的一部分。 ③函数参数 函数调用作为一个函数的实参,如:printf(“%d”,max(a,b));是把max(a,b)作为printf函数的一个参数。 2.3 函数问题案例讲解 ①首先从库函数的调用案例着手讲授,学生自然就很轻松上手。 众所周知,库函数中的数学函数学生从高中就经常接触到,在计算机教学的其他课程里面也会经常出现,如excel里面就有数学函数,学生们已经很熟悉了,如下面一道编程题就需要调用库函数解决。 用C语言求14+24+34+……94+104之和。 #include"math.h" main() {int n=10,k=4; long y=0; for(i=1;i<=n;i++) y=y+pow(i,k); printf("%d",y); } 其中,pow(i,k)就是系统自带的数学函数,i和k是它自带的两个参数,其功能是计算i的k次方。通过这个系统数学函数的调用程序的编写及调试,学生们很轻松就知道库函数怎么调用,即函数名加上函数括号里面的参数。 另外大家使用库函数的时候,一定要在本文件开头用#include命令,将调用有关库函数时所需用到的信息“包含”到本文件中来。该程序开头用语句# include"math.h",即可将数学库函数“包含”到主函数中来。 ②用大家熟悉且简短的函数编程案例入手讲解。 典型小案例教学具有很强的启发性,既有利于学生学习,也有利于老师教授。 用C语言函数实现1+2+3+……+20之和。 long fnsum(int n) {int i; long y=0; {for(i=1;i<=n;i++) y=y+i;} return y; } main() { int n=20; printf("%d",fnsum(n)); } 在这个程序代码中,程序行long fnsum(int n)是自定义函数,fnsum是函数名,n是定义的一个形参,也仅需要一个,表示1+2+……+20共有多少个数求和。由于fnsum函数代码写在main()函数之前,可以不进行声明。反之,若fnsum函数代码写在main()函数之后,必须用代码long fnsum(int n);进行声明。fnsum函数功能即是题目要完成的功能实现,最后通过main()主函数定义一个实参n并赋值20,在printf函数中通过代码printf("%d",fnsum(n)),调用了自定义函数fnsum,并将实参n=20传递给自定义函数fnsum(int n)中的形参n,最终将结果打印输出。 在main()主函数中,fnsum这个函数调用也可以改成如下: main() { int n=20,sum; sum=fnsum(n); printf("%d",sum); } 這个是通过函数表达式的方法进行函数调用,通过这个自定义函数的简单案例讲解,学生很轻松能够理解函数怎么自定义并在main()主函数中调用。 3 结束语 本文分析了C语言函数调用学习过程中存在的问题,在今后的教学过程中,本人将进一步努力提升自己,希望能总结出更多更好的方法来改进函数教学方法,使学生能够更轻松地上手学习。 参考文献: [1]汪明光.C++语言中函数指针的分析与应用[J].巢湖学院学报,2006,8(3):30-34. [2]谭浩强.C语言程序设计(第三版)[M].北京:清华大学出版社,2005.143-150. 在第一章中已经介绍过,C源程序是由函数组成的, 虽然在前面各章的程序中都只有一个主函数main, 但实用程序往往由多个函数组成。函数是C源程序的基本模块, 通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。 C语言不仅提供了极为丰富的库函数(如Turbo C,MS C 都提供了三百多个库函数),还允许用户建立自己定义的函数。用户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。 可以说C程序的全部工作都是由各式各样的函数完成的, 所以也把C语言称为函数式语言。 由于采用了函数模块式的结构, C语言易于实现结构化程序设计。使程序的层次结构清晰,便于程序的编写、阅读、调试。 在C语言中可从不同的角度对函数分类。 1. 从函数定义的角度看,函数可分为库函数和用户定义函数两种。 (1)库函数 由C系统提供,用户无须定义, 也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到printf 、scanf 、getchar 、putchar、gets、puts、strcat等函数均属此类。 (2)用户定义函数 由用户按需要写的函数。对于用户自定义函数, 不仅要在程序中定义函数本身, 而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。 2. C语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。 (1)有返回值函数 此类函数被调用执行完后将向调用者返回一个执行结果, 称为函数返回值。如数学函数即属于此类函数。 由用户定义的这种要返回函数值的函数,必须在函数定义和函数说明中明确返回值的类型。 (2)无返回值函数 此类函数用于完成某项特定的处理任务, 执行完成后不向调用者返回函数值。这类函数类似于其它语言的过程。 由于函数无须返回值,用户在定义此类函数时可指定它的返回为“空类型”, 空类型的说明符为“void”。 3. 从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。 (1)无参函数 函数定义、函数说明及函数调用中均不带参数。 主调函数和被调函数之间不进行参数传送。 此类函数通常用来完成一组指定的功能,可以返回或不返回函数值。 (2)有参函数 也称为带参函数。在函数定义及函数说明时都有参数, 称为形式参数(简称为形参)。在函数调用时也必须给出参数, 称为实际参数(简称为实参)。 进行函数调用时,主调函数将把实参的值传送给形参,供被调函数使用。 4. C语言提供了极为丰富的库函数, 这些库函数又可从功能角度作以下分类。 (1)字符类型分类函数 用于对字符按ASCII码分类:字母,数字,控制字符,分隔符,大小写字母等。 (2)转换函数 用于字符或字符串的转换;在字符量和各类数字量 (整型, 实型等)之间进行转换;在大、小写之间进行转换。 (3)目录路径函数 用于文件目录和路径操作。 (4)诊断函数 用于内部错误检测。 (5)图形函数 用于屏幕管理和各种图形功能, (6)输入输出函数 用于完成输入输出功能。 (7)接口函数 用于与DOS,BIOS和硬件的接口。 (8)字符串函数 用于字符串操作和处理。 (9)内存管理函数 用于内存管理。 (10)数学函数 用于数学函数计算。 (11)日期和时间函数 用于日期,时间转换操作。 (12)进程控制函数 用于进程管理和控制。 (13)其它函数 用于其它各种功能。 以上各类函数不仅数量多,而且有的还需要硬件知识才会使用,因此要想全部掌握则需要一个较长的学习过程。 应首先掌握一些最基本、最常用的函数,再逐步深入。由于篇幅关系,本书只介绍了很少一部分库函数, 其余部分读者可根据需要查阅有关手册。 还应该指出的是,在C语言中,所有的函数定义,包括主函数main在内,都是平行的。也就是说,在一个函数的函数体内, 不能再定义另一个函数, 即不能嵌套定义。但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。 函数还可以自己调用自己,称为递归调用。main 函数是主函数,它可以调用其它函数,而不允许被其它函数调用。 因此,C程序的执行总是从main函数开始, 完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序。一个C源程序必须有,也只能有一个主函数main。 函数定义的一般形式 1.无参函数的一般形式 类型说明符 函数名() { 类型说明 语句 } 其中类型说明符和函数名称为函数头。 类型说明符指明了本函数的类型,函数的类型实际上是函数返回值的类型。 该类型说明符与第二章介绍的各种说明符相同。 函数名是由用户定义的标识符,函数名后有一个空括号,其中无参数,但括号不可少。{} 中的内容称为函数体。在函数体中也有类型说明, 这是对函数体内部所用到的变量的类型说明。在很多情况下都不要求无参函数有返回值, 此时函数类型符可以写为void。 我们可以改为一个函数定义: void Hello() { printf (”Hello,world “); } 这里,只把main改为Hello作为函数名,其余不变。Hello 函数是一个无参函数,当被其它函数调用时,输出Hello world字符串。 2.有参函数的一般形式 类型说明符 函数名(形式参数表) 型式参数类型说明 { 类型说明 语句 } 有参函数比无参函数多了两个内容,其一是形式参数表, 其二是形式参数类型说明。在形参表中给出的参数称为形式参数, 它们可以是各种类型的变量, 各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。 形参既然是变量,当然必须给以类型说明。例如,定义一个函数, 用于求两个数中的大数,可写为: 本章重点: 本章难点: //函数相关内容: *语法:包括定义,声明,调用,*语义 语句包括:表达式语句,空语句,控制语句,复合语句,函数调形参与实参的意义、作用与区别; 参数的两种传递方式; 对递归函数调用过程的理解; 全局变量和局部变量的作用。函数的定义和调用; 函数间的数据传递方式; 嵌套调用和递归调用; 变量的作用域和存储类别; 模块化程序设计方法。用语句 函数:*函数首部:包括返回值类型,函数名,形参 *函数体 *函数调用的过程:*开辟空间(形参,函数的局部变量) 1.函数其实就是一段可以重复调用的、功能相对独立完整的程序段。 2.主函数可以调用其他函数,其他函数也可以互相调用。 3.一个C程序必须有一个且只能有一个main函数,无论main函数位于程序 的什么位置,运行时都是从main函数开始执行的。 4.函数不能嵌套定义,也就是说一个函数不能从属于另一个函数。函数之 *把实参送给形参 *执行函数 *释放空间 间可以互相调用,但是任何函数不能调用main函数,main函数是被操作系 统调用的。 5.函数的分类: (1)从用户角度看:库函数、用户自定义的函数(2)从形式:无参函数、有参函数 6.函数定义即函数的实现,是对所要完成功能的操作进行描述的过程,包 括函数命名和返回值类型声明、形式参数的类型说明、变量说明和一系 列操作语句等。 函数和变量一样,必须“先定义,后使用” 7.函数定义应包括以下内容: 函数的名字、返回值的类型。函数参数的类型和名字,无参函数不需要 指定。指定函数的功能 8.在函数体中,声明部分是对函数内部所用到的变量的类型说明,并对要 调用的函数进行声明。 9。定义有参函数的一般形式为: 类型标识符 函数名(形式参数表列){ 声明部分; } 语句; 10.在C语言中,可以用以下几种方式调用函数(1)函数表达式 函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式 的运算。这时要求函数是有返回值的。 例如:y=sin(x);(2)函数语句 函数调用的一般形式加上分号即构成函数语句。 例如:printf(“%d”,a); 这种方式通常只要求函数完成一定的操作,不要求函数带回值。(3)函数实参 这种方式是函数作为另一个函数调用的实际参数出现,也就是把该函 数的返回值作为实参进行数据传送,所以要求该函数必须是有返回值 的。 例如:printf(“%d”,max(a,b)); 11.实参:可以是常量、变量和表达式。 12.只有在发生函数调用时,才给形参分配单元,并且赋值,一旦函数调 用结束后,形参所占的内存单元又被释放掉。 13.在调用函数过程中发生的实参与形参间的数据传递是“值传递”,只 能由实参向形参传递数据,是单向传递,不能由形参传给实参。 14.声明的作用是把函数的返回值类型、函数名、函数参数的个数和类型 等信息通知编译系统,以便在遇到函数调用时,编译系统能识别该函 数并检查调用是否合法 15.函数的声明方法: (1)只说明函数的类型,这称为简单声明。int min();(2)不仅说明函数的类型还要说明参数的个数和类型,这称为原型声明。 int min(int x,int y); 16.数组名作函数参数时,形参数组和实参数组为同一数组,共同拥有一段 内存空间。 17.数组元素不能用作形参,因为形参是在函数调用时临时分配内存存储 单元的,不能为一个数组元素单独分配存储单元。 18.变量的有效范围(作用域) 19.局部变量也称为内部变量,是在函数内或函数的复合语句内定义说明的。 20.全局变量也称为外部变量,它是在函数外部定义的变量,位置在所有 函数前、各个函数之间或所有函数后。 *其作用域是从定义变量的位置开始到本源文件结束。 *设置全局变量的作用是可以增加各个函数之间的数据传输渠道。21.变量的完整说明为: 存储类型 数据类型 变量名表列; 例如: auto int x,y; 22.C语言变量的存储方式可以分为动态存储方式和静态存储方式。 23.动态存储方式:(1)自动变量(auto变量)(2)寄存器变量(register变量)(3)形式参数 24.静态存储方式: (1)静态局部变量(static局部变量) 其语法格式为: static 类型标识符 变量名; 例如:static int f; (2)全局变量(全局变量赋初值也是在编译时完成的,且仅执行一次赋初值的操作。) 不能用extern来初始化外部变量。 (3)静态外部变量 25.一般为了叙述方便,把建立存储空间的变量声明称定义,而把不需要 建立存储空间的声明称为声明 26.在函数中出现的对变量的声明(除了用extern声明的以外)都是定义。 例如:extern int x=25; //错误 初中函数练习题及答案 一、选一选,慧眼识金(每小题3分,共24分) 1.下列函数关系式:①,y=-2x ② y=-2/x , ③y=-2x2, ④y=2 , ⑤y=2x-1.其中是一次函数的是 ( ) (A)①⑤ (B)①④⑤ (C)②⑤ (D)②④⑤ 2.一个正比例函数的图象经过点(2,-1),那么这个正比例函数的表达式为 ( ) (A)y=2x (B)y=-2x (C)xy21 (D)xy2 1 3.函数y=-3x-6中,当自变量x增加1时,函数值y就 ( ) (A)增加3 (B)减少3 (C)增加1 (D)减少1 4.在同一直角坐标系中,对于函数:①y=-x-1 ②y=x+1 ③y=-x+1 ④y=-2(x+1)的图象,下列说法正确的是 (A)通过点(-1,0)的是①和③ (B)交点在y轴上的是②和④ (C)互相平行的是 ①和③ (D)关于x轴平行的是②和③ 5.一次函数y=-3x+6的图象不经过 ( ) (A)第一象限 (B)第二象限 (C)第三象限 (D)第四象限 6.已知一次函数y=ax+4与y=bx-2的图象在x轴上交于同一点,则a b 的值为 ( ) (A)4 (B)-2 (C)-2/1 (D)2/1 7.小明、小强两人进行百米赛跑,小明比小强跑得快, 如果两人同时跑,小明肯定赢,现在小明让小强先跑若 干米,图中的射线a、b分别表示两人跑的路程与小明 追赶时间的关系,根据图象判断:小明的速度比小强的 速度每秒快 A、1米 B、1.5米 C、2米 D、2.5米 8.如图中的图象(折线ABCDE)描述了一汽车在某一直线 上的行驶过程中,汽车离出发地的距离s(千米)和行驶时 间t(小时)之间的函数关系,根据图中提供的信息,给出 下列说法:①汽车共行驶了120千米;②汽车在行驶途中停 留了0.5 小时;③汽车在整个行驶过程中的平均速度为 3 80 千米/时;④汽车自出发后3小时至4.5小时之间行驶的速度 在逐渐减少.其中正确的说法共有( ) A、1个 B、2个 C、3个 D、4个 二、填一填,画龙点睛(每小题 4分,共32分) 1.某种储蓄的月利率为0.15%,现存入1000元,则本息和y(元)与所存月数x之间的函数关系式是 . 2. 一次函数y= -2x+4的图象与x轴交点坐标是 ,与y轴交点坐标是 与坐标轴围成的三角形面积是 。 3.下列三个函数y= -2x, y= - 14 x, y=(2 - 3 )x共同点是(1) ; (2) ;(3) . 4.如图,直线m对应的函数表达式是。 5.一次函数y=kx+b的图象如图所示,则k 0,b 0( 填“>”、“=”或 “<”) 6.写出同时具备下列两个条件的一次函数表达式(写出一个即可) . (1)y随着x的增大而减小。 (2)图象经过点(1,-3) 7.某人用充值50元的IC卡从A地向B地打长途电话,按通话时间收费,3分钟内收费2.4元,以后每超过1分钟加收1元,若此人第一次通话t分钟(3≤t≤45),则IC卡上所余的费用y(元)与t(分)之间的关系式是 . 8.如图,已知A地在B地正南方3千米处,甲乙两人同时分 别从A、B两地向正北方向匀速直行,他们与A地的距离S(千米)与所行的时间t(小时)之间的函数关系图象如图所示的AC和BD给出,当他们行走3小时后,他们之间的距离为 千米. 三、做一做,牵手成功(本大题共64分) 1.(9)为了保护学生的视力,课桌椅的高度都是按一定的关系配 套设计的。研究表明,假设学生的课桌高度为y(㎝),椅子的高度(不含靠背)为x(㎝),则y 应是x的一次函数。下表列出两 套符合的课桌椅的高度: 2、(9)随着我国人口增长速度的减慢,小学入学儿童数量有所减少.下表中的数据近似地呈现了某地区入学儿童人数的变化趋势. 3、(9)在某地,人们发现某种蟋蟀1分钟所叫次数与当地温度之间近似为一次函数关系。 下面是蟋蟀所叫次数与温度变化情况对照表: 4.(9)旅客乘车按规定可携带一定重量的行李,如果超过规定则需购行李票,设行李费y(元)是行李重量x(千克)的一次函数,其图象如图所示。 (1)求y与x之间的`函数关系式; (2)旅客最多可免费携带多少千克行李? 5.(14)已知某一次函数的图象经过点(0, -3),且与正比例函数y= 12 x的图象相交于 点(2,a),求 (1) a的值。 (2)k、b的值。 (3)在同一直角坐标系中画出这两个函数的图象。 (4)这两个函数图象与x轴所围成的三角形面积。 6.(14)某单位急需用车,但又不需买车,他们准备和一个个体车或一国营出租公司中的一家签订月租车合同。设汽车每月行驶x千米,应付给个体车主的月租费为y1 元,应付给国 营出租公司的月租费为y2 元,y1 、y2 与x之间的函数关系(两条射线)如图所示,观察图 象回答下列问题: (1)每月行驶路程在什么范围内时,租用国营 出租公司的车合算? (2)每月行驶路程是多少时,两家的费用相同? (3) 每月行驶在什么范围内时,租用个体车合算? (4) 这个单位估计每月行驶的路程在2300千米 左右,则租用哪家车合算? 答案: 第一题:(1—8)A、D、B、C、C、C、D、A 第二题: 1、y=1.5x+1000 2、(2,0)(0,4)、4 3、都是正比例函数;都过二、四象限;y都随x的增大而减小; 4、y=-12 x+1 5、<;< 6、y=-x-2(符合即可) 7、y=50.6-t 8、1.5 第三题: 1、y=1.6x+11;高为78.2 2、y=-190x+382520; 3、y=7x-21; 12摄氏度 4、y=1/6x-5; 30千克 5、a=1; k=2,b=-3; 三角形面积3/4 随着计算机技术的飞速发展及应用领域的扩大, 熟练掌握一门语言已变的尤为关键。C语言这门课程在计算机的基础教学中一直占有比较重要的地位, 然而要想突破C语言的学习, 对函数和指针的掌握是非常重要的, 本文将具体针对函数和指针的关系做详尽的介绍。 一、函数的有关概念 为了使程序的编写更加清晰、直观且易于修改, C语言中引用了函数。所谓函数, 就是一个程序模块, 该模块用来完成一个特定的程序功能。引用一个函数时, 需要包括对函数的定义、声明, 继而调用。在掌握函数相关概念的同时, 有以下几点需要注意: (1) 调用函数和被调用函数 由上例可以看出, 函数A在执行的过程中包括了对函数B的调用, 则函数A称为调用函数 (调用函数B) , 而函数B被函数A调用, 称为被调用函数。 (2) 实参和形参 调用函数中定义的变量是实参, 被调用函数中定义的变量是形参。如上例, 函数A中的变量a是实参, 函数B中的变量b是形参。 (3) 实参变量和形参变量之间的独立性 实参变量和形参变量之间只存在值的传递过程, 实参变量的存储空间在调用函数中分配, 而形参变量的存储空间在被调用函数中分配, 被调用函数执行完毕后, 其所分配的存储空间被释放, 即形参变量的存储空间被释放, 它不会返回值给实参变量, 也不会参与调用函数的继续执行。例如 (实现两个数的交换) : 显然, 函数main是调用函数 (调用函数swap) , 函数swap是被调用函数。main函数中的a, b由main函数分配存储空间, 而swap函数中的a, b由swap函数分配存储空间。main函数执行到swap函数时, 调用swap函数, swap函数为其变量分配存储空间, 然后实现了swap函数中变量a, b的值交换, 执行完毕后即释放其分配变量的存储空间。继而, main函数继续执行, 但其变量a, b没有做任何改变, 即main函数不能实现a, b的交换。由上例可以看出, 若单纯的使用变量, 则被调用函数无法改变调用函数中的变量值, 即swap函数无法实现main函数中变量a, b的交换。 二、指针的有关概念 指针是C语言中功能最强大, 使用最广泛的一种数据类型, 主要用于描述存储单元的地址。通过使用指针, 可以在函数中进行传址调用。 (1) 指针变量的定义 定义指针变量的一般形式:类型标识符*变量名;其中, 变量名前的符号“*”表示将要定义的变量, 类型说明符表示该指针变量所指向数据的类型。例如:int*p1;char*p2;float*p3; (2) 指针变量的引用 &为取地址运算符, 其一般形式为:&变量名, 例如: int x=3, *p;p=&x;指针变量p指向变量x。 在使用x的值时, 可以直接使用x, 也可以用*p来代替使用x。此外, 指针变量一定是和它所对应的变量相互引用, 即指针变量在使用时一定要有明确的指向, 必须赋予具体的值, 否则将可能导致错误。 三、指针与函数的关系 在函数的编写过程中, 若单纯的只用变量参数, 则无法实现被调用函数改变调用函数中变量值的目的。而为了实现这一目的, 就需要函数和指针之间的结合使用。 (1) 引用指针, 可以实现调用函数和被调用函数中的指针变量共同指向调用函数中的存储单元, 从而实现被调用函数改变调用函数中变量值的目的。例如: 由上例可以看出, 在调用函数 (main函数) 中定义了变量a和指针变量p1, 被调用函数 (change函数) 中定义了指针变量p2。程序首先从main函数开始执行, 分配变量a和指针变量p1的存储单元, 此时指针变量p1指向变量a (p1=&a) 。当程序执行到change函数时, 程序跳转到change函数执行其函数体, change函数为其指针变量p2分配存储单元, 同时p2也得到了p1传过来的值 (变量a的地址) , 此时p2也指向了调用函数中的变量a, 即实现了p1和p2共同指向了调用函数中的存储单元 (变量a的存储单元) , change函数执行其函数体 (*p2=3) , 即使a的值变为3。change函数执行完毕后, 释放其变量的存储空间, 转而继续执行main函数, 此时a的值已经发生改变 (由2变为3) , 实现了被调用函数改变调用函数中变量值的目的。 (2) 调用函数和被调用函数中实参和形参之间的关系图 被调用函数执行完毕后, 释放它所分配的存储单元, 而调用函数分配的存储单元仍继续使用。此外, 只有当调用函数中传指针值 (即实参是指针值) , 而被调用函数中引用变量 (即形参收到指针值后, 在函数体内引用变量值) , 才能达到改变的目的。 例如, 实现变量a和b的交换, 程序如下: 例1虽然传的是指针值, 但在函数体的执行过程中引用的仍然是指针值 (引用x和y) , 所以不能实现a和b的交换;例2程序传指针值后, 引用变量 (*x和*y, 即a和b) , 所以能实现a和b的交换。 四、结束语 在以后的编程过程中, 若遇到想通过被调用函数改变调用函数中变量值的目的, 则可以把该变量的地址值传给被调用函数, 从而达到改变的目的。鉴于文章篇幅及个人能力有限, 本文肯定还存在许多不足之处, 仅供大家学习和参考。 参考文献 [1]谭浩强.C程序设计[M].二版.清华大学出版社, 2004. [2]杜友福.C语言程序设计[M].二版.科学出版社, 2007. 这种方式很简单,只是简单地将main字符串用宏来代替,或者使用##拼接字符串,示例程序如下: #include #define begin main int begin(void) { printf(“Hello, World!”); return 0; } #include #define begin m##a##i##n int begin(void) { printf(“Hello, World!”); return 0; } 严格来说,这种方式只算是一种技巧...... 2、_start函数 _start函数是C程序的入口函数,会调用main函数。在调用main函数之前,会先执行_start函数分配必要的资源,然后再调用main函数。但是在用gcc编译程序时可以使用-nostartfiles选项来重写_start函数。示例程序如下: #include #include _start(void) { printf(“Hello, World!”); exit(0); } 编译上面的程序的命令为: gcc -nostartfiles _start.c -o a.out 反汇编生成的可执行程序,如下所示: a.out: file format elf64-x86-64 Disassembly of section .plt: 0000000000400320 : 400320: ff 35 ea 01 20 00 pushq 0x2001ea(%rip) # 600510 <_GLOBAL_OFFSET_TABLE_+0x8> 400326: ff 25 ec 01 20 00 jmpq *0x2001ec(%rip) # 600518 <_GLOBAL_OFFSET_TABLE_+0x10> 40032c: 0f 1f 40 00 nopl 0x0(%rax) 0000000000400330 : 400330: ff 25 ea 01 20 00 jmpq *0x2001ea(%rip) # 600520 <_GLOBAL_OFFSET_TABLE_+0x18> 400336: 68 00 00 00 00 pushq $0x0 40033b: e9 e0 ff ff ff jmpq 400320 0000000000400340 400340: ff 25 e2 01 20 00 jmpq *0x2001e2(%rip) # 600528 <_GLOBAL_OFFSET_TABLE_+0x20> 400346: 68 01 00 00 00 pushq $0x1 40034b: e9 d0 ff ff ff jmpq 400320 Disassembly of section .text: 0000000000400350 <_start>: 400350: 55 push %rbp 400351: 48 89 e5 mov %rsp,%rbp 400354: bf 68 03 40 00 mov $0x400368,%edi 400359: e8 d2 ff ff ff callq 400330 40035e: bf 00 00 00 00 mov $0x0,%edi 400363: e8 d8 ff ff ff callq 400340 exit@plt 上面的结果是完整的反汇编结果,我们可以看到_start函数中只有我们调用printf和exit函数相关的一些指令,并且.txt段中只有_start函数,没有看到main函数。如果将源代码中的_start替换为main,重新编译程序,反汇编的结果中会看到_start函数会调用到main。 另外还有一点需要注意,因为这里重写了_start函数,所以gcc为默认的main函数准备的清理动作就没用上,所以如果退出的时候直接使用return,会导致程序崩溃。所以这里要使用exit来退出程序。具体的原因可以参见这篇文章。 3、gcc的-e选项 示例程序如下: #include #include int nomain(int i, int j, int k) { printf(“Hello, World!”); exit(0); } 将上面的程序保存为m.c,编译命令如下所示: gcc -nostartfiles -e nomain m.c -o a.out 继续使用objdump反汇编生成的可执行程序,结果如下: a.out: file format elf64-x86-64 Disassembly of section .plt: 0000000000400320 : 400320: ff 35 f2 01 20 00 pushq 0x2001f2(%rip) # 600518 <_GLOBAL_OFFSET_TABLE_+0x8> 400326: ff 25 f4 01 20 00 jmpq *0x2001f4(%rip) # 600520 <_GLOBAL_OFFSET_TABLE_+0x10> 40032c: 0f 1f 40 00 nopl 0x0(%rax) 0000000000400330 : 400330: ff 25 f2 01 20 00 jmpq *0x2001f2(%rip) # 600528 <_GLOBAL_OFFSET_TABLE_+0x18> 400336: 68 00 00 00 00 pushq $0x0 40033b: e9 e0 ff ff ff jmpq 400320 0000000000400340 400340: ff 25 ea 01 20 00 jmpq *0x2001ea(%rip) # 600530 <_GLOBAL_OFFSET_TABLE_+0x20> 400346: 68 01 00 00 00 pushq $0x1 40034b: e9 d0 ff ff ff jmpq 400320 Disassembly of section .text: 0000000000400350 400350: 55 push %rbp 400351: 48 89 e5 mov %rsp,%rbp 400354: 48 83 ec 10 sub $0x10,%rsp 400358: 89 7d fc mov %edi,-0x4(%rbp) 40035b: 89 75 f8 mov %esi,-0x8(%rbp) 40035e: 89 55 f4 mov %edx,-0xc(%rbp) 400361: bf 75 03 40 00 mov $0x400375,%edi 400366: e8 c5 ff ff ff callq 400330 40036b: bf 00 00 00 00 mov $0x0,%edi 400370: e8 cb ff ff ff callq 400340 从上面我们可以看到指定的nomain函数位于.text段的开始位置,同样在函数结束的时候没有gcc为main函数准备的清理动作,所以在这里也只能使用exit()来退出程序,而不能使用return, 4、nostartfiles选项 前面已经多次使用了该选项,不过都是配合其他选项使用的,这个选项也可以单独使用,其含义为“Do not use the standard system startup files when linking”。 示例程序如下: #include #include void func() { printf(“I am func....”); } int nomain1(int i, int j, int k) { func(); printf(“%s: Hello, World!”, __func__); exit(0); } 上面的程序保存为k.c,然后使用下面的命令编译: [root@CentOS_190 ~]# gcc -nostartfiles p.c /usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400398 【c语言函数习题答案】推荐阅读: c语言之指针数组函数09-21 c语言课后习题答案10-13 c语言程序设计复习题10-28 C语言编程期末试题答案10-08 《C语言程序设计》精品试题(附讲解答案)06-10 函数的基本性质习题课07-15 c语言总结07-15 c语言概念题09-22 C语言教学建议10-25 c语言递归程序11-06c语言函数习题答案 篇2
C语言教学中函数调用问题探讨 篇3
五、(C语言)函数 篇4
C语言函数知识点总结 篇5
初中函数练习题及答案 篇6
C语言中的函数与指针 篇7
C语言main函数生成可执行法 篇8