C Primer Plus 第六版(中文版)第十五章(完美修订版)编程练习答案

news2024/9/29 7:41:29

//本博主所写的代码仅为阅读者提供参考;

//若有不足之处请提出,博主会尽其所能修改;

//附上课后编程练习题目;

//若是对您有用的话请点赞或分享提供给它人;



在这里插入图片描述

//-----------------------------------------------------------------------------
//15.9-1.c

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

int convert(const char *str);

int main(void)
{
    const char *pbin = "01001001";
    
    printf("binary %s is decimal %d\n", pbin, convert(pbin));
    //书上有误, 01001001对应的不是25而是73
    
    return 0;
}

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;
}

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//15.9-2.c

#include <stdio.h>
#include <stdlib.h>

int bstr_to_dec(const char * str);
char *itobs(int n, char *str);

int main(int argc, char *argv[])
{
    char bstr[8 * sizeof(int) + 1];
    
    if (argc != 3)
    {
        fprintf(stderr, "Usage: %s binarynum1 binarynum2\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    int v1 = bstr_to_dec(argv[1]);
    int v2 = bstr_to_dec(argv[2]);
    printf("~%s = %s\n", argv[1], itobs(~v1, bstr));
    printf("~%s = %s\n", argv[2], itobs(~v2, bstr));
    printf("%s & %s = %s\n", argv[1], argv[2], itobs(v1 & v2, bstr));
    printf("%s | %s = %s\n", argv[1], argv[2], itobs(v1 | v2, bstr));
    printf("%s ^ %s = %s\n", argv[1], argv[2], itobs(v1 ^ v2, bstr));
    
    return 0;
}

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;
}

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//15.9-3.c

#include <stdio.h>
#define TEST_NUM 13

char *itobs(int n, char *str);
int onbits(int x);

int main(int argc, char *argv[])
{
    int x = TEST_NUM;
    char bstr[8 * sizeof(int) + 1];
    
    printf("%d(%s) has %d bit on.\n", x, itobs(x, bstr), onbits(x));
    
    return 0;
}

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;
}

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//15.9-4.c

#include <stdio.h>
#define TEST_NUM 13

int test_bit(int x, int pos);
char *itobs(int n, char *str);

int main(int argc, char *argv[])
{
    int x = TEST_NUM;
    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;
}

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;
}

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//15.9-5.c

#include <stdio.h>
#define TEST_NUM 13
#define ROTATE_BITS 4

char *itobs(int n, char *str);
unsigned int rotate_l(unsigned int n, unsigned int b);

int main(int argc, char *argv[])
{
    unsigned int val = TEST_NUM;
    unsigned int rot = rotate_l(val, ROTATE_BITS); //可更改宏定义改变反转的位; 
    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;
}

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));
}

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//15.9-6.c

#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);
int get_first(void);
int get_choice(void);
void change_font(void);
void change_size(void);
void change_alignment(void);
void change_toggle(int ch);

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;
}

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;
    }
}

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//15.9-7.c

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

typedef unsigned long ulong;
static ulong ft = 0x00001180; //题目初始状态; 
//从右往左数, 第1位表示U, 第2位表示I, 第3位表示B, 第4至5位表示ALIGNMENT, 第6至第12位表示SIZE, 第13至20位表示ID
const char *state[4] = {"off", "on"};
const char *alignment[7] = {"left", "center", "right"};

void eatline(void);
int get_first(void);
int get_choice(void);
void change_font(void);
void change_size(void);
void change_alignment(void);
void change_toggle(int ch);

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;
}

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);
        }
    }
}

//-----------------------------------------------------------------------------

//---------------------------2022年12月30日----------------------------

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

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

相关文章

操作系统——进程与线程

进程与线程一、进程的概念1、进程和进程实体2、进程的组织方式3、进程的特征二、进程的状态与转换1、进程的状态2、进程的转换三、进程控制1、定义2、原语控制①创建原语②撤销原语③阻塞原语④唤醒原语⑤切换原语四、进程通信方法一&#xff1a;共享内存方法二&#xff1a;管道…

