专升本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 { 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 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
正在阅读:
专升本C语言历年考试题及答案501-06
西安财经学院12级重点企业资源管理(ERP)B卷 - 图文09-19
新闻好标题集锦01-23
2018-2024年中国干手机市场深度分析与前景发展战略规划研究报告(05-21
法律知识础上论制定中国行政程序法的宪法基01-20
机组投产试验措施08-12
网络培训考试答案(最全)05-01
蓝田县玉山镇产业发展规划11-02
阴、阳离子交换器大修措施10-20
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 考试题
- 专升本
- 历年
- 答案
- 语言
- 专业技术人员继续教育《物联网》、《中西方绘画鉴赏与摄影》试题及答案
- 竞争性谈判投标文件格式
- 小学对外协议、合同法律审查制度
- 经济学知识要点(考试)
- 新-杂物电梯定检自检报告 - 图文
- 城市商业银行高峰论坛实录全文 - 最新城商行竞争态势
- 人教版七年级下册英语期中考试英语试卷 - 图文
- 2011年广西公务员考试申论真题
- 浅谈老年糖尿病病人的社区护理
- 黑人维权运动
- 微电子工艺技术 复习要点4-6
- 《教师法》《未成年人保护法》试题及答案
- 2011年工作总结
- 广西旅游业发展基本情况
- 2014年泰安市中考物理模拟试题一
- 征文演讲学校庆建国60周年迎世博优秀演讲稿
- 2014年中考化学真题及答案-湖北宜昌化学
- PB-串行接口
- 小区沥青混凝土路面施工方案
- 中国共产党的性质