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

news2024/11/26 12:42:56

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

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

1.编写一个函数,把二进制字符串转换为一个数值。例如,有下面的语 句:

char * pbin = "01001001";

那么把pbin作为参数传递给该函数后,它应该返回一个int类型的值25。

#include <stdio.h>
#include <string.h>
int convert(const char* str)
{
    int sum = 0, len = strlen(str);
    for (int i = len - 1, exp = 1; i >= 0; --i, exp *= 2)
    {
        sum += (str[i] - '0') * exp;
    }
    return sum;
}
int main(void)
{
    const char* pbin = "01001001";

    printf("binary %s is decimal %d\n", pbin, convert(pbin));

    return 0;
}

2.编写一个程序,通过命令行参数读取两个二进制字符串,对这两个二 进制数使用~运算符、&运算符、|运算符和^运算符,并以二进制字符串形 式打印结果(如果无法使用命令行环境,可以通过交互式让程序读取字符 串)。

#include <stdio.h>
#include <stdlib.h>
int bstr_to_dec(const char* str)
{
    int val = 0;
    while (*str)
    {
        val = val * 2 + (*str++) - '0';
    }
    return val;
}
char* itobs(int n, char* str)
{
    int sz = 8 * sizeof(int);
    for (int i = sz - 1; i >= 0; --i, n >>= 1)
    {
        str[i] = (n & 1) + '0';
    }
    str[sz] = '\0';
    return str;
}
int main(int argc, char* argv[])
{
    char bstr[8 * sizeof(int) + 1];
    char str1[20] = {0};
    char str2[20] = { 0 };
    
    printf("请输入两个字符串:");
    scanf("%s%s", str1, str2);

    int v1 = bstr_to_dec(str1);
    int v2 = bstr_to_dec(str2);
    printf("~%s = %s\n", str1, itobs(~v1, bstr));
    printf("~%s = %s\n", str2, itobs(~v2, bstr));
    printf("%s & %s = %s\n", str1, str2, itobs(v1 & v2, bstr));
    printf("%s | %s = %s\n", str1, str2, itobs(v1 | v2, bstr));
    printf("%s ^ %s = %s\n", str1, str2, itobs(v1 ^ v2, bstr));

    return 0;
}

3.编写一个函数,接受一个 int 类型的参数,并返回该参数中打开位的 数量。在一个程序中测试该函数。

#include <stdio.h>
char* itobs(int n, char* str)
{
    int sz = 8 * sizeof(int);
    for (int i = sz - 1; i >= 0; --i, n >>= 1)
    {
        str[i] = (n & 1) + '0';
    }
    str[sz] = '\0';
    return str;
}
int onbits(int x)
{
    int sum = 0;
    for (int i = 8 * sizeof(int) - 1; i >= 0; --i)
    {
        sum += (x >> i) & 1;
    }
    return sum;
}
int main(int argc, char* argv[])
{
    int x = 11;
    char bstr[8 * sizeof(int) + 1];

    printf("%d(%s) has %d bit on.\n", x, itobs(x, bstr), onbits(x));

    return 0;
}

4.编写一个程序,接受两个int类型的参数:一个是值;一个是位的位 置。如果指定位的位置为1,该函数返回1;否则返回0。在一个程序中测试 该函数。

#include <stdio.h>
int test_bit(int x, int pos)
{
    return (x >> pos) & 1;
}
char* itobs(int n, char* str)
{
    int sz = 8 * sizeof(int);
    for (int i = sz - 1; i >= 0; --i, n >>= 1)
    {
        str[i] = (n & 1) + '0';
    }
    str[sz] = '\0';
    return str;
}
int main(int argc, char* argv[])
{
    int x = 11;
    int sz = 8 * sizeof(int);
    char bstr[8 * sizeof(int) + 1];

    printf("%d(%s):\n", x, itobs(x, bstr));
    for (int i = sz - 1; i >= 0; --i)
    {
        printf("The position %d is %d\n", i + 1, test_bit(x, i));
    }

    return 0;
}

5.编写一个函数,把一个 unsigned int 类型值中的所有位向左旋转指定数 量的位。例如,rotate_l(x, 4)把x中所有位向左移动4个位置,而且从最左端 移出的位会重新出现在右端。也就是说,把高阶位移出的位放入低阶位。在 一个程序中测试该函数。

