一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八二三四五六七八九十一二三四五

Size: px
Start display at page:

Download "一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八二三四五六七八九十一二三四五"

Transcription

1 科学出版社职教技术出版中心

2 C 语言程序设计学习指导与练习 ( 二级 ) 魏文主编 陈燕敏汪志勤李文锦副主编 北京

3 内容简介本书针对浙江省计算机等级考试的大纲, 结合作者多年的实际教学经验, 总结归纳出各章节的知识点, 对重点 难点等内容进行解释与剖析, 并给出实例 书中提供了四套笔试综合练习题和详解, 分析解题思路, 给出应试技巧 针对上机考试, 编写了上机练习精解, 同时提供了一套上机考试模拟练习题及解答, 使考生能够有的放矢地进行复习备考 书中还收集了历年浙江省计算机等级考试二级 C 的试卷, 并给出参考答案 本书的所有例题和练习都在 Visual C 集成开发环境中通过调试运行 本书非常适用于参加计算机等级考试二级 C 考生的考前辅导, 也可作为各大专院校 C 语言程序设计 课程的教学参考书 图书在版编目 (CIP) 数据 C 语言程序设计学习指导与练习. 二级 / 魏文主编. 北京 : 科学出版社,2010 ( 面向 21 世纪高等院校计算机系列规划教材 ) ISBN Ⅰ.C Ⅱ. 魏 Ⅲ.1C 语言 程序设计 高等学校 教学参考资料 Ⅳ.1TP312 中国版本图书馆 CIP 数据核字 (2010) 第 号 责任编辑 : 陈晓萍 / 责任校对 : 刘玉清责任印制 : 吕春珉 / 封面设计 : 北大彩印 科学出版社发行各地新华书店经销 * 2010 年 8 月第一版 开本 : / 年 8 月第一次印刷 印张 :14 印数 : 字数 : 定价 :24.00 元 ( 如有印装质量问题, 我社负责调换 环伟 ) 销售部电话 编辑部电话 版权所有, 侵权必究举报电话 : ; ; 科学出版社职教技术出版中心

4 前 言 C 语言作为一种结构化 模块化的程序设计语言, 具有简洁 灵活 实用 高效 移植性好等特点, 是目前全国各高等院校理工科学生的主要必修课程, 而且在程序员考试和各类计算机等级考试中也占有重要地位 为了帮助学生尽快掌握 C 语言, 提高 C 语言编写程序 解决实际问题的能力, 同时为配合浙江省计算机等级考试的复习, 我们组织了具有多年本科教学经验的老师编写了本书 全书主要包括以下几个章节 第 1 章综合复习 C 语言程序设计中各教学章节的知识点, 并归纳了教学重点 难点以及初学者易犯的错误, 用实例进行分析 ; 整理总结出计算机等级考试中常见的一些算法 第 2 章包含四套综合练习的详细解答 针对一些基本概念 常见题型和算法, 给出解题思路和详细的解题过程, 有助于提高考生的解题能力 第 3 章精选上机试题, 给出解题步骤, 包含上机考试的常见考点, 同时对上机考试系统的使用进行了简要的说明 从第 4 章开始, 给出了上机考试的模拟练习题及答案 历年浙江省计算机等级考试二级 C 笔试试题及参考答案, 供考生进行练习, 提高应试能力 本书内容精练, 重点突出, 习题丰富, 不仅可以作为计算机等级考试复习用书, 也可以作为各类高校非计算机专业 C 语言程序设计 课程的教学辅导书 本书由魏文任主编, 陈燕敏 汪志勤 李文锦任副主编 由于时间仓促, 编者水平有限, 书中难免有错误或不当之处, 敬请广大读者批评指正, 如需联系编者可发邮件至 cprogram2000@hotmail.com 魏文 2010 年 6 月

5 目 录 第 1 章 C 语言要点 重点 难点分析 C 语言程序设计基础知识 数据类型及其运算 控制结构与语句 数组 指针 函数 编译预处理 结构体 共用体 枚举和位运算 文件 第 2 章综合练习详解 综合练习一详解 综合练习二详解 综合练习三详解 综合练习四详解 第 3 章上机练习精解 程序填空题 程序改错题 程序设计题 浙江省高校计算机等级考试二级 C 上机考试说明 第 4 章上机考试模拟练习 程序填空题 程序改错题 科学出版社职教技术出版中心 程序设计题 第 5 章历年浙江省计算机等级考试二级 C 笔试试题 年春浙江省高等学校计算机等级考试试卷 ( 二级 C) 年秋浙江省高等学校计算机等级考试试卷 ( 二级 C) 年春浙江省高等学校计算机等级考试试卷 ( 二级 C) 年秋浙江省高等学校计算机等级考试试卷 ( 二级 C) 年春浙江省高等学校计算机等级考试试卷 ( 二级 C) 年秋浙江省高等学校计算机等级考试试卷 ( 二级 C) 年春浙江省高等学校计算机等级考试试卷 ( 二级 C)

6 iv C 语言程序设计学习指导与练习 ( 二级 ) 第 6 章上机考试模拟练习参考答案 程序填空题 程序改错题 程序设计题 第 7 章历年浙江省计算机等级考试二级 C 笔试试题参考答案 年春浙江省高校计算机等级考试参考答案 ( 二级 C) 年秋浙江省高校计算机等级考试参考答案 ( 二级 C) 年春浙江省高校计算机等级考试参考答案 ( 二级 C) 年秋浙江省高校计算机等级考试参考答案 ( 二级 C) 年春浙江省高校计算机等级考试参考答案 ( 二级 C) 年秋浙江省高等学校计算机等级考试参考答案 ( 二级 C) 年春浙江省高等学校计算机等级考试参考答案 ( 二级 C) 附录 附录 1 C 语言的关键字 附录 2 常用字符的 ASCII 码对照表 附录 3 C 语言运算符的优先级与结合性 附录 4 常用库函数 参考文献

7 第 1 章 C 语言要点 重点 难点分析 1.1 C 语言程序设计基础知识 1. 知识要点 (1) 计算机程序设计语言 程序设计语言主要分成三大类 : 机器语言 汇编语言和高级语言 只有用机器语言 编写的程序, 计算机才能够直接执行 汇编语言编写的程序需要经过汇编程序, 高级语言编写的程序需要经过编译或解释程序, 最后才能生成机器语言程序, 在计算机上运行 C 语言属于高级语言, 由于其特有的优点, 它既可用来编写系统软件, 也可用来编写应用软件 (2)C 语言程序设计的基本知识 C 语言具有语言简洁 使用灵活 运算符丰富 允许直接访问物理地址 生成目标代码质量高以及编写的程序移植性好等特点 用 C 语言编写的程序由函数构成 一个 C 源程序有且只有一个 main 函数和若干个 (0 1 或多个 ) 其他函数 函数包括函数头部和函数体两部分 函数的头部包括函数名 函数类型 函数属性 函数参数及其类型等组成 函数体放在一对大括弧中, 分成声明部分 ( 变量 函数声明等 ) 和执行部分 ( 若干执行语句 ) 一个 C 语言的程序可以由多个文件组成 一个 C 程序总是从 main 函数开始执行, 并在 main 函数中结束运行 (3)C 语言程序在计算机上的执行过程首先编辑 C 的源程序, 并以扩展名为.c 的文件名保存 然后必须经过编译程序对源程序进行编译, 生成扩展名为.obj 的二进制目标程序 最后, 还需要将该程序包括的所有目标程序 系统库文件进行连接, 生成一个扩展名为.exe 的可执行程序 在 Microsoft Visual C++ 集成开发环境中可以方便地进行 C 源程序的编辑 编译 连接和运行 2. 重点及难点 科学出版社职教技术出版中心 (1) 重点 C 源程序的构成和运行过程 (2) 难点 C 源程序在计算机上的执行 C 源程序在计算机上调试的过程中, 可能出现两种错误 : 语法错误和逻辑错误 没

8 2 C 语言程序设计学习指导与练习 ( 二级 ) 有语法错误的程序不一定就是正确的程序, 可能还存在逻辑错误 因此, 还必须经过运行测试, 根据程序运行结果的正确与否来判断程序是否正确 3. 例题分析例 1.1 以下叙述中正确的是 A. 高级语言就是机器语言 B. 汇编语言程序 高级语言程序都是计算机程序, 但只有机器语言程序才是计算机可以直接识别并执行的程序 C.C 语言因为具有汇编语言的一些特性, 所以是汇编语言的一种 D.C 源程序经过编译 连接, 若正确, 执行后就能得到正确的运行结果答 : 高级语言接近于自然语言和数学语言, 计算机不能直接识别, 但使用上比机器语言和汇编语言更方便 简单 C 语言属于高级语言 C 源程序如果编译 连接正确后, 运行不一定能到正确的运行结果, 因为还可能存在逻辑错误 本题答案为 B 例 1.2 以下叙述中错误的是 A.main 函数在 C 程序中必须有且只有一个 B.C 程序的基本组成单位是函数 C.C 程序的执行从 main 函数开始, 所以 main 函数必须放在程序最前面 D.C 程序中各个函数位置可以任意答 : 一个 C 程序由一个或多个函数构成, 其中 main 函数有且只能有一个 不论 main 函数放在什么位置, 一个 C 程序总是从 main 函数开始执行 本题答案为 C 例 1.3 以下叙述中正确的是 A.C 语言编写的源程序经过编译后生成可执行文件 B.C 的源程序可以直接在计算机上运行 C.C 语言的函数不可以单独进行编译 D.C 语言中的每条可执行语句最后都要被转换成二进制的机器指令答 :C 的源程序不能在计算机上直接运行, 首先必须经过编译, 可以生成一个二进制的.obj 目标程序, 然后与系统库文件等其他程序连接后, 才能生成一个可直接运行的.exe 可执行文件 C 的函数可以单独进行编译, 生成二进制的.obj 目标程序 本题答案为 D 1.2 数据类型及其运算 1. 知识要点 (1)C 语言标识符 C 语言源程序中可以用到的字符集包括英文大小写字母 ( 共 52 个 ), 数字 0~9( 共 10 个 ), 还有 + - 等其他 30 个字符 标识符是一个名字, 是给程序中的变量 符号常量 数组 结构体 函数或文件等所起的名字 C 语言的标识符包括关键字 预定义标识符和用户标识符 关键字是系统指定的标识符, 代表固定的含义, 不能另作它用 预定义标识符在 C 语言中也是有特定

9 第 1 章 C 语言要点 重点 难点分析 3 的含义, 如 C 语言提供的库函数名称 C 语言语法允许将这类标识符另作它用, 但为了 避免误解, 建议大家不要将这些标识符另作它用 用户标识符是由用户根据需要自己定义的, 必须以字母或下划线开头, 由字母 数字 下划线组成的字符序列 在定义标识符时, 尽量做到 见名知义 需要注意的是,C 语言区分大小写字母, 即大写字母和小写字母被认为是两个不同的字符 (2) 数据类型 C 语言有丰富的数据类型, 不同数据类型的数据在存储 ( 占内存字节数 ) 表示( 取值范围 ), 和对其可进行的操作上都各不相同 C 语言的数据类型包括基本类型 ( 整型 字符类型 实型 枚举类型 ) 构造类型( 数组 结构体类型 共用体类型 ) 指针类型和空类型 基本数据类型中, 整型又可细分成短整型 (short) 基本整型(int) 和长整型 (long), 实型可分成单精度 (float) 类型和双精度 (double) 类型 整型数据以补码形式存放在内存中, 实型数据按指数形式存储, 字符 (char) 类型在内存中则以其对应的 ASCII 码值来存放 不同的数据类型在内存中存放所占的长度 ( 即字节数 ) 不同 以 Visual C 系统为例, 短整型数据占 2 个字节, 基本整型和长整型数据都是占 4 个字节 单精度类型数据占 4 个字节, 双精度类型数据占 8 个字节 (3) 常量在程序运行过程中其值不变的量称为常量 常量可以分为整型常量 实型常量 字符常量 字符串常量和符号常量 整型常量可以是十进制 八进制及十六进制表示的整数 十进制整数是带符号 (+ -) 的包含 0~9 的一位或多位十进制数, 但第一位不能是 0 八进制整数是带符号(+ -) 的以 0 开头 包含 0~7 的一位或多位八进制数 十六进制整数是带符号 (+ -) 的以 0x 或 0X 开头 包含 0~9 a~f 的一位或多位十六进制数 例如, 是整型常量, 是八进制常量,0x2af 0Xc2-0x12 是十六进制常量 如果在整型常量后面加上字母 l 或 L, 则表示它是一个长整型常量 实型常量有两种表示方式 : 小数形式和指数形式 小数形式由符号 (+ -) 整数部分 小数点和小数部分组成, 其中整数部分和小数部分不可同时省略, 小数点不可省略 例如, 等都是合法的实型常量 指数形式由符号 (+ -) 小数部分 指数符号 e 或 E 和指数部分组成, 其中小数部分不可省略, 指数部分必须为整数 例如,1.23e-5 2E e2 等都是合法的实型常量 在 Visual C 中, 实型常量都是 double 类型, 在实型常量后面加 f, 则为 float 类型, 如 3.14f 字符常量是用单引号括起来的一个字符, 其中单引号只是起到定界作用并不表示字符本身 C 语言中还有一些字符无法表示 ( 如换页 退格等 ), 则采用转义字符来表示 转义字符以反斜杠 (\) 开头, 后面跟一些特殊字符或数字, 将反斜杠 (\) 后面的字符或数字转换成其他意义的字符 常用的转义字符如表 1.1 所示 对于字符 A(ASCII 码值为 65), 可以有不同的表示方法 'A' '\101' '\x41' 都代表 ASCII 码值为 65 的字符常量 需要掌握以下一些常用字符之间的转换 科学出版社职教技术出版中心

10 4 C 语言程序设计学习指导与练习 ( 二级 ) 1 英文大小写字母之间的转换, 对应大小写字母之间 ASCII 码值相差 32( 即 'a'-'a') 2 数字字符 '0'~'9' 大写字母'A'~'Z' 小写字母'a'~'z' 互相之间 ASCII 码值依次递增 1 3 数字 0~9 加上 48( 即字符 '0'), 转换成对应的数字字符 '0'~'9' 例如, 字母 'G' 加 32 即转换成字母 'g'; 字母 'a' 加 4 即为字母 'e'; 数字 1 加上 '0' 字符就转换成数字字符 '1'; 数字字符 '1' 加上 8 就转换成了数字字符 '9' 表 1.1 转义字符 转义字符 意 义 ASCII 码值 ( 十进制 ) \a 响铃 (BEL) 7 \b 退格, 即输出位置移到前一列 (BS) 8 \n 换行, 即输出位置移到下一行开头 (LF) 10 \r 回车, 即输出位置移到本行开头 (CR) 13 \t 水平制表, 即输出位置移到下一个输出区 (HT) 9 \\ 反斜杠字符 92 \? 问号字符 63 \ 单引号字符 39 \ 双引号字符 34 \0 空字符 (NULL) 0 \ddd \xhh ASCII 码值为 1~3 位八进制数所代表的字符 ASCII 码值为 1~2 位十六进制数所代表的字符 字符串常量是用双引号括起来的一串字符, 其中双引号只是起到定界作用 C 语言中, 字符串常量在内存中存放时, 系统自动在字符串的末尾加一个 串结束标志, 即 ASCII 码值为 0 的空字符 '\0' 因此, 包含 n 个字符的字符串常量在内存中要占 (n+1) 个字节的 存储空间 空串 " " 表示字符串中只有一个空字符 '\0' 注意区分 'a' 和 "a" 的不同之处 符号常量是指在程序中用一个标识符代表一个常量 定义的形式如下 : #define 符号常量名常量系统进行预处理时, 将程序中的符号常量名替换成对应的常量 ( 即宏展开 ) (4) 变量 在程序运行过程中其值可变的量称为变量 C 语言规定, 变量必须先定义后使用 变量定义的一般形式如下 : 数据类型变量名 ; 在变量定义的同时给变量赋值, 即为变量的初始化 例如,int a=3, b=1; 需要注意的是, 一般变量定义后若未初始化, 则此时变量的值为不确定 可以通过 变量初始化 赋值语句和调用输入函数等三种方式给变量赋值 (5) 数据类型的转换 不同数据类型的数据混合运算时, 需要转换数据类型 C 语言数据类型的转换分自 动转换和强制转换两种

11 第 1 章 C 语言要点 重点 难点分析 5 当不同数据类型混合运算时由系统进行自动转换 1 级别低的数据类型自动向高级别的类型转换 字符型 (char) 和短整型 (short) 必须先转换成整型 (int), 单精度型 float 必须先转换成双精度型 double 类型转换的优先级为 int unsigned long double 2 在赋值运算中, 赋值号右边的表达式类型自动转换为赋值号左边变量的类型 3 用户自定义函数中, 由 return 返回的表达式类型自动转换为函数头部的函数类型 C 语言中还有强制类型转换运算符, 其一般形式如下 : ( 类型说明符 )( 表达式 ) 将表达式的值强制转换成所需的数据类型 (6) 运算符 优先级 结合性和表达式 C 语言中提供了丰富的运算符, 分为算术运算符 关系运算符 逻辑运算符 条件运算符 赋值运算符 逗号运算符 移位运算符和位逻辑运算符等 对于运算符, 需要掌握参与运算的操作数个数 ( 单 / 双目 ) 运算符的优先级和结合性 C 语言的运算符中, 优先级为 2 级的都是单目运算符, 条件运算符是三目运算符, 其余都是双目运算符 所有运算符分成 15 个优先级 常用运算符 ( 除其中的单目运算符以外 ) 的优先级按算术运算符 > 关系运算符 > 逻辑运算符排列 C 语言中运算符的结合性分为左结合性 ( 从左到右计算 ) 右结合性( 从右到左计算 ) 两种, 其中单目 三目运算符都是右结合性, 除赋值及复合赋值运算符之外的所有双目运算符都是左结合性 由常量 变量 函数调用以及按 C 语言语法规则用运算符把运算数据连起来的式子都是 C 的合法表达式 在计算表达式时, 首先计算优先级高的运算符, 对于同一优先级的运算符则根据其结合性决定计算次序 在表达式的计算过程中, 参加运算的两个操作数在计算前先自动转换成同一数据类型, 再运算求值 对于常用的运算符和表达式需要注意以下问题 1 自增 自减运算符 (++ 和 --) 只能用于单个变量 ( 或数组元素 ) 前缀自增( 减 ) 运算先对变量加 ( 减 )1, 然后此时变量的值 ( 加 / 减 1 之后的值 ) 即为表达式的值 ; 后缀自增 ( 减 ) 运算先将此时变量的值 ( 未加 / 减 1 之前的值 ) 作为表达式的值, 然后对变量加 ( 减 )1 由此可见, 不论前缀还是后缀自增 ( 减 ) 运算, 计算后只有表达式的值不同, 变量的值都是一样的 2 求余运算符 (%) 要求两个操作数都是整型数据 如果实型数据要进行求余运算, 则必须对其进行强制类型转换, 转换成整型 3 如果除法运算 (/) 的两个操作数都是整数, 则其结果取整 例如, 表达式 2/5 的结果为 0 如果不希望结果取整( 即需要结果为实数 ), 则需要将其中一个操作数转换成实型 4 使用求余 % 运算符, 根据余数是否是零可以判断该整数是否能被另一个整数整除 对于整数 n, 计算 n%10 即可得到 n 的个位数字 ; 将 n%10 和 n/10 配合起来使用, 可以得到整数 n 各个位上的数字 ; 采用 n%2 和 n/2, 可以将十进制正整数 n 转换成二进制 ; 同理, 采用 n%8 和 n/8( 或 n%16 和 n/16), 可以将十进制正整数 n 转换成八进制 ( 或十六进制 ) 5 关系运算符为左结合性, 运算结果为 1( 真 ) 或者 0( 假 ) 需要注意的是数学上 科学出版社职教技术出版中心

