C primer plus 第五版十二章习题

时间:2022-05-22 14:35:08

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