#include <stdio.h>
char* itobs(int n, char* str)
{
    int sz = 8 * sizeof(int);
    for (int i = sz - 1; i >= 0; --i, n >>= 1)
    {
        str[i] = (n & 1) + '0';
    }
    str[sz] = '\0';
    return str;
}
unsigned int rotate_l(unsigned int n, unsigned int b)
{
    static const int size = 8 * sizeof(int);
    b %= size;
    return (n << b) | (n >> (size - b));
}
int main(int argc, char* argv[])
{
    unsigned int val = 11;
    unsigned int rot = rotate_l(val, 4);
    char bstr1[8 * sizeof(int) + 1];
    char bstr2[8 * sizeof(int) + 1];

    printf("%u rotated is %u.\n", val, rot);
    printf("%s rotated is %s.\n", itobs(val, bstr1), itobs(rot, bstr2));

    return 0;
}

6.设计一个位字段结构以储存下面的信息。

字体ID:0~255之间的一个数;

字体大小:0~127之间的一个数;

对齐:0~2之间的一个数,表示左对齐、居中、右对齐;

加粗:开(1)或闭(0);

斜体:开(1)或闭(0);

在一个程序中使用该结构来打印字体参数,并使用循环菜单来让用户改 变参数。例如,该程序的一个运行示例如下:

该程序要使用按位与运算符(&)和合适的掩码来把字体ID和字体大小 信息转换到指定的范围内。

#include <stdio.h>
#include <ctype.h>
#include <string.h>

typedef unsigned int uint;
typedef struct
{
    uint id : 8;
    uint sz : 7;
    uint at : 2;
    uint b : 1;
    uint i : 1;
    uint u : 1;
} font;

static font ft = { 1, 12, 0, 0, 0, 0 };
const char* state[4] = { "off", "on" };
const char* alignment[7] = { "left", "center", "right" };
void eatline(void)
{
    while (getchar() != '\n')
        continue;
}
int get_first(void)
{
    int ch;

    do
    {
        ch = getchar();
    } while (isspace(ch));
    eatline();

    return ch;
}
int get_choice(void)
{
    int ch;

    printf("ID    SIZE    ALIGNMENT      B       I       U\n");
    printf("%-7u%-9u%-12s", ft.id, ft.sz, alignment[ft.at]);
    printf("%-8s%-8s%-8s\n", state[ft.b], state[ft.i], state[ft.u]);
    printf("f) change font        s) change size        a) change alignment\n");
    printf("b) toggle bold        i) toggle italic      u) toggle underline\n");
    printf("q) quit\n");

    while (ch = get_first(), NULL == strchr("fsabiuq", ch))
    {
        printf("Please enter with f, s, a, b, i, u or q: ");
    }
    return ch;
}
void change_font(void)
{
    int ch;
    uint id;

    printf("Enter font id (0-255): ");
    while (scanf("%u", &id) != 1)
    {
        while ((ch = getchar()) != '\n')
        {
            putchar(ch);
        }
        printf(" is not a id.\n");
        printf("Please enter a number such as 0, 5 or 255: ");
    }
    ft.id = id & 0XFF;
}
void change_size(void)
{
    int ch;
    uint sz;

    printf("Enter font sz (0-127): ");
    while (scanf("%u", &sz) != 1)
    {
        while ((ch = getchar()) != '\n')
        {
            putchar(ch);
        }
        printf(" is not a size.\n");
        printf("Please enter a number such as 0, 5 or 127: ");
    }
    ft.sz = sz & 0x7F;
}
void change_alignment(void)
{
    int ch;

    printf("Select alignment:\n");
    printf("l) left    c) center    r) right\n");
    while (ch = get_first(), NULL == strchr("lcr", ch))
    {
        printf("Please enter with l, c or r: ");
    }
    ft.at = (ch == 'l' ? 0 : ch == 'c' ? 1 : 2);
}
void change_toggle(int ch)
{
    if (ch == 'b')
    {
        ft.b ^= 1;
    }
    else if (ch == 'i')
    {
        ft.i ^= 1;
    }
    else
    {
        ft.u ^= 1;
    }
}
int main(void)
{
    int ch;

    while ((ch = get_choice()) != 'q')
    {
        switch (ch)
        {
        case 'f':
        {
            change_font();
            break;
        }
        case 's':
        {
            change_size();
            break;
        }
        case 'a':
        {
            change_alignment();
            break;
        }
        case 'b':
        case 'i':
        case 'u':
        {
            change_toggle(ch);
            break;
        }
        }
        putchar('\n');
    }
    printf("Bye!\n");

    return 0;
}

