专升本C语言历年考试题及答案5

更新时间:2024-01-06 06:42:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

专升本C语言历年考试题及答案

第一章 C语言程序设计初步

一、主要知识点

(一) 程序设计语言的发展

1、机器语言 2、汇编语言 3、面向过程的语言 4、面向对象的程序设计语言

(二) C程序设计语言的执行过程

1、编辑 2、编译 3、连接 4、执行 (三) 用库函数组装C程序 例1:计算2.1715的正弦值。 #include ―math.h‖ main( ) {

float a; /*定义a为实型变量*/ a=sin(2.1715); /*调用sin函数*/

printf(―%f\\n‖,a); /*调用printf函数,输出a的值*/ } 详解:

1、在本例中用到的sin函数称为数学函数,它是为了用户使用方便,由一批厂家开发编写的函数,并不是C语言的一部分。在使用数学函数时,往往要用到函数执行时所需的一些信息(例如宏定义),这些信息包含在―math.h‖中。因此在程序开头用#include ―math.h‖将有关的标头文件包括到程序中。

2、一个C语言源程序文件由一个或多个函数组成,C语言的基本组成单位是函数。一个完整的C语言程序有且只有一个称为主函数的main函数,程序总是从main函数开始执行,调用其它函数后再回到main函数,在main函数中结束整个程序的运行。

3、main是函数名称,没有参数可以不写,但圆括号不能省略,main()后面有一对花括号,花括号内的部分称为函数体,main函数可以在程序的任意位置。

专升本C语言历年考试题及答案

4、C规定每个语句以分号(;)结束,分号是语句不可缺少的组成部分,每行中可以写多条语句。

5、/*与*/之间为注释信息,对程序运行结果不发生影响,也不被编译,注释说明可以放在语句的任意位置。

6、float a;此语句是把a定义为一个实型变量。

7、C语言本身没有输入、输出语句,本例使用prinft函数输出数据。prinft函数的括号内包括两部分内容:双引号内的部分、双引号外的部分。双引号内的部分是“格式字符串”,用于指定输出双引号外的变量的打印格式。此例中双引号中有一个‖%f‖,它是输出一个保留小数点后6位数字的格式字符,小数点前的位数不指定。

二、练习 (一) 选择题

1、以下叙述正确的是_C___。

(A)在C程序中,main函数必须位于程序的最前面 (B)C程序的每行中只能写一条语句 (C)C语言本身没有输入输出语句

(D)在对一个C程序进行编译的过程中,可发现注释中的拼写错误 2、C语言规定:在一个源程序中,main函数的位置___C_。 (A)必须在最开始

(B)必须在系统调用库函数的后面 (C)可以任意 (D)必须在最后

3、一个C语言程序是由____B。 (A)一个主程序和若干子程序组成 (B)函数组成 (C)若干过程组成 (D)若干子程序组成

4、一个C程序的执行是从A____。

(A)本程序的main函数开始,到main函数结束

(B)本程序文件的第一个函数开始,到本程序文件的最后一个函数结束

专升本C语言历年考试题及答案

(C)本程序的main函数开始,到本程序文件的最后一个函数结束 (D)本程序文件的第一个函数开始,到本程序main函数结束 5、以下叙述不正确的是__D__。

(A)一个C源程序可由一个或多个函数组成

(B)一个C源程序必须包含一个main函数 (C)C程序的基本组成单位是函数

(D)在C程序中,注释说明只能位于一条语句后面 (二) 填空题:

1、一个C源程序中至少包括一个 __main函数____。

2、在一个C源程序中,注释部分两侧的分界符分别为____/*____和_*/_______。

第二章 数据描述与基本操作

一、主要知识点

(一) C的基本数据类型节 短整型(short) 整型 整型 (int) 基本类型 字符型(char) 长整型 (long)

实型(浮点型) 单精度型 (float) 枚举类型 双精度型 (double)

数据类型 构造类型 数组类型 结构类型(struct) 指针类型 共用类型(union) 空类型(void) 文件类型(FILE)

(二) 常量和符号常量

1、常量定义:在程序运行过程中,其值不能被改变的量称为常量。常量常区分不同的类型,如12、0、-3为整型常量,‘a‘、‘D‘为字符常量。

2、符号常量:用一个标识符代表一个常量的,称为符号常量,即标识符形

专升本C语言历年考试题及答案

式的常量。常量不同于变量,它的值在作用域内不能改变,也不能再被赋值。

例1:已知商品的单价及数量求商品的总价值。 #define PRICE 30 main( ) {

int num=10,total; total=num*PRICE; printf(―total=%d‖,total); }

输出结果:total=300 详解:

1、程序中用#define命令行定义PRICE代表常量30,此后凡在此文件中出现的PRICE都代表30,可以和常量一样进行运算。

2、符号常量不同于变量,它的值在其作用域内不能改变,也不能再被赋值。如再用以下赋值语句给PRICE赋值:PRICE=40;是错误的。

(三) 变量

1、变量定义:其值可以改变的量称为变量。 2、标识符的命名规范

和其它高级语言一样,用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为标识符,C语言中的标识符命名规范为:

①变量名只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。

②C语言中标识符的长度(字符个数)无统一规定,随系统而不同。许多系统(如IBM PC的MS C)取前7个字符,假如程序中出现的变量名长度大于7个字符,则只有前面7个字符有效,后面的不被识别。

③C语言有32个关键字(例如if、else、while)它们已有专门含义,不应用采用与它们同名的变量名。

④C语言将大写字母和小写字母认为是两个不同字。

例2:在下列符号中,可以选用哪些作变量名?哪些不可以?

a3B 3aB ∏ +a -b *x $ _b5_ if next_ day e_2 OK?

专升本C语言历年考试题及答案

integer MAXNUMBER i*j

答案:_b5_ a3B next_ day e_2 MAXNUMBER可作变量名,其它的作变量名不可以。

详解:

①MAXNUMBER可作变量名。习惯上符号常量名用大写,变量名用小写以示区别,但大写字母作变量名并无错误。

②if、integer属于保留字,保留字不可作变量名。

③∏ +a -b *x $ OK? i*j不可作变量名,因为变量名只能由字母、数字和下划线三种字符组成。

④3aB不可作变量名,因为变量名的第一个字母必须为字母或下划线。 (四) 整型数据 1、整型常量

整型常量即整常数。C语言整常数可用以下三种表示形式。 ①十进制表示。如231、-56.478 ②八进制表示。以

8=1*8

2

0开头的数是八进制数。如0123即(123)

+2*81+3*80=64+16+3=83。

③十六进制表示。以0x开头的数是16进制。如0x123即(123)

16=1*16

2

+2*161+3*160=256+32+3=291。

2、整型变量

整型变量分为:基本型、短整型、长整型、和无符号型四种。 ①基本型,以int表示

②短整型,以short int表示或以short表示 ③长整型,以long int表示,或以long表示

④无符号型,存储单元中全部二进制位(bit)用作存放数本身,而不包括符号。无符号型中又分为无符号整型、无符号短整型和无符号长整型,分别以unsigned int 、unsigned short 和unsigned long表示。

3、整型数据的取值范围

C标准没有具体规定各类型所占内存字节数,各种机器处理上有所不同,以IBM PC为例,数的范围如表2.1所示。

表2.1

专升本C语言历年考试题及答案

Int short[int] Long[int] Unsigned[int] Unsigned short Unsigned long

4、整型常量的分类

①一个整常量,如果其值在-32768~32767范围内,认为它是int型,它可以赋值给int型和long int型变量。

②一个整常量,如果其值超过了上述范围,而在-2147483648~2147483647范围内,则认为它是long int型,可以将它赋值给一个long int型变量。

③如果某一计算机系统的C版本确定的short int与int型在内存中占据的长度相同,则一个int型的常量出同时一个short int型常量。

④常量中无unsigned型。但一个非负值的整常量可以赋值给unsigned型整变量,只要它的范围不超过变量的取值范围即可。例如:将50000赋给一个unsigned int型变量是可以的,而将70000赋给它是不行的(溢出)。

⑤在一个整常量后面加一个字母l或L,则认为是long int型常量。 (五) 实型数据 1、实型常量

实数在C语言中又称为浮点数。实数有两种表示形式:

①十进制形式。它由数字和小数点组成(注意必须有小数点)。例如:0.123、.123、123.0、0.0都是十进制数形式。

②指数形式。如123.56e4或123.56E4都代表123.56*104。但字母e(或E)之前必须有数字,e后面指数必须为整数。例如:e3、2.1e3.5、.e3、e等都不是合法的指数形式。

例3:下面四个选项中,均是不合法的浮点数的选项是_____。 (A)160. 0.12 e3 (B)123 2e4.2 .e5 (C)-.18 123e4 0.0 (D)-.e3 .234 1e3

所占位数 16 16 32 16 16 32 数的范围 -32768~32767 即-215~(215-1) -32768~32767 即-215~(215-1) -2147483648~2147483647 即-231~(231-1) 0~65535 即0~(216-1) 0~65535 即0~(216-1) 0~4294967295 即0~(232-1)

专升本C语言历年考试题及答案

答案:B 详解:

①160. 0.12 -.18 123e4 0.0 .234 1e3是实数的十进制形式或指数形式。

②e3 2e4.2 .e5 -.e3不是正确的指数形式。因为正确的字母e(或E)之前必须有数字,e后面指数必须为整数。对于数据表示形式.e5以及-.e3,e前的.与-.不是有效的数字表示形式。

③123是整数形式。 2、实型变量

C实型变量分为单精度(float型)和双精度(double型)两类。

在一般系统中,一个单精度型数据在内存中占4个字节(32位),一个double型数据占8个字节。一个单精度型变量能接收7位有效数字,一个double型变量能接收17位有效数字,数值的范围随机器系统而异。在IBM PC中,单精度实数的范围约为±(3.4E10-38~3.4E1038),双精度实数的范围约为±(1.7E10-308~1.710308)。

例4: main( ) { float a;

a=111111.666666; printf(―%f‖,a); }

输出结果:111111.640621 详解:

①一个实型常量不分float型和double型。一个实型常量可以赋给一个float型或double型变量。根据变量的类型截取实型常量中相应的有效位数字。

②由于float型变量只能接收7位有效数字,因此在把111111.666666赋给a时,a只接收了111111.6,由于输出函数printf中的%f格式表示输出小数点后的6位小数,所以111111.6后的40621属于无意义数字。

③如果a改为double型,则能全部接收上述12位数字。 (六) 字符型数据

专升本C语言历年考试题及答案

1、字符常量:

①普通形式的字符常量:用引号(即撇号)括起来的一个字符,如‘a‘、‘D‘、‘$‘、‘?‘等都是字符常量。

②转义符:以“\\”开头的字符序列。 常用的以“\\”开头的特殊字符见表2.2

表2.2

字符形式 \\n \\t \\v \\b \\r \\f \\\\ \\‘ \\ddd \\xhh 功能 换行 横向跳格 竖向跳格 退格 回车 走纸换页 反斜杠字符 单引号字符 1到3位8进进制所代表的字符 1到2位16进制数所代表的字符 例5:若有说明语句:char c=‘\\729‘;则变量c_____。 (A)包含1个字符 (B)包含2个字符 (C)包含3个字符 (D)说明不合法 答案:D

详解:‖\\‖后可以有1到3位8进制所代表的字符,本题中‖\\‖后的‖72‖属于8进制所代表的字符,而‖9‖则不属于8进制位所代表的字符,则‘\\729‘中包含了两个字符常量‘\\72‘和‘9‘。而字符常量是用引号(即撇号)括起来的一个字符,所以答案为D。

2、字符变量

字符变量是用来存放字符常量的存储单元。 3、字符数据在内存中的存储形式

将一个字符常量存放到一个字符变量中,实际上并不是把该字符本身存放到内存单元中去,而是将该字符的相应的ASCII码值存放到存储单元中去。

例6:将小写字母转换成大写字母

专升本C语言历年考试题及答案

main( ) { char c1=‘a‘; c1=c1-32; printf(―%c‖,c1); }

输出结果:A 详解:

①‘a‘的ASCII码为97,所以c1=‘a‘;语句的功能是把97赋值给了c1。 ②c1=c1-32;语句的功能是把97-32的值65赋值给c1。

③printf函数中的%c格式表示以字符方式输出。ASCII码值为65的字符为A,所以运行结果为:A

(七) 字符串常量

字符常量是用一对双引号括起来的零个或多个字符序列。C规定以字符‘\\0‘作为字符串结束标志。所以字符串‖a‖实际上包含2个字符:‘a‘、‘\\0‘,因此下面的语句:

c=‖a‖;

把一个串赋值给一个字符变量c是错误的。

例7:下面不正确的字符串常量是______。

(A)‘abc‘ (B)‖12‘12‖ (C)‖0‖ (D)‖ ‖ 答案:A

详解:‘abc‘是用单引号引来的,所以‘abc‘不是正确的字符串常量。 (八) 算术运算符和算术表达式 1、基本算术运算符

①C语言中有5个基本算术运算符:

+(加法运算符。如3+5、+3) -(减法运算符。如5-2、-3) *(乘法运算符,如3*5) /(除法运算符,如5/3,5.0/3)

%(求余运算符,要求%两侧均为整型数据)

例8:在C语言中,要求运算数必须是整型的运算符是____。

专升本C语言历年考试题及答案

(A)/ (B)++ (C)!= (D)% 答案:D

详解:对于%运算符来说,要求两侧均为整型数据,所以表达式3.5%2与3%2.0是错误的。

例9:写出下列程序的输出结果 main( ) {

printf(―%d,%d\\n‖,5/3,5%3); printf(―%d,%d\\n‖,-5/-3,-5%-3); printf(―%d,%d\\n‖,-5/3,-5%3); printf(―%d,%d\\n‖,5/-3,5%-3); }

输出结果: 1,2 1,-2 -1,-2 -1,2

