Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Ist dieser Quelltext wirklich empfehlbar?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.03.2008, 11:18 Uhr
~urilaiberl
Gast


Hallo,

ich habe durch Zufall diesen Quelltext in einem Tutorial online gefunden. Die Seite auf der ich das Fand gab es leider nicht mehr, daher kopiere ich mal den Code hier rein:


C++:
Eingabefunktion in C


class eingaben{
                private:
                unsigned char c;
            short curpos;

                public:
                char eingabe (char *eing,short zeile,short spalte,short laenge);
            char fz,                  //Füllzeichen
                    f_autoende,    //1=Ende bei vollem Feld
                    f_autocurpos,  //1=Curpos auf Eingabeende
                  einf_mod;        //Einfügemodus 1
            short curpos_ende,   //Curpos beim Endezeichen
                  curtyp,       //Cursorart
                  textfarbe,
                  hintergrund,
                  ende,                //endekriterium 2 bei Überlauf sonst 1
                  zeile,spalte,laenge;

            eingaben();             //Konstruktor anmelden
            };
char eingaben::eingabe  (char *eing,short zeile,short spalte,short laenge)
{

//einstellungen!
_setcursortype(curtyp);//Cursorart!!
textcolor(textfarbe);  //Farbe
textbackground(hintergrund);


int i;
ende=0;
if((curpos=strlen(eing))<laenge)  //wenn Übergabe < laenge curpos ist Länge
{ for(i=strlen(eing);i<laenge;i++) eing[i]=fz; //bis Stringende füllen
}
else curpos=laenge-1;
eing[laenge]='\0';                 //Stringende setzen

do                        // Beginn der Eingabe
{
    gotoxy (spalte,zeile);cputs(eing);   //Ausgabe der Vorgabe
    
    /*     // Eigener Cursor oder Ereignishandler//
    while (!kbhit())          //  keine Taste gedrückt  Cursor blinken
        {if (i++/blink<1){gotoxy (spalte+curpos,zeile); cout<<'<';}
            else if (i++/blink<2){gotoxy (spalte+curpos,zeile); cout<<eing[curpos];}
                else     i=0;
    }             // ++++ Taste wurde gedrückt +++
     gotoxy (spalte+curpos,zeile); cout << eing[curpos];   // Eingabe wiederherstellen
     */

    
gotoxy (spalte+curpos,zeile);       //Cursor setzen

c=getch();

    if (c>31)              // zugelassenes Zeichen ?
      {                          // an Cursorpos einfügen
        if (einf_mod)        //Einfügemodus ist ein
     { if (eing[laenge-1]==fz)                      // noch Platz in der Eingabe?
          { for (i=laenge-1;i>curpos;i--)eing[i]=eing[i-1];    //  Platz für Eingabe
           eing[i]=c;                           // C einfügen
        } else if(f_autoende)ende=2;               //ende kein Füllzeichen aber Autoende
         }else {eing[curpos]=c;                                // Ende Einfügemodus C überschreiben
       if (curpos<laenge-1)curpos++;                  // Cursorpos weiterschieben    
     }                  // Ende zulässiges Zeichen einfügen


    else                  //  ++++ Steuerzeichen eingegeben?
     {
      if(c==0)c=getch();     // doppeltes Steuerzeichen
     switch(c)                   //Auswahl nach gedrückter Steuertaste
        {
         case 8: //BS gedrückt
                    if (curpos)if (curpos<laenge)
                    { curpos--;
                    for (i=curpos;i<laenge-1 ;i++)
                         eing[i]=eing[i+1];
                         eing[i]=fz;
                    }
                     break;
          case 75: //cursor links
                     if (curpos)curpos--;
                     break;
          case 77: //cursor rechts
                     if (curpos<laenge-1)curpos++;
                     break;
case 82: //Einfuege Taste
                    if(einf_mod==1){einf_mod=0;curtyp=_SOLIDCURSOR;}
                               else{einf_mod=1;curtyp=_NORMALCURSOR;}
              _setcursortype(curtyp);
                     break;

          case 83: //Entferne Taste
                    for (i=curpos;i<laenge-1 ;i++)
                         eing[i]=eing[i+1];
                         eing[i]=fz;
                     break;
         default:    //Ende der Eingabe
                    ende=1;
             } //switch Ende
    }     // Steuerzeichen Ende
  }  while (!ende);   //Eingabeende
    //Füllzeichen abschneiden
    while(eing[--laenge]==fz);
    eing[++laenge]='\0';
   curpos_ende=curpos;
  return c;
}                            //Funktionsende

eingaben::eingaben()           //Konstruktor
{
gotoxy(50,1);cout <<"konstruktor";
fz='_';                        
f_autoende=0;                    
f_autocurpos=1;                     sein soll
curpos_ende=0;                    //letzte curpos
einf_mod=1;                    
curtyp=_NORMALCURSOR;              


textfarbe=LIGHTGRAY;         // BLACK 0  BLUE  GREEN CYAN RED MAGENTA BROWN
hintergrund=BLACK;        //LIGHTGRAY 7 DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN
                                 //LIGHTRED 12 LIGHTMAGENTA YELLOW WHITE BLINK 128
}
the end. the end.



Ich will mal gerne wissen ob Ihr das als guten Stil findet? Ich komme damit irgendwie nicht so gut zurecht, da es sich nicht so gut liest.

Daher meine Frage. Ist es sinnvoll sowas als Tutorial anzubieten oder hat das eher den gegenteiligen effekt?

denn als ich das fand hab ich mich echt gefragt ob sowas für ein tutorial gut ist.

bitte um eure meinung

uri
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.03.2008, 12:51 Uhr
0xdeadbeef
Gott
(Operator)


Das ist ja direkt widerlich. Wenn's ein Tutorial über das alte DOS-API ist, kann man sowas vielleicht machen, aber auch dann sieht es mir ein bisschen danach aus, als habe der Schreiber hier nur zur Hälfte verstanden, was er da tut.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.03.2008, 13:37 Uhr
~urilaiberl
Gast


Hallo,

ja mir kam das auch so komisch vor. Zumal noch der Titel. Das ist keine Funktion, und C kennt ja nicht mal Klassen. Mir kam es so vor als ich das gelesen habe, als ob der nicht mal den Unterschied zwischen C und C++ kennt.

Ich hab noch so ein Beispiel von diesem nicht mehr verfügbaren Tutorial:


C++:
Programmbeispiel Binärbaum:
/*Binärbaum */

#define DATEI "c:\\verket.lst"
#define DATEI1 "c:\\verket.lst"

//#include "\\fileserver2\daten\beck\C\quellen\header\eingabe1.h"

class satz{     private:
        char *name,*bem;
            satz *gr; satz *kl; satz *z;
            static satz *ROOT,*akt ;
            static char error[9][16];
            static int err;
            static FILE* in, *out;
        public:
            satz(){;}
            ~satz(){speichern();cout<<"destruktor";}
            void satz_erzeugen();
            void satz_neu(char*,char*);
            int laden();
            void speichern();
void satz_suchen(char *such);
satz * einbaustelle(satz *x,char *such);
satz * vorher() ;
satz * naechster();
satz * erster();
char * letzter();
void  ausgabe();
void  alle();
        char* Name(){return name;}
                    char* Bem(){return bem;}
                    satz* kl_speichern(satz*i);
                   void satz_speichern(satz*);
    };                     //ende class

// Methoden

/*Datei von einer Textdatei lesen und die Daten im Binärbaum (satz_neu)aufbauen
  dabei wird von einer unsortierten Struktur siehe Binärbaum speichern,
  ausgegangen */


int satz::laden()
{ in=fopen(DATEI,"rb");
    if(!in){return 0;}
     int i;
for (i=0;!feof(in);i++){    char *name=finput(in);         //Name = Schlüssel
             char *bemerkung=finput(in);
             satz_neu(name,bemerkung);
                              }
  fclose(in);
  return i;
}


void satz::speichern()
{ out=fopen(DATEI1,"wb");
    if(!out){err=2;return;}

  /* um einen vergleichsweisen Neuaufbau des Baumes sicherzustellen, wird der
  Baum zweigweise abgespeichert. Dazu wird immer ein kompletter Kleinerzweig ab
  dem Knoten zum Größerzweig gespeichert. Bei der Root also zuerst der komplette
  Kleinerzweig.
  (Speichern eines Kleinerzweiges -ein Satz ist immer vorhanden)
  Am Ende des kl-zweiges den Schlüsselbegriff für spätere Vergleiche retten und
  den Satz auf den gr_zeiger setzen und dort wieder den
  kl-zweig speichern (er kann , wenn es keinen weiteren kl-zeiger gibt, aus nur
  einem satz bestehen).
  Ist kein gr-zeiger vorhanden, dann muss über den Rückzeiger
  solange im Baum zurückgegangen werden, bis zu dem knoten, dessen wert größer
  als der aktuelle ist. Der dort gefundene gr-zeiger setzen,
  er zeigt auf den nächsten kl-zweig, der gespeichert wird.
  Das Ende wird erreicht, wenn der Rück-zeiger = 0 (rückzeiger des ROOT- Satzes)
  ist. (man erreicht -im Normalfall- zum zweiten mal den ROOT- Satz, diesmal vom
  größer-Zweig und man müßte jetzt einen Knoten zurück)
  */

   satz *i=ROOT;
    if (!i){fclose(out);err=2;return;}       //kein aktueller Datensatz zum weiterlesen

  //1.Kleinerzweig
  i=kl_speichern(i);                   //Kleinerzweig der ROOT speichern
  do{
        while( i->gr) {i=i->gr;        // gibt es einen größerzeiger  dann nachsetzen
                 i=kl_speichern(i);
               }
         // es gibt keinen Gößerzeiger daher im Baum zurück
        char *verg=i->name;              //aktuellen Vergleichswert retten
         while (i->z){i=i->z;              //Vorgänger laden wenn es einer im Baum ist
          if (strcmp(i->name,verg)>0) break;//ist Vorgänger > Vergleich dann Knoten gefunden
         }
      }while (i->z);                
  // letzter satz bereits gespeichert, da im Größerzweig bei der Root angekommen.
}

satz* satz:: kl_speichern(satz*i)
             {while(i->kl){satz_speichern(i);i=i->kl;}  
              satz_speichern(i);
              return i;}
void satz::satz_speichern(satz* i)
  {
   fputs(i->name,out);fputc(13,out);fputc(10,out);
   fputs(i->bem,out);fputc(13,out);fputc(10,out);
  }



Der Quelltext ist so lange, das ist teil 1, der zweite ist im nächsten post
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.03.2008, 13:37 Uhr
~urilaiberl
Gast


Teil 2 des Quelltextes


C++:
//********************* Neuen Satz erzeugen ***********
void satz:: satz_erzeugen() // vor zeigt auf vorgänger
{char*n=input("suchbegriff eingeben  ");
char*b= input ("Bemerkung eingeben  ");
satz_neu(n,b);
}

void satz::satz_neu(char*n,char* b)
{
satz *x=new satz();        //    (satz *)malloc(sizeof(satz));
x->name=n;x->bem=b;x->kl=x->gr=0;
if (ROOT==0){x->z=0;ROOT=x;err=0;return; }           //nur bei Neuaufbau der ROOT

satz *vor=x->z=einbaustelle(ROOT,x->name);      //Vorgänger suchen und im Rückzeiger einbauen
                                                            //Zeiger des Vorgängers aktualisieren
if(strcmp(vor->name,x->name)>0)                // Vorgängername größer als akt daher Kleinerzweig
                vor->kl=x;                             // Kleinerzeiger des Vorgängers setzen
                    else vor->gr=x;                    //Sonst Größerzeiger
/* kürzer
x->z=einbaustelle(ROOT,x->name);
if(strcmp((x->z)->name,x->name)>0)(x->z)->kl=x;     //Vorgänger > akt ->Kleinerzweig
                                      else (x->z)->gr=x;     //Sonst Größerzeiger
*/

akt=x;                                      //neuer Satz =aktueller
}

satz * satz::einbaustelle(satz *x,char *such) //Suche nach diesen Satz bis zum Zweigende
{satz *i=x=ROOT;
while (x)         //solange ein Zeiger auf Datensatz existiert
{i=x; //merkt sich den Datensatzzeiger vor der Neusetzung da dieser zurückgeliefert wird
   if (strcmp(x->name,such)<=0)x=x->gr; //  Struct  auf GrößerZeiger
   else x=x->kl;     //  Struct  auf KleinerZeiger
    }
return i;  //Rückgabe des Zeigers letzten gefundenen Datensatzes (=Vorgänger)
}

// *************Datensatz suchen****************

void satz::satz_suchen(char *such)
{
satz *x=ROOT;
while (x)       //solange ein Zeiger existiert
    {if (strcmp(x->name,such)==0){akt=x;err=5;return; }//gefunden
         else if (strcmp(x->name,such)<0)x=x->gr; //  Struct  auf GrößerZeiger
                 else x=x->kl; //  Struct  auf KleinerZeiger
     } //ende while Folgezeiger existiert
err=4;
}



// ****  sequentiell vorwärts nächst größerer im Baum ***************
satz * satz::naechster()
{
satz *i=akt;
if (!i)return 0;             //kein aktueller Datensatz zum weiterlesen
char *verg=i->name;            //aktuellen Vergleichswert retten
if( i->gr){ i=i->gr;              // gibt es einen größerzeiger  dann nachsetzen
               while(i->kl)i=i->kl; // solange kleinerzeiger vorhanden nachsetzen
                akt=i;            // gefunden
            return i;
              }
     else {                          // es gibt keinen Gößerzeiger daher im Baum zurück
         while (i->z){i=i->z;          //Vorgänger laden wenn es einer im Baum ist
                             if (strcmp(i->name,verg)>0)     //ist Vorgänger > Vergleich
                                {akt=i; return i;}         //dann gefunden
                              }
         err=1;return 0;   // nicht gefunden da bei Root von größer angek.
          }
}
// ****  sequentiell rückwärts nächst kleinerer im Baum ***************
/* der nächst kleinere Datensatz ist, wenn es einen Kleiner-Zeiger gibt
   am Ende des Größer-Zweiges. Existiert kein Größerzweig, dann ist
   der unmittelbar auf den Kleinerzeiger folgende Satz
*/

satz * satz::vorher()
{
satz *i=akt;
if (!i)return 0;               //kein aktueller Datensatz zum weiterlesen
char *verg=i->name;        //aktuellen Vergleichswert retten
  if( i->kl){i=i->kl;                 // wenn es einen kleinerzeiger gibt dann dort
                  while(i->gr)i=i->gr;    // an das Ende des Größerzweiges
            akt=i;return i;          //  dort ist der nächst kleinere
            }                          //Ende if es gibt einen Kleinerzeiger
          else           // es gibt keinen Kleinerzeiger daher im Baum zurück
                 {
                  while(i->z){i=i->z;   // solange es einen Vorgänger im Baum gibt
                     if (strcmp(i->name,verg)<=0) {akt=i; return 0;} //gefunden
              //ist Vorgänger kleiner als Vergl dann war Vergl im Größerzweig
              //der mögliche Kleinerzweig kann nur kleinere Werte als der Knoten
              //haben daher ist der Knoten der nächst kleinere --> gefunden
                             }  //Ende while es gibt keinen Rückzeiger mehr
                 err=3;return 0;  // nicht gefunden da bei Root von Kleinerzweig angek.
                 }// ende else
}

// ****  sequentiell erster im Baum ***************
satz * satz::erster()
{
satz *i=ROOT; if(!ROOT)return 0;   //kein aktueller Datensatz
while(i->kl)i=i->kl; // solange Kleinerzeiger vorhanden nachsetzen
  akt=i;                // gefunden
  return i;
}

// ****  sequentiell letzter im Baum ***************
char * satz::letzter()
{
satz *i=ROOT; if(!ROOT)return 0;   //kein aktueller Datensatz
while(i->gr)i=i->gr; // solange Größerzeiger vorhanden nachsetzen
                akt=i;                // gefunden
            return 0;
}

void satz::alle()
{long nr; satz*i=erster();
char zeile[80];
for(nr=1;i;i=naechster(),nr++)
   {sprintf(zeile,"%2i  %10s   %10s   i=%p gr=%p kl=%p z=%p", nr,i->name,i->bem,i,i->gr,i->kl,i->z);
    puts (zeile);
    if (!(nr%10)){ cout<<"\nweiter mit Taste \n";getch(); }
   }
}

void satz::ausgabe ()
{
cout <<endl<< error[err]<<endl;
err=0;
if (akt)  {cout<<"aktueller satz = "<<akt->name<<'\t'<<akt->bem<<endl; }

cout<<"\nsuchen -> s\tweiter -> +\tvorher -> -\terster -> 1\tletzter -> l\n"
   << "Neu    -> n\tAlle   -> a\tEnde    -> ESC"<<endl;

}

FILE *satz:: in=0;    FILE *satz::out=0;
satz *satz::akt=0;
char satz::error[9][16]={ "              ","dateiende     ","Dateifehler   ",
                                    "dateianfang   ","nicht gefunden","wurde gefunden",
                           "              ","              ","              "};
int satz::err=0;
satz *satz::ROOT=0;

void main (void)
{
satz x;
char* such,w;
x.laden();// in konstruktor nicht möglich,da bei jeder Anlage laden aufgerufen wird;
do{
    x.ausgabe();
    switch  (w=getch())
     { case 'n':x.satz_erzeugen();break;
      case 's':such=input("suchbegriff eingeben  ");
                  x.satz_suchen(such);
               free(such);
               break;
      case '+':x.naechster();break;
      case '-':x.vorher();break;
      case '1':x.erster();break;
      case 'l':x.letzter();break;
      case 'a':x.alle();break;
          case 27:     break;
    }
  }while(w!=27);
}





Wenn ich dieses Beispiel sehe wird mir echt kotzübel. Das kann doch nicht sein das sowas in einem Tutorial erklärt wird das den Leuten einen Binärbaum näher bringen möchte?

Gruß

Uri
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.03.2008, 15:25 Uhr
Hans
Library Walker
(Operator)


Hi,

ohne das ich mir das B-Baum Beispiel jetzt näher angesehen habe, kam mir aber auch beim überfliegen des ersten Textes schon der Verdacht, das der Mensch nicht so recht wusste, was er da tut. Deshalb ist es wohl nur richtig, das dieses Tutorial nicht mehr verfügbar ist, weil es diese Bezeichnung anscheinend nicht verdient.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.03.2008, 20:04 Uhr
HansGeorg



Hallo,

also vom durchlesen her finde ich den Code auch nicht gerade vorbildlich. Wenn der wirklich so in einem Tutorial stand dann ist es nicht gerade fördernd.

Dieser Stil schreckt junge Programmierer sogar etwas ab, so kommt es mir vor.

Gruß

Hans
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: