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
Ach ja Ich sollte vielleicht noch hinzufügen, dass es mit C programmiert werden muss.
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
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.
:
Bearbeitet durch User
Vielen Dank erstmal an alle. =) Ich werde jetzt versuchen das Programm fertig zu schreiben und es dann hinterher hochladen. Danke nochmals.
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.
Die Funktionen aus ctype.h sind dein Freund: http://www.cplusplus.com/reference/cctype/ Was sollen die Schleifen in deinem Programm machen?
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 :)
Dein Informatikprof mag scheinbar den K&R. Hol dir das Buch und schau die ersten 10-20 Seiten an. Da wird exakt das behandelt.
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.
Vielen Dank Leute für eure Unterstützung. =)
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]
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.
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.
Rolf M. schrieb: > Spar dir die Kommentare OK, mache ich. http://stackoverflow.com/questions/10050948/kernighan-ritchie-word-count-example-program-in-a-functional-language
Carsten P. schrieb: > ie auf K&R stehen oder keinen Bock auf funktionale > Programmierung haben Es muss nicht jeder diesen akademischen Furz machen.
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! ;-)
Georg schrieb: > Nebenbei, ist "Boah Ey Alter" auch ein Satz? "Technisch" betrachtet: ja. Aber da fehlt nicht nur am Ende ein Satzzeichen. ;-)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.