Kann ich überhaupt programmieren lernen?

Hi,

ich lese langsam regelmäßig in diesem Forum mit und hab mich eben dazu entschlossen mich anzumelden, um mehr oder vielleicht auch weniger eine Bereicherung darzustellen, aber vorallem, um die ein oder andere Frage stellen zu können.

Ich hoffe, dass meinen Fragen konstuktive Vorschläge folgen und keine Diskreminierungen, wie es in Foren leider so oft der Fall ist, weil meine Frage dämlich oder die Antwort darauf leicht erscheint.

Ich versuche seit ca. 6 Wochen C++ zu lernen, mit Hlife von öffentlichen Video Tutorials, Google, und einer Fachliteratur, die ich mir vor wenigen Tagen kaufte. Jeden Tag beschäftige ich mich im Schnitt ca. 2,5 Std. mit C++.

Mein Grund, weshalb ich diesen Beitrag schreibe, ist die Programmieraufgabe "Bowling-Simulation" lösen zu wollen. Mich beschäftigt aber auch, ob ich überhaupt die Voraussetzungen besitze, um das Programmieren erlernen zu können.
Wenn ich mir manche Beiträge von hiesigen, erfahrenen Programmieren oder vermeindlich simple Codes durchlese, geht das ganze oft über mein Verständnis hinaus!

Mir scheint man müsse für das Programmieren ein hohes Verständis für Mathematik besitzen, welches, meiner Meinung nach, bei mir nicht sonderlich ausgeprägt ist.

Leider überfordert mich die Programmieraufgabe und ich bin nach etwa 3 Std. coden und ausprobieren und googlen nicht über dies hinaus gekommen:

Code:
//    main.cpp    //

#include <iostream>
#include <conio.h>
#include <time.h>
using namespace std;


int main(){

    int iPlayer;
    int iTurn = 10;
    int iZufallszahl;


    cout << "Wieviele Spieler sollen am Tunier teilnehmen?" << endl;
    cin >> iPlayer;
    cout << "Es nehmen " << iPlayer << " Spieler am Tunier teil." << endl;

    srand((unsigned)time(NULL));

    for (int i = 0; i < iTurn; i++){
        iZufallszahl = rand()%11;
            cout << iZufallszahl << endl;

    if (iZufallszahl == 10)
        for (int j = 9; j < iTurn; j++)
            cout << rand()%11 << endl;
    }


    _getch();
}

Der Code funktioniert soweit ja auch ganz gut. Aber das wären nur die Würfe von Spieler 1 inkl. den nach Strikes resultierenden Würfen.

Wie kann ich die Ergebnisse, die rand() ausgibt, zu einer Gesamtsumme addieren und wie kann ich erreichen, dass nach Spieler 1, Spieler 2 folgt usw..

Ich versuche meine eigene Lösung zu finden und mich nicht zu sehr nach den vorhergenden Codes zu richten. (Soweit ich sie überhaupt verstehe)


Ich wäre euch auf jedenfall dankbar, wenn ihr auf meinen Beitrag eingehen würdet. Nicht nur auf meine Fragen, sondern auch auf meine Bedenken. Ich muss sehr viel darüber nachdenken, ob ich überhaupt die Intelligenz besitze Programmieren! erlernen zu können.
 
@Sin84
Als erstes: Willkommen im Board, Sin84...:)
Aber gleich zu Anfang auch ein kleiner Tipp für die Zukunft: Du vermischt zwei unterschiedliche Anliegen in diesem Beitrag - einmal stellst Du eine konkrete Frage zu der Bowling-Aufgabe (die ist in diesem Thread natürlich völlig richtig platziert), doch Deine Grundsatzfragen zum Thema Programmieren und Programmieren lernen, gehören eigentlich in einen eigenen Thread. Der Grund dafür ist denkbar einfach: In einem Support-Forum dienen die Threads primär dazu Hilfestellungen bei Problemen zu geben, deshalb sollten die Titel der Threads eindeutig sein (damit der Thread auch später über die SuFu von anderen Betroffenen gefunden werden kann) und die Beiträge sollten sich alle auf das Thema beziehen. Niemand käme auf die Idee in einem Thread zu einer konkreten Programmieraufgabe, nach einer Grundsatzdiskussion über die wichtigsten Eigenschaften eines Programmierers zu suchen...