详解:两个同号整数相除时结果为正整数,如5/3、-5/-3的结果值为1。两个异号整数相除时结果为负整数,多数机器采取“向零取整”法,即-5/-3=-1,5/-3=-1,但如果参加运算的两个数中有一个数为实数时结果为实数。对于求余(%)运算,运算结果与第一个数的符号相同。

②优先级别:先*、/、%后+、-

③运算量:双元运算量,%前后必须为整数。 ④左右结合性:自左至右参预运算。 2、自加自减运算符

①C语言中有4种形式的自加自减运算符:

++i (先使i加1后使用) i++ (先使用后使i加1) --i (先使i减1后使用) i-- (先使用后使i减1)

专升本C语言历年考试题及答案

②优先级别:高于算术运算。

例10:若x和n均是int型变量,且x和n的初值均为5,则计算表达式后x的值为______,n的值为______。

x+=n++

答案:10 6

详解:根据优先级别选运算表达式n++,因为n++是后缀表示形式,所以n先参预运算,再运算表达式x+=n,则x为10,最后n自加为6。

例11: main( ) {

int x,y,m,n; x=2;y=2 m=x++*5; n=++y*5;

printf(―%d,%d,%d,%d‖,x,y,m,n); }

输出结果:3,3,10,15

详解:对于后缀来说是先使用后运算,所以m的值为x在自加以前的2*5得10赋值给m后,x自加变为3。对于前缀来说是先运算后使用,所以m的值为x在自加以后的3*5得15赋值给n。

③运算量:单元运算量,此运算量必须为变量,所以表达式5++、(x+y)++是错误的。

④左右结合性:自右至左参预运算。 (九) 关系运算

1、C语言提供的关系运算符有:

>(大于) >=(大于或等于) <(小于) <=(小于或等于) ==(等于)是 !=(不等于)

2、优先级别:关系运算符的优先级别低于纯算术类,高于赋值类。后两个的优先级小于前四个。如表达式a+b

3、运算量:关系运算符是双元运算符,整型、实型、字符都可以参预运算。

专升本C语言历年考试题及答案

4、左右结合性:从左向右的结合方向 5、关于关系运算符的进一步说明:

①关系表达式的值是整型数0或1,故也可以将其看成一种整型表达式。例如: int i=1,j=7,a; a=i+(j%4!=0);

的执行结果为:a的值为2。

②要说明x在区间[a,b]中,普通数学中使用表达式a≤x≥b。但C语言中应写成a<=x&&x<=b。

③表达式5>2>7>8在数学上是不允许的,而在C中是允许的。按自左至右求解。

④字符数据的比较按其ASCII码值进行。

⑤在判定两个浮点数是否相等时,由于存储上的误差,会得出错误的结果。例如:

1.0/3.0*3.0==1.0 该表达式的值为0。

(十) 逻辑运算

1、C语言提供的逻辑运算符:

&&(逻辑与) ||(逻辑或) !(逻辑非)

2、优先级别:&&与||的优先级别低于关系运算符,高于条件运算符,&&的优先级别高于||,!的优先级别与自加运算符(++)、自减运算符(--)同级。

3、运算量:&&和||是双元运算符,!是单元运算符。

例12:已知x=43,ch=‘A‘,y=0;则表达(x>=y&&ch<‘B‘&&!y)的值是______。 (A)0 (B)语法错 (C)1 (D)“真” 答案:C

详解:C语言不提供逻辑性数据“真”和“假”,在进行逻辑运算时,结果不是1就是0。

4、左右结合性:&&和||运算符的结合方向为自左至右,!的结合方向为自右至左。

5、关于逻辑运算符的进一步说明:

①在一个&&表达式中,若&&的一端为0,则不必再计算另一端,该表达式的

专升本C语言历年考试题及答案

值肯定为0。

②在一个||表达式中,若||的一端为0,则不必再计算另一端,该表达式的值肯定为1。

例13:写出下面程序的输出结果。 main( ) {

int x,y,z; x=y=z=0; ++x&&++y||++z;

printf(―%d,%d,%d‖,x,y,z); x=y=z=0; ++x||++y&&++z;

printf(―%d,%d,%d‖,x,y,z);

}

输出结果: 1,1,0 1,0,0 详解:

①因为&&的优先级别高于||,所以表达式++x&&++y||++z是一个或表达式,根据||的一端为0,则不必再计算另一端的原则,先计算表达式++x&&++y的值为1,因为1或任何值都为1,所以表达式++z没有运算,输出结果为:1,1,0。

②表达式++x||++y&&++z也是一个或表达式,同样根据||的一端为0,则不必再计算另一端的原则,先计算表达式++z的值为1,因为1或任何值都为1,所以表达式++y&&++z没有运算,输出结果为:1,0,0。

(十一) 赋值运算 1、基本的赋值运算符:

=(将赋值运算符右侧的表达式赋给左侧的变量) 2、自反算术赋值运算符

C语言中有5个基本自反算术赋值运算符: +=(a+=3 等价于a=a+3)

专升本C语言历年考试题及答案

-=(a-=3 等价于a=a-3) *=(a*=3 等价于a=a*3) /=(a*=3 等价于a=a*3) %=(a%=3 等价于a=a%3)

3、优先级别:赋值运算符与自反算术赋值运算符属于同等级别,低于条件运算符,高于逗号运算符。如对于表达式x%=y+3完全等价于x%=(y+3)。

例14:若有以下定义,则能使值为3的表达式是______。 Int k=7,x=12;

(A)x%=(k%5) (B)x%=(k-k%5) (C)x%=k-k%5 (D)(x%=k)-(k%=5) 答案:D

详解:表达式(x%=k)-(k%=5)完全等价于(x=x%k)-(k=k%5)等价于5-2,此表达式的结果为3。

4、运算量:双元运算量,赋值运算符与自反算术赋值运算的第一个量必须为变量,且%=前后必须为整型数据。如对于表达式a*3+=2是错误的。因为此表达式完全等价于(a*3)=(a*3)+2。

5、左右结合性:自右至左参预运算。

例15:若a是int型变量,且a的初值为6,则计算表达式后a的值为______。 a+=a-=a*a 答案:-60

详解:表达式从左向右运算,先计算表达式a=a-36后a为-30,再计算表达式a=a+a后a的值变为-60。

(十二) 条件运算:

1、条件运算符的基本形式及功能:

条件运算是一种在两个表达式的值中选择一个的操作。它的一般形式为: e1?e2:e3

它的操作过程为,若e1为真,则表达式的值为e2,若为假表达式的值为e3。

2、优先级别:低于逻辑运算,高于赋值运算。

3、运算量:三元运算量,e1一般为算术表达式,e2、e3可以是任意类型的表达式,条件表达式的值的类型为e2与e3二者中类型较高的。

专升本C语言历年考试题及答案

例16:若有条件表达式(exp)?a++:b--,则以下表达式中能完全等价于表达式(exp)的是______。

答案:exp!=0

详解:对于表达式e1?e2:e3 ,e1一般为算术表达式、逻辑表达式、关系表达式,结果为1(真)或0(假)。也可以为数值exp,结果为结果为非0(真)或0(假)在本例中与exp完全等价的表达式是exp!=0。

4、左右结合性:自右至左运算。 例17:以下程序的运行结果是______。

main() {

int k=4,a=3,b=2,c=1;

printf(―%d‖,k

详解:条件表达式是从右向左运算,所以在本例中先计算表达式c(十三) 逗号运算

1、逗号运算符的基本形式及功能:

逗号表达式的一般形式为: 表达式1,表达式2。逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个表达式的值是表达式2的值。

2、优先级别:逗号运算符是所有运算符中级别最低的。 例18:以下符合C语言语法的赋值表达式是______。 (A)d=9+e+f=d+9 (B)d=(9+e,f=d+9) (C)d=9+e,e++,d+9 (D)d=9+e++=d+7 答案:B

解析:表达式d=9+e+f=d+9中9+e+f=d+9是不正确的表示形式,因为赋值号(=)左边不能是表达式。表达式d=9+e,e++,d+9是逗号表达式,因为赋值运算符(=)的优先级别高于逗号运算符(,)。表达式d=9+e++=d+7中9+e++=d+7是不正确的表达式,因为赋值号(=)左边不能是表达式。

专升本C语言历年考试题及答案

如输入:a b c 。字符‘a‘赋给c1,字符(空格)‘ ‘赋给c2,字符‘b‘ 赋给c3。

5、scanf的停止与返回

①格式参数中的格式项用法----正常结束。 ②发生格式项与输入域不匹配时----不正常退出: (十七) getchar、putchar函数 1、getchar函数

getchar函数是从终端输入一个字符。getchar函数没有参数,其一般形式为:getchar( )。

2、putchar函数

putchar函数的作用是向终端输出一个字符。 二、练习 (一)选择题

1、下面四个选项中,均是不合法的用户标识符的选项是____。 (A)A P_0 do (B)float la0 _a (C)b-a goto int (D)_123 temp INT

2、若x,i,j和k都是int型变量,则计算下面表达式后,x的值为______。x=(i=4,j=16,k=32)

(A)4 (B)16 (C)32 (D)52

3、下列四个选项中,均是不合法的整型常量的选项是______。 (A)--0f1 -0xffff 0011 (B)-0xcdf 017 12,3456 (C)-018 999 5e2 (D)-0x48eg -068 03f

4、下面四个选项中,均是合法浮点数的选项是______。 (A)1e1 5e-9.4 03e2 (B)-.60 12e-4 -8e5 (C)123e 1.2e-.4 2e-1

(D)-e3 .8e-4 5.e-0

5、下面四个选项中,均是合法字符的选项是______。 (A)‘\\‘‘ ?\\\\‘ ?\\xf‘ (B)‘\\‘ ?\\017‘ ?\\n‘

专升本C语言历年考试题及答案

(C)‘\\018‘ ?\\f‘ ?xab‘(D)‘\\0‘ ?\\101‘ ?xlf‘ 6、以下不正确的叙述是______。

(A)在C程序中,逗号运算符的优先级最低。 (B)在C程序中,APH和aph是两个不同的变量

(C)若a和b类型相同,在计算机了赋值表达式a=b后,b的值不变。 (D)当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数据。

第三章 C程序的流程设计

一、算法 1、算法的概念

为解决某一个问题而采取的方法和步骤,就称为算法。 2、算法的性质

①有穷性:一个算法应包含有限的操作步骤 ②一个初始:此动作序列只有一个初始动作

③确定性:算法中的每一个步骤都应当是确定性的,仅有一个后继动作。 ④有一个或多个输出:序列终止表示问题得到解答或问题没有解答,没有输出的算法是没有意义的。

二、选择型程序设计 1、if 语句的形式

①if(条件表达式) 语句

②if(条件表达式) 语句1 else 语句 2 注意:

①if语句中的条件表达式一般为逻辑表达式或关系表达式,但也可以是任意

专升本C语言历年考试题及答案

的数值类型(包括整型、实型、字符型、指针类型),例如下列语句也是合法的。

if(?a‘) printf(―%d‖ ,‘a‘);

②在if语句中,分号是语句的结束标志。

③在if和else后面可以只含一个内嵌的操作语句,也可以有多个操作语句,此时用花括号将几个语句括起来成为一个复合语句。

例1:以下不正确的if语句形式是( )。 A)if(x>y&&x!=y);

B)if(x==y) x+=y;

C)if(x!=y) scanf(―%d‖,&x) else scanf(―%d‖,&y); D)if(x

详解:scanf(―%d‖,&x)末尾应加分号,因为分号是语句不可缺少的部分。 例2:已知int x=10,y=20,z=30;以下语句执行后x,y,z的值是( )。 if(x>y)

z=x;x=y;y=z;

答案:x,y,z的值分别是:20 30 30

详解:在此语句中,条件x>y为假,所以只执行x=y;y=z;两条语句。

例3、以下不正确的语句是( ) A)if(x>y);

