"C"-Programmier-Kurs für Einsteiger (3)

Im zweiten Teil haben Sie einen wichtigen Variab-lentypen, den float, also die Fließkommazahl, kennengelernt und eine erste Bekanntschaft mit einer Schleife gemacht, der do-while-Schleife.

Sie können also nun schon mit Variablen umgehen und kennen den grundsätzlichen Aufbau eines "rund" laufenden C-Programms.

Zugegeben, die Aufgaben der letzten Ausgabe waren nicht leicht, aber Sie wollen ja auch weiterkommen - oder? Die Lösungen (für alle bisher erschienenen Kurse!) finden Sie auf der PD-Diskette Nr. 44.

Alle Dateien sind als C-Code und als lauffähiges TOS-Programm vorhanden.

Beim Schreiben, Ausprobieren oder beim Lösen der Aufgaben ist Ihnen sicherlich bewußt geworden, wie schwierig es ist, den Quellcode so zu schreiben, daß das Programm nacheinander auch wirklich das macht, was Sie wollen. Immerhin mußten in der letzten Aufgabe des vergangenen Kurses drei ineinander laufende do-while-Schleifen programmiert werden. Da ist es wirklich nicht leicht, die Übersicht zu behalten und die richtige Reihenfolge der Anweisungen zu beachten. Leider werden die weiteren Programme komplizierter und verschachtelter.

Das ist die beste Zeit, sich Gedanken darüber zu machen, wie man seine Idee erst strukturiert auf ein Blatt Papier schreibt oder zeichnet und erst dann, wenn das logisch ablaufen kann, in den Computer eingibt. Dieses hilft nicht nur, unsinnige Fehler zu vermeiden, die man schlecht findet (der Compiler kann nur syntaktische, nicht aber logische Fehler erkennen), sondern spart auch eine Menge Zeit und Testläufe.

Das Problem, ein Programm strukturiert und leicht nachvollziehbar gestalten zu können, ist so alt wie der Computer selbst. Die Herren Nassi und Shneiderman hatten damals eine Möglichkeit zur graphischen Darstellung bekannt gemacht. Dieses Struktrogramm trägt natürlich deren Namen. Weiterhin gibt es die sogenannten Struktogramme. Beide haben aber Nachteile. Es müssen verschiedene Rauten und Rechtecke gezeichnet werden, in welchen der Text steht, das macht ein Einfügen oder Erweitern unmöglich. Weiterhin verläuft der Quellcode eines Programms grundsätzlich von oben nach unten; in den Struktogrammen liegen die einzelnen Anweisungen zum Teil aber auch nebeneinander, so daß das Übertragen nicht unbedingt leichtfällt.

Sehen Sie sich das Bild 1 an (Seite 41). Kommt Ihnen das Programm bekannt vor? Sie kennen es aus dem zweiten Teil. Das Programm, das bis 10 zählt. So hat es ausgesehen, bevor es eingetippt wurde. Nachdem angegeben ist, welche Variablen verwendet werden, beginnt eine Linie auf der linken Seite wie ein roter Faden durch das Programm zu führen. Die Zeichen daneben symbolisieren grob die Art der Anweisung dahinter. Der Strich bedeutet allgemeine Anweisung und ist für alles zu gebrauchen.

# Aufgaben zum C-Kurs

Aufgabe 1
Wie die Zahlen sind auch die Buchstaben geordnet und zusammenhängend im ASCIf-Code codiert. So können Sie das Listing 1 dahingehend erweitern, daß das Programm die kleinen Buchstaben erkennt und alles andere als "andere Zeichen" bezeichnend ausgibt. Es sollen 10 Zeichen nacheinander abgefragt, erkannt und ausgegeben werden; erst dann soll die Frage nach Beendigung des Programms erscheinen.

Aufgabe 2
Soll natürlich die großen Buchstaben herausfinden. Zu Beginn soll aber eine Abfrage erscheinen, wieviel Großbuchstaben erkannt werden sollen, bevor die Frage nach Beendigung des Programmes ausgegeben wird.

Aufgabe 3
Erweitern Sie das Listing 2 dahingehend, daß das Programm, wenn die eingegebene Zahl um 20 größer oder kleiner ist; "Die Zahl ??? ist viel zu groß" (bzw. zu klein) ausgibt.

Aufgabe 4
Erweitern Sie das Programm der Aufgabe 3 nachdem es läuft, daß das Programm nur Zahlen bis 100 für die abzuspeichernde Zahl zuläßt und wenn die eingegebene Zahl darüber ist, eine Meldung ausgibt: "Die Zahl ist zu groß, bitte eine neue eingeben !"

Aufgabe 5
Programmieren Sie einen "Blinker". Das Programm soll untereinander "Blinker EIN" und "Blinker AUS" ausgeben, bis die Taste ’q’ gedrückt wird. Verwenden Sie dafür die Anweisung getchar() aus dem ersten Kurs. Schreiben Sie also: ende = getchar();

