有问题欢迎留言讨论~如果要书pdf可以在评论里留下邮箱
IDE: Xcode
12-1
#include <stdio.h>
void critic(int *unit_p); //不使用全局变量,就通过指针将参数带下来
int main(void)
{
int units;
printf("How many pounds to a firkin of butter?\n");
scanf("%d", &units);
while(units != 56)
critic(&units);
printf("You must have looked it up!\n");
return 0;
}
void critic(int *unit_p)
{
printf("No luck, my friend. Try again.\n");
scanf("%d", unit_p);
}
Output:
12-2
//pe12-2a.c
#include <stdio.h>
int gb_mode = 0;
int gb_distance = 0;
double gb_fuel = 0;
void set_mode(int mode)
{
if(mode == 0 || mode == 1) //只有mode的输入是有效值,才会对应的更新global变量
gb_mode = mode;
else{
if(gb_mode)
printf("Invaild mode specified. Mode 1(US) used.\n");
else
printf("Invaild mode specified. Mode 0(metric) used.\n");
}
}
void get_info(void)
{
if(gb_mode){
//US mode
printf("Enter distance traveled in miles: ");
scanf("%d", &gb_distance);
printf("Enter fuel consumed in gallons: ");
scanf("%lf", &gb_fuel);
}else{
//metric mode
printf("Enter distance traveled in kilometers: ");
scanf("%d", &gb_distance);
printf("Enter fuel consumed in liters: ");
scanf("%lf", &gb_fuel);
}
}
void show_info(void)
{
double consumption;
if(gb_mode){
//US mode
consumption = gb_distance / gb_fuel;
printf("Fuel consumption is %.1f miles per gallon.\n", consumption);
}else{
//metric mode
consumption = gb_fuel / gb_distance * 100;
printf("Fuel consumption is %.2f liters per 100 km.\n", consumption);
}
}
//pe12-2a.h
extern int gb_mode;
extern int gb_distance;
extern double gb_fuel;
extern void set_mode(int mode);
extern void get_info(void);
extern void show_info(void);
//pe12-2b.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;
}
Output:
12-3
// pe12-2b.c
#include <stdio.h>
#include "pe12-2a.h"
int main(void)
{
int mode = 0,last_mode = 0;
printf("12-3 / Enter 0 for metric mode, 1 for US mode: ");
scanf("%d", &mode);
while(mode >= 0)
{
mode = set_mode(mode, last_mode); //因为不能有全局变量,所以在set mode后需要把mode值作为return值带出来
last_mode = mode;//因为不能有全局变量,所以在main中新建一个变量last_mode记录上次使用的mode
get_info(mode);//因为不能有全局变量,所以mode作为参数带下去
printf("Enter 0 for metric mode, 1 for US mode: ");
printf(" (-1 to quit): ");