Zeichen, Wörter, Buchstaben, Sätze und Zeilensprung aufzählen

Gast #4347744
Hey Leute,

bin jetzt im ersten Semester und studiere Informatik.
Ich muss ein Programm entwickeln, welches in der Lage ist
Zeichen, Wörter, Buchstaben, Sätze und Zeilensprünge aufzuzählen.

Hab jetzt einige Ansätze gefunden aber komme trotzdem nicht voran,
da ich noch nicht ganz mit den Befehlen vertraut bin.
Wäre vielleicht jemand in der Lage bzw. so lieb und könnte solch ein 
Programm kurz programmieren und vielleicht die einzelne Schritte 
erklären?

Ich weis das es viel mühe kostet aber es würde mir sehr viel weiter 
helfen.

Mfg

Max
Max schrieb:
> bin jetzt im ersten Semester und studiere Informatik.
> Ich muss ein Programm entwickeln, welches in der Lage ist
> Zeichen, Wörter, Buchstaben, Sätze und Zeilensprünge aufzuzählen.
>
> Hab jetzt einige Ansätze gefunden aber komme trotzdem nicht voran,
> da ich noch nicht ganz mit den Befehlen vertraut bin.
> Wäre vielleicht jemand in der Lage bzw. so lieb und könnte solch ein
> Programm kurz programmieren und vielleicht die einzelne Schritte
> erklären?
>
> Ich weis das es viel mühe kostet aber es würde mir sehr viel weiter
> helfen.

Entschuldige, aber ich fürchte, Du hast da etwas mißverstanden. Ein 
Forum wie dieses ist nicht dazu da, Deine Anfänger-Hausaufgaben zu 
machen.

Natürlich würden 99% der Forennutzer so ein Programm in weniger als zwei 
Minuten schreiben. Aber dabei würdest Du nichts lernen, und genau das 
ist doch der Sinn eines Studiums im Allgemeinen, und einer solchen 
Aufgabe im Besonderen, nicht wahr? Und für uns wäre so ein Programm 
nicht einmal im Ansatz herausfordernd und interessant genug, unsere 
kostbare Lebens- und Freizeit darauf zu verschwenden.

Mach' etwas Revolutionäres, schockier' Deine Eltern, und lies ein Buch! 
Für die Programmiersprache C gibt sehr gute Bücher wie zum Beispiel das 
Standardwerk "The C Programming Language" von Brian W. Kerninghan und 
Dennis M. Ritchie. Ansonsten findest Du im Internet gute Tutorials zur 
Programmiersprache C (das auf dieser Seite hier ist nicht gut geeignet, 
weil es sich auf die Besonderheiten von Mikrocontrollern konzentriert).

Bevor aber jetzt jene Leute kommen, die Dir das viel weniger freundlich 
erklären, weil sie sich das, was Du hier abgreifen willst, sehr hart und 
aufwändig erarbeitet haben, möchte ich Dir trotzdem dieses eine Mal kurz 
auf die Sprünge helfen.



Zuerst mußt Du jeweils eine Variable für jeden Sachverhalt deklarieren, 
den Du zählen möchtest. Dann mußt Du Deine Variablen mit dem Wert 0 
vorbelegen; sowas kann C in einem Schritt. Dann mußt Du lernen, wie man 
eine Datei zum Lesen öffnet, und wie man die Datei zeichenweise liest.

Danach liest Du die Datei Zeichen für Zeichen, und schaust bei jedem 
Zeichen, was für ein Zeichen das ist: wenn es ein Buchstabe ist, zählst 
Du Deine Variable für Buchstaben um eins hoch, wenn es ein Leerzeichen 
ist, Deine Variable für Wörter, und wenn es ein Zeilenumbruch ist, dann 
die Variable für Zeilenumbrüche.

Außerdem mußt Du herausfinden, wie Du erkennst, daß Du das Ende Deiner 
Datei erreicht hast. Dann mußt Du nämlich Deine Datei schließen und die 
Zählerstände Deiner Variablen ausgeben.