B)if(x=y)&&(x!=0) x+=y; C)if(x!=y) scanf(―%d‖,&x); D)if(x

详解:分号是语句结束的标志,y++的末尾无分号,所以y++不是合法的语句。

2、if 的嵌套

if(条件1)

if(条件2) 语句1 else

语句2

专升本C语言历年考试题及答案

else

if(条件3) 语句3 else

语句4

例4:以下程序的输出结果是( ) main( ) {

int a=100,x=10,y=20,ok1=5,ok2=0; if(x

if(y!=10) if (!ok1)

a=1; else

if(ok2) a=10; printf(―%d\\n‖,a);

}

答案:100

详解:把10、20、5、0分别给变量x、y、ok1、ok2赋值,执行条件语句后a值没有改变,所以a值仍是原值100。

3、switch结构

switch语句是多分支选择语句,其形式如下: switch(表达式) {

case 常量表达式1:语句1 case 常量表达式2:语句2 …………

default:语句n+1 } 注意:

1、switch后面括弧内的“表达式”,可以是整型表达式或字符型表达式,也可以枚举型数据。

2、当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。

3、每一个case的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象。

4、执行完一个case后面的语句后,流程控制转移到下一个case继续执行,

专升本C语言历年考试题及答案

直到遇到break语句或执行完为止。

5、default可以放在case语句的后面,也可以放在case语句的前面。 例5:运输公司对用户计算运费,距离越远,每公里运费越低。设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f计算公式为f=p*w*s(1-d),编写程序。公里数s与折扣率d的标准如下:(此程序可用if??else来完成,也可以用switch来完成)。

s<250km d=0 250≤s<500 d=0.05 500≤s<1000 d=0.075 1000≤s<2000 d=0.1 2000≤s<3000 d=0.15 3000≤s d=0.2 main()

{

int s;

float p,w,d,f;

printf(―请输入每公里每吨货物的基本运费‖); scanf(―%f‖,&p);

printf(―请输入货物重‖); scanf(―%f‖,&w);

printf(―请输入公里数‖); scanf(―%f‖,&s); switch((int)(s/250)) {

case 0: d=0; break;

case 1: d=0.05; break; case 2:

case 3: d=0.075; break; case 4: case 5:

case 6:

case 7: d=0.1; break; case 8: case 9:

case 10:

case 11: d=0.15; break; default: d=0.2; }

专升本C语言历年考试题及答案

f=p*w*s(1-d);

printf(“基本运费是:%f”,f); }

详解:

1、多个case可共用一组执行语句,必须写成如下的形式:

case 4:

case 5:

case 6:

case 7: d=0.1; break;

case后面只能有一个常量,把上式改写成case 4,5,6,7: d=0.1; break;的形式是错误的。

2、switch后面括弧内的“表达式”必须是整型表达式或字符型表达式,也可以是枚举型数据,对于swith来说,关键是把原始数据转换为易表达的形式。

例6:请读以程序写出程序的输出结果。 #include main( )

{

int x=1,y=0,a=0,b=0; switch(x) {

case 1:

switch(y) {

case 0: a++;break; case 1: b++;break; }

case 2:

a++;b++;break; }

printf(―a=%d,b=%d‖,a,b);

}

答案:a=2,b=1

详解:此程序是switch的嵌套结构,在此程序中break跳出内层switch结构,接着执行外层switch的case 2后的语句。

例7:写出下面程序的运行结果是( ) main() {

int i;

for(i=1;i<=5;i++) switch(i%5)

专升本C语言历年考试题及答案

{

case 0: printf(―*‖); break;

case 1: printf(―#‖); break; default: printf(―\\n‖); case 2: printf(―&‖);

} }

答案:#& & &*

详解:default可放在case语句的前面,也可以放在case语句的后面,当i%5不等于0,1,2时,将执行default后的语句printf(―\\n‖);执行完成后没有break,将继续执行case 2后的语句printf(―&‖);

三、循环型程序设计 1、while语句

while语句用来实现‖当型‖循环结构,其一般形式如下: while(条件表达式) 循环体语句 例11:设有程序段: int k=10;

while(k=0) k=k-1; 循环体执行( )次。 答案:0

答案解析:在此程序的while结构中,条件表达式k=0的结果永远为0即为假,所以循环执行的次数为0。

例12:下面程序段的运行结果是( ) x=y=0;

while(x<15) y++,x+=++y; printf(―%d,%d‖,y,x); 答案:8,20 例13、设有程序段 t=0;

while(printf(―*‖)) { t++;

if(t>3) break;

} 循环执行( )次

专升本C语言历年考试题及答案

答案:4

答案解析:while结构中的条件表达式printf(―*‖)的值为输出数据的个数,在此例中,printf(―*‖)的结果为1,即为真。

2、do-while语句

do-while语句的特点是先执行循环体,然后判断循环条件是否成立,其一般形式为:

do{

循环体语句

}while(条件表达式); 例14、若有如下语句 int x=3;

do {printf(―%d\\n‖,x-=2);}

while(--x);

则上面程序段输出结果是( )。 答案:1

例15、以下程序段循环执行几次。 x=-1; do

{ x=x*x;} while(!x); 答案:1

例16、下面程序的运行结果是( ) main( ) {

int y=10;

do{y--;} while(--y); printf(―%d\\n‖,y--); }

答案:0 3、for语句

C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句,其一般形式为:

for(表达式1;表达式2;表达式2)

专升本C语言历年考试题及答案

语句 说明:

①for语句一般形式中的“表达式1”可以省略,此时应for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。

②如果表达式2省略,即不判断循环条件,循环无终止地进行下去。 ③表达式3也可以省略,但此时程序设计者应另外设法保证循环正常结束。 ④可以省略表达式1和表达式3,只有表达式2,即只给循环条件,在这种情况下,完全等同于while语句。

⑤3个表达式都可省略,如:for( ; ; ) 语句,相当于while(1) 语句,即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。

⑥表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。for(sum=0;i<=100;i++) sum=sum+i;

⑦表达式一般是关系表达式(如i<=100)或逻辑表达式(如a

例17:若i为整型变量,则以下循环执行次数是( )。 for( i=2 ;i!=0 ; ) printf(―%d‖,i--); 答案:2

例18:以下不是无限循环的语句是( ) A)for(y=0,x=1;x>++y;x=i++) i=x; B)for(;;x++=i) C)while(1){x++;} D)for(i=10;;i--) sum+=i; 答案:A

例19、执行语句for( i=1 ; i++<4 ; ); 后变量i的值是( ) 答案:4

例20、下面程序段的功能是计算1000!的末尾含有多少个零。请填空。 for(k=0,i=5;i<=1000;i+=5)

{m=i;

while( ) {k++;m=m/5;} }

专升本C语言历年考试题及答案

答案:m%5!=0 4、break与continue

在break语句可以使流程跳出switch结构,继续执行switch语句下面的一个语句。实际上,break语句还可以用来从循环体内跳出循环体,即提高结束循环,接着执行循环下面的语句。break语句的一般形式为:break;

continue语句只结束本次循环,而不是终止整个循环的执行。continue语句的一般形式为:continue;

例21:下列程序的运行结果是( )。 main( )

{ int i,j,x=0;

for(i=0;i<2;i++) {x++;

for(j=0;j<=3;j++)

{ if(j%2) continue; x++;} x++;

}

printf(―x=%d\\n‖,x);

} 答案:

例22、下面程序的运行结果是( ) main( )

{ int k=0;char c=‘A‘; do

{switch(c++)

case ?A‘:k++;break; case ?B‘:k--;

case ?C‘:k+=2;break;

case ?D‘:k=k%2;continue; case ?E‘:k=k*10;break; default:k=k/3; } k++;

}while(c<‘G’); printf(―k=%d\\n‖,k);

答案:

5、循环的嵌套

一个循环体中又包含另一个完整的循环结构称为循环的嵌套。内嵌的循环中

专升本C语言历年考试题及答案

可嵌套循环,这就是多层循环。

6、举例: ①求和问题

例23:s=1+2+…………..+100 例24:s=1!+2!+………… +100!

例25:e=1+1/1!+1/2!+1/3!+…… 精确到10-6 例26:s=1-1/3!+1/5!-1/7!+……. 精确到10-6 #include ―math.h‖ main( ) {

long t; double s;

for(s=0,t=1,i=0;fabs(1/t)>=1e-6;i++) {

t=(-1)*t*i; s=s+1/t; }

printf(―%lf‖,s); }(例26程序设计)

例27:有一分数序列:2/1,3/2,5/3,8/5,13/6,21/13,求出这个数列的前20项之和 main() {

int s=0, f1=1,f2=2; for(I=1;I<=20;I++) {

s=s+f2/f1; f2=f1+f2; f1=f2-f1;

}

printf(―%d‖,s); }

例28:打印九九表

main( ) {int i,j;

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

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

printf(―-*-=-‖,i,j,i*j); printf(―\\n‖);

. 还……

专升本C语言历年考试题及答案

} }

例29:打印出下列图形

* * *

* * *

* * *

