c语言 第8章 函数习题
- 格式:doc
- 大小:30.50 KB
- 文档页数:17
编译预处理习题一.单项选择题1.在宏定义#define A 3.897678中,宏名A代替一个()。
A)单精度数 B)双精度数 C)常量 D)字符串2.以下叙述中正确的是A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令C)宏名必须用大写字母表示D)宏替换不占用程序的运行时间3.C语言的编译系统对宏命令的处理()。
A)在程序运行时进行的B)在程序连接时进行的C)和C程序中的其它语句同时进行的D)在对源程序中其它语句正式编译之前进行的4.在文件包含预处理语句的中,被包含文件名用“< >”括起时,寻找被包含文件的方式是()。
A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录搜索,再按系统设定的标准方式搜索C)仅仅在源程序所在目录搜索D)仅仅搜索当前目录5.以下说法中正确的是A)#define和printf都是C语句 B)#define是C语句,而printf不是C)printf是C语句,但#define不是D)#define和printf都不是C语句6.#define A 3.897678#include <stdio.h>main( ){ printf(“A=%f ”,A);}程序运行结果为()。
A) 3.897678=3.897678 B) 3.897678=A C) A=3.897678 D)无结果7.有宏定义:#define LI(a,b) a*b#define LJ(a,b) (a)*(b)在后面的程序中有宏引用:x=LI(3+2,5+8);y=LJ(3+2,5+8);则x、y的值是()。
A) x=65,y=65 B) x=21,y=65 C) x=65,y=21 D)x=21,y=218.有以下程序# define f(x) (x*x)main(){ int i1, i2;i1=f(8)/f(4) ; i2=f(4+4)/f(2+2) ;printf("%d, %d\n",i1,i2);}程序运行后的输出结果是A)64, 28 B)4, 4 C)4, 3D)64, 649.以下程序的输出结果是#define M(x,y,z) x*y+zmain(){ int a=1,b=2, c=3;printf(“%d\n”, M(a+b,b+c, c+a));}A) 19 B) 17 C) 15 D) 1210.有以下程序#define N 5#define M1 N*3#define M2 N*2main(){ int i;i=M1+M2; printf(“%d\n”,i);}程序编译后运行的输出结果是:A) 10 B) 20 C) 25 D) 3011.有如下程序#define N 2#define M N+1#define NUM 2*M+1#main(){ int i;for(i=1;i<=NUM;i++)printf(“%d\n”,i);}该程序中的for循环执行的次数是A) 5 B) 6C) 7 D) 812.位运算是对运算对象按二进制位进行操作的运算,运算的对象是____数据,以___的形式参与运算。
第1部分课后练习题第1章C语言概述一、选择题1.一个C程序的执行是从。
A)本程序的main函数开始,到main函数结束B)本程序文件的第一个函数开始,到本程序文件的最后一个函数结束C)本程序的main函数开始,到本程序文件的最后一个函数结束D)本程序文件的第一个函数开始,到本程序main函数结束2.以下叙述正确的是。
.在C程序中,main函数必须位于程序的最前面A)C程序的每行中只能写一条语句B)C语言本身没有输入输出语句C)在对一个C程序进行编译的过程中,可发现注释中的拼写错误3.以下叙述不正确的是。
A)一个C源程序可由一个或多个函数组成B)一个C源程序必须包含一个main函数C)C程序的基本组成单位是函数D)在C程序中,注释说明只能位于一条语句的后面4.C语言规定:在一个源程序中,main函数的位置。
A) 必须在最开始 B) 必须在系统调用的库函数的后面C) 可以任意 D) 必须在最后5.一个C语言程序是由。
A) 一个主程序和若干子程序组成 B) 函数组成C) 若干过程组成 D) 若干子程序组成6.C语言中的语句需要符号作为结尾。
A) : B) ; C)。
D) //7.C 语言程序中可以对程序进行注释,注释部分用符号_____括起来。
A)‘{‘ 和’}’ B)‘[‘和’]’C)“/*”和”*/” D)“*/”和”/*”8.C语言中注释的位置。
A) 必须在程序的最开始 B) 必须在程序的结尾C) 可以在程序的任何位置 D) 不可以写到main函数里面9.C语言程序能够在不同的操作系统下面运行,这说明c语言具有很好的。
1A) 适应性 B)移植性 C)兼容性 D) 操作性10.C语言经过编译后生成的文件的后缀是。
A).c B) .cpp C) .exe D) .obj11.C语言编译程序的首要工作是。
A) 检查C语言程序的语法错误 B) 检查C语言程序的逻辑错误C)检查程序的完整性 D) 同时检查语法和逻辑错误12. C语言经过链接后生成的文件的后缀是。
一、单项选择题题目1标准输出设备显示器的文件流标识符是()。
a. stdinb. stdoutc. stderrd. stdio题目2表示文件结束符的符号常量EOF的值为()。
a. 0b. -1c. 1d. 127题目3假定一个磁盘数据文件占用n个字节的存储空间,则按字节进行编址的范围是()。
a. 1˜(n-1)b. 0˜(n-1)c. 0˜nd. 1˜n题目4在C语言中,为只写操作打开一个文本文件的方式为()。
b. "w"c. "r"d. "a"题目5在C语言中,文本文件的打开方式共有()。
a. 6b. 9c. 12d. 3题目6在C语言中,为读和写操作打开一个二进制文件,若文件不存在则自动建立空文件的打开方式为()。
a. "ab+"b. "w+"c. "rb+"d. "wb+"题目7从一个文本文件中读取以换行符结束的一个字符串的系统函数为()。
a. fgets()b. fputc()d. fputs()题目8向一个文本文件中写入一个字符的系统函数为()。
a. fputs()b. fputc()c. fgetc()d. fgets()题目9向一个二进制文件中写入数据的系统函数为()。
a. fputc()b. fwrite()c. fread()d. fputs()题目10从一个二进制文件中读取数据的系统函数为fread(),它的参数有()。
a. 2个b. 4个c. 3个d. 5个二、判断题题目11一个磁盘数据文件的文件名由文件主名和扩展名所组成,其中间用圆点分开。
对错题目12当向字符文件输出一个换行符时,实际将输出的是回车符或换行符。
对错题目13C语言系统中提供一个用来描述文件属性的类型标识符为FILE。
对错题目14在数据文件打开方式字符串中,字符r、w和a具有确定的含义,分别代表读、写和追加方式。
1、int *p 的含义是(B)A.p是一个指针, 用来存放一个整型数B.p是一个指针, 用来存放一个整型数据在内存中的地址C.p是一个整型变量D. 以上都不对2、以下函数用来求出两整数之和,并通过形参将结果传回,请填空。
void func(int x,int y, ___int*____ z){ *z=x+y; }3、有如下程序段(B)int *p,a=10,b=1;p=&a; a=*p + b;执行该程序段后,a的值是A. 12B. 11C. 10D. 编译出错4、若己定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1]地址的表达式是( C)A) p+1B) a+1C) a++D) ++p5、以下程序运行后的输出结果是(A)void main( ){ int a[ ]={1,2,3,4,5,6,7,8,9,0},*p;for(p=a;p<a+10;p++) printf("%d,",*p);}A)1,2,3,4,5,6,7,8,9,0,B)2,3,4,5,6,7,8,9,10,1,C)0,1,2,3,4,5,6,7,8,9,D)1,1,1,1,1,1,1,1,1,1,6、下面程序的输出是(D)void prtv(int *x)printf("%d\n", ++*x);}main(){ int a=25;prtv(&a);}A) 23 B) 24 C) 25D) 267、有以下函数(B)char fun(char *p){ return p; }该函数的返回值是A) 无确切的值B) 形参p中存放的地址值C) 一个临时存储单元的地址D) 形参p自身的地址值8、下列程序的输出结果是(7)#include<stdio.h>void fun (int *p1, int *p2){ if (*p1>*p2) printf ("%d\n",*p1);else printf ("%d\n",*p2);}void main ( ){ int a=3,b=7;fun (&a, &b);}9、下列程序的运行结果是(B)void fun(int *a, int *b){ int *k;k=a; a=b; b=k;}main(){ int a=3, b=6, *x=&a, *y=&b;fun(x,y);printf("%d %d", a, b);}A) 6 3 B) 3 6 C) 编译出错D) 0 010、以下程序调用findmax函数返回数组中的最大值(B)findmax(int *a,int n){ int *p,*s;for(p=a,s=a; p-a<n; p++)if ( ) s=p;return(*s);}main(){ int x[5]={12,21,13,6,18};printf("%d\n",findmax(x,5));}在下划线处应填入的是(B)A) p>s B) *p>*s C) a[p]>a[s] D) p-a>p-s11、下列程序段的输出结果是(A)void fun(int *x, int *y){ printf("%d %d", *x, *y); *x=3; *y=4;}main(){ int x=1,y=2;fun(&y,&x);printf("%d %d",x, y);}A) 2 1 4 3 B) 2 1 3 4 C) 1 2 1 2 D) 2 1 1 212、以下程序执行后输出的结果是___84________。
第八单元结构体和共用体一、选择题1、说明一个结构体变量时系统分配给它的内存是。
A. 各成员所需要内存量的总和B. 结构体中第一个成员所需内存量C. 成员中占内存量最大者所需的容量D. 结构中最后一个成员所需内存量2、 C 语言结构体类型变量在程序执行期间。
A. 所有成员一直驻留在内存中B. 只有一个成员驻留在内存中C. 部分成员驻留在在内存中D. 没有成员驻留在内存中3、设有以下说明语句struct stu { int a ; float b ; } stutype ;则下面的叙述不正确的是。
A. struct 是结构体类型的关键字B. struct stu 是用户定义的结构体类型C. stutype 是用户定义的结构体类型名D. a 和b 都是结构体成员名4、程序中有下面的说明和定义struct abc { int x;char y;}struct abc s1,s2;则会发生的情况是。
A. 编译出错B. 程序将顺利编译、连接、执行C. 能顺利通过编译、连接、但不能执行D. 能顺利通过编译、但连接出错5、有如下定义struct person { char name[9]; int age;};struct person class[10]={ " Johu", 17,"Paul", 19,"Mary", 18,"Adam",16};根据上述定义,能输出字母M 的语句是。
A. prinft(" %c\n",class[3].name);B. printf(" %c\n",class[3].name[1]);C. prinft(" %c\n",class[2].name[1]);D. printf(" %c\n",class[2].name[0]);6、下面程序的输出是。
1.1选择题:⑴一个C程序的执行是(A)。
A)从main()函数开始,直到main()函数结束B)从第一个函数开始,直到最后一个函数结束C)从第一个语句开始,直到最后一个语句结束D)从main()函数开始,直到最后一个函数结束⑵计算机能直接执行的语言是(B)。
A)汇编语言B)机器语言C)高级语言D)A和B⑶一个C程序是由(C)。
A)一个主程序和若干子程序组成B)若干过程组成C)一个或多个函数组成D)若干子程序组成⑷下列说法正确的是(B )。
A)C程序书写格式限制严格,一行内必须写一个语句B)C程序书写比较自由,一个语句可以分行写在多行上C)C程序书写格式限制严格,要求一行内必须写一个语句,并要求行号D)C程序中一个语句不可以分写在多行上1.2填空题:⑴构成C语言程序的基本单位是函数。
⑵C语言源程序文件的后缀是.c,经过编译后,生成文件的后缀是,obj,经过连接后,生成文件的后缀是.exe。
⑶在TURBO C环境中用RUN命令运行一个C程序时,所运行的程序的后缀是.exe。
⑷一个C语言程序必须有而且只能有一个主函数,它的函数名为main。
⑸一个函数有两部分组成,第一部分称为函数首部;第二部分称为函数体。
⑹函数体由符号{开始,用符号}结束。
函数体的前面是声明部分,其后是执行部分。
1.3上机编辑、调试、运行下列程序,发现错误,并改正之。
/*求1 + 2 + 3 + ……+ 10的和*/#include <stdio.h>main(){int sum,n;sum = 0;n = 1;while(n < 10){sum = sum + n;n = n + 1;}printf("sum = %d \n",sum);}2.1选择题⑴ 在以下标识符中,( B )是合法的用户标识符。
A ) a#bB ) getchC ) voidD ) ab*⑵ 不合法的八进制数是( B )。
智慧树知到程序设计基础(C语言)测试第八章单元测试参考答案•总题数: 101【判断题】 (10分)有如下函数调用语句:fun(r1,r2+r3,(r4,r5));该函数调用语句中,含有的实参个数是3个。
A.错B.对正确本题总得分10分2【判断题】 (10分)函数可以嵌套定义,但不能嵌套调用。
A.对B.错正确本题总得分10分3【判断题】 (10分)mian函数可以自己调用自己。
A.对B.错正确本题总得分10分4【单选题】 (5分)以下正确的函数定义是()。
A.fun(int x,y){ int z; return int z; }B.double fun(int x,int y){ z=x+y; return z; }C.double fun(int x,int y){ double z;z=x+y;return z; }D.fun(x,y){int x,y; z=x+y; retun z;}正确本题总得分5分5【单选题】 (10分)在C语言函数中,下面说法正确的是()。
A.一个函数中只能有一个return语句。
B.一个return语句可以返回多个值。
C.一个函数中可以有多个return语句,但是最多执行其中一个return语句。
D.一个函数中可以有多个return语句,可能多个return语句全部执行正确本题总得分10分6【单选题】 (10分)在C语言函数中,以下说法正确的是()。
A.return后边的值不能为表达式B.定义函数时,形参的类型说明可以放在函数体内。
C.如果形参与实参的类型不一致以实参类型为准D.如果函数值的类型与return返回值类型不一致,以函数值类型为准正确本题总得分10分7【单选题】 (10分)在C语言程序中,以下正确的描述是()。
A.函数的定义和调用均可以嵌套B.函数的定义和函数的调用均不可以嵌套C.函数的定义可以嵌套,但函数的调用不可以嵌套D.函数的定义不可嵌套,但函数的调用可以嵌套正确本题总得分10分8【单选题】 (10分)有下列程序,程序运行后的输出结果是()。
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位数,其个位数字立方和等于该数本身。
第八章以下叙述中正确的是()若有以下语句typedefstruct S{int g; char h;}T;A.可用T定义结构体变量是struct S类型的变量C.可用S定义结构体变量是struct类型的变量当定义一个结构体变量时,系统分配给它的内存是()。
A.结构体中最后一个成员所需内存量B.成员中占内存量最大的容量C.结构体中第一个成员所需内存量D.各成员所需内存量的总和若有以下定义:struct link{int data;struct link *next;}a,b,c,*p,*q;且变量a和b之间已有如下图所示的链表结构,若指针p指向a,指针q指向c。
则能把c插入到a和b之间形成新的链表的语句是()>next=&c;q->next=p->next;q->next=&b;=b;/*N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。
请编写函数fun,它的功能是:求出平均分,由函数值返回。
例如,若学生的成绩是85,76,69,91,72,64,87,则平均分应当是。
注意:部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:*/#include<>#include<>#define N 8struct sliststruct slist *next;};typedef struct slist STREC;double fun(STREC *h){/***********Begin***************//***********End**************/}STREC *creat(double *s) /*创建链表*/ {STREC *h,*p,*q;int i=0;h=p=( STREC*)malloc(sizeof(STREC));p->s=0;while(i<N){q=( STREC*)malloc(sizeof(STREC));q->s=s[i];i++;p->next=q;p=q;}p->next=0;return h;}outlist(STREC *h){STREC *p;p=h->next;printf("head ");do{printf("->%4.1f ",p->s);p=p->next; /*输出各成绩*/}while(p!=NULL);printf("\n\n");}void main(){FILE *wf;double s[N]={85,76,69,85,91,72,64,87},ave; STREC *h;h=creat(s);ave=fun(h);printf("ave=%6.3f\n ",ave);/******************************/wf=fopen("debug\\","w");fprintf(wf,"%6.3f\n",ave);fclose(wf);/*****************************/}【参考代码】double av=;STREC *p=h->next;/*p直接指向"头节点"的下一个节点,即第一个成绩*/while(p!=NULL){av=av+p->s; /*求总分数*/p=p->next;}return av/N; /*返回平均值*//*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,该函数的功能是:把高于等于平均分的学生数据放在b所指的数组中,高于等于平均分的学生人数通过形参n传回,平均分通过函数值返回。
第一单元(1-5章)基本概念练习题一、单选选择(直接在正确的选项上打勾,每题)1、下面关于C语言特点的描述,不正确的是( )。
DA、C语言兼有高级语言和低级语言的双重特点,执行效率高B、C语言既可以用来编写应用程序,又可以用来编写系统软件C、C语言是一种结构式模块化程序设计语言D、C语言的可移植性较差2、C语言规定,在一个源程序中,main函数的位置( )。
BA、必须在最开始B、可以任意C、必须在最后D、必须在系统调用的库函数的后面3、下列说法中正确的是( )。
CA、C程序书写时,不区分大小写字母B、C程序书写时,一行只能写一个语句C、C程序书写时,一个语句可分成几行书写D、C程序书写时每行必须有行号4、C语言编译程序的首要工作是( )。
AA、检查C语言程序的语法错误B、检查C语言程序的逻辑错误C、检查程序的完整性D、生成目标文件5、C语言程序经过连接以后生成的文件名的后缀为( )。
CA、.cB、.objC、.exeD、.cpp6、以下关于算法的说法中,错误的是( )。
DA、一个算法应包含有限个步骤B、在计算机上实现的算法是用来处理数据对象的C、算法的目的是为了求解D、算法中指定的操作,不能通过已经实现的基本运算执行有限次后实现7、算法是指为解决某个特定问题而采取的确定且有限的步骤,下面不属于算法的五个特性之一的是( )。
CA、确定性B、有穷性C、零个或多个输出D、零个或多个输入8、以下不属于结构化程序设计三种基本结构之一的是( )。
BA、顺序B、递归C、循环D、选择9、下列数据中,不合法的C语言实型数据是( )。
CA、0.123B、123e3C、2.1e3.5D、789.010、若变量a、i已正确定义,且i已正确赋值,以下属于合法的C语句是( )。
A、a==1B、++i;C、a=a++=5;D、a=int(i);11、已有定义int a=6; 则执行语句a+=a-=a*a;后,a的值为( )。
一、选择题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 写一个函数,输入一行字符,将此字符串中最长的单词输出。
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个整数,将其中最⼩的数与第⼀个数对换, 把最⼤的数与最后⼀个数对换。
《C程序设计》复习题集第2章基础概念一、选择题(在下列各题的A)、B)、C)、D)四个选项中,只有一个选项是正确的)2.1以下叙述中正确的是A)C语言比其他语言高级B)C语言可以不用编译就能被计算机识别执行C)C语言以接近英语国家的自然语言和数学语言作为语言的表达形式D)C语言出现的最晚,具有其他语言的一切优点正确答案: C2.2 以下叙述中正确的是A)构成C程序的基本单位是函数B)可以在一个函数中定义另一个函数C)main()函数必须放在其他函数之前D)所有被调用的函数一定要在调用之前定义正确答案: A2.3 以下说法正确的是A)C语言程序总是从第一个函数开始执行B)在C语言程序中,要调用函数必须在main()函数中定义C)C语言程序总是从main()函数开始执行D)C语言程序中的main()函数必须放在程序的开始部分正确答案: C2.4 C语言规定,在一个源程序中,main函数的位置A)必须在最开始B)必须在系统调用的库函数的后面C)可以任意D)必须在最后正确答案: C2.5 以下叙述不正确的是A)一个C源程序可由一个或多个函数组成B)一个C源程序必须包含一个main函数C)C程序的基本组成单位是函数D)在C程序中,注释说明只能位于一条语句的后面正确答案: D2.6 下列叙述中正确的是A)C语言编译时不检查语法B)C语言的子程序有过程和函数两种C)C语言的函数可以嵌套定义D)C语言的函数可以嵌套调用正确答案: D2.7 以下叙述正确的是A)在C程序中,每行中只能写一条语句B)若a是实型变量,C程序中允许赋值a=10,因此实型变量中允许存放整型数C)在C程序中,无论是整数还是实数,都能被准确无误地表示D)在C程序中,%是只能用于整数运算的运算符正确答案: D2.8 下列关于C语言的说法不正确的是A)C语言既具有高级语言的一切功能,也具有低级语言的一些功能B)C语言中的每一条执行语句都必须用分号结束,但分号不是C语言的一部分,是语句之间的分隔符号C)注释可以出现在程序中任意合适的地方D)命令行后面不能加分号,命令行不是C语言的语句正确答案: B2.9 以下说法错误的是A)高级语言都是用接近人们习惯的自然语言和数学语言作为语言的表达形式B)计算机只能处理由0和1的代码构成的二进制指令或数据C)C语言源程序经过C语言编译程序编译之后生成一个后缀为.EXE的二进制文件D)每一种高级语言都有它对应的编译程序正确答案: C2.10 C语言中用于结构化程序设计的3种基本结构是A)顺序结构、选择结构、循环结构B)if,switch,breakC)for,while,do-while D)if,for,continue正确答案: A第3章数据类型运算符与表达式一、选择题(在下列各题的A)、B)、C)、D)四个选项中,只有一个选项是正确的)3.1 C语言提供的基本数据类型包括A)整型、实型、逻辑型B)整型、实型、字符型C)整型、字符型、逻辑型D)字符型、实型、逻辑型正确答案: B3.2 C语言中的标识符只能由字母,数字和下划线三种字符组成,且第一个字符A)必须为字母B)必须为下划线C)必须为字母或下划线D)可以是字母,数字和下划线中任一字符正确答案: C3.3 下列可用于C语言用户标识符的一组是A)void, define, WORD B)a3_b3, _123,CarC)For, -abc, IF Case D)2a, DO, sizeof正确答案: B3.4 下面四个选项中,均是不正确的8进制数或16进制数的选项是A)016 0x8f 018 B)0abc 017 0xaC)010 -0x11 0x16 D)0a12 7ff -123正确答案: D3.5 下列数据中,不合法的C语言实型数据的是A)0.123 B)123e3 C)2.1e3.5 D)789.0正确答案: C3.7 若有说明语句:char c='\72';则变量cA)包含1个字符B)包含2个字符C)包含3个字符D)说明不合法,c的值不确定正确答案: A3.8 有字符串如下,"\n\\\407as1\"\xabc",则字符串的长度为A)6 B)7 C)8 D)9正确答案: D3.9 C语言中运算对象必须是整型的运算符是A)%= B)/ C)= D)<=正确答案: A3.10 若变量已正确定义并赋值,以下符合C语言语法的表达式是A)a:=b+1 B)a=b=c+2 C)int 18.5%3 D)a=a+7=c+b正确答案: B3.11 若变量a,i已正确定义,且i已正确赋值,合法的语句是A)a= =1 B)++i; C)a=a++=5; D)a=int(i);正确答案: B3.12 若有定义:int a=7;float x=2.5,y=4.7;则表达式x+a%3*(int)(x+y)%2/4的值是A)2.500000 B)2.750000 C)3.500000 D)0.000000正确答案: A3.13 若有运算符<<,sizeof,^,&=,则它们按优先级由高至低的正确排列次序是A)sizeof,&=,<<,^ B)sizeof,<<,^,&= C)^,<<,sizeof,&= D)<<,^,&=,sizeof正确答案: B3.14 以下不正确的叙述是A)在C程序中,逗号运算符的优先级最低B)在C程序中,APH和aph是两个不同的变量C)若a和b类型相同,在计算了赋值表达式a=b后b中的值将放入a中,而b中的值不变D)当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数值正确答案: D3.15 已知int i,a;执行语句i=(a=3,a++,- -a,a+4,a+5,++a);后,变量i的值为A)2 B)3 C)4 D)5正确答案: C3.16 设变量a是int型,f是float型,i是double型,则表达式10+′a′+i*f值的数据类型为A)int B)float C)double D)不确定正确答案: C3.17 在C语言中,char型数据在内存中的存储形式是A)补码B)反码C)原码D)ASCII码正确答案: D3.18 字符型数据在机器中是用ASCII码表示的,字符’5’和’7’在机器中表示为A)10100011和 01110111 B)01000101和01100011C)00110101和00110111 D)01100101和01100111正确答案: C3.19 不能进行++和- -运算的数据类型为A)指针B)整型C)长整型D)常量正确答案: D3.20 设有int x=11;则表达式(x++*1/3)的值是A)3 B)4 C)11 D)123.21 以下程序的输出结果是main(){ int a=21,b=11;printf("%d\n",- -a+b,- -b+a);}A)30 B)31 C)32 D)33正确答案: A3.22 假设整型变量a,b,c的值均为5,则表达式a+++b+++c++的值为A)17 B)16 C)15 D)14正确答案: C3.23 已知int a=6; 则执行a+=a-=a*a;语句后,a的值为A)36 B)0 C)-24 D)-60正确答案: D3.24 设变量n为float类型,m为int类型,则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五入运算的表达式是A)n=(n*100+0.5)/100.0 B)m=n*100+0.5,n=m/100.0C)n=n*100+0.5/100.0 D)n=(n/100+0.5)*100.0正确答案: B3.25 sizeof(float)是A)一个双精度型表达式B)一个整型表达式C)一种函数调用D)一个不合法的表达式正确答案: B3.26下列关于字符串的说法中错误的是A)在C语言中,字符串是借助于字符型一维数组来存放的,并规定以字符′\0′作为字符串结束标志B)′\0′作为标志占用存储空间,计入串的实际长度C)在表示字符串常量的时候不需要人为在其末尾加入′\0′D)在C语言中,字符串常量隐含处理成以′\0′结尾正确答案: B3.27 以下变量x,y,z均为double类型且已正确赋值,不能正确表示数学式子x÷y÷z 的C语言表达式是A)x/y*z B)x*(1/(y*z)) C)x/y*1/z D)x/y/z正确答案: A3.28 下列关于语句的说法错误的是A)复合语句是由“{”开头,由“}”结尾的B)复合语句在语法上视为一条语句C)复合语句内,可以有执行语句,不可以有定义语句部分D)C程序中的所有语句都必须由一个分号作为结束正确答案: C二、填空题3.30 以下程序的输出结果是【1】。
第8章函数习题A卷1. 单项选择题(1)C 语言总是从函数开始执行。
AA. mainB. 处于最前的C.处于最后的D. 随机选一个(2)函数在定义时,省略函数类型说明符,则该函数值的类型为。
AA. intB. floatC. longD. double(2)以下函数,真正地没有返回值。
BA. int a(){int a=2;return (a);}B. void b(){printf("c");}C. int a(){int a=2;return a;}D. 以上都是(3)在C 语言中,有关函数的说法,以下正确的是。
AA. 函数可嵌套定义,也可嵌套调用B. 函数可嵌套定义,但不可嵌套调用C. 函数不可嵌套定义,但可嵌套调用D. 函数不可嵌套定义,也不可嵌套调用(4)以下函数调用语句中,含有实参的个数为。
Cfun((2,3),(4,5+6,7));A. 1B. 2C. 5D. 6(5)函数调用可以在。
DA. 函数表达式中B. 函数语句中C. 函数参数中D. 以上都是(6)被调函数返回给主调函数的值称为。
CA. 形参B. 实参C. 返回值D. 参数(7) ,可以不进行函数类型说明。
DA. 被调函数的返回值是整型或字符型时B. 被调函数的定义在主调函数定义之前时C. 在所有函数定义前,已在函数外预先说明了被调函数类型D. 以上都是(8)被调函数通过语句,将值返回给主调函数。
DA. ifB. forC. whileD. return(9)被调函数调用结束后,返回到。
DA.主调函数中该被调函数调用语句处B.主函数中该被调函数调用语句处C.主调函数中该被调函数调用语句的前一语句D.主调函数中该被调函数调用语句的后一语句(10)以下对C语言函数的有关描述中,正确的是。
AA. 在C 中,调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参B. C函数既可以嵌套定义又可递归调用C. 函数必须有返回值,否则不能使用函数D. C程序中有调用关系的所有函数必须放在同一个源程序文件中(11)C 语言中函数的隐含存储类型是。
CA. autoB. staticC. externD. 无存储类型(12)能把函数处理结果的两个数据返回给主调函数,在下面的方法中不正确的是。
AA. return 这两个数B. 形参用两个元素的数组C. 形参用两个这种数据类型的指针D. 用两个全局变量(13)C语言可执行程序从什么地方开始执行( )。
CA. 程序中第一条可执行语句B. 程序中第一个函数C. 程序中的main函数D. 包含文件中的第一个函数(14)有一个函数原型如下所示,则该函数的返回类型为( ) 。
Cabc(float x,float y);A. voidB. doubleC. intD. float2. 填空题(1) 变量的作用域主要取决于变量,变量的生存期既取决于变量,又取决于变量。
所处的位置,所处的位置,存储类型(2) 说明变量时,若省略存储类型符,系统默认其为存储类别,该存储类别的类型符为:。
动态,auto(3) 静态型局部变量的作用域是,生存期是。
它所在的局部,整个程序(4) 函数中的形参和调用时的实参都是数组名时,传递方式为,都是变量时,传递方式为。
址传递,值传递(5) 函数的形式参数的作用域为,全局的外部变量和函数体内定义的局部变量重名时,_________变量优先。
该函数中,局部(6) 若自定义函数要求返回一个值,则应在该函数体中有一条语句,若自定义函数要求不返回一个值,则应在该函数说明时加一个类型说明符。
return,void(7) 若函数的形式参数是指针类型,则实参可以是或。
指针,数组名(8) 函数的参数为char *类型时,形参与实参结合的传递方式为。
址传递(9) 函数的实参为常量时,形参与实参结合的传递方式为。
值传递(10) 下面这个函数的功能是求两个整数的积,并通过形参传回结果,请填空。
int int int* *resultvoid mul(___x,___y,___result){___=x*y;}3. 判断题(× )(1) 函数说明指的是在程序中设定一个函数模块。
(√ )(2) 形参只有在被调用时才分配存储空间。
(× )(3) 在C的函数中,最好使用全局变量。
(× )(4) 在调用函数时,实参传值给形参,调用结束时,形参值传给实参。
(√ )(5) 所有函数定义都是并行的,相互独立的。
(× )(6) 函数的隐含存储类型是extern。
(× )(7) 形参可以是常量、变量或表达式。
(× )(8) 函数调用可以作为一个函数的形参。
(√ )(9) C语言规定,实参应与其对应的形参类型一致。
(× )(10) 定义函数时,形参的类型说明可以放在函数体内。
4. 程序填空题(1) 对数组按值从大到小的顺序排序后输出,请填空。
#include <stdio.h>void main(){float a[7]={2,6,3,8,3,12,9};int i ;void sort(float*,int);;for(i=0;i<7;i++) printf("%f ",a[i]); printf("\n");}void sort( ){int i,j,k; float t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if( ) k=j;{ t=*(p+i); *(p+i)=*(p+k); *(p+k)=t; }}}sort(a,7) float* p,int n *(p+k)<*(p+j) if(k!=i)(2) 下列函数在n 个元素的一维数组中,找出最大值、最小值并传送到调用函数,请填空。
#include <stdio.h>void find(float *p, int max, int min, int n){int k;*max=*p;for(k=1;k<n;k++){t=*(p+k);if( ) *max=t;if(t<*min) *min=t;}}float t; *min=*p; *max<tB卷5. 写出下列程序运行结果(1)main(){int i=1,p;p=fun(i,i+1);printf("%d\n",p);}int fun(int a,int b){int f;if(a>b)f=1;else if(a==b)f=0;elsef=-1;return f;}-1(2)键盘输入abcdef<CR> #include <stdio.h>void fun( ){char c ;if((c=getchar( ))!='\n')fun( ) ;putchar(c);}void main( ){ fun( ); }fedcba(3)#include <stdio.h>#define C 5int x=1,y=C;void main( ){int x;x=y++; printf("%d %d\n", x,y);if(x>4) { int x ; x=++y; printf("%d %d\n",x,y) ; } x+=y--;printf("%d %d\n",x,y);}5 67 712 6(4)#include <stdio.h>int c , a=4 ;func(int a , int b){ c=a*b ; a=b-1 ; b++ ; return (a+b+1) ; } void main( ){int b=2 , p=0 ; c=1 ;p=func(b , a) ;printf("%d,%d,%d,%d\n", a,b,c,p) ;}4,2,8,9(5)unsigned fun6(unsigned num){unsigned k=1;do { k*=num%10; num/=10; } while(num);return k;}void main( ){unsigned n=26;printf("%d\n", fun6(n));}12(6)#include <stdio.h>int max(int a,int b);main(){int x,y,z,t,m;scanf("%d,%d,%d",&x,&y,&z);t=max(x,y);m=max(t,z);printf("%d",m);}int max(int a,int b){if(a>b)return(a);elsereturn(b);}运行时若输入:10,15,9 则输出:___ 15运行时若输入:300,129,300 则输出:___ 300 (7)#include <stdio.h>long sum(int a,int b);long factorial(int n);main(){int n1,n2;long a;scanf("%d,%d",&n1,&n2); a=sum(n1,n2);printf("a=%1d",a);}long sum(int a,int b){long c1,c2;c1=factorial(a);c2=factorial(b);return(c1+c2);}long factorial(int n){long rtn=1;int i;for(i=1;i<=n;i++)rtn*=i;return(rtn);}运行时若输入:2,3 则输出:___ 8运行时若输入:0, 5 则输出:___ 121 (8)#include <stdio.h>int s();int x,y;main(){int n;x=1;y=2;n=s();printf("x=%d,y=%d,n=%d",x,y,n);}int s(){int z;x=3;y=4;z=x+y;return(z);}程序运行后输出:___ 3,4,7(9) 以下程序的输出结果是a=___,b=___,c=___。
#include <stdio.h>int func(int a,int *p);void main(){int a=1,b=2,c;c=func(a,&b);b=func(c,&a);a=func(b,&c);printf("a=%d,b=%d,c=%d",a,b,c); }int func(int a,int *p){a++;*p=a+2;return(*p+a);}36 16 19。