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

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

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

 /* global.c  --- 使用外部变量  */
#include <stdio.h>
int units = ; //一个外部变量
void critic(void);
int main(void)
{
extern int units; printf ("How many pounds to a firkin of butter?\n");
scanf("%d", &units);
while(units != )
critic(); printf("You must have looked it up!\n");
return ;
} void critic(void){
printf("No luck, chummy, Try again in.\n");
scanf("%d", &units);
}

first-text

以下是我的答案:

 #include "stdio.h"

 void critic(void);

 int main(void){
int num;
printf("How many pounds to a firkin of butter?\n");
while(scanf("%d", &num) == && num != ){
critic();
} printf("You must have looked it up!\n"); return ;
} void critic(void){
puts("Not lucky, Try again!");
}

first-case

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

 #include "stdio.h"

 void set_mode(int get);            //设置模式
void get_info(void); //获取行驶公里、消耗油量,计算
void show_info(void); //展示计算结果 static int mode;
static double loss = 0.0,
distance = 0.0; void set_mode(int get){
switch(get){
case :
mode = ;
break;
case :
default:
mode = ;
break;
}
} void get_info(void){
extern double loss, distance;
switch(mode){
case :
puts("输入你所形式的公里数:");
scanf("%lf", &distance);
puts("损耗的油(单位:加仑):");
scanf("%lf", &loss);
break;
case :
puts("输入你所形式的英里数:");
scanf("%lf", &distance);
puts("损耗的油(单位:加仑):");
scanf("%lf", &loss);
break;
default:
puts("你选择的模式不正确!默认使用英里模式!");
puts("输入你所形式的英里数:");
scanf("%lf", &distance);
puts("损耗的油(单位:加仑):");
scanf("%lf", &loss);
break;
}
} void show_info(void){
switch(mode){
case :
printf("平均每公里损耗%0.2lf加仑油!\n", distance / loss);
break;
case :
default:
printf("平均每英里损耗%0.2lf加仑油!\n", distance / loss);
break;
}
}

second-case-pe12-2a.h

 #include "stdio.h"
#include "pe12-2a.h" //函数要求写在pe12-2a.h中 int main(void){
int mode;
printf("Enter 0 for metric mode, 1 for US mode:");
scanf("%d", &mode);
while(mode >= ){
set_mode(mode);
get_info();
show_info();
printf("Enter 0 for metric mode, 1 for US mode.");
printf("(-1 to quit)");
scnaf("%d", &mode);
}
printf("Done \n"); return ;
}

second-case-pe12--2.c

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

 //pe12-3a.h
#include "stdio.h"
#define MET 0
#define US 1 void set_mode(int *); //获取用户输入的信息,设置模式
void get_info(const int mode, double *distance, double *loss); //获取用户的信息
void show_info(const int mode, const double distance, const double loss); //计算平均油耗,输出结果 void set_mode(int *get){
if((*get != US) && (*get > US)){
*get = US;
}
} void get_info(const int mode, double *distance, double *loss){
switch(mode){
case :
puts("输入你所形式的公里数:");
scanf("%lf", distance);
puts("损耗的油(单位:加仑):");
scanf("%lf", loss);
break;
case :
puts("输入你所形式的英里数:");
scanf("%lf", distance);
puts("损耗的油(单位:加仑):");
scanf("%lf", loss);
break;
default:
puts("你选择的模式不正确!默认使用英里模式!");
puts("输入你所形式的英里数:");
scanf("%lf", distance);
puts("损耗的油(单位:加仑):");
scanf("%lf", loss);
break;
}
} void show_info(const int mode, const double distance, const double loss){
switch(mode){
case :
printf("平均每公里损耗%0.2lf加仑油!\n", distance / loss);
break;
case :
default:
printf("平均每英里损耗%0.2lf加仑油!\n", distance / loss);
break;
}
}

third-case-pe12-3a.h

 //12-3b.c
#include "stdio.h"
#include "12-3a.h" int main(){
int mode;
double distance = 0.0,
loss = 0.0;
printf("输入0选择公尺单位,输入1选择英尺单位");
scanf("%d", &mode);
while(mode >= ){
set_mode(&mode);
get_info(mode, &distance, &loss);
show_info(mode, distance, loss);
printf("输入0选择公尺单位,输入1选择英尺单位");
scanf("%d", &mode);
} puts("Done");
return ;
}

