C++程序设计课后习题答案1-4章.pdf_第1页
C++程序设计课后习题答案1-4章.pdf_第2页
C++程序设计课后习题答案1-4章.pdf_第3页
C++程序设计课后习题答案1-4章.pdf_第4页
C++程序设计课后习题答案1-4章.pdf_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C C 程序设计课后习题答案程序设计课后习题答案 第一章第一章 C 基础知识习题基础知识习题 1 1 判断下列标识符的合法性 sinbook5arry nameExample2 1main 1class cppa3x ymy name 答 合法的 sinbook namemainclass cpp a3 非法的 5arryExample2 1 1x ymy name 1 2假定有下列变量 int a 3 b 5 c 0 float x 2 5 y 8 2 z 1 4 char ch1 a ch2 5 ch3 0 ch4 求下列表达式的值 以及运算后表达式所涉及的各变量的值 x int y ax z b b b x b ch4 ch3 ch2 ch1 int y z int y int z a b int m 5 a char ch a int array 5 1 2 3 4 5 char s Hello 答 China 文字常量 const int n 10 常变量 int m 5 变量 a 文字常量 char ch a 变量 int array 5 1 2 3 4 5 变量 char s Hello 变量 1 4将下列算式或叙述用 C 表达式描述 1 2 x y x y ay 3 位于原点为圆心 a b 为半径的圆环中的点坐标 4 5 并且字符 ch 不为 0 答 pi 2 sqrt asin x asin x c c x y x y pow a y x x y y a a ch2 cin get cin ch3 若从键盘输入 3 2 1 8 7 a b c 执行后各变量取值如何 注意 abc 三字符两两间有空格 答 a 是3 b 是2 x 是1 8 y 是7 ch1是 a ch2是空格 ch3是 b 1 7设有语句 int a b c d cin oct a b hex c dec d 若从键盘输入 23232323 执行后各变量的值用十进制表示各是多少 答 a 19 b 19 c 35 d 23 1 8对于习题1 7 若执行 cout a t hex b t oct c 课后习题答案 第二章基本控制结构程序设计习题第二章基本控制结构程序设计习题 一 基本概念与基础知识自测题 2 1程序阅读题 2 1 1设有说明 int a 3 b 100 下面的循环语句执行 1 次 执行后 a b 的值分别为 2 3 while b a 5 if b a 25 a elseb a 解答 本题检查学生整除的概念 跟踪 abb a循环次数b a 310033197 410025296 510020395 1510061385 1610061484 171005停 1 14 2 17 3 100 2 1 2设有说明 int x y n k 下面程序段的功能是备选答案中的 1 当 n 10 x 10打印结果是 2 cin x n k 0 do x 2 k while k n y 1 x k 0 do y y y k while k n cout y endl 备选答案 A B C D 解答 第一个循环使 x 成为 y 成为 第二个循环使 y 成为 1 B 考虑整除 当 x 连除4次2以后即为0 所以 为0 2 1 2 1 3请看如下程序段 if num 1 cout Alpha else if num 2 cout Bata else if num 3 cout Gamma else cout Delta 当 num 的值分别为1 2 3时 上面程序段的输出分别为 1 2 3 解答 检查条件语句与字符串输出概念 1 Alpha 2 Bata 3 Gamma 2 1 4执行下面程序段后 m 和 k 的值分别为 1 2 int m k for k 1 m 0 k 10 break if m 2 0 m 5 continue m 3 解答 注意 continue 语句的使用 初值m 0k 1 第1次循环后m 5k 2 第2次循环后m 2k 3 第3次循环后m 7k 4 第4次循环后m 4k 5 第5次循环后m 9k 6 第6次循环后m 6k 7 第7次循环后m 11k 8 第8次循环m 11结束k 8 k 未做 1 11 2 8 二 编程与综合练习题 2 2有一个函数 编写程序 输入 x 输出 y 解 include using namespace std int main double x y cout x if x 1 y x else if x 10 y 2 x 1 else y 3 x 11 cout y y endl return 0 2 3设计程序将输入的百分制成绩转换为五分制输出 90分以上为5分 80 89分 为4分 70 79分为3分 60 69分为2分 60分以下为1分 解 10分一档用10进行整除获得 转换用开关语句实行 include using namespace std int main int mark result mark 是百分制成绩 result 是5分制 cout 请输入百分制成绩 mark if mark 0 cout 缺考 endl return 0 switch mark 10 case 9 case 10 result 5 cout 输出五分制成绩 result endl break case 8 result 4 cout 输出五分制成绩 result endl break case 7 result 3 cout 输出五分制成绩 result endl break case 6 result 2 cout 输出五分制成绩 result endl break case 5 case 4 case 3 case 2 case 1 case 0 result 1 cout 输出五分制成绩 result endl break default cout 输入错误 endl return 0 2 4编程计算个人所得税 个人所得税率表如下 月收入1200元起征 超过起征 点500元以内部分税率5 超过500元到2 000元部分税率10 超过2 000元到 5 000元部分税率15 超过5 000元到20 000元部分税率20 超过20 000元到 40 000元部分税率25 超过40 000元到60 000元部分税率30 超过60 000元到 80 000元部分税率35 超过80 000元到100 000元部分税率40 超过100 000 元部分税率45 解 应该从最高税率段开始计算 分段叠加 先算两万元以上各段 每两万为一 档 采用 switch 语句 注意没有使用 break 语句 后面各低收入段 用 if 语句 也没有使用 else 这两种方法是对应的 第二要注意计算的入口处 收入减去该 段的下限 进行计算 以后各段都是完整的段 计算十分简单 include using namespace std int main double income tax 0 int k cout 请输入个人月收入 income if income 1200 cout 免征个人所得税 20000 k income 20000 switch k default tax income 100000 0 45 income 100000 case 4 tax income 80000 0 40 income 80000 case 3 tax income 60000 0 35 income 60000 case 2 tax income 40000 0 30 income 40000 case 1 tax income 20000 0 25 income 20000 if income 5000 tax income 5000 0 20 income 5000 if income 2000 tax income 2000 0 15 income 2000 if income 500 tax income 500 0 10 income 500 tax income 0 05 cout 应征所得税 tax endl return 0 2 5编程打印如下图形 解 难点在三角形左边的空格的控制 嵌套一个循环语句完成此任务 include using namespace std int main int i j for i 1 i0 j cout 三角形每行前部的空格 for j 1 j 2 i 1 j cout cout endl for i 1 i 3 i cout n return 0 2 6编程输出下列图形 中间一行英文字母由输入得到 A B B B C C C C C D D D D D D D C C C C C B B B A 解 分上三角和下三角两部分分别处理左边的空格 include using namespace std int main char in int i j do cout in if in 97 小写改大写 while in90 int line in A for i 0 i0 j cout 前方空格 for j 1 j 2 i 1 j cout char i A cout 0 i 下三角 少一行 for j 0 j line i j cout for j 1 j 2 i 1 j cout char i 1 A cout endl return 0 2 7输入 n 求1 2 3 n 解 通常求和作为外循环 阶乘作为内循环 这里考虑到 n n n 1 利用 递推法运算速度大大提高 同时两者可合并为一个循环 本程序考虑了输入的健 壮性 include include using namespace std int main int n i jch 1 double result 0 result 是结果 cout 请输入正整数 n n if n 1 cout 输入错误 endl return 1 result 1 for i 2 i n i jch i jch 是 i 的阶乘 注意 n n n 1 这样可少一层循环 result jch cout result endl return 0 2 8猴子吃桃问题 猴子摘下若干个桃子 第一天吃了桃子的一半多一个 以后 每天吃了前一天剩下的一半多一个 到第十天吃以前发现只剩下一个桃子 问猴 子共摘了几个桃子 解 采用递推法 从最后一天逆推到第一天 9次循环 include using namespace std const int day 10 int main int i x 1 最后一天只有一个 for i 1 i day i x x 1 2 从一天前推到九天前 cout 开始共有桃子 x 个 n return 0 2 9从键盘输入一组非0整数 以输入0标志结束 求这组整数的平均值 并统计 其中正数和负数的个数 解 将这组整数放在整型数组中 一边输入一边求和及统计正数和负数的个数 平均数由和除以整数数量取得 include include using namespace std int main int stem 256 sum 0 pnum 0 nnum 0 i 0 cout 从键盘输入一组非0整数 以输入0标志结束 stem i while stem i 0 sum stem i 求和 if stem i 0 pnum 正数数量 else nnum 负数数量 i cin stem i if i cout 0个数 endl else cout 平均值 double sum pnum nnum endl 平均值习 惯不用整数 cout 正数个数 pnum endl cout 负数个数 nnum endl return 0 2 10编程找出1 500之中满足除以3余2 除以5余3 除以7余2的整数 解 中国古代数学问题 韩信点兵 采用穷举法 注意三个条件同时成立用 int main int i for i 1 i 500 i if i 3 2 return 0 2 11编程求1000之内的所有完全数 所谓完全数指的是一个数恰好等于它的所有 因子和 例如6 1 2 3 就是一个完全数 解 采用穷举法 两重循环 外层是从1到999依次处理 内层是求该数的所有因 子的和 并判断是否等于该数 include using namespace std int main int i a sum yz sum yz 是 a 的因子和 for a 1 a 1000 a sum yz 0 for i 1 i a i if a i 0 sum yz i 求因子运算未改变循环控制变量 a 的值 否则要用另一个变量 b 来代 替 a 来参加运算 if a sum yz cout a endl return 0 2 12将100元换成用10元 5元和1元的组合 共有多少种组合方法 解 采用穷举法 考虑10元最多10张 5元最多20张 余下是1元 include using namespace std int main int i j k count 0 for i 0 i 10 i i 是10元张数 j 是5元张数 k 是1元张数 for j 0 j 0 cout i t j t k endl count cout count endl return 0 2 13利用反正切展开计算 的近似值 要求误差10 5 公式如下 令 x 1 可计算出 4的近似值 解 采用递推法 初看每一项的递推通式不易写出 但每一项全看作奇数项 而 偶数项全为零 则很容易写出 第1项为 x 第3项为第1项乘以 x 的平方除以项 序号3乘以 1 其余类推 同时和的误差小于最后一项的绝对值 include include using namespace std const double e 1e 5 int main double x a sum int i 3 cout 请输入正切值 x a x sum x do a x x 1 sum a i i 2 while fabs a i e cout arctg x sum endl return 0 2 14用迭代法求方程 x2 10cosx 0的根 误差限为10 5 迭代公式如下 解 迭代法也是用循环语句实现 数学上迭代法可能收敛 也可能发散 解答中 加了最大迭代次数的限制 include include using namespace std const double e 1e 5 int main double x0 x1 int n 0 cout 输入初始近似值 x1 do x0 x1 x1 x0 x0 10 x0 sin x0 cos x0 2 x0 10 sin x0 x0是上次算出的结果 x1用作保存新算出的结果 n while fabs x1 x0 e else cout 方程 x x 10 cos x 0的一个根为 x1 endl cout 方程误差为 x1 x1 10 cos x1 endl return 0 2 15两队选手每队5人进行一对一的比赛 甲队为 A B C D E 乙队为 J K L M N 经过抽签决定比赛配对名单 规定 A 不和 J 比赛 M 不和 D 及 E 比赛 列出所有可能的比赛名单 解 这是一个组合问题 使用穷举法 共有5个位置 设甲队5名队员位置不变 乙队改变队员位置 进行配对 注意第1个位置可在5个队员中任选一个 以后的 位置必须扣除已选过的队员 并扣除不能配对的情况 即得所有可能的比赛名单 include using namespace std int main char st1 5 A B C D E st2 5 J K L M N int i 0 j k l m n for j 0 j 5 j 0号位 if j 0 continue A 选手不与选手 J 比赛 即 st1 0 不与 st2 0 比赛 for k 0 k 5 k 1号位 if k j continue 剔除乙队占据0号位的选手 for l 0 l 5 l 2号位 if l j l k continue 剔除乙队占据0 1号位的 选手 for m 0 m 5 m 3号位 if m j m k m l continue 剔除乙队 占据0 1 2号位的选手 if m 3 continue st1 3 不与 st2 3 比赛 即 D 不与 M 比赛 for n 0 n 5 n 4号位 if n j n k n l n m continue 剔除乙队占据0 1 2 3号位的选手 if n 3 continue st1 4 不与 st2 3 比赛 即 E 不与 M 比赛 cout st1 0 st2 j t st1 1 st2 k t cout st1 2 st2 l t st1 3 st2 m t cout st1 4 st2 n endl i cout i endl return 0 2 16编程模拟选举过程 假定四位候选人 zhang wang li zhao 代号分别为 1 2 3 4 选举人直接键入候选人代号 1 4之外的整数视为弃权票 1为终 止标志 打印各位候选人的得票以及当选者 得票数超过选票总数一半 名单 解 用5个元素的整型数组 分别放弃权票和各候选人的得票 然后用开关语句 打印 include include using namespace std int main enum candidate feipiao zhang wang li zhao cand int vote 5 0 i k 0 n cin n while n 1 k if n 1 for i 0 i 5 i cand candidate i switch cand case feipiao cout setw 10 feipiao t vote cand endl break case zhang cout setw 10 zhang t k 2 cout 当选 endl else cout endl break case wang cout setw 10 wang t k 2 cout 当选 endl else cout endl break case li cout setw 10 li t k 2 cout 当选 endl else cout endl break case zhao cout setw 10 zhao t k 2 cout 当选 endl else cout endl break return 0 2 17改造 例2 14 将运行结果 Fibonacii 数列的前20项 存入文件 解 采用3步法 所谓3步法 是将书上的第1和第2步合并 格式如下 首先建立或打开一个输出文件 并与磁盘文件联系 ofstream ofile myfile2 17 txt 再按一定格式存入数据 ofile setw 15 fib0 setw 15 i j k l 等 并输出 最后关闭文件 file close include include include using namespace std const int m 20 int main int fib0 0 fib1 1 fib2 i j k l n char ch ofstream ofile myfile2 17 txt ofile setw 15 fib0 setw 15 fib1 for n 3 n m n fib2 fib0 fib1 ofile setw 15 fib2 if n 5 0 ofile endl 控制每行5个数据 fib0 fib1 fib1 fib2 ofile close cout 是否要将文件输出 Y 或 N ch if ch y ch Y ifstream ifile myfile2 17 txt while 1 ifile i j k l n 由文件读入 if ifile eof 0 break cout setw 15 i setw 15 j setw 15 k setw 15 l setw 15 n endl 显示 ifile close return 0 2 18改造 例2 19 将运行结果 100以内素数 存入文件 解 采用4步法 首先定义一个输出文件 ofstream ofile 再打开该文件并与并与磁盘文件联系 ofile open myfile2 18 txt 按一定格式把数据存入文件 最后关闭文件 效果与3步法相同 读文件同样可用3步法或4步法 include include include include using namespace std const int n 100 int main int a n i j char ch b 256 ofstream ofile ifstream ifile for i 0 i n i a i 1 i 用数组保存整数1 100 a 0 0 1不 是素数 置0 for i 0 i n i if a i 0 continue 该数已经置0 判 断下一个数 for j i 1 j n j if a j a i 0 a j 0 是 a i 倍数的元素置 0 ofile open myfile2 18 txt int count 0 ofile 1 n 之间的素数 endl for i 0 i n i 输出所有 素数 if a i 0 ofile setw 6 a i count if count 10 0 ofile endl 每行10个数据 ofile close cout 是否要将文件输出 Y 或 N ch if ch y ch Y ifile open myfile2 18 txt i 0 while ifile get b i 不可用 它不能读白字符 if b i n break i b i 0 cout b i 由文件读入 cout setw 6 i 屏幕显示 count if count 10 0 cout endl 每行10个数 if ifile eof 0 break 最后一个数据后面可能没有回车 直接为 文件结束 ifile close cout endl return 0 2 19改造 例2 13 文本由文本文件输入 解 文本文件读入要用成员函数 ifile get 而不可用插入运算符 否则会丢 失空白字符 include include using namespace std int main char ch int nline 0 nword 0 nch 0 int isword 0 ifstream ifile ep2 19 cpp cout 读入 ep2 19 cpp endl do ch ifile get if ch n nline 遇换行符行数 1 if ch 在 单词的起始处给单词数 1 nch 字符数加 1 isword 1 else isword 0 读到间隔符 while ch EOF 读到文本结 束符为止 ifile close cout 行数 nline endl cout 单词数 nword endl cout 字符数 nch 课后习题答案 第三章函数习题 一 基本概念与基础知识自测题 3 1填空题 3 1 1被定义为形参的是在函数中起 1 作用的变量 形参只能用 2 表示 实参的作用是 3 实参可以用 4 5 6 表示 答案 1 自变量 2 变量名 3 将实际参数的值传递给形参 4 具有值的变量 5 常量 6 表达式 3 1 2局部域包括 1 2 和 3 使用局部变量的意义在于 4 答案 1 块域 2 函数域 3 函数原型域 4 局部变量具有局部作用域使得程序在不同块中可以使用同名变量 3 1 3静态局部变量存储在 1 区 在 2 时候建立 生存期为 3 如定义 时未显式初始化 则其初值为 4 答案 1 全局数据区 2 编译 3 全局生存期 4 全0 3 1 4局部变量存储在 1 区 在 2 时候建立 生存期为 3 如定义时未 显式初始化 则其初值为 4 答案 1 栈 2 在函数或块开始执行时 3 函数或块的执行期 4 随机值 3 1 5编译预处理的作用是 1 预处理指令的标志是 2 多文件系统中 程 序由 3 来管理 用户自定义头文件中通常定义一些 4 答案 1 将源程序文件进行处理 生成一个中间文件 编译系统对此中间文件进 行编译并生成目标代码 2 3 工程文件 4 用户构造的数据类型 如枚举类型 外部变量 外部函数 常量和内联 函数等具有一定通用性或常用的量 3 1 6 设有函数说明如下 int f int x int y return x y 1 假定 a 10 b 4 c 5 下列语句的执行结果分别是 1 和 2 1 cout f a b f a c 2 cout f f a c b f b c 解答 1 a x y f a b 返回值 c b 4 5 f a c 返回值 3 1 f a b 域 f a c 域 10 4 return x y 1 x y 10 5 return x y 1 main 域 10 答案 4 2 b x x y y x a c 10 4 5 y 4 5 f a c b 域 f b c 域 15 4 return x y 1 4 5 return x y 1 f f a c b f b c 域 return x y 1 f f a c b f b c 返回值 5 main 域 答案 5 3 1 7下列程序的输出结果分别为 1 和 2 1 include using namespace std int a b void f int j static int i a 注意静态局部变量 int m n m i j i j n i j a cout i i t j j t cout m m t n n endl int main a 1 b 2 f b f a cout a a t b b endl return 0 解 j n m m n j a b 2 2 f a 返回值 f b 返回值 4 5 f b 域 i 1 3 全局域 f a 域 main 域 i j 1 2 3 i j 2 3 6 8j4 静态 f 域 2 3 2 3 i j 2 2 4 i j 3 3 9 8j4 2 1 3 答案 i 2 j 3 m 3 n 6 对应蓝色 i 3j 3 m 4 n 9 对应绿色 a 3 b 2 2 include using namespace std float sqr float a return a a float p float x int n cout in process x x t n n endl if n 0 return 1 else if n 2 0 return x sqr p x n 2 else return sqr p x n 2 int main cout p 2 0 13 endl return 0 图解递归 共五层 返回值是回归时产生 sqr p x n 2 x sqr p x n 2 p 2 0 3 p 2 0 6 x sqr p x n 2 x sqr p x n 2 n 13 x 2 0 p 2 0 13 64 8192 n 6 x 2 0 8 n 3 x 2 0 2 n 0 x 2 0 n 1 x 2 0 p 2 0 0 1 1 main 域 第1层 p 域 第2层 p 域 第3层 p 域 第4层 p 域 第5层 p 域 p 2 0 1 答案 in process x 2 n 13 in process x 2 n 6 in process x 2 n 3 in process x 2 n 1 in process x 2 n 0 8192 3 2简答题 3 2 1函数的实参和形参怎样对应 实参和形参数目必须一致吗 什么情况下可 以不同 答 实参和形参的个数和排列顺序应一一对应 并且对应参数应类型匹配 赋值 兼容 当有缺省参数时可以不同 3 2 2函数和内联函数的执行机制有何不同 定义内联函数有何意义 又有何要 求 答 内联函数的调用机制与一般函数不同 编译器在编译过程中遇到 inline 时 为该函数建立一段代码 而后在每次调用时直接将该段代码嵌入到调用函数中 从而将函数调用方式变为顺序执行方式 这一过程称为内联函数的扩展或内联 内联函数的实质是牺牲空间来换取时间 因 inline 指示符对编译器而言只是一个 建议 编译器也可以选择忽略该建议 内联函数只适用于功能简单 代码短小而 又被重复使用的函数 函数体中包含复杂结构控制语句 如 switch 复杂 if 嵌套 while 语句等 以及无法内联展开的递归函数 都不能定义为内联函数 即使定 义 系统也将作为一般函数处理 3 2 3全局变量和全局静态变量的区别在哪里 为什么提倡尽量使用局部变量 答 有 static 修饰的全局变量只能在定义它的文件中可见 在其他文件中不可见 而非静态的全局变量则可以被其他程序文件访问 但使用前必须用 extern 说明 局部变量具有局部作用域使得程序在不同块中可以使用同名变量 这些同名 变量各自在自己的作用域中可见 在其它地方不可见 所以提倡尽量使用局部变 量 3 2 4函数重载的作用是什么 满足什么条件的函数才可以成为重载函数 重载 函数在调用时是怎样进行对应的 答 函数重载可以定义几个功能相似 而参数类型不同使用相同的函数名的函数 以适应不同情况下自动选用不同函数进行操作 函数重载的好处在于 可以用相 同的函数名来定义一组功能相同或类似的函数 程序的可读性增强 在定义重载函数时必须保证参数类型不同 仅仅返回值类型不同是不行的 当某个函数中调用到重载函数时 编译器会根据实参的类型去对应地调用相 应的函数 匹配过程按如下步骤进行 1 如果有严格匹配的函数 就调用该函数 2 参数内部转换后如果匹配 调用该函数 3 通过用户定义的转换寻求匹配 3 2 5多文件结构的程序是如何进行管理并运行的 采用多文件结构有什么好 处 答 多文件结构通过工程进行管理 在工程中建立若干用户定义的头文件 h 和源 程序文件 cpp 头文件中定义用户自定义的数据类型 所有的程序实现则放在不 同的源程序文件中 编译时每个源程序文件单独编译 如果源程序文件中有编译 预处理指令 则首先经过编译预处理生成临时文件存放在内存 之后对临时文件 进行编译生成目标文件 obj 编译后临时文件撤销 所有的目标文件经连接器连 接最终生成一个完整的可执行文件 exe 多文件结构管理程序的好处是十分明显的 首先 可以避免重复性的编译 如果修改了个别函数 那么只需将这些函数所在的文件重新编译即可 其次 将 程序进行合理的功能划分后 更容易设计 调试和维护 另外 通常把相关函数 放在一个文件中 这样形成一系列按照功能分类的文件 便于为其他程序文件使 用 3 2 6宏定义与常量定义从作用及效果上看是一样的 二者是否完全相同 答 完全不同 不带参宏定义与 const 说明符定义常量从效果上看是一样的 但它们的机制不同 首先宏定义是在预处理阶段完成 而 const 定义则是在编译 阶段实现 其次宏定义只是一种简单的字符串替代 不会为字符串分配内存单元 替代过程也不作语法检查 即使指令中的常量字符串不符合常量要求 预处理的 替代过程也照样按指令给出的格式进行 而 const 定义则是象定义一个变量一样 定义一个常量标识符 系统要按照类型要求为该标识符分配内存单元 同时在将 常量放入单元时进行类型检查 如果类型不匹配 类型相容的会进行系统的类型 转换 不相容的则要提示错误 二 编程与综合练习题 3 3设计函数 将小写英文字符变为对应的大写字符 解 小写字母比大写字母 ASCII 码值大32 或写作 ch ch a A include using namespace std char capitalize char ch if ch a else return ch int main int i 0 char cp 30 cout 请输入包含小写字母的句子 endl cin getline cp 30 while cp i 0 cout capitalize cp i cout endl return 0 3 4设计两个函数 分别求两个数的最大公约数和最小公倍数 解 可用穷举法求最大公约数 从大到小找到的第1个公约数 和最小公倍数 从 小到大找到的第1个公倍数 include using namespace std MaxCommonDevisor int n int m int i for i n i 1 i if n i 0 return i MinCommonMultiple int n int m int i for i n i n m i if i n 0 return i int main int i j cout 请输入两个整数 i j cout 最大公约数 MaxCommonDevisor i j t 最小公倍数 MinCommonMultiple i j endl return 0 3 5 设计函数 digit num k 返回整数 num 从右边开始的第 k 位数字的值 例如 digit 4647 3 6 digit 23523 7 0 解 把整数转换为数串 放在一个整型数组中 include using namespace std digit int num int k int s 10 0 0 0 0 0 0 0 0 0 0 int i 0 do 先把整数转换为数字串 s i num 10 num 10 i while num 0 if k i return s k 1 题目中位数的下标从1开始 而数组下标从0开始 else return 0 int main cout digit 4647 3 digit 4647 3 endl cout digit 23523 7 digit 23523 7 endl return 0 3 6设计函数 factors num k 返回整数 num 中包含因子 k 的个数 如果没有该因 子 则返回0 解 必须先判断整数 m 能否被 k 整除 include using namespace std factors int num int k 缺省返回值为整型 int count 0 while num k 0 count num k return count int main cout factors 1875 5 factors 1875 5 endl cout factors 64 3 factors 64 3 endl return 0 3 7歌德巴赫猜想指出 任何一个充分大的偶数都可以表示为两个素数之和 例 如 4 2 26 3 38 3 5 50 3 47 将4 50之间的所有偶数用两个素数之和表示 判断一个整数是否为素数用函 数完成 解 用 prime 函数判断是否素数 用穷举法 歌德巴赫猜想验证也用穷举法 在所有组合中找两个数均为素数者 include include using namespace std bool prime int m if m 1 m 0 return false if m 2 return true int k int sqrt m for int i 2 ik return true else return false int main for int n 4 n 50 n 2 for int i 2 i n 2 i if prime i 列出所有可能组合 return 0 3 8 设计函数打印直方图 直方图宽度为3行 每列代表数据1 如下面的图形 表示10 解 为简单将 a 用 a 表示 include using namespace std void PrintDiagram int m int i cout endl for i 0 i 3 i cout for int j 0 j m j cout cout endl cout endl int main PrintDiagram 10 PrintDiagram 15 PrintDiagram 7 return 0 3 9定义递归函数实现下列 Ackman 函数 其中 m n 为正整数 设计程序求 Acm 2 1 Acm 3 2 解 递归函数实现非常简单 按公式写即可 include using namespace std Acm int m int n if m 0 return n 1 if n 0 return Acm m 1 1 return Acm m 1 Acm m n 1 int main cout Acm 2 1 Acm 2 1 endl cout Acm 3 2 Acm 3 2 endl return 0 3 10 用递归函数实现勒让德多项式 在主函数中求 P4 1 5 解 把勒让德多项式的阶和自变量都作为参数 include using namespace std double P int n double x if n 0 return 1 if n 1 return x return 2 n 1 x P n 1 x n 1 P n 2 x n int main cout P 4 1 5 P 4 1 5 endl return 0 3 11定义内联函数实现求三个实数中的最大值 解 内联函数只适用于功能简单 代码短小而又被重复使用的函数 函数体中包 含复杂结构控制语句 如 switch 复杂 if 嵌套 while 语句等 以及无法内联展 开的递归函数 都不能定义为内联函数 即使定义 系统也将作为一般函数处理 include using namespace std inline max int a int b int c if a b if b a return c int main cout max 3 7 4 0 inline bool IfDigitChar char ch if ch 0 else return 0 int main char ch cout 请输入一个字符 输入 停止 ch while ch if IfDigitChar ch cout ch is a digit char endl else cout ch is not a digit char endl cout 请输入一个字符 输入 停止 ch return 0 3 13 设计两个重载函数 分别求两个整数相除的余数和两个实数相除的余数 两个实数求余定义为实数四舍五入取整后相除的余数 解 实数四舍五入取整 正数是 0 5取整 负数是 0 5取整 include include using namespace std mod int n int m return n m round double x 四舍五入函数 if x 0 return int x 0 5 else return int x 0 5 mod double x double y return round x round y int main cout mod 8 3 mod 8 3 endl cout mod 8 2 3 6 mod 8 2 3 6 endl cout mod 8 2 2 6 mod 8 2 2 6 endl return 0 注意 mod double x double y 形参类型不可以写成 float 因为在入口函数中 mod 8 2 3 6 的实参8 2 3 6都认为是 double 型常数 重载时系统不知应转换为 float 还是 int 出现歧义 3 14 建立一个头文件 area h 在其中定义两个面积函数 area 分别用来计算半 径为 r 的圆的面积和边长为 a 和 b 的矩形面积 另外建立一个实现文件 area cpp 在其中定义主函数 通过包含 area h 输入数据并输出圆和矩形的 面积 解 两个面积函数 area 一个是单参数 一个是双参数 头文件 area h double area double r return 3 14 r r double area double a double b return a b 实现文件 area cpp include using namespace std include area h int main double a b r cout input radius r cout input side length a b cout area r area r endl cout area a b area a b 0 for i 0 i w i cout t w cout endl p1 w 1 调用 p1 4 答 用调用树来解答 如下图 注意打印是在递归调用之前 按照打印语句 for i 0 i w i cout t w cout 0 p2 w 1 for i 0 i w i cout t w cout 0 for i 0 i w i cout t w cout 0 for i 0 i w i cout t w cout endl p4 w 1 for i 0 i w i cout t w cout 课后习题答案 第四章类与对象习题 一 基本概念与基础知识自测题 4 1填空题 5 1 1 引入类定义的关键字是 1 类的成员函数通常指定为 2 类的数据成员通常指定为 3 指定为 4 的类成员可以在类 对象所在域中的任何位置访问它们 通常用类的 5 成员表示类的属 性 用类的 6 成员表示类的操作 答案 1 class 2 公有的 public 3 私有的 private 4 公有的 public 5 数据 6 函数 4 1 2 类的访问限定符包括 1 2 和 3 私有数据通 常由 4 函数来访问 读和写 这些函数统称为 5 答案 1 public 公有的 2 private 私有的 3 protected 保护的 4 公有的成员函数 5 类的接口 4 1 3 通常在逻辑上 同一类的每个对象都有 1 代码区 用以存储成员 函数 而在物理上通常只有 2 代码区 只有在 3 定义 并 4 的函数和加了关键字 5 的函数例外 答案 1 独立的 2 共用的 3 在类说明中 4 不包括循环等复杂结构 5 inline 4 1 4 C 中支持三种域 1 2 3 函数域被包括 在 4 中 全局域被包括在 5 中 using 指示符以关键字 using 开头 后面是关键字 6 最后是 7 这样表示以后在该名字空 间中所有成员都 8 如不使用 using 指示符则在使用时要加 称 为 9 运算符 答案 1 局部域 local scope 2 名字空间域 namespace scope 3 类域 class scope 4 局部域 5 名字空间域 6 namespace 7 名字空

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论