Programmieren 6
Aufgabe 13: Oberfläche und Volumen eines Parallelflachs

Es sollen die Oberfläche und das Volumen eines Parallelflachs (auch Parallelepiped oder Spat genannt) berechnet werden. Dabei werden folgende Begriffe verwendet:
Es bedeuten , und sowohl Ortsvektoren als auch Punkte im 3-dimensionalen Raum.
Das Skalarprodukt a · b (Punktprodukt, inneres Produkt) zweier Vektoren a und b:
Die Länge eines Vektors a ist .
Das Vektorprodukt a × b (Kreuzprodukt) zweier Vektoren ergibt wieder einen Vektor,der definiert ist durch
- Der Flächeninhalt eines durch die Vektoren a und b aufgespannten Parallelogramms: .
- Die Oberfläche eines durch die Vektoren a, b, c aufgespannten Parallelflachs:.
- Das Volumen eines durch die Vektoren a, b, c aufgespannten Parallelflachs – als Betrag des Skalarprodukts des Kreuzprodukts und dem Vektor c:.
Schreiben Sie ein Fortran 95–Modul, in dem Sie für jede der oben aufgeführten mathemati- schen Definitionen eine Funktion implementieren.
Überlegen Sie sich, für welche Funktionen man mit Hilfe selbstdefinierter Operatoren die Notation mathematik-ähnlicher machen kann und verwenden Sie hierfür Interface-Blöcke.
Schreiben Sie ein Fortran 95–Hauptprogramm, das unter Benutzung dieses Moduls in einer Schleife wiederholt jeweils 3 dreidimensionale Vektoren einliest, überprüft, ob einer der ein- gegebenen Vektoren der Nullvektor ist (was zum Verlassen der Schleife führen soll) und wenn nicht die Oberfläche und das Volumen des durch diese Vektoren aufgespannten Parallelflachs berechnet und kommentiert ausgibt.
Bemerkung zu Arrays:
In den meisten Anwendungen mit Feldern/Arrays werden wir Felder benötigen, deren Größe zum Zeitpunkt des Programmierens und Compilierens nicht festgelegt werden soll oder kann (sogenannte dynamic arrays, z.B. mit ALLOCATABLE-Attribut). In der vorliegenden Auf- gabenstellung können die Indexgrenzen der eindimensionalen Felder statisch im Programm festgelegt werden, da es sich um Vektoren im 3-dimensionalen Raum handelt.
Aufgabe 14: Magische Quadrate
Eine Matrix A heißt „magisches Quadrat“, wenn jede der Zahlen genau einmal auftritt und es eine Zahl gibt mit den Eigenschaften:
- Die Summe der Zahlen in jeder Spalte ist S.
- Die Summe der Zahlen in jeder Zeile ist S.
- Die Summe der Zahlen in jeder der beiden Diagonalen (mit n Elementen) ist S.
Da sich die Summe der Zahlen zu ergibt, muss sein.
Beispiel:
Ein magisches Quadrat ungerader Ordnung mit kann wie folgt gebildet werden:
Sei anfangs die Matrix A mit Nullen besetzt; trage 1 in a1m ein; trage jeweils diagonal nach links oben laufend ein. Bei Erreichen des Randes der Matrix oder eines bereits besetzten Feldelements ist wie folgt fortzufahren:
Sei das zuletzt besetzte Feld der Matrix:
(1) i=1,j=1: Schreibeweiterin
(2) i=1,: Schreibe weiter in
(3) ,j = 1 :Schreibe weiter in
(4) , :Schreibe weiter in
Schreiben Sie ein Fortran 95-Programm, das magische Quadrate ungerader Ordnung n nach diesem Algorithmus generiert und sodann testet.
Hierzu ist in einer Schleife die Dimension n von der Tastatur einzulesen (falls n gerade ist, soll erneut zur Eingabe einer ungeraden Dimension n aufgefordert werden), das dynamische Feld A im Speicher als Matrix anzulegen und mit Null zu initialisieren, das magische Quadrat wie oben beschrieben zu generieren und übersichtlich auszugeben und sodann auf seine magische Eigenschaft zu testen, indem alle Zeilen-, Spalten- und Diagonalsummen be-rechnet und verglichen werden sowie die gefundene Summe S und (zum Vergleich) der Wert kommentiert ausgegeben werden. Die Schleife soll so lange wiederholt werden,bis ein eingegeben wird.
Aufgabe 15: Boothroyd/Dekker-Matrizen
Die Elemente einer Boothroyd/Dekker-Matrix sind ganze Zahlen, die durch
gegeben sind. Dabei bezeichnet den Binomialkoeffizienten „n über k“ mit
Schreiben Sie ein Fortran 95–Modul, in dem Sie
a) einen binären Operator .ueber. definieren, der mittels einer ganzzahligen Funktion den Binomialkoeffizienten gemäß folgender Vorschrift berechnet:
(Es gilt dann ).
b) eine Funktion mit einem ganzzahligen Argument n und einem optionalen, logischen Argument inv bereitstellen, die, falls inv nicht angegeben oder falsch ist, unter Be-nutzung des Operators .ueber. die Boothroyd/Dekker-Matrix B und sonst ihre Inverse D liefert. Die Inverse einer Boothroyd/Dekker-Matrix hat diesel-be Gestalt wie diese, und ihre Elemente ergeben sich, indem man die Elemente der Boothroyd/Dekker-Matrix schachbrettartig mit einem negativen Vorzeichen versieht:
Schreiben Sie ein Fortran 95–Hauptprogramm, das in einer Schleife die Dimension (d.h.die Zeilenzahl) n einer Boothroyd/Dekker-Matrix einliest und, falls , Speicherplatz für die benötigten dynamischen Felder reserviert (und später wieder freigibt), die jeweili-ge Boothroyd/Dekker-Matrix sowie ihre Inverse generiert, die beiden generierten Matrizen mittels MATMUL multipliziert und sodann die Boothroyd/Dekker-Matrix und die berechnete Produktmatrix zeilenweise auf dem Bildschirm ausgibt.
Ergibt sich als Produkt tatsächlich die Einheitsmatrix? Im Fall soll die Schleife verlas-sen und das Programm beendet werden.
Hinweis: Wenn bei der Berechnung der Binomialkoeffizienten und der Matrixelemente bzw. in der angegebenen Reihenfolge jeweils zuerst multipliziert und dann dividiert wird, bleiben alle Zwischenergebnisse ganzzahlig und möglichst klein! Verwenden Sie für die Matrixelemente und alle Berechnungen 64-bit INTEGER, um die mit schnell wachsenden Elemente für größere n berechnen zu können.
Aufgabe F4: Rekursive Funktion
Gesucht ist die Anzahl aller nichtnegativer, ganzer, M-stelliger Dezimalzahlen mit der Quer- summe Q. Wie üblich wird die Quersumme als Summe der Ziffern in der Dezimaldarstellung der Zahl berechnet. Die Zahlen dürfen durchaus führende Nullen haben.
a) Konzipieren Sie zunächst eine Rekursionsbeziehung für die gesuchte Anzahl, indem Sie den Fall M-stelliger Dezimalzahlen auf den Fall (M-1)-stelliger Dezimalzahlen zu- rückführen und geeignete Abbruchbedingungen festlegen. Betrachten Sie hierbei alle Möglichkeiten, die führende Ziffer zu wählen, und berechnen Sie jeweils die Anzahl (M-1)-stelliger Dezimalzahlen mit einer entsprechend verringerten Quersumme.
b) Schreiben Sie in einem Fortran 95–Modul eine rekursive Funktion ANZ(M,Q), die für eine positive ganze Zahl M und eine nichtnegative ganze Zahl Q die Anzahl aller nichtnega-tiver, ganzer, M-stelliger Dezimalzahlen mit der Quersumme Q berechnet. Beachten Sie,dass die Quersumme Q einer M-stelligen Dezimalzahl stets die Bedingung erfüllt, weshalb, sobald in der rekursiven Aufruffolge eine Quersumme oder verlangt wird, keine weiteren rekursiven Aufrufe stattfinden dürfen und der aktuelle Funktionsaufruf null liefern muss.
c) Schreiben Sie zum Testen ein Fortran 95–Hauptprogramm, in dem in einer Schleife wiederholt zur Eingabe von Zahlen M und Q aufgefordert wird, diese von der Tastatur eingelesen werden und der mittels ANZ(M,Q) berechnete Wert kommentiert auf dem Bildschirm ausgegeben wird. Die Schleife soll durch eine Eingabe, die eine der Bedin-gungen oder verletzt, beendet werden.
d) Freiwillige Zusatzaufgabe: Verallgemeinern Sie das Problem für Zahldarstellungen in einer beliebig wählbaren ganzzahligen Basis .
Aufgabe F5: Zahlentheoretisches Computerexperiment
Eine Folge natürlicher Zahlen sei, ausgehend von einem Startwert , für durch die folgende Vorschrift definiert:
ist die Summe der dritten Potenzen der Dezimalziffern von .
Beispiel:
Diese Folgen werden für jeden beliebigen Startwert zyklisch (warum?). In Abhängig-keit von können verschiedene Zyklen entstehen (Fixpunkte sind Zyklen der Länge 1).
Schreiben Sie zunächst ein Fortran 95-Programm, das für alle „sinnvollen“ Startwerte (be-stimmen Sie theoretisch eine möglichst kleine Oberschranke!) den erzeugten Zyklus/Fixpunkt liefert. Versuchen Sie, auf der Basis dieses ersten Experiments Regelmäßigkeiten zu erkennen,und modifizieren Sie das Programm so, dass es die beobachtete Einteilung der Startwerte in Klassen entsprechend der Zyklen/Fixpunkte, die sie erzeugen, möglichst effizient berücksich-tigt. Geben Sie insbesondere die Menge aller möglichen Zyklen/Fixpunkte an, die überhaupt auftreten können. Inwieweit können Sie für einen gegebenen Startwert den erzeugten Zy-klus/Fixpunkt ohne Berechnung der Folgenglieder vorhersagen?
Welcher Startwert oder welche Startwerte kleiner 10000 erzeugt bzw. erzeugen die längste Folge von Zahlen, bevor ein Zyklus erreicht wird?
**Hinweise:**Weil die Folgenglieder bei großen Startwerten zunächst rapide kleiner werden,genügt es sicher, nur Startwerte kleiner 10000 zu untersuchen, man kann aber eine wesentlich kleinere obere Schranke für „sinnvolle“ Startwerte finden.Man darf davon ausgehen, dass kein Zyklus mehr als 20 Glieder enthält.
公众号:AI悦创【二维码】

AI悦创·编程一对一
AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh
C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh
方法一:QQ
方法二:微信:Jiabcdefh
