Почему меня просят ввести больше раз, чем я ожидаю? - PullRequest
0 голосов
/ 11 июня 2019

Я должен создать программу, которая решает следующую схему ворот.Однако во время выполнения программы что-то идет не так, потому что мне предлагается ввести восемь раз вместо шести.Пожалуйста, предоставляйте только те решения, которые связаны с изменениями в основной функции, а не с другими.

Вот схема схемы, которую я должен решить:
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 Ответ

2 голосов
/ 11 июня 2019

Каждый раз, когда вы пытаетесь оценить один из ваших «вводных» терминов, вы запрашиваете ввод у пользователя. Поскольку на gate2_ptr ссылаются два гейта, его значение оценивается дважды, а каждый из его входов оценивается дважды. Это приводит к появлению двух дополнительных входных подсказок при запуске программы.

Вы должны запрашивать входные значения при создании входных данных, а не при их оценке.

Не связано, но некоторые компиляторы выдают предупреждение для creategate(getinput), потому что creategate ожидает указатель на функцию, которая принимает два параметра int, а getinput не ожидает ни одного. В этом случае это безвредно, поскольку дополнительные параметры будут игнорироваться getinput и удаляться вызывающей стороной, но это представляет потенциально ошибочную конструкцию. (Если getinput будет ожидать больше параметров - например, 3 int с - вы получите другой набор предупреждений и создадите более серьезные проблемы.)

...