C Primer Plus 第6版 编程练习 chapter 12

文章目录

  • 1. 第1题
    • 1.1 题目描述
    • 1.2 编程源码
    • 1.3 结果显示
  • 2. 第2题
    • 2.1 题目描述
    • 2.2 编程源码
      • 2.2.1 pe12-2a.h源码
      • 2.2.2 pe12-2a.c源码
      • 2.2.3 pe12-2b.c源码
    • 2.3 结果显示
  • 3. 第3题
    • 3.1 题目描述
    • 3.2 编程源码
      • 3.2.1 pe12-2a.h源码
      • 3.2.2 pe12-2a.c源码
      • 3.2.3 pe12-2b.c源码
    • 3.3 结果显示
  • 4. 第4题
    • 4.1 题目描述
    • 4.2 编程源码
    • 4.3 结果显示
  • 5. 第5题
    • 5.1 题目描述
    • 5.2 编程源码
    • 5.3 结果显示![结果显示](https://img-blog.csdnimg.cn/direct/545c733ccf6a4994879d03a6a8638577.png)
  • 6. 第6题
    • 6.1 题目描述
    • 6.2 编程源码
    • 6.3 结果显示
  • 7. 第7题
    • 7.1 题目描述
    • 7.2 编程源码
    • 7.3 结果显示
  • 8. 第8题
    • 8.1 题目描述
    • 8.2 编程源码
    • 8.3 结果显示
  • 9. 第9题
    • 9.1 题目描述
    • 9.2 编程源码
    • 9.3 结果显示

1. 第1题

1.1 题目描述

不使用全局变量,重写程序清单12.4

1.2 编程源码

#include<stdio.h>void critic(int *n){printf("No luck, my friend. Try again.\n");scanf("%d",n);
}int main(void){int units;printf("How many pounds to a firkin of butter?\n");scanf("%d", &units);while(units != 56) critic(&units);printf("You must have looked it up!\n");return 0;
}

1.3 结果显示

结果显示


2. 第2题

2.1 题目描述

在美国,通常以英里/加仑来计算油耗;在欧洲,以升/100公里来计算。下面是程序的一部分,提示用户选择计算模式(美制或公制),然后接收数据并计算油耗。

//pe12-2b.c
//与pe12-2a.c一起编译
#include<stdio.h>
#include"pe12-2a.h"int main(void){int mode;printf("Enter 0 for metric mode, 1 for US mode: ");scanf("%d", &mode);while(mode>=0){set_mode(mode);get_info();show_info();printf("Enter 0 for metric mode, 1 for US mode(-1 to quit): ");scanf("%d", &mode);}printf("Done.\n");return 0;
}

下面是一些输出示例

Enter 0 for metric mode, 1 for US mode: 0
Enter distance traveled in kilometers: 600
Enter fuel consumed in liters: 78.8
Fuel consumption is 13.13 liters per 100km.
Enter 0 for metric mode, 1 for US mode(-1 to quit): 1
Enter distance traveled in miles: 434
Enter fuel consumed in gallons: 12.7
Fuel consumption is 34.2 miles per gallon.
Enter 0 for metric mode, 1 for US mode(-1 to quit): 3
Invalid mode specified. Mode 1(us) used.
Enter distance traveled in miles: 388
Enter fuel consumed in gallons: 15.3
Fuel consumption is 25.4 miles per gallon.
Enter 0 for metric mode, 1 for US mode(-1 to quit): -1
Done.

如果用户输入了不正确的模式,程序向用户给出提示消息并使用上一次的正确模式。请提供pe12-2a.h和pe12-2a.c源文件。源文件代码应定义3个具有文件作用域、内部链接的变量。一个表示模式,一个表示距离,一个表示消耗的燃料。get_info函数根据用户输入的模式提示用户输入相应的数据,并将其储存 到文件作用域变量中。show_info函数根据设置的模式计算并显示油耗。可以假设用户输入的都是数值数据。

2.2 编程源码

2.2.1 pe12-2a.h源码

#ifndef PE12_2A_H_
#define PE12_2A_H_void set_mode(int mode);
void get_info(void);
void show_info(void);int mod;
double dis;
double fule;#endif

2.2.2 pe12-2a.c源码

#include<stdio.h>
#include "pe12-2a.h"void set_mode(int m){	if((m !=0) && (m != 1)){mod = 1;printf("Invalid mode specified. Mode 1(US) used.");}else{mod = m;}
}void get_info(){if(mod == 1){printf("Enter distance travelde in miles:");scanf("%lf", &dis);while(getchar()!= '\n') continue;printf("Enter fuel consumed in gallons:");scanf("%lf", &fule);while(getchar()!= '\n') continue;}else{		printf("Enter distance travelde in kilometers:");scanf("%lf", &dis);while(getchar()!= '\n') continue;printf("Enter fuel consumed in liters:");scanf("%lf", &fule);while(getchar()!= '\n') continue;}
}void show_info(){double n = 0;if(mod == 1){n = dis/fule;printf("Fuel consumption is %.2lf liters per gallon\n", n);}else{		n = fule / (dis/100);printf("Fuel consumption is %.2lf liters per 100 km\n", n);}
}

2.2.3 pe12-2b.c源码

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

2.3 结果显示

结果显示


3. 第3题

3.1 题目描述

重新设计编程练习2,要求只使用自动变量。该程序提供的用户界面不变,即提示用户输入模式等。但是函数调用要作相应变化。

3.2 编程源码

3.2.1 pe12-2a.h源码

#ifndef PE12_2A_H_
#define PE12_2A_H_int set_mode(int mode);
void get_info(int mod, double* dis, double *fule);
void show_info(int mod, double dis,double fule);#endif

3.2.2 pe12-2a.c源码

#include<stdio.h>
#include "pe12-2a.h"int set_mode(int m){	if((m !=0) && (m != 1)){m = 1;printf("Invalid mode specified. Mode 1(US) used.\n");}
}void get_info(int mod, double* dis, double *fule){if(mod == 1){printf("Enter distance travelde in miles:");scanf("%lf", dis);while(getchar()!= '\n') continue;printf("Enter fuel consumed in gallons:");scanf("%lf", fule);while(getchar()!= '\n') continue;}else{		printf("Enter distance travelde in kilometers:");scanf("%lf", dis);while(getchar()!= '\n') continue;printf("Enter fuel consumed in liters:");scanf("%lf", fule);while(getchar()!= '\n') continue;}
}void show_info(int mod, double dis,double fule){double n = 0;if(mod == 1){n = dis/fule;printf("Fuel consumption is %.2lf liters per gallon\n", n);}else{		n = fule / (dis/100);printf("Fuel consumption is %.2lf liters per 100 km\n", n);}
}

3.2.3 pe12-2b.c源码

#include<stdio.h>
#include"pe12-2a.h"int main(void){int mode;double dis,fule;printf("Enter 0 for metric mode, 1 for US mode: ");scanf("%d", &mode);while(mode>=0){mode = set_mode(mode);get_info(mode, &dis, &fule);show_info(mode,dis,fule);printf("Enter 0 for metric mode, 1 for US mode(-1 to quit): ");scanf("%d", &mode);}printf("Done.\n");return 0;
}

3.3 结果显示

结果展示


4. 第4题

4.1 题目描述

在一个循环中编写并测试一个函数,该函数返回它被调用的次数。

4.2 编程源码

#include<stdio.h>int time(void){static int n=0;return ++n;
}int main(void){for(int i=0;i<10;++i)printf("该函数被调用了%d次\n", time());return 0;
}

4.3 结果显示

结果显示


5. 第5题

5.1 题目描述

编写一个程序,生成100个1~10范围内的随机数,并以降序排列(可以把第11章的排序算法稍加改动,便可用于整数排序,这里仅对整数排序)。

5.2 编程源码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>void sort(int*num, int m){int t;for(int i=0;i<m;++i){for(int j=i;j<m;++j){if(num[i]>num[j]){t = num[i];num[i] = num[j];num[j] = t;}}}
}int main(void){int num[100];srand((unsigned int)time(0));printf("生成的整数原来顺序为:\n");for(int i=0;i<100;++i){num[i] = rand()%10;printf("%d\t", num[i]);}printf("\n");sort(num,100);printf("排序后的整数顺序为:\n");for(int i=0;i<100;++i){printf("%d\t", num[i]);}printf("\n");return 0;
}

5.3 结果显示结果显示


6. 第6题

6.1 题目描述

编写一个程序,生成1000个1~10范围内的随机数。不用保存或打印这些数字,仅打印每个数出现的次数,用10个不同的种子值运行,生成的数字出现的次数是否相同?可以使用本章自定义的函数或ANSIC 的rand和srand函数,他们的格式相同。这是一个测试特定随机数生成器随机性的方法。

6.2 编程源码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>int main(void){int num[10]={0};int n;for(int t=0;t<10;++t){srand((unsigned int)t);printf("\n第%d次测试:\n",t);for(int i=0;i<1000;++i){n = rand()%10;++num[n];}for(int i=0;i<10;++i){printf("%d\t", num[i]);}printf("\n");for(int i=0;i<10;++i) num[i] = 0;}return 0;
}

