Besser Programmieren? In Arrays suchen und Arrays vergleichen



  • Hallo, ich lerne seit zwei Tagen Programmieren und habe mich für C++ entschieden. Ich habe aktuell die Themen. Variablen, Ein-/ Ausgabe, Arrays, Funktionen, Bedingungen und Schleifen durch genommen. Um mein gelerntes anwenden zu können, habe ich mich dafür entschieden ein "Lottospiel" zu programmieren. In diesem SPiel habe ich alles verwendet, was ich bisher gelernt habe, ich weiß es ist noch nicht viel, trotzdem bin ich stolz drauf. Das SPiel geht so.

    Der Spieler gibt zuerst seinen Namen ein. Dann Tippt der Spieler seine 6 Gewinnzahlen ein. Es ist für den Spieler nur möglich Zahlen von 1-49 einzugeben. Er kann keine doppelten Zahlen eingeben. Hat er die Zahlen eingeben, werden per Zufallsmechanismus 6 Zahlen aus der "Lostrommel" gezogen. Hier wird auch dafür gesorgt, dass jede Zahl nur einmal gezogen werden kann. Anschließend wird untersucht, wie Viele Übereinstimmungen vorliegen und diese angezeigt. Wie gesagt, habe ich alles was ich bisher in zwei Tagen gelernt habe zu verwenden. Schleifen Arrays und und und. Jetzt meine Frage.

    Wir würde ein "PROFI" dieses Programmieren? Ich gehe mit mehreren Forschleifen die Arrays durch, um z.B. zu schauen, dass ich keine doppelten Zahlen ziehe, bzw. ob Übereinstimmungen vorhanden sind. Gibt es da für "Fortgeschrittene" bessere Möglichkeiten?

    Ist es möglich, dass man in einem Array suchen kann? Ist es möglich 2 Arrays miteinander zu vergleichen und die Gemeinsamkeiten in ein weiteres Array auszugeben? Dies würde meinen Code natürlich sehr verschlanken. Obwohl ich durch meine Programmierung natürlich das in den letzen 2 Tagen gelernte verinnerlichen und anwenden konnte.

    Vielen Dank für Eure Antworten, bezüglich meiner Fragen, Suchen in Arrays und Arrays vergleichen.

    Anbei mein aktueller QUelltext, bitte nicht gleich komplett zerreißen, ich bin wie gesagt absoluter Anfänger und ich weiß, dass es wahrscheinlich viel besser geht, aber ich bin trotzdem sehr stolz drauf und wollte, dass es funktioniert.

    Viele Grüße

    Betzi

    #include <iostream>
    #include<cstdlib>
    #include <unistd.h>
    #include<ctype.h>
    #include<string>
    #include <sstream>
    
    using namespace std;
    
    
    int generiereZufallszahl(int bis){
        int zufallszahl = rand() % bis +1;
        return(zufallszahl);
    
    
    }
    
    void fuelleLottotrommel(int lottoTrommel[]){
    
        for(int i=0;i<49;i++){
            lottoTrommel[i]=i+1;
        }
    }
    
    bool istZahlDoppelt(int gezogeneZahl, int gezogeneZahlen[]){
        bool istDoppelt = false;
        for(int i=0;i<6;i++){
            if(gezogeneZahl == gezogeneZahlen[i]){
                istDoppelt = true;
            }
        }
        return istDoppelt;
    
    }
    
    void zieheZahlen(int gezogeneZahlen[]){
        int gezogeneZahl =0;
        for(int i = 0; i<6; i++){
    
           do{
                gezogeneZahl = generiereZufallszahl(49);
            }while(istZahlDoppelt(gezogeneZahl, gezogeneZahlen));
    
    
            gezogeneZahlen[i] = gezogeneZahl;
        }
    
    }
    
    int zeigeAnzahlUebereinstimmungen(int gezogeneZahlen[], int getippteZahlen[],int trefferZahlen[]){
    int treffer = 0;
    for(int i = 0; i<6; i++){
        for(int j=0; j<6; j++){
            if(gezogeneZahlen[i]==getippteZahlen[j]){
                treffer++;
                trefferZahlen[i]=gezogeneZahlen[i];
            }
        }
    }
    
    return treffer;
    
    }
    
    
    int main()
    {
        srand((unsigned)time(NULL));
        int lottoTrommel[49];
        int meineGluecksZahlen[6] = {0,0,0,0,0,0};
        int gezogeneZahlen[6] = {0,0,0,0,0,0};
        int trefferZahlen[] = {0,0,0,0,0,0};
        string name;
    
        cout << "Herzlich willkommmen zur Lottoziehung." << endl;
    
        cout << "Bitte gib Deinen Namen ein: ";
        getline(cin,name);
        cout << endl << name << " freut mich Dich kennenzulernen, schön das Du dein Geld hier lässt ;)" << endl;
    
    
        cout << name << " bitte geb Deine 6 Lottozahlen ein!" << endl;
    
        for(int i = 0; i < 6; i++){
            int meineZahl;
            string mystr;
    
            do{
    
                cout << name << ", bitte " << i+1 << ". Zahl eingeben:";
    
                getline (cin,mystr);
                stringstream(mystr) >> meineZahl;
                if(istZahlDoppelt(meineZahl,meineGluecksZahlen) || meineZahl <1 || meineZahl>49){
                    cout << endl << "Nein " << name << " bitte eine Zahl zwischen 1 und 49 eingeben und jede Zahl nur einmal eingeben!!!!!" << endl;
                }
    
            }while (istZahlDoppelt(meineZahl,meineGluecksZahlen)||meineZahl <1 || meineZahl>49);
            meineGluecksZahlen[i] = meineZahl;
        }
    
    
    
        fuelleLottotrommel(lottoTrommel);
        cout << name << " gleich geht es los, die Lottotrommel wird gefüllt" << endl << endl;
        for(int i=0;i<49;i++){
            cout << lottoTrommel[i] << ",";
        }
    
    
    
        cout << endl << endl << endl << name << " Deine Glückszahlen:" << endl << "{";
    
    
        for(int i = 0 ; i<6 ; i++){
            cout <<meineGluecksZahlen[i] << ",";
        }
        cout << "}" << endl;
    
        cout << "Starte die Lostrommel";
        getchar();
        zieheZahlen(gezogeneZahlen);
        cout << name << " bitte warte, es geht los, die Ziehung beginnt" << endl;
        usleep(3000000);
        for(int i = 0 ; i<6 ; i++){
            cout  << name << " hier kommt Zahl " << i+1 << ":";
            cout <<"";
            usleep(3000000);
            cout << gezogeneZahlen[i] << endl;
        }
        int treffer = zeigeAnzahlUebereinstimmungen(gezogeneZahlen, meineGluecksZahlen,trefferZahlen);
        if(treffer > 0){
            cout << endl << "Glückwunsch " << name << " Du hast " << treffer << " Treffer :)";
            cout << endl << "Folgende Zahlen stimmen überein: ";
            for(int i =0; i<6;i++){
                if(trefferZahlen[i]!=0){
                    cout << " " << trefferZahlen[i] << endl;
                }
            }
        }else{
            cout << endl << "Schade " << name << " versuche es ein andermal" << endl;
        }
    
    
        return 0;
    }
    
    


  • @betzi1985 sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    Wir würde ein "PROFI" dieses Programmieren?

    Gar nicht 😉 Er würde einen großen Bogen um solche Projekte machen.
    Bei größeren Projekten kommen dann aber ganz andere Probleme auf, deswegen braucht man dann auch ganz andere Ansätze und viel mehr Wissen. Du hast noch sehr viel zu lernen 😉

    Ich hab mir deinen Code nicht im Detail angeschaut, ich tu mich bei sowas recht schwer.
    So ganz oberflächlich:

    • deutsche Bezeichner gefallen mir überhaupt nicht, kann ich nicht leiden
    • C Arrays würde man in C++ eher nicht verwenden wollen. Entweder std::array, oder std::vector. Das sind aber vermutlich noch fortgeschrittene Themen für dich. Könntest du aber vielleicht eben als nächstes angehen.
    • Es gibt in C++ modernere Möglichkeiten, Zufallszahlen zu generieren.


  • Vielen Dank für Deinen Beitrag. Gut das Du das mit den C-Arrays ansprichst. Ich habe 2 Bücher, eins davon ist etwas älter, da gibt es nichts anderes. In dem Anderen Buch steht std::Array und std::Vector dann ist das wohl besser, wenn ich das nehme. Und ich dachte ich hätte jetzt für zwei Tage was tolles programmiert. 😞

    Ich würde gerne beim Programmieren einsteigen bei uns in der Firma, da ist deutsch gesetzt, daher möchte ich es mir gleich angewöhnen, sorry.



  • @betzi1985 sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    In dem Anderen Buch steht std::Array und std::Vector

    Achte auf Groß-/Kleinschreibung. std::array und std::vector



  • @betzi1985 sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    Und ich dachte ich hätte jetzt für zwei Tage was tolles programmiert.

    Lass dich nicht entmutigen, so war das nicht gemeint. Für wenige Tage ist das sicher nicht schlecht. Du solltest nur nicht erwarten, dass du die ganze Bandreite der Softwareentwicklung in wenigen Tagen drauf hast. Dafür braucht man Jahre, und dann noch viel Erfahrung.

    @betzi1985 sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    Ich würde gerne beim Programmieren einsteigen bei uns in der Firma, da ist deutsch gesetzt

    Dann würde ich mir eine andere Firma suchen, ernsthaft. Man kann nicht "deutsch" programmieren, höchstens denglisch, und das ist grauenvoll. Die Programmiersprache ist englisch, die ganzen Standardbibliotheken sind englisch, alle third party Bibliotheken, die ihr verwendet werden, sind englisch. Oder willst du ernsthaft eine third party Bibliothek verwenden, die jemand auf bulgarisch geschrieben hat? Willst du vielleicht mal Teile von dem Code als Open Source veröffentlichen? Oder mal auf stackoverflow eine Frage zu dem Code stellen? Oder vielleicht mal Teile der Entwicklung outsourcen? Abgesehen davon, dass das schon sprachlich nicht funktioniert. getWert? holeWert? Ich kann niemanden ernst nehmen, der Code auf deutsch schreibt.
    Der einzige legitime Fall wäre, wenn es um eine hochkomplexe Fachdomäne geht, wo man die Englischen Begriffe einfach nicht kennt. Aber auch da würde ich die deutschen Bezeichner auf das nötigste reduzieren.



  • @betzi1985

    Und std::vectorist ganz einfach. Du musst Deine Zeilen

        int lottoTrommel[49];
        int meineGluecksZahlen[6] = {0,0,0,0,0,0};
        int gezogeneZahlen[6] = {0,0,0,0,0,0};
        int trefferZahlen[] = {0,0,0,0,0,0};
    

    nur durch

    std::vector<int> lottoTrommel(49);
    std::vector<int> meineGluecksZahlen(6);
    std::vector<int> gezogeneZahlen(6);
    std::vector<int> trefferZahlen(6);
    

    ersetzen. Die ganzen Zugriffe im restlichen Code können größtenteils so bleiben.

    PS: Und was die Jobaussicht betrifft, ich würde einfach im Privaten weitermachen und immer abgleichen, was in der Firma so von Nöten ist. Wenn Du meinst, Du hast was Besseres, stelle es Deinem Chef vor. Würde mir jetzt so einfallen, ohne selbst in dieser Richtung zu arbeiten.



  • Das deutsch beim Programmieren verwendet wird in Firmen, mag vlt. gar nicht mal so unüblich sein ... Englisch kann halt auch nicht jeder.

    Ich würde aber ganz abgesehen davon privat immer Englisch nehmen! Wie hier schon gesagt wurde, wirst du um Englisch nicht herum kommen ... Fachliteratur, stack overflow, andere Projekte ... und wenn du nicht grade Englisch (im Gegensatz zu Deutsch) perfekt beherrschst solltest du eher das üben. Und naja, das Üben in Bezug auf deutsch ... ich gehe mal davon aus, dass deutsch deine Muttersprache ist ... wenn du Code auf Englisch gut dokumentieren kannst irgendwann, kannst du es auch auf Deutsch.

    Bezüglich deiner Literatur, die du verwendest: Man mag es als Anfänger oft nicht glauben, aber die Qualitätsunterschiede in Literatur sind massiv. Und eine schlechte Anfängerlektüre (oder teilweise auch veraltete -> wobei es immer etwas auf das Thema ankommt, wo sowas wichtig ist) kann dir mehr schaden als nützen.
    Es gibt einige Threads hier, die sich mit schlechter und guter lektüre beschäftigen. Faustregel: Nichts wo dabei steht "in so und so viel Tagen", nichts von Jürgen Wolf, nichts "für dummies" ^^ etc. ... als deutsche Lektüre zu empfehlen sei an dieser Stelle "Der C++ Programmier" von Breymann.



  • @Leon0402

    Da wo ich arbeite ist per Gesetz deutsch vorgeben und daher ist das so.

    Natürlich habe ich genau ein Buch von Wolf 😞 also zumindest das neuere :(. Darf ich erfahren, was genau daran nicht gut ist?:(.

    Das andere ist von 2009, vielleicht deshalb kein Vector und Array :(.

    Dann werde ich mal nach anderer Lektüre suchen, die sowohl für Anfänger gut ist, aber auch tieferes Wissen vermittelt



  • @betzi1985 sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    Da wo ich arbeite ist per Gesetz deutsch vorgeben und daher ist das so.

    Jetzt bin ich aber neugierig: Was für ein Gesetz ist das denn, das einem die Bezeichner in Programmen vorschreibt?

    Natürlich habe ich genau ein Buch von Wolf 😞 also zumindest das neuere :(. Darf ich erfahren, was genau daran nicht gut ist?:(.

    Der Autor hat keine Ahnung von der Materie. Kannst ja mal hier im Forum nach dem Namen suchen.

    Das andere ist von 2009, vielleicht deshalb kein Vector und Array :(.

    array gibts in der Tat erst seit dem Standard von 2011. vector gibt es dagegen quasi schon immer, das war schon im Standard von 1998 enthalten. Es gibt keine Entschuldigung für ein C++-Buch von 2009, vector nicht zu erwähnen, zumal das mit Abstand die wichtigste Containerklasse ist.



  • @Bashar in Behörden.

    Dann wird wohl ein neues Buch her müssen.

    Eine frage zu dem Buch, geht er auch auf Grafik und Datenbanken ein?



  • Also, wenn du das in 2 Tagen gelernt hast, dann ist das meiner Meinung nach sehr gut!

    Natürlich (und das wäre echt ein Wunder, wenn es anders wäre) gibt es viel zu kritisieren, aber ich fange vielleicht auch mal mit den Dingen an, die gut sind.

    1. Dein Programm ist ordentlich eingerückt. (gut, hier und da könnte man noch ein paar Leerzeichen einsetzen, aber insgesamt ist es so gut lesbar - zum Beispiel könntest du das for(int i =0; i<6;i++){ besser schreiben: for (int i = 0; i < 6; i++) { - aber da sind wir schon auf einem Detaillevel - und es gibt auch gute automatische Code-Formatierer. Und dann könnten wir auch das i++ besser als ++i schreiben, denn dich interessiert der vorherige Wert von i ja nicht (ist bei int-Variablen allerdings irrelevant))
    2. Zumindest am Anfang hast du Funktionalität in kleine, übersichtliche Funktionen ausgelagert. Deine main-Funktion ist aber noch zu groß/unübersichtlich. Versuche auch hier, Funktionen zu finden.
    3. Dir ist richtig aufgefallen, dass die Lösung mit den 2 verschachtelten Schleifen irgendwie nicht gut ist. Das zeigt, dass du auf jeden Fall ein gutes Verständnis von dem Code hast, den du hier zeigst.

    Also sei ermutigt, weiterzumachen!

    Da du aber auch gefragt hast, wie es besser geht...

    Generell gute Hinweise zum good practice in C++ findest du hier in den C++ Core Guidelines hier (vieles mag noch viel zu fortgeschritten sein, aber guck trotzdem mal rein): https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#main

    Wichtig:

    • Du hast zu viele magische Zahlen in deinem Programm stehen (typischer Anfängerfehler). Siehe hier: https://de.wikipedia.org/wiki/Magische_Zahl_(Informatik)#Magische_Zahlen_in_Code - insbesondere hast du an mehreren Stellen im Programm fest verdrahtet, dass es sich um "6 aus 49" handelt. Schreib dein Programm so, dass es auch "7 aus 50" oder beliebige andere Lottovarianten durchführen könnte (könnte gleich für dich die nächste Aufgabe sein!) - lass am besten noch den Benutzer eingeben, was für ein Lotto er spielen will.
    • C-Arrays. Haben die anderen schon geschrieben. Schau dir als nächstes unbedingt https://en.cppreference.com/w/cpp/container/vector an - std::vector ist die wichtigste C++-Klasse! Du bekommst mit den C-Arrays nämlich Probleme, weil diese eine fixe Länge haben.
    • Parameterübergabe. (Fast) all deine Funktionen haben ein Problem: sie kennen die Größe des übergebenen C-Arrays nicht.Beispiel: void fuelleLostrommel(int lottoTrommel[]). In dieser Funktion ist es NICHT MÖGLICH, herauszufinden wie groß die übergebene Lottotrommel wirklich ist. C-Arrays als Parameter erfordern grundsätzlich, dass die Größe ebenfalls als Parameter übergeben wird. Daher sind diese Funktionen auch fehleranfällig - aber du solltest ja sowieso C-Arrays vermeiden.
    • Du hast die Streams noch nicht ganz verstanden (was normal ist). Insbesondere liest du die Zahl erst in einen stringstream, um sie dann daraus weiter zu lesen. Du kannst auch direkt mit cin >> meineZahl eine Zahl einlesen. Ein verbundenes Problem: du überprüfst gar nicht, ob das einlesen erfolgreich war! Du solltest immer das Ergebnis überprüfen. Die Streams gehen in einen Fehlerstate, wenn etwas nicht gut war (den du dann wieder löschen musst, um weiter einlesen zu können). Ich hätte erwartet: if (cin >> meineZahl) { ok...} else { fehler...; cin.clear + cin.ignore nicht vergessen } Siehe hier für ein Beispiel: https://en.cppreference.com/w/cpp/io/basic_ios/clear

    Auch noch wichtig: stöbere auf https://en.cppreference.com/w/cpp mal weiter herum. Insbesondere würde ich anfangen mit Containern und Algorithmen.

    Nicht so wichtig:



  • @betzi1985 sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    Dann werde ich mal nach anderer Lektüre suchen, die sowohl für Anfänger gut ist, aber auch tieferes Wissen vermittelt

    Der C++ Programmier von Breymann 🙂

    Das Buch hat um die 1000 Seiten, davon sind ungefähr die Hälfte fürs lernen gedacht, der Rest ist mehr Nachschlagewerk oder nach Bedarf. Bei dem Buch kannst du dir sicher sein, dass du gutes Wissen vermittelt bekommst.
    Es gibt auch verhältnismäßig viele Übungsaufgaben, wovon doch die ein oder andere auch etwas hausfordernd ist.

    Eine frage zu dem Buch, geht er auch auf Grafik und Datenbanken ein?

    Es gibt jeweils ein Kapitel in dem Buch, sollte so mit zu den letzen Kapiteln gehören (im "Lern Bereich"). Die sind beide auch relativ kurz und das hat seinen Grund

    Graphik:
    Mit dem Thema sollte man sich grundsätzlich erst befassen, wenn man die Grundlagen drauf hat. Graphik lenkt schnell ab, man trennt Frontend nicht vom backend, man gewöhnt sich schlechte Sachen an abhängig davon welche Graphik Lib man verwendet.

    Das zweite Problem ist, dass es in C++ keine Graphik Funktionalität integriert gibt. Es gibt also eine Reihe von extra libraries und ich denke Breymann wollte da niemanden eine zu starke Richtung vorgeben. Er selbst spricht kurz Qt an, wohl das verbreiteste Framework (was aber (leider?) viel viel viel mehr als nur Graphik ist).

    Außerdem ist es auch einfach ein ziemlich umfangreiches Thema.

    Datenbank:
    Genauso wie vorher ein riesiges Thema mit dem man selbst nochmal gute 1000 Seiten füllen könnte, um die basics zu vermitteln. Insbesondere, wenn man nicht nur auf die Programmierung eingeht, sondern auch auf die Modellierung.

    Auch hier gibt es keinen C++ Standard, er hat also wieder eine library als Beispiel genommen und mal angerissen wie man mal seine erste Tabelle erstellt, Einträge hinzufügt etc.

    Andere Themen, die definitiv zu kurz kommen (das ist nicht negativ gemeint, das Buch hat einen gewissen scope und das ist auch gut so).

    • Softwaredesign etc. (gibt auch hier mal wieder ein kurzes Kapitel über Modellierung mit uml)
    • Testen von Code mit unit tests etc. (wieder kurzes Kapitel, gibt unzählige Frameworks, könnte ein ganzes Buch füllen)
    • Build Sytem (hier gibt es sogar ein vergleichsweise ausführliches Kapitel zu Makefiles, damit kann man schon einiges machen ... der de facto Standard ist aber wohl eher cmake, was alerdings Makefiles generiert bzw. generieren kann, je nachdem auf welcher Plattform man unterwegs ist -> Auch cmake wieder ein ganzes Buch)

    Gibt vermutlich noch ein paar mehr, die mir spontan nicht einfallen. Aber du siehst, dass trotz der recht umfangenreichen Länge des Buches, werden viele (fortgeschrittenen) Themen nur knapp befasst. Das liegt einfach daran, dass C++ eine sehr umfangreiche Sprache ist. Jedes Buch, was dir vermitteln will, dass es dir innerhalb von 200 Seiten als Anfänger beibringt riesige Applikationen mit frontend und Datenbank zu schreiben, taugt nichts.



  • Hey, vielen dank für die freundlichen Antworten, dann möchte ich natürlich darauf antworten.

    Das mit den Einrücken in den Vorschleifen, sieht natürlich viel schöner aus, muss ich mir angewöhnen, habe es sogar unabsichtlich schon in 2, 3 Schleifen gemacht ;).

    Das meine Funktionen nicht wissen/ wussten wie groß meine Datenfelder sind, war mir auch ein Dorn im Auge, ich habe im Internet recherchiert und sowas gefunden

    for (i = 0; i < sizeof(array[]) / sizeof(array[0]); i++)
    

    Das funktioniert und ich kann jedes Array reintun, ohne die Länge zu kennen, aber da wird in einigen Einträgen von abgeraten, weil es bei manchen Compilern nicht funktioniert, dazu kann ich leider nix sagen, bei mir iT es geklappt. ;), aber ich schaue mir vectoren mal an.

    Das mit dem streams und den Umwandeln erst in Strings, ist dem geschuldet, das er immer in Eike Endlosschleife gelaufen ist, wenn der Anwender statt einer Zahl einen Buchstaben eingegeben hat. Etwas im Internet recherchiert und meine Lösung gefunden :). Aber ich werde das mal ausprobieren, was in dem LINK steht, den Du mir geschickt hast, sieht gut aus und habe es verstanden ;).

    Zum Buch: Das das Buch nicht ausführlich über Oberflächen berichten kann ist mir klar, aber wenn mal ein Fenster mir 2 Textfeldern und 1 Bitton erstellt werden kann, wäre es ein Anfang.:).
    Für das Thema SQL habe ich schon ein Buch da, da geht es nur um SWL Befehle und DB Design, da steht aber nichts drin, wie man die mir einer Programmiersprache einbindet.

    Ich werde nur das Buch wohl mal anschaffen, auch wenn es sehr teuer ist.

    Warum habe ich mich für C/C++ entschieden. Also ich wollte etwas unabhängig vom WEB programmieren, also kein php und Co. Und ein Kumpel hat Informatik studiert und er meinte C hat den Vorteil, dass man Objektorientiert programmieren kann, aber nicht muss, bei Java geht ohne Objektorientiering nix. Und C ist auch näher an Linux dran, obwohl Java natürlich auch gehen würde.

    Da habe ich jetzt eine kleine Frage. Bin gerade am Thema Zeiger/ CallByRef dran. Ich habe es verstanden, was es tut und das Arrays z.B immer CallByRef übergeben werden, aber ich habe nicht wirklich finden können, wann man Zeiger verwenden sollte? Ich kann mir nur erstmal vorstellen; dass ich CallByRef nehme, wenn ich mehr als 1 Wert mir einer Funktion verändern möchte, oder später ein Object verändern möchte, oder seh ich das falsch. Wann macht man CallByVal und wann CallByRef als Übergabe?

    Danke und Gruß

    Betzi



  • @betzi1985 sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    Das funktioniert und ich kann jedes Array reintun, ohne die Länge zu kennen, aber da wird in einigen Einträgen von abgeraten, weil es bei manchen Compilern nicht funktioniert, dazu kann ich leider nix sagen, bei mir iT es geklappt.

    Das funktioniert nur, wenn das Array auch in dem Bereich definiert wurde. Als Parameter einer Funktion geht das nicht mehr.

    @betzi1985 sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    Warum habe ich mich für C/C++ entschieden. Also ich wollte etwas unabhängig vom WEB programmieren, also kein php und Co. Und ein Kumpel hat Informatik studiert und er meinte C hat den Vorteil, dass man Objektorientiert programmieren kann, aber nicht muss, bei Java geht ohne Objektorientiering nix. Und C ist auch näher an Linux dran, obwohl Java natürlich auch gehen würde.

    Es gibt kein C/C++.
    Das sind zwei verschiedene Programmiersprachen, auch wenn C++ mal als Objektorientierte Erweiterung von C angefangen hat. Das war aber im letzten Jahrtausend.

    Lerne gleich richtig C++.

    Da habe ich jetzt eine kleine Frage. Bin gerade am Thema Zeiger/ CallByRef dran. Ich habe es verstanden, was es tut und das Arrays z.B immer CallByRef übergeben werden, aber ich habe nicht wirklich finden können, wann man Zeiger verwenden sollte? Ich kann mir nur erstmal vorstellen; dass ich CallByRef nehme, wenn ich mehr als 1 Wert mir einer Funktion verändern möchte, oder später ein Object verändern möchte, oder seh ich das falsch. Wann macht man CallByVal und wann CallByRef als Übergabe?

    Zeiger benutzt du, wenn du Objekte verändern möchtest, die woanders definiert wurden, z.B außerhalb der Funktion.

    Da eine Funktion i.A. nur einen Rückgabewert hat, benutzt man das auch, um mehr Werte aus einer Funktion zu bekommen.

    Oder auch, wenn du das Kopieren großer Datenmengen vermeiden möchtest.

    Das von einem Array nur die Anfangsadresse an eine Funktion übergeben wird, ist auch der Grund, warum das sizeof(a)/sizeof(a[0]) da nicht funktioniert.



  • @betzi1985 sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    Wir würde ein "PROFI" dieses Programmieren?

    Ein Profi würde nie C mit cout "programmieren", d.h. in einem Programm/Modul 2 Sprachkonzepte mischen unter dem Vorwand "das Beste aus 2 Welten" zu verwenden.



  • @betzi1985 sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    Hey, vielen dank für die freundlichen Antworten, dann möchte ich natürlich darauf antworten.

    Das meine Funktionen nicht wissen/ wussten wie groß meine Datenfelder sind, war mir auch ein Dorn im Auge, ich habe im Internet recherchiert und sowas gefunden

    for (i = 0; i < sizeof(array[]) / sizeof(array[0]); i++)
    

    Das funktioniert und ich kann jedes Array reintun, ohne die Länge zu kennen, aber da wird in einigen Einträgen von abgeraten, weil es bei manchen Compilern nicht funktioniert, dazu kann ich leider nix sagen, bei mir iT es geklappt. 😉

    Das funktioniert für Arrays. Ich habe aber von Funktionen geschrieben (dass du innerhalb deiner Funktionen nicht an die Größe rankommst). Das Problem daran ist, dass void fuelleLostrommel(int lottoTrommel[]) dasselbe ist wie void fuelleLostrommel(int* lottoTrommel). Das lottoTrommel ist innerhalb der Funktion also gar kein Array mehr, sondern ein Pointer auf das erste Arrayelement! Auch wenn der Parameter int lottoTrommel[] wie ein Array aussehen mag, es ist kein Array! Du wirst also innerhalb der Funktion immer 1 herausbekommen.



  • @wob sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    Du wirst also innerhalb der Funktion immer 1 herausbekommen.

    Nein.
    Das hängt von der Zeigergröße und dem Datentyp des Arrays ab.
    Bei Windows 64-Bit ist sizeof(*int) 8, sizeof(int) 4



  • @betzi1985 sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    Zum Buch: Das das Buch nicht ausführlich über Oberflächen berichten kann ist mir klar, aber wenn mal ein Fenster mir 2 Textfeldern und 1 Bitton erstellt werden kann, wäre es ein Anfang.:).

    Aber allein schon ein Fenster ohne auch nur ein Eingabefeld führt eigentlich schon zu weit 😉 Mich hat es ehrlich gesagt überrascht, dass das im Breymann überhaupt angesprochen wird. Das ist wie gesagt kein Teil der Sprache, und bei C++ muss man die Sprache sehr gut verstehen, bevor man sich etwas anderes anschaut. Für "Fenster" braucht man auf jeden Fall ziemlich umfangreiche Frameworks mit ihren eigenen Konzepten. Du hättest unter Windows z.B. die Windows API. Da gehört aber einiges dazu, das zu verstehen, und wäre z.B. unter Linux nicht verwendbar. Hat also in einem C++ Buch nichts verloren. Oder du hättest Qt als plattformunabhängiges Framework, was Breymann wohl auch angesprochen hat. Aber auch das ist sehr umfangreich und hat viele eigene Konzepte, die man erstmal verstehen muss. Außerdem ist Qt an sich nicht mal sauberes C++. Das sollte man erst angehen, wenn man die Sprache an sich schon sicher beherrscht.
    Außerdem ist es mittlerweile auch gar nicht so wahnsinnig wichtig, grad im C++ Bereich. Bei C++ ist die Wahrscheinlichkeit hoch, dass du etwas im Backend Bereich entwickeln wirst. Das mag dann vielleicht als Webservice rausgelegt sein, oder auch nicht, spielt im Endeffekt auch keine Rolle. Aber das Entwickeln einer GUI wird da wahrscheinlich nicht so zentral sein.

    @betzi1985 sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    er meinte C hat den Vorteil, dass man Objektorientiert programmieren kann, aber nicht muss, bei Java geht ohne Objektorientiering nix.

    Das hört sich für mich jetzt nicht direkt nach einem Vorteil an. Es gibt durchaus einiges, was mir an Java nicht gefällt, und warum ich C++ oft bevorzugen würde. Aber das muss man schon viel differenzierter betrachten. Und ob etwas "ohne Objektorientierung" geht, wird zu 99% vermutlich eine absolut untergeordnete, vernachlässigbare Rolle spielen.



  • @DirkB sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    Nein.

    Sorry, du hast natürlich völlig recht. Was habe ich da geschrieben?!



  • @Mechanics sagte in Besser Programmieren? In Arrays suchen und Arrays vergleichen:

    Mich hat es ehrlich gesagt überrascht, dass das im Breymann überhaupt angesprochen wird.

    Ich denke es soll eher ein Wegweiser sein. Ist meine ich so ziemlich das letze Kapitel zusammen mit eben anderen out of scope themen. Vermute das heißt dann so viel wie: Jetzt bist du bereit, dich da mal weiter mit zu beschäftigen.

    Das hört sich für mich jetzt nicht direkt nach einem Vorteil an. Es gibt durchaus einiges, was mir an Java nicht gefällt, und warum ich C++ oft bevorzugen würde. Aber das muss man schon viel differenzierter betrachten. Und ob etwas "ohne Objektorientierung" geht, wird zu 99% vermutlich eine absolut untergeordnete, vernachlässigbare Rolle spielen.

    Finde ich schon ein Vorteil. Nicht alles ist nun mal ein Objekt. Schon alleine, dass die main Teil einer Klasse sein soll? Hat für mich nie Sinn ergeben bzw. habe immer vermutet, dass man vermutlich um die Komplexität geringer zu halten, damit lebt.


Anmelden zum Antworten