C Primer Plus第九章编程练习答案

news2024/11/26 22:25:44

学完C语言之后,我就去阅读《C Primer Plus》这本经典的C语言书籍,对每一章的编程练习题都做了相关的解答,仅仅代表着我个人的解答思路,如有错误,请各位大佬帮忙点出!

1.设计一个函数min(x, y),返回两个double类型值的较小值。在一个简单 的驱动程序中测试该函数。

#include <stdio.h>
double Min(double x, double y)
{
	return x > y ? y : x;
}
int main(void)
{
	double min_num = Min(20.0, 15.0);
	printf("min_num : %lf\n", min_num);

	min_num = Min(15.0, 20.0);
	printf("min_num : %lf\n", min_num);

	return 0;
}

2.设计一个函数chline(ch, i, j),打印指定的字符j行i列。在一个简单的驱 动程序中测试该函数。

#include <stdio.h>
void chline(char ch, int i, int j)
{
	for (int m = 0; m < i; m++)
	{
		for (int n = 0; n < j; n++)
		{
			printf("%c ", ch);
		}
		printf("\n");
	}
}
int main(void)
{
	char ch = '0';
	int i = 0, j = 0;

	printf("请输入一个字符:");
	scanf("%c",&ch);

	printf("请输入行数:");
	scanf("%d", &i);
	printf("请输入列数:");
	scanf("%d", &j);

	chline(ch, i, j);

	return 0;
}

3.编写一个函数,接受3个参数:一个字符和两个整数。字符参数是待 打印的字符,第1个整数指定一行中打印字符的次数,第2个整数指定打印指 定字符的行数。编写一个调用该函数的程序。

#include <stdio.h>
void chline(char ch, int i, int j)
{
	for (int m = 0; m < j; m++)
	{
		for (int n = 0; n < i; n++)
		{
			printf("%c ", ch);
		}
		printf("\n");
	}
}
int main(void)
{
	char ch = '0';
	int i = 0, j = 0;

	printf("请输入一个字符:");
	scanf("%c",&ch);

	printf("请输入一行中打印字符的个数:");
	scanf("%d", &i);
	printf("请输入指定打印字符的个数:");
	scanf("%d", &j);

	chline(ch, i, j);

	return 0;
}

4.两数的调和平均数这样计算:先得到两数的倒数,然后计算两个倒数 的平均值,最后取计算结果的倒数。编写一个函数,接受两个double类型的 参数,返回这两个参数的调和平均数。

#include <stdio.h>
double Reconcile_the_average(double d1, double d2)
{
	return 1.0 / ((1.0 / d1 + 1.0 / d2) / 2.0);
}
int main(void)
{
	double ret = Reconcile_the_average(3.0,4.0);
	printf("ret : %lf\n", ret);

	ret = Reconcile_the_average(4.0, 5.0);
	printf("ret : %lf\n", ret);
	
	return 0;
}

5.编写并测试一个函数larger_of(),该函数把两个double类型变量的值替 换为较大的值。例如, larger_of(x, y)会把x和y中较大的值重新赋给两个变 量。

#include <stdio.h>
void larger_of(double* d1,double* d2)
{
	if (*d1 > *d2)
		*d2 = *d1;
	else
		*d1 = *d2;
}
int main(void)
{
	double d1 = 1.0, d2 = 2.0, d3 = 3.0,d4 = 4.0;

	printf("d1 = %lf,d2 = %lf d3 = %lf,d4 = %lf\n", d1, d2, d3, d4);
	larger_of(&d1, &d2);
	larger_of(&d3, &d4);
	printf("d1 = %lf,d2 = %lf d3 = %lf,d4 = %lf\n", d1, d2, d3, d4);

	return 0;
}

6.编写并测试一个函数,该函数以3个double变量的地址作为参数,把最 小值放入第1个函数,中间值放入第2个变量,最大值放入第3个变量。

#include <stdio.h>
void sort(double* d1, double* d2, double* d3)
{
	double temp = 0.0;
	if (*d1 > *d2)
	{
		temp = *d1;
		*d1 = *d2;
		*d2 = temp;
	}
	if (*d1 > *d3)
	{
		temp = *d1;
		*d1 = *d3;
		*d3 = temp;
	}
	if (*d2 > *d3)
	{
		temp = *d2;
		*d2 = *d3;
		*d3 = temp;
	}
}
int main(void)
{
	double d1 = 2.0, d2 = 3.0, d3 = 1.0;

	printf("排序前:d1 = %lf,d2 = %lf,d3 = %lf\n", d1, d2, d3);
	sort(&d1, &d2, &d3);
	printf("排序后:d1 = %lf,d2 = %lf,d3 = %lf\n", d1, d2, d3);

	return 0;
}

