16位加法器和字符数组调试时的一些问题

要求:通过连接16个1位加法器而形成1个16位的加法器,我们会要求用户输入两个16进制数来验证加法器的功能。

1,我以前的答案:

 

#include<stdio.h>
void readinput(char str_1[], char str_2[], int num_1[], int num_2[]);
void operation(int num_1[],int num_2[],int outpr[]);
void main(void)
{
	char str_1[17];
	char str_2[17];
	int num_1[16];
	int num_2[16];
	int outpr[16];
	gets_s(str_1);
	gets_s(str_2);
	readinput(str_1,str_2,num_1,num_2);
	operation(num_1, num_2,outpr);
	for (int i = 0; i <= 15; i++)
	{
		printf("%d",outpr[i]);
	}
}
void readinput(char str_1[], char str_2[], int num_1[], int num_2[])
{
	for (int i = 15; i >= 0; i--)
	{
		num_1[i] = str_1[i] - '0';
		num_2[i] = str_2[i] - '0';
	}
}
void operation(int num_1[],int num_2[],int outpr[])
{
	int carry = 0, standard,real_num;
	for (int i = 15; i >= 0; i--)
	{
		real_num = num_1[i] + num_2[i] + carry;
		if (real_num == 0 || real_num == 1)
		{
			standard = real_num;
			outpr[i] = standard;
			carry = 0;
		}
		else if (real_num == 2)
		{
			standard = 0;
			outpr[i] = standard;
			carry = 1;
		}
		else
		{
			standard = 1;
			outpr[i] = standard;
			carry = 1;
		}
	}
}

 

思想:把输入的字符型的数组转化为整数型的数组,然后对这两个个整数型的数组进行if判定,如果相加结果为0,1,2,3会怎样。

2,标准答案:

 

#include<stdio.h>
void adder1bit(char x, char y, char carryIn, char *sum, char *carryOut);
void adder16bit(char x[], char y[], char answer[]);
void readinput(char in[]);
void main()
{
	int i;
	char dummy;
	char inputX[16];
	char inputY[16];
	char answer[17];
	printf("Enter 2 16-bit binary numbers:\n");
	readinput(inputX);

	scanf("%c", &dummy);
	readinput(inputY);
	adder16bit(inputX,inputY,answer);
	printf("The sum is:");
	for (i = 16; i >= 0; i--)
	{
		printf("%d",answer[i]);
	}
	printf("\n");
}
void readinput(char in[])
{
	int i;
	char bit;

	for (i = 15; i >= 0; i--)
	{
		scanf("%c",&bit);
		in[i] = bit - '0';
	}
}
void adder16bit(char x[], char y[], char answer[])
{
	int i;
	char cin, cout, sum;

	cin = 0;
	for (i = 0; i < 16; i++)
	{
		//这里将子函数内的局部参数也取出指针赋到子函数里面。
		adder1bit(x[i], y[i], cin, &sum, &cout);
		cin = cout;
		answer[i] = sum;
	}
	answer[16] = cout;
}
void adder1bit(char x, char y, char carryIn, char *sum, char *carryOut)
{
	*sum = (x ^ y) ^ carryIn;
	*carryOut = x & y | carryIn & (x ^ y);
}

 

思想:把输入的字符型数组不转化成整数型数组,用数字逻辑的方法进行运算而不是我的那个if判断,注意其子函数里面调用子函数的方法和子函数调用子函数是指针的妙用。

3,关于调试时数组的显示。

a,首先,这子函数中调用数组的方式和它调试时的显示

执行后,

 总结:数组调试时的显示方式是:地址+数组储存的内容。

b,在子函数内部数组的调用和使用方式。

执行前:

执行后:

总结:关于数组的这个调用方式也是正确的:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值