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

Gast #4347744
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
#4347754
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ö.
Gast #4347794
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.
Gast #4347804
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…
Moderator #4348041
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 ;-)
#4348048
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.
#4348275
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.
Angehängte Dateien:
#4348556
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 :)
#4348637
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.
#4349091
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]
#4352554
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.
#4353078
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! ;-)
#6277040
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren