C语言习题(详细解答) 下载本文

内容发布更新时间 : 2024/5/19 2:34:01星期一 下面是文章的全部内容请认真阅读。

【解析】第一次调用的是最内层的f(n),即f(1) 返回值2。第二次调用中间的f(f(n)),即f(2)返回值4。最后调用最外层的f(f(f(n))),即f(4)返回值8,最后打印输出。 二.填空题

1.以下程序的输出结果是_________。

#include

void swap(int *a, int *b) { int *t;

t=a; a=b; b=t; } main()

{ int i=3,j=5,*p=&i,*q=&j;

swap(p,q); printf(\%d\\n\,*p,*q); }

参考答案:3 5

【解析】函数swap(int *a,int *b)的功能是实现*a和*b中两个数据的交换,在主函数中调用swap(p,q)后,参形指针变量a和b分别指向i和j,在swap(int *a,int *b)执行完后,指针变量a和b分别指向j和i,而指针变量p,q所指向变量的值没有发生变化,所以输出结果为3 5。

2.以下fun函数的功能是:找出具有N个元素的一维数组中的最小值,并作为函数值返回。请填空。(设N已定义)

int fun(int x[N]) { int i,k=0; for(i=0;i

参考答案:i

【解析】通过函数中语句 return x[k]; 可知x[k]表示的是该一维数组中最小的值,所以当x[i]小于x[k]所代表的数值后应将i变量赋给k变量,使得x[k]表示当前值较小的那个数据。 3.有以下函数

void prt(char ch,int n) { int i;

for(i=1;i<=n;i++)

printf(i%6!=0 ? \; }

执行调用语句prt('*',24);后,函数共输出了______ 行*号。 参考答案:4

【解析】本题中输出*并换行的条件是i能被6整除,否则输出*不换行。因此只有在i为6、12、18和24时*的输出才会换行,最终输出4行*。

4.请将以下程序中的函数声明语句补充完整。

#include int______; main()

{ int x,y,(*p)();

scanf(\,&x,&y); p=max;

21

printf(\,(*p)(x,y)); }

int max(int a,int b) { return(a>b?a:b);} 参考答案:max(int a,int b)

【解析】本题考的是函数声明。函数声明是把函数的名字、函数类型以及形参的类型、个数和顺序通知给编译系统。函数在被调用前必须先声明,因为main函数后面有max函数的定义。 5.有以下程序,请在 __ 处填写正确语句,使程序可正常编译运行。

#include ____________ ; main()

{ double x,y,(*p)();

scanf(\,&x,&y); p=avg;

printf(\,(*p)(x,y)); }

double avg(double a,double b) { return((a+b)/2);}

参考答案:double avg(double a ,double b);

【解析】c语言编译器对于源代码的编译是顺序编译的,当任意一个函数中调用某个函数的时候,这个函数的原型必须在调用之前声明,否则就会出现编译错误。本题中需要在main函数调用avg之前对其进行声明。 6.有以下程序:

#include fun(int x)

{ if(x/2>0) fun(x/2); printf(\.\,x); } main()

{ fun(6),printf(\;} 程序运行后的输出结果是________。 参考答案:1 3 6

【解析】 依次执行fun(6),fun(3),fun(1),当执行fun(6)时要调用fun(3),执行fun(3)时要调用fun(1),所以输出的结果为1 3 6。 第09章 一.选择题 1.有以下程序:

#include int b=2; int fun(int *k)

{ b=*k+b;return(b);} main()

{ int a[10]={1,2,3,4,5,6,7,8},i;

for(i=2;i<4;i++){b=fun(&a[i])+b; printf(\,b);} printf(\;

变量的属性和编译预处理

22

}

程序运行后的输出结果是________。 A)10 12 B)8 10 C)10 28 D)10 16

解析】b为全局变量,在第一次执行for循环后b的值变为10并输出,第二次执行for循环后b的值变为28。因此,本题答案选C)。

2.在C语言中,只有在使用时才占用内存单元的变量,其存储类型是。 A)auto和register B)extern和register C)auto和static D)static和register

【解析】在C语言中只有自动变量和寄存器变量在使用时才占用内存单元。所以正确答案为A)。 3.设函数中有整型变量n,为保证其在未赋初值的情况下初值为0,应选择的存储类别是___C_____。 A)auto B)register C)static D)auto或register