Aufgabe 6
Die sechste Aufgabe sollte eigentlich wieder die schwerste sein, aber die 3. und die 4. sind das schon reichlich. Deshalb erweitern Sie einfach den Blinker, so daß eine zuvor eingegebene Anzahl mal blinkt und dann nach dem Programmende fragt.

Am schwierigsten im Programmablauf zu durchschauen sind aber die Schleifen. Die do-while-Schleife beginnt mit einem Punkt, auf den die Schleife immer wieder zurückspringt, bis die Bedingung hinter dem Kreis (er symbolisiert die Schleife) erfüllt ist.

Laufen Sie einmal mit dem Finger das Programm ab, so wie es der Ablauf vorgibt. Dieses wird Ihnen sehr viel leichter fallen, als den reinen Quellcode nachzuvollziehen. Danach versuchen Sie das genauso mit dem Bild 2, dem Programm, das bis 100 zählt. Natürlich nicht gleich bis 100, bis 20 reicht schon.

Praxis

Dieser dritte Kurs wird sich damit beschäftigen, wie ein Programm logische Entscheidungen treffen und danach je nach Entscheidung verschiedene Anweisungen abarbeiten kann. Um das leichter zu verstehen, ist der gerade beschriebene Ablaufplan eine große Hilfe.

Sie wollen ein Programm schreiben, das nach Eingabe eines Zeichens herausfindet, ob das Zeichen eine Zahl oder ein Buchstabe ist und das Ergebnis der Entscheidung (Zahl oder Buchstabe) dann auf dem Bildschirm anzeigt. Wichtig zu wissen ist, daß es für einen Computer keine Buchstaben gibt. Er behandelt diese als Zahl, mit der er nicht rechnen soll. Nach einem fest definierten Code, dem ASCII-Code nämlich, weiß er, welches Zeichen mit welchem Zahlenwert identisch ist. Somit kann er auch ermitteln, welche Zeichen vor der ’0’ (kleiner als 0) und hinter der ’9’ (größer als 9) stehen. Das werden Buchstaben und andere Zeichen sein, nicht aber Zahlen. Eine Anweisung könnte also heißen:

Wenn das Zeichen kleiner ist als ’0’ oder größer ist als ’9’, erkenne es als Buchstabe, andernfalls als Zahl.

In Bild 3 sehen Sie ein auf der Spitze stehendes Karo. An dieser Stelle muß eine logische Entscheidung getroffen werden. Wird die dahinterstehende Frage bejaht, verzweigt das Programm nach rechts, ansonsten nach unten weiter. Da die beiden Abarbeitungsmöglichkeiten im Quellcode untereinander stehen, kreuzen sich die beiden Striche, um danach wieder zusammenzulaufen.

Die if-Anweisung (siehe Listing 1 auf Seite 41) ist in vielen Programmiersprachen bekannt; so auch in C. Wichtig ist, daß die Syntax hinter der schließenden Klammer und hinter eise kein Semikolon verlangt, da jeweils dahinter bzw. darunter steht, was das Programm machen soll. Würde ein Semikolon dahinter stehen, würde das Programm die if-Anweisung als abgeschlossen ansehen und sofort die nächste Anweisung hinter dem Semikolon ausführen. Vergleichen Sie Bild 3 und Listing 1 miteinander und Sie sehen, wie leicht das aufgezeichnete "Gedankengerüst" in einen Quellcode umgewandelt werden kann. Nur wie das "oder" in der Sprache C aussieht, können Sie noch nicht wissen. Es sind zwei " |". Sie finden dieses Zeichen rechts neben der Return- und unter der Deletetaste. Da das Programm nach der Eingabe eines einzelnen Zeichens und ohne Return abzuwarten Weiterarbeiten soll, verwenden wir, wie auch am Ende eines Programms, getch(), nicht wie bisher scanf().

Das nächste Programm soll eine fest eingegebene Zahl mit einer immer wieder neu eingegebenen vergleichen und ausgeben, ob sie größer oder kleiner ist. Das Ganze läuft natürlich in einer Schleife, die am besten abgebrochen werden kann, wenn die beiden Zahlen gleich sind. Machen Sie sich ein paar grundsätzliche Gedanken und versuchen Sie, einen kleinen Ablaufplan zu erstellen, bevor Sie weiterlesen.

Einigen wir uns auf integer-Variablen mit der Bezeichnung "zahl", "eingabezahl" und "ende". Als erstes brauchen Sie natürlich eine do-while-Schleife, um dem gesamten Programm eine Wiederholungsmöglichkeit mit Abbruchbedingung zu geben. In dieser Schleife wird erst einmal eine Aufforderung zur Eingabe der festen Zahl geben. Nun soll das Programm wiederholend nach einer neuen Zahl fragen und sie mit der festen vergleichen, bis die beiden Zahlen übereinstimmen. Also noch eine do-while-Schleife, die "zahl" und "eingabe" miteinander auf Gleichheit prüft. In dieser Schleife liegt der Kern des Programms. Eine if-Abfrage fragt beispielsweise, ob "zahl" größer als "eingabe" ist, verzweigt dementsprechend und gibt die Ausgabe, ob "eingabezahl" zu groß oder zu klein ist. Der Ablauf ist in Bild 4 nachzuvollziehen; das lauffähige Programm sehen Sie in Listing 2. Das Programm hat (wie oben beschrieben) einen logischen Fehler, den der Compiler nicht finden kann und den wir mit dem bisherigen Wissen nicht vermeiden können. Versuchen Sie einmal, anhand des Ablaufplans herauszufinden, wo er steckt.

