Namensuche



  • Und woher möchte ich jetzt wissen,..dass ein Name gefunden ist?
    bzw. brauche ich dann auch das Feldelement worauf ich ja dann den NAmen abrufen kann!



  • Geht so:

    for (i = 0; i < anzahl; i++)
      { if (feld[i].name == name)
          { DoSth(feld+i); /* ohne break: für JEDE Übereinstimmung */
            /* break; */
          }
      }
    
    /* mit break: */
    if (i < anzahl)
        DoSth1(feld+i); /* für die ERSTE/EINZIGE Übereinstimmung */
      else
        DoSth2(); /* für NICHT Übereinstimmung */
    


  • also würde man es wie folgt anwenden?

    for (i = 0; i < anzahl; i++) 
        { 
           if (feld[i].name == name) 
            { 
                DoSth(feld+i); 
                break;  
          } 
      } 
    
       if (i < anzahl) 
       { 
         DoSth1(feld+i);
         Anweisung????
       } 
      else 
       {
        DoSth2(); 
       Anweisung????
       }
    

    Aber wie kann denn i > anzahl sein? bzw. was bedeutet DoSth(feld+i)???
    zudem bricht break nicht etwas ab,...
    wäre echt nett von dir, wenn du es ein wenig detalierter mir erklären kannst denn ich mchte ja daraus lernen!

    mfg

    Svolf



  • *murmelmurmel* dafür gibts doch Bücher....

    Na gut: DoSth(feld+i) steht für Do Something Function() also für irgendeine Funktion oder auch irgendeine sinnvolle Anweisung. Der übergebene Parameter ist ein Zeiger auf die aktuellen Daten des Feldes (nur so als Beispiel).

    wenn die for-Schleife durch break; abgebrochen wird, dann ist i maximal anzahl-1 d.h. umgekehrt: wenn i kleiner als anzahl ist, wurde eine Übereinstimmung gefunden.

    Ist i == anzahl, dann ist for ( ; i < anzahl; ) falsch, for wird abgebrochen, feld+i zeigt *hinter* das letzte Element von feld.

    Ich hoffe, ein bischen erleuchtet zu haben.

    EDIT: Du hast recht, break bricht immer nur eine Schleifenebene ab. for, do-while, while und auch switch (ok ist keine Schleife) der if-else {block} ist betroffen.

    for (;;)
      for (;;)
          break; /* nur eine Ebene */
    


  • Naja ok verstanden kann ich nicht grade dazu sagen aber soetwas in der art 😉
    ok also so wie ich es oben schrieb könnte ich es doch benutzen also in der verzweigung mit den Anweisungen?

    zudem müsste es nicht so heißen

    if (feld[i].name == suche)
    

    und die funktion macht einfach i auf max und dann -1? sodas i < anzahl ist?
    und das passiert nur wenn eine übereinstimmung vorhanden ist?
    aber was nun zu dem break,.weil das wird ja danna uch angesprochen und beendet dann die for schleife? gleich und muss sie dann nicht weiter ausführen und dann in der verzweigung wird nun ermittelt welche werte,...



  • for (i = anzahl-1; i >= 0; i--)
      { if (feld[i].name == suche)
          { /* gefunden */
            /* break */
          }
      }
    wenn mit break und nix gefunden dann i = -1
    ohne break ist i immer -1
    einfach mit printf die Werte ausgeben und etwas damit "spielen"
    


  • Jetzt hast du mich nochmehr verwirrt,..also das programm läuft und ich muss ja ausgeben das er was gefunden hat oder nicht,...wo mache ich das jetzt? einmal für gefunden / nicht gefunden?



  • Kann mir vielleicht jemand sagen, wieso dieser script nicht richtig funktioniert, denn vom logischen her müsste er es!

    #include <cstdlib>
    #include <iostream>
    #include <conio.h>
    #include <iostream>
    #include <windows.h>
    #include <iomanip>
    
    using namespace std;
    
    struct Daten
    {
           char Name[10];
    };
    
    Daten feld[20];
    
    int anzahl;
    int google;
    int zahl=0;;
    char such_name[10];
    
    int main()
    {
    
            for(int x=0; x<3; x++)
            {
            cout << "Name: ";
            cin >> feld[x].Name;
            }
    
            system("CLS");
    
            cout << "Ihr gesuchter Name: ";
            cin >> such_name;
    
            cout << "\n\n\n";
    
            zahl=0;
    
         do
         {
           google = strcmp(such_name,feld[zahl].Name);
    
              if(google == 0)
              {
                 zahl = anzahl;
              }
    
         zahl++;
    
         }
         while(zahl < anzahl);
    
            if(zahl > anzahl)
            {
            cout << "\n\n\t\t Gefunden!!!";
            system("PAUSE");
            }
            else
            {
            cout << "\n\n\t\t nicht Gefunden!!!";
            system("PAUSE");
            }                
    
        return EXIT_SUCCESS;
    }
    


  • Svolf schrieb:

    wieso dieser script nicht richtig funktioniert

    Eine filosofische Frage...



  • naja ich versteh echt,.nicht wieso es nicht funktioniert 😞



  • Was sagt den dein Debugger dazu?

    Gruß



  • Naja,..mein Kompiler ,.also sagt nichts,..also er kompiliert,.nur im Programm selbst,.gibt man Werte ein: und dann bei der suche ergal ob es den Wert gibt oder nicht,..er meint es gibt ihn -.-



  • Dann suchst du am besten mal in der Hilfe deiner Entwicklungsumgebung danach wie man den Debugger benutzt.

    Ohne Debugger wirst du dich bei weiteren Entwicklungen schwer tun. Wenn du den Debugger nicht bedienen kannst, tun es bei kleinen Programmen Debugausgaben.

    Sprich:
    Gib dir die Variablen in deiner Suchschleife aus, dann kommst du auch auf deine Fehler.

    Gruß


Anmelden zum Antworten