Wieso geht das nicht



  • Bin anfänger und habe ein Problem bei dem ich nicht weiter komme.
    Was ist hier falsch:

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    struct buch{
           char autor[30], titel[50], verlag[30];
           float preis;       
           }; 
    
    int main()
    {
        string temp,temp2;
        int x=1,i=0;
        buch n[100];
    
        while (x==1)
        {
        cout<<"Titel: "<<endl; 
        cin>>n[i].titel;
    
        cout<<"Autor: "<<endl;
        cin>>n[i].autor;
    
          cout<<"Verlag: "<<endl;
        cin>>n[i].verlag;
    
          cout<<"Preis: "<<endl;
        cin>>n[i].preis;
    
        cout<<"Noch einen Datensatz hinzufügen? 0 = Nein , 1= Ja"<<endl;
        cin>>x;
        if (x==1) {i++; //system("CLEAR");
        } 
         }
    
    cout<<endl;
    cout<<"Unsortiert"<<endl;
    
    for (int a=0;a<=i;){
        cout<<n[a].titel<<'\t'<<n[a].autor<<'\t'<<n[a].verlag<<'\t'<<n[a].preis<<endl;
    a++;
    }
    cout<<endl;
    cout<<"Sortiert"<<endl;    
    int z=0;
    for (int j=0;j<i;)
    {z=j+1;
     if (n[j].autor<n[z].autor)
      {
      temp=n[j].autor;
      temp2=n[z].autor;
    n[z].autor=temp; // Hier unterbrichts bzw. Kompilierungsfehler
    n[j].autor=temp2; //und hier auch
      j++;
    } 
    }
    
    for (int d=0;d<i+1;)
    {
      cout<<n[d].titel<<'\t'<<n[d].autor<<'\t'<<n[d].verlag<<'\t'<<n[d].preis<<endl;    
    d++;
    }
    
        system("PAUSE");
        return 0;
    }
    

    Kann mir jemand helfen, wieso es in dieser Zeile einen Fehler gibt.

    n[z].autor=temp; 
    n[j].autor=temp2;
    


  • Hab jetzt den Fehler schon gefunden:

    Einmal handelt es sich um einen String und einmal um einen Char

    Wie kann man einen String einlesen?

    mit cin.getline geht das komischerweise nicht



  • Was sagt denn der Compiler?



  • anfänger7 schrieb:

    Kann mir jemand helfen, wieso es in dieser Zeile einen Fehler gibt.

    n[z].autor=temp; 
    n[j].autor=temp2;
    

    mach mal entweder :

    strcpy(n[z].autor, temp.c_str()); 
    strcpy(n[j].autor, temp2.c_str());
    

    oder besser:

    //...
    struct buch
    {
      std::string autor, titel, verlag;
      float preis;       
    }; 
    //...
    //und nur dann
    n[z].autor=temp; 
    n[j].autor=temp2;
    


  • Anfänger7 schrieb:

    Hab jetzt den Fehler schon gefunden:

    Einmal handelt es sich um einen String und einmal um einen Char

    Wie kann man einen String einlesen?

    mit cin.getline geht das komischerweise nicht

    std::string str;
    std::getline(cin, str);
    


  • Hab ich nicht std:: schon includiert mit using namespace std?



  • Anfänger 7 schrieb:

    Hab ich nicht std:: schon includiert mit using namespace std?

    doch



  • Also, wie ihr vielleicht gemerkt habt, sollte das kleine Programm bücher, die man eingibt, nach Autoren alphabetisch (A-Z) sortieren, mit Bubblesort.

    Hab das jetzt mal so gemacht:

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    struct buch{
           int id;
           char autor[30], titel[30], verlag[30];
           float preis;       
           }; 
    
    int main()
    {
        int x=1,i=0,t1,t2;
        buch n[100],h;
    
        while (x==1)
        {n[i].id=i+1;
        cout<<"Titel: "<<endl; 
    cin>>n[i].titel;
    //scanf("%s",n[i].titel);    
        cout<<"Autor: "<<endl;
        cin>>n[i].autor;
    
          cout<<"Verlag: "<<endl;
       cin>>n[i].verlag;
    
          cout<<"Preis: "<<endl;
        cin>>n[i].preis;
    
        cout<<"Noch einen Datensatz hinzufügen? 0 = Nein , 1= Ja"<<endl;
        cin>>x;
        if (x==1) {i++; //system("CLEAR");
        } 
         }
    
    cout<<endl;
    cout<<"Unsortiert"<<endl;
    
    for (int a=0;a<=i;a++){
        cout<<n[a].id<<'\t'<<n[a].titel<<'\t'<<n[a].autor<<'\t'<<n[a].verlag<<'\t'<<n[a].preis<<endl;
    }
    cout<<endl;
    cout<<"Sortiert"<<endl;    
    int z=0;
    for (int k=i;k>0;k--)
    {
    for (int j=0;j>k;j++)
    {z=j+1;
     if (n[j].autor<n[z].autor)
      {                           
      h=n[z];
      n[z]=n[j];
      n[j]=h;
    
    cout<<"--------"<<endl;
    cout<<n[z].autor<<endl;
    cout<<n[j].autor<<endl;
    
    }//IF  
    }
    }
    for (int d=0;d<=i;d++)
    {
      cout<<n[d].id<<'\t'<<n[d].titel<<'\t'<<n[d].autor<<'\t'<<n[d].verlag<<'\t'<<n[d].preis<<endl;    
    }
    
        system("PAUSE");
        return 0;
    }
    

    Es sortiert immer noch Falsch. Könnte mir da einer ein bisschen Helfen? 😕
    Danke 😃



  • pseudo
    
    for ( i = n-1; i > 0; i-- )
        for ( k = 0; k < i; k++ )
    	if ( daten [k] > daten [k+1] )
    	    swap(daten[k], daten[k+1]);
    

    sollte funktionieren



  • Hab das jetzt mal so gemacht, geht aber immer noch nicht richtig:

    cout<<"Sortiert"<<endl;    
    int z=0;
    for (int k=i-1;k>0;k--)
    {
    for (int j=0;j<k;j++)
    {if (n[j].autor<n[j+1].autor)
      { 
       swap (n[j],n[j+1]);
    
                                 /*                          
      h=n[j+1];
      n[j+1]=n[j];
      n[j]=h;
    
    cout<<"--------"<<endl;
    cout<<n[z].autor<<endl;
    cout<<n[j].autor<<endl;
     */
    }//IF  
    }
    }
    


  • ist die Anzahl der Elemente sicher richtig??
    also in deinem Fall die Variable "i"



  • Ja, i= die Zählvariabel di beim ersten schleifen durchlauf mit läuft:

    while (x==1)
        {n[i].id=i+1;
        cout<<"Titel: "<<endl; 
    cin>>n[i].titel;
    //scanf("%s",n[i].titel);    
        cout<<"Autor: "<<endl;
        cin>>n[i].autor;
    
          cout<<"Verlag: "<<endl;
       cin>>n[i].verlag;
    
          cout<<"Preis: "<<endl;
        cin>>n[i].preis;
    
        cout<<"Noch einen Datensatz hinzufügen? 0 = Nein , 1= Ja"<<endl;
        cin>>x;
        if (x==1) {i++; //system("CLEAR");
        } 
         }
    


  • if (n[j].autor<n[z].autor)
    

    hast du schon überlegt, was genau du hier vergleichst?



  • Dachte das bedeutet folgendes:

    Wenn n[j].autor alphabetisch nach n[j+1].autor kommt.

    Stimmt das nicht?

    Aber wenn ich das ">" schreibe gehts auch nicht richtig...



  • du vergleichst 2 variablen des typs const char*, also 2 adressen.
    mach dich mal über strcmp(...) schlau!



  • Ja du hast recht ist mir jetzt auch aufgefallen.
    Habs jetzt so umgeändert:

    struct buch{
           int id;
           string autor, titel, verlag;
           float preis;       
           };
    

    Geht aber immer noch nicht.



  • for (int k=i-1;k>0;k--)
    {
    for (int j=0;j<k;j++)
    {
    

    die zweite schleife wird nie betretten... 🕶



  • das stimmt nicht ganz,

    irgendwie sortiert er da schon was.

    Wie würde das richtig kommen?



  • die zwei Schleifen sind richtig,
    aber wie chirgi schon sagte das vergleichen der Objekte stimmt nicht
    habe das leider nicht gesehen hab etwas ueberhastet daruebergelesen

    du musst die Objekte mit strcmp vergleichen bzw wenn du die std::string Klasse verwendest kannst du einfach denn Operator verwenden

    und das austauschen muss natuerlich dann auch anders gemacht werden
    bei cstrings zb: mit strcpy o memcpy

    ok?



  • hatte nicht gemerkt, dass die schleifen bereits korrigiert wurden... (und dabei habe ich die bereits korrigierte version gequotet! 😃 )


Anmelden zum Antworten