c++第三章练习题

发布于:2025-06-03 ⋅ 阅读:(24) ⋅ 点赞:(0)

c++第三章练习题

编程步骤:

  1. Read the problem statement.
  2. Formulate the algorithm using pseudocode and top-down, stepwise refinement.
  3. Write a C++ program.
  4. Test, debug and execute the C++ program.

油耗计算

司机们关心自己汽车的油耗情况。有一位司机通过记录每次行程的行驶里程和消耗的汽油量来跟踪多次行程。
请开发一个 C++ 程序,使用 while 语句输入每次行程的行驶里程和消耗的汽油量。程序应计算并显示每次行程的英里每加仑油耗(MPG),并打印到目前为止所有行程的综合英里每加仑油耗。


(1)问题陈述:输入单次的行驶里程、耗油量,输出单次行程的油耗、当前里程的所有油耗
(2)逐步细化问题
第一次细化
循环读取用户输入的单次的行驶里程、耗油量
单次里程的油耗=单次里程/耗油量
总油耗=之前所有里程/总耗油量

第二次细化
初始化变量:单次的行驶里程miles、总里程total_miles、单次耗油量gallon、总耗油量total_gallon、单次里程油耗MPG、总里程油耗total_MPG
输入单次的行驶里程miles、单次耗油量gallon
while(单次耗油量gallon不等于-1)
单次里程油耗MPG = 单次的行驶里程miles / 单次耗油量gallon
总里程total_miles += 当前里程
总耗油量total_gallon += 单次耗油量gallon
总里程油耗total_MPG = 总里程total_miles / 总耗油量total_gallon
输入单次的行驶里程miles、单次耗油量gallon
输出语句

(3)写c++代码,并进行测试修改

#include <iostream>
int main() {
    float mpg{0}, total_mpg{0}, miles{0}, total_miles{0}, gallons{0}, total_gallons{0};
    while (miles != -1) {
        std::cout << "Enter miles driven (-1 to quit): ";
        std::cin >> miles;
        if (miles == -1)
            break;
        std::cout << "Enter gallons used: ";
        std::cin >> gallons;
        mpg = miles / gallons;
        std::cout << "MPG this trip: " << mpg;
        total_miles += miles;
        total_gallons += gallons;
        total_mpg = total_miles / total_gallons;
        std::cout << "\nTotal MPG: " << total_mpg;
        std::cout << "\n";
    }
    return 0;
}

信用额度

开发一个 C++ 程序,用于确定服装店客户是否超出其赊账账户的信用额度。对于每位客户,可获取以下信息:
a) 账户号码(整数)
b) 月初余额
c) 本月该客户所有消费项目的总金额
d) 本月该客户账户获得的所有信用额度(贷方金额)总和
e) 允许的信用额度

程序应使用 while 语句输入这些信息,计算新余额(= 月初余额 + 消费总额 – 信用额度总和),并判断新余额是否超出客户的信用额度。对于信用额度超标的客户,程序应显示客户的账户号码、信用额度、新余额以及消息 “信用额度已超支”。

(1)问题陈述:输入用户的账户号码、月初余额、本月消费额、本月信用额度来计算新余额,对比允许信用额度,如果超过额度现实客户的相关信息

(2)逐步细化问题
第一次细化
初始化变量:用户的账户号码acc_number、月初余额beg_balance、本月消费额total_charges、本月信用额度total_credits、允许信用额度credit_limit
循环用户输入各个变量信息
计算新余额
判断新余额与允许信用额度
根据判断输出相应信息

第二次细化
初始化变量:用户的账户号码acc_number、月初余额beg_balance、本月消费额total_charges、本月信用额度total_credits、允许信用额度credit_limit
新余额new_balance
循环用户输入各个变量信息
输入:
用户的账户号码acc_number
月初余额beg_balance
本月消费额total_charges
本月信用额度total_credits
允许信用额度credit_limit
计算新余额:
新余额new_balance=月初余额beg_balance + 消费总额total_charges – 信用额度总和total_credits
单条件判断:
新余额new_balance > 允许信用额度credit_limit
打印用户信息
Account 账户号码acc_number
Credit limit 允许信用额度credit_limit
Balance 新余额 new_balance
Credit Limit Exceeded

(3)写c++代码,并进行测试修改

#include <iostream>
int main() {
    int acc_number{0};
    float beg_balance{0.0}, total_charges{0.0}, total_credits{0.0}, credit_limit{0.0}, new_balance{0.0};
    while (acc_number != -1) {
        std::cout << "Enter account number(or -1 to quit): ";
        std::cin >> acc_number;
        if (acc_number == -1)
            break;
        std::cout << "Enter beginning balance: ";
        std::cin >> beg_balance;
        std::cout << "Enter total charges: ";
        std::cin >> total_charges;
        std::cout << "Enter total credits: ";
        std::cin >> total_credits;
        std::cout << "Enter credit limit: ";
        std::cin >> credit_limit;
        new_balance = beg_balance + total_charges - total_credits;
        std::cout << "New balance is: " << new_balance << "\n";
        if (new_balance > credit_limit) {
            std::cout << "Account: " << acc_number << "\n";
            std::cout << "Credit limit: " << credit_limit << "\n";
            std::cout << "Balance: " << new_balance << "\n";
            std::cout << "Credit Limit Exceeded.";
        }
        std::cout << "\n";
    }
    return 0;
}

销售佣金计算器