惠州学院采购JKTD-1000型铁电材料测试仪

惠州学院采购JKTD-1000型铁电材料测试仪 JKTD-1000型铁电材料测试仪 模式测量电路&#xff0c;与传统的 Sawyer-Tawer-模式相比&#xff0c;此电路取消了外接电容&#xff0c;可减小寄生元件的影响。此电路的测试精度取决于积分器积分电容的精度&#xff0c;减少了对测试的影响…

软件测试概念篇

目录 1.软件测试 2.需求 2.1 用户需求 2.2 软件需求 2.3 测试人员眼里的需求 2.4 需求的重要性 3.测试用例 3.1 什么是测试用例 3.2 为什么有测试用例 4.BUG 4.1 BUG的概念 4.2 如何描述一个BUG 4.3 如何定义BUG的优先级 4.4 BUG的生命周期 5.软件生命周期 6. …

RocketMQ 基本概念与工作原理

一、基本概念 消息(Message) 消息&#xff08;Message&#xff09;就是要传输的信息。一条消息必须有一个主题&#xff08;Topic&#xff09;&#xff0c;主题可以看做是你的信件要邮寄的地址。 主题(Topic) Topic表示一类消息的集合&#xff0c;每个主题包含若干条消息&am…

A机器连接同一局域网下的B机器的虚拟机中的mysql

一 背景描述 1.1 需求描述 B机器windows10 的机器ip为&#xff1a; 172.16.71.13 在其上的虚拟机中安装了mysql&#xff0c;虚拟机的ip为 192.168.152.141 。 A机器的ip为&#xff1a;172.16.71.14 &#xff1b; 需求&#xff1a; A机器想访问 B机器172.16.71.13 这台机…

aardio - 【库】libxl库,一个dll操作excel

经常用到excel操作&#xff0c;也有几个现成的库能实现我需要的功能&#xff0c;但用起来总是感觉不顺手。 于是便抽了两天时间&#xff0c;在aaz.libxl库的基础上&#xff0c;按照我的使用习惯进行了修改。 以后再也不用为操作excel发愁啦。 下载地址&#xff1a;http://che…

广州车展|埃安超跑Hyper GT登场,给年少有为者的时代献礼

近年来&#xff0c;随着中国新能源的技术日趋成熟&#xff0c;中国新能源车开始蓬勃发展&#xff0c;逐渐占据了可观的市场份额&#xff0c;并朝着高端化迈进。有一个有趣的现象&#xff1a;希望进军豪华纯电市场的中国车企&#xff0c;几乎都会与特斯拉对标。然而&#xff0c;…

2023新一代设备管理系统助力企业高效化巡检

设备数量和种类都比较多的情况下&#xff0c;工厂设备管理员的工作往往压力巨大&#xff0c;因为生产环环相扣&#xff0c;每一个环节如果出现问题&#xff0c;都会影响到生产。如果隐患不能及时处理&#xff0c;会影响设备的正常和安全运转&#xff0c;严重的会波及到周围相关…

SpringBoot+Shiro+JWT+Mybatis-Plus搭建admin-shiro管理系统

1、项目背景 从零开始搭建一个项目骨架&#xff0c;最好选择合适&#xff0c;熟悉的技术&#xff0c;并且在未来易拓展&#xff0c;适合微服务化体系等。所以一般以Springboot作为我们的框架基础&#xff0c;这是离不开的了。 然后数据层&#xff0c;我们常用的是Mybatis&…

佳创视讯亮相第十八届文博会,VR直播全民化备受瞩目

2022年12月28日,第十八届中国(深圳)国际文化产业博览交易会正式面向公众开放。本届文博会采取线下为主、线上同步的方式,强化线上线下交互联动,旨在推动中华文化产业高质量发展,加强对外文化合作交流。展会共吸引2532家政府组团、文化机构和企业线下参展,870家机构和企业线上参…

SpringSecurity(二十四)--OAuth2:使用JWT和加密签名(下)非对称密钥加密