main( ) {

int i,j;

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

for(j=1;j<=5+fabs(i-3);j++) printf(― ‖);

for(j=1;j<=5-2*fabs(i-3);j++) printf(―*‖); printf(―\\n‖);

}

}

例30、打印出下列图形

* ***

*****

***

例31、兔子繁殖问题 main( ) {

int i,f1,f2,f3;

for(i=3;i<=12;i++) {

f3=f1+f2; f1=f2; f2=f3; }

printf(―%d‖,f3); }

专升本C语言历年考试题及答案

例32、求最大公约数、最小公倍数。

main( )

{int r,u,v,m,n;

scanf(―%d,%d‖,&m,&n); m=u;n=v;

if(u

{r=u%v;u=v;v=r;}

printf(―最大公约数是:%d,最小公倍数是‖,v,m*n/v); }

例33、sn=a+aa+aaa+aa…a,从键盘输入a及n后,求sn 方法一: main() {int n,a; long s;

scnaf(―%d%d‖,&n,&a); for(i=1;i<=n;i++) s=s*10+i*a; printf(―%ld‖,s); }

方法二:

main() {int n,a; long s,t=0;

scnaf(―%d%d‖,&n,&a); for(i=1;i<=n;i++) {t=t*10+a

s=s+t; }

printf(―%ld‖,s); }

例34、给出一个不多于5位的正整数,要求①求出它是几位数②分别打印出每一位数③逆序打印此数据。

main( ) {long a;

int i=0;s=0;

printf(―它的每一位数:‖); While(a!=0) { i=i+1; x=a; a=a/10; s=s*10+x;

专升本C语言历年考试题及答案

printf(―%d ‖,x); }

printf(―\\n‖);

printf(―它是%d位数\\n‖,i); printf(―它的逆序是%d\\n‖,s);

}

例35、输出1—100之间每位数的乘积大于每位数的和的数

main()

{ int n,k=1,s=0,m;

for(n=1;n<=100;n++) {k=1;s=0; m=n;

while(m!=0) {

k=k+m; s=s+m; m=m/10; }

if(k>s) printf(―%d‖,n); } }

例36、猴子吃桃问题,猴子第一天摘下若干桃子,当即吃了一半,还不过瘾又多吃了一个,第二天又将剩下的桃子吃掉一半,又多吃了一个,以后每天都吃前一天剩下的半多一个,到第10天,再吃桃时只剩下一个桃子,求第一天共摘下多少了桃。

main() {int i,s=1;

for(i=9;i<=1;i--) s=2*s+1;

printf(―第一天共摘下%d个桃子‖,s); }

例37:准备客票:某铁路线上共有10个车站,问需要准备几种车票。 main()

{int i,j,s=0;

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

for(j=I+1;j<=10;j++) s=s+1;

printf(―需要准备%d‖,2*s); }

例38、有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完。

专升本C语言历年考试题及答案

main( )

{ int day=0,s=1020; while(s<=0)

{s=s/2-2; day++; } printf(―%d‖,day); }

例39、从三个红球、五个白球、六个黑球中任意取出八个球,且其中必须有白球,输出所有可能的方案。

main()

{int red,white,black;

for(white=1;white<=5;white++) for(red=0;red<=3;red++)

for(black=0;black<=6;black++) if(white+red+black==8)

printf(―%d个红球,%d个白球,%d个黑球‖,red,white,black); }

例40、二分迭代法

二分迭代法的思想是:先取f(x)=0的两个粗略解x1与x2。若f(x1)与f(x2)符号相反,则方程f(x)=0在区间(x1,x2)中至少有一个根。

While(fabs(x1-x2)>=1e-6)

{ x3=(x1+x2)/2; if(f(x3)*f(x2)>0) x2=x3; else x1=x3; }

例41、牛顿切线法求a的平方根。 x=√a x2=a 构造函数 f(x)=x2-a x2=x1-f(x1)/f‘(x1) double sq-root(double a) {double x; x=a;

while(fabs(x*x)-a>=1e-6)

x=(x+a/x)*0 5;

专升本C语言历年考试题及答案

return(x);

}

例42、求积分用梯形法求sin(x)*cos(x)的定积分,设上限a、下限b分别为0,1.2。积分区间分割数n=100.

S=h/2[f(a)+f(b)]+h(f(a+h)+f(a+2h)+………..+f(b)) main( ) { int i,n=100;

double h,s,a=0,b=1.2;

s=0.5*(sin(a)*cos(a)+sin(b)*cos(b)); for(i=1;i<=n;i++)

s=s+sin(a+i*h)*cos(a+i*h); printf(―%lf‖,s); }

例44、验证一个数是否为素数 main( )

{int n,I,flag=1;

scnaf(―%d‖,&n);

for(i=2;i<=sqrt(n);i++)

if(n%i==0) {flag=0;break;}

if(flag==1)

printf(―%d是素数。‖,n); else

printf(―%d不是素数。‖,n); }

例45、输入一个数,输出这个数的质因子乘积的形式。例如输入72后,输出:72=2*2*2*3*3。

main()

{ int n,i=2,flag=0; scanf(―%d‖,&n); printf(―%d=‖,n); while(n!=1) {

if(n%i==0)

{if(flag==0)

{printf(―%d‖,i);flag=1;}

else

专升本C语言历年考试题及答案

{printf(―*%d‖,i);}

n=n/i;

} else i=i+1 } }

二、练习

例5:请阅读以下程序:若运行时输入2.0<回车>,则上面程序的输出结果是( )

#include main( ) {

float a,b;

scanf(―%f‖,&a); if(a<0.0) b=0.0;

else if((a<0.5) &&(a!=2.0) b=1.0/(a+2.0); else if(a<10.0) b=1.0/a; else b=10.0;

printf(―%f\\n‖,b); }

答案:0.500000 例6:请阅读下面的程序:

main( ) {

int s,t,a,b;

scanf(―%d,%d‖,&a,&b); s=1; t=1;

if(a>0) s=s+1; if(a>b) t=s+t;

else if(a==b) t=5; else t=2*s;

printf(―%d,%d‖,s,t); }

为了使输出结果t为4,输入量a和b应满足的条件是( )。

答案:b>a>0

例10:编写程序给出一百制成绩,要求输出成绩等级‘A‘、‘B’、‘C’、‘D’、‘E’,90分以上为A,80-89分为‘B’,70-79为‘C’,60-69为‘D’,60分以下为‘E’。

专升本C语言历年考试题及答案

main() {int score;

scanf(―%d‖,&score); switch(score/10) {case 10:

case 9:printf(―等级是A‖);break; case 8: printf(―等级是B‖);break; case 7: printf(―等级是C‖);break; case 6: printf(―等级是D‖);break; default: printf(―等级是E‖);break; } }

第四章 模块化程序设计

一、函数 1、C程序结构

一个简单的函数调用例子。

main()

{printstar();

print_message(); printstar(); }

printstar() {

printf(―**************************\\n‖); }

print_message() {

printf(―How do you do!\\n‖); } 说明:

①用C语言编写函数至少要编写一个main()函数,执行C程序就是执行相应的main()函数,调用其他函数后流程回到main函数,在main函数中结束整个程

专升本C语言历年考试题及答案

序的运行。

②一个C程序可由一个主函数和若干个函数组成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。

③所有函数都是平行的,即在定义函数时互相独立的,一个函数并不从属于另一个函数,即函数不能嵌套调用

④从用户使用的角度看,函数有两种:标准函数,用户自定义函数。 ⑤从函数的形式看,函数分两类:无参函数、有参函数。 例1:以下正确的说法是( )建立函数的目的之一是: A)提高程序的执行效率 B)提高程序的可读性 C)减少程序的篇幅 D)减少程序文件所占内存 答案:B

