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ö.
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.
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…
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.
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.
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
intx;// 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
doanweisung// 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(inti=0;i<10;i++)
50
printf("%d\n",i);
51
// Ist equivalent zu:
52
{
53
inti=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
gotobla;// (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.
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]
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.
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.
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.
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.
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.