zoukankan      html  css  js  c++  java
  • 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?
    ");
    10     scanf("%d", &units);
    11     while(units != 56)
    12         critic();
    13 
    14     printf("You must have looked it up!
    ");
    15     return 0;
    16 }
    17 
    18 void critic(void){
    19     printf("No luck, chummy, Try again in.
    ");
    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?
    ");
     8     while(scanf("%d", &num) == 1 && num != 56){
     9         critic();
    10     }
    11     
    12     printf("You must have looked it up!
    ");
    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加仑油!
    ", distance / loss);
    52             break;
    53         case 1:
    54         default:
    55             printf("平均每英里损耗%0.2lf加仑油!
    ", 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 
    ");
    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加仑油!
    ", distance / loss);
    44             break;
    45         case 1:
    46         default:
    47             printf("平均每英里损耗%0.2lf加仑油!
    ", 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次函数
    ", 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('
    ');
    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次!
    ", temp + 1, number[temp]);
    69         sum += number[temp];
    70     }
    71     printf("一共产生了%d个数!
    ", 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('
    ');
    47     }
    48     if(n % 8 != 0)
    49         putchar('
    ');
    50 }
    eighth-case-pe12-8a.c
  • 相关阅读:
    Hibernate>查询缓存 小强斋
    hibernate>抓取策略 小强斋
    Spring>环境 及 为什么使用spring 小强斋
    Hibernate>一级缓存 小强斋
    Spring>环境 及 为什么使用spring 小强斋
    【设计模式系列】OO设计原则之LSPLiskov替换原则
    【设计模式系列】OO设计原则之SRP单一职责原则
    【Android】选项卡使用
    【人生】不管你挣多少, 钱永远是问题
    【设计模式系列】序
  • 原文地址:https://www.cnblogs.com/UncleXiang/p/5510596.html
Copyright © 2011-2022 走看看