例2:以下正确的说法是( )

A)用户若需调用标准库函数,调用前必须重新定义

B)用户可以重新定义标准函数,若如此,该函数将失去原有含义 C)系统根本不允许用户重新定义标准库函数

D)用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,系统自动去调。

答案:B 2、函数的定义

函数定义就是在程序中设定一个函数模块。 例3:

main( ) {

double sum(int a,double b );/*函数声明*/

}

double sum(int a,double b) /*函数定义*/ {

/*函数体*/

}

注意:

专升本C语言历年考试题及答案

①函数名应符合C语言对标识符的规定。以字母或下划线开头,后跟字母、数字下划线的组合。

②形式参数写在函数后面的一对圆括号内,表示将从主调函数中接收哪些类型的信息,程序进行编译时,并不为形式参数分配存储空间。只有在被调用时,形式参数才临时地占有存储空间。

③函数返回值类型,如省略返回值类型系统默认为int型,对不需要使用函数返回值的函数,应定义为void类型。

④函数的外部性,函数不能嵌套,一个函数不能定义在别的函数内部。 3、函数声明

在主调函数中,要对在本函数中将要调用的函数事先作一声明。所谓“声明”是指向编译系统提供必要的信息:函数名,函数的类型,函数参数的个数,类型及排列次序。

①函数声明末尾要加;

②函数声明可以不写形参名,但必须写类型标识符。如上例中可以把声明改为:double sum(int ,double );但不能只写形式参名而不写类型如:double sum(a,b );

例4:若调用一个函数,且此函数中没有return语句,则正确的说法是() A)没有返回值

B)返回若干个系统默认值

C)能返回一个用户所希望的函数值 D)返回一个不确定的值 答案:D

例5、C语言规定,函数返回值的类型是由() A)return语句中的表达式类型决定 B)调用该函数时的主调函数类型所决定 C)调用该函数时系统临时决定

D)在定义该函数时所指定的函数类型所决定 答案:D

例6、下面函数调用语句含有实参个数为() func((exp1,exp2),(exp3,exp4,exp5));

专升本C语言历年考试题及答案

答案:2

例7、若输入的值是-125,以下程序的运行结果是( )。 #include ―math.h‖ main() { int n;

scanf(―%d‖,&n); n=fabs(n); fun(n); }

fun(int n) {

int k,r;

for(k=2;k<=sqrt(n);k++) {

r=n%k;

while(r==0)

{ printf(―%d‖,k); n=n/k; if(n>1) printf(―*‖); }

}

if(n!=1) printf(―%d\\n‖,n); }

答案:-125=-5*5*5

例9、以下正确的函数定义形式是( )。 A)double fun(int x,int y) B)double fun(int x;int y) C)double fun(int x,int y); D)double fun(int x,y); 答案:A

例10、以下正确的函数形式是()。 A)double fun(int x,int y)

{z=x+y;return z;}

B)fun(int x,y)

{int z; return z;}

C)fun(int x,int y)

{int x,y;double z; z=x+y;return z;}

D)double fun(int x,int y)

{doble z;

z=x+y;return z;}

专升本C语言历年考试题及答案

答案:D

4、函数的传值调用

参数是函数调用时进行信息交换的载体,关于形参与实参的说明: ①在定义函数中指定的形参,在未出现函数调用时,它们并不占用内存中的存储单元。只有在函数调用时,函数中的形参才被分配内存单元,形参与实参各占一个独立的存储空间,函数返回时,临时存储区被撤销。

②在被定义的函数中,必须指定形参的类型,实参可以是常量、变量或表达式,但要求它们有确切的值。实参与形参的类型应相同或赋值兼容。

③ C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实能。

例11、 main( ) {

int a=3,b=5;

void swap(int x,int y); swap(a,b);

printf(―%d,%d‖,a,b); }

void swap(int x,int y) {int temp;

temp=x;x=y;y=temp; } 输出结果:3,5

例12、以下正确的说法是()。 在C语言中,

A)实参与其对应的形参各占用独立的存储单元。 B)实参和与其对应的形参共占用一个存储单元

C)只有当实参和与其对应的形参同名时才共占用存储单元。 D)形参是虚拟的,不占用存储单元。 答案:A

例13、以下不正确的说法是()。 C语言规定

A)实参可以是常量、变量或表达式 B)形参可以是常量、变量或表达式

专升本C语言历年考试题及答案

C)实参可以为任意类型

D)实参类型应与其对应形参的一致 答案:B

5、函数的递归调用

在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

例14、用递归方法计算n!的函数rfact( )。假设n为正数。

求n!可以用递推方法,即从1开始,乘2,再乘3……一直乘到n。这种方法容易理解,也容易实现。递推法的特点是从一个已知的事实出发,按一定规律推出下一个事实,再从这个新的已知的事实出发,再向下推出一个新的事实。

float rfac1(int n) { int i; float t;

for(i=1;i<=n;i++) t=t*I; return(t); }

求n!也可以用递归方法,即5!=5*4!,而4!=4*3!,3!=3*2!,2!=2*1!,1!=1,可用下面的递归公式表示。

=1 n=1 rfact(n)

=rfact(n-1)*n n>1 long rfact(int n) {

if( n<=1)

return(1); else

return(n*rfact(n-1)); }

分析:递归总是由两部分组成的: ①递归方式 ②递归终止条件 例15、求1/n!

①递归方式 n>1 f15(n)=f15(n-1)*1/n

专升本C语言历年考试题及答案

②递归终止条件 n=1 f15=1 double f15(int n) {

if(n==1) return(1); else

return(f15(n-1)*1/n); }

例16、s=1+1/2+1/3+…….+1/n

①递归方式 n>1 f16(n)=f16(n-1)*1/n ②递归终止条件 n=1 f16(n)=1 double f16(int n) {

if(n==1) return(1); else

return(f16(n-1)+1/n); }

例17、s=1-1/2+1/3-1/4+…..1/n 精确到10-6 ①递归方式 n>1 f17(n)=f17(n-1)±1/n ②递归终止条件 n=1 f17(n)=1 double f17(int n, int flag) {

if(n==1) return(1); else

return(f17(n-1,-flag)+1/n*flag); }

main()

{int n,flag;

scanf(―%d‖,&n);

if (n%2==0) flag==-1; else flag==1;

printf(―%lf‖,f17(n,flag)); }

例18、以下程序的功能是用递归法计算学生的年龄,已知第一位学生年龄最小,为10岁,其余学生一个比一个大2岁,求第5位学生的年龄。

