题目:
每个学生利用 C 语言独自完成设计一个 8 位加法器,模拟电路形式,计算只用非与或(!, &&,‖)三种逻辑运算实现。
(C 语言的布尔数据类型:bool,参考: https://www.javatpoint.com/c-boolean)
要求:
输入:两个加数(8 位的二进制数)
输出:加数的和(8 位或者 9 位的二进制数)
原理:
半加器:
全加器:
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 8 //宏定义,便于更改求不同为二进制数的和
void Array_creat(char *array, int n, int m); //将从键盘上输入的二进制数赋给数组
int Half_Adder(char *x, char *y, int *s); //半加器
void Full_Adder(char *x, char *y, int *s, int *c); //全加器
void show(int *s); //输出两个二进制数的和
int main()
{
char x[SIZE+1], y[SIZE+1]; //采用字符数组来接收二进制数
int s[SIZE+1] = {0}; //用于存放两个二进制数各个位上的和
int c[SIZE] = {0}; //用于存放两个二进制数各个位上的进制数
char ch = 'y'; //用于判断是否继续循环
while(ch == 'y')
{
Array_creat(x, 1, SIZE);
Array_creat(y, 2, SIZE);
Full_Adder(x, y, s, c);
printf("两个二进制数相加的和为:");
show(s);
printf("\n");
printf("********************************************************\n");
printf("\n");
printf("按y继续,按任意键结束:");
scanf("%c",&ch);
getchar();
}
return 0;
}
void Array_creat(char *array, int n, int m)
{
int judge = 1; //用来判断输入的二进制数是否正确
int i;
char ch; //储存接受的字符
printf("输入第%d个%d位的二进制数: ", n, m);
for(i = 0, ch = '\0'; ch != '\n'; i++)
{
ch = getchar();
if(i < SIZE)
{
if(ch == '0' || ch == '1') ; //判断输入的二进制数是否是0或1,同时也判断输入的二进制位数是否达到要求,是则执行空格语句
else
{
judge = 0;
continue;
}
}
if((i > SIZE)) //判断输入的二进制位数是否错误
{
judge = 0;
continue;
}
if(ch == '\n' || i == SIZE) //遇到回车或到达数组最后一个元素,存入'\0'
{
array[i] = '\0';
continue;
}
array[i] = ch;
}
while(judge == 0)
{
judge = 1;
printf("输入有错误,请重新输入: ");
for(i = 0, ch = '\0'; ch != '\n'; i++)
{
ch = getchar();
if(i < SIZE)
{
if(ch == '0' || ch == '1') ;
else
{
judge = 0;
continue;
}
}
if(i > SIZE)
{
judge = 0;
continue;
}
if(ch == '\n' || i == SIZE)
{
array[i] = '\0';
continue;
}
array[i] = ch;
}
}
}
int Half_Adder(char *x, char *y, int *s) //半加器
{
int carry;
carry = (*x-'0') && (*y-'0');
*s = ((*x-'0') || (*y-'0')) && !carry;
return carry;
}
void Full_Adder(char *x, char *y, int *s, int *c) //全加器
{
int length = strlen(x);
int i = length-1;
c[i] = Half_Adder(&x[i], &y[i], &s[i+1]);
for(i--; i >= 0; i--)
{
s[i+1] = ((x[i]-'0') && (y[i]-'0') && c[i+1]) || ((x[i]-'0') && !(y[i]-'0') && !c[i+1]) || (!(x[i]-'0') && (y[i]-'0') && !c[i+1]) || (!(x[i]-'0') && !(y[i]-'0') && c[i+1]);
c[i] = ((x[i]-'0') && (y[i]-'0') && c[i+1]) || ((x[i]-'0') && (y[i]-'0') && !c[i+1]) || ((x[i]-'0') && !(y[i]-'0') && c[i+1]) || (!(x[i]-'0') && (y[i]-'0') && c[i+1]);
}
s[i+1] = c[i+1]; //将最后一个进制数赋给s的最高位数,即s0 = c0
}
void show(int *s) //输出
{
if(s[0])
{
printf("%d",s[0]);
}
else
{
printf(" "); //目的使输出的二进制数和跟输入的二进制数对齐
}
for(int i = 1; i < SIZE+1; i++)
{
printf("%d",s[i]);
}
printf("\n");
}
特点说明 :
1.字符串的形式接收输入的二进制数,解决整数第一位不为0的情况;
2.宏定义二进制位数,修改宏定义数值即可计算不同位数的二进制数相加;
3.使用getchar()来接收字符,解决数组越界隐患,也避免手动设计程序去刷新缓存区。