Sin84:
Mir scheint man müsse für das Programmieren ein hohes Verständis für Mathematik besitzen, welches, meiner Meinung nach, bei mir nicht sonderlich ausgeprägt ist.
Selbstverständlich spielt Mathematik eine Rolle in der Programmierung und ein gewisses mathematisches Grundwissen ist unabdingbar, da praktisch alle Programmiersprachen schon in ihrer Schreibweise auf mathematischen Regeln beruhen. Ohne z. B. die Regeln für die Operatorreihenfolge zu kennen ("Punktrechnung vor Strichrechnung", etc.) oder zu wissen wie man einen Ausdruck klammern muss, damit er in der gewünschten Reihenfolge aufgelöst wird, ist ein Programmierer verraten und verkauft. Ansonsten hängt es stark davon ab, welche Ziele Du genau verfolgst, es gibt viele Arten von Anwendungen, die man ohne allzuviel Mathematik coden kann. In jedem Fall kann es, bei einer ernsthaften Beschäftigung mit dem Thema Programmieren, nicht schaden seine mathematischen Kenntnisse aufzufrischen oder zu erweitern. Eine gute und leicht verständliche Einführung bietet z. B. der erste Band der Reihe Mathematik für Informatiker von Teschl & Teschl (erschienen im Springer-Verlag)...

Sin84:
Ich muss sehr viel darüber nachdenken, ob ich überhaupt die Intelligenz besitze Programmieren! erlernen zu können.
Programmieren ist eine Fertigkeit wie alle anderen auch - wenn Du lesen kannst, etwas Geduld mitbringst und zumindest über ein bisschen logisches Denkvermögen verfügst, steht dem erlernen einer Programmiersprache nichts (oder höchstens die eigene Ungeduld/Trägheit) im Weg...;)

Sin84:
Wie kann ich die Ergebnisse, die rand() ausgibt, zu einer Gesamtsumme addieren und wie kann ich erreichen, dass nach Spieler 1, Spieler 2 folgt usw..
Hm, ich habe die Aufgabe und Deinen Code nur überflogen (kenne mich mit C++ auch nicht besonders gut aus), aber so auf Anhieb würde ich die "Würfe" in eine Methode packen, die die Zufallszahlen für die Ergebnisse (einschliesslich möglicher Extra-Würfe bei einem Strike) als Rückgabewerte hat. Diese Methode würde ich dann für jeden Spieler aufrufen (dafür eignet sich wiederum eine Zählschleife) und die Ergebnisse in einen eigenen Array speichern... Vielleicht hilft Dir das ja schon weiter...;)
 
Habe mal die Beiträge in einen eigenen Thread verschoben:
Zum einen ist der Bezug zu der Bowling-Simulation nicht sooo stark.
Zum anderen dürfte es so deutlich mehr Benutzer erreichen (da wohl nur die wenigsten ernsthaft die Programmieraufgaben Threads verfolgen ;) )
 
Ich würd es mal so sagen: Beim Programmieren ist wie mit einen neuen Sport erlernen. Mit der richtigen Ausrüstung (Bücher/Foren/event. einem Lehrer) und viel Übung kann man ziemlich weit kommen. Und: Es ist noch kein Meister vom Himmel gefallen.

Dinge die dir jetzt zu komplex erscheinen wirst du mit Übung - je nach dem in kürzerer oder etwas längerer Zeit - aus dem ff beherschen. Ansonstem ist dem von Tarantoga nicht mehr viel hinzuzufügen.
 
Ich stimme Tarantoga zu.

Um das mit der Mathematik und dem neuen Sport nochmal aufzugreifen...

"Muss ich gelenkig sein um Sport zu machen?"...
Für Tennis, Freeclimbing und Fußball ist das sicherlich nicht schlecht, für Schach und E-Sport jedoch nicht umbedingt erforderlich.

Was ich damit sagen möchte und wie auch Tarantoga bereits gesagt hat: Programmieren auf Mathematik zu reduzieren ist der falsche Ansatz. Logisches denken und immer weiter wühlen, das sollte die Devise sein.

Darf ich fragen, warum du programmieren lernen möchtest? Lernst du um zu lernen, oder verfolgst du konkrete Ziele?
 
auch wenn die threads nun getrennt sind, am beispiel der bowling simu kann man die vorgehensweise erklären...

@Sin84

du versuchst das ganze also prozedural ... ok

es hilft, wenn man sich bei dieser vorgehensweise vor beginn der programmierung ein paar gedanken macht wie das gesammtproblem in (möglicherweise wiederkehrende) teilprobleme zerlegt werden kann:

"jeder spieler macht alle seine würfe am stück" -> man kann hier eine prozedur ableiten die würfe macht, und eine prozedur die diese prozedur benutzt um alle würfe eines spielers zu machen

du kannst mal versuchen für das ganze, ohne code, nur durch die planung von prozeduren, eine lösung zu skizzieren

wenn du dann die nötigen prozeduren für deine lösung identifiziert hast und daraus die gesammtlösung zusammengesetzt hast, kannst du dir gedanken machen welche informationen deine prozeduren jeweils für die erfüllung ihrer aufgaben benötigen, und welche informationen sie jeweils an die aufrufende prozedur zurückgeben ...

beispielsweise soll die bestenliste im speicher gehalten werden ->
die prozedur die alle würfe eines spielers macht, muss wissen wo sie den bestenlisten eintrag des spielers findet, für den sie gerade die würfe durchgeführt hat, sonst kann sie dort nichts eintragen ... da diese prozedur auch wissen muss was sie dort eintragen soll, muss sie die ergebnisse der einzelnen würfe auswerten ... da diese ergebnisse aber nur der prozedur bekannt sind welche die würfe durchführt, ist klar dass die durchführende prozedur ein ergebnis zurückliefern sollte ...

in code übertragen haben diese überlegungen nun alle informationen zu diesen prozeduren geliefert, um daraus funktionen mit rückgabetypen und parametern zu machen ... natürlich sind die überlegungen für die bowling simulation noch nicht vollständig, da ich hier nur einen ausschnitt betrachtet habe und es wäre verfrüht jetzt schon code zu schreiben, da sich noch dinge ändern können sobald man den rest betrachtet, aber ich hoffe das schema mit dem man das ganze strukturiert planen kann ist klar geworden...


  1. zerlegen in prozeduren (in welche teilprobleme kann man das ganze zerlegen?)
  2. zusammensetzen der gesammtlösung aus den prozeduren (welche prozeduren rufen welche anderen prozeduren auf, damit das gesammtproblem gelößt wird?)
  3. informationsfluss zwischen prozeduren (welche informationen muss eine prozedur erhalten und zurückgeben, damit die aufgerufene und die aufrufenden prozeduren arbeiten können?)
 
Danke für eure Antworten, Tipps und für´s Thread verschieben. :wink:

Ich war mir nicht sicher, ob ich extra ein neues Thema erstellen sollte, da ich davon ausging, dass nach meiner zugegebenermaßen längeren "off topic- Zwischenfrage", das Thema bald wieder zurück zum Ursprung finden wird.
Aber nun hab ich wohl meinen eigenen Bowling Simulations Thread. :P

Taratonga:
Hm, ich habe die Aufgabe und Deinen Code nur überflogen (kenne mich mit C++ auch nicht besonders gut aus), aber so auf Anhieb würde ich die "Würfe" in eine Methode packen, die die Zufallszahlen für die Ergebnisse (einschliesslich möglicher Extra-Würfe bei einem Strike) als Rückgabewerte hat. Diese Methode würde ich dann für jeden Spieler aufrufen (dafür eignet sich wiederum eine Zählschleife) und die Ergebnisse in einen eigenen Array speichern... Vielleicht hilft Dir das ja schon weiter...;)
Deinen Ratschlag konnte ich einigermaßen realisieren. Ich tu mich aber ein wenig schwer mit der Rückgabe und ob ich das ganze dann schaffe in ein Array zu verpacken, wird sich noch herausstellen.

Code:
    //    main.cpp    //

#include <iostream>
#include <conio.h>
#include <time.h>
using namespace std;


void Würfe(){        // Ist zur Zeit wieder void, bis ich das mit den Rückgabewerten hinbekomme.

    int iZufallszahl;
    int iTurn = 10;

    for (int i = 0; i < iTurn; i++){
        iZufallszahl = rand()%11;
            cout << iZufallszahl << endl;

    if (iZufallszahl == 10)
        for (int j = 9; j < iTurn; j++)
            cout << rand()%11 << endl;
    }
    
}


