CPrimer Plus第6版第十五章编程练习答案(C语言)(自学记录)

本文是CPrimer Plus第6版第十五章的编程练习解答记录,涵盖了从第一题到第七题的详细解题过程,通过实例展示了C语言中按位操作的应用。
摘要由CSDN通过智能技术生成

第一题

#define _CRT_SECURE_NO_WARNINGS
//第十五章,编程练习题,第一题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int printStrInt(char* str);
char* fget_s(char* st, int n);
int main(void)
{
   
	int ch;
	char str[100];
	printf("请输入一个二进制字符串:");
	fget_s(str, 100);
	ch=printStrInt(str);
	printf("输入的字符串%s\n值为:%d\n", str, ch);
	return 0;
}
//求值函数
int printStrInt(char* str)
{
   
	int i;
	int len;
	int wei = 1;	//值
	int sum=0;		//总值
	if (!(len = strlen(str)))
	{
   
		fprintf(stderr, "长度为0");
		return 0;
	}
	for (i = len-1; i >= 0; i--, wei <<= 1)
	{
   
		if (str[i] == '1')
			sum += wei;
		else if (str[i] == '0')
			;
		else
		{
   
			fprintf(stderr, "输入的是二进制字符串,不符合规则");
			exit(EXIT_FAILURE);
		}
	}
	//sum^=80;
	return sum;
}
char* fget_s(char* st,int n)
{
   
	char* find;
	char* str_val;
	str_val = fgets(st, n, stdin);
	if (str_val)
	{
   
		find = strchr(st, '\n');
		if (find)
			*find = '\0';
		else
			while (getchar() != '\n')
				continue;
	}
	return str_val;
}

这题按照例子中的传递"01001001"(73)应该在函数中可以用一个按位取反的运算与"01010000"(80)运算可的返回值25,

第二题

#define _CRT_SECURE_NO_WARNINGS
//第十五章,编程练习题,第二题
//命令行参数读取两个二进制字符串,使用运算符,并以二进制打印结果
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ZERO '0'
#define ONE '1'
int main(int argc, char* argv[])
{
   
	int count, i;
	unsigned int  wei = 1;
	unsigned int  num;
	unsigned int  sum = 0;
	unsigned int zongSum[2];
	if (argc != 3)
	{
   
		fprintf(stderr, "命令行参数不正确,请从新输入:");
		exit(EXIT_FAILURE);
	}
	for (count = 1; count < argc; count++)
	{
   
		num = strlen(argv[count]);
		for (i = num - 1, sum = 0, wei = 1; i >= 0; i--)
		{
   
			if (argv[count][i] == ZERO)
				;
			else if (argv[count][i] == ONE)
				sum += wei;
			else
				continue;
			wei <<= 1;
		}
		zongSum[count - 1] = sum;
	}
	printf("输入的字符串为\"%s\",\"%s\",转换为数值为%u,%u,\n使用~运算符为%u,%u\n",
		argv[1], argv[2], zongSum[0], zongSum[1], ~zongSum[0], ~zongSum[1]);
	printf("使用&运算符为%u\n", zongSum[0] & zongSum[1]);
	printf("使用|运算符为%u\n", zongSum[0] | zongSum[1]);
	printf("使用^运算符为%u\n", zongSum[0] ^ zongSum[1]);
	return 0;
}

第三题

#define _CRT_SECURE_NO_WARNINGS
//第十五章,编程练习题,第三题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int puts_wei(int num);
int main(void)
{
   
	int a = 15;
	int num;
	num=puts_wei(a);
	printf("%d", num);
	return 0;
}

int puts_wei(int num)
{
   
	int  wei = 1;
	int i;
	for (i = 0; num >= 1; num >>= 1)
	{
   
		(wei& num) == 1 ? i++ : i;
	}
	return i;
}

第四题

#define _CRT_SECURE_NO_WARNINGS
//第十五章,编程练习题,第四题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int puts_wei(int num, int wei);
int main(void)
{
   
	int a, b;
	int i;
	printf("请输入值:");
	scanf("%d", &a);
	printf("请输入位数(0-31)之间:");
	scanf
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值