Eure Meinung



  • Also Stings kanns du mir da eine Seite darüber empfehlen weil ich immer wenn
    ich strings nutzen will mit gets,fgets und getline auf die nase gefallen weil
    die nur chars wollen. 😞
    OOP ich komme irgendwie nicht dahinter. Das ist doch einfach um funktion
    einfacher zu sehen,übersichtlicher. oder? 😕



  • Stefan311 schrieb:

    Also Stings kanns du mir da eine Seite darüber empfehlen weil ich immer wenn
    ich strings nutzen will mit gets,fgets und getline auf die nase gefallen weil
    die nur chars wollen. 😞
    OOP ich komme irgendwie nicht dahinter. Das ist doch einfach um funktion
    einfacher zu sehen,übersichtlicher. oder? 😕

    Nein. Einfach gesagt, ist es lediglich ein Abstraktionsmittel, um Gegenstände der realen Welt oder unserer Anschauung zu einem "Ding" in einem Programm zusammenzufassen. Du schaust dir an, was für Eigenschaften dein Betrachtungsgegenstand hat und welche Aktionen es ausführen kann. Eine Katze hat z.B. ein Gewicht, eine Augenfarbe, ein Alter usw. und kann fressen, schlafen, miauen usw. Also kapselst du das alles in eine Klasse Katze mit den Objektvariablen gewicht, augenfarbe und alter und den Methoden fressen(), schlafen und miauen(). (Sry für das Beispiel 😃 )

    Du solltest jedoch nicht versuchen (wie du es gerade gemacht hast), auf Teufel komm raus Funktionen in eine Klasse zu pressen, nur um irgendwie OOP zu programmieren.



  • Nein. Einfach gesagt, ist es lediglich ein Abstraktionsmittel, um Gegenstände der realen Welt oder unserer Anschauung zu einem "Ding" in einem Programm zusammenzufassen. Du schaust dir an, was für Eigenschaften dein Betrachtungsgegenstand hat und welche Aktionen es ausführen kann. Eine Katze hat z.B. ein Gewicht, eine Augenfarbe, ein Alter usw. und kann fressen, schlafen, miauen usw. Also kapselst du das alles in eine Klasse Katze mit den Objektvariablen gewicht, augenfarbe und alter und den Methoden fressen(), schlafen und miauen(). (Sry für das Beispiel 😃 )

    Also ich weiß ja wie du es meinst (so hab ich mir das mit den klassen auch gedacht).
    Aber ich verstehe nicht wie ich das jetzt hier einsetzen soll? 😕
    Da jemand das auf der ersten seite erwähnte. OOP geht hier nicht ja.(?)



  • Also ich hab jetzt probiert mehr stings zu nutzen und die klasse erstmal bei
    behalten.
    Was hält ihr jetzt davon ist es so besser(lesbarkeit)
    main.cpp

    #include <iostream>
    #include <string>
    #include <fstream>
     #include "Klassen.hpp"
    
    using namespace std;
    
    int erststart();
    
    prog program;
    
    int main()
    {
    	int i;
    	int a;
    
    	while(a)//endloss schleife
    	{
         if(program.dateipruefer()==true)//Dateien überprüfen(im momen verfäscht da man sonst nichts testen kann)
         {
             program.loescheall();
             erststart();
         }
         else
    	cout<<"V0.1(alpha) (C) by Stefan Veuskens\nVerschluesslungstool fuer Texte(Sicherheit: Niedrig)\n [1] Ver- oder Entschluesseln | [2] Ende\n";
        cin.clear();
        cin>>i;//auswahl(wird bald ersetzt
        if(i==1)
         {
         int swit;          //Modus für crypter
         int key;                          //Schlüssel
         string dname;              //Datei name
         cout<<"\n[1]Ent- oder [2]Verschluesseln?\n";
         cin.clear();
         cin>>swit;                 //Modus auswählen,wird auch bald ersetzt
         cout<<"\nDateiname: ";
         getline(cin,dname);
         getline(cin,dname);        //Datei name einlesen(mit einmal klappt das nicht,warum weiß ich nicht)
         cout<<"\nKey: ";
         cin>>key;      //key eingebn
         if(program.einlesen(dname,key,swit)==false) //einlesen verschlüsseln speichern und fehler meldung
         {
             cout<<"Datei konnte nicht geoeffnet werden.\nTipp:Existiert sie?\nTippfehler?\nWenn die Datei sich in einem ander ordner\n";
             cout<<"befindet als das Verschluesslungstool muessen sie einen ganzen pfad angeben.\n";
         }
         else
         {
         cout<<"\nErfolgreich beendet\n";       //Hat geklappt
         }
         }
    else
    {
    
    	cout<<"Bis dann.";
    	cin.get();
    	cin.get();
    	break;      //Zum beenden.
    }
    	}
    		return 0;
    }
    
    int erststart()//Hat noch keine aufgabe
    {
    
    }
    

    die Include

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <windows.h>
    
    using namespace std;
    
    class prog
    {
    private:
    int lange;      //für V0.2
    //int i;
    ifstream in;    //einlesen
    ofstream out;   //auslesen(eigentlich klar)
    char pws[];     //für V0.2
    //bool an;      //Wird nicht mehr gebraucht
    
    public:
    
    int loescheall()        //für V0.2
    {
           remove("keys.txt.crpt");
           remove("psw.txt.crpt");
           remove("langa.txt.crpt");
    
    };
    bool dateipruefer()     //für V0.2
    {
       in.open("psw.txt.crpt");
       if(!in)
    {
        in.clear();         //Wenn sie nicht existiert wird false zurück gegeben
        return false;
    }
    else
    {
      in.clear();
      return true;          // ''  ''   ''     ''       ''  true    ''      ''
    }
    };
    
    char crypt(char ch,char key)//verschlüsseln/entschlüsseln
    {
        cout<<".";
        return ch+key;
    }
    bool einlesen(string dname,char key,int swit)//einlesen
    {
       string ende=".crpt";        //Datei ende für neue datei
       char ine[80];               //char für denn Datei namen
       strcpy(ine,dname.c_str());  //kopieren aus string in char
       in.open(ine);               //öffnen(Test)
       if(!in)                     //Fehler ob existiert
        {
        return false;
        }
    
    if(swit == 1)               //modus (decrypten)
      {
        dname;                  //Dateiname
        key=key/-1;      //key negativ machen da ja entschlüsselt werden soll
        int pos=dname.rfind(ende);      //suche nach .crpt
        dname.erase(pos);               //löschen von .crpt
        char out2[80];                  //char für dateiname
        strcpy(out2,dname.c_str());     //kopieren string>>char
    
        out.open(out2);                 //öffnen(erstellen)
        while(!in.eof())                //verschlüsseln
         {
           char ch=in.get();
           out<<crypt(ch,key);         //decrypten
    
          }
       }
     else
       {
    
       dname=dname + ende;      //.crpt dranhängen
       char out2[80];              //char für dateinamen
       strcpy(out2,dname.c_str());//kopieren string>>char
    
       out.open(out2);             //öffnen(erstellen)
       while(!in.eof())                //verschlüsseln
          {
              char ch=in.get();
              out<<crypt(ch,key);         //crypten
    
           }
    
        }
        return true;//hat geklappt
     }
    
    };
    

    Nur so sollte man zeilen zwischen den Befehlen lassen?

    Editiert:einnrückungen



  • wie oft wurde dir jetzt eigentlich schon gesagt du sollst die einrückung ordentlich und einheitlich machen?

    ich nehm jetzt einfach mal zufälligerweise ein stückchen heraus...

    // deutscher funktionsname ... hmm find ich nicht so praktisch
    bool dateipruefer()
    {
       in.open("psw.txt.crpt"); // ok
       if(!in) //... ok (gibt aber bessere methoden dafür soweit ich weiß)
       // ich kenn das eigentlich so, dass die { und } klammern unter 
       // das schlüsselwort (hier if) kommen, nicht ganz an den anfang der zeile...
       // man könnte meinen das hier gehört nicht mehr zu dateipruefer...
    {
        in.clear();
        return false;
    }
    // das hier gehört immer noch zu "dateipruefer", sollte also auch so eingerückt  
    // werden, das else sollte IMMER in der gleichen einrückung sein wie das
    // zugehörige if, egal welchen komischen stil du hast, sowas ruiniert total die 
    // übersichlichkeit
    else
    {
      // und auf einmal benutzt du wieder eine andere einrückung...
      // mitlerweile weiß wohl niemand mehr der den code liest wozu das hier gehört
      in.clear();
    
      // seltsamer kommentar...
      return true;          // ''  ''   ''     ''       ''  true    ''      ''
    }
    

    So wäre das doch schonmal besser:

    // hab leider(gottseidank) nicht den gesammten quellcode gelesen, bennen die
    // funktion einfach nach dem, was sie macht bzw. prüft in englisch.
    // wenn ich das richtig sehe wird die datei hier geöffnet und zusätzlich geprüft
    // oder wird die hier nur schnell geöffnet um geprüft zu werden? (und das
    // mit einer membervariable vom typ fstream o.O??)
    // wenn ja ist das 
    // mist, denn man öffnet die datei nur einmal und prüft sie dann, aber das is ja 
    // deine sache das zu verbessern...
    
    // also:
    bool open_file_whatever(std::string filename)
    // dateinamen sollte man dynamisch halten...
    {
       in.open(filename);
       if(!in) // hab keine lust mich darüber zu informieren, ich glaub .good() war
               // die beste methode um sowas zu checken, aber was solls
       {
          in.clear();
          return false;
       }
    
       // das else wird nicht benötigt, auf grund des return false'es
       in.clear();
       return true;
    }
    


  • wie oft wurde dir jetzt eigentlich schon gesagt du sollst die einrückung ordentlich und einheitlich machen?

    ich nehm jetzt einfach mal zufälligerweise ein stückchen heraus...

    // deutscher funktionsname ... hmm find ich nicht so praktisch
    bool dateipruefer()
    {
       in.open("psw.txt.crpt"); // ok
       if(!in) //... ok (gibt aber bessere methoden dafür soweit ich weiß)
       // ich kenn das eigentlich so, dass die { und } klammern unter 
       // das schlüsselwort (hier if) kommen, nicht ganz an den anfang der zeile...
       // man könnte meinen das hier gehört nicht mehr zu dateipruefer...
    {
        in.clear();
        return false;
    }
    // das hier gehört immer noch zu "dateipruefer", sollte also auch so eingerückt  
    // werden, das else sollte IMMER in der gleichen einrückung sein wie das
    // zugehörige if, egal welchen komischen stil du hast, sowas ruiniert total die 
    // übersichlichkeit
    else
    {
      // und auf einmal benutzt du wieder eine andere einrückung...
      // mitlerweile weiß wohl niemand mehr der den code liest wozu das hier gehört
      in.clear();
    
      // seltsamer kommentar...
      return true;          // ''  ''   ''     ''       ''  true    ''      ''
    }
    

    So wäre das doch schonmal besser:

    // hab leider(gottseidank) nicht den gesammten quellcode gelesen, bennen die
    // funktion einfach nach dem, was sie macht bzw. prüft in englisch.
    // wenn ich das richtig sehe wird die datei hier geöffnet und zusätzlich geprüft
    // oder wird die hier nur schnell geöffnet um geprüft zu werden? (und das
    // mit einer membervariable vom typ fstream o.O??)
    // wenn ja ist das 
    // mist, denn man öffnet die datei nur einmal und prüft sie dann, aber das is ja 
    // deine sache das zu verbessern...
    
    // also:
    bool open_file_whatever(std::string filename)
    // dateinamen sollte man dynamisch halten...
    {
       in.open(filename);
       if(!in) // hab keine lust mich darüber zu informieren, ich glaub .good() war
               // die beste methode um sowas zu checken, aber was solls
       {
          in.clear();
          return false;
       }
    
       // das else wird nicht benötigt, auf grund des return false'es
       in.clear();
       return true;
    }
    


  • ups, hab ich dich ja glatt gleich 2 mal mit einem post erfreut 😃



  • Ok das mit der einen einrückung hab ich übersehen.Das war aber auch nur das einzige
    falsch eingerückte.

    Das mit in soll nur gucken ob diese Datei existiert. Ich will sie ja nicht durchgehen.



  • man öffnet eine datei nicht erst um zu gucken ob sie existiert, schließt sie dann und öffnet sie dann nochmal.

    einmal öffne, checken ob der fstream ok ist(die datei existiert) mit .good() und dann weiterarbeiten oder abbrechen.



  • Also dies mit dateien prüfen soll irgendwann mit variablen arbeiten.
    Also ne "richtige" Funktion. Eine Frage wenn ich in der Klasse
    eine Variable deklariere also so:

    class mathe
    {
      private:
      int i;
      int b;
      int c;
      public:
      int rechne(i,b);
      c = i + b;
      return c;
    }
    

    Ist das erlaubt/möglich?



  • mein ich's nur, oder ist der Thread schon viel zu lange...

    Ist das erlaubt/möglich?

    Nö, denn der Compiler wird es nicht fressen, du hast Code, der in ne Funktion gehört, leer im Raum stehen.
    So geht's:

    class Mathe {
      //int i,b,c;  die braucht deine Klasse nicht.
    
    public:
      int rechne(int, int);
    };
    
    //Diese Methode wird addieren
    int Mathe::rechne(int x, int y) {
      return x+y;
    };
    

    MfG

    GPC


Anmelden zum Antworten