12 6 C 语言程序设计学习指导与练习 ( 二级 ) 成立的不等式作为 C 语言的表达式时, 却可能出现相反的运行结果 例如, 数学上 6>4>2 是成立的, 但作为 C 语言的关系表达式 6>4>2 的计算结果却是 0( 假 ) 根据关系运算 符的左结合性, 先计算 6>4, 结果为 1( 真 ), 然后再计算 1>2, 结果为 0( 假 ) 因此, 在写类似的关系表达式时, 一定要将两个关系运算分开写, 并通过逻辑与运算连接起来 例如,6>x>2 要写成 6>x&&x>2 6 在 && 和 运算符组成的逻辑表达式中, 为提高程序的执行效率,C 语言规定, 只对能够确定整个表达式值的最少数目的子表达式进行计算, 即当计算出某个子表达式后就可以确定整个逻辑表达式的值, 后面的子表达式就不再计算了 在计算 ( 表达式 A)&&( 表达式 B) 时, 先计算表达式 A 的值 若表达式 A 的值为零 ( 假 ), 则不必进行表达式 B 的计算, 就可得出整个逻辑表达式值为零 在计算 ( 表达式 A) ( 表达式 B) 时, 先计算表达式 A 的值 若表达式 A 的值为非零 ( 真 ), 则不必进行表达式 B 的计算, 就可得出整个逻辑表达式值为 1 7 在进行移位运算或位运算时, 先要将两个操作数都转化成二进制, 然后再按位进行计算 (7) 数据的输入 / 输出 C 语言中没有输入 / 输出语句, 所有的输入 / 输出都由系统提供的库函数完成 字符型数据输入 / 输出常用 getchar()/putchar() 函数, 格式输入 / 输出函数 (scanf()/printf()) 可以输入 / 输出各种类型的数据 getchar() 函数 : 从标准输入设备读取一个字符 使用方式 :char c; c=getchar() putchar() 函数 : 向标准输出设备输出一个字符 使用方式 :putchar(c), 其中 c 表示任意一字符常量或字符变量 scanf() 函数 : 按照格式控制字符串所给定的输入格式, 将输入数据表按地址列表存入指定的存储单元 使用方式 :scanf( 格式控制字符串, 地址列表 ), 其中地址列表可以是变量 ( 或数组元素 ) 的地址 字符串的首地址等 printf() 函数 : 按照格式控制字符串所给定的输出格式, 把输出项表中各表达式的值输出到显示器 使用方式 :printf( 格式控制字符串, 输出项表 ), 其中输出列表是若干个 C 的表达式 格式控制字符串由两部分组成 : 格式说明符和普通字符 格式说明符一般格式如下 : %[ 宽度 ] 格式说明符号 scanf() 函数中的普通字符必须按原样输入,printf() 函数中的普通字符要按原样输出 2. 重点及难点 (1) 重点各种常量的表示 运算符的优先级和结合性 表达式的求值 整除 (/) 和求余 (%) 运算符的结合, 解决十进制与二进制 十六进制之间的转换, 求整数的各位数等问题 注意 : = 与 == ++a 与 a++ 的区别 ; 逻辑表达式的计算特点 ;C 语言关系表达式与数学中的关系运算的不同 (2) 难点根据运算符的优先级 结合性和不同数据类型, 计算 C 表达式的值

13 第 1 章 C 语言要点 重点 难点分析 7 3. 例题分析 例 1.4 设 m n a 均为 int 型变量, 则执行语句 m=n=0;a=++m ++n; 后,m n 和 a 的值为 A B C D 答 : 根据逻辑表达式的计算特点 ( 参见本节的知识要点 ), 先计算 ++m ++n, 然后将 计算结果赋给变量 a ++m 为自增前缀, 先做 m=m+1,++m 表达式的值为 1 在进行逻 辑或运算时, 由于 ++m 的值为真,++n 就不执行, 可以得出表达式 ++m ++n 的值为 1 本题答案为 B 例 1.5 执行下面程序段后, 变量 i 和 k 的值为 int i=0,k=10; if(i=8)k--; else k++; A.8 10 B.0 9 C.8 9 D.0 11 答 : 根据双分支 if 语句的执行过程 ( 参见下节的知识要点 ), 先计算表达式 (i=8) 的值 由于 i=8 是赋值表达式, 因此 i 的值为 8, 赋值表达式的值也是 8, 即为真, 接下 来执行 k-- 本题答案为 C 思考 : 如果将 i=8 改为 i= =8, 那么结果是多少? 例 1.6 判断字符变量 c 是数字字符的逻辑表达式为 A.0<=c&&c<=9 B."0"<=c&&c<="9" C.'0'<=c<='9' D.'0'<=c&&c<='9' 答 :0 9 是整型常量,"0" "9" 是字符串常量,'0' '9' 是字符常量 ( 参见本节关于 常量的知识要点 ) 根据关系表达式的运算规则( 参见本节的知识要点 ), 不论 c 取任何 值, 表达式 '0'<=c<='9' 的值均为真 本题答案为 D 例 1.7 程序填空 输出所有的水仙花数 水仙花数是指一个三位数, 其各位数字 的立方和等于其本身, 如 153=1*1*1+5*5*5+3*3*3 #include <stdio.h> #include<math.h> void main() { int k,a,b,c; for(k=100;k<1000;k++) { a=k/100; 1 ; c=k%10; if ( 2 ) printf("%d is a Armstrong number!\n",k); 科学出版社职教技术出版中心 答 : 通过整除 / 和求余 % 运算符得到整数的各位数字 ( 参见本节关于常量的知识要点 ) 本题 1 的答案为 b=i%100/10 或者 b=i/10%10 本题 2 的答案为 a*a*a+b*b*b+

14 8 C 语言程序设计学习指导与练习 ( 二级 ) c*c*c==k 例 1.8 程序填空 将输入的十进制整数 n 通过函数 Conversion 转换为十六进制数, 并将转换结果以字符串形式输出 ( 例如, 输入十进制数 125, 将输出十六进制 7d ) # include<stdio.h> char ToChar(int n) { if(n<10) return '0'+n; else 1 ; int Conversion(int x,char *s) { int i=0; while(x!=0) { 2 ; x/=16; i++; return i-1; void main() { int i,k,n; char str[80]; scanf("%d",&n); k=conversion(n,str); for (i=0;i<=k;i++) printf("%c",str[k-i]); 答 : 本题涉及两个知识点 : 整数 10~15 转换成是字符 'a'~'f ' 通过整除/ 和求余 % 运算符进行进制的转换 ( 参见本节关于常量的知识要点 ) 本题 1 的答案为 return 'a'+n-10 本题 2 的答案为 s[i]=tochar(x%16) 1.3 控制结构与语句 1. 知识要点 (1)C 语言的基本语句 1) 表达式语句 : 由表达式加上分号 ; 组成 其一般形式为表达式 ; 执行表达式语句就是计算表达式的值 例如, x=y+z;a=520; 2) 函数调用语句 : 由函数名 实际参数加上分号 ; 组成 其一般形式为函数名 ( 实际参数表 ); 执行函数语句就是调用函数并把实际参数赋予函数定义中的形式参数, 然后执行被

15 调函数体中的语句 例如, 第 1 章 C 语言要点 重点 难点分析 9 printf("helloworld"); 3) 控制语句 : 用于控制程序的流程, 以实现程序的各种结构方式 它们由特定的语 句定义符组成 C 语言有九种控制语句, 可分成以下三类 1 条件判断语句 :if 语句 switch 语句 2 循环执行语句 :do while 语句 while 语句 for 语句 3 转向语句 :break 语句 continue 语句 goto 语句 ( 此语句尽量少用, 因为这不 利结构化程序设计 ) return 语句 上述语句的基本语法和语句的执行过程将在选择结构和循环结构中进行说明 4) 复合语句 : 把多个语句用括号 { 括起来组成的一个语句称复合语句 复合语句在语法上相当于一条语句的作用, 常用于 if 的分支语句 循环结构的循环体语句等 例如, { x=y+z; a=b-c; 是一条复合语句 复合语句内的各条语句都必须以分号 ; 结尾 ; 此外, 在括号 外不能加分号 5) 空语句 : 只有分号 ; 组成的语句称为空语句 空语句是什么也不执行的语句 (2)C 语言程序的基本结构 1) 顺序结构 : 顺序结构是程序中最简单的一种结构 顺序结构的程序主要由赋值语句及数据输入 输出等函数调用语句共同组成, 程序执行时, 按照语句的排列次序依次执行 2) 选择结构 : 在程序设计时, 如果需要根据某些条件作出判断, 决定不同的处理方式, 可以使用选择结构完成 if 语句和 switch 语句可以实现选择结构 1 if 语句 :if 语句的三种形式如下 (a) 单分支 if( 表达式 ) 语句 1; 执行过程 : 先计算表达式的值, 当表达式的值不等于零时, 则执行分支语句, 否则直接执行 if 语句的后续语句 (b) 双分支 if( 表达式 ) 语句 1; else 语句 2; 执行过程 : 先计算表达式的值, 当表达式的值不等于零时, 则执行分支语句 1, 否则执行分支语句 2 (c)if 语句的嵌套形式有如下几种 else-if 嵌套的一般形式 : if( 表达式 1) 语句 1 else if( 表达式 2) 语句 2 else if( 表达式 n-1) 语句 n-1 科学出版社职教技术出版中心

16 10 C 语言程序设计学习指导与练习 ( 二级 ) else 语句 n 执行过程 : 先计算表达式 1 的值, 当表达式 1 的值不等于零时, 则执行分支语句 1, 整个 if 语句执行结束 ; 否则计算表达式 2, 当表达式 2 的值不等于零时, 则执行分支语 句 2, 只有当表达式 1 表达式 2 表达式 n-1 的值都为零时, 执行 else 的分支语 句 n 双分支嵌套 : if( 表达式 1) else if( 表达式 2) 语句 1 else 语句 2 if( 表达式 3) 语句 3 else 语句 4 执行过程 : 先计算表达式 1 的值, 当表达式 1 的值不等于零时, 则计算表达式 2; 当表达式 2 的值不等于零时, 则执行分支语句 1, 否则执行 else 的分支语句 2; 当表达 式 1 的值等于零时, 则计算表达式 3; 当表达式 3 的值不等于零时, 则执行分支语句 3, 否则执行 else 的分支语句 4 使用 if 语句编写选择结构的程序时, 需要注意以下几点 if( 表达式 ) 后面不要随意加分号, 因为分号也是一个语句, 空语句 这样写意 味着如果表达式为真, 则执行空语句, 导致语句的逻辑发生错误 复合语句的使用 : 即如果在条件成立的情况下, 需要完成的工作都由多个语句共 同组成, 这时需要把这些语句组成一个复合语句, 即用 { 将这些语句括在一起 条件成 立则都执行, 否则都不执行 条件不成立的情况下亦同 if 与 else 的匹配 :if 语句有多层嵌套时, 可能出现多个 if 与 else,else 与 if 的匹 配规则是 :else 与前面最靠近它的 可见的 还没有与其他 else 匹配过的 if 匹配 在分支条件较多的情况下,if 的嵌套层次会比较多, 程序可读性比较差 2 switch 语句 switch 语句也可以用来处理多分支结构的情况 switch 语句的一般形式 : switch( 表达式 ){ case 常量表达式 1: 语句组 1 case 常量表达式 2: 语句组 2 case 常量表达式 n: 语句组 n default: 语句组 n+1 执行过程 : 先计算表达式的值, 若表达式值与 case 的常量表达式值 i 相等时, 就从该 case 进入, 执行完后面的所有语句组, 直到遇到 break 语句或者 switch 的结束括号跳出 switch 语句 若表达式值与所有 case 的常量表达式值都不相等, 则从 default 进入, 执行语句组 n+1 使用 switch 语句编写选择结构的程序时, 需要注意以下几点 switch 语句中判断的表达式的值必须是整型或者字符型的

17 第 1 章 C 语言要点 重点 难点分析 11 case 后面的表达式必须是常量 ( 即表达式中不含变量 ), 而且必须是整型或者字 符型的 各个 case 相互之间没有先后次序, 各个常量表达式的值必须唯一 case 的语句 组可以为空或者多条语句 多个 case 可共用一组语句 default 部分可以省略, 也可以出现在其他位置 default 语句的作用 : 当表达式与 所有的 case 表达式的值都不匹配时, 才执行 default 后面的语句组 break 语句在 switch 中的作用 : 强行跳出 switch 语句, 转到 switch 语句的后续语 句执行 3) 循环结构 编程时, 遇到有规律的重复计算或操作, 可以将这些过程写成循环结 构 C 语言中可用于实现循环结构的语句有 while do-while 和 for 1 while 语句的一般形式 : while( 表达式 ) 语句 s 执行过程 : 计算表达式的值, 若表达式的值为真 ( 非零 ) 时, 重复执行语句 s, 否则结束循环, 转到 while 语句的后续语句执行 2 do-while 语句的一般形式 : do 语句 s while ( 表达式 ); 执行过程 : 先执行循环体语句 s, 计算表达式的值, 若表达式值非零, 继续执行循环, 否则循环执行结束, 转到 do-while 语句的后续语句执行 使用 while 语句和 do-while 语句编写循环结构的程序时需要注意以下几点 ( 表达式 ) 是循环条件, 也就是在表达式为真时进行循环 语句 s 是循环体, 也就是循环做什么, 即需要重复执行的语句 循环体中必须有使循环条件向不满足的方向变化的语句, 否则将陷入死循环 复合语句的使用 : 即如果在循环条件成立的情况下, 需要重复完成的工作由多个语句共同组成, 这时需要把这些语句组成一个复合语句 do-while 语句和 while 语句一般情况下可以通用 它们不同之处在于 :do-while 语句是先执行后判断, 循环体至少执行一次 while 语句是先判断后执行, 因此, 循环体有可能一次也不执行 3 for 语句的一般形式 : for( 表达式 1; 表达式 2; 表达式 3 ) 语句 s 执行过程如下 : (a) 先计算表达式 1 科学出版社职教技术出版中心 (b) 计算表达式 2, 当其值为真 ( 非零 ), 执行循环体语句 s 后转 (c), 否则循环结束, 转到 for 的后续语句执行 (c) 计算表达式 3, 然后转 (b) 继续 使用 for 语句编写循环结构的程序时需要注意以下几点 执行 for 语句时, 先执行表达式 1, 且只执行一次, 一般用于循环的准备, 为有关变量赋初值

18 12 C 语言程序设计学习指导与练习 ( 二级 ) 表达式 2 是循环条件, 每次执行循环体语句 s 前, 要判断条件是否成立, 只要其 值非零, 就执行循环体 表达式 3 在循环体语句 s 执行之后执行, 每次循环都执行一遍 ; 一般用于改变与 循环条件有关的变量值, 使循环趋于结束 各表达式可以是任意的 C 语言表达式, 如赋值表达式 逗号表达式等 三个表达式的任一个或多个可以省略, 但两个分号不能省略 如果表示式 2 省略, 等价于表达式 2 的值为 1, 即表示循环条件恒为真, 循环体语句 s 将无限次执行 while 语句 do-while 语句以及 for 语句基本上可以通用,while for 语句为当型循 环 ( 即先判断后循环 ),do-while 语句为直到型循环 ( 即先循环后判断 ) 一般 for 语句常 用于定长循环 ( 即循环次数已知 ) 三种循环语句还可以自身嵌套或者相互嵌套, 即一个循环语句的循环体中又包含循 环语句, 组成多重的循环结构, 以解决更复杂的问题 4) 转向语句 : 在 while 语句 do-while 语句以及 for 语句中, 只有当循环条件不满 足时, 循环终止 如果在循环执行中, 想中途提前结束循环体的执行, 可以使用 break 语句和 continue 语句完成 1 break 语句的一般形式 : break; 功能 : 立即结束循环, 执行循环语句的后续语句 2 continue 语句的一般形式 : continue; 功能 : 跳过 continue 后面的语句, 结束本次循环, 继续下一次的循环 2. 重点及难点 (1) 重点掌握用于选择结构的 if 语句 switch 语句的基本语法和使用方法, 能够编写多路分支的程序 掌握用于循环结构的 while 语句 do-while 语句和 for 语句的基本语法和使用方法, 使用循环结构能够解决如下问题 1) 累加和问题 这一类问题的特点是求一系列加数的和, 而这些加数是呈一定规律变化的 具体算法如下 : 1 设累加和变量 s, 设加数变量 t, 并设置好初值, 一般累加和变量 s 的初值设为零, 加数变量 t 的值根据具体问题设置成第一个加数的值 2 把当前加数变量 t 加到累加和变量 s 中, 然后根据加数的变化规律, 修改加数变量 t 的值得到下一个加数 3 重复执行 2, 直到全部加数都已加完 4 输出累加和变量 s 2) 计算一个整数的位数及各个位上的数字之和 这一类问题的特点是通过灵活的使用取余和整除运算符, 获取一个整数的位数以及

