Forum:Lisp
Thema:Funktion, die feststellt, ob in einer Zeichenkette ein bestimmtes Zeichen vorkommt
Möchten Sie sich registrieren?
Wer darf antworten? Registrierte Benutzer können Beiträge verfassen.
Hinweise zur Registrierung Sie müssen registriert sein, um Beiträge oder Antworten auf Beiträge schreiben zu können.
Ihr Benutzername:
Ihr Kennwort:   Kennwort vergessen?
Anhang:    Datei(en) anhängen  <?>   Anhänge bearbeiten  <?>
Grafik für den Beitrag:                                                
                                                       
Ihre Antwort:

Fachbegriff
URL
Email
Fett
Kursiv
Durchgestr.
Liste
*
Bild
Zitat
Code

*HTML ist AUS
*UBB-Code ist AN
Smilies Legende
Netiquette

10 20 40

Optionen Smilies in diesem Beitrag deaktivieren.
Signatur anfügen: die Sie bei den Voreinstellungen angegeben haben.

Wenn Sie bereits registriert sind, aber Ihr Kennwort vergessen haben, klicken Sie bitte hier.

Bitte drücken Sie nicht mehrfach auf "Antwort speichern".

*Ist HTML- und/oder UBB-Code aktiviert, dann können Sie HTML und/oder UBB Code in Ihrem Beitrag verwenden.

T H E M A     A N S E H E N
Cadibar

Beiträge: 10 / 0

AutoCAD Map 3D
AutoCAD LT

Hallo zusammen,

ich bin ein absoluter Anfänger, was LISP angeht und versuche mit dem Tutorial von Axel Strube-Zettler das Programmieren zu erlernen.

Ich bin jetzt an dem Kapitel angelangt, in dem ich eine Funktion schreiben soll, die prüft ob ein bestimmtes Zeichen in einer Zeichenkette vorkommt und komme einfach nicht zu einer Lösung.
Falls es irgendwo online Lösungen zu den Kapitel gibt, bin ich um jeden Tipp der mich zu ihnen führt dankbar.

Mein Code sieht bisher so aus:

(defun str-pos (zk1 z1)
  (setq laenge (1- (strlen zk1)))
  (setq zeichenkette-enthaelt-buchstabe 0)
    (while (not (minusp laenge))
      (if
        (= z1 (substr zk1 laenge 1))
        (setq zeichenkette-enthaelt-buchstabe (- (strlen zk1) laenge))
        (setq laenge (1- (strlen zk1)))
      )
    )
)

Allerdings stürzt mein AutoCAD ab, sobald ich die Funktion anwenden will.

Kann mir jemand sagen, welche Zeile Probleme macht und warum?

Vielen Dank im voraus!

Peter2

Beiträge: 2962 / 4

Win 7/64 Prof & Win 10/64 Pro
AutoCAD 2017 - 2018, Civil 3D 2017 - 2018, Expresstools
BricsCAD V16 / V17 / V18

Ich denke, die Funktion "wcmatch" kann da helfen:
http://help.autodesk.com/view/ACD/2018/DEU/?guid=GUID-EC257AF7-72D4-4B38-99B6-9B09952A53AD
-

------------------
Für jedes Problem gibt es eine einfache Lösung.
Die ist aber meistens falsch. ;-)

Cadibar

Beiträge: 10 / 0

AutoCAD Map 3D
AutoCAD LT

Danke schon mal für die Antwort, aber die Funktion kenne ich leider noch nicht. Geht es auch ohne?
CADmium

Beiträge: 13298 / 249

.

2 Beispiele :

(defun CHAR_IN_STRING? ( STRING CHAR )
  (if(and(=(type STRING)'STR)(=(type CHAR)'STR)(=(strlen CHAR)1))
    (wcmatch  STRING (strcat "*" CHAR "*"))
  )
)

(defun CHAR_IN_STRING? ( STRING CHAR )
  (if(and(=(type STRING)'STR)(=(type CHAR)'STR)(=(strlen CHAR)1))
    (member(car(vl-string->list CHAR))(vl-string->list STRING))          
  )
)

liefern 'T wenn Zeichen vorhanden , sonst nil


es geht auch so :


(defun CHAR_IN_STRING? ( STRING CHAR )
  (if(and(=(type STRING)'STR)(=(type CHAR)'STR)(=(strlen CHAR)1))
    (vl-string-position (ascii CHAR) STRING)
  )
)

(defun CHAR_IN_STRING? ( STRING CHAR )
  (if(and(=(type STRING)'STR)(=(type CHAR)'STR)(=(strlen CHAR)1))
    (vl-string-search CHAR STRING)
  )
)


oder

(defun CHAR_IN_STRING? ( STRING CHAR / L FOUND?)
  (if(and(=(type STRING)'STR)(=(type CHAR)'STR)(=(strlen CHAR)1))
    (progn
      (setq L(strlen STRING))
      (setq zeichenkette-enthaelt-buchstabe 0)
      (while(and(> L 0)(not FOUND?))
        (setq FOUND? (= CHAR (substr STRING 1 1)))
        (setq STRING (substr STRING 2))
        (setq L(strlen STRING))               
      )
      FOUND? 
    )
  )   
)

