c语言第8章函数
- 格式:doc
- 大小:94.50 KB
- 文档页数:14
C语言程序设计-第三版-谭浩强主编第6—8章课后习题答案第六章循环语句6.1输入两个正数,求最大公约数和最小公倍数.#includevoidmain(){inta,b,num1,num2,temp;printf(\请输入两个正整数:\\n\canf(\if(num1temp=num1;num1=num2;num2=temp;}a=num1,b=num2;while(b!=0){temp=a%b;a=b;b=temp;}printf(\它们的最大公约数为:%d\\n\printf(\它们的最小公倍数为:%d\\n\}编译已通过6.2输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数.解:#includevoidmain(){charc;intletter=0,pace=0,degit=0,other=0;printf(\请输入一行字符:\\n\while((c=getchar())!='\\n'){if(c>='a'&&c<='z'||c>'A'&&c<='Z')letter++;eleif(c=='')pace++;eleif(c>='0'&&c<='9')digit++;eleother++;}printf(\其中:字母数=%d空格数=%d数字数=%d其它字符数=%d\\n\digit,other);}6.3求(n)=a+aa+aaa++aaa之值,其中a是一个数字,n表示a的位数。
解:voidmain(){inta,n,count=1,n=0,tn=0;printf(\请输入a和n的值:\\n\canf(\printf(\while(count<=n){tn=tn+a;n=n+tn;a=a某10;++count;}printf(\\\n\}6.4求(即1+2!+3!+4!++20!)voidmain(){floatn,=0,t=1;for(n=1;n<=20;n++){t=t某n;=+t;}printf(\\\n\}阶乘利用递归,再求和:#includeuingnamepacetd;longFunc(intn){ if(1==n)returnn;if(n>1)returnn某Func(n-1);}main(){long=0;inti=1;while(i<=6){=+Func(i);i++;}cout<6.5求voidmain(){intk,N1=100,N2=50,N3=10;float1=0.0,2=0.0,3=0.0;for(k=1;k<=N1;k++)/某计算1到100的和某/{1=1+k;}for(k=1;k<=N2;k++)/某计算1到50各数平方和某/{2=2+k某k;}for(k=1;k<=N3;k++)/某计算1到10各数倒数之和某/{3=3+1.0/k;}printf(\总和=%8.2f\\n\}已通过intmain(){intk=1,i=11,j=51;float=0.0;while(k<=10){=+k+k某k+1.0/k;while(k==10&&i<=50){=+i+i某i;while(i=50&&j<=100){ =+j;j++;}i++;}k++;}}6.6所谓“水仙开数”是指一个3位数,其个位数字立方和等于该数本身。
一、选择题1.以下数组定义中,错误的是:C)int a[3]={1,2,3,4};2.以下数组定义中,正确的是:B) int a[][2]={1,2,3,4};3.设有定义“int a[8][10];”,在VC中一个整数占用4字节,设a的起始地址为1000,则a[1][1]的地址是:D)10444.已知有数组定义“int a[][3]={1,2,3,4,5,6,7,8,9};”,则a[1][2]的值是:C)65.在以下字符串定义、初始化和赋值运算中,错误的是:A) char str[10];str=”String”;6.设有以下字符串定义,char s1[]={‘S’,’t’,’r’,’i’,’n’,’g’};char s2[]=”String”;则s1和s2:C)长度不同,但内容相同。
7.设有定义“int a[10]={0};”,则说法正确的是:A)数组a有10个元素,各元素的值为0.8.设已定义“char str[6]={‘a’,’b’,’\0’,’c’,’d’,’\0’};”,执行语句“printf(“%s”,str)”后,输出结果为:B)ab9.引用数组元素时,数组元素下标不可以是:C)字符串10.已定义字符串S1和S2,以下错误的输入语句是:C)gets(s1,s2);11.下面程序段的运行结果是:A)123void main(){char a[]=”abcd”,b[]=”123”;strcpy(a,b);printf(“%s\n”,a);}12.下面程序段的运行结果是:A)123void main(){char a[]=”123”,b[]=”abcd”;if(a>b)printf(“%s\n”,a);else printf(“%s\n”,b);}二、编程题1.一维数字a的值已经,请把数组中的值按逆序存放,然后输出数组。
例如数组中原来的值为3,4,2,1,6,颠倒后变成6,1,2,4,3.#include<stdio.h>main(){int i,a[5]={2,3,45,12,5},t;printf("转换前:");for(i=0;i<5;i++)printf("%d\t",a[i]);for(i=0;i<5/2;i++){t=a[i];a[i]=a[5-i-1];a[5-i-1]=t;}printf("\n转换后:");for(i=0;i<5;i++)printf("%d\t",a[i]);}2.输入一个整数(位数不确定),从高位到低位依次输出各位数字,其间用逗号分隔。
8.1 编写两个函数,分别求两个证书的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果,两个整数由键盘输入。
void main(){ int Mgy(int x,int y);int Mgb(int z);int a,b,mgy,mgb;printf("请输入两个数:\n");scanf("%d,%d",&a,&b);mgy=Mgy(a,b);mgb=Mgb(a,b,mgy);printf("两个数的最大公约数为%d,最小公倍数为%d\n",mgy,mgb);}int Mgy(int x,int y){ int r,temp;if(x<y){ temp=x;x=y;y=temp;}while(x%y!=0){ r=x%y;x=y;y=r;}return y;}int Mgb(int x,int y,int z){ return (x*y/z);}8.2 求方程ax²+bx+c=0的根,用三个函数分别求当b²-4ac大于零、等于零和小于零时的根,8.3编写一个判素数的函数,在主函数输入一个整数,输出是否是素数的信息。
#include<math.h>void main(){ int Isprime(int a);int m,temp=0;printf("请输入一个数:\n");scanf("%d",&m);temp=Isprime(m);if(temp==0) printf("%d不是素数。
\n",m);else printf("%d是素数。
\n",m);}int Isprime(int a){ int i,k,flag;if(a==0||a==1) flag=0;else{ k=sqrt(a);for(i=2;i<=k;i++)if(a%i==0) flag=0; }return flag; }8.8 写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字间空一格空8.9编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符8.10 写一个函数,输入一行字符,将此字符串中最长的单词输出。
第八章函数8、1 函数概述1、C语言的函数:C语言的函数是子程序的总称,包括函数和过程。
(有返回值、无返回值,教材中称为:有返回值函数,无返回值函数)。
C语言函数可以分为库函数、用户自定义函数。
库函数由系统提供,程序员只需要使用(调用),用户自定义函数需要程序员自己编制。
2、C语言的程序由函数组成,函数是C语言程序的基本单位。
前面章节介绍的所有程序都是由一个主函数main组成的。
程序的所有操作都在主函数中完成。
事实上,C语言程序可以包含一个main函数,也可以包含一个main函数和若干个其它函数。
C语言程序的结构如图所示。
在每个程序中,主函数main是必须的,它是所有程序的执行起点,main函数只调用其它函数,不能为其它函数调用。
如果不考虑函数的功能和逻辑,其它函数没有主从关系,可以相互调用。
所有函数都可以调用库函数。
程序的总体功能通过函数的调用来实现。
3、使用函数的意义(补充)有些同学提出,我只用一个main函数就可以编程,为什么这么复杂,还要将程序分解到函数,还要掌握这么多概念,太麻烦了?我们说对于小程序可以这样做,但是对于一个有一定规模的程序这样做就不合适了。
使用函数的几个原因:(1)使用函数可以控制任务的规模一般应用程序都具有较大的规模。
例如:一个齿轮误差分析软件系统的源程序行数要数千行。
一个传动链计算机辅助设计系统的源程序行数5万多行。
使用函数可以将程序划分为若干功能相对独立的模块,这些模块还可以再划分为更小的模块,直到各个模块达到程序员所能够控制的规模。
然后程序员再进行各个模块的编制。
因为各个模块功能相对独立,步骤有限,所以流程容易控制,程序容易编制,修改。
一般一个模块的规模控制在源程序60行以内(但是也不必教条化)。
(2)使用函数可以控制变量的作用范围变量在整个模块范围内全局有效,如果将一个程序全部写在main()函数内,大家可以想象,变量可以在main函数内任何位置不加控制地被修改。
c语⾔程序设计第五版课后答案谭浩强第⼋章课后答案c语⾔程序设计第五版课后答案谭浩强习题答案第⼋章善于利⽤指针本章习题均要求使⽤指针⽅法处理。
1. 输⼊3个整数,要求按由⼩到⼤的顺序输出。
解题思路:先获取到三个变量的地址,然后获取三个数据,通过指针进⾏⽐较转换即可答案:#include <stdio.h>void swap(int *p_a, int *p_b){int temp = *p_a;*p_a = *p_b;*p_b = temp;}int main(){int a, b, c, *p_a = &a, *p_b = &b, *p_c = &c; // 获取每个变量空间的地址printf("Please enter three numbers:");scanf_s("%d%d%d", p_a, p_b, p_c);if (*p_a > *p_b) {swap(p_a, p_b);//通过指针进⾏指向空间内的数据交换}if (*p_a > *p_c) {swap(p_a, p_c);}if (*p_b > *p_c) {swap(p_b, p_c);}printf("%d %d %d\n", *p_a, *p_b, *p_c);system("pause");return 0;}2. 输⼊3个字符串,要求按由⼩到⼤的顺序输出。
解题思路:字符串的⽐较可以使⽤strcmp函数,返回值>0表⽰⼤于,返回值⼩于0表⽰⼩于,返回追等于0表⽰相同。
其他的⽐较排序思路与数字的排序交换没有区别,逐个进⾏⽐较先找出最⼤的,然后找出第⼆⼤的。
答案:#include <stdio.h>int main(){char str[3][32];char *p[3];printf("Please enter three strings:");for (int i = 0; i < 3; i++) {p[i] = str[i];scanf_s("%s", p[i], 32);//后边的数字限制缓冲区边界,防⽌缓冲区溢出访问越界}//让p[0]和p[1]/p[2]分别进⾏⽐较,找出最⼤的字符串,i+1之后,则让p[1]和p[2]进⾏⽐较,找出第⼆⼤//i循环总个数-1次,最后⼀个是不需要⽐较的for (int i = 0; i < 2; i++) {for (int j = i + 1; j < 3; j++) {if (strcmp(p[i], p[j]) > 0) {char *tmp = p[i]; p[i] = p[j]; p[j] = tmp;}}}printf("%s %s %s\n", p[0], p[1], p[2]);system("pause");return 0;}3. 输⼊10个整数,将其中最⼩的数与第⼀个数对换, 把最⼤的数与最后⼀个数对换。
第8章函数1.以下程序的输出结果是( )A、6 9 9B、6 6 9C、6 15 15D、6 6 15int d=1;fun(int p){ static int d=5;d+=p;printf("%d ",d);return(d);}main( ){ int a=3;printf("%d \n",fun(a+fun(d)));}答案:C注解:函数fun调用两次,第一次调用的实参是全局变量d的值1,在函数调用执行过程中,输出的是局部静态变量d;第二次调用的实参是第一次调用的返回值和变量a的和,输出的仍是局部静态变量d的值。
注意静态变量的定义和初始化是在第一次使用时进行的,在以后的使用过程中,保留上一次的值,不再初始化。
2.若有以下调用语句,则不正确的fun函数的首部是()A、void fun(int m,int x[])B、void fun(int s,int h[41])C、void fun(int p,int *s)D、void fun(int n,int a)main( ){ …int a[50],n;…fun(n,&a[9]);…}答案:D注解:从主函数中fun函数的调用格式可以看出,fun函数的两个形参的类型,第一个形参是整型变量,第二个形参是变量的地址,则必须是数组名或者是指针。
3.有如下函数调用语句func(rec1,rec2+rec3,(rec4,rec5));该函数调用语句中,含有的实参个数是()A、3B、4C、5D、有语法错答案:A注解:该函数调用语句中,含有的实参分别是rec1,rec2+rec3表达式计算后的值和(rec4,rec5)逗号表达式计算后值。
4.有如下程序int runc(int a,int b){ return(a+b);}main( ){ int x=2,y=5,z=8,r;r=func(func(x,y),z);printf("%d\n",r);}该程序的输出的结果是()A、12B、13C、14D、15答案:D注解:函数func第一次调用的返回值作为第二次调用的实参,第一次调用func(x,y)即func(2,5)的返回值是7,第二次调用func(7,z)即func(7,8)的返回值是15,所以r的值为15。
5.有如下程序long fib(int n){ if(n>2)return(fib(n-1)+fib(n-2));else return(2);}main( ){printf("%d\n",fib(3));该程序的输出结果是()A、2B、4C、6D、8答案:B注解:函数fib是递归函数,递归终止条件是n<=2。
则fib(3)的调用过程是:条件n>2成立,则再次调用fib(2)和fib(1),而fib(1)和fib(2)在函数调用时,不再递归调用,均返回2到它的上一级调用,即到调用fib(3)的执行过程,所以fib(3)调用返回值为4。
6.在C语言中,函数的隐含存储类别是()A、autoB、staticC、externD、无存储类别答案:C7.以下所列的各函数首部中,正确的是()A、void play(var:Integer,var b:Integer)B、void play(int a,b)C、void play(int a,int b)D、Sub play(a as integer,b as integer)答案:C注解:选项A、D不是C语言的函数定义格式,C语言在函数定义的函数头部,形参的定义是每一个形参都要有自己的关键字。
8.以下程序的输出结果是()A、0B、29C、31D、无定值fun(int x,int y,int z){ z=x*x+y*y;}main( ){ int a=31;fun(5,2,a);printf("%d",a);}答案:C注解:函数fun的调用时,参数传递是传值方式,所以形参值的变化并不会影响实参值的变化,故变量a的值保留原值。
9.当调用函数时,实参是一个数组名,则向函数传送的是()A、数组的长度B、数组的首地址C、数组每一个元素的地址D、数组每个元素中的值答案:B注解:函数调用时,参数是数组名或指针时,参数传递是传地址方式。
10.以下只有在使用时才为该类型变量分配内存的存储类说明是()A、auto和staticB、auto和registerC、register和staticD、extern和register答案:B11.以下程序的输出结果是()A、1B、2C、3D、4long fun( int n){ long s;if(n= =1 || n= =2)s=2;else s=n-fun(n-1)return s;}main( ){ printf("%ld\n",fun(3));}答案:A注解:fun函数调用是递归调用,主函数中fun(3)调用的执行过程是:初始n=3,if语句的条件n= =1 || n= =2不成立,执行else子句,再次调用fun函数,s=3-fun(2),则此次执行过程中,if语句的条件n= =1 || n= =2成立,执行if后的子句s=2;,然后再返回到调用它的上一级函数fun(3),fun(3)调用再返回到主函数,返回值为1。
12.以下程序的输出结果是()main( ){ int num= 0;while(num<=2){ num++;printf("%d\n",num);}A、1B、1C、1D、l2 2 23 34答案:B注解:循环的执行过程是:(1)变量num的初值为0,则条件num<=2满足,执行循环体,输出num自增后的值1;(2)变量num的值变为1,条件满足,输出num自增后的值2;(3)变量num的值变为2,条件满足,输出num自增后的值3;(4)变量num的值变为3,条件不满足,则退出循环的执行。
13.以下程序的输出结果是()int f( ){static int i=0;int s=1;s+=i;i++;return s;}main( ){int i,a=0;for(i=0;i<5;i++)a+=f();printf("%d\n",a);}A、20B、24C、25D、15答案:D注解:在主函数中,函数f( )被调用5次,第一次调用时定义静态变量i,并给i赋初值0,s累加和为1,变量i的值自增为1,将s值返回给a,则a的值为1,第二次调用时,静态变量i保留第一次调用时的值1,s 累加和为2,变量i的值自增为2,将s值返回到a+=f( ),则a的值为1+2=3,第三、四、五次调用类似执行。
14.以下程序的输出结果是()f(int b[ ],int m,int n){int i,s=0;for(i=m;i<n;i=i+2) s=s+b[i];return s;}main( ){int x,a[ ]={1,2,3,4,5,6,7,8,9};x=f(a,3,7);printf("%d\n",x);}A、10B、18C、8D、15答案:A注解:函数f(a,3,7)调用时,a是传数组地址,形参数组b与a使用同一片存储空间。
f函数的执行是循环控制变量I的初值是3,变量s中累加上b[3]的值4,s的值为4,然后变量I增为5,条件I<7成立,s中累加上b[5]的值6,s的值为10,变量I的值增为7,条件不成立,则退出循环,返回值给x,则最后输出的值为10。
填空题1.以下程序的输出结果是____________________main( ){int x=0;sub(&x,8,1);printf("%d\n",x);}sub(int *a,int n,int k){if(k<=n) sub(a,n/2,2*k);*a+=k;}答案:注解:函数调用sub(&x,8,1),将变量x的地址传给指针变量a,数值8传给n,数值1传给k,在函数体的执行中,条件k<=n成立,再次调用sub(a,4,2)函数,执行函数体,条件k<=n成立,第三次调用sub(a,2,4)函数,数值2传给n,数值4传给k,执行循环体,条件不成立,执行语句*a+=k;,指针a所指单元内的值为4,返回上一级调用,执行语句*a+=k;,指针a所指单元内的值为6,再一次返回到第一次函数调用,执行语句*a=k;,指针a所指单元内的值为7,则变量x的值为7。
2.以下程序输出的最后一个值是_____________int ff(int n){ static int f=l;f=f*n;return f;}main( ){ int i;for(i=1;i<=5;i++ ) printf("%d\n",ff(i));}答案:120注解:函数ff在循环中调用5次,第一次调用ff(1),函数体执行,静态变量f的值为1,执行1*n,返回值为1,第二次调用ff(2),静态变量f的值保留第一次调用的值1,执行1*n,返回值为2,依次类推,第五次调用ff(5),f保留第四次调用的值24,执行24*n=24*5=120,返回值为120。
3.以下函数的功能是:求x的y次方,请填空。
double fun( double x,int y){ int i;double z;for(i=1,z=x;i<y;i++) z=z*_______;return z;}答案:x注解:求x的y次方,即是x*x*…*x,一共有y个x相乘,在for循环中,变量z用为存放累乘的积,所以z=z*x,变量z的初值为x,所以只要循环y-1即可。
4.若已定义:int a[10],i;,以下fun函数的功能是:在第一个循环中给前10个数组元素依次赋1、2、3、4、5、6、7、8、9、10;在第二个循环中使a数组前10个元素中的值对称折叠,变成1、2、3、4、5、5、4、3、2、1。
请填空。
fun( int a[ ]){ int i;for(i=0;i<10;i++) (1) =i;for(i=0;i<5;i++) (2) =a[i];}答案:(1)a[i] (2)a[9-i]注解:根据要求,第二个循环将数组前10个元素中值对称折叠,即将数组的a[5]中存放a[4]的值,a[6]中存放a[3]的值,依次类推,a[9]中存放a[0]的值,由此可知(2)中应填入的是a[9-i]。
5.若变量n中的值为24,则prnt函数共输出(1) 行,最后一行有(2) 个数。