19 第 1 章 C 语言要点 重点 难点分析 13 对它各个位上的数字进行处理 ( 如正序或逆序输出各个位上的数字 求各个位上数字之和等 ), 下面以统计一个整数的位数为例进行说明, 具体算法如下 1 输入一个整数 n, 变量 m 记录 n 的位数,m 的初值设为零 2 n 的个位数为 n%10, 位数 m 加 1 3 个位数处理完毕, 需要把个位数去除, 此处利用整除运算符, 去除个位数之后的 n=n/10 4 重复执行 2, 直至 n 为零为止 ( 所有位已经处理完毕 ) 3) 素数判断, 输出一定范围内的所有的素数或统计它们的个数及和 这一类问题的关键之处在于理解素数的定义, 如果 n 是素数,n 只能被 1 和它自身整除, 那么就可以理解为 2~n-1 中任何一个数都不能整除 n 判断一个数 n 是否是素数, 即判断 2~n-1 之中是否有数能够整除 n, 如果没有, 则 n 是素数, 否则 n 不是素数 具体解法一 : 1 输入一个整数 n, 用变量 i 记录 n 的除数,i 的初值设为 2 变量 flag 作为 n 是否是素数的标记量 如果 flag 为 1, 则 n 是素数 ; 如果 flag 为 0, 则 n 不是素数 flag 初值设为 1, 即初始时假设 n 是素数 2 判断 i 是否能把 n 整除即 n%i 是否为零, 如果是, 则表示在 2~n-1 中找到了能整除 n 的数,n 不是素数, 则把 flag 标记量置为 0, 否则, 执行第 3 步 3 i 加 1, 继续用下一个除数去除 n, 即重复执行第 2 步, 直到 i 大于 n-1( 或大于 n/2 大于 sqrt(n)) 为止 4 判断 flag 的值, 如果仍为 1, 说明在 2~n-1 中没有能把 n 整除的数, 则 n 为素数, 否则,n 不是素数 具体解法二 : 1 输入一个整数 n, 用变量 i 记录 n 的除数,i 的初值设为 2 2 判断 i 是否能把 n 整除即 n%i 是否为零, 如果是, 则表示在 2~n-1 中找到了能整除 n 的数, 则 n 不是素数, 利用 break 语句提前退出循环, 否则, 执行第 3 步 3 i 加 1, 继续用下一个除数去除 n, 即重复执行第 2 步, 直到 i 大于 n-1( 或大于 n/2 大于 sqrt(n)) 为止 4 判断 i 的值, 如果 i 大于 n-1( 或大于 n/2 大于 sqrt(n)), 表示循环正常结束, 即在 2~n-1 中没有找到能把 n 整除的数, 则 n 为素数, 否则,n 不是素数 4) 统计输入的 m 个数中最大值 最小值及平均值的统计问题 以求最小值为例, 具体算法如下 : 1 输入第一个数, 用变量 n 来保存, 变量 min 来保存最小值, 假设第一个输入的数就是最小的, 即 min 赋值为 n, 变量 count 记录输入的数据个数, 初值设为 1 2 输入下一个数, 用变量 n 来保存, 判断 n 和 min 的关系, 如果 n 小于 min, 则修改 min 的值为 n, 同时 count 加 1 3 重复执行第 2 步, 直至 count 大于 m, 即 m 个数据输入结束 4 输出 min 值 5) 统计一行以回车结束的字符中字母 数字 其他字符的个数的统计问题 具体算法如下 : 科学出版社职教技术出版中心

20 14 C 语言程序设计学习指导与练习 ( 二级 ) 1 输入一个字符, 用变量 c 保存, 统计变量 alph digit others 分别用来保存字母 数字 其他字符的个数, 初值均置为零 2 判断字符 c 的情况, 如果 c 在字符 '0'~ 字符 '9' 之间, 则 digit 加 1, 否则判断 c 是否在字符 'a'~ 字符 'z' 或者字符 'A'~ 字符 'Z' 之间 如果是, 则 alph 加 1; 如果不是, 则 others 加 1 3 输入下一个字符, 用变量 c 保存, 重复执行 2, 直到 c 是回车字符为止 ( 即输入结束 ) 4 输出统计变量 alph digit other 此算法中可以使用 (ch=getchar())!='\n' 作为循环条件, 注意括号的层次 6) 穷举法的应用 该算法常用于求解多元方程 鸡兔同笼 百元买百鸡等问题的所有解 下面以求 x 2 +y 2 =10000 的所有整数解为例进行说明 具体算法如下 : 1 x 的初值设为 y 的初值设为 判断 x 2 +y 2 =10000 是否成立, 如果成立, 则 x y 为一对解, 输出 4 y 增加 1, 重复执行 3, 直至 y 大于 100 为止 5 x 增加 1, 重复执行 2, 直至 x 大于 100 为止 (2) 难点 if 语句的嵌套,if 语句多层嵌套时,if 和 else 的配对问题 三种循环的嵌套使用 此外, 一些常规算法中的难点, 例如, 累加和问题的算法中, 找到加数的变化规律 ; 素数的判断方法等 在选择结构 循环结构程序编写中, 复合语句的使用 3. 例题分析例 1.9 阅读下列程序并回答问题, 在每小题提供的若干可选答案中, 挑选一个正确答案 程序 void main() { int m, n, k; scanf("%d", &m); n=k=0; if((m/10)>0) /* 第 7 行 */ n=m; if((m!=0)&&(n==0)) k=m; else k=-1; /* 第 12 行 */ printf("n=%d, k=%d\n", n, k);

21 (1) 程序运行时, 输入 5, 输出 A.n=0, k=5 B.n=5, k=5 C.n=0, k=-1 第 1 章 C 语言要点 重点 难点分析 15 D.n=5, k=-1 (2) 程序运行时, 输入 99, 输出 A.n=99, k=-1 B.n=0, k=-1 C.n=0, k=99 D.n=99, k=99 (3) 将第 12 行改为 "k = -1; n=m/10; " 后, 程序运行时, 输入 99, 输出 A.n=99, k=-1 B.n=9, k=99 C.n=99, k=99 D.n=9, k=-1 (4) 将第 7 行改为 "if((m/10)>0){", 第 12 行改为 "k=-1;" 后, 程序运行时, 输入 5, 输出 A.n=0, k=-1 B.n=0, k=0 C.n=5, k=5 D.n=5, k=-1 答 : 本题主要考查 if-else 语句的分支结构执行过程 第 (1) 题选 A; 第 (2) 题选 A; 第 (3) 题修改后,else 的分支语句只有 k=-1; 而 n=m/10; 是在 if-else 语句之外 需要顺序执行的语句, 所以第 (3) 题选 D; 第 (4) 题修改后从第 8 行一直到第 12 行组 成了一个复合语句, 该复合语句是 if((m/10)>0) 的分支语句, 所以第 (4) 题选 B 例 1.10 阅读下列程序并回答问题, 在每小题提供的若干可选答案中, 挑选一个正 确答案 程序 程序 1 main() { int j, k, c1, c2; c1=c2=0; for(j=1; j<=5; j++){ c1++; for(k=1; k<=j; k++) c2++; printf("%d %d", c1, c2); 程序 2 main() { int j, k, c1, c2; c1=0; for(j=1; j<=5; j++){ c1++; for(k=1, c2=0; k<=j; k++) 科学出版社职教技术出版中心

22 16 C 语言程序设计学习指导与练习 ( 二级 ) c2++; printf("%d %d", c1, c2); 程序 3 main() { int j, k, c1, c2; c1=0; for(j=1; j<=5; j++){ c1++; for(k=1; k<=j; k++, c2=0) c2++; printf("%d %d", c1, c2); 程序 4 main() { int j, k, c1, c2; c1=c2=0; for(j=1; j<=5; j++, c1=0){ c1++; for(k=1; k<=j; k++) c2++; printf("%d %d", c1, c2); (1) 程序 1 运行时, 输出 A.0 15 B.5 0 C.5 5 D.5 15 (2) 程序 2 运行时, 输出 A.0 15 B.5 0 C.5 5 D.5 15 (3) 程序 3 运行时, 输出 A.0 15 B.5 0 C.5 5 D.5 15 (4) 程序 4 运行时, 输出 A.0 15 B.5 0 C.5 5 D.5 15 答 : 本题主要考查对 for 语句的执行过程的理解,for 语句中的表达式 1 在进入循环

23 第 1 章 C 语言要点 重点 难点分析 17 前执行, 且只执行 1 次, 表达式 3 是跟在循环体后执行的, 每次循环都要执行 1 次 因 此, 第 (1) 题选 D; 第 (2) 题选 C; 第 (3) 题选 B; 第 (4) 题选 A 例 1.11 阅读下列程序并回答问题, 在每小题提供的若干可选答案中, 挑选一个正 确答案 程序 void main() { int j; for(j=5; j>0; j--){ if(j==3) continue; /* 第 6 行 */ printf("%d ", j); (1) 程序的输出是 A B C.5 4 D.3 (2) 将第 6 行中的 continue 改为 break 后, 程序的输出是 A B C.5 4 D.3 (3) 将第 6 行中的 continue 删除 ( 保留分号 ) 后, 程序的输出是 A B C.5 4 D.3 (4) 将第 6 行全部删除后, 程序的输出是 A B C.5 4 D.3 答 : 本题主要考查对 break 语句和 continue 语句的执行过程的理解 遇到 Break 语句则立即结束循环, 执行循环语句的后续语句 ; 遇到 continue 语句则是结束本次循环, 继续下一次的循环 因此, 第 (1) 题选 B; 第 (2) 题选 C; 第 (3) 题修改后,if 的分支语句是一个空语句, 选 A; 第 (4) 题修改后,if 的分支语句是 printf("%d ", j);, 选 D 例 1.12 阅读下列程序并回答问题, 在每小题提供的若干可选答案中, 挑选一个正确答案 程序说明 输入一个正整数 n(n>=2), 输出斐波那契 (Fibonacci) 序列的前 n 项, 每行输出 6 个数 斐波那契序列 :1,1,2,3,5,8,13,, 数列的前两个数都是 1, 从第三个数开始, 每个数是前两个数之和 运行示例 : Enter n: 程序 main() { int count, i, n, f1, f2, f; 科学出版社职教技术出版中心

24 18 C 语言程序设计学习指导与练习 ( 二级 ) printf("enter n:"); scanf("%d", &n); f1=f2=1; printf("%6d%6d", f1, f2); (1) for(i=1; i<=n-2; i++){ (2) ; printf("%6d", f); count++; if( (3) ) printf("\n"); f1=f2; (4) ; 供选择的答案 (1)A.count=2 B.count=0 C.count=1 D.count=-1 (2)A.f1=f1 f2 B.f=f1+f2 C.f=f1 D.f=f2 (3)A.count/6==0 B.count%6!=0 C.count%6==0 D.count/6!=0 (4)A.f=f1+f2 B.f2=f1; C.f=f2; D.f2=f; 答 : 本题主要抓住斐波那契序列的特点, 利用循环依次输出序列各项 斐波那契序列第一项和第二项都是 1, 从第三项开始是前面两项之和 如果前面第一项是 f1, 前面第二项是 f2, 则下一项 f=f1+f2, 序列是 f1,f2,f,?, 那么下一项是多少, 因为求法跟上面过程一致, 而它的前面第一项是 f2, 前面第二项是 f, 所以可以考虑把 f1 修改成 f2, 而 f2 修改成 f, 新的 f 则等于新的 f1 加上新的 f2, 以后每一项的求法重复上述过程即可 所以, 第 (1) 题选 A; 第 (2) 题选 B; 第 (3) 题选 C; 第 (4) 题选 D 例 1.13 程序填空 求输入的整数各位数字之和, 如输入 234 则输出 9, 输入 -312 则输出 6 #include<math.h> void main() { int n,s=0; scanf("%d",&n); (1) while(n!=0){ (2)

25 第 1 章 C 语言要点 重点 难点分析 19 n=n/10; printf("%d\n",s); 答 : 本题主要考查利用整除和取余运算符对数字的各个位上的数字进行处理的方法, 参见本节 重点 部分算法 2) (1) 中填 if(n<0) n=-n;,( 2) 中填 s+=n%10; 例 1.14 编写程序 : 输入 x,n 的值, 计算 x/2!+x 2 /3!+x 3 /4!+ +x n /(n+1)! 的结果 答 : 本题主要考查累加和算法的应用 ( 参见本节 重点 部分算法 1)), 注意找出其中加数的变化规律 : 第 i 个 (i=2,3,,n) 加数在前一个加数的基础上, 分子多乘了一个 x, 分母多乘了一个 i+1 也可以考虑第 i 个 (i=1,2,3,,n) 加数的分子是 x 的 i 次方, 分母是 (i+1) 的阶乘, 再套用求 n 的阶乘 (1 n 累乘 ) 的方法和求某个数 x 的 n 次方 ( 将 x 重复乘 n 次 ) 的方法进行计算 解题方法不唯一, 参考程序如下 : void main() { float s=0,a=1,b=1,x; int i,n; printf("input x and n:\n"); scanf("%f%d",&x,&n); for(i=1;i<=n;i++){ a=a*x; b=b*(i+1); s=s+a/b; printf("s=%f",s); 例 1.15 编写程序 : 计算 500~800 区间内素数的个数 cnt 和素数和 sum 答 : 本题主要考查对素数判断算法的理解和多重循环的使用, 对 500~800 之间的数进行逐个的素数判断, 而判断一个数是否为素数可以使用本节 重点 部分算法 3) 来完成 void main() { int i,j,half; int cnt=0,sum=0; for(i=500;i<=800;i++){ half=i/2; for(j=2; j<half; j++) if(i%j==0)break; if(j>=half) {cnt++; sum+=i; printf(" 素数个数是 %d 素数的和是 %d",cnt,sum); 科学出版社职教技术出版中心

26 20 C 语言程序设计学习指导与练习 ( 二级 ) 1.4 数组 1. 知识要点 数组是用同一名字 不同下标组织起来的一组同类型的有序变量的集合 组成数组 的每个数组元素都表示一个变量, 可以像普通变量一样进行操作 使用数组可以方便地处理一批同类型的数据 本章的主要知识点有一维数组 二维数组 字符串 数组与函数 (1) 一维数组的定义 引用和初始化 1) 一维数组的定义 : 类型说明符数组名 [ 常量表达式 ]; 其中, 表示数组大小 ( 即数组元素个数 ) 的常量表达式必须是正整数, 也可以用符号常量 比如 : #define N 5 int a[n]; 以下是非常典型的一个错误 : int n, a[n]; // 数组的大小不可以是变量数组名表示数组在内存中所分配的一块存储区域的首地址, 是一个地址常量 因此, 不允许对数组名进行赋值等操作 例如, 对于数组 a, 执行 a++ 是错误的 a++ 等价于 a=a+1, 但 a 是常量, 不能被赋值 2) 一维数组元素的引用 : 数组名 [ 下标 ] 其中,C 语言中数组元素的下标必须从 0 开始 因此, 如果数组的大小是 n, 则数组元素的下标是从 0 到 n-1 在使用数组元素时, 特别要注意下标不能越界 一维数组元素的地址 : & 数组名 [ 下标 ] 或者数组名 + 下标例如, 定义 int a[10];, 则 a[1] 是数组元素,&a[1] 或 a+1 表示数组元素 a[1] 的地址 由于数组元素的下标是有序的 ( 从 0 开始,1,2, 依次递增 ), 通常通过对数组下标进行循环, 实现对数组的每个元素进行操作 3) 一维数组初始化的形式有整体初始化和局部初始化 如果是整体初始化, 则可以不指定数组的长度 例如 : 整体初始化 : int a[5]={1,2,3,4,5; 整体初始化 : int a[ ]={1,2,3,4,5; 局部初始化 : int a[5]={1,2,3; // 注意剩余的元素值为 0

27 第 1 章 C 语言要点 重点 难点分析 21 注意两种特殊情况 : 如果不初始化, 那么数组元素的值为随机数 ; 如果 int a[5]={0;, 则表示所有的元素都初始化为 0 (2) 二维数组的定义 引用和初始化 1) 二维数组的定义 : 类型说明符数组名 [ 常量表达式 1][ 常量表达式 2]; 其中, 常量表达式 1 表示数组第一维的大小 ( 即行数 ), 常量表达式 2 表示数组第二维的 大小 ( 即列数 ) 它们必须都是正整型常量表达式, 可以用符号常量 例如 : int b[3][4]; // 定义一个 3 行 4 列的二维数组 C 语言中, 二维数组在内存中按行优先存放, 即在内存中先存放第一行的各元素, 然后再存放第二行, 以此类推 或者 2) 二维数组元素的引用 : 数组名 [ 行下标 ][ 列下标 ] 二维数组元素的地址 : & 数组名 [ 行下标 ][ 列下标 ] 数组名 [ 行下标 ]+ 列下标 3) 二维数组的初始化 : 整体初始化 : int b[3][3]={{1,2,3,{4,5,6,{7,8,9; 整体初始化 : int b[3][3]={1,2,3,4,5,6,7,8,9; 整体初始化 : int b[][3]={1,2,3,4,5,6,7,8,9; // 可以省略第一维的大小局部初始化 : int b[3][3]={{1,2,{5,6,7,{9; // 未初始化的元素值为 0 注意 : 二维数组初始化时, 只允许省略第一维大小的定义, 第二维大小一定不能省略 (3) 字符数组的定义 引用和初始化 字符数组用来存放若干字符时, 它的定义 引用和初始化与其他普通数组的类似 C 语言中没有字符串数据类型, 使用字符数组来存放字符串 当字符数组中存放的是字符串时, 它的初始化 输入 / 输出等操作有着不同于其他普通数组的特殊性 C 语言在字符串的最后加了一个 '\0' 字符 ( ASCII 码值为 0), 作为字符串的结束标志, 便于程序中判断字符串是否结束 一维字符数组用来存放一个字符串, 二维字符数组可以存放多个字符串 1) 字符数组的初始化 : 1 一维字符数组的初始化 : char s1[10]={'c','h','i','n','a'; // 其余的元素值为 '\0' char s2[10]={"china"; char s3[10]="china"; char s4[]={'c','h','i','n','a'; char s5[]="china"; 科学出版社职教技术出版中心

28 22 C 语言程序设计学习指导与练习 ( 二级 ) 注意 : 数组 s4 与 s5 的区别 数组 s4 的大小为 5, 其中存放的不是字符串 ( 最后无 串结束符 '\0') 数组 s5 的大小为 6, 其中存放的是字符串 ( 包含 'C', 'h', 'i', 'n', 'a' 及 '\0') 当字符数组用来存放字符串时, 我们更关心字符串的长度, 而不是字符数组的大小 字符串的长度是指字符串中字符的个数, 但不包括串结束符 '\0' 在这里, 要特别注意字 符串长度和 sizeof 的区别 上面的例子中,s1 中存放的字符串的长度是 5, 而 sizeof(s1) 的值是 10 sizeof(s1) 计算整个数组在内存中所占的字节数 束符 ) 2 二维字符数组的初始化 : char str1[3][20]={{"abc",{"efg",{"hijk"; char str2[3][20]={"abc","efg","hijk"; char str3[3][20]={"abc","efg"; //str3[2] 为空串 2) 字符串的输入 / 输出 : 1 第一种方法 : 按一个个字符输入 / 输出 ( 如果按字符串存放, 则最后要加上串结 char s[10],ch; int i, j; for(i=0; (ch=getchar())!='\n'; i++) scanf("%c", &s[i]); s[i]='\0'; for(j=0; j<i; j++) // 输入 // 注意 : 加上字符串结束标志后, 才构成一个字符串 // 输出 printf("%c", s[j]); 2 第二种方法 : 调用 scanf/printf 函数 scanf("%s", 字符数组或字符数组元素地址或字符类型指针 ); 输入若干字符, 存放到数组起始地址或数组元素地址所对应的一块内存空间, 遇到 回车符 Tab 或空格输入结束, 并在最后添加串结束符 '\0' printf("%s", 字符数组或字符数组元素地址或字符类型指针 ); 将以数组起始地址或数组元素地址开始的连续内存空间中的一串字符输出, 直到遇 '\0' 停止 例如 : char s[80]; scanf("%s", s); printf("%s", s); 3 第三种方法 : 调用 gets/puts 函数 gets( 字符数组或字符数组元素地址 ); 功能与上面的 scanf 相同, 但 gets 遇到回车符输入结束 ( 即函数 gets 输入的字符串中可以包含空格或 Tab 字符 ) puts( 字符数组或字符数组元素地址 ); 功能与上面的 printf 相同, 但函数 puts 输出结束时会自动输出一个换行符 例如 : char s[80]; gets(s); puts(s); (4) 字符串处理函数在调用字符串处理函数时, 注意在程序的开始处加上预编译命令 : #include<string.h>

29 1) 求字符串长度函数 : strlen( 字符串 ) 返回字符串的长度, 不包括 '\0' 2) 字符串拷贝函数 : 第 1 章 C 语言要点 重点 难点分析 23 strcpy( 字符数组 1, 字符数组 2); 将字符数组 2 的内容复制到字符数组 1 中 其中, 字符数组 1 的数组大小必须大于 或等于字符数组 2 的大小 3) 字符串连接函数 : strcat( 字符数组 1, 字符数组 2) 将字符数组 2 的内容拼接到字符数组 1 的后面, 结果存放在字符数组 1 中 其中, 字符数组 1 必须足够大, 能容纳拼接后的字符串 函数返回字符数组 1 的首地址 4) 字符串比较函数 : strcmp( 字符串 1, 字符串 2) 比较字符串 1 和字符串 2 的大小 若字符串 1 大于字符串 2, 函数返回 1; 若字符串 1 等于字符串 2, 函数返回 0; 若字符串 1 小于字符串 2, 函数返回 -1 两个字符串的比较, 按逐个比较两个字符串中对应字符的 ASCII 码值来进行 注意 : 不能将一个字符串常量或字符数组直接赋值给另一个字符数组 ; 不能直接使 用关系运算符比较两个字符串的大小 应改为 例如 : char s1[20]= "Monday",s2[20]; s2=s1; s2="tuesday"; if(s1==s2) // 错! 数组名是地址常量, 其值不能改变 // 错! 数组名是地址常量, 其值不能改变 // 这是两个地址的大小比较, 而不是字符串大小的比较 strcpy(s2,s1); strcpy(s2, "Tuesday"); if(strcmp(s1,s2)==0) 注意字符处理库函数与字符串处理库函数的区别 : 字符函数对应的头文件是 ctype.h, 字符串函数对应的头文件是 string.h 字符函数处理的对象是单个字符, 函数参数可以是字符常量 字符变量或字符数组元素 ; 字符串函数处理的对象是字符串, 函数参数可以是字符数组名 字符数组元素的地址或字符指针 (5) 数组与函数 1) 数组元素作函数参数 : 当形参是变量时, 实参可以是常量 变量 表达式, 也可以是数组元素 函数调用时, 参数之间是值传递 2) 数组作函数参数 : 数组可以作函数的形参, 此时实参必须是数组 数组元素的地址或指向数组的指针变量 函数调用时, 形参数组不分配存储空间, 只是将实参数组的首地址传递给形参数组, 使形参数组与实参数组使用同一块存储空间 在函数中访问形参数组, 就是访问实参数组 数组作函数参数时, 需要将数组的首地址和数组的长度传递给函数 科学出版社职教技术出版中心

30 24 C 语言程序设计学习指导与练习 ( 二级 ) 1 一维数组作为函数参数的示例 : 函数类型函数名 (int a[], int n) { 说明 : 形参数组 a 获得实参数组的首地址, 形参 n 获得要处理的数组元素个数 2 二维数组作为函数参数的示例 : 函数类型函数名 (int b[][4], int m, int n) { 说明 : 形参数组 b 获得实参数组的首地址, 形参 m n 获得要处理二维数组的行数 和列数 定义二维形参数组时, 第一维的长度可以省略, 但必须指明第二维的长度, 且 第二维的长度必须与实参数组的第二维长度一致 3 字符数组 ( 存放字符串 ) 作为函数参数的示例 : 函数类型函数名 (char s[]) { 说明 : 字符串末尾有 '\0' 字符作结束标志, 所以数组长度不需要传递给函数, 只需一个字符数组作形参即可 2. 重点及难点 (1) 重点一维数组的排序 插入 删除等常用算法, 二维数组的应用, 字符串的处理 (2) 难点字符串的应用 3. 例题分析 (1) 常规算法 1: 求数组元素的最大值 最小值和平均值 S1: 首先定义一个临时变量 temp( 也可以是 max 或者 min); S2: 假设第一个元素就是最大值或者最小值, 并赋值给 temp; S3: 将剩余元素逐个与 temp 比较, 转到 S4; 直到没有剩余元素, 则转到 S5; S4: 若有元素比 temp 更大或者更小, 则赋值给 temp; 返回到 S3; S5: 最后,temp 就是我们要求的最大值或者最小值 这个算法很基本, 难度不大, 颇受考官的青睐, 读者务必掌握 例 1.16 请编写一个函数 fun, 它的功能是 : 找出一维整型数组元素中最大的值和它所在的下标, 最大的值和它所在的下标通过形参传回 数组元素中的值已经在主函数中赋予

31 第 1 章 C 语言要点 重点 难点分析 25 #include<stdlib.h> void fun(int a[], int n, int *max, int *d) { // 请读者完成这个 fun 子函数 main() { int i, x[20], max, index, n=10; for(i=0; i<n; i++) { scanf("%d", &x[i]); printf("%4d", x[i]); printf("\n"); fun(x, n, &max, &index); printf("max=%5d, index=%4d\n", max, index); 解 : void fun(int a[], int n, int *max, int *d) { // 请读者完成这个 fun 子函数 int i; *max=a[0]; *d=0; for(i=0;i<n;i++) if(a[i]>*max) { *max=a[i]; *d=i; 例 1.17 请编写一个函数 fun, 它的功能是 : 求出一个 2 M 整型二维数组中最大元素的值, 并将最大值返回调用函数 #define M 4 int fun(int a[][m]) { // 请读者完成这个 fun 子函数 main() { int arr[2][m]={5,8,3,45,76,-4,12,82; printf("max=%d\n", fun(arr)); 科学出版社职教技术出版中心

32 26 C 语言程序设计学习指导与练习 ( 二级 ) 解 : int fun(int a[][m]) { // 请读者完成这个 fun 子函数 int i,j,max; max=a[0][0]; for(i=0;i<2;i++) for(j=0;j<m;j++) return max; if(a[i][j]>max) max=a[i][j]; (2) 常规算法 2: 数组元素排序 这是一个最常见的算法, 每一本 C 语言的教材中均有详细的算法解释, 而且有一定 的难度, 希望读者要认真掌握 例 1.18 下列给定程序中, 函数 fun 的功能是 : 用选择法对数组中的 n 个元素按从 小到大的顺序进行排序 请改正程序中的错误, 使它能得出正确的结果 注意 : 不要改动 main 函数, 不得增行或删行, 也不得更改程序的结构 #define N 20 void fun(int a[], int n) { int i,j,t,p; for(j=0; j<n-1; j++) { p=j; /*****found*****/ for(i=0; i<n;i++) if(a[i]<a[p]) { /******found*******/ p=i; t=a[p]; a[p]=a[i]; a[i]=t; main() { int a[n]={9,6,8,3,-1,i,m=5; for(i=0; i<m; i++) printf("%d", a[i]); printf("\n"); fun(a, m);

33 第 1 章 C 语言要点 重点 难点分析 27 for(i=0; i<m; i++) printf("%4d", a[i]); printf("\n"); 解 : 第 1 处 :for(i=0; i<n; i++) 应改为 for(i=j+1; i<n; i++) 第 2 处 :p=i; 应改为 p=j; (3) 常规算法 3: 插入 删除数组元素 例 1.19 假定整数数列中的数不重复, 并存放在数组中 下列给定程序中, 函数 fun 的功能是 : 删除数列中值为 x 的元素, 同时将其他元素前移,n 是数列中元素的个数 请改正程序中的错误, 使它能得出正确的结果 注意 : 不要改动 main 函数, 不得增行或删行, 也不得更改程序的结构 #define N 20 fun(int *a, int n, int x) { int p=0,i; a[n]=x; // 注意 : 该语句为数组设定一个结束标志 while(x!=a[p]) p=p+1; if(p==n) return -1; else { /*******found************/ for(i=p; i<n; i++) a[i+1]=a[i]; return n-1; main() { int w[n]={-3,0,1,5,7,99,10,15,30,90,x,n,i; n=10; scanf("%d", &x); n=fun(w,n,x); if(n==-1) printf("***not be found!***\n\n"); else { printf("the data after delete:\n"); for(i=0; i<n; i++) printf("%5d", w[i]); printf("\n\n"); 科学出版社职教技术出版中心

34 28 C 语言程序设计学习指导与练习 ( 二级 ) 解 : 删除一个数组元素使后面的元素向前移动, 覆盖前面的元素 a[i+1] 排在 a[i] 的 后面, 因此应将 a[i+1]=a[i]; 改为 a[i]=a[i+1]; 考查知识点 : 数组下标操作, 查找算法, 删除算法 思考题 : 1) 如果本题去掉 没有重复元素 的条件, 程序该如何实现? 2) 如果本题去掉 没有重复元素 的条件, 并限定在一个循环内完成, 程序该如何实现? 例 1.20 请补充函数 fun, 该函数的功能是 : 删去一维数组中所有相同的数, 使之只剩一个 数组中的数已按由小到大的顺序排列, 函数返回删除后数组中的数据的个数 例如, 若一维数组中的数据是 :1,1,1,2,2,3,4,4,5,5,6,6,7,7,8,9,9, 10,10 删除后, 数组中的内容应该是 :1,2,3,4,5,6,7,8,9,10 注意 : 给出部分源程序如下 请勿改动主函数 main 和其他函数中的任何内容, 仅在 fun 函数的横线上填入所编写的若干表达式或语句 #define N 80 int fun(int a[], int n) { int i,t,j=0; t=a[0]; for(i=1;i<n;i++) if( 1 ) ; else { 2 ; t=a[i]; a[j]=t; return j; main() { int a[n]={1,1,1,2,2,3,4,4,5,5,6,6,7,7,8,9,9,10,10,i,n=20; for(i=0;i<n;i++) printf("%4d", a[i]); printf("\n"); n=fun(a,n); for(i=0;i<n;i++) printf("%4d", a[i]); printf("\n"); 解 : 第 1 处填空 :t= =a[i] 第 2 处填空 :a[j++]=t

35 第 1 章 C 语言要点 重点 难点分析 29 (4) 字符串相关算法字符 ASCII 码值的应用 字符查找 删除指定字符 各类字符统计 字符串逆置 回文字符串 数字字符串转成整数 字符串长度的比较 子字符串移动 字符串连接 例 1.21 请编写函数 fun, 对长度为 7 个字符的字符串, 除首尾字符外, 将其余 5 个字符按 ASCII 码降序排列 例如, 原来的字符串为 CEAedca, 则排序后输出为 CedcEAa 注意 : 给出部分源程序如下 请勿改动主函数 main 和其他函数中的任何内容, 仅在函数 fun 的花括号中填入所编写的若干语句 void fun(char *s, int num) { /****** 请读者完成 fun 子函数 ******/ main() { char s[10]; gets(s); fun(s,7); printf("%s\n", s); 解 : void fun(char * s, int num) { /****** 请读者完成 fun 子函数 ******/ char t; int i,j; for(i=1; i<num-2; i++) for(j=i+1; j<num-1;j++) if(s[i]<s[j]) { t=s[i]; s[i]=s[j]; s[j]=t; 科学出版社职教技术出版中心 例 1.22 请编写函数 fun, 其功能是 : 将 s 所指字符串中除下标为偶数, 同时 ASCII 值也为偶数的字符之外, 其余的字符全部删除 ; 串中剩余字符所形成的一个新串放在 t 所指的数组中 例如, 若 s 所指字符串中的内容为 "ABCDEFG123456", 其中字符 'A' 的 ASCII 码值为奇数, 因此应当删除 ; 其中字符 B 的 ASCII 码值为偶数, 但在数组中的下标为奇数, 因此也应当删除 ; 而字符 '2' 的 ASCII 码值为偶数, 所在数组中的下标也为偶数, 因此不应当删除, 其他以此类推 最后 t 所指的数组中的内容应是 "246" 注意 : 给出部分源程序如下 请勿改动主函数 main 和其他函数中的任何内容, 仅在函数 fun 的花括号中填入所编写的若干语句

36 30 C 语言程序设计学习指导与练习 ( 二级 ) #include<string.h> void fun(char *s, char t[]) { /****** 请读者完成 fun 子函数 ******/ main() { char s[100],t[100]; scanf("%s", s); fun(s,t); printf("%s\n", t); 解 : void fun(char *s, char t[]) { /****** 请读者完成 fun 子函数 ******/ int i,j=0,n; n=strlen(s); for(i=0; i<n; i++) if(i%2==0&&s[i]%2==0) { t[j]=s[i]; j++; t[j]='\0'; 例 1.23 请编写一个函数 void fun(char a[],char b[], int n), 其功能是 : 删除一个字符串中指定下标的字符 其中,a 指向原字符串, 删除后的字符串存放在 b 所指的数组中, n 中存放指定的下标 例如, 输入一个字符串 "World", 然后输入 3, 则调用该函数后的结果为 "Word" 注意 : 给出部分源程序如下 请勿改动主函数 main 和其他函数中的任何内容, 仅在函数 fun 的花括号中填入所编写的若干语句 #define LEN 20 void fun(char a[], char b[], int n) { /****** 请读者完成 fun 子函数 ******/ main() { char str1[len],str2[len];

37 解 : int n; gets(str1); scanf("%d",&n); fun(str1, str2, n); printf("%s\n", str2); 第 1 章 C 语言要点 重点 难点分析 31 void fun(char a[], char b[], int n) { /****** 请读者完成 fun 子函数 ******/ int i, j=0; for(i=0; i<len; i++) if(i!=n) { b[j]=a[i]; j++; b[j]='\0'; 例 1.24 请编写一个函数 void fun(char *tt, int pp[]), 统计在 tt 字符串中数字字符 '0' 到 '9' 各自出现的次数, 并依次放在 pp 数组之中 例如, 当输入字符串 a12b e23c9de04c 后, 程序的输出结果应该是 : 注意 : 给出部分源程序如下 请勿改动主函数 main 和其他函数中的任何内容, 仅在函数 fun 的花括号中填入所编写的若干语句 void fun(char *tt, int pp[]) { /****** 请读者完成 fun 子函数 ******/ main() { char aa[1000]; int bb[10], k; scanf("%s", aa); fun(aa, bb); for(k=0; k<10;k++) printf("%d", bb[k]); printf("\n"); 科学出版社职教技术出版中心 解 : void fun(char *tt, int pp[]) { /****** 请读者完成 fun 子函数 ******/

38 32 C 语言程序设计学习指导与练习 ( 二级 ) int i; for(i=0; i<10; i++) pp[i]=0; while(*tt) { switch(*tt) { case '0': pp[0]++;break; tt++; case '1': pp[1]++;break; case '2': pp[2]++;break; case '3': pp[3]++;break; case '4': pp[4]++;break; case '5': pp[5]++;break; case '6': pp[6]++;break; case '7': pp[7]++;break; case '8': pp[8]++;break; case '9': pp[9]++; 例 1.25 请补充函数 fun(char *s), 该函数的功能是把字符串中的内容逆置 例如, 字符串中原有的字符串为 abcde, 则调用该函数后, 串中的内容变为 edcba 注意 : 给出部分源程序如下 请勿改动主函数 main 和其他函数中的任何内容, 仅在 fun 函数的横线上填入缩写的若干表达式或语句 #include<string.h> #define N 81 void fun(char *s) { int i=0, t, n=strlen(s); for(; 1 ; i++) { t=*(s+i); 2 ; 3 ; main() { char a[n]; gets(a); puts(a); fun(a); puts(a);

39 第 1 章 C 语言要点 重点 难点分析 33 解 : 第 1 处填空 :s+i<s+n-i 或 i<n-1-i 或 i<n/2 第 2 处填空 :*(s+i)=*(s+n-1-i) 第 3 处填空 :*(s+n-1-i)=t 例 1.26 请补充函数 fun 函数, 该函数的功能是判断一个数是否为回文数 当字符 串是回文数时, 函数返回字符串 :yes!, 否则函数返回字符串 :no!, 并在主函数中输出 所谓回文即正向与反向的拼写都一样, 例如,abcba 注意 : 给出部分源程序如下 请勿改动主函数 main 和其他函数中的任何内容, 仅在 fun 函数的横线上填入缩写的若干表达式或语句 #include<string.h> char *fun(char *str) { char *p1, *p2; int i, t=0; p1=str; p2=str+strlen(str)-1; for(i=0; 1 ;i++) if( 2 ) { t=1; break; if( 3 ) return "yes!"; else return "no!"; main() { char str[50]; scanf("%s", str); printf("%s\n", fun(str)); 解 : 第 1 处填空 :i<=strlen(str)/2 或者 i< strlen(str)/2 或者 p1<p2 第 2 处填空 :*p1++!=*p2-- 第 3 处填空 :t==0 例 1.27 下列给定程序中, 函数 fun 的功能是 : 将一个由八进制数字字符组成的字 科学出版社职教技术出版中心 符串转换为与其值相等的十进制整数 规定输入的字符串最多只能包含 5 位 8 进制数字 例如, 输入 77777, 则输出将是 请改正程序中的错误, 使它能得到正确的结果 注意 : 不要改动 main 函数, 不得增行或删行, 也不得更改程序的结构 #include<string.h> #include <stdlib.h> int fun(char *p) { int n;

40 34 C 语言程序设计学习指导与练习 ( 二级 ) /*****found*****/ n=*p; p++; while(*p!=0) { /*****found*****/ n=n*7+*p-'0'; p++; return n; main() { char s[6]; int i; int n; gets(s); if(strlen(s)>5) { printf("too longer!\n\n"); exit(0); for(i=0;s[i];i++) if(s[i]<'0' s[i]>'7') { printf("its not ocatal digits!\n\n"); exit(0); n=fun(s); printf("%s is converted to integer number: %d\n", s, n); 解 : 第 1 处 :n=*p; 应改为 n=*p-'0'; 第 2 处 :n=n*7+*p-'0'; 应改为 n=n*8+*p-'0'; 例 1.28 请编写一个函数 fun, 它的功能是 : 比较两个字符串的长度 ( 不得调用 C 语言提供的求字符串长度的函数 ), 函数返回较长的字符串 若两个字符串长度相同, 则返回第一个字符串 例如, 输入 beijing<cr>shanghai<cr>(<cr> 为回车键 ), 函数将返回 shanghai 注意 : 给出部分源程序如下 请勿改动主函数 main 和其他函数中的任何内容, 仅在函数 fun 的花括号中填入所编写的若干语句 char * fun(char *s, char *t) { /****** 请读者完成 fun 函数 ******/ main()

41 解 : { char a[20], b[10]; gets(a); gets(b); printf("%s\n", fun(a,b)); char * fun(char *s, char *t) { /****** 请读者完成 fun 函数 ******/ char *p, *t1=t, *s1=s; int n=0,m=0; while(*s1) { n++; s1++; while(*t1) { m++; t1++; if(n>=m) p=s; else p=t; return p; 第 1 章 C 语言要点 重点 难点分析 35 例 1.29 假定输入的字符串中只包含字母和 * 号 请编写函数 fun, 它的功能是 : 将 字符串中的前导 * 号全部移到字符串的尾部 例如, 若字符串中的内容为 ***A*BC*DEF*G, 移动后, 字符串中的内容应当是 A*BC*DEF*G*** 在编写函数时, 不得使用 C 语言提供的字符串函数 注意 : 给出部分源程序如下 请勿改动主函数 main 和其他函数总的任何内容, 仅在函数 fun 的花括号中填入所编写的若干语句 算法如下 : 1) 定义一个指针并指向字符串的首地址 2) 利用循环语句找出字符串的前导 * 的个数 n 3) 利用循环语句把剩余的字符拷贝到字符串中 4) 在字符串的末尾接上 n 个 * #include<conio.h> void fun(char *a) { /****** 请读者完成 fun 函数 ******/ 科学出版社职教技术出版中心

42 36 C 语言程序设计学习指导与练习 ( 二级 ) main() { char s[81]; gets(s); fun(s); puts(s); 解 : void fun(char *a) { /****** 请读者完成 fun 函数 ******/ int i=0, n=0; char *p; p=a; while(*p=='*') { n++; p++; while(*p) { a[i]=*p; i++; p++; while(n!=0) { a[i]='*'; i++; n--; a[i]='\0'; 例 1.30 编写一个函数 fun, 它的功能是 : 实现两个字符串的连接 ( 不使用库函数 strcat), 即把 p2 所指向的字符串连接到 p1 所指的字符串后 例如, 分别输入两个字符串 "FirstStr" 和 "SecondStr", 则程序输出 FirstStrSecondStr 注意 : 给出部分源程序如下 请勿改动主函数 main 和其他函数总的任何内容, 仅在函数 fun 的花括号中填入所编写的若干语句 算法如下 : 1) 用指针遍历第一个字符串, 把指针定位到串尾的结尾标志符 '\0' 处 2) 遍历第二个字符串, 依次把字符拷贝到第一个字符串的末尾 3) 最后赋结尾标志符 #include<conio.h> void fun(char p1[],char p2[]) { /****** 请读者完成 fun 函数 ******/

43 第 1 章 C 语言要点 重点 难点分析 37 main() { char s1[81],s2[40]; scanf("%s%s", s1, s2); puts(s1); puts(s2); fun(s1,s2); puts(s1); 解 : void fun(char p1[],char p2[]) { /****** 请读者完成 fun 函数 ******/ int i=0, n=0; char *p=p1, *q=p2; while(*p) { p++; n++; i=n; while(*q) { p1[i]=*q; q++; i++; p1[i]='\0'; 1. 知识要点 1.5 指针 科学出版社职教技术出版中心 (1) 指针概念系统为 C 语言中定义的各种对象都分配了存储单元, 对象所占存储单元的第一个字节地址称为指针 指针变量用于存放对象的地址 1) 指针变量定义 int *p; // 定义指针变量 p, 存放 int 型变量的地址 2) 指针变量初始化 int a=10, *p=&a; // 定义指针变量 p 的同时初始化 int a=10, *p; p=&a; // 先定义指针变量 p, 再赋值注意 : 指针变量定义后, 需赋值后才可以使用, 否则指向的变量不确定 int *p; *p=100; // 错!

44 38 C 语言程序设计学习指导与练习 ( 二级 ) float a; int *p=&a; 3) 指针运算符 & 变量 // 错! 指针只能指向同类型的变量 // 取变量在内存单元中的首地址 * 地址表达式 // 间接访问指针所指向的对象存取变量中数据有两种方式 : 1 通过变量名直接引用 : int a=100, b; b=a; 2 通过指向变量的指针间接引用 : int b=100, *pb; pb=&b; *pb=800; 4) 指针变量的应用和运算 b=*p; // 将指针 p 所指向的对象值赋给变量 b *p=5; // 将数值 5 赋给指针 p 所指向的对象 5) 指向变量的指针作函数参数 指针作函数参数, 形参与实参之间是传地址 在被调函数中引用或修改形参所指的对象, 实际上就是引用或修改了主调函数中的变量, 实现函数返回多个值 例如 : void swap(int *x, int *y) { int t; t=*x; *x=*y; *y=t; void main() // 主调函数中, 调用函数 swap 时传地址 { int a, b; swap(&a, &b); 调用函数 swap 时, 实参 &a &b 分别传递给形参指针变量 x y, 即 x y 分别指向的主调函数中变量 a b 在函数 swap 中, 将 x 所指对象与 y 所指对象交换, 实际上就是将主函数中的变量 a 和 b 进行了交换, 但实参 &a 和 &b 的值 ( 地址 ) 并没有改变 (2) 指针与一维数组数组名即系统为数组分配的内存单元的起始地址, 是一个指针 ; 对数组元素的引用除了下标引用方式, 还可用指针间接访问 1) 指向数组元素的指针变量 int a[10], *p=a; // 指针变量 p 指向数组元素 a[0] int a[10], *p; p=a; // 同上 2) 存取下标为 j 的数组元素有两种表示方法 : 下标法和指针法 下标法 :a[j] 或 p[j] 指针法 :*(a+j) 或 *(p+j) 3) 指针在数组上的运算 指针变量 ±n: 指向数组元素的指针前移或后移 n 个数组元素 当两个指针变量指向同一个数组时 : 两个指针相减 : 两个指向数组元素的指针之间间隔的数组元素个数

45 第 1 章 C 语言要点 重点 难点分析 39 两个指针关系运算 : 判断两个指向数组元素的指针是否指向同一数组元素 注意 :*p++ 与 (*p)++ 的区别 前者等价于 *(p++), 先得到 p 指向的数组元素的值, 然后执行 p 指向下一个数组元素 后者表示对 p 所指的数组元素的值加 1 4) 一维数组作函数参数 当一维数组作函数形参时, 实参数组将数组的首地址传给形参数组, 实质上就是指 针作函数参数 例如 : 等价于 void sort(double a[], int n){ void sort(double *a, int n){ 函数调用 : sort(b, 5); 实参 b( 数组名或指向数组元素的指针 ) 代表实参数组的首地址, 将 &b[0] 传给 sort 函数 的形参 a, 使指针变量 a 指向主调函数中的 b[0] 数组元素 对 *(a+i) 操作, 即是对主函数 中 b[i] 元素的操作 函数调用 : sort(b+2, 5); 实参 b+2 代表实参数组元素 b[2] 的地址, 将 &b[2] 传给 sort 函数的形参 a, 使指针变量 a 指向主调函数中的数组元素 b[2] 对 *(a+i) 操作, 即是对主函数中 b[i+2] 元素的操作 由此可知, 用数组元素指针 ( 数组中某个元素的地址 ) 作函数参数, 可灵活地对数 组中部分元素进行操作 (3) 指针与二维数组 1) 二维数组的指针 二维数组元素在内存单元中按行存储, 二维数组中有元素指针 行指针两种指针 元素指针 : 数组元素的地址, 如 &a[i][j] a[i]+j 是 a[i][j] 的元素指针 行指针 : 每行的地址, 如 a a+1 分别指向二维数组的第 1 2 行 2) 二维数组元素的三种表示法 :a[i][j] *(*(a+i)+j) *(a[i]+j) 3) 行指针变量的定义 int (*p)[4], a[3][4]; // 行指针变量 p 指向包含 4 个整型元素的一维数组 p=a; // 使 p 指向二维数组 a 的第 1 行通过行指针变量 p 引用数组元素 a[i][j] 的三种形式 :p[i][j] *(*(p+i)+j) *(p[i]+j) 通过行指针变量 p 表示数组元素 a[i][j] 地址的三种形式 :&p[i][j] *(p+i)+j p[i]+j * 4) 行指针作函数参数 行指针变量作函数的形参, 实参可以是二维数组 函数调用时, 实参二维数组将数 组的首地址传递给行指针变量 在被调函数中, 通过行指针变量即可访问主调函数中的实参数组 例如 : void change(int (*p)[5], int n, int m) 等价于 void change(int p[ ][5], int n, int m) 函数调用 : change(a, 5, 5); 科学出版社职教技术出版中心

46 40 C 语言程序设计学习指导与练习 ( 二级 ) 实参 a( 数组名或行指针 ) 是指向数组第一行的指针, 通过将行指针值传给形参 p, 使指 针变量 p 指向主调函数中数组 a 的第一行, 对 *(*(p+i)+j) 操作, 即是对主函数中 a[i][j] 元 素的操作 函数调用 : change(a+2,3,3); 实参 a+2 代表实参数组第三行的指针, 通过将行指针值传给形参 p, 使指针变量 p 指向 主调函数中数组 a 的第三行, 对 *(*(p+i)+j) 操作, 即是对主函数中 a[i+2][j] 元素的操作 操作 由此可见, 用数组某行指针作函数参数, 可灵活地对数组中某几行某几列元素进行 (4) 指针与字符串 1) 字符串指针及定义指向字符串的指针变量 字符串指针 : 字符串中第一个字符的地址 字符串常量的值就是一个字符串的指针, 代表该字符串在内存中存放的起始地址 等价于 定义字符指针变量并初始化, 使字符指针指向字符串的第一个字符 : char *s="welcome"; // 定义字符指针变量 s, 并初始化 char *s; s="welcome"; // 定义指针变量 s 后, 由赋值语句赋值注意 : 指向字符串的字符指针与存放字符串的字符数组的区别 前者是个变量, 没 有存放字符串的存储空间, 只存放字符串的地址 后者有存放字符串的存储空间, 字符数组名代表该存储空间的起始地址, 是一个地址常量 因此, 对字符指针可以进行赋值等操作, 但对数组名则不行 以下例子供读者比较字符指针与字符数组的区别 : char str[20]="welcome"; // 定义字符数组, 并初始化 s="china"; // s 指向字符串的第一个字符 'C' str="china"; // 错误! s++; // s 指向字符串的第二个字符 'h' str++; // 错误! gets(s); // 错误! 指针变量 s 没有存放字符串的存储空间 gets(str); // 输入一个字符串, 存放到字符数组 str 中 2) 指向字符串的指针变量的使用 printf("%s \n", s); // 输出 s 指向的字符串 printf("%c \n", *s); // 输出字符指针 s 指向的字符串中第一个字符注意 : 用循环逐个处理字符串中字符时, 常用结束符 '\0' 作为循环的终止条件 3) 字符串指针作函数参数 字符串指针作函数形参, 实参将字符串的地址传给形参 在被调函数中, 通过形参指针可以访问主调函数中的字符串 例如 : int mystrlen(char *s){ 函数调用 : char a[81]={"hello!"; int n; n=mystrlen(a); 字符数组名 a 作实参, 将字符串的首地址传递给函数的形参 s 于是, 被调函数中

47 指针变量 s 与 a 指向同一字符串 (5) 指针数组 定义格式 : 数据类型 * 数组名 [ 数组长度 ]; 例如 : 第 1 章 C 语言要点 重点 难点分析 41 int *p[4]; // 定义指针数组 p, 有 4 个元素, 各元素存放 int 型对象的地址常用字符指针数组处理多个字符串, 每个数组元素分别指向一个字符串, 可通过引 用字符指针数组的元素来访问字符串 * (6) 指向指针的指针 ( 即二级指针 ) 定义格式 : 数据类型 ** 变量名 ; 二级指针指向的对象是指针类型 例如 : int a=3,*p=&a,**pp=&p; // 定义二级指针变量 pp, 存放指针变量 p 的地址对变量 a 的引用 :a 或者 *p 或者 **pp 对变量 a 地址的引用 :&a 或者 p 或者 *pp 二级指针通常与指针数组结合起来使用 (7) 指针与函数 1) 返回指针的函数定义形式 : 函数类型 * 函数名 ( 形参表 ) { 函数的返回值是一个指针 ( 即地址 ) 2) 函数指针变量的定义形式 : 数据类型 (* 指针变量名 )( 形参表 ); 函数名即系统为函数分配的内存单元的起始地址 ( 即函数的入口地址 ), 是一个指针 可以把函数名赋给一个类型相同的指针变量, 称为函数指针 除了用函数名调用函数, 还可以用指向函数的指针来调用函数 例如 : double (*q)(double, double); double max(double,double),min(double,double); double a,b,x,y; 函数调用 : x=max(a,b); y=min(a,b); // 用函数名调用函数 q=max; x=(*q)(a,b); // 指针 q 指向 max 函数 q=min; y=(*q)(a,b); // 指针 q 指向 min 函数 函数指针作函数参数, 利用其指向不同的函数, 可调用不同的函数, 程序更具通 用性 2. 重点及难点 科学出版社职教技术出版中心 (1) 重点指针变量的定义 初始化和引用 ; 指针变量作为函数参数 定义指针变量指向一维 二维数组元素 ; 通过指针引用一维 二维数组元素 ; 指向数组的指针之间的算术运算和

48 42 C 语言程序设计学习指导与练习 ( 二级 ) 关系运算 ; 数组名或数组元素指针作为函数的参数 定义字符指针变量指向字符串, 通过字符指针引用字符串 ; 字符串指针作函数参数 定义字符指针数组处理多个字符串 函数返回值为指针 注意区分 : 函数调用时的 传值 与 传地址 两个指针之间的交换 ( 地址交换 ) 与 两个指针所指对象之间的交换 ( 值交换 ) 元素指针 与 行指针 (2) 难点指针 数组和地址间的关系及操作 ; 地址与值的关系 ; 通过指针引用变量 ; 指针运算 ; 行指针 ; 指针作为函数参数 ; 通过字符指针处理字符串 指针是整个 C 语言中的难点 3. 例题分析例 1.31 以下语句正确的是 A.int a=0, *p; *p=a; B.int *p=&a; int a; C.int a=2, *p; p=&a; D.int a=2; float *p=&a; 解 : 选项 A 中指针变量 p 没有初始化, 不能将 a 的值赋给 p 所指向的对象 选项 B 中对 a 的引用在 a 的定义之前 选项 C 中指针 p 指向变量 a 选项 D 中 p 只能存放 float 类型变量的地址 本题的答案是 C 例 1.32 设有定义 :int a=0,b=2,*p=&b,*q=&a;, 以下赋值语句中与 b=a; 语句等价的是 A.*p=*q; B.p=q; C.*p=&a; D.p=*q; 解 : 选项 A 是将指针 q 所指向的对象 a 的值赋给指针 p 所指向的对象 b 选项 B 是将指针 q 的值赋给指针 p, 让 p q 指向同一对象 a 选项 C 中,&a 是变量的地址, 而 *p 是指针 p 所指的变量即 b 变量, 不能将地址赋给一个整型变量 选项 D 中错误地将 *q ( 即 q 所指变量 a 的值 ) 赋给指针变量 p( 代表地址 ) 本题的答案是 A 例 1.33 语句 x=*p++; 的作用是 A. 将 *p 的值赋给 x, 然后 p++ B. 将 *p 的值赋给 x, 然后 (*p)++ C. 将 p 的值赋给 x, 然后 p++ D.p++, 然后将 *p 的值赋给 x 解 : x=*p++; 相当于 x=*(p++);, 其作用是将 *p 的值赋给 x, 然后将 p 加 1 而 x=(*p)++; 是将 *p 的值赋给 x, 然后将 *p 加 1 本题的答案是 A 例 1.34 写出如下程序的输出 #include<stdlib.h> void f1(int x, int y) { int t; t=x; x=y; y=t; void f2(int *x, int *y) { int t; t=*x; *x=*y; *y=t;

49 第 1 章 C 语言要点 重点 难点分析 43 void f3(int *x, int *y) { int *t; t=x; x=y; y=t; void f4(int x, int y) { int *t=malloc(sizeof(int)); *t=x; x=y; y=*t; void main() { int i=0, j=1; f1(i, j); printf("(%d,%d)\n", i, j); i=0, j=1; f2(&i, &j); printf("(%d,%d)\n", i, j); i=0, j=1; f3(&i, &j); printf("(%d,%d)\n", i, j); i=0, j=1; f4(i, j); printf("(%d,%d)\n", i, j); 解 : 本题考查 : 函数调用时, 普通变量作形参与指针变量作形参的区别 ; 指针变量作形参时, 被调函数中指针变量所指对象之间的交换与指针变量之间交换的区别 首先注意函数调用时, 只有传地址方式即地址作为实参时, 被调函数才有可能改变主调函数中的变量值 所以, 函数 f1 f4 都不会改变主调函数中实参 i j 的值 其次, 采用传地址方式时, 交换两个指针变量 ( 地址交换, 即交换两个指针变量的指向 ), 并不能交换其指向的变量的值 ; 只有交换两个指针变量所指向的对象值, 才能交换其指向的主调函数中变量的值 所以, 只有函数 f2 交换了主调函数中实参 i j 的值 本题的答案是 : 第 1 行输出 (0, 1); 第 2 行输出 (1, 0); 第 3 行输出 (0, 1); 第 4 行输出 (0, 1) 例 1.35 程序填空 如下程序计算字符串长度 int mystrlen( 1 ) { int i=0; while(*s!='\0'){ i++; 2 ; return i; void main() 科学出版社职教技术出版中心

50 44 C 语言程序设计学习指导与练习 ( 二级 ) { char str[81]={"i like computer!\n"; printf("the length is: %d \n", mystrlen(str) ); 解 : 数组名 str 指向字符串 "I like computer!\n" 的首字符, 函数调用时, 实参 str 将字符串起始地址传递 s 可知,s 应该是字符数组或字符指针 这样,s 与 str 指向同一字符串 在 mystrlen 函数中逐一处理字符串中字符至 '\0', 循环体内字符计数器 i 加 1 后, 指针下移一位, 以处理下一字符 本题 1 的答案为 char *s 或者 char s[] 本题 2 的答案为 s++ 例 1.36 程序填空 如下程序检查一个字符串是否是回文字符串, 是回文字符串时输出 yes, 否则输出 no 回文字符串即正向与反向的拼写都一样的字符串, 例如 :adgda #include<string.h> char *match(char *str) { char *p, *q; int i, t=0; p=str; q= 1 ; for(i=0; i<=strlen(str)/2; i++) if(*p++!=*q--){ t=1; break; if( 2 ) return("yes"); else return("no"); void main() { char str[50]; printf("input:"); scanf("%s",str); printf("%s\n", 3 ); 解 : 函数调用时, 字符数组名作实参, 将数组首地址复制给函数 match 的形参 字符指针变量 str 字符指针变量 p 和 q 分别指向 str 指向的字符串的首字符和末字符 字符串中最后一个字符 ( 在串结束符 '\0' 前 ) 的下标等于 ( 串长 -1) 若 p 和 q 指向的对象值相等, 则 p 指针后移一个字符,q 指针前移一个字符, 继续比较, 直到找到 p q 所指字符不相同或比较到字符串正中 ; 若遇到不相等的情况, 则修改开关变量 t 的值并结束比较 在循环结束后根据 t 的值判断该字符串是否是回文字符串 本题 1 的答案为 str+strlen(str)-1 本题 2 的答案为 t==0 或!t 本题 3 的答

51 案为 match(str) 例 1.37 写出如下程序的输出 第 1 章 C 语言要点 重点 难点分析 45 #include<string.h> main() { char *str[2]={"1234", "5678"; while(*str[1]!='\0'){ printf("%s\n", str[0]+strlen(str[1])-1); str[1]++; 解 : 程序通过字符指针数组 str 来处理多个字符串, 指针数组中每个元素指向一个字符串 数组元素 str[0] 是字符串 "1234" 的首地址 ; 数组元素 str[1] 是字符串 "5678" 的首地址, 即指向字符串 "5678" 中的字符 '5',*str[1] 的值即为字符 '5' str[1]++ 则将 '5' 字符的下一个字符的地址赋给 str[1], 即 str[1] 指向字符串中的 '6' 字符 str[0]+strlen(str[1])-1) 是一个地址表达式, 是 str[0] 所指字符串 "1234" 中第 strlen(str[1]) 个字符 ( 即下标为 strlen(str[1])-1 的字符 ) 的地址 本题的答案是 : 第 1 行输出 4; 第 2 行输出 34; 第 3 行输出 234; 第 4 行输出 知识要点 1.6 函数 (1) 函数的基本概念函数, 就是一段完成某个特定功能的程序 C 语言中的函数分为库函数和用户自定义函数 库函数可以直接使用 常用的库函数有输入 / 输出函数 数学函数 字符函数 字符串函数等 用户自定义函数需要先定义后使用 函数定义的一般形式如下 : 返回值类型说明符函数名 ( 类型说明符形参, 类型说明符形参, ) // 函数头部 { // { 内包含的内容为函数体声明部分语句部分 需要说明的是 : 科学出版社职教技术出版中心 1 返回值类型说明符, 指出该函数通过 return 语句返回值的数据类型, 即为函数类型 若函数无返回值, 则函数类型为 void( 即空类型 ) 若无返回值类型说明符, 则默认的函数类型为 int 2 函数可以有多个形参, 各形参必须单独给出数据类型, 并互相用逗号分隔 ; 也可以没有形参, 但函数名后面的 () 不可省略 3 若函数有返回值, 则函数体中至少包含一个 return 语句 若函数类型与 return 语句中表达式值的类型不一致, 则系统将返回值的类型自动转换成函数类型

52 46 C 语言程序设计学习指导与练习 ( 二级 ) 4 C 语言规定, 在一个函数的函数体内不能定义其他函数, 即函数不能嵌套定义 (2) 函数的调用 函数调用一般形式 : 函数名 ( 实参表 ) 函数调用需要注意 : 1 函数调用时, 直接给出函数名和实参即可, 不要加函数类型和实参类型 2 若有多个实参, 则彼此之间用逗号分隔 若无实参, 则函数名后的 () 不可省略 3 实参与形参的个数必须相等, 对应数据类型应一致 若实参与形参数据类型不一致, 则系统将实参值的类型自动转换成形参的数据类型 函数调用的方式有以下三种 1 语句调用方式 : 函数名 ( 实参表 ); 作为一个独立的语句, 适用于无返回值的函数或不需要返回值的函数 2 表达式方式 : 函数调用作为表达式来使用, 适用于有返回值的函数 3 函数参数方式 : 函数调用作为外层函数调用的实参, 适用于有返回值的函数 在主调函数中, 执行到函数调用语句时, 程序转去执行被调函数 执行过程如下 : 1 若被调函数有形参, 则给形参分配存储空间 2 计算实参表中各实参的值, 并依次传递给形参 ; 若对应的数据类型不一致, 则将实参值的类型自动转换成形参的数据类型 3 执行被调函数的函数体, 直到执行完函数体内的所有语句或遇到 return 语句, 程序 ( 若有返回值, 则带返回值 ) 返回到主调函数中原来的调用点继续执行其余的程序 4 函数调用结束后, 被调函数中的形参自动被释放, 即形参随函数的调用而产生, 随函数调用的结束而消亡 C 语言要求函数先定义后使用 如果被调函数的定义在主调函数的后面, 则在函数调用之前必须对被调函数进行声明 函数声明的一般形式有两种, 即函数类型函数名 ( 类型说明符形参, 类型说明符形参, ); 或者函数类型函数名 ( 类型说明符, 类型说明符, ); 注意 : 函数的声明与函数定义不同, 前者其实只是函数的头部 函数声明的目的是便于编译系统在函数调用时进行语法检查 ( 检查函数名 参数类型与个数等是否匹配 ) (3) 形参与实参之间的数据传递在函数调用时, 实参的值传递给形参的过程称为参数传递 根据实参传递给形参的数据类型的不同,C 语言中的参数传递可分为值传递和地址传递 C 语言规定, 数据传递只能由实参传递给形参, 而不能由形参传回给实参, 即单向传递 值传递 : 当形参是普通变量时, 实参可以是普通变量 数组元素 表达式或常量 函数调用时, 把实参的值复制给形参 函数调用完毕, 并不把形参的结果回传给实参 地址传递 : 当形参是指针变量 数组名时 ( 即传递的不是数据, 而是存储数据的地址 ), 实参也必须是代表同类型变量的地址或数组元素的地址 指针变量 数组名 此时, 仍然是实参把地址值传递给形参, 同样并不把形参的结果 ( 地址值 ) 回传给实参 但是,

53 第 1 章 C 语言要点 重点 难点分析 47 由于数据在被调函数和主调函数中都使用了相同的存储空间 ( 内存地址相同 ), 因此, 在被调函数中修改该存储空间的值, 就是修改了主调函数中该存储空间的值 利用地址传递方式的这个特点, 可以从被调函数中返回多个结果 (4) 函数的嵌套调用和递归调用在调用一个函数的过程中, 又调用了另一个函数, 称为函数的嵌套调用 在调用一个函数的过程中, 又出现直接或间接地调用该函数本身称为函数的递归调用 实际上, 函数的递归调用是嵌套调用的一种特例 函数的递归调用过程分为递推和回溯两个过程 先从原问题出发, 不断递推到下一个子问题, 直到遇到递归出口 ( 已知解 ); 然后从递归出口 ( 已知解的子问题 ) 按递推的逆过程, 逐一求值回溯, 最后回到递归的开始处, 获得原问题的解 编写递归函数时, 必须找出问题的递归公式及递归出口 (5) 变量的作用域根据变量定义的位置不同, 分为全局变量与局部变量 在函数内部定义的变量称为局部变量, 其作用域是在本函数范围内 也就是说, 在该函数外不能使用这些局部变量 在函数外部定义的变量称为全局变量, 其作用域是从定义变量的位置开始到本源文件结束 若全局变量与某个函数中的局部变量同名, 则在该函数中全局变量被屏蔽, 即不起作用 (6) 变量的存储类别 C 语言程序运行时, 供用户使用的存储空间可分为三部分 : 程序区 静态存储区和动态存储区 程序代码存放在程序区, 程序中的数据分别存放在静态存储区和动态存储区 全局变量存放在静态存储区, 而函数的形参则存放在动态存储区 变量的存储类别是指变量在内存中的存储方式, 有静态存储方式和动态存储方式两种 具体包含四种 : 自动变量 静态变量 寄存器变量和外部变量 1) 自动变量 :auto 变量 当在函数内部或复合语句内定义变量时, 若没有指定变量的存储类别, 系统即认为它是 auto 类型 每次进入函数或复合语句时, 在动态存储区为自动变量分配存储空间, 每次都要进行初始化 若程序中没有对其进行初始化, 则其值为不确定 若函数或复合语句执行结束后, 释放其存储空间, 其值不再存在 2) 静态变量 :static 变量 在静态存储区为静态变量分配存储空间, 可分为静态局部变量和静态全局变量 静态局部变量在局部变量定义的前面加上 static, 通常在函数或复合语句内使用 静态局部变量在编译时进行初始化, 且只初始化一次 若程序中没有对其进行初始化, 则系统自动将其初始化为 0 函数或复合语句执行完毕, 静态局部变量的存储空间不被释放, 其值保留不变 直到整个程序运行结束, 静态局部变量的存储空间才被释放 静态全局变量在全局变量定义的前面加上 static 静态全局变量只能被所在文件中的函数使用, 其他文件中的函数不能使用它 3) 寄存器变量 :register 变量 通常对使用频率较高的变量不在内存中分配存储空 科学出版社职教技术出版中心

54 int a[10]; float s; 48 C 语言程序设计学习指导与练习 ( 二级 ) 间, 而是存放在 CPU 的寄存器中, 这样可以提高变量的访问速度 4) 外部变量 :extern 变量 在函数外部定义, 在静态存储区分配存储空间 通常用于一个文件内或不同文件中外部变量的声明 在一个文件中, 若全局变量定义在后, 而引用它的函数在前, 则必须在引用它的函数中用 extern 对该全局变量进行声明 在多文件的程序中, 若在一个文件中定义了全局变量, 其他文件就不能再定义同名的全局变量, 否则多个文件连接时会产生重复定义的错误 但是可以在其他文件中将该全局变量用 extern 声明为外部变量 2. 重点及难点 (1) 重点用户自定义函数的定义和调用, 函数的嵌套调用, 全局变量和局部变量, 静态局部变量和自动局部变量 (2) 难点函数参数的传地址方式, 函数的递归调用 3. 例题分析例 1.38 下列程序中, 正确的函数头部定义是 { void main() { int a,b,c; double x; x=sub(a+b,a+b+c); A.double sub(int x,y) B.double sub(int x,int y) C.sub(int x;int y) D.double sub(int x,int y); 解 : 从主函数中的函数调用, 可以看出函数 sub 有两个形参, 且函数有返回值 若函数有多个形参, 则必须分别对每个形参进行类型说明, 相互之间用逗号分隔 选项 A 中形参 y 无类型说明 选项 C 中形参之间的分隔符错误 函数定义与函数声明语句不同, 函数头部后面不能有分号, 因此选项 D 错误 正确答案是 B 例 1.39 主函数中函数 f 进行了声明, 能正确调用 f 函数的语句是 main() { float f(int x[]);

55 A.s=f(int a[10]); C.s=f(a); 第 1 章 C 语言要点 重点 难点分析 49 B.s=f(a[10]); D.s=f(&a); 解 : 函数 f 中数组作为形参, 这时参数间传递的是地址 因此, 函数调用时实参也 应该是地址 ( 数组首地址或数组元素的地址 ) 主函数中定义了数组 a, 因此 a 可以直接 作为实参 选项 A 中对实参进行类型说明会产生语法错误 选项 B 的实参是 a[10], 代 表的不是地址, 而是值 数组元素 ( 且下标越界 ) 数组名 a 是地址常量, 不能使用取 地址运算符 &, 选项 D 也是错误的 正确答案是 C, 将数组 a 的首地址传递给形参 x 例 1.40 函数 fun 的功能是计算 n! 并返回, 请填空 float fun(int n) { 1 ; int i; for(i=1;i<=n;i++) s=s*i; 2 ; 解 : 函数中引用的局部变量 s 没有定义, 因此本题 1 中应该定义 s 并初始化 函 数类型是 float, 则函数中应该有 return 语句, 将 n! 的计算结果返回 本题 1 的答案 : float s=1 本题 2 的答案 :return s 例 1.41 写出下列程序的运行结果 void f(int x, int y, int add, int mult) { add=x+y; mult=x*y; printf("%d %d ", add, mult); void main() { int a=2,b=3,c=7,d=8; f(a,b,c,d); printf("%d %d\n", c, d); A B C D 解 : 形参是变量, 实参可以是常量 变量或表达式 此时, 参数之间是单向的值传递, 即实参把值复制给形参, 形参的变化与实参无关 本题正确答案是 B 例 1.42 写出下列程序的运行结果 void fun(int x[], int m, int n) { int t; if(m<n) { t=x[m]; x[m]=x[n]; x[n]=t; 科学出版社职教技术出版中心

没有幻灯片标题

没有幻灯片标题 指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,

More information

《C语言程序设计》第2版教材习题参考答案

《C语言程序设计》第2版教材习题参考答案 教材 C 语言程序设计 ( 第 2 版 ) 清华大学出版社, 黄保和, 江弋编著 2011 年 10 月第二版 ISBN:978-7-302-26972-4 售价 :35 元 答案版本 本习题答案为 2012 年 2 月修订版本 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p = &a A. *p = *a B. p = *a C.p = &a D. *p =

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

网C试题(08上).doc

网C试题(08上).doc 学习中心 姓名 学号 西安电子科技大学网络与继续教育学院 高级语言程序设计 (C) 全真试题 ( 闭卷 90 分钟 ) 题号一二三总分 题分 60 20 20 得分 一 单项选择题 ( 每小题 3 分, 共 60 分 ) 1.C 语言程序的基本单位是 A) 程序行 B) 语句 C) 函数 D) 字符 2. 下列四组选项中, 均是不合法的用户标识符的选项是 A)A B)getc C)include D)while

More information

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3 浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.

More information

期中考试试题讲解

期中考试试题讲解 一 选择题 ( 一 ) 1. 结构化程序设计所规定的三种基本结构是 C A 主程序 子程序 函数 B 树形 网形 环形 C 顺序 选择 循环 D 输入 处理 输出 2. 下列关于 C 语言的叙述错误的是 A A 对大小写不敏感 B 不同类型的变量可以在一个表达式中 C main 函数可以写在程序文件的任何位置 D 同一个运算符号在不同的场合可以有不同的含义 3. 以下合法的实型常数是 C A.E4

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

<4D F736F F D205A572D2D A1AAA1AAD4ACE7F42D43D3EFD1D4CAB5D1B5BDCCB3CC2E646F6378>

<4D F736F F D205A572D2D A1AAA1AAD4ACE7F42D43D3EFD1D4CAB5D1B5BDCCB3CC2E646F6378> 第 1 部分 Visual Studio 6.0 开发环境介绍 本书以 Visual C++ 6.0 作为 C 源程序的实践开发环境, 本章将首先介绍 Visual C++ 6.0 环境的基本操作, 包括 Visual C++ 6.0 的安装和启动,C 源程序的编辑 运行与调试 1.1 安装与启动 Visual C++ 6.0 MSDN Visual C++ 6.0 1.1 Microsoft Visual

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

《计算概论》课程 第十九讲 C 程序设计语言应用

《计算概论》课程 第十九讲  C 程序设计语言应用 计算概论 A 程序设计部分 字符数组与字符串 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 字符数组的定义 #include int main() char a[10] = 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ; for (int i = 0; i < 10; i++) cout

More information

2015年计算机二级(C语言)模拟试题及答案(三)

2015年计算机二级(C语言)模拟试题及答案(三) 2016 年计算机二级 (C 语言 ) 模拟试题及答案 (3) 1.( A ) 是构成 C 语言程序的基本单位 A 函数 B 过程 C 子程序 D 子例程 2.C 语言程序从 ( C ) 开始执行 A 程序中第一条可执行语句 B 程序中第一个函数 C 程序中的 main 函数 D 包含文件中的第一个函数 3 以下说法中正确的是( C ) A C 语言程序总是从第一个定义的函数开始执行 B 在 C 语言程序中,

More information

FJXBQ

FJXBQ 高等医学院校选用教材 ( 供成人教育中医药专业 中西医结合专业使用 ) 方剂学 闫润红 主编 2 0 0 1 内容简介本书是供成人教育中医药专业 中西医结合专业使用的教材 全书分总论和各论两部分, 总论部分对中医方剂的基本理论, 如治法 君臣佐使 剂型 剂量等及其现代研究进展进行了介绍 各论部分对常用方剂的主治病证 配伍意义 临床应用 加减变化规律及现代研究概况等内容, 按分类进行了系统阐述 在保证方剂学学科知识结构完整性的前提下,

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 第 1 章程序设计和 C 语言 1.1 什么是计算机程序 1.2 什么是计算机语言 1.3 C 语言的发展及其特点 1.4 最简单的 C 语言程序 1.5 运行 C 程序的步骤与方法 1.6 程序设计的任务 1.1 什么是计算机程序 程序 : 一组计算机能识别和执行的指令 只要让计算机执行这个程序, 计算机就会自动地 有条不紊地进行工作 计算机的一切操作都是由程序控制的, 离开程序, 计算机将一事无成

More information

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期  开放本科  期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默 试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默认扩展名为 ( ) A. cpp B. c C. exe D. obj 2. 设 x 和 y 均为逻辑值,

More information

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc C 语言开发入门 课程教学大纲 ( 课程英文名称 ) 课程编号 :201409210011 学分 :5 学分学时 :60 学时 ( 其中 : 讲课学时 :37 学时上机学时 :23 学时 ) 先修课程 : 计算机导论后续课程 :C++ 程序设计适用专业 : 信息及其计算机相关专业开课部门 : 计算机系 一 课程的性质与目标 C 语言开发入门 是计算机各专业必修的基础课程, 是数据结构 C++ Java

More information

新版 明解C言語入門編

新版 明解C言語入門編 328, 4, 110, 189, 103, 11... 318. 274 6 ; 10 ; 5? 48 & & 228! 61!= 42 ^= 66 _ 82 /= 66 /* 3 / 19 ~ 164 OR 53 OR 164 = 66 ( ) 115 ( ) 31 ^ OR 164 [] 89, 241 [] 324 + + 4, 19, 241 + + 22 ++ 67 ++ 73 += 66

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN: 978-7-302-13599-9, 红色封面答案制作时间 :2011 年 2 月 -5 月一 选择题 1. 以下数组定义中, 错误的是 :C)int a[3]=1,2,3,4; 2. 以下数组定义中, 正确的是 :B) int a[][2]=1,2,3,4; 3. 设有定义 int a[8][10];,

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

没有幻灯片标题

没有幻灯片标题 第 2 章 C 语言的基本数据类型与表达 式 2. 1 C 语言的语法基础 2. 2 C 语言的基本数据类型 2. 3 常量和变量 2. 4 运算符与表达式 2. 5 数据类型转换 用 第 2 章 C 语言的基本数据类型与表达 2.1 C 语言的语法基础 2. 1. 1 C 语言字符集 式 C 语言的基本符号可分 4 个类, 归纳如下 : (1) 英文字母 : 大小写各 26 个, 共计 52 个

More information

新・明解C言語入門編『索引』

新・明解C言語入門編『索引』 !... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN: 978-7-302-13599-9, 红色封面答案制作时间 :2011 年 2 月 -5 月一 思考题 1 函数总需要从 main 中调用吗? 当调用一个函数时, 为什么要使用参数? 函数不是总需要从 main 函数中调用, 使用参数的目的是为了给被调函数传递数据 2 什么是函数的返回值? 是否每个函数都有返回值?

More information

新・解きながら学ぶC言語

新・解きながら学ぶC言語 330!... 67!=... 42 "... 215 " "... 6, 77, 222 #define... 114, 194 #include... 145 %... 21 %... 21 %%... 21 %f... 26 %ld... 162 %lf... 26 %lu... 162 %o... 180 %p... 248 %s... 223, 224 %u... 162 %x... 180

More information

科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心

More information

科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心

More information

科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心

More information

科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心

More information

download.kaoyan.com_2006ÄêÌì½ò¹¤Òµ´óѧ¸ß¼¶ÓïÑÔ³ÌÐòÉè¼Æ£¨409£©¿¼ÑÐÊÔÌâ

download.kaoyan.com_2006ÄêÌì½ò¹¤Òµ´óѧ¸ß¼¶ÓïÑÔ³ÌÐòÉè¼Æ£¨409£©¿¼ÑÐÊÔÌâ 考生注意 : 本试卷共七大题, 满分 150 分 考试时间为 3 小时 ; 所有答案均写在答题纸上 ( 注明题号 ), 在此答题一律无效无效 一 选择题 ( 本题共 20 小题, 每小题 2 分, 满分 40 分 ) 1 char ch 1 2 A 0

More information

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式] 函数 Function 如何重用代码 How to reuse code 3 4 = 3*3*3*3 3 4,6 5 : 拷贝 - 粘帖代码 (Copy-paste code) 3 4,6 5,12 10 : 拷贝 - 粘帖代码 (Copy-paste code) Bad! 使用函数 (with a function) 使用函数 (with a function) 使用函数 (with a function)

More information

nooog

nooog C : : : , C C,,, C, C,, C ( ), ( ) C,,, ;,, ; C,,, ;, ;, ;, ;,,,, ;,,, ; : 1 9, 2 3, 4, 5, 6 10 11, 7 8, 12 13,,,,, 2008 1 1 (1 ) 1.1 (1 ) 1.1.1 ( ) 1.1.2 ( ) 1.1.3 ( ) 1.1.4 ( ) 1.1.5 ( ) 1.2 ( ) 1.2.1

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

技能竞赛C试题

技能竞赛C试题 C 语言程序设计单元测验四 ( 数组 ) 一 单项选择题 ( 每题 1 分, 共 60 分 ) 1 若有以下说明语句 : int a[12]={1,2,3,4,5,6,7,8,9,10,11,12; char c= a,d,g; 则数值为 4 的表达式是 :( ) A a[g-c] B a[4] C a[ d - c ] D a[ d -c] 2 假设 int 型变量占两个字节的存储单元, 若有定义

More information

2015年计算机二级(C语言)模拟试题及答案(四)

2015年计算机二级(C语言)模拟试题及答案(四) 2015 年计算机二级 (C 语言 ) 模拟试题及答案 (4) 一 填空题 1 C 语言中基本的数据类型有 : 2 C 语言中普通整型变量的类型说明符为, 在内存中占 字节, 有符号普通整型的数据范围是 3 整数-35 在机内的补码表示为 4 执行下列语句 int a=8;a+=a-=a*a; 后,a 的值是 5 有如下语句:charA[ ]={ I am a student }; 该字符串的长度是,A[3]=

More information

Microsoft Word - 正文.doc

Microsoft Word - 正文.doc 第 2 章 Java 语言基础 通过本章的实践, 要掌握 Java 中的标识符 关键字 常量, 熟练掌握算术 关 系 逻辑 条件 赋值 位运算符的使用, 掌握简单顺序结构的程序设计 2.1 典型习题解答 2.1 Java 中怎样进行注释? 解答 Java 语言中的注释有 3 种形式 : (1) 单行 : // (2) 多行 : /* */ (3) 文档注释 : /** */ 第三种形式是第二种形式的变形,

More information

林子雨《C语言程序设计》讲义PPT

林子雨《C语言程序设计》讲义PPT C 语言程序设计 厦门大学计算机科学系 2012-02-26 林子雨 ziyulin@xmu.edu.cn 2012-02-26 厦门大学非计算机专业本科生公共课 (2011-2012 第 2 学期 ) C 语言程序设计 林子雨厦门大学计算机科学系 E-mail: ziyulin@xmu.edu.cn 个人主页 :http://www.cs.xmu.edu.cn/linziyu 课程提要 第一章绪论

More information

科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心

More information

科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心

More information

科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心

More information

第一章三角函数 1.3 三角函数的诱导公式 A 组 ( ) 一 选择题 : 共 6 小题 1 ( 易诱导公式 ) 若 A B C 分别为 ABC 的内角, 则下列关系中正确的是 A. sin( A B) sin C C. tan( A B) tan C 2 ( 中诱导公式 ) ( ) B. cos(

第一章三角函数 1.3 三角函数的诱导公式 A 组 ( ) 一 选择题 : 共 6 小题 1 ( 易诱导公式 ) 若 A B C 分别为 ABC 的内角, 则下列关系中正确的是 A. sin( A B) sin C C. tan( A B) tan C 2 ( 中诱导公式 ) ( ) B. cos( 第一章三角函数 1. 三角函数的诱导公式 A 组 一 选择题 : 共 6 小题 1 ( 易诱导公式 ) 若 A B C 分别为 ABC 的内角 则下列关系中正确的是 A. sin( A B) sin C C. tan( A B) tan C ( 中诱导公式 ) B. cos( B C) cos A D. sin( B C) sin A sin60 cos( ) sin( 0 )cos( 70 ) 的值等于

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p NOWOER.OM /++ 程师能 评估. 单项选择题 1. 下 描述正确的是 int *p1 = new int[10]; int *p2 = new int[10](); p1 和 p2 申请的空间 的值都是随机值 p1 和 p2 申请的空间 的值都已经初始化 p1 申请的空间 的值是随机值,p2 申请的空间 的值已经初始化 p1 申请的空间 的值已经初始化,p2 申请的空间 的值是随机值 2.

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 第 12 章再谈指针 本章的基本内容是 : 指针与数组 指针与结构体 动态存储分配 由于指针可以直接对内存进行操作, 所以指针的功能非常 强大 正确灵活地使用指针可以有效地表示复杂的数据结 构, 并可动态分配内存空间, 提高程序的运行效率 任务 12.1 判断回文 问题 输入一个字符串, 判断该字符串是否为回文 ( 首尾对称的字句, 例如 abcba abba 均为回文 ) 要求用指针实现 想法 设两个指针变量

More information

Microsoft Word - 综合试题2.doc

Microsoft Word - 综合试题2.doc 综合测试题二 一 选择题 ( 本大题共 10 小题, 每小题 1 分, 共 10 分 ) 1. C 语言中用于结构化程序设计的三种基本结构是 A. 顺序结构 选择结构 循环结构 B. if switch break C. for while do-while D. if for continue 2. 下列关于 C 语言用户标识符的叙述中正确的是 A. 用户标识符中可以出现下划线和中划线 B. 用户标识符中不可以出现中划线,

More information

Monthly Report 2010_12

Monthly Report 2010_12 年月日 程序设计 -2011 年秋 1 数组的基本概念 一维数组 多维数组 字符数组与字符串 程序设计 -2011 年秋 2 定义形式 类型说明符数组名 [ 常量表达式 ]; 类型说明符数组名 [ 常量表达式 ][ 常量表达式 ]; 引用形式 数组名 [ 下标 ] 数组名 [ 下标 ][ 下标 ] 程序设计 -2011 年秋 3 数组的基本概念 一维数组 多维数组 字符数组与字符串 程序设计 -2011

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章流程控制和数组 3.1 实验目的 (1) 熟练掌握控制台应用程序的代码编写和调试, 以及运行方法 (2) 掌握选择结构的一般语法格式和应用 (3) 掌握 switch 语句的用法 (4) 掌握选择结构的嵌套的用法, 能灵活使用选择结构解决实际问题 (5) 掌握 while 循环语句的一般语法格式 (6) 掌握 for 循环语句的一般语法格式 (7) 掌握循环嵌套的语法格式 (8) 掌握一维数组的定义

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 177 [P179] (1) - [P181] [P182] (2) - for [P183] (3) - switch [P184] [P187] [P189] [P194] 178 [ ]; : : int var; : int var[3]; var 2293620 var[0] var[1] 2293620

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

第4章 栈和队列

第4章  栈和队列 期中考试成绩统计结果 ( 平均 :68) 第 9 讲指针与引用 (Part I) 周水庚 2017 年 11 月 23 日 提要 指针 指针和数组 提要 指针 指针和数组 指针与指针的作用 指针是 C 语言中用于表示程序对象地址的一类数据 指针的作用 间接引用它所指的对象 描述数据和数据之间的关系, 以便构造复杂的数据结构 利用各种类型指针形参, 能使函数增加活力 指针与数组结合, 使引用数组元素的形式更加多样

More information

技能竞赛C试题

技能竞赛C试题 C 语言程序设计单元测验六 ( 指针 ) 一 单项选择题 ( 每题 1 分, 共 54 分 ) 1 有以下程序 void fun(char *a, char *b) { a=b; (*a)++; { char c1='a',c2='a',*p1,*p2; p1=&c1; p2=&c2; fun(p1,p2); printf("%c%c\n",c1,c2); A Ab B aa C Aa D Bb 2

More information

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7>

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7> 能源与动力工程学院 结构化编程 结构化程序设计 循环 循环结构 确定性循环 非确定性循环 I=1 sum=sum+i I = I +1 陈 斌 I>100 Yes No 目录 求和 :1+2+3++100 第四节循环的应用 PROGRAM GAUSS INTEGER I, SUM 计数器 SUM = 0 DO I = 1, 100, 1 SUM = SUM + I print*, I, SUM DO

More information

C

C C 2017 3 14 1. 2. 3. 4. 2/95 C 1. 3/95 C I 1 // talkback.c: 2 #include 3 #include 4 #define DENSITY 62.4 5 int main(void) 6 { 7 float weight, volume; 8 int size; 9 unsigned long letters;

More information

<4D F736F F D20CBB6CABFD1D0BEBFC9FAC8EBD1A7BFBCCAD4B4F3B8D92D383835B3CCD0F2C9E8BCC62E646F63>

<4D F736F F D20CBB6CABFD1D0BEBFC9FAC8EBD1A7BFBCCAD4B4F3B8D92D383835B3CCD0F2C9E8BCC62E646F63> 目录 I 考查目标... 2 II 考试形式和试卷结构... 2 III 考查内容... 2 IV. 题型示例及参考答案... 7 1 全国硕士研究生入学统一考试程序设计考试大纲 I 考查目标 全国硕士研究生入学统一考试计算机技术 软件工程专业学位硕士 程序设计 考试是为江苏大学招收以上硕士生设置的具有选拔性质的考试科目 其目的是科学 公平 有效地测试考生是否具备攻读计算机技术 软件工程专业学位硕士所必须的基本素质

More information

一 关于内存 数据存储 变量分类 局部变量 全局变量 静态变量 请看下面代码, 分析变量类型? int pi = 3; int Area(int r, int *sum) { int b; static int c =0; b = pi * r * r; c += b; *sum = c; retu

一 关于内存 数据存储 变量分类 局部变量 全局变量 静态变量 请看下面代码, 分析变量类型? int pi = 3; int Area(int r, int *sum) { int b; static int c =0; b = pi * r * r; c += b; *sum = c; retu 移动平台应用软件开发 C/C++/JAVA 基础 指针以及指针操作 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组北京大学二零一五年 一 关于内存 数据存储 变量分类 局部变量 全局变量 静态变量 请看下面代码, 分析变量类型? int pi = 3; int Area(int r, int *sum) { int b; static int c =0;

More information

Microsoft PowerPoint - C语言课件-9-结构体.pptx

Microsoft PowerPoint - C语言课件-9-结构体.pptx 第九章结构体 郎大鹏 第九章结构体 9.1 结构体类型的声明方法 9.2 结构体类型变量的定义与使用 9.3 结构体数组 9.4 编程举例 9.5 习题 9.1 结构体类型的声明方法 结构体声明的语法形式如下 : struct 结构体标识符 成员变量列表 ; }; 例如, 为了描述班级 ( 假设仅仅包括班级编号 专业 人数等信息 ), 可以声明如下的结构体类型 struct Class char Code[10];

More information

C/C++ - 函数

C/C++ - 函数 C/C++ Table of contents 1. 2. 3. & 4. 5. 1 2 3 # include # define SIZE 50 int main ( void ) { float list [ SIZE ]; readlist (list, SIZE ); sort (list, SIZE ); average (list, SIZE ); bargragh

More information

untitled

untitled CHAPTER 02 2 CHAPTER 2-1 2-4 2-2 2-5 2-3 2-6 2-1 2-1-1 2-2 02 int A[3] = {10, 20, 30; A[0] 10 A[1] 20 A[2] 30 int *pa[3], A[3]; C 3 pa pa[0]pa[1]pa[2] 3 A A[0]A[1]A[2] 3 A A[0] A + i A[i] A + i &A[i]*(A

More information

C语言最重要的知识点夊习资料

C语言最重要的知识点夊习资料 全国计算机等级考试二级 C 语言上机答题技巧 一 上机改错题的特点和注意事项 1. 上机改错的试题中通常包含两个 ( 或三个 ) 错误需要修改 2. 试题中用 "******found******/" 来提示在下一行 ( 或下面第二行 ) 有错 3. 错误的性质基本分语法错和逻辑错两种, 也有些试题要求把语句添加在下划线处 4. 特别要注意的是 : 只能在出错的行上进行修改, 不要改动程序行的顺序,

More information

<4D F736F F D20D7DBBACFCAD4CCE231B2CEBFBCB4F0B0B82E646F63>

<4D F736F F D20D7DBBACFCAD4CCE231B2CEBFBCB4F0B0B82E646F63> 综合测试题一参考答案 一 填空题 ( 表达式求值 )( 本大题共 10 小题, 每小题 1 分, 共 10 分 ) 设各语句的初始化 相同 :int x=3,y=2,z=1; 1. x=y==z x= 0 2. x=!(z>y)&&!x 1 x= 1 3. x=(y++*1/3) x= 0 4. x=((x>y>z)?1:0) x= 0 5. x*=2+3 x= 15 6. x=(++z*y,y++,z%y)

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 7.5 函数的嵌套调用 C 语言的函数定义是互相平行 独立的 即函数不能嵌套定义 但可以嵌套调用函数 即调用一个函数的过程中, 又可以调用另一个函数 7.5 函数的嵌套调用 main 函数 1 调用 a 函数 2 a 函数 3 调用 b 函数 4 b 函数 5 9 8 7 6 结束 7.5 函数的嵌套调用 例 7.5 输入 4 个整数, 找出其中最大的数 用函数的嵌套调用来处理 解题思路 : main

More information

C C

C C C C 2017 3 8 1. 2. 3. 4. char 5. 2/101 C 1. 3/101 C C = 5 (F 32). 9 F C 4/101 C 1 // fal2cel.c: Convert Fah temperature to Cel temperature 2 #include 3 int main(void) 4 { 5 float fah, cel; 6 printf("please

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN: 978-7-302-13599-9, 红色封面答案制作时间 :2011 年 2 月 -5 月一 选择题 1. 设有程序段 int k=10;while(k=0)k=k-1;, 则下面叙述正确的是 D 循环体语句一次也不执行 2. 设有程序段 int x=0,s=0;while(!x!=0)s+=++x;printf(

More information

Ps22Pdf

Ps22Pdf ( 98 ) C ( ) ( )158 1998 C : C C C,,, C,, : C ( ) : : (, 100084) : : : 7871092 1/ 16 :18 25 :415 : 2000 3 1 2000 3 1 : ISBN 7 302 01166 4/ T P432 : 00016000 : 22 00 ( 98 ) 20 90,,, ;,,, 1994, 1998, 160,

More information

文件

文件 CH10 文件 1 文件的概念 一 文件分类 二 文件的组织结构 : ASCII 码文件 ( 文本文件 ) 二进制文件 文件是二进制代码的, 则文件就是字节流 文件是 ASCII 码的, 则文件就是字符流, 也是字节流 1 如 : 对于整型变量 x, 其值为 32767 若以文本方式存放, 则共有 5 个字符, 内容为 : 00110011 00110010 00110111 00110110 00110111

More information

林子雨《C语言程序设计》讲义PPT

林子雨《C语言程序设计》讲义PPT C 语言程序设计 厦门大学计算机科学系 2012-03-18 林子雨 ziyulin@xmu.edu.cn 2012-03-18 厦门大学非计算机专业本科生公共课 (2011-2012 第 2 学期 ) C 语言程序设计 林子雨厦门大学计算机科学系 E-mail: ziyulin@xmu.edu.cn 个人主页 :http://www.cs.xmu.edu.cn/linziyu 课程提要 第一章绪论

More information

内容简介 C 语言是一种结构化程序设计语言, 本书通过大量的实例讲解 C 语言程序设计的方法, 主要内容包括 C 语言程序的结构 数据类型 运算符和表达式 数据的输入和输出 选择结构 循环结构 数组 函数 指针 编译预处理 结构和共用体 位运算 文件等 每个单元包括小结 实验 习题等 本书可作为高等

内容简介 C 语言是一种结构化程序设计语言, 本书通过大量的实例讲解 C 语言程序设计的方法, 主要内容包括 C 语言程序的结构 数据类型 运算符和表达式 数据的输入和输出 选择结构 循环结构 数组 函数 指针 编译预处理 结构和共用体 位运算 文件等 每个单元包括小结 实验 习题等 本书可作为高等 普通高等教育 十二五 重点规划教材计算机系列中国科学院教材建设委员会 十二五 规划教材 C 语言程序设计 张秀萍主编闫丽王淑霞副主编 北 京 科学出版社职教技术出版中心 www.aboo 内容简介 C 语言是一种结构化程序设计语言, 本书通过大量的实例讲解 C 语言程序设计的方法, 主要内容包括 C 语言程序的结构 数据类型 运算符和表达式 数据的输入和输出 选择结构 循环结构 数组 函数 指针 编译预处理

More information

2001年(下)局域网技术与组网工程试卷答案

2001年(下)局域网技术与组网工程试卷答案 二 一年上半年全国高等教育自学考试计算机基础与程序设计试卷 一 单项选择题 ( 本大题共 20 小题, 每小题 1 分, 共 20 分 ) 在每小题列出的四个选项中只有一个选项是符合题目要求的, 请将正确选项前的字母填在题后的括号内 1.I/O 设备指的是计算机的 ( ) A 存储设备 B 输入和输出设备 C 控制器 D 运算器 2. 具有只读功能的内存储器是指 ( ) A ROM B RAM C

More information

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023) ( CIP) /. :, 2005. 2 ( ) ISBN 7-5624-3339-9.......... TP311. 1 CIP ( 2005) 011794 : : : : * : : 174 ( A ) :400030 : ( 023) 65102378 65105781 : ( 023) 65103686 65105565 : http: / /www. cqup. com. cn : fxk@cqup.

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

关于编写硕士研究生入学考试自命题初试科目

关于编写硕士研究生入学考试自命题初试科目 华北水利水电大学 2019 年硕士研究生入学考试初试科目考试大纲 农业综合知识三 ( 科目代码 :341) 考试大纲 考试形式和试卷结构一 试卷分值及考试时间考试时间 180 分钟 (3 个小时 ), 满分 150 分二 考试基本要求本考试大纲适用于报考华北水利水电大学农业工程与信息技术专业硕士研究生入学考试, 该科目包括 : 数据库 c 语言程序设计 计算机网络三部分内容 三 试卷内容及结构数据库部分占

More information

林子雨《C语言程序设计》讲义PPT

林子雨《C语言程序设计》讲义PPT C 语言程序设计 厦门大学计算机科学系 2013/3/26 林子雨 ziyulin@xmu.edu.cn 2013/3/26 厦门大学非计算机专业本科生公共课 (2012-2013 第 2 学期 ) C 语言程序设计 林子雨厦门大学计算机科学系 E-mail: ziyulin@xmu.edu.cn 个人主页 :http://www.cs.xmu.edu.cn/linziyu 课程提要 第一章绪论 第二章

More information

第4章 栈和队列

第4章  栈和队列 第 7 讲 数组 字符串 指针及其应用 (Part II) 周水庚 2006 年 10 月 18 日 程序设计 -2006 年秋 1 提要 数组的基本概念 一维数组 多维数组 字符数组和字符串 指针和数组 程序设计 -2006 年秋 2 数组 定义形式 类型说明符数组名 [ 常量表达式 ]; 类型说明符数组名 [ 常量表达式 ][ 常量表达式 ]; 引用形式 数组名 [ 下标 ] 数组名 [ 下标

More information

第 10 章结构体和枚举教案 一 授课题目 ( 教学章 节或主题 ) 10.1 结构体及结构体变量 10.2 结构体数组 二 教学时间安排 上课 2 学时 三 教学目的 要求 知识目标 : 学习结构体变量和结构体数组的定义和引用能力目标 : 掌握结构体的初步应用情感目标 : 通过结构体编程实践获得成

第 10 章结构体和枚举教案 一 授课题目 ( 教学章 节或主题 ) 10.1 结构体及结构体变量 10.2 结构体数组 二 教学时间安排 上课 2 学时 三 教学目的 要求 知识目标 : 学习结构体变量和结构体数组的定义和引用能力目标 : 掌握结构体的初步应用情感目标 : 通过结构体编程实践获得成 第 10 章结构体和枚举教案 一 授课题目 ( 教学章 节或主题 ) 10.1 结构体及结构体变量 10.2 结构体数组 二 教学时间安排 上课 2 学时 三 教学目的 要求 知识目标 : 学习结构体变量和结构体数组的定义和引用能力目标 : 掌握结构体的初步应用情感目标 : 通过结构体编程实践获得成就感, 提升 C 语言编程的兴趣 四 教学重点或难点 教学重点 : 结构体数组成员的引用 教学难点 :

More information

<4D F736F F D C4EA33D4C2C8ABB9FABCC6CBE3BBFAB5C8BCB6BFBCCAD4B6FEBCB6B1CACAD4CAD4BEEDBCB0B2CEBFBCB4F0B0B82E646F63>

<4D F736F F D C4EA33D4C2C8ABB9FABCC6CBE3BBFAB5C8BCB6BFBCCAD4B6FEBCB6B1CACAD4CAD4BEEDBCB0B2CEBFBCB4F0B0B82E646F63> 2012 年 3 月全国计算机等级考试二级笔试试卷及参考答案 C 语言程序设计 ( 考试时间 90 分钟, 满分 100 分 ) 一 选择题 ((1)-(10) (21)-(40) 每题 2 分,(11)-(20) 每题 1 分, 共 70 分 ) 下列各题 A) B) C) D) 四个选项中, 只有一个选项是正确的 请将正确选项填涂在答题卡相应位置上答在试卷上不得分 1. 下列叙述中正确的是 A)

More information

内容简介 本书以教育部高等学校计算机科学与技术教学指导委员会编制的 关于进一步加强高等学校计算机基础教学的意见暨计算机基础课程教学基本要求 中有关计算机程序设计基础 (C 语言 ) 课程教学基本要求为指导, 结合教育部考试中心最新的全国计算机等级考试二级 (C 语言程序设计 ) 考试大纲要求和作者多

内容简介 本书以教育部高等学校计算机科学与技术教学指导委员会编制的 关于进一步加强高等学校计算机基础教学的意见暨计算机基础课程教学基本要求 中有关计算机程序设计基础 (C 语言 ) 课程教学基本要求为指导, 结合教育部考试中心最新的全国计算机等级考试二级 (C 语言程序设计 ) 考试大纲要求和作者多 普通高等教育 十二五 重点规划教材公共课系列 中国科学院教材建设专家委员会 十二五 规划教材 C 语言程序设计 张淑华朱丽莉主编 于雪晶顾煜新副主编 北京 内容简介 本书以教育部高等学校计算机科学与技术教学指导委员会编制的 关于进一步加强高等学校计算机基础教学的意见暨计算机基础课程教学基本要求 中有关计算机程序设计基础 (C 语言 ) 课程教学基本要求为指导, 结合教育部考试中心最新的全国计算机等级考试二级

More information

计算概论A B03 C++语言的基本成分 - 运算成分(2)

计算概论A B03 C++语言的基本成分 - 运算成分(2) 计算概论 A 程序设计部分 C 语言的构成成分 运算成分 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn C 语言中的运算符 C 语言的运算符范围很宽 求字节数运算符 : sizeof 下标运算符 [ ] 赋值运算符 = 算术运算符 + - * / % 关系运算符 < > == >= > ~

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

Microsoft Word - YYCXfm.DOC

Microsoft Word - YYCXfm.DOC C 语言程序设计 王曙燕主编曹锰副主编 北京 内容简介 本书共 13 章, 主要内容包括 C 语言的基本概念 基本语法和基本数据结构, 另外, 给出了一个小型超市管理的综合实例, 介绍了 C 语言图形程序设计的基本方法, 还简单介绍了 C++ Visual C++ 和 C# 等面向对象程序设计语言 本书注重应用性和实践性, 通过一些典型算法的解题分析及其实现给读者一些解题示范和启发 每章后面配有习题,

More information

图书在版编目穴 CIP 雪数据做事细节全书 / 赵彦锋编著郾 北京 : 企业管理出版社, ISBN Ⅰ 郾做... Ⅱ 郾赵... Ⅲ 郾工作方法 通俗读物 Ⅳ 郾 B 中国版本图书馆 CIP 数据核字 (2005) 第 号 书

图书在版编目穴 CIP 雪数据做事细节全书 / 赵彦锋编著郾 北京 : 企业管理出版社, ISBN Ⅰ 郾做... Ⅱ 郾赵... Ⅲ 郾工作方法 通俗读物 Ⅳ 郾 B 中国版本图书馆 CIP 数据核字 (2005) 第 号 书 做事细节全书 赵彦锋著 企业管理出版社 图书在版编目穴 CIP 雪数据做事细节全书 / 赵彦锋编著郾 北京 : 企业管理出版社, 2005.11 ISBN 7-80197-338-0 Ⅰ 郾做... Ⅱ 郾赵... Ⅲ 郾工作方法 通俗读物 Ⅳ 郾 B026-49 中国版本图书馆 CIP 数据核字 (2005) 第 136676 号 书 名 : 做事细节全书 作 者 : 赵彦锋 责任编辑 : 吴太刚

More information

Microsoft PowerPoint - 03.Fortran程序设计基础1

Microsoft PowerPoint - 03.Fortran程序设计基础1 简单 Fortran 90 程序的构造形式 : 第二讲 Fortran 程序设计基础 (2) [PROGRAM 程序名 ] [ 声明语句 ] [ 执行语句 ] END [PROGRAM [ 程序名 ]] 程序的书写 (P5) PROGRAM MONEY!calculate balance after interest compounded! 根据利息计算余额 REAL BALANCE, INTEREST,

More information

Static Enforcement of Security with Types

Static Enforcement of Security with Types 例题 1 一个 C 语言程序及其在 X86/Linux 操作系统上的编译结 果如下 根据所生成的汇编程序来解释程序中四个变 量的存储分配 生存期 作用域和置初值方式等方面 的区别 static long aa = 10; short bb = 20; func( ) { } static long cc = 30; short dd = 40; static long aa = 10; func(

More information

test

test C 语言程序设计教案 计算机科学技术学院基础教学部 前言 一. 教学目的 C 语言程序设计是高等学校本专科生计算机基础教学中的一门必修的公共基础课, 也是学习计算机的入门课 教学目的是通过理论教学和实验操作, 使学生掌握 C 程序编写及操作, 使学生具备在信息化社会里工作 学习和生活所必须的计算机编程知识与基本操作技能, 系统地 正确地建立计算机相关概念, 具备独立读写程序的能力, 并使学有余力的同学对

More information

C/C++程序设计 - 字符串与格式化输入/输出

C/C++程序设计 - 字符串与格式化输入/输出 C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int

More information

C++ 程序设计 OJ4 - 参考答案 MASTER 2019 年 5 月 30 日 1

C++ 程序设计 OJ4 - 参考答案 MASTER 2019 年 5 月 30 日 1 C++ 程序设计 OJ4 - 参考答案 MASTER 2019 年 月 30 日 1 1 STRINGSORT 1 StringSort 题目描述 编写程序, 利用 string 类完成一个字符串中字符的排序 ( 降序 ) 并输出 输入描述 输入仅一行, 是一个仅由大小写字母和数字组成的字符串 输出描述 输出排序后的字符串 样例输入 abcde 样例输出 edcba 提示 使用 std::sort

More information

第5章 递归 (Recurve)

第5章  递归 (Recurve) 第 11 讲指针与引用 (Part II) 周水庚 2016-11-24 提要 指针形参 数组形参 字符指针形参 函数形参 返回指针值的函数 程序设计 -2016 年秋 2 提要 指针形参 数组形参 字符指针形参 函数形参 返回指针值的函数 程序设计 -2016 年秋 3 函数形参 函数设置形参的目的是让函数被调用时, 能从调用处获得数据或指针信息 C 语言关于函数形参遵守以下规定 函数调用时, 形参从实参获得初值

More information

1 2005 9 2005,,,,,,,,,, ( http: \ \ www. ncre. cn,, ) 30,,,,,,,, C : C : : 19 : 100081 : : 7871092 1 /16 : 8. 75 : 96 : 2005 11 1 : 2005 11 1 : ISBN 7

1 2005 9 2005,,,,,,,,,, ( http: \ \ www. ncre. cn,, ) 30,,,,,,,, C : C : : 19 : 100081 : : 7871092 1 /16 : 8. 75 : 96 : 2005 11 1 : 2005 11 1 : ISBN 7 1 2005 9 2005,,,,,,,,,, ( http: \ \ www. ncre. cn,, ) 30,,,,,,,, C : C : : 19 : 100081 : : 7871092 1 /16 : 8. 75 : 96 : 2005 11 1 : 2005 11 1 : ISBN 7-80097 - 564-9 /TP 8 : 10. 00 ,,,, 1994 NCRE,,, ( ),,,,,

More information

C/C++ - 字符串与字符串函数

C/C++ - 字符串与字符串函数 C/C++ Table of contents 1. 2. 3. 4. 1 char C 2 char greeting [50] = " How " " are " " you?"; char greeting [50] = " How are you?"; 3 printf ("\" Ready, go!\" exclaimed John."); " Ready, go!" exclaimed

More information

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 第十一讲 运算符重载 与类型转换 运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 为什么要运算符重载 预定义的运算符只针对基本数据类型, 若要对类的对象进行类似的运算, 需要重新定义运算符的功能 运算符重载实质就是函数重载 : 对已有的运算符赋予多重含义, 使得同一个运算符作用于不同类型的数据时导致不同的行为

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 第六讲 指针与字符串 为什么指针 持久动态内存分配 字符串 ( 字符数组 ) 指针 什么是指针 指针的定义与运算 指针与一维 ( 二维 ) 数组 指针数组 指针与引用 指针与函数 2 指针定义 什么是指针 指针变量, 简称指针, 用来存放其它变量的内存地址 指针的定义 类型标识符 * 指针变量名 声明一个指针类型的变量, 星号后面可以留空格 类型标识符表示该指针所指向的对象的数据类型, 即该指针所代表的内存单元所能存放的数据的类型

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc 2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

技能竞赛C试题

技能竞赛C试题 C 语言程序设计试题 第 1 2 3 章概述 类型 表达式 一 选择题 1 一个 C 程序由若干个 C 函数组成, 各个函数在文件中的位置顺序为 :( ) A 任意 B 第一个函数必须是主函数, 其他函数任意 C 必须完全按照执行的顺序排列 D 其他函数可以任意, 主函数必须在最后 2 下列四个叙述中, 正确的是 :( ) A C 程序中的所有字母都必须小写 B C 程序中的关键字必须小写, 其他标示符不区分大小写

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

<4D F736F F D C4EA39D4C23137C8D5B6FEBCB643D3EFD1D4B1CACAD4CAD4BEEDBCB0B4F0B0B85FB1EAD7BCB0E65F2E646F63>

<4D F736F F D C4EA39D4C23137C8D5B6FEBCB643D3EFD1D4B1CACAD4CAD4BEEDBCB0B4F0B0B85FB1EAD7BCB0E65F2E646F63> 2011 年 9 月 17 日全国计算机等级考试 C 语言笔试题 一 选择题 (⑴-(10) (21)-(40) 每题 2 分,(11)-(20) 每题 1 分, 共 70 分 ) 下列各题 A) B) C) D) 四个选项中, 只有一个选项是正确的, 请将正确选项填涂在答题卡相应位置上, 答在试卷上不得分 (1) 下列叙述中正确的是 A) 算法就是程序 B) 设计算法时只需考虑数据结构的设计 C)

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 4.4.1 逻辑运算符及其优先次序 3 种逻辑运算符 : &&( 逻辑与 ) ( 逻辑或 )!( 逻辑非 ) && 和 是双目 ( 元 ) 运算符! 是一目 ( 元 ) 运算符 逻辑表达式 用逻辑运算符将关系表达式或其他逻辑量连接起来的式子 4.4.1 逻辑运算符及其优先次序 判断年龄在 13 至 17 岁之内? age>=13 && age

More information

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年 移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组北京大学二零一五年 预处理 2 预处理器 C 语言的编译系统分为编译预处理和正式编译 预处理作用 : 对源程序编译之前做一些处理, 生成扩展 C 源程序 预处理器的行为是由预处理指令控制的 宏定义 文件包含 条件编译 #define #ifdef

More information

C 语言程序设计 ( 第 33 版 )) #define PI // 下面 2 行是函数的原型说明部分 double sup_area(double r); double volume(double r); // 下面是主函数部分 { double a=-5,b,c,d; b=fab

C 语言程序设计 ( 第 33 版 )) #define PI // 下面 2 行是函数的原型说明部分 double sup_area(double r); double volume(double r); // 下面是主函数部分 { double a=-5,b,c,d; b=fab 第 1 章 C 语言基础与顺序结构 学习目标 1. 掌握 C 语言程序的结构 2. 合理选用数据类型 3. 掌握算术运算符和赋值运算符 4. 掌握控制数据的输入 输出方法 5. 掌握顺序结构以及顺序结构的流程 6. 掌握 Visual C++ 6.0 集成环境的使用方法 7. 掌握转换大小写字母的方法 8. 掌握产生随机整数的方法 计算机由硬件系统和软件系统组成, 其中硬件是物质基础, 而软件是计算机的灵魂

More information

untitled

untitled 串 串 例 : char ch= a ; char str[]= Hello ; 串 列 ch=getchar(); scanf( %c,&ch); 串 gets(str) scanf( %s,str); 8-1 數 ASCII 例 : char ch= A ; printf( %d,ch); // 65 A ascii =0x41 printf( %c,ch); // A 例 : char ch;

More information

Mx* Language Reference Manual 2016 年 4 月 7 日 1 用词说明 未定义 指中央还没有表态指语言定义中不涉及的部分, 编译器和运行时环境如何表现是未知的 主要是为了给学生实现语言留下足够的空间, 标准测试集里不会出现涉及未定义部分的内容 例如 : 术语 : 源程

Mx* Language Reference Manual 2016 年 4 月 7 日 1 用词说明 未定义 指中央还没有表态指语言定义中不涉及的部分, 编译器和运行时环境如何表现是未知的 主要是为了给学生实现语言留下足够的空间, 标准测试集里不会出现涉及未定义部分的内容 例如 : 术语 : 源程 Mx* Language Reference Manual 2016 年 4 月 7 日 1 用词说明 未定义 指中央还没有表态指语言定义中不涉及的部分, 编译器和运行时环境如何表现是未知的 主要是为了给学生实现语言留下足够的空间, 标准测试集里不会出现涉及未定义部分的内容 例如 : 术语 : 源程序大小超过 256M 是未定义的 解释 : 我们测试用的源程序大小不会超过 256M 2 程序结构 Mx*

More information