• Keine Ergebnisse gefunden

¨Ubungspaket 4 Klassifikation von Dreiecken

N/A
N/A
Protected

Academic year: 2021

Aktie "¨Ubungspaket 4 Klassifikation von Dreiecken"

Copied!
12
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Ubungspaket 4 ¨

Klassifikation von Dreiecken

Ubungsziele: ¨

1. Selbstst¨ andiges Entwickeln eines ersten Programms 2. Anwenden der Methoden des Software Life Cycles

3. Programmentwurf durch Anwendung der Methode der Schrittwei- sen Verfeinerung

4. Erstellen eines ersten, eigenen C-Programms 5. Finden von Programmierfehlern

Skript:

Kapitel: 6 bis 9 und 16 Semester:

Wintersemester 2021/22 Betreuer:

Thomas, Tim und Ralf Synopsis:

Nach dem ihr im 3. ¨ Ubungspaket ein in der Vorlesung entwickeltes Pro-

gramm auf dem Rechner zum Laufen gebracht habt, m¨ usst ihr nun euer

erstes eigenes Programm selber entwickeln. Im Rahmen der Programm-

entwicklung sollt ihr alle Phasen des Software Life Cycles anwenden.

(2)

Teil I: Stoffwiederholung

Aufgabe 1: Das Konzept der Fallunterscheidung

In Kapitel9des Skriptes haben wir dieFallunterscheidung eingef¨uhrt. Erkl¨are mit eigenen Worten, wof¨ur sie verwendet werden kann und wie sie mittels der Methode der Schrittweisen Verfeinerung dargestellt wird!

Die Fallunterscheidung dient dazu, einen logischen Ausdruck auszuwerten und in Ab- h¨angigkeit des Ergebnisses etwas Bestimmtes zu tun. Man spricht auch von einer be- dingten Programmverzweigung. Die einfachste Form der Fallunterscheidung kann man als wenn-dannKonstruktion beschreiben:

wenn ein logischer Ausdruck wahr ist dann tue etwas Sinnvolles

Diese Konstruktion l¨asst sich erweitern:

wenn ein logischer Ausdruck wahr ist dann tue etwas Sinnvolles

sonst tue etwas anderes

Aufgabe 2: Die Fallunterscheidung in C

Erkl¨are kurz, wie die Fallunterscheidung in der Programmiersprache C implementiert wird!

Gib zus¨atzlich mindestens vier Beispiele f¨ur eine

”sinnvolle“ Fallunterscheidung in C an!

Die einfache wenn-dann Konstruktion wird in C wie folgt umgesetzt:

if ( logischer Ausdruck ) Anweisung;

Das Schl¨usselwortifwird mit der Bedeutungwennverwendet. C kennt kein Schl¨usselwort f¨urdann; es ist implizit enthalten. Es kannnur eine Anweisung folgen; ben¨otigt man mehr als eine Anweisung, m¨ussen diese mit geschweiften Klammern eingeschlossen werden (aus Platzgr¨unden ohne Einr¨ucken):

1 if ( l o g i s c h e r A u s d r u c k )

(3)

Weitere Beispiele (Anmerkung: i und x sind vom Typ int):

1 if ( i == 0 )

2 p r i n t f ( " i ist n u l l \ n " ) ; 3

4 if ( i == 0 )

5 p r i n t f ( " i ist n u l l \ n " ) ;

6 e l s e p r i n t f ( " i ist n i c h t n u l l \ n " ) ; 7

8 if ( i == 0 && x < 3 ) 9 {

10 p r i n t f ( " i ist n u l l \ n " ) ;

11 p r i n t f ( " x ist k l e i n e r als 3\ n " ) ; 12 }

13 e l s e {

14 p r i n t f ( " e n t w e d e r ist i u n g l e i c h n u l l " ) ;

15 p r i n t f ( " o d e r x ist g r o e s s e r o d e r g l e i c h 3\ n " ) ;

16 }

17

18 if ( i == 0 && x < 3 ) 19 {

20 p r i n t f ( " i ist n u l l \ n " ) ; 21 if ( x >0)

22 {

23 p r i n t f ( " x ist e n t w e d e r 1 o d e r 2\ n " ) ;

24 }

25 e l s e {

26 p r i n t f ( " x ist n e g a t i v o d e r g l e i c h n u l l \ n " ) ;

27 }

28 }

29 e l s e {

30 p r i n t f ( " e n t w e d e r ist i u n g l e i c h n u l l " ) ;

31 p r i n t f ( " o d e r x ist g r o e s s e r o d e r g l e i c h 3\ n " ) ;

32 }