------------------
Also ich finde Unities gut ... und andere sicher auch
---------------------------------------
  - Thomas -          
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

joern bosse

Beiträge: 1609 / 6

Window 8.1
ACAD 2005-2018
CIVIL 2010 - 2018
BricsCAD V13-V18
Intel(R) Core(TM)i7-4700HQ CPU @ 2.40GHz 2.40 GHz
16.0GB RAM
NVIDIA GeForce GTX 850M

Hallo Cadibar,
vielleicht noch als Ergänzung:
mit VL-STRING-SEARCH kannst Du prüfen, ob eine Zeichnenfolge einer Zeichnenkette vorhanden ist, zurückgegeben wird die Startposition, gezählt ab 0:

(vl-string-search "123" "123456789")
=> 0
(vl-string-search "123" "0123456789")
=> 1
wenn die Zeichenfolge nicht vorhanden ist wird ein NIL zurückgegeben
(vl-string-search "xxx" "123456789")
=> NIL


------------------
viele Grüße

Jörn
http://www.bosse-engineering.com

Liniensignaturen Youtube

[Diese Nachricht wurde von joern bosse am 07. Dez. 2017 editiert.]

Cadibar

Beiträge: 10 / 0

AutoCAD Map 3D
AutoCAD LT

Das letzte Beispiel hilft mir auf jeden Fall schon mal weiter, danke!

So richtig verstehe ich allerdings immer noch nicht was ich falsch mache und selber kriege ich es auch noch nicht hin. Da muss ich wohl noch ein bisschen üben.

cadffm

Beiträge: 18030 / 370

System: F1
und Google

Zitat:
Original erstellt von Cadibar:
Das letzte Beispiel hilft mir auf jeden Fall schon mal weiter, danke!

Nein vergesse lieber das Beispiel!

Diese Funktion hattest du in dem aktuellen Kapitel noch nicht,
daher solltest du es besser für den Moment vergessen.

-

Ich habe mir deine Funktion angesehen und eine ordentliche Antwort wäre eine A5 bis A4 Seite lang
weil darin gleich mehrere Fehler enthalten sind, die Zeit habe ich nicht und daher nur in Stichpunkten:

1. Dein Zähler wird nicht in jedem Durchlauf von while geändert.
2. Der Wert von deinem Zähler ändert sich NIE (du fragst immer nur die Länge der Zeichenkette ab und die ändert sich ja nie)
3. Falls du vorhattest die Position (der letzten Treffers) zu speichern, auch dort ist ein Fehler,
   du speicherst nicht die aktuelle Position in der Variable ab.
  

------------------
CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD

archtools

Beiträge: 654 / 16

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

Zitat:
Original erstellt von Cadibar:
Danke schon mal für die Antwort, aber die Funktion kenne ich leider noch nicht. Geht es auch ohne?

Natürlich wäre WCMATCH die richtige Lösung, und wenn Du es noch nicht kennst, wäre das die passende Gelegenheit, es kennen zu lernen.

Aber die Aufgabe kann trivial auch ohne WCMATCH gelöst werden. Weil wir in Lisp sind und deshalb gerne mit Listen arbeiten, kannst Du ja den String mal in eine Liste von einzelnen Zeichen umwandeln, und dann einfach mit MEMBER gucken, ob es in der Liste vorkommt. Deine Aufgabe hast Du dann auf die einfachere Aufgabe der Umwandlung des Strings in eine Liste von Zeichen reduziert. Und das ist überhaupt der Trick beim funktionalen Programmieren: man bricht ein komplexes Problem in eine Kombination einfacherer Probleme herunter, die man dann mit simplen kleinen Funktionen lösen kann. Idealerweise ist ein komplexes Lisp-Programm nur eine Folge von kurzen, maximal 5-zeiligen Funktionen.

Für's Umwandeln von Strings in Listen gibt's übrigens schonb eine vordefinierte Funktion, die die Liste der ASCII-Codes der einzelnen Zeichen zurück gibt: VL-STRING->LIST. Deine Aufgabe ist also in einer kurzen Zeile lösbar. Wenn z.B. (setq zeichen "B") und (setq zeichenkette "ABC") ist, dann prüfst Du mit
(member (ASCII zeichen) (VL-STRING->LIST zeichenkette))
ob das Zeichen in der Zeichenkette enthalten ist.

cadffm

Beiträge: 18030 / 370

System: F1
und Google

Ich beführworte noch immer die Lösung mit den bisher bekannten Funktionen SELBST zu erarbeiten.
Also mit den Funktionen die man zwischen SITZ!PLATZ!FASS! und RAUCHZEICHEN bereits behandelt hat. 

------------------
CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD

archtools

Beiträge: 654 / 16

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

Zitat:
Original erstellt von cadffm:
Ich beführworte noch immer die Lösung mit den bisher bekannten Funktionen SELBST zu erarbeiten.

Ich weiß natürlich nicht, welche Funktionen zu dem Zeitpunkt des Lehrgangs bereits bekannt sind, aber SUBSTR ist wohl schon vorhanden, denn das wird im OP ja schon benutzt. Dann wird ja wohl auch CONS schon bekannt sein.  Und damit kann man sich schon selbst die Umwandlungsfunktion eines Strings in eine Liste von Zeichen selbst schreiben.

(c)2018 CAD.de