third-case-pe12-3b.c

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

 #include "stdio.h"

 int test_call(void);

 int main(void){
int temp, num;
while(scanf("%d", &temp) == ){
for(; temp > ; temp--){
num = test_call();
}
printf("这次一共调用了%d次函数\n", num);
printf("输入调用次数:");
} return ;
} int test_call(void){
static int num = ;
return ++num;
}

fourth-case-pe12-4a.c

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

 #include "stdio.h"
#include "stdlib.h"
#define LEN 100 void set_num(int *); //产生随机数
void show_num(int *); //排序后输出 int main(void){
int arr[LEN],
temp = ; set_num(arr);
show_num(arr); return ;
} void set_num(int *arr){
int temp = ;
for(; temp < LEN; temp++){
arr[temp] = rand() % + ; //rand() % 10 产生一个个位数,为了避免是0,所以加1.
}
} void show_num(int *arr){
int temp = ,
loop1 = , //用于循环而创建的变量
loop2 = ; //进行排序
for(; loop1 < LEN; loop1++){
for(loop2 = loop1; loop2 < LEN; loop2++){
if(arr[loop1] < arr[loop2]){ //注意降序排列
temp = arr[loop1];
arr[loop1] = arr[loop2];
arr[loop2] = temp;
}
}
} for(temp = ; temp < LEN; temp++){
printf("%3d", arr[temp]);
if((temp + ) % == )
putchar('\n');
}
}

fifth-case-12pe-5a.c

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

 #include "stdio.h"
#include "stdlib.h"
#define LEN 1000 static number[];
//计算数字出现的次数
void get_thousand(int );
//输出每个数字出现的次数
void show_thousand(void); int main(void){
int temp = ,
arr[LEN];
for(; temp < LEN; temp++){
//生成一个随机数
get_thousand(arr[temp] = rand() % + );
} show_thousand(); return ;
} void get_thousand(int num){
static temp = ;
switch(num){
case :
number[--num]++;
break;
case :
number[--num]++;
break;
case :
number[--num]++;
break;
case :
number[--num]++;
break;
case :
number[--num]++;
break;
case :
number[--num]++;
break;
case :
number[--num]++;
break;
case :
number[--num]++;
break;
case :
number[--num]++;
break;
case :
number[--num]++;
break;
default:
puts("产生了一个不在1-10范围内的数字!");
break;
}
++temp;
} void show_thousand(void){
int temp = ,
sum = ;
for(; temp < ; temp++){
printf("%d出现了%d次!\n", temp + , number[temp]);
sum += number[temp];
}
printf("一共产生了%d个数!\n", sum);
}

sixth-case-pe12-6a.c

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

//这题空缺

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

 #include "stdio.h"
#include "stdlib.h" int * make_array(int elem, int val);
void show_array(const int ar[], int n); int main(void){
int *pa,
size,
value; printf("输入数字:");
scanf("%d", &size); while(size > ){
printf("输入初始值:");
scanf("%d", &value);
pa = make_array(size, value);
if(pa){
show_array(pa, size);
free(pa);
}
printf("输入数字:");
scanf("%d", &size);
} puts("Done");
return ;
} int * make_array(int elem, int val){
int *ptr = (int *) malloc(elem * sizeof(int)),
temp;
for(temp = ; temp < elem; temp++)
ptr[temp] = val; return ptr;
} void show_array(const int ar[], int n){
int temp = ;
for(; temp < n; temp++){
printf("%5d", ar[temp]);
if((temp + ) % == )
putchar('\n');
}
if(n % != )
putchar('\n');
}

