第一题 问题 A: 简单运算器-74LS181
参考代码(C语言):
#include <stdio.h>
#include <stdlib.h>
int main() {
char a[8],b[8],result[8];
for (int i = 0; i < 8; i++) //取值
scanf("%c",&a[i]);
getchar();
for (int i = 0; i < 8; i++)
scanf("%c",&b[i]);
char flag = '0'; //进位
for (int i = 7; i >= 0; i--)
{
if( a[i] == '1' && b[i] == '1' ){ //都为一
if ( flag == '1'){ //判断是都有进位情况,一下以此类推
flag = '1';
result[i] = '1';
continue;
}
flag = '1';
result[i] = '0';
}
if( (a[i] == '1' && b[i] == '0') || (a[i] == '0' && b[i] == '1') ){ //仅有一个为一
if ( flag == '1'){
flag = '1';
result[i] = '0';
continue;
}
flag = '0';
result[i] = '1';
}
if( a[i] == '0' && b[i] == '0' ){ //都为0
if ( flag == '1'){
flag = '0';
result[i] = '1';
continue;
}
flag = '0';
result[i] = '0';
}
}
for (int i = 0; i < 8; i++){
printf("%c",result[i]);
}
/*system("pause");*/
return 0;
}
第二题 问题 B: 算术逻辑运算器-74LS181
参考代码(C语言):
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
//a,b为八位二进制数; operator为运算符; result为结果;
char a[8],b[8],operator_,result[8];
for (int i = 0; i < 8; i++) //取值
scanf("%c",&a[i]);
getchar(); //过度空格
for (int i = 0; i < 8; i++)
scanf("%c",&b[i]);
getchar();
scanf("%c",&operator_);
//方法调用
if( operator_ == '+' ){ //加运算 00000001 0000000
char flag = '0';//进位
for (int i = 7; i >= 0; i--)
{
if( a[i] == '1' && b[i] == '1' ){ //都为一
if ( flag == '1'){ //判断是都有进位情况,一下以此类推
flag = '1';
result[i] = '1';
continue;
}
flag = '1';
result[i] = '0';
}
if( (a[i] == '1' && b[i] == '0') || (a[i] == '0' && b[i] == '1') ){ //仅有一个为一
if ( flag == '1'){
flag = '1';
result[i] = '0';
continue;
}
flag = '0';
result[i] = '1';
}
if( a[i] == '0' && b[i] == '0' ){ //都为0
if ( flag == '1'){
flag = '0';
result[i] = '1';
continue;
}
flag = '0';
result[i] = '0';
}
}
}
else if( operator_ == '-' ){ //减运算
//采用反码二进制减法。
int n = 0 ,m = 0;
for(int i = 0 ; i < 8 ; i++){
if( b[i] == '1')
b[i] = '0';
else
b[i] = '1';
}
b[0] = '1';
char temp[] = {'0','0','0','0','0','0','0','1'};
//加法 +1
char flag = '0';//进位
for (int i = 7; i >= 0; i--)
{
if( b[i] == '1' && temp[i] == '1' ){ //都为一
if ( flag == '1'){ //判断是都有进位情况,一下以此类推
flag = '1';
result[i] = '1';
continue;
}
flag = '1';
result[i] = '0';
}
if( (b[i] == '1' && temp[i] == '0') || (b[i] == '0' && temp[i] == '1') ){ //仅有一个为一
if ( flag == '1'){
flag = '1';
result[i] = '0';
continue;
}
flag = '0';
result[i] = '1';
}
if( b[i] == '0' && temp[i] == '0' ){ //都为0
if ( flag == '1'){
flag = '0';
result[i] = '1';
continue;
}
flag = '0';
result[i] = '0';
}
}
for(int i = 0 ; i < 8 ; i++)
b[i] = result[i];
for (int i = 7; i >= 0; i--)
{
if( a[i] == '1' && b[i] == '1' ){ //都为一
if ( flag == '1'){ //判断是都有进位情况,一下以此类推
flag = '1';
result[i] = '1';
continue;
}
flag = '1';
result[i] = '0';
}
if( (a[i] == '1' && b[i] == '0') || (a[i] == '0' && b[i] == '1') ){ //仅有一个为一
if ( flag == '1'){
flag = '1';
result[i] = '0';
continue;
}
flag = '0';
result[i] = '1';
}
if( a[i] == '0' && b[i] == '0' ){ //都为0
if ( flag == '1'){
flag = '0';
result[i] = '1';
continue;
}
flag = '0';
result[i] = '0';
}
}
}
else if( operator_ == '&' ){ //与运算
//两数对应的二进制数位相与,两数位都为1时,该结果位才为1,否则为0。
for( int i = 0 ; i < 8 ; i++){
if( a[i] == b[i] && a[i] == '1')
result[i] = '1';
else
result[i] = '0';
}
}
else if( operator_ == '|' ){ //或运算
//两数对应的二进制数位相或,两数位有一个1,该结果位就为1。
for( int i = 0 ; i < 8 ; i++){
if( a[i] == '1' || b[i] == '1' )
result[i] = '1';
else
result[i] = '0';
}
}
else if( operator_ == '^' ){ //异或运?
//两数对应的二进制数位相异或,两数位不同结果位为1,否则为0。
for( int i = 0 ; i < 8 ; i++){
if( (a[i] == '1' && b[i] == '0') || (a[i] == '0' && b[i] == '1') )
result[i] = '1';
else
result[i] = '0';
}
}
else
return 0;
//打印
for(int i = 0 ; i < 8 ; i++){
printf("%c",result[i]);
}
return 0;
}
第三题 问题 C: 8位存储器功能选择-6264
参考代码(C语言):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int n = 0;
scanf("%d",&n);
char str[n][5];
getchar(); //过度回车
for (int i = 0; i < n; i++)
gets(str[i]);
for (int i = 0; i < n; i++)
{
if( strcmp( str[i], "1010" ) == 0){ //读出
printf("r");
}
else if( strcmp(str[i], "0100" ) == 0 || ( strcmp( str[i], "0000" ) == 0)){ //写出
printf("w");
}
else
printf("NULL");
if(i != (n-1))
printf("\n");
}
return 0;
}
第四题 问题 D: 8位存储器-6264
参考代码(C语言):
#include<stdio.h>
#include<malloc.h>
#include<string.h>
struct out {
char cunchu[10];
};
struct index {
char value[10]; //数据值
char address[10]; //地址值
}index[256]; // 8位 * 8位
//1存0读
//二进制循环+1
char* add1(char a[])
{
int i;
for (i = 7; i >= 0; i--) {
if (a[i] == '0') {
a[i] = '1';
break;
}
else {
a[i] = '0';
continue;
}
}
return a;
}
//将二进制转化为十进制
int str(char a[]) {
int i, sum = 0, n = 1;
for (i = 7; i >= 0; i--) {
if (i != 7){
n = n * 2;
}
sum += (int)(a[i]-'0')*n;
}
return sum;
}
int main()
{
int i, j, k = 0, x;
int N;
char v[9], a[9];
for (i = 0; i < 256; i++) {
strcpy(index[i].value,"00000000");
strcpy(index[i].address,"00000000");
if (i > 0) {
strcpy(index[i].address,add1(index[i-1].address));
}
}
scanf("%d", &N);
if (N == 0) {
return 0;
}
struct out * put=(struct out *)malloc(N*(sizeof(struct out)));
for (i = 0; i < N; i++) {
scanf("%d", &x);
if (x == 1) {
scanf("%s%s", a, v);
for (j = 0; j < 256; j++) {
if (str(a) == j) {
strcpy(index[j].value, v);
break;
}
else continue;
}
}
else {
scanf("%s", a);
for (j = 0; j < 256; j++) {
if (str(a) == j) {
strcpy(put[k].cunchu,index[j].value);
k++;
break;
}
else continue;
}
}
}
for (i = 0; i < k; i++) {
if(i==k-1) printf("%s", put[i].cunchu);
else printf("%s\n", put[i].cunchu);
}
return 0;
}
第五题 问题 E: 简单微控制器
参考代码(C语言):
#include<stdio.h>
#include<math.h>
struct memory{
int data;
}_mem_[1024];
int _binary_decimal(int num)
{
int digit,result=0,i=0;
while (1)
{
if(num == 0) break;
digit = num % 10;
num /= 10;
result += digit * pow(2, i);
i++;
}
return result;
}
int pri(int result[])
{
int i = 0;
for (i = 7; i >= 0; i--) printf("%d",result[i]);
}
void _decimal_binary(int result)
{
int binary[8] = {0};
int i = 0;
while(result != 0)
{
binary[i] = result % 2;
result /= 2;
i++;
}
pri(binary);
}
int main()
{
int count, i,choice;
int number01, number02;
int address;
int address_,data;
int flag = 0; //记录要输出个数
int a_temp[1024]={0};
_mem_[0].data = 64;
_mem_[1].data = 136;
_mem_[2].data = 74;
_mem_[16].data = 1;
_mem_[17].data = 2;
_mem_[18].data = 3;
scanf("%d", &count);
for (i = 0; i < count; i++)
{
scanf("%d",&choice);
switch (_mem_[_binary_decimal(choice)].data)
{
case 64:
case 68:{
scanf("%d %d",&address_,&data);
_mem_[_binary_decimal(address_)].data = _binary_decimal(data);
break;
}
case 74:{
scanf("%d", &address);
a_temp[flag] = _mem_[_binary_decimal(address)].data;
flag++;
break;
}
case 136:{
scanf("%d ", &number01);
scanf("%d", &number02);
a_temp[flag] = _binary_decimal(number01) + _binary_decimal(number02);
flag++;
break;
}
default:break;
}
}
for (int i = 0; i < flag ; i++)
{
_decimal_binary(a_temp[i]);
if (i + 1 < flag)
printf("\n");
}
return 0;
}
第六题 问题 F: 16位计算机机器内码及转换
参考代码(C语言):
#include<stdio.h>
#include<string.h>
int main(){
char erjinzhi[16][5] = {"0000","0001","0010","0011",
"0100","0101","0110","0111",
"1000","1001","1010","1011",
"1100","1101","1110","1111"};
char shiliujinzhi[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int n = 0;
scanf("%d",&n);
getchar();
char str[n][17];
for(int i = 0 ; i < n ; i++)
gets(str[i]);
for(int i = 0 ; i < n ; i++){
if( strlen(str[i]) != 16 ){ //16->2
for(int j = 0 ; j < strlen(str[i]) ; j++){ //遍历某行字符
for(int k = 0 ; k < 16 ; k++){ //寻找值
if(str[i][j] == shiliujinzhi[k]){
printf("%s",erjinzhi[k]);
}
}
}
printf("\n");
}
else{ //2->16
char bit[5] = {""};
for(int j = 0 ; j < strlen(str[i]) ; j += 4){ //遍历某行字符
strncpy(bit,str[i]+j,4);
for(int k = 0 ; k < 16 ; k++){ //寻找值
if( strcmp(erjinzhi[k],bit) == 0 ){ //erjinzhi[k] == bit
printf("%c",shiliujinzhi[k]);
}
}
}
printf("\n");
}
}
return 0;
}