C :: Aufgabe #57 :: Lösung #1

1 Lösung Lösung öffentlich
#57

Firmenumsatz in OOP-Weise

Fortgeschrittener - C von bibir - 08.10.2014 um 13:27 Uhr
Die Zentrale einer Supermarktkette möchte die Umsatzzahlen ermitteln.
Hierzu läßt sie sich die Zahlen aus den einzelnen Filialen geben.
Diese haben wiederum unterschiedliche Kassen, die morgens mit einer gewissen Anfangsumme bestückt werden und am Abend eine Endsumme haben.

Erstelle entsprechende Klassen mit sinnvollen Methoden um den Gesamtumsatz zu berechnen.
#1
vote_ok
von devnull (8870 Punkte) - 01.12.2014 um 18:08 Uhr
Eine Lösung in Pseudo-OO C-Code:
Quellcode ausblenden C-Code
/********************************************
 * umsatz.c   Pseudo-Klassen Umsatzberechnung
 ********************************************/
#include <stdlib.h>
#include <stdio.h>

#define ANZAHL_KASSEN   3
#define ANZAHL_FILIALEN 2

/* Typdefinition Funktionszeiger auf Rechenfunktionen */
typedef double (*ftumsatz)(void*);

// Typdefinition Kasse
typedef struct Kasse {
	double anfangswert;
	double endwert;
	ftumsatz berechne_umsatz;
} TKasse;

// Typdefinition Filiale
typedef struct Filiale {
	TKasse **kassen;
	ftumsatz berechne_umsatz;
} TFiliale;

// Typdefinition Zentrale
typedef struct Zentrale {
	TFiliale **filialen;
	ftumsatz berechne_umsatz;
} TZentrale;


// Berechnungsfunktionen Umsatz
double umsatz_kasse(void *p) {
	TKasse *k = (TKasse *)p;
	return (k->endwert - k->anfangswert);
}
double umsatz_filiale(void *p) {
	TFiliale *f = (TFiliale *)p;
	double summe = 0.0;
	int n;
	for (n=0; n<ANZAHL_KASSEN; n++)
		summe += f->kassen[n]->berechne_umsatz(f->kassen[n]);
	return summe;
}
double umsatz_zentrale(void *p) {
	TZentrale *z = (TZentrale *)p;
	double summe = 0.0;
	int n;
	for (n=0; n<ANZAHL_FILIALEN; n++)
		summe += z->filialen[n]->berechne_umsatz(z->filialen[n]);
	return summe;
}

// Pseudo-Konstruktoren
TKasse *newKasse(double a, double e) {
	TKasse *k;
	if ((k = malloc(sizeof(TKasse))) != NULL) {
		k->anfangswert = a;
		k->endwert = e;
		k->berechne_umsatz = umsatz_kasse;
	}
	return k;
}
TFiliale *newFiliale(TKasse **ak) {
	TFiliale *f;
	if ((f = malloc(sizeof(TFiliale))) != NULL) {
		f->kassen = ak;
		f->berechne_umsatz = umsatz_filiale;
	}
	return f;
}
TZentrale *newZentrale(TFiliale **af) {
	TZentrale *z;
	if ((z = malloc(sizeof(TZentrale))) != NULL) {
		z->filialen = af;
		z->berechne_umsatz = umsatz_zentrale;
	}
	return z;
}

int main() {
    TFiliale *af[ANZAHL_FILIALEN];
	TZentrale *z;
	int nf, nk;
	
	TKasse *ak1[] = { newKasse(1000, 1100),
					  newKasse(2000, 2200),
					  newKasse(3000, 3300) };
	af[0] = newFiliale(ak1);

	TKasse *ak2[] = { newKasse(4000, 4400),
			 	      newKasse(5000, 5500),
			 		  newKasse(6000, 6600) };
	af[1] = newFiliale(ak2);
	z = newZentrale(af);

	for (nf=0; nf<ANZAHL_FILIALEN; nf++) {
	  for (nk=0; nk<ANZAHL_KASSEN; nk++)
	    printf("Filiale %d, Kasse %d: Anfangswert=%.2f / Endwert=%.2f\n", \
	            (nf+1), (nk+1),\
	            af[nf]->kassen[nk]->anfangswert,\
	            af[nf]->kassen[nk]->endwert);	  
	  printf("Umsatz Filiale %d  : %.2f\n", (nf+1), \
	          af[nf]->berechne_umsatz(af[nf]));
    }
	printf("Umsatz Zentrale   : %.2f\n", \
	        z->berechne_umsatz(z));
	return 0;
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben