《C Primer Plus》第六版 第十二章第二题 编程练习

好的,既然上次已经发了博客,那就不算萌新了.......

编译环境:VS 2017 (Community)

运行环境: Win 10 × 64

题目

/*	12-2 ---在美国,通常以英里/加仑来计算油耗;在欧洲,以升/100 公里来计算。
	下面是程序的一部分,提示用户选择计算模式(美制或英制),然后接收数据并计算油耗。
        
*/
//pe12-2b.c
//与 pe12-2a.c 一起编译
#include <stdio.h>
#include "pe12-2a.h"

int main(void)
{
	int mode;

	printf("Enter 0 for metric mode, 1 for US mode: ");
	scanf_s("%d", &mode);
	while (mode >= 0)
	{
		set_mode(mode);
		get_info();
		show_info();
		printf("Enter 0 for metric mode, 1 for US mode");
		printf(" (-1 to quit): ");
		scanf_s("%d", &mode);
	}
	printf("Done.\n");
	return 0;
}

下面是一些输出示例:

Enter 0 for metric mode, 1 for US mode: 0
Enter distance traveled in kilometers: 600
Enter fuel consumed in liters: 78.8
Fuel consumption is 13.13 lirers per 100 km.
Enter 0 for metric mode, 1 for US mode (-1 to quit): 1
Enter distance traveled in miles: 434
Enter fuel consumed in gallons: 12.7
Fuel consumption is 34.2 lirers per gallon.
Enter 0 for metric mode, 1 for US mode (-1 to quit): 3
Invalid mode specified. Mode 1(US) used.
Enter distance traveled in miles: 388
Enter fuel consumed in gallons: 15.3
Fuel consumption is 25.4 lirers per gallon.
Enter 0 for metric mode, 1 for US mode (-1 to quit): -1

Done.

如果用户输入了不正确的模式,程序向用户给出提示消息并使用上一次输入正确的模式。

请提供pe12-2a.h头文件和pe12-2a.c源文件。源代码文件应定义3个具有文件作用域,内部链接的

变量。一个表示模式,一个表示距离,一个表示消耗的燃料。get_info()函数根据用户输入的模

式提示用户输入相应数据,并将其储存到文件作用于变量中。show_info()函数根据设置的模式

计算并显示油耗。可以假设用户输入的都是数值数据。

以上,题目结束!

根据题目做出的3个变量:

  • distance                         汽车行驶的距离
  • double consumption      消耗的燃料
  • int mode                        用户设置的模式

以及3个函数:

  1. void set_mode(int number);                //获取用户输入的模式
  2. void get_info(void);                             //根据用户输入的模式提示用户输入数据
  3. void show_info(void);                          //根据设置的模式计算并显示油耗

以及1个附加的(我附加的):

    4. double WrongJudge(double number);//处理非法输入,后期强制int类型转换

下面是分文件给出代码:

pe12-2a.h:

#pragma once

//函数原型
void set_mode(int number);			//获取用户输入的模式
void get_info(void);				//根据用户输入的模式提示用户输入数据
void show_info(void);			        //根据设置的模式计算并显示油耗
double WrongJudge(double number);		//处理非法输入,后期强制int类型转换

pe12-2a.c:

//pe12-2a
//与 pe12-2b 一起编译

#include <stdio.h>
#include "pe12-2a.h"

int distance;					//汽车行驶的距离
double consumption;				//消耗的燃料
int mode;					//用户设置的模式

//获取用户输入的模式
void set_mode(int number)
{		
	if (number >= 0 && number <= 1)
	{
		mode = number;
	}
	else if (mode == 0)			//按照先前的选项进行运算
	{
		printf("Invalid mode specified. Mode 0(USA) used.\n");
	}
	else if (mode == 1)
	{
		printf("Invalid mode specified. Mode 1(US) used.\n");
	}
}

//根据用户输入的模式提示用户输入数据
void get_info(void)
{
	if (mode == 0)	
	{
		//提示美制的输入  获取行程(千米)
		printf("Enter distance traveled in kilometers: ");
		distance = (int)WrongJudge((double) distance);

		//提示消耗的燃料输入
		printf("Enter fuel consumed in liters: ");
		consumption = WrongJudge(consumption);

	}
	else if (mode == 1)
	{
		//提示英制的输入  获取行程(英里)
		printf("Enter distance traveled in miles: ");
		distance = (int)WrongJudge((double)distance);

		//提示消耗的燃料输入
		printf("Enter fuel consumed in gallons: ");
		consumption = WrongJudge(consumption);
	}
}

//根据设置的模式计算并显示油耗
void show_info(void)
{
	if (mode == 0)
	{
		printf("Fuel consumption is %.2f lirers per 100 km.\n",
			100 * (consumption / distance));
	}
	else if (mode == 1)
	{
		printf("Fuel consumption is %.1f lirers per gallon.\n",
			(distance / consumption));
	}
}

//处理非法输入,后期强制int类型转换
double WrongJudge(double number)
{
	while (scanf_s("%lf", &number) != 1)    //处理非法输入
	{
		printf("That's not a value number, try again: ");
		continue;
	}
	return number;
}

pe12-2b.c:

//pe12-2b.c
//与 pe12-2a.c 一起编译
#include <stdio.h>
#include "pe12-2a.h"

int main(void)
{
	int mode;

	printf("Enter 0 for metric mode, 1 for US mode: ");
	scanf_s("%d", &mode);
	while (mode >= 0)
	{
		set_mode(mode);
		get_info();
		show_info();
		printf("Enter 0 for metric mode, 1 for US mode");
		printf(" (-1 to quit): ");
		scanf_s("%d", &mode);
	}
	printf("Done.\n");
	return 0;
}

好了,让我们来看看实际的效果:

看吧,和题目上的一模一样,非常好! 

源代码我都已经发出来了,以上

Alex Mercer (boy) 鸣谢!

猜你喜欢

转载自blog.csdn.net/Alex_mercer_boy/article/details/81482746
今日推荐