C Primer Plus第十六章编程练习答案

news2024/11/28 20:42:15

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

由于使用的是命令行参数常用于linux系统或者vscode,但此代码是运行于vs2022的,测试截图就不弄了。

2.两数的调和平均数这样计算:先得到两数的倒数,然后计算两个倒数 的平均值,最后取计算结果的倒数。使用#define指令定义一个宏“函数”,执 行该运算。编写一个简单的程序测试该宏。

#include <stdio.h>
#define HMEAN(X, Y) (2.0 * (X) * (Y) / ((X) + (Y)))
int main(void)
{
    double x, y, ans;

    printf("Enter a pair of numbers (q to quit): ");
    while (scanf("%lf %lf", &x, &y) == 2)
    {
        ans = HMEAN(x, y);
        printf("%g = harmonic mean of %g %g.\n", ans, x, y);
        printf("Enter a pair of numbers (q to quit): ");
    }
    printf("Done.\n");

    return 0;
}

3.极坐标用向量的模(即向量的长度)和向量相对x轴逆时针旋转的角 度来描述该向量。直角坐标用向量的x轴和y轴的坐标来描述该向量(见图 16.3)。编写一个程序,读取向量的模和角度(单位:度),然后显示x轴 和y轴的坐标。相关方程如下:

x = r*cos A y = r*sin A

需要一个函数来完成转换,该函数接受一个包含极坐标的结构,并返回 一个包含直角坐标的结构(或返回指向该结构的指针)。

#include <stdio.h>
#include <math.h>
#define PI 3.1415926
typedef struct
{
    double length;
    double angle;
} polar;
typedef struct
{
    double x;
    double y;
} rect;
rect polar_to_rect(const polar* temp)
{
    rect res;
    static const double rad = PI / 180.0;
    double ang = rad * temp->angle;

    res.x = temp->length * cos(ang);
    res.y = temp->length * sin(ang);

    return res;
}
int main(void)
{
    polar input;
    rect answer;

    printf("Enter magnitude and angle in degrees (q tu quit): ");
    while (scanf("%lf %lf", &input.length, &input.angle) == 2)
    {
        answer = polar_to_rect(&input);
        printf("polar coord: %g %g\n", input.length, input.angle);
        printf("rectangular coord: %g %g\n", answer.x, answer.y);
        printf("You can enter again (q tu quit): ");
    }
    printf("Done.\n");

    return 0;
}

4.ANSI库这样描述clock()函数的特性:

#include <time.h>

clock_t clock (void);

这里,clock_t是定义在time.h中的类型。该函数返回处理器时间,其单 位取决于实现(如果处理器时间不可用或无法表示,该函数将返回-1)。然 而,CLOCKS_PER_SEC(也定义在time.h中)是每秒处理器时间单位的数 量。因此,两个 clock()返回值的差值除以 CLOCKS_PER_SEC得到两次调用 之间经过的秒数。在进行除法运算之前,把值的类型强制转换成double类 型,可以将时间精确到小数点以后。编写一个函数,接受一个double类型的 参数表示时间延迟数,然后在这段时间运行一个循环。编写一个简单的程序 测试该函数。

#include <stdio.h>
#include <time.h>
void delay(const double second)
{
    clock_t start = clock();
    clock_t end = clock();

    while (((double)(end - start) / CLOCKS_PER_SEC) < second)
    {
        end = clock();
    }
    printf("Delay %g seconds.\n", (double)(end - start) / CLOCKS_PER_SEC);
}
int main(void)
{
    double n;

    printf("please enter a number (<0 or q to quit): ");
    while (scanf("%lf", &n) == 1)
    {
        delay(n);
        printf("You can enter again (<0 or q to quit): ");
    }
    printf("Done.\n");

    return 0;
}

5.编写一个函数接受这些参数:内含int类型元素的数组名、数组的大小 和一个代表选取次数的值。该函数从数组中随机选择指定数量的元素,并打 印它们。每个元素只能选择一次(模拟抽奖数字或挑选陪审团成员)。另 外,如果你的实现有time()(第12章讨论过)或类似的函数,可在srand()中 使用这个函数的输出来初始化随机数生成器rand()。编写一个简单的程序测 试该函数。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#define LEN 30
#define PICK 6
void random_pick(int ar[],int picks)
{
    int count = 0;
    int i, br[LEN];

    memcpy(br, ar, LEN * sizeof(int));
    srand((unsigned int)time(0));
    printf("Pick %d numbers:\n", picks);
    while (picks > 0)
    {
        i = rand() % LEN;
        if (0 == br[i])
        {
            continue;
        }
        else
        {
            printf("%-8d", br[i]);
            br[i] = 0;
            --picks;
        }
        if (++count % 10 == 0)
        {
            putchar('\n');
        }
    }
    printf("\n");
}
int main(void)
{
    int i, ch;
    int choices[LEN];

    for (i = 0; i < LEN; i++)
    {
        choices[i] = i + 1;
    }
    do
    {
        random_pick(choices, PICK);
        printf("Can you do again (y/n)? ");
        ch = getchar();
        while (getchar() != '\n')
            continue;
    } while ('y' == ch || 'Y' == ch);
    printf("Done.\n");

    return 0;
}

6.修改程序清单16.17,使用struct names元素(在程序清单16.17后面的 讨论中定义过),而不是double类型的数组。使用较少的元素,并用选定的 名字显式初始化数组。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 40
#define SLEN 5
struct names
{
    char first[LEN];
    char last[LEN];
};
int comp(const void* p1, const void* p2)
{
    const struct names* ps1 = (const struct names*)p1;
    const struct names* ps2 = (const struct names*)p2;

    if (strcmp(ps1->last, ps2->last) != 0)
    {
        return 0;
    }
    else
    {
        return strcmp(ps1->first, ps2->first);
    }
}
void show_names(const struct names* begin, int n)
{
    const struct names* end = begin + n;

    while (begin < end)
    {
        printf("%s %s\n", begin->first, begin->last);
        ++begin;
    }
    return;
}
int main(void)
{
    struct names staff[SLEN] ={{"Francy, card"},{"Coffee, cancy"},
                            {"Stephen, lory"},{"Jack, rosery"},{"Black, clover"}};
    printf("Random list:\n");
    show_names(staff, SLEN);
    qsort(staff, SLEN, sizeof(struct names), comp);
    printf("\nSorted list:\n");
    show_names(staff, SLEN);

    return 0;
}

7.下面是使用变参函数的一个程序段:

#include

#include

#include

void show_array(const double ar[], int n);  

double * new_d_array(int n, ...);

int main() {

double * p1;

double * p2;

p1 = new_d_array(5, 1.2, 2.3, 3.4, 4.5, 5.6);

p2 = new_d_array(4, 100.0, 20.00, 8.08, -1890.0);

show_array(p1, 5);

show_array(p2, 4);

free(p1);

free(p2);

return 0; }

new_d_array()函数接受一个int类型的参数和double类型的参数。该函数 返回一个指针,指向由malloc()分配的内存块。int类型的参数指定了动态数 组中的元素个数,double类型的值用于初始化元素(第1个值赋给第1个元 素,以此类推)。编写show_array()和new_d_array()函数的代码,完成这个 程序。

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void show_array(const double ar[], int n)
{
    int i;

    printf("%d elements:\n", n);
    for (i = 0; i < n; i++)
    {
        printf("%-8g", ar[i]);
    }
    printf("\n");
}
double* new_d_array(int n, ...)
{
    int i;
    va_list ap;
    double* pt;

    va_start(ap, n);
    pt = (double*)malloc(n * sizeof(double));
    for (i = 0; i < n; i++)
    {
        pt[i] = va_arg(ap, double);
    }
    va_end(ap);
    return pt;
}
int main()
{
    double* p1;
    double* p2;

    p1 = new_d_array(5, 1.2, 2.3, 3.4, 4.5, 5.6);
    p2 = new_d_array(4, 100.0, 20.00, 8.08, -1890.0);
    show_array(p1, 5);
    show_array(p2, 4);
    free(p1);
    free(p2);

    return 0;
}

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

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

相关文章

常见的ACL攻击方式,集权设施如何防御攻击?

本文主要介绍了 WindowsAD域中基于访问控制列表&#xff08;ACL&#xff09;的攻击&#xff0c;在AD域的攻击手法中&#xff0c;基于ACL的攻击由于理解起来比较困难&#xff0c;现有的安全设备也很少有对ACL的监控&#xff0c;这种类型的攻击通常会被安全人员所忽视。 1.什么是…

[SpringBoot]创建聚合项目

首先&#xff0c;创建父级项目&#xff1a; 因为手动添加依赖&#xff0c;以下只选版本不打钩 因为父项目不写代码&#xff0c;所以删除src 调整pom.xml文件&#xff08;并刷新maven&#xff09;&#xff0c;如下&#xff1a; <?xml version"1.0" encoding&qu…

如何入门渗透测试

1. 什么是渗透测试 渗透测试就是模拟真实黑客的攻击手法对目标网站或主机进行全面的安全评估&#xff0c;与黑客攻击不一样的是&#xff0c;渗透测试的目的是尽可能多地发现安全漏洞&#xff0c;而真实黑客攻击只要发现一处入侵点即可以进入目标系统。 一名优秀的渗透测试工程…

Flink SQL之Regular Joins

1.Regular Joins&#xff08;双流join&#xff09; 双流join是最通用的联接类型&#xff08;支持 Batch\Streaming&#xff09;&#xff0c;其中任何新记录或联接两侧的更改都是可见的&#xff0c;并影响整体的Join结果。 特点&#xff1a; 对于流式查询&#xff0c;双流join…

深入分析 OpenShift 内部 DNS

深入分析 OpenShift 内部 DNS OpenShift 中的DNS 相关组件及其配置1.1 Pod 中的 DNS 配置1.2 Pod 所在宿主机上的 DNS 配置及服务1.2.1 resolv.conf 文件 DNS 配置DNS 查询流程为什么需要内部 DNS&#xff1f; 本文基于 OpenShift 3.11&#xff0c;Kubernetes 1.11 进行测试 O…

Linux服务器禁止密码登录,设置秘钥登录

生成SSH密钥 (客户机端) 执行ssh-keygen -t rsa命令创建RSA密钥对&#xff0c;执行结果如下(键入3次回车)&#xff1a; [rootnode01 .ssh]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): [回车] En…

【十五】设计模式~~~行为型模式~~~状态模式(Java)

【学习难度&#xff1a;★★★☆☆&#xff0c;使用频率&#xff1a;★★★☆☆】 4.1. 模式动机 在很多情况下&#xff0c;一个对象的行为取决于一个或多个动态变化的属性&#xff0c;这样的属性叫做状态&#xff0c;这样的对象叫做有状态的(stateful)对象&#xff0c;这样的…

向后切片,正向切片和其他形式的切片

向后切片,正向切片和其他形式的切片 向后切片Backward Slices 假设我们希望确定哪些语句影响节点 n。 这是由 n 和在 n 处引用的变量。 我们只是&#xff1a; 从 n 回溯控制和流依赖边。 我们保留由此到达的节点。 一般后向切片 通常&#xff0c;我们的切片标准是一个节点和一…

【CMake 入门与进阶(1)】一个例子搞懂什么是CMakeLists——从“Hello World”开始(附代码)

在前面两篇内容中&#xff0c;我们编写了很多示例程序&#xff0c;但这些示例程序都只有一个.c 源文件&#xff0c;非常简单。因此&#xff0c;编译这些示例代码其实都非常简单&#xff0c;直接使用 GCC 编译器编译即可&#xff0c;连 Makefile 都不需要。但是&#xff0c;在实…

中国人民大学与加拿大女王大学金融硕士项目——在职攻读金融硕士,努力迈进高阶人生

学历重要吗&#xff1f;入职门槛、晋升、考公等多方面都考核学历。学历代表的并不只是学习经历&#xff0c;也是学习能力的体现。在快速发展的社会&#xff0c;学历越高&#xff0c;学习能力越强&#xff0c;机会就越多。金融行业在职的你&#xff0c;有计划在职攻读硕士学位吗…

如何在 K3s 中使用网络策略

本文将介绍如何在示例项目中使用网络策略&#xff0c;并解释它在 K3s 中的工作原理&#xff0c;从而帮助用户提高部署的安全性。 关于 K3s 对网络策略的支持存在一个普遍的误解&#xff0c;因为 K3s 默认使用 Flannel CNI&#xff0c;而 Flannel CNI 不支持网络策略。其实&…

Docker+Jenkins+Gitee+Pipeline部署项目

1.前言 Hello&#xff0c;各位小伙伴大家好。&#x1f604; 在上一篇文章【DockerJenkinsGitee自动化部署maven项目】中&#xff0c;咱们详细介绍了如何自动化部署maven项目&#xff0c;如果说你的项目仅仅为maven项目&#xff0c;那么这种部署方式是很契合的&#xff0c;如果…

超全,Selenium4自动化测试并行测试详解,进阶之路看这篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Selenium4 自动化测…

万字解析PELT算法!

Linux是一个通用操作系统的内核&#xff0c;她的目标是星辰大海&#xff0c;上到网络服务器&#xff0c;下至嵌入式设备都能运行良好。做一款好的linux进程调度器是一项非常具有挑战性的任务&#xff0c;因为设计约束太多了&#xff1a; 它必须是公平的快速响应系统的throughp…

如何学习R-Meta分析与【文献计量分析、贝叶斯、机器学习等】多技术融合?

专题一&#xff1a;Meta分析的选题与文献计量分析CiteSpace应用 1、Meta分析的选题与文献检索 1) 什么是Meta分析 2) Meta分析的选题策略 3) 文献检索数据库 4) 精确检索策略&#xff0c;如何检索全、检索准 5) 文献的管理与清洗&#xff0c;如何制定文献纳入排除标准 6…

第一行代码 第十四章 开发酷欧天气

第14章 开发酷欧天气 在本章将编写一个功能较为完整的天气预报程序。 功能需求及技术可行性分析 在开始编码之前&#xff0c;需要先对程序进行需求分析&#xff0c;想一想酷欧天气中应该具备哪些功能。将这些功能全部整理出来&#xff1a; 可以罗列出全国所有的省、市、县&…

英飞凌 AURIX-TC3XX:QSPI通信实验

目录 AURIX-TC3XX-QSPI通信实验1.QSP简介1.1、AURIX TC3XX QSPI个数1.2、QSPI功能特点1.2.1、QSPI外设的新特性1.2.2、一些独特的特性1.2.3、支持传统的SPI特性1.2.4、四种可供用户选择的传输模式 2、具体实验操作2.1、新建工程2.2、实验一 3、域控制器中常见的SPI通信方式3.1、…

ble常见概念

0. 蓝牙一些常见概念 参考&#xff1a;https://www.bilibili.com/video/BV1ad4y1d7AM 基于ESP32来了解蓝牙协议的一些东西 蓝牙广播 包组成结构 低功耗蓝牙一共有40个信道&#xff0c;频段范围从2402Mhz-2480Mhz&#xff0c;每2Mhz一个信道&#xff0c;37 38 39 是广播信道…

基于linux的程序库文件打包和调用的实现(一)——静态库文件打包和调用

随着技术的发展&#xff0c;基于linux项目的软件代码越发复杂&#xff0c;原来一个人可以完成的软件项目&#xff0c;现在可能需要多个人合作、多个部门合作、多个企业合作&#xff0c;每个人、每个部门、每个企业可能负责部分软件模块的开发。各个软件模块在调试过程由于涉及企…

DeFi 发展沃土,Uniswap 成功“登陆” Moonbeam

作者&#xff1a;OneBlock 去年 3 月底&#xff0c;Uniswap 社区发布一项全新治理提案&#xff0c;旨在通过社区授权于 Polkadot 生态智能合约平台 Moonbeam 上部署 Uniswap V3&#xff0c;将 Uniswap 扩展至 Polkadot 生态。在这项提案中&#xff0c;Uniswap 计划除了提供流动…