码迷,mamicode.com
首页 > 其他好文 > 详细

C primer plus 第五版十二章习题

时间:2016-05-25 23:45:05      阅读:357      评论:0      收藏:0      [点我收藏+]

标签:

看完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

 

C primer plus 第五版十二章习题

标签:

原文地址:http://www.cnblogs.com/UncleXiang/p/5510596.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!