C Primer Plus(第六版)15.9 编程练习 第7题

这篇文章展示了如何在C语言中使用位操作符对unsignedlong类型的变量进行操作,以控制字体的ID、大小、对齐方式、粗体、斜体和下划线,通过用户输入进行动态修改菜单选项。
摘要由CSDN通过智能技术生成

//

//  main.c

//  15.9-7

//

//  Created by cjm on 2024/2/5.

//猜测题意是用一个unsigned long 64个位去储存全部信息,一共需要20位即可

//00000000 0000000     00    0 0 0

//   ID      size  alignment B I U

#include <stdio.h>

#include <stdbool.h>

#include <string.h>

#include <limits.h>

#define MASK_U  1           //001

#define MASK_I  2           //010

#define MASK_B  4           //100

#define MASK_A  0x18        //11000

#define MASK_S  0xfe0       //111111100000

#define MASK_ID 0xff000     //11111111000000000000

void show_menu(unsigned long font_n);

int main()

{

    printf("The number of bits in an unsigned long: %ld\n", CHAR_BIT * sizeof(unsigned long));//确认unsigned long的位数

    unsigned long font_n;

    

    

    char ch;

    font_n=0b00000001000110001000;//初始化为题目的初始状态

    int id,size = 0;

    char alig;

    show_menu(font_n);

    while(scanf("%c",&ch)!=EOF&&ch!='q')

    {

        while(getchar()!='\n')

            continue;

        switch(ch)

        {

            case 'f':

                puts("Enter font ID(0-255)");

                scanf("%d", &id);

                font_n=font_n&(~MASK_ID);

                font_n=font_n+(id<<12);

                show_menu(font_n);

                break;

            case 's':puts("Enter font size(0-127)");

                scanf("%d",&size);

                font_n=font_n&(~MASK_S);

                font_n=font_n+(size<<5);

                show_menu(font_n);

                break;

            case 'a':

                puts("Select alignment:\nl) left\tc)center\tr)right\n");

                scanf("%c",&alig);

                while(getchar()!='\n')

                    continue;

                font_n=font_n&(~MASK_A);//清空位

                if(alig=='l')

                    font_n=font_n+8;

                else if(alig=='r')

                    font_n=font_n+16;

                show_menu(font_n);

                break;

            case 'b':

                font_n^=MASK_B;

                show_menu(font_n);

                break;

            case 'i':

                font_n^=MASK_I;

                show_menu(font_n);

                break;

            case 'u':

                font_n^=MASK_U;;

                show_menu(font_n);

                break;

            default:;break;

        }

        while(getchar()!='\n')

            continue;

    }

    puts("Bye!\n");

    return 0;

}

void show_menu(unsigned long font_n)

{

    char ali[7];

    if(((font_n>>3)&(MASK_A>>3))==0)

        strcpy(ali,"center");

    else if (((font_n>>3)&(MASK_A>>3))==1)

        strcpy(ali,"left");

    else if(((font_n>>3)&(MASK_A>>3))==2)

        strcpy(ali,"right");

    printf("ID\tSIZE\tALIGNMENT\tB\tI\tU\n");

    printf("%lu\t%lu\t\t%s\t\t%s\t%s\t%s \n\n",

           (font_n>>12)&(MASK_ID>>12),

           (font_n>>5)&(MASK_S>>5),ali,

           ((font_n>>2)&(MASK_B>>2)) == true?"on":"off",

           ((font_n>>1)&(MASK_I>>1)) == true?"on":"off",

           (font_n&MASK_U) == true?"on":"off");

    printf("f)change font\ts)change size\ta)change alignment\nb)toggle bold\ti)toggle italic\tu)toggle underline\nq)quit\n");

}

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值