C primer plus (第六版)第十二章 编程练习第2题

题目:

题目2.在美国,通常以英⾥/加仑来计算油耗;在欧洲,以升/100公⾥来计算。下⾯

是程序的⼀部分,提⽰⽤⼾选择计算模式(美制或公制),然后接收数据并计算油耗。

cpp 复制代码
//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("%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("%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 liters 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 miles 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 miles 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()函数根据设置的模式计算并显⽰油耗。可以假设⽤⼾输⼊的

都是数值数据。

思路:

  • 查看pe12-2b.c 程序文件和题目要求可以知道,需要在pe12-2a.c文件中创建3个函数:

    set_mode(mode);

    get_info();

    show_info();

  • 同时需要注意在pe12-2a.h文件中声明这3个函数;

  • 同时需要注意在pe12-2a.c中编写函数的时候可以创建3个内部链接静态变量,只供这3个函数调用,其中mode的值也是这样,便于在get_info()函数和show_info()函数中用mode值做选择判断;

cpp 复制代码
//pe12-2a.c的程序代码
#include <stdio.h>
static int mode_code;   //内部链接的静态变量
static float distance;  //内部链接的静态变量
static float fuel_consume;  //内部链接的静态变量

void set_mode(int mode)
{
    mode_code = mode;
}

void get_info()
{
    if (mode_code == 0)
    {
        puts("Enter distance traveled in kilometers:");
        while (scanf("%d", &distance) == 1 && distance > 0)
        {
            puts("Enter fuel consumed in liters:");
            if (scanf("%d", &fuel_consume) == 1 && fuel_consume > 0);  
            return ;    //无返回值函数提前结束
        }
    }

    if (mode_code == 1)
    {
        puts("Enter distance traveled in miles:");
        while (scanf("%d", &distance) == 1 && distance > 0)
        {
            puts("Enter fuel consumed in gallons:");
            if (scanf("%d", &fuel_consume) == 1 && fuel_consume > 0);
            return ;    //无返回值函数提前结束
        }
    }    
}

int show_info()
{
    if (mode_code == 0)
    {
        printf("Fuel consumption is %.2f liters per 100 km.\n",fuel_consume/distance);
    }
    if (mode_code == 1)
    {
        printf("Fuel consumption is %.2f miles per gallon.\n",distance/fuel_consume);
    }    
}
cpp 复制代码
//pe12-2a.h的程序代码
void set_mode(int mode);
void get_info(void);
void show_info(void);

在powershell中编译测试:

相关推荐
LuminousCPP21 分钟前
栈和队列专题(四):LeetCode 232. 用栈实现队列|双栈分工 + 按需迁移 + 摊还 O(1)
c语言·数据结构·笔记·算法·leetcode
流浪0011 小时前
C/C++ 后端筑基系列(一):C语言 —— 从基础到进阶系统指南
c语言
caimouse12 小时前
ReactOS 图形系统分析(51):元文件子系统 — metafile.c
c语言·开发语言
Canmag 兴隆磁性16 小时前
C 系列充磁机
c语言·开发语言·学习·永磁材料·充磁·退磁
_Narcissus_17 小时前
排序算法总结表格
c语言·数据结构·c++·笔记·算法·排序算法·总结
小雪崩18 小时前
嵌入式学习 day27:标准IO
linux·c语言·学习
xx~t19 小时前
嵌入式——Linux软件编程2
linux·运维·服务器·c语言·学习方法
luj_17681 天前
变频技术核心原理揭秘
服务器·c语言·开发语言·经验分享·算法
_Narcissus_1 天前
B树概念及操作笔记(含完整代码实现)
c语言·数据结构·数据库·c++·笔记·b树·算法
松小白song1 天前
嵌入式通信协议全解:UART、RS232、RS485、I²C、SPI 与 CAN 的本质区别与选型指南
c语言·开发语言