一家大型公司按佣金制向销售人员支付报酬。销售人员每周固定获得200美元,另加其当周总销售额的9%作为佣金。例如,一位销售了价值5000美元化学品的销售人员,其收入为200美元加上5000美元的9%,总计650美元。
请开发一个C++程序,使用while语句输入每位销售人员上周的总销售额,并计算、显示该销售人员的收入。程序需每次处理一位销售人员的数据。

(1)问题陈述:输入销售额,输出销售人员的薪资
(2)逐步细化问题
第一次细化
初始化变量:周销售额sales、周薪salary
循环输入周销售额sales
周薪salary=周销售额sales*0.09+底薪200
输出周薪
(3)写c++代码,并进行测试修改

#include <iostream>
int main() {
    float sales{0.0}, salary{0.0};
    while (sales != -1) {
        salary = 0.0;
        std::cout << "\nEnter sales in dollars(-1 to end): ";
        std::cin >> sales;
        if (sales == -1)
            break;
        salary = 200 + sales*0.09;
        std::cout << "Salary is: " << salary;
    }
    return 0;
}

阶乘



由于问题c基本包含了问题a和问题b, 所以我们直接写问题c
(1)问题陈述:输入非负整数x,输出对应e^x函数的估计值
(2)逐步细化问题
第一次细化
初始化变量x
计算分母(阶乘)
计算分子
计算每一项
确定估计精度(有几项)
计算估计值

第二次细化
初始化变量x(无符号整数)、项数accuracy_c、初始化ex的值为1
计算分母:从123*4……,每轮计数器乘
计算分子:x
计算ex的值
更新下一项,分子依次乘x

第三次细化
初始化变量x(cpp_dec_float_100大数字)、项数terms=1(无符号整数)、初始化ex=1.0(cpp_dec_float_100大数字)、计数器counter=1(无符号整数)、分母fact=1(cpp_int大数字,承接阶乘较大结果)
用户输入x、项数terms
循环(计数器小于等于项数)
计算分母阶乘:分母*计数器
计算ex值:ex += x / 分母
更新 x:x乘x
更新计数器

(3)写c++代码,并进行测试修改

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
using boost::multiprecision::cpp_int;
using boost::multiprecision::cpp_dec_float_100;

int main() {
    cpp_dec_float_100 x{0}, ex{1};
    unsigned int terms{1}, counter{1};
    cpp_int fact{1};
    std::cout << "Input x: ";
    std::cin >> x;
    std::cout << "Input number of terms: ";
    std::cin >> terms;
    while (counter <= terms) {
        fact *= counter;
        ex += x / cpp_dec_float_100(fact);
        x *= x;
        counter++;
    }
    std::cout << "e^x approximation value: " << ex;
    return 0;
}

其他Boost多精度算术运算

3.14节介绍了Boost多精度库的cpp_int类,并演示了如何将cpp_int对象与加法、减法和乘法运算符配合使用。你还可以使用除法(/)和取模(%)运算符。此外,Boost多精度库还提供了许多执行常见算术计算的函数,例如用于将值提升到指定幂次的pow函数,或用于计算一个数平方根的sqrt函数。若要使用sqrt和pow函数,请在main函数之前添加以下using声明:21

using boost::multiprecision::pow;
using boost::multiprecision::sqrt;

这些函数的操作方式如下:
• pow函数接受两个参数,并返回第一个参数的值提升到第二个参数指定的幂次的结果。例如,调用pow(x, 3)可计算cpp_int对象x的立方。
• sqrt函数需要一个参数,并返回其值的平方根。例如,调用sqrt(x)可获取cpp_int对象x的平方根。

修改图3.5,使用变量value1和value2执行除法(/)和取模(%)运算。另外,计算value1的平方,然后创建包含1000000000000000000000000000000000000(1后面跟着36个零)的cpp_int对象value4,并计算value4的平方根。你更新后的程序的最终输出应如下:

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
using boost::multiprecision::cpp_int;
using boost::multiprecision::cpp_dec_float_100;
using boost::multiprecision::pow;
using boost::multiprecision::sqrt;
int main() {
    //initializing cpp_ints
    const cpp_int value1{"100000000000000000000000000000"};//30 digits
    const cpp_int value2{9223372036854775807LL}; //long long max
    const int value3{3};
    const cpp_int value4{"1000000000000000000000000000000000000"};
    std::cout << "Initial values"
        << "\ncpp_int value1:" << value1
        << "\ncpp_int value2:" << value2
        << "\n int value3:" << value3;
    //arithmetic with cpp_ints
    std::cout << "\n\nUSE CPP_INT OBJECTS WITH THE +,-,*,/,AND % OPERATORS"
        << "\nvalue1 + value2: " << value1 + value2
        << "\nvalue1 - value2: " << value1 - value2
        << "\nvalue1 * value2: " << value1 * value2
        << "\nvalue1 / value2: " << value1 / value2
        << "\nvalue1 % value2: " << value1 % value2;
    std::cout << "\n\nMULTIPLY A CPP_INT OBJECT BY INT VALUES"
        << "\nvalue1*value3: " << value1*value3
        << "\nvalue1*17: " << value1*17;
    // arithmetic mixing cpp_ints and integers
    std::cout << "\n\nusing boost multiprecision library functions pow and sqrt"
    << "\nvalue1 squared: " << pow(value1,2)
    << "\nsquare root of value4: " << sqrt(value4) << "\n";
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到