C语言复习经典习题及其答案

C语言复习经典习题及其答案
C语言复习经典习题及其答案

C语言经典习题及其答案详解第一章C语言概述

1.1单项选择题

1.二进制语言是属于()

①面向机器语言②面向问题语言③面向过

程语言④面向汇编语言

「解」人们研制了许许多多计算机程序设计语

言,其中二进制语言直接来自计算机的指令系统,

与具体计算机紧密相关,所以是一种面向机器语

言。面向问题语言是为了易于描述和求解某类特定

领域的问题而专门设计的一种非过程语言。面向过

程语言是一种能方便描述算法过程的计算机程序

设计语言。有汇编语言,但没有面向汇编语言。汇

编语言也是一种面向机器的语言,与机器语言比

较,汇编语言用有助于记忆的符号来代表二进制代

码。所以解答是①。

2.下列语言中不属于面向过程的语言是()

①高级语言②低级语言③C语言④

PASCAL语言

「解」C语言和PASCAL等程序设计语言都

是高级语言,它们用于描述复杂加工的处理过程,

所以也称它们是面向过程语言。低级语言是指机器

语言和汇编语言,低级语言是面向机器的语言,而

不是面向问题的语言。所以解答是②。

3.下列字符中属于键盘符号的是()

①\②\n③\t④\b

「解」键盘符号是指键盘上有标记,并能在显

示器上直接以其标记字样显示的字符。有许多键盘

上有标记的符号,它们不是用于直接显示的,键入

这种字符用于表示特定的意义,如常用的回车符。

为了能让C程序标记这种符号,程序采用转义字符

的方式书写这种字符。如'\n'、'\t'、'\b'都不是键盘字符,在C语言中,它们都得用转义字符来表达。

只有字符\才是键盘字符。所以解答是①。但在C

程序中,反斜杠字符\已特别用作转义字符的引导

符,它也得用转义字符的表达形式书写,将它写成

‘\\’。

