您好,欢迎来到聚文网。 登录 免费注册
C++程序设计题解与拓展(第2版)

C++程序设计题解与拓展(第2版)

  • 装帧: 简装
  • 出版社: 清华大学出版社
  • 作者: 翁惠玉 俞勇
  • 出版日期: 2019-09-01
  • 商品条码: 9787302532828
  • 版次: 2
  • 开本: 其他
  • 页数: 0
  • 出版年份: 2019
定价:¥59 销售价:登录后查看价格  ¥{{selectedSku?.salePrice}} 
库存: {{selectedSku?.stock}} 库存充足
{{item.title}}:
{{its.name}}
精选
编辑推荐
"l 归纳、总结了C++语言的基本内容、过程化程序设计和面向对象程序设计的基本思想。 l 187个简答题帮助进一步理解程序设计的基本概念、方法,了解常见的错误和解决方法。 l 181个编程题详解有助于进一步理解问题求解过程、培养良好的代码风格和计算思维。 l 讲解深入浅出、语言通俗,是读者不仅知其然,更知其所以然。 "
内容简介
本书是与《C++程序设计: 思想与方法(慕课版第3版)》(翁惠玉、俞勇编著)配套的辅助教材。 本书与主教材的章安排接近相同。每一章首先总结了主教材中对应章的主要内容以及重点、难点,解答了主教材中的所有习题。作为对主教材的补充,本书在某些章后还增加了进一步拓展部分。通过对本书的学习,可以帮助读者进一步巩固程序设计的知识,提高编程能力。 本书概念清楚,习题丰富,可作为高等院校计算机专业或其他相关专业的“程序设计”课程的配套教辅,也可作为计算机专业研究生入学考试的辅导书,还可作为其他专业人员的参考书。
作者简介
作者毕业于上海交通大学,获博士学位,现为上海交通大学计算机系副教授。长期承担程序设计和数据结构的教学工作,主讲ACM试点班和电信学院的《程序设计》和《数据结构》课程,这两门课程分别是上海市精品课程和重量精品课程。出版过教材三本:《C++程序设计:思想与方法》(获上海交大优秀教材二等奖)、《数据结构:思想与实现》(获上海市优秀教材二等奖并入选教育部十二五规划教材)、《计算机网络》。出版过教辅两本:《数据结构:题解与拓展》、《计算机网络300题》
目录
第1章绪论1 1.1知识点回顾1 1.1.1计算机组成1 1.1.2程序设计语言2 1.1.3程序设计过程3 1.2习题解答5 1.2.1简答题5 1.2.2编程题12 1.3进一步拓展12 1.3.1计算机为什么采用二进制12 1.3.2算法的评价13 第2章程序的基本组成14 2.1知识点回顾14 2.1.1C++程序的基本结构14 2.1.2常量与变量14 2.1.3数据的输入输出18 2.1.4算术运算18 2.1.5赋值运算19 2.2习题解答21 2.2.1简答题21 2.2.2程序设计题27 2.3进一步拓展34 2.3.1“按位与”运算35 2.3.2“按位或”运算37 2.3.3“按位异或”运算38 2.3.4“取反”运算39 2.3.5“左移”运算402.3.6“右移”运算40 第3章分支程序设计43 3.1知识点回顾43 3.1.1关系表达式和逻辑表达式43 3.1.2分支语句44 3.2习题解答45 3.2.1简答题45 3.2.2程序设计题48 〖3〗C++程序设计题解与拓展(第2版)目录〖3〗第4章循环程序设计63 4.1知识点回顾63 4.1.1计数循环63 4.1.2while循环64 4.1.3dowhile循环64 4.1.4break和continue语句65 4.2习题解答65 4.2.1简答题65 4.2.2程序设计题67 4.3进一步拓展81 4.3.1goto语句81 4.3.2结构化程序设计82 4.3.3位运算的进一步讨论83 第5章批量数据处理——数组84 5.1知识点回顾84 5.1.1一维数组84 5.1.2二维数组85 5.1.3字符串86 5.2习题解答88 5.2.1简答题88 5.2.2程序设计题90 5.3进一步拓展104 5.3.1特殊矩阵104 5.3.2对称矩阵105 5.3.3三角矩阵105 5.3.4稀疏矩阵106 第6章过程封装——函数107 6.1知识点回顾107 6.1.1函数的概念107 6.1.2函数的定义107 6.1.3函数的参数和返回值108 6.1.4数组作为函数的参数108 6.1.5重载函数109 6.1.6函数模板109 6.1.7变量的作用域与存储类别110 6.1.8递归程序设计111 6.1.9C++11的扩展112 6.2习题解答113 6.2.1简答题113 6.2.2程序设计题117 6.3进一步拓展138 6.3.1模拟计算机程序的运行138 6.3.2模拟器的设计139 第7章间接访问——指针144 7.1知识点回顾144 7.1.1指针的概念144 7.1.2指针运算与数组144 7.1.3指针与动态内存分配145 7.1.4字符串的指针表示146 7.1.5指针、数组和字符串传递146 7.1.6引用与引用传递147 7.1.7多级指针与指向函数的指针148 7.1.8main函数的参数149 7.1.9lambda表达式149 7.2习题解答150 7.2.1简答题150 7.2.2程序设计题151 第8章数据封装——结构体161 8.1知识点回顾161 8.1.1记录的概念161 8.1.2结构体变量的使用162 8.1.3结构体作为函数的参数163 8.1.4链表163 8.2习题解答164 8.2.1简答题164 8.2.2程序设计题165 8.3进一步拓展174 第9章模块化开发177 9.1知识点回顾177 9.1.1自顶向下分解177 9.1.2模块划分177 9.1.3设计自己的库177 9.2习题解答178 9.2.1简答题178 9.2.2程序设计题179 9.3进一步拓展195 9.3.1软件危机195 9.3.2软件工程196 第10章创建新的类型199 10.1知识点回顾199 10.1.1面向对象的思想199 10.1.2面向对象程序设计的特点199 10.1.3类的定义200 10.1.4对象的使用201 10.1.5对象的构造与析构201 10.1.6C++11对构造的扩展202 10.1.7常量对象和常量成员函数204 10.1.8常量数据成员205 10.1.9静态数据成员与静态成员函数205 10.1.10友元206 10.2习题解答206 10.2.1简答题206 10.2.2程序设计题209 10.3进一步拓展244 10.3.1不要随便改变复制构造的意义244 10.3.2计算机模拟程序245 第11章运算符重载249 11.1知识点回顾249 11.1.1什么是运算符重载249 11.1.2运算符重载的方法249 11.1.3自定义类型转换函数250 11.2习题解答251 11.2.1简答题251 11.2.2程序设计题255 11.3进一步拓展277 第12章组合与继承278 12.1知识点回顾278 12.1.1组合278 12.1.2继承278 12.1.3虚函数与运行时的多态性280 12.1.4虚析构函数280 12.1.5纯虚函数和抽象类281 12.2习题解答281 12.2.1简答题281 12.2.2程序设计题284 12.3进一步拓展308 12.3.1避免随意地继承308 12.3.2多态性与switch语句308 第13章泛型机制——模板310 13.1知识点回顾310 13.1.1类模板的定义310 13.1.2类模板的实例化310 13.1.3类模板的友元311 13.2习题解答312 13.2.1简答题312 13.2.2程序设计题313 第14章输入输出与文件320 14.1知识点回顾320 14.1.1基于控制台的输入输出321 14.1.2基于文件的输入输出323 14.2习题解答326 14.2.1简答题326 14.2.2程序设计题327 第15章异常处理351 15.1知识点回顾351 15.1.1异常抛出351 15.1.2异常检测和处理351 15.1.3异常规格声明352 15.2习题解答352 15.2.1简答题352 15.2.2程序设计题354 第16章容器和迭代器358 16.1知识点回顾358 16.1.1容器358 16.1.2迭代器358 16.2习题解答359 16.2.1简答题359 16.2.2程序设计题359 参考文献362
摘要
    第
     3
     章分支程序设计3.1知识点回顾
     分支程序设计可以根据不同的情况执行不同的处理过程。实现分支程序设计首先要能够区分不同的情况,然后要有一个能够根据不同的情况执行不同语句的控制机制。前者由关系表达式和逻辑表达式完成,后者由分支语句完成。
     3.1.1关系表达式和逻辑表达式
     关系运算符用于比较两个对象。C++提供了6个关系运算符: <(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、==(等于)、!=(不等于)。前4个运算符的优先级相同,后两个运算符的优先级相同。前4个运算符的优先级高于后两个。
     用关系运算符可以将两个表达式连接起来形成一个关系表达式,关系表达式的格式如下: 表达式关系运算符表达式参加关系运算的表达式可以是C++的各类合法的表达式,包括算术表达式、逻辑表达式、赋值表达式以及关系表达式本身。关系表达式的计算结果是布尔型的值: true和false。
     除了关系运算符外,C++还定义了3个逻辑运算符,即!(逻辑非)、&&(逻辑与)和‖(逻辑或),它们可以将关系表达式组合起来,形成更加复杂的情况。由逻辑运算符连接而成的表达式称为逻辑表达式。
     !是一元运算符,&&和‖是二元运算符。它们之间的优先级: !优选,&&次之,‖大力度优惠。事实上,!运算是所有C++运算符中优先级优选的。它们的准确意义可以用真值表来表示。给定布尔变量p和q,&&运算、‖运算和!运算的真值表如表3?1所示。
     当C++程序在计算exp1 && exp2或exp1 ‖ exp2形式的表达式时,总是先计算exp1。一旦exp1的值能确定整个表达式的值时,终止计算,不再计算exp2,这称为短路求值。短路求值的一个好处是可以减少计算量,另一个好处是第一个条件能控制第二个条件的执行。在很多情况下,复合条件的第二部分只有在第一部分满足某个条件时才有意义。例如,要表达以下两个条件: 整型变量x的值非零;x能整除y。由于表达式y%x只有在x不为0时才计算,用C++语言可表达这个条件测试为(x != 0) && (y % x = = 0)而该表达式在其他语言中可能出现除0的错误。表3?1&&运算、‖运算和!运算的真值表pqp && qp ‖ q!pfalsefalsefalsefalsetruefalsetruefalsetruetruefalsefalsetruefalsetruetruetruetrue〖3〗C++程序设计题解与拓展(第2版)第3章分支程序设计〖3〗3.1.2分支语句
     C++提供两种分支语句: 两分支语句(if)和多分支语句(switch)。
     if语句用于处理两分支的情况,它有以下两种形式: if (条件)语句
     if (条件)语句1else 语句2第一种形式表示如果条件为真,执行条件后的语句,否则什么也不做;第二种形式表示条件为真时执行语句1,否则执行语句2。条件为true时,所执行的语句称为if语句的then子句;条件为false时,执行的语句称为else子句。
     条件部分原则上应该是一个关系表达式或逻辑表达式,但事实上,在C++的if语句中的条件可以为任意类型的表达式,可以是算术表达式,也可以是赋值表达式。表达式的结果为0表示false,非0表示true。语句部分可以是对应于某种情况所需要的处理语句。如果处理很简单,只需要1条语句就能完成,则可放入此语句。如果处理相当复杂,需要许多语句才能完成,可以用一个程序块,即用一对大括号{}将一组语句括起来,在语法上大括号及其中的语句相当于1条语句。
     对于一些非常简单的分支情况,C++语言提供了另一个更加简单的机制: “? :”运算符。这个运算符被称为问号冒号,由问号冒号运算符连接起来的表达式称为条件表达式。条件表达式有3个运算数。它的一般形式如下: 条件 ? 表达式1 : 表达式2C++程序遇到“? :”运算符时,首先计算条件的值。如果条件结果为true,则计算表达式1的值,并将它作为整个表达式的值;如果条件结果为false,则计算表达式2的值,并将它作为整个表达式的值。
     当一个程序逻辑上要求根据特定条件做出真假判断并执行相应动作时,if语句是理想的解决方案。然而,还有一些程序需要有两个以上的可选项,这些选项被划分为一系列互相排斥的情况。这时可以用switch语句。switch语句的语法如下: switch (控制表达式){
     case常量表达式1:语句1;
     case常量表达式2:语句2;
     ?
     case常量表达式n:语句n;
     default:语句n+1;
     }switch语句的主体分成许多独立的由关键字case或default开头的语句组。一个case关键字和紧随其后的下一个case或default之间所有语句合称为case子句。default关键字及其相应语句合称为default子句。
     switch语句的执行过程如下。先计算控制表达式的值。当控制表达式的值等于常量表达式1时,执行语句1到语句n+1;当控制表达式的值等于常量表达式2时,执行语句2到语句n+1;以此类推,当控制表达式的值等于常量表达式n时,执行语句n到语句n+1;当控制表达式的值与任何常量表达式都不匹配时,执行语句n+1。
     default子句可以省略。当default子句被省略时,如果控制表达式找不到任何可匹配的case子句时,就退出switch语句。
     在多分支的情况中,通常对每个分支的情况都有不同的处理,因此希望执行完相应的case子句后就退出switch语句。这可以通过break语句实现,break语句的作用就是跳出当前的switch语句。将break语句作为每个case子句的最后一个语句,可以使各个分支互不干扰。这样,switch语句就可以写成switch (控制表达式){
     case常量表达式1:语句1;break;
     case常量表达式2:语句2;break;
     ?
     case常量表达式n: 语句n;break;
     default:语句n+1;
     }3.2习题解答〖*4/5〗3.2.1简答题1. 写出测试下列情况的关系表达式或逻辑表达式。
     (1) 测试整型变量n的值为0~9,包含0和9。
     (2) 测试整型变量a的值是整型变量b的值的一个因子。
     (3) 测试字符变量ch中的值是一个数字。
     (4) 测试整型变量a的值是奇数。
     (5) 测试整型变量a的值是5。
     (6) 测试整型变量a的值是7的倍数。
     【解】
     (1) n >= 0 && n <= 9
     (2) b % a == 0
     (3) ch >= '0' && ch <= '9'
     (4) a % 2 == 1或a % 2
     (5) a == 5
     (6) a % 7 == 0
     2. 假设myFlag声明为布尔型变量,下面的if语句会有什么问题?if (myFlag == true)…【解】 这个语句的语法和运行结果都是正确的,但有冗余判断。表达式myFlag == true的值与变量myFlag是一样的,所以只要写成if(myFlag)就可以。
     3. 设a=3、b=4,c=5,写出下列各逻辑表达式的值。
     (1) a+b>c && b==c
     (2) a‖b+c && b-c
     (3) !(a>b) && !c
     (4) (a!=b)‖(b     【解】
     (1) a+b>c && b==c
     = true && false
     = false
     (2) a‖b+c && b-c
     = true‖b+c && b-c
     = true
     (3) !(a > b) && !c
     = true && false
     = false
     (4) (a!=b)‖(b < c)
     = true‖(b < c)
     = true
     4. 用一个if语句重写下列代码。if (ch =='E')++c;
     if (ch =='E') cout << c << endl;【解】 这两个if语句的条件部分接近相同,因此可以合并成一个if语句,将两个then子句中的语句合并成一个复合语句。即if (ch =='E'){ ++c; cout << c << endl;}或者也可以利用前缀++的特性,将then子句中的两个语句合并为一个语句,即if (ch =='E') cout << ++c << endl;5. 用一个switch语句重写下列代码。if (ch == 'E' ‖ ch =='e')
     ++countE;
     else if (ch =='A' ‖ ch =='a')
     ++countA;
     else if (ch =='I' ‖ ch =='i')
     ++countI;
     else
     cout <<"error";【解】 上述if语句区分了7种情况,用switch语句会使逻辑更加清晰。在7种情况中,大小写字母e的处理是相同的,大小写字母a的处理是相同的,大小写字母i的处理是相同的,可以将大小写字母两种情况连在一起,最后一种作为default。该switch语句表示如下:switch (ch) {
     case 'E': case 'e':++countE; break;
     case 'A' : case 'a': ++countA; break;
     case 'I' : case 'i': ++countI;; break;
     default : cout <<"error";
     }6. 如果a=5、b=0、c=1,写出下列表达式的值以及执行了表达式后变量a、b、c的值。
     (1) a‖(b += c)
     (2) b + c && a
     (3) c = ( a == b)
     (4) (a-= 5) ‖ b++ ‖--c
     (5) b < a <= c
     【解】
     这些表达式的结果如表3?2所示。续表表3?26题答案序号a的值b的值c的值表达式的值(1)501true(2)501true(3)5000(4)010false(5)501true7. 修改下面的switch语句,使之更简洁。switch (n) {
     case 0: n += x; ++x; break;
     case 1: ++x; break;
     case 2: ++x; break;
     case 3: m = m+n; --x; n = 2; break;
     case 4: n = 2;
     }【解】 观察上述switch语句,发现case 1和case 2的处理接近相同,case 0的最后一个语句与case 1相同,这3个部分可以合并在一起。case 3的最后一个语句与case 4接近相同,因此也可以合并在一起。最终形成的switch语句如下:switch (n) {
     case 0: n += x;
     case 1:
     case 2: ++x; break;
     case 3: m = m+n; --x;
     case 4: n = 2;
     }8. 某程序需要判断变量x的值是否在0~10(不包括0和10),程序采用语句如下:if (0 < x < 10) cout << "成立";
     else cout << "不成立";但无论x的值是多少,程序为什么永远输出成立?
     【解】 在C++中,“<”运算是左结合的。0     else cout << "不成立";3.2.2程序设计题
     1. 从键盘输入3个整数,输出其中的优选值、最小值和平均值。
     【解】 首先,将第一个数既作为优选值max也作为最小值min。然后,处理第二个数。将第二个数与最小值相比,如果小于最小值,将第二个数作为最小值。再将第二个数与优选值相比,如果大于优选值,将第二个数作为优选值。最后,处理第三个数,处理过程与第二个数相同。现在max中保存的数是三个数中的优选值,min中保存的数是三个数中的最小值。平均值avg是将这3个整数相加,然后除以3。这个算法的实现过程如代码清单3?1。
     代码清单3?1求3个整数的优选值、最小值和平均值的程序#include
     using namespace std;
     int main()
     {
     double avg;
     int num1, num2, num3, max, min;
     cout << "请输入三个整数:";
     cin >> num1 >> num2 >> num3 ;
     max = min = num1;
     if (num2 > max) max = num2;
     if (num2 < min) min = num2;
     if (num3 > max) max = num3;
     if (num3 < min) min = num3;
     avg = (num1 + num2 + num3 ) / 3.0;
     cout << "优选值是" << max << endl;
     cout << "最小值是" << min << endl;
     cout << "平均值是" << avg << endl;
     return 0;
     }2. 编写一个程序,输入一个整数,判断输入的整数是奇数还是偶数。例如,输入11,输出为11是奇数【解】 判断一个整数是奇数还是偶数,可以通过检验这个整数除2后的余数。如果余数为0是偶数,否则是奇数。这个简单的判断可以通过条件表达式来实现。完整的程序如代码清单3?2所示。
     代码清单3?2判断奇偶数的程序#include
     using namespace std; int main()
     {
     int num;
     cout << "请输入一个整数:";
     cin >> num;
     cout << num <<(num % 2 ? "是奇数" :"是偶数") << endl;
     return 0;
     }3. 输入两个二维平面上的点,判断哪个点离原点更近。
     【解】 二维平面上的点(x,y)离原点的距离为x2+y2,只要对输入的两个点分别计算x2+y2,并比较两个值的大小。具体实现如代码清单3?3。
     代码清单3?3判断两个点中哪个点离原点更近#include
     using namespace std;
     int main()
     {
     double x1, x2, y1, y2;
     cout << "请输入第一个点的x和y的值:";
     cin >> x1 >> y1;
     cout << "请输入第二个点的x和y的值:";
     cin >> x2 >> y2;
     if ((x1?x1 + y1 ? y1)< (x2?x2 + y2?y2))
     cout <<"第一个点离原点更近" << endl;
     elseif ((x1?x1 + y1 ? y1) > (x2?x2 + y2?y2))
     cout <<"第二个点离原点更近" << endl;
     else cout <<"两个点离原点距离相同" << endl;
     return 0;
     }4. 有一个函数,其定义如下:
     y=x(x<1)
     2x-1(1≤x<10)
     3x-11(x≥10)
     编一程序,输入x,输出y。
     【解】 这个函数有3种不同的情况,可以用if语句区分3种情况,并针对3种情况做出不同的处理就完成了这个功能。具体程序如代码清单3?4。
     代码清单3?4函数计算程序#include
     using namespace std;
     int main()
     {
     double x, y;
     cout << "请输入x:";
     cin >> 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;
     }5. 编写一个程序,输入一个二次函数,判断该抛物线开口向上还是向下,输出顶点坐标以及抛物线与x轴和y轴的交点坐标。
     【解】 二次函数f(x)=ax2+bx+c是一条抛物线。根据二次函数的性质可知: 当a大于0时,抛物线开口向上,否则开口向下;顶点坐标是(-b/(2a), (4?a?c-b?b)/4/a);与x轴的交点就是方程的两个根,如果方程无根则无交点;与y轴的交点就是x等于0时的y值,也就是c的值。据此可得代码清单3?5。
     代码清单3?5输出抛物线的各个特征值#include
     #include
     using namespace std;
     int main()
     {
     double a, b, c;
     cout << "请输入抛物线的3个系数a、b和c:";
     cin >> a >>b >> c;
     if(a == 0) {
     cout <<"不是二次函数\\n ";
     return 1;
     }
     if (a > 0) cout << "开口向上\\n";
     else cout << "开口向下\\n";
     cout << "顶点坐标是(" << -b/2/a << ", " << (4?a?c-b?b)/4/a<< ")\\n";
     if(b?b - 4 ? a ? c < =) cout << "与x轴无交点\\n";
     elsecout << "与x轴的交点坐标是(" << (-b + sqrt(b?b - 4 ? a ? c))/2/a << ", 0)和(" <<(-b - sqrt(b?b - 4 ? a ? c))/2/a << ", 0)\\n";
     cout << "与y轴的交点坐标是(0, " << c << ")\\n";
     return 0;
     }6. 编写一个程序,输入一个二维平面上的直线方程,判断该方程与x轴和y轴是否有交点,输出交点坐标。
     【解】 设直线方程为ax+by+c=0。如果a等于0且b不等于0,方程简化为by+c=0,这是一条与x轴平行的线,所以与x轴无交点。但注意有个特例,即当c等于0时,该直线与x轴重叠,即有无数个交点。如果a不等于0,该直线与x轴的交点是y等于0时的x值,即-c/a。
     如果b等于0且a不等于0,方程简化为ax+c=0,这是一条与y轴平行的线,所以与y轴无交点。但注意有个特例,即当c等于0时,该直线与y轴重叠,即有无数个交点。如果b不等于0,该直线与y轴的交点是x等于0时的y值,即-c/b。具体程序如代码清单3?6。
     代码清单3?6求直线方程与x和y轴的交点#include using namespace std;
     int main()
     {
     double a, b, c;//ax + by + c = 0
     cout << "请输入a、b和c:";
     cin >> a >> b >> c;
     if (a == 0 && b == 0 ) {
     cout << "非法方程\\n";
     return 1;
     }
     if (a == 0 )
     if (c != 0 ) cout << "与x轴无交点\\n";
     else cout << "与x轴有无数个交点\\n";
     else cout << "与x轴的交点坐标是( 0, " << -c / a << ")\\n";
     if (b == 0 )
     if (c != 0 ) cout << "与y轴无交点\\n";
     else cout << "与y轴有无数个交点\\n";
     else cout << "与y轴的交点坐标是( 0, " << -c / b << ")\\n";
     return 0;
     }7. 编写一个程序,输入一个角度,判断它的正弦值是正数还是负数。
     【解】 0°和180°的正弦值为0。在第一象限和第二象限,正弦值是正数;在第三象限和第四象限,正弦值是负数。具体程序如代码清单3?7。
     代码清单3?7判断输入角度的正弦值是正数还是负数#include
     using namespace std;
     int main()
     {
     double angle;
     cout << "请输入角度(0 ~360):";
     cin >> angle;
     if (angle == 0 ‖ angle == 180) cout << "正弦值是0\\n";
     if (angle < 180 ) cout << "正弦值是正数\\n";
     else cout << "正弦值是负数\\n";
     return 0;
     }8. 编写一个计算工资的程序。某企业有3种工资计算方法: 计时工资、计件工资和固定月工资。程序首先让用户输入工资类别,再按照工资类别输入所需的信息。若为计时工资,则输入工作时间及每小时工资;若为计件工资,则输入每件的报酬和本月完成的件数;若为固定月工资,输入工资额。计算本月应发工资。职工工资需要缴纳个人所得税(简称个税),缴纳个税的方法: 应发工资在(0,2000]元免税;(2000,2500]元,超过2000元的部分按5%计税;(2500,4000]元,(2000,2500]元的500元按5%计税,超过2500元的部分按10%计税;4000元以上,(2000,2500]元的500元按5%计税,(2500,4000]元的1500元按10%计税,超过4000元的部分按15%计税。最后,程序输出职工的应发工资和实发工资。
     【解】 程序的工作可以分为两个阶段: 计算应发工资和计算实发工资。计算应发工资是一个典型的多分支的实例。3类工资计算方法就是3个分支。可以用switch语句区分各类工资,根据不同情况做出不同的处理,最后得到应发工资,并输出应发工资。第二阶段是计算实发工资。各类工资的扣税方法是一样的,可以合并在一起处理。扣税的过程也可分为几种情况,用if语句来区分。首先,检查应发工资是否超过4000元,收取4000元以上的税金。然后,再检查是否超过2500元,收取(2500,4000]元的税金。最后,检查是否超过2000元,收取(2000,2500]元的税金。实发工资是应发工资减去收取的所有税金。程序的实现如代码清单3?8。
     代码清单3?8计算工资程序#include
     using namespace std;
     int main()
     {
     char type;
     int time, piece;
     double salary, unitSalary;
     cout << "请选择计时工资(T)、计件工资(P)或固定月工资(S):";
     cin >> type;
     //计算应发工资
     switch (type) {
     case 'T' ://计时工资
     case 't': cout << "请输入工作时间和小时工资:";
     cin >> time >> unitSalary;
     salary = time ? unitSalary;
     cout << "工作时间:" << time <<" 小时,本月应发工资为" << salary << endl;
     break;
     case 'P' ://计件工资
     case 'p': cout << "请输入完成数量和每件报酬:";
     cin >> piece >> unitSalary;
     salary = piece ? unitSalary;
     cout << "完成件数:" << piece <<",本月应发工资为" << salary << endl;
     break;
     case 'S'://固定月工资
     case 's': cout << "请输入月工资:";
     cin >> salary;
     out << "本月应发工资为" << salary << endl;
     break;
     default: cout << "错误的工资类型!" << endl; return 1;
     }
     //计算实发工资
     double tmp = salary;
     if (tmp > 4000) {
     salary -= (tmp - 4000) ? 0.15;
     tmp = 4000;
     }
     if (tmp > 2500) {
     salary -= (tmp - 2500) ? 0.1;
     tmp = 2500;
     }
     if (tmp > 2000)
     salary -= (tmp - 2000) ? 0.05;
     cout << "本月实发工资为"<< salary;
     return 0;
     }9. 编写一个程序,输入一个字母,判断该字母是元音字母还是辅音字母。程序用两种方法实现: 第一种用if语句实现,第二种用switch语句实现。
     【解】 英文字母中有5个元音字母: a、e、i、o、u,只要输入的是这5个字母中的某一个,输出“该字母是元音字母”,否则输出“该字母是辅音字母”。区分出这5个元音字母可以用if语句,实现的程序如代码清单3?9。也可以用switch语句区分出这5种特殊情况,实现的程序如代码清单3?10。注意字母有大小写。
     代码清单3?9用if语句判断元音字母的程序#include
     using namespace std;
     int main()
     {
     char ch;
     cout << "请输入一个字母:";
     cin >> ch;
     if (ch >= 'a' && ch <='z') ch = ch - 'a' + 'A';//全部换成大写字母
     if (ch >'Z' ‖ ch < 'A') cout << "不是字母" << endl;
     else if (ch == 'A' ‖ ch == 'E' ‖ ch == 'I' ‖ ch == 'O' ‖ ch == 'U')
     cout << "该字母是元音字母" << endl;
     else cout << "该字母是辅音字母" << endl;
     return 0;
     }代码清单3?10用switch语句判断元音字母的程序#include
     using namespace std;
     int main()
     {
     char ch;
     cout << "请输入一个字母:"; cin >> ch;
     if (ch >= 'a' && ch <='z') ch = ch - 'a' + 'A';//全部换成大写字母
     if (ch >'Z' ‖ ch < 'A') cout << "不是字母" << endl;
     else
     switch (ch) {
     case 'A' : case 'E' : case 'I': case 'O': case 'U':
     cout << "该字母是元音字母" << endl; break;
     default: cout << "该字母是辅音字母" << endl;
     }
     return 0;
     }10. 编写一个程序,输入3个非0正整数,判断这3个值是否能构成一个三角形。如果能构成一个三角形,判断该三角形是否是直角三角形。
     【解】 3个值能构成一个三角形必须满足: 任意两条边之和大于第三条边。构成一个直角三角形的条件: 两条直角边的平方和等于斜边的平方。程序实现如代码清单3?11。程序首先找出最长的边a,这样判断三角形是否成立只需要判断b+c是否大于a。如果能构成三角形,那么b和c是直角边,a是斜边,再判断b2+c2是否等于a2,决定是否能构成直角三角形。
     代码清单3?11判断3个非0正整数能否构成三角形和直角三角形#include
     using namespace std;
     int main()
     {
     int a, b, c, tmp;
     cout << "请输入3条边长:";
     cin >> a >> b >> c;
     //找出最长的边a
     if (a < b) { tmp = a; a = b; b = tmp; }
     if (a < c) { tmp = a; a = c; c = tmp; }
     //判断三角形
     if (b + c > a)
     if (a ? a == b ? b + c ? c)
     cout << "该图形是三角形且为直角三角形"<< endl;
     else cout << "该图形是三角形" << endl;
     else cout << "该图形不能构成三角形" << endl;
     return 0;
     }11. 恺撒密码是将每个字母循环后移3个位置后输出。如a变成d,b变成e,……,x变成a,y变成b,z变成c。编一个程序,输入1个字母,输出加密后的密码。
     【解】 C++的字符类型的变量可执行加减运算。将字母从'a'变成'd','b'变成'e',……,只需要执行加3操作。有3个字母是例外,'x'变成'a','y'变成'b','z'变成'c'。这3个字母似乎需要特殊处理。但事实上,只要巧妙利用取模操作,可以将两种情况合并起来。具体实现见代码清单3?12。
     代码清单3?12恺撒密码#include
     using namespace std;
     int main()
     {
     char ch;
     cout << "请输入一个字母:";
     cin >> ch;
     if(ch >= 'a' && ch <= 'z')
     ch = (ch - 'a' + 3) % 26 + 'a';
     else if (ch >= 'A' && ch <= 'Z')
     ch = (ch - 'A' + 3) % 26 + 'A';
     cout << ch << endl ;
     return 0;
     }12. 编写一个成绩转换程序,转换规则: A档是90~100分,B档是75~89分,C档是60~74分,其余分数为D档。程序用switch语句实现。
     【解】 这个问题的关键在于如何将每个档次用一个常量来表示。观察转换规则可知,B档和C档都占15分,由此可以想到能否让分数除以15。将分数除以15后,90~100分映射到6,75~89分映射到5,60~74分映射到4,4以下都是不及格。因此switch语句有4种情况: 6、5、4及4以下,把4以下作为default,于是可得代码清单3?13的程序。
     代码清单3?13成绩转换程序#include
     using namespace std;
     int main()
     {
     int score;
     cout << "请输入分数:";
     cin >> score;
     switch(score / 15) {
     case 6: cout << "A\\n"; break;
     case 5: cout <<"B\\n"; break;
     case 4: cout <<"C\\n"; break;
     default: cout << "D\\n";
     }
     return 0;
     }13. 二维平面上的一个与x轴平行的矩形可以用两个点来表示。这两个点分别表示矩形的左下方和右上方的两个顶点。编写一个程序,输入两个点(x1,y1)、(x2,y2),计算它们对应的矩形的面积和周长,并判断该矩形是否是一个正方形。
     【解】 首先根据两个点计算矩形的两条边长,矩形面积是长×宽,周长是2×(长+宽)。正方形是长和宽相等的矩形,但问题是长和宽都是实数,不能做相等比较,于是程序采用了判断长和宽的差的绝对值小于一个可容忍的误差。代码清单3?14中将误差设为10-8,并将它定义为一个常量EPSILON,以方便程序的修改。求实数的绝对值可以用C++的标准函数库cmath中的函数fabs。
     代码清单3?14计算矩形的面积与周长,并判断是否是正方形#include
     #include
     using namespace std;
     #defineEPSILON1e-8
     int main()
     {
     double x1, y1, x2, y2;
     cout << "请输入左下方点的x和y:";
     cin >> x1 >> y1;
     cout << "请输入右上方点的x和y:";
     cin >> x2 >> y2;
     cout << "面积为" <<(x2-x1) ? ( y2-y1) << endl;
     cout << "周长为" <<2? ((x2-x1) + ( y2-y1)) << endl;
     if (fabs((x2-x1)-(y2-y1)) < EPSILON)cout <<"该图形是正方形\\n";
     elsecout << "该图形不是正方形\\n";
     return 0;
     }14. 设计一个停车场的收费系统。停车场有3类汽车,分别用3个字母表示: C代表轿车,B代表客车,T代表卡车。收费标准如表3?3所示。表3?3某停车场收费标准车 辆 类 型收 费 标 准轿车3小时内(包括3小时),每小时10元;3小时后,每小时15元客车2小时内(包括2小时),每小时20元;2小时后,每小时35元卡车1小时内(包括1小时),20元;1小时后,每小时30元编写一个程序,输入汽车类型和入库、出库的时间,输出应交的停车费。
     【解】 这个程序的难点在于如何计算停车时间。如果所有的车都是当天进场当天出场,停车时间就是出库时间减去入库时间。如果过夜了,计算停车时间就比较麻烦。假设每辆车的停车时间都不会超过24小时,那么

蜀ICP备2024047804号

Copyright 版权所有 © jvwen.com 聚文网