Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Funktionen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Funktionen (972 mal gelesen)
Sue84
Mitglied
Studentin

Sehen Sie sich das Profil von Sue84 an!   Senden Sie eine Private Message an Sue84  Schreiben Sie einen Gästebucheintrag für Sue84

Beiträge: 2
Registriert: 10.12.2005

erstellt am: 11. Dez. 2005 17:32    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo,

im Rahmen meines Studiums hatte ich folgende Aufgaben zu realisieren:

1. Schreiben Sie eine Funktion (multiplik z1 z2), die zwei Integerzahlen mulipliziert, dabei aber nicht auf (*) zurückgreift, sondern nur auf (+). Die Multiplikation wird also durch Additionen ersetzt.

2. Schreiben Sie eine Funktion (subtrak), die eine Integerzahl von einer anderen Zahl (int oder real) abzieht und dabei nur auf (1-) zurückgreift.

Meine Lösungen:

1.

Code:

(defun multiplik (z1 z2)
  (setq sum 0)
  (while(>= z1 0)
    (setq sum(+ sum z2))
    (setq z1(1- z1))
  )
)

2.

Code:

(defun subtrak (z1 z2)
  (repeat z2(1- z1))
)

Könnte dies so stimmen?
Leider besitze ich kein AutoCAD mit integriertem AutoLISP um das zu testen.

Über jede Hilfe wäre ich sehr dankbar!

MfG Sue

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Proxy
Ehrenmitglied
Stateless-DHCP v6-Paketfragmentierer


Sehen Sie sich das Profil von Proxy an!   Senden Sie eine Private Message an Proxy  Schreiben Sie einen Gästebucheintrag für Proxy

Beiträge: 1629
Registriert: 13.11.2003

Tastaturen, Mäuse,
Pladden, ...,
AutoCADs 200X, SWX 2kX

erstellt am: 11. Dez. 2005 18:05    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

Du kannst eine 30-Tage kostenlose Version bei einem Fachhändler dir holen. Warum du auch mit AutoLisp etwas realiseren musst und dabei nicht eine Educatiion-Version hast, musst dich wohl selber fragen, soooo teuer ist die auch nicht. Zur "Lisp" selber => Mapcars Visual-Lisp-Tutorial und AutoLisp Tutorial von Mapcar helfen dir bestimmt bei der Schleifenbildung.

------------------
MfG Proxy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 11. Dez. 2005 18:08    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

Willkommen im Forum!

zu multiplik :

(defun multiplik (z1 z2 / sum)
  (setq sum 0)
  (repeat Z2
    (setq SUM(+ SUM Z1))
  )         
)

sum als "lokale Variable gesetzt
und repeat statt while verwendet und zwar
--> der Test durch while schluckt bloß rechenzeit und ich habe keine bei der Programmerstellung unkannte Abruchbedingung. DIe Schleife muß eh Z2-mal durchlaufen werden. Und While würde in deinem Falle immer -1 zurückgeben ( abbruch bei der ersten Zahl < 0 ) und somit auch deine Funktion!!!
Ein Test wäre noch evtl. sinnvol, und zwar, ob Z1 und Z2 wirklich Integers sind ( kann aber auch vom Aufrufer erledigt werden .. d.h. Ansichtssache)
->
(defun multiplik (z1 z2 / sum)
  (if (and(numberp Z1)(= Z1 (fix Z1))
          (numberp Z2)(= Z2 (fix Z2))
       )
    (progn
      (setq sum 0)
      (repeat Z2
        (setq SUM(+ SUM Z1))
      )          
    )
  )
)

zu subtrak : du weißt das Ergebnis von (1- Z1) nie zu , somit wird die Funktion als Ergebnis immer nur Z1-1 als Ergebnis des letzten Schleifendurchlaufes zurückliefern.
Richtig wäre

(defun subtrak (z1 z2)
  (repeat z2(setq Z1(1- z1)))
)

------------------
    - Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Sue84
Mitglied
Studentin

Sehen Sie sich das Profil von Sue84 an!   Senden Sie eine Private Message an Sue84  Schreiben Sie einen Gästebucheintrag für Sue84