【解析】static(静态局部变量):有时我们希望函数中局部变量的值在函数调用结束后不消失而保留原值,这时就将局部变量指定为静态局部变量,如果定义静态局部变量时不赋值,则编译时自动赋初值0(对数据型变量)或空字符(对字符变量)。

auto(自动变量):函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时自动释放这些存储空间。

register(寄存器变量):为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫寄存器变量。

4.有以下程序:

#include int f(int n); main()

{ int a=3,s;

s=f(a);s=s+f(a);printf(\,s); } int f(int n)

{ static int a=1; n+=a++; return n; }

程序运行后的输出结果是__C______。 A)7 B)8 C)9 D)10

【解析】 s=f(a)表达式第一次调用f(n)函数时,f(n)函数运行结果为n=4,a=2,即s等于4;s=s+f(a)表达式第二次调用f(n)函数时,f(n)函数运行结果为n=5,所以得到s值为9。 5.有以下程序

#include int fun() { static int x=1; x*=2; return x; }

23

main() { int i,s=1;

for(i=1;i<=2;i++) s=fun(); printf(\}

程序运行后的输出结果是

A)0 B)1 C)4 D)8

【解析】x被声明为静态变量,第一次调用fun()后,x值为2,第二次调用时直接执行x*=2,值为4。 6.以下叙述中错误的是

A)在程序中凡是以\开始的语句行都是预处理命令行D B)预处理命令行的最后不能以分号表示结束 C)#define MAX是合法的宏定义命令行

D)C程序对预处理命令行的处理是在程序执行的过程中进行的

【解析】C语言中的预处理命令以符号#开头,这些命令是在程序编译之前进行处理的,选项D)的描述错误。故答案选D)。 7.以下关于宏的叙述中正确的是_____C___。 A)宏名必须用大写字母表示

B)宏定义必须位于源程序中所有语句之前 C)宏替换没有数据类型限制 D)宏调用比函数调用耗费时间

【解析】宏名可以大写,也可以小写。其有效范围为定义命令之后到本源文件结束。宏的调用是字符的替换,没有数据类型限制。 二.填空题

1.以下程序的输出结果是_____。

#include int fun(int x) { static int t=0; return(t+=x); } main() { int s,i;

for(i=1;i<=5;i++) s=fun(i); printf(\,s); }

参考答案:15

【解析】static关键字用来声明\静态局部变量\,静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序运行期间不释放变量的值。

2.以下程序运行后的输出结果是 ____ 。

#include #include #include main()

{ char *p; int i;

p=(char*)malloc(sizeof(char)*20);

24

strcpy(p,\;

for(i=6;i>=0;i--)putchar(*(p+i)); printf(\; free(p); }

参考答案:emoclew

【解析】本题中用malloc函数申请一个20个字符大小的空间,并用指针p指向空间的首地址。strcpy函数使\字符串存放到分配的空间,最后用putchar函数倒序输出字符串的前7个字符。p[0] = w ,p[1] = e ,p[2] = l , p[3] = c , p[4] = o , p[5] = m , p[6] = e。 第10章 一.选择题 1.有以下程序:

#include main()

{ struct STU{ char name[9]; char sex; double score[2]; }; struct STU a={\,'m',85.0,90.0},b={\,'f',95.0,92.0}; b=a;

printf(\,%c,%2.0f,%2.0f\\n\,b.name,b.sex,b.score[0],b.score[1]); }

程序的运行结果是_____D___。 A)Qian,f,95,92 B)Qian,m,85,90 C)Zhao,f,95,92 D)Zhao,m,85,90

【解析】该题目考查结构体数据类型,注意语句b=a,因此输出b.name为zhao,b.sex为m,依此类推。 2.以下结构体类型说明和变量定义中正确的是。A A)typedef struct

{int n; char c;}REC; REC t1,t2; B)struct REC;

{int n; char c;}; REC t1,t2; C)typedef struct REC ;

{int n=0; char c='A';}t1,t2; D)struct

{int n; char c;}REC; REC t1,t2;

【解析】本题考查的是typedef的用法和结构体变量的定义方法。typedef可用于声明结构体类型,其格式为\结构元素定义}结构类型;\。本题正确答案为A)。 3.若有以下语句

typedef struct S

{ int g;char h; }T; 以下叙述中正确的是

A)可用S定义结构体变量 B)可用T定义结构体变量 C)S是struct类型的变量 D)T是struct S类型的变量

复杂数据类型

25