2016-11-17 3 views
1

So versuche ich, ein Programm zu machen, das mathematische Operationen basierend auf Benutzereingaben ausführt, aber ich stoße auf ein Problem mit dem Versuch, den mathematischen Operator basierend auf dem zu setzen, was sie geben.Verwenden einer Funktion anstelle eines Operators

Funktion:

const operator(int val) 
{ 
    if (val == 1) 
    { 
    return +; 
    } 
    if (val == 2) 
    { 
    return -; 
    } 
} 

Mit einem Haupt-Code sucht so etwas wie dies

scanf("%d", val) 
output = 4 operator(val) 2 
printf("%d", output) 

Gibt es eine variable Art, die ich anstelle einem Betreiber verwenden kann? Wenn nicht, gibt es eine Möglichkeit, eine Variable/Funktion auf ein definiertes Makro zu verweisen?

Zum Beispiel:

#define plus + 

dann das Makro im Code verweisen?

Schließlich bin mir bewusst, dass ich haben könnte, wenn Fälle für jeden Eingang, aber das ist wie schlecht für etwas skaliert,

output = 2 operator(val) 5 operator(val) 7 operator(val) 3 

die 64 erfordern würde, wenn Aussagen Ich denke, es funktioniert.

Vielen Dank für das Lesen, ich bin am Ende meiner Weisheit.

+5

Sie können nicht in C. '#define Plus +' nicht tun diese Art von Unsinn, es macht Ihr Programm schwer zu lesen. –

+0

@MichaelWalz Können Sie näher darauf eingehen? Gibt es eine Möglichkeit, die mathematischen Funktionen ohne große Mengen von if-Anweisungen auszuführen? – Warior4356

+1

Sie könnten eine Zeichenfolge nehmen und analysieren, um den Operator zwischen den Operanden zu finden. – George

Antwort

5

Was Sie tun können, ist die Verwendung von Funktionszeigern.

Lässt Sie sagen sich auf ganze Zahlen beschränken und addieren/subtrahieren für dieses Beispiel:

int add(int a, int b) 
{ 
    return a + b; 
} 

int subtract(int a, int b) 
{ 
    return a - b; 
} 

// without typedef, the signature of get_operator would be really messy 
typedef int (*arithmetic_func)(int,int); 

arithmetic_func get_operator(int val) 
{ 
    if (val == 1) 
    { 
     return &add; 
    } 
    if (val == 2) 
    { 
     return &subtract; 
    } 
    return NULL; // what to do if no function matches? 
} 

Statt output = 4 operator(val) 2 können Sie schreiben:

output = get_operator(val)(4, 2) 

Was dort passiert, ist, dass die get_operator(val) Funktion Aufruf gibt einen Funktionszeiger an eine tatsächliche arithmetische Funktion zurück. Dann wird diese eigentliche arithmetische Funktion mit den Parametern (4, 2) als Parameter aufgerufen.

+2

Für die Liebe zur Verschleierung verwenden Sie einen Typedef. Vielleicht können Sie dann eine Antwort mit gültigem C-Code posten, der tatsächlich kompiliert wird. Hinweis: 'int (* get_operator (int val)) (int, int)'. Aber schrei so nicht so, benutze einen Typedef. – Lundin

+0

Beachten Sie auch, dass [return add; 'und' return 'funktionieren werden] (/ questions/16917043/do-function-pointer-need-an-kaufmännisches), mit dem Unterschied, dass man mit Ihrem Codierungsstil übereinstimmt der andere wird nicht. –

+0

Dies ist wirklich hilfreich und löst alle außer einem Fall, was mache ich bei der Division? Wenn ich das Ergebnis in der Form Num R Remainder haben wollte, d. H. Wenn das Problem 5/3 ist, dann sollte die Antwort als 1R2 bereitgestellt werden. Wie würde ich int divate() formatieren, um dies zu tun? – Warior4356

Verwandte Themen