| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Funktion, die feststellt, ob in einer Zeichenkette ein bestimmtes Zeichen vorkommt (1430 / mal gelesen)
|
Cadibar Mitglied Bauzeichner
Beiträge: 10 Registriert: 30.03.2017
|
erstellt am: 07. Dez. 2017 12:49 <-- editieren / zitieren --> Unities abgeben:
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! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3849 Registriert: 15.10.2003 Win 10 bzw. 11 / 64 Pro AutoCAD MAP 3D 2023 BricsCAD 24
|
erstellt am: 07. Dez. 2017 12:57 <-- editieren / zitieren --> Unities abgeben: Nur für Cadibar
|
Cadibar Mitglied Bauzeichner
Beiträge: 10 Registriert: 30.03.2017
|
erstellt am: 07. Dez. 2017 13:06 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 07. Dez. 2017 13:12 <-- editieren / zitieren --> Unities abgeben: Nur für Cadibar
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." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 07. Dez. 2017 13:53 <-- editieren / zitieren --> Unities abgeben: Nur für Cadibar
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.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Cadibar Mitglied Bauzeichner
Beiträge: 10 Registriert: 30.03.2017
|
erstellt am: 07. Dez. 2017 14:24 <-- editieren / zitieren --> Unities abgeben:
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. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 07. Dez. 2017 14:31 <-- editieren / zitieren --> Unities abgeben: Nur für Cadibar
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 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 07. Dez. 2017 14:57 <-- editieren / zitieren --> Unities abgeben: Nur für Cadibar
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. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 07. Dez. 2017 15:03 <-- editieren / zitieren --> Unities abgeben: Nur für Cadibar
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 07. Dez. 2017 15:24 <-- editieren / zitieren --> Unities abgeben: Nur für Cadibar
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. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |