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

news2025/2/26 3:51:41

文章目录

  • 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.coloradmin.cn/o/1347433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年【安全员-B证】考试报名及安全员-B证新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-B证考试报名考前必练&#xff01;安全生产模拟考试一点通每个月更新安全员-B证新版试题题目及答案&#xff01;多做几遍&#xff0c;其实通过安全员-B证考试试题很简单。 1、【多选题】《中华人民共和国消防法…

液晶时钟设计

#include<reg51.h> //包含单片机寄存器的头文件 #include<stdlib.h> //包含随机函数rand()的定义文件 #include<intrins.h> //包含_nop_()函数定义的头文件 sbit RSP2^0; //寄存器选择位&#xff0c;将RS位定义为P2.0引脚 sbit RWP2^1; //读写选…

《Python机器学习原理与算法实现》学习笔记

以下为《Python机器学习原理与算法实现》&#xff08;杨维忠 张甜 著 2023年2月新书 清华大学出版社&#xff09;的学习笔记。 根据输入数据是否具有“响应变量”信息&#xff0c;机器学习被分为“监督式学习”和“非监督式学习”。 “监督式学习”即输入数据中即有X变量&…

如何通过易舟云财务软件,查看账簿的总账?

如何通过易舟云财务软件&#xff0c;查看账簿的总账&#xff1f; 前言财务软件操作步骤 前言 总账是会计中的一个重要概念&#xff0c;是指记录一个企业在一定时期内所有经济业务活动的账簿。总账记录了企业的资产、负债、所有者权益、收入和费用等各项会计科目的变动情况。 …

详解数组的轮转

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

软件测试/测试开发丨Python 常用第三方库 yaml

YAML 一种数据序列化格式用于人类的可读性和与脚本语言的交互一种被认为可以超越 XML、JSON 的配置文件 YAML 基本语法规则 大小写敏感使用缩进表示层级关系缩进时不允许使用 Tab 键&#xff0c;只允许使用空格缩进的空格数目不重要&#xff0c;只要相同层级的元素左侧对齐即…

mixins混淆请求字典封装库

摘要&#xff1a; 页面请求要使用到很多重点的查询&#xff0c;写在本页面的逻辑代码太混乱&#xff0c;所以可以抽离封装成功一个js库混淆进来&#xff01; commonMixins.js: import {Toast} from "vant"; export const oplistMix {mounted() {this.GETSTORE_LOCA…

vue-springboot基于JavaWeb的宠物店兽医站管理系统

ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7 框架&#xff1a;ssmspringboot都有 前端&#xff1a;vue.jsElementUI 详细技术&#xff1a;HTMLCSSJSspringbootSSMvueMYSQLMAVEN 数据库工具&#xff1a;Navicat结合现有兽医站体系的特点&#xff0c;运…

【小沐学NLP】Python实现TF-IDF算法(nltk、sklearn、jieba)

文章目录 1、简介1.1 TF1.2 IDF1.3 TF-IDF2.1 TF-IDF(sklearn)2.2 TF-IDF(nltk)2.3 TF-IDF(Jieba)2.4 TF-IDF(python) 结语 1、简介 TF-IDF&#xff08;term frequency–inverse document frequency&#xff09;是一种用于信息检索与数据挖掘的常用加权技术。TF是词频(Term Fr…

[场景实现]:多选框与树形结构递归

一、场景描述 实现一个分配权限的页面&#xff0c;最左侧是大的权限模块的名称&#xff0c;左右侧是控制其是否勾选的多选框。中间部分是一级权限模块下的子权限名称及多选框。 请求此权限模块数据的接口返回的是树形结构 对象数组。 主要属性为menuName表示权限名&#xff0…

回溯法寻找元素之和等于目标值的子集

这是一个回溯法的算法,可以用来寻找所有元素之和等于目标值的子集. 整个算法中最重要的是:在递归之后"恢复现场" 也就是: t[cnt]0; cnt--; 完整代码(注释部分打印信息可以用来辅助理解递归过程)&#xff1a; #include<iostream> #include<cstring> …

【Spring Security】快速入门之案例实操

目录 一、简介 1、什么是安全框架 2、主流的安全框架 3、为什么使用Spring Security 二、引言 1、什么是Spring Security 2、Spring Security工作原理 3、特点 三、快速入门 1、引入依赖 2、配置 3、启动测试 4、配置自定义账号密码 四、Web安全配置类 1.HttpSe…

vue3(十一)-基础入门之脚手架创建项目与打包并部署项目

一、安装 node.js node.js官网 1、下载并安装推荐版 2、检查是否安装成功 有版本号表示安装成功 3、如果想安装淘宝镜像可以使用以下指令 npm install -g cnpm -registryhttps://registry.npm.taobao.org检查淘宝镜像是否安装成功 二、安装vue脚手架 该指令为固定指令不可…

常用的 MySQL 可视化客户端

数据库可视化客户端&#xff08;GUI&#xff09;让用户在和数据库进行交互时&#xff0c;能直观地查看、创建和修改对象&#xff0c;如&#xff1a;表、行和列。让数据库操作变得更方便了。 今天&#xff0c;我们来了解下目前市场上最常用的 MySQL 可视化客户端。 官方&#x…

x-cmd-pkg | deno - 更快更强的 JS 和 TS 运行时

目录 简介首次用户技术特点进一步阅读 简介 Deno 是一个基于 V8 引擎和 Rust 语言构建的 JavaScript 和 TypeScript 运行时环境&#xff0c;于 2018 年由 Ryan Dahl 在演讲中宣布&#xff0c;并在 2020 年正式发布 1.0&#xff0c;目标是提供一个高效且安全的脚本环境。 安全…

idea中终端Terminal页面输入命令git log后如何退出

1、idea中Terminal输入命令git log后如何退出&#xff1f; 2、解决 输入q键会自动退出git log命令

《深入理解JAVA虚拟机》学习笔记

1.java内存结构&#xff0c;以及每个结构的作用&#xff1f; 线程共享区 堆内存:所有的对象实例都要在堆上分配方法区:是各个线程共享的内存区域&#xff0c;它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据非线程共享区 Java虚拟机栈:每…

25、商城系统(七):商城项目基础功能pom.xml(重要),mybatis分页插件

截止这一章,我们就不把重心放在前端,后台的基础代码,因为后面都是业务层面的crud。 前端直接替换这两个文件夹即可,后台代码也直接复制: 一、重新更新一下所有的pom.xml 这个地方我踩了好多坑,最后得到一个完整的pom.xml,建议大家直接用我的pom.xml替换即可。 1.comm…

计算机组成原理知识总结

目录 第一章、计算机系统概述知识框架&#xff1a;1.冯诺依曼机和存储程序的概念&#xff1f;2.计算机的工作过程&#xff1f;3.在计算机系统结构中&#xff0c;什么是编译&#xff1f;什么是解释&#xff1f;4.描述一下指令执行过程&#xff1f;1) 取指令&#xff1a; PC 一&g…

[Angular] 笔记 25:指令

组件指令 (chatgpt 回答) 在 Angular 中&#xff0c;组件本身可以被视为指令&#xff0c;这种指令被称为组件指令。组件是 Angular 应用的构建块之一&#xff0c;它封装了一段具有特定功能和特性的用户界面&#xff0c;并且可以在应用中重复使用。 组件指令具有以下特征&…