我的博客主要记录一下自己的学习代码过程。
大家可以在自己电脑上运行看看。
编译器为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上一位同学不跑步就等吧写的,很详细了