Beiträge: 2
Registriert: 10.12.2005

erstellt am: 11. Dez. 2005 19:27    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Vielen Dank!

Aber die Schleifenwiederholung wird doch schon abgebrochen, nachdem z1 auf den Wert 0 gesetzt wurde, nicht erst bei -1, oder?

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 11. Dez. 2005 20:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

(while(>= z1 0)  --> bedeutet ... solange Z1 größer /gleich 0 führe aus
somit : wenn Z1 = 0 wird trotzdem noch
(setq z1(1- z1)) ausgeführt.
außerdem gibst du in deiner Funktion nicht SUM zurück, sondern das Ergebnis des letzen Aufrufs von (setq z1(1- z1)) nämlich -1 !!

P.S. was studierst du eigentlich? Und ab welchem Semester bekommt man solche Aufgaben?

------------------
- Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Brischke
Moderator
CAD on demand GmbH




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 12. Dez. 2005 08:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von Sue84:
...Leider besitze ich kein AutoCAD mit integriertem AutoLISP um das zu testen. ...

Dafür gibt es doch einen Online-Lisp-Interpreter von mapcar.

Grüße Holger

------------------
Holger Brischke
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

archtools
Mitglied



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 12. Dez. 2005 21:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von Sue84:

1. Schreiben Sie eine Funktion (multiplik z1 z2), die zwei Integerzahlen mulipliziert, dabei aber nicht auf (*) zurückgreift, sondern nur auf (+). Die Multiplikation wird also durch Additionen ersetzt.

(defun multiplik (z1 z2)
  (setq sum 0)
  (while(>= z1 0)
    (setq sum(+ sum z2))
    (setq z1(1- z1))
  )
)
[/code]

Könnte dies so stimmen?


Na, dann prüfen wir mal: (multiplik -3 5) -> nil

Sorry, falsches Ergebnis :-)

Tom Berger


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

archtools
Mitglied



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 12. Dez. 2005 21:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von CADmium:
Willkommen im Forum!

zu multiplik :

(defun multiplik (z1 z2 / sum)
  (setq sum 0)
  (repeat Z2
    (setq SUM(+ SUM Z1))
  )         
)


Na, dann schau'n wir hier mal: (multiplik 3 -5) -> nil

Sorry, das war auch nix :-)

Tom Berger

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

archtools
Mitglied



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 12. Dez. 2005 22:03    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von Sue84:
Hallo,

im Rahmen meines Studiums hatte ich folgende Aufgaben zu realisieren:

1. Schreiben Sie eine Funktion (multiplik z1 z2), die zwei Integerzahlen mulipliziert, dabei aber nicht auf (*) zurückgreift, sondern nur auf (+). Die Multiplikation wird also durch Additionen ersetzt.


Die Aufgabe ist mit '+ als einzig zulässiger arithmetischer Funktion nicht lösbar, wenn man als Operanden tatsächlich alle Integerzahlen zulässt.

Zitat:

2. Schreiben Sie eine Funktion (subtrak), die eine Integerzahl von einer anderen Zahl (int oder real) abzieht und dabei nur auf (1-) zurückgreift.

Und diese Aufgabe ist ebenfalls unlösbar.

Ich vermute allerdings, dass der Aufgabensteller sich vertan hat und nicht beliebige Integerzahlen als Operanden zulassen wollte, sondern nur positive und die Null. Damit ist die Aufgabe trivial, und Du solltest in der Lage sein, sie als Hausaufgabe im Rahmen Deines Seminars selbst zu lösen.

Tom Berger

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 12. Dez. 2005 22:13    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

@Tom
"Integer" war für mich in dem Fall  = Natürliche Zahlen , sonst wäre ja die Aufgabenstellung Blödsinn.
Danke, das du das noch mal Explizit dargelegt hast.

------------------
- Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

archtools
Mitglied



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 12. Dez. 2005 22:39    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von CADmium:
@Tom
"Integer" war für mich in dem Fall  = Natürliche Zahlen , sonst wäre ja die Aufgabenstellung Blödsinn.