int main(){
    
    int iPlayer;


    cout << "Wieviele Spieler sollen am Turnier teilnehmen?" << endl;
    cin >> iPlayer;
    cout << "Es nehmen " << iPlayer << " Spieler am Turnier teil." << endl;
    
    srand((unsigned)time(NULL));
    for (int i = 1; i <= iPlayer;){
        cout << "Spieler " << i++ << " wirft:" << endl;
        Würfe();
    }


    _getch();
}
.:L:
Darf ich fragen, warum du programmieren lernen möchtest? Lernst du um zu lernen, oder verfolgst du konkrete Ziele?
Ich wollt schon programmieren können, als ich noch ein Kind war. Als Kind hatte mich das Hacken sehr fasziniert. :) Ich hatte aber erst im Alter von 18 Jahren das Geld zusammen für nen eigenen Pc. Jetzt bin ich 26 und es wird langsam mal Zeit mit dem Lernen zu beginnen.


@GrafZahl:

Von dir habe ich hier bereits ein paar Beiträge gelesen und deinen Nick behielt ich in Erinnerung.

Jo, ich versuche es prozedural. Ich habe mir zwar kurz Gedanken gemacht, wie das komplette Programm funktionieren könnte, bevor ich angefangen habe den Code zu schreiben, aber das sind immer eher fixe Ideen als ein wirklicher Plan.
Den Aufbau des Programmes zu skizzieren, bevor ich anfange irgendwas zu schreiben, werde ich auf jeden Fall mal versuchen. Danke dafür.

Erstellst du denn vor jedem Code erstmal eine Skizze?


@all:


Und um nochmal zurück zu meinem Code zu kommen. Ich glaube aufgrund der einzelnen Prozeduren, die ich gefertigt habe, ist es jetzt kaum noch möglich eine Bestenlise zu erstellen, ohne den halben Code über den Haufen werfen zu müssen. Oder irre ich mich?
 
Sin84:
Ich tu mich aber ein wenig schwer mit der Rückgabe und ob ich das ganze dann schaffe in ein Array zu verpacken, wird sich noch herausstellen.
Wie gesagt - mit C++ habe ich wenig Erfahrung, daher kann ich Dir leider nicht genau erklären wie in dieser Sprache Prozeduren definiert und Arrays realisiert werden können... Aber vielleicht erbarmt sich z. B. CDW, dass ist ein Board-interner Moderations-Bot, in dem die Syntax & Paradigmen der gängigen Sprachen implementiert wurden...;)

Sin84:
Ich glaube aufgrund der einzelnen Prozeduren, die ich gefertigt habe, ist es jetzt kaum noch möglich eine Bestenlise zu erstellen, ohne den halben Code über den Haufen werfen zu müssen. Oder irre ich mich?
Das kommt darauf an, wie genau Du die Prozeduren realisiert hast - ohne Deinen Code zu kennen, kann man das schlecht beantworten... Aber wenn Du die Würfe der Spieler in einem Array speicherst, sollte das kein Problem sein - einfach die besten Ergebnisse aus dem Array auslesen und, nach Größe geordnet, in ein neues Array packen...
 
Zuletzt bearbeitet:
Achtung! Programmieren mit Umlauten ist böse! :wink:
Einige Compiler quittieren, wenn sie Quelltexte mit Umlauten erhalten, einfach mit einem Fehler den Dienst (wundert mich gerade, dass das überhaupt ein C++-Compiler annimmt).

Um das Problem zu lösen gibt es unendlich viele Möglichkeiten und, ja mit deinem Codeaufbau funktioniert das auch. Ich würde vorschlagen, dass du ein globales Array (zweidimensional - 1. Dimension für die Spieler; 2. Dimension für ihre Würfe, also 20 integer groß) anlegst und der Funktion Wuerfe den aktuellen Spieler (die aktuelle Spielernummer) übergibst. Dann kann die Funktion nämlich die Werte für jeden Spieler in dem Array speichern.
Danach kannst du von main aus auf das Array zugreifen.

Nur eine Sache noch zu deinem Code (kann sein, dass ich was falsch verstehe, aber...)
Code:
    if (iZufallszahl == 10)
        for (int j = 9; j < iTurn; j++)
            cout << rand()%11 << endl;
j=9, ist damit < iTurn (= 10) , j++
Die Schleife wird einmal durchlaufen -> ist daher unnötig.

mfg Christian
 
Erstellst du denn vor jedem Code erstmal eine Skizze?
bei größeren dingen, ja ... kleinere dinge wie die bowling aufgabe mach ich im kopf
Und um nochmal zurück zu meinem Code zu kommen. Ich glaube aufgrund der einzelnen Prozeduren, die ich gefertigt habe, ist es jetzt kaum noch möglich eine Bestenlise zu erstellen, ohne den halben Code über den Haufen werfen zu müssen. Oder irre ich mich?
ja, du irrst ;)

