目录
一、 二、 三、
前言................................................................................................................... 2 福建省高等学校计算机应用水平等级考试考试大纲............................................. 3 理论习题............................................................................................................ 6 1. 第一章..................................................................................................... 6 2. 3. 4. 5. 6. 7. 8.
四、
第二章(略) .......................................................................................... 7 第三章 数据类型、运算符和表达式 ......................................................... 7 第四章、第五章 程序控制结构(分支、循环语句) .............................. 13 第六章 数组(数组概念、二维数组、字符数组).................................... 19 第七章 函数 .......................................................................................... 23 第八章 善于利用指针 ............................................................................ 24 第九章 第十章(结构体、共用体、文件及其他) .................................. 27
9. 宏、预处理命令、位运算及其他 ............................................................ 30 章节编程训练................................................................................................... 31 1. 数据类型、运算符与表达式 ................................................................... 31 2. 分支语句编写程序,使其计算以下分段函数 .............................................. 33 3. 循环 ...................................................................................................... 34
五、
4. 指针与数组............................................................................................ 43 真题训练.......................................................................................................... 56 1. 2. 3.
编程题................................................................................................... 57 填空题: ............................................................................................... 69 改错题: ............................................................................................... 80
1
一、 前言
C是最常见的一种高级程序设计语言,高等院校理工科专业都开设“C程序设计”课程作为程序设计入门语言。为此,福建省高校计算机水平考试委员会将其列入福建省高等院校计算机应用水平等级考试(二级C)考试科目,旨在让学生初步掌握程序设计的方法,为今后学习其他计算机课程打下基础,也为今后工作打下计算机应用基础。
目前,以Turbo C为平台介绍各种算法、试题解答的书还不多。笔者从2005年担任诚毅学院工科类专业的“C程序设计”课程教学,多年来注意搜集、整理、编写Turbo C有关的算法例题、试题解答,在课堂上进行融通讲解,系统地从数值处理、图形输出、数据处理、过程模拟、算式求值、文件(字符、)指针处理、数字组合、图形设计八个方面详细地介绍算法例题、试题解答程序,着重培养学生分析问题、解决问题、调试纠错的能力,让学生在扩大计算机知识面的同时,提高实际编程能力、操作能力。
本习题册专为非计算机专业学生编写,主要强调学生实际动手编程能力的培养。本学期要求学生达到以下水平:
1-9章要求学生掌握理论的基础上自己设计程序; 10章以后要求学生理解知识点,能够读懂程序。
编写仓促,错误之处难免,欢迎指正。
2
二、 福建省高等学校计算机应用水平等级考试考试大纲
二级(C语言)
I、考试目的
本考试考查考生以下知识与能力:
1.掌握C语言的基本概念和语法知识;
2.了解C语言程序与函数的结构特点,主函数及程序执行流程;
3.正确使用顺序、选择、循环三种结构,具有结构化程序设计的能力; 4.掌握常用算法,能运用算法描述工具——流程图;
5.能使用Turbo C集成开发环境,完成源程序的编写、编译,运行与调试程序;
6.具有综合运用以上知识编写程序,解决计算与数据处理类问题的初步能力。
II、考试内容
一.C语言基础
1.C语言特点(识记);
2.C语言程序基本组成(识记):
C语言程序的结构与主函数,程序的书写格式与规范; 3.基本数据类型:
标识符与基本数据类型(识记), 常量与变量(领会), 内存的概念(识记);
4.基本输入、输出函数(领会): 格式输入和格式输出函数, 非格式化输入、输出函数;
5.运算符与表达式(简单应用):
算术运算,增1与减1运算,关系运算,逻辑运算,条件运算, 位运算,赋值运算,类型转换,逗号运算,长度运算符, 运算符的优先级与结合性。 二.程序控制结构
1.C语言的语句(识记):
C语言语句的语法及书写规范; 2.顺序结构(领会):
程序设计的流程图,程序控制结构中的顺序结构,复合语句; 3.分支结构(简单应用):
if结构、if结构的多种形式,switch 结构与多分支结构;
3
4.循环结构(综合应用):
当型循环,直到型循环,break语句与continue语句。 三.构造型数据
1.数组(综合应用):
一维数组,字符数组,二维数组; 2.结构类型:
结构类型的概念,结构类型定义及结构变量说明,结构变量的使用(领会), 结构变量的初始化,结构数组的初始化(识记); 3.联合类型(识记):
联合类型的概念,联合类型定义和联合变量说明,联合类型的使用; 4.枚举型(识记):
枚举型的定义和使用枚举型变量; 5.typedef的用途(识记): 使用typedef定义新类型名。 四.指针
1.指针与指针变量(识记):
指针的基本概念,指针变量的定义,指针变量的赋值; 2.指针运算符(领会):
地址运算符与指针运算符、间接寻址; 3.指针与数组(简单应用):
指针与一维数组,移动指针及两指针相减运算,指针比较, 指针与字符串, 指针与二维数组;
4.指针数组与指向指针的指针(识记):
指针数组,定义指针数组,指针数组的应用,
指向指针的指针,定义指向指针的指针变量,指向指针的指针变量的应用; 5.指针与结构(领会):
指向结构变量的指针变量,指向结构数组的指针变量。 五.函数
1.常见的系统库函数(识记): 输入、输出函数(stdio.h): printf, scanf, getchar, putchar, puts,gets; 字符与字符串函数(string.h):strcpy, strcat, strcmp, strlen; 简单数学函数(math.h):sqrt, fabs, sin, cos, exp, log, log10, pow; 2.用户自定义函数(简单应用):
函数定义、调用和说明,函数返回值,函数参数; 3.函数之间的数据传递(领会):
函数数据按数值传递,函数数据按地址传递,
利用函数返回值和外部变量进行函数数据传递,结构变量作为函数参数传递;
4.函数的嵌套调用及递归调用(领会): 函数的嵌套调用、函数的递归调用; 5.局部变量与全局变量(识记):
4
局部变量与全局变量的定义、初始化及作用范围; 6.变量的存储类型与变量的初始化(领会): 局部变量与全局变量的生存期,
静态变量与动态变量的定义、初始化、作用范围及生存期; 7.编译预处理(领会): 文件包含,无参宏定义。 六.文件
1.文件的基本概念,C语言中的两种文件(识记);
2.文件的打开、关闭和文件结束测试,文件的读写,文件的定位(识记)。 七.算法与编程(综合应用)
1.用C表达式或函数计算相对应的数学表达式; 2.连加与连乘的计算,级数的计算; 3.冒泡法排序与选择法排序; 4.矩阵的简单运算与显示; 5.字符串操作; 6.文件编程应用。
八.使用Turbo C集成开发环境调试程序 1.源程序的编写、编辑与改错(领会); 2.集成环境下的求助Help(识记);
3.程序的编译与目标代码的生成(识记); 4.程序的调试(综合应用):
单步运行程序,运行到光标处,断点设置,变量内容的跟踪、显示与修改; 5.了解Turbo C程序的常见错误提示(识记)。
Ⅲ、考试说明
一.考试形式
采用无纸化上机考试;
考试环境: Windows XP 简体中文版,
Turbo C 2.0或以上集成环境(IDE); 考试时间: 90分钟。 二.试卷题型结构
1.选择题(20小题) 40%; 2.程序改错题(2小题) 20%; 3.程序填空题(2小题) 20%; 4.编程题(2小题) 20%。
5
三、 理论习题 1. 第一章
1. C语言的函数体由(
)括起来。
C) []
D) ()
A) <> B) {} 2. 下面叙述错误的是()
A) 一个C源程序可由一个或多个函数组成 B) 构成C语言源程序的基本单位是语句
C) C源程序中大、小写字母是有区别的 D) 若一条语句较长,可分写在下一行或多行上 3. 下面叙述正确的是()
A) 每行最多只能写两条语句
B) main()函数必须位于源程序文件的开头 4. C源程序中main()函数的位置()。
A) 必须位于程序的最前面 B) 必须在自定义函数前面
5. main()函数的位置()
A) 必须位于用户自定义函数的前面
C) 所有语句都必须以分号;结束 D) 程序中必须含有自定义函数 C) 必须在系统库函数后面 D) 可以在自定义函数后面
B) 必须位于程序文件的最前面
C) 可位于用户字定义函数之前,也可位于用户自定义函数之后 D) 必须位于用户自定义函数的后面 6. 结构化程序设计不包括( )。
A) 最优化 B) 自顶而下,逐步细化
7. ( )是结构化程序设计应遵循的原则
A) B) C) D)
C) 模块化设计 D) 结构化编程
根据需要可使用嵌套基本控制结构表示程序逻辑
应使用顺序、选择、循环三种基本控制结构表示程序逻辑 选用的控制结构可有多个入口和一个出口 为提高程序效率,应尽量使用goto语句
C) 高级语言、字软语言和伪代码 D) 汇编语言、高级语言和低级语言
8. 描述一个算法可以有不同的方式常见的有() A) 机器语言、汇编语言和高级语言 B) 自然语言、流程图和伪代码 9. 下列叙述正确的是()
A) 花括号“{}“只能用作函数体的定界符
B) 注释部分可在C源程序单独占一行,也可以跟在一行语句后面 C) 分号是C语句之间的分隔符,并不调试一条语句的结束 D) 函数是C源程序的基本单位,所有函数名都可以由用户命名 10. 下面叙述错误的是()
A) 语句是构成C语言源程序的基本单位 B) 所有语句都必须以分号“;”结束
11. 能将C源程序转换为目标程序的软件是()
A) 编译程序
C) C语言源程序必须包含一个main()函数 D) 注释部分在程序编译和运行时不起作用 C) 解释程序
6
B) 汇编程序 D) 编辑程序
12. 下面叙述中,( )不是结构化程序设计中的三种基本结构之一。
A) 数据结构 B) 选择结构 C) 循环结构
D) 顺序结构
2. 第二章(略)
3. 第三章 数据类型、运算符和表达式
1. ( )为合法的常量。 A) 5,236
B) 1.23E+8
2. 下列合法的浮点数的是()
A) .66 B) 123 3. 下列()是不正确的常量形式; A) ‘x5’ B) 1.6E6 4. ( )为正确的用户标识符。 A) min-5 B) max_at 5. 下列()是不合法的用户标识符 A) Div B) _f6 6. 合法的用户标识符是() A) 0.6f B) _struct 7. 正确的常量是() A) ‘a3’ B) “\\0” 8. 整型常量没有()形式
A) 十六进制
B) 十进制 9. 不合法的长整型常量是()
A) 1E10 B) 0L
10. 以下( )是正确的变量名。
A) a.bee
B) -p11
11. 以下( )是正确的变量名。
A) 5f
B) if
12. 以下( )是正确的常量。
A) E-5
B) 1E5.1
13. 以下( )是不正确的字符串常量。
A) 'abc'
B) \
14. 以下( )是正确的字符常量。
A) \
B) '\\\\'
C) ‘b_k’ D) 3.21E-6.5
C) 2E0.5 C) 1E-2 C) 3_row C) _num C) for C) 1E6.1 C) 二进制 C) 6246245 D) (Long)6246245
C) int
C) f.5
C) 'a12'
C) \
C) 'W' 7
D) E2
D) “\\0”
D) union
D) 5x
D) 5d
D) E-3
D) 八进制
D) p_11
D) _f5
D) 32766L
D) \
D) \
15. ( )为非法的字符串常量
A) “056”
B) ?123?
C) “
“
16. 下列不合法的字符常量是()
A) ‘\\\\’ C) ‘\\t’ B) “a”
D) ‘\\n’
17. char型变量存放的是( )。
A) ASCII代码值
C) 十进制代码值 B) 字符本身
D) 内码值
18. ()为正确的字符常量
A) ‘\\084’
B) ‘bcd’ C) ‘165’ 19. ()运算符不能用于非整型数据运算
A) /
B) %
C) *
20. 下列运算符中,优先级最高的是()
A) != B) &&
C) + 21. 若有定义:int b=-15;则()为正确的赋值表达式。 A) *b=6 B) b=*5 C) b+10=-5 22. 若有定义:float x=2,y; int a=3 ;语句y=1*(x+a)/3;运行后,y的值为( )。A) 2.0 B) 1.666667 C) 1.0 23. 若有定义:int a,b=5;语句a=(b/2)+b%2;运行后,a的值为(
)
A) 3
B) 4
C) 0
24. 若已经定义:int i,j,k; double x;则下列表达式中语法正确的是()
A) j+=(k=4)*j C) i=k+2j B) x%5
D) j+2=k
25. 若已定义:int n=10,i=4;则赋值运算n%=i+1执行后,n的值是()。
A) 1
B) 0
C) 2
26. 若已定义int k=5;float d=3.5;则表达式d+k%3/2的值为()
A) 4.5 B) 3.5 C) 4 27. 下面叙述正确的是( ) A) 2/3与2%3等价 C) ++2与- -3等价 B) 5/(int)4.0与5/4等价
D) ++2与3等价
28. 若有定义:int a,b=6;语句a=--b;运行后,a、b的值分别是()。
A) 6 6 B) 5 6 C) 5 5 29. 若有定义:int i=3,j=6;则表达式(--i)*(j++)的值为( )。
A) 10
B) 18
C) 15
30. 若已经定义:int i=5,j;则语句j=(++i)+(i--);运行后的j的值为() A) 11 B) 9 C) 10 31. 若已经定义:int x,y,z;则()是不正确。
A) x=y+=10*x;
B) x=10,y=6;
C) x=2.5;
8
D) “case”
D) ‘@’
D) ++
D) ++
D) b+=b*3
D) 0
D) 2
D) 3
D) 5.5
D) 6 5
D) 12
D) 12
D) z=y+x=30
32. 若已经定义: double x;下列可以用于求x的绝对值的数学函数是()
A) fabs(x)
B) sqrt(x)
C) abs(x)
33. 已知int a='R'; 则正确的表达式是( )。
A) a=int(3e2)
C) a=a+a=a+3
B) 2*a=a++
D) a
34. 已知char a='R'; 则正确的赋值表达式是( )。
A) a=(a++)%4
B) a+2=3
C) a+=256--
35. 语句a=(3/4)+3%2;运行后,a的值为( )。
A) 0
B) 1
C) 2
36. 设整型变量a为5,使b不为2的表达式是( )。
A) b=(++a)/3
B) b=6-(--a)
C) b=a%2
37. 设单精度型变量f、g的值均为2.0,使f为4.0的表达式是( )。
A) f+=g
B) f-=g+2
C) f*=g-6
38. 若有定义:int k,i=2,j=4;则表达式k=(++i)*(j--)的值是( )。
A) 8
B) 12
C) 6
39. 若有定义: int a=3;语句a+=a-=a*a;运行后,a的值为()
A) -6
B) 0
C) -12
40. 若有定义:int b=-15; 则()为正确的赋值表达式。
A) b=*5
B) *b=6
C) b+10=-5
41. 下面叙述正确的是( )。
A) 2/3 与 2.0/3.0 等价 C) ++5 与 6 等价B) (int)2.0/3 与 2/3 等价
D) 'A'与\等价
42. 若有定义int x=1,y=2,n=3;则()为正确的表达式。
A) x=y*3,y=(x+n)/y C) float(y/n)
B) (x+y)(y+n)
D) x=ny
43. 若有定义:float x=3.5;int z=8;则表达式 x+z%3/4 的值为( )。 A) 3.75 B) 3.5 C) 3 44. 若有定义:float x=3.5,y=3.6,则表达式()的值为6。 A) (int)x+(int)y C) int(x+y) B) (int)(x+y) D) x+y 45. 下面叙述正确的是()。
A) (3+9)++是正确的表达式
B) “abc”+”xxx”是正确表达式
C) c语言中整型与字符型变量的混合运算表达式的结果是整型 D) 模运算符%两边运算数的数据类型是任意的
46. 下列四个运算符,按优先级别由高到低排列的是()
A) !、%、=、== C) !、%、==、= B) %、!、==、= D) !、=、%、==
9
D) labs(x)
D) a='\\078'
D) 3
D) b=a/2
D) f/=g*10
D) 9
D) -3
D) b+=b*3
D) 4
47. 若已定义:int x=3,y=2;则下列不正确的赋值表达式是()
A) x-=x+=y; C) x-y=1;
B) x=y+2
D) x=2,y=2;
48. 若有定义:int x;char c=?A?;则正确的赋值表达式是().说明‘A’的ASCII码的十进制值为65,‘a’的ASCII码的十进制值为97 A) x=c+’ABC’ C) x=c+’CBA’ B) x=c+32 D) x=’ABC’ 49. 若有定义:char c1=?A?,c2=?B?;语句printf(“%d+%d=%d”,c1,c2,c1+c2); 运行后的结果为()。说明:‘A’的ASCII码的十进制值为65 A) 65+65=AB B) A+B=131 C) 65+66=131 50. 下面叙述错误的是()。 A) 算术运算符中只有“*”、“/”优先级高于关系运算符 B) 模运算符“%”是C语言基本的算术运算符
C) 算术运算符中不包含“=”运算符
D) 自加和自减运算符只能用于变量,而不能用于常量或表达式 51. 下面关于算术运算符的叙述,错误的是( )。
A) %(模运算符)的运算对象只能为整型量
B) 算术运算符的结合方向是\自左至右\C) 自加和自减运算符的结合方向是\自右至左\D) 其运算对象不包含函数
52. 若已定义:int x=11;double y=3.5;则表达式y/2+x%2/2的值是()
A) 3.5 B) 1.0 C) 1.5 53. 若已经定义:int x=2,y;则执行语句y=x%2+(--x);后y的值是() A) 0 B) 3 C) 1
54. 若已经定义:double x=3,y;int z=2;则语句y=(x+z)/2*z;执行后,y的值为() A) 4.0 B) 1.0 C) 1.25 55. 若已经定义:double x,y;则下列表达式不能正确计算(x-2)/3*y的是() A) (x-2)*y*1/3 C) y*(x-2)/3
B) y/3*(x-2)
D) (1/3)*(x-2)*y
56. 若已经定义:double x=2.5;则求x的平方的正确的函数调用是()
A) sqrt(x)
B) pow(x,2)
C) exp(x)
57. 若已经定义:double x;则 exp(x)+sqrt(x)/2所表示的数学式是(3)
10
D) A+B=AB D) 1.75
D) 2
D) 5.0
D) rand(2,x)
58. 对应代数表达式3a÷(b+c),C语言的表达式是()
A) 3*a\\(b+c)
B) 3a/(b+c)
C) 3*a/b+c D) 3*a/(b+c)
59. 若已经定义:double a,b,c;下列表达式中与(a-b)*c/2 计算结果不相符合的是()。
A) (a-b)*c/2 C) c/2*(a-b) B) (a-b)*c*1/2 D) (1/2)*(a-b)*c 60. 若已经定义:int a=1,b=2,c=2;则表达式(a+b)/1.0/c的值是() A) 0.0 B) 1.0 C) 1 61. 下面叙述正确的是( )。
A) 强制类型转换运算的优先级高于算术运算
B) 若a和b是整型变量,(a+b)++是合法的 C) 'A'*'B' 是不合法的 D) \是合法的
62. 若已定义:int x=2,y=4;则表达式(double)x/y+y%x的值是()
A) 2 B) 2.5 C) 0
63. 若已经定义:long int i; char c; double x;则表达式i*c+(int)x的结果的类型是() A) long int B) int C) double 64. 若已经定义:int n=2 ;double x=2.5;则下列表达式中不符合语法的是() A) (int)(x/n) C) (int)(x%n)
B) (int)x%n
D) (int)x/n
D) 1.5
D) 0.5
D) char
65. 若已经定义:int i=2,j=2;float x=2.5,y=3.5;则表达式(float)(i+j)/2+(int)x%(int)y的值为() A) 4.5 B) 4.0 C) 3.0 D) 3.5 66. 若有定义:float x=3.5,y=5.5;则表达式()的值为2. A) (int)x+y%7
B) (int)(x+y)%7
67. 若有定义:int x=2;则正确的赋值表达式是( )。
A) a-=(a*3)
B) double(-a)
C) int(x+y)%7 D) (x+y)%7
C) a*3 D) a*4=3
68. 若已经定义:int b=7;float a=2.5,c=4.0;则表达式a+(b/2*(int)(a+c))%4的值是()
A) 4.5 B) 5.5 C) 2.5 69. getchar()函数的功能是获取终端输入的( A) 一个字符 B) 多个字符 70. 只能向终端输出一个字符的是().
A) printf()函数 B) getchar()函数
C) scanf()函数 D) putchar()函数
)
C) 一个整型变量表达式 D) 一个实型变量值
D) 3.5
71. 若有定义int a=8,b=5;要实现输出形式为:8*5=40,正确的printf()函数调用语句是()
A) printf(“%d*%d=%d\\n”,a,b,a*b); B) printf(“a*b=%d\\n”,a*b); C) printf(“%d*%d=a*b\\n”,a,b);
11
D) printf(“a*b=a*b\\n”);
72. 若有定义float x;要从键盘输入数据6.02赋给x,则应选用()语句。
A) scanf(“%8.2f”,&x); B) scanf(“%4.2f”,&x); C) scanf(“%f”,&x); D) scanf(“%1.2f”,&x);
73. 若已定义:float f; char s[20];下列正确的输入语句是()。 注:参考数组章节知识
A) scanf(“%s%f”,s,f); B) scanf(“%c%f”,s,&f);
C) scanf(“%s%f”,s,&f); D) scanf(“%s%f”,&s,f);
74. 若有定义:int x=1234,y=123,z=12;则语句printf(\, z);运行后的输出结果为( )。
A) 123412312 C) 1234+1234+1234 B) 12341234123412341231231231212 D) 1234+123+12 75. 若有语句int a;char c;scanf(“=%c”,&a,&c);为将整数135赋给a,字符‘6’赋给c,正确的数据输
入方式是()。说明:
C) 1356
76. 已知 char a;使用scanf()函数输入一个字符给变量a,不正确的函数调用是( )。
A) scanf(\C) scanf(\
B) scanf(\
D) scanf(\
)
77. 要使用以下程序给三个整变量x1,x2,x3分别赋之值1,2,3,正确的数据输入格式是( int x1,x2,x3;
scanf(“%d,%d,%d”,&x1,&x2,&x3); A)1,2,3 B)1 2 3 C)1 2 3 D)123
78. 若已经定义:char c;则下列正确的输入语句是()
A) gets(c);
B) scanf(“%c”,c);
C) getchar(c);
D) scanf(“%s”,&c);
79. 若已经定义:int x=5,y=7;正确实现输出形式:5+7=12的语句是()
A) printf(“%d+%d=%d”,x,y,x+y); C) printf(“%d+%d=x+y”,x,y);
B) printf(“x+y=x+y”);
D) printf(“x+y=%d”,x+y);
80. 要使下列程序段输出的内容为123-123-45,正确的输入数据格式是() int i,j,k;
scanf(“%d%d%d”,&I,&j,&k); printf(“%d-%d-%d\\n”,i,j,k);
12
A) 12312345 B) 123 123 45 C) 123,123,45 D) 123,12345
81. 若有定义:int x,a;则语句x=(a=3,a+1);运行后,x、a的值依次为( )。
A) 3,3 B) 4,4
C) 4,3 D) 3,4
82. 若已经定义:int x; 则逗号表达式x=5,3+x,x=x*2的值是()
A) 15
B) 5 C) 10 D) 16
83. 语句x=(a=3,b=++a);运行后,x、a、b的值依次为( )。
A) 3,3,4
B) 4,4,3 C) 4,4,4 D) 3,4,3
84. 若有定义:int x,y,z;语句x=(y=z=3,++y,z+=y);运行后,x的值为()
A) 7 B) 3 C) 8
D) 6
4. 第四章、第五章 程序控制结构(分支、循环语句)
1. 若有定义:int a;则表达式( )不能用来判断a值为奇数是“真”,偶数是“假”
A) a%2==1 B) !(a%2==0)
C) a%2 D) !(a%2)
2. 若已经定义int x,y;则下列不能正确表示数学关系式|x-y|>5的表达式是( )
A) (x-y)>5 || (x-y)<-5
B) (x-y)<-5&&(x-y)>5 C) abs(x-y)>5 D) (x-y)*(x-y)>25
3. 判断char型变量C1是否为小写字母的正确表达式为( )
A) (‘a’>=c1)&&(‘z’<=C1) B) (c1>= ‘a’)&&( C1<= ‘z’) C) ‘a’<=c1<=’z’
13
D) (c1>= a)&&( C1<= z)
4. 若已定义:int a=0,b=1;则下列表达式值为真的是( )
A) a!=0||b!=1
B) a++&&b++
C) (a=0)&&(b=1) D) a==1||a!=1
5. 若已经定义: int x=2,y=3;则下列表达式值为假的是( )
A) x&&y
B) x>y||x 6. 若有定义:int a;且表达式!a的值为0,则表达式( )的值为1. A) a= =0 B) a=0 C) !(a<0||a>0) D) a!=0 7. 若有定义:int a=1,b=2,c=3,d=4,t=2,k=2;语句(t=a C) 0 D) 1 8. 若已定义:int a=3,b=4,c=5;则下列表达式中值为0的是( ) A) a||b+c&&b-c B) a<=b C) !((a 9. 能正确表示a和b同时为正或同时为负的逻辑表达式是( ) A) a*b>0 B) (a+b>0)&&(a+b<0) C) (a>0||b>0)&&(a<0||b<0) D) (a>0&&b>0)&&(a<0&&b<0) 10. 若已定义int x=5;则下列程序段的运行结果是( )。 if((x--)<5) printf(“%d\\n”,x); else printf(“%d\\n”,x++); A) 5 B) 4 C) 6 D) 3 11. 下列程序段的运行结果是( )。 int k=8; 14 。 ) switch(k%5) { default: printf(“DD”) ; case 1: printf(“AA”); break; case 2: printf(“BB”); case 0: printf(“CC”); } A) AA B) DD C) CC D) DDAA 12. 下列程序段运行后sum的值为( )。 int i=8,sum=0; while((i--)>=5) {sum+=2;} A) 10 B) 6 C) 8 D) 4 13. 若已定义int k=4,s=10;则下列程序段运行结果是( if (2*k>9) s=k+5; printf(\\); A) 13 B) 19 C) 10 D) 14 14. 下列程序段运行后m的值为( ) int i,j,m=0; for(i=1;i<=3;i++) for(j=2;j<=4;j++) m=m+i+j; A) 33 B) 30 C) 45 D) 27 15. 下列程序段运行后sum的值为( )。 int i=8,sum=0; 15 ) while((i--)>=5) {sum=sum+2; } A) 4 B) 6 C) 8 D) 10 16. 若已定义int k;下列( )语句与其他三条语句不等价。 A) if(k==0) printf(“Yes!\\n”); else printf(“No!\\n”); B) if(k==0) printf(“No!\\n”); else printf(“Yes!\\n”); C) if(k!=0) printf(“Yes!\\n”); else printf(“No!\\n”); D) if(k) printf(“Yes!\\n”); else printf(“No!\\n”); 17. 若已定义:int i=5,m=1;则( )语句不会产生无限循环。 A) while(i=1) m+=3; B) for( ; i>0; i--) m+=3; C) do{m+=3;}while(i==5); D) for( ;i<10; )m+=3; 18. 下列程序段运行时,语句k+=2;执行的次数是( )。 int i,k=0; for(i=7;i>3;i- -,i- -) k+=2; A) 1 B) 2 C) 3 D) 4 19. 叙述正确的是( )。 A) while循环体至少无条件执行一次,而do...while循环体可能都不执行 B) for循环中,不能用break语句跳出循环体 C) for循环中循环体可包含多条语句,但必须用{}括起来 D) while循环中,不能用break语句跳出循环体 20. 若已定义:int m=3,n=2,k;则下面正确的switch语句是( )。 A) switch(m+n) case 3: k=m+n; break; case 2: k=m-n; break; default: k=m*n; B) switch(m+n) {case is 3: k=m+n; break; 16 case is 5:k=m-n;break; default: k=m*n; } C) switch(m) {case m<0: k=m+n;break; case m==0: k=m-n;break; default: k=m*n; } D) switch(m+n) { case 3: k=m+n;break; case 2: k=m-n;break; default: k=m*n; } 21. 设有程序段 int h=8; while(h=0) h=h-2; 叙述正确的是(A) 循环语句执行1次 B) 循环语句执行3次 C) 循环体语句一次也不执行 D) 循环体语句执行4次 22. 以下程序段的运行结果是( )。 int a=-6,b; if(a>0) b=9; else if (a==0) b=0; else if(a<-5) b=-8; else b=-1; printf(\ A) -1 B) -8 C) 9 D) 0 23. 以下程序段运行后x的值为( )。 int i,x=1; for(i=3;i>0;i--) x=(x+1)*3; A) 54 B) 27 C) 66 D) 9 24. 以下程序段运行后m的值为( )。 int i,m=3; for(i=1;i<=3;i++) 。17 ) { m+=1; if(m%2!=0) break; m+=2; } A) 6 B) 7 C) 9 D) 8 25. 以下程序的运行结果是( )。 void main() { int s[5]={1},i; for(i=1;i<5;i++) s[i]=s[i-1]+i; for(i=0;i<5;i++) printf(\} A) 1 2 4 6 8 B) 1 2 3 4 5 C) 1 2 4 7 11 D) 1 2 6 10 15 26. 以下程序的运行结果是( )。 void main() {int k=5; switch(k) { default: printf(\ case 1: printf(\ break; case 2: printf(\ case 3: printf(\} } A) 5 B) 15 C) 10 D) 55 27. 以下程序段运行后m的值为( )。int i,m=1; for(i=1;i<=4;i++) { m+=1; if(m%2==0) continue; m+=2; } 18 A) 6 B) 5 C) 12 D) 9 5. 第六章 数组(数组概念、二维数组、字符数组) 1. 下列程序段的运行结果是( )。 int a[]={1,3,4,6,9},i,x=1; for(i=0;i<3;i++) x+=a[i+i]; printf(“%d\\n”,x); A) 15 B) 10 C) 9 D) 14 2. 下列程序段的运行结果是( )。 int a[]={8,7,6,5,4,3,2,1},i,sum=0; for(i=0;i<8;i++) if(i<=3) sum+=a[i]; else sum - = a[i]; printf(“%d\\n”,sum); A) 15 B) 16 C) 10 D) 0 3. 对二维数组arr初始化正确的是( )。 A) int arr[2][3]={{1,2},{3,4},{0}}; B) int arr[2][3]={{1,2},{3,4}}; C) int arr[2][]={1,2,3,4,5}; D) int arr[][]={{1},{3,4,5}}; 4. 下列程序的运行结果是( )。 void main() { int a[5]={2,3,5,11,4},b[5]={12,1,6,9,8}; int *pa=a,*pb=b; int i; for(i=0;i<5;i++) if(*(pa+i)<*(pb+i)) printf(“%d ”,*(pa+i)); } A) 11 B) 5 19 C) 2 D) 2 5 4 5. 下列程序段的运行结果是( )。 int a[]={0,1,2,3,4,5,6,7,8,9},i=0,t; while(i<=7) {t=a[i]; a[i]=a[i+2]; a[i+2]=t; i+=2; } for(i=0;i<10;i++) printf(“%d”,a[i]); A) 1357924680 B) 2468013579 C) 2143658709 D) 0123456789 6. 下列程序段的运行结果是( )。 int a[3][3]={1,2,3,4,5,6,7,8,9},i; for(i=0;i<3;i++) printf(“-”,10-a[2-i][i]); A) 9 5 1 B) 3 5 7 C) 7 5 3 D) 8 4 1 7. 若已定义char stra[50],strb[50];能正确从键盘读入字符串的是(A) scanf(“%s%s”,stra,strb); B) getch(str,strb); C) scanf(“%s%s”,stra[50],strb[50]); D) gets(strb,stra); 8. 下列程序定义的二维数组a的() #define M 3 #define N 4 void main() { int a[M][N]; ?? } A) 第一维和第二维都为3 B) 第一维为3,第二维为4 C) 第一维和第二维都为4 D) 第一维为4,第二维为3 9. 下列叙述正确的是()。 A) 数组中每一个原属都属于同一个数据类型; B) C语言中,数组长度在程序运行中可作动态调整; C) 可利用数组名引用数组的第一元素; 20 ) D) 定义数组时,若不加类型说明符则为整型; 10. 下列程序段的运行结果是( )。 char str[ ]={ ?Y?,?o?, ?u?, ?\\0?, ?a?, ?r?, ?e?, ?\\0?, ?w?, ?e?, ?l?, ?c?, ?o?, ?m?, ?e?}; puts(str); A) You are B) welcome C) You are welcome D) You 11. 若已定义:char str1[20]=”guangzhou”,str2[20]=”2010”;能形成字符串”GUANGZHOU 2O1O”的语句是()。 A) strcpy(str2,strupr(str1)); B) strcat(strupr(str1),str2); C) strcpy(strupr(str1),str2); D) strcat(str2,strupr(str1)); 12. 若已定义:char str[20]={“Good\\0morning”};则函数strlen(str)的值是() A) 12 B) 6 C) 4 D) 5 13. 下列程序段的运行结果是() char s1[7]=”abcdef”,s2[4]=”123”; strcpy(s1,s2); printf(”%s %c”,s1,s1[4]); A) 123 e B) abc C) abc e D) 123 14. 下列程序段的运行结果是( )。 int a[]={1,3,4,6,9},i,x=1; for(i=0;i<3;i++) x+=a[i+1]; printf(“%d\\n”,x); A) 15 B) 14 C) 9 D) 10 15. 若已定义:int a[][4]={{1,2},{3,4},{5,6,7},{8,9,10,11}};则a[2][2]的值为( )。 A) 4 B) 6 C) 7 D) 10 16. 给数组a所有元素赋初值0的语句是( )。 A) int a[9]=9*0; B) int a[9]={0}; C) int a[9]={ }; D) int a[9]=0; 17. 正确定义二维数组arr的语句是( )。 A) float arr[4][3]; B) float arr(4,3); C) float arr[4][ ]; D) float arr[4,3]; 18. 下列关于字符数组描述正确的是( )。 A) 字符数组只能存放字符串,不能存放单个字符 21 B) 只能利用赋值语句实现字符数组的整体赋值 C) 只能用len函数计算字符数组中字符串的长度 D) 可使用printf函数实现字符数组中字符串的输出,遇'\\0'字符结束 19. 以下程序的执行功能是( )。 void main() { int a[5]={66,78,82,53,91},b[5]={70,58,81,65,90},i,n=0; for(i=0;i<5;i++) {if(a[i]>b[i]) n++; } printf(\} A) 统计数组a各元素值等于数组b对应元素值的个数 B) 统计数组a各元素值小于数组b对应元素值的个数 C) 统计数组a各元素值大于60的个数 D) 统计数组a各元素值大于数组b对应元素值的个数 20. 若已定义int a[3][4]; 无法正确引用数组a元素的是( )。 A) a[1][5-2] B) a[0][3/2] C) a[2+1][3] D) a[2][1] 21. 使字符数组str正确存放字符串\的语句是( )。 A) char str[4]={'a','b','c','0'}; B) char str[3]={'a','b','c'}; C) char str[4]={'a','b','c','\\0'}; D) char str[ ]={'a','b','c'}; 22. 以下程序的运行结果是( )。 void main() { int a[2][3]={{1,3,5},{2,4,6}}; int i,*p; p=a[0]; for(i=0;i<=5;i++) printf(\printf(\} A) 1 3 5 2 4 6 B) 1 3 5 1 3 5 C) 2 4 6 1 3 5 D) 2 4 6 2 4 6 23. 若已定义int a[][4]={1,2,3,4,5,6,7,8,9,10,11};则表达式sizeof(a)/(sizeof(int)*4)的值为 ( )。 A) 数组a的元素个数 22 B) 数组a第二维长度 C) 数组a第一维长度 D) 数组a占用的字节数 24. 函数调用中,若实参为数组名,则传递给对应形参的是( )。 A) 数组中每个元素的值 B) 数组的长度 C) 数组的首地址 D) 数组中每个元素的地址 25. ( )是int a[9]={3,5,6,8,9};功能的正确描述。 A) 将5个初值依次赋给a[0]至a[4] B) 将5个初值依次赋给a[1]至a[5] C) 将5个初值依次赋给a[5]至a[9] D) 将5个初值依次赋给a[4]至a[8] 26. 若已定义int arr[][3]={1,2,5,6,8,9,11};则数组a第一维长度是( )。 A) 4 B) 3 C) 2 27. 若已定义 char b[20]=\ to meet you!\实现输出字符串\( )。 A) printf(\B) printf(\C) printf(\D) printf(\ 6. 第七章 函数 1. 对于无返回值的自定义函数,在定义时最好使用( )类型标识符 A) long B) float C) int 2. 下列叙述错误的是() A) 形参是变量名时,实参也只能是变量名,不可以是表达式 B) 定义函数的可以有参数,也可以没有参数 C) 函数的形参和对应的实参个数应相等,类型应相同或赋值兼容 D) 函数的形参在函数被调用前是没有确定值的 3. 下列叙述正确的是( )。 A) 函数的定义和调用都允许嵌套 B) 函数的定义和调用都不允许嵌套 C) 函数的定义不允许嵌套,但函数的调用允许嵌套 D) 函数的定义允许嵌套,但函数的调用不允许嵌套 4. 下列程序段中函数调用语句tnk((a,b),m+n);的实参值是( )。 int a=1,b=2,m=3,n=4; tnk((a,b),m+n); A) 2和3 B) 2和7 23 D) 5 you!\的语句是 D) void C) 1和7 D) 3和7 5. 叙述错误的是( )。 A)全局变量的作用域是从其定义处起至本程序结束处 B)函数内复合语句中定义的变量在该函数内有效 C)函数内定义的变量其有效范围不超出该函数 D)所有形参都是局部变量 6. 以下程序的运行结果是( )。 int fun(int k) { switch(k) { case 2: return 0; case 3: case 4: return 1; default: return 5; } return -1; } void main() { printf(\} A) 0 B) 1 7. 第八章 善于利用指针 1. 变量的指针,其值是该变量的( )。A) 值 B) 内存单元地址 2. 下列程序的运行结果是( )。 void fn(int *p,int n) {int j; for(j=0;j void main() {int a[5]={1,2,3,4,5}; int i; fn(a,5); for(i=0;i<5;i++) printf(“%d ”,*(a+i)); } A) 2 3 4 15 B) 11 12 13 14 15 C) 2 3 4 5 D) 2 3 4 5 C) C) D)24 -1 一个标志标识符 D) 5 3. 若已定义:int a[5]={1,2,3,4,5},*p=a;且p值未发生变化,下列不能表示a[1]地址的是( )。 A) p+1 B) a+1 C) a++ D) ++p 4. 下列程序的运行结果是( )。 void main() {int a[5]={2,3,5,11,4},b[5]={12,1,6,9,8}; int *pa=a,*pb=b; int i; for(i=0;i<5;i++) } if(*(pa+i)<*(pb+i)) printf(“%d ”,*(pa+i)); A) 3 11 B) 5 C) 2 5 4 D) 2 5. 若已定义:int a,b=5,*p=&a;与语句a=b;等价的是( )。 A) a=*p B) a=**p; C) a=&b; 6. 下列程序的运行结果是()。 void main ( ) {char str[]=”abcd”,*p=str; int i; while(*p) printf(\”,*(p++)); } A) cd B) bcd C) abcd D) *p=*&b; D) abc 7. 若已定义:int a=5,*p1=&a; float f=6.5,*p2=&f;则下列正确的赋值语句是()。 A) p2=p1; B) p1=&f; C) p2=&a; D) f=*p1+*p2; 8. 若已定义:int a[5]={1,2,3,4,5},*pa=a;下列叙述错误的是()。 A) a[2]与pa[2]的值相等 B) *(pa+2)与a[2]的值相同 C) pa与a的值相等 D) a++与pa++的作用相同 9. 下列程序运行的结果是()。 void main() {int a[]={1,2,3,4,5,7},*p; p=a; *(p+3)+=2; printf(“%d,%d\\n”,*p,*(p+3)); } A) 1,3 B) 1, 6 25 C) 1, 5 D) 1, 4 10. 若已定义:int a,b=5,*p=&a;与语句a=b;等价的是()。 A) *p=*&b; B) a=**p; 11. 下列程序的运行结果是()。 void main() {int a[5]={2,3,5,11,4},b[5]={12,1,6,9,8}; int *pa=a,*pb=b; int i; for (i=0;i<5;i++) } A) 2 5 4 B) 3 11 C) 2 D) 5 if(*(pa+i)<*(pb+i)) printf(“%d”,*(pa+i)); C) a=*p; D) a=&b; 12. 若已定义:int b=12,*p=&b;下列叙述错误的是( )。 A) *(&p)等价于b B) &(*p)等价于p C) *p等价于b D) b等价于*(&b) 13. 以下程序的运行结果是( )。 #include { char *str; str=\ is a Book\ str=str+8; while(*str) { putchar(*str); str++; } } A) This is B) Book C) a Book D) is a Book 14. 以下程序的运行结果是( )。 void main() { int a=5,b=6,c; int *p1,*p2; p1=&a; p2=&b; p1=p2; c=*p2+2*(*p1); printf(\ 26 } A) 17 B) 18 C) 16 D) 15 15. 以下程序段的运行结果是( )。 char str[]=\printf(\ A) retupmoC B) Computer C) C D) r 16. 若已定义:int a=5;*p1=&a; float x=11.6,*p2=&x;下列能实现正确赋值的语句是( )。 A) x=*p1+*p2; B) p2=a+x; C) p1=x; D) x=p1+p2; 8. 第九章 第十章(结构体、共用体、文件及其他) 1. 若已定义: struct teacher { int num; char name[20]; }t1,*p=&t1; 下列对结构变量t1成员num合法的引用是() A. teacher.num B. p->num C. *p.num D. t1->num 2. 若已定义: struct student { int num; float score; }stu[2]={{101,85.5},{102,90.0}},*p=stu; 下列对结构体数组引用错误的是() A. p->num B. stu[0].num C. (*p).num D. p[1]->num 3. 下列枚举类型的定义正确的是() A. enum a{x=-2,y=1,z=3} B. enum a{?A?,?B?,?C?} C. enum a={A,B,C} D. enum a={?A?,?B?,?C?} 4. 以下程序运行后,文件file1.txt的内容是(): ??????? #include fp=fopen(“file1.txt”,”w”); if(fp==NULL) return 0; else { fputs(“one”,fp); 27 rewind(fp); return 1; } } A. one B. two C. twoone D. onetwo 5. 若已定义: struct student { int num; float score; }stu[4]; 以下错误的语句是() A. *(stu)=*(stu+1) B. stu[0]=stu[1] C. printf(“%d”,(*stu).num) D. stu[0]->num=101 6. 以下程序段输出结果是() int a[5]={1,3,5,7,9},*p; p=&a[2]; printf(“%d”,*(++p)); printf(“%d”,p-a); A. 7 3 B. 9 4 C. 5 3 D. 7 4 7. 若已定义FILE *fp,则能向fp所指向文件写入hello这5个字符的语句是() A. fputc(“hello”,fp) B. fwrite(“hello”,5,fp) C. fwrite(“hello”,fp) D. fputs(“hello”,fp) 8. 若已定义: struct student { int num; char name[20]; }stu1,stu2; 则下列语句不正确的是() A. stu1.name=”Li Min” B. stu1=stu2 C. strcpy(stu1.name,stu2.name) D. stu1.num=stu2.num 9. 若已定义() int a[5]={1,2,3,4,5}int *p=&a[3];则下列值为3的是( ) A. p-a[0] B. *p C. a+2 D. p-a 10. 以下程序段运行后,c的二进制值是() int a=2,b=3,c=10; c>>=a|b; A. 01010000 B. 00000001 C. 00000010 D. 00101000 11. 用fseek函数可以实现以下哪个功能() A. 移动文件的读写位置指针 B. 在制定的文件夹中查找文件 C. 得到文件位置指针的当前位置 D. 改变文件的读取顺序 28 12. 以下程序段的运行结果是() union data { int a; char b; }data1; data1.b=?A?; data1.a++; printf(“%c\\n”,data1.b); A. 65 B. A C. 66 D. B 13. 以下语句正确的是() A. typedef INTEGER: int; B. typedef INTEGER int; C. typedef INTEGER= int; D. typedef int INTEGER; 14. 下列对结构类型变量stu1的定义和初始化正确的是() A. struct student { int num; float score; }; struct student stu1={1001,85.0} B. struct student { int num; float score; }stu1; stu1={1001,85.0} C. struct student { int num; float score; }stu1={1001,85.0}; D. struct student { int num; float score; }; struct student stu1 stu1->num=1001; stu1->score=85.0; 15. 若已定义:int a[5],*p=a;则不能正确表示a[1]地址的是() A. ++a B. ++p C. p+1 D. a+1 16. 文件类型FILE是() A. 一种函数类型 B. 一种指针类型 C. 一种数组类型 D. 一种结构类型 17. 若已定义:int a[3]={3,6,9};则对数组元素a[1]错误引用的是() 29 A. p[1] B. *p+1 C. *(&a[1]) D. *(a+1) 9. 宏、预处理命令、位运算及其他 1. 下列程序的运行结果是( )。 #define K 5 void main() { int a=3,b=4; printf(“%d\\n”,K*(a+b)); } A. 5 A. 0 B. 15 B. 1 C. 20 C. 20 D. 35 D. 8 2. 若已定义:int x=7,y=5;则表达式(x^y)<<2的值为() 3. 下列叙述错误的是()。 A. C语言源程序中加入一些预处理命令是为了改进程序设计环境,提高编程效率 B. 宏定义可出现在源程序中任意合适的位置,且必须在行末加分号 C. #define PER 1.5的作用是用标识符PER代表1.5 D. 预处理命令行都必须以#号开始 4. 下列错误的是()。 A. 预处理命令行都必须以#号开始。 B. C语言程序中加入一些预处理命令是为了改进程序设计环境,提高编程效率 C. 宏定义可出现在源程序中任意合适的位置,且必须在行末加分号 D. #define PER 1.5的作用是用标识符PER代表1.5。 5. 下列叙述正确的是()。 A. 宏定义中的宏名必须用大写字母表示 B. 为提高程序运行速度可在源程序中加入一些宏定义 C. 宏定义不占用程序运行时间,但与程序中的语句一样需要编译 D. 一个C语言源程序只能有一条预处理命令 6. 下列程序的运行结果是( )。 #define M 5 #define N M+1 #define NN N*N-M void main() { printf(“%d\\n”,3*NN); } A. 16 B. 103 C. 21 D. 108 7. 叙述正确的是( )。 A) 宏定义命令可根据需要以\开头或省略\ B) 宏定义:#define CR 15的作用是定义一个与15等价的符号常量CR C) C源程序中加入一些宏定义是为了提高程序运行速度 30 D) 宏定义命令也是语句,必须以分号结束 8. 宏定义的#define PI 3.14中,用宏名PI 代表一个( )。 A) 单精度数 C) 字符变量 B) 双精度数 D) 符号常 四、 章节编程训练 1. 数据类型、运算符与表达式 1. 补充以下程序,实现从键盘输入一个整数,输出该数的平方。 #include int x; scanf(“%d”,&x); printf(“%d”,x*x); } 2. 补充以下程序, #include /**/ float f; /**/ 定义一个变量来存放表达式的值,注意应定义成浮点型,因为结果包含小数 printf(\ scanf(\ f = /**/ (fabs(x)-2)/(x*x+1) /**/ ; 表达式书写时注意分子分母用括号括起来 printf(\ getch(); } 3. 编写程序,使其计算表达式的值,运行并观察结果。 31 #include #include return (1+sin(x)+exp(x))/(1+x); /**/ } void main() { clrscr(); printf(\ printf(\ printf(\} 4. 编写程序,根据三角形的三条边长a,b,c用公式 #include #include /**/ double /**/ fun(float a,float b,float c)函数类型由返回值类型确定,因area 是float型所以可设为double或float型 { float s,area ; s = /**/ (a+b+c)/2 /**/;根据题意可知 s = s*(s-a)*(s-b)*(s-c);计算面积 if( s < 0 ) 不能构成三角形的情况 area = -1; else area = sqrt(s); return area ; } main() { float a,b,c,area; printf(\ scanf(\输入三边长,注意scanf格式,本题输入时不能用逗号隔 开,应用空格或回车 area = fun(a,b,c);调用fun函数,传递三边长,计算面积,并接收fun函数返回的面积存 于area中 printf(\ getch(); } 32 2. 分支语句编写程序,使其计算以下分段函数 #include void main() { double x,y; scanf(\ if(x>2) y=fabs(1.23*x-9); else if(x = = 2) y=exp(x)+pow(x,3); else y=cos(x); printf(\} 1. 编写程序完成其中实现对输入的一个月工资数额,求应交税款,设应交税款的计算公式如下: 0 x≤1600 (x-1600)*5%-25 1600 f(x)= (x-1600)*10%-25 2100 (x-1600)*15%-125 x>3100 例如:输入:1825 输出:f?1825??11.25 输入:2700 输出:f?2700??85.00 输入:5655 输出:f?5655??483.25 #include /**/if else 多层选择结构,本题题目出错,第2个表达式应该没有-25,考试时注意下,不要 -25 就跟答案一样了 double y; if(x<=1600) y=0; else if(x<=2100) y=(x-1600)*0.05; else if(x<=3100) y=(x-1600)*0.1-25; else y=(x-1600)*0.15-125; 33 return y; /**/} void main() { float x; double y; clrscr(); printf(\ scanf(\ y = f(x); printf(\ getch();} #include int fun(/**/ float a,float b,float c /**/)形式参数是用来接受被main函数调用时 传递给它的值的,故其类型跟传给它的值类型一致,观察main函数,传给它的值都是float型,故此处定义为float型,另注意定义形参时,每个变量前都应该加类型说明,即不能写为float a,b,c { float temp; int bTrue = 0;bTrue做为返回值,从下面程序分析可知0代表不能构成直角三角形,1代表 可构成,此处先假设不能构成 if(a } if(a 以上两个if语句后使a存放的是三边中的最大边长 if( fabs(/**/ a*a /**/ - (b*b + c*c)) < 1.0e-15)若两边平方和与另一边平方和的 绝对值小于一个极小数,则构成直角三角形 bTrue = 1;能构成直角三角形 给bTrue赋值为1 return bTrue; } main() 34 { float a,b,c; printf(\ scanf(\ if( fun(a,b,c) == 1) a,b,c的类型决定了fun函数内参数的类型 printf(\ else printf(\ getch(); } 3. 循环 1. 计算s=1+12+123+1234+12345 编写程序计算s=1+12+123+1234+12345。 #define N 5 #include int t=0,/**/ s=0 /**/,i; s记得赋初值 for(i=1;i<=N;i++) { t=/**/ t*10+i /**/; t存入累加项,观察给定表达式可知 其值为上一个 累加项*10+i s+=t; } clrscr(); printf(\ getch(); } m2. 补充程序Ccon 081.c,根据输入的整数m(m>=0)值,计算?i. i?1#include unsigned sum(unsigned n) { unsigned i,/**/ sum=0; /**/ 累加和sum记得赋初值0 for(i=1;i<=n;i++) sum+=i; /**/ return sum; /**/ 返回结果 } void main() { int m; 35 clrscr(); printf(\ scanf(\ while(m<0){该循环确保用户输入的值大于0 可不用太关心 printf(\ scanf(\ } printf(\调用sum函数记得传参数m getch();} 3. #include { double pi=0; long i, sign=1;因累加项有正负号的变换,用乘以sign来进行控制 for(i=1;i<=10001;i+=2) { pi+=1.0*sign/i; sign=/**/ -sign /**/;使sign在正负1之间间替变化 } pi*=/**/ 4 /**/;前面for循环算出的是1-1/3+1/5?再乘以4即得到pi printf(\} 4. #include double fun(/**/ int n /**/) 观察fun函数调用该函数传递的数值及题目可知此处应定义一个整型形参变量,变量名由函数体里未被定义的变量确定 { double y = 0.0; int i,j; for(i=1;i<=n;i++) {y = y +/**/ 1.0/(8+3*i) /**/; 注意计算结果有小数部分,此处分子要写成1.0 } return (/**/ y /**/); } void main() { 36 clrscr(); printf(\ getch(); } 5. #include double sum=0; for(i=1;i<=n;i++)求累加和咯,j控制正负号变化 { sum+= 1.0/(i*(2*i+1))*j; 看到分数要注意到将分子或分母转化成浮点型,如1.0 j*=-1; } return sum; /**/ } void main() { int n; printf(\ scanf(\ printf(\ getch(); } 6. #include int hcf(int,int); 37 int a,b,k; printf(\ b: \ scanf(\注意scanf的格式,此处输入用空格或回车隔开 k=hcf(/**/ a,b /**/); printf(\ getch(); } 7. #include void main() { int m,n; for(m=1; /**/ m<=5; /**/ m++) 外循环控制输出5层*号,内循环控制每层如何输出*号 { printf(\ for(n=1;n<= /**/ 2*(m-1); /**/ n++) 输出*号前的空格 printf(/**/ “ ” /**/); for(n=9;n>=m*2-1;n--) 输出每层* 号 printf(\ } getch(); } 8. 补充程序ccon072.c,计算P?#include double fun(unsigned m,unsigned n) { unsigned i; double p=1.0; for(i=1;i<=m;i++) 本循环求出m! /**/ p*=i; /**/ for(i=1;i<=n;i++) 进入循环时 p初值为m!,本循环求出m!/n! /**/ p/=i; /**/ for(i=1;i<=m-n;i++) 进入循环时 p初值为m!/n!,本循环求出m!/(n!*(m-n)!) p=p/i; m!n!?m?n?!,其中m,n为整数且m>n>=0。 38 return p;} void main() {clrscr(); printf(\ getch();} 9. #include int i,m; float x,s,tem; printf(\ scanf(\ /**/ s=1;tem=1; /**/ 分析下面的for循环可知,累加项是从x开始的,故1应在此赋值 给s,另外tem用来存放当前的累加项,而当前累加项通过上一累加项乘x/i得到,相当于一个累乘的过程,故初始值设为1 for(i=1;/**/ i<=m /**/;i++) for循环过程中第一项为x,最后一项为xm/m! 故总共有m项 { tem*=x/i; 得到当前的累加项 s+=tem; } printf(\ getch(); } 10. #include void main() { /**/ int /**/ a,b,temp; 由以下scanf语句,知此处应填int整型 39 scanf(\ if (a /**/ } while /**/ (--a>b) /**/ 此处设置循环条件,a必须不断自减1来枚举区间(a,b)之间的数,同时当a==b时则不再进行判断 { if(a%3==0) 满足条件输出数值 printf(\ } printf(\ getch(); } 11. #include float i,j,k,s=0; for(i=0;i<=50;i++) for(j=0;j<=100;j++) for(k=0;k<=200;k++) if(i*2+j+k*0.5 = = 100) { s++; printf(“cock=%f hen=%f chick=%f”,i,j,k); } printf(“\\n the number of solutions is %f”,s); getch(); } 40 #include int hcf(int,int); int a,b,k; printf(\ b: \ scanf(\注意scanf的格式,此处输入用空格或回车隔开 k=hcf(/**/ a,b /**/); printf(\ getch(); } 辗转相除法 :1. a ÷ b,令r为所得余数(0≤r<b)若 r = 0,算法结束;b 即为答案。 2. 互换:置 a←b,b←r,并返回第一步。 int hcf(int x,int y) { int r; r=x%y; while( r!=0 ) { x=y; y=/**/ r /**/; r=x%y ; } return (/**/ y /**/); } 12. #include #define /**/ N 20 /**/ 根据下方for循环的i<=N 可知此处需定义符号常量N值为20 main() { int a,flag,i,j,m=0; for(i=2;i<=N;i++) 依次判断2到20之间的数是否是素数 { flag=1; flag为0标记i不是素数,为1是素数,此处先假设i为素数,故初始为1 j=2; a=(int)sqrt((double)i);有确凿证据显示 要证明i是素数 只要证明2到i的平方根之间的数都无法被i整除即可,此处将i的平方根存于a中 while (flag&&j<=a) j用来枚举2与a之间的数,flag未被置为0且j未大于a时执行 41 循环体 { if(i%j==0) /**/{flag=0;break;} /**/ 找到2与a之间有个数能被i整除,说明i不是素数,将 flag置为0,并退出循环 j++; 准备判断下一个数能否被i整除 } if (flag) 若在上面的while循环中flag未被置为0,则说明i为素数,将其输出 { printf(\ /**/ m++; /**/ m记录找到的素数的个数,因下一语句要根据m的值每输出4 个素数换行 if(m%4==0)实现每输出4个素数换行 printf(\ } } getch(); } 13. #include #include int fun(int bg,int fn) 观察main函数可知bg,fn存放的是2个边界自然数的值 { /**/ int i,j,k,count=0; for(i=bg;i<=fn;i++)枚举bg和fn之间的各个自然数 {判断一个数i是素数只要证明其不能被2和它的平方根之间的数整除即可 k=sqrt(i); 求i的平方根 for(j=2;j<=k;j++)枚举2和平方根之间的数 if(i%j==0) break; 若找到一个数能被i整除,则说明i不是素数退出循环 if(j>k) count++; 若在上面的循环过程中未有一个数能被i整除,则退出循环时j必大于k,由此可说明找到一个素数,故让count++记录找到的素数数量 } return count;返回找到的素数个数 /**/ } void main() { int count; count=fun(100,500); printf(\ getch(); 42 } 14. #include int prime(int n) 该函数判断n是否为素数,若是返回1否则返回0 { int k,flag=1; 从上下文判断 flag为1代表n为素数,为0不是素数 for(k=2; k<=n/2+1; k++) if (n%k==0) { flag=/**/ 0 /**/ ; break;} 找到一个在k和n/2+1之间的数能被n 整除,则说明n不是素数,将flag置为0,退出循环 return flag; } void main() { int num, a; clrscr(); do { printf(\ scanf(\ }while(num<=6||num%2==1);该while循环确保用户输入的n值是大于6的偶数 要证明的是一个偶数num是两个质数之和,故假设其中一个数是a,则另外一个数就是num-a了,接着只要调用prime函数,看看prime(a)和prime(num-a)是否都为1即a和num-a是否都为质数,若是则得证,将结果输出 for(a=2;a<=num/2+1;a++) if(prime(a) && prime(/**/ num-a /**/)) printf(\} 4. 指针与数组 #include void main() { char s[80]; int i; printf(\ for(i=0;((s[i]=getchar())!='\\n')&&(i<80);i++); for循环不断接收用户输入的字符, 直到用户输入回车为止 s[i]='\\0'; 给用户输入的字符串结尾加上结束符‘\\0’ for(i=0;s[i]!='\\0';/**/ i++ /**/) 按顺序访问字符数组s的各个字符,直到遇 到’\\0’即字符串结尾为止 43 { if(s[i]>='a'&&s[i]<='z') 若当前访问的字符为小写字母将其减32转换为大写字母 s[i]=s[i]-32; else if(/**/ s[i]>='A' && s[i]<='Z' /**/)若当前访问的字符为大写字母将其加32 转换为小写字母 s[i]=s[i]+32; printf(\ } getch(); } #include float average(int *pa,int n) pa接收本函数被调用时传给它的数组名,n为数组内元素个 数 { int k; /**/ float avg=0; /**/ 下面程序有avg=avg/n的式子,故avg因定义为float型 for(k=0;k return avg; } void main() { int a[5]={20,30,45,64,23}; float m; m=average(/**/ a /**/, 5); 将要计算平均会的数组a的首地址及首组个数传给函数average printf(\ getch(); } 打开程序Cprong042.c,完成其中的fun()函数,使程序打印出Fibonacci,数列的前20个数。 该数列{1,1,2,3,5,8,13,??}的第1,第2个数为1,从第3个数开始每个数等于 前2个数之和。 #include a[0]=1;a[1]=1; 初始化前两项的值为1 for(i=2;i 44 /**/ } void main() { int a[20],i; fun(a,20); 调用函数fun,传递存入费布拉切数列的数组a的首地址及要求的数列项数20 for(i=0; i<20; i++)将费布拉切数列打印出来 printf(\ printf(\ getch(); } 本题采用的是选择排序法,基本思路:每一趟从待排序的数列中选出值最小(或最大)的数据,将它与当前待排序的子数列的最后一个数据进行交换,直到全部数据排序完毕。 #include void sort(int a[], int m) { int i, j, k, t; for( i = 0; i < m-1; i++ )第一趟找到最小的数与第一个数进行交换,第二趟找到次小的 数与第二个数进行交换?故需m-1趟 { 每一趟相当于在未排序的部分进行寻找最小值下标的操作,然后根据最小值下标将最小值元素与该未排序部分的第1个元素进行交换 k = i; k记录最小值的下标,初始化为未排序部分的第1个数 for( j=i+1; j< /**/ m /**/; j++) 在未排序部分寻找最小值的下标 if( a[j] < a[k] ) /**/ k=j /**/; if( k != i ) 若最小值下标不是前面初始化的i则进行交换,否则就不需交换 { t = a[k]; a[k]= a[i]; a[i] = /**/ t /**/; } } } void main() { int a[] = {72,25,58,32,2,15,7,64}; int i,m = sizeof(a)/sizeof(int); sort(a,m); for(i=0;i 45 } 16. 输入一个4行4列的二维整型数组表4×4阶矩阵,并计算第1列元素之和. 补充程序Ccon 061.c,使其从键盘输入一个4行4列的二维整型数组表4×4阶矩阵,并计算 第1列元素之和. 如输入:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 输出:28 #include int i,/**/ j /**/;观察下文,j未被定义,故此处应定义j int a[4][4],sum; sum=/**/ 0 /**/; sum存放累加和 故初始化为0 printf(\ for(i=0; i<4;i++) 输入矩阵注意scanf格式 输入时各个数用空格隔开 for(j=0;j<4;j++) scanf(\ for(i=0;i<4;i++) /**/ sum+=a[i][0]; /**/ 求累加和 printf(\ getch(); } 17. 二分法查找元素 补充程序Ccon 062.c,使程序中的fun( )函数用二分法在已按从小到大排好序的数组a中直找q,若找到第一个q返回对应的下标,没找到返回-1. 基本思想:将已排好序的n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x==a[n/2]则找到x,算法终止。如果xa[n/2],则我们只要在数组a的右半部照此方法继续搜索x。 #include int fun(int a[],int n,/**/ int q /**/) 此处q接收要查找的数值,数组 a为排好序的数组,n为数组元素个数 { int left,right,mid; left为q所在部分的左边界下标,right为右边界下标,mid为中间 元素下标 left= 0 ; right = n-1; while(left <= right) 在left <= right的情况下才执行循环体 { mid= /**/ (left+right)/2 /**/; 求出中间元素下标 46 if( q < a[mid] ) right = mid-1; q在左半部,更新right的值 else if( q > a[mid]) left = mid+1; q在右半部,更新left的值 else return mid; a[mid]==q的情况,返回q所在元素的下标 } return -1; 若在上面while循环中未找到q,则该数组中不存在该元素,返回-1 } main() { int a[]={3,4,6,11,17,22,31,45}; int k,n; n = sizeof(a)/sizeof(int); sizeof(a)数组a所占字节数,sizeof(int)一个整型变量所 占的字节数,故n为数组a所含元素个数 k = fun(a,n,31); printf(\ getch(); } #include int count(int s[]) { int i,c=0; float sum=0,aver; for(i=0;i aver=/**/ sum/N; /**/ 求出数组s的平均值 for(i=0;i { 遍历数组,找到一个大于等于平均值的数时 c自增1,故c用于存放高于平均分的人数 if(s[i]>=aver) c++; } return(/**/ c /**/); 将高于平均数的人数返回 } void main() { int score[N]={67,78,66,79,73,82,69,85,77,80,93,72}; int cn; cn=/**/ count /**/ (score); 调用函数count进行计算,故此处写上函数名 printf(\ getch(); } 47 #include int i,a[10]={9,26,35,8,6,19,69,3,5,95}; int min1,min2; i=0; min1=a[0]a[1]?/**/a[0]:a[1]; /**/将a[0] a[1]中较大数存于a[1]中 先假设min1,min2里存放的是数组a中最小数和次小数 for(i=2;i<10;i++) 遍历数组 { if(a[i] 需进行更新,需注意的是更新时先更新min2的值,再更新min1的值 { min2=min1; min1=a[i]; } else if(a[i] 需进行更新 /**/ min2=a[i]; /**/ } printf(\ getch(); } #include void fun(double a[],double x,int n) { /**/ a[0]=(2*n+1)*pow(x,n)/(n*(n+1)); 计算表达式的值将其存在a[0]内 a[1]=a[0]-(int)a[0]; (int)a[0]得到a[0]的整数部分,故a[0]- (int)a[0]可得到小 数部分 /**/ } main() 48 { int n; double a[2],x; printf(\ scanf(\注意此处scanf的格式,数据要用逗号隔开 while(x<1.0 || x>2.0 || n<0 || n>10) 确保用户输入的值在允许范围内 { printf(\data (1.0<=x<=2.0,0 scanf(\ } fun(a,x,n); printf(\ getch(); } #define N 6 #define M 9 void fun(int a[],int b[],int c[]) { /**/ int i,j,k; i控制数组c元素的下标,j控制数组a元素的下标,k控制数组b元素的下标 j=N-1;k=0; 初始化j,k为数组a b最大元素的下标 for(i=0; k 取a[j],b[k]中较大值存入数组c中,并将c的下标自增1,以接收下一个值,较大值所在数组为a的话下标自减1,为b的话自加1,以指向下一个进行判断的值 if(a[j] while(j>=0){c[i]=a[j];j--;i++;}若数组a还有元素未存入c则将其全部存入c中 while(k int a[N]={2,5,8,10,18,24},b[M]={96,88,70,36,24,18,11,10,2}; int c[N+M],n; fun(a,b,c); printf(\ for(n=0;n 49 printf(\ getch(); } #include int search(int a[]) { /**/ int i,max,max_next; max=a[0]>a[1]?a[0]:a[1]; max存a[0],a[1]中较大值 max_next=a[0]>a[1]?a[1]:a[0]; max_next存a[0],a[1]中次大值 先假设max, max_next里存放的是数组a中最大数和次大数 for(i=2;i if(max max_next都不是最大值和次大值,需进行更新,需注意的是更新时先更新max_next的值,再更新max的值 else if(max_next 明当前max_next不是次大值,需进行更新 return max_next;只返回次大值 /**/ } void main() { int a[N]={16,8,66,45,6,79,40,58}; int max_next; max_next=search(a); printf(\ getch(); } 50