Das war nicht zu übersehen, dass hier alle einschließlich des Aufgabenstellers falsch dachten :-) Aber ich finde, dass man Studenten bei solchen Hausaufgaben nicht mit fertigen Lösungen helfen sollte - damit wird der Sinn der Aufgabe konterkariert.

Unabhängig davon aber liebe ich solche kleinen Herausforderungen, wenn die Fragestellung sinnvoll ist. Ändern wir also die Aufgabenstellung ein wenig und zwar so:

Erstelle eine Funktion (mult z1 z2), bei der die zwei Operanden z1 und z2 Natürliche Zahlen (einschließlich Null) sind, die miteinander multipliziert werden sollen. Die einzige zulässige arithmetische Funktion einschließlich Vergleichsoperatoren ist '+, und dieses '+ soll so selten wie irgend möglich aufgerufen werden.

Tom Berger

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

klapproth
Mitglied



Sehen Sie sich das Profil von klapproth an!   Senden Sie eine Private Message an klapproth  Schreiben Sie einen Gästebucheintrag für klapproth

Beiträge: 13
Registriert: 03.12.2005

erstellt am: 13. Dez. 2005 00:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

Sehr hilfreich ist bei so etwas, sich mal mit der Sprache 'brainfuck' zu befassen. Da der Interpreter nur 171 Bytes (!) groß ist, sollte der Download auch kein Problem darstellen - selbst mit einem 1200 baud-Modem dauert das nicht so lange;-)
http://de.wikipedia.org/wiki/Brainfuck

Grüße, Justus

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 14. Dez. 2005 08:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

nochmal zur ersten: wenn man auch (abs) verwenden darf gehts auch mit negativen Integers ( Bereich der GANZEN ZAHLEN ):

(defun multiplik (z1 z2 / sum)
  (setq sum 0)
  (cond
    ((<= 0 Z1 Z2)  (repeat Z1 (setq SUM(+ SUM Z2))))
    ((<= 0 Z2 Z1)  (repeat Z2 (setq SUM(+ SUM Z1))))
    ((<= Z1 Z2 0)  (setq Z1 (abs Z1) Z2 (abs Z2))(repeat (abs Z2) (setq SUM(+ SUM Z1))))
    ((<= Z2 Z1 0)  (setq Z1 (abs Z1) Z2 (abs Z2))(repeat (abs Z1) (setq SUM(+ SUM Z2))))
    ((<  Z1 0 Z2)  (repeat Z2 (setq SUM(+ SUM Z1))))
    ((<  Z2 0 Z1)  (repeat Z1 (setq SUM(+ SUM Z2))))
  )
  SUM
)

------------------
- Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

archtools
Mitglied



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 14. Dez. 2005 21:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von CADmium:
nochmal zur ersten: wenn man auch (abs) verwenden darf gehts auch mit negativen Integers ( Bereich der GANZEN ZAHLEN ):

(defun multiplik (z1 z2 / sum)
  (setq sum 0)
  (cond
    ((<= 0 Z1 Z2)  (repeat Z1 (setq SUM(+ SUM Z2))))
    ((<= 0 Z2 Z1)  (repeat Z2 (setq SUM(+ SUM Z1))))
    ((<= Z1 Z2 0)  (setq Z1 (abs Z1) Z2 (abs Z2))(repeat (abs Z2) (setq SUM(+ SUM Z1))))
    ((<= Z2 Z1 0)  (setq Z1 (abs Z1) Z2 (abs Z2))(repeat (abs Z1) (setq SUM(+ SUM Z2))))
    ((<  Z1 0 Z2)  (repeat Z2 (setq SUM(+ SUM Z1))))
    ((<  Z2 0 Z1)  (repeat Z1 (setq SUM(+ SUM Z2))))
  )
  SUM
)


Da Du hier die Anzahl der '+ Aufrufe durch Größenvergleich von z1 und z1 minimieren wolltest, nehme ich an, dass Du damit auch meiner neuen Aufgabe gerecht werden wolltest :-)

Dann will ich Dich mal überraschen: man benötigt nicht mehr als einen einzigen (in Ziffren: 1) Aufruf von '+, um das Problem zu lösen :-)

