Beste Möglichkeit C zu lernen

Ja, Python ist halt der kleine Helfer der dir mittels der umfangreichen Bibliothek einfach mal verdammt viel schnell ermöglicht und das ohne lästiges Kompilieren und einrichten. Und das unter allen Plattformen.

Zum Beispiel auch mit knapp 300 Zeilen Code für meine Eltern einen kleinen Webservice geschrieben der ihre Excel-Dateien auswertet. Also in den 300 Zeilen steckt dann der Webserver GET/POST Handling und die Auswertung der Excel-Datei. Alles nur mit einem Addon was Excel-Dateien lesen kann.

Das ist natürlich kein Rock-Solid Production Ready Code der auf 1000 Nutzer skaliert, aber für meine Eltern funktioniert es und es war für mich nur wenig Aufwand.
 
Nun, du kannst C und Pascal nicht vergleichen. Pascal ist viel weiter "nach oben" standardisiert, da sind soweit ich weiß auch GUI Sachen mit in der Standard Library, bei C eben nicht. Ein Ansatzpunkt für dich können etwa die man-Pages zu den header-files sein. Es gibt auch zu vielen, wenn nicht allen, Standardfunktionen man-Pages die dir deren Verwendung erklären. Das nützt dir nur wahrscheinlich nichts, wenn du die zusammenhänge nicht verstehst. Das Standardwerk von Kernighan und Ritchie kann ich dir nur empfehlen, aber die Empfehlung hast du bestimmt schon mal bekommen. Ich habe hier die deutsche Version von 1990 - da ist auch hinten eine Liste an Funktionen der Standardbibliothek drin. Wenn du mehr brauchst, musst du es dir selbst schreiben oder Frameworks benutzen.

Kannst Du mal aufs Buch sehen nach der ISBN NUmmer?
 
C ist praktisch nur eine Sprache. Der standardisierte Teil der Standard-Blibiothek ist sehr schlank und beschränkt sich per Design nur auf plattform- und architekturunabhängige Basisfunktionalität. Dinge wie das farbige Ausgeben von Buchstaben liegen damit gar nicht im Fokus, da dort mehrere unportable Dinge ins Spiel kommen. Es geht mit dem Zeichensatz und dessen Codierung los. ASCII, UTF-8, UTF-32 oder doch lieber Shift-JIS? Welches Terminal wird genutzt und auf welche Steuerzeichen reagiert es wie? Zur Abstraktion der Fähigkeiten des Terminal und der Steuerzeichen gibt es unter unixoiden Systemen zwei Systeme. Termcap und Terminfo, die die Anwendung nutzen kann. Natürlich führt es zur Frage, welches der beiden Systeme verfügbar ist. Und was passiert, wenn man kein unixoides System nutzt, stattdessen ein Windows oder ganz etwas anderes? Hinzu kommt, dass man die Cursor positionieren muss, was wiederum von der Größe des Terminals und einigen anderen Faktoren abhängig ist... Natürlich hatten schon andere Personen diese Probleme und sich Bibliotheken geschrieben, die sie lösen. Am Populärsten ist da sicher ncurses.

Was ich damit sagen will ist, dass man beim Programmieren in C nicht einfach eine Sprache lernen kann. Die Sprache selbst bringt einem so gut wie gar nichts. Man muss sich sehr tiefgehend mit der Plattform beschäftigen, auf der man entwickelt. Man kommt nicht umher viel Code selbst zu schreiben, oder sich Bibliotheken zu suchen und diese in das eigene Projekt einzubinden. Bei höheren Sprachen hingegen hat man oft eine deutlich umfassendere Bibliothek, durch die die zugrunde liegende Plattform abstrahiert wird. Das kann auf eher niedrigem Niveau geschehen, wie zum Beispiel bei C++. Java und C# liegen irgendwie im Mittelfeld. Die Kür ist Python, was praktisch zu allem ein Modul mitliefert.

Das finde ich sehr gut erklärt. So habe ich das noch nie erklärt bekommen.
 
Ich kann nicht programmieren, aber dazu fällt mir Pascal ein. Da gibts Procedure und man mit begin; und end; Blöcke schreiben und testen. Wie in BASIC mit gosub.
Das ist nicht ganz richtig. "BEGIN" und "END" umfassen einen Quelltextblock, während "GOSUB" zu einer Subroutine verzeigt, und nach dessen Abarbeitung zum Hauptprogramm zurückkehrt. Als Beispiel Modula2 und GWBasic (letzteres aus der Erinnerung):

