您的位置:首页 > 其它

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

2017-11-06 11:24 330 查看
要求:通过连接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,在子函数内部数组的调用和使用方式。

执行前:





执行后:





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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