C Primer Plus (第六版) 第十五章_编程练习答案

no1.c

//编写一个函数,把二进制字符串转换为一个数值.例如,有下面语句:
//char * pbin = "01001001" ;
//那么把pbin作为参数传递给函数后,他应该返回一个int类型的值25;

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

# define SIZE 33

int get_bstr(char * st , int n);
char * del_space(char * st);
int btoi(char * st);

int main(void)
{
	char binstr[SIZE];
	int num ;

	printf("请输入二进制数(输入空行退出)\n");
	while (get_bstr(binstr , SIZE) && binstr[0]) 
	{
		num = btoi(del_space(binstr));
		printf("%s 是十进制是 %d\n" , binstr , num);
		printf("请输入下一个二进制数(输入空行退出)\n");
	}

	return 0 ;
}

//从标准输入里读取二进制字符串,给出字符串数组地址,和读取长度,读取n-1个二进制字符.自动添加'\0'
//返回成功读取的字符个数,读取失败返回0,遇到不是二进制字符,或者达到指定个数,都将停止读取
int get_bstr(char * st , int n)
{
	char ch ; 
	int i = 0;

	for (i = 0 ; i < n - 1 && (ch = getchar()) != '\n' && (isdigit(ch) || isspace(ch)) ; i++)
		st[i] = ch ;
	st[i] = '\0' ;

	if (ch != '\n')
		while (getchar() != '\n') ;

	return i ;
}

//删除字符串中的空格
char * del_space(char * st)
{
	int i = 0 ;
	char * find = NULL ;

	while (find = strchr(st , ' '))
	{
		for (i = 0 ; find[i] ; i++)
			find[i] = find[i + 1] ;
	}

	return st ;
}

//核心函数,将二进制字符串转换为十进制
int btoi(char * st)
{
	int number = 0 ;

	for (int i = 0 ; st[i] ; i++)
	{
		number <<= 1 ;
		number |=  (st[i] - '0');
	}

	return number ;
}

no2.c

//编写一个程序,通过命令行参数读取两个二进制字符串,对这两个二进制数使用~运算符,&运算符,|运算符
//和^运算符,并以二进制字符串形式打印结果(如果无法使用命令行环境 , 可以通过交互式让程序读取字符串)
# include <stdio.h>
# include <limits.h>
# include <string.h>
# include <stdlib.h>
# include <ctype.h>

# define SIZE 33

int str_bstr(char * st);
char * del_space(char * st);
int btoi(char * st);
void print_bstr(unsigned int n);

//int main(int argc , char * argv[])
int main(void)
{
	char argv[3][SIZE] = {"a.exe" , "a0101b" , "341010"};
	int num1 , num2 ;

	/*
	if (argc != 3)
	{
		fputs("参数错误", stderr);
		exit(1);
	}
	*/

	str_bstr(argv[1]) ;
	str_bstr(argv[2]) ;
	
	num1 = btoi(del_space(argv[1]));
	num2 = btoi(del_space(argv[2]));

	printf("~%s == " ,argv[1]);
	print_bstr(~num1);
	putchar('\n');

	printf("~%s == " ,argv[2]);
	print_bstr(~num2);
	putchar('\n');

	printf("%s & %s == " , argv[1] , argv[2]);
	print_bstr(num1 & num2);
	putchar('\n');

	printf("%s | %s == " , argv[1] , argv[2]);
	print_bstr(num1 | num2);
	putchar('\n');

	printf("%s ^ %s == " , argv[1] , argv[2]);
	print_bstr(num1 ^ num2);
	putchar('\n');

	return 0 ;
}

int str_bstr(char * st)
{
	int cur = 0 ; 			//当前索引位置
	char ch ; 

	for (int i = 0 ; st[i]; i++)
		if((isdigit(st[i]) && st[i] < '2') || isspace(st[i]))
		{
			ch = st[cur] ;
			st[cur] = st[i] ;
			st[i] = ch ;

			cur++ ;
		}

	st[cur] = '\0' ;

	return cur ;
}

//删除字符串中的空格
char * del_space(char * st)
{
	int i = 0 ;
	char * find = NULL ;

	while (find = strchr(st , ' '))
	{
		for (i = 0 ; find[i] ; i++)
			find[i] = find[i + 1] ;
	}

	return st ;
}

//核心函数,将二进制字符串转换为十进制
int btoi(char * st)
{
	int number = 0 ;

	for (int i = 0 ; st[i] ; i++)
	{
		number <<= 1 ;
		number |=  (st[i] - '0');
	}

	return number ;
}

//使用递归方式使他反序打印字符
void print_bstr(unsigned int n)
{
	static long loop = 0;

	//如果形参是0,直接输出0,不进行递归
	if (!loop && !n)
	{
		putchar('0');
		return ;
	}

	if (n)
	{
		loop++ ;
		print_bstr(n / 2) ;
	}
	else
		return  ;

	putchar('0' + (n % 2));
	if ((--loop % 4)== 0)
		putchar(' ');
}

no3.c

//编写一个程序,接受一个int类型的参数,并返回该参数中打开位置的数量,在一个程序中测试该函数

# include <stdio.h>

int count_openbit(unsigned int n);

int main(void)
{
	int num ;

	puts("请输入您要查看打开位总数的整数:(q 退出)");
	while (scanf(" %d" , &num))
	{
		while (getchar() != '\n') ;

		printf("%d 中打开位一共有%d个\n" , num , count_openbit(num));
		puts("请输入您要查看打开位总数的整数:(q 退出)");
	}

	return 0 ;
}

int count_openbit(unsigned int n)
{
	int count = 0 ;

	while (n)
	{
		count += (n & 1) ;
		n >>= 1 ;
	}
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值