Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Mit Werten in einer Liste rechnen/jonglieren

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:  Mit Werten in einer Liste rechnen/jonglieren (467 mal gelesen)
benwisch
Mitglied
Bautechniker, CAD-Konstrukteur


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

Beiträge: 375
Registriert: 01.02.2001

erstellt am: 27. Jun. 2003 13:04    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

will wieder mal alte codes von mir auf meinen jetztigen wissenstand bringen...

ich habe eine globale liste = *valueList-duab* gefüllt mit 3 real-werten '(dm ab cm²/m)
innerhalb einer dialogbox, kann der nutzer jonglieren, indem er ein feld leer läßt, was bedeutet, daß dieses feld errechnet wird.

bsp. der liste mit den real-werten, die vom nutzer aus der dialogbox übergeben werden.

'(8.0 15.0 0 )
'(8.0 0    3.35 )
'(0 15.0 3.35 )

so sollte es nicht sein...kann aber!

'(0 0 3.35 )
'(8.0 0 0 )
'(0 0 0 )
'(8.0   15.0    3.35    )

das rechnen/tauschen erfolgt bei mir so...

Code:

(setq
*valueList-duab*
(mapcar
  '(lambda (val)
    (if (= 0 val)
     (apply
      '(lambda (a b c)
(cond
((and (= 0 a) (/= 0 c b))
  (* (sqrt (/ (/ c (/ 100 b)) pi)) 2 10)
)
((and (= 0 b) (/= 0 c a))
  (/ 100 (/ c (/ (* pi (expt a 2)) 4 100)))
)
((and (= 0 c) (/= 0 b a))
  (* (/ 100 b) (/ (* pi (expt a 2)) 4 100))
)
((= nil) val)
) ;_ end cond
       ) ;_ end lambda
      *valueList-duab*
     ) ;_ end apply
     val
    ) ;_ end if
   ) ;_ end lambda
  *valueList-duab*
) ;_ end mapcar
)


hier stört mich aber etwas... falls innerhalb des cond-befehls es zu keiner rechnung kommt, weil mehr als ein wert 0 ist, dann gibt cond ein nil aus. um dieses nil abzufangen binde ich innerhalb des cond-befehls ein ((= nil) val). sieht aber irgendwie komisch aus !!!

ich habe jetzt zwei tage lang versucht zu kürzen, was in meinem "können" liegt und mein gefühl sagt mir...hier gibt es eine elegantere lösung!

würde mich über tipps und konstruktive kritik freuen.


[Diese Nachricht wurde von benwisch am 27. Juni 2003 editiert.]

[Diese Nachricht wurde von benwisch am 14. Sep. 2005 editiert.]

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

Dabrunz
Mitglied



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

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 27. Jun. 2003 18:45    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 benwisch 10 Unities + Antwort hilfreich

 
Zitat:
Original erstellt von benwisch:
will wieder mal alte codes von mir auf meinen jetztigen wissenstand bringen...

Na, da will mal nicht daneben stehen ...

 

Zitat:
Original erstellt von benwisch:
[..]ich habe jetzt zwei tage lang versucht zu kürzen, was in meinem "können" liegt und mein gefühl sagt mir...hier gibt es eine elegantere lösung!

würde mich über tipps und konstruktive kritik freuen.


Sollst du habe:

Die Problem-Stellung ist kein Fall für'ne Schleife, das kannst du daran erkennen, dass du die Liste über die du mit MAPCAR iterierst ja doch wieder innerhalb des Schleifen-Körpers als Ganzes abfragst. Also nix mit MAPCAR.

(apply'(lambda(a b c)..)<irgend-eine-Liste> )
ist Klasse, wenn's nötig ist. Das ist's aber nicht, wenn du alternativ auch gleich
((lambda(a b c)..)<irgend-eine-Liste> )
schreiben kannst - und so scheints mir hier.

Edit: Schwachsinn! - Möchte mal wissen, was mich da geritten hat - hier passt's natürlich ganz besonders gut!

Dann hab ich auch noch ein wenig in den Formeln 'rumgekürzt und raus kommt das:

Code:

(setq *valuelist-duab*
      (apply'(lambda (a b c / viertel-a-quadrat-pi)
          (setq viertel-a-quadrat-pi (* 0.25 a a pi))
          (cond
            ((= 0 b c) (list a b c)) ;** verändert sich nix
            ((list ;** ELSE
              (if (= 0 a)
                (* 2 (sqrt (/ (* c b) pi))) ;** Ist egal, ob <b> oder <c> Null sind
                a ;** ELSE
              )
              (if (= 0 b)
                (/ viertel-a-quadrat-pi c)
                b ;** ELSE:
              )
              (if (= 0 c)
                (/ viertel-a-quadrat-pi b)
                c ;** ELSE
              )
            ) ; end LIST
            ) ; end ELSE-Altenative
          )
        ) ;_ end lambda
        *valuelist-duab*
      )
)

viertel-a-quadrat-pi hab' ich benutzt, weil' die Lesbarkeit steigert - effektiv ist's eigendlich nicht.

Hat noch jemand einen Vorschlag?

Achim Dabrunz

[Diese Nachricht wurde von Dabrunz am 27. Juni 2003 editiert.]

[Diese Nachricht wurde von Dabrunz am 27. Juni 2003 editiert.]

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



Maschinenbauingenieur / Konstruktionsingenieur (w/m/d) Gas- und Energiewirtschaft

Die PSE Engineering GmbH bietet im Bereich Planung alle Ingenieurdienstleistungen rund um die betriebstechnischen Einrichtungen in der Energie- und Gaswirtschaft an.

Für die unterschiedlichsten Anforderungen unserer Kunden werden die erforderlichen technischen Konzepte und Lösungen individuell erarbeitet und die komplette Planung von der ersten konzeptionellen Vorstudie bis hin zur Bauüberwachung und Inbetriebnahme der kompletten Betriebsanlagen durchgeführt....

Anzeige ansehenMaschinenbau
benwisch
Mitglied
Bautechniker, CAD-Konstrukteur


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

Beiträge: 375
Registriert: 01.02.2001

Autocad 2005-2010
Microstation V8
Photoshop CS4 + Camera Raw
Nikon Capture NX2
Nikon D90

erstellt am: 29. Jun. 2003 10: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

hallo Achim

wie vermutet, sieht man oft lösungen nicht....
deine alternative gefällt mir, zeigt sie mir doch einen ähnlich weg, jedoch gibt dein apply eine liste aus. das war anscheinend bei mir das problem, da mir apply immer nur einen wert ausgab. sollte der durchmesser errechnet werden, dann gab halt apply mir den durchmesser aus. aus diesem grund wählte ich mapcar.

mein ehemaliger mathelehrer würde wohl um seinen pult laufen, wenn er meine formeln sieht....aber ehrlich...an das kürzen der formeln habe ich überhaupt nicht gedacht, immer schön step by step. formel läuft...o.k....code optimieren -->halt, auch codes gehören dazu :-))

ein großes dankeschön für deine hilfe !!

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