Aufgabe 3: Detailfragen zur Speicherorganisation

Wie kann man die Speicheradressen von Variablen und Funktionen ausgeben?

Variablen: printf( "%p", & name der variablen );

Funktionen: printf( "%p", & name der funktion );

(4)

Teil II: Quiz

Aufgabe 1: Phasen des Software Life Cycle

Wie heißen die einzelnen Phasen des Software Life Cycle und worauf zielen sie ab?

1. Phase

Name: Aufgabenstellung

Ziele: Erfassung des Problems, des Problemumfangs und der notwendigen Rand- bedingungen, vage Beschreibung des gew¨unschten Ergebnisses.

2. Phase

Name: Problemanalyse

Ziele: Konkretisierung aus Programmierersicht: welche Daten, wie wird verarbei- tet, welches Ergebnis, Bedienung, Reaktion auf Fehler, welche Testdaten?

3. Phase

Name: Entwurf

Ziele: Aufteilung komplexer Aufgabenstellungen in mehrere kleinere Komponen- ten. Wie werden Daten zwischen den Komponenten vermittelt?

4. Phase

Name: Implementierung

Ziele: Detaillierte Beschreibung der Algorithmen der einzelnen Module: Strukto- gramm/schrittweise Verfeinerung (kein C-Code).

5. Phase

Name: Kodierung

Ziele: Umsetzen der Implementierung in C-Code.

6. Phase

Name: Test

Ziele: Test aller Programmteile mit g¨ultigen und ung¨ultigen Daten, Fehlererken- nung und -behebung.

(5)

Teil III: Fehlersuche

Aufgabe 1: Syntaxfehler

Unser Programmiererteam, die Tri Angels haben in folgendes Programm je Zeile einen Fehler eingebaut. Finde, erkl¨are und korrigiere sie.

1 # i n c l u D e < s t d i o . h >

2 INT m a i n ( int argc , c h a r ** a r g v )

3 [

4 int i , j k , l ;

5 i = 1; j = 2; k = 3; l = 2:

6 if ( i == 1

7 p r i n t f ( " i ist 1\ n ) ;

8 if ( i == 1 &&& j == 3 )

9 p r i n t f ( " i ist 1 und j ist 3\ " ) ; 10 if ( k == 1 && [ j == 3 || l < 5) )

11 p r i n t ( " k ist 1 und j ist 3 o d e r l k l e i n e r 5\ n " ) ;

12 if ( i = > 2 * ( j + k ) * l || l == 2 )

13 p r i n t f " der k o m p l i z i e r t e a u s d r u c k ist w a h r \ n " ;

14 $ }

Zeile Fehler Erl¨auterung Korrektur

1 großes D C unterscheidet Groß/Kleinbuchstaben #include

. . . .

2 großes INT C unterscheidet Groß/Kleinbuchstaben int

. . . .

3 [ In C werden Bl¨ocke durch { und } gebildet {

. . . .

4 , fehlt Variablen m¨ussen mit Komma getrennt werden j, k

. . . .

5 : Abschluss einer Anweisung mittels ; l = 2;

. . . .

6 ) fehlt Die Bedingung muss mit einer runden Klammer enden if (i == 1)

. . . .

7 " fehlt Zeichenketten m¨ussen innerhalb von "..." stehen "i ... 1\n"

. . . .

8 &&& Das logische und besteht aus nur zwei &-Zeichen &&

. . . .

9 \" Der Zeilenumbruch heißt \n. Bei \" will der Compiler ein " ausgeben. Folgefehler: er erkennt das Ende der Zeichenkette nicht

j ist 3\n"

. . . .

10 [ Die einzelnen Ausdr¨ucke m¨ussen in() stehen (j == 3...)

. . . .

11 f fehlt Die Ausgabeanweisung heißt printf() printf

(6)

Zeile Fehler Erl¨auterung Korrektur 12 => Der Vergleich ≥ heißt in C >= i >= 2 ...

. . . .

13 () fehlen Die Argumente von printf m¨ussen in () stehen printf()

. . . .

14 $ zu viel Dort geh¨ort kein $-Zeichen hin } Programm mit Korrekturen:

1 # i n c l u d e < s t d i o . h >

2 int m a i n ( int argc , c h a r ** a r g v )

3 {

4 int i , j , k , l ;

5 i = 1; j = 2; k = 3; l = 2;

6 if ( i == 1 )

7 p r i n t f ( " i ist 1\ n " ) ;

8 if ( i == 1 && j == 3 )

9 p r i n t f ( " i ist 1 und j ist 3\ n " ) ; 10 if ( k == 1 && ( j == 3 || l < 5) )

11 p r i n t f ( " k ist 1 und j ist 3 o d e r l k l e i n e r 5\ n " ) ;

12 if ( i >= 2 * ( j + k ) * l || l == 2 )

13 p r i n t f ( " der k o m p l i z i e r t e a u s d r u c k ist w a h r \ n " ) ;

14 }

(7)

Teil IV: Anwendungen

Aufgabe 1: Vor¨ uberlegung: Klassen von Dreiecken

In der Mathematik werden Dreiecke, die durch die drei Seitena,bundcbeschrieben werden, in die folgenden f¨unf Klassen eingeteilt. Beschreibe jede Klasse mittels einer Formel (a, b und c) sowie mindestens einem Zahlenbeispiel.

1. Kein Dreieck: Die Dreiecksungleichung besagt, dass die Summe zweier Seiten immer echt gr¨oßer sein muss als die dritte Seite:

Die drei Seiten a,b,ck¨onnen kein Dreieck bilden, wenn folgende Aussage wahr ist:

a+b≤c oderb+c≤a odera+c≤b. Beispiel: a= 5, b = 1, c= 1

Umgekehrt bilden die drei Seiten a, b, c ein Dreieck, wenn folgende Aussage wahr ist:a+b > c und a+c > bund b+c > a

2. Gleichseitiges Dreieck:

Alle drei Seitena,b,c m¨ussen gleich lang sein:a=b und b =c.

Beispiel: a= 4, b = 4, c= 4 3. Gleichschenkliges Dreieck:

Zwei Seiten des Dreiecks m¨ussen gleich lang sein, folgende Aussage muss also wahr sein: a=b oder a=coderb =c

Beispiel: a= 6, b = 6, c= 3 4. Rechtwinkliges Dreieck:

Im rechtwinkligen Dreieck muss die Summe der Quadrate der beiden Seiten, die den rechten Winkel einschließen, genauso groß sein, wie das Quadrat der dritten Seite:

a2+b2 =c2 oderb2+c2 =a2 odera2 +c2 =b2 Beispiel: a= 3, b = 4, c= 5

5. Gew¨ohnliches Dreieck:

Jede Kombination der Seiten a, b, c, die gem¨aß Bedingung 1 ein Dreieck bilden, aber keine der Bedingungen 2 bis 4 erf¨ullen, bilden ein gew¨ohnliches Dreieck.

Beispiel: a= 3, b = 4, c= 6

(8)

Aufgabe 2: Entwicklung eines Dreiecksprogramms

In dieser Aufgabe geht es um die eigenst¨andige Entwicklung eines Programms zur Klassi- fikation von Dreiecken. Dabei sollt ihr alle Phasen des Software Life Cycle nacheinander durchlaufen (siehe auch Skriptkapitel 7), was durch die folgende Gliederung unterst¨utzt werden soll. Die Klassifikation der einzelnen Dreiecke kann gem¨aß Aufgabe 1 erfolgen.

Innerhalb dieser Aufgabe bezeichnen wir die drei Seiten des Dreiecks mit a, b und c.

1. Aufgabenstellung

Entwickle ein Programm, das drei Zahlen f¨ur die Seiten a, b und c einliest. Das Programm soll ¨uberpr¨ufen, ob es sich um ein Dreieck handelt und ggf. die zutreffenden Dreiecksklassen ausgeben.

Beispiel: Eingabe: 3, 4, 5Ausgabe: rechtwinkliges Dreieck

Das Programm soll auch erkennen, falls get¨atigte Eingaben unsinnig sind. Hierzu z¨ahlt beispielsweise die Eingabe negativer Seitenl¨angen.

Hinweis: Bei der Programmentwicklung kann davon ausgegangen werden, dass im- mer nur ganze Zahlen vorkommen, sodass der Datentypintverwendet werden kann.

2. Pflichtenheft

Aufgabe : Klassifikation von Dreiecken

Eingabe : drei Zahlen f¨ur die Seitena,b und c, Datentyp int Ausgabe : Die jeweilige(n) Klasse(n) des Dreiecks

Sonderf¨alle : Zahlenwerte ≤0 f¨ur eine oder mehrere Seiten

3. Testdaten

Testfall a b c Dreiecksklasse(n)

1 1 2 4 kein Dreieck

2 9 9 9 gleichseitig, gleichschenklig 3 4 4 6 gleichschenklig

4 4 3 3 gleichschenklig

5 3 4 5 rechtwinklig

(9)

4. Implementierung

Klassifikation von Dreiecken Variablen: Integer: a, b, c

Einlesen von Seite a, Einlesen von Seite b, Einlesen von Seite c wenn a > 0 und b > 0 und c > 0

dann wenn a+b > c und a+c > b und b+c > a

dann Ausgabe des Textes: regul¨ares Dreieck Test auf gleichseitiges Dreieck

Test auf gleichschenkliges Dreieck Test auf rechtwinkliges Dreieck sonst Ausgabe des Textes: kein Dreick

sonst Ausgabe des Textes: Mindestens eine Eingabe ist fehlerhaft Test auf gleichseitiges Dreieck

wenn a = b und b = c

dann Ausgabe des Textes: Gleichseitiges Dreieck Test auf gleichschenkliges Dreieck

wenn a = b oder b = c oder a = c

dann Ausgabe des Textes: Gleichschenkliges Dreieck Test auf rechtwinkliges Dreieck

wenn a2 + b2 = c2 oder b2 + c2 = a2 oder a2 + c2 = b2 dann Ausgabe des Textes: Rechtwinkliges Dreieck

Handsimulation:Trage in nachfolgender Tabelle ein, welche Ausdr¨ucke ausgewertet und welche Ausgaben get¨atigt werden.

Eingabe: 2 3 4

Ausdr¨ucke und Variablen Zuweisung Auswertung Ausgabe

Variable a: Wert: undef. 2

Variable b: Wert: undef. 3

Variable c: Wert: undef. 4

a>0 und b>0 und c>0 wahr regul¨ar

a=b und b=c falsch

a=b oder a=c oder b=c falsch

a2+b2=c2 oder b2+c2=a2 oder a2+c2=b2 falsch

(10)

5. Kodierung

Unsere Kodierung sieht wie folgt aus (teilweise etwas komprimiert):

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 // f u e r j e d e s e i t e e i n e v a r i a b l e n e b s t i n i t i a l i s i e r u n g

6 int a = -1 , b = -1 , c = -1;

7

8 // e i n g a b e a u f f o r d e r u n g und die s e i t e n e i n l e s e n

9 p r i n t f ( " B i t t e S e i t e a e i n g e b e n : " ) ; s c a n f ( " % d " ,& a ) ; 10 p r i n t f ( " B i t t e S e i t e b e i n g e b e n : " ) ; s c a n f ( " % d " ,& b ) ; 11 p r i n t f ( " B i t t e S e i t e c e i n g e b e n : " ) ; s c a n f ( " % d " ,& c ) ; 12

13 // d a m i t wir wissen , was vor s i c h g e h t

14 p r i n t f ( " \ n E i n g a b e : a =% d b =% d c =% d \ n \ n " , a , b , c ) ; 15

16 // p r u e f u n g auf k o r r e k t e e i n g a b e 17 if (( a > 0) && ( b > 0) && ( c > 0) )

18 {

19 // a l l e s OK ; e r s t e r t e s t : d r e i e c k o d e r k e i n e s 20 if (( a + b > c ) && ( a + c > b ) && ( b + c > a ) )

21 {

22 p r i n t f ( " a , b und c b i l d e n ein D r e i e c k \ n " ) ; 23

24 // z w e i t e r t e s t : g l e i c h s e i t i g e s d r e i e c k

25 if (( a == b ) && ( b == c ) )

26 p r i n t f ( " Das D r e i e c k ist g l e i c h s e i t i g \ n " ) ; 27

28 // d r i t t e r t e s t : g l e i c h s c h e n k l i g e s d r e i e c k

29 if (( a == b ) || ( b == c ) || ( a == c ) )

30 p r i n t f ( " Das D r e i e c k ist g l e i c h s c h e n k l i g \ n " ) ; 31

32 // v i e r t e r t e s t : r e c h t w i n k l i g e s d r e i e c k

33 if (( a * a + b * b == c * c ) || ( a * a + c * c == b * b )

34 || ( b * b + c * c == a * a ) )

35 p r i n t f ( " Das D r e i e c k ist r e c h t w i n k l i g \ n " ) ;

(11)

Handsimulation: Im Sinne eines effizienten Arbeitens ist es sehr lohnenswert, das auf Papier entwickelte C-Programmvor dem Eintippen mittels einer Handsimulation f¨ur einige ausgew¨ahlte Testdaten zu ¨uberpr¨ufen. Trage hierzu in nachfolgender Ta- belle (von oben nach unten) ein, welche Ausdr¨ucke ausgewertet und welche Ausgaben get¨atigt werden. Eine m¨ogliche Testeingabe lautet: 3, 4, 5.

Eingabe: 3, 4, 5

Zeile Variablen Aktion Resultat/Effekt

6 . . . . Definition int a,b,c Anlegen und Initialisieren

9 a=-1 b=-1 c=-1 scanf( "%d", & a ) Eingabe 3: a=3 10 a= 3 b=-1 c=-1 scanf( "%d", & a ) Eingabe 4: b=4 11 a= 3 b= 4 c=-1 scanf( "%d", & a ) Eingabe 5: c=5

14 a= 3 b= 4 c= 5 printf(...) Ausgabe: a=3 b=4 c=5

17 . . . . a>0 && b>0 && c>0 wahr

20 . . . . a+b>c && a+c>b && b+c>a wahr

22 . . . . printf(...) Ausgabe: ein Dreieck

25 . . . . a==b && b==c falsch

29 . . . . a==b || a==c || b==c falsch

33 . . . . a*a + b*b == c*c || ... wahr

35 . . . . printf(...) Ausgabe: rechtwinklig

42 . . . . return 0 Programmende

6. Speicherorganisation

Um ein besseres Gef¨uhl f¨ur die internen Dinge eines C-Programms zu bekommen, sollt ihr diesmal auch eine

”Speicherkarte“ erstellen, deren Eintr¨age ¨ublicherweise abstei- gend sortiert sind (die großen Adressen oben, die kleinen unten). F¨ur alle Variablen und Funktionen sind jeweils ihre Namen und Adressen einzutragen. Bei Variablen ist ferner anzugeben, wie viele Bytes sie im Arbeitsspeicher belegen. Hinweise findet ihr in der ersten Programmieraufgabe aus Aufgabenblatt 3 sowie in Kapitel 8 des Skriptes. Verwende folgende Tabelle, in der bereits zwei Beispiele (fast vollst¨andig) eingetragen sind:

Adresse Name Typ Gr¨oße

0x00401BE4 printf Funktion 0x00401BDC scanf Funktion 0x00401418 main Funktion

0x0028FF1C a Variable: int 4 Bytes 0x0028FF18 b Variable: int 4 Bytes 0x0028FF14 c Variable: int 4 Bytes

(12)

Der zugeh¨orige Teil des C-Programms sieht wie folgt aus, den wir beispielsweise hinter Programmzeile 7 oder Zeile 40 einf¨ugen k¨onnen:

// s p e i c h e r s e g m e n t e a u s g e b e n // z u e r s t die f u n k t i o n e n

p r i n t f ( " A d r e s s e n der F u n k t i o n e n :\ n " ) ; p r i n t f ( " \ t m a i n : \ t % p \ n " , m a i n ) ;

p r i n t f ( " \ t p r i n t f : \ t % p \ n " , p r i n t f ) ; p r i n t f ( " \ t s c a n f : \ t % p \ n " , s c a n f ) ; // und j e t z t n o c h die v a r i a b l e n

p r i n t f ( " A d r e s s e n und G r o e s s e n der V a r i a b l e n :\ n " ) ; p r i n t f ( " \ ta : % p % d B y t e s \ n " , & a , s i z e o f ( a ) ) ; p r i n t f ( " \ tb : % p % d B y t e s \ n " , & b , s i z e o f ( b ) ) ; p r i n t f ( " \ tc : % p % d B y t e s \ n " , & c , s i z e o f ( c ) ) ;

Referenzen

ÄHNLICHE DOKUMENTE

 bauxite

Country-level means of performance and standard deviations from the FIMS data collected in 1964 - at teen age for the cohort group considered - are presented in Table 1a. As shown

Dabei sollt ihr alle Phasen des Software Life Cycle nacheinander durchlaufen (siehe auch Skriptkapitel 7), was durch die folgende Gliederung unterst¨ utzt werden soll..

Nehmen wir nun an, dass unser Programm zwei unterschiedliche Schwellwertfunktionen sowie eine cos-Funktion ben¨ otigt. Eine sehr einfache Implementierung w¨ urde beispielsweise je

Durch /* ist der hintere Teil kein Kommentar, da man Kommentare so nicht schachteln kann.

Unlike industrial products, whose quality can be easily defined through a series of mechanical, physical or chemical properties, the quality of food products

• der Server eines WCMS enthält das Content Repository, verwaltet den Workflow, sowie das Rechtekonzept und bietet Schnittstellen nach außen. • es entstehen große Lasten auf

Die abschließende Freigabe (Release) für den Einsatz in der Produktion und die ständige Wartung (Maintenance) der Software sind zwei wesentliche Schritte, die bei der