Frage zur Arrayeingabe



  • Wow, das ging aber fix und ich sag auch schon 1000x danke, nur habe ich jetzt ein Prob in meiner Suche Funktion, die folgendemassen aufgebaut ist.

    // SUCHFUNKTION
    
    void Suchen()
    {
     sting inter;
     int i=0;    // Variable für das zu vergleichende Arrayfeld
    
     cout << "Geben sie den Interpreten der CD ein die sie Suchen wollen!" << endl;
     cin >> inter;   // Eingabe des Arraywertes der gesucht wird
    
            while (interpret[i] != inter)
           {
           i++;   // Wenn der Arraywert in Feld i nicht mit dem gesuchten übereinstimmt
           }      // wird der Wert i um einen erhöht und es wird wieder kontrolliert
    
           // Ist der Wert aus Feld i mit der Eingabe "inter" gleich,
           // so wird folgendes ausgegeben
    
            cout << " " << endl;
            cout << "CD Nummer: " << i << endl;
            cout << "Interpret: " << interpret[i] << endl;
            cout << "Titel: " << titel[i] << endl;
            cout << "Laenge: " << spieldauer[i] << endl;
            cin.get();cin.get();
    
    }
    

    Beim ersten Versuch das Prog zu starten sagte er mir fehlen bei der definition von string inter. Beim nächsten mal startete das Programm, doch bei meine Eingabe Funktion wird die Eingabe des Interpreten nun völlig übersprungen.

    Ich kopier einfach mal den kompletten Quellcode. 😕

    #include <iostream.h>
    #include <string>
    #include <vcl.h>
    #include <conio.h>
    #pragma hdrstop
    
    using namespace std;
    
    #pragma argsused
    
    string interpret[1000];  // Ein Array des Typen String mit 1000 Feldern
    float spieldauer[1000];  // Ein Array des Typen Float mit 1000 Feldern
    string titel[1000];   // Ein Array des Typen String mit 1000 Feldern
    
    // -------------------------------- FUNKTIONEN -----------------------------
    
    // EINGABEFUNKTION
    
    void Eingabe()
    {
    int cdnr=0;
    
    cout << "Bitte geben sie die CD Nummer ein" << endl;
    cin >> cdnr;  // Die Variable cdnr. stellt gleichzeitig den Array-Index dar.
    cout << " " << endl;
    
    cout << "Bitte geben sie den Interpreten ein" << endl;
    std::getline( std::cin, interpret[ cdnr ] );  // Der eingegebene String wird dem Arrayfeld cdnr. hinzugefügt
    cout << " " << endl;
    
    cout << "Bitte geben sie den Titel ein" << endl;
    cin >> titel[cdnr];  // Der eingegebene String wird dem Arrayfeld cdnr. hinzugefügt
    cout << " " << endl;
    
    cout << "Bitte geben sie die Spieldauer ein" << endl;
    cin >> spieldauer[cdnr];  // Der eingegebene Floatwert wird dem Arrayfeld cdnr. hinzugefügt
    cout << " " << endl;
    cin.get();
    }
    
    // AUSGABEFUNKTION
    
    void Ausgabe()
    {
    int cdnr=0;
    
    cout << "Bitte geben sie eine CD Nummer ein" << endl;
    cin >> cdnr;   // Eingabe des gesuchten Arrayfeldes
    cout << " " << endl;
    cout << "CD Nummer: " << cdnr << endl;
    cout << "Interpret: " << interpret[cdnr] << endl;   // Arrayfeld cdnr. wird ausgelesen
    cout << "Titel: " << titel[cdnr] << endl;    // Arrayfeld cdnr. wird ausgelesen
    cout << "Spieldauer: " << spieldauer[cdnr] << endl;   // Arrayfeld cdnr. wird ausgelesen
    cout << " " << endl;
    cin.get();cin.get();
    }
    
    // SUCHFUNKTION
    
    void Suchen()
    {
     string inter;
     int i=0;    // Variable für das zu vergleichende Arrayfeld
    
     cout << "Geben sie den Interpreten der CD ein die sie Suchen wollen!" << endl;
     cin >> inter;   // Eingabe des Arraywertes der gesucht wird
    
            while (interpret[i] != inter)
           {
           i++;   // Wenn der Arraywert in Feld i nicht mit dem gesuchten übereinstimmt
           }      // wird der Wert i um einen erhöht und es wird wieder kontrolliert
    
           // Ist der Wert aus Feld i mit der Eingabe "inter" gleich,
           // so wird folgendes ausgegeben
    
            cout << " " << endl;
            cout << "CD Nummer: " << i << endl;
            cout << "Interpret: " << interpret[i] << endl;
            cout << "Titel: " << titel[i] << endl;
            cout << "Laenge: " << spieldauer[i] << endl;
            cin.get();cin.get();
    
    }
    
    // ---------------------------- HAUPTPROGRAMM ---------------------------------
    
    int main()
    {
    
    int eingabe=0;
    
    do
    {
       cout << "CD-Verwaltung" << endl;
       cout << " " << endl;
       cout << "(1) Eingabe" << endl;
       cout << "(2) Ausgabe" << endl;
       cout << "(3) Suchen" << endl;
       cout << "(4) Sortieren" << endl;
       cout << " " << endl;
       cout << "(9) Beenden" << endl;
       cout << " " << endl;
    
       cout << "Bitte treffen sie eine Auswahl: " ;
       cin >> eingabe;
    
       switch(eingabe)
       {
        case 1:
           Eingabe();
           clrscr();
           break;
        case 2:
           Ausgabe();
           clrscr();
           break;
        case 3:
           Suchen();
           clrscr();
           break;
        case 4:
           cout << " " << endl;
           cout << "Hier wird sortiert!" << endl;
           cin.get();cin.get();
           clrscr();
           break;
        case 9:
           eingabe=9;
           break;
    
        default:
           cout << "Bitte Eingabe korregieren" << endl;
           cin.get();cin.get();
           clrscr();
    
                }
                } while ( eingabe!=9);
    
        cin.get(); cin.get();
            return 0;
    }
    


  • Hi!

    Im ersten Codefragment schreibst du sting. Im unteren Code stimmts dann. Du solltest die Eingabe des Interprets auch über getline lösen.

    grüße



  • Also das mit dem sting/string befehl hab ich behoben, dennoch überspringt er bei mir immer ncoh die eingabe des interpreten 😕



  • std.:cin.cear();
    std::cin.ignore(std::cin.rdbuf()->in_avail());
    

    sollten helfen.



  • Also diese Befehlsfolge bewirkt bei mir, das das Programm bei der Suche einen Absturz hat. 😞



  • Hier ist noch:

    #include <iostream> // Ohne .h !
    #include <string>
    #include <vcl.h>
    #include <conio.h>
    #pragma hdrstop
    
    using namespace std;
    
    #pragma argsused
    

    Was ist eigenltich conio.h?
    Das kenne ich ned... oder pragma??

    Gg



  • Ja, gibts beides. Is aber Microsoft spezifischer Kram! 😉

    grüße



  • Jaja, und die VCL ist auch von MS 🙄 🙄 🙄



  • roko79 schrieb:

    Also diese Befehlsfolge bewirkt bei mir, das das Programm bei der Suche einen Absturz hat. 😞

    http://www.gnu.org/software/ddd/
    Ein sehr guter Debuger.
    Setzt auf dem GDB auf. sicher ein versuch wert.



  • Thomas (: schrieb:

    Jaja, und die VCL ist auch von MS 🙄 🙄 🙄

    MS-DOS spezifische Funktionen in conio.h Programme, die darauf aufbauen, sind nicht portabel, da conio.h nicht zur ANSI-Standardbibliothek gehört und z.B. auf einer Sun oder in Linux nicht verfügbar ist.

    MS-Spezifischer gehts ja wohl nich, oder?

    grüße



  • Tut mir ja leid mit all den MS Teilen, doch wenn unsere Lehrer uns das so zeigt 😃

    Aber um auf mein Prob zurückzukommen, das sieht immer noch so aus, das ich bei der Suche ein riesiges Prob hab.

    Ich kann nun problemlos texte mir lehrzeichen eingeben und auch wieder ausgeben, doch mit der suche das läuft alles schief. ich glaub ich geb es auf und muss damit leben das ich nur ein wort eingeben kann



  • Was läuft denn schief?



  • ich kriege folgende fehlerbox und das prog ist tot.

    http://pixelfummler.redio.de/1.jpg



  • Dann schmeiß mal den Debugger an. Diese Fehlermeldung kann nur eine vage Vermutung auf das tatsächliche Problem geben.

    grüße





  • Das bringt nich wirklich viel. Es wäre viel interessanter bei welcher Aktion das Programm abstürzt. Um sowas rauszufinden kannst du den Debugger von Borland verwenden. Borland IDE's haben imo ja einen recht komfortablen Debugger.

    grüße



  • jaja, lehrer und ihre programme..erschreckend was die einem sogar an der uni als c++ code andrehen wollen..

    while (interpret[i] != inter)
           {
           i++;   // Wenn der Arraywert in Feld i nicht mit dem gesuchten übereinstimmt
           }      // wird der Wert i um einen erhöht und es wird wieder kontrolliert
    

    du solltest auch irgenwann aufhören über den array zu iterieren.
    zb. mit

    while ( i < 1000 && interpret[i] != inter )
           {
           i++;   // Wenn der Arraywert in Feld i nicht mit dem gesuchten übereinstimmt
           }      // wird der Wert i um einen erhöht und es wird wieder kontrolliert
    

    und auch beim ausgeben checken das du nicht ausserhalb der grenzen bist

    if( i >= 1000 ){
            cout << " " << endl;
            cout << "Interpret nicht gefunden!" << endl;
           else{
            cout << " " << endl;
            cout << "CD Nummer: " << i << endl;
            cout << "Interpret: " << interpret[i] << endl;
            cout << "Titel: " << titel[i] << endl;
            cout << "Laenge: " << spieldauer[i] << endl;
           }
           cin.get();cin.get();
    

    vermutlich wird das prog jetzt nicht mehr mit ner access violation abschmieren, aber wohl nicht einen interpreten wieder finden richtig? oder klapts sogar?

    und ggf. solltest du dir mal überlegen ne globale const variable MAXARRAYSIZE zu benutzen und diese in deinem programm zu benutzen. ist zwar nicht perfekt aber besser als die hardcodierten 1000 überall im programmcode zu haben.
    also:

    const unsigned int MAXARRAYSIZE = 1000;
    .
    .
    .
    string interpret[MAXARRAYSIZE];  // Ein Array des Typen String mit 1000 Feldern
    float spieldauer[MAXARRAYSIZE];  // Ein Array des Typen Float mit 1000 Feldern
    string titel[MAXARRAYSIZE];
    .
    .
    .
    while ( i < MAXARRAYSIZE && interpret[i] != inter )
    .
    .
           if( i >= MAXARRAYSIZE ){
    

    nun kannst du an EINER stelle im code die größe deiner arrays verändern.


Anmelden zum Antworten