C++ Primer Plus(第六版)编程练习 第3章 处理数据

1. 编写一个小程序,要求用户使用一个整数指出自己的身高(单位为英寸),然后将身高转换为英尺和英寸,该程序使用下划线字符来指示输入位置。另外,使用一个const符号常量来表示转换因子。

本题要求将输入数据转换为不同的表达方式,使用不同的单位。而从单位为英寸,转换为英单位是尺和英寸,就是将原值除以转换比例之间,得出商和余数,商的单位为英尺,余数的单位为英寸;这里的转换比例为12。

另外这里还要注意,题目要求使用下划线字符来指示输入位置,就是要求你打出下划线,然后使用“\b”字符来使光标回退到下划线的最前端。

代码如下:

// 3.1.cpp: 定义控制台应用程序的入口点。
// 3.1.cpp: 显示自己的身高

#include "stdafx.h"
#include <iostream>

int main()
{
    using namespace std;
    cout << "Enter your height:________\b\b\b\b\b\b\b\b ";
    int height;
    cin >> height;
    const int Ft_per_in = 12;
    int ft, in;
    ft = height / Ft_per_in;
    in = height % Ft_per_in;
    cout << "That means you are " << ft << " feet and " << in << " inches height." << endl;
    system("pause");
    return 0;
}

代码运行结果如下:



2. 编写一个小程序,要求以几英尺几英寸的方式输入其身高,并以磅为单位输入其体重。(使用3个变量来存储这些信息。)该程序报告其BMI(Body Mass Index,体重指数)。为了计算BMI, 该程序以英寸的方式指出用户的身高(1英尺为12英寸),并将以英寸为单位的身高转换为以米为单位的身高(1英寸=0.0254米)。然后,将以磅为单位的体重转换为以千克为单位的体重(1千克=2.2磅)。最后,计算相应的BMI——体重(千克)除以身高(米)的平方。用符号常量表示各种转换因子。

本题和上一题类似,要求用户将输入数据进行单位转换,另外要求将转换后的数据进行计算得到一个新的值BMI。有了转换单位的转换因子,我们就可以轻松计算,但是这里要求我们使用符号常量表示转换因子,也就是使用const。

这里有一点需要注意,题目要求输入的身高是英尺+英寸的方式,因此这里需要两步转换才能转换为单位为米的身高,第一步是英尺+英寸转换为英寸,第二步是英寸转换为米;而体重方面,从磅转换为千克,就只需要转换一次即可。

代码如下:

// 3.2.cpp: 定义控制台应用程序的入口点。
// 3.2.cpp: 计算体重指数

#include "stdafx.h"
#include <iostream>

int main()
{
    using namespace std;
    cout << "Enter your feet:________\b\b\b\b\b\b\b\b";
    int feet;
    cin >> feet;
    cout << "Enter your inches:________\b\b\b\b\b\b\b\b";
    int inch;
    cin >> inch;
    cout << "Enter your weight: ________\b\b\b\b\b\b\b\b";
    int weight_p;
    cin >> weight_p;
    cout << "So you are " << feet << " feet and " << inch << " inches height and " << weight_p << " pounds weight." << endl;
    int height_inch;
    const int Ft_per_in = 12;
    height_inch = feet * Ft_per_in + inch;
    const double M_per_in = 0.0254;
    double height_meter;
    height_meter = height_inch * M_per_in;
    const double Kg_per_p = 2.2;
    double weight_kg;
    weight_kg = weight_p / Kg_per_p;
    cout << "That means you are " << height_meter << " meters height and " << weight_kg << " kilograms weight." << endl;
    double BMI;
    BMI = weight_kg / (height_meter * height_meter);
    cout << "And your BMI is " << BMI << endl;
    system("pause");
    return 0;
}

代码运行结果如下:



3. 编写一个程序,要求用户以度、分、秒的方式输入一个纬度,然后以度为单位显示该纬度。1度为60分,1分等于60秒,请以符号常量的方式表示这些值。对于每个输入值,应使用一个独立的变量存储它。下面是该程序运行时的情况:

Enter a latitude in degrees, minutes, and seconds:

First, enter the degrees: 37

Next, enter the minutes of arc: 51

Finally, enter the seconds of arc: 19

37 degrees, 51 minutes, 19seconds = 37.8553 degrees

本题要求用户输入一个纬度数据,然后进行单位转换后显示,使用符号常量来表示转换因子,基本上和前两题类似。

