谭浩强C++课后习题答案.pdf
浩 强 C+课 后 习 题 答 案 一 1.请 根 据 你 的 了 解,叙 述 C+的 特 点。C+对 C 有 哪 些 发 展?【解】略。2.一 个 C+的 程 序 是 由 哪 几 部 分 构 成 的?其 中 的 每 一 部 分 起 什 么 作 用?【解】略。3.从 拿 到 一 个 任 务 到 得 到 最 终 结 果,一 般 要 经 过 几 个 步 骤?【解】略。4.请 说 明 编 辑、编 译、连 接 的 作 用。在 编 译 后 得 到 的 目 标 文 件 为 什 么 不 能 直 接 运 行?【解】编 译 是 以 源 程 序 文 件 为 单 位 进 行 的,而 一 个 完 整 的 程 序 可 能 包 含 若 干 个 程 序 文 件,在 分 别 对 它 们 编 译 之 后,得 到 若 干 个 目 标 文 件(后 缀 一 般 为.o b j),然 后 要 将 它 们 连 接 为 一 个 整 体。此 外,还 需 要 与 编 译 系 统 提 供 的 标 准 库 相 连 接,才 能 生 成 一 个 可 执 行 文 件(后 缀 为.e x e)。不 能 直 接 运 行 后 缀 为.obj的 目 标 文 件,只 能 运 行 后 缀 为.exe的 可 执 行 文 件。5.分 析 下 面 程 序 运 行 的 结 果。#include using namespace std;int main()(coutThis n i sc o u tMa vvC+c o u t program.,/e n d l;return 0;)【解】输 出 的 结 果 为 ThisisaC+program.4C+面 向 对 象 程 序 设 计 题 解 与 上 机 指 导.-一-一 6.分 析 下 面 程 序 运 行 的 结 果。#include using namespace std;int main()(int a,b,c;a=10;b=23;c=a+b;co u t a+b=;coutc;coutendl;return 0:)【解】前 两 个 cout语 句 在 输 出 数 据 后 不 换 行,第 3 个 cout语 句 输 出 一 个 换 行,因 此 输 出 的 结 果 为 a+b=337.分 析 下 面 程 序 运 行 的 结 果。请 先 阅 读 程 序 写 出 程 序 运 行 时 应 输 出 的 结 果,然 后 上 机 运 行 程 序,验 证 自 己 分 析 的 结 果 是 否 正 确。以 下 各 题 同。#include using namespace std;int main()(int a.b,c;int f(int x,int y,int z);c in a b c;c=f(a,b,c);coulcendl;return 0;)int f(int xjnt yjnl z)(int m;if(xy)m=x;else m=y;if(zm)m=z;return(m);I【解】程 序 的 作 用 是:输 入 3 个 整 数,然 后 输 出 其 中 值 最 小 的 数。在 主 函 数 中 输 入 3 个 整 数,然 后 调 用 f 函 数,在 f 函 数 中 实 现 找 最 小 的 整 数,用 i f语 句 比 较 两 个 数,将小 者 存 放 在 变 量 m 中,经 过 两 个 i f语 句 的 比 较,m 中 存 放 的 是 3 个 整 数 中 最 小 的 数。运 行 情 况 如 下:1 5 3/(输 入 3 个 整 数)1(输 出 其 中 最 小 的 数)8.在 你 所 用 的 C+系 统 上,输 入 以 下 程 序,进 行 编 译,观 察 编 译 情 况,如 果 有 错 误,请 修 改 程 序,再 进 行 编 译,直 到 没 有 错 误,然 后 进 行 连 接 和 运 行,分 析 运 行 结 果。int main();(int a,b;c=a+b;cout a+b=”a+b;)【解】上 机 编 译 出 错,编 译 出 错 信 息 告 知 在 第 2 行 出 错,经 检 查,发 现 第 1行 的 末 尾 多 了 一 个 分 号,编 译 系 统 无 法 理 解 第 2 行 的 花 括 号,导 致 报 告 第 2 行 出 错。将 第 1行 的 末 尾 的 分 号 去 掉,重 新 编 译,编 译 出 错 信 息 告 知 在 第 5 行 和 第 6 行 出 错。第 5 行 出 错 原 因 是 c o u t未 经 声 明,因 为 cout不 是 C+语 言 提 供 的 系 统 的 关 键 字,而 是 输 出 流 的 对 象,必 须 使 用 头 文 件 iostream。第 6 行 出 错 原 因 是 m ain是 in t型 函 数,应 返 回 一 个 整 型 值。将 程 序 改 为#include int main()(int a,b;c=a+b;cout a+b=a+b;return 0;)重 新 编 译。编 译 出 错 信 息 告 知 在 第 5 行 和 第 6 行 出 错。第 5 行 出 错 原 因 是 变 量 c 未 定 义,第 6 行 出 错 原 因 是 cout未 经 声 明,说 明#include viostream命 令 行 未 能 起 作 用,原 因 是 未 指 明 命 名 空 间。将 程 序 改 为#include using namespace std;int main()(int a,b,c;c=a+b;c o u tr,a+b=r,a+b;return 0;6C+面 向 对 象 程 序 设 计 题 解 与 上 机 指 导 重 新 编 译。编 译 出 错 信 息 告 知 在 第 7 行 出 错,经 检 查,是“”用 得 不 当,“”是 提 取 运 算 符,应 与 cin联 合 使 用,用 来 从 输 入 流 中 提 取 数 据,输 出 时 应 该 用 插 入 运 算 符 把 两 处”都 妫“,再 重 新 编 译,发 现 没 有 error错 误,但 有 两 个 警 告(warning),原 因 是 定 义 了 a 和 b,但 未 对 它 们 赋 值。应 增 加 赋 值 语 句 或 输 入 语 句,使 a 和 b 获 得 值,将 程 序 改 为#include using namespace std;int main()(int a,b,c;c in a b;c=a+b;c o u tr,a+b=a+b;return 0;)重 新 编 译,没 有 编 译 错 误,能 通 过 编 译 和 连 接,可 以 正 常 运 行,在 Visual C+6.0环 境 下 运 行 时 屏 幕 显 示 如 下:5 9/a+b=14Press any key to continue显 然 这 样 的 输 出 不 理 想,uPress any key to continue”是 Visual C+系 统 在 输 出 了 运 行 结 果 后 自 动 显 示 的 一 个 信 息,告 诉 用 户“如 果 想 继 续 工 作,请 按 任 何 一 个 键”。当 用 户 按 任 何 一 个 键 后,显 示 运 行 结 果 的 窗 口 消 失,屏 幕 显 示 回 到 Visual C+的 主 窗 口,显 示 出 源 程 序 和 编 译 信 息。为 了 解 决 以 上 输 出 不 理 想 的 情 况,可 以 在 最 后 一 个 输 出 语 句 中 增 加 输 出 一 个 换 行 符。最 后 的 程 序 如 下:#include using namespace std;int main()(int a,b,c;c in a b;c=a+b;c o u t,ra+b=,a+b en d l;return 0;运 行 时 屏 幕 显 示 如 下:5a+b=l4Press any key to continue这 就 完 成 了 程 序 的 调 试。这 里 对 本 题 的 调 试 过 程 作 了 比 较 详 细 的 分 析,以 便 使 读 者 对 如 何 调 试 程 序 有 比 较 具 体 而 清 晰 的 了 解。需 要 说 明:(1)编 译 系 统 给 出 的 编 译 出 错 信 息,只 是 提 示 性 的,引 导 用 户 去 检 查 错 误,用 户 必 须 根 据 程 序 的 上 下 文 和 编 译 出 错 信 息,全 面 考 虑,找 出 真 正 出 错 之 处。例 如 编 译 出 错 信 息 通 知 第 2 行 出 错,其 实 可 能 是 第 1行 出 错。(2)有 时,有 的 错 误 开 始 时 未 被 检 查 出 来 并 告 知 用 户(例 如 未 定 义 变 量 c),由 于 其 他 错 误 未 解 决,掩 盖 了 这 个 错 误。当 解 决 了 其 他 错 误 后,这 个 错 误 会 被 检 查 出 来。有 时 在 调 试 过 程 中 会 不 断 检 查 出 新 的 错 误,这 是 不 奇 怪 的。一 一 处 理,问 题 会 迎 刃 而 解。(3)为 了 说 明 调 试 过 程,这 里 全 部 依 靠 计 算 机 系 统 来 检 查 错 误,其 实 有 些 明 显 的 错 误,完 全 可 以 由 人 工 查 出,这 样 可 以 提 高 调 试 效 率。由 人 工 在 纸 面 或 屏 幕 上 检 查 错 误,称 为 静 态 查 错,用 计 算 机 编 译 系 统 检 查 错 误,称 为 动 态 查 错。建 议 尽 量 先 用 静 态 查 错 的 方 法 排 除 错 误,只 有 人 工 检 查 不 出 来 的 错 误 才 让 计 算 机 检 查。9.输 入 以 下 程 序,进 行 编 译,观 察 编 译 情 况,如 果 有 错 误,请 修 改 程 序,再 进 行 编 译,直 到 没 有 错 误,然 后 进 行 连 接 和 运 行,分 析 运 行 结 果。#include using namespace std;int m ain()(int a,b;c=add(a,b)c o u t a+b=,f c e n d l;return 0;)int add(int x,int y);(z=x+y;retrun(z);)【解】发 现 7 个 错 误:(1)对 add函 数 未 声 明 就 调 用,应 在 main函 数 中 对,add函 数 进 行 声 明。(2)定 义 add函 数 时,函 数 首 行 末 尾 不 应 有 分 号。(3)变 量 c未 经 定 义。(4)add函 数 中 的 变 量 z 未 经 定 义。(5)第 6 行 末 尾 少 了 一 个 分 号.(6)add函 数 中 的 retrun拼 写 错 误,应 为 return。编 译 系 统 把 retain作 为 未 声 明 的 标 识 符 而 报 错,因 为 retrun(z)会 被 认 为 是 函 数 调 用 的 形 式。8C+面 向 对 象 程 序 设 计 题 解 与 上 机 指 导.?(7)变 量 a 和 b 未 被 赋 值。改 正 后 的 程 序 如 下:#include using namespace std;int m ain()int add(int x,int y);int a,b,c;cin a b;c=add(a,b);cout vv a+b=c e n d l;return 0;)int add(int x,int y)int z;z=x+y;retum(z);)运 行 情 况 如 下:5 8/1310.输 入 以 下 程 序,编 译 并 运 行,分 析 运 行 结 果。#include using namespace std;int m ain()void sort(int x,int y,int z);int x,y,z;cin x y z;sort(x,y,z);return 0;void sort(int x,int y,int z)(int temp;if(xy)temp=x;x=y;y=temp;/内 3 个 语 句 的 作 用 是 将 x 和 y 的 值 互 换 if(zx)cout z r x r/y endl;else if(zy)cout x/z 7 y endl;else cout x r/y z endl;请 分 析 此 程 序 的 作 用。sort函 数 中 的 i f 语 句 是 一 个 嵌 套 的 i f语 句。运 行 时 先 后 输 入 以 下 几 组 数 据,观 察 并 分 析 运 行 结 果。3 6 10/6 3 101 1()6 3/10,6,3/【解】程 序 的 作 用 是 对 输 入 的 3 个 整 数 按 由 小 到 大 的 顺 序 进 行 排 序。sort函 数 中 的 第 1个 i f 语 句 的 作 用 是 先 将 x 和 y 排 序,使 x 小 于 或 等 于 y。第 2 个 i f语 句 是 一 个 嵌 套 的 i f语 句,先 比 较 z和 x,如 果 z x,显 然 由 小 到 大 的 顺 序 应 当 是 z,x,y,按 此 顺 序 输 出;如 果 z 不 小 于 x,而 小 于 y,显 然 由 小 到 大 的 顺 序 应 当 是 x,z,y,按 此 顺 序 输 出;如 果 z既 不 小 于 x,又 不 小 于 y,显 然 由 小 到 大 的 顺 序 应 当 是 x,y,z,按 此 顺 序 输 出。按 题 目 要 求 分 别 输 入 以 下 几 组 数 据,运 行 结 果 如 下.:3 6 10/3,6,1()6 3 1003.6-10 10 6 3/3,6-10 10,6,3/-858993460,-858993460,10以 上 是 在 Visual C+6.0环 境 下 运 行 的 情 况,前 3 次 运 行 正 常,表 明 当 输 入 不 同 的 数 据 时,程 序 能 实 现 由 小 到 大 的 排 序 功 能。第 4 次 运 行 的 结 果 显 然 不 正 常,这 是 由 于 输 入 数 据 时 出 了 问 题,本 来 要 求 在 输 入 数 据 时,数 据 之 间 以 空 格 或 换 行 相 隔,而 现 在 却 以 逗 号 相 隔,只 有 第 一 个 整 数 能 正 常 赋 给 变 量 x,第 二 和 第 三 个 数 据 均 无 法 正 常 赋 给 变 量 y和 z,y 和 z 的 值 来 自 输 入 流 中 相 应 字 节 的 内 容。1 1.求 2 个 或 3 个 正 整 数 中 的 最 大 数,用 带 有 默 认 参 数 的 函 数 实 现。【解】可 以 编 写 出 以 下 程 序:#include using namespace std;int main()int max(int a,int b,int c=0);int a,b,c;cin a b c;cout”max(a,b,c)=max(a,b,c)endl;cout”max(a,b)=max(a,b)endl;return 0;110C+面 向 对 象 程 序 设 计 题 解 与 上 机 指 导 int max(int a,int b,int c)if(ba)a=b;if(ca)a=c;return a;)运 行 情 况 如 下:13 5 76/max(a,b,c)=76(从 3个 数 中 找 最 大 者)max(a,b)=13(从 前 2 个 数 中 找 最 大 者)如 果 想 从 3 个 数 中 找 大 者,可 以 在 调 用 时 写 成“max(a,b,c)”形 式,如 果 只 想 从 2 个 数 中 找 大 者,则 在 调 用 时 写 成“max(a,b)”形 式,此 时 c 自 动 取 默 认 值 0,由 于 0 比 任 何 正 整 数 都 小,因 此 从 14,5,0 中 选 最 大 者 和 从 14,5 中 选 大 者 的 结 果 是 一 样 的。1 2.输 入 两 个 整 数,将 它 们 按 由 大 到 小 的 顺 序 输 出。要 求 使 用 变 量 的 引 用。【解】可 以 编 写 出 以 下 程 序:#includcusing namespace std;int main()void change(int&,int&);int a,b;c in a b;if(ab)change(a,b);如 果 a b,使 a 和 b 的 值 互 换 c o u t max=,f a m in=cvbvvendl;return 0;)void change(int&rl,int&r2)函 数 的 作 用 是 使 r l 与 r2互 换 int temp;temp=rl;rl=r2;r2=temp;运 行 情 况 如 下:12 67/max=67 min=1213.对 3个 变 量 按 由 小 到 大 顺 序 排 序,要 求 使 用 变 量 的 引 用。【解】可 以 编 写 出 以 下 程 序:#include using namespace std;int main()void sort(int&.int&,int&);int a,b,c,aLbl,cl;coutvv Please enter 3 integersc in a b c;al=a;bl=b;cl=c;sort(al,bl,cl);c o u t a r,“vbj)change(i,j);if(ik)change(i,k);if(jk)change(j,k);)void change(int&x,int&y)int temp;temp=x;x=y;y=temp;运 行 情 况 如 下:Please enter 3 integers:23 67 5 5/23 67-55 in sorted order is-55 23 67这 个 程 序 很 容 易 理 解,不 易 出 错。由 于 在 调 用 sort函 数 时 虚 实 结 合 使 形 参 i,j,k成 为 实 参 a l,b l,c l的 引 用(别 名),因 此 通 过 调 用 函 数 sort(a l,b l,c l)既 实 现 了 对 i,j,k排 序,也 就 同 时 实 现 了 对 a l,b l,c l排 序。同 样,执 行 change(i,j)函 数,可 以 实 现 对 实 参 i 和 j的 互 换。1 4.编 一 程 序,将 两 个 字 符 串 连 接 起 来,结 果 取 代 第 一 个 字 符 串。要 求 用 string方 法。【解】可 以 编 写 出 以 下 程 序:#include#include 程 序 中 若 使 用 字 符 串 变 量,必 须 包 含 头 文 件 stringusing namespace std;int main()string si=week,s2=endcout Msl=M s l endl;cout s2=vv s2 endl;1 2-C+面 向 对 象 程 序 设 计 题 解 与 上 机 指 导 彳 sl=sl+s2;c o u t M The new string is:M s l e n d l;return 0;)运 行 情 况 如 下:sl=weeks2=endThe new siring is:weekend15.输 入 一 个 字 符 串,把 其 中 的 字 符 按 逆 序 输 出。如 输 入 L IG H T,输 出 THGILo要 求 用 string方 法。【解】可 以 编 写 出 以 下 程 序:#include#include using namespace std;int m ain()string str;int i,n;定 义 字 符 串 变 量 strchar temp;/定 义 字 符 变 量 tempc o u t f*please input a string:cin str;n=str.size();for(i=0;in/2;i+)输 入 一 个 字 符 串 赋 给 字 符 串 变 量 str 测 量 s tr的 长 度 n 使 s tr中 的 字 符 对 称 互 换 temp=stri;stri=strn_i_ 1:strn_i-l=temp;)cout sir endl;return 0;1运 行 情 况 如 下:please input a string:L IG H T/THGIL注 意:输 入 的 字 符 串 中 不 能 含 有 空 格。16.有 5 个 字 符 串,要 求 将 它 们 按 由 小 到 大 的 顺 序 排 列,用 string方 法。【解】可 以 编 写 出 以 下 程 序:#include#include using namespace std;int m ain()int i;string str5=BASIC C FORTRAN C+”PASCAL;void sort(string);sort(str);对 字 符 串 排 序 c o u t M the sorted strings:M cn d l;for(i=0;i5;i+)c o u t s tr iH 按 已 排 好 的 顺 序 输 出 字 符 串 coutendl;return 0;)void sort(string s)(int i,j;string t;for(j=0;j5;j+)for(i=0;isi+l)t=si;si=si+l;si+l=t;)运 行 结 果 如 下:the sorted strings:BASIC C C+FORTRAN PASCAL1 7.编 一 个 程 序,用 同 一 个 函 数 名 对 n个 数 据 进 行 从 小 到 大 排 序,数 据 类 型 可 以 是 整 型、单 精 度 型、双 精 度 型。用 重 载 函 数 实 现。【解】可 以 编 写 出 以 下 两 个 程 序:(1)建 立 3 个 函 数,分 别 用 于 处 理 整 型、单 精 度 型、双 精 度 型 数 据 的 排 序,在 3 个 函 数 中 都 采 用 选 择 法 排 序 方 法。#include#includc using namespace std;int m ain()(longa5=10100,-123567,1198783,-165654,3456;int b5=1,9,0,23,-45);float c|5=2.4,7.6,5.5,6.6,-2.3;void sort(long);void sort(int);void sort(float);sort(a);sort(b);sort(c);return 0;C+面 向 对 象 程 序 设 计 题 解 与 上 机 指 导)void sort(long a)nt i,j;long t;for(j=O;j5;j+)for(i=0;iai+l)t=ai;ai=ai+l;ai+l=t;c o u tM the sorted numbers:vendl;for(i=0:i5;i+)c o u t a i coutendlendl;)void sort(int a)int i,j,t;for(j=O;j5;j+)for(i=0;iai+l)t=ai;ai=ai+l;ai+l=t;c o u tM the sorted numbers:,rendl;for(i=0;i5;i+)c o u t a i coutendlcndl;void sort(float a|)int i,j;float t;for(j=O;j5;j+)for(i=0;iai+l)t=ai;ai=ai+l;ai+l=t;c o u t,the sorted numbers:0endl;for(i=0;i5;i+)c o u t a i coutendlendl;)运 行 结 果 如 下:the sorted numbers:123567-165654 I0KX)3456 1198783(长 整 型 数 据 排 序)the sorted numbers:-45 0 I 9 23(整 型 数 据 排 序)the sorted numbers:-2.3 2.4 5.5 6.6 7.6(单 精 度 型 数 据 排 序)(2)在 第 1种 方 法 中,3 个 函 数 的 函 数 体 基 本 上 是 相 同 的,都 是 采 用 选 择 法 排 序,在 下 面 的 程 序 中,3 个 函 数 的 函 数 体 不 全 相 同,前 两 个 函 数 采 用 选 择 法 排 序,最 后 一 个 函 数 采 用 起 泡 法 排 序。#includc#include using namespace std;int m ain()long a5=10100,-123567,1198783,-165654,3456;int b5=1,9,0,23-45);noat c|5=2A 7.6,5.5,6.6,-2.3;void sort(int);void sort(float);void sort(long);sort(a);对 长 整 型 数 据 排 序 sort(b);对 整 型 数 据 排 序 sort(c);对 单 精 度 型 数 据 排 序 return 0;void sort(long a)int i,j,min;对 长 整 型 数 据 用 选 择 法 排 序 的 函 数 long t;for(i=0;i5;i+)min=i;for(j=i+l;ja|jl)min=j;t=ai;ai=amin;amin=t;c o u t p the sorted numbers:r,e n d l;for(i=0;i5;i+)c o u t a i co u t en d l en d l;void sort(int a)int i,j,t;for(j=0;j5;j+)对 整 型 数 据 用 选 择 法 排 序 的 函 数C+面 向 对 象 程 序 设 计 题 解 与 上 机 指 导 7for(i=0;iai+l)t=ai;ai=ai+1;ai+l=t;c o u t f,the sorted numbers:,r e n d l;for(i=0;i5;i+)c o u t a i co u t en d l en d l;void sort(float a|)对 单 精 度 型 数 据 用 起 泡 法 排 序 的 函 数 int i,j;float t;for(j=0;j5;j+)for(i=0;iali+l)t=ai;ai=ai+l;ai+l=t;c o u t M the sorted numbers:0endl;for(i=0;i5;i+)c o u t a i co u t en d l en d l;1运 行 结 果 如 下:the sorted numbers:-123567-165654 10100 3456 1198783(长 整 型 数 据 排 序 结 果)the sorted numbers:-45 0 1 9 23the sorted numbers:-2 3 2.4 5.5 6.6 7.6(整 型 数 据 排 序 结 果)(单 精 度 型 数 据 排 序 结 果)对 比 两 种 方 法,可 以 看 到,并 不 要 求 重 载 函 数 的 函 数 体 相 同,在 本 例 中,采 用 不 同 的 排 序 方 法,结 果 是 相 同 的。从 理 论 上 说,重 载 的 函 数 可 以 用 来 实 现 完 全 不 同 的 功 能,但 是 应 该 注 意:同 一 个 函 数 名 最 好 用 来 实 现 相 近 的 功 能,而 不 要 用 来 实 现 完 全 不 相 干 的 功 能,以 方 便 用 户 理 解 和 使 用。1 8.对 第 17题 改 用 函 数 模 板 实 现。并 与 17题 程 序 进 行 对 比 分 析。#include#include using namespace std;template void sort(T a)函 数 模 板,采 用 选 择 法 排 序 int i,j,min;T t;for(i=0;i5;i+)min=i;for(j=i+l;jaj)min=j;t=ai;ai=amin;amin=t;)c o u t M the sorted numbers:o e n d l;for(i=0;i5;i+)c o u t a i co u t en d l en d l;)int m ain()long a5=10100,-123567,11 98783,-165654,3456);int b5=1,9,0,23,-45;float c5=2.4,7.6,5.5,6.6,-2.3;sort(a);sort(b);sort(c);return 0;)运 行 结 果 如 下:the sorted numbers:-123567-165654 10100 3456 1198783(长 整 型 数 据 排 序)the sorted numbers:(整 型 数 据 排 序)-45 0 1 9 23the sorted numbers:-2.3 2.4 5.5 6.6 7,6(单 精 度 型 数 据 排 序)对 比 第 17题 和 18题,可 以 看 到,如 果 重 载 函 数 的 函 数 体 基 本 相 同 的 话,用 函 数 模 板 显 然 更 方 便,可 以 压 缩 程 序 篇 幅,使 用 方 便。