C primer plus(第五版)编程练习第十五章

第一题:编写一个将二进制字符串转化为数字值的函数。也就是说,如果您有以下语句:
    char * pbin = "01001001";
那么您可以将pbin作为一个参数传送给该函数,使该函数返回一个int值25。
解:
代码如下:
#include
#include
#include
int btois(char *);
int main(void)
{
    char bin_str[8 * sizeof(int) + 1];
    int i,number;

    puts("Enter binary and see them in integers.");
    while(scanf("%s",bin_str))
    {
        for(i = 0;i < strlen(bin_str);i++)
            if(!strchr("10",bin_str[i]))
            {
                puts("wrong input");
                exit(1);
            }
        number = btois(bin_str);
        printf("%s is %d\n",bin_str,number);
    }
    puts("Bye!");

    return 0;
}

int btois(char * ps)
{
    int i;
    int n = 0;
    size_t size = strlen(ps);

    for(i = size -1;i >= 0;i--)
        n += (ps[i] - 48) * (1 << (size - 1 - i));
    return n;
}
———————————————分割线—————————————————
第二题:编写一个程序,该程序用命令行参数读取两个二进制字符串,并打印对每个数使用~运算符的结果,以及对这两个数使用&、|和^运算符的结果。使用二进制字符串形式显示结果。
解:就是进行二进制和十进制之间的转换。
代码如下:
#include
#include
#include
int btois(char * ps);
char * itobs(int n,char * ps);
void show_bstr(const char * str);
int main(int argc,char * argv[])
{
    int n1,n2,result,i;
    char bin_str[8 * sizeof(int) + 1];

    if(argc != 3)
    {
        puts("Usage:command binary1 binary2");
        exit(1);
    }
    for(i = 0;i < strlen(argv[1]);i++)
        if(!strchr("10",argv[1][i]))
        {
            puts("wrong input:binary1");
            exit(2);
        }
    for(i = 0;i < strlen(argv[2]);i++)
        if(!strchr("10",argv[2][i]))
        {
            puts("wrong input:binary2");
            exit(2);
        }

    n1 = btois(argv[1]);
    n2 = btois(argv[2]);
    result = ~n1;
    itobs(result,bin_str);
    printf("~binary1:");
    show_bstr(bin_str);
    result = ~n2;
    itobs(result,bin_str);
    printf("~binary2:");
    show_bstr(bin_str);
    result = n1 & n2;
    itobs(result,bin_str);
    printf("binary1 & binary2:");
    show_bstr(bin_str);
    result = n1 | n2;
    itobs(result,bin_str);
    printf("binary1 | binary2:");
    show_bstr(bin_str);
    result = n1 ^ n2;
    itobs(result,bin_str);
    printf("binary1 ^ binary2:");
    show_bstr(bin_str);
    return 0;
}
int btois(char * ps)
{
    int i;
    int n = 0;
    size_t size = strlen(ps);

    for(i = size -1;i >= 0;i--)
        n += (ps[i] - 48) * (1 << (size - 1 - i));
    return n;
}
char * itobs(int n,char * ps)
{
    int i;
    static int size = 8 * sizeof(int);
    for(i = size -1;i >= 0;i--,n >>= 1)
        ps[i] = (01 & n) + '0';
    ps[size] = '\0';
    return ps;
}
void show_bstr(const char * str)
{
    int i = 0;
    while(str[i])
    {
        putchar(str[i]);
        if(++i % 4 == 0 && str[i])
            putchar(' ');
    }
    putchar('\n');
}
———————————————分割线—————————————————
第三题:编写一个函数,该函数接受一个int参数,并返回这个参数中打开的位的数量。在程序中测试该函数。
解:
代码如下:
#include
int count(int n);
int main(void)
{
    int n;
    
    puts("Input a number:");
    while(scanf("%d",&n))
    {
        printf("%d open %d bits\n",n,count(n));
    }
    puts("Bye");
    return 0;
}
int count(int n)
{
    int i,j;
    static int size = 8 * sizeof(int);
    char ps[size + 1];

    for(i = size -1;i >= 0;i--,n >>= 1)
        ps[i] = (01 & n) + '0';
    ps[size] = '\0';
    for(i = 0,j = 0;i < size;i++)
        if(ps[i] == '1')
            j++;
    return j;
}
———————————————分割线—————————————————
第四题:编写一个函数,该函数接受两个int参数:一个值和一个位的位置。如果指定的位上的值是1,则该函数返回1,否则返回0。在程序中测试该函数。
解:
代码如下:
#include
int confirm(int n,int m);
int main(void)
{
    int n,m;
    
    puts("Input a number and its localtion(q to quit) :");
    while(scanf("%d %d",&n,&m) == 2 && m >= 0)
    {
        if(confirm(n,m))
            puts("it is opened.");
        else
            puts("it is closed.");
    }
    puts("Bye");
    return 0;
}
int confirm(int n,int m)
{
    int i,j;
    static int size = 8 * sizeof(int);
    char ps[size + 1];

    for(i = size -1;i >= 0;i--,n >>= 1)
        ps[i] = (01 & n) + '0';
    ps[size] = '\0';
    j = ps[size - 1 - m] - 48; 
    return j;
}
———————————————分割线—————————————————
第五题:编写一个函数,该函数将一个unsigned int 中的所有位向左旋转指定数量的位。例如,ratate_1(x,4)将x中的所有位向左移动4个位置,而且从左端丢失的位会重新出现在右端。也就是说,把从高位移出的位放入低位。在程序中测试该函数。
解:
代码如下:
#include
int ratate(int n,int m);
int main(void)
{
    int n,m;
    
    puts("Input a positive number and how many bit it move left shift (q to quit) :");
    while(scanf("%d %d",&n,&m) == 2 && m >= 0)
    {
        printf("%d left shift %d bits is %d\n",n,m,rarate(n,m));
    }
    puts("Bye");
    return 0;
}
int rarate(int n,int m)
{
    int i,j,temp;
    int result = 0;
    static int size = 8 * sizeof(int);
    char ps[size];

    for(i = size -1;i >= 0;i--,n >>= 1)
        ps[i] = (01 & n) + '0';
    for(i = 0;i < m;i++)
    {
        temp = ps[0];
        for(j = 0;j < size - 1;j++)
            ps[j] = ps[j + 1];
        ps[size - 1] = temp;
    }
    for(i = size -1;i >= 0;i--)
        result += (ps[i] - '0') * (1 << (size - 1 - i));
    return result;
}
———————————————分割线—————————————————
第六题:设计一个位字段结构用来存储以下信息:
Font ID:0到255之间的一个数
Font Size:0到127之间的一个数
Bold:off(0)或on(1)
Italic:off(0)或on(1)
Underline:off(0)或on(1)
在程序中使用这个结构来显示字体参数,并使用循环的菜单来让用户改变参数。例如,程序的一个运行示例如下:
ID SIZE ALIGNMENT B I U
1 12 left off off off 

f)change font  s)change size  a)change alignment
b)toggle bold  i)toggle italic  u)toggle underline
q)quit
s
Enter font size (0-127):36

ID SIZE ALIGNMENT B I U
1 36 left off off off 

f)change font  s)change size  a)change alignment
b)toggle bold  i)toggle italic  u)toggle underline
q)quit
a
select alignment:
l)left  c)center  r)right
r

ID SIZE ALIGNMENT B I U
1 36 right off off off 

f)change font  s)change size  a)change alignment
b)toggle bold  i)toggle italic  u)toggle underline
q)quit
i

ID SIZE ALIGNMENT B I U
1 36 right off on off 

f)change font  s)change size  a)change alignment
b)toggle bold  i)toggle italic  u)toggle underline
q)quit
q
Bye!
这个程序应该使用&操作符和合适的掩码来保证Font ID 和Font size 信息被转换到指定的范围内。
解:
代码如下:
#include
#include
#define LEFT 1
#define CENTER 2
#define RIGHT 3
#define ON 1
#define OFF 0
struct control {
    unsigned int font_id:8;
    unsigned int font_size:7;
    unsigned int alignment:2;
    unsigned int bold:1;
    unsigned int italic:1;
    unsigned int underline:1;
};
char getchoice(void);
int show(struct control c);
int main(void)
{
    struct control config  = {1,12,1,0,0,0};
    char ch;
    int n;
    char alignment;
    
    while(show(config) && (ch = getchoice()) != 'q')
    {
        switch(ch)
        {
            case 'f':printf("Enter font id (0-255):");
                        if(scanf("%d",&n))
                            config.font_id = n & 255;
                        else
                            puts("wrong input");
                        while(getchar() != '\n');
                        break;
            case 's':printf("Enter font size (0-127):");
                        if(scanf("%d",&n))
                            config.font_size = n & 127;
                        else
                            puts("wrong input");
                        while(getchar() != '\n');
                        break;
            case 'a':printf("Select alignment:\n");
                        printf("l)left  c)center  r)right\n");
                        scanf("%c",&alignment);
                        while(getchar() != '\n');
                        if(alignment == 'l')
                            config.alignment = LEFT;
                        else if(alignment == 'c')
                            config.alignment = CENTER;
                        else if(alignment == 'r')
                            config.alignment = RIGHT;
                        else
                            puts("wrong input");
                        break;
            case 'b':config.bold ^= 1;
                          break;
            case 'i':config.italic ^= 1;
                          break;
            case 'u':config.underline ^= 1;
        }
    }
    puts("Bye!");
    return 0;
}
char getchoice(void)
{
    char ch;
    
    do
    {
        puts("f)change font  s)change size  a)change alignment");
        puts("b)toggle bold  i)toggle italic  u)toggle underline");
        puts("q)quit");
        scanf("%c",&ch);
        while(getchar() != '\n');
    }while(!strchr("fsabiuq",ch) && puts("wrong choice,try again"));
    return ch;
}
int show(struct control c)
{
    printf("ID SIZE ALIGNMENT B I U\n");
    printf(" %d %d",c.font_id,c.font_size);
    if(c.alignment == 1)
        printf(" left");
    else if(c.alignment == 2)
        printf(" center");
    else
        printf(" right");
    printf(" %s",c.bold?"on":"off");
    printf(" %s",c.italic?"on":"off");
    printf(" %s\n",c.underline?"on":"off");
    puts("");
    return 1;
}
———————————————分割线—————————————————
第七题:编写一个与第六题所面熟的功能相同的程序。使用一个unsigned long来保存字体信息,使用位运算符而不是位成员来管理这些信息。
解:所有信息需要20位来保存,本人使用64位操作系统,int类型是32位,故在此使用unsigned int类型。
代码如下:
#include
#include
#define ID_MASK 0xff
#define SIZE_MASK 0x7f00
#define ALIGNMENT_MASK 0x18000
#define BOLD_MASK 0x20000
#define ITALIC_MASK 0x40000
#define UNDERLINE_MASK 0x80000
char getchoice(void);
int show(unsigned int config);
int main(void)
{
    unsigned int config = 0x8c01;
    char ch;
    unsigned int n;
    char alignment;
    
    while(show(config) && (ch = getchoice()) != 'q')
    {
        switch(ch)
        {
            case 'f':printf("Enter font id (0-255):");
                        if(scanf("%d",&n))
                            config = (config & ~ID_MASK) + n;
                        else
                            puts("wrong input");
                        while(getchar() != '\n');
                        break;
            case 's':printf("Enter font size (0-127):");
                        if(scanf("%d",&n))
                            config = (config & ~SIZE_MASK) + (n << 8);
                        else
                            puts("wrong input");
                        while(getchar() != '\n');
                        break;
            case 'a':printf("Select alignment:\n");
                        printf("l)left  c)center  r)right\n");
                        scanf("%c",&alignment);
                        while(getchar() != '\n');
                        if(alignment == 'l')
                            config = (config & ~ALIGNMENT_MASK) + (1 << 15);
                        else if(alignment == 'c')
                            config = (config & ~ALIGNMENT_MASK) + (1 << 16);
                        else if(alignment == 'r')
                            config = (config & ~ALIGNMENT_MASK) + ALIGNMENT_MASK;
                        else
                            puts("wrong input");
                        break;
            case 'b':config ^= BOLD_MASK;
                          break;
            case 'i':config ^= ITALIC_MASK;
                          break;
            case 'u':config ^= UNDERLINE_MASK;
        }
    }
    puts("Bye!");
    return 0;
}
char getchoice(void)
{
    char ch;
    
    do
    {
        puts("f)change font  s)change size  a)change alignment");
        puts("b)toggle bold  i)toggle italic  u)toggle underline");
        puts("q)quit");
        scanf("%c",&ch);
        while(getchar() != '\n');
    }while(!strchr("fsabiuq",ch) && puts("wrong choice,try again"));
    return ch;
}
int show(unsigned int config)
{
    printf("ID SIZE ALIGNMENT B I U\n");
    printf(" %d %d",config & ID_MASK,(config & SIZE_MASK) >> 8);
    if(((config & ALIGNMENT_MASK) >> 15) == 1)
        printf(" left");
    else if(((config & ALIGNMENT_MASK) >> 15) == 2)
        printf(" center");
    else
        printf(" right");
    printf(" %s",((config & BOLD_MASK) >> 17)?"on":"off");
    printf(" %s",((config & ITALIC_MASK) >> 18)?"on":"off");
    printf(" %s\n",((config & UNDERLINE_MASK) >> 19)?"on":"off");
    puts("");
    return 1;
}



























你可能感兴趣的:(C,Primer,Plus编程练习)