So, ich will anfangen C zu lernen, oder zumindest die Grundzüge.
Hab mir dazu ein Buch gekauft(Programmieren in C).
Einer der ersten Programme ist Wörter zählen:
Es schaut so aus.:
#include <stdio.h>
#define IN 1
#define OUT 0
main()
{
int c, nl, nw, nc, state;
state = OUT;
nl = nw = nc = 0;
while ((c = getchar()) != EOF) {
++nc;
if (c == '\n')
++nl;
if (c == ' ' || c == '\n' || c == '\t')
state = OUT;
else if (state == OUT) {
state = IN;
++nw;
}
}
printf(" %d %d %d\n", nl, nw, nc);
}
Das Programm soll Zeichen, Wörter und Zeichen zählen.
Ich hab Linux 9.0 Pro, . Ich habe es auf der Entwicklungsumgebung
K-Develop geschrieben. Das Ausführen hat auch wunderbar geklappt, ohne Fehlermeldung. Es kommt dann die Konsole(Bash),
ich geb voller Erwartung irgendwas ein, drück enter, bekomme aber keine Ausgabe. Ich seh nur meinen eben geschriebenen Text vor mir. Im Buch steht, ohne Eingabe sollte die Ausgabe 0 0 0 sein(keine Zeilentrenner, keine Wörter, keine Zeichen). Vor mir seh ich aber nur eine leere Konsole, weiter nichts. Kann ja schwer ohne Ausgabe üben. Das ganze Zeichen, Zeilen zählen klappt nicht, als ob nichts währ.
Die Zeicheneingabe und Ausgabe fängt im Buch mit einem Dateien kopieren Beispiel an.
main()
{
int c;
while((c = getchar()) != EOF)
putchar(c);
}
Dieses putchar hat noch schön geklappt, hab von meinem geschriebenen blaba die selbe Ausgabe wieder bekommen, das andere (Zeichen zählen, usw.) klappt aber leider, bzw. passiert nichts.
Auch wenns erst am Beginn ist, hab noch eine Erklärungsfrage an sich zum Beispiel:
In dem Beispiel hat diese while Schleife eine else Anweisung.
Ich versteh nicht warum in der Klammer zu else if(state == OUT)
steht. ich les es so: jedes Zeichen wird gezählt, solang es nicht das Ende von der Zeichenkette ist.(in der while, die bedingung)
in der 2ten if ( solange das Zeichen ein Tabulatorzeichen ist, wird es gezählt), Stimmt so weit meine Folgerung?
in der 3ten if, lese ich: Stimmt die Bedingung das das Zeichen eine Leertaste ist, bekommt es die Variable state der der Wert OUT zugewiesen wird, OUT ist 0;
hoff das stimmt so, das nächste versteh ich nicht:
trifft das nicht zu, dann hat es den Wert IN -> 1,
Warum heisst die Bedingung (state == OUT) Komm da nicht dahinter. Wenn das Zeichen ein Leerzeichen( oder die anderen 2) ist, ist es OUT; Wenn das nicht gegeben ist, kommts zur else.
Ist das aber nicht gegeben, wie kann dann state OUT als Bedingung haben!! müsste es nicht IN als Bedingung haben.
Sehr verwirrend. Wie kann ich es mit OUT überhaupt vergleichen, das Programm kann doch nicht erkennen ob es OUT ist...
in der 2ten if Anweisung, wirds nach der hier für mich eindeutigen Bedingung OUT zugewiesen. Kommt die 2te if Rechnung nicht zustande da keine Leertaste, also zur else, hat ja auch keine Zuweisung zu OUT stattgefunden, wie kann es in der dritten if es dann als Bedingung haben??
Am Beginn sind alle int Werte zwar 0 initialisiert worden, also sowieso OUT, trotzdem. da steht ja in der 3ten if, falls es OUT ist,
wird es zu IN zugwiesen, hat 1, und wird gezählt. Beim nächsten Lauf, kanns ja nicht mehr gezählt werden, das als IN ja nicht mehr in die Bedingung OUT fällt).
:roll:
Hoff es macht nicht all zu viele Umstände, dass ein derart einfaches Anfangsbeispiel mir schon Probleme und Fragen aufwirft.
Hab mir dazu ein Buch gekauft(Programmieren in C).
Einer der ersten Programme ist Wörter zählen:
Es schaut so aus.:
#include <stdio.h>
#define IN 1
#define OUT 0
main()
{
int c, nl, nw, nc, state;
state = OUT;
nl = nw = nc = 0;
while ((c = getchar()) != EOF) {
++nc;
if (c == '\n')
++nl;
if (c == ' ' || c == '\n' || c == '\t')
state = OUT;
else if (state == OUT) {
state = IN;
++nw;
}
}
printf(" %d %d %d\n", nl, nw, nc);
}
Das Programm soll Zeichen, Wörter und Zeichen zählen.
Ich hab Linux 9.0 Pro, . Ich habe es auf der Entwicklungsumgebung
K-Develop geschrieben. Das Ausführen hat auch wunderbar geklappt, ohne Fehlermeldung. Es kommt dann die Konsole(Bash),
ich geb voller Erwartung irgendwas ein, drück enter, bekomme aber keine Ausgabe. Ich seh nur meinen eben geschriebenen Text vor mir. Im Buch steht, ohne Eingabe sollte die Ausgabe 0 0 0 sein(keine Zeilentrenner, keine Wörter, keine Zeichen). Vor mir seh ich aber nur eine leere Konsole, weiter nichts. Kann ja schwer ohne Ausgabe üben. Das ganze Zeichen, Zeilen zählen klappt nicht, als ob nichts währ.
Die Zeicheneingabe und Ausgabe fängt im Buch mit einem Dateien kopieren Beispiel an.
main()
{
int c;
while((c = getchar()) != EOF)
putchar(c);
}
Dieses putchar hat noch schön geklappt, hab von meinem geschriebenen blaba die selbe Ausgabe wieder bekommen, das andere (Zeichen zählen, usw.) klappt aber leider, bzw. passiert nichts.
Auch wenns erst am Beginn ist, hab noch eine Erklärungsfrage an sich zum Beispiel:
In dem Beispiel hat diese while Schleife eine else Anweisung.
Ich versteh nicht warum in der Klammer zu else if(state == OUT)
steht. ich les es so: jedes Zeichen wird gezählt, solang es nicht das Ende von der Zeichenkette ist.(in der while, die bedingung)
in der 2ten if ( solange das Zeichen ein Tabulatorzeichen ist, wird es gezählt), Stimmt so weit meine Folgerung?
in der 3ten if, lese ich: Stimmt die Bedingung das das Zeichen eine Leertaste ist, bekommt es die Variable state der der Wert OUT zugewiesen wird, OUT ist 0;
hoff das stimmt so, das nächste versteh ich nicht:
trifft das nicht zu, dann hat es den Wert IN -> 1,
Warum heisst die Bedingung (state == OUT) Komm da nicht dahinter. Wenn das Zeichen ein Leerzeichen( oder die anderen 2) ist, ist es OUT; Wenn das nicht gegeben ist, kommts zur else.
Ist das aber nicht gegeben, wie kann dann state OUT als Bedingung haben!! müsste es nicht IN als Bedingung haben.
Sehr verwirrend. Wie kann ich es mit OUT überhaupt vergleichen, das Programm kann doch nicht erkennen ob es OUT ist...
in der 2ten if Anweisung, wirds nach der hier für mich eindeutigen Bedingung OUT zugewiesen. Kommt die 2te if Rechnung nicht zustande da keine Leertaste, also zur else, hat ja auch keine Zuweisung zu OUT stattgefunden, wie kann es in der dritten if es dann als Bedingung haben??
Am Beginn sind alle int Werte zwar 0 initialisiert worden, also sowieso OUT, trotzdem. da steht ja in der 3ten if, falls es OUT ist,
wird es zu IN zugwiesen, hat 1, und wird gezählt. Beim nächsten Lauf, kanns ja nicht mehr gezählt werden, das als IN ja nicht mehr in die Bedingung OUT fällt).
:roll:
Hoff es macht nicht all zu viele Umstände, dass ein derart einfaches Anfangsbeispiel mir schon Probleme und Fragen aufwirft.