prozeduren haben unteranderem die eigenschaft, dass sie in der regel kontextabhänig sind ... würfe gibt es beispielsweise jede menge, aber jeweils einige stehen im kontext eines spielers ... lässt man nun zu, dass die prozedur den jeweiligen kontext kennt, kann sie mit wissen um den konkreten kontext handeln, oder weitere prozeduren kontextbezogen aufrufen, wie beispielsweise eine prozedur die den eintrag in die liste vornimmt ... das wissen um den kontext währe in diesem beispiel möglicherweise die spielernummer, oder aber auch jedes andere identifizierende merkmal dass du einbauen möchtest (z.B. spielername, pointer auf den jeweiligen eintrag in der bestenliste, etc ... nummern haben sich allerdings als IDs bewährt ...)

bezogen auf prozeduralen c/c++ code kann man die kenntnis des kontextes als funktionsparameter sehen

also statt:
Code:
void Wuerfe()
hieße die methode dann beispielsweise:
Code:
void Wuerfe(int iFuerSpielerNr)
in diesem fall müsste es dann aber eine globale referenz auf die bestenliste geben, auf die die methode dann zugreifen kann ... alternativ betrachtet man auch die bestenliste als kontext (so dass theoretisch mehr als ein spiel zur gleichen zeit laufen könnte) und gibt die liste auch als parameter mit ...

jenachdem wie du die bestenliste ausführen möchtest (nur alle spieler mit ihrer jeweiligen gesammtpunktzahl, oder aber auch jeden einzelnen wurf), variiert das weitere vorgehen...

//da war doch glatt jemand schneller ...
 
Thunder11:
j=9, ist damit < iTurn (= 10) , j++
Die Schleife wird einmal durchlaufen -> ist daher unnötig.
Hattest Recht. Schleife entfernt und die bösen Umlaute auch.

Aber abgesehen von der Schleife und den Umlauten, bin ich mit meinem Code seit meinem letzen Post nicht im Geringsten voran gekommen.


Thunder11:
Ich würde vorschlagen, dass du ein globales Array (zweidimensional - 1. Dimension für die Spieler; 2. Dimension für ihre Würfe, also 20 integer groß) anlegst und der Funktion Wuerfe den aktuellen Spieler (die aktuelle Spielernummer) übergibst.
Hört sich nach einem guten Vorschlag an, hab ich jetzt auch schon mehrere Stunden versucht umzusetzen, es geht aber einfach nix! :wall:
Mir tausend verschiedene Texte über return und Funktionsübergabe durch zu lesen, hat mir auch nicht weiter geholfen.

Wie übergebe ich denn einer Funktion Parameter aus der main()? Ich dachte die main() Funktion erhält höchstens die Parameter einer Funktion?!


GrafZahl:
jenachdem wie du die bestenliste ausführen möchtest (nur alle spieler mit ihrer jeweiligen gesammtpunktzahl, oder aber auch jeden einzelnen wurf), variiert das weitere vorgehen...
Gesamtpunktzahl.


Hilfe! :)
 
ich hab lange kein cpp mehr geschrieben, und das hier auch nicht getestet...
Code:
#include <iostream>
#include <iomanip>

#define _MAX_PLAYERS_ 100

int globalVarBestenliste[_MAX_PLAYERS_];

int Wurf()
{
    //hier muss noch ein richtiger wurf implementiert werden
    int punkte=4;
    return punkte;
}

void alleWuerfeFuerSpieler(int spielerNummer)
{
    //hier alle würfe eines spielers durchführen lassen,
    //z.B. so:
    int gesPunkte = 0;
    for(int i=0;i<10;i++)
    {
        gesPunkte += Wurf();
        //gesPunkte = gesPunkte + Wurf(); // beide zeilen bedeuten das gleiche
    }
    globalVarBestenliste[spielerNummer] = gesPunkte;
}

void ausgabeBestenlistenEintragFuerSpieler(int spielerNummer)
{
    if(globalVarBestenliste[spielerNummer] != -1)
    {
        cout << "Spieler " << setw(3) << spielerNummer << " hat ";
        cout << setw(4) << globalVarBestenliste[spielerNummer] << " Punkte erreicht." << endl;
    }
}

int main()
{
    for(int i=0;i<_MAX_PLAYERS_;i++)
    {
        globalVarBestenliste[i]=-1;
    }

    //hier erfassen wer/wieviele leute mitspielt/mitspielen...
    int iPlayer;


    cout << "Wieviele Spieler sollen am Turnier teilnehmen?" << endl;
    cin >> iPlayer;
    if(iPlayer > _MAX_PLAYER_)
        iPlayer = _MAX_PLAYER_;
    cout << "Es nehmen " << iPlayer << " Spieler am Turnier teil." << endl;


    //alleWuerfeFuerSpieler für jeden spieler aufrufen
    for(int i=0;i<iPlayer;i++)
        alleWuerfeFuerSpieler(i);

    //bestenliste ausgeben ... -1 in der bestenliste bedeutet,
    //dass auf diesem listen platz kein spieler teilgenommen hat
    for(int j=0;j<iPlayer;j++)
        ausgabeBestenlistenEintragFuerSpieler(j);
    

    return 0;
}

was du dem code entnehmen kannst:

deklaration eines globalen arrays (auch wenn man das nach möglichkeit vermeiden sollte...)
array zugriff ...
funktionen und methoden mit parametern ...
rückgabe des ergebnis einer funktion ...

versuch das ganze mal nachzuvollziehen, und schau was du für dein programm verwenden kannst ... man kann das ganze an dem punkt hier nach belieben aufblasen, dass genug für dich zu tun bleibt ... man könnte die bestenliste sortieren ... man könnte den spielern namen geben ... man könnte jeden einzelnen wurf speichern ... vielfältige möglichkeiten ... ;)

ich geh derweil mal wieder meinem fremdsprachenkurs in elefantisch nach, und bereichere die taschentuch hersteller...
 
Danke für den Code, GrafZahl. Ich glaub der könnte mir ein wenig weiterhelfen, Rückgabewerte besser zu verstehen.
Ich werd mich dann morgen ausführlich mit dem auseinandersetzen.

Gute Besserung!
 
Warum hast Du Dich eigentlich für C++ als erste Programmiersprache entschieden? Die Sprache C++ ist eine mächtige und vielseitige Sprache, die gleich mehrere Paradigmen unterstützt - aber genau deshalb ist sie nicht gerade die einfachste Sprache die man erlernen kann.
Für jemanden der noch keiner Kenntnisse als Programmierer besitzt, eignen sich vermutlich andere Sprachen besser - so auf Anhieb würden mir etwa Java oder Python einfallen, die beide als einfach zu erlernen gelten...
 
Warum hast Du Dich eigentlich für C++ als erste Programmiersprache entschieden? Die Sprache C++ ist eine mächtige und vielseitige Sprache, die gleich mehrere Paradigmen unterstützt - aber genau deshalb ist sie nicht gerade die einfachste Sprache die man erlernen kann.
Für jemanden der noch keiner Kenntnisse als Programmierer besitzt, eignen sich vermutlich andere Sprachen besser - so auf Anhieb würden mir etwa Java oder Python einfallen, die beide als einfach zu erlernen gelten...

Solltest du unter Windows entwickeln empfehle ich dir einmal C# anzusehen. Das .NET-Framework ist für Anfänger wirklich sehr einsteigerfreundlich und bietet auch für Fortgeschrittene ein ansehnliches Repertoire. Die Sprache ist sehr einfach zu erlernen, des Weiteren ist der Einstieg in die GUI-Programmierung durch VisualStudio später sehr leicht. Ich persönlich finde C# leicht zu lesen und zu verstehen.
 
Hi Tarantoga,

gerade weil C++ so mächtig und vielseitig sein soll, habe ich mich für die Sprache entschieden. Ich dachte mir, "wenn ich schon anfange Programmieren zu lernen, warum dann nicht eine Programmiersprache wählen, mit der man praktisch alles umsetzen kann?" Jedenfalls ist mein Verständnis von "mächtig", eine Sprache, die vielseitig einsetzbar ist und mit der man viele Pogrammideen verwirklichen kann. Oder sollte ich unter mächtig "schwere Kost" verstehen?

Ich spiele ganz gerne Pc-Spiele. Werde wahrscheinlich niemals ein vernünftges coden.. Habe jedenfalls gelesen, dass ca. 95% aller Spiele in C++ geschrieben werden, was mich u.a. auch dazu bewog, mich für diese Sprache zu entscheiden.

