为什么提示输入的次数比预期的多?

时间:2019-06-11 15:17:46

标签: c logic logical-operators

我必须创建一个解决以下门电路的程序。但是,在程序执行过程中出了点问题,因为系统提示我输入八次而不是六次。请仅提供涉及主要功能更改的解决方案,而不提供其他解决方案。

这是我必须解决的电路问题图:
Circuit problem I have to solve

#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; 
}

1 个答案:

答案 0 :(得分:2)

每次尝试评估“输入”项之一时,都会要求用户输入。由于gate2_ptr由两个门引用,因此其值将被评估两次,并且其每个输入将被评估两次。当您运行程序时,这将导致两个额外的输入提示。

您应该在创建输入时而不是在评估输入时要求输入值。

不相关,但是某些编译器会为creategate(getinput)发出警告,因为creategate期望一个指向带有两个int参数的函数的指针,而getinput则不期望。在这种情况下,这是无害的,因为多余的参数将被getinput忽略并被调用者删除,但这确实表示潜在的有缺陷的设计。 (如果getinput需要更多的参数,例如3个int,则会收到一组不同的警告并引入更严重的问题。)