第1部分〓《经济管理中的C++程序设计》(第2版)习题及参考答案 第1章〓C++语言基础 思考题 1. C++语言有哪些特点和优点? 参考答案: 特点: 尽量兼容C语言; 支持面向对象的方法。 优点: 语言简洁灵活; 运算符和数据结构丰富; 具有结构化控制语句; 程序执行效率高; 同时具备高级语言和汇编语言的优点。 2. 什么是变量?定义变量后,如何分配内存单元?与变量的数据类型是什么关系? 参考答案: 变量的本质就是要在内存的某个位置开辟空间,用来保存数据。变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。每个变量都有指定的类型,类型决定了变量存储的大小和布局,该大小范围内的值都可以存储在内存中,运算符可应用于变量上。 3. 写出C++语句声明一个常量PI,值为3.1416; 再声明一个浮点型变量a,把PI的值赋给a。 参考答案: const float PI=3.1416; float a = PI; 4. 什么是标识符?如何声明?合法的标识符声明规则是什么? 参考答案: 标识符是用来命名变量、函数、类等程序实体的名称。合法的标识符必须遵循以下规则。 (1) 由字母(大小写)、数字和下画线组成。 (2) 第一个字符必须是字母或下画线。 (3) 标识符不能是C++的关键字。 (4) C++命名标识符区分大小写。 5. 什么是常量?什么是符号常量?什么是常变量?两者的区别是什么? 参考答案: 常量是在程序执行过程中其值不能被修改的变量。在C++中,常量可以分为符号常量和常变量两种主要类型。 符号常量是在程序中使用标识符来表示固定的数值或对象,它们的值在程序执行期间是不可更改的。在C++中,通常使用#define预处理指令来定义符号常量。 常变量是在声明时初始化,并且在之后不能修改其值的变量。在C++中,可以使用const关键字来声明常变量。 区别: 符号常量不占用内存空间,在预编译时就全部由符号常量的值替换了,而常变量占用内存空间,只是此变量在存在期间不能重新赋值。 6. 如何理解运算符的优先级和结合性?如何运用其规则求解表达式? 参考答案: 运算符优先级定义了运算符在表达式中的计算顺序。当表达式中有多个运算符时,具有较高优先级的运算符会先于优先级较低的运算符进行计算。如果运算符具有相同的优先级,则计算顺序取决于运算符的结合性。 7. 程序设计包括几个阶段?每个阶段的主要任务是什么?如何通过软件系统完成? 参考答案: 程序设计过程应当包括分析问题、设计算法、编写程序、运行程序、分析结果、编写程序文档等不同阶段。 (1) 分析问题: 对于接受的任务要进行认真的分析,研究所给定的条件,分析最后应达到的目标,找出解决问题的规律,选择解题的方法,完成实际问题。 (2) 设计算法: 即设计出解题的方法和具体步骤。 (3) 编写程序: 将算法翻译成计算机程序设计语言,对源程序进行编辑、编译和连接。 (4) 运行程序,分析结果: 运行可执行程序,得到运行结果。能得到运行结果并不意味着程序正确,要对结果进行分析,看它是否合理。不合理要对程序进行调试,即通过上机发现和排除程序中的故障的过程。 (5) 编写程序文档: 许多程序是提供给别人使用的,如同正式的产品应当提供产品说明书一样,正式提供给用户使用的程序,必须向用户提供程序说明书。内容应包括程序名称、程序功能、运行环境、程序的装入和启动、需要输入的数据及使用注意事项等。 8. 程序设计中的语法错误和逻辑错误的区别是什么?如何处理和解决错误? 参考答案: 语法错误: 语法错误是指程序中违反编程语言规则的错误,即程序无法被编译器正确解析和理解。这些错误通常是由于拼写错误、缺少分号、括号不匹配等基本语法错误引起的。 逻辑错误: 逻辑错误是指程序在编译和运行过程中没有报错,但程序的输出结果与预期不符的错误。 处理方法: 对于语法错误,编译器通常会提供详细的错误信息,可以根据错误信息直接定位并修复错误。对于逻辑错误,可以通过调试器逐步执行程序并观察变量的值、条件的判断等来定位问题所在,逻辑错误的修复通常需要对程序的算法和逻辑进行重新评估和调整。 9. 已知复利终值的计算公式为F=P(1+i)n,请写出只含加法、乘法的三年期复利终值表达式。 参考答案: F=P*pow(1+i,3) 10. 生产企业出口货物劳务免抵退税的计算公式如下,请设定变量,用算术表达式实现下面的公式: 当期应纳税额=当期销项税额-(当期进项税额-当期不得免征和抵扣税额) 当期不得免征和抵扣税额=当期出口货物离岸价×外汇人民币折合率×(出口货物适用税率-出口货物退税率)-当期不得免征和抵扣税额抵减额 当期不得免征和抵扣税额抵减额=当期免税购进原材料价格×(出口货物征税率-出口货物退税率) 参考答案: 设当期免税购物原材料价格为mp,出口货物征税率为tr,出口货物退税率为rr,当期不得免征和抵扣税额抵减额为td,当期出口货物离岸价为ep,外汇人民币折合率为er,出口货物适用税率为atr,出口货物退税率为etr,当期不得免征和抵扣税额为ted,当期应纳税额为ctp,当期销项税额为ot,当期进项税额为it。用算术表达式实现的公式为: td=mp×(tr-rr) ted=ep×er×(atr-etr )-td ctp=ot-(it-ted) 练习题 1. C++语言中有哪几种数据类型?简述其值域。编程显示你使用的计算机中的各种数据类型的字节数。 参考答案: 布尔型、字符型、整型、短整型、(4字节)长整型、(8字节)长整型、单精度浮点型、双精度浮点型、长双精度浮点型,如表11所示。 表11数据类型及其值域 数 据 类 型值域 bool逻辑型,只有true和false char-128~127或者0~255 int-2147483648~2147483647 short int-32768~32767 long int-2147483648~2147483647,与int表示范围一样 float精度型占4字节(32位)内存空间,-3.4×10-38~3.4×1038(~7位有效数字) double双精度型占8字节(64位)内存空间,-1.7×10-308~1.7×10308(~15位有效数字) longlong长整型占8字节(64位)内存空间,-263~263-1 long double长双精度型16字节(128位)内存空间,可提供18~19位有效数字 Size of int: 4 bytes Size of float: 4 bytes Size of double: 8 bytes Size of char: 1 byte Size of bool: 1 byte 编写程序 #include using namespace std; int main() { cout << "Size of int: " << sizeof(int) << " bytes" << endl; cout << "Size of float: " << sizeof(float) << " bytes" << endl; cout << "Size of double: " << sizeof(double) << " bytes" << endl; cout << "Size of char: " << sizeof(char) << " byte" << endl; cout << "Size of bool: " << sizeof(bool) << " byte" << endl; return 0; } 2. 打印ASCII码为32~127的字符。 参考答案: ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ 编写程序 #include using namespace std; int main() { for (int i = 32; i <= 127; ++i) { cout << static_cast(i) << " "; } return 0; } 3. 下列标识符中哪些是合法的? Program, -page,_lock, test2, 3in1, @mail, A_B_C_D 参考答案: Program, _lock, test2,A_B_C_D 4. 在下面的枚举类型中, BLUE的值是多少? enum COLOR{WHITE, BLACK=100, RED, BLUE, GREEN=300}; 参考答案: BLUE的值是102。 5. 定义枚举类型weekday, 包括Sunday到Saturday七个元素,在程序中定义weekday类型的变量,对其赋值,定义整型变量,能否对其赋weekday类型的值? 参考答案: 能。 编写程序 #include using namespace std; enum Weekday { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; int main() { int i; Weekend d=Monday; i=d; cout<< "i="< using namespace std; int main( ) { char i, j; i= 'A'; j= 'B '; cout << i <<", "<< j <<", "<< i + j << endl; return 0; } 参考答案: A, B, 131 7. 写出下列程序的运行结果。 #include using namespace std; int main() { int i, j; int m,n; i=8; j=10; m=++i+j++; n=(++i)+(++j)+m; cout << i <<", "<< j<< endl; cout << m <<", "<< n << endl; return 0; } 参考答案: 10, 12 19, 41 8. 已知A公司4月份购买甲产品支付货款10000元,增值税进项税额1700元,取得增值税专用发票。销售甲产品含税销售额为23400元。请设计变量,编写一个程序,求出增值税额。 增值税额计算公式如下。 应纳税额=当期销项税额-当期进项税额 销项税额=销售额×税率 销售额=含税销售额÷(1+税率) 参考答案: 问题分析 销项税额: 是指纳税人提供应税服务按照销售额和增值税税率计算的增值税额。 进项税额: 是指纳税人购进货物或者接受加工修理修配劳务和应税服务,支付或者负担的增值税税额。 目前销售货物增值税率为17%(2018年5月1日起17%税率变为16%税率),应纳税额的计算公式为: 应纳税额=含税销售额/(1+17%)×17%-进项税额 根据上述公式,销售甲产品的增值税额为23400/(1+17%)×17%-1700=1700元。 编写程序 1#include 2#define TAXRATE 0.17 //符号常量TAXRATE表示17%的增值税税率 3using namespace std; 4int main() 5{ 6float sales = 23400; 7float taxin = 1700; 8float tax; 9tax = sales / (1 + TAXRATE)*TAXRATE - taxin; 10cout << "销售甲产品含税销售额为:" << sales << "元\n"; 11cout << "增值税进项税额为:" << taxin << "元\n"; 12cout << "所需缴纳的增值税为:"; 13cout << tax << "元\n"; 14return 0; 15} 运行结果: 销售甲产品含税销售额为: 23400元 销售甲产品含税销售额为: 1700元 所需缴纳的增值税为: 1700元 9. 公司固定资产原值为11万元,预计残值为1万元,使用年限为4年。利用年数总和法,编程计算每一年的固定资产折旧额。 年折旧额计算公式如下。 年折旧率=尚可使用年限预计使用年限各年数之和=尚可使用年限预计使用年限×(预计使用年限+1)÷2×100% 年折旧额=(固定资产原值-预计残值)×年折旧率 参考答案: 问题分析 每年先利用年折旧率公式计算出年折旧率,再利用年折旧额公式计算出年折旧额,其中预计使用年限为4年,尚可使用年限为4年、3年、2年、1年依次递减,用循环结构实现。 根据上述公式,第一年的固定资产折旧率分别为4/(4×(4+1)/2)×100%=40%,固定资产折旧额为(11-1)×40%=4万元; 第二年的固定资产折旧率为3/(4×(4+1)/2)×100%=30%,固定资产折旧额为(11-1)×30%=3万元; 第三年的固定资产折旧率为2/(4×(4+1)/2)×100%=20%,固定资产折旧额为(11-1)×20%=2万元; 第四年的固定资产折旧率为1/(4×(4+1)/2)×100%=10%,固定资产折旧额为(11-1)×10%=1万元。 编写程序 1#include 2using namespace std; 3int main() 4{ 5float original = 11; 6float residual = 1; 7int years = 4; 8int i; 9float rate, depreciation; 10for (i = 4; i >0; i--) 11{ 12rate = i / (years*(years + 1.0) / 2.0); 13depreciation = (original - residual)*rate; 14cout << "第" << years - i + 1 << "年的固定资产折旧额为:" << depreciation 15<< "万元\n"; 16} 17return 0; 18} 运行结果: 第1年的固定资产折旧额为: 4万元 第2年的固定资产折旧额为: 3万元 第3年的固定资产折旧额为: 2万元 第4年的固定资产折旧额为: 1万元 10. 设圆半径r=1.5,圆柱高h=3,编写程序求圆周长、圆面积、球(r为半径)表面积、球体积、圆柱(底面圆半径为r)体积。 参考答案: 问题分析 计算圆周长: 使用公式C=2×π×r计算圆周长。 计算圆面积: 使用公式A=π×r2计算圆面积。 计算球表面积: 使用公式S=4×π×r2计算球的表面积。 计算球体积: 使用公式V=(4/3)×π×r3计算球的体积。 计算圆柱体积: 使用公式V=π×r2×h计算圆柱的体积。 根据上述公式,计算得到圆周长=9.42477,圆面积=7.06858,球表面积=28.2743,球体积=14.1372,圆柱体积=21.2057。 编写程序 #include #include using namespace std; int main() { const double pi = 3.14159; double r = 1.5; double h = 3.0; //圆周长 double circle_perimeter = 2 * pi * r; //圆面积 double circle_area = pi * r * r; //球表面积 double sphere_surface_area = 4 * pi * r * r; //球体积 double sphere_volume = 4 * pi * pow(r, 3) / 3; //圆柱体积 double cylinder_volume = pi * r * r * h; cout << "圆周长=" << circle_perimeter << endl; cout << "圆面积=" << circle_area << endl; cout << "球表面积=" << sphere_surface_area << endl; cout << "球体积=" << sphere_volume << endl; cout << "圆柱体积=" << cylinder_volume << endl; return 0; } 第2章〓程序控制结构 思考题 1. C++中有哪些控制结构?请说明它们的应用场合。 参考答案: 主要有顺序、选择、循环这3种基本控制结构。 2. C++中有哪些条件分支语句?请写出其语法结构,并对比它们的相同点与不同点。 参考答案: C++语言中构成条件分支结构的流程控制语句有if语句和switch语句,其中,if条件分支主要用于两个分支的选择,而switch分支则用于多个分支的选择。 3. C++语言中有哪些循环控制结构?请写出其语法形式,并说明执行流程。 参考答案: 根据循环体和循环条件执行的先后次序,循环结构可以分为如下两类。 当型循环: 首先判定循环条件,为真时执行循环体,否则结束循环。 直到型循环: 首先执行循环体,再判定循环条件,为真时继续循环; 否则结束循环。 在C++语言中,提供了三种典型的循环结构: while结构、dowhile结构和for结构。 4. 简述if(x=3)和if(x==3)这两条语句的差别。 参考答案: (x=3)是一个赋值表达式,而不是一个条件判断。它会将变量x的值设置为3,然后将这个赋值表达式的结果作为条件。条件判断的结果取决于赋值操作的结果是否为零。如果赋值成功,则条件为真,否则为假。 (x==3)是一个典型的相等比较操作,用来检查变量x的值是否等于3。只有当x的值确实等于3时,条件判断的结果才为真。 5. 在一个for循环中是否可以初始化多个变量?如何实现? 参考答案: 可以。 #include int main() { for (int i = 0, j = 10; i < 5; ++i, --j) { std::cout << "i: " << i << ", j: " << j << std::endl; } return 0; } 6. 已知x, y两个变量,编写if语句,把较小的值赋给原本较大值的变量。 参考答案: 编写程序 #include using namespace std; int main() { int x = 5; int y = 10; cout << "初始值:x = " << x << ", y = " << y << endl; if (x < y) { y = x; } else { x = y; } cout << "更新后的值:x = " << x << ", y = " << y << endl; return 0; } 7. 比较break语句与continue语句的不同用法。 参考答案: 当break语句执行时,它会立即终止当前所在的循环,不管循环条件是否已经完成,并跳出循环体,继续执行循环后面的代码。 当continue语句执行时,它会立即跳过当前迭代中剩余的循环代码,并继续下一次循环的执行,仍然保持在循环中。 练习题 1. 我国税法规定: 个人将购买不足5年的住房对外销售的,全额征收营业税; 个人将购买超过5年(含5年)的非普通住房对外销售的,按照其销售收入减去购买房屋的价款后的差额征收营业税; 个人将购买超过5年(含5年)的普通住房对外销售的,免征营业税。请编程实现。 参考答案: 问题分析 从题目描述中可以发现,营业税的计算需要五个变量,分别是房屋类型type、持有年限year、购买价格buyPrice、出售价格sellPrice和营业税税率taxRate,需要定义相应的变量,并接受用户从键盘输入的数值。 具体计算过程,题目描述很详尽,可以参见程序。 编写程序 1#include 2using namespace std; 3double tax(int type, int year, double buyPrice, double sellPrice, double taxRate) 4{ 5double taxSum=0; 6if(year<5) 7taxSum = sellPrice*taxRate; 8else if(type==1) 9taxSum = 0; 10else 11taxSum = (sellPrice - buyPrice)*taxRate; 12if(taxSum<0) 13taxSum=0; 14return taxSum; 15} 16int main() 17{ 18int type = 0; 19int year = 0; 20double buyPrice = 0; 21double sellPrice = 0; 22double taxRate = 0.10; //假设房屋买卖税率是10% 23cout<<"请问您的房屋类型是:1-代表普通住房,2-代表非普通住房\n"; 24cin>>type; 25cout<<"请问您房屋持有的年限是: \n"; 26cin>>year; 27cout<<"请问您购买房屋时的价格是: \n"; 28cin>>buyPrice; 29cout<<"请问您房屋出售的价格是: \n"; 30cin>>sellPrice; 31cout<<"您需要缴纳的税费为:"< 2using namespace std; 3int main() 4{ 5double salary = 0; 6double x = 10000; 7cout<<"请问您的收入是:"; 8cin>>salary; 9if(salary>x) 10{ 11cout<<"您适合进行股票投资"; 12} 13else 14cout<<"您适合进行储蓄投资"; 15return 0; 16} 运行结果: 请问您的收入是: 100000 您适合进行股票投资 3. 编写程序,实现输入一批正数,输入0时结束循环,并且输出最大的正数。 参考答案: 问题分析 题目要求输出最大的正数,因此可以定义变量x来存储当前的最大正数; 而输入的正数需要从键盘接收,定义num来接收该数据。接收后需要判断输入的num是否为0,如果不为0,则将输入num与x比较,若num>x,则将x更新为num的值,继续循环; 否则结束程序,进行输出。 编写程序 1#include 2using namespace std; 3int main() 4{ 5int x = 0, num; 6cout<<"请输入一个正数,输入0结束循环 : "; 7cin>>num; 8while(num!=0) 9{ 10if(num > x) 11x = num; 12cout<<"请输入一个正数,输入0结束循环 : "; 13cin>>num; 14} 15cout<<"序列中最大元素是:"< 2using namespace std; 3int main() 4{ 5double profit = 0.0; 6double bonus = 0.0; 7cout<<"请输入当月利润: "; 8cin>>profit; 9if(profit<=100000) 10{ 11bonus = profit*0.10; 12} 13if(profit>100000 && profit<=200000) 14{ 15bonus = (profit-100000)*0.075 + 100000*0.10; 16} 17if(profit>200000 && profit<=400000) 18{ 19bonus = (profit-200000)*0.05+100000*0.075+100000*0.10; 20} 21if(profit>400000 && profit<=600000) 22{ 23bonus = (profit-400000)*0.03+200000*0.05+100000*0.075+100000*0.10; 24} 25if(profit>600000 && profit<=1000000) 26{ 27bonus = (profit-600000)*0.015+200000*0.03+200000*0.05+ 28100000*0.075+100000*0.10; 29} 30if(profit>1000000) 31{ 32bonus = (profit-1000000)*0.01+400000*0.015+200000*0.03+ 33200000*0.05+100000*0.075+100000*0.10; 34} 35cout<<"应该发放奖金总数是:"< using namespace std; int main() { int score; //提示输入成绩 cout << "请输入百分制成绩:"; cin >> score; //根据成绩等级输出 switch(score / 10) { case 10: case 9: std::cout << "成绩等级:A" << std::endl; break; case 8: std::cout << "成绩等级:B" << std::endl; break; case 7: std::cout << "成绩等级:C" << std::endl; break; case 6: cout << "成绩等级:D" << endl; break; default: std::cout << "成绩等级:E" << std::endl; } return 0; } 6. 编写程序,输出所有的“水仙花数”。“水仙花数”是指一个3位数,其各位数字立方和等于该数字本身。例如: 153=13+53+33,153就是水仙花数。 参考答案: 问题分析 使用一个循环遍历所有的3位数(100~999),对每个数进行立方和的计算,然后判断是否等于原始数。如果等于原始数,则输出该数,即为水仙花数。 编写程序 #include using namespace std; int main() { cout << "所有的水仙花数:" << endl; for (int num = 100; num < 1000; ++num) { int digit1 = num / 100; //百位 int digit2 = (num / 10) % 10; //十位 int digit3 = num % 10; //个位 //计算立方和 int sum = digit1 * digit1 * digit1 + digit2 * digit2 * digit2 + digit3 * digit3 * digit3; //判断是否为水仙花数 if (sum == num) { cout << num << endl; } } return 0; } 7. 编写程序,有一个分数数列21,32,53,85,138,2113,…,求出这个数列前20项之和。 参考答案: 问题分析 首先用一个变量temp来暂时记录前一项分子,后一项分子为前一项分子和分母相加之和,后一项分母为前一项分子,对每一项进行数值更新,最后利用for循环计算当前项的值并累加到总和中。 编写程序 #include using namespace std; int main() { double sum = 0.0; double numerator = 2.0; //分子 double denominator = 1.0; //分母 double temp; //临时变量 for (int i = 1; i <= 20; ++i) { sum += numerator / denominator; //计算当前项的值并累加到总和中 temp = numerator; //暂时记录前一项分子 numerator = numerator + denominator; //后一项分子为前一项分子和分母相加之和 denominator = temp; //后一项分母为前一项分子 } cout << "前20项之和为:" << sum << endl; return 0; } 8. 编写程序,使用迭代法求出x=a。求平方根的选代公式为xn+1=12xn+axn,要求前后两次求出的x的差的绝对值小于或等于10-3。 参考答案: 问题分析 设定一个初始值,然后根据给定的迭代公式,不断更新这个初始值,直到相邻两次迭代值的差的绝对值小于或等于10-3。 编写程序 #include using namespace std; int main() { double a; cout << "请输入要求平方根的数:"; cin >> a; double x0 = a / 2.0; //初始化 x0 为 a 的一半 double x1; //用来存储下一次迭代的值 double epsilon = 1e-3; //设置精度要求 //迭代求解 while (true) { x1 = 0.5 * (x0 + a / x0); //计算下一个近似值 x1 //如果满足终止条件,即相邻两次 x 的差的绝对值小于 epsilon,则退出循环 if (fabs(x1 - x0) <= epsilon) break; x0 = x1; //更新 x0 为当前 x1 的值,以便下一次迭代 } cout << "平方根的近似值为:" << x1 << endl; return 0; } 9. 编写程序,输出下列的图形。 * *** ***** ******* ***** *** *