Aufgabe so gut gelöst?



  • Aufgabe:

    Klasse um eingaben zu speichern, solange keine null eingegebn wird!
    Wenn 0 eingegeben alles werte sortiert ausgeben!

    Ich habs so gemacht:

    bool sortiert=true;
    class test
     {
    public:
     void SetIt()
      {
      int e;
      int k=0;
      while(e!=0)           //solange eingabe,solange nicht 0 eingegeben wird
       {
       if(e==0){}
       else
       {
        cin>>e;
        array[k]=e;        //eingabe in array speichern
        k++;               //k erhöhen für naechsten arraywert
        c++;               //c erhöhen,damit man weiß wieviel werte drin sind
       }
      }
      GetIt();            //wenn 0 eingegeben dann anzeigefunktion aufrufen
      }
    
    private:
     void GetIt()
      {
       cout<<"Sortierte ausgabe der Daten"<<endl;
       sortar();                 //erst array sortieren
       for (int i=0;i<c;i++)
       {
        cout<<array[i]<<endl;    //alle anzeigen lassen
       }
      }
    
     void sortar()
     {
       do
       {
        sortiert=true;
        for (int i =0;i<c;i++)
         {
          if (array[i]>array[i+1])            //bubblesort(aber selber geschrieben)
          {
           int temp=array[i];
           array[i]=array[i+1];
           array[i+1]=temp;
           sortiert=false;
           }
         }
        }
        while(!sortiert);
     }
      int array[];                //array um werte zu speichern
      static int c;
    }t;
    int test::c=0;
    
    int main(int argc, char* argv[])
    {
    t.SetIt();                    
    getch();       return 0;
    }
    

    ist das si halbwegs vernünftig geloest, oder geht das viel viel besser??

    Bin noch anfaenger!



  • Es geht besser.

    Besser kommentiert
    Besser formatiert
    Bessere Variablennamen ausgesucht

    Das Objekt besser definiert
    Keine globalen variablen verwendet
    Deklaration und Implementation gehören getrennt...

    ... gäb bestimmt noch mehr... aber ist ja nicht meine Aufgabe.



  • Also besser kommentiert logisch
    extra deklariert, hat ich jetzt keine lust.....=/
    besser formatiert? hm....
    ja variablennamen nehm ich bei richtigen projekten schon ordentlich,nur hier wollt ich schreibarbeit sparen
    Objekt besser definiert? hm...
    Wie kann ich das sortiert besser einsetzten?

    Aber wie wird die eigentliche Aufgabe mit der Klasse gelöst?



  • Aufgabenloeser schrieb:

    Wie kann ich das sortiert besser einsetzten?

    Wo findet Soritert denn verwendung?

    Was passiert mit 2 Instanzen von test? Wieso ist Programmufunktionalität (einlesen, ausgeben) in deiner klasse?

    Aufgabenloeser schrieb:

    Aber wie wird die eigentliche Aufgabe mit der Klasse gelöst?

    Wie wärs wenn du dich hinsetzt und die Anwendung einfach testest?



  • Klasse um eingaben zu speichern, solange keine null eingegebn wird!
    Wenn 0 eingegeben alles werte sortiert ausgeben!

    Zuviele Aufgaben für eine Klasse.

    Deine Lösung ist für eine C++-Lösung deutlich zu kompliziert.
    Schau dir mal std::sort, std::vector oder gleich std::multiset an.
    Dazu noch std::copy und std::ostream_iterator.

    Statt der Kommentare solltest du lieber vernünftige Bezeichner für deine Variablen/Funktionen verwenden. Und wenn du schon kommentierst, dann bitte nicht sowas wie "//eingabe in array speichern". Das steht bereits im Code.

    Hier mal eine (ungetestete) Alternativversion:

    class NumberReader
    {
    public:
    	NumberReader() {}
    	void readWhileNotNull()
    	{
    		for (int nr = 0; (nr = readInt()) != 0; )
    		{
    			numbers_.insert(nr);
    		}
    	}
    	void writeSorted() const
    	{
    		cout << "Your numbers (in ascending order): \n";
    		copy(numbers_.begin(), numbers_.end(), ostream_iterator<int>(cout, " "));
    	}
    private:
    	NumberReader(const NumberReader&);
    	NumberReader& operator=(const NumberReader&);
    	int readInt() const
    	{
    		do 
    		{
    			int numberToRead = 0;
    			if (cin >> numberToRead)
    				return numberToRead;
    			cout << "Please enter a valid integer." << endl;
    			cin.clear();
    			cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    		} while (true);
    	}
    	std::multiset<int> numbers_;
    };
    int main()
    {
    NumberReader r;
    r.readWhileNotNull();
    r.writeSorted();
    return 0;
    }
    

    Letztlich sollte man die einzelnen Aufgaben aber voneinander trennen.



  • junix schrieb:

    Wie wärs wenn du dich hinsetzt und die Anwendung einfach testest?

    Ja funktionieren tut alles =), wollte mehr wissen, ob die klasse aber auch nur 1/10 so groß sein muesste, oder ähnliches!

    junix schrieb:

    Aufgabenloeser schrieb:

    Wie kann ich das sortiert besser einsetzten?

    Wo findet Soritert denn verwendung?

    Was passiert mit 2 Instanzen von test? Wieso ist Programmufunktionalität (einlesen, ausgeben) in deiner klasse?

    Hmmm, also wuerde die 2te Instanz dann also auch auf das sortiert zugreifen! Also das sortiert in klasse als true deklarieren?!

    Wieso programmfunktionalität?
    hm...na damit ich mit der klasse was machen kann! ICh starte eben mit einlesen, und das ausgeben ist eben zur kontrolle!



  • Ist das eine Orginalaufgabe aus der Schule/Uni?
    Wenn nicht, schmeiß den Code weg (schreib 2 Funktionen für std::vector, die zur Not in einer Klasse), ansonsten:

    Hast du das ganze schon mal durch den Compiler gejagt?

    int array[]; // das funktioniert nicht
    
    // selbst wenn, spaetestens hier krachts:
    void sortar() {
    // ...
      for (int i =0;i<c;i++) {
        if (array>array[i+1]) // <--- array[i+1] gibt's nicht
    
    // in SetIt:
    if(e==0){}
    else
    {
    // ...
    }
    // was soll das denn? Schreib gefaelligst was du meinst:
    if (e != 0)
    

    Warum ist [i]c* static? Und sortiert global?
    Selbst wenn das funktionieren würde, was passiert mit c wenn du das Objekt zwei mal benutzt?



  • Aufgabenloeser schrieb:

    Ja funktionieren tut alles 🙂

    Theoretisch oder auch praktisch?

    Aufgabenloeser schrieb:

    Wieso programmfunktionalität?
    hm...na damit ich mit der klasse was machen kann! ICh starte eben mit einlesen, und das ausgeben ist eben zur kontrolle!

    Es geht darum das deine Zahlen in einem container und die Ein- und Ausgabe davon getrennt sein sollten. cin in einer Datenstruktur zählt (IMAO) zu den übelsten Abscheulichkeiten.

    @Foren-Experten
    Kann man irgendwie gültige BBTags als Text in die Beiträge bringen, irgendendetwas wie [i]?



  • finix schrieb:

    @Foren-Experten
    Kann man irgendwie gültige BBTags als Text in die Beiträge bringen, irgendendetwas wie [i]?

    Zur not kannst du BBTags deaktivieren, sowie ichs in diesem Beitrag mach [i], [b], dann mal schauen, was mit dem [quote] passiert.



  • [quote="Gast221212"][quote="finix"]@Foren-Experten
    Kann man irgendwie gültige BBTags als Text in die Beiträge bringen, irgendendetwas wie [i]?[/quote]

    Zur not kannst du BBTags deaktivieren, sowie ichs in diesem Beitrag mach [i], [b], dann mal schauen, was mit dem [quote] passiert.[/quote]

    Jubel, das geht, aber code geht dann bestimmt nicht mehr: [b] [i],

    int foo;
    

    ?



  • Also, mit vectoren hab ich noch nicht gearbeitet!

    Und ja das funktioniert ohne fehler, keine warnung nix!

    Das mit dem if, sorry, hab vergessen das raus zu nehmen bevor ich gepostet habe!



  • wie gesagt, ich bin erst anfänger, also nioch so komplizierte sachen reinwerfen! 🙄 🙄



  • Aufgabenloeser schrieb:

    Aufgabe:
    Klasse um eingaben zu speichern, solange keine null eingegebn wird!
    Wenn 0 eingegeben alles werte sortiert ausgeben!
    ...
    ist das si halbwegs vernünftig geloest, oder geht das viel viel besser??

    je nach anspruch. viele meinen sicherlich, man müßte voll viele klassen nehmen, einen supa-dupa-sortieralgo und so sachen.
    ich bin da anderer meinung, und meine, daß ein anfänger sich auch wie ein anfänger benehmen sollte. und das heißt erstmal, ein angemessenes verfahren finden (hier insertion-sort mit der einlese-schleife verspleißen). und dann einigermaßen lesbaren code erzeugen. die profis sollten übrigens genaus vorgehen, auch wenn sie es nicht gerne hören.

    das ergibt dann folgenden, fast sogar als lesbar zu bezeichnenden code. (unter vermeidung von std::sort, weil ich meine, man soll sowas erst selber üben, bevor man fremdes nimmt).

    int main(){
       int array[1024];/hoffentlich isses genug. 1024 statt 1000 nur wegen stil
       //besser wäre vector<int> und push_back, aber erstmal egal.
       int anzahl=0;
    
       for(;;){//endlosschleife vermeidet hier doppelten code
          cin>>array[anzahl];//neuen wert hinten eintragen
          if(array[anzahl]==0)
             break;
          int i=anzahl-1;
          while(i>=0 && array[i]>array[i+1]){
             swap(array[i],array[i+1]);
             --i;
          }
          ++anzahl;
       }
       for(int i=0;i!=anzahl;++i)
          cout<<array[i]<<' ';
    }
    


  • 2 Fragen @ volkard:

    1: also würdest du sagen,wäre meine lösung erstmal ok?
    2: zu deiner lösung, wie kann ich die so ungefähr in eine klasse bauen?
    3: 😉 Wieso wird i immer vermindert? 😕

    Sorry wenn jetzt vollnub fragen dabei sind, aber ich möchte alles genau wissen 🙂



  • Aufgabenloeser schrieb:

    2 Fragen @ volkard:

    bitte genauer zählen. *g*

    1: also würdest du sagen,wäre meine lösung erstmal ok?

    hab deine nicht so ganz genau angeguckt. der eine überlauf wurde ja schon entdeckt. ka, ob andere fehler drin sind. aber wenn sie fehlerfrei ist, ist sie auch ok. kein schrecklicher stil zu finden.

    2: zu deiner lösung, wie kann ich die so ungefähr in eine klasse bauen?

    na, wenns denn echt sein muss.

    class SortedArray{
    private:
       int array[1024];
       int anzahl;
    public:
       void push(int x){
          array[anzahl]=x;
          int i=anzahl-1;
          while(i>=0 && array[i]>array[i+1]){
             swap(array[i],array[i+1]);
             --i;
          }
          ++anzahl;
       }
       void print(){
          for(int i=0;i<=anzahl;++i)
             cozt<<array[i]<<' ';
       }
    };
    int main(){
       SortedArray a;
       for(;;){//endlosschleife vermeidet hier möglicherweise doppelten code
          int x;
          cin>>x;
          if(x==0)
             break;
          a.push(x);
       }
       a.print();
    }
    

    3: 😉 Wieso wird i immer vermindert? 😕

    ich hab sagen wir mal 2 4 5 8 im array. dann hänge ich ne neue zahl dran, ich lese die 3.
    2 4 5 8 3
    dann muss ich die 3 einsortieren. das mache ich, indem ich zuzerst die 8 mit der 3 vergleiche und gegebenenfalls tausche
    2 4 5(3 😎
    dann die 5 mit der 3
    2 4(3 5)8
    und so weiter. aufhören muss es, wenn ich am ersten arrayplatz bin oder wenn einmal nicht vertauscht werden musste.

    Sorry wenn jetzt vollnub fragen dabei sind, aber ich möchte alles genau wissen 🙂

    das gehört sich auch so.



  • int array[1024];/hoffentlich isses genug. 1024 statt 1000 nur wegen stil

    Bin ich absolut nicht mit einverstanden. Entweder du machst es richtig oder du programmierst in einer Sprache mit Laufzeitchecks. Wir sind nicht mehr 1974. Es wird langsam mal Zeit, dass man aufhört den Leuten sowas beizubringen.
    Einem C++ Anfänger würde ich gleich std::vector ans Herz legen. Und wer C programmieren will, der soll in den sauren Apfel beißen und Memory-Management lernen. Das aller mindeste wäre aber ein Check in der Schleife.
    Und dann gleich weiter: Was ist 1024? Ich habe immer gedacht man solle magic-numbers vermeiden und stattdessen Konstanten verwenden die Ausdrücken was los ist.

    cin>>array[anzahl];//neuen wert hinten eintragen

    Bin ich absolut nicht mit einverstanden. cin ist eine Schnittstelle zwischen der gemeinen Außenwelt und unserem schönen Wohnzimmer. Da wir nicht mehr 1394 und noch nicht 2426 sind, sprich es also böse Menschen/Maschinen gibt gehört eine Eingabe geprüft. Immer. Auch bei Anfängern.

    Den Rest des Codes würde ich nicht unbedingt als verständlich bezeichnen, aber das muss jeder für sich selbst entscheiden.



  • HumeSikkins schrieb:

    Bin ich absolut nicht mit einverstanden. Entweder du machst es richtig oder du programmierst in einer Sprache mit Laufzeitchecks. Wir sind nicht mehr 1974. Es wird langsam mal Zeit, dass man aufhört den Leuten sowas beizubringen.

    das ist dein problem. nicht meines.

    Da wir nicht mehr 1394 und noch nicht 2426 sind, sprich es also böse Menschen/Maschinen gibt gehört eine Eingabe geprüft. Immer. Auch bei Anfängern.

    auch das ist nicht mein problem.

    du kannst ja mal versuchen, den nubes alles auf einmal gleichzeitig beizubringen. viel spaß dabei. erfolg zu wünschen wäre unfug, der stellt sich bei dem ansinnen eh nicht ein.



  • hm...nun verwirrt ihr mich!

    bei vector bin ich noch nciht, und wollte die aufgabe mit den mitteln löse die ich bis jetzt beherrsche!

    DAs bedeutet wir müssen den kontext der aufgabenlösung eingrenzen(eben ohne vectoren)! Sorry das ich noch nich so weit bin!

    Wieso ist der code denn nicht verständlich?

    Wie geasgt ich freue mich über jede kritik, aber bitte mit erklärung ich wills besser machen!



  • Aufgabenloeser schrieb:

    bei vector bin ich noch nciht, und wollte die aufgabe mit den mitteln löse die ich bis jetzt beherrsche!

    haste schon new und delete? falls ja, kannste noch dafür sorgen, daß man keine 1024 oder sowas vorgeben muss, sondern machen, daß das array immer wieter wächst. aber ist meiner meinung nach ehrlich nicht so wichtig erstmal.

    DAs bedeutet wir müssen den kontext der aufgabenlösung eingrenzen(eben ohne vectoren)! Sorry das ich noch nich so weit bin!

    zum beispiel, daß der user nur zahlen eingeben wird.

    Wieso ist der code denn nicht verständlich?

    weil die profis nur code zulassen, der so aussieht:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <iterator>
    using namespace std;
    
    int main(){
    	vector<int> v;
    	copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(v));
    	sort(v.begin(),v.end());
    	copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
    }
    

    der ist nämlich viel verständlicher, weil man nur die fertigen funktionen copy und sort geeignet aufrufen muss.
    naja, freu dich einfach drauf, daß du bald sowas auch machen kannst. damit wird manches (aber nicht alles!) echt angenehmer.



  • =)!

    Na das sortieren wollt ich ja selber machen, zum üben eben! Mir fallen selbser keine aufgaben so ein!

    Da freu ich mich auch schon drauf, new und delete ja schon etwas!
    meinst du das:

    int size = 1024;
    int* array = new int[size]
    
    delete[] array
    

    ????

    aber wie gesagt templates und vectoren bin ich noch nich!
    ich hänge bei klassen und zeigern (kommt mir sehr kompliziert vor, und ich habe keine aufgaben zum üben) 🙄


Anmelden zum Antworten