{"action":"created","issue":{"url":"https://api.github.com/repos/philsupertramp/Programmieren1B/issues/1","labels_url":"https://api.github.com/repos/philsupertramp/Programmieren1B/issues/1/labels{/name}","comments_url":"https://api.github.com/repos/philsupertramp/Programmieren1B/issues/1/comments","events_url":"https://api.github.com/repos/philsupertramp/Programmieren1B/issues/1/events","html_url":"https://github.com/philsupertramp/Programmieren1B/pull/1","id":120666437,"number":1,"title":"Die Vorlage zur Projektaufgabe 4","user":{"login":"philsupertramp","id":9550040,"avatar_url":"https://avatars.githubusercontent.com/u/9550040?v=3","gravatar_id":"","url":"https://api.github.com/users/philsupertramp","html_url":"https://github.com/philsupertramp","followers_url":"https://api.github.com/users/philsupertramp/followers","following_url":"https://api.github.com/users/philsupertramp/following{/other_user}","gists_url":"https://api.github.com/users/philsupertramp/gists{/gist_id}","starred_url":"https://api.github.com/users/philsupertramp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/philsupertramp/subscriptions","organizations_url":"https://api.github.com/users/philsupertramp/orgs","repos_url":"https://api.github.com/users/philsupertramp/repos","events_url":"https://api.github.com/users/philsupertramp/events{/privacy}","received_events_url":"https://api.github.com/users/philsupertramp/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":0,"created_at":"2015-12-06T22:46:07Z","updated_at":"2015-12-08T00:27:27Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/philsupertramp/Programmieren1B/pulls/1","html_url":"https://github.com/philsupertramp/Programmieren1B/pull/1","diff_url":"https://github.com/philsupertramp/Programmieren1B/pull/1.diff","patch_url":"https://github.com/philsupertramp/Programmieren1B/pull/1.patch"},"body":"Die Aufgabe\r\nIn dieser Aufgabe geht es um die Themen\r\nmehrfache Fallunterscheidung, die primitiven\r\nDatentypen und symbolische Konstanten.\r\nSchreiben Sie ein kleines Rechenprogramm\r\nfur die Shell. Es fragt den Benutzer ¨\r\nnach einer einfachen Tastatureingabe der\r\nForm\r\nx op y = _\r\nDamit sind gemeint: x und y sind beliebige\r\nreelle Zahlen und op ist eine Rechenoperation,\r\nsymbolisiert durch ein einzelnes\r\nZeichen. Das Programm pruft die Berechen- ¨\r\nbarkeit des Ausdrucks und gibt ggf. das Ergebnis\r\nin einer neuen Zeile auf cout aus.\r\nBeispiel-Dialog: →\r\nLaden Sie die Vorlagedatei rechner.cpp von Moodle in ein neues Projekt namens PA4 oder\r\nrechner in Ihrer Projektmappe Prog1b. Dort sind einige Rechenfunktionen und die main()-Funktion\r\nbereits angelegt. Sie brauchen keine weiteren Funktionen zu schreiben. In main() stehen Punkte ‘...’,\r\nwo Text von Ihnen hin kommen soll.\r\nSchreiben Sie zuerst den Ein-/Ausgabedialog in der Endlosschleife, sonst kann die switch-Anweisung\r\nnicht arbeiten. Dort soll dem Benutzer der obige Prompt angeboten und seine Eingabe nach Drucken ¨\r\nder Enter-Taste auswertet werden. Die Schleife und damit das ganze Programm soll abbrechen, wenn\r\nbeide Operanden x, y den Wert Null haben oder der Operator op eine Ziffer 0, . . . , 9 ist. Sie\r\ndurfen in dieser Aufgabe davon ausgehen, dass die gemachten Eingaben auf diese Vorgabe passen, d.h. ¨\r\nx, y sind Gleitkommaliterale und op ist ein einzelnes Zeichen. Sie brauchen evtl. Fehleingaben des\r\nBenutzers nicht abzufangen.\r\nSchreiben Sie dann zur Behandlung der Eingabe die switch-Anweisung in der Vorlage zu Ende\r\n(Anleitung folgt, s.u.). Setzen Sie die case-Marken als symbolische Konstanten mit sprechenden Namen\r\num. Der sinnvolle Platz dafur oberhalb von ¨ main() ist schon markiert. Entspricht der eingegebene\r\nOperator keinem der vorgesehenen, so soll ein Hinweis auf cerr ausgegeben werden, siehe BeispielDialog.\r\nDie Schleife soll aber nicht abbrechen.\r\n1\r\nAchtung: alle Ausgaben auf cout oder cerr werden ausschließlich in main() gemacht! Die\r\nRechenfunktionen rechnen grunds¨atzlich nur, damit die Ausgabestellen im Programm uberschaubar ¨\r\nbleiben.\r\nLevel 1: die Grundrechenarten\r\nFolgende Rechenoperationen soll Ihr Shell-Rechner beherrschen:\r\n• + Addition\r\n• - Subtraktion\r\n• * Multiplikation\r\n• / Division.\r\nFalls der Nenner Null ist, soll die Rechnung vermieden und stattdessen eine passende Fehlermeldung\r\nauf cerr ausgegeben werden.\r\n(Tipp: Sie k¨onnen eine Rechenoperation direkt in eine cout-Anweisung schreiben. Es ist keine Zwischenvariable\r\nn¨otig.)\r\nLevel 2: Modulo\r\nSchreiben Sie die in der Vorlage angelegte Testfunktion\r\n// ist x eine nat¨urliche Zahl?\r\nbool istNatuerlich ( double x )\r\nSie gibt true zuruck, wenn ihr Parameterwert ¨ x echt positiv ist und keine Nachkommastellen besitzt,\r\nsonst false. Wie k¨onnen Sie das im Programm geeignet testen?\r\nHinweis: denken Sie daran, dass x auch groß sein kann. Ihre Funktion muss nicht bis 10308 korrekt\r\nrechnen, soll es aber schon bis ca. 1019 tun.\r\nSchreiben Sie den Operator % , der die reelle\r\nModulo-Funktion bedeuten soll:\r\nx mod y := x−\r\n\u0016\r\nx\r\ny\r\n\u0017\r\n·y fur ¨ x, y ∈ R, y 6= 0 .\r\nFalls y == 0 ist, soll die Rechnung vermieden\r\nund stattdessen eine passende Fehlermeldung\r\nauf cerr ausgegeben werden.\r\nBeispiel-Dialog: →\r\nSchreiben Sie die angelegte Funktion\r\n// reelle Modulofunktion\r\ndouble mod ( double x, double y ) .\r\nAchten Sie darauf, dass die Abrundung auch bei verschiedenen Vorzeichen der Operanden korrekt\r\nfunktioniert (siehe Skript 3.7.2 und Aufgabe 13.1).\r\n2\r\nHinweis: der Operator ‘%’ im Quelltext funktioniert fur den Typ ¨ double nicht. Deshalb diese Funktion.\r\nVerwenden Sie fur die Abrundung nicht die Funktion ¨ floor(), zu der Ihnen das Internet r¨at! Akzeptieren Sie\r\nals Anf¨anger/innen keine unverstandenen ”\r\nL¨osungen“, die Ihnen dann wegen unbekannter Seiteneffekte auf die\r\nFuße fallen. Bitte verwenden Sie f ¨ ur korrekte Rundung unsere Mittel aus Skript und Aufgaben. ¨\r\nLevel 3: gr¨oßter gemeinsamer Teiler\r\nSchreiben Sie die Operatoren g und G , die (beide) den gr¨oßten gemeinsamen Teiler ggT(x, y)\r\nbedeuten sollen. Diese Funktion kann nur mit naturlichen Inputs umgehen. ¨\r\nPrufen Sie dazu in der Fallbehandlung in ¨ main() (nicht in der Funktion, das ist zu sp¨at!), ob x\r\nund y naturliche Zahlen sind. Falls nein, soll die Rechnung vermieden und stattdessen eine passende ¨\r\nFehlermeldung auf cerr ausgegeben werden.\r\nBeispiel-Dialog:\r\nSchreiben Sie die folgende in der Vorlagedatei angelegte Funktion:\r\n// gr¨oßter gemeinsamer Teiler\r\nlong long ggT ( long long m, long long n ) .\r\nSie kann z.B. den im nebenstehenden\r\nAblaufdiagramm gezeigten\r\nAlgorithmus zur Berechnung\r\nvon ggT(x, y) umsetzen: →\r\nFalls Sie einen schnelleren Algorithmus\r\nkennen, durfen Sie ihn statt- ¨\r\ndessen einsetzen. Bitte geben Sie\r\ndann unbedingt im Kommentar Ihre\r\nQuelle an, z.B. das Buch (Autor/Titel/Seite),\r\nbei Internet den\r\nURL mit Aufrufdatum. Sonst werde\r\nich ihn nicht akzeptieren. n = n − m\r\nOutput: m\r\nja\r\nm > n ?\r\nnein\r\nnein\r\nja\r\nm == n ?\r\nInput: m, n ∈ N\r\nm = m − n\r\nLevel 4: Binomialkoeffizienten\r\nSchreiben Sie die Operatoren b und B , die (beide) den Binomialkoeffizienten\r\nx\r\ny\r\n\u0001\r\nbedeuten sollen.\r\nDiese Funktion kann nur mit naturlichen Inputs ¨ x ≥ y umgehen. Prufen Sie dazu in der Fallbehand- ¨\r\nlung in main(), ob x und y naturliche Zahlen sind und die richtige Gr ¨ ¨oßenbeziehung besteht. Falls\r\n3\r\nnein, soll die Rechnung vermieden und stattdessen eine passende Fehlermeldung auf cerr ausgegeben\r\nwerden.\r\nBeispiel-Dialog:\r\nDie folgenden beiden iterativen Vorschriften berechnen den Binomialkoeffizienten:\r\n\u0012\r\nn\r\n0\r\n\u0013\r\n:= 1 \u0012\r\nn\r\nk\r\n\u0013\r\n:=\r\nn\r\nk\r\n\u0012\r\nn − 1\r\nk − 1\r\n\u0013\r\nfur 1 ¨ ≤ k ≤ n\r\n\u0012\r\nn\r\n0\r\n\u0013\r\n:= 1 \u0012\r\nn\r\nk\r\n\u0013\r\n:=\r\nn − k + 1\r\nk\r\n\u0012\r\nn\r\nk − 1\r\n\u0013\r\nfur 1 ¨ ≤ k ≤ n .\r\n(Probieren Sie zum Verst¨andnis diese Vorschriften ruhig einmal schriftlich aus fur ¨\r\n\r\n6\r\n4\r\n\u0001\r\n= 15.)\r\nSchreiben Sie die folgende in der Vorlagedatei angelegte Funktion. Setzen Sie darin eine der beiden\r\nVorschriften Ihrer Wahl durch eine iterative Schleife (keine Selbstaufrufe) um1\r\n:\r\n// Binomialkoeffizient \"n ¨uber k\"\r\nlong long binom ( int n, int k ) .\r\nBeschreiben Sie im Kommentartext uber dem Funktionskopf Ihre ¨ Uberlegungen zur Umsetzung der ge- ¨\r\nw¨ahlten Vorschrift. Wenn Sie hier nichts Nachvollziehbares schreiben, bewerte ich diesen Aufgabenteil\r\nnicht.\r\nAnmerkung. Naturlich ist in der Praxis ab einer gewissen Gr ¨ ¨oße von n, k ein Ringuberlauf der internen ¨\r\nVariablen unvermeidlich. Achten Sie aber in der Umsetzung darauf, dass die folgenden Werte noch\r\nkorrekt berechnet werden:\r\n\u0012\r\n66\r\n23\u0013\r\n= 348524321356411200 \u0012\r\n72\r\n20\u0013\r\n= 312049055023946856 .\r\nDabei helfen Ihnen die Aufgaben 15.3 und 15.4.\r\nHinweis: ich weiß, dass im Internet fertiger Code steht. Widerstehen Sie der Versuchung und entwickeln Sie die\r\nFunktion binom() selbst aus einem der obigen Rechenverfahren! Nur dann verstehen Sie ihn und lernen etwas.\r\n(Optional, kleine Herausforderung. ; –)\r\nVerbessern Sie Ihre Funktion binom() weiter, sodass auch folgende Werte noch korrekt ohne Uberlauf ¨\r\nberechnet werden:\r\n\u0012\r\n66\r\n33\u0013\r\n= 7219428434016265740 \u0012\r\n72\r\n24\u0013\r\n= 7950261662089028100 .\r\n1Selbstaufrufe, sog. Rekursion, ist in C++ zwar m¨oglich. Dazu brauchen wir aber weitere Kenntnisse → deshalb sp¨ater.\r\n4\r\nHinweise: ¨andern Sie dazu nicht den Datentyp in double, denn dadurch verlieren Sie erheblich an\r\nGenauigkeit. Bleiben Sie bei long long und uberlegen Sie ¨ algorithmisch. Die Verbesserung ist durch\r\nreines Nachdenken uber die Zwischenergebnisse zu erreichen. Zwei kleine Rechentricks k ¨ ¨onnen helfen.\r\nKommen Sie drauf?"},"comment":{"url":"https://api.github.com/repos/philsupertramp/Programmieren1B/issues/comments/162714526","html_url":"https://github.com/philsupertramp/Programmieren1B/pull/1#issuecomment-162714526","issue_url":"https://api.github.com/repos/philsupertramp/Programmieren1B/issues/1","id":162714526,"user":{"login":"philsupertramp","id":9550040,"avatar_url":"https://avatars.githubusercontent.com/u/9550040?v=3","gravatar_id":"","url":"https://api.github.com/users/philsupertramp","html_url":"https://github.com/philsupertramp","followers_url":"https://api.github.com/users/philsupertramp/followers","following_url":"https://api.github.com/users/philsupertramp/following{/other_user}","gists_url":"https://api.github.com/users/philsupertramp/gists{/gist_id}","starred_url":"https://api.github.com/users/philsupertramp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/philsupertramp/subscriptions","organizations_url":"https://api.github.com/users/philsupertramp/orgs","repos_url":"https://api.github.com/users/philsupertramp/repos","events_url":"https://api.github.com/users/philsupertramp/events{/privacy}","received_events_url":"https://api.github.com/users/philsupertramp/received_events","type":"User","site_admin":false},"created_at":"2015-12-08T00:27:27Z","updated_at":"2015-12-08T00:27:27Z","body":"Datei wäre als .pdf wesentlich besser angelegt.\r\n[projekt4.pdf](https://github.com/philsupertramp/Programmieren1B/files/54770/projekt4.pdf)\r\n"}}