Grundsatzfrage bzgl. der Eignung für die Programmierung



  • Ich hätte einmal eine Grundsatzfrage...

    Wie ihr alle mitbekommen habt, habe ich mit der Programmierung Probleme.

    Ich weiß jetzt nicht, ob ich mit der Programmierung weiter machen soll oder ob ich alles hinschmeißen soll.

    Was haltet ihr denn davon?? Hat es überhaupt denn Sinn, weiter zu kämpfen wenn man so ungeeignet und untalentiert ist wie ich?? Oder macht es nicht mehr Sinn, nach was anderem zu suchen?

    Edit:

    Ich wollte zum Beispiel ein Programmcode schreiben, der mir zwei Strings vergleicht und ausgibt, welcher String von den Buchstaben her länger ist.

    Hier der Ansatz:

    #include <iostream>
    #include <string>
    #include <cstring>
    using namespace std;
    
    int main()
    {
    
    	cout << "\tErste Schritte mit Strings!\n";
    	cout << "\n";
    
    	string Text_1;
    	cout << "Geben Sie den ersten Text ein!\n";
    	getline(cin, Text_1);
    	cout << "\n";
    	cout << "Diesen ersten Text haben Sie eingegeben:\n";
    	cout << Text_1 << "\n";
    	cout << "\n";
    	cout << "Wieviel Buchstaben hat der erste Buchstabe?";
    
    	string Text_2;
    	cout << "Geben Sie den zweiten Text ein!\n";
    	getline(cin, Text_2);
    	cout << "\n";
    	cout << "Diesen zweiten Text haben Sie eingegeben:\n";
    	cout << Text_2 << "\n";
    	cout << "\n";
    
    	return 0;
    }
    

    Wenn ich jetzt nach einer Funktion suche, die mir die beiden Strings miteinander vergleicht, dann komme ich auf die Idee, bei "C++ Reference" danach zu suchen: http://www.cplusplus.com/reference/cstring/strcmp/

    Des weiteren sausen mir aber gleichzeitig Gedanken im Kopf herum, wie ich denn einen Zähler miteinbaue. Also brauche ich auch hier eine Schleife, wie ich auf C++ Referenc sehe, eine do ... while Schleife.

    Aber weiterhin mache ich mir Gedanken, wie ich die Funktion strcmp mit einbaue.

    Hat es also Sinn, wenn man im Kopf so unstrukturiert und so untalentiert wie ich an die Sache rangeht und die Leute hier im Forum schon weitestgehend geschrieben haben, dass man 0,0 "Talent" hat und es besser sein lassen soll, weiterhin zu kämpfen??



  • Kämpfen ist imho nur sinnvoll, wenn Du die Waffe (= Herangehensweise, Lernmethode) wechselst.



  • Lies den Edit



  • silent_max schrieb:

    Was haltet ihr denn davon?? Hat es überhaupt denn Sinn, weiter zu kämpfen wenn man so ungeeignet und untalentiert ist wie ich?? Oder macht es nicht mehr Sinn, nach was anderem zu suchen?

    Talent braucht man nur fuers leichtere Lernen. Aber es ist nicht notwendig um ein guter Programmierer zu sein.



  • Richtig: Talent ist etwas besonderes, was andere nicht haben und auch nicht lernen können. Programmieren gehört in die Rubrik, wo Können und die Bereitschaft zum Lernen gefragt ist. Hier machen die Regeln andere - man muss sie nur verstehen und einsetzen können. Bei Talent macht man die Regeln dagegen selbst und alle bewundern dich.

    comprende? 🙂



  • Selbsterkenntnis ist der erste Schritt zur Besserung. Sagt man so zumindest.

    Wenn du zu unstrukturiert herangehst (das tust du) musst du "nur" lernen strukturierter heranzugehen. Das solltest du aber sowieso lernen, denn wenn du nicht grade Maler oder so werden willst (selbst vielleicht dann) ist das eine wichtige Fähigkeit. Was du - meiner Meinung nach - nicht kannst hat tatsächlich eben gar nicht sooo viel mit programmieren zu tun.
    Ein bißchen aber schon. Tatsächlich kann kein Mensch die komplexesten Sachverhalte vollständig verstehen. Deswegen haben sich über Jahre und Jahrezente gewisse Techniken nur deshalb entwickelt, um Dinge eben zu strukturieren und übersichtlich zu gestalten.

    Zum edit:
    Das ist, wenn du mich fragst, schon von vorneherein der falsche Ansatz für folgende Aufgabe:

    Ich wollte zum Beispiel ein Programmcode schreiben, der mir zwei Strings vergleicht und ausgibt, welcher String von den Buchstaben her länger ist.

    Du musst - oder sollst - da erstmal gar kein funktionierendes Programm schreiben (oft wird ja sogar "pseudo-code" verwendet.
    Was willst du? Du willst die Länge zweier Zeichenketten vergleichen.
    Also strukturieren wir das mal:

    1.Finde die Länge der beiden Zeichenketten
    2.Vergleiche, welche länge größer ist
    

    Das kann man immer noch als "zu kompliziert" verstehen, weil das 1.) kann man in noch kleinere Teilaufgaben aufteilen:

    1. Finde die länge der ersten Zeichenkette.
    2.Finde die länge der zweiten Zeichenkette
    3.Schau, welches größer ist
    

    Wie du die Länge einer Zeichenkette bestimmst ist jetzt wieder ein Teilproblem. Dafür gibt es aber - zum Glück - schon eine Funktion.
    Wenn du das so strukturiert hast. Kannst du das ganz langsam in code umsetzen. Erstmal wieder Pseudo-code, der etwas näher an unserem Ziel ist:

    bool isLonger(string first, string second) { //Ich fasse hier schon etwas zusammen - das da ein bool stehen sollen ist eine eigene Überlegung. Ich habe mich - mit mir - darauf geeinigt das ich als Antwort habe, ob der erste string länger als der zweite ist
    int laengeVomErstenString = /*hier die Länge bestimmen*/; //das war vorher 1.
    int laengeVomZweitenString = /*hier die Länge bestimmen*/; //das war vorher 2.
    if(laengeVomErstenString >laengeVomZweitenString) //das war vorher 3.
    return true;
    else 
    return false;
    }
    

    Das "Länge bestimmen" müssen wir noch lösen. Da finden wir im Falle von std::string size(). Das ergibt dann:

    bool isLonger(string first, string second) { 
    int laengeVomErstenString = first.size(); //das war vorher 1.
    int laengeVomZweitenString = second.size(); //das war vorher 2.
    if(laengeVomErstenString >laengeVomZweitenString) //das war vorher 3.
    return true;
    else 
    return false;
    }
    

    Als nächstes können wir das ganze vereinfachen:

    bool isLonger(string first, string second) { 
    int laengeVomErstenString = first.size(); 
    int laengeVomZweitenString = second.size(); 
    return laengeVomErstenString >laengeVomZweitenString; //Das ganze ergibt ja schon einen Wahrheitswert
    }
    

    Und ein weiterer Schritt:

    bool isLonger(string first, string second) { 
    return first.size() > second.size(); //man muss den Zwischenschritt über die Variablen nicht gehen
    }
    

    Damit ist die Aufgabe "bestimme, welcher strings von zwei länger ist" gelöst. Das muss man nicht zwangsweise immer so ausführlich machen, aber bis man sich mit dem ganzen wohl fühlt, sollte man es.

    So, scheinbar war deine eigentliche "Aufgabe" aber: Lass den Nutzer zwei Zeichenketten eingeben. Entscheide welche länger ist. Sag ihm das.
    Wieder in Teilprobleme aufteilen:

    1.Zwei Zeichenketten eingeben lassen
    2.Entscheide, welche länger ist. //Klasse, das Problem haben wir ja oben sogar schon gelöst!
    3.Antworte
    

    Jeden dieser Teile kann man wieder in Teilprobleme aufteilen. Für 2. haben wir das schon gemacht.
    Teilprobleme von 1.:

    1.Platz für erste Zeichenkette bereitstellen (Variable)
    2.Nutzer nach erster Zeichenkette fragen.
    3.Zeichenkette in bereitgestellter Variable speichern.
    4.Platz für zweite Zeichenkette bereitstellen (Variable)
    5.Nutzer nach zweiter Zeichenkette fragen.
    6.Zeichenkette in bereitgestellter Variable speichern.
    

    Das kann man wieder in ein Programm umwandeln, sogar ziemlich einfach:

    string erste; //1.
    cin >> erste; //2. und 3.
    string zweite; //4.
    cin >> zweite; //5. und 6.
    

    Bleibt noch "3.Antworte". Teilprobleme:

    1.Wenn der erste string länger ist, sag das der erste string länger ist
    2.sonst sag, das der zweite string nicht länger ist
    
    if(isLonger(erste,zweite)) //wir hatten 2. ja schon gelöst!
    cout << "Der erste ist länger";
    else << "Der zweite ist länger";
    

    Dann nur noch zusammenbaun:

    string erste; 
    cin >> erste; 
    string zweite; 
    cin >> zweite;
    if(isLonger(erste,zweite))
    cout << "Der erste ist länger";
    else 
    cout << "Der zweite ist länger";
    

    Aja, dann noch das int main(), includes und using namespace std; drumherum klatschen, dazu die Funktion von oben noch angeben:

    #include <string>
    #include <iostream>
    
    using namespace std;
    bool isLonger(string first, string second) { 
    return first.size() > second.size(); 
    }
    
    int main() {
    string erste; 
    cin >> erste; 
    string zweite; 
    cin >> zweite;
    if(isLonger(erste,zweite))
    cout << "Der erste ist länger";
    else 
    cout << "Der zweite ist länger";
    }
    

    Wenn du das durchgemacht hast, hast du erstmal ein funktionierendes Programm. Und wenn du dir solche Überlegungen immer dazu machst (mit Erfahrung brauchst du für vieles, was ich hier ausführlich beschrieben habe unter einer Sekunde), dein Programm auf diese Art und Weise aufbaust, dann kommst du deutlich weiter.



  • So wie ich Dich verstanden habe kleiner Troll, sollte man sich schon vorher Gedanken machen, wie man einen Programmcode aufsetzt??

    Ich mein, erst die Aufgabenstellung analysieren und schauen, wie man die Aufgabe in kleinere Teilaufgaben gliedern kann und dann ganz nach den Teilaufgaben schauen, was man braucht??

    Weil das hat uns unser Lehrer bis jetzt noch nicht beigebracht dieses strukturierte Vorgehen.

    Er gibt eine Aufgabe vor, wir sollen es nach besten Wissen und Gewissen lösen und klatscht dann in der nächsten Stunde die Musterlösung per Beamer an die Wand.

    An alle, die nichts von mir halten:

    Ich werde jetzt versuchen, strukturierter an die Aufgaben bzw. an die Programmcodes, die ich programmieren möchte, ranzugehen. Bevor ich jetzt alles hinschmeiße, werde ich lieber lernen, strukturiert an so etwas ran zu gehen.

    Hättet ihr etwas dagegen, wenn ich weiterhin hier etwas poste?



  • Am wichtigsten ist, dass du Spaß am Programmieren hast.
    Hab damals mit C angefangen und hab für Mikrocontroller, selbstgebastelte Roboter, Schultaschenrechner und für die Konsole kleine (nutzlose 😉 ) C Programme geschrieben.
    Du glaubst nicht, wie oft ich Scheiße gebaut habe, und irgendwelche dubiosen Fehler gemacht habe. Aber dann gabs auch die Momente, als endlich alles geklappt hat. Die von mir programmiere künstliche Intelligenz von 4 Gewinnt mich endlich besiegen konnte. Oder ein Bildverarbeitungsalgorithmus endlich das richtige Ergebnisbild ausgespuckt hat. Usw...

    Aber ich hab eigentlich immer wieder Spaß daran gehabt, neue Dinge zu probieren, und nach einigen Jahren bin ich jetzt ein halbwegs brauchbarer Programmierer.
    Arbeite inzwischen als C++ Entwickler für embedded systems, und komme eigentlich sehr gut klar. Gerade weil ich eben Programmieren immer als Spaß gesehen habe, und nicht nur rein aus der Ausbildung (Schule + Uni) kennengelernt habe.
    Dort habe ich natürlich auch einiges gelernt, aber das meiste habe ich selber gelernt, wenn ich z.B. eine Nacht lang darüber gedüftelt habe, wie ich einen PID Regler dazu bekomme, meinen Roboter auf einer geraden Linie fahren zu lassen.

    Vielleicht wäre es gut, mit weniger abstrakten Dingen wie std::string anzufangen. C++ legt auf C nochmal eine Abstraktionsebene drauf. Vielleicht wäre es besser, du siehst dir die C Strings mal an, denn mit denen arbeitest du direkt am Speicher, das kannst du dann auch sehr gut debuggen und dir anschauen, was da genau passiert. Und zum Stringvergleich schreibst du dir deine eigene Funktion, die zwei C Strings annimmt, und einfach Zeichen für Zeichen vergleicht.
    Denn letztlich passiert in C++ genau das gleiche, nur dass die Dinge etwas versteckter, hinter der Hülle einer oder mehrerer Klassen, ablaufen.
    Und wenn du dann str1.compare(str2) aufrufst, dann weißt du wenigstens genau, was da im Hintergrund tatsächlich abläuft.

    Also spiel weiter mit C und C++, und hab Spaß daran. Gerade in der Softwareentwicklung stößt man immer wieder auf Problemstellungen, von denen man davor nicht mal noch gehört hat. Man ist also auch als Profi immer wieder Anfänger - auf einem neuen Fachgebiet. Doch ist nicht das gerade das spannende am Programmieren?



  • silent_max schrieb:

    Hättet ihr etwas dagegen, wenn ich weiterhin hier etwas poste?

    Nein. Warum sollte?

    Überleg dir VOR jeder Aufgabe, ob du sie jemand anderen erklären kannst. Dann hast du die Aufgabe verstanden und kannst dich an die Lösung machen 🙂



  • und lass dich auch nicht vom teils rauen Ton im Forum abschrecken.
    Man wird belehrt und manchmal sogar als dumm dargestellt, aber wenn man dann mal drüber nachdenkt was der eine oder andere so geschrieben hat kann man sehr viel dabei lernen!

    programmierer sind halt keine softies 😃



  • programmierer sind halt keine softies

    Genau genommen schon ;). Die Techniker sind schon eher die "harten Jungs" 🤡



  • So wie ich Dich verstanden habe kleiner Troll, sollte man sich schon vorher Gedanken machen, wie man einen Programmcode aufsetzt??

    Ja, ja und ja! Du erinnerst dich vllt an den anderen thread, wo gefragt wurde warum du x machst. Das ziehlte in etwa genau darauf ab. So ein strukturiertes Vorgehen machen die meisten irgendwann mehr oder weniger "automatisch", aber wohl scheinbar nicht jeder.
    Das heißt nicht, das man so keine Fehler man macht, aber man versteht dann schnell, warum etwas falsch ist.



  • Selber nachdenken macht schlau. Hat mein Mathelehrer immer gesagt.
    Ich laufe öfters in Probleme, dann fange ich an hier einen Beitrag zu schreiben. Da muss erst das Ziel drin stehen was ich machen will,
    dann der Ansatz wie ich das löse und dann was daran nicht funktioniert. Und während ich so meine Frage formuliere fallen mir alle
    Schlaumeierantworten ein die hier so gegeben werden (oder die ich selber geben würde). Die Frage muss also so gestellt werden, dass
    ich all diese Schlaumeierantworten schon bedacht und durchprobiert habe. Und nachdem ich meine Frage mittelmäßig idiotensicher
    gestellt habe ist sie so einfach, dass ich selbst auf die Antwort komme.
    Dieses Forum hilft mir sehr, weil ich hier Fragen entwerfe, die ich dann nicht abschicke, die aber trotzdem beantwortet sind (ein
    magisches Forum ist das) (Ich drücke auch ungefähr 20 mal auf Vorschau bevor ich was abschicke.
    do drüberlesen(); while (fehlergefunden);).
    Das ist ungefähr dasselbe, was Troll meinte. Beim Frage stellen strukturiere ich meine Gedanken und analysiere das Problem, was der
    Schlüssel zur Problemlösung ist. Du wirst sicherlich deine eigene Form der Problemanalyse finden.

    Noch ein paar Tipps:
    Unbedingt den Debugger benutzen. Du hast ein Programm, es tut nicht was es soll. Du kannst Schritt für Schritt durch das Programm gehen
    und vergleichen, ob sich das was das Programm tut mit deinen Erwartungen deckt und genau die Stelle finden, wo das nicht mehr der Fall
    ist. Das setzt natürlich voraus, dass du weißt, was du willst. Und das Ziel ist nicht "Die Aufgabe lösen" sondern "Diese Funktion tut
    X".

    Kenne deine Grenzen. Ich habe festgestellt, dass ich an guten Tagen ungefähr 1000 Zeilen selbst geschriebenen Code überblicken kann.
    Danach setzt mein Hirn aus und es kommt nur noch Blödsinn raus. Wie schreibe ich ein 3000 Zeilen langes Programm? Ich muss dafür
    sorgen, dass ich mindestens 3 Teile habe, die unabhängig voneinander verständlich sind. Dann gibt es eine einfache Funktionsstruktur,
    wo ein Teil jeweils andere Teile benutzt. Wenn irgendwo irgendwas schief geht, muss sofort klar sein, welcher Teil schuld hat, sonst
    bin ich in den 3000 Zeilen verloren. Das ist ungefähr das, was man mit Kapselung/Strukturierung/Objektorientiertheit/Wasauchimmer
    bezeichnet, allerdings für mich verständlicher.



  • silent_max schrieb:

    Ich hätte einmal eine Grundsatzfrage...
    Was haltet ihr denn davon?? Hat es überhaupt denn Sinn, weiter zu kämpfen wenn man so ungeeignet und untalentiert ist wie ich?? Oder macht es nicht mehr Sinn, nach was anderem zu suchen?

    Hat es also Sinn, wenn man im Kopf so unstrukturiert und so untalentiert wie ich an die Sache rangeht und die Leute hier im Forum schon weitestgehend geschrieben haben, dass man 0,0 "Talent" hat und es besser sein lassen soll, weiterhin zu kämpfen??

    aach egal. untalentiert sind 99,9% aller user hier auch, das fällt nicht weiter auf, guck dir mal Sone an z.b.
    wenn du spass dran hast(an deinen proggies die nicht laufen), einfach weitermachen! 👍



  • Ich les hier nicht genug, um mir irgendein Urteil über silent_maxs Talent erlauben zu können. Hier nur ein paar Gedanken zum Thema "Talent und Training", auf die ich Hauptsächlich durch meine Trainertätigkeiten im Sport gekommen bin, von denen sich aber vielleicht auch einige Sachen aufs Programmieren übertragen lassen:
    - Um Weltklasse in irgendwas zu werden müssen meistens Talent und Fleiß zusammenkommen.
    - Extrem gute Leute (zb. Shade Of Mine?) behaupten gerne, man bräuchte kein Talent und sie wären nur durch ihre Lern-Einstellung dahin gekommen. Das scheint mir aber genau wie das Gegenteil (schlechte Leute, die sagen, es läge nur an ihrer Veranlagung) eine Form vom Self-serving bias (http://de.wikipedia.org/wiki/Selbstwertdienliche_Verzerrung) zu sein.
    - Durch harte Arbeit lässt sich trotzdem (auch mit durchschnittlichem Primärtalent) viel erreichen, vorallem wenn die eigenen Stärken und Schwächen erkannt, und dementsprechend die Trainingsmethoden schlau gewählt werden. (Metakognition?)
    - Talent ist nicht binär. Es gibt viele verschiedene Facetten und Abstufungen.
    - Lernkurven verlaufen stark unterschiedlich. Es gibt Leute, die werden anfangs schnell ziemlich gut und steigern sich dann kaum noch weiter. Andere krüppeln anfangs nur rum, werden dann mit den Jahren aber kontinuierlich immer besser und überholen irgendwann viele der "Schnellstarter".
    - Training/Arbeit/Lernen ist wesentlich ergiebiger wenns Spaß macht. Ich tippe drauf, dass es dafür auch eine tolle neurochemiesche Erklärung gibt. 😉



  • silent_max schrieb:

    Ich hätte einmal eine Grundsatzfrage...

    Wie ihr alle mitbekommen habt, habe ich mit der Programmierung Probleme.

    Hast du bis jetzt nur mit C++ programmiert? Als erste Sprache solltest du was einfacheres lernen, z.B. Python.



  • 98iu8iu7z6 schrieb:

    ... Als erste Sprache solltest du was einfacheres lernen, z.B. Python.

    Schnickschnack.
    Man kann auch in C++ einfache Sachen machen. Aber dafür fehlt ihm im Augenblick das rechte Verständnis.

    Die meisten Sachen (Variablen, Kontrollstruckturen, Funktionen) sind in den meisten Programmiersprachen gleich.



  • DirkB schrieb:

    98iu8iu7z6 schrieb:

    ... Als erste Sprache solltest du was einfacheres lernen, z.B. Python.

    Schnickschnack.
    Man kann auch in C++ einfache Sachen machen. Aber dafür fehlt ihm im Augenblick das rechte Verständnis.

    Die meisten Sachen (Variablen, Kontrollstruckturen, Funktionen) sind in den meisten Programmiersprachen gleich.

    In Python muss man sich schon mal sogut wie garnicht um Variablentypen kümmern. Listen und Schleifen darüber sind auch viel einfacher...



  • Dobi schrieb:

    - Um Weltklasse in irgendwas zu werden müssen meistens Talent und Fleiß zusammenkommen.
    - Extrem gute Leute (zb. Shade Of Mine?) behaupten gerne, man bräuchte kein Talent und sie wären nur durch ihre Lern-Einstellung dahin gekommen. ...

    So etwas wie Talent gibt es nicht. Du kannst Shade Of Mine ruhig glauben. Es zählt das Interesse an einem Thema, die investierte Zeit und ein gute Förderung. Mit Förderung meine ich alles von einem Verwandten der einem etwas erklärt, über gute Bücher mit deren Hilfe es einem wie Schuppen von den Augen fällt und natürlich braucht man auch das entsprechende Umfeld und die Möglichkeiten.

    Ausnahmslos alle die eine gewisse Weltklasse erreicht haben oder sogar als Genies gelten (in Sport, Musik, Wissenschaft usw. ...) haben immens mehr Zeit in ein Thema gesteckt als der Rest der Welt. So einfach ist das Leben. 😉



  • silent_max schrieb:

    ...Hat es also Sinn, wenn man im Kopf so unstrukturiert und so untalentiert wie ich an die Sache rangeht und die Leute hier im Forum schon weitestgehend geschrieben haben, dass man 0,0 "Talent" hat und es besser sein lassen soll, weiterhin zu kämpfen??

    Ich würde an deiner Stelle schlicht nicht so viel im Forum posten. Das ist Zeitverschwendung. Quäl dich durch die Aufgaben, sprich mit deinen Mitschülern und frag den Lehrer. Erarbeite 100%ig eigene Lösungen und vergleiche erst dann mit der Musterlösung.

    Wenn dir bei einem Programm wie deinem Stringvergleich so viele Gedanken durch den Kopf schießen, dann setze halt ein paar davon um und überleg dir die Vor- und Nachteile der jeweiligen Lösung bzw. überleg dir ob überhaupt alle Varianten das Problem auch wirklich lösen.

    Der Schlüssel ist, sich von Beginn an selbst um die Aufgaben zu kümmern, vielleicht zusammen mit einem Mitschüler. Nur wenn es wirklich absolut nicht weitergeht wendest du dich an das Forum.

    Was du hier versuchst wird nicht funktionieren. Wenn du in 2 Wochen eine Abschlussprüfung in c++ hast, dann such dir eine Lerngruppe aus Mitschülern die das Fach beherrschen und bereit sind dir alles zu erklären. Das Forum hier wirft dich nur zurück.



  • So ein Schmarrn, natürlich gibt es "so etwas wie Talent".
    Und es ist auch überhaupt nicht egal ob man es hat oder nicht hat.

    Die Vorstellung jeder könne zu einem wirklich guten Programmierer werden ist genau so absurd wie die Vorstellung jeder könne zu einem wirklich guten Schriftsteller/Tänzer/Skateboardfahrer/... werden.

    Das mag vielleicht nicht fair sein, aber es ist einfach so. Es zu verleugnen bringt keinem was. Ausser vielleicht denen, die gerne glauben möchten dass alle die weniger erreicht haben als sie selbst einfach nur faule Säcke sind.


Anmelden zum Antworten