Wenn Du einen Code entwickelt hast, dem man ansehen kann, daß Du Dir ein 
wenig Mühe gegeben hast, dann können wir uns Deinen Code vielleicht mal 
anschauen und Dir erklären, wie Du ihn verbessern kannst. Aber so? Nö.
Gast
So etwas mußte ich auch im ersten Semester schreiben. Lange ist es her, 
war damals noch eine andere Programmiersprache.

Aber von einem Informatikstudenten erwarte ich, dass er diese Aufgabe 
selbstständig lösen kann.
Das ist doch gerade Sinn des Studiums, dass man sich Lösungen und Wege 
ausdenkt, probiert und so lange prokelt, bis es geht.
Auch muss ein Informatiker sich andauernd in neue Programmiersprachen 
eindenken, Handbücher und APIs lesen und diese anwenden.

Wenn jemand schon im ersten Semenster damit überfordert ist: die 
Baubranche sucht händeringend nach Maurern oder Heizungsmonteuren.
Gast
Sheeva P. schrieb:

> Danach liest Du die Datei Zeichen für Zeichen, und schaust bei jedem
> Zeichen, was für ein Zeichen das ist: wenn es ein Buchstabe ist, zählst
> Du Deine Variable für Buchstaben um eins hoch, wenn es ein Leerzeichen
> ist, Deine Variable für Wörter,

aufpassen bei mehreren aufeinanderfolgenden leerzeichen und/oder tabs ;)
außerdem könnte man noch schauen, ob das letze zeichen einer zeile ein 
"-" (bindestrich, aber aufpassen - und – sind evtl möglich) ist, ob das 
zeichen vor dem "-" ein buchstabe ist, und ob im der folgezeile das 
erste zeichen ein kleiner buchstabe ist… gnaaaaarf…
Moderator
Max schrieb:
> Ich muss ein Programm entwickeln, welches in der Lage ist Zeichen,
> Wörter, Buchstaben, Sätze

Auch hier aufpassen: Es genügt nicht, einfach nur die Punkte zu zählen.
Ein Punkt kann zwar ein Indikator für ein Satzende sein, wird aber auch
in Abkürzungen, in Ordnungszahlen, in Uhrzeiten, in der Nummerierung von
Überschriften, als Auslassungpunkte, als Tausendertrennzeichen, als
Dezimaltrennzeichen (in englischen Texten), in IP-Adressen  u.v.m.
verwendet. Die Unterscheidung dieser Fälle, insbesondere der Abkürzungen
ist nicht ganz trivial ;-)
Max schrieb:
> Hey Leute,
>
> bin jetzt im ersten Semester und studiere Informatik.
> Ich muss ein Programm entwickeln, welches [...]
>
> Wäre vielleicht jemand in der Lage bzw. so lieb und könnte solch ein
> Programm kurz programmieren [...]

Du hast vergessen: "Für den besten Mikrocontroller der Welt. Welcher ist 
das? Ich habe gehört, PIC soll sehr gut sein."

Nimm Dir ein Beispiel an dem hier:

Beitrag "Zu kompliziertes Deutsch erschwert die Kommunikation"

Der hat das richtig gemacht.
Wow, schon zwei "Dislikes". Sollte irgendwann wirklich ein C-Quelltext, 
der nach einem Erstsemester aussieht und irgendetwas in Richtung der 
Aufgabenstellung macht, vom TO geliefert werden, leiste ich Abbitte. 
Vorher halte ich mich für im Recht.
Dies ist eine wirklich interessante Aufgabenstellung. Viel Erfolg bei 
deinem Programm.

Diese Aufgabe lässt sich auf Unendlich viele Arten lösen, ich konnte 
nicht wiederstehen es selbst mal zu versuchen, das Resultat ist im 
Anhang, aber es wird dir nichts nützen, da ich mit der Abstraktion 
masslos übertrieben habe.
Angehängte Dateien:
Gast
Oye die Parser Datei sieht ja mal extrem aus. :/

So Leute ich habe jetzt mal einen kleinen Anfang gewagt und weis jetzt 
nur nicht, wie ich den eingegeben Text in die Schleife rein bekomme.

Wäre lieb wenn mir jemand ein Tipp geben könnte.
Angehängte Dateien:
Sheeva P. schrieb:
> Mach' etwas Revolutionäres, schockier' Deine Eltern, und lies ein Buch!
> Für die Programmiersprache C gibt sehr gute Bücher wie zum Beispiel das
> Standardwerk "The C Programming Language" von Brian W. Kerninghan und
> Dennis M. Ritchie. Ansonsten findest Du im Internet gute Tutorials zur
> Programmiersprache C (das auf dieser Seite hier ist nicht gut geeignet,
> weil es sich auf die Besonderheiten von Mikrocontrollern konzentriert).
>
> Bevor aber jetzt jene Leute kommen, die Dir das viel weniger freundlich
> erklären, weil sie sich das, was Du hier abgreifen willst, sehr hart und
> aufwändig erarbeitet haben, möchte ich Dir trotzdem dieses eine Mal kurz
> auf die Sprünge helfen.

Sheeva, es ist sehr selten, dass ich Menschen spontan sympathisch finde, 
aber mit dieser Antwort hast du ein ganz großes Goulasch bei mir 
verdient :)
Denis Schmidt schrieb:
> Dein Informatikprof mag scheinbar den K&R. Hol dir das Buch und schau
> die ersten 10-20 Seiten an. Da wird exakt das behandelt.

Nun sind aber Profs, die auf K&R stehen oder keinen Bock auf funktionale 
Programmierung haben, einfach Profs, die sich ihren Arsch dank ihrer 
Ernennung vergolden lassen, statt nicht nur die Antike zu lehren, 
sondern auch Neues zu erforschen und zu vermitteln. Da sollte man als 
Studi auch mal die Klappe aufreißen.
Ich habe mir deinen Code angesehen, und mir ist folgendes Aufgefallen:

1) Du nutzt die Funktion gets, diese Funktion ist veraltet und 
garantiert dir eine Sicherheitslücke in deinem Programm, denn gets kann 
benutzt werden um mehr Zeichen in einen Buffer zu schreiben, als in 
diesem Platz haben. Durch einen derartigen Bufferoverflow kann dann 
beliebiger Code ausgeführt werden, oder das Programm abstürtzen. Nutze 
statdessen fgets, also statt gets(text) einfach 
fgets(text,sizeof(text),stdin)

2) Deine for schleifen sind nicht sinnvoll, deshalb zeige ich eine 
kleine Übersicht über die wichtigsten Programmkonstrukte mit Erklärung:
1
// Hier wird ein Ausdruck per Semikolon abgeschlossen 
2
ausdruck; // also irgendetwas wie "f();" oder "a=((b=a),3);" oder ";", etc
3

4
// Ein Blockscope, in welchem eine Variable x definiert wird und mehrere Ausdrücke vorhanden sind, z.B. x auf 1 setzen. Blockscopes können überal dort eingesetzt werden, wo ein Ausdruck eingesetzt werden kann und umgekehrt.
5
{
6
  int x; // definition
7
  x = 1; // Ausdruck, setzen von x auf 1
8
  x++; // Incrementieren von x
9
}
10

11
// If bedingung
12
if( ausdruck ) // If Anweisung und ausdruck als Bedingung 
13
  ausdruck // Erster Ausdruck gehört zur Schleife
14
ausdruck // dieser nichtmehr
15

16
// Beispiel:
17
  if( 0 ) // Bedingung
18
    printf("Not printed\n"); // Anweisung zur vorherigen Bedingung, welche aber immer unwahr ist
19
  if( 1 ) // Bedingung ist 1, also wahr
20
    if( 2 ) // If Anweisung der zum vorherigen if gehört, dessen Bedingung immer war ist. Bedingung 2 ist immer wahr 
21
    { // Blockscope, der zum vorherigen if gehört
22
      printf("a\n"); // erste Anweisung in Blockscope, wird ausgeführt
23
      printf("b\n"); // zweite Anweisung in Blockscope, wird auch ausgeführt
24
    }
25
  printf("test\n"); // gehört zu keiner der vorherigen Bedingungen, wird ausgeführt
26

27

28
// Schleifen
29

30
// while Schleife //
31
while( anweisung ) // Wenn das Resultat der Anweisung, also die Abbruchbedingung, wahr ist, wird die Schleif durchlaufen. Danach wird die Bedingung erneut Ausgewertet und alles wiederholt sich.
32
  anweisung // Diese Anweisung wird bei jedem Schleifendurchlauf ausgeführt
33

34

35
// do while Schleife //
36
do anweisung // Anweisung, die bei jedem schleifendurchlauf ausgeführt wird
37
while( anweisung ) // Schleifenkopf mit Bedingung, wird beim ersten Schleifendurchlauf noch nicht geprüft
38

39
// for schleife //
40
for( // schleifenkopf, hat einen eigenen Scope (=gültigkeitsbereich für Veriablen)
41
  anweisung; // Wird vor dem ersten Schleifendurchlauf ausgeführt, eine definition ist auch erlaubt
42
  anweisung; // Abbruchbedingung, wie bei while
43
  anweisung // Wird nach jedem schleifendurchlauf ausgeführt
44
) anweisung // Wird bei jedem schleifendurchlauf ausgeführt
45

46

47
// Eine for Schleife kann immer auch als while schleife geschriegen werden, und umgekehrt:
48

49
for(int i=0;i<10;i++)
50
  printf("%d\n",i);
51
// Ist equivalent zu:
52
{
53
  int i=0;
54
  while(i<10){
55
    printf("%d\n",i);
56
    i++
57
  }
58
}
59

60
//////////
61

62
while(1)
63
// Ist equivalent zu
64
for(;;)
65
  printf("y\n");
66
// Ist equivalent zu
67
label_bla:
68
 printf("y\n");
69
 goto bla; // (goto hat leider einen schlechten ruf)
70

71
///////////
72

73
// Trivia:
74
// Schleifen können mit "break" abgebrochen werden, und mit "continue" wird zur Schleifenbedingung gesprungen.
75

76

77
// Funktionsaufruf:
78
funktion_oder_funktionspointer(argument1,argument2,...)
79
// Beispiel:
80
printf("%d\n",1)

Damit du die Aufgabe bewältigen kannst, musst du dich folgendes Fragen:
 1) Welche schritte müssen in welcher Reihenfolge passieren. Das hast du 
bereits sehr gut gemacht. (mal abgesehen von der Position der printf 
angaben)
 2) Du hast einige Schleifen erstellt, in denen du eine Variable zuerst 
auf 0 setzt und dann hochzählst. Aber in der Bedingung steht z.B. eine 
Regel die prüft ob es ein Buchstabe ist. Daraus resultieren folgende 
Fragen:
  2.1) Worauf muss diese Bedingung angewendet werden?
  2.2) Welche Programmstruktur ist für eine einfache Bedingung gedacht?
  2.3) Angenommen, es muss für jedes Zeichen in der Zeichenkette sein, 
womit kann die Programmstruktur mit der Bedingung wiederholt werden und 
wo muss diese dann stehen?
  2.4) Wie oft muss die Schleife durchlaufen werden, was wird in der 
Schleife gebraucht? (gibt hier mindestens 2 mögliche Antworten)
 3) Wo kommt die Ausgabe hin?

Du benötigst vermutlich noch folgendes:
 * Ermitteln der Stringlänge: strlen
   -> http://www.cplusplus.com/reference/cstring/strlen/
 * Der Operator [] (subscript operator), gibt das n-te Element zurück 
wird folgendermassen angewendet: arrayOrPointer[index]
Noch eine kurze Anmerkung zur Lesbarkeitsverbesserung:
1
int r; //Zeichen    
2
int b; //Buchstaben
3
int w; //Wörter
4
int s; //Sätze
5
int z; //Zeilen