Außerdem ist für Java eine Laufzeitumgebung erforderlich ( wie du natürlich weißt ), was sicher kein Nachteil darstellen muss, für mich aber ein Kontraindiz war. Über Pyton weiß ich praktisch gar nix.

Ist es nicht vielleicht sogar effizienter zuerst eine mächtige, vielseitige Sprache wie C++ zu erlernen und danach "simplere Sprachen" versuchen zu verstehen, als andersrum?
 
Sin84:
gerade weil C++ so mächtig und vielseitig sein soll, habe ich mich für die Sprache entschieden. Ich dachte mir, "wenn ich schon anfange Programmieren zu lernen, warum dann nicht eine Programmiersprache wählen, mit der man praktisch alles umsetzen kann?"
Na ja, auch Java, Python oder C# sind mächtige Programmiersprachen. Genau wie C++ ist Java auch an der klassischen C-Syntax angelehnt, sie wird aber vor allem dadurch leichter, dass sie eine rein objektorientierte Sprache ist (und man sich dadurch nur mit einem Paradigma auseinandersetzen muß) und, im Vergleich zu C oder C++, einen reduzierten Sprachumfang besitzt. C++ schleppt dagegen viele "Altlasten" mit sich herum, die der Tatsache geschuldet sind, dass die Sprache voll mit C kompatibel sein soll...
Auch Python gilt als vergleichsweise leicht erlernbar, da man bei der Entwicklung ebenfalls Wert auf einen reduzierten Sprachumfang und eine überschaubare Anzahl von Schlüsselwörtern gelegt hat.

Sin84:
Ich spiele ganz gerne Pc-Spiele. Werde wahrscheinlich niemals ein vernünftges coden.. Habe jedenfalls gelesen, dass ca. 95% aller Spiele in C++ geschrieben werden, was mich u.a. auch dazu bewog, mich für diese Sprache zu entscheiden.
Ich weiss ja nicht was für Spiele Du Dir so vorstellst, aber Sachen wie Ego-Shooter oder Echtzeit-Strategie Spiele mit toller Grafik wirst Du nicht in Deiner Freizeit am heimischen Schreibtisch coden... Realistischer sind eher Spiele in der Art einiger Browser-Games - und die sind z. B. recht häufig in Java geschrieben.

Sin84:
Ist es nicht vielleicht sogar effizienter zuerst eine mächtige, vielseitige Sprache wie C++ zu erlernen und danach "simplere Sprachen" versuchen zu verstehen, als andersrum?
Du solltest nicht denken das Java oder Python "simpler" sind, alle drei Sprachen gehören zu den höheren Programmiersprachen und alle drei Sprachen kann man vielseitig anwenden... Ein Unterschied ist z. B. das Python und Java gut 10 Jahre jünger als C++ sind und auf eher "moderneren" Prinzipien beruhen und explizit mit Blick auf die Nutzerfreundlichkeit entwickelt wurden...
C++ ist nach wie vor eine extrem wichtige Programmiersprache, z. B. weil sie es, wie C, ermöglicht, sehr nahe an der Hardware zu arbeiten. Deshalb kann man in dieser Sprache sogar Betriebssysteme, Treiber oder ähnliches bauen - das sind aber in der Regel keine Anwendungen, mit denen sich ein Einsteiger beschäftigt...
 
gerade weil C++ so mächtig und vielseitig sein soll, habe ich mich für die Sprache entschieden. Ich dachte mir, "wenn ich schon anfange Programmieren zu lernen, warum dann nicht eine Programmiersprache wählen, mit der man praktisch alles umsetzen kann?
Das denken sich wohl die meisten, ich hab damals das gleiche gedacht. Im Nachhinein muss ich aber zugeben, dass der Gedankengang einen Fehler besaß, nämlich das man als Anfänger erstens gar nicht alle Möglichkeiten ausschöpfen kann (man kann mit C einen Kernel schreiben - brauch man das als Anfänger?) und zweitens ist man als Anfänger oft von der Komplexität überfordert (was bringen die includes (außer das es ohne eben nicht funktioniert)? was macht mein Compiler? usw).

Für den Anfang ist daher eine Sprache sinnvoll, bei der man nicht die Sprache lernen muss, sondern sich Hauptsächlich auf das Programmieren an sich in Form von Problemlösungsalgorithmen. Bsp HelloWorld-Programm

C:
Code:
#include <stdio.h>
int main(int argc, char **argv)
{
   printf("Hello World");
   return 0;
}
Da stell ich mir doch als Anfänger die Frage: Was bedeutet das alles?! Viel lustiger wird es, wenn man dann versucht Zahlen einzulesen oder gar GUI (:D)
Code:
int a;
scanf("%d", &a);
%d ? &a???

Ich habe schnell gemerkt, dass ich mich am Anfang mehr damit auseinander gesetzt habe wie ich C dazu bringe eine bestimmte Aktion auszuführen, als dass ich mir Gedanken über Algorithmen oder den Aufbau gemacht habe.

Nimmt ein ein HelloWorld in Python
Code:
 print "Hello World"
und eine Zahl einlesen:
Code:
zahl = input('Gib eine Zahl ein: ')
print zahl
Ich kann nur jeden Anfänger empfehlen mit einer einfachen Sprache anzufangen und sich so die Grundprinzipien (Schleifen, Funktionen, Rekursionen, Datenstrukturen...) so anzueignen. Den Syntax und Prinzipien hinter neuen Sprachen erlernt man danach relativ schnell. Wenn du nicht nach ein paar Monaten völlig frustriert aufgeben willst, dann versuch dich lieber an Python, damit hast du schneller bessere Erfolge.
 
das endet in einer grundsatz diskusion ...

einfache sprachen bieten fluch und segen in einer eigenschaft ... unschärfe ... du musst nicht alles bedenken damit es funktioniert ... du verstehst aber auch nicht, warum bestimmte dinge so sind wie sie sind, und gewöhnst dir relativ schnell dinge an, die dir nacher im weg stehen ...

das ganze wird zu einer gradwanderung zwischen frustration und fundamentalem verstehen auf der einen seite, und schneller sichtbaren ergebnissen, halbwissen und unerklärlichen phänomenen auf der anderen seite ...

bestes beispiel ist typisierung ...

sprachen wie c/cpp (und in besonderem maße, da die laufzeit auch aufpasst: c#) erwarten dass der programmierer weiß auf was für typen er sich bezieht ... als anfänger wird einem da relativ unbarmherzig klar gemacht, dass 5 nicht gleich '5' oder gar gleich "5" ist ... php kennt an dieser stelle beispielsweise auf den ersten blick gar keinen unterschied ... python kann ich nicht, aber von dem was ich gerade zu dynamischen typisierung überflogen habe verhält es sich da änhlich wie php

nun kann man schnell zu der frage kommen ob es für einen anfänger wichtig ist dass es diese unterscheidung gibt ... auf den erste blick nein, da man ja ganz offensichtlich ohne eine strenge unterscheidung programmieren kann, und sowohl python als auch php weite verbreitung gefunden haben ... aber für jemanden der gerade anfängt wäre es meiner meinung nach wichtig, dass er von anfang an lernt sich möglichst präzise auszudrücken ... wenn die sprache zu strenger typisierung zwingt halte ich das für hilfreich, auch wenn das bedeutet dass man möglicherweise länger braucht bis man zu den gewünschten ergebnissen kommt ...
 
Du schlägst vor eine Sprache zu lernen. Aber nicht programmieren. Vielleicht wird es an einem anderem Beispiel deutlich: Nehmen wir an du willst malen lernen - so hat es wenig Sinn, wenn du Photoshop kaufst und damit experimentierst. Sinnvoller ist es zunächst sich einmal Stift und Papier zu schnappen und dort die Sachen "zu Papier" zu bringen. So erhält man eine Idee, wie man bestimmte Dinge anstellen muss, damit sie auf eine bestimmte Art und Weise wirken. Bei Photoshop hat man zwar zig Mio. Möglichkeiten, aber am Anfang brauch man eh nur die wenigsten und die muss man dann noch aufwendig suchen.
An der Uni wird im ersten Semester meist Scheme gelehrt, es handelt sich dabei um eine funktionale Sprache die massiven Gebrauch von ()(()()((((()))))) macht -.- Zum einen kann ich mir natürlich gut vorstellen, dass die Dozenten die Studenten einfach gerne damit quälen wollen, auf der anderen Seite ist diese Sprache sehr logisch, man lernt sehr wichtige Grundprinzipien und Denkweisen vom Programmieren und sie ist an sich nicht schwer. @Threadersteller, wenn du also des englischen einigermaßen mächtig bist: http://www.htdp.org/2003-09-26/Book/curriculum-Z-H-1.html ein komplettes Lehrbuch, welches dir nicht nur die Sprache beibringt.
 
Zurück
Oben