4.下列字符列中,不是用来表达转义字符是)(

①\\②\'③074④\0

「解」转义字符有三种书写形式:反斜杠字符

后接上某个规定的字符;反斜杠字符后接上13个

八进制数字符;反斜社字符和字符X之后接上1至

2个十六进制数字符。后两种分别八进制数和十六

进制数直接给出字符的ASCll代码值。而074是八

进制整数,不是转义字。所以解答是③。

5.不是C语言提供的合法关键字是()

①switch②begin③case④default

「解」因C语言的关键字表中没有begin,它

不是C语言的关键字。所以解答是②。

6.下列字符列中,能作为单个标识符是()

①?a②a=2③a.3④a_3

「解」在C语言中,规定标识符是这样一种字

符序列,由英文字母或下线字符开始,后接任1个

英文字母、下线字符和数字符组成。所以问题所列

的字符列只有a_3是标识符,其余都不是标识符,

一个是由字符‘?’开头、一个中间有字符‘=’,另一个有字符‘.’。所以解答是④。

1.2填充题

7.在C语言中,下列说法中错误的是()

①函数定义可以分为两个部分:函数说明部分

和函数体

②主函数可以调用任何非主函数

③任何非主函数可以调用其它任何非主函数

④程序可以从任何函数开始执行

「解」每个C函数的定义分两部分,函数说明

部分和函数体,所以叙述①是正确的叙述。语言C

中,函数可以递归调用,主函数可以调用程序中的

任何函数,当然可以调用任何非主教的其它函数,

所以叙述②是一个正确的叙述。同样理由,叙述③

也是正确的。C语言规,C程序只有一个主函数,

并总是从主函数开始执行,不能从非主函数开始执

行。所以,说程可以从任何函数开始执行是错误的。

所以解答是④。

1.汇编语言属于面向________语言,高级语言

属于面向________语言。

「解」汇编语言与具体计算机密切有关,是属

于面向机器的语言;而高级语言用来描述求解题的

算法,所以是面向过程的语言。所以解答是:面向

机器和面向过程。

2.用高级语言编写的程序称为________程序,

它可以通过________程序翻译一句执一句的方式

执行,也可以通过________程序一次翻译产生

________程序,然后执行。

「解」用高级语言编写的程序称为源程序,源

程序不能在计算机上直接运行,运行源程序有种方

式:一种是通过解释程序,对源程序逐句解释执行;

另一种是先让编译程序将源程序一翻译产生目标

程序(目标程序是计算机可直接执行的机器语言程

序,它是一种二进制代码程),然后执行目标程序。

3.转义字符是由________符号开始,后接单个

字符或若干字符组成。

4.C语言词类主要分为____、_____、_____和

_____等。

「解」语言的基本词汇是指直接由字符序列组

成,有确定意义的最基本单位,所以C语言词汇有:

字面形式常量、特殊符号(主要是运算符)、保留

字和标识符等四类。而表达式、函数调用等是更高

级的语言成分,如表达式中还可分运算分量和运算

符等;函数调用也是一种表达式,它有函数名标识

符、圆括号和实际参数表等。利用基本词汇,按照

给定的C语言的句法规则,就可命名程序对象,描

述表达式计算、构造语句、函数,直至整个程序。

5.C语言的语句主要分为_____语句、_____语句、

_____语句_____语句、______语句和_____语句等。

「解」C语言有多种不同功能的语句,有用于

定义数据的,有用于各种存储和计算的,有用于程

序流程控制的,有多种分类方法。C语言的语句主

要有:数据定义语句、表达式语句、流程控制语句、

复合语句、空语句和其它语句。程序中经常使用的

赋值表达式语句和函数调用表达式语句都是典型

的表达式语句。

6.C程序是由函数构成的。其中有并且只能有

_____个主函数。C语言程序的执行总是由_____函

数开始,并且在_____函数中结束(如别的函数未

调用终止程序执行的库函数)

「解」C程序是由若干函数构成的。其中有并

且只能有1个主函数(用main命名)程序的执。C

行总是由主函数开始执行,通常在主函数中结束

(如没有在别的函数中调用终止程序执行的库函

数的话)。

第二章基本数据类型和表达式

2.1单项选择题

1.下列字符列中,可以作为“字符串常量”的是

()

1ABC②“ABC“③‘abc’④‘a’

「解」C程序中,一个字符率常量是表示一个

字符序列,书写时,用双引号字符前后括住这个字

符序列。所以只有“ABC”是一个正确的字符率常

量,其余都不是。其中,ABC可作为标识符,字符

列‘abc’不能出现在C程序中,‘a’是一个字符常量。所以解答是②。

2.在以字节存储字符的系统中,‘\n’在内存占

用的字节数是()

①1②2③3④4

「解」一般来说,一个字符在内存中只占1个

字节,‘\n’是转义字符,其意义是换行符,它作为

一个字符存储,在内存也只占1个字节。所以解答

是①。

3.字符串“xyz”在内存占用的字节数是()

①3②4③6④8

「解」字符串中的每个字符占1个字节,但C

程序在存储字符串时,要在最后一个有效字符后面

接上1个字符串结束的标记符‘\0’。这样,存储字

符串常量“xyz”需要4个字节。所以解答是②。

4.在以下字符列中,合法的长整型常数是()

①0L②4962710③0.054838743④

2.1869el0

「解」为表示不同范围的整数,整型数据分短

整型、基本型和长整型,并对三种整型内部表示的

最高位的不同理解,又分别分成无符号和带符号两

种。若要明确指明一个整数是长整型的,必须在整

数之后接上字符‘L’。所以0L是一个长整型的整型

常量,而4962710是基本整型数据,而对于用2个

字节表示一个基本整型数据的系统来说,该整数将

因超出范围而是一个错误的整数;0.054839743和

2.1869el0都是double型的实数。所以解答是①。

5.一个char型数据,它的值在内存中存放的是

()

①ASCll代码值②BCD代码值③内码值④

十进制代码值

「解」计算机存储字符,通常是存储字符的某

种代码值。有许多种字符编码的方法,最流行的是

ASCII代码。在C语言中,Char型数据也用ASCII

2代码表示。所以解答是①。

6.设变量m,n,a,b,c,d的初值均为0,执

行(m=a==b)||(n=c==d)后,m,n的值是

()

①0,0②0,1③l,0④1,1

「解」计算(m=a==b)||(n=c==d)的过程

是先计算逻辑或的左运算分量(m=a==b)的值,由

低,又先计算a==b.因a,b均为0后,所以比较

结果值为1.将1赋给变量m,使变量m的值变为1.

同时这个赋值运算的结果也是1,这样逻辑运算的

左运算分量的值为1.由于逻辑或运算的左运算分量

值为1,按照C语言对逻辑或运算优化计算的规定,

不再计算逻辑或的右运算分量,而直接得到逻辑或

运算的结果为1.由于逻辑或的右运算分量不曾计

算过,所以变量n的值也不为变化。这样,上述表

达式计算后,变量m的情为1,变量n的值为0.所

以解答是③。

7.设a为5,执行下列计算后,b的值不为2的

是()

①b=a/2②b=6-(--a)③b=a%2④b

=a<3?3:2

「解」因两个整型数据相除,结果是整数,当

a的值为5时,计算表达式b=a/2后,使b的值为

2.计算表达式b=6-(--a)是先计算子表达式(--a)

的,先让a的值减1变成4,并以减1后的a为子

表达式的结果,所以子表达式的结果为4,最后使

b的值为2.在计算表达式b=a%2时,求余运算a%

2的结果为1,最后使变量b的值为1.计算表达式b

=a<3?3:2时,先计算条件表达式a<3?3:2,

以2为结果,最后也使变量b的值为人所以解答是

③。

8.执行语句“x=(a=3,b=a--);”后,X,a,

b的值依次为()

①3,3,2②2,3,2③3,2,3④2,3,3

「解」计算表达式x=(a=3,b=a--)时,先计

算赋值号右端圆括号内的逗号表达式。逗号表达式

要求各子表达式顺序计算,并以最后予表达式的值

为整个逗号表达式的结果。所以该表达式计算时,

先让变量a的值为3,a--的值是a当时的值,以该

值为结果赋给变量b,并以该值为逗号表达式的值

赋给变量x,然后a的值被减少1.所以计算该表达

式后,使变量x,a,b的值依次为3,2,3.所以解

答是③。

9.设整型变量m,a,c,均为1,n,b,d执行“m(=a>b)&&(n=a>b)”后m,n的值是()

①0,0②0,l③1,0④1,l

「解」表达式(m=a>b)&&(n=a>b)

是一个逻辑表达式,它的计算过程是先计算逻辑与

的左分量(m=a>b,其中又是先计算a>b.因a>b

不成立,结果为0,将0赋给变量m,最后逻辑与

的左分量结果为0.由于逻辑运算采用特别的优化计

算规则,当逻辑与的左分量结果为0时,不再计算

逻辑与的右分量,而直接以0为逻辑与的结果。所

以,上述表达式计算使m的值变为0,而n的值没

有变,依旧为l.所以解答是②。

10,设有代码“int a=3;”,则执行了语句

“a+=a-=a*a;”后,变量a的值是()

①3②0③9④-12

「解」由于赋值运算符的结合性自右至左,语

句“a+=a-=a*a;”的执行是先计算a*a,得到值9,

再计算a-=a*a,使a的值为-6,接着计算a+=a,

使a的值为-12.所以解答是④。

11.在以下一组运算符中,优先级最高的运算符

是()

①<=②=③%④&&

「解」常规运算符的优先级自高到低的排列顺

序是算术运算符、移位运算符、关系运算符。按位

运算符、逻辑运算符、条件运算符、赋值运算符、

逗号运算符。所以问题所给的四个运算符按优先级

12.设整型变量i的值为3,则计算表达式i---i

后表达式的值为()

①0②l③2④表达式出错

「解」有些运算符只有一个字符,也有许多运

算符由两个字符组成。特别是有些字符既可是单个

字符的运算符,又能组成双字符的运算符。编译系

统在识别源程序时,通常是尽量多地读八字符,能

组成多字符单词的先尽量组成多字符单词。所以表

达式i---i,被编译器理解为(i--)-i.另外,当表达

式中某变量有后缀自增和自减运算时,先按变量的

原值计算表达式,然后再对变量进行自增和自减运

算。同样地,当表达式中某变量有前缀自增和自减

运算时,先对变量进行自增和自减运算,然后再按

变量的新值计算表达式。按这个约定,求表达式

(i--)-i是计算i-i的值为0,然后再对i作自减运算。这样,表达式(i--)-i的值为0.所以解答是①。

13.设整型变量a、b、c均为2,表达式a+++b+++c++的结果是()

①6②9③8④表达式出错

「解」与上一小题解答的理由相同,表达式

a+++b+++c++被系统理解成:(a++)+(b++)()

+c++)。表达式“变量++”的值是变量的原来值,所

以在变量a、均为2的前题下,b.c执行上述表达式,

得到结果为6.所以解答是①。

14.若已定义x和y为double类型,则表达式:

x=l,y=x+3/2结果是()

①l②2③2.0④2.5

「解」由于变量x和y都是double类型,表达

式x=l,y=x+3/2是先计算x=1,由于1是

整型的,x是double类型的,该计算先将整数1转

换成double类型的1.0,并将1.0赋给变量x.计算y

=x+3/2是先求3/2的值,因是两整数相除,

结果是整型值1,然后在计算x+1时,也先将1

转换成1.0,然后求得x+l的值为2.0,最后将该

值赋给变量y,并得到整个表达式的值为2.0.所以

解答是③。

15.设a=1,b=2,c=3,d=4则表达式a<b?

a:c<d?a:d的结果为()

①4②3③2④1

「解」条件运算符的优先级比关系运算符的优

先级低,并且它的结合性是自右向左的,所以表达

式a<b?a:c<d?a:d可用圆括号等价地写成(a

<b?a:(c

结果为A的值1.所以解答是④。

16.设a为整型变量,下列C表达式中,不能表

达数学关系式:10<a<15的是()

①10<a<15②a==11||a==12||a==13||a

==14

③a>10&&a<15④!(a<=10)&&!(a

>=15)

「解」数学关系式10<a<15表示。只能是

11,12,13,14四个值之l.

用C表达式表示这个条件,可写成a>10&&

a<15,或!(a<=10)&&!(a>=15),或a==

11||a==12||a==13||a==14等。若写成10<a<15,该算式的计算顺序是先求出10<a的结果0或1,

然后以这个结果与15比较,是否小于15,显然这与数学式子的意义是不一致的。所以解答是①。

17.下列表达式中,正确的C赋值表达式是)(

①a=7+b+c=a+7②a=7+b++=a+7

③a=(7+b,b++,a+7)④a=7+b,

c=a+7

「解」赋值运算符是运算符之一,赋值运算也

可以出现在一般表达式中。赋值运算时,出现在赋式a=7+b+c=a+7因算术运算符比赋值运算符

的优先级高,要把a+7的结果赋给7+b+c,这是

错误的。同样理由,表达式a=7+b++=a+7

也是错误的。而表达式a=(7+b,b++,a+7)

就是正确的赋值表达式,它是先计算赋值号左边的

括号内的表达式,括号表达式内是一个逗号表达

式,远号表达式要求顺序逐一计算各子表达式,并

以最后一个子表达式的值作为远号表达式的结果,

最后将该结果赋给变量a.而表达式a=7+b,c=a

+7则不是一个赋值表达式,而是一个逗号表达式,

它由两个赋值子表达式组成。所以解答是③。

18.若有以下定义:char a;int b;float c;double d;则表达式a*b+d-c值的类型为()

①float②int③char④double

「解」基本类型的数据可以混合运算,但运算

时,对要求运算分量类型相同的运算来说,如运算

分量的类型不是全相同,则会有自动类型转换发

生。类型自动转换规则规定类型低(简单)的向类

型高(复杂)的转换。各类型由高到低的排列顺序

是:long double、float、unsigned long、long、unsigned int、int这样,若有定义:char a;int b;float c;double d;则表达式a*b+d-c的值的类型是double

的。首先计算a*b,得到int类型的值,接着计算

a*b+d,得到double类型的值,最后计算a*b+d-c,

得到double类型的值。所以解答是④。

19.表达式“9!=7”的值是()

①true②非0值③0④1

「解」关系运算的结果只有0和1,若关系成

立,则结果为1;若关系不成立,则结果为0.因关

系式9!=7成立,所以表达式的结果为1.虽然1

也是非0值,在供选择的答案中有1,所以最确切

的解答是④。

21.设字符型变量a=3,b=6,计算表达式C

=(a^b)<<2后C的二进制值是()

①00011100②00000111③00000001④00010100

「解」a的值为3,写成8位二进制数形式是00000011,b的值为6,写成8位二进制数形式是00000110.表达式c=(a^b)<<2,先计算a与b

的按位加,得到结果00000101,将这结果向左移2

位,得到二进位的位串信息是00010100.所以解答

是④。

22.设a,b和c都是int型变量,且a=3,b

=4,c=5,则下面的表达式中值为0的是()

①‘a’&&‘b‘②a<=b③a||b+c&&b-c④!((a

「解」对于表达式‘a’&&‘b’,两个非O运算

分量的逻辑与结果为1.对于表达式a<=b,由于关

系式成立,结果也为此又由于变量a为非0,表达

式a||b+c&&b-c的结果也为1.对于表达式!((a<b)&&!c||1),先是计算(a<b)得到结果1;计算!

C得到结果为0;再计算它们的逻辑与,结果为0.

继续与1求逻辑或,得到结果为1.最后,对1求逻

辑非,得到结果为0.所以解答是④。

23.设ch是char型变量,其值为‘A’,则下面表

达式的值是()

ch=(ch>=‘A’&&ch<=‘Z’)?(ch+32):ch

①‘A’②‘a’③‘Z’④‘z’

「解」由于字符型变量ch的值为‘A’,计算表

达式ch=h>=‘A’&&ch<=‘Z’)?(ch+32):ch,先计算其中条件表达式,由于条件(ch>=‘A

&&h<=’Z‘)成立,该条件表达式以ch+32=97

为结果,将该值赋给变量ch,以字符表达这个值

2.2填充题

1.在内存中,存储字符串“X”要占用______个字节,存储字符‘X’要占用_____个字节。

「解」计算机存储一个字符用1个字节,存储

字符串时,每个字符要占用1个字节,另在字符串

的有效字符之后存储1个字符串的结束标记符。所

以存储字符率“X‘要占用2个字节,存储字符’X‘只要1个字节。

2.在C程序中,判逻辑值时,用_____表示逻辑

值“真”,又用_____表示逻辑值‘假“。在求逻辑值时,用_____表示逻辑表达式值为”真“,又用_____表示

逻辑表达式值为”假“。

「解」在C程序中,判逻辑值时,用非0值表

示真;而判逻辑值时,用值0表示假。但逻辑表达

式计算结果,逻辑表达式值为真是用1表示的,而

逻辑表达式的值为假,则用0表示。

3.定义符号常量的一般形式是_____.

「解」定义符号常量用预处理命令的宏定义,

其定义的一般形式是:

#define符号常量名常量

4.在函数内,说明变量时,若省略存储类型符,

系统默认其为_____存储类别,该存储类别的类型

符为_____.

「解」在函数内,说明变量时,若省略存储类

型符,系统就默认其为自动存储类别,该存储类别

用auto标识。

5.无符号基本整型的数据类型符为_,双精度

实型数据类型符为_,字符型数据类型符为_。

「解」无符号的基本整型的类型符为unsigned

int,或简写成unsigned.双精度实型数据类型符为double,字符型数据类型符为char.

6.定义指定数据类型的变量时,较完整的一般

形式是。

「解」要指定变量的存储类型,定义指定类型

的变量,其一般形式是:存储类型符数据类型符变

量名1,变量名2,……;

7.设有下列运算符:<<、+、++、&&、

<=,其中优先级最高的是_____,优先级最低的

是_____.

「解」对运算符<<、+、++、&&、<=,

按它们的优先级自高到低的顺序排列为:++、+、

<<、<=、&&所以,优先级最高的是++,优先

级最低的是&&。

8.设二进制数A是0A101111,若想通过异或运

算A^B使A的高4位取反,低4位不变,则二

进制数B应______.

「解」按位加运算的一个重要应用是让某个整

型变量的二进位位串信息的某些位信息反向,0变

成1,而1变成0.这只要设计这样一个位串信息,

让要变反的位为1,不要改变的位为0,用这个位

串信息与整型变量按位加就能得到希望的结果。要

使字节的高4位取反,低4位不变,则需要位串信

息是11110000,写成八进制数是0360,写成十六进

制数为0xF0.

9.设a=3,b=2,c=l,c>b的值为______.,则

a>b>c的值为______.

「解」因a的值为3,b的值是2,条件a>b

为真,其值为1.表达式a>b>c的求值顺序是计算

a>b,结果为1,接着计算1>c,因c的值为1,

条件1>c为假,结果为0.

10.已知a=10,b=20,则表达式!a<b的值

为_____.

「解」计算表达式!a<b,先计算!a,因a

的值为10,的值为0.关系表达式0<20为真,!a

11.设x和y均为int型变量,且x=l,y=2,

则表达式1.0+x/y的值为_____.

解」计算表达式1.0+x/y,先求x/y,因x

和y是整型变量,其中的除运算是整除,1/2的

结果为0.接着计算1.0+0,计算时,先将右分量转

换成0.0,最后得到结果1.0.

12.设整型变量x、y、z均为5:

①执“x-=y-x”后,x=__________,

②执行“x%=y+z”后,x=__________.

③执行“x=(y>z)?x+2:x-2,3,2后,

x=____________.

「解」在变量x、y、z的值均为5的情况下,

计算各表达式。由于表达式x-=y-z等价于表达式

x=x-(y-z)所以计算后x的值为5.表达式x%=y,+z等价于表达式x=x%(y+z),所以计算后x的

值也为5.表达式x=(y>z)?x+2:x-2,3,

2的计算过程用圆括号描述其计算顺序是:

((x=(y>z)?x+2:x-2),2,3)

即这是一个逗号运算表达式,由一个赋值表达

式和两个数值构成,逗号表达式要求顺序求各子表

达式的值。表达式x=(y>z)?x+2:x-2的

计算是先求赋值号右边的条件表达式,因条件(y

>z)为假,求出x-2的值为3,将该值赋给变量

x,使x的值为3.

13.能表述“20<x<30或x<-100”的C语言

表达式是_____.

「解」首先表述20<x<30的C表达式可写成

20<x&&x<30.所以表述“20<x<30或x<-100”

的C表达式为20<x&&x<30||x<-100.

14,请写出数学式x/y*z的C语言表达式

_______.

「解」数学式子表述的是x除以y乘z的积,

写成C表达式可以写为x/(y*z),或可等价地写

成x/y/z.

15.C语言中运算结果可以当成逻辑值使用的

表达式有:_____表达式、_______.表达式、________

表达式、____________表达式、_________表达式、

________表达式。

「解」在C语言中,逻辑判断以非0值为真,以0

值为假。所以,几乎所有的表达式的运算结果都可

以当成逻辑值使用,如算术表达式、关系表达式、

逻辑表达式、赋值表达式、逗号表达式、条件表达

式等。

第三章C程序结构

3.1单项选择题

1.设a=3,b=4执行“printf(“%d,%d’,(a,b)(b,a);”的输出是(),)

①3,4②4,3③3,3④4,4

「解」在调用格式输出函数的语句中,其中每

个格式符对应一个输出项,格式符d要求输出项内

容以十进制整数形式输出。第一个输出项(a,b)

是一个逗号表达式,该表达式的值是b的值,输出

4.接着输出字符逗号。第二个输出项(b,a)的值

是a的值,输出3.所以语句执行将输出4,3.正解

的选择是②。

2.使用“scanf(”x=%f,y=%f“,&x,&y)”,要使x,y均为1.25,正确的输入是()

①1.25,1.25②1.251.25③x=1.25,y=1.25

④X=1.25y=1.25

「解」格式输入函数的格式字符串中的字符可

以分成三类:空格类字符、其它普通字符和格式转

换说明。其中空格类字符用来跳过一个空格类字符

序列,直至下一个非空格类字符。普通字符要求输

入字符与其完全相同。格式转换说明对输入字符列

按格式转换说明进行转换,得到内部值存储到对应

输入项所指定的存储位置中。函数调用scanf(“x

=%f,y=%f,&x,&y)以普通字符x=开头,输

入时也要先输入x=。接着是一个浮点数输入格式,

所有能构成一个浮点数1.25的字符序列都能满足

要求。接着是普通字符列”,y=“,在输入的浮点数

之后也要有字符列”,y=“。最后又是浮点数输入格

式,同样所有能构成一个浮点数1.25的字符序列都

能满足要求。问题给出的供选择答案中只有

x=1.25,y=1.25是能满足上述要求的。所以正确选

择是③。

3.设有int i=010,j=10;则执行“printf(”%d,

%d\n“,++i,j--);”的输出是()

①ll,10②9,10③010,9④10,9

「解」变量i和j的初值分别为八进制数010

和十进制数10,函数调用Printf(“%d,%d\n”,

++i,j——)中,++i的值是变量i增1后的值,原

来值是八进制数010,等于十进制数8,输出9.j——

的值是变量j减1之前的值,输出10.格式字符申中

的逗号是普通字符照原样输出。所以问题给出的格

式输出函数调用将输出9,10.正确的解答是②。

4.设a,b为字符型变量,执行“scanf(”a=%c,

b=%c“,&a,&b)”后使a为‘A’,b为‘B’,从键

盘上的正确输入是()

①‘A“B’②‘A’,‘B’③A=A,B=B④a=A,b

=B

「解」函数调用scanf(“c=%c,b=%c”,&c,

&b)中,普通字符必须按格式字符串要求照原样输

入,c格式对紧接的任何字符都输入。所以实现问

题的要求,输入字符列应为“a=A,b=B”。另外要

特别指出,在程序中,为表示字符常量,字符前后

需加单引号。但用字符格式输入字符时,在要输入

字符前后不必另键人单引号。若键人单引号,则这

个单引号也将作为字符被输入。正确的解答是④。

5.设x、y、z、t均为int型变量,则执行以下

语句后,t的值为()

x=y=z=1;t=++x||++y&&++z;

①不定值②2③l④0

「解」语句序列“x=y=z=l;t=

++x||++y&&++z;”使变量x的值为1,变量t是赋

一个逻辑表达式的值。在C语言中,由逻辑与和逻

辑或构成的逻辑表达式有特别的计算规则,顺序计

算各逻辑子表达式,并当一旦能得到逻辑表达式的

结果时,就立即结束逻辑表达式的计算,不再计算

后继逻辑子表达式。本题的逻辑表达式是两个运算

分量的逻辑或,而且左运算分量++x的值为非0,

立即得到逻辑或运算的结果为1,并将1赋给变量

t,所以变量t的值为1.正确解答为③。

6设x、y、z均为int型变量,则执行以下语句

后,x、y,z的值为()

x=1;y=0;z=2;y++&&++z||++x;

①2、l、3②2、0、3③2、l、3④2、1、2

「解」语句序列“x=l;y=0;z=2;y++&&++z||++x;”先使变量x的值为1,变量y的

值为0,变量z的值为2.由逻辑与和逻辑或构成的

逻辑表达式的特别计算规则,顺序计算各逻辑子表

达式,并当一旦能得到逻辑子表达式的结果时,就

立即结束逻辑子表达式的计算,不再计算该逻辑子

表达式。计算y++因y的值为0,使y++&&++z的

结果为0,立即去计算++x,这次计算使变量y的值变成1,而变量z的值本改变。接着计算++x,使x

的值变为2.所以经上述语句执行后,x、y、z的值

依次为2、1、2.正确解答为④。

7.假定所有变量均已正确定义,下列程序段运

行后x的值是()

a=b=c=0;x=35;

if!x--;else if b)if c)(a)(;(x=3;else x=4;

①34②4③35④3

「解」以变量a,b,c的值均为0,变量x的

值为35,语句:

if(!a)x--;else if(b);if(c)x=3;else x

=4;

由两个if语句组成。首先执行前一个if语句“if

(!a)x--;else if(b);”,因变量a的值为0,条

件!a成立,执行x--使x的值变为34.接着执行后

继的if语句“if(c)x=3;else x=4;”,因变量c

的值为0,条件不成立而执行x=4,最终使变量x

的值为4.正确解答是②。

注意前一个if语句的else部分的成分语句只有

“if(b);”,这是一个单分支if语句,且其成分语

句为空语句。

9.下列语句中,句法错误的是(不考虑语义)

()

①while(x=y)5;②do x++while(x=

=10);

③while(0)④do2;while(a==b);;

「解」while语句的一般形式是:

while(表达式)语句

这里的表达式可以是任何合理的表达式,语句

可以是任何语句,包括空语句,或表达式语句。可

能书写的while语句没有任何意义,如供选择的①

while(x=y)5;和③while(0),但这两个语句;

的句法没有任何错误。do-while语句的一般形式是:do语句while(表达式);

其中的成分语句也可以是任何语句,但供选择

答案②do x++while(x==10);中的代码x++是一

个表达式,不是语句,语句必须要以分号结束,所

以是错误的。正确解答是②。

10,循环语句“for(x=0,y=0;(y!=123)

||(x<4);x++);”的循环执行()

①无限次②不确定次③4次④3次

「解」for循环语句的初始化部分置变量x和y

的初值为0,循环条件是(y!=123)||(x<4),

每次循环后变量X的值增1.由于循环过程中变量y

的值未被修改过,循环条件又是一个逻辑或,其左

分量(y!=123)永远成立,也就是循环条件永远

成立。所以该循环语句将循环执行无限次。正确解

答是①。

11.若i、j已定义为int类型,则以下程序段中

的内循环体的执行次数是()

for(i=5;i;i--)

for(j=0;j<4;j++){……}

①20②24③25④30

「解」问题所给的程序段的外循环是一个阶循

环语句,它的初始化部分置变量i的初值为5,循

环条件简写成i,即i!=0,每次循环后变量i的值

减1.所以外循环共控制5次循环。内循环也是一个

for循环语句,它的初始化部分置变量j的初值为0,

循环条件是j<4,每次循环后变量j的值增1.所以内

循环共控制4次循环。这样,如内循环的体内未曾

对变量i和j有修改,在内、外循环一起控制下,

内循环体共被重复执行20次。正确解答是①。

12.假定a和b为int型变量,则执行以下语句

后b的值为()

a=1;b=10;

do{b-=a;a++;

}while(b--<0);

①9②-2③-1④8

「解」在这个程序段中,循环开始前变量a的值为1,b的值为10,每次循环从变量b减去a,

并让a增1,并在循环条件判定时,又让b减去1.

第一次循环后,变量b的值变成9,变量a的值变

为2,循环判断时,因b的值大于0,循环条件不

成立,结束循环。但在循环判断时,让b减去了1,

所以循环结束时,变量b的值为8.正确的解答是④。

13.设x和y为int型变量,则执行下面的循环

后,y的值为()

for(y=l,x=l;y<=50;y++)

{

if(x>=10)break;

if(x%2==1)x+=5;continue;}{

x-=3;

}

①2②4③6④8

「解」for循环语句的初始化部分置变量x和y的初值为1,循环条件是(y<=50),每次循环

后变量y的值增1,控制循环最多执行50次。循环

体有三个语句:首先在发现变量x的值大于等于10

时,结束循环;接着是当变量x除2的余数为1(即变量x是奇数)时,让变量X值增5,让x变成偶

数,并直接进入下一轮循环;如变量x是偶数,则

从变量x减去3,让变量x变成奇数。由上述分析

知,每两次循环使变量x的值增加2.第一次循环后,变量x的值变成6.第二次循环后,变量x的值变成

3.第三次循环后,变量x的位变成8.第四次循环后,

变量x的值变成5.第五次循环后,变量x的值变成

10.第六次循环时,因变量x的位大于等于10,直

接跳出循环,这次循环是非正常结束,对变量y的

修正只执行了5次。所以循环结束后,变量y的值

增至6.正确的解答是③。

14.在C语言中,下列说法中正确的是()

①不能使用“do语句while(条件)”的循环

②“do语句While(条件)”的循环中必须使用

“break”语句退出循环

③“do语句while(条件)”的循环中,当条件

非0时将结束循环

④“do语句while(条件)”的循环中,当条件

为0时将结束循环

「解」do-while语句的一般形式是:

do语句

while(表达式);

其语义是重复执行其成分语句,直至表示条件的表达式值为0时结束。do-while语句是正常使用

的一种循环结构之一。do-while语句的循环结束条

件由while后的表达式值为0所控制,并不一定要

有break语句跳出循环来结束循环。do-while语句

在条件值非0时,将继续循环,而不是结束循环。

条件值为0时,才结束循环。所以正确的选择是④。

3.2填充题

1.结构化程序设计规定的三种基本结构是________结构,选择结构和_______结构。

「解」结构化程序设计的三种基本控制结构是

顺序结构、选择结构和循环结构。

2.若有定义“int a=25,b=14,c=19;”,以

下语句的执行结果是______.

if(a++<=25&&b--<=2&&c++)

prinif(“***a=%d,b=%d,c=%d\n”,a,

b,c);

else printf(“###a=%d,b=%d,c=%d\n”,

a,b,c);

「解」问题所给的if语句中,条件a++<=25

&&b--<=2&&c++是先求逻辑与的第一个运算

分量,它是一个关系式,关系成立。接着判定第二

个逻辑与运算分量,又是一个关系式,由于变量b

的值是14,b不小于等于2,运算分量的关系式不

成立,导致if语句的条件为假,执行else部分。在

求且语句的条件时,计算了2个逻辑与分量,使变

量a的值增了1,变量b的值被减了1.所以输出内

容是:###a=26,b=13,c=19.

3.以下两条if语句可合并成一条if语句为

_____________.

if(a<=b)x=1;

else y=2;

if(a>b)printf(“****y=%d\n”,y);

else printf(“####x=%d\n”,x);

「解」在以上两条if语句中,两个条件刚巧相

反。若将前一个if语句的第一个成分语句与第二个

if语句的第二个成分语句合并;第一个if语句的第

二个成分语句与第二个if语句的第一个成分语句合

并,写成一条if语句如下:

if a<=b)({x=1;printf“####x=%d\d,;(x)}

else{y=2;printf(“****y=%d\n”,y);}

4.设i,j,k均为int型变量,则执行完下面的

for语句后,k的值为_______.

for(i=0,j=10;i<=j;i++,j--)k=i+j;

「解」该for语句以i为0、j为10初始化,

循环条件是i<=j,每次循环后i增1、j减1,

循环体是将i与j的和赋给k.这样变量k将保存的

是最后一次赋给它的值。一次循环后i为l.j为9,

二次循环后i为2.j为8,……,五次循环后i为

5.j为5,继续第六次循环,i与j的和10存于k将

后,i为6、j为4,结束循环。所以循环执行后k

为10.

5.下列程序的功能是输入一个整数,判断是不

是素数,若为素数输出1,否则输出0,请为程序

填空。

main()

{int i,x,y=1;

scanf(“%d”,&x);

for(i=2;i<=x/2;i++)

if________________{y=0;break;}

printf(“%d\n”,y);

}

「解」为判数x是否是素数,预置变量y的值

为1(x可能是素数),然后用循环,用2至x/2

的整数i测试对x的整除性,若能被其中的某个整

数整除,则x是合数,置y的值为0(不是素数),

结束测试循环。若都不能整除,则x为素数。i能

否整除x,可用求余运算x%i等于0来判定。所以

程序中的空框可填x%i==0.测试X为素数的代

码可写成:

y=l;

for(i=2;i<=x/2;i++)

if(x%i==0){y=0;bleak;}

3.3程序分析题

1.阅读程序,写出运行结果。

main()

{int a=10,b=4,c=3;

if(a<b)a=b;

if(a<c)a=c;

printf(“%d,%d,%d\n”,a,b,c);

}

「解」程序中,第一个if语句if(a

当a

小。同样第二个IF语句if(a<c)a=c,当a<c

时,让C值置A,使A的值不比C小。实际;情

况是a本来就比b和c都大,所以a的值没有变,

程序输出a、b和c的原来值:10,4,3.

2.阅读下列程序,写出程序的输出结果。

main()

{int x=100,a=10,b=20,ok1=5,ok2

=0;

if(a<b)if(b!=15)if(!ok1)x=1;

else if(ok2)x=10;

else x=-l;

printf(“%d\n”,x);

}

「解」程序预置变量x的值为100,a的值为

10,b的值为20,ok1为5,ok2为0.

程序中给出的if语句可以写成更结构化的形式

如下:

if(a<b){

if(b!=15){

if(!ok1)x=1;

else{

if(ok2)x=10;

else x=-l;

}

}

由于条件a<b成立,并且条件b!=15也成立,

而ok1不等于0,执行else后的语句。又因ok2等

于0,执行else后的语句赋-1给x.所以程序输出-l.

3.阅读下列程序,写出程序的输出结果。

main()

{int y=9;

for(;y>0;y--)

if(y%3==0)printf{(“%d”,;--y)continue;}}

「解」循环前,变量y的值为9,其中的循环

语句在y大于0情况下循环,每次循环后y的值减

1.循环体是当y能被3整除时输出表达式--y,输出

的是减1后的y值。这样,第一次循环因y为9,

能被3整除,输出8,y也变成8.又经两次循环,y

的值变为6,又让y减1变成5,并输出5;又经两

次循环,y的值变成3,让y减至变成2,输出2;

再经两次循环后,y的值变成0,结束循环。所以

程序输出852.

3.4程序设计题

1.编一个程序,输入华氏温度(F),按下列公

式计算并输出对应的摄氏温度(C):C=5(F-

32)/9

「解」利用公式:C=5(F-32)/9,输入F

氏温度,计算并输出对应的C氏温度,程序要引入

两个变量,分别用于存储F氏温度和C氏温度,计

算时应采用浮点型,包括公式中的常数也应写成浮

点数,不能采用整型和把常数写成整数。因采用整

型编写,公式中的除运算变成整除,会得出与实际

#include

main()

{float f,c;/*变量定义*/

printf(“输入F氏温度”);

scanf(“%f,&f);

c=5.0*(f-32.0)/9.0;

printf(“对应的C氏温度%6.2f\n”,c);

}

2.编一个程序,输入一个整数,输出其符号(若

≥0,输出1;若<0输出-1)。

「解」程序可用if语句判断输入数的符号,并

控制输出1或-l.程序如下:

#include

main()

{int c;/*变量定义*/

printf(“输入一个整数”);

scanf(“%d”,&c);

if(c>=0)printf(“1\n”);

else printf(“-l\n”);

}

3.编一个程序,输入X的值,按下列公式计算

并输出y的值。

x(x≤l)

y=2x-l(l<x<10)

3x-11(10≤x)

「解」输入x,按公式计算y.这可用一个嵌套

的if语句分段判断并计算出y的值。然后输出y值。程序如下:

#include<stdio.h>

main()

{int x,y;/*变量定义*/

printf(“输入一个整数”);

scanf(“%d”,&x);

if(x<=l)y=x;

else if(x<10)y=2*x-l;

else y=3*x-11;

printf(“y=%d\n”,y);

}

4.编一个程序,输入三个单精度数,输出其中最

小数。

「解」设最小数存于变量min中,为求三个数

中的最小数,可分以下多步完成,先预置min为x,

然后分别将其余两个数逐一与min比较,当它们中

的某个值比存于min中的值更小时,就用它们更新

min.写出程序如下:

#include

main()

{float x,y,z,min;/*变量定义*/

printf(“输入三个单精度浮点数”);

scanf(“%f%f%f”,&x,&y,&z);

min=x;

if(min>y)min=y;

if(min>z)min=z;

printf(“浮点数%f,%f中的最小值是%f\n”,%f,x,y,z,min);

}

5.编一个程序,求出所有各位数字的立方和等

于1099的3位数。

「解」找出所有各位数字的立方和等于1099

的3位整数。3位整数是100至999范围内的整数,

设分别用a,b,c存储3位数的百位、十位和个位

的数字,程序用三重循环求出a,b,c的立方和为1099的3位数a*100+b*10+c.程序如下:

#include

main()

{int a,b,c;/*变量定义*/

for(a=1;a<=9;a++)

for(b=0;b<=9;b++)

for(c=0;c<=9;c++)

if(a*a*a+b*b*b+c*c*c==1099)

printf(“%d\n”,(10*a+b)*10+c);

}

若用一个变量i表示3位数,循环体将3位数

变量i分拆出它的百位、十位和个位共3个数字,

然后判这三个数字的立方和是否是1099,若是就输

出该变量的值。程序如下:

#include

main()

{int i,a,b,c;/*变量定义*/

for(i=100;i<=999;i++){

a=i/100;

b=(i%10)/10;/*或b=(i/10)%l0*/

c=i%10;

if(a*a*a+b*b*b+c*c*c==1099)

printf(“%d\n”,i);

}

}

6.编一个程序,输入10个整数,统计并输出其中正数、负数和零的个数。

「解」输入10个整数,统计其中正数、负数

和零的个数。程序引入3个计数器变量,用于统计

大于以小于0和等于0的整数的个数。开始时,这

3个计数器都置0,然后用循环逐一输入10个整数,并判定当前输入的整数是大于0,或小于0,或等

于0,并按判定结果累加相应计数器。最后,程序

输出这3个计数器的值。程序如下:

#include

main()

{int i,d,n,z,p;/*变量定义*/

n=z=p=0;

for(i=1;i<=10;i++){

print(“输入第%d个整数”,i);

scanf(“%d”,&d);

if(d<0)n++;

else if(d>0)p++;

else z++;

}

printf(“负数有%d个,正数有%d个,零有%d 个。\n”,n,p,z);

}

7.编程序,按下列公式计算e的值(精度为

1e-6):

e=1+1/1!+1/2!+1/3!+…+1/n!+…

「解」按e的幂级数展开式计算e的值。这是

典型的求级数和计算问题。通常采用逐项计算,并

累计的方法。计算新的项时,可用上一轮循环计算

出的项,这能提高程序的效率。循环直至当前项的

值小于精度要求结束。程序如下:

#include

main()

{double e,t,i;/*变量定义*/

e=0.0;t=1.0;i=1.0;

while(t>=1.0e-6){

e+=t;

t/=i;

i+=1.0;

}

printf(“e=%.6f\n”,e);

8.编程序,按下列公式计算y的值(精度为

1e-6):

y=∑1/r*r+1

「解」按所给公式计算数列的和。类似上一小

题的解,逐项计算并累计。程序如下:

#include

main()

{double y,r,t;/*变量定义*/

y=0.0;r=1.0;

while((t=1.0/(r*r+1.0))>=1.0e-6){

y+=t;

r+=1.0;

}

printf(“y=%.6f\n”,y);

}

9.编一个程序显示ASCII代码0x20至ox6f的十进制数值及其对应字符。

「解」显示ASCII代码为十六进制0x20至ox6f 的字符的十进制代码值与其字符。程序可用一个循环,让变量i顺序地取0X20至OX6f的值,并逐一输出其十进制代码和对应的字符,程序如下:

#include

main()

{int i,k=0;

for(i=0x20;i<=0x6f;i++){

if(k++%10==0)/*每行十个*/

printf(“\n”);

printf(“(%c)=(%d)”,i,i);

}

printf(“\n”);

}

10.用三种循环语句分别编写程序显示1至100

的平方值。

「解」用三种循环语句分别编写显示1至100

的平方值的程序。直接写出3个程序如下:

(1)用输循环实现的程序

#include

main()/*用for循环*/

{int i,k=0;

for(i=l;i<=100;i++){

if(k++%5==0)/*每行五个*/

printf(“\n”);

printf(“%d*%d=%d”,i,i,i*i);

}

printf(“\n”);

}

(2)用while循环实现的程序

#include

main()/*用while循环*/

{int i,k=0;

i=1;

while(i<=100){

if(k++%5==0)/*每行五个*/

printf(“\n”);

printf(“%d*%d=%d”,i,i,i*i);

i++;

}

printf(“\n”);

}

(3)用do-while循环实现的程序

#include

main()/*用do-while循环*/

{int i,k=0;

i=1;

do{

if(k++%5==0)/*每行五个*/

printf(“\n”);

printf(“%d*%d=%d”,i,i,i*i);

i++;

}while(i<=100);

printf(“\n”);

}

第四章数组

4.1单项选择题

1.若有下列说明,则数值为4的表达式是()

int a[12]={l,2,3,4,5,6,7,8,9,10,

11,12};char c=‘a’,d,g;

①a[g-c]②a[4]

③a[‘d’-‘c’]④a[‘d’-c]

「解」数组元素的下标自0开始顺序编号,值

为4的元素是a[3].所以只有下标表达式的值为3的

才是正确的。下标表达式g-c中的的变量g和c的

值是还未被设定的,其值不确定。a[4]的值为5,下

标为4是不对的。‘d’-‘c’的值为1,a[l]的值是2,所以也是不对的。变量c的值为‘a’,‘d’-c=3,所

以正确解答是④。

2.设有定义:“char s[12]={”string“};”则printf (“%d\n”,strlen(s);的输出是())

①6②7

③11④12

「解」在C语言中,字符串是指在有效字符之

后有字符列结束标记符的字符列,并约定字符串的

长度是指字符列中有效字符个数,不包括字符串的

结束标记符。存放于字符数组s中的字符串是

“string”,该字符串的长度为6,所以输出该字符串

的长度应是6.正确的解答是①。

3.下列语句中,正确的是()

①char a[3][]={‘abc“,’1‘};②char

a[][3]={’abc‘,’l‘};

③char a[3][]={‘a’,“1”};④char a[][3]={“a”,“1”};

「解」如定义数组时有初始化,其最高维的长

度可以省缺,由系统根据初始化时的初值个数确

定,而其它维的长度是不可以缺省的。对二维字符

数组的初始化,可以按行用字符串对其初始化,也

可以按二维数组元素的存储顺序逐一用字符对其

元素初始化。在供选择解答①和③中,有不是最高

维的长度被缺省,所以是错误的。在供选择解答①

和②中,还将字符串常量写作‘abc’,这也是错误的。

只有④,用字符列按行给二维字符数组初始化,这

才是正确的。正确构解答是④。

4.合法的数组定义是()

①int a[]={“string”}②int a[5]={0,1,2,3,4,5};

③char a={“string”}④char a[]={0,1,2,3,4,5};

「解」①错误的原因是整数数组不可以用字符

串对其初始化。②错误的原因是,数组初始化时,

初始化指定的值的个数多于数组的元素个数。③错

误的原因是,能用字符串初始化的只;有字符指针

初始化,包括字符变量。④是正确的,因为字符数

组可以用小整数(作为字符的ASCII代码值)对其

元素初始化。

5.语句“printf”%d\n“,(”ats\nol2\1\\“);(strlen)”的输出结果是()

①11②10③9④8

「解」字符串中的字符可以是一般的普通字符,

也可以是由反斜杠字符开头的转义字符。在字符串

“abs\no12\1\\”中,有三个转义字符,它们是\n、\1、

\\,所以该字符串的有效字符个数是9.所以正确的

回答是③。

6.函数调用“strcat(strcpy(strl,str2),str3)”的

功能是()

①将字符串strl复制到字符串str2中后再连接

到字符串str3之后

②将字符串strl连接到字符串str2中后再复制

到字符率str3之后

③将字符串str2复制到字符串strl中后再将字

符串str3连接到字符串strl之后

④将字符串str2连接到字符串strl之后再将字

符串strl复制到字符串str3中

「解」函数调用strcat(s1,s2)是将s2字符

串复制连接到s1字符串之后,使s1字符串变得更

长。函数调用strcpy(s1,s2)是将s2字符串复制

到s1,s1字符串的内容与s2字符串的内容相同。使

函数调用strcat(strcpy(strl,str2),str3)是先

执行strcpy(strl,str2),然后再执行strcat(strl,

str3)所以其功能是将字符串str2复制到字符串strl,

中,然后再将字符串str3复制连接到字符串strl之

后。正确的选择是③。

7.设有如下定义,则正确的叙述为()

char x[]={“abcdefg”};

char y[]={‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’};

①数组x和数组y等价

②数组x和数组y长度相同

③数组x的长度大于数组y的长度

④数组x的长度小于数组y的长度

「解」不指定数组长度的字符数组定义,其所

需要的字节数可由初始化中给出的值的个数确定。

字符数组可以用字符串初始化,也可用字符逐个给

字符数组的元素初始化。但用字符初始化时,尽管

给出了字符串中的全部字符,还是不会自动有字符

率结束字符。但字符串初始化自动会含有字符串的

结束标记符,字符串初始化所需要的字节个数会比

用同样多的字符初始化多1个字节。所以只有③才

是正确的。

4.2填充题

1.根据变量定义“static int b[5],a[][3]={1,2,

3,4,5,6};”,b[4]=_____,a[1][2]=

「解」系统规定,静态变量定义时,若末初始

化,系统自动给定二进制代码全0的值。所以静态

数组b的元素全为0,当然包括b[4]也为0。静态

数组a是二维数组,每行有三个元素,在初始化中

结出了六个初值,所以数组a有2行。由于数组的

元素按行顺序存储,并按行顺序初始化。前三个值

是第一行,后三个值是第二行。a[1][2]是第二行的

第三列元素,也是a的最后一个元素,所以其值是

6. 2.设有定义语句“static int a[3][4]={{1},{2},{3}};”则a[l][l]值为_,a[2][1]的值为_。

「解」给二维数组初始化时,可按行给出初值,

并且每行可以只给前面部分的元素给出初值。系统

规定,对那些未给出初值的部分元素,系统自动置

二进制代码全0的值。由于定义语句只给a[0][0]给

定初值l、a[l][0]给定初值2、a[2][0]给定初值3.这样,其它元素都为0值。所以,a[1][1]=0,a[2][1]=0.

3.若在程序中用到“putchar()”函数时,应在程序开头写上包含命令_____,若在程序中用到

“strlen()”函数时,应在程序开头写上包含命令

______。

「解」putchar()是系统提供的头文件stdio.h 中定义的宏,所以程序要使用它,必须写上包含命

令:#include.函数strlen()是系统提供

的字符串处理函数之一,字符串处理函数的函数原

型说明和它们用到的有关常量、数据结构等,在系

统提供的头文件string.h中定义,所以使用该函数

的程序应在程序开头写上包含命令

#include.

4.下面程序的功能是输出数组s中最大元素的

下标,请填空。

main()

{int k,p;

int s[]={1,-9,7,2,-10,3};

for(p=0,k=p;p<6;p++)

if(s[p]>s[k])____________

printf(“%d\n”,k);

}

「解」为要寻找数组中的最大元素的下标,需

先预设1个临时最大元素的下标,并顺序逐一考察

数组的元素,当发现当前元素比临时最大元素更大

时,就用当前元素的下标更新临时最大元素下标。

直至考察了数组的全部元素后,这临时最大元素下

标就是数组的最大元素下标。通常预设的最大元素

下标是数组的首元素下标,考察是从首元素开始顺

序向后继元素考察。程序中,存储临时最大元素下

标的变量是k,变量p控制顺序考察的循环控制变

量。当发现当前元素s[p]比临时最大元素s[k]更大

时,应该用p更新k.所以在空框处应填入代码“k=p;”。

5.下面程序的功能是将一个字符串str的内容颠

倒过来,请填空。

main()

{int i,j,_____________;

char str[]={“1234567”};

for(i=0,j=strlen(str);i

printf(“%s\n”,str);

}

「解」颠倒一个字符串中的字符,就是首尾对

应的元素两两交换。简单地可用两个游标变量i和

j,i是前端元素的下标,j是后端元素的下标,交

换以这两个变量值为下标的元素str[i]和str[j].开始时,i的值为0,j的值为字符串末元素的下标(字

符串长度减1)。每次交换后,i增1,j减1.继续交换的条件是str[i]还位于str[j]的前面,即i

处应填入-1.程序为了交换str[i]和str[j],使用了变量k,该变量应在程序的变量定义部分中一起定义,

所以在第一个空框处应填入k.

6.以下程序可把输入的十进制数以十六进制数

的形式输出,请填空。

main()

{char b[17]={“0123456789ABCDEF”};

int c[64],d,i=0,base=16;

long n;

printf(“Enter a number:\n”);

scanf(“%ld”,&n):

do{c[i]=________;i++;n=n/base;}

while(n!=0);

printf(“Transmite new base:\n”);

for(--i;i>=0;--i)

{d=c[i];printf(“%c”,);}

printf(“\n”);

「解」程序中,字符数组b存储十六进制的16

个数字符,整型数组c存储译出的十六进制数的各

位数值。从整数n译出它的各位十六进制数值,需

采用除16取余的方法,即求n除16的余。得到它

的十六进制的个位数,接着将n除以16.在n不等

于0的情况下循环,能顺序求出n的十六进制的个

位数、十位数、百位数等等。程序中变量base已预

置16,所以在第一个空框处可填代码n%base。n当

的十六进制数的个位、十位、百位等数字依次存放

于数组c中后,就从最高位至最低位,参照数组c

的内容d(以其内容为下标),取十六进制数字符表

中的字符b[d]输出。所以在第二个空框处可填入代

码b[d].

4.3程序分析题

1.阅读程序,写出程序运行结果。,

main()

{static int a[][3]={9,7,5,3,l,2,4,6,

8};

int i,j,sl=0,s2=0;

for(i=0;i<3;i++)

for(j=0;j<3;j++)

{if(i==j)s1=s1+a[i][j];

if(i+j==2)s2=s2+a[i][j];

}

printf(“%d\n%d\n”,sl,s2);

}

「解」已知数组共有3行3列,第一行依次是

9,7,5;第二行是3,1,2;第三行是4,6,8.

程序引用数组元素的游标变量是i和j,外循环控制

变量i是数组的行下标,内循环控制变量j是数组

的列下标。循环体的工作是将数组的某些元素累计

到sl,某些元素累计到s2.将行下标i和列下标j相

同的元素累计到sl,sl=a[0][0]+a[l][1]+a[2][2].将行下标i与列下标j的和为2的元素累计到s2,s2

=a[0][2]+a[l][l]+a[2][0].所以sl是18,s2是10.程序输出:

18

10

2.说明下列程序的功能。

main()

{int i,j;

float a[3][3],b[3][3],x;

for(i=0;i<3;i++)

for(j=0;j<3;j++)

{scanf(“%f”,&x)a[i][j]=x;;

}

for(i=0;i<3;i++)

for(j=0;j<3;j++)

b[j][i]=a[i][j];

for(i=0;i<3;i++)

{printf(“\n”);

for(j=0;j<3;j++)

printf(“%f”,b[i][j]);

}

「解」程序第一段两重循环,实现按行顺序输入数组a的全部元素的值。程序第二段两重循环是

将数组a转置复制到数组b.程序第三段两重循环

实现按行输出数组b的全部元素。所以程序的功能

是按行顺序输入3*3二维数组的全部元素,然后按

列顺序输出。

3.写出下列程序的运行结果。

main()

{static char a[]={‘*’,‘*’,‘*’,‘*’,‘*’,‘*’};int i,j,k;

for(i=0;i<5;i++)

{printf(“\n”);

for(j=0;j

for(k=0;k<5;k++)printf(“%c”,a[k]);

}

printf(“\n”);}

「解」程序的外循环控制循环五次,每次开始

先输出一个换行符,共输出5行信息。对于i(自0

开始计算)行,先输出i个空白符,接着输出字符

数组a中的五个字符,由于a中的五个字符都是字

符。,所以输出五个*字符。这样程序是输出以下形

式的图案:

*****

*****

*****

*****

*****

4.说明下列程序的功能。

main()

{int i,j;

float a[3][3],b[3][3],c[3][3],x;

for(i=0;i<3;i++)

for(j=0;j<3;j++)

{scanf(“%f”,&x)a[i][j]=x;;

}

for(i=0;i<3;i++)

for(j=0;j<3;j++)

{scanf(“%f”,&x);b[i][j]=x;

}

for(i=0;i<3;i++)

for(j=0;j<3;j++)

c[i][j]=a[i][j]+b[i][j];

for(i=0;i<3;i++)

{printf(“\n”);

for(j=0;j<3;j++)

printf(“%f”,c[i][j]);

}

printf(“\n”);

}

「解」程序第一段的功能是按行顺序输入数组

a的元素。程序第二段的功能是按行顺序输入数组

b的元素。程序第三段的功能是顺序累加数组a和

数组b的对应元素,并将和存于数组c的对应元素

中。最后,按行顺序输出数组c的全部元素。

4.4程序设计题

1.编程序,输入单精度型一维数组a[10],计

算并输出a数组中所有元素的平均值。

「解」为了计算数组元素的平均值,首先要累

计它的全部元素的和,然后除以数组元素的个数,

即得数组元素的平均值。写成C程序如下:

#include

main()

{int i,n=10;

float s,a[10];printf(“Enter%d numbers!\n”,n);for(i=0;i

{scanf(“%f”,&s)a[i]=s;;

}

for(s=0.0,i=0;i

s+=a;

s/=n;

printf(“平均值是%.2f\n”,s);

}

2.编程序,输入10个整数存入一维数组,再按逆

序重新存放后再输出。

「解」将数组的元素逆序重新存放,就是将数

组的首尾对应元素两两交换。简单地可用两个游标

变量i和j,是前端元素的下标,是后端元素的下ij 标,交换以这两个变量值为下标的数组元素。开始

时,i的值为0,j的值为末元素的下标。每次交换

后,i增1,j减1.继续交换的

条件是i

#include

main()

{int a[10],i,j,t,n=10;

printf(“Enter%d numbers!\n”,n);

for(i=0;i

scanf(“%d”,&a[i]);

for(i=0,j=n-1;i

t=a[i];a[i]=a[j];a[j]=t;

}

for(i=0;i

printf(“%d\t”,a[i]);

printf(“\n”);

}

3.编程序,输入两个字符串(<40个字符),

连接后输出(不准用系统函数).

「解」将字符串s2连接到字符串s1的计算过

程可分两个步骤完成。首先找到字符串s1的末尾,

然后参照字符串s2,将字符串s2的全部有效字符

逐一复制到字符串s1,最后在字符串s1的末尾接

上字符串结束标记符。完整程序如下:

#include

#define N40

main()

{char s1[N],s2[N];

int i,j;

printf(“Enter stringl!\n”);

scanf(“%s”,s1);

printf(“Enter string2!\n”);

scanf(“%s”,s2);

for(i=0;sl[i]!=‘\0’;i++);

for(j=0;s2[j]!=‘\0’;i++,j++)

s1[i]=s2[j];

s1[i]=‘\0’

printf(“sl=%s\n”,sl);

}

4.编程序按下列公式计算s的值(其中x1、 (x2)

xn由键盘输入):

s=∑(xi-x0)(xi-x0)(其中x0是x1、 (x2)

xn的平均值)

「解」输入数组x的n个元素的值,按公式计

算。程序首先输入n,设n<100,然后输入n个数

据,接着求它们的平均值,最后按计算公式求出s,

并输出。程序如下:

#include

#define N100

{double x[N+1],s;

int i,n;

do{

printf(“Enter n(<100)”);

scanf(“%d”,&n);

}while(n<=0||n>=100);

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

scanf(“%lf”,&s);

x[i]=s;

}

for(s=0.0,i=1;i<=n;i++)

s+=x;

x[0]=s/n;

for(s=0.0,i=1;i<=n;i++)

s+=(x[i]-x[0])*(x[i]-x[0]);

printf(“s=%f\n”,s);}

5.输入一个3X5的整数矩阵,输出其中最大值、

最小值和它们的下标。

「解」输入一个二维数组,寻找二维数组的最

大值和最小值。其中寻找最大值和最小值的工作可

用两重循环实现,即按行按列考察二维数组的元

素。程序如下:

#include

main()

{int a[3][5],i,j,t,n=3,m=5,min,

max,minrow,mincol,maxrow,maxcol;

printf“Enter%d*%d numbers!,n,;(\n”m)for(i=0;i

for(j=0;j

scanf(“%d”,&t);

a[i][j]=t;

}

min=max=a[0][0];

minrow=mincol=maxrow=maxcol=0;

for(i=0;i

for(j=0;j

if(a[i][j]>max){

max=a[i][j];maxrow=i;maxcol=j;

}

if(a[i][j]

min=a[i][j];minrow=i;mincol=j;

}

}

printf(“MAX=a[%d][%d]=%d MIN=

a[%d][%d]=%d\n”,maxrow,maxcol,max,

minrow,mincol,min);

}

6.输入一个字符串,将其中的所有大写字母改为

小写字母,而所有小写字母全部改为大写字母,然

后输出。

「解」程序先输入字符串,然后顺序考察输入

字符串中的字符,当发现是大写字母时,将它改写

成对应的小写字母,而当它是小写字母时,就将它

改写成对应的大写字母。若变量ch中的字符是大

写字母,则与它对应的小写字母的表达式可以写成

ch-‘A’+‘a’;类似地,若变量ch中的字符是小写

字母,则与它对应的大写字母的表达式可以写成ch -‘a’+‘A’.完整程序如下:

#include

#include

#define N200

main()

{char s[N];

int i;

printf(“Enter string!\n”);

gets(s);

for(i=0;s!=‘\0’;i++)

if(s[i]>=‘A’&&s[i]<=‘Z’)

s[i]=s[i]-‘A’+‘a’;

else if(s[i]>=‘a’&&s[i]<=‘z’)

s=s-‘a’+‘A’;

printf(“s=%s\n”,s);

}

7.设某班50名学生的三科成绩表如下:

课程一课程二课程三

………………

试编一个程序,输入这50个学生的三科成绩,

计算并输出每科成绩的平均分。

「解」程序定义一个50行3列的二维数组,

用于存储全班学生的成绩。程序顺序输入各个学生

的三科成绩,然后按列的顺序,累计各科总分,并

计算平均分。完整程序如下:

#include

#define N50

#define M3

main()

{int score[N][M],i,j,t;

double a[M];

printf(“Enter scores!\n”);

for(i=0;i

for(j=0;j

scanf(“%d”,&t);

score[i][j]=t;

}

for(j=0;j

for(j=0;j

for(i=0;i

a[j]+=score[i][j];

a[j]/=N;

}

for(j=0;j

printf“课程%d的平均分是%.2f\n”,j+1,(a[j]);

}

8.编一个程序,输入一个整型数据,输出每位

数字,其间用逗号分隔。例如,输入整数为2345,

则输出应为:2,3,4,5.

「解」程序的主要工作是从输入整数分拆出它

的十进制整数的各位数字,将分拆出来的各位数字

存于数组中,然后将这些数字自高位到低位的顺序

逐位输出。要将一个整数按十进制数的要求分拆,

需用一个循环,每次循环求出被分拆数除以10的

余数的办法来求出它的个位,每分拆出一位就将被

分拆的数除以10.循环过程直至被分拆的数为0结

束。完整程序如下:

#include

main()

{int a[20],i,base=10;

int n;

printf(“Enter a number!\n”);

scanf(“%d”,&n);/*整数输入*/

i=0;/*对n进行分拆,各位数字自低位到高

位存于数组a*/

do{

a[i++]=n%base;

n/=base;

}while(n);

for(i--;i>=0;i--)/*自高位到低位输出*/

printf(“%d%c”,a[i],i>0?’,’:’\n’);}

9.编一个程序,输入一个字符串,将其中所有

的大写英文字母的代码+3,小写英文字母的代码-3.

然后输出加密后的字符串。

「解」程序的主要工作是输入字符串,并顺序

考察输入字符串中的字符,分别对其中大小写英文

字母完成问题要求的更改,而跳过不是英文字母的

字符。完整程序如下:

#include

#include

#define N200

main()

{char s[N];

int i;

printf(“Enter string!\n”);

gets(s);

for(i=0;s[i]!=‘\0’;i++)

if(s[i]>=‘A’&&s[i]<=‘Z’)

s[i]+=3;

else if(s[i]>=‘a’&&s[i]<=‘z’)

s[i]+=3;

printf(“s=%s\n”,s);

}

第五章指针

5.1单项选择题

1.设有定义“int a=3,b,*p=&a;”,则下列语句中使b不为3的语句是()

①b=*&a;②b=*p;

③b=a;④b=*a;

「解」定义有int a=3,b,*p=&a;对b赋

值的表达式有*&a、*p、a、*a.引用变量a的值有

两种方法,一是直接引用a,二是通过a的指针间

接引用a.对于后者,又有多种表达方法,通过指

向a的指针p,间接引用a的内容,如*p.或通过求地址运算符由变量a得到其指针&a,再由这指针表

达式间接引用a的内容,如*&a.所以表达式*&a、

*p和a都能引用变量a的值,而使b的值为3.而表达式b=*a是错误的,因为a不是指针变量,不

能对它施行取内容运算符……所以解答是④。

2.设指针x指向的整型变量值为25,则“printf (”%d\n“,++*x);”的输出是()

①23②24③25④26

「解」若指针变量x指向某个变量,例如指向

变量v,并且变量v的值是25,则表达式++*x的

值是26.这是因为表达式的计算顺序可加圆括号表

达成(++(*x),首先是*x,是对x所指变量v的)引用,所以++*x就是++v.++v是先让变量v增1,并以增1后的v的值为表达式++v的结果,所以其

值是26.所以解答是④。

3.若有说明:“int i,j=7,*p=&i;”,则

与“i=j;”等价的语句是()

①i=*p;②*p=*&j;

③i=&j;④i=**p;

「解」指针变量p指向变量i时,表达式i=*p

等价于i=i;表达式*p=*&j等价于i=j;而表达

式i=&j企图将整型变量的指针赋给整型变量,这

是错误的;表达式i=**p也是一种错误的表达式。

p是指针,*p是p所指变量j,**p是企图将整型

变量j当作指针,并想通过j间接引用某个变量。

所以解答是②。

4.若有说明语句“int a[10],*p=a;”,对数组

元素的正确引用是()

①a[p]②p[a]

③*(p+2)④p+2

「解」在C语言中,约定数组名单独出现在表

达式中时,它表示数组首元素的指针。int a[10],有

则a可以作为&a[0]使用。另有整型指针变量p,代

码p=a实现p指向数组a的首元素。则表达式*(p

+2)是引用数组元素a[2].表达式a[p]和p[a]都是不

正确的,下标必须是整型表达式,不可以是指针表

达式。表达式p+2是指针表达式,它的值是&p[2].

所以只有表达式*(p+2)引用数组a的元素a[2].

所以解答是③。

5.下面各语句中,能正确进行赋字符串操作的

语句是()

①char s[5]={“ABCDE”};②char s[5]={‘A’,

‘B’,‘C’,‘D’,‘E’};

③char*s;s=“ABCDE”;④char*s;scanf

(“%s”,&s);

「解」字符串最终存储于字符数组中,存储字

符串的字符数组可以是程序主动引入的(定义或动

态分配),也可以是字符串常量,由系统分配。其

中字符数组用字符串初始化就是字符串存储于由

程序引入的字符数组的例子。给字符指针赋字符串

则是系统自动分配字符串存储空间的例子。给字符

指针赋字符串并不是将一个长长的字符串存于字

符指针变量中,而是将字符串常量存储于常量区,

并将存储这个字符串的首字节地址赋给指针变量,

让指针变量指向字符串常量的首字符。对于以字符

串作为字符数组初值的情况,要求字符数组足够的

大,能存得下字符串常量。这里有一个特别的规定,

若数组的大小少于存储字符串有效字符的字节个

数,系统将报告错误;当字符数组的大小只能存储

字符串的有效字符,而不能存储字符率结束标记符

时,则存储于字符数组中的内容是字符序列,因没

有存储字符串结束标记符,存储的内容就不是字符

串。如代码char a[5]=“ABCDE”。

另外,给字符数组元素逐一赋字符初值,并在

字符初值中没有字符串结束标记符,则存于字符数

组中的内容也不是字符串。如代码char s[5]={‘A’,

‘B’,‘C’,‘D’,‘E’}.特别要注意当字符指针还未指向某个字符数组的元素时,不可以通过字符指针

输入字符串。如代码char*s;scanf(“%s”,s)。若

写成char*str;scanf(“%s”,&str)更是错误的了。由于C语言规定数组不能相互赋值,所以只能将字

符串常量赋给某字符指针。如代码char*s;s=“ABCDE”是正确的。实际上,字符串“ABCDE”被

存储于常量区中,向指针变量赋的是字符指针,让

s指向其中的字符‘A’。所以解答是③。

6.若有以下定义,则不能表示a数组元素的表

达式是()

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

*p=a;

①*p②a[10]③*a④a[p-a]

7.若有以下定义,则值为3的表达式是()

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

*p=a;

①p+=2,*(p++)②p+=2,*++p

③p+=3,*p++④p+=2,++*p

「解」数组a有10个元素,分别有值1至10,

指针变量p指向a[0]①逗号表达式p+=2,*

(p++)先是p+=2使p指向a[2],,接着是*p++)(,以当时P所指变量a[2]取内容3为表达式的值,同

时使p指向a[3].②逗号表达式p+=2,*++p,先

是p+=2使p指向a[2],以后是*++p,又使p增

1,让它指向a[3],并取指针p所指变量a[3]的内容

4作为表达式的值。③逗号表达式p+=3,*p++,

先是p+=3使p指向a[3],以后是*p++,表达式的

值是a[3]为4,而使p指向a[4].④逗号表达式p+

=2,++*p,先是p+=2,使p指向a[2],以后是

++*p,因当时的*p就是a[2],++a[2]使a[2]增1,

变成4,并以4为表达式的值。所以只有p+=2,

*(p++)的值是3.所以解答是①。

8.设有定义“char a[10]={”abcd“},*p=a;”,则

*(p+4)的值是()

①“abcd”②‘d’

③‘\0’④不能确定

「解」若有char a[10]=“abcd”,*p=a,则指

针变量p指向a[0].在表达式*(p+4)中,p+4

指向a[4],*(p+4)就是a[4].由于用字符串“abcd”

给字符数组a赋初值,a[4]的值是字符串结束标记

符‘\0’。所以解答是③。

9.设有代码“int(*ptr)[10];”,其中的ptr是()

①10个指向整型变量的指针

②指向10个整型变量的函数指针

③一个指向具有10个元素的一维数组的指针

④具有10个指针元素的一维数组

「解」代码“int(*ptr)[10];”的分析过程是,

因圆括号,括号内的ptr先与字符*结合,字符*修

饰标识符ptr是一种指针;接着与后面的一对方括

号结合,表示是这样的一种指针,是指向一维数组

的;再有方括号中的10,说明这种数组有10个元

素。至此,ptr是指向含10个元素的一维数组的指

针。最后,是最前面的int,表示数组元素是int类

型的。所以,是一个指向具有10个int型元素的ptr

一维数组的指针。所以解答是③。另外,要是①,

10个指向整型变量的指针,就是一个指针数组,上

述代码应写成“int*ptr[10];”,即ptr是一个有10

个指向整型变量的数组。要是②,返回值是指向10

个整型变量的函数的指针,上述代码应写成“int(*

(*ptr))[10];”,即ptr是指针,指向一种函数,()函数的返回值又是一种指针,指向10个元素的数

组,数组的元素是整型的。下面的代码是这样的函

数指针和函数的例子:

#include

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

int(*(*ptr)(int))[10];

int(*f(int n))[10]

{return a+n;

}

void main()

{int(*p)[10],*q;

ptr=f;/*让ptr指向函数f*/

p=(*ptr)(0);

q=*p;

printf(“%d\n”,*q);

p=(*ptr);(l)

q=*p;

在上述代码中,函数有一个int型的形参。要

是④,其意义与①相同,上述代码应写成“int* ptr[10];”,即ptr是一个有10个元素的数组,数

组元素是指向整型变量的指针。

10.若有以下定义,则数值为4的表达式是)(

static int w[3][4]={{0,1},{2,4},{5,8}};

int(*p)[4]=w;

①*w[1]+l②p++,*(p+1)③w[2][2]④

p[1][1]

「解」二维数组定义有多种赋初值的办法,问

题给出的代码是按行给数组的部分元素赋初值。它

们分别是w[0][0]=0,w[0][1]=1,w[1][1]=2,

w[1][1]=4,w[2][0]=5,w[2][1]=8.根据约定,未

指定初值的元素自动置全0值。指针变量p是一个

指向具有四个int型元素的一维数组的指针,定义

时的初值使它指向数组W的第一行。①的代码,

*w[1]+1中的w[l]是指向w[l][0]的指针,*w[1]就

是w[1][0],其值是2,*w[1]+l的值是3.②的代

码是逗号表达式,“p++,*(p+1)”先使p指向

数组w的第二行,*(p+l)中的p+l是指向数组

w的第三行,*(p+1)是指针值,指向数组w的

第三行的第一个元素,即&w[2][0].③的代码w[2][2]

引用数组w第三行的第三列元素,其值是0.④的

代码p[1][l]引用数组w第二行的第二列元素

w[1][1],其值是4.所以解答是④。

11.若有下面的程序片段,则对数组元素的错误

引用是()

int a[12]={0},*p[3],**pp,i;

for(i=0;i<3;i++)p[i]=&a[i+4];

pp=p;

①pp[0][1]②a[10]

③p[3][l]④*(*(p+2)+2)

「解」上述代码定义变量a是有12个整型元

素的数组,它的初值全是0.p是有三个元素的指针

数组,每个指针能指向整型变量。是指针的指针,pp

它能指向一个指向整型变量的指针,i是一个整型

变量。执行代码for(i=0;i<3;i++)p=&a[i+4]

使指针数组p的元素p[0]指向a[4],p[l]指向

a[5],p[2]指向a[6].代码pp=p使指针变量pp指

向p[0].①代码pp[0][l]用指针表达可等价地写成*

(*pp+l)。其中*pp就是p[0],p[0]的值是&a[4],

*pp+1的值是&a[4]+1=&a[5],(*pp+1)*就是a[5].

②代码a[l0]当然是引用数组a的元素。③代码

p[3][1]数组p只有三个元素,没有p[3],所以是错

误的。④代码**p+2)((+2)(p+2)&p[2],中的是

*(p+2)是p[2],其值是&a[6],*(p+2)+2的

值是&a[8],*(*(p+2)+2)引用的是a[8].所以

解答是③。

12.若有如下定义和语句,则输出结果是()

int**pp,*p,a=10,b=20;

pp=&p;p=&a;p=&b;printf“%d%d\n”,(

*p,**pp);

①10,20②10,10

③20,10④20,20

「解」上述代码定义变量pp是指针的指针,

它能指向一个指向整型变量的指针。定义变量p是

指针,它能指向一个整型变量。a是一个整型变量,

它有初值10.b也是一个整型变量,它有初值20.代

码pp=&p使pp指向p,p=&a使p指向a,p=

&b又使p指向b,不再指向a.所以*p是引用b,

其值为20.**pp是通过pp间接引用p,再通过p间

接引用b,所以也是20.所以解答是④。

13.若有以下定义和语句,则对w数组元素的

非法引用是()

int w[2][3],pw)[3];pw=w;(*

①*(w[0]+2)②*pw[2]

③pw[0][0]④*(pw[l]+2)

「解」上述代码定义2行3列的二维数组w,

定义能指向有3个整型元素一维数组的指针pw,

并让pw指向数组w的第一行。①代码*(w[0]+2)

中的w[0]是&w[0][0],w[0]+2是&w[0][2],所以*

(w[0]+2)就是w[0][2].②代码*pw[2]中的pw[2]

是&w[2][0],该数组w只有2行,没有w[2][0],所

以代码*pw[2]是对数组W元素的非法引用。③代码

pw[0][0]就是w[0][0].④代码*pw[l]+2)(中的pw[1]就是*(pw+l)即&w[l][0],,pw[l]+2就是&w[l][2],所以*(pw[1]+2)就是w[1][2].所以解答是②。

5.2填充题

1.“*”称为___________运算符,“&”称为_________运算符。

「解」单目运算符“*”称为取内容运算符,单目

运算符“&”称为取地址运算符。

2.若两个指针变量指向同一个数组的不同元

素,可以进行减法运算和___________运算。

「解」若两个指针变量指向同一个数组的不同

元素,可以进行减法运算求它们所指元素相差多少

元素。进行关系运算,判定它们所指元素的前后,

或是否指向同一个元素等。

3.设int a[10],*p=a;则对a[3]的引用可以

是p[______________]和*(p_________)。

「解」若指针p指向数组a的首元素,则引用

a[3]用指针p可以写成p[3]和*(p+3)。

4.若d是已定义的双精度变量,再定义一个指

向d的指针变量p的代码是___________.

「解」若d是一个双精度变量,定义能指向它

的指针变量p可以用以下代码double*p=&d.

5.&后跟变量名,表示该变量的________;*后

跟指针变量名,表示该指针变量_______.&后跟的

是指针变量名,表示该指针变量的_____________.

「解」单目运算符&是取地址运算符,&后跟

变量名,就表示该变量的地址。单目运算符*是取

内容运算符,*后跟指针变量名,表示该指针变量

所指变量的内容。若&后跟的是指针变量名,就表

示该指针变量的地址。若知道指针变量的地址,欲

通过指针变量的地址引用指针变量所指变量的内

容,需要连续两次取内容运算。

6.设有char*a=“ABCD”,则printf(“%s”,a)的输出是_______;而printf(“%c”,*a)的输出是

______.

「解」若给字符指针变量a赋一个字符串常量“ABCD”,实际上是给a赋指向字符串常量首字符

‘A’的指针。程序通过它访问字符串中的各字符。如

用代码printf(“%s”,a)输出这个字符串常量“ABCD”的字符列ABCD,用代码printf“%c”,(*a)

输出a所指的字符A.

7.设有以下定义和语句,则*(*(p+2)+l)的

值为__________.

int a[3][2]={10,20,30,40,50,60},(*p)[2];

p=a;

「解」上述代码定义3行2列的二维数组a,

#include

#include

main()

{char str[81],*sptr;

int i;

for(i=0;i<80;i++)

{str[i]=getchar();

if(str[i]==‘\n’)break;

}

str[i]=____________;

sptr=str;

while*sptr)putchar*sptr______________)((;

}

「解」从键盘输入字符行,通过循环逐一输入

字符,当发现输入字符是换行符时,结束循环。为

了使输入的字符列变成字符串,必须在输入字符列

之后,原存储换行符的元素改为存储字符串的结束

标记符,需用代码str=‘\0’,所以在第一框填入代

码‘\0’。当要将存于字符数组str中的字符串通过循

环逐一输出字符串的字符时,可以用字符指针sptr,

让sptr遍历整个字符串,每次循环时,输出sptr所

指字符,并让sptr增1,即可用代码*sptr++实现,

所以在第二框填入代码++.

5.3程序分析题

1.阅读下列程序,写出程序的输出结果。

main()

{char

*a[6]={“AB”,“CD”,“EF”,“GH”,”U“,”KL“};

int i;

for(i=0;i<4;i++)

printf(“%s”,a[i]);

printf(“\n”);

}

「解」程序定义了有六个元素的字符指针数组

a,数组a的各元素指向字符率常量。

程序的for循环遍历了a的前四个元素,用字

符串输出格式,输出指针数组a前四个元素所指的

字符串。所以程序输出:ABCDEFGH.

2.阅读下列程序,写出程序的主要功能。

main()

{int i,a[l0],*p=&a[9];

for(i=0;i<10;i++)scanf(“%d”,&a[i]);

for(;p>=a;p--)printf(“%d\n”,*p);

}

「解」程序定义了有10个元素的整型数组a,

另定义指针变量p,并让它指向a的最后一个元素

a[9].执行代码的第一个循环是顺序输人数组a的

10个元素。第二个循环利用指针p逆序遍历数组a,

将数组a的各元素逆序输出。所以程序的功能是输

入10个整数,并逆序输出这10个整数。

3.阅读下列程序,写出程序运行的输出结果。

char s[]=“ABCD”;

main()

{char*p;

for(p=s;p

}

「解]程序定义了一个字符数组s,由给它所

赋的字符串初值知,该数组只有五个元素。程序另

定义了字符指针变量p.循环开始时,先让p指向数

组的首元素。循环每次输出以p所指字符为首字符

的字符串,并让它指向下一个字符。如此反复循环

四次,所以程序输出以下内容:

ABCD

BCD

CD

D

4.阅读下列程序,试写出程序运行的结果。

main()

{int i,b,c,a[]={1,10,-3,-21,7,13},

*p_b,*p_c;

b=c=1;p_b=p_c=a;

for(i=0;i<6;i++)

{if b<*a+i){b=*a+i)p_b=&a[i];}(()(;

if c>*((a+i){c=*)(a+i)p_c=&a[i];};}

i=*a;

*a=*p_b;

*p_b=i;

i=*(a+5);

*(a+5)=*p_c;

*p_c=i;

printf“%d,(%d,%d,%d,%d,%d\n”,a[O],a[1],a[2],a[3],a[4],a[5]);

}

「解]程序定义了一个整型数组。,由给它所

赋的初值知,该数组有六个元素。程序另定义了三

个整型变量i、b、c和两个指针变量p_b、p_c.程

序首先置变量b和c都为1,和p_c都指向数组p_b

a的首元素a[0].接着执行六次循环,循环体由两

个if语句。第一个if语句是当b的值小于*(a+i)(就是a[i])时,将*(a+i)的值复制到b,并让

p_b指向a[i].这是在a中找最大值,将最大值存于

b,最大值元素的指针存于指针变量p_b.第二个if

语句是当c的值大于*(a+i)(就是a[i])时,将*

(a+i)的值复制到c,并让p_c指向a[i].这是在

a中找最小值,将最小值存于c,最小值元素的指针

存于指针变量p_c.循环结束后的前三个语句实现

最大元素与a[0]交换。接着三个语句是在已经过前

面交换的基础上,将最小元与a[5]交换。最后程序

顺序输出数组a的六个元素。所以程序输出内容

是:

13,10,-3,l,7,-21.

若数组a的初值由输入任意指定,上述程序对

一种特殊情况不能完成功能的要求,即最小元素若

是a[0],p_c所指元素已被移到p_b指针所指位置,

实际与a[5]交换的不再是数组中的最小元素,而是

最大元素。

5.4程序设计题

1.输人3个整数,按从大到小顺序输出。

「解」存储输入的三个整数可用三个简单变量,

也可用数组。设用三个简单变量x,y,z存储输入

的三个整数。另设若干个指针变量指向存储输入数

据的变量。实现从大到小输出三个整数有多种方

案,如通过比较交换变量的值,多次比较交换使变

量满足条件x>=y>=z.这样,变量的输入值可能会

与它的输出值不一样。如通过比较交换指针变量,

当比较后发现要交换时,就交换变量的指针,而不

交换变量的值,则在比较结束后,变量的值没有改

变,但从指针方向来看,它们的值是从大到小排列

的。下面的程序就采用这种方案。

#include

main()

{int x,y,z;

int*big=&x,*mid=&y,*sma=&z;/*置三个指

针变量分别指向x,y,z*/为变量x,y,z输入值*/

if(*big<*mid){temp=big;big=mid;mid

=temp;}

/*使*big>=*mid*/

if(*big<*sma){temp=big;big=sma;sma

=temp;}/*使*big>=*sma*/

if(*mid<*sma){temp=mid;mid=sma;sma=temp;}/*使*mid>=*sma*/

printf(“%d\t%d\t%d\n”,x,y,z);/*按输入顺序输出x,y,z*/

printf(“%d\t%d\t%d\n”,*big,*mid,*sma);/*按从大到小的顺序输出*/

}

2.编一个程序,输入15个整数存入一维数组,再

按逆序重新存放后再输出。

「解」输入数组的元素,并重新颠倒存放后输

出。将存储于数组中的元素颠倒存储,只要首尾相

对应的元素两两交换即可。若用指针实现,可让一

个指针p指向前端的元素,另一个指针q指向与前

端元素对应的后端的元素。循环前,让p指向数组

的首元素,让q指向数组的末元素。循环时,让p

和q所指两个元素交换,并让p增1,q减l.循环条件是p所指元素在前,q所指元素在后,即p<q.

程序如下:

#include

main()

{int a[15],*p,*q,temp;

printf(“Enter15numbers.\n”);

for(p=a;p<a+15;p++)

scanf(“%d”,p);

for(p=a,q=a+14;p<q;p++,q--)

{

temp=*p;*p=*q;*q=temp;

}

for(p=a;p

printf(“%d\t”,*p);

printf(“\n”);

}

3.输入一个字符串,按相反的次序输出其中的

全部字符。

「解」要相反的次序输出字符串的全部字符,

可用一个字符指针变量,从指向字符串的本字符开

始,逆序遍历字符串,输出指针所指字符即可。但

为了让字符指针指向字符串的末字符,若不用字符

串处理库函数,得用一个循环,让它从字符串的首

字符开始,顺序移至字符串的结束标记符,然后倒

退一个字符,就能让它指向字符串的末字符。程序

如下:

#include

#define N200

main()

{char s[N],*p;

printf(“Enter a string.\n”);

scanf(“%s”,s);

for(p=s;*p;p++);

for(p--;p>=s;p--)printf(“%c”,*p);

printf(“\n”);

}

4.输入一个一维实型数组,输出其中的最大值、

最小值和平均值。

「解」设实型数组的元素个数n不超过20.程

序输入n,并用循环输入数组的元素,再用循环遍

历数组,求出数组的最大值和最小值、数组元素的

和。然后求出数组元素的平均值,最后输出结果。

#include

#define N20

main()

{double a[N],max,min,ave,*p,t;

int n;

printf(“Enter n(0<n<20)。\n”);

do{

scanf(“%d”,&n);

if(n>0&&n<20)break;

printf“n值不合要求,(请重新输入!;\n”)}while(l);

printf(“输入%d个实数\n”,n);

for(p=a;p

scanf(“%lf”,&t);

*p=t;

}

max=min=ave=*a;

for(p=a+l;p

if(max<*p)max=*p;

if(min>*p)min=*p;

ave+=*p;

}

ave/=n;

printf(“最大值:%f\t最小值:%f\t平均值:

%f\n”,max,min,ave);

}

5.输入一个3×6的二维整型数组,输出其中的

最大值、最小值及其所在的行列下标。

「解」找出其最大值和最小值,及它们的行列

位置。采用按行按列顺序遍历数组的方法找出数组

的最大值、最小值,以及它们在数组中的位置指针。

输出时,将位置指针转换成行下标和列下标。程序

如下:

#include

#define N3

#define M6

main()

{int a[N][M],*maxp,*minp,*q,t;

printf(“输入%d个整数\n”,N*M);

for(q=a[0];q<*a+N*M;q++){

scanf(“%d”,&t);*q=t;

}

maxp=minp=*a;

for(q=a[0];q<*a+N*M;q++){

if(*maxp<*q)maxp=q;

if(*minp>*q)minp=q;

}

printf(“最大值:%d它的行下标是%d它的列

下标是%d\n”,*maxp,(maxp-*a)/M,maxp-*a)(%M);

printf(“最小值:%d它的行下标是%d它的列

下标是%d\n”,*minp,(minp-*a)/M,(minp-*a)%M);

}

6.输入三个字符串,找出其中最大的字符串。

「解」将输入的三个字符率分别存于三个一维

字符数组中,另用一个字符指针数组,分别指向这

三个字符串,然后用循环控制这三个字符串的比

较,找出最大的字符串。两字符串比较时,程序不

用标准库函数,而用两字符串的对应字符比较来实

现。完整程序如下:

#include

#define N120

#define M3

mian()

{char s1[N],s2[N],s3[N],*strs[M]={s1,s2,s3},*p,*q,*ms;

int i;

printf(“输入%d个字符串\n”,M);

for(i=0;i

scanf(“%s”,strs[i]);

ms=strs[0];

for(i=1;i

for(p=ms,q=strs[i];*p!=‘\0’&&

*p==*q;p++,q++);if(*p<*q)ms=strs[i];

}

printf(“最大字符串:%s\n”,ms);

}

7.输入两个字符串,将它们连接后输出。

「解」程序设有两个存储字符串的数组,先输

入两个字符串,然后找到第一个字符串的末尾,接

着将第二个字符串复制在第一个字符串的后面,然

后输出。程序如下:

#include

#define N120

main()

{char s1[N+N],s2[N],*p,*q;

printf(“输入2个字符串\n”);

scanf(“%s%s”,s1,s2);

for(p=sl;*p!=‘\0’;p++);

for(q=s2;*p++=*q++;;)

printf(“两字符串连接后:%s\n”,sl);

}

8.比较两个字符串是否相等。

「解」程序设两个存储字符串的数组,先输入

两个字符串,两字符率比较时,直接用两字符串的

对应字符比较来实现。完整程序如下:

#include

#define N120

main()

{char sl[N],s2[N],*p,*q;

char*result[]={“小于”,“相等”,“大于”};

int comp;

printf(“输入2个字符串\n”);

scanf(“%s%s”,s1,s2);

for(p=sl,q=s2;*q!=‘\0’&&*p==*q;

p++,q++);

comp=*p<*q?0:*p==*q?l:2;

printf(“字符串1与字符串2比较:%s\n”,result[comp]);

}

9.输入10个整数,将其中最大数与最后一个

数交换,最小数与第一个数交换。

「解」程序设一个一维数组存储输入的10个

整数。然后遍历数组,找出最大元素和最小元素的

指针。接着按要求先将最大元素与最后一个元素交

换,然后将最小元素与第一个元素交换。最后,输

出数组中的全部整数。程序应考虑到这样一种特殊

情况,即最后一个元素正是最小元素,它在与最大

元素交换后,位置已移到原先存储最大元素的位

置。程序应保证最大元素移到末尾,最小元素移到

最前端。

程序如下:

#include

#define N10

main()

{int a[N],*maxp,*minp,*q,t;

printf(“输入%d个整数\n”,N);

for(q=a;q

scanf(“%d”,&t);

*q=t;

}

maxp=minp=a;

for(q=a;q

if(*maxp<*q)maxp=q;

if(*minp>*q)minp=q;

}

t=*maxp;*maxp=a[N-1];a[N-l]=t;

if(minp==&a[N-l])minp=maxp;

t=*minp;*minp=a[0];a[0]=t;

for(q=a;q

printf(“%d”,*q);

printf(“\n”);

}

第六章函数

6.1单项选择题

1.函数调用语句“f((el,e2)(e3,e4,e5);”,)中参数的个数是()

①1②2

③4④5

「解」上述函数调用中,(e1,e2)和(e3,e4,

e5)是两个带括号的表达式,所以函数调用只提供

两个实参,其中第一个实参先计算el的值,然后计

算e2,并以e2的值为实参。第二个实参顺序计算

e3,e4,e5,并以e5的值为实参。所以解答是②。

2.C语言中,函数的隐含存储类型是()

①auto②static

③extern④无存储类别

「解」由于C函数内不能再定义函数,C函数

的存储类型只能是静态的或外部的之一。若定义函

数时不指定存储类型是静态的,则它的存储类型就

是外部的(extern),即函数允许被程序的其它函数

调用。所以解答是③。

3.以下对C语言函数的有关描述中,正确的是

()

①在C语言中,调用函数时,只能把实参的值

传递给形参,形参的值不能传递给实参

②C函数既可以嵌套定义,又可以递归调用

③函数必须有返回值,否则不能定义成函数

④C程序中,有调用关系的所有函数必须放在

同一个源程序文件中

「解」C语言规定,调用函数时,只能把实参

的值传递给函数的形参。函数调用时,形参从实参

表达式得到初值,形参也是函数的一种局部变量,

其值可以改变,但形参的值不能传回给对应的实

参。当函数设置非指针类型的形参时,实参可以是

同类型的一般表达式;当函数设置指针类型的形参

时,对应的实参也必须是同类型的指针表达式。所

以叙述①是正确的。C语言虽可以递归调用,但同

时规定,在函数内不能再定义函数,所以叙述②是

错误的。通常C函数会有返回值,但也可以没有返工作,并没有返回值,所以叙述③是不正确的。在C程序中,如函数未指定是静态的,则就是外部的,能让别的文件中的函数调用。但函数要调用别的文件中的函数,在调用代码之前,需对它作说明,所以叙述④也是不正确的。正确的解答只有①。

4.设函数的功能是交换x和y的值,且通过正确调用返回交换结果。不能正确执行此功能的函数是()

①funa(int*x,int*y)

{int*p;

*p=*x;*x=*y;*y=*p;

}

②funb(int x,int y)

{int t;

t=x;x=y;y=t;

}

③func(int*x,int*y)

{int p;

p=*x;*x=*y;*y=p;

}

④fund(int*x,int*y)

{

*x=*x+*y;*y=*x-*y;*x=*x-*y;

}

「解」设计实现交换两个变量值的函数。希望

函数调用能改变调用环境中的变量,方法之一是让函数设置指针类型的形参,实参传送给形参希望交换值的是两个变量的指针。函数的两个形参得到这两个变量的指针后,函数就能通过形参间接引用要交换值的变量,或引用它们的值,或改变它们的值。从而实现从函数传回信息存于调用环境的变量中。以上所述是设计交换变量值函数的一般原则,具体编写函数时还需注意对上述原则的正确应用。

对于函数funa,该函数的定义满足设置指针形参,并通过指针形参间接引用环境变量的要求。但是在函数体中定义了指针变量p,并在p没有明确设定它所指向的变量下,代码*p=*x企图将值存入它所指的变量中,这是初学者经常出现的一种严重的错误。该函数因而有错,不能实现交换变量值的功能。

对于函数funb,该函数不定义指针形参,函数体也没有可用的指针间接引用调用环境中的变量,所以该函数也不能实现交换变量值的功能。

对于函数func,该函数正确定义了指针形参,函数体也正确通过指针形参间接引用环境中的变量,并正确定义了自己的局部变量。该函数能实现交换变量值的功能。

对于函数fund,该函数也正确定义指针形参和函数体通过形参间接引用环境变量。特别要指出的是,该函数是利用*x和*y的旧值与新值之间的关系实现问题要求的。其中第一个赋值使*x变成原来未交换之前的*x与*y之和;第二个赋值从这个和中减去原来的*y,并将差赋给*y,使*y的值是交换之前的*x的值;第三个赋值再次从和中减去新的

*y,即减去交换之前的*x,这个差就是交换之前的*y,并将差赋给*x.经以上三个赋值,实现两变量之间的值交换。

所以不能正确执行交换变量值的函数是funa

和funb,即正确选择是①②。

5.要求函数的功能是在一维数组a中查找x值。若找到,则返回所在的下标值;否则,返回0.设数据放在数组元素的a[1]到a[n]中。在以下给出的函数中,不能正确执行此功能的函数是()

①funa(int*a,int n,int x)

{*a=x;

whlie(a[n]!=x)n--;

return n;

}

②funb(int*a,int n,int x)

{int k;

for(k=l;k<=n;k++)

if(a[k]==x)return k;

return0;

}

③func(int a[],int n,int x)

{int*k;

a[0]=x;k=a+n;

while(*k!=x)k--;

return k-n;

}

④fund(int a[],int n,int x)

{int k=0;

do k++;

while((k

if((k

else return0;

}

「解」在数组中找指定值是经常遇到的计算要

求,有多种编程方法。在这里,数据预放在数组下

标1至n的元素中,下标为0的元素没有放数据,

程序可以利用这个位置简化查找函数。函数funa先

将要查找的值放入a[0],从数据表的最后一个元素

开始逆序向前查找。这样做的好处是循环条件不必

担心因数组中原先没有值为x的元素而一直顺序查

找下去,访问不是数组的元素,需插入条件n>O.

在a[0]处放入x后,这个条件就不必要了,循环至

少在访问了a[0]后终止,并返回0值。所以该函数

能完成指定的功能。函数funb采用常规的办法编

写,循环在a[1]与a[n]之间顺序寻找,一旦找到立

即返回找到处的下标,直至查找循环结束,查不到

指定的值而返回0值。函数func采用与函数funa

相同的方法,不过是另外引入一个指针变量。但是

该函数return语句后的表达式有严重的错误,应返

回k-a,两指针的差,其值等于找到元素的下标。

表达式k-n是指针k向前移n个位置的指针值。

函数fund预置k为0,循环让k增1,并在k在

界内和a[k]不等于x的情况下循环。循环结束有

两种情况,或k已不在界内,或k在界内,并且

a[k]等于x.若是后者,函数返回k,而若前者,函

数返回比该函数也能正确完成查找工作。这样,不

能正确完成查找工作的函数是函数fonc.所以正确

选择是③。

6.以下程序的输出结果是()

#include

subl(char a,char b){char c;c=a;a=b;

b=c;}

sub2(char*a,char b){char c;c=*a;*a=b;b=c;}

sub3(char*a,char*b){char c;c=*a;*a

=*b;*b=c;}

main()

{char a,b;

a=‘A’;b=‘B’;sub3(&a,&b)putchar;(a)putchar(b);;

a=‘A’;b=‘B’;sub2(&a,b);putchar(a);putchar(b);

a=‘A’;b=‘B’;sub1(a,b)putchar(a);;putchar(b);

「解」在上述程序中,函数subl完成两形参值

的交换,这个交换不影响实参变量,这是一个没有

意义的函数。函数sub2将第二个形参的值置入由

第一个指针形参所指的变量中,指针形参所指的变

量由调用时的实参提供。函数sub3完成将两个形参

所指的变量的值交换。程序调用sub3,使变量a和

b的值交换输出BA;调用sub2,使变量b的值传

送到a,输出BB;调用subl,变量a和b的值不改

变,输出AB.所以程序输出BABBAB.正确解答

是①。

6.2填充题

1.静态型内部变量的作用域是___________.

「解」静态存储类型的主要特性是永久性和专

用性。静态局部变量提供永久存储,但因它是局部

变量,也得遵守局部变量的作用域规则,是定义它

的函数或复合语句。

2.函数中的形参和调用时的实参都是数组名

时,传递方式为______;都是变量时,传递方式

为_____________.

「解」在C语言中,实参向形参传递方式只有

值传递,但传递的内容可能是非指针类型的值,如

基本类型值,或结构类型值,也可以是指针类型值。

通常传递指针类型值特称为传地址方式。其中实参

向指针形参传递数组名,就是一种传地址方式。若

形参不是指针类型的,形参是一般的变量,实参可

以是变量或表达式,就是值传递方式。

3.函数的形式参数的作用域为_____,全局的外

部变量和函数体内定义的局部变量重名时,

________变量优先。

「解」函数将它的形参当作它的局部变量,所

以函数形参的作用城为定义它的函数。当函数的形

参或函数内的局部变量与函数外的全局变量同名

时,函数的局部变量优先。

4.若自定义函数要求返回一个值,则应在该函

数体中有一条________语句,若自定义函数要求不

返回一个值,则应在该函数说明时加一个类型符

____________.

「解」苦自定义的函数有返回值,则函数返回

时应执行带表达式的return语句返回,该表达式的

值将作为函数调用的结果。为了强调函数是一个不

返回值的函数,应在该函数说明时,加上一个void

类型说明符。

5.若给fun函数的形参s传送字符串:“ㄩㄩ

6354abcc”(其中ㄩ表示空格字符),则函数的返回

值是__________.

#include

long fun(char s[])

{long n;

int sign;

for(;isspace(*s)s++);;

sign=(*s==‘-’)?-1:l;

if(*s==‘+’||*s==‘-’)s++;

for(n=0;isdigit(*s)s++)n=10*n+;

(*s-‘0’);

return sign*n;

}

「解」函数fun的第一个for循环跳过字符串

的前导空白符,接着分析第一个非空白符是否是负

号,若是置变量sign为-1;否则,置变量sign为1.

接着的if语句在第一个非空白字符是负号或正号时,跳过该字符。以后的for循环将后面的数字符

当作十进制数的各位数字译出一个长整数n.遇字

的乘积。所以若调用函数时提供的实参是“ㄩㄩ

6354abc”,函数返回值是整数6354.

6.下面函数要求计算两个整数x、y之和,并通

过形参z传回该和值,请填空。

void add(int x,int y,________z)

{_________=x+y;return;}

「解」函数希望通过形参z传送结果,形参z

必须是指针类型的,由于返回整型结果,所以z的

说明是int*z.函数返回前必须先把结果通过形参z

间接引用(写成*z)传回。

7.以下函数用来在w数组中插入x.在n所指

向的存储单元中存放着w数组中的字符个数。数组

w中的字符已按从小到大的顺序排列,插入后数组

w中的字符仍有序。请填空。

void fun(char*w,char x,int*n)

{int i,p;

p=0;

w[*n]=x;

whlie(x>w[p])p++;

for(i=*n;i>p;i--)w[i]=____________;

w[p]=x;

++*n;

}

「解」在用数组实现的有序序列中插入内容,

必须先寻找插入位置。插入位置找到后,需将插入

位置之后的元素向后移动一个位置,留出插入点。

最后,将元素插入,并增加序列的元素个数。函数

为了简化寻找插入位置循环的循环条件,预先在序

列的最后置人插入值。插入位置之后的元素向后移

动一个位置必须从最后一个元素开始往前逆序移

动,是将前一个元素向后移,所以在空框处应填入

w[i-l].

7.函数my_cmp()的功能是比较字符串s和t

的大小,当s等于t时返回0,否则返回s和t的第一个不同字符的ASCII码差值,s>t时返回正值,即当s

my_cmp(char*s,char*t)

{while(*s==*t)

{if(*s==‘\0’)return0;

++s;++t;

}

return____________;

}

「解」两字符串大小比较必须从它们的首字符

开始,在对应字符相等情况下循环,直至不相等结

束。相等时,两字符串已到了字符串的结束标记符,

则两字符串相同,函数退回0值;如还有后继字符,

则准备比较下一对字符。对应字符不相同,循环结

束。循环结束时,就以两个当前字符的差返回。所

以在空框处应填入*s-*t,保证在*s>*t时返回正值,

当*s<*t时返回负值。

6.3程序分析题

1.阅读函数,写出函数的主要功能:

ch(int*p1,int*p2)

{int p;

if*pl>*p2){p=*pl;(*pl=*p2;p2=p;}* }

「解」函数ch有两个指针形参p1和p2,函数

体通过*pl和*p2间接引用它们所指变量。当pl所

指变量的位大于p2所指变量的值时,交换两形参

所指变量的值。所以函数的功能当形参1所指变量

比形参2所指变量的值大时,交换这两个变量的值。

调用该函数能保证形参1所指变量的值不大于形参

2所指变量的值。

2.阅读函数,写出函数的主要功能:

float av(int a[],int n)

{int i;

float s;

for(i=0,s=0;i

return s/n;

}

「解」函数有一个数组形参a和一个整型形参n.函数首先用循环求数组a的前n个元素和,然后将和除以n.即求数组元素的平均值。

3.阅读下面程序,写出运算结果。

unsigned fun6(unsigned num)

{unsigned k=l;

do{k*=num%10;num/=10;}

while(num);

return k;

}

main()

{unsigned n=26;

printf(“%d\n”,fun6(n);)

}

「解」函数有一个形参num,循环前变量k置1,循环中,表达式num_是取num的个位,num将的个位值累乘于k中,然后num除以10.循环直至num为0结束,这是逐一求出num十进制表示的各位数字,并累乘于变量k的循环。函数最后返回k.

函数fun6的功能是求整数的各位十进数字乘积。所以程序输出12.

6.4程序设计题

1.编一个名为root的函数,求方程ax*x+bx+

c=0的b*b-4ac,并作为函数的返回值。其中的a、

b、c作为函数的形式参数。

「解」该函数应设3个形参,分别表示一元二

次方程的三个系数。函数按公式求出结果返回即

可:

double root(double a,double b,double c)

{return b*b+4.0*a*c;

}

2.编一个函数,若参数y为闰年,则返回1;

否则返回0.

「解」由每四年一个闰年,但每100年少一个

闰年,每400年又增加一个闰年的约定。记年份为

y,则y年是闰年的条件是:能被4整除,但不(y

能被100整除)或(y能被400整除)

用逻辑表达式可描述如下:

(y%4==0&&y%100)||y%400==0

写成函数为:

int isLeap(int y)

{return y%4==0&&y%100)||y@0==(

0;

}

3.编一个无返回值,名为root2的函数,要求如

下:

形式参数:a,b,c单精度实型,root单精度

实型数组名。

功能:计算ax*x+bx+c=0的两个实根(设

b*b-4ac>0)存入数组root[2]中。

「解」函数根据形参。a,b,c的值,首先计

算d=b*b-4*a*c.考虑到实数运算时的计算误差,两

个几乎相等的数相减有效位数也几乎全部丢失的

情况,应先求出绝对值大的根,然后利用报与系数

之间的关系,再求绝对值小的根。函数定义如下:

C语言经典例题和答案

一、求一个任意边长的矩形面积。 #include void main() {int w,h,sum; scanf("%d%d",&w,&h); sum=w*h; printf("area=%d\n",sum); } 二、求一个任意半径的圆的面积及周长。 #define PI 3.14159 #include void main() {float r,area,c; scanf("%f",&r); area=PI*r*r; c=2*PI*r; printf("area=%f\ncircle=%f\n",area,c); } 三、已知:w=5, y=4, z=2, 求表达式:w*y/z的值,并输出。 ##include void main() { int w,y,z,r; w=5; y=4; z=2; r=w*y/z; printf("%5d",r); } 一、从键盘上输入三个数,求出其中的最大值,并输出。 #include void main() {int a,b,c,max; scanf("%d%d%d",&a,&b,&c); max=a; if(max

#include #define PI 3.14159 #include void main() {float a,b,sum; a=30*PI/180; b=60*PI/180; sum=sin(a)+sin(b)+cos(a)+cos(60); printf("total=%f\n",sum); } 三、比较两个数的大小。如果x大于y,则输出:x>y,否则输出:x void main() {int x,y; scanf("%d,%d",&x,&y); if(x>y) printf("x>y\n"); else printf("x void main() {int a,b,c,t; scanf("%d%d%d",&a,&b,&c); if(a>b) { t=b; b=a; a=t; } if(a>c) {t=a; a=c; c=t; } if(b>c) {t=b;b=c;c=t;} printf("%3d%3d%3d\n",a,b,c); }. 二、求自然数1~10之和。。 #include void main()

嵌入式C语言经典笔试题目

嵌入式c语言经典笔试题目 1 .用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1) #define语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。 3)意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。 4)如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。 2 .写一个"标准"宏MIN,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B)((A)<= (B) ? (A) : (B)) 这个测试是为下面的目的而设的: 1)标识#define在宏中应用的基本知识。这是很重要的。因为在嵌入(inline)操作符变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。 2)三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。 3)懂得在宏中小心地把参数用括号括起来 4)我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事? least = MIN(*p++, b); 3.预处理器标识#error的目的是什么? 如果你不知道答案,请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。 死循环(Infinite loops) 4.嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢? 这个问题用几个解决方案。我首选的方案是: while(1) { } 一些程序员更喜欢如下方案: for(;;) { } 这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,

C语言练习题(带答案)-绝对经典题目不看后悔

1单选题 1.(A)是构成C语言程序的基本单位。 A、函数 B、过程 C、子程序 D、子例程 2.C语言程序从C开始执行。 A) 程序中第一条可执行语句B) 程序中第一个函数 C) 程序中的main函数D) 包含文件中的第一个函数 3、以下说法中正确的是(C)。 A、C语言程序总是从第一个定义的函数开始执行 B、在C语言程序中,要调用的函数必须在main( )函数中定义 C、C语言程序总是从main( )函数开始执行 D、C语言程序中的main( )函数必须放在程序的开始部分 4.下列关于C语言的说法错误的是(B)。 A) C程序的工作过程是编辑、编译、连接、运行 B) C语言不区分大小写。 C) C程序的三种基本结构是顺序、选择、循环 D) C程序从main函数开始执行 5.下列正确的标识符是(C)。 A.-a1 B.a[i] C.a2_i D.int t 5~8题为相同类型题 考点:标识符的命名规则 (1)只能由字母、数字、下划线构成 (2)数字不能作为标识符的开头 (3)关键字不能作为标识符 选项A中的“-” ,选项B中“[”与“]”不满足(1);选项D中的int为关键字,不满足(3) 6.下列C语言用户标识符中合法的是(B)。 A)3ax B)x C)case D)-e2 E)union 选项A中的标识符以数字开头不满足(2);选项C,E均为为关键字,不满足(3);选项D中的“-”不满足(1); 7.下列四组选项中,正确的C语言标识符是(C)。 A)%x B)a+b C)a123 D)123 选项A中的“%” ,选项B中“+”不满足(1);选项D中的标识符以数字开头不满足(2) 8、下列四组字符串中都可以用作C语言程序中的标识符的是(A)。 A、print _3d db8 aBc B、I\am one_half start$it 3pai C、str_1 Cpp pow while D、Pxq My->book line# His.age 选项B中的“\”,”$” ,选项D中“>”,”#”,”.”,”-”不满足(1);选项C中的while为关键

c语言笔试题(答案)(精心整理)

笔试题 一、填空题(每个空4分,共28分) 1)struct tagABC { char name[10]; char sex; long sno; float score[4]; }*pAbc;(四字节对齐) pAbc=NULL; 那么,执行pAbc+=2;之后pAbc的值为(64 ) 2)如下代码,最终value的值是(8) int *p1,*p2; int value; p1=(int*)0×400; p2=(int*)0×408; value = p2-p1; 3)如下代码,printf的结果为(2) #include〈stdio.h〉 #include〈string.h〉 void main(void) { char acNew[20]= “\\0\0”; printf(“%d\n”,strlen(acNew)); } 4) 有如下程序段,运行该程序的输出结果是(33) main () { int y=3,x=3,z=1; printf(“%d%d\n”,(++x,y++),z+2); } 5)设有:int a=1,b=2,c=3,d=4,m=2,n=2;执行(m=a>b)&&(n=c>d)后,n的值为(2)6)struct tagAAA { Unsigned char ucId:1; Unsigned char ucPara0:2; Unsigned char ucState:6; Unsigned char ucTail:4; Unsigned char ucAvail; Unsigned char unTail2:4; Unsigned long ulData; }AAA_S 问:AAA_S在字节对齐分别为1,4情况下,占用的空间大小分别是多少?( 9)(12 )

最新版c语言经典习题100例(最全面)

C 语言习题100 例(最新整理版) 习题目录:(按住Ctrl 点击可以快速跳转到对应页面) 【程序1】 (5) 题目:有1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? (5) 【程序2】 (6) 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元 时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%; 40万到60万之间时高于40万元的部分,可提成3%; 60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? (6) 【程序3】 (7) 题目:一个整数,它加上100 后是一个完全平方数,再加上168 又是一个完全平方数,请问该数是多少? (7) 【程序4】 (7) 题目:输入某年某月某日,判断这一天是这一年的第几天? (7) 【程序5】 (8) 题目输入三个整数x,y,z请把这三个数由小到大输出。 (8) 【程序6】 (9) 题目用*号输出字母C的图案。 (9) 【程序7】 (9) 题目:输出特殊图案,请在C环境中运行,看一看,VeryBeautifuI! (9) 【程序8】 (9) 题目:输出9*9 口诀。 (9) 【程序9】 (10) 题目:要求输出国际象棋棋盘。 (10) 【程序10】 (10) 题目:打印楼梯,同时在楼梯上方打印两个笑脸。 (10) 【程序11】 (11) 题目:古典问题:有一对兔子,从出生后第3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? (11) 【程序12】 (11) 题目:判断101-200 之间有多少个素数,并输出所有素数。 (11) 【程序13】 (12) 题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1 的三次方+5的三次方+3的三次方。 (12) 【程序14】 (12) 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5 。 (12) 【程序15】 (13) 题目利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用 C 表示。 (13) 【程序16】 (13) 题目:输入两个正整数m和n ,求其最大公约数和最小公倍数。 (13) 【程序17】 (14) 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。14【程序18】 (14)

c语言笔试题目及答案

c语言笔试题目及答案 C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。下面是c语言笔试题目及答案,请参考。 c语言笔试题目及答案 一、选择题((1)~(10)每小题2分,(11)~(50)每小题1分,共60分) 下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选 项涂写在答题卡相应位置上,答在试卷上不得分。 (1)数据的存储结构是指________。 A)存储在外存中的数据 B)数据所占的存储空间量 C)数据在计算机中的顺序存储方式 D)数据的逻辑结构在计算机中的表示 答案:D 评析:数据的逻辑结构在计算机存储空间中的存放形式形式称为数据的存储结构(也称数据的物理结构)。 (2)下列关于栈的描述中错误的是________。 A)栈是先进后出的线性表

B)栈只能顺序存储 C)栈具有记忆作用 D)对栈的插入与删除操作中,不需要改变栈底指针 答案:B 评析:栈是一种特殊的线性表,又称先进后出表(FILO—First In Last Out)。 (3)对于长度为n的线性表,在最坏情况下,下列各排序法所对应的比较次数中正确的是 ________。 A)冒泡排序为n2 B)冒泡排序为n C)快速排序为n D)快速排序为n(n一1)/2 答案:D 评析:假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后扫描和n/2遍的从后往前扫描,需要比较次数为n(n-1)/2。快速排序法的最坏情况比较次数也是n(n-1)/2。 (4)对长度为n的线性表进行顺序查找,在最坏情况下所需要的比较次数为________。 A)log2n B)n/2 C)n D)n+l 答案:C 评析:顺序查找过程中,如果被查找的元素是线性表中的最后一个元素,或者元素不在线性表中,则需要与线性表中所有的元素进行比较。对长度为n的线性表进行顺序查找,在最坏情况下需要比较