一、前言 由于上文对称密钥涉及到的内容比较多&#xff0c;所以这一节的非对称密钥加密拆开成这一节单独讲解。 所以大家尽量先阅读完上一章的内容后再浏览这一章内容会更好。 二、使用通过JWT和非对称密钥签名的令牌 本节将实现OAuth2身份验证的一个示例&#xff0c;其中授…

自定义事件实现rpc的调用C++和蓝图实现举例

参考视频&#xff1a;https://www.youtube.com/watch?vGcZQ2o6LpDI 1.自定义事件的方式实现rpc run on server 修改角色的最大速度&#xff0c;方框1&#xff0c;让客户端先行&#xff0c;速度直接改变&#xff1b;然后方框2&#xff0c;告知服务器&#xff0c;自己的速度已经…

双脚在路上,钢笔在手里,想法在脑中,2023年CSDN将在心头

☔️&#xff08;一&#xff09;行走过的道路 一年的时间说长不长&#xff0c;说短不短&#xff0c;所渡过时光的长短在于你是否留意你曾走过的路。 &#x1f434;① 记得2022年初我所许下的flag&#xff0c;是要在CSDN平台上运用今年一年的时间撰写超50篇的技术文章&#xff0…

MySQL-运算符详解

1. 算数运算符 运算符名称作用示例加法计算两个值或表达式的和SELECT A B-减法计算两个值或表达式的差SELECT A - B*乘法计算两个值或表达式的乘积SELECT A * B/或DIV除法计算两个值或表达式的商SELECT A / B%或MOD求模(求余)计算两个值或表达式的余数SELECT A % B 2. 比较运…

vue导入私有组件和注册全局组件和props自定义属性

目录先下载并配置插件导入私有组件注册全局组件props自定义属性使用先下载并配置插件 导入的时候需要路径,有个符号,但不能提示路径,需要手打路径,会发现很麻烦,这时候可以通过vscode插件来解决 vscode搜索Path Autocomplete 配置插件,点击插件设置—扩展设置,点开任意一个set…

CRM客户关系管理:赢得和留住客户的指南

客户管理是一个涉及协调和管理客户与企业之间互动的过程。它对企业的商誉及其保留和获得新客户的能力有重大影响。 一般来说&#xff0c;客户管理可以分解成四个不同的部分&#xff1a; - 了解客户的需求以及他们想从你这里得到什么 - 满足这些要求并对他们的询问提供充分的…

EIZO船舶触摸屏维修T1502-B

EIZO船舶触摸屏使用注意事项&#xff1a; 1 由于显示器电子零件的性能需要约30分钟才能稳定,因此在电源开启之后,应调整显示器30分钟以上。 2为了降低因长期使用而出现的发光度变化以及保持稳定的发光度,建议您以较低亮度使用显示器。 3 当显示器长期显示一个图像的情况下再…

传统卷积与Transformers 优缺点对比

近两年Transformer如日中天&#xff0c;刷爆各大CV榜单&#xff0c;但在计算机视觉中&#xff0c;传统卷积就已经彻底输给Transformer了吗&#xff1f; 回答1 作者&#xff1a;DLing 链接&#xff1a;https://www.zhihu.com/question/531529633/answer/2819350360 看在工业界还…

【云原生进阶之容器】第二章Controller Manager原理--client-go剖析

2 Client-go Kubernetes 官方从 2016 年 8 月份开始,将 Kubernetes 资源操作相关的核心源码抽取出来,独立出来一个项目 client-go,Kubernetes中使用client-go作为Go语言的官方编程式交互客户端库,提供对api server服务的交互访问。对于k8s的二次开发,熟练掌握client-go是十…

大胆预测,2023年Android 行业什么技术最重要~

随着Android 时代的发展&#xff0c;在2022的这一年里&#xff0c;感觉自己经历了许多&#xff0c;从年初到年底&#xff0c;见证了不是互联网公司的裁员、优化、毕业、输送人才……等一些列的操作&#xff0c;估计有些人和我一样对Android未来感到茫然&#xff0c;不少人可能会…