Mit der Auflösung warte ich nach diesem Hinweis noch, aber ich bin schon gespannt auf Deine Herausforderung.

Gruß
Tom Berger


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 14. Dez. 2005 22:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

@Tom : Na lass gucken  .. aber du willst sicherlich auf die Addition der Logarithmenwerte hinaus, so wie es "intern" der Rechenschieber - wer weiß noch was das ist?? - beim "Multiplizieren" macht.

Meinst du wirklich, das war in der Aufgabe beabsichtigt?

------------------
  - Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Theodor Schoenwald
Ehrenmitglied



Sehen Sie sich das Profil von Theodor Schoenwald an!   Senden Sie eine Private Message an Theodor Schoenwald  Schreiben Sie einen Gästebucheintrag für Theodor Schoenwald

Beiträge: 1672
Registriert: 16.04.2002

erstellt am: 14. Dez. 2005 23:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

Hallo Sue,
...
Leider besitze ich kein AutoCAD mit integriertem AutoLISP um das zu testen.
...

Für das Studium bekommst Du ACAD für ca. 120 Euro oder BricsCad, von Mervisoft in Wiesbaden, für 58 Euro.

BricsCad kann die VLX-Befehle nicht aber die brauchst Du vieleicht auch nicht für Deine Aufgabe.

Gruß
Theodor Schönwald

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

klapproth
Mitglied



Sehen Sie sich das Profil von klapproth an!   Senden Sie eine Private Message an klapproth  Schreiben Sie einen Gästebucheintrag für klapproth

Beiträge: 13
Registriert: 03.12.2005

erstellt am: 15. Dez. 2005 13:03    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von archtools:
Erstelle eine Funktion (mult z1 z2), bei der die zwei Operanden z1 und z2 Natürliche Zahlen (einschließlich Null) sind, die miteinander multipliziert werden sollen. Die einzige zulässige arithmetische Funktion einschließlich Vergleichsoperatoren ist '+, und dieses '+ soll so selten wie irgend möglich aufgerufen werden.

Verstehe ich was falsch? Toms Aufgabe heisst doch a) Natürliche Zahlen inkl. 0, also {0, 1, 2, 3, 4 ... bis 8-quer}, und b) nur eine einzige arithmetische Funktion einschl. aller Vergleiche - und davon wimmelt es in Cadmiums Lösung doch nur so.

Mein Vorschlag, *diese* Denksport-Aufgabe erstmal zu lösen:

Code:

(defun mult(z1 z2 / l)
  (apply'+(repeat z1(setq l(cons z2 l))))
)


Enthält ein einziges + und keinerlei Vergleiche, und es ist eine Übertragung des Brainfuck-Vorgehens nach Lisp, also ziemlich 'streifenförmig';-)

Die Erweiterung für Ganze Zahlen muss aber, so wie ich das sehe, noch (mindestens) eine weitere arithmetische Operation bzw. Vergleichsfunktion enthalten. Außerdem wäre es zu klären, wieviel 'Beschiss' drin sein darf, man würde es wahrscheinlich auch mit ein paar Kilo (lsh) und (boole) hinkriegen. Aber das wären ja nur Emulationen von arithmetischen und Vergleichsfunktionen.

Der Rechenschieber-Ansatz kommt für diese Aufgabenstellung nicht in Frage, da die Logarithmen-Funktionen ja auch arithmetische sind. Außerdem müsste man dann auch eine Genauigkeits-Schranke definieren, man dann ja auf Zahlendarstellung im Zweierkomplement umsteigen würde.

Grüße, Justus

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 15. Dez. 2005 13:09    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