C语言练习习题(带详解答案)

欢迎阅读 一、编程题 1.输入2个整数,求两数的平方和并输出。 #include int main(void) { intt a ,b,s; 2. 信息。 scanf("%lf",&r); if (r>=0) { area =PI*r*r; girth =2*PI*r ; printf("the area is %.2f\n", area);

printf("the girth is %.2f\n", girth);} else printf("Input error!\n"); return 0; } 3 4.从键盘上输入一个百分制成绩score,按下列原则输出其等级:score≥90,等级为A;80≤score<90,等级为B;70≤score<80,等级为C;60≤score<70,等级为D;score<60,等级为E。 #include void main(){ int data;

char grade; printf("Please enter the score:"); scanf("%d”, &data); switch(data/10) { case 10: } 5. float fee; printf(“please input hour:\n”); scan f(“%d”,&hour); if(hour<=10) fee=30;

else if(hour>=10&&hour<=50) fee=3*hour; else fee=hour*2.5; printf(“The total fee is %f”,fee); } 6. } 7、编程序实现求1-10之间的所有数的乘积并输出。 #include void main( ) { int i; long sum=1;

c语言-经典常用-习题

c语言-经典常用-习题

1.输入一个字符串,将其按给定的长度n格式化并输出,若n=0,则输出原字符串 输入 输入一个字符串 输出 格式化并输出 样例输入 asdfasdf 3 样例输出 asd fas df 提示 #include #include int main()

{ int n,m,i,j; char a[10000]; gets(a); scanf("%d",&m); n=strlen(a); if(m==0) puts(a); else { for(i = 0; i < n; i += m) { if(a[i] == '\0') return 0; for(j = 0; j < m; ++ j) { if(a[i + j] == '\0') { printf("\n"); return 0; } printf("%c", a[i + j]);

} printf("\n"); } } return 0; } 2.题目描述 输入一个长度不超过100 的字符串,删除串中的重复字符。 输入 输入要检查的字符串,长度不超过100个字符。例如:abacaeedabcdcd。 输出 删除重复字符后的字符串。例如:abced。 样例输入 saas

样例输出 sa 提示 #include int main() { char a[100]; int i,j,m; scanf("%s",a); for(i=0;a[i]!=0;i++) for(j=i+1;a[j]!=0;j++) if(a[i]==a[j]) { for(m=j;a[m]!=0;m++) { a[m]=a[m+1]; } j--;

嵌入式C语言面试题汇总(超经典)

第一部分:基本概念及其它问答题 1、关键字static的作用是什么? 这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。 2、“引用”与指针的区别是什么? 答、1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。 指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。 流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。 3、.h头文件中的ifndef/define/endif 的作用? 答:防止该头文件被重复引用。 4、#include 与#include “file.h”的区别? 答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。 5、描述实时系统的基本特性 答:在特定时间内完成特定的任务,实时性与可靠性。 6、全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 答:全局变量储存在静态数据区,局部变量在堆栈中。 7、什么是平衡二叉树? 答:左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。 8、堆栈溢出一般是由什么原因导致的? 答:1.没有回收垃圾资源 2.层次太深的递归调用

c语言经典面试题

C语言面试题大汇总之华为面试题 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 2、如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。 3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错. 4、请写出下列代码的输出内容 #include int main(void) { int a,b,c,d; a=10;

c=++a; d=10*a++; printf("b,c,d:%d,%d,%d",b,c,d); return 0; } 答:10,12,120 5、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 答: 1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 2) 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。3) static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对

c语言基础练习题含答案定稿版

c语言基础练习题含答 案 HUA system office room 【HUA16H-TTMS2A-HUAS8Q8-HUAH1688】

第一章 C语言基础知识 1.1 选择题 1. 以下不是C语言的特点的是()。 A、语言简洁紧凑 B、能够编制出功能复杂的程序 C、C语言可以直接对硬件操作 D、C语言移植性好 2. 下列字符序列中,不可用作C语言标识符的是()。 A.abc123 B.no.1 C._123_ D._ok 3. 正确的C语言标识符是()。 A._buy_2 B.2_buy C.?_buy D.buy? 4. 请选出可用作C语言用户标识符的一组标识符()。 A.void B.a3_b3 C.For D.2a define _123 -abc DO WORD IF Case sizeof 5. 下列符号中,不属于转义字符的是()。

A.\\ B.\0xAA C.\t D.\0 6. 不属于C语言关键字的是()。 A.int B.break C.while D.character 7. 是C语言提供的合法关键字的是()。 A.Float B.signed C.integer D.Char 8. 以下不能定义为用户标示符的是()。 A.scanf B.Void C._3com_ D.int 9. 一个C程序是由()。 A.一个主程序和若干子程序组成 B.一个或多个函数组成 C.若干过程组成 D.若干子程序组成 10. C语言程序的基本单位是()。 A.程序行B.语句 C.函数 D.字符 11. 下列说法中,错误的是()。

A.每个语句必须独占一行,语句的最后可以是一个分号,也可以是一个回车换行符号 B.每个函数都有一个函数头和一个函数体,主函数也不例外 C.主函数只能调用用户函数或系统函数,用户函数可以相互调用 D.程序是由若干个函数组成的,但是必须有、而且只能有一个主函数 12. 以下说法中正确的是()。 A.C语言程序总是从第一个定义的函数开始执行 B.在C语言程序中,要调用的函数必须在main( )函数中定义 C.C语言程序总是从main( )函数开始执行 D.C语言程序中的main( )函数必须放在程序的开始部分 13. C编译程序是()。 A.C程序的机器语言版本 B.一组机器语言指令 C.将C源程序编译成目标程序 D.由制造厂家提供的一套应用软件 14.以下选项中,合法的用户标识符是()。

C语言面试题(经典全)

1.static有什么用途?(请至少说明两种) 1)限制变量的作用域 2)设置变量的存储域(堆,主动分配内存也是堆) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在栈 6.堆栈溢出一般是由什么原因导致的? 堆栈溢出一般是循环的递归调用导致的,如果使用的大数据结构的局部变量,也可能导致堆栈溢出。没有回收垃圾资源导致的是内存泄露最后内存耗尽。 20.不能做switch()的参数类型是: switch的参数不能为实型。(只能是int char) 9.写出float x 与“零值”比较的if语句。 if(x<0.000001&&x>-0.000001)

3.在c语言库函数中将一个字符转换成整型的函数是atol()吗,这个函数的原型是什么? 函数名: atol 功能: 把字符串转换成长整型数 函数的原型: long atol(const char *nptr); 程序例: #include #include int main(void) { long l; char *str = "98765432"; l = atol(lstr); printf("string = %s integer = %ld\n", str, l); return(0); } 1.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现? c用宏定义,c++用inline

C语言编程练习题绝对经典

马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人? 解方程组 编写程序,采用穷举法求出结果。 编写程序,根据以下公式求e的值。要求用两种方法计算: 1) for循环,计算前50项 2)while 循环,直至最后一项的值小于10-4 从键盘中输入一个数字(不限位数),用循环语句编程判断并输出这个数字的位数。 猴子吃桃子问题。猴子第一天摘下若干个桃,当即只一半,又多吃一个。第二天早上又将剩下的一半吃掉一半,双多吃一个。以后每天早上都吃了前天剩下的一半零一个,到第10天早上只剩下最后一个桃。问第一天摘了几个桃。 编程打印九九乘法表 青年歌手参加歌曲大奖赛,有10个评委打分,试编程求选手的平均得分(去掉一个最高分和一个最低分)。 从键盘中输入一个数字(可以包含小数点,其位数在60位以下,求其整数的有效位数,如输入,返回值为整数有效位数为3) 1) 输入数据为浮点型,不用数组,不用字符串,只有变量的算术运算实现此功能。 2) 使用数组来进行编程。 使用数组,编写一个十进制正整数转换为任意进制数的转换工具。 (大进制向小进制的转换。(方法是相除去余) 10进制327转八进制: 327/8 = 40 余数为7 40/8 = 5 余数为0 于是八进制数为507(第一位5是最后的商)) 使用数组,编写一个任意进制正整数转换为十进制的转换工具。(以2,10进制互转为例,其他请举一反三: 二进制数1101转十进制: 1×2的三次幂+1×2的二次幂+0×2的一次幂+1×2的零次幂=8+4+0+1=13) 10个小孩围成一圈分糖果,老师顺次分给每个人的糖块数为12,2,8,22,16,4,10,6,14,20。然后按下列规则调整,所有小孩同时把自己的糖果分一半给右边的小孩,糖块数变为奇数的人,再向老师补要一块,问经过多少次调整后,大家的糖块一样多,且每人多少块。

C语言经典面试题目集锦

1.前言 2.声明和初始化 2.1我如何决定使用那种整数类型? 2.264位机上的64位类型是什么样的? 2.3怎样定义和声明全局变量和函数最好? 2.4extern在函数声明中是什么意思? 2.5关键字auto到底有什么用途? 2.6我似乎不能成功定义一个链表。我试过typedef struct{char*item;NODEPTR next;}*NODEPTR;但是编译器报了错误信息。难道在C语言中一个结构不能包含指向自己的指针吗? 2.7怎样建立和理解非常复杂的声明?例如定义一个包含N个指向返回指向字符的指针的函数的指针的数组? 2.8函数只定义了一次,调用了一次,但编译器提示非法重定义了。 2.9main()的正确定义是什么?void main()正确吗? 2.10对于没有初始化的变量的初始值可以作怎样的假定?如果一个全局变量初始值为``零",它可否作为空指针或浮点零? 2.11代码int f(){char a[]="Hello,world!";}不能编译。 2.12这样的初始化有什么问题?char*p=malloc(10);编译器提示``非法初始式"云云。 2.13以下的初始化有什么区别?char a[]="string literal";char*p="string literal";当我向p[i]赋值的时候,我的程序崩溃了。 2.14我总算弄清除函数指针的声明方法了,但怎样才能初始化呢? 3.结构、联合和枚举 3.1声明struct x1{...};和typedef struct{...}x2;有什么不同? 3.2为什么struct x{...};x thestruct;不对? 3.3一个结构可以包含指向自己的指针吗? 3.4在C语言中实现抽象数据类型什么方法最好? 3.5在C中是否有模拟继承等面向对象程序设计特性的好方法? 3.6我遇到这样声明结构的代码:struct name{int namelen;char namestr[1];};然后又使用一些内存分配技巧使namestr数组用起来好像有多个元素。这样合法和可移植吗? 3.7是否有自动比较结构的方法? 3.8如何向接受结构参数的函数传入常数值? 3.9怎样从/向数据文件读/写结构? 3.10我的编译器在结构中留下了空洞,这导致空间浪费而且无法与外部数据文件进行"二进制"读写。能否关掉填充,或者控制结构域的对齐方式? 3.11为什么sizeof返回的值大于结构的期望值,是不是尾部有填充? 3.12如何确定域在结构中的字节偏移? 3.13怎样在运行时用名字访问结构中的域? 3.14程序运行正确,但退出时却``core dump''了,怎么回事? 3.15可以初始化一个联合吗?

最新版c语言经典习题100例(最全面)

C语言习题100例(最新整理版) 习题目录:(按住Ctrl点击可以快速跳转到对应页面) 【程序1】 (5) 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? (5) 【程序2】 (6) 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成 1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? (6) 【程序3】 (7) 题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? (7) 【程序4】 (7) 题目:输入某年某月某日,判断这一天是这一年的第几天? (7) 【程序5】 (8) 题目:输入三个整数x,y,z,请把这三个数由小到大输出。 (8) 【程序6】 (9) 题目:用*号输出字母C的图案。 (9) 【程序7】 (9) 题目:输出特殊图案,请在c环境中运行,看一看,VeryBeautiful! (9) 【程序8】 (9) 题目:输出9*9口诀。 (9) 【程序9】 (10) 题目:要求输出国际象棋棋盘。 (10) 【程序10】 (10) 题目:打印楼梯,同时在楼梯上方打印两个笑脸。 (10) 【程序11】 (11) 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? (11) 【程序12】 (11) 题目:判断101-200之间有多少个素数,并输出所有素数。 (11) 【程序13】 (12) 题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。 (12) 【程序14】 (12) 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 (12) 【程序15】 (13) 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 (13) 【程序16】 (13) 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 (13) 【程序17】 (14) 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 (14) 【程序18】 (14)

C语言笔试题大全

C语言笔试题大全 4. static有什么用途?(请至少说明两种) 1.限制变量的作用域 2.设置变量的存储域 7. 引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 2) 不存在指向空值的引用,但是存在指向空值的指针。 8. 描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性 9. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在堆栈 10. 什么是平衡二叉树? 左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1 11. 堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源 12. 什么函数不能声明为虚函数? constructor 13. 冒泡排序算法的时间复杂度是什么? O(n^2) 14. 写出float x 与“零值”比较的if语句。 if(x>0.000001&&x<-0.000001) 16. Internet采用哪种网络协议?该协议的主要层次结构? tcp/ip 应用层/传输层/网络层/数据链路层/物理层 17. Internet物理地址和IP地址转换采用什么协议? ARP (Address Resolution Protocol)(地址解析協議) 18.IP地址的编码分为哪俩部分? IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。 2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。 循环链表,用取余操作做 3.不能做switch()的参数类型是: switch的参数不能为实型。 華為 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如

嵌入式开发c语言经典笔试题-含答案

void e(int ); main(){ int a; a=3; e(a);}void e(int n){ if(n>0) { e(--n); printf("%d" , n); e(--n); }}这段程序的输出是: A.0 1 2 0 B.0 1 2 1 C.1 2 0 1 D.0 2 1 1 typedef int (*test) ( float * , float*)test tmp; tmp 的类型是【】 A.函数的指针,该函数以两个指向浮点数(float)的指针(pointer)作为参数(arguments) Pointer to function of having two arguments that is pointer to float B.整型 C.函数的指针,该函数以两个指向浮点数(float)的指针(pointer)作为参数(arguments),并且函数的返回值类型是整型Pointer to function having two argument that is pointer to float and return int D.以上都不是 第3 题 main(){ char p; char buf[10] ={ 1,2,3,4,5,6,9,8}; p = (buf+1)[5]; printf("%d" , p);}这段程序的输出是:【】 A.5 B.6 C.9 D.以上都不对 第4 题 Void f(char**);main(){ char * argv[] = { "ab" ,"cd" , "ef" ,"gh", "ij" ,"kl" }; f( argv );}void f( char **p ){ char* t; t= (p+= sizeof(int))[-1]; printf( "%s" , t);}这段程序的输出是:【】 A.ab B.cd C.ef D.gh 第5 题 #includeint ripple ( int , ...);main(){ int num; num = ripple ( 3, 5,7); printf( " %d" , num);}int ripple (int n, ...){ int i , j; int k; va_list p; k= 0; j = 1; va_start( p , n); for (; j

C语言面试题大汇总,个人觉得还是比较全

4. static有什么用途?(请至少说明两种) 1.限制变量的作用域 2.设置变量的存储域 7. 引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 2) 不存在指向空值的引用,但是存在指向空值的指针。 8. 描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性 9. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在堆栈 10. 什么是平衡二叉树? 左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1 11. 堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源 12. 什么函数不能声明为虚函数? constructor 13. 冒泡排序算法的时间复杂度是什么? O(n^2) 14. 写出float x 与“零值”比较的if语句。 if(x>0.000001&&x<-0.000001) 16. Internet采用哪种网络协议?该协议的主要层次结构? tcp/ip 应用层/传输层/网络层/数据链路层/物理层 17. Internet物理地址和IP地址转换采用什么协议? ARP (Address Resolution Protocol)(地址解析協議) 18.IP地址的编码分为哪俩部分? IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。 2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出 C程序。 循环链表,用取余操作做 3.不能做switch()的参数类型是: switch的参数不能为实型。 華為 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内

100条经典C语言笔试题目(全)

100条经典C语言笔试题目 1、请填写bool,float,指针变量与“零值”比较的if语句。 提示:这里“零值”可以是0,0.0,FALSE 或者“空指针”。例如int变量n与“零值” 比较的if语句为: if ( n == 0 ) if ( n != 0 ) 以此类推。 (1)请写出 bool flag 与“零值”比较的 if 语句: 【标准答案】if ( flag ) if ( !flag ) (2)请写出 float x 与“零值”比较的 if 语句: 【标准答案】 const float EPSINON = 0.00001; if ((x >= - EPSINON) && (x <= EPSINON) 不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成 “>=”或“<=”此类形式。 (3)请写出 char *p 与“零值”比较的 if 语句 【标准答案】 if (p == NULL) if (p != NULL) 2、以下为 Linux下的 32 位 C程序,请计算 sizeof 的值。 char str[] = “Hello” ; char *p = str ; int n = 10; 请计算(1)sizeof (str ) = (2)sizeof ( p ) = (3)sizeof ( n ) = 【标准答案】(1)6、(2)4、(3)4 (4)void Func ( char str[100]) { ……; } 请计算 sizeof( str ) = (5)void *p = malloc( 100 ); 请计算sizeof ( p ) = 【标准答案】(4)4、(5)4 3、 long a=0x801010; a+5=? 【标准答案】0x801010用二进制表示为:“1000 0000 0001 0000 0001 0000”,十 进制的值为8392720,再加上5就是8392725。 4、用变量a给出下面的定义

相关文档
最新文档