C primer plus 第五版十二章习题

看完C prime plus(第五版)第十二章,随带完成了后面的习题。

1.不使用全局变量,重写程序清单12.4的程序。

先贴出12.4的程序,方便对照;

 1 /* global.c  --- 使用外部变量  */
 2 #include <stdio.h>
 3 int units = 0;            //一个外部变量
 4 void critic(void);
 5 int main(void)
 6 {
 7     extern int units;
 8
 9     printf ("How many pounds to a firkin of butter?\n");
10     scanf("%d", &units);
11     while(units != 56)
12         critic();
13
14     printf("You must have looked it up!\n");
15     return 0;
16 }
17
18 void critic(void){
19     printf("No luck, chummy, Try again in.\n");
20     scanf("%d", &units);
21 }

first-text

以下是我的答案:

 1 #include "stdio.h"
 2
 3 void critic(void);
 4
 5 int main(void){
 6     int num;
 7     printf("How many pounds to a firkin of butter?\n");
 8     while(scanf("%d", &num) == 1 && num != 56){
 9         critic();
10     }
11
12     printf("You must have looked it up!\n");
13
14     return 0;
15 }
16
17 void critic(void){
18     puts("Not lucky, Try again!");
19 }

first-case

2.在美国通常以英里每加仑来计算油耗,在欧洲是以升每百公里来计算。下面是某程序的一部分,该程序让用户选择一个模式(公制的或美制的),然后收集数据来计算油耗。

 1 #include "stdio.h"
 2
 3 void set_mode(int get);            //设置模式
 4 void get_info(void);                //获取行驶公里、消耗油量,计算
 5 void show_info(void);               //展示计算结果
 6
 7 static int mode;
 8 static double loss = 0.0,
 9               distance = 0.0;
10
11 void set_mode(int get){
12     switch(get){
13         case 0:
14             mode = 0;
15             break;
16         case 1:
17         default:
18             mode = 1;
19             break;
20     }
21 }
22
23 void get_info(void){
24     extern double loss, distance;
25     switch(mode){
26         case 0:
27             puts("输入你所形式的公里数:");
28             scanf("%lf", &distance);
29             puts("损耗的油(单位:加仑):");
30             scanf("%lf", &loss);
31             break;
32         case 1:
33             puts("输入你所形式的英里数:");
34             scanf("%lf", &distance);
35             puts("损耗的油(单位:加仑):");
36             scanf("%lf", &loss);
37             break;
38         default:
39             puts("你选择的模式不正确!默认使用英里模式!");
40             puts("输入你所形式的英里数:");
41             scanf("%lf", &distance);
42             puts("损耗的油(单位:加仑):");
43             scanf("%lf", &loss);
44             break;
45     }
46 }
47
48 void show_info(void){
49     switch(mode){
50         case 0:
51             printf("平均每公里损耗%0.2lf加仑油!\n", distance / loss);
52             break;
53         case 1:
54         default:
55             printf("平均每英里损耗%0.2lf加仑油!\n", distance / loss);
56             break;
57     }
58 }

second-case-pe12-2a.h

 1 #include "stdio.h"
 2 #include "pe12-2a.h"            //函数要求写在pe12-2a.h中
 3
 4 int main(void){
 5     int mode;
 6     printf("Enter 0 for metric mode, 1 for US mode:");
 7     scanf("%d", &mode);
 8     while(mode >= 0){
 9         set_mode(mode);
10         get_info();
11         show_info();
12         printf("Enter 0 for metric mode, 1 for US mode.");
13         printf("(-1 to quit)");
14         scnaf("%d", &mode);
15     }
16     printf("Done \n");
17
18     return 0;
19 }    

second-case-pe12--2.c

3.重新设计习题2中的程序,使它仅使用自动变量。(使用不同的函数)

 1 //pe12-3a.h
 2 #include "stdio.h"
 3 #define MET 0
 4 #define US 1
 5
 6 void set_mode(int *);                                                       //获取用户输入的信息,设置模式
 7 void get_info(const int mode, double *distance, double *loss);              //获取用户的信息
 8 void show_info(const int mode, const double distance, const double loss);   //计算平均油耗,输出结果
 9