(defun mult(z1 z2 / l)
  (apply'+(repeat z1(setq l(cons z2 l))))
)

hmm .. repeat läuft genausooft durch,  hinzu kommt noch ne Listenoperation und dann das apply, das nochmal durchmuß ..
das soll effektiv sein.. ? und was macht der Prozessor dabei?.. auch Z1 mal + ..

naja, mal sehen , wo der Thread noch hinführt..? 

------------------
- Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

archtools
Mitglied



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 15. Dez. 2005 18:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von klapproth:

Mein Vorschlag, *diese* Denksport-Aufgabe erstmal zu lösen:
Code:

(defun mult(z1 z2 / l)
  (apply'+(repeat z1(setq l(cons z2 l))))
)



Applaus - das gibt die Maximalzahl von 100 Punkten.

Schön wäre natürlich auch noch, wenn's ohne lokale Variable ginge, aber da fällt mir auch nur der Umweg über die Rekursion ein, und das ist hier nicht wirklich kürzer, eleganter oder schneller.

Gruß
Tom Berger

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

archtools
Mitglied



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 15. Dez. 2005 18:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von CADmium:
(defun mult(z1 z2 / l)
  (apply'+(repeat z1(setq l(cons z2 l))))
)

hmm .. repeat läuft genausooft durch,  hinzu kommt noch ne Listenoperation und dann das apply, das nochmal durchmuß ..
das soll effektiv sein.. ? und was macht der Prozessor dabei?.. auch Z1 mal + ..

naja, mal sehen , wo der Thread noch hinführt..? 



Von Effektivität hat niemand was gesagt, sondern von einer Minimierung der '+ Aufrufe. Aber Du kannst ja leicht testen, ob z1 mal '+ schneller ist als z1 mal 'cons plus ein '+ und ein 'apply, und uns das Ergebnis dann hier mitteilen.

Sinnvoll ist diese Übungsaufgabe natürlich, weil es analoge Probleme gibt, bei denen statt des '+ zeitintensivere Funktionen aufgerufen werden müssen, und weil dann die Reduktion auf einen einzigen Aufruf wirklich was bringt.

Tom Berger

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

klapproth
Mitglied



Sehen Sie sich das Profil von klapproth an!   Senden Sie eine Private Message an klapproth  Schreiben Sie einen Gästebucheintrag für klapproth

Beiträge: 13
Registriert: 03.12.2005

erstellt am: 15. Dez. 2005 19:47    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sue84 10 Unities + Antwort hilfreich

Tja, vorhin habe ich einen etwas längeren Beitrag zum Thema "Effektivität" geschrieben - bloß ist leider meine Birne manchmal nicht so effektiv: Ich hab zwar mit der Vorschau alles kontrolliert, aber dann das Absenden vergessen:-(((

Nein, Effektivität war gar nicht gefragt. Wen es darum ginge, würde ich das hier als Lösung abgeben:

Code:

(defun mult(z1 z2 / )
  (* z1 z2)
)

Das enthält zwar auch einen Regelverstoß, aber eben nur einen einzigen;-) Und es wäre noch viel, viel effektiver.

Effektivität muss ja auch immer eine Zielrichtung haben. Code kann effektiv im Sinne der Performance sein, er kann aber auch effektiv für das Portemonnaie des Programmierers sein. Wie gesagt: diese Lösung entspricht dem Brainfuck-Vorgehen. Und das ist eine äußerst effektive Sprache - ein Interpreter, der nur 171 Bytes belegt, und trotzdem eine Turing-vollständige Sprache: Das ist ultra-effektiv! Damit kann man z.B. einen Rechner bauen, dessen CPU 50 Cents kostet, aus ein paar dutzend integrierten Transistoren besteht, woraus dann wiederum folgt, dass sie so gut wie keinen Strom verbraucht, keine Abwärme produziert und daher mit Taktfrequenzen betrieben werden kann, die man sich kaum vorstellen kann. Die derzeitigen RISC-Prozessoren bspw. sind deutlich dümmer als ihre CISC-Brüder wie Pentium oder Athlon. Trotzdem können sie viel effektiver sein, obwohl nicht mal eine FPU drin steckt.   

Hier gings jedenfalls nicht um Effektivität im Sinne von Performance, das war weder im Oposting noch in Toms Denksportaufgabe gefordert. Und nun stelle ich mal die nächste Aufgabe: Da Capo, aber für 'Ganze Zahlen', und dafür darf nur eine einzige weitere arithmetische oder Vergleichsfunktion hinzukommen. Ob das wirklich lösbar ist, weiß ich selber noch nicht;-)

Grüße, Justus


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz