看完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. 使用纯css代码实现div的“回”字型“叠放”效果

    正如大家所知道的那样,div是一个块级元素,也是网页编写过程中使用频率最高的一个元素,通过不同的样式控制可以实现一些最常见的页面效果,当然也可以实现一些比较复杂的页面效果,这里就展示一个本人面试过程中 ...

  2. PHP常用之封装分页工具类

    分页基本上是每个项目都会使用到的,所以呢,把它封装成一个工具类,以后直接调用就可以了(虽然TP框架的灰常强大,但是自己封一个也未尝不可.),这样既省时又省力还赚'工分'. 我封的这个分页工具类还比较完 ...

  3. go CD 用虚拟机快速增加一个新agent

    背景 最近项目在用go CD做持续交付.为了最大化利用硬件,所有的agent都是用的vbox的虚拟机.随着pipelines的增加,就需要增加更多的agent. 步骤 为了快速增加新的agent,最简 ...

  4. CentOS 7下安装X Window

    1.网上其他人都这么说: yum check-update yum groupinstall "X Window System" ... 但是运行yum groupinstall  ...

  5. USACO 4.2 The Perfect Stall(二分图匹配匈牙利算法)

    The Perfect StallHal Burch Farmer John completed his new barn just last week, complete with all the ...

  6. 2017 01 16 校内小测 ZXR专场

    我等蒟蒻爆零之后,问LincHpin大爷:“此等神题可有甚么来头?” LincHpin:“此三题皆为当年ZXR前辈所留.” 固名之,ZXR专场,233~~~ T1 勤奋的YouSiki 这个题在BZO ...

  7. Python高手之路【十】python基础之反射

    反射说简单点 --> 就是利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员. 需求:由用户输入一个模块名,用户输入什么模块名,文件中就导入什么模块: 1:文件都在同一目录下的导 ...

  8. 访问mysql出现“Access denied for user root@localhost”(using password:NO)解决方案

    首先声明,出现这个提示的原因有很多,以下只针对我遇到的一种情况 使用解压缩版安装mysql的时候,data文件夹是自己新建的,my-default.ini也是自己配置的,这时直接启动mysql服务的时 ...

  9. Python高手之路【九】python基础之迭代器与生成器

    迭代器与生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外 ...

  10. ORALCE 编译过程卡死解决方法。

    --摘自网易博客 术士 在对存储过程进行test的时候,没有完全停止,就又在另外一个窗口,对它进行修改而且进行编译,出现了卡死现象. 用PLSQL Developer 在session里,找到这条se ...