10 void set_mode(int *get){
11     if((*get != US) && (*get > US)){
12         *get = US;
13     }
14 }
15
16 void get_info(const int mode, double *distance, double *loss){
17     switch(mode){
18         case 0:
19             puts("输入你所形式的公里数:");
20             scanf("%lf", distance);
21             puts("损耗的油(单位:加仑):");
22             scanf("%lf", loss);
23             break;
24         case 1:
25             puts("输入你所形式的英里数:");
26             scanf("%lf", distance);
27             puts("损耗的油(单位:加仑):");
28             scanf("%lf", loss);
29             break;
30         default:
31             puts("你选择的模式不正确!默认使用英里模式!");
32             puts("输入你所形式的英里数:");
33             scanf("%lf", distance);
34             puts("损耗的油(单位:加仑):");
35             scanf("%lf", loss);
36             break;
37     }
38 }
39
40 void show_info(const int mode, const double distance, const double loss){
41      switch(mode){
42         case 0:
43             printf("平均每公里损耗%0.2lf加仑油!\n", distance / loss);
44             break;
45         case 1:
46         default:
47             printf("平均每英里损耗%0.2lf加仑油!\n", distance / loss);
48             break;
49     }
50 }

third-case-pe12-3a.h

 1 //12-3b.c
 2 #include "stdio.h"
 3 #include "12-3a.h"
 4
 5 int main(){
 6     int mode;
 7     double distance = 0.0,
 8            loss = 0.0;
 9     printf("输入0选择公尺单位,输入1选择英尺单位");
10     scanf("%d", &mode);
11     while(mode >= 0){
12         set_mode(&mode);
13         get_info(mode, &distance, &loss);
14         show_info(mode, distance, loss);
15         printf("输入0选择公尺单位,输入1选择英尺单位");
16         scanf("%d", &mode);
17     }
18
19     puts("Done");
20     return 0;
21 }

third-case-pe12-3b.c

4.编写一个函数,返回函数自身被调用的次数;

 1 #include "stdio.h"
 2
 3 int test_call(void);
 4
 5 int main(void){
 6     int temp, num;
 7     while(scanf("%d", &temp) == 1){
 8         for(; temp > 0; temp--){
 9             num = test_call();
10         }
11         printf("这次一共调用了%d次函数\n", num);
12         printf("输入调用次数:");
13     }
14
15     return 0;
16 }
17
18 int test_call(void){
19     static int num = 0;
20     return ++num;
21 }

fourth-case-pe12-4a.c

5.编写产生100个1到10范围内的随机数的程序,并且以降序排序;

 1 #include "stdio.h"
 2 #include "stdlib.h"
 3 #define LEN 100
 4
 5 void set_num(int *);            //产生随机数
 6 void show_num(int *);            //排序后输出
 7
 8 int main(void){
 9     int arr[LEN],
10         temp = 0;
11
12     set_num(arr);
13     show_num(arr);
14
15     return 0;
16 }
17
18 void set_num(int *arr){
19     int temp = 0;
20     for(; temp < LEN; temp++){
21         arr[temp] = rand() % 10 + 1;    //rand() % 10 产生一个个位数,为了避免是0,所以加1.
22     }
23 }
24
25 void show_num(int *arr){
26     int temp = 0,
27         loop1 = 0,            //用于循环而创建的变量
28         loop2 = 0;
29
30     //进行排序
31     for(; loop1 < LEN; loop1++){
32         for(loop2 = loop1; loop2 < LEN; loop2++){
33             if(arr[loop1] < arr[loop2]){                //注意降序排列
34                 temp = arr[loop1];
35                 arr[loop1] = arr[loop2];
36                 arr[loop2] = temp;
37             }
38         }
39     }
40
41
42     for(temp = 0; temp < LEN; temp++){
43         printf("%3d", arr[temp]);
44         if((temp + 1) % 10 == 0)
45             putchar(‘\n‘);
46     }
47 }

fifth-case-12pe-5a.c

6.编写一个程序,产生1000个范围在1到10的数字,不必存储他们,只需要计算每个数出现的次数;

 1 #include "stdio.h"
 2 #include "stdlib.h"
 3 #define LEN 1000
 4
 5 static number[10];
 6 //计算数字出现的次数
 7 void get_thousand(int );
 8 //输出每个数字出现的次数
 9 void show_thousand(void);
10
11 int main(void){
12     int temp = 0,
13         arr[LEN];
14     for(; temp < LEN; temp++){
15         //生成一个随机数
16         get_thousand(arr[temp] = rand() % 10 + 1);
17     }
18
19     show_thousand();
20
21     return 0;
22 }
23
24 void get_thousand(int num){
25     static temp = 0;
26     switch(num){
27         case 1:
28             number[--num]++;
29             break;
30         case 2:
31             number[--num]++;
32             break;
33         case 3:
34             number[--num]++;
35             break;
36         case 4:
37             number[--num]++;
38             break;
39         case 5:
40             number[--num]++;
41             break;
42         case 6:
43             number[--num]++;
44             break;
45         case 7:
46             number[--num]++;
47             break;
48         case 8:
49             number[--num]++;
50             break;
51         case 9:
52             number[--num]++;
53             break;
54         case 10:
55             number[--num]++;
56             break;
57         default:
58             puts("产生了一个不在1-10范围内的数字!");
59             break;
60     }
61     ++temp;
62 }
63
64 void show_thousand(void){
65     int temp = 0,
66         sum = 0;
67     for(; temp < 10; temp++){
68         printf("%d出现了%d次!\n", temp + 1, number[temp]);
69         sum += number[temp];
70     }
71     printf("一共产生了%d个数!\n", sum);
72 }

sixth-case-pe12-6a.c

7.编程程序,与程序清单12.13的输出之后所讨论的修改版程序具有相同的表现;

//这题空缺

8.给出函数make_array(),show_array().其中ma接受两个参数,第一个是int数组的元素个数,第二个是赋给每个元素的值。函数使用malloc()创建一个适当大小得数组,将每个元素设定为指定的值并且返回一个指针,函数sh以8个数一行的格式显示数组内容;

 1 #include "stdio.h"
 2 #include "stdlib.h"
 3
 4
 5 int * make_array(int elem, int val);
 6 void show_array(const int ar[], int n);
 7
 8 int main(void){
 9     int *pa,
10         size,
11         value;
12
13     printf("输入数字:");
14     scanf("%d", &size);
15
16     while(size > 0){
17         printf("输入初始值:");
18         scanf("%d", &value);
19         pa = make_array(size, value);
20         if(pa){
21             show_array(pa, size);
22             free(pa);
23         }
24         printf("输入数字:");
25         scanf("%d", &size);
26     }
27
28     puts("Done");
29     return 0;
30 }
31
32 int * make_array(int elem, int val){
33     int *ptr = (int *) malloc(elem * sizeof(int)),
34         temp;
35     for(temp = 0; temp < elem; temp++)
36         ptr[temp] = val;
37
38     return ptr;
39 }
40
41 void show_array(const int ar[], int n){
42     int temp = 0;
43     for(; temp < n; temp++){
44         printf("%5d", ar[temp]);
45         if((temp + 1) % 8 == 0)
46             putchar(‘\n‘);
47     }
48     if(n % 8 != 0)
49         putchar(‘\n‘);
50 }

eighth-case-pe12-8a.c

时间: 2024-12-18 04:18:46

C primer plus 第五版十二章习题的相关文章

C++primer(第五版)第二章的学习笔记(也有对部分习题的解答和指出c++11特性)

算术类型分为两类:整型(字符和bool在内)和浮点型. C/C++算术类型 类型 含义 最小尺寸 bool 布尔类型 未定义 char 字符 8位 wchar_t 宽字符 16位 char16_t Unicode字符 16位 char32_t Unicode字符 32位 short 短整型 16位 int  整型 16位 long 长整型 32位 long long 长整型 64位 unsigned long 无符号长整型 32位 double 双精度浮点数 10位有效数字 long doubl

C++ Primer(第五版)读书笔记 &amp; 习题解答 --- Chapter 3

Chapter 3.1 1. using声明具有如下的形式: using namespace::name; Chapter 3.2 1. C++标准一方面对库类型所提供的操作做了规定,另一方面也对库的实现做出了性能上的要求,所以,在一般的应用场合,标准库类型都有足够的效率. 2. 当用一个字符串字面值初始化string对象时,除了最后那个空字符外其他所有的字符都会被拷贝到新创建的string对象中去. 3. 如果使用等号初始化一个变量,实际上执行的是拷贝初始化.如果不使用等号,则执行的是直接初始

C++ Primer(第五版)读书笔记 &amp; 习题解答 --- Chapter 1

Chapter 1.1 1. 每个C++程序都必须有且只能有一个main函数,main函数的返回类型必须是int.操作系统通过调用main函数来运行C++程序. 2. 一个函数的定义包含四部分:返回类型.函数名.形参列表以及函数体. 3. 当return语句包含一个值时,此返回值的类型必须与函数的返回类型相兼容. 4. 类型是程序设计最基本的概念之一.一种类型不仅定义了数据元素的内容,还定义了这类数据上可以进行的运算. Chapter 1.2 1. C++包含了一个全面的标准库,标准库就是一个类

C++ Primer(第五版)读书笔记 &amp; 习题解答 --- Chapter 2

Chapter 2.1 1. 数据类型决定了程序中数据和操作的意义. 2. C++定义了一套基本数据类型,其中包括算术类型和一个名为void的特殊类型.算术类型包含了字符.整型.布尔值以及浮点数.void无值也无操作,我们不能定义一个void类型的变量. 3. 算术类型的尺寸,也就是该类型所占的比特数,在不同机器上有所差别.下表列出了C++标准规定的最小尺寸,同时允许编译器赋予这些类型更大的尺寸: 由于比特数的不同,一个类型所能表达的最大(最小)值也是不同的. 4. C++语言规定,一个int至

C primer plus 读书笔记第十二章

C的强大功能之一在于它允许我们控制程序的细节.C的内存管理系统正是这种控制能力的例子.它通过让我们决定哪些函数知道哪些变量以及一个变量在程序中存在多长时间来实现这些控制. 1.存储类及其说明符 主要的定义:作用域.链接以及存储时间.其他编程语言也有类似的概念.C语言通过这三个概念定义了5中存储类.其说明符分别为auto.register.static.extern和typedef. 2.存储类和函数 函数也分为外部的和静态的.关键字是extern和static.默认情况下是外部的. 3.mall

C Primer Plus (第五版) 第十二章 存储类、链接和内存管理 编程练习

第十二章 存储类.链接和内存管理 编程练习 1.Q不使用全局变量,重写程序清单13.4 #include <stdio.h>; int critic(int u); int main(void) { int units; printf("How many pounds to a firkin of butter?\n"); scanf_s("%d", &units); while (units != 56) critic(units); prin

c++ primer plus(第6版)中文版 第十二章编程练习答案

第十二章编程练习答案 12.1根据以下类声明,完成类,并编小程序使用它 //12.1根据以下类声明,完成类,并编小程序使用它 #include <iostream> #include <cstring> using namespace std; class Cow{ char name[20]; char * hobby; double weight; public: Cow(); Cow(const char * nm, const char * ho, double wt);

c++ primer(第五版)学习笔记及习题答案代码版(第十四章)重载运算与类型转换

笔记较为零散,都是自己不熟悉的知识点. 习题答案至于一个.h 和.cc 中,需要演示某一题直接修改 #define NUM****, 如运行14.30题为#define NUM1430: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful f

C Primer Plus 第十二章程序清单……2015.5.10

C Primer Plus           第五版 第十二章  程序清单 #include<stdio.h> int main() { int x=30; printf("x in outer block:%d\n",x); { int x=77; printf("x in inner block:%d\n",x); } printf("x in outer block:%d\n",x); while(x++<33) { i