C Primer Plus 第6版 第12章 练习答案

我的博客主要记录一下自己的学习代码过程。
大家可以在自己电脑上运行看看。
编译器为VS2019
官方答案有的直接附上代码。
12.1

/* global.c  -- uses an external variable */
#include <stdio.h>
//int units = 0;         /* an external variable      */
void critic(int *n);
int main(void)
{
    int units = 0;  /* an optional redeclaration */

    printf("How many pounds to a firkin of butter?\n");
    scanf_s("%d", &units);
    while (units != 56)
        critic(&units);
    printf("You must have looked it up!\n");
    return 0;
}
void critic(int *n)
{
    /* optional redeclaration omitted */
    printf("No luck, my friend. Try again.\n");
    scanf_s("%d", n);
}

运行结果:
在这里插入图片描述
12.2
主要代码如下

void set_mode(int);
void get_info(void);
void show_info(void);

static int mode;
static double distance;
static double fuel;

void set_mode(int m)
{
    if (m == 0 || m == 1)
        mode = m;
    else
        printf("Invalid mode specified. Mode %s used.\n", mode ? "1(US)" : "0(metric)");
}
void get_info(void)
{
    if (mode == 0)
    {
        puts("Enter distance traveled in kilometers: ");
        scanf_s("%lf", &distance);
        getchar();//消除回车键
        puts("Enter fuel comsumed in liters: ");
        scanf_s("%lf", &fuel);
        getchar();
    }
    else if (mode == 1)
    {
        puts("Enter distance traveled in miles: ");
        scanf_s("%lf", &distance);
        getchar();
        puts("Enter fuel comsumed in gallons: ");
        scanf_s("%lf", &fuel);
        getchar();
    }
}
void show_info(void)
{
    if (mode == 0)
    {
        printf("Fuel comsumption is %.2lf liters per 100 km\n", (100 * fuel / distance)));
    }
    else if (mode == 1)
    {
        printf("Fuel comsuption is %.2lf miles per gallon.\n", distance / fuel);
    }

}

运行结果:
在这里插入图片描述
12.3
附上官方答案。

//pe12-3a.h
#define METRIC 0
#define US 1
#define USE_RECENT 2
void check_mode(int* pm);
void get_info(int mode, double* pd, double* pf);
void show_info(int mode, double distance, double fuel);
// pe12-3a.c
// compile with pe12-3b.c
#include <stdio.h>
#include "pe12-3a.h"
void check_mode(int* pm)
{
	if (*pm != METRIC && *pm != US)
	{
		printf("Invalid mode specified. Mode %d\n", *pm);
		printf("Previous mode will be used.\n");
		*pm = USE_RECENT;
	}
}
void get_info(int mode, double* pd, double* pf)
{
	if (mode == METRIC)
		printf("Enter distance traveled in kilometers: ");
	else
		printf("Enter distance traveled in miles: ");
	scanf("%lf", pd);
	if (mode == METRIC)
		printf("Enter fuel consumed in liters: ");
	else
		printf("Enter fuel consumed in gallons: ");
	scanf("%lf", pf);
}
void show_info(int mode, double distance, double fuel)
{
	printf("Fuel consumption is ");
	if (mode == METRIC)
		printf("%.2f liters per 100 km.\n", 100 * fuel / distance);
	else
		printf("%.1f miles per gallon.\n", distance / fuel);
}
// pe12-3b.c
// compile with pe12-3a.c
#include <stdio.h>
#include "pe12-3a.h"
int main(void)
{
	int mode;
	int prev_mode = METRIC;
	double distance, fuel;

	printf("Enter 0 for metric mode, 1 for US mode: ");
	scanf("%d", &mode);
	while (mode >= 0)
	{
		check_mode(&mode);
		if (mode == USE_RECENT)
			mode = prev_mode;
		prev_mode = mode;
		get_info(mode, &distance, &fuel);
		show_info(mode, distance, fuel);
		printf("Enter 0 for metric mode, 1 for US mode");
		printf(" (-1 to quit): ");
		scanf("%d", &mode);
	}
	printf("Done.\n");
	return 0;
}

12.4


#include <stdio.h>
#include<ctype.h>
void report_count(int n);


int main(void)
{
    int value,i;   
    puts("Enter a integer (q to quit): ");
    while (scanf_s("%d", &value) == 1)
    {
        int count = 1;
        if (value == 'q')
            goto quit;
        else if (isalpha(value) || isspace(value))
        {
            puts("请重新输入:");
            continue;
        } 
        for (i = value; i > 0; i--)
        {
            report_count(count);
            ++count;
        }
        puts("Enter a integer (q to quit): ");
    }
quit:puts("结束.");
    return 0;
}

void report_count(int n)
{
    printf("Loop executed %d times\n", n);
}

运行结果:
在这里插入图片描述
12.5
主要考察点 :p390页的rand函数。附上官方答案

#include <stdio.h>
#include <stdlib.h>
void print(const int array[], int limit);
void sort(int array[], int limit);
#define SIZE 100
int main(void)
{
	int i;
	int arr[SIZE];

	for (i = 0; i < SIZE; i++)
		arr[i] = rand() % 10 + 1; 
	puts("initial array");
	print(arr, SIZE);
	sort(arr, SIZE);
	puts("\nsorted array");
	print(arr, SIZE);

	return 0;
}
/* sort.c -- sorts an integer array in decreasing order */
void sort(int array[], int limit)
{
	int top, search, temp;
	for (top = 0; top < limit - 1; top++)
		for (search = top + 1; search < limit; search++)
			if (array[search] > array[top])
			{
				temp = array[search];
				array[search] = array[top];
				array[top] = temp;
			}
}
/* print.c -- prints an array */
void print(const int array[], int limit)
{
	int index;
	for (index = 0; index < limit; index++)
	{
		printf("%2d ", array[index]);
		if (index % 10 == 9) //换行
			putchar('\n');
	}
	if (index % 10 != 0) // if last line not complete
		putchar('\n');
}

运行结果:
在这里插入图片描述
12.6
思想和书上的掷骰子程序一样,利用time()函数返回系统时间,自动重置种子。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    long int ar[10] = { 0 }, i, number;//数组用来存各个数字的次数
    srand((unsigned int)time(0));
    for ( i = 0; i < 1000; i++)
    {
        number = (rand() % 10 + 1);
        ar[number - 1]++;
    }
    for (i = 0; i < 10; i++)
    {
        printf("数字%d出现的次数为:%ld\n\n", i + 1, ar[i]);
    }
    return 0;

}

运行结果:
在这里插入图片描述
第二次:
在这里插入图片描述
12.7
官方代码

/* pe12-7.c */
#include <stdio.h>
#include <stdlib.h> /* for srand() */
#include <time.h> /* for time() */
int rollem(int);
int main(void)
{
	int dice, count, roll;
	int sides;
	int set, sets;
	srand((unsigned int)time(0)); /* randomize rand() */
	printf("Enter the number of sets; enter q to stop: ");
	while (scanf_s("%d", &sets) == 1)
	{
		printf("How many sides and how many dice? ");
		if (scanf_s("%d %d", &sides, &dice) != 2)
		{
			puts("not integers -- terminating input loop.");
			break;
		}
		printf("Here are %d sets of %d %d-sided throws.\n", sets, dice, sides);
		for (set = 0; set < sets; set++)
		{
			for (roll = 0, count = 0; count < dice; count++)
				roll += rollem(sides);
			/* running total of dice pips */
			printf("%4d ", roll);
			if (set % 15 == 14)
				putchar('\n');
		}
		if (set % 15 != 0)
			putchar('\n');
		printf("How many sets? Enter q to stop: ");
	}
	puts("GOOD FORTUNE TO YOU!\n");
	return 0;
}
int rollem(int sides)
{
	int roll;
	roll = rand() % sides + 1;
	return roll;
}

运行结果:
在这里插入图片描述
12.8


#include <stdio.h>
#include <stdlib.h>

int* make_array(int, int);
void show_array(const int ar[], int);
int main(void)
{
    int* pa;
    int size;
    int value;

    printf("Enter the number of elements: ");
    while (scanf_s("%d", &size) == 1 && size > 0)
    {
        printf("Enter the initialization value: ");
        scanf_s("%d", &value);
        pa = make_array(size, value);
        if (pa)
        {
            show_array(pa, size);
            free(pa);
        }
        printf("Enter the number of elements (<1 to quit): ");
    }
    printf("Done.\n");
    return 0;
}

int* make_array(int elem, int val)
{
    int* ptr,i;
    ptr = (int*)malloc(sizeof(int) * elem);
    for (i = 0; i < elem; i++)
        ptr[i] = val;
    return ptr;
}

void show_array(const int ar[], int n)
{
    puts("输入的数组数和值如下:");
    for (int i = 0; i < n; i++)
    {
        if (i % 8 == 0 && i != 0)
            puts("");
        printf("%-3d", ar[i]);
    }
    puts("");
}

运行结果:
在这里插入图片描述
12.9
这道题没写出来,对于动态内存理解不够。
CSDN上一位同学不跑步就等吧写的,很详细了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值