7.编写一个函数,从标准输入中读取字符,直到遇到文件结尾。程序要 报告每个字符是否是字母。如果是,还要报告该字母在字母表中的数值位 置。例如,c和C在字母表中的位置都是3。合并一个函数,以一个字符作为 参数,如果该字符是一个字母则返回一个数值位置,否则返回-1。

#include <stdio.h>
#include <ctype.h>
int position(char ch)
{
	if (islower(ch))
		return ch - 'a' + 1;
	else if (isupper(ch))
		return ch - 'A' + 1;
	return -1;
}
void get_char_pos(void)
{
	char ch = '0';

	printf("请输入一些字符:");
	while ((ch = getchar()) != EOF)
	{
		if (ch == '\n')
			continue;
		if (position(ch) != -1)
			printf("该字符是一个字母,且位于字母表第%d位\n", position(ch));
		else
		{
			printf("该字符不是一个字母\n");
		}

	}
}
int main(void)
{
	get_char_pos();

	return 0;
}

8.第6章的程序清单6.20中,power()函数返回一个double类型数的正整数 次幂。改进该函数,使其能正确计算负幂。另外,函数要处理0的任何次幂 都为0,任何数的0次幂都为1(函数应报告0的0次幂未定义,因此把该值处 理为1)。要使用一个循环,并在程序中测试该函数。

#include <stdio.h>
double power(double n, int p)
{
    int i;
    double pow = 1.0;

    if ((0 == p) && (0 == n))
    {
        printf("0 to the 0 undefined, using 1 as the value.\n");
        return pow;
    }
    if (0 == n)
    {
        pow = 0.0;
        return pow;
    }
    if (0 == p)
    {
        return pow;
    }
    if (p > 0)
    {
        for (i = 1; i <= p; i++)
        {
            pow *= n;
        }
        return pow;
    }
    else
    {
        for (i = 1; i <= -p; i++)
        {
            pow *= 1 / n;
        }
        return pow;
    }
}
int main(void)
{
    double x, xpow;
    int exp;

    printf("Enter a number and the integer power");
    printf(" to which\nthe number will be raised. Enter q");
    printf(" to quit.\n");
    while (scanf("%lf%d", &x, &exp) == 2)
    {
        xpow = power(x, exp);
        printf("%.3g to the power %d is %.5g.\n", x, exp, xpow);
        printf("Enter next pair of numbers or q to quit.\n");
    }
    printf("Hope you enjoyed this power trip -- bye!\n");

    return 0;
}

9.使用递归函数重写编程练习8。

#include <stdio.h>
double power(double n, int p)
{
    double pow = 1.0;

    if ((0 == p) && (0 == n))
    {
        printf("0 to the 0 undefined, using 1 as the value.\n");
        return pow;
    }
    if (0 == n)
    {
        pow = 0.0;
        return pow;
    }
    if (0 == p)
    {
        return pow;
    }
    if (p > 0)
    {
        return n * power(n, p - 1);
    }
    else
    {
        return power(n, p + 1) / n;
    }
}
int main(void)
{
    double x, xpow;
    int exp;

    printf("Enter a number and the integer power");
    printf(" to which\nthe number will be raised. Enter q");
    printf(" to quit.\n");
    while (scanf("%lf %d", &x, &exp) == 2)
    {
        xpow = power(x, exp);
        printf("%.3g to the power %d is %.5g.\n", x, exp, xpow);
        printf("Enter next pair of numbers or q to quit.\n");
    }
    printf("Hope you enjoyed this power trip -- bye!\n");

    return 0;
}

10.为了让程序清单9.8中的to_binary()函数更通用,编写一个to_base_n() 函数接受两个在2~10范围内的参数,然后以第2个参数中指定的进制打印第 1个参数的数值。例如,to_base_n(129, 8)显示的结果为201,也就是129的 八进制数。在一个完整的程序中测试该函数。

#include <stdio.h>
void to_base_n(int x, int base)
{
    int r;

    r = x % base;
    if (x >= base)
    {
        to_base_n(x / base, base);
    }
    printf("%d", r);
    return;
}
int main(void)
{
    int b;
    long int n;

    printf("Please enter a number (q to quit): ");
    while (scanf("%ld", &n) == 1)
    {
        if (n <= 0)
        {
            printf("Illegal data! Please enter again: ");
            continue;
        }
        printf("Please enter a base system number (2 - 10): ");
        while (scanf("%d", &b) != 1 || (b < 2 || b > 10))
        {
            while (getchar() != '\n')
                continue;
            printf("Please enteragain (2 - 10): ");
        }
        printf("%d in %d base system is: ", n, b);
        to_base_n(n, b);
        printf("\nYou can enter a number again (q to quit): ");
    }
    printf("Done.\n");

    return 0;
}

11.编写并测试Fibonacci()函数,该函数用循环代替递归计算斐波那契 数。

#include <stdio.h>
void Fibonacci(int len)
{
    int i;
    unsigned long t, x, y;
    x = y = 1;

    for (i = 0; i < len; i++)
    {
        printf("%lu\n", x);
        t = x + y;
        x = y;
        y = t;
    }
    return;
}
int main(void)
{
    int n;
    printf("Please enter a integer (<= 0 or q to quit): ");
    while (scanf("%d", &n) == 1)
    {
        printf("Top %d items of Fibonacci sequence:\n", n);
        Fibonacci(n);
        printf("You can enter again (<= 0 or q to quit): ");
    }
    printf("Done.\n");

    return 0;
}

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

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

相关文章

【利用AI让知识体系化】5种创建型模式

文章目录 创建型模式简介工厂模式抽象工厂模式单例模式建造者模式原型模式 创建型模式 简介 创建型模式&#xff0c;顾名思义&#xff0c;是用来创建对象的模式。在软件开发中&#xff0c;对象的创建往往比一般的编程任务更为复杂&#xff0c;可能涉及到一些琐碎、复杂的过程…

Boosting以及代表算法(Adaboost、GBDT)介绍

一、Boosting介绍 1.什么是Boosting Boosting&#xff08;提升&#xff09;是一种集成学习方法&#xff0c;通过组合多个弱学习器来构建一个强学习器。与Bagging不同&#xff0c;Boosting采用了序列化的方式构建模型&#xff0c;每个弱学习器都是在前一个弱学习器的基础上进行…

Linux-0.11 文件系统exec.c详解

Linux-0.11 文件系统exec.c详解 模块简介 该模块实现了二进制可执行文件和shell脚本文件的加载和执行。 函数详解 create_tables static unsigned long * create_tables(char * p,int argc,int envc)该函数的作用是建立参数和环境变量指针表。 create_table的作用就是建立…

玄子Share - IDEA 2023.1 自定义 代码模板(Servlet)

玄子Share - IDEA 2023.1 自定义 代码模板&#xff08;Servlet&#xff09; 23版 IDEA 内取消了自动生成 Servlet 模板类&#xff0c;不过我们可以自己定义一个 Servlet 模板 步骤 第一步打开 IDEA 设置界面&#xff0c;编辑器 -> 文件和代码模板 -> 点击加号新建模板…

chatgpt赋能python:Python补齐0,让你在编程中更得心应手

Python 补齐0&#xff0c;让你在编程中更得心应手 在Python编程中&#xff0c;我们经常会遇到数字需要补齐0的情况。比如说我们要制作一个日期格式的字符串&#xff0c;例如“2022-02-22”&#xff0c;但是当天数只有一位数时&#xff0c;需要在前面补0&#xff0c;即“2022-0…

chatgpt赋能python:Python转换器——将数据转换为所需格式的工具

Python 转换器——将数据转换为所需格式的工具 Python 是一种功能强大的编程语言&#xff0c;因为它具有处理和分析数据的能力&#xff0c;因此被广泛使用。然而&#xff0c;在现代互联网时代&#xff0c;数据的格式和大小通常不相同&#xff0c;因此经常需要将数据从一种格式…

chatgpt赋能python:Python词形还原:一种优化搜索引擎排名的方法

Python词形还原&#xff1a;一种优化搜索引擎排名的方法 什么是词形还原&#xff1f; 词形还原是自然语言处理&#xff08;NLP&#xff09;中的一种重要技术。它是将单词转化为其最基本的形式的过程&#xff0c;例如动词的原形或名词的单数形式。这个过程旨在帮助计算机更好地…

openGauss 3.1企业版升级至5.0

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

什么是SOME/IP?

本文是SOME/IP 官方文档的翻译。原文地址&#xff1a;https://www.autosar.org/fileadmin/standards/R22-11/FO/AUTOSAR_RS_SOMEIPProtocol.pdf 1.引言和概览 2. 协议要求 3. 缩略语和术语 术语/缩略语描述Byte Order Mark字节顺序标记(byte order mark, BOM)是一个Unicode字…

Spring学习记录

目录 工厂模式的三种形态 简单工厂模式 代码&#xff1a; 运行结果&#xff1a; 总结&#xff1a; 工厂模式 代码&#xff1a; 运行结果&#xff1a; 总结&#xff1a; 抽象工厂模式 代码&#xff1a; 运行结果&#xff1a; 总结&#xff1a; bean的单例与多例 设置 …

chatgpt赋能python:Python父类调用子类:多态性的核心思想

Python父类调用子类&#xff1a;多态性的核心思想 多态性是面向对象编程(OOP)的核心思想之一&#xff0c;它允许不同的对象在调用同一个方法时产生不同的行为。Python是一门支持多态性的编程语言。在Python中&#xff0c;使用父类调用子类的方法是实现多态性的关键之一。 什么…

考研C语言第五章

5.2 数组基础知识 注意要点&#xff1a; 1.下标0开始 2.没有定义的地方是0 5.3 数组访问越界与数组传递 访问越界&#xff0c;定义超过前面定义的数组长度&#xff0c;占据了后面定义数据的地方 非常危险&#xff01; 在循环里面往往容易造成越界 数组传递 1.函数引用时…

AI一键抠图

前言 由于需要批量抠图&#xff0c;原本是想用MODNet的&#xff0c;可惜最新的模型官方不开源&#xff0c;旧模型扣的人物边缘有白边。最后发现了PP飞桨。 飞桨&#xff08;PaddlePaddle&#xff09;以百度多年的深度学习技术研究和业务应用为基础&#xff0c;集深度学习核心训…

【JDK】一、jdk17的下载与安装配置(图文说明超详细)

JDK17的下载与安装 前言一、JDK17下载1、官方下载地址 &#xff08; Oracle中国的官方网站&#xff09; 二、JDK17安装1、先看一下我现在的java版本和环境变量2、开始新的安装第一步&#xff1a;双击下载的jdk-17.0.7_windows-x64_bin.exe 进入到安装页面第二步&#xff1a;jdk…

内存管理之内存寻址(笔记)

计算机体系结构中的核心问题之一就是如何有效的进行内存寻址。因为所有运算的前提都是要先从内存中取地数据。所以内存寻址技术在一定程度上代表了计算机技术。 1. 图灵机和冯诺依曼体系 图灵机&#xff1a;图灵机是一种通用自动的机器模型&#xff0c;通过二段无线延申的纸带…

C++Primer——第一讲

重制CPrimer 目录 一、第一个程序 二、代码 二、题目 前言 我们会从一个C程序开始&#xff0c;这里默认您已经安装了Dev-C或其他的IDE软件。 一、第一个程序 下面这串代码是可以输出“Hello world”的代码。 #include<bits/stdc.h> using namespace std; int main(){…

Arduino+ESP8266 MCU开发板 ----带你开发DHT11温湿度开发项目

目录 PC调试过程如图 手机APP可在各大商场APP中下载 手机APP调试结果/效果如图 ESP8266 MUC介绍 ESP8266 MUC主要特点&#xff1a; 步1&#xff1a;下载Arduino&#xff0c;本次不多做说明&#xff0c;本次使用的arduino软件为老版本的&#xff0c;新版本有关的问题本人…

统计学的假设检验

假设检验的核心其实就是反证法。反证法是数学中的一个概念&#xff0c;就是你要证明一个结论是正确的&#xff0c;那么先假设这个结论是错误的&#xff0c;然后以这个结论是错误的为前提条件进行推理&#xff0c;推理出来的结果与假设条件矛盾&#xff0c;这个时候就说明这个假…

总结881

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;1800基础部分&#xff0c;背诵15篇短文&#xff09; 周目标&#xff1a;1800高等数学部分并完成错题记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#xff09; 前天错题纠错&#xff0c;线代部…

Solidity拓展:数据类型的转换

1.数据类型隐式转换 (自动) 同一类型之间的转换:由低长度转换为高长度int8-int16-int32int256,但int不能自动转换成uint&#xff0c;因为放不下负数所以直接不让转换,且 int8 不能转换成 uint256 &#xff08;因为 uint256 不能涵盖某些值&#xff0c;例如&#xff0c; -1&…