Code:
MODULE Fakultaet;
FROM InOut IMPORT ReadCard, WriteLn, WriteString, WriteCard;

VAR Zaehler, Eingabe, Fakultaet: CARDINAL;

BEGIN  (*Beginn des Hauptprogramms*)
    WriteString("Brechnung der Fakultät. - Geben Sie eine Zahl ein: ");
    ReadCard(Eingabe);
    WriteLn;
    Fakultaet:=1;   (*Initialisieren*)
    FOR Zaehler:=1 TO Eingabe DO
    Fakultaet:=Fakultaet * Zaehler;
END;   (*Ende Hauptprogramm*)
    WriteCard(Fakultaet, 5);
End Fakultaet.

---------------------------------------------------------

10  PRINT "Berechnung der PS-Stärke"
20  PRINT "------------------------"
30  INPUT "Geben Sie die KW Ihres Motors ein: ", KW!      'Dezimalzahl
100 GOSUB 200
110 PRINT USING "###,.## " KW! "sind: " ###,.### " PS!    'Komma für Tausendertrenner
111 PRINT
112 END                'Verhindert die Wiederholung von GOSUB
200 PS! = KW! * 1.36   'Unterprogramm
201 RETURN             'Rücksprung

Und zum Erlernen, man arbeitet eine gute Anleitung, bei mir muß es was schriftliches sein, von der 1ten Seite an durch, und immer üben. Die Programmbeispiele immer per Hand eintippen, niemals(!) kopieren. Mit der Zeit merkt man schon, daß man in der Lage ist eigenständige Progrämmchen zu schreiben, und so weiter ...

Unter Linux habe ich zum Programmieren NEdit benutzt: http://sourceforge.net/projects/nedit/
 
Bezüglich des Editors muß ich korrigieren, ich benutzte unter Linux "jedit": http://www.jedit.org/

Ich habe mal eines von meinen alten Übungsprogrammen von QuickC auf den GCC übertragen - es macht etwas halbwegs vernünftiges, es berechnet einen angesparten Kapitalwert. Beispiel, Eltern beschließen von der Geburt ihres Kindes an jedes Jahr 1200,00 Euro einzuzahlen, zum 21. Geburtstag wird es ausgezahlt.

@logoft, auch wenn man das im Moment noch nicht versteht, aber es ist ein Beispielsziel mit Hilfe einer guten Einführung in C sich dahin vorzuarbeiten, daß man es versteht, und eigene Programme frei entwickeln kann. Es gibt keinen anderen Weg eine Programmiersprache zu lernen, jedenfalls kenne ich keine andere.

Den Quelltext kann man so wie er ist in einen Editor eingeben, nur "cls" muß unter ix ersetzt werden. Compileroption für den GCC: gcc -o kapitalwert kapitalwert.c -lm

Code:
//Berechnet ein angespartes Kapital nach n Jahren, für GCC 17. Dez 2015
//Für GCC Compileroptionen: gcc -o kapitalwert kapitalwert.c -lm (für math.h)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//Funktionsdeklaration
void endausgabe( double kapital, int zeit, double q );

void main( )
{
    double einzahlung, zinswert, zwischen_sum, q;
    int zeit, zaehler;
   
    system( "cls" );   //Bildschirm löschen - Nur für Windows
    printf("\n\tBerechnet zu welcher Endsumme sich eine gleichbleibende\n");
    printf("\n\t\tjaehrlich Kapitaleinzahlung summiert.\n\n");
    printf("Geben Sie die jaehrlich Einzahlung ein      : ");
    scanf("%lf", &einzahlung);
    printf("Geben Sie den Zinsfuss ein                  : ");
    scanf("%lf", &zinswert);
    printf("Geben Sie die Einzahlungsdauer (Jahre) ein  : ");
    scanf("%d", &zeit);
    printf("\n\n\n");

    //Zinsfaktor berechnen
    q = ( 1 + ( zinswert / 100 ));

    zaehler = 5;
    while ( zaehler < zeit )
    {
        //Zwischensummen alle 5 Jahre ausgeben
        zwischen_sum = ( einzahlung * (( pow( q, zaehler ) - 1 ) / ( q - 1 )));
        printf("Das Kapital belaeuft sich nach %2d Jahren auf: %10.2f Euro\n", zaehler, zwischen_sum);

        zaehler += 5;
        if ( zaehler == zeit )
            { break; }
    }
    endausgabe( einzahlung, zeit, q );
}

