• 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;
    }
  • 相关阅读:
    python 迭代器
    python 语言特性
    JavaScript 【语句】for-in语句
    Vue实例-创建第一个VUE应用
    【安装】Vue( 直接使用<script>方式引入、CDN方式引入 )
    到某个目录下新建文件
    NVM 安装( Windows)
    尾调用
    JavaScript 【函数表达式】私有变量
    JavaScript 【函数表达式】模仿块级作用域
  • 原文地址:https://www.cnblogs.com/cokefentas/p/12438670.html
Copyright © 2020-2023  润新知