摘要
第
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小时,那么