Spar dir die Kommentare und nenne die Variablen einfach entsprechend. 
Die Namen dürfen auch mehr als ein Zeichen lang sein.
Yalu X. schrieb:
> Max schrieb:
>> Ich muss ein Programm entwickeln, welches in der Lage ist Zeichen,
>> Wörter, Buchstaben, Sätze
>
> Auch hier aufpassen: Es genügt nicht, einfach nur die Punkte zu zählen.
> Ein Punkt kann zwar ein Indikator für ein Satzende sein, wird aber auch
> in Abkürzungen, in Ordnungszahlen, in Uhrzeiten, in der Nummerierung von
> Überschriften, als Auslassungpunkte, als Tausendertrennzeichen, als
> Dezimaltrennzeichen (in englischen Texten), in IP-Adressen  u.v.m.
> verwendet. Die Unterscheidung dieser Fälle, insbesondere der Abkürzungen
> ist nicht ganz trivial ;-)

Das ist wirklich nicht trivial. Zu sehen an den M$-Korrektur programmen.
Man verwendet einen Punkt zum Abkürzen, schreibt weiter und plötzlich 
wird aus dem kleinen Anfangsbuchstaben des folgenden Wortes ein 
Großbuchstaben, weil M$ denkt, es wäre ein neuer satz.
Gast
Konrad S. schrieb:
> allerdings geht es dann dabei nicht um das Zählen der
> Sätze.

Wenn du als freier Schriftsteller oder Übersetzer tätig bist und nach 
Sätzen bezahlt wirst, bist du für jeden Punkt dankbar...

Nebenbei, ist "Boah Ey Alter" auch ein Satz?

Georg
c.m. schrieb:
> aufpassen bei mehreren aufeinanderfolgenden leerzeichen und/oder tabs ;)
> außerdem könnte man noch schauen, ob das letze zeichen einer zeile ein
> "-" (bindestrich, aber aufpassen - und – sind evtl möglich) ist, ob das
> zeichen vor dem "-" ein buchstabe ist, und ob im der folgezeile das
> erste zeichen ein kleiner buchstabe ist… gnaaaaarf…

YMMD! ;-)
Nein, boah ey alter ist kein Satz, da fehlt das Verb.

So, und jetzt für unseren Padawan mal ein paar hinter die Ohren:

Was in Büchern steht, ist dazu da, dass du es lernst und dann selber 
denkst. Das Zeug, was du liest, war mal zeitgemäß, als Compiler noch 
Bezeichner in den Code gepackt haben. Heute kannst du

foreach (var p in sps)

auch als

foreach (var theCurrentSuspiciousPerson in suspiciousPersons)

schreiben.

Vor langer Zeit mal war ''literarisches Coden'' angesagt. Da bestand der 
Code aus 10x so viel Kommentar wie aus ausführbarem Code. Such dir eine 
Programmiersprache, in der du dich austoben kannst. Bei mir ist es C#, 
da heißt eine Variable auch mal 
entityFoundIsASingletonAndCannotBeCloned.

Ob du dich jetzt z.B. an die Regel hältst, dass Wahr/Falsch-Variablen 
(egal ob bool in höhren oder int/byte in C) von der Aussage beim Lesen 
wahr sein müssen oder du die Invertierungen bei Ifs vermeiden willst, 
ist dein Stil.

Aber! Du solltest viel viel viel programmieren. Deinen eigenen Stil 
entwickeln und vor allem alten Code von dir selbst (!) lesen. Wenn du da 
ewig rein grübeln oder nochmal zigmal die Tests laufen lassen musst, ist 
er: NICHTGUT GARNICHTGUT NEUMACHEN!

Guter Code braucht keine Kommentare, außer es sind hardware-spezifische 
Dinge, sehr spezielle Kundenwünsche oder solcher Code, der um bekannte 
Fehler herum steuert.

Sowas wie int a, cl, dx, foo, mymother = 0; will ich in Code nie wieder 
sehen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.