//Funktionsdefinition
//Endsumme ausgeben, auch wenn die Anzahl Jahre nicht durch 5 teilbar ist
void endausgabe( double kapital, int zeit, double q )
{
    double endkapital;
    endkapital = ( kapital * (( pow( q, zeit ) - 1 ) / ( q -1 )));
    printf("\n\nDas Endkapital betraegt nach %2d Jahren      : %10.2f Euro", zeit, endkapital);
}

Die Ausgabe sollte so aussehen:

Kapitalwert_2015-12-18_184902.jpg
 
Also ich habe mir C beigebracht, indem ich angefangen habe
die komplette Code-basis von einem FreeBSD (Zeile um Zeile)
zu studieren. FreeBSD oder auch die anderen BSD's bieten ein
fantastisches Kompendium an Beispielen zum autodidaktischen
erlernen von C.

--> https://svnweb.freebsd.org/base/releng/10.2/

Es empfiehlt sich bspw. ein bestimmtes Tool aus Unix-Toolbox,
bspw. cp(8), zu studieren.

Bzw. sich die Implementierung ausgewaehlter Bibliotheksroutinen
aus bereits erwaehnten Studienobjekt, bzgl. Implementierung, zu
untersuchen.

Ergaenzend sollte Advanced Programming in the UNIX Environment als
begleitende Referenz bzgl. Studium von gegebener Code-basis sein.

Zentraler Aspekt, fuer das autodidaktische Erlernen von C ist
das Verstehen der einem unixoidem System zugrundeliegenden
Konzepte (und Paradigmen) die hinreichend sind fuer das Darstellen
eines unixoiden Betriebssystem.

Ich muss eingestehen, dass dies eine sehr unorthodoxe bzw.
radikale Methode bzgl. Autodidaktik ist, aber der Aufwand
lohnt sich. :)
 
Ich bin kürzlich über einen Reddit-Thread mit Links zu Projekten gestolpert, die guten Code haben. Da werden unter anderem Standard Libraries und zum Beispiel djb's Code empfohlen. Ansonsten sitzt man ja auf einem BSD mit einer netten libc und vor allem vielen kleinen, praktischen Tools, die meist ganz gut programmiert sind.

Ja djb hat sehr eleganten Code geschrieben, aber der ist nicht zwangsläufig gutes Lehrmaterial für Einsteiger. Sein Code ist eher mit einem guten mathematischen Beweis zu vergleichen. Ja man kann daraus viel lernen, aber damit Einsteiger zu verschrecken ist nicht optimal. Guter Code ist ein Kompromiss. Sowohl in Funktion als auch in Form. Gerade bei der Form hat sich seit den 90ern viel geändert. Bildschirme können heute deutlich mehr darstellen under anderem längere Zeilen mit Platz für selbstdokumentierende Variablennamen. djb ist halt Mathemagier und als solcher ist es für ihn vermutlich einfacher seinen Code in UTF-8 zu speichern um mehr Symbole zu haben als leserfreundliche Variablennamen zu verwenden. Dazu kommt, dass ein Großteil seines Codes noch C89 kompatibel geschrieben ist und z.B. nicht die "richtigen" Typen aus stdint.h verwendet. Das heisst nicht, dass sein Code nicht in der Praxis deutlich zuverlässiger ist als 99% des C-Codes da draussen. Nur würde ein Neueinsteiger auch falsches bzw. sehr veraltetes aus dem Code lernen.

Sobald ein C Programmierer etwas gefestigt ist lohnt es sich sich libdjb oder libowfat (einen Fork unter GPL) genauer anzusehen. Besonders für API Design sind diese Libs ein gutes Beispiel.
 
Also ich habe mir C beigebracht, indem ich angefangen habe
die komplette Code-basis von einem FreeBSD (Zeile um Zeile)
zu studieren. FreeBSD oder auch die anderen BSD's bieten ein
fantastisches Kompendium an Beispielen zum autodidaktischen
erlernen von C.

--> https://svnweb.freebsd.org/base/releng/10.2/

Ein wenig schöner geht's damit: http://bxr.su/FreeBSD/