Es gibt verschiedene Möglichkeiten, ihn zu beseitigen, doch dazu muß er erst einmal gefunden werden. Vielleicht finden Sie sogar eine mögliche Lösung. Im nächsten Teil wird aus diesem Programm ein kleines Ratespiel, natürlich ohne diesen bug. Als letztes versuchen Sie bitte (mit dem Finger), das Bild 5 ablaufen zu lassen. Bevor Sie das Listing 3 eingeben, versuchen Sie herauszufinden, was das Programm auf dem Bildschirm ausgeben wird. Im Listing sehen Sie hinter der if-else-Anweisung nun Klammern. Genau wie in der do-while-Schleife können auch hier mehrere aufeinanderfolgende Anweisungen, in eine geschweifte Klammer gesetzt, nacheinander abgearbeitet werden.

Die if-Anweisung fragt immer wieder ob "a" und "b" noch nicht gleich groß sind und addiert, nach der Bildschirmausgabe, "a" um 1 weiter hoch. Interessant ist auch die Abbruchmöglichkeit im else-Zweig. Die Variable "abbruch" erhält zu Beginn ein "x" zugeschrieben, so daß die zweite Schleife hält. Ist "a" gleich "b" verzweigt die if-Anweisung nach eise und diese setzt "abbruch" auf "q". Prompt bricht die Schleife ab.

Damit endet der dritte Teil des C-Kur-ses. Mit der if-Anweisung haben Sie neben der Funktion der Variablen und der Schleife einen elementaren Bestandteil eines Programms kennengelernt. Mit der Hilfe eines Ablaufplans können Sie schnell ein Programm skizzieren und falls das Programm nicht richtig läuft, einen logischen Fehler herausfinden. Viel Spaß beim Lösen der Aufgaben.

# C-Kurs Teil 3 / Bilder 1 - 5
Kursteil 3, Bild 1
Kursteil 3, Bild 2
Kurs 3, Bild 4
Kurs 3. Bild 5


/* Kurs 3, Listing l */

#include <stdio.h>
#include <ext.h>

main() {
	char Zeichen,ende;

	printf("\nEin Programm, dass zwischen Zahl" ); 
	printf(" und Buchstaben unterscheiden kann\n" );

	do {
		printf( "\n\nBitte eine Taste drücken: " );
		zeichen = getch();

		if( Zeichen <'0' || Zeichen >'9' )
			printf( "\n\nDas ist der Buchstabe: %c",zeichen ); 
		else
			printf( "\n\nDas ist die Zahl; %c”,zeichen );

		printf( "\n\nEnde mit 'q', weiter mit Taste 1" ); 
		ende = getch();
	} while( ende != 'q' );

	return 0;
} /* main_ende */


/* Kurs 3. Listing 2 */

#include <stdio.h>
#include <ext.h>

main() (
	int zahl,eingabezahl;
	char ende;

	printf( "\nEin Programm, das gross und klein heraus findet.\n\n" );
	do {
		printf( "Bitte geben Sie Zahl ein, die fest abgespeichert wird: ");
		scanf( "%i", &zahl );

		do{
			printf( "\n\nBitte eine Zahl eingeben:");
			scanf( "%i", &eingabezahl );

			if( zahl < eingabezahl )
				printf( "Die Zahl %i ist größer.", eingabezahl);
			else
				printf( "Die Zahl %i ist kleiner.", eingabezahl );

		}while( zahl != eingabezahl );

		printf( "\n\nEnde mit 'q'. weiter mit Taste !\n" );
		ende = getch();
	}while( ende != 'q' );

	return 0; 
} /*main_ende*/


/* Kurs 3, Listing 3 */

#include <stdio.h>
#include <ext-h>

main(){

	int a,b;
	char abbruch,ende;

	printf( "\nEin Programm, das von 0 bis zu einer " );
	printf( "eingegebenen Zahl hochzählt.\n" );

	do(
		a = b = 0; 
		abbruch = 'x';

		printf( "\n\nBitte eine Zahl eingeben: " );
		scanf( "%i", &b );

		do{
			if( a != b ){
				printf( "\nDie Variable a ist gerade %i, b ist ", a,b );
				a ++;
			} else {
				printf( "\nJetzt ist die variable a %i, gleich b %i.", a,b );
				abbruch = 'q';
			}
		}while( abbruch != 'q' );

		printf( "\n\nBeenden des Programms mit *q', weiter mit Taste !\n" );
		ende = getch();
	}while( ende != 'q' );

	return 0; 
} /*main_ende*/



Klaus Sommer
Aus: ST-Computer 10 / 1996, Seite 38

Links

Copyright-Bestimmungen: siehe Über diese Seite