代码如下:

// 3.3.cpp: 定义控制台应用程序的入口点。
// 3.3.cpp: 显示度、分、秒之间的转换

#include "stdafx.h"
#include <iostream>

int main()
{
    using namespace std;
	
    cout << "Enter a latitude in degrees, minutes, and seconds:" << endl;
    cout << "First, enter the degrees:__\b\b";
    int degree;
    cin >> degree;
    cout << "Next, enter the minutes:__\b\b";
    int minute;
    cin >> minute;
    cout << "Finally, enter the seconds:__\b\b";
    int second;
    cin >> second;
    const int Convert = 60;
    double latitude;
    latitude = degree + double(minute) / Convert + double(second) / Convert / Convert;
    cout << degree << " degrees, " << minute << " minute, " << second << " seconds = " << latitude << " degrees" << endl;
    system("pause");
    return 0;
}

在这里有一个地方需要注意,我们在输入的时候,无论是度、分、秒中的哪一个,都是只需要输入一个int类型的整数,但是在计算的时候,由于要除以转换因子60,最终得到的度数肯定是double类型的浮点数,所以这里有两种比较直观的方法来解决计算问题,一种是再声明两个double类型的浮点数,分别来存储从分转换过来的度数以及从秒转换过来的度数,然后将这两个浮点数与本身输入就存在的int类型的整数相加来得到度数,这里int类型和double类型相加,结果是double类型;另一种方法是我使用的这样,直接进行度分秒的转换及相加计算,只是在分和秒的前面加上强制类型转换,将int类型的整数想转换为double类型的浮点数,之后再进行除以转换因子60来得到从分或从秒转换过来的度数,这样再与输入的度数相加的时候,就是两个double类型的浮点数相加了,结果也就自然是double类型的浮点数了。

代码运行结果如下:



4. 编写一个程序,要求用户以整数方式输入秒数(使用long或long long变量存储),然后以天、小时、分钟和秒的方式显示这段时间。使用符号常量来表示每天有多少小时、每小时有多少分钟以及每分钟有多少秒。该程序的输出应与下面类似:

Enter the number of seconds: 3160000

316000 seconds = 365 days, 17 hours, 46 minutes, 40 seconds

本题要求用户输入一个秒数,然后转换为天数+小时数+分钟数+秒数,相当于把之前的英尺+英寸转换为英寸的题目反过来计算,我们只需要按照对应关系计算就可以了。

代码如下:

// 3.4.cpp: 定义控制台应用程序的入口点。
// 3.4.cpp: 显示时间单位转换

#include "stdafx.h"
#include <iostream>

int main()
{
    using namespace std;
    cout << "Enter the number of seconds:________\b\b\b\b\b\b\b\b";
    long sec;
    cin >> sec;
    const int Min_per_sec = 60;
    const int H_per_min = 60;
    const int D_per_h = 24;
    int s, d, h, min;
    s = sec % Min_per_sec;
    int convert;
    convert = sec / Min_per_sec;
    min = convert % H_per_min;
    convert = convert / H_per_min;
    h = convert % D_per_h;
    d = convert / D_per_h;
    cout << sec << " seconds = " << d << " days, " << h << " hours, " << min << " minutes, " << s << " seconds" << endl;
    system("pause");
    return 0;
}

这里在转换分钟、小时和天的时候,我使用了同一个convert来表示中间过程,由于C++代码是顺序执行,使用完convert里的旧值之后给其赋新值,然后又使用新值,这样是完全可以的。

代码运行结果如下:


不知道为什么,我的书上写的是365days,但是实际就应该是36days,这个程序运行结果是完全正确的!


5.  编写一个程序,要求用户输入全球当前的人口和美国当前的人口(或其他国家的人口)。将这些信息存储在long long变量中,并让程序显示美国(或其他国家)的人口占全球人口的百分比。该程序的输出应与下面类似:

Enter the world's population: 6898758899

Enter the population of the US: 310783781

The population of the US is 4.50492% of the world population.

本题是要求用户输入两个人口数目值,使用long long 类型的变量来存储,然后计算这两个数值之间的比值,使用百分比的方式显示出来。

代码如下:

// 3.5.cpp: 定义控制台应用程序的入口点。
// 3.6.cpp: 人口比例计算

#include "stdafx.h"
#include <iostream>

int main()
{
    using namespace std;

    cout << "Enter the world's population:__________\b\b\b\b\b\b\b\b\b\b";
    long long wp;
    cin >> wp;
    cout << "Enter the population of the US:__________\b\b\b\b\b\b\b\b\b\b";
    long long usp;
    cin >> usp;
    float rate;
    rate = float(usp) / float(wp) * 100;
    cout << "The population of the US is " << rate << "% of the world population." << endl;
    system("pause");

    return 0;
}

在这里我依然是使用了强制类型转换来解决不同类型的数值之间的计算问题,而且在计算rate时,由于C++语句是从右往左执行的,而\和*是同级运算,所以会先计算wp*100,在计算除法,所以这就是将rate表示为百分比的方式。

代码运行结果如下:



6. 编写一个程序,要求用户输入驱车里程(英里)和使用汽油量(加仑),然后指出汽车耗油量为一加仑的里程。如果愿意,也可以让程序要求用户以公里为单位输入距离,并以升为单位输入汽油量,然后指出欧洲风格的结果——即每100公里的耗油量(升)。

本题要求用户输入里程和汽油量两个值,然后求出二者的比值来获得耗油量为一加仑的里程,或者是获得100公里的耗油量。这两种计算方式无非就是不同的数做除数和被除数,思路都是一样的。在这里我就只做了前面的一种计算,后面的那一种表示方式完全与前者类似。

代码如下:

// 3.5.cpp: 定义控制台应用程序的入口点。
// 3.6.cpp: 人口比例计算

#include "stdafx.h"
#include <iostream>

int main()
{
    using namespace std;

    cout << "Enter the world's population:__________\b\b\b\b\b\b\b\b\b\b";
    long long wp;
    cin >> wp;
    cout << "Enter the population of the US:__________\b\b\b\b\b\b\b\b\b\b";
    long long usp;
    cin >> usp;
    float rate;
    rate = float(usp) / float(wp) * 100;
    cout << "The population of the US is " << rate << "% of the world population." << endl;
    system("pause");

    return 0;
}

代码运行结果如下:



7. 编写一个程序,要求用户按欧洲风格输入汽车的耗油量(每100公里消耗的汽油量(升)),然后将其转换为美国风格的耗油量——每加仑多少英里。注意,除了使用不同的单位计量外,美国方法(距离/燃料)与欧洲方法(燃料/距离)相反。100公里等于62.14英里,1加仑等于3.875升。因此,19mpg大约合12.41/100km,127mpg大约合8.71/100km。

本题要求用户将输入的数值从欧洲风格转换为美国风格,既然输入的是欧洲风格,设输入为x,也就是说100公里耗油x升,那么我们就以此为基础进行计算,首先转换为英里,也就是62.14英里耗油x升,也就是62.14英里耗油(x/3.875)加仑,所以y=62.14/[(x/3.875)]即为每加仑多少英里了。

代码如下:

// 3.7.cpp: 定义控制台应用程序的入口点。
// 3.7.cpp: 单位换算及数值计算

#include "stdafx.h"
#include <iostream>

int main()
{
    using namespace std;

    cout << "Enter your kilometers:";
    float kilometer;
    cin >> kilometer;
    cout << "Enetr your litros:";
    float litro;
    cin >> litro;
    float eux;
    eux = litro / (kilometer / 100);
    cout << "Every 100 kilometers cost " << eux << " litros gas in Europe." << endl;
    const float Mile_per_100kilometers = 62.14;
    float mile;
    mile = (kilometer / 100) * Mile_per_100kilometers;
    const float Calon_per_litro = 3.875;
    float calon;
    calon = litro / Calon_per_litro;
    float usx;
    usx = mile / calon;
    cout << "That means you drive " << usx << " miles  using 1 calon gas in the US." << endl;
    cout << eux << "/100km = " << usx << "mpg" << endl;
    system("pause");

    return 0;
}

代码运行结果如下:



从该结果图可以验证,确实是大概19mpg合12.41/100km。但是却应该是27mpg大约合8.71/100km,书上却写的是127mpg大约合8.71/100km!

Tip:以后遇到运行结果与书上不同的地方我都会用红色加粗的字体表示,以提醒大家注意;这一章的这两个地方自我感觉应该是书上写的有误,今后再遇到不知道是否还能如此笃定,到时候如果我也confuse了就欢迎大家一起来讨论交流~

猜你喜欢

转载自blog.csdn.net/leowinbow/article/details/79745222