6.3 结果显示

结果显示


7. 第7题

7.1 题目描述

编写一个程序,按照程序清单12.13输出示例后面讨论的内容,修改程序。使其输出类似:

Enter the number of sets; enter q to stop: 18
How many sides and how many dice? 6 3
Here are 18 sets of 3 6-sided throws.
12 10 6 9 14 8 15 9 14 12 17 11 7 10 13 8 14
How many sets? Enter q to stop:q

7.2 编程源码

#include<stdio.h>
#include<stdlib.h>
#include"diceroll.h"int roll_count = 0;static int rollem(int sides){int roll;roll = rand()%sides +1;++roll_count;return roll;
}int roll_n_dice(int dice, int sides){int d;int total = 0;if(sides<2){printf("Need at least 2 sides.\n");return -2;}if(sides<1){printf("Need at least 1 die.\n");return -1;}for(d = 0;d<dice;++d)total += rollem(sides);return total;
}

7.3 结果显示

结果显示


8. 第8题

8.1 题目描述

下面是程序的一部分:

//pe12-8.c
#include<stdio.h>
int* make_array(int elem, int val);
void show_array(const int ar[], int n);
int main(void){int *pa;int size;int value;printf("Enter the number of elements:");while(scanf("%d", &size) == 1 && size>0){printf("Enter the initialization value:");scanf("%d", &value);pa = make_array(size, value);if(pa){show_array(pa, size);free(pa);}printf("Enter the number of elements (<1 to quit):");}printf("Done.\n");return 0;
}

提供make_array和show_array函数的定义,完成该程序。make_array函数接受两个参数,第1个参数是int类型数组的元素个数,第2个参数是要赋给每个元素的值。该函数调用malloc创建一个大小合适的数组,将其每个元素设置为指定的值,并返回一个指向该数组的指针。show_array函数显示数组的内容,一行显示8个数。

8.2 编程源码

#include<stdio.h>
#include<stdlib.h>
int* make_array(int elem, int val){int* num = (int *)malloc(sizeof(int)*elem);if(num){for(int i=0;i<elem;++i)num[i] = val;}return num;
}
void show_array(const int ar[], int n){for(int i=0;i<n;++i){printf("%d\t", ar[i]);if(i%8 == 7) printf("\n");}printf("\n");
}
int main(void){int *pa;int size;int value;printf("Enter the number of elements:");while(scanf("%d", &size) == 1 && size>0){printf("Enter the initialization value:");scanf("%d", &value);pa = make_array(size, value);if(pa){show_array(pa, size);free(pa);}printf("Enter the number of elements (<1 to quit):");}printf("Done.\n");return 0;
}

8.3 结果显示

结果显示


9. 第9题

9.1 题目描述

编写一个符合以下描述的函数。首先,询问用户需要输入多少个单词。然后,接受用户输入的单词,并显示出来,使用malloc并回答第1个问题(即要输入多少个单词),创建一个动态数组,该数组内含相应的指向const的指针(注意,由于数组的每个元素都指向char的指针,所以用于储存malloc返回值的指针应该是一个指向指针的指针,且它所指向的指针指向char)。在读取字符串时,该程序应该把单词读入一个临时的char数组,使用malloc分配足够的存储空间来储存单词,并把地址存入该指针数组(该数组中每个元素都是指向char的指针)。然后从临时数组中把单词拷贝到动态分配的存储空间中。因此,有一个字符指针数组,每个指针都指向一个对象,该对象的大小正浩能容纳被储存的特定单词。下面是该程序的一个运行示例:

How many words do you wish to enter? 5
Enter 5 words now:
I enjoyed doing this exerise
Here are your words:
1
I
enjoyed
doing
this
exercise

9.2 编程源码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>void copy_array(char *p, const char ar[]){while(*ar)*p++ = *ar++;
}
int main(void){int size;printf("How many words do you wish to enter?");scanf("%d", &size);while(getchar()!='\n')continue;char** p = (char**) malloc(sizeof(char*)*size);printf("Enter %d words now: \n",size);char t[20];int i = 0;while(scanf("%s", t) == 1 && i< size){p[i] = (char*) malloc(sizeof(char)*strlen(t)+1);copy_array(p[i],t);++i;}if(p){for(int j=0;j<i;++j)puts(p[j]);}if(p){for(int j=0;j<i;++j){if(p[i]) free(p[i]);}}if(p) free(p);printf("Done.\n");return 0;
}

9.3 结果显示

结果显示


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/311805.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[每周一更]-(第43期):Golang版本的升级历程

