<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.stageing.freitagsrunde.org//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=130.149.245.244</id>
	<title>FreitagsrundenWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stageing.freitagsrunde.org//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=130.149.245.244"/>
	<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//Spezial:Beitr%C3%A4ge/130.149.245.244"/>
	<updated>2026-11-01T07:15:31Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.6</generator>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=C-Kurs/Pong&amp;diff=22239</id>
		<title>C-Kurs/Pong</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=C-Kurs/Pong&amp;diff=22239"/>
		<updated>2014-09-19T09:21:48Z</updated>

		<summary type="html">&lt;p&gt;130.149.245.244: /* Kommentare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier soll das Spiel Pong Schritt für Schritt implementiert werden. Die Anzeige des Spielfelds soll durch ASCII-Zeichen realisiert werden, sodass das Spiel in einem Terminal laufen kann. Ein Beispiel-Screenshot könnte so aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;         4                     2&lt;br /&gt;
+----------------------------------------+&lt;br /&gt;
|                                        |&lt;br /&gt;
|                                        |&lt;br /&gt;
|#                                       |&lt;br /&gt;
|#                                       |&lt;br /&gt;
|#                                       |&lt;br /&gt;
|            *                           |&lt;br /&gt;
|                                        |&lt;br /&gt;
|                                       #|&lt;br /&gt;
|                                       #|&lt;br /&gt;
|                                       #|&lt;br /&gt;
|                                        |&lt;br /&gt;
|                                        |&lt;br /&gt;
|                                        |&lt;br /&gt;
|                                        |&lt;br /&gt;
|                                        |&lt;br /&gt;
+----------------------------------------+&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider ist es nicht ganz einfach, einzelne Tasten einzulesen, wie sie gebraucht werden, wenn der Benutzer den Schläger bewegen möchte. &amp;lt;tt&amp;gt;scanf&amp;lt;/tt&amp;gt; arbeitet gepuffert und gibt die Eingabe erst nach Betätigung der Enter-Taste an das Programm. Wir verwenden deswegen die C-Programmbibliothek &#039;&#039;curses&#039;&#039;, die uns entsprechende Funktionen zum Abfragen eines Tastendrucks liefert. im CS-Netz ist schon alles nötige installiert. Solltest du Linux benutzen, musst du das Entwicklerpacket von libncurses installieren (unter Debian/Ubuntu &#039;&#039;libncurses-dev&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Aufgabe ==&lt;br /&gt;
=== curses initialisieren ===&lt;br /&gt;
Erstmal müssen wir das Headerfile für &#039;&#039;curses&#039;&#039; includen:&lt;br /&gt;
&amp;lt;pre&amp;gt; #include &amp;lt;curses.h&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schreibe jetzt eine Funktion &#039;&#039;void init()&#039;&#039;, die für das Initialisieren von curses zuständig wird. Sie enthält folgende Befehle:&lt;br /&gt;
* &amp;lt;tt&amp;gt;initscr();&amp;lt;/tt&amp;gt; aktiviert curses&lt;br /&gt;
* &amp;lt;tt&amp;gt;noecho();&amp;lt;/tt&amp;gt; damit Buchstaben der getippten Tasten nicht im Terminal erscheinen&lt;br /&gt;
* &amp;lt;tt&amp;gt;cbreak();&amp;lt;/tt&amp;gt; deaktiviert das Puffern der Terminalzeile&lt;br /&gt;
* &amp;lt;tt&amp;gt;keypad(stdscr, TRUE);&amp;lt;/tt&amp;gt; aktiviert spezielle Tasten, wie die Pfeiltasten&lt;br /&gt;
* &amp;lt;tt&amp;gt;nodelay(stdscr, TRUE);&amp;lt;/tt&amp;gt; damit die Funktion, die später die Tastendrücke entgegennimmt, nicht blockiert, bis eine Taste gedrückt wird&lt;br /&gt;
&lt;br /&gt;
Jetzt folgt die &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Funktion. Sie enthält als ersten Aufruf unsere &amp;lt;tt&amp;gt;init&amp;lt;/tt&amp;gt;-Funktion. Unser Programm sollte beim Beenden curses vernünftig deaktivieren, weswegen als letzter Aufruf in der &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Funktion folgender sein sollte:&lt;br /&gt;
&amp;lt;pre&amp;gt; endwin(); &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Quelltextdatei &#039;&#039;pong.c&#039;&#039; heißt, kann sie ab jetzt mit folgendem Befehl kompiliert werden:&lt;br /&gt;
&amp;lt;pre&amp;gt; gcc -o pong -lcurses pong.c &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variablen für den Zustand des Spiels ===&lt;br /&gt;
Zuerst überlegen wir uns, wie groß unser Spielfeld und die Schläger sein sollen. Diese Werte sollten als Define-Makros angegeben werden. Ein kleines, aber feines Feld bekommt man z.B. mit einer Breite von 40, einer Höhe von 15 und einer Schlägerhöhe von 3.&lt;br /&gt;
&lt;br /&gt;
Jetzt führen wir die Variablen ein, die den Spielzustand repräsentieren sollen. Wir brauchen je eine y-Positionen für die beiden Schläger. Dazu kommt x- und y-Position des Balls. Diese Positionsvariablen sind vom Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. Damit wir wissen, in welche Richtung sich der Ball gerade bewegt, brauchen wir x- und -y-Richtung. Dafür eignet sich auch &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;; welche die Werte 1 und -1 annehmen können sollen, je nachdem, ob es nach rechts/links bzw. nach unten/oben gehen soll. Jetzt brauchen wir noch zwei Variablen für den Punktestand, die wir auch gleich mit 0 initialisieren können.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;tt&amp;gt;void place_paddles()&amp;lt;/tt&amp;gt; soll die Schläger mittig platzieren. Die Funktion &amp;lt;tt&amp;gt;void place_ball()&amp;lt;/tt&amp;gt; soll den Ball in der Mitte platzieren. Die x- und y-Richtung können wir erstmal mit 1 belegen. Beide Funktionen sollten jetzt in der &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt; aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
=== Ausgeben des Spielfelds ===&lt;br /&gt;
Jetzt soll die Funktion &amp;lt;tt&amp;gt;void print_field()&amp;lt;/tt&amp;gt; geschrieben werden, die das komplette Spielfeld und den Punktestand anzeigen soll. Schaue dir dazu den obigen Screenshot an und überlege, wie du diesen zeilenweise aus den Positionsvariablen zusammenbauen kannst.&lt;br /&gt;
&lt;br /&gt;
In der Funktion sollte zuerst &amp;lt;tt&amp;gt;clear()&amp;lt;/tt&amp;gt; von curses aufgerufen werden, was den bisherigen Terminalinhalt löscht. Wichtig ist, dass du &amp;lt;tt&amp;gt;printw()&amp;lt;/tt&amp;gt; von curses statt &amp;lt;tt&amp;gt;printf()&amp;lt;/tt&amp;gt; verwendest. Die Art und Weise der Verwendung ist aber identisch. Zum Schluss muss noch &amp;lt;tt&amp;gt;refresh()&amp;lt;/tt&amp;gt; von curses aufgerufen werden, damit das eben ausgegebene erscheint.&lt;br /&gt;
&lt;br /&gt;
Teste nun dein &amp;lt;tt&amp;gt;print_field()&amp;lt;/tt&amp;gt;, indem du es in &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt; aufrufst. Sollte das Bild gleich nach Starten des Programms wieder verschwinden, baue am Ende noch ein &amp;lt;tt&amp;gt;sleep(10)&amp;lt;/tt&amp;gt; ein, damit das Programm noch 10 Sekunden läuft.&lt;br /&gt;
&lt;br /&gt;
=== Verarbeiten der Tastendrücke ===&lt;br /&gt;
Als nächstes kommt die Funktion &amp;lt;tt&amp;gt;void key_processing()&amp;lt;/tt&amp;gt; dran. Darin fragen wir nun folgendermaßen einen Tastedruck ab:&lt;br /&gt;
&amp;lt;pre&amp;gt;int ch = getch();&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wir können das Ergebnis in &#039;&#039;ch&#039;&#039; nun z.B. mit der Konstante &amp;lt;tt&amp;gt;KEY_UP&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;KEY_DOWN&amp;lt;/tt&amp;gt; bzw. den Buchstaben &amp;lt;tt&amp;gt;&#039;w&#039;&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;&#039;s&#039;&amp;lt;/tt&amp;gt; vergleichen und entsprechend die Positionsvariable der Schläger erhöhen oder veringern. Dabei sollte abgefangen werden, dass der Schläger außerhalb des Spielfelds landet. Wurde keine oder eine ungültige Taste gedrückt, können wir das hier stillschweigend ignorieren.&lt;br /&gt;
&lt;br /&gt;
Zum Testen kann die Funktion zusammen mit &amp;lt;tt&amp;gt;print_field()&amp;lt;/tt&amp;gt; und einer 100-Millisekunden-Pause in eine Endlosschleife gepackt werden. Für Pausen eignen sich die Funktionen &amp;lt;tt&amp;gt;sleep&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;usleep&amp;lt;/tt&amp;gt; aus &#039;&#039;stdlib.h&#039;&#039;. Erstere nimmt Sekunden, letztere Mikrosekunden an. (1 Sekunde = 1.000 Millisekunden = 1.000.000 Mikrosekunden)&lt;br /&gt;
&lt;br /&gt;
=== Ball bewegen ===&lt;br /&gt;
Schreibe jetzt die Funktion &amp;lt;tt&amp;gt;void move_ball()&amp;lt;/tt&amp;gt;, die die Positionsvariablen des Ball entsprechend der Werte der Richtungsvaraiblen inkrementiert bzw. dekrementiert.&lt;br /&gt;
&lt;br /&gt;
Teste die Funktion, indem du sie in der Test-Endlosschleife aufrufst. Der Ball fliegt jetzt erstmal ziemlich schnell aus dem Spielfeld.&lt;br /&gt;
&lt;br /&gt;
=== Kollisionen des Balls erkennen ===&lt;br /&gt;
Die jetzt zu schreibende Funktion &amp;lt;tt&amp;gt;void detect_collision()&amp;lt;/tt&amp;gt; soll Kollisionen mit der oberen/unteren Kante und den Schlägern erkennen und den Ball entsprechend reflektieren.&lt;br /&gt;
&lt;br /&gt;
Das lässt sich realisieren, indem man die y-Position mit der oberen und unteren Kantenposition vergleicht und bei Kollision die y-Richtung umkehrt. Bei den Schlägern geht das ähnlich mit der x-Position; hier muss aber noch geprüft werden, ob die y-Koordinate des Schlägers mit der y-Koordinate des Balls zusammenpasst (Schlägerhöhe beachten).&lt;br /&gt;
&lt;br /&gt;
Zum Testen kann die Funktion jetzt wieder in der Endlosschleife aufgerufen werden. Jetzt fliegt der Ball nur noch aus dem Spielfeld, wenn ihn kein Schläger getroffen hat.&lt;br /&gt;
&lt;br /&gt;
=== Erkennen, wenn der Ball nicht vom Schläger getroffen wurde ===&lt;br /&gt;
Dazu schreiben wir jetzt die Funktion &amp;lt;tt&amp;gt;int detect_ball_out()&amp;lt;/tt&amp;gt;. Der Rückgabewert soll angeben, für welchen Spieler es im weiteren Programmablauf den Punkt geben soll. Die Funktion muss prüfen, ob der Ball in der x-Position auf der Höhe eines Schlägers ist und für die rechte Seite &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; bzw. für die linke Seite &amp;lt;tt&amp;gt;2&amp;lt;/tt&amp;gt; zurückgeben. Ansonsten gibt die Funktion &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
Getestet werden kann die Funktion jetzt, indem sie als negierte Bedingung für die bisherige Endlosschleife genutzt wird.&lt;br /&gt;
&lt;br /&gt;
=== alles in ein rundenbasiertes Spiel stecken ===&lt;br /&gt;
Wir lagern nun die bisherige Testschleife in die neue Funktion &amp;lt;tt&amp;gt;int play_round()&amp;lt;/tt&amp;gt; um. Der Rückgabewert soll der Wert sein, den &amp;lt;tt&amp;gt;detect_ball_out()&amp;lt;/tt&amp;gt; im Fall des Nichttreffens liefert. Bisher reagieren die Schläger noch recht langsam, weshalb wir die Pause in der Schleife auf 20 Millisekunden herabsetzen. Da nun aber der Ball viel zu schnell wird, sollte &amp;lt;tt&amp;gt;move_ball&amp;lt;/tt&amp;gt; nur jeden fünften Schleifendurchlauf aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
In der &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Funktion erstellen wir nun eine Schleife mit der Bedingung, dass beide Spieler noch weniger als 10 Punkte haben. In den Schleifenkörper kommt unser &amp;lt;tt&amp;gt;play_round()&amp;lt;/tt&amp;gt;; danach wird abhängig von dessen Ergebnis der Punktestand von Spieler 1 bzw. Spieler 2 inkrementiert. Dann wird der Ball mit &amp;lt;tt&amp;gt;place_ball&amp;lt;/tt&amp;gt; neu platziert, bevor die nächste Runde beginnt. Hier ist es sinnvoll, die x-Richtung zum Spieler zu setzen, der zuletzt den Ball nicht getroffen hat (es muss also die Richtung noch an &amp;lt;tt&amp;gt;place_ball&amp;lt;/tt&amp;gt; übergeben werden).&lt;br /&gt;
&lt;br /&gt;
Wenn das Spiel zu Ende ist, soll noch ausgegeben werden, welcher Spieler gewonnen hat (wieder &amp;lt;tt&amp;gt;printw()&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;refresh()&amp;lt;/tt&amp;gt; verwenden).&lt;br /&gt;
&lt;br /&gt;
=== Zusatzaufgabe: KI ===&lt;br /&gt;
Statt des zweiten Spielers soll nun ein Computergegner spielen. Eine einfachste Lösung wäre, in jedem Schritt den die y-Position des Balls mit der des Schlägers zu vergleichen und ihn entsprechend nach oben/unten zu bewegen. Schreibe dazu eine entsprechende Funktion &amp;lt;tt&amp;gt;ai_opponent&amp;lt;/tt&amp;gt;. Nun bewegt sich der Schläger genauso schnell, wie der Ball, womit die die KI unbesiegbar ist. Führe deswegen eine Funktion &amp;lt;tt&amp;gt;can_move&amp;lt;/tt&amp;gt; ein, von der abhängt, ob sich der Schläger bewegt. Die Funktion sollte mit einer gewissen Wahrscheinlichkeit &#039;&#039;wahr&#039;&#039; zurückliefern. Die Schwierigkeit besteht darin, einen ausgewogenen Gegner zu programmieren. Eine gute Idee ist es z.B., die Position des Balls mit in die Wahrscheinlichkeit einfließen zu lassen.&lt;br /&gt;
&lt;br /&gt;
=== Zusatzaufgabe: andere Winkel des Balls ===&lt;br /&gt;
Bisher fliegt der Ball immer im 45°-Winkel. Beim originalen Pong verändert sich der Winkel jedoch bei jedem Aufschlag auf den Schläger zufällig. Man könnte jetzt die Ballpositionen und -richtungen intern als &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; speichern, um andere Winkel zu erreichen.&lt;br /&gt;
&lt;br /&gt;
== Kommentare ==&lt;br /&gt;
Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf &amp;quot;bearbeiten&amp;quot; und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Als kleine Starthilfe folgt ein Beispiel, wie so ein Kommentar formatiert sein könnte. Mit &amp;quot;Vorschau zeigen&amp;quot; kannst du dir ansehen, was deine Änderung bewirken würde, ohne wirklich etwas zu ändern.&lt;br /&gt;
Du musst übrigens außerhalb dieses auskommentieren Bereichs schreiben ;)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Der Befehl  gcc -o pong -lcurses pong.c funktioniert nicht. So funktionierts:  gcc -o pong  pong.c -lcurses&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>130.149.245.244</name></author>
	</entry>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=Kickerturnier_2013/orga&amp;diff=21489</id>
		<title>Kickerturnier 2013/orga</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=Kickerturnier_2013/orga&amp;diff=21489"/>
		<updated>2013-10-16T14:48:52Z</updated>

		<summary type="html">&lt;p&gt;130.149.245.244: Orga Kickertische einigetragen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Orga Mitglieder ==&lt;br /&gt;
Levi, Jan, Flo, Marcel, Konrad, Carl, Thomas, Till, Thilo, Maggy&lt;br /&gt;
&lt;br /&gt;
==Protokoll - Vorbereitungstreffen 15.10.2013==&lt;br /&gt;
&lt;br /&gt;
====Termin der Veranstaltung====&lt;br /&gt;
* Freitag, 22.11.2013&lt;br /&gt;
&lt;br /&gt;
====Uhrzeit====&lt;br /&gt;
*  18:00 Uhr&lt;br /&gt;
&lt;br /&gt;
====Raum====&lt;br /&gt;
* Raumbuchung ueber TU ueber AStA, ... &lt;br /&gt;
** Verantw.: Magdalena und Thomas&lt;br /&gt;
&lt;br /&gt;
====Orga-Kickertische====&lt;br /&gt;
* Ausleihen der Kicker anschreiben (Termin Abholung/Abgabe) &lt;br /&gt;
** Verantw.: Flo und Levi&lt;br /&gt;
* Transport der Kickertische voraussichtlich Ausleihen eines Autos vom AStA &lt;br /&gt;
** Verantw.: Marcel, Konrad und Jan&lt;br /&gt;
&lt;br /&gt;
====Medien====&lt;br /&gt;
* Musik vom Laptop inkl. Boxen&lt;br /&gt;
* Tafel zum notieren der Ergebnisse oder via Beamer&lt;br /&gt;
** Verantw.: Konrad; Marcel&lt;br /&gt;
* Bearbeitung von ggf. zwei Rechnern&lt;br /&gt;
&lt;br /&gt;
====Anmeldung====&lt;br /&gt;
* Anmeldung der Veranstaltung ueber Wiki/Anmeldescript&lt;br /&gt;
** Verantw.: Carl&lt;br /&gt;
* Siehe Liste 2012&lt;br /&gt;
&lt;br /&gt;
====Zutritt====&lt;br /&gt;
* Zutritt zum Gebaeude fuer Aussenstehende&lt;br /&gt;
* Liste von Teilnehmern an Pfoertner &lt;br /&gt;
** Verantw.: Carl&lt;br /&gt;
&lt;br /&gt;
====Verpflegung====&lt;br /&gt;
* Vorzeitige Absprache mit dem Lieferanten bzgl. der voraussichtlichen Menge&lt;br /&gt;
* Bevorzugtes Nahrungsmittel: Pizza &lt;br /&gt;
* Getraenke absprache mit Freitagsrunde GetraenkeOrga&lt;br /&gt;
* Abrechnung schon bei der Bestellung&lt;br /&gt;
* Kassenwart&lt;br /&gt;
** Verantw.: Thomas&lt;br /&gt;
&lt;br /&gt;
====Regeln====&lt;br /&gt;
* siehe Vorjahre &lt;br /&gt;
** Verantw.: Konrad und Marcel&lt;br /&gt;
&lt;br /&gt;
====Sieger-Preis-Praemie====&lt;br /&gt;
* gebastelte Trophae sh. Ideen der vergangenen Jahre &lt;br /&gt;
** Verantw.: Till und Thomas&lt;br /&gt;
&lt;br /&gt;
====Werbung====&lt;br /&gt;
* Plakat Gestaltung, Druck &lt;br /&gt;
** Verantw.: Jan und Till&lt;br /&gt;
* Verteilung durch Alle&lt;br /&gt;
* Mailverteiler der Uni &lt;br /&gt;
** Verantw.: Levi&lt;br /&gt;
&lt;br /&gt;
====Risiken====&lt;br /&gt;
* Veranstaltungstermin abhaengig von der Verfuegbarkeit der Kickertische und Transporter&lt;br /&gt;
&lt;br /&gt;
====Absprachen====&lt;br /&gt;
* Mailing Liste wird erstellt &lt;br /&gt;
** Verantw.: Magdalena&lt;br /&gt;
* E-Mail Adressen wurden festgehalten&lt;br /&gt;
&lt;br /&gt;
====Naechstes Treffen====&lt;br /&gt;
* Mittwoch der 23.10.2013 um 18:00 Uhr MAR 0.005&lt;br /&gt;
&lt;br /&gt;
==Ergebnisse der Orga Kickertische==&lt;br /&gt;
&lt;br /&gt;
====Café Erdreich====&lt;br /&gt;
*&amp;lt;div style=&amp;quot;color:red&amp;quot;&amp;gt;Nicht zur Verfügung&amp;lt;/div&amp;gt;&lt;br /&gt;
**Kicker zu zerbrechlich für den Transport&lt;br /&gt;
&lt;br /&gt;
====Café A==== &lt;br /&gt;
*&amp;lt;div style=&amp;quot;color:green&amp;quot;&amp;gt;Zur Verfügung&amp;lt;/div&amp;gt;&lt;br /&gt;
**Genaueres wird morgen im Gespräch im Café A geklärt&lt;br /&gt;
&lt;br /&gt;
====Café PlanWirtschaft====&lt;br /&gt;
&lt;br /&gt;
====DAI Labor====&lt;br /&gt;
&lt;br /&gt;
====inet====&lt;br /&gt;
&lt;br /&gt;
====swt====&lt;br /&gt;
&lt;br /&gt;
====Kicker von Professor oben im Mar====&lt;/div&gt;</summary>
		<author><name>130.149.245.244</name></author>
	</entry>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=C-Kurs/Buchstaben_z%C3%A4hlen&amp;diff=21325</id>
		<title>C-Kurs/Buchstaben zählen</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=C-Kurs/Buchstaben_z%C3%A4hlen&amp;diff=21325"/>
		<updated>2013-09-10T09:52:29Z</updated>

		<summary type="html">&lt;p&gt;130.149.245.244: /* Anonym */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Aufgabenstellung ==&lt;br /&gt;
&lt;br /&gt;
Schreibe ein Programm, das die Vorkommnisse aller Buchstaben in einer Datei zählt und anschließend ausgibt. Dabei sollen Groß- und Kleinbuchstaben zusammengefasst werden. Verwende die folgende Vorgabe:&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 int main(int argc, char **argv) {&lt;br /&gt;
     if (argc != 2) {&lt;br /&gt;
         printf(&amp;quot;missing filename\n&amp;quot;);&lt;br /&gt;
         return 0;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // open file&lt;br /&gt;
     FILE *file = fopen(argv[1], &amp;quot;r&amp;quot;);&lt;br /&gt;
     if (file == NULL) {&lt;br /&gt;
         printf(&amp;quot;cannot open file\n&amp;quot;);&lt;br /&gt;
         return 0;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // TODO your code here&lt;br /&gt;
 &lt;br /&gt;
     // close the file&lt;br /&gt;
     fclose(file);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Hinweis zum Dateienlesen ==&lt;br /&gt;
Für diese Aufgabe werden folgende File-IO-Funktionen benötigt. Die ersten beiden sind in der Vorgabe schon vorhanden.&lt;br /&gt;
* &amp;lt;tt&amp;gt;fopen(filename, &amp;quot;r&amp;quot;)&amp;lt;/tt&amp;gt; öffnet die Datei unter dem angegebenen Dateinamen im Nur-Lese-Modus und gibt einen FILE-Pointer zurück, mit dem im Folgenden auf die Datei zugegriffen werden kann.&lt;br /&gt;
* &amp;lt;tt&amp;gt;fclose(file)&amp;lt;/tt&amp;gt; schließt die Datei.&lt;br /&gt;
* &amp;lt;tt&amp;gt;fgetc(file)&amp;lt;/tt&amp;gt; liest ein Zeichen der Datei. Ist die Datei zuende, gibt die Funktion &amp;lt;tt&amp;gt;-1&amp;lt;/tt&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
== Hinweis zum Umgang mit chars ==&lt;br /&gt;
Mit &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; kann man genauso rechnen, wie mit &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. Die Berechnung &amp;lt;tt&amp;gt;character-&#039;a&#039;&amp;lt;/tt&amp;gt; ergibt also die Position des Buchstaben im Alphabet, wenn &amp;lt;tt&amp;gt;character&amp;lt;/tt&amp;gt; zwischen &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;z&amp;lt;/tt&amp;gt; in der [http://de.wikipedia.org/wiki/ASCII-Tabelle ASCII-Tabelle] liegt.&lt;br /&gt;
&lt;br /&gt;
== Zusatzaufgabe ==&lt;br /&gt;
Verschönere die Ausgabe so, dass für jede Buchstabenhäufigkeit eine visuelle Ausgabe (z.B. in Form eines Balkens aus &amp;lt;tt&amp;gt;#&amp;lt;/tt&amp;gt;) angezeigt wird, die den relativen Anteil des Buchstabens darstellt.&lt;br /&gt;
&lt;br /&gt;
== Kommentare ==&lt;br /&gt;
Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf &amp;quot;bearbeiten&amp;quot; und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)&lt;br /&gt;
&lt;br /&gt;
== Anonym ==&lt;br /&gt;
int main(int argc, char **argv) {&amp;lt;br&amp;gt;&lt;br /&gt;
Die Argumente von Main und auch die Sternchen sollten erklärt werden. Es kam weder in der 1.VL noch im 1.Tut.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
das sind die kommandozeilen parameter der ausfuehrbaren datei, wobei argc (Argument Count) die anzahl der uebergebenen argumente ist und argv (Argument Values) die einzelnen uebergebenen argumente sind. hierbei werden argumente unterschieden wenn sie von einem space character (040) getrennt sind.&lt;br /&gt;
&lt;br /&gt;
argc ist hierbei mindestens 1, da es mindetens den namen der ausfuehrbaren datei enthaelt.&lt;br /&gt;
&lt;br /&gt;
andererseits ist es fuer die lsg der aufgabe eher unerheblich was genau in dem vorgegebenen code passiert, desshalb ist er ja vorgegeben und wird nicht vorrausgesetzt...&lt;br /&gt;
&lt;br /&gt;
mfg alex&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Als kleine Starthilfe folgt ein Beispiel, wie so ein Kommentar formatiert sein könnte. Mit &amp;quot;Vorschau zeigen&amp;quot; kannst du dir ansehen, was deine Änderung bewirken würde, ohne wirklich etwas zu ändern.&lt;br /&gt;
Du musst übrigens außerhalb dieses auskommentieren Bereichs schreiben ;)&lt;br /&gt;
&lt;br /&gt;
==== Robert ====&lt;br /&gt;
Na mal schauen, ob irgendjemand diese Funktion wirklich benutzt. Ich fände es jedenfalls toll.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:CKurs]]&lt;br /&gt;
[[Kategorie:CKurs_Aufgaben]]&lt;/div&gt;</summary>
		<author><name>130.149.245.244</name></author>
	</entry>
</feed>