7.编写一个与编程练习 6 功能相同的程序,使用 unsigned long 类型的变 量储存字体信息,并且使用按位运算符而不是位成员来管理这些信息。

#include <stdio.h>
#include <ctype.h>
#include <string.h>
typedef unsigned long ulong;
static ulong ft = 0x00001180;
const char* state[4] = { "off", "on" };
const char* alignment[7] = { "left", "center", "right" };
void eatline(void)
{
    while (getchar() != '\n')
        continue;
}
int get_first(void)
{
    int ch;

    do
    {
        ch = getchar();
    } while (isspace(ch));
    eatline();

    return ch;
}
int get_choice(void)
{
    int ch;

    printf("ID    SIZE    ALIGNMENT      B       I       U\n");
    printf("%-7u%-9u%-12s", (ft >> 12) & 0XFF, (ft >> 5) & 0x7F, alignment[(ft >> 3) & 0x03]);
    printf("%-8s%-8s%-8s\n", state[(ft >> 2) & 1], state[(ft >> 1) & 1], state[ft & 1]);
    printf("f) change font        s) change size        a) change alignment\n");
    printf("b) toggle bold        i) toggle italic      u) toggle underline\n");
    printf("q) quit\n");

    while (ch = get_first(), NULL == strchr("fsabiuq", ch))
    {
        printf("Please enter with f, s, a, b, i, u or q: ");
    }
    return ch;
}
void change_font(void)
{
    int ch;
    ulong id;

    printf("Enter font id (0-255): ");
    while (scanf("%lu", &id) != 1)
    {
        while ((ch = getchar()) != '\n')
        {
            putchar(ch);
        }
        printf(" is not a id.\n");
        printf("Please enter a number such as 0, 5 or 255: ");
    }
    id &= 0XFF, id <<= 12;
    for (int i = 12; i < 20; ++i)
    {
        ft &= ~(ulong)(1 << i);
    }
    ft |= id;
}
void change_size(void)
{
    int ch;
    ulong sz;

    printf("Enter font sz (0-127): ");
    while (scanf("%lu", &sz) != 1)
    {
        while ((ch = getchar()) != '\n')
        {
            putchar(ch);
        }
        printf(" is not a size.\n");
        printf("Please enter a number such as 0, 5 or 127: ");
    }
    sz &= 0X7F, sz <<= 5;
    for (int i = 5; i < 12; ++i)
    {
        ft &= ~(ulong)(1 << i);
    }
    ft |= sz;
}
void change_alignment(void)
{
    int ch;

    printf("Select alignment:\n");
    printf("l) left    c) center    r) right\n");
    while (ch = get_first(), NULL == strchr("lcr", ch))
    {
        printf("Please enter with l, c or r: ");
    }
    ft &= ~(ulong)(1 << 3), ft &= ~(ulong)(1 << 4);
    ft = ft | (ch == 'c' ? (ulong)(1 << 3) : ch == 'r' ? (ulong)(1 << 4) : 0);
}
void change_toggle(int ch)
{
    if (ch == 'b')
    {
        if (ft & 0x04)
        {
            ft &= ~(ulong)(0x04);
        }
        else
        {
            ft |= (ulong)(0x04);
        }
    }
    else if (ch == 'i')
    {
        if (ft & 0x02)
        {
            ft &= ~(ulong)(0x02);
        }
        else
        {
            ft |= (ulong)(0x02);
        }
    }
    else
    {
        if (ft & 0x01)
        {
            ft &= ~(ulong)(0x01);
        }
        else
        {
            ft |= (ulong)(0x01);
        }
    }
}
int main(void)
{
    int ch;

    while ((ch = get_choice()) != 'q')
    {
        switch (ch)
        {
        case 'f':
        {
            change_font();
            break;
        }
        case 's':
        {
            change_size();
            break;
        }
        case 'a':
        {
            change_alignment();
            break;
        }
        case 'b':
        case 'i':
        case 'u':
        {
            change_toggle(ch);
            break;
        }
        }
        putchar('\n');
    }
    printf("Bye!\n");

    return 0;
}

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

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

相关文章

串口通信简介

1. 数据通信的基础概念 1.1 数据通信方式 按数据通信方式分类&#xff0c;可分为串行通信和并行通信两种。串行和并行的对比如下图所示&#xff1a; 串行通信的基本特征是数据逐位顺序依次传输&#xff0c;优点是传输线少、 布线成本低 、 灵活度高等优点&#xff0c;一般用…

docker架构速看(2)-镜像

docker架构细看(2)-镜像 ​ 上一章讲了Docker服务端的启动&#xff0c;这一章我们来看Docker中的镜像,需要对容器镜像分层存储&#xff0c;容器存储驱动有一定了解&#xff0c;参考 容器技术原理(一)&#xff1a;从根本上认识容器镜像 ​ Docker篇之镜像存储-OverlayFS和联合…

JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO

JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO 这是一篇总结文章。 文章目录 JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO1、学习技术的梳理1.1、jdbc的引入1.2、ResultSet[结果集]1.3API小结 2、数据库连接池3、Apache公司的DBUtils工具-BasicDAO…

在页面上画一个三角形然后点击内部触发事件

在HTML页面上创建一个canvas元素。使用JavaScript绘制三角形并将其填充。您可以使用canvas的API来绘制形状&#xff0c;例如beginPath&#xff08;&#xff09;和lineTo&#xff08;&#xff09;等。将一个事件监听器绑定到canvas元素上&#xff0c;以便在单击三角形时触发事件…

Rust每日一练(Leetday0017) 字母异位词分组、幂函数、N皇后

目录 49. 字母异位词分组 Group Anagrams &#x1f31f;&#x1f31f; 50. 幂函数 Pow(x, n) &#x1f31f;&#x1f31f; 51. N 皇后 N-Queens &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日…

chatgpt赋能python:Python代码输出666——让你快速入门Python编程

Python代码输出666——让你快速入门Python编程 引言 Python是一种面向对象、解释型计算机程序设计语言。Python广泛应用于Web开发、科学计算、数据分析及人工智能等领域&#xff0c;具有优雅、明确、简单的特点&#xff0c;而且学习起来十分容易。如果你是一名初学者&#xf…

chatgpt赋能python:Python修改信息的方法和应用

Python修改信息的方法和应用 Python是一种简单易学、高效、功能强大的编程语言&#xff0c;被广泛应用于各种领域。其中&#xff0c;修改信息是Python最常用的功能之一。无论是在数据分析、网络爬虫还是Web开发中&#xff0c;我们都需要通过Python对数据进行修改、更新和删除等…

Jetson nano之ROS入门 - - 机器人建模与仿真

文章目录 前言一、URDF建模1. URDF语法详解a. robotb. linkc. joint 2. URDF机器人建模实操 二、Xacro宏优化1、 Xacro宏语法详解2、 Xacro建模实操 三、Rviz与Gazebo仿真1、Gazebo集成URDF建模语法基础2、Gazebo集成URDF实操 总结 前言 在ROS中&#xff0c;机器人建模和仿真是…

Spring(四)基于xml的自动装配

自动装配&#xff1a;根据指定的策略&#xff0c;在IOC容器中匹配某一个bean,自动为指定的bean中所依赖的类类型或接口类型属性赋值。 首先我们来熟悉三层架构的创建过程&#xff1a; 三层架构为controller层&#xff0c;service层&#xff0c;dao层。 在service层里面创建ser…

ShareX_一款好用的截图工具安装- Window

择心】向大家介绍and安装ShareX ShareX 免费、开源、轻量多区域截图无缝处理截图屏幕录制、文件共享各种实用工具&#xff08;如拾色器&#xff0c;屏幕拾色器&#xff0c;尺子&#xff0c;图像编辑器&#xff0c;图像合并&#xff0c;图像分割器&#xff0c;生成图像缩略图&am…

mysql学+练

从开始到放弃&#xff01; 开始 mysql -uroot -p123456退出命令 exit 或者 quit注释 # show databases; 单行注释 -- show databases; 单行注释 /* 多行注释 show databases; */DDL操作数据库 创建 /* 方式1 直接指定数据库名进行创建 */ CREATE DATABASE db1; /* 方式2 …

TerminalWorks TSPrint/TSScan/TSWebCam Crack

/ 远程桌面打印软件&#xff0c;TerminalWorks TSPrint Server/Client 从远程服务器打印到本地打印机的 简单方法 TSPrint 为您提供了一个简单的远程桌面打印软件&#xff0c;以及使 Windows 终端服务操作更容易的附加工具。有选择地启用或禁用功能&#xff0c;以便您可以完全…

Unity刚体

1、Dynamic&#xff1a;动态类型 受重力和力的影响移动和旋转 Material&#xff1a; 物理材质&#xff0c;在刚体上设置了物理材质&#xff0c;如果子物体有碰撞器但是没有设置材质则会通用刚体的物理材质 如果不设置&#xff0c;将使用在Physics 2D窗口中设置的默认材质(Physi…

python day1 函数

文章目录 前言一、python函数二、定义函数三、函数返回值四、实例五、变量作用域六、参数扩展1、默认值参数2、顺序参数&#xff0c;关键词参数3、可变参数4、可变关键词参数5、解包操作 七、函数类型的参数八、高阶函数九、匿名函数十、递归 前言 看深度学习的代码时&#xff…

SO21434 持续进行的网络安全(五)

目录 一、概要 二、目标 三、网络安全监控 3.1 输入 3.1.1 先决条件 3.1.2 进一步支持信息 3.2 要求和建议 3.3 输出 四、网络安全事件评估 4.1 输入 4.1.1 先决条件 4.1.2 进一步支持信息 4.2 要求和建议 4.3 输出 五、漏洞分析 5.1 输入 5.1.1 先决条件 5.…

Sentinel如何使用滑动窗口进行限流和降级,请看这篇文章分享

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将详细介绍如何Sentinel如何使用滑动窗口进行限流和降级&#xff0c;后续文章将详细介绍其他知识。 如果文章有什么需要改进的地方还请大佬不吝赐教&#x1f44f;…

环境感知算法——3.PSMNet基于Kitti数据集训练

1. 前言 PSMNet的核心思想是通过金字塔结构来捕捉不同尺度的特征信息&#xff0c;从而提高视差估计的精度。其亮点在于&#xff1a;&#xff08;1&#xff09;使用了金字塔形的卷积神经&#xff08;SPP module&#xff09;网络来提取不同尺度的特征信息&#xff1b;&#xff0…

【UR机械臂ros通讯前的示教器网络配置】

1. 前言 欢迎大家阅读2345VOR的博客【D435i深度相机YOLO V5结合实现目标检测】&#x1f973;&#x1f973;&#x1f973;2345VOR鹏鹏主页&#xff1a; 已获得CSDN《嵌入式领域优质创作者》称号&#x1f47b;&#x1f47b;&#x1f47b;&#xff0c;座右铭&#xff1a;脚踏实地&…

《新程序员005:开源深度指南新金融背后的科技力量》

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰来写书评啦&#xff0c;尽管再忙&#xff0c;也不能不读书&#xff0c;下面&#xff0c;就让小雅兰来带你们走进《新程序员005&#xff1a;开源深度指南&新金融背后的科技力量》这本书的世界吧&#xff01;&#…

安科瑞医用隔离电源系统在浙江某医院项目中的应用

【摘要】介绍该三级乙等综合医院采用安科瑞医用隔离电源系统&#xff0c;使用分体配电柜安装方式&#xff0c;从而实现将TN系统转化为IT系统&#xff0c;以及系统绝缘情况监测。 【关键词】医用隔离电源系统&#xff1b;IT系统&#xff1b;绝缘情况监测&#xff1b;三级乙等综合…