• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

C Übung

Klee

Newbie
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.
 
A

Anonymous

Gast
Ich habe mir dein Posting jetzt minimum 5 Mal durchgelesen, ich verstehe immer noch nicht recht, wo du ein Problem hast, das Progmm funktioniert einwandfrei. (bei mir heist es im compilierten Zustand zahltest)
Code:
rob@dhcppc1:~/test> ls | ./zahltest
 51 50 407
rob@dhcppc1:~/test> ls | wc
     51      50     407
rob@dhcppc1:~/test>

Ich nehme an , du hast nur ein Problem Dein Programm richtig aufzurufen.
mach mal ZB
Code:
cat Textdatei | ./my_program

robi
 

}-Tux-{

Hacker
Klee schrieb:
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);
}

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??
.
du musst das Programm wie folgt anwenden
cat text.datei | ./dasprog


while ((c = getchar()) != EOF) {
++nc;
if (c == '\n')
++nl;
if (c == ' ' || c == '\n' || c == '\t')
state = OUT;

else if (state == OUT) {
state = IN;
++nw;
}

Die Variable "state" schaut ob das Programm gerade ein Wort oder ein Leerzeichen, Neuzeilezeichen usw. liest.
Wenn nun das Programm z.B. Leerzeichen liest, schreibt man state = OUT, da man sich nicht in einem wort befindet. Wenn das Programm wieder am anfang eines neuen Wortes steht, ist die bedingung
if (c == ' ' || c == '\n' || c == '\t')
falsch da "c" ja ein Zeichen enthält und _kein_ leerzeichen, neuzeile oder tabulatorzeichen. Es wird die else anweisung ausgeführt.
Nun weißt man der Variablen state die Konstante IN wieder zu, da man sich ja wieder IN einem Wort befindet. Ich hoffe ich konnte dir ein wenig weiterhelfen (falls ich dein posting richtig verstanden habe)

mfg }-Tux-{
 

TeXpert

Guru
Du kannst das Tool natürlich auch ohne Pipe aufrufen, aber da Du auf das EOF-Signal wartest, musst Du natürlich auch eins senden


$ ./count
Hallo Klee, Du siehst, es geht! 0 6 31

dabei rufe ich das Programm auf, anschließend erwartet das Programm Eingaben (hier in rot) nach einem EOF-Signal (Strg-D drücken) beendet sich das Tool auch wunderbar...
 
Oben