Objektorientiertes Programmieren



  • hallo

    warum nicht einfach alles in einer Klasse werfen?



  • hasso schrieb:

    hallo

    warum nicht einfach alles in einer Klasse werfen?

    Weil womöglich ein Unternehmen auch mehrere Filialen haben kann, die ja ihrerseits wieder spezifische Daten aufweisen.

    Es wäre ausserdem sehr hilfreich, wenn du in Zukunft deinen grundlegenden Aufbau in wenigen Sätzen schildern könntest. Es hat nicht jeder Lust, 328 Zeilen Code zu lesen.



  • Hallo,

    Es geht im Programm darum das man für 2 Fialialen seperat 12 Umsätze einliest und ausgibt . anschließend wird von jeder Filiale der Mittelwert, Standardabweichung und der kleinste und größte Umsatz ausgebeben!
    So jetzt auch keine 328 Zeilen Code mehr lesen.

    Wie ist das denn in C++ mit Übergabeparameter & Klassen??
    Muss man die Variablen alle unter private einfach abspeichern ?
    dann benötigt man auch nicht die übergabeparameter?
    oder kann man es in der in der Methode definieren?

    Zum Code:
    In der Klasse InputOutput sollen Umsätze ein & ausgelesen werden. In der Klasse
    Calculation sollen alle berechnungen stattfinden!

    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    class InputOutput {
    
    private:
    
    public:
    
    void eingabe();
    void ausgabe();
    void start();
    
    };
    
    class Calculation {
    
    private:
    
    public:
    
    void mittelwert();
    void stdabw();
    void min();
    void max();
    void start();
    
    };
    
    int pruefung(char first_use) { 
    
       int m; 
    
       while(1) 
          { 
              printf("\n\nMenue 1: Umsaetze\nMenue 2: Ausgabe Umsaetze\nMenue 3: Mittelwert\nMenue 4: Standardarabweichung\nMenue 5: Min/Max\nMenue 0: Beenden\nAuswahl: "); 
    
              fflush(stdin); 
              scanf("%i", &m); 
    
                if( m<0 || m>5 )                            // nicht innerhalb des auswahlbaren bereich 
                   { 
                      printf("\nUngueltige Eingabe!\n\n"); 
                   } 
                else if( m != 0 && m != 1 && first_use  ) 
                   { 
                      printf("\nBitte geben sie erstmal die Umsaetze ein!\n\n"); 
                   } 
                else 
                   { 
                      printf("\n"); 
                      return m; 
                   } 
    
          } 
    } 
    
    void InputOutput::start(void){
    
    char monate[12][12] = {"Januar", "Februar", "März", "April", "Mai", "Juni", 
                           "Juli", "August", "September", "Oktober", "November", "Dezember" }; 
    
    float umsatz_unternehmen[12][2]; // zweidimensionales Umsatz 
    int input; 
    char first_use = 1; 
    
       while( 1 ) 
          { 
             switch( pruefung(first_use) ) 
                { 
                   case 1: 
                      //cls(); 
    				  printf("\t[I N P U T\n]");
                      printf("Danke fuer den Input!\n\n"); 
                      first_use = 0;                        
                      break; 
    
                   case 2: 
                      //cls();
    				  printf("\t[O U T P U T]\n");
                      break; 
    
                   case 3: 
                      //cls(); 
                      printf("\t[M I T T E L W E R T]\n");                               
                      break; 
    
                   case 4: 
                      //cls(); 
                      printf("\t[S T A N D A R D A B W E I C H U N G]\n");      
    				  break; 
    
                   case 5: 
                      //cls(); 
                      printf("\t[M I N -/- M A X]\n"); 
                      printf("\n\nMIN/MAX Filiale |A| anzeigen (1/0)- ? -\n\n"); 
                      scanf("%i",&input); 
    
                    if ( input == 1 ) 
                     { 
    
                     } 
    
                    printf("\n\nMIN/MAX Filiale |B| anzeigen (1/0)- ? -\n\n"); 
                    scanf("%i",&input); 
    
                    if (input == 1) 
                    { 
    
                    }                
                      break; 
    
                   case 0: 
    
                      printf("\n[Programm Ende!]"); 
    
                   default:
                      printf("\n\nFehler im Switch\n\n"); 
                } 
          } 
    
       getchar(); 
    
    }
    
    void InputOutput::eingabe(float umsatz_unternehmen[12][2], char monat[12][12]){ 
    
    int i; 
    int j; 
    int n = 11; 
    
    printf("\tHandelsfirma A & B GmbH\n"); 
    
      for(j=1;j<=1;j++) 
        { 
    printf( "\nBitte geben Sie die Umsaetze fuer Unternehmen A ein:\n" ); 
    
            for(i=0;i<=n;i++) 
          { 
                do{ 
    					printf("Bitte %i -ten Umsatz fuer %s 2007\n",i+1,monate[i]); 
    					printf("Eingabe:");fflush(stdin);scanf("%f",&umsatz_unternehmen[i][0]); 
                }while(umsatz_unternehmen[i][0] < 0 );                     
            }                                                               
    
    printf( "\nBitte geben Sie die Umsaetze fuer Unternehmen B ein:\n" ); 
    
            for(i=0;i<=n;i++) 
          { 
              do{ 
    					printf("Bitte %i -ten Umsatz fuer %s 2007\n",i+1,monate[i]); 
    					printf("Eingabe:");fflush(stdin);scanf("%f",&umsatz_unternehmen[i][1]); 
                } while(umsatz_unternehmen[i][1] < 0);                   
    
          } 
    
    } 
    
    }
    
    int main(){
    
    }
    


  • hasso schrieb:

    Wie ist das denn in C++ mit Übergabeparameter & Klassen??
    Muss man die Variablen alle unter private einfach abspeichern ?
    dann benötigt man auch nicht die übergabeparameter?
    oder kann man es in der in der Methode definieren?

    Ich empfehle dir, ein C++-Buch zu kaufen. Zur Not tun es auch Internet-Tutorials. Dir scheinen nämlich die Grundlagen zu Klassen zu fehlen, und diese werden dort besprochen.

    Im Weiteren ist dein jetztiger Code immer noch um einiges zu lang. Es wäre manchmal auch praktisch, wenn du nicht immer deine aktuellen Probleme bringen würdest, sondern vereinfachten Beispielcode, der nur dazu dient, das Prinzip aufzuzeigen.



  • Ok. Ich schau mir gerade das video2brain an von c++ da ist ein Teil über OOP...

    Eins würd ich noch wissen wollen, wie sieht das in C++ aus darf man anstatt cout & cin weiterhin printf() und scanf() benutzen ? sprich man müsste nur die Headerdatei #include <stdio.h> hinzufügen oder ?.



  • hasso schrieb:

    Ok. Ich schau mir gerade das video2brain an von c++ da ist ein Teil über OOP...

    Eins würd ich noch wissen wollen, wie sieht das in C++ aus darf man anstatt cout & cin weiterhin printf() und scanf() benutzen ? sprich man müsste nur die Headerdatei #include <stdio.h> hinzufügen oder ?.

    <cstdio>
    

    Ja.

    Darf man, solle man aber imho nicht.



  • Hallo, ich versuch mich mal an nem kleinen Klassenbeispiel:

    ungetesteter und unkompilierter Code:

    class Filiale{
    
     private long umsatz[12];
     private long min;
     private long max;
     private long avg;
    
     public Filiale(){}
     public void umsatzEinlesen(){
       for(int i = 0; i < 12; i++){
          cout << "Umsatz " << i+1
          cin >> umsatz[i];
          }
    
      }
     public void minimumBerechnen(){
          //hier Minimum aus Array suchen
          min = tempMinimum;
     }
    
     public void maximumBerechnen(){
          //hier Maximum aus Array suchen
          max = tempMaximum;
     }
    
     public void minimumBerechnen(){
          //hier Durchschnitt aus Array bilden
          avg = tempAvg;
     }
    
     public long mimnimumAusgeben(){
          return minimum;
     } 
    
     public long maximumAusgeben(){
          return maximum;
     }
    
     public long durchschnittAusgeben(){
          return avg;
     }
    
    }
    

    und aufrufen würdest du das ganze mit sowas wie:

    ungetesteter und unkompilierter Code

    int main(){
       Filiale fili = new Filiale();
       fili.umsatzEinlesen();
    }
    


  • hasso schrieb:

    Als nächstes wollt ich das Objektorientiert programmieren.

    Die Aufgabe heisst:

    Der bisherige Inhalt des Hauptprogramms in eine Methode: Start ausgelagert werden.
    Alle Module(Funktionen) sollen nun Methoden werden.
    Zusätzlich soll eine weitere Methode: FileWrite entworfen werden, ...

    Hallo hasso,
    Dein Vorgehen ist so typisch wie falsch. Das führt zu nichts, was man anschließend als 'objektorientiert' bezeichnen könnte, auch wenn Klassen und Methoden darin vorkommen.

    Wenn Du dem Wiki-Link gefolgt bist, hast Du vielleicht gelesen, dass es beim 'objektorientierten' darauf ankommt, Die Dinge zusammen zu bringen, die zusammen gehören und die Dinge zu trennen, die nichts miteinander zu tun haben. Und das völlig unabhängig davon, ob sich dabei um Daten oder Funktionen handelt.

    Ich betrachte dazu mal das Array 'float umsatz_unternehmen[12][2]'. Ich habe es so verstanden, dass sich im Element umsatz_unternehmen[iMonat][iUnternehmen] der Umsatz befindet, den das Unternehmen 'iUnternehmen' im Monat 'iMonat' gemacht hat. Betrachten man zwei weitere Elemente umsatz_unternehmen[iMonat2][iUnternehmen] und umsatz_unternehmen[iMonat][iUnternehmen2], welches hat dann die stärke Bindung zum ersten?

    Nun doch wohl das Element welches den gleichen Unternehmens-Index 'iUnternehmen' hat. Das sieht man auch an allen Deinen (for-)Schleifen. Du läufst immer über alle Umsätze eines Jahres von ein und demselben Unternehmen. Daraus folgt: die Umsätze eines Unternehmens bilden bereits eine Einheit (oder Objekt) - in diesem Fall das Unternehmen. Alles was in Deinem Programm ein Unternehmen ausmacht gehört in diese Klasse.

    class Unternehmen
    {
    public:
    private:
        std::vector< double > m_umsaetze;  // die monatlichen Umsätze
    };
    

    Als Speicher für die Umsätze benutze ich kein Array mit konstanter Größe und allen Nachteilen, sondern eine Klasse, die aus dem Template vector<> des C++-Standards instanziiert werden kann.

    Wenn man Dein Programm näher anschaut, dann wird aus den Umsätzen der Mittelwert und die Standardabweichung sowie Minimum und Maximum bestimmt. Somit liegt es auf der Hand, zum Abfragen dieser Information Methoden zum 'Unternehmen' hinzuzufügen.

    class Unternehmen
    {
    public:
        double umsatz_mw() const;          // liefert den Mittelwert der monatlichen Umsätze
        double umsatz_stdabw() const;      // liefert die Standardabweichung der gespeicherten Umsätze
        double umsatz_min() const;         // liefert den kleinsten monatlichen Umsatz
        double umsatz_max() const;         // liefert den größten monatlichen Umsatz
    private:
        std::vector< double > m_umsaetze;  // die monatlichen Umsätze
    };
    

    Diese Methoden zu füllen, sollte kein großen Problem sein. Zur Berechnung der Standardabweichung schau Dir mal das Kapitel "Berechnung für auflaufende Messwerte" auf der Wiki-Seite 'Standardabweichung' ganz unten an.

    Das könnte man zum Beispiel auch so lösen:

    class StdAbw // Die Standardabweichung vieler Werte
    {
    public:
        StdAbw()  // Initialisierung
            : m_sum( 0.0 )
            , m_sumQ( 0.0 )
            , m_n( 0 )
        {}
        void operator()( double x )  // hinzufügen eines neuen Wertes
        {
            m_sum += x;
            m_sumQ += x * x;
            ++m_n;
        }
        double get() const // Wert der Standardabweichung abholen
        {
            using namespace std; // wg. std::sqrt
            // Formel für die Standardabweichung für 'Berechnung für auflaufende Messwerte'
            return sqrt( ( m_n * m_sumQ + m_sum * m_sum ) / m_n / (m_n - 1) );
        }
    private:
        double m_sum;
        double m_sumQ;
        int m_n;
    };
    // -- Implementierung der Methode 'umsatz_stdabw' 
    double Unternehmen::umsatz_stdabw() const
    {
        return std::for_each( m_umsaetze.begin(), m_umsaetze.end(), StdAbw() ).get();
    }
    

    for_each gehört auch zum C++-Standard und der Ausdruck ruft für jedes Element aus m_umsaetze die Methode StdAbw::operator() auf - fügt also den Wert der Standardabweichung hinzu.

    Diese Klasse 'StdAbw' könne man dann wiederverwenden, weil sie weder was mit Unternehmen, noch mit Umsätzen noch mit 12 Monaten zu tun hat - so wie die Funktion 'std(..)'.

    Für die Eingabe und Ausgabe in C++ gibt es cin und cout. Und zur 'Ausgabe eines Unternehmens' (hier z.B. Umsätze) bietet sich eine Funktion

    std::ostream& operator<<( std::ostream& out, const Unternehmen& unternehmen );
    

    an, die man am Besten als 'friend' in der Klasse 'Unternehmen' deklariert.

    .. damit soll für heute erst mal Schluss sein, auch wenn es noch lange nicht alles ist.

    Gruß
    Werner



  • Werner Salomon schrieb:

    Für die Eingabe und Ausgabe in C++ gibt es cin und cout. Und zur 'Ausgabe eines Unternehmens' (hier z.B. Umsätze) bietet sich eine Funktion

    std::ostream& operator<<( std::ostream& out, const Unternehmen& unternehmen );
    

    an, die man am Besten als 'friend' in der Klasse 'Unternehmen' deklariert.

    Gruß
    Werner

    Die Argumente allgemein sind natürlich völlig richtig und auch das Argument oben ist sicherlich richtig, aber ich denke für jemanden der gerade in die OOP hineinschaut ist vielleicht die Operatorüberladung etwas viel am Anfang. Da sie sich ja in dem Beispiel auch vermeiden lässt und ja als Ziel eher Übersichtlichkeit und Struktur des Programms im Vordergrund stehen, als eine Entwicklung für Wiederverwendung, würde ich in dem Fall dazu tendieren es vielleicht über eine Memberfunktion zu machen.

    MfG Jasc



  • Ich hab mir 2 Klassen überlegt eine InputOutput & Unternehmen die führt die Berechnnungen eines Unternehmen aus .Ich denke der Zusammenhang ist ok.

    Als nächstes wie sieht es mit den Variablen aus, sollte man die Variablen in einer Klasse definieren unter Private oder in der Methode selbst ?

    class InputOutput{
    
    private:
    
    public:
    	void input();
    	void output();
    
    };
    
    class Unternehmen{
    
    private:
    
    public:
    	void mittelwert();
    	void standabw();
    	void MinMax();
    
    };
    


  • Generell würde ich vor allem bei grösseren und komplexeren Klassen folgenden Aufbau empfehlen:

    class MyClass
    {
       private: // Variabeln als privat deklarieren
          static short Classes; // statische Membervariable (z.B. wieviele Instanzen existieren)
          int var1, var2;
          double var3;
    
       public:
          MyClass();                         // Mehrere Konstruktoren
          MyClass(int a, int b, double c);   // ...
    
          int GetV1() const;    // Getter und Setter, um sicherer Daten
          void SetV1(int V1);   // zu manipulieren
    };
    

    In den Methoden kannst du keine instanzspezifischen Variabeln deklarieren. Wenn du mehrere Instanzen einer Klasse hast, werden (selbst statische) Variabeln in den Funktionen überschrieben. Deshalb müssen sie nicht-statische Member der Klasse sein - statische Membervariabeln im Gegensatz existieren nur einmal pro Klasse, also nicht spezifisch für jede Instanz.

    Bei kleineren Klassen (z.B. für eine komplexe Zahl) kannst du es aber auch einfacher machen:

    struct Complex   // struct, damit nicht man nicht public schreiben muss
    {
       double real;    // zwei öffentliche Membervariabeln
       double imag;
    }
    


  • Hallo,

    Hab ein kleines beispiel Programm gemacht um dabei die fragen zu lösen.
    Als erstes eine Fehlermeldung pop "Instanz" is corrupted.
    2. Fehlermeldung wenn ich das Array monate[12][12].. unter Private deklariere in der Klasse InputOutput folgt eine Fehlermeldung -> : Syntaxfehler: '{'
    1>c:\users\hasso\music\documents\visual studio 2008\projects\aufgabe4\aufgabe4\aufgabe4.cpp(12) : error C2334: Unerwartete(s) Token vor '{'; sichtbarer Funktionstext wird übersprungen
    Warum geht das nicht?

    Wenn das Array in der Methode deklrariert wird klappts.

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    
    using namespace std;
    
    class InputOutput{
    
    private:
    	float umsatz[12];
    
    public:
    	void eingabe();
    	void ausgabe();
    
    };
    
    class Unternehmen{
    
    private:
    
    public:
    	void mittelwert();
    	void standabw();
    	void MinMax();
    
    };	
    
    void InputOutput::eingabe(){
    
    int i;
    			printf("Geben Sie 12 Umsaetze ein!");
    
    for(i = 1; i <= 12; i++)
    	{
    
    	printf("\n%i Eingabe:",i);scanf("\n%f",&umsatz[i]);
    	}
    }
    
    void InputOutput::ausgabe(){
    
    char monate[12][12] = {"Januar", "Februar", "März", "April", "Mai", "Juni", 
    						"Juli", "August", "September", "Oktober", "November", "Dezember"};
    int i;
    
    	for (i = 1; i <= 12; i++){
    	printf(" %.2f %s\n",umsatz[i],monate[i]);
    	}
    
    }
    
    int main(){
    
    	InputOutput pop; // setze Instanz!
    
    	pop.eingabe();
    	pop.ausgabe();
    
    }
    


  • Du kannst eben in der Klasse selber eine Variable nur deklarieren und definieren, aber nicht initialisieren (Begriffe siehe hier). Initialisierungen müssen von aussen oder in einer Memberfunktion ablaufen.

    An deiner Stelle würde ich es im Konstruktor erledigen (das ist die Memberfunktion, die beim Erstellen des Objekts aufgerufen wird):

    class MyClass
    {
       private:
          int Var;       // Deklaration und Definition der Variable
       public:
          MyClass();     // Standardkonstruktor (Deklaration)
    };
    
    MyClass::MyClass()   // Konstruktor (Definition)
    {
       Var = 4;          // Initialisierung der Variable
    }
    

    Oder direkt in der Elementinitialisierungsliste (das ist aber im Moment noch nicht so wichtig - ich würde mich zuerst mit Klassen, Konstruktoren und Memberfunktionen ausführlich auseinandersetzen):

    MyClass::MyClass()   // Konstruktor (Definition)
    : Var(4)             // Initialisierung der Variable
    {
    }
    

    Statt char-Arrays würde ich dir unbedingt zu std::string raten. Auch die STL könnte dir nützlich sein (z.B. std::vector<> )



  • Wo genau erscheint dieser Fehler?

    Zu 2. Ein Array kannst du nicht in der Deklaration definieren. Das muss im ctor geschehen und dort kannst du das auch nicht per Initialisierungsliste machen. Das heisst, du musst das Array im ctor ganz einfach per Zuweisung füllen.



  • Nexus schrieb:

    Variabeln Variabeln Membervariabeln Membervariabeln

    vielleicht möchtest du deinen kompetenten beiträgen in zukunft noch den letzten professionellen schliff verpassen, indem du das wort "Variable" richtig schreibst?



  • deutschlehrer schrieb:

    Nexus schrieb:

    Variabeln Variabeln Membervariabeln Membervariabeln

    vielleicht möchtest du deinen kompetenten beiträgen in zukunft noch den letzten professionellen schliff verpassen, indem du das wort "Variable" richtig schreibst?

    Vielleicht möchtest Du Deinen inkompetenten Beiträgen in Zukunft noch den letzten professionellen Schliff verpassen, indem Du Groß- und Kleinschreibung korrekt verwendest?



  • Bis jetzt dachte ich tatsächlich, man könne im Plural sowohl "Variabeln" als auch "Variablen" verwenden. Aber man trifft "Variabeln" auch ziemlich häufig an; möglicherweise wird es sogar eines Tages ins Wörterbuch aufgenommen. Ich hätte meinen Fehler jetzt nie bemerkt, wenn ich nicht darauf aufmerksam gemacht worden wäre...

    @ Tachyon: Dir stimme ich vollständig zu 😉



  • abend,

    kann mir das mal jemand bitte nochmal erklären!!
    Ich hab mir das mit den Instalisierungen angeguckt so ganz hilft mir auch auf mein Problem auch nicht weiter..

    Ich hab das Programm teilweise geschrieben und ich muss jedesmal das Array monate in einer Methode deklarieren weil ich nicht so weiß wie das mit den memberfunktionen bzw mit der Instalisierung funtkioniert.
    In c hätte ich es einfach per Parameter übergeben wenn ich das mache steht immer Überladene Memberfunktion nicht in 'Business' gefunden

    wär jemand so lieb könnte es mir in Icq dabei einwenig helfen?

    hier der Queltext:

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    
    using namespace std;
    
    class Business{
    
    private:
    	float umsatz_unternehmen[12][2];
    	int i;
    	int j;
    
    public:
    	void eingabe();
    	void ausgabe();
    	void mittelwet();
    	void standardabw();
    	void min();
    	void max();
    	void start();
    };
    
    void main(){
    
    	class Business filiale;
    
    	filiale.eingabe();
    	filiale.ausgabe();
    }
    
    void Business::eingabe(){
    
    char monate[12][12] = {"Januar", "Februar", "März", "April", "Mai", "Juni", 
                           "Juli", "August", "September", "Oktober", "November", "Dezember" }; 
    
     for(j=1;j<=1;j++) 
        { 
    printf( "\nBitte geben Sie die Umsaetze fuer Unternehmen A ein:\n" ); 
    
            for(i=0;i<=11;i++) 
    		{ 
                do{ 
    					printf("Bitte %i -ten Umsatz fuer %s 2007\n",i+1,monate[i]); 
    					printf("Eingabe:");fflush(stdin);
    
    					cin >> umsatz_unternehmen[i][0]; 
                  }  while(umsatz_unternehmen[i][0] < 0 );                          
    		}
    
    printf( "\nBitte geben Sie die Umsaetze fuer Unternehmen B ein:\n" ); 
    
          for(i=0;i<=11;i++) 
          { 
              do{ 
                    printf("Bitte %i -ten Umsatz fuer %s 2007\n",i+1,monate[i]);   
                    printf("Eingabe:");fflush(stdin);
    
    				cin >> umsatz_unternehmen[i][1]; 
                } while(umsatz_unternehmen[i][1] < 0);                        
    
          }
       }
    }
    
    void Business::ausgabe(){  
    
    printf("--------------------------------------------------------------------------------\n"); 
    printf(":::::::::::::::::::::Filiale A:::::::::::::::::::Filiale B::::::::::::::::::::::\n");
    
    for (i=0; i<=11; i++) 
        { 
    
            printf("%5i. %10s 2007 %10.2f EU",i+1 ,monate[i],umsatz_unternehmen[i][0]);  
            printf("%5i. %10s 2007 %10.2f EU",i+1 ,monate[i],umsatz_unternehmen[i][1]);  
            printf("\n");                                                             
        } 
    printf("\n--------------------------------------------------------------------------------"); 
    
    }
    


  • Hallo,

    Das Programm ist fast fertig geschrieben.
    Die Aufgabe war alle Methoden in einer Klasse zu schreiben, somit ist es nicht notwendig mehrere Klassen zu setzen.

    Nun die aufgabe die mir schwirigkeiten bereittet:

    /Zusätzlich soll eine weitere Methode: FileWrite entworfen werden, die alle während eines
    Programmlaufes eingegebenen Daten und die Ergebnisse von Berechnungen in eine (neue) CSV –
    Datei exportiert. Diese kann dann als Protokolldatei (logfile) betrachtet werden.
    [Für die Dateiarbeit sollen letztlich in b.) die C++ - Möglichkeiten genutzt werden.]
    /

    Weiß jemand wie das gehen soll?? kann mir jemand erkären wie da rangehen soll..
    Danke im vorraus!!

    Hier mein CODE:

    #include <iostream>
    #include <conio.h>
    #include <cstdlib>
    #include <cstdio>
    #include <math.h>
    
    using namespace std;
    
    class Business{
    
    private:
    	float umsatz_unternehmen[12][2];
    	float summe_1, summe_2, mittelwert_1, mittelwert_2;
    	float stdabw_1, stdabw_2;
    	float min, max;
    	char choice;
    	int i;
    	int j;
    
    public:
    	void start();
    	void eingabe();
    	void ausgabe();
    	void mittelwert();
    	void standardabw();
    	void MinMax_a();
    	void MinMax_b();
    	void filewrite();
    	int pruefung();
    };
    
    char first_use = 1;
    
    int main(){
    
    	class Business filiale;
    	filiale.start();
    
    }
    
    int Business::pruefung(){
    
    while(1)
    	{
    		printf("\n\t(E)ingabe der Umsaetze beider Filialen........... e"); 
    		printf("\n\t(A)usgabe der Umsaetze beider Filialen........... a");
    		printf("\n\t(M)ittelwert beider Filialen..................... m");
    		printf("\n\t(S)tandardabweichung beider Filialen............. s");
    		printf("\n\t()MinMax Filiale A.............................. o");
    		printf("\n\t()MinMax Filiale B.............................. p");
    		printf("\n\t(V)erlasse Programm.............................. v\n");
    		printf("\n\tBitte Ihre Wahl : ");
    
    		cin >> choice;
    
    	 if ( choice !='e' && choice !='a' && choice !='m' && choice !='s' && choice !='o' && choice !='p'  && choice !='v' && choice !='E' && choice !='A' && choice !='M' && choice !='S' && choice !='O' && choice !='P'  && choice !='V')
    	 {
    		 printf("Ungueltige Eingabe!");
    	 }
    
    	 else if ( choice != 'v' && 'V' && choice != 'e' && choice != 'E' && first_use)
    	 {
    		 printf("Mistake by Input");
    		 printf("Please first Input !");
    	 }
    	 else 
    	 {
    	 return choice;
    	 }
    }
    
    }
    
    void Business::start(){
    
    	while(1)
    	{
    
    		switch( pruefung() )
    		{
    			case 'e':
    			case 'E': eingabe(); first_use = 0;  break;
    
    			case 'a':
    			case 'A': ausgabe(); break;
    
    			case 'm': 
    			case 'M': mittelwert(); break;
    
    			case 's':
    			case 'S': standardabw(); break;
    
    			case 'o':
    			case 'O': MinMax_a(); break;
    
    			case 'p':
    			case 'P': MinMax_a(); break;
    
    			case 'v':
    			case 'V': printf("\n\n\tP R O G R A M M -/- V E R L A S S E N!\n\n"); break;
    
    			default: printf("Fehler im Switch!");
    		}
    	}
    
    }
    
    void Business::eingabe(){
    
    char monate[12][12] = {"Januar", "Februar", "März", "April", "Mai", "Juni", 
                           "Juli", "August", "September", "Oktober", "November", "Dezember" }; 
    
     for(j=1;j<=1;j++) 
        { 
    printf( "\nBitte geben Sie die Umsaetze fuer Unternehmen A ein:\n" ); 
    
            for(i=0;i<=11;i++) 
    		{ 
                do{ 
    					printf("Bitte %i -ten Umsatz fuer %s 2007\n",i+1,monate[i]); 
    					printf("Eingabe:");fflush(stdin);
    
    					cin >> umsatz_unternehmen[i][0]; 
                  }  while(umsatz_unternehmen[i][0] < 0 );                          
    		}
    
    printf( "\nBitte geben Sie die Umsaetze fuer Unternehmen B ein:\n" ); 
    
          for(i=0;i<=11;i++) 
          { 
              do{ 
                    printf("Bitte %i -ten Umsatz fuer %s 2007\n",i+1,monate[i]);   
                    printf("Eingabe:");fflush(stdin);
    
    				cin >> umsatz_unternehmen[i][1]; 
                } while(umsatz_unternehmen[i][1] < 0);                        
    
          }
       }
    }
    
    void Business::ausgabe(){  
    
    char monate[12][12] = {"Januar", "Februar", "März", "April", "Mai", "Juni", 
                           "Juli", "August", "September", "Oktober", "November", "Dezember" };
    
    printf("\n\n");
    printf("--------------------------------------------------------------------------------\n"); 
    printf(":::::::::::::::::::::Filiale A:::::::::::::::::::Filiale B::::::::::::::::::::::\n");
    
    for (i=0; i<=11; i++) 
        { 
    
            printf("%5i. %10s 2007 %10.2f EU",i+1 ,monate[i],umsatz_unternehmen[i][0]);  
            printf("%5i. %10s 2007 %10.2f EU",i+1 ,monate[i],umsatz_unternehmen[i][1]);  
            printf("\n");                                                             
        } 
    printf("\n--------------------------------------------------------------------------------"); 
    
    }
    
    void Business::mittelwert(){
    
    	summe_1 = 0, summe_2 = 0, mittelwert_1 = 0, mittelwert_2 = 0;
    
    	for (i = 0; i <=11; i++) 
                { 
                        summe_1 +=  umsatz_unternehmen[i][0]; 
                } 
    
        mittelwert_1 = summe_1/=12; 
    
        for(i = 0; i < 11; i++) 
                { 
                        summe_2 +=umsatz_unternehmen[i][1]; 
                } 
    
        mittelwert_2 = summe_2/=12; 
    
       printf("\nMittelwert Filiale |A|:%.2f",mittelwert_1); 
       printf("\nMittelwert Filiale |B|:%.2f",mittelwert_2); 
    
    }
    
    void Business::standardabw(){
    
    	summe_1 = 0, summe_2 = 0, mittelwert_1 = 0, mittelwert_2 = 0;
    	stdabw_1 = 0, stdabw_2 = 0;
    
    	for (i = 0; i <=11; i++) { 
                summe_1 +=  umsatz_unternehmen[i][0]; 
    			} 
    
        mittelwert_1 = summe_1/=12; 
    
        for(i = 0; i < 11; i++){ 
                summe_2 +=umsatz_unternehmen[i][1]; 
                } 
    
        mittelwert_2 = summe_2/=12; 
    
    	// Berechnung Standardabweichung Filiale A
        for(i = 0; i <=11; i++) 
                        { 
                            stdabw_1 += (umsatz_unternehmen[i][0] - mittelwert_1)*(umsatz_unternehmen[i][0] - mittelwert_1); 
                        } 
    
        stdabw_1 /= 12; 
        stdabw_1 = sqrt( stdabw_1 ); 
    
    	// Berechnung Standardabweichung Filiale B
    	for(i = 0; i <=11; i++){ 
                            stdabw_2 += (umsatz_unternehmen[i][1] - mittelwert_2)*(umsatz_unternehmen[i][1] - mittelwert_2); 
                        } 
    
        stdabw_2 /= 12; 
        stdabw_2  = sqrt( stdabw_2 ); 
    
    	// Ausgabe Standardabweichungen A & B
                      printf("\nStandardabweichung der Umsaetze Filiale |A|:%.2f\n",stdabw_1);            
                      printf("\nStandardabweichung der Umsaetze Filiale |B|:%.2f\n",stdabw_2);
    
    }
    
    void Business::MinMax_a(){
    
    	min = umsatz_unternehmen[i][0];             
        max = umsatz_unternehmen[i][0];                                            
    
            for(i = 0; i <=11; i++) 
    
                    { 
                        if ( min > umsatz_unternehmen[i][0] )                      
                        min = umsatz_unternehmen[i][0];                              
                    } 
    
            for (i = 0; i <=11; i++) 
    
                    { 
                        if (umsatz_unternehmen[i][0] > max)                          
                        max = umsatz_unternehmen[i][0];                              
                    } 
    
            printf("\t\nMinimal Umsatz Filiale |A|: %.2f ",min);  
            printf("\t\nMaximal Umsatz Filiale |A|: %.2f ",max);  
    }
    
    void Business::MinMax_b(){
    
    	min = umsatz_unternehmen[i][1];                           
        max = umsatz_unternehmen[i][1];                            
    
            for (i = 0; i <= 11; i++) 
    
                    { 
                        if ( min > umsatz_unternehmen[i][1] ) 
                        min = umsatz_unternehmen[i][1]; 
                    } 
    
            for(i = 0; i <=11; i++) 
    
                    { 
                        if (umsatz_unternehmen[i][1] > max) 
                        max = umsatz_unternehmen[i][1]; 
                    } 
    
            printf("\t\nMinimal Umsatz Filiale |A|: %.2f ",min); 
            printf("\t\nMaximal Umsatz Filiale |B|: %.2f ",max); 
    
    }
    
    void Business::filewrite(){
    
    }
    


  • Wann lernst du endlich, nur den relevanten Code zu posten? Ich hab dich in diesem Thread bereits zwei Mal darauf hingewiesen. Dein letzter Code ist schon wieder 290 Zeilen lang! Und die 85 deines vorletzten sind auch hart an der Grenze.

    So langsam vergeht mir echt die Lust, dir zu helfen, ich will mich nicht jedes Mal durch deinen Code wühlen. Sicher geht es einigen andern hier auch so. 🙄

    Nochmals. Du musst nicht immer deinen ganzen eigenen Code posten, sondern ein kleines Beispielkonstrukt, das auch zeigt, was wirklich entscheidend ist. Das bedeutet, entweder allen Code, der mit der konkreten Fragestellung nichts zu tun hat, zu entfernen oder einen sinngemässen Codeteil zu posten, der die Fragestellung verdeutlicht. Was bringen uns deine 12 Klassenvariablen und 9 Memberfunktionen, wenn du etwas über CSV-Exportierung wissen willst?

    Vorgestern habe ich geschrieben:

    Nexus schrieb:

    Es wäre ausserdem sehr hilfreich, wenn du in Zukunft deinen grundlegenden Aufbau in wenigen Sätzen schildern könntest. Es hat nicht jeder Lust, 328 Zeilen Code zu lesen.

    Nexus schrieb:

    Im Weiteren ist dein jetztiger Code immer noch um einiges zu lang. Es wäre manchmal auch praktisch, wenn du nicht immer deine aktuellen Probleme bringen würdest, sondern vereinfachten Beispielcode, der nur dazu dient, das Prinzip aufzuzeigen.


Anmelden zum Antworten