eighth-case-pe12-8a.c

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

  1. 《OpenCL异构并行编程实战》补充笔记散点,第五至十二章

    ▶ 第五章,OpenCL 的并发与执行模型 ● 内存对象与上下文相关而不是与设备相关.设备在不同设备之间的移动如下,如果 kernel 在第二个设备上运行,那么在第一个设备上产生的任何数据结果在第二个 ...

  2. C++primer(第五版)读书笔记&习题解答---CHAPTER 3

    C++标准库类型包括:string,vector和迭代器,其中string是可变长的字符序列,vector存放的是某种给定类型对象的可变长序列,迭代器是string和vector的配套类型,常被用于访 ...

  3. C primer plus 读书笔记第十二章

    C的强大功能之一在于它允许我们控制程序的细节.C的内存管理系统正是这种控制能力的例子.它通过让我们决定哪些函数知道哪些变量以及一个变量在程序中存在多长时间来实现这些控制. 1.存储类及其说明符 主要的 ...

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

    Chapter 3.1 1. using声明具有如下的形式: using namespace::name; Chapter 3.2 1. C++标准一方面对库类型所提供的操作做了规定,另一方面也对库的 ...

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

    Chapter 2.1 1. 数据类型决定了程序中数据和操作的意义. 2. C++定义了一套基本数据类型,其中包括算术类型和一个名为void的特殊类型.算术类型包含了字符.整型.布尔值以及浮点数.vo ...

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

    Chapter 1.1 1. 每个C++程序都必须有且只能有一个main函数,main函数的返回类型必须是int.操作系统通过调用main函数来运行C++程序. 2. 一个函数的定义包含四部分:返回类 ...

  7. C Primer Plus(第五版)1

    这是C Primer Plus(第五版)的第一章,上传上来主要是方便我进行做笔记,写注释,还有我会删掉一些“废话”等. 1.1 C语言的起源 贝尔实验室的 Dennis Ritchie 在1972年开 ...

  8. sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)

    第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的  DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...

  9. Gradle 1.12用户指南翻译——第五十二章. Maven 插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见:http://blog.csdn.net/column/details/gradle-translation.html翻译项目请关注Github上 ...

随机推荐

  1. java中的public,protected,private权限修饰

    public和private基本没问题,主要是默认的和protected之间的区别 同一包中默认的和protected一样,所以来看看不同包的情况 看下如下代码,两个类位于不同包: public cl ...

  2. VS超强调试技巧--忍不住想赞一下

    你是否曾遇到一个项目启动都要半分钟? 启动后调试或突然看到有行代码写错了?然后开始了: 处理步骤:停止运行->修改代码->重新启动(10-30秒)->又写错了->又要修改-&g ...

  3. 【C语言】一些重要的知识点

    1.#include <stdio.h> #include 是C语言的预处理指令之一,所谓预处理,就是在编译之前做的处理,预处理指令一般以 # 开头 #include 指令后面会跟着一个文 ...

  4. 采用apicloud开发移动端项目心得体会

    作为第一批吃螃蟹的,来说一说apicloud做移动端项目的一些体会. 刚开始接到项目,需要移动端开发两个项目,公司人员里面没有一个会原生android或者ios开发的,目前能出的技术也就是web,后端 ...

  5. Android自定义控件系列(一)—Button七十二变

    转载请注明出处:http://www.cnblogs.com/landptf/p/6290791.html 忙了一段时间,终于有时间整理整理之前所用到的一些知识,分享给大家,希望给同学们有些帮助,同时 ...

  6. H3 BPM 跨平台表单发起详解

    1.1 目的 为方便技术对接服务,实现流程业务的跨平台对接,给出指引和帮助文档. 2 跨平台以Java为例调用.NET BPM表单流程全过程 2.1 双方系统确定接口协议规则 通信协议:基于soap通 ...

  7. CA认证

    nginx下证书配置 nginx 下 配 置 CA 认 证   为nginx配置https并自签名证书   开启443端口   实验环境: centos6.5    192.168.16.14   [ ...

  8. 安装windows后grub的恢复

    问题: 原本是:双系统(linux和windows),后来换windows版本覆盖了grub2 解决方法: 进入windows后下载并安装EasyBCD并添加grub2的选项,重启看见了熟悉的启动项, ...

  9. WebService一、数据交互

    调用webservice总结:  1.加入第三方的jar包 Ksoap2-android-XXX    2.访问响应的webservice的网站,查看响应的信息,得到nameSpace,methodN ...

  10. NoSQL数据建模技术

    原文来自“NoSQL Data Modeling Techniques”,由酷壳网陈皓编译<NoSQL数据建模技术>.这篇文章看完之后,你可能会对NoSQL的数据结构会有些感觉.我的感觉是 ...