C primer plus 第五版十二章习题
看完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 第五版十二章习题的更多相关文章
- 《OpenCL异构并行编程实战》补充笔记散点,第五至十二章
▶ 第五章,OpenCL 的并发与执行模型 ● 内存对象与上下文相关而不是与设备相关.设备在不同设备之间的移动如下,如果 kernel 在第二个设备上运行,那么在第一个设备上产生的任何数据结果在第二个 ...
- C++primer(第五版)读书笔记&习题解答---CHAPTER 3
C++标准库类型包括:string,vector和迭代器,其中string是可变长的字符序列,vector存放的是某种给定类型对象的可变长序列,迭代器是string和vector的配套类型,常被用于访 ...
- C primer plus 读书笔记第十二章
C的强大功能之一在于它允许我们控制程序的细节.C的内存管理系统正是这种控制能力的例子.它通过让我们决定哪些函数知道哪些变量以及一个变量在程序中存在多长时间来实现这些控制. 1.存储类及其说明符 主要的 ...
- C++ Primer(第五版)读书笔记 & 习题解答 --- Chapter 3
Chapter 3.1 1. using声明具有如下的形式: using namespace::name; Chapter 3.2 1. C++标准一方面对库类型所提供的操作做了规定,另一方面也对库的 ...
- C++ Primer(第五版)读书笔记 & 习题解答 --- Chapter 2
Chapter 2.1 1. 数据类型决定了程序中数据和操作的意义. 2. C++定义了一套基本数据类型,其中包括算术类型和一个名为void的特殊类型.算术类型包含了字符.整型.布尔值以及浮点数.vo ...
- C++ Primer(第五版)读书笔记 & 习题解答 --- Chapter 1
Chapter 1.1 1. 每个C++程序都必须有且只能有一个main函数,main函数的返回类型必须是int.操作系统通过调用main函数来运行C++程序. 2. 一个函数的定义包含四部分:返回类 ...
- C Primer Plus(第五版)1
这是C Primer Plus(第五版)的第一章,上传上来主要是方便我进行做笔记,写注释,还有我会删掉一些“废话”等. 1.1 C语言的起源 贝尔实验室的 Dennis Ritchie 在1972年开 ...
- sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)
第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的 DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...
- Gradle 1.12用户指南翻译——第五十二章. Maven 插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见:http://blog.csdn.net/column/details/gradle-translation.html翻译项目请关注Github上 ...
随机推荐
- 服务端获取客户端html页面内容-2013-6-28-2
客户端怎么提交 整个html页面? 分析: 1>我们知道b/s模式,也知道http协议.服务端想要获取客户端的数据,客户端就 必须提交给它,服务器才能获取到. 2> ...
- tampermonkey,采用js解析自定义脚本,实现网页列表数据采集分析
最近一直在做数据采集的事情,目的是使用java开发一套分析指定采集规则,模拟用户动作做数据提取.因此定义了一套动作脚本,open,click,get,list,opentab,closetab...j ...
- UIView的生命周期和layout方法总结
生命周期 1. loadView 什么时候调用? 每次访问UIViewController的view时候并且view == nil时候调用. 如何实现? 1> 如果在初始化UIViewContr ...
- 读书笔记:《HTML5开发手册》Web表单
这是补充HTML5基础知识的第五篇内容,其他为: 一.HTML5-- 新的结构元素 二.HTML5-- figure.time.details.mark 三.HTML5-- details活学活用 四 ...
- 微型orm框架--dapper的简单使用
1.安装 首先使用nuget安装dapper,因为这里的示例是使用mysql,所以还要安装mysql的驱动.如下图: 2 数据库表 脚本 ; -- -------------------------- ...
- 链接中的href=#是什么意思呢
链接当前页面. ------------------- 通常有如下用法: <a href="#" onclick="window.close()"> ...
- js中常用的Math方法总结
1.min()和max()方法 Math.min()用于确定一组数值中的最小值.Math.max()用于确定一组数值中的最大值. alert(Math.min(2,4,3,6,3,8,0,1,3)); ...
- overflow属性及其在ios下卡顿问题解决
overflow属性:http://www.w3school.com.cn/cssref/pr_pos_overflow.asp overflow:scroll/auto;在手机页面滑动不流畅问题: ...
- python——爬虫
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕 ...
- 开通域名绑定DDNS
一.初衷 我想要有一个自己的域名,然后有自己的server,在server上搭一个网站或者开通一个ftp服务,我想通过这个域名来访问它. 二.什么是DDNS DDNS 动态dns,电信宽带采用拨号联网 ...