①递归方式 n>1 f18(n)=f18(n-1)+2 ②递归终止条件 n=1 f18(n)=10

专升本C语言历年考试题及答案

int f18(int n) {

if(n==1)

return(10); else

return(f18(n-1)+2); }

例19、求u,v两数的最大公约数

①递归方式 v!=0 f19(u,v)=f19(v,u%v) ②递归终止条件 v==0 f19(u,v)=u int f19(int u,int v) {

if (v==0) return(u); else

return (f19(v,u%v)); }

例20、兔子繁殖问题、牛群繁殖问题

①递归方式 n>1 f20(n)=f20(n-1)+f20(n-2) ②递归终止条件 n=1 f20(n)=1 n=2 f20(n)=1 int f20(int n) {

if(n==1) return(1); else if(n==2) return(1); else

return(f20(n-1)+f20(n-2)); }

21、写出计算

Ackermann

函数

ack(m,n)的递归函数。m>=0,n>=0,Ack(m,n)定义为: ack(0,n)=n+1 ack(m,0)=ack(m-1,1)

ack(m,n)=ack(m-1,ack(m,n-1))

①递归方式 n>1 ack(m,n)=ack(m-1,ack(m,n-1)) ②递归终止条件 n=0 ack(m,n)=ack(m-1,1)

对于

专升本C语言历年考试题及答案

m=0 ack(m,n)=n+1

double ack(int m,int n) {

if(m==0)

return(n+1); else if(n==0)

return(ack(m-1,1)); else

return(ack(m-1,ack(m,n-1))); }

例22、分别写出Hermite多项式Hn(x)的值的递推和递归函数。Hn(x)定义如下:

H0(x)=1 H1(x)=2x

Hn(x)=2xHn-1(x)-2(n-1)Hn-2(x) 递推法:

double h1(int n,float x) {

float s1=1,s2=2*x,s3; int i;

if(n==0) return(1);

else if(n==1) return(2*x); else

{ for(i=2;i<=n;i++)

{s3=2*x*s2+2*(n-1)*s1; s1=s2; s2=s3;

}

} }

递归法:

①递归方式 n>1 h(n,x)=2*x*h(n-1,x)-2*(n-1)*h(n-2,x) ②递归终止条件 n=0 h(n,x)=1 n=1 h(n,x)=2*x double h1(int n,float x) {

if(n==0) return(1);

else if(n==1) return(2*x);

else return(2*x*h(n-1,x)-2*(n-1)*h(n-2,x)); }

专升本C语言历年考试题及答案

例23、求a的平方根 递推法:

double sq_root(double a) { double x; x=a;

while(fabx(x*x)-a)>=1e-6) x=(x+a/x)*0.5; return(x); } 递归法:

①递归方式 fabx(x*x)-a)>=1e-6 sqroot(x,a)=sqroot((x+a/x)*0.5,a) ②递归终止条件 fabx(x*x)-a)<1e-6 sqroot(x,a)=x double sqroot(double x,double a) {

if(fabs(x*x)-a<1e-6) return(x); else

return(sqroot((x+a/x)*0.5,a)) }

例24、求一个给定数字的所有质因子,如72=2*2*2*3*3 递推法:

void yizi(int n) {int i=2,flag=0; while(n!=1) {

if(n%i==0) {

if(flag==0) {printf(―%d=%d‖,n,i); flag=1; } else printf(―*%d‖,i); n=n/i; }

else i=i+1; } } 递归法:

void yizi(int n,int i,int flag) {if (n!=1) {

if(n%i==0)

{

if (flag==0) {printf(―%d=%d‖,n i); flag=1;}

专升本C语言历年考试题及答案

}

例24、用递归法将一个整数n转换成字符串 void conver(int n) {int i;

if(i=n/10)!=0) convert(i);

putchar(n+‘0‘); }

二、变量的存储属性 1、动态变量

动态变量是C程序中使用最多的一种变量,在程序执行过程中自动进行建立和撤销,它们存在于程序的局部,也只在这个局部中可以使用,这种变量称为动态变量,动态变量有两种:自动(auto)变量和寄存器(register)变量。

在一个函数内部定义的变量是局部 例25:

main() { int x=1; {

void prt(void); int x=3; prt( );

printf(―x=%d\\n‖,x); }

printf(―x=%d\\n‖,x); }

void prt(void) {

int x=5;

printf(―x=%d‖,x); } 注意:

1、系统在程序执行过程中动态建立动态撤消,在赋值前它的值是不确定的。 2、局部可用。

else printf(―*%d‖,i);

yizi(n/i,i,flag); } else

yizi(n,i+1,flag); }

专升本C语言历年考试题及答案

3、外层的变量被内层的同名变量屏蔽。 例26:以下正确的说法是()

如果在一个函数中的复合语句中定义了一个变量,则该变量( ) A)只在该复合语句中有效 B)在该函数中有效 C)在本程序范围内均有效 D)为非法变量

例27:以下正确的说法为( )

A)在不同函数中可以使用相同名字的变量 B)形式参数是局部变量

C)在函数内定义的变量只在本函数范围内有效

D)在函数内的复合语句中定义的变量在本函数范围内有效 2、寄存器变量 register

通常把使用频率较高的变量定义为寄存器变量。 3、静态变量 static 注意:

①在编译时为其分配空间,如不赋初值,初值为0。 ②局部可用或全局可用。 ③静态变量具有可继承性。 4、外部变量

在一个文件中,定义在所有函数之外的变量称为外部变量。 注意:

①在编译时为其分配空间。 ②全局可用。

③限定本文件的外部变量只在本文件使用

static int a=3; main( ) { }

④将外部变量的作用域在本文件范围内(或在其它文件)扩充。 extern

专升本C语言历年考试题及答案

三、编译预处理 注意:

①编译预处理是在编译前对源程序进行的一些预加工。 ②C语言 的预处理命令均以“#”开头,末尾不加分号 ③编译预处理命令可以出现在程序中的任何位置 1、宏替换 ①字符串宏替换 ②带参的宏替换 注意:

①宏名与宏体之间应以空格相隔 ②宏名不能用引号

③较长的定义在一行写不下时,可在末尾加 \\。

④对带参宏定义时、宏休及其各个形参应用括号括起来。 2、文件包含

格式1:#include“文件标识” 格式2:#include<文件名>

例28:以下叙述中不正确的是() A)预处理命令行都必须以#开头

B)在程序中凡是以#号开头的语句行都是预处理命令 C)C程序在执行过程中对预处理命令行进行处理 D)以下是正确的宏定义

#define IBM_PC

例29:以下叙述中正确的是()

A)在程序的一行上可以出现多个有效的预处理命令行 B)使用带参的宏时,参数的类型应与宏定义时的一致 C)宏替换不占用运行时间,只占编译时间 D)在以下定义中C R是称为“宏名”标识符 #define C R 045

例30:设有以下宏定义: #define WIDTH 80

本文来源:https://www.bwwdw.com/article/crpx.html

Top