Und noch eine Installation, weil ich nicht weiß, ob erstere aktuell ist: http://nxr.netbsd.org/
 
Also ich habe mir C beigebracht, indem ich angefangen habe
die komplette Code-basis von einem FreeBSD (Zeile um Zeile)
zu studieren. FreeBSD oder auch die anderen BSD's bieten ein
fantastisches Kompendium an Beispielen zum autodidaktischen
erlernen von C.

--> https://svnweb.freebsd.org/base/releng/10.2/

Es empfiehlt sich bspw. ein bestimmtes Tool aus Unix-Toolbox,
bspw. cp(8), zu studieren.

Bzw. sich die Implementierung ausgewaehlter Bibliotheksroutinen
aus bereits erwaehnten Studienobjekt, bzgl. Implementierung, zu
untersuchen.

Ergaenzend sollte Advanced Programming in the UNIX Environment als
begleitende Referenz bzgl. Studium von gegebener Code-basis sein.

Zentraler Aspekt, fuer das autodidaktische Erlernen von C ist
das Verstehen der einem unixoidem System zugrundeliegenden
Konzepte (und Paradigmen) die hinreichend sind fuer das Darstellen
eines unixoiden Betriebssystem.

Ich muss eingestehen, dass dies eine sehr unorthodoxe bzw.
radikale Methode bzgl. Autodidaktik ist, aber der Aufwand
lohnt sich. :)


Mein Problem war/ist das ich nicht weißwie ich den Befehl finde. Da könnte ich mir noch so viele Beispiele ansehen, geholfen hat das nicht.

Wenn ich zum Beispiel ene Zuallszahl erstellend will, dann muß ich den Befehl finden damit ich die Datei laden kann - "#include datei.h". Das war und ist mein größtes Problem. Hier schrieb mir einer das man vieles selber schreiben muß. Aber sowas wie die Zufallszahl muß irgendwo definiert sein. Und das hat bisher noch niemand erklärt. "Lies Bücher" oder "Tutorials ansehen", ich entdeckte auch das Schlüsselwort Referenz um die lesen zu können.
Wenn ich das wüßte wie das geht, ein Befehl finden, dann wüßte ich wie das mit den 3000 anderen Befehlen ginge. Manche Leute schreiben Beispiele, ohne Erklärung. Sie erklären nicht wie sie den Befehl fanden.

mfg
 
Mein Problem war/ist das ich nicht weißwie ich den Befehl finde. Da könnte ich mir noch so viele Beispiele ansehen, geholfen hat das nicht.

Wenn ich zum Beispiel ene Zuallszahl erstellend will, dann muß ich den Befehl finden damit ich die Datei laden kann - "#include datei.h". Das war und ist mein größtes Problem.
mfg

Das liest sich so, als hättest Du noch nie etwas gelernt bzw. etwas Neues gelernt. Wo fängt man denn da an - bei Adam & Eva, und das gilt für jede Sache die man erlernen will.

Die Funktion die Du suchst heißt "rand()", dafür muß "stdlib.h" eingebunden werden. Und was hast Du jetzt davon? Ein Beispiel für "rand()" findet sich in Microsoft C Programmierhandbuch auf Seite 209ff, aber offenbar sind 3,-Euro zu viel.

Was das Finden von Befehlen etc. angeht, für einen Anfänger, daß wurde doch auch schon erwähnt: man geht so ein Buch Seite für Seite, Kapitel für Kapitel durch. So, und nur so, lernt man eine Programmiersprache, und damit auch die für diese relevanten Befehle, Funktionen usw.

Finde den Fehler:
Code:
#include <stdlib.h>

define GROESSE 12

void main()
{
    int zufalls-zahl[GROESSE];
    int i;

    for (i = 0; i < GROESSE; ++)
        { zufalls-zahl[i] = rand(); }

        . . .

}
 
So was einfaches, sollte ich normalerweise nicht beantworten. Es heißt noch immer 'i++' , egal wo und wer es schreibt. :p:grumble::p
 
Ich frag mich, ob überhaupt heute noch jemand Programmierer sein will.
So wie ich das sehe, wollen sie eher mit Youtube Geld verdienen.
Schon richtig... das merkt man auch an der Qualität mancher Youtube Videos... einfach reinprügeln ohne Sinn und Verstand...

strip_1878.jpg


