Ubungspaket 7 ¨
Angemessenes Formatieren von C-Programmen
Ubungsziele: ¨
1. Gute Layout-Struktur durch Einr¨ ucken 2. Richtiges Verwenden von Kommentaren Skript:
Kapitel: 19 Semester:
Wintersemester 2021/22 Betreuer:
Thomas, Tim und Ralf Synopsis:
Das Kodieren eines Algorithmus in ein C-Programm und das Eintip- pen in den Rechner ist eigentlich gar nicht so problematisch. Schwierig wird’s nur bei der Fehlersuche, wenn das Programm nicht das macht, was es machen soll. Noch schwieriger wird es, wenn dann der Betreuer
” mal eben“ den Fehler finden soll. Hier helfen Kommentare und ange-
messenes Einr¨ ucken, was wir hier ein wenig ¨ uben wollen.
Teil I: Stoffwiederholung
Aufgabe 1: Kommentare
In der Programmiersprache C gibt es zwei M¨oglichkeiten, Kommentare zu verwenden.
Erkl¨are kurz die Syntax und zeige ein Beispiel.
M¨oglichkeit 1:
Syntax Die erste M¨oglichkeit erfordert sowohl ¨offnende /* als auch schließende */
”Klammern“ und kann sich ¨uber mehrere Zeilen erstrecken.
Beispiel int i /* hier ist ein kommentar
der hier zu ende ist */ = -1;
M¨oglichkeit 2:
Syntax Die zweite M¨oglichkeit besteht in //. Derartige Kommentare beginnen mit // und gehenimmer bis zum Ende der Zeile. Bei mehrzeiligen Kommentaren ist das // entsprechend in jeder Zeile zu wiederholen.
Beispiel int i = // variablendefinition -1; // initialisierung
Aufgabe 2: Geschachtelte Kommentare
Erkl¨are kurz, wie man Kommentare schachteln kann und was dabei passiert.
Nat¨urlich kann man Kommentare schachteln wie man will, nur muss man verstehen, was dabei passiert. Die wesentliche Frage ist immer, welche Kommentarform die ¨außere ist.
1. //-Kommentare:
Egal, was man hier hineinschreibt, der Kommentar endet am Zeilenende. Auch wenn die schließende Klammer fehlt, ist dieser am Zeilenende zu Ende.
Beispiel: // aeuesserer kommentar /* innerer kommentar 2. /* ... */-Kommentare:
Egal, was man hier hineinschreibt, der Kommentar ist beim Auftreten des ersten
*/ zu Ende, egal ob dies in der selben oder einer sp¨ateren Zeile der Fall ist.
Beispiel: /* aeusserer kommentar */ kein kommentar mehr */
7-1 Wintersemester 2021/22, Einf¨uhrung in die Praktische Informatik
Aufgabe 3: Angemessenes Einr¨ ucken
Erkl¨are kurz in eigenen Worten, warum wir als Lehrpersonal so sehr auf eine angemessene Form des Einr¨uckens Wert legen.
Ein C-Programm besteht in der Regel aus Variablendefinitionen und Anweisungsbl¨ocken.
Ein Charakteristikum von Anweisungsbl¨ocken ist, dass sie aus verschiedenen Elementen wie Fallunterscheidungen, Schleifen und weiteren Anweisungen bestehen, die ineinander verschachtelt sein k¨onnen. Daraus ergibt sich eine logische Strukur. F¨ur dasFinden m¨ogli- cher Fehler ist es f¨uralle sehr hilfreich, wenn man die intendierte Struktur auf den ersten Blick erfasst. Damit vermeidet man nicht nur Fehler, sondern sieht sehr schnell, wo m¨ogli- cherweise Klammern fehlen oder zu viele gesetzt sind.
Aufgabe 4: Recherche
Recherchiere etwa f¨unf bis zehn Minuten im Web zum Thema
”Einr¨ucken in C“ und notiere deine zwei Favoriten. M¨ogliche Schlagw¨orter sind: einruecken c programm
Die meisten von uns favorisieren einen Einr¨uckstil, der sehr stark dem Allman/BSD/
”East Coast“ Stil ¨ahnelt.
Ihr k¨onnt selbstverst¨andlich euren Einr¨uckstil frei w¨ahlen, solange er auch tats¨achlich einr¨uckt (also nicht linksb¨undig schreibt), konsistent ist und alle Beteiligten damit zurecht kommen.
Teil II: Quiz
Aufgabe 1: Finden von Kommentaren
Im folgenden (recht sinnfreien) Text befinden sich einige Kommentare. Schaue dir die Texte an und unterstreiche alle Kommentare einschließlich der
”Kommentarklammern“. Dabei ist jede Zeile f¨ur sich zu behandeln, d.h. eventuell noch nicht abgeschlossene Kommentare aus vorherigen Zeilen haben keinen Einfluss. Korrigiere die Kommentare, sofern dir dies sinnvoll, logisch oder naheliegend erscheint.
1 h e u t e ist ein /* s c h o e n e r */ tag
2 g e s t e r n s c h i e n die s o n n e // den g a n z e n tag
3 /* das */ l e r n e n der /* p r o g r a m m i e r s p r a c h e C */ ist a n s t r e n g e n d
4 // ich w u e n s c h t e , das s t u d i u m w a e r e s c h o n f e r t i g 5 ich h a b e /* s e h r /* n e t t e */ */ k o m m i l i t o n e n
6 b e i m h o c h s c h u l s p o r t f i n d e t man v i e l e /** g u t e */ k u r s e 7 im s o m m e r ist es warm , im w i n t e r /* n i c h t **/ i m m e r
8 m a t h e ist /* oft * / a n s t r e n g e n d , /* p h y s i k */ l e i d e r a u c h 9 das l e r n e n /* in der // g r u p p e */ m a c h t s p a s s
10 schoen , // b a l d */ ist w o c h e n e n d e
11 k o m m e n t a r e s i n d /* s e h r * / b l o e d // f i n d e ich
Im Text haben wir folgende Kommentare gefunden:
Zeile Kommentar 1 /* schoener */
2 // den ganzen Tag 3 /* das */
3 /* programmiersprache C */
4 // ich wuenschte, dass studium waere schon fertig 5 /* sehr /* nette */
6 /** gute */
7 /* nicht **/
8 /* oft * / anstrengend, /* physik */
9 /* in der // gruppe */
10 // bald */ ist wochenende 11 /* sehr * / bloed // finde ich
7-3 Wintersemester 2021/22, Einf¨uhrung in die Praktische Informatik
Die im Text verwendete Schreibweise legt nahe, dass einige Tippfehler passiert sind, die folgende Korrekturen nahelegen:
Zeile Korrektur Begr¨undung
5 /* sehr nette */ Kommentare kann man nicht schachteln 6 /* gute */ Vermutlich ein * zu viel
7 /* nicht */ Vermutlich ein * zu viel
8 /* oft */ vermutlich ein Leerzeichen zu viel 10 /* bald */ vermutlich Verwechslung von / und * 11 /* sehr */ vermutlich ein Leerzeichen zu viel Diese Korrekturen ergeben folgenden Text:
1 h e u t e ist ein /* s c h o e n e r */ tag
2 g e s t e r n s c h i e n die s o n n e // den g a n z e n tag
3 /* das */ l e r n e n der /* p r o g r a m m i e r s p r a c h e C */ ist a n s t r e n g e n d
4 // ich w u e n s c h t e , das s t u d i u m w a e r e s c h o n f e r t i g 5 ich h a b e /* s e h r n e t t e */ k o m m i l i t o n e n
6 b e i m h o c h s c h u l s p o r t f i n d e t man v i e l e /* g u t e */ k u r s e 7 im s o m m e r ist es warm , im w i n t e r /* n i c h t */ i m m e r
8 m a t h e ist /* oft */ a n s t r e n g e n d , /* p h y s i k */ l e i d e r a u c h 9 das l e r n e n /* in der // g r u p p e */ m a c h t s p a s s
10 schoen , /* b a l d */ ist w o c h e n e n d e
11 k o m m e n t a r e s i n d /* s e h r */ b l o e d // f i n d e ich
Teil III: Fehlersuche
Aufgabe 1: Fehlerhafte Kommentare finden
Im folgenden Programm befinden sich f¨ur seine Gr¨oße recht viele Kommentare. Leider hat der Programmierer hier und dort den einen oder anderen Fehler gemacht.
Fehlerhaftes Programm:
1 # i n c l u d e < s t d i o . h > /* k o m m e n t a r 2
3 int m a i n ( int argc , k o m m e n t a r c h a r ** a r g v ) 4 // h i e r ist g a n z /* v i e l
5 k o m m e n t a r s o g a r u e b e r */
6 // d r e i z e i l e n
7 { /* s c h o n w i e d e r ein /* e i n f a c h e r */ k o m m e n t a r */
8 int // k o m m e n t a r m i t t e n i ; d r i n
9 if ( i == 2 )
10 h i e r a u c h p r i n t f ( " t r u e \ n " ) ;
11 e l s e p r i n t f ( " f a l s e \ n " ) ; /* und j e t z t ist a b e r s c h l u s s
12 }
Viele dieser Kommentare sind v¨ollig sinnfrei. Aber dennoch, finde und korrigiere sie. Be- denke, dass es immer mehrere M¨oglichkeiten gibt, die Fehler zu korrigieren. Entscheide dich jeweils f¨ur eine. Bei richtig gesetzten Kommentaren sollte der Compiler folgendes Programm sehen, sofern er selbige entfernt hat:
Programm, wie es ohne Kommentare sein sollte:
1 # i n c l u d e < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v )
4 {
5 int i ;
6 if ( i == 2 )
7 p r i n t f ( " t r u e \ n " ) ; 8 e l s e p r i n t f ( " f a l s e \ n " ) ;
9 }
Die Richtigkeit der durchgef¨uhrten Korrekturen l¨asst sich sehr einfach feststellen. Einfach mal das Kommandocpp <datei.c>ausf¨uhren, wobei<datei.c>nat¨urlich durch den rich- tigen Dateinamen zu ersetzen ist. Am Anfang steht sehr viel, das alles mit stdio.hzu tun hat. Am Ende jedoch sollte das Programm richtig erscheinen (unter Umst¨anden sind aber die Zeilen ein wenig verrutscht). Statt cppkann nat¨urlich auchgcc -Everwendet werden.
7-5 Wintersemester 2021/22, Einf¨uhrung in die Praktische Informatik
Fehlerbeschreibung:
Zeile Fehler Erl¨auterung Korrektur
1 */ fehlt Die schließende Kommentarklammer */ fehlt. */ erg¨anzen
. . . .
3 /*...*/
fehlen ”kommentar“ steht nicht in Kommentarklammern. /*. . . */
erg¨anzen
. . . .
4 Alles v¨ollig korrekt.
. . . .
5 /* oder //
fehlen
Der Kommentar wird zwar beendet, aber die ¨offnende Klammer fehlt.
/* oder //
erg¨anzen
. . . .
6 Alles v¨ollig korrekt
. . . .
7 falsche Schachtelung
Durch/*ist der hintere Teil kein Kommentar, da man Kommentare so nicht schachteln kann.
neu anfangen
. . . .
8 i ist im Kommentar
Die Variableiist leider im Kommentar. Hier muss der Kommentar vorher beendet und anschließend wieder angefangen werden.
*/ und //
erg¨anzen
. . . .
9 Alles v¨ollig korrekt.
. . . .
10 /*...*/
fehlen
Die ersten beiden W¨orter sind zu viel. Diese m¨ussen durch weitere Kommentarklammern
”entfernt“ wer- den.
/*...*/
erg¨anzen
. . . .
11 */ fehlt Die schließende Kommentarklammer */ fehlt entwe- der */ am Ende erg¨anzen oder // am Kommentaran- fang.
*/ erg¨anzen
Wir haben das schreckliche Programm jedenfalls wie folgt korrigiert:
Korrigiertes Programm:
1 # i n c l u d e < s t d i o . h > /* k o m m e n t a r */
2
3 int m a i n ( int argc , /* k o m m e n t a r */ c h a r ** a r g v ) 4 // h i e r ist g a n z /* v i e l
5 // k o m m e n t a r s o g a r u e b e r */
6 // d r e i z e i l e n
7 { /* s c h o n w i e d e r ein /* e i n f a c h e r */ /* k o m m e n t a r */
8 int /* k o m m e n t a r m i t t e n */ i ; // d r i n
9 if ( i == 2 )
10 /* h i e r a u c h */ p r i n t f ( " t r u e \ n " ) ;
11 e l s e p r i n t f ( " f a l s e \ n " ) ; // und j e t z t ist a b e r s c h l u s s
12 }
Teil IV: Anwendungen
In diesem Aufgabenteil sollt ihr schlecht formatierte Programme durch Verwenden von Leerzeichen und Zeilenumbr¨uchen so umwandeln, dass derenStruktur sofort erkennbar ist.
Aufgabe 1: Ein erstes, einfaches Programm
1 # include < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v ) 4 {
5 int i , j ; 6 if ( i < j )
7 for ( i =0; i < 1 0 ; i = i +1) 8 p r i n t f ( " ha ha \ n " ) ; 9 e l s e
10 if ( i == j )
11 for ( i =0; i <3; i = i +1) 12 for ( j =0; j < 1 0 ; j = j +1) 13 p r i n t f ( " ho ho \ n " ) ; 14 e l s e
15 p r i n t f ( " t o t a l b l o e d \ n " ) ; 16 }
Neue Formatierung:
1 # i n c l u d e < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v )
4 {
5 int i , j ;
6 if ( i < j )
7 for ( i = 0; i < 10; i = i + 1 )
8 p r i n t f ( " ha ha \ n " ) ;
9 e l s e if ( i == j )
10 for ( i = 0; i < 3; i = i + 1 )
11 for ( j = 0; j < 10; j = j + 1 )
12 p r i n t f ( " ho ho \ n " ) ;
13 e l s e p r i n t f ( " t o t a l b l o e d \ n " ) ;
14 }
Dies ist nur eine von vielen M¨oglichkeiten. Hauptsache die Programmstrukur ist auf den ersten Blickerkennbar!
7-7 Wintersemester 2021/22, Einf¨uhrung in die Praktische Informatik
Aufgabe 2: Ein zweites, einfaches Programm
1 # include < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v ) 4 {
5 int i , j ; 6 if ( i < j )
7 for ( i =0; i < 1 0 ; i = i +1) 8 if ( i = = 3 )
9 for ( j =0; j <3; j = j +1) 10 p r i n t f ( " ha ha \ n " ) ; 11 e l s e
12 p r i n t f ( " ho ho \ n " ) ; 13 e l s e
14 p r i n t f ( " t o t a l b l o e d \ n " ) ; 15 }
Neue Formatierung: (Konsistent, aber mit vielen geschweiften Klammern) 1 # i n c l u d e < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v )
4 {
5 int i , j ;
6 if ( i < j )
7 {
8 for ( i = 0; i < 10; i = i + 1)
9 {
10 if ( i == 3)
11 {
12 for ( j = 0; j < 3; j = j + 1)
13 {
14 p r i n t f ( " ha ha \ n " ) ;
15 }
16 }
17 e l s e {
18 p r i n t f ( " ho ho \ n " ) ;
19 }
20 }
21 }
22 e l s e {
23 p r i n t f ( " t o t a l b l o e d \ n " ) ;
24 }
25 }
Ohne alle nicht unbedingt notwendigen geschweiften Klammern h¨atten wir folgendes, recht kompaktes Programm:
1 # i n c l u d e < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v )
4 {
5 int i , j ;
6 if ( i < j )
7 for ( i = 0; i < 10; i = i + 1)
8 if ( i == 3)
9 for ( j = 0; j < 3; j = j + 1)
10 p r i n t f ( " ha ha \ n " ) ; 11 e l s e p r i n t f ( " ho ho \ n " ) ; 12 e l s e p r i n t f ( " t o t a l b l o e d \ n " ) ;
13 }
Aufgabe 3: Ein drittes, einfaches Programm
1 # i n c l u d e /* e i n g a b e */ < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v )
4 {
5 int i
6 ; if ( i
7 == 2 ) p r i n t f ( " t r u e \ n " ) ; e l s e p r i n t f 8 ( " f a l s e \ n " ) ;
9
10 }
Neue Formatierung:
1 # i n c l u d e < s t d i o . h > /* e i n g a b e */
2
3 int m a i n ( int argc , c h a r ** a r g v )
4 {
5 int i ;
6 if ( i == 2 )
7 p r i n t f ( " t r u e \ n " ) ; 8 e l s e p r i n t f ( " f a l s e \ n " ) ;
9 }
Bei diesem Programm haben wir zwecks ¨Ubersichtlichkeit und erkennbarer Programm- struktur zus¨atzlich die Inhalte zwischen den Zeilen hin- und hergeschoben.
7-9 Wintersemester 2021/22, Einf¨uhrung in die Praktische Informatik