C primer plus 第15章编程练习

第一题:

  math库中pow的使用,整型数字转换成数字字符串可以用sprintf函数,用数字字符串计算时要注意以下

  注意点:数组中存入的是字符串,因此需要(-‘0’)来转换成整型,‘0’的ASCII码是0x30转换成十进制是48

#include<stdio.h>
#include<string.h>
#include<math.h>
#define LEN 80

char * s_gets(char * st , int n);
void bintodec(char arr[]);

int main(void)
{
    int n;
    char arr[LEN];
    char *p;
    int i;

    printf("input a Binary number:
");
    s_gets(arr,LEN);
    bintodec(arr);

    return 0;
}

void bintodec(char arr[])
{
    int i;
    int j = strlen(arr);
    int sum=0;

    printf("%d
",j);

    for(i=0;i<strlen(arr);i++)
    {
        j--;
        sum += (arr[i]-'0') * (int)pow(2,j);
    }

    printf("Decimal number is:%d
",sum);
}


char * s_gets(char * st , int n)
{
    char * ret_val ;
    char * find ;
 
    if (ret_val = fgets(st , n , stdin))
    {
        if (find = strchr(st , '
'))
            *find = '' ;
        else 
            while (getchar() != '
');
    }
 
    return ret_val ;
}

 第二题:

  头文件是#include <string.h>,如果要从数组a复制k个元素到数组b,可以这样做memcpy(b,a,sizeof(int)*k);

  strcpy和memcpy主要有以下3方面的区别:
  1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
  2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符""才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
  3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

  printf是格式化输出函数,它可以直接打印十进制,八进制,十六进制,输出控制符分别为%d, %o, %x, 但是它不存在二进制,如果输出二进制可以自建函数或者使用调用stdlib.h里面的itoa函数。
  itoa函数原型为char*iota(int value,char *string,int radix);value为被转化的整数,string为转换后储存的字符数组,radix为要转换的进制数

  void *memset(void *s, int ch, size_t n); 函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
  memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体数组进行清零操作的一种最快方法
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define LEN 80

int bintodec(char arr[]);

int main(int argc,char** argv)
{
    char arr1[LEN];
    char arr2[LEN];
    char arr3[LEN];
    char ch;

    if(argc == 4)
    {
        printf("%s %s %s %s
",argv[0],argv[1],argv[2],argv[3]);
        // printf("%u
",strlen(argv[1]));
        memcpy(arr1,argv[1],sizeof(int)*strlen(argv[1]));
        memcpy(arr2,argv[2],sizeof(int)*strlen(argv[2]));
        // puts(arr1);
        // puts(arr2);
        ch = argv[3][0];
        switch(ch)
        {
        case '1':
            itoa(~bintodec(arr1),arr3,2);//运算后以二进制存入新字符串
            puts(arr3);
            memset(arr3, 0, sizeof(arr3));//每次运算后清空字符串
            itoa(~bintodec(arr2),arr3,2);
            puts(arr3);
            memset(arr3, 0, sizeof(arr3)); 
            break;
        case '2':
            itoa(bintodec(arr1)&bintodec(arr2),arr3,2);
            puts(arr3);
            memset(arr3, 0, sizeof(arr3));
            break;
        case '3':
            itoa(bintodec(arr1)|bintodec(arr2),arr3,2);
            puts(arr3);
            memset(arr3, 0, sizeof(arr3));
            break;
        case '4':
            itoa(bintodec(arr1)^bintodec(arr2),arr3,2);
            puts(arr3);
            memset(arr3, 0, sizeof(arr3));
            break;
        }

        bintodec(arr1);
    }
    else
    {
        printf("please input like: %s 00100 10101 1
",argv[0]);
    }
    

    return 0;
}

int bintodec(char arr[])
{
    int i;
    int j = strlen(arr);
    int sum=0;

    // printf("%d
",j);

    for(i=0;i<strlen(arr);i++)
    {
        j--;
        sum += (arr[i]-'0') * (int)pow(2,j);//每次减去‘0’是因为字符串以ASCII码存储,‘0’是0X30,依次递增,通过减‘0’转换为整型
    }

    // printf("Decimal number is:%d
",sum);
    return sum;
}

 第三题:

#include<stdio.h>
#include<limits.h>

char size = CHAR_BIT*sizeof(int);//char_bit表示char中的位数

int fun(int n);

int main(void)
{
    int i;
    scanf("%d",&i);
    printf("Number of open bits:%d
",fun(i));

    return 0;
}

int fun(int n)
{
    int i;
    int j = 1,sum = 0;

    for(i=0;i<size;++i)
    {
        if(j&n)
        {
            sum++;
        }
        j<<=1;
    }
    return sum;
}

第四题:

#include<stdio.h>
#include<limits.h>

int fun(int m, int n);

int main(void)
{
    int i,j;
    scanf("%d",&i);
    scanf("%d",&j);
    printf("Value pointing to bit:%d
",fun(i,j));

    return 0;
}

int fun(int m, int n)
{
    int ret;
    int j = 1;

    j<<=(n-1);
    if(j&m)
        ret = 1;
    else
        ret = 0;
        
    return ret;
}
原文地址:https://www.cnblogs.com/cokefentas/p/12438670.html