从1.13接触go语言开始更新我们公司内第一个Go项目&#xff0c;直至现在go版本已经发展到1.20&#xff08;20230428&#xff09;&#xff0c;我们从go发版开始认识go语言&#xff0c;有利于我们更深入 了解这门语言&#xff0c;洞悉一些深层方式&#xff0c;加深我们学习的动力&…

深入探索小红书笔记详情API:解锁内容创新的无尽潜力

一、引言 在当今信息爆炸的时代&#xff0c;内容创新已经成为品牌和个人脱颖而出的关键。小红书&#xff0c;作为全球最大的消费类口碑库之一&#xff0c;每天产生大量的用户生成内容。而小红书笔记详情API&#xff0c;作为一个强大的工具&#xff0c;能够为内容创作者提供深入…

前后台分离开发

前后台分离开发 简介 前后台分离开发&#xff0c;就是在项目开发过程中&#xff0c;对于前端代码的开发由专门的前端开发人员负责&#xff0c;后端代码则由后端开发人员负责&#xff0c;这样可以做到分工明确、各司其职&#xff0c;提高开发效率&#xff0c;前后端代码并行开…

【linux】tail的基本使用

在linux可以用find查找一个文件&#xff0c;可以用grep查找符合要求的文件内容&#xff0c;但是有的时候希望查看文件的前几行或者后几行&#xff08;其实这种场景经常可以遇到&#xff0c;比如接触到日志分析的时候&#xff09;&#xff0c;那就应该使用head和tail这两个工具了…

2023-12-24 LeetCode每日一题(收集足够苹果的最小花园周长)

2023-12-24每日一题 一、题目编号 1954. 收集足够苹果的最小花园周长二、题目链接 点击跳转到题目位置 三、题目描述 给你一个用无限二维网格表示的花园&#xff0c;每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| |j| 个苹果。 你将会买下正中心坐…

【北亚数据恢复】mysql表被truncate,表数据被delete的数据恢复案例

云服务器数据恢复环境&#xff1a; 华为ECS云服务器&#xff0c;linux操作系统&#xff0c;mysql数据库&#xff08;innodb引擎&#xff09;。作为网站服务器使用。 云服务器故障&#xff1a; 在执行mysql数据库版本更新测试时&#xff0c;误将本应该在测试库上执行的sql脚本执…

<软考高项备考>《论文专题 - 37 采购管理(2) 》

2 过程1-规划采购管理 2.1 问题 4W1H过程做什么记录项目采购决策、明确采购方法&#xff0c;及识别潜在卖方的过程作用&#xff1a;确定是否从项目外部获取货物和服务&#xff0c;如果是&#xff0c;则还要确定将在什么时间、以什么方式获取什么货物和服务为什么做为如何采购…

阿贝云免费云服务器

最近体验了一下阿贝云的免费云服务器&#xff0c;总体感受是简单易上手。感兴趣的小伙伴们可以赶紧注册体验一下。 阿贝云官网&#xff1a; https://www.abeiyun.com 下图是我亲测的免费云服务器管理界面&#xff0c;免费云服务器的配置信是1核1GB&#xff0c;硬盘10GB&#x…

VMware虚拟机网络配置——桥接模式

VM虚拟机配置桥接模式&#xff0c;可以让虚拟机和物理主机一样存在于局域网中&#xff0c;可以和主机相通&#xff0c;和互联网相通&#xff0c;和局域网中其它主机相通。 vmware为我们提供了三种网络工作模式&#xff0c;它们分别是&#xff1a;Bridged&#xff08;桥接模式&…

竞赛保研 基于机器视觉的12306验证码识别

文章目录 0 简介1 数据收集2 识别过程3 网络构建4 数据读取5 模型训练6 加入Dropout层7 数据增强8 迁移学习9 结果9 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的12306验证码识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向…

Yapi接口管理平台Centos7容器部署

文章目录 0.Docker部署1.Docker部署1.1 MongoDB1.2 下载 Yapi 镜像1.3 初始化数据库1.4 启动 Yapi 服务1.5 访问 Yapi 2.docker-compose部署2.1 创建容器网络2.2 创建2.3 创建 mongodb-compose2.4 创建 yapi-compose2.5 启动容器2.6 访问 Yapi 0.Docker部署 参考&#xff1a;C…

kafka 的零拷贝原理

文章目录 kafka 的零拷贝原理 今天来跟大家聊聊kafka的零拷贝原理是什么&#xff1f; kafka 的零拷贝原理 零拷贝是一种减少数据拷贝的机制&#xff0c;能够有效提升数据的效率&#xff1b;   在实际应用中&#xff0c;如果我们需要把磁盘中的某个文件内容发送到远程服务器上…