Moeki Geschrieben 7. November 2004 Teilen Geschrieben 7. November 2004 Also unsere Aufgabe ist es, Woche für Woche mit anderen Programmiersprachen die Wurzelberechnung "k-te Wurzel von r" zu berechnen. Grundlage ist der Quellcode für die Quadratwurzelberechnung. Diese Woche ist LISP dran :beagolisc , die Sprache der unendlichen Klammern. Vorher Fortran und C+, was kein Problem war. programm_sqrt.lsp ; Naeherungsloesung der Quadratwurzel ; (Nullstellenbestimmung mit dem Newton-Verfahren) ; Der Radikand wird vom Benutzer erfragt. ; ; Vorgegebenes Programm in Sprache LISP zur 3. Uebung (DEFUN program_sqrt () ;Funktionsdefinition (PROGN ;Prozedurrumpf:Sequenz (DEFUN quadratwurzel (radikand) ;Funktionsdefinition (COND ;Prozedurrumpf:Fallunterscheidung ((< radikand 0.00001) "ohne Ergebnis abgebrochen") ;Ausnahmefall ( T (DO ( ;Normallfall:Wiederholung:Zustandsblock (naeh1 1.0 naeh2) ;Komponente naeh1 (naeh2 (/ (+ 1.0 radikand) 2) ;Komponente naeh2 (/ (+ (EXPT naeh2 2) radikand) (* 2 naeh2)) )) ;Folgewert ((< (* 10000.0 (ABS (- naeh2 naeh1)) ) naeh2) ;Ausstiegsblock:Abbruchbedingung naeh2) )))) ;Ergebnis+Leerer Rumpf (PRINT "Bitte Radikand als Liste eingeben: ®= ") ;Eingabeaufforderung (SETQ kr (CONS 2 (READ))) ;Listenaufbau(Grad Radikand) (SETQ k (CAR kr)) ;Grad-Extraktion (SETQ r (CADR kr)) ;Radikand-Extraktion (SETQ ergebnis (CONS (FLOAT (quadratwurzel r)) NIL)) ;Listenaufbau(Ergebnis) (PRINT "Wurzelgrad k Radikand r k-te Wurzel aus r") ;Ausgabeerklärung (CONS 2 (CONS r ergebnis)) )) ;Listenaufbau und -ausgabe Dabei ist zu beachten, dass das Programm ursprünglich schon für die k-te Wurzel ausgelegt wurde, sieht man an einigen Ausdrücken. Hier mal die konkrete Aufgabenstellung: Mit dem gegebenen LISP-Programm ist in gleicher Weise zu verfahren wie mit dem C-Programm der zweiten Übung. Das heißt, der Programmtext ist so abzuändern, (1) dass anstelle der Quadratwurzel die k-te Wurzel berechnet wird, und (2) dass die Folge der numerierten Näherungswerte ausgegeben wird. Im Unterschied zur Sprache C gibt es in LISP eine Funktion zum Potenzieren von Zahlen mit ganzzahligen Exponenten: Die Auswertung des Ausdrucks (EXPT b e) liefert das Ergebnis be . Und hier das gleiche Konzept schon fertig für C+. /********************************************************************/ /* */ /* Naeherungsloesung der Quadratwurzel */ /* (Nullstellenbestimmung mit dem Newton-Verfahren) */ /* Der Radikand wird vom Benutzer erfragt. */ /* */ /* Vorgegebenes Programm in Sprache C fuer die 2. Uebung */ /* */ /* X & Y */ /********************************************************************/ #include <stdio.h> #include <math.h> #include <stdlib.h> int main() { /* Beginn des Vereinbarungsteils */ int grad, i,j, imax=100; double radikand, naeh1, naeh2, maxdist=1.0e+4, rmin=1.0e-4; /* Ende des Vereinbarungsteils */ /* Beginn des Eingabeteils */ printf("Radikand = "); scanf("%lf", &radikand); printf("Wurzelgrad = "); scanf("%d", &grad); /* Ende des Eingabeteils */ if (radikand < rmin) /* Beginn der Ausnahmebehandlung */ printf("ohne Ergebnis abgebrochen"); /* Ende der Ausnahmebehandlung */ else /* Beginn des Berechnungsteils */ { naeh1 = 1.0; naeh2 = ((grad-1)*naeh1 + radikand)/(grad*naeh1); i = 1; while((fabs(naeh2-naeh1)*maxdist > naeh2) && (i<imax)) { printf("%d : %f\n", i, naeh1); naeh1 = naeh2; j=1; while(j < (grad-1)) { naeh2 = naeh2 * naeh1; j = j + 1; } naeh2 = ((grad-1)*naeh1*naeh2 + radikand)/(grad*naeh2); i = i+1; }; printf("%d-te Wurzel aus %f = ", grad, radikand); printf("%f\n", naeh2); }/* Ende des Berechnungsteils */ return 0; } /* end of main */ Habt ihr eventuell nen Ansatz? Danke, Moeki. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Moeki Geschrieben 7. November 2004 Autor Teilen Geschrieben 7. November 2004 google hilft :-) (DEFUN program_k-root() ;Funktionsdefinition (PROGN ;Prozedurrumpf:Sequenz (DEFUN wurzel (radikand grad) ;Funktionsdefinition (COND ;Prozedurrumpf:Fallunterscheidung ((< radikand 0.00001) "ohne Ergebnis abgebrochen") ;Ausnahmefall ((< grad 1) "Grad kleiner als 1") ;Ausnahmefall für grad < 1 ( T (DO ( ;Normallfall:Wiederholung:Zustandsblock (naeh1 1.0 (PRINT naeh2)) ;Komponente naeh1 (naeh2 (/ (+ 1.0 radikand) 2) ;Komponente naeh2 (/ (+ (* (EXPT naeh2 grad) (- grad 1)) radikand) ;Folgewert (* grad (EXPT naeh2 (- grad 1))) ) ) ) ((< (* 10000.0 (ABS (- naeh2 naeh1)) ) naeh2) ;Ausstiegsblock:Abbruchbedingung naeh2) ;Ergebnis+Leerer Rumpf )))) (PRINT "Bitte Grad und Radikand als Liste eingeben: (k r)= ") ;Eingabeaufforderung (SETQ kr (READ)) ;Listenaufbau(Grad Radikand) (SETQ k (CAR kr)) ;Grad-Extraktion (SETQ r (CADR kr)) ;Radikand-Extraktion (PRINT "Näherungslösung:") (SETQ ergebnis (CONS (FLOAT (wurzel r k)) NIL)) ;Listenaufbau(Ergebnis) (PRINT "Wurzelgrad k Radikand r k-te Wurzel aus r") ;Ausgabeerklärung (CONS k (CONS r ergebnis)) )) ;Listenaufbau und -ausgabe Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
saiboT-R Geschrieben 14. November 2004 Teilen Geschrieben 14. November 2004 @moeki sich selbst antworten ist auch ne Möglichkeit die Aufgabe zu lösen?! :confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.