我必须创建一个解决以下门电路的程序。但是,在程序执行过程中出了点问题,因为系统提示我输入八次而不是六次。请仅提供涉及主要功能更改的解决方案,而不提供其他解决方案。
这是我必须解决的电路问题图:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int (*CallBack)(int, int);
typedef struct gate {
CallBack f;
struct gate * in1 ;
struct gate * in2 ;
} Gate;
int getinput() {
int x;
scanf("%d", &x);
return x;
}
int myand (int a, int b) {
return a * b;
}
int myor (int a, int b) {
return a + b>0;
}
int mynand (int a, int b) {
return !(a * b);
}
int mynor (int a, int b) {
return a + b<=0;
}
int myxor (int a, int b) {
return a!=b;
}
Gate * creategate(CallBack f) {
Gate * temp ;
temp = malloc(sizeof (Gate));
temp->f = f;
temp->in1 = NULL;
temp->in2 = NULL;
return temp;
}
int eval(Gate *x) {
int a, b;
if (x->in1 != NULL)
a = eval(x->in1);
if (x->in2 != NULL)
b = eval(x->in2);
if (x->in1==NULL && x->in2 == NULL)
return (x->f)(0,0);
else
return (x->f)(a,b);
}
int main( ) {
Gate * gate1_ptr, * gate2_ptr, * gate3_ptr, * gate4_ptr, * gate5_ptr, * gate6_ptr;
Gate * a_ptr, * b_ptr, * c_ptr, * d_ptr, * e_ptr, * f_ptr;
gate1_ptr = creategate(mynor);
gate2_ptr = creategate(myand);
gate3_ptr = creategate(myor);
gate4_ptr = creategate(mynand);
gate5_ptr = creategate(myxor);
gate6_ptr = creategate(myor);
printf("Enter six inputs, split by enter:\n");
a_ptr = creategate(getinput);
b_ptr = creategate(getinput);
c_ptr = creategate(getinput);
d_ptr = creategate(getinput);
e_ptr = creategate(getinput);
f_ptr = creategate(getinput);
gate1_ptr->in1 = a_ptr;
gate1_ptr->in2 = b_ptr;
gate2_ptr->in1 = c_ptr;
gate2_ptr->in2 = d_ptr;
gate3_ptr->in1 = e_ptr;
gate3_ptr->in2 = f_ptr;
gate4_ptr->in1 = gate1_ptr;
gate4_ptr->in2 = gate2_ptr;
gate5_ptr->in1 = gate2_ptr;
gate5_ptr->in2 = gate3_ptr;
gate6_ptr->in1 = gate4_ptr;
gate6_ptr->in2 = gate5_ptr;
printf("%d", eval(gate6_ptr));
return 0;
}
答案 0 :(得分:2)
每次尝试评估“输入”项之一时,都会要求用户输入。由于gate2_ptr
由两个门引用,因此其值将被评估两次,并且其每个输入将被评估两次。当您运行程序时,这将导致两个额外的输入提示。
您应该在创建输入时而不是在评估输入时要求输入值。
不相关,但是某些编译器会为creategate(getinput)
发出警告,因为creategate
期望一个指向带有两个int
参数的函数的指针,而getinput
则不期望。在这种情况下,这是无害的,因为多余的参数将被getinput
忽略并被调用者删除,但这确实表示潜在的有缺陷的设计。 (如果getinput
需要更多的参数,例如3个int
,则会收到一组不同的警告并引入更严重的问题。)