Hot News aus dem CAD.de-Newsletter:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Funktion, die feststellt, ob in einer Zeichenkette ein bestimmtes Zeichen vorkommt

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
Autor Thema:   Funktion, die feststellt, ob in einer Zeichenkette ein bestimmtes Zeichen vorkommt (175 mal gelesen)
Cadibar
Mitglied


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

Beiträge: 7
Registriert: 30.03.2017

erstellt am: 07. Dez. 2017 12: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

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.




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

Beiträge: 2939
Registriert: 15.10.2003

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

erstellt am: 07. Dez. 2017 12:57    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 Cadibar 10 Unities + Antwort hilfreich

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. ;-)

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

Cadibar
Mitglied


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

Beiträge: 7
Registriert: 30.03.2017

erstellt am: 07. Dez. 2017 13: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

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

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: 13294
Registriert: 30.11.2003

.

erstellt am: 07. Dez. 2017 13:12    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 Cadibar 10 Unities + Antwort hilfreich

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


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

Beiträge: 1602
Registriert: 11.10.2004

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

erstellt am: 07. Dez. 2017 13:53    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 Cadibar 10 Unities + Antwort hilfreich

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


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

Beiträge: 7
Registriert: 30.03.2017

erstellt am: 07. Dez. 2017 14:24    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

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
良い精神




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

Beiträge: 17955
Registriert: 14.06.2002

System: F1
und Google

erstellt am: 07. Dez. 2017 14:31    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 Cadibar 10 Unities + Antwort hilfreich

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



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: 653
Registriert: 09.10.2004

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

erstellt am: 07. Dez. 2017 14:57    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 Cadibar 10 Unities + Antwort hilfreich

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
良い精神




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

Beiträge: 17955
Registriert: 14.06.2002

System: F1
und Google

erstellt am: 07. Dez. 2017 15: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 Cadibar 10 Unities + Antwort hilfreich

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

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: 653
Registriert: 09.10.2004

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

erstellt am: 07. Dez. 2017 15:24    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 Cadibar 10 Unities + Antwort hilfreich

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

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)2017 CAD.de