Man müsste es der Jugend halt erst mal schmackhaft machen... bzw... nicht jeder der mit Computern arbeitet sollte das auch wirklich tun. Dieses "Jeder kann Programmieren" Initiative ist ja eh so ein nutzloses Hirngespinst der Regierung die meinte man müsste unbedingt den Markt mit schlechten oder mittelmässigen Programmierern Fluten weil wir ein Fachkräfte Mangel haben... dass das aber nicht unbedingt bei den Programmierern ist... darüber denken die erst nach wenn man ein Haufen hat die einfach keine Anstellung bekommen, sondern in niedriger bezahlten Jobs unterkommen müssen oder sogar umschulen.
 
Dieses "Jeder kann Programmieren" Initiative ist ja eh so ein nutzloses Hirngespinst der Regierung die meinte man müsste unbedingt den Markt mit schlechten oder mittelmässigen Programmierern Fluten weil wir ein Fachkräfte Mangel haben...
Das ist allzu kurzschlüssig gedacht. Es geht bei diesen Dingen nicht etwa um berufliche Bildung, sondern darum die Welt, und dazu gehört nun einmal auch technisches Wissen, zu verstehen. Im übrigen hat die Benutzung von Computern nichts mit Prorgammierung zu tun. Das ist ein Qualifikation wie jede andere auch, nämlich ein Werkzeug in einem bestimmten Zusammenhang angemessen zu verwenden. Und das kann dann eben auch Youtube sein. ;)
 
Das ist allzu kurzschlüssig gedacht. Es geht bei diesen Dingen nicht etwa um berufliche Bildung, sondern darum die Welt, und dazu gehört nun einmal auch technisches Wissen, zu verstehen. Im übrigen hat die Benutzung von Computern nichts mit Prorgammierung zu tun. Das ist ein Qualifikation wie jede andere auch, nämlich ein Werkzeug in einem bestimmten Zusammenhang angemessen zu verwenden. Und das kann dann eben auch Youtube sein. ;)

OT:
Naja, die Absicht ist die Masse an kreativen überwiegend weiblichen Potential in die Programmiererecke zu schubsen(und wenn es "nur" Webtechnologien sind), damit eine Quote auch die Chance der Machbarkeit bekommt, befürchte ich. Nur gibts nicht wenige die mit Mathematik oder besser Algorithmen auf Kriegsfuß stehen, weshalb wir uns lieber weiterhin belügen MINT und bspw. Frauen wären eine wahrnehmbare Größe und Programmieren für alle würde die Wahrscheinlichkeit eines neuen (deutschen) Zuse erhöhen.
Deutschland ist mMn fortschrittsfeindlich und braucht mehr Selektion der besten Köpfe statt alle auf ein geringeren Durchschnitt zu drücken.
 
Das liest sich so, als hättest Du noch nie etwas gelernt bzw. etwas Neues gelernt. Wo fängt man denn da an - bei Adam & Eva, und das gilt für jede Sache die man erlernen will.

Die Funktion die Du suchst heißt "rand()", dafür muß "stdlib.h" eingebunden werden. Und was hast Du jetzt davon? Ein Beispiel für "rand()" findet sich in Microsoft C Programmierhandbuch auf Seite 209ff, aber offenbar sind 3,-Euro zu viel.

Was das Finden von Befehlen etc. angeht, für einen Anfänger, daß wurde doch auch schon erwähnt: man geht so ein Buch Seite für Seite, Kapitel für Kapitel durch. So, und nur so, lernt man eine Programmiersprache, und damit auch die für diese relevanten Befehle, Funktionen usw.

Finde den Fehler:
Code:
#include <stdlib.h>

define GROESSE 12

void main()
{
    int zufalls-zahl[GROESSE];
    int i;

    for (i = 0; i < GROESSE; ++)
        { zufalls-zahl[i] = rand(); }

        . . .

}


Und genau das ist das Beispiel wie es immer ablaeuft, einer sagt die Loesung und bringt ein Beispiel. Nur wie er die L;sung gefunden hat sagt er nie. Nur das hilft mir nie. Bei dem naechsten stehe ich genauso da. Ich kann doch nicht 5 Buecher lesen bis ich vielleicht die Loesung finde. Irgendwie musst Du wissen wie Du den Befehl findest,Du musst wissen wie Du das Wort findest, das richtige. Wie geht das?
 
Zurück
Oben