C :: Aufgabe #22

2 Lösungen Lösungen öffentlich

Programmier-Basic: Eigene Klasse Rechnen schreiben

Anfänger - C von Coco - 02.01.2013 um 16:58 Uhr
Schreibe eine eigene Klasse, die für dich das Rechnen übernimmt:
-Funktionen für Addition, Multiplikation, Subtraktion, Division
-Achte darauf, dass Bei der Divison nicht durch 0 geteilt werden darf!
-Die Funktionen sollten Float Werte entgegen nehmen, damit du auch Kommerzahlen berechnen kannst


Im eingentlichen Programm sollst du dann mit z.B. mit einer switch abfrage die Eingabe verwalten und zu den Richtigen funktionen schicken.

Eine bespiel in der Konsole:

Konsolenausgabe:


Erste Zahl: 1.215
Operator: /
Zweite Zahl: 1.124

Ergebnis: 1.08096

Drücken Sie eine beliebige Taste...


gruß
coco

Lösungen:

vote_ok
von devnull (8870 Punkte) - 19.03.2014 um 17:07 Uhr
Das ist eigentlich keine C-Aufgabe, da C keine OO-Sprache ist und keine Klassen kennt.
Diese Lösung simuliert eine Klasse mittels C-struct, Funktionszeiger und Pseudo-Konstruktor.
Die Werte werden mit "scanf" eingelesen, ohne ausgefeilte Eingabeprüfung.
Quellcode ausblenden C-Code
/********************************************
 * rechnen.c  Pseudo-Klasse Rechnen
 * devnull    14-07-2013                
 ********************************************/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

/* Typdefinition Funktionszeiger auf Rechenfunktionen */
typedef float (*fberechnung)(float, float);

/* Typdefinition Rechnen-Struktur */
typedef struct Rechnen {
	float wert1;
	float wert2;
	int opcode;
	fberechnung berechnung;
} TRechnen;
	
/* Berechnungsfunktionen */
float add(float wert1, float wert2) {
	return wert1 + wert2;
}
float sub(float wert1, float wert2) {
	return wert1 - wert2;
}
float mult(float wert1, float wert2) {
	return wert1 * wert2;
}
float divs(float wert1, float wert2) {
	return (wert2 == 0) ? INFINITY : wert1 / wert2;
}

/* Zuordnung Opcode - Funktionszeiger */
fberechnung opselect(char opcode) {
	switch(opcode) {
		case '+' : return add;
		case '-' : return sub;
		case '*' : return mult;
		case '/' : return divs;
	 default     : return NULL;
	}
}

/* Pseudo-Konstruktor Rechnen - "Klasse" */
TRechnen *newRechnen(float wert1, float wert2, char opcode) {
	static TRechnen rechnen;
	
	rechnen.wert1 = wert1;
	rechnen.wert2 = wert2;
	rechnen.opcode = opcode;
	if ((rechnen.berechnung = opselect(opcode)) != NULL)
		return &rechnen;
	else
		return NULL;
}

int main() {
float z1, z2;
char op[2];
TRechnen *r;	
	
	printf("Erste Zahl : "); 
	scanf("%f", &z1); 
	printf("Operator   : "); 
	scanf("%s", op); 
	printf("Zweite Zahl: "); 
	scanf("%f", &z2); 
	if ((r = newRechnen(z1, z2, op[0])) != NULL)
		printf("Ergebnis: %f\n", r->berechnung(z1, z2));
	return 0;
}
vote_ok
von kathleenw (3600 Punkte) - 08.07.2020 um 10:05 Uhr
Quellcode ausblenden C-Code
#include <stdio.h>
#include <stdlib.h>

float addieren(float a, float b)
{
    return a+b;
}

float subtrahieren(float a, float b)
{
    return a-b;
}

float multiplizieren(float a, float b)
{
    return a*b;
}

float dividieren(float a, float b)
{
    return a/b;
}

int main(void)
{
    float a,b,ergebnis;
    char operator[2];
    
    printf("1. Zahl : ");
    if(scanf("%f", &a)!=1) {
        printf("Fehler bitte eine Zahl eingeben. \n");
        return EXIT_FAILURE;
    }
    fflush(stdin);
    
    printf("Operator: ");
    fgets(operator,2,stdin);
    
    printf("2. Zahl : ");
    if(scanf("%f", &b)!=1) {
        printf("Fehler bitte eine Zahl eingeben. \n");
        return EXIT_FAILURE;
    }
    fflush(stdin);
    
    if(operator[0]=='/' && b==0)
    {
        printf("Division ist nicht möglich.\n");
        return EXIT_FAILURE;
    }
    
   
    switch(operator[0]) {
        case '+': ergebnis = addieren(a,b); break;
        case '-': ergebnis = subtrahieren(a,b); break;
        case '/': ergebnis = dividieren(a,b); break;
        case '*': ergebnis = multiplizieren(a,b);break;
        default : printf("Es wurde ein falscher Operator eingegeben.\n");break;
    }
    
    printf("\nErgebnis: %f\n\n", ergebnis);
    
    
    
}