Spaß mit Früchten (war: C++ programm)



  • Hallo ich habe leider Schwierigkeiten bei einer Aufgabe:

    Legen Sie ein Array fruechte vom Typ string mit der Größe 17 an. In diesem Array sollen die unten
    aufgelisteten Früchte gespeichert werden (keine Tastatureingabe). Anschließend sollen verschiedene
    Abfragen durchgeführt werden.
    Programmentwurf
    Eingabedaten: fruechte array of string mit folgenden Initialwerten:
    "Ananas", "Apfel", "Banane", "Birne", "Blaubeere",
    "Clementine", "Erdbeere", "Heidelbeere",
    "Himbeere", "Johannisbeere", "Kiwi", "Mandarine",
    "Melone", "Nektarine", "Orange", "Pampelmuse",
    "Pfirsich"
    Weitere Variablen nach Bedarf
    Ausgabedaten:
    a) alle Früchte, die an 2. Stelle ein 'a' haben, ausgeben

    Ich hab in meiner Funktion versucht weniger variablen zu vergleichen:

    #include <iostream>
    
    using namespace std;
    
    int main() {
        string fruechte[5] = {"Ananas", "Apfel", "Banane", "Birne", "Blaubeere"};
    
        for (int i = 0; i < 5; i++) {
    
                if (fruechte[i][1] == fruechte[i+1][1] ) {
    
                    cout << fruechte[i] << endl;
    
    }
    
    }
    
    }
    

    ch hab das so gemacht . ABer beim ausführen wird mir nichts ausgegeben?

    Ist meine idee falsch?


  • Mod

    if (fruechte[i][1] == fruechte[i+1][1] ) Beschreib mal in Worten ganz genau, was da womit verglichen wird und wie das mit dem Buchstaben 'a' zusammen hängt.



  • Ich dachte das ich mit fruechte [i+1] die nachfolgenden variablen vergleichen kann.

    Und mit dem [1] dachte ich den 2 wert vergleichen zu können.

    Ich weiss nicht ob es stimmt?



  • array24 schrieb:

    Ich dachte das ich mit fruechte [i+1] die nachfolgenden variablen vergleichen kann.

    Und mit dem [1] dachte ich den 2 wert vergleichen zu können.

    Ich weiss nicht ob es stimmt?

    Zusammengefasst: Du hast keine Ahnung, was dein Code tut oder tun soll?
    Erstens greifst du auf ein Element zu das gar nicht existiert ( fruechte[5] ).
    Zweitens vergleichst du bei deiner Abfrage, ob der zweite Buchstabe des Strings gleich ist mit dem zweiten Buchstaben des "nächsten" Strings. Und das ist nie der Fall (die Buchstaben sind n, p, a, i und l), daher bekommst du auch keine Ausgabe.



  • array24 schrieb:

    Ich dachte das ich mit fruechte [i+1] die nachfolgenden variablen vergleichen kann.

    Wieso willst du aufeinanderfolgende Strings miteinander vergleichen? So wie ich die Aufgabe lese, sollst du doch immer ein Zeichen eines Strings mit 'a' vergleichen, oder nicht?

    Sone schrieb:

    Zusammengefasst: Du hast keine Ahnung, was dein Code tut oder tun soll?

    Hast du auch mal gute Laune 😃

    PS: Lese deinen Beitrag immer noch einmal durch, bevor du ihn abschickst. Und keine Gedichtsform. Es gibt automatische Zeilenumbrüche.



  • Und keine Gedichtsform.

    Woah, längst nicht alle Gedichte haben einen Hakenstil. ⚠

    out schrieb:

    Sone schrieb:

    Zusammengefasst: Du hast keine Ahnung, was dein Code tut oder tun soll?

    Hast du auch mal gute Laune 😃

    Wieso? Ich meine das ernst. Wieso schreibt er dieses if -Statement, wenn er nicht weiß, was es tun soll?

    c.rackwitz schrieb:

    Wenn du selber Code schreibst, musst du ihn auch verstehen. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. Du musst genau wissen, warum du wo und welches Zeichen setzt.



  • Sone schrieb:

    c.rackwitz schrieb:

    Wenn du selber Code schreibst, musst du ihn auch verstehen. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. Du musst genau wissen, warum du wo und welches Zeichen setzt.

    Doch genauso fängt jeder an... die ersten Schritte... vor allem wenn man mit Skripten aus dem Unterricht arbeitet... dafür können die Schüler ja nichts, sie wissen es ja (zu diesem Zeitpunkt) nicht besser. Vielleicht solltest du deine Beiträge an das C++-Niveau des TE anpassen ⚠



  • #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
        int iZehler, iArraySize;
        string sFruechte[] = {"Ananas", "Apfel", "Banane", "Birne", "Mandarine", "Blabla"};
    
        iArraySize = sizeof(sFruechte)/ sizeof(sFruechte[0]);
    
        cout << endl
        << endl << "Eintrag aus Array mit <a> an zweite Stelle:\n" ;
    
        for(iZehler = 0; iArraySize > iZehler; ++iZehler)
        {
            if (sFruechte[iZehler].find('a') == 1) cout << sFruechte[iZehler] << endl;
        }
    
        return 0;
    }
    

  • Mod

    Entweder machst du es vernünftig, oder ich muss das als bewusste Irreführung des Threaderstellers ansehen. Jedenfalls kann es nicht angehen, dass du dich hier einerseits wie der große Oberchecker aufführst, andererseits aber nicht einmal merkst, was an deinen Lösungen so schlecht ist, selbst wenn man es dir sagt*. Eines von beidem muss falsch sein.

    *: Für verwirrte Mitlesende: Schrottlösung und folgendes Gezänk wurde gelöscht.



  • andererseits aber nicht einmal merkst, was an deinen Lösungen so schlecht ist....

    dann sage es, was daran so schlecht ist, vieleicht lerne noch was dazu, habe code geschrieben so einfach wie es geht....für Obercheker habe ich mich micht nicht ausgegeben, das ist mein gewönliches Programmierungs Still.



  • c2010 schrieb:

    andererseits aber nicht einmal merkst, was an deinen Lösungen so schlecht ist....

    dann sage es, was daran so schlecht ist,[...]

    Das hat Dir SeppJ doch schon in den gelöschten Beiträgen verraten.
    Seine Hilfe hast Du abgelehnt, Du Checker.



  • Uhu...letzten post neu editiert, schaut viel besser aus als vorher...



  • Ich hätte es so gelöst:

    #include <iostream>
    #include <string>
    
    int main(){
        std::string fruits[] = { "Ananas", "Apfel", "Banane", "Birne", "Blaubeere" };
    
        for(const std::string& fruit : fruits){
            if(fruit[1] == 'a')
                std::cout << fruit << '\n';
        }
    
        return 0;
    }
    

    Bestenfalls sogar mit std::vector, aber die Aufgabestellung sagt ja was anderes.



  • #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
       int iZehler, iArraySize;
        string sFruechte[] = {"Ananas", "Apfel", "Banane", "Birne", "Mandarine"};
    
        iArraySize = sizeof(sFruechte)/ sizeof(sFruechte[0]);
    
        for(iZehler = 0 ; iArraySize > iZehler; ++iZehler)
        {
            if (sFruechte[iZehler][1] == 'a') cout << sFruechte[iZehler] << endl;
        }
        return 0;
    }
    


  • @c2010: Gebannt in 3..2...1..... :SeppJ klickt "User melden":

    Du sollst
    1. Nichts vormachen.
    2. Auf keinen Fall etwas schlecht vormachen.
    3. Niemals Hungarian Notation verwenden.

    @TE: Mal ein bisschen Netter:

    Ich dachte das ich mit fruechte [i+1] die nachfolgenden variablen vergleichen kann.

    Und mit dem [1] dachte ich den 2 wert vergleichen zu können.

    Ich weiss nicht ob es stimmt?

    Nein. 🙂
    Aber das ist auch in der Aufgabenstellung doch gar nicht enthalten 😕
    Ersetze einfach eine Abfrage durch die Richtige:
    fruechte[i][1] == 'a'
    Dann funktioniert auch der Code aus deinem Ausgangspost.



  • Ich komme aus VB zeiten, habe in VB6 5 Jahren programmiert.
    Wenn vor die Augen 5 Seitige Code hast, da macht kein Spaß quer durch den ganzen Quelltext rum zu schnüffeln um zu schauen welche Variable mit welchen Datentyp deklariert ist. Habe einige C++ und VB Quelltexte ohne Hungarian Notation gesehen, das ist sowas von unleserlich und unübersichtliches Code, ich will nicht bei solche Code/Projekte an irgend-welche Erweiterungen oder Änderung teilnemen (sinnlose Zeit verschwindung).
    In C++ bin ca mehr als ein Jahr dabei und ich persönlich finde Hungarian Notation noch immer besser als ohne. Aber ok, jeder Entwickler hat eigener Still und Geschmack.



  • c2010 schrieb:

    Ich komme aus VB zeiten, habe in VB6 5 Jahren programmiert.
    Wenn vor die Augen 5 Seitige Code hast, da macht kein Spaß quer durch den ganzen Quelltext rum zu schnüffeln um zu schauen welche Variable mit welchen Datentyp deklariert ist. Habe einige C++ und VB Quelltexte ohne Hungarian Notation gesehen, das ist sowas von unleserlich und unübersichtliches Code, ich will nicht bei solche Code/Projekte an irgend-welche Erweiterungen oder Änderung teilnemen (sinnlose Zeit verschwindung).
    In C++ bin ca mehr als ein Jahr dabei und ich persönlich finde Hungarian Notation noch immer besser als ohne. Aber ok, jeder Entwickler hat eigener Still und Geschmack.

    Kein WUnder, wenn Du so schreibst:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
       int iZehler, iArraySize;
        string sFruechte[] = {"Ananas", "Apfel", "Banane", "Birne", "Mandarine"};
    
        iArraySize = sizeof(sFruechte)/ sizeof(sFruechte[0]);
    
        for(iZehler = 0 ; iArraySize > iZehler; ++iZehler)
        {
            if (sFruechte[iZehler][1] == 'a') cout << sFruechte[iZehler] << endl;
        }
        return 0;
    }
    

    Mach die Variablen lokaler.

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        string fruechte[] = {"Ananas", "Apfel", "Banane", "Birne", "Mandarine"};
        int arraySize = sizeof(fruechte)/ sizeof(fruechte[0]);
    
        for(int i = 0 ; i > arraySize; ++i)
        {
            if (fruechte[i][1] == 'a') 
               cout << fruechte[i] << '\n';
        }
    }
    


  • Womit programmierst du? Mit 'nem Editor?
    Schon mal etwas von Intellisense gehört? Und IDEs?
    Die zeigen einem den Typ einer Variablen an, wenn man mit dem Mauszeiger drüberfährt.
    aHungarian nNotation vHat aSoviele nNachteile, pIch vWill aDie aJetzt aAlle aGar aNicht vAufzählen. pEs vIst aSehr aUnleserlich (unter anderem).
    Wie kennzeichnest du einen Referenz auf einen Funktionspointer, der einen basic_string<wchar_t> zurückgibt, und als Argument einen Funktionspointer, der eine const Referenz auf ein char Array der Größe N (Template) annimmt und eine const Referenz auf ein wchar_t Array der Größe N zurückgibt und einen volatile konstanten Pointer auf eine vector vom Typ char annimmt?
    In C++:

    template <std::size_t N>
    std::basic_string<wchar_t> foo(wchar_t(&const)[N] (*) (char (& const) arr[N]), volatile const std::vector<char> *vec);
    

    Und auf den Funktionszeiger davon eine konstante Referenz.
    Ist das dann: crfpwcppststfpcrwcanvcpvcName oder was?

    Und in C++ kann man Variablen an jedem beliebigen Punkt deklarieren, das sollte man ausnutzen.
    Und Funktionen sollten eh nie die 10 Zeilen überschreiten.
    Und was ist, wenn du zur Compilezeit gar nicht weißt, welchen Typ eine Variable hat (Polymorphie)?

    Edit: Mir fällt noch ein Beispiel ein:
    In C++11 kann man auto als Platzhalter für den Typen der Variable nutzen.
    Häufig weiß ich da noch nichtmal, wie der Typ genau heißt, ich weiß nur, dass es eine Memberfunktion func1 gibt und eine Memberfunktion func2 und ich das Objekt dann an func3 übergebe.



  • @volkard: ja, das ist die Gewohnheiten, ich weis dass Quelltext kann auch anders gestaltet werden.
    @Nathan: Progge in Code::Blocks & NET Beans. Funktions poiter - "fp", Array - "a" oder "ar" Template - "t" usw.....

    Die zeigen einem den Typ einer Variablen an, wenn man mit dem Mauszeiger drüberfährt.

    bei 5 Seiten Quelltext und mehr, vergeht dir sehr scnell das lust über jede Variable mit Maus drüber zu fahren um raus zu kriegen mit welchen Datentyp die Varibale oder etc deklariert.



  • Und Funktionen sollten eh nie die 10 Zeilen überschreiten.

    Das ist eine so unrealistische Faustregel, dass man sie komplett ignorieren darf.


Anmelden zum Antworten