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中编译测试:

相关推荐
skywalk81631 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
额鹅恶饿呃4 小时前
C语言中的数据结构和变量
c语言·数据结构·算法
捷瑞电子工坊8 小时前
C语言条件操作符(? :)——三分钟上手
c语言·条件操作符·编程基础·三目运算符
A.零点8 小时前
期末复习,408考研数据结构:第一章绪论完整知识梳理与真题深度解读
c语言·数据结构·笔记·考研
xu_wenming11 小时前
Zephyr上开发 BLE(低功耗蓝牙)入门应用
c语言·嵌入式硬件·物联网
三十岁老牛再出发11 小时前
07.08.&07.09.每日总结
c语言·python
byte轻骑兵13 小时前
【AVRCP】规范精讲[41]:AV/C指令帧解析,蓝牙遥控交互的底层语言
c语言·开发语言·人机交互·智能制造·avrcp
FREEDOM_X13 小时前
Linux 进程间通讯(IPC)——总结
linux·c语言·前端·嵌入式硬件·struts
gugucoding14 小时前
39. 【C语言】经典 C 项目实战:迷你 HTTP 服务器
c语言·开发语言·http
山登绝顶我为峰 3(^v^)31 天前
C/C++ 交叉编译方法
java·c语言·c++