Forum: PC-Programmierung Zeichen, Wörter, Buchstaben, Sätze und Zeilensprung aufzählen


von Max (Gast)


Lesenswert?

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

von Max (Gast)


Lesenswert?

Ach ja
Ich sollte vielleicht noch hinzufügen, dass es mit C programmiert werden 
muss.

von Sheeva P. (sheevaplug)


Lesenswert?

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ö.

: Bearbeitet durch User
von PittyJ (Gast)


Lesenswert?

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.

von c.m. (Gast)


Lesenswert?

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…

von Yalu X. (yalu) (Moderator)


Lesenswert?

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 ;-)

von Walter T. (nicolas)


Lesenswert?

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.

: Bearbeitet durch User
von Max (Gast)


Lesenswert?

Vielen Dank erstmal an alle. =)

Ich werde jetzt versuchen das Programm fertig zu schreiben und es dann 
hinterher hochladen.

Danke nochmals.

von Walter T. (nicolas)


Lesenswert?

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.

von Daniel A. (daniel-a)


Angehängte Dateien:

Lesenswert?

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.

von Max (Gast)


Angehängte Dateien:

Lesenswert?

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.

von J. T. (chaoskind)


Lesenswert?


von DirkB (Gast)


Lesenswert?

Die Funktionen aus ctype.h sind dein Freund:
http://www.cplusplus.com/reference/cctype/

Was sollen die Schleifen in deinem Programm machen?

von Carsten P. (r2pi)


Lesenswert?

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 :)

von Denis Schmidt (Gast)


Lesenswert?

Dein Informatikprof mag scheinbar den K&R. Hol dir das Buch und schau 
die ersten 10-20 Seiten an. Da wird exakt das behandelt.

von Carsten P. (r2pi)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

Vielen Dank Leute für eure Unterstützung. =)

von Daniel A. (daniel-a)


Lesenswert?

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]

von Walter T. (nicolas)


Lesenswert?

Max schrieb:
> So Leute ich habe jetzt mal einen kleinen Anfang gewagt

OK, ich habe mich getäuscht. Es ist tatsächlich nur ein verpeilter 
Erstsemester, kein Troll. Nichts für ungut. Wir alle haben mal klein 
angefangen.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Stefan Salewski (Gast)


Lesenswert?


von Der Andere (Gast)


Lesenswert?

Carsten P. schrieb:
> ie auf K&R stehen oder keinen Bock auf funktionale
> Programmierung haben

Es muss nicht jeder diesen akademischen Furz machen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Carsten P. schrieb:
> Da sollte man als Studi auch mal die Klappe aufreißen.

Dann mach mal.

Nichts, was im K&R steht (sofern wir hier von der zweiten Ausgabe 
sprechen) ist durch nachfolgende C-Standards effektiv falsch oder 
überholt.

Es gibt jetzt nur auch noch andere Möglichkeiten, Dinge zu tun.

von J. W. (nuernberger)


Lesenswert?

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.

von Konrad S. (maybee)


Lesenswert?

J. W. schrieb:
> Das ist wirklich nicht trivial.

So ist es. Es gibt nicht viel Software am Markt, die Satzsegmentierung 
gut beherrscht - allerdings geht es dann dabei nicht um das Zählen der 
Sätze.

von Georg (Gast)


Lesenswert?

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

von Sheeva P. (sheevaplug)


Lesenswert?

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! ;-)

von Konrad S. (maybee)


Lesenswert?

Georg schrieb:
> Nebenbei, ist "Boah Ey Alter" auch ein Satz?

"Technisch" betrachtet: ja. Aber da fehlt nicht nur am Ende ein 
Satzzeichen. ;-)

von Carsten P. (r2pi)


Lesenswert?

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.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Carsten P. schrieb:
> Nein, boah ey alter ist kein Satz, da fehlt das Verb.

Wow, und du hast viereinhalb Jahre gebraucht, um das festzustellen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.