CATEGORII DOCUMENTE |
AutoLISP dispune de un set redus de functii care realizeaza operatii de baza pe siruri: lungimea sirului, modificarea caracterelor, concatenarea si analiza.
in acest capitol veti studia:
Cum sa determinati numarul de caractere dintr-un sir.
Cum sa modificati caracterele dintr-un sir.
Cum sa concatenati doua sau mai multe siruri.
Cum sa analizati un sir, fiecare caracter pe rind.
{irurile de tip text sint formate din 0 sau mai multe caractere aflate intre semnele citarii duble ("). Un sir cu nici un caracter este reprezentat ca '', sau cu null string.
Functia strlen cere un singur sir ca argument. Functia returneaza lungimea unui sir in caractere ca un intreg.
Un spatiu valoreaza cit un caracter, caracterul escape este echivalent cu 'an'.
Introduceti expresiile care urmeaza. Aflati lungimea citorva siruri de text.
.Command: (strlen '')
0
Command: (strlen '123456789')
9
Command: (strlen '1 3 5 7 9')
9
Command: (strlen 'anPoint:')
7
Functia strcase cere un argument si un argument optional. Primul argument trebuie sa fie un sir de tip text. Daca al doilea argument este omis sau este nil, sirul cu toate caracterele transformate in litere mari este returnat; sau daca al doilea argument este t, adica nu este nil, atunci se returneaza sirul cu caracterele transformate in litere mici.
Introduceti expresiile care urmeaza. Transformati caracterele celor trei siruri de tip text.
Command: (strcase 'to upper')
'TO UPPER'
Command: (strcase 'To Upper')
'TO UPPER'
Command: (strcase 'to upper' nil)
'TO UPPER'
Command: (strcase 'TO LOWER' t)
'to lower'
Functia strcat cere unul sau mai multe argumente si fiecare dintre ele trebuie sa fie un sir de tip text. Functia returneaza un singur sir text: rezultatul concatenarii argumentelor.
Functia strcat, printre altele, este folositoare pentru a formula cereri la utilizator. De exemplu, este posibil sa fie nevoie sa cereti utilizatorului ca a n-a instructiune dintr-un grup de instructiuni sa fie procesata. Pentru aceasta trebuie sa luati numarul n, sa-l transformati intr-un sir, apoi sa-l concatenati cu restul.
Introduceti expresiile care urmeaza. Concatenati cele doua siruri.
Command: (setq x 'one' y 'two')
'two'
Command: (setq z (strcat x y))
'one two'
Command: (setq z (strcat x x z y y))
'one one one two two two'
Introduceti expresiile care urmeaza. Formulati o cerere dintr-un sir si un numar intreg.
Command: (setq index 1)
1
Command: (setq a 'Processing object ' b
'')
''
Command: (strcat a (itoa 1) b)
'Processing object 1'
Putine texte in Lisp acorda subiectului despre analiza sirurilor importanta cuvenita. Desi pare ciudat, probabil va este mai comod sa cautati un text despre limbajul C cu explicatii si exemple de analiza a sirului. Manualele The C Programming Language de Brian Kernighan si Dennis Ritchiei, Programming in C de Stephen G. Kochan si Advanced Turbo C de Herbert Schildt sint manuale care acorda cel putin un capitol sirurilor si analizei sirurilor.
Analiza sirurilor simple, adica citirea pe rind a caracterelor dintr-un sir si compararea acestora cu valori, este discutata in urmatorul capitol destinat functiei substr.
Functia substr cere trei argumente: un sir de tip text, un numar intreg de indexare a caracterelor din sir de la stinga la dreapta, si un pas de incrementare a numarului de caractere spre dreapta si inclusiv a caracterului indexat.
Functia substr returneaza un sir care incepe cu caracterul indexat din sir si se continua cu numarul de caractere din dreapta indexului indicat de al treilea argument.
Argumentul index incepe cu 1; adica primul caracter din sir are indexul 1.
De exemplu aceasta expresie returneaza sirul '4'.
(substr '123456' 4 1)
Aceasta expresie returneaza sirul '456'.
(substr '123456' 4 3)
Pentru a analiza caracterele unui sir pe rind, ar trebui sa apelati functia substr aflata intr-o bucla.
Un index al unui caracter dintr-un sir este initializat cu 1. Bucla incepe si se repeta pentru fiecare caracter din sir. Fiecare caracter este returnat si tiparit separat si indexul incrementat cu 1 in bucla.
(setq index 1)
(setq string 'Hello, world.')
(repeat
(strlen string)
(print (substr string index 1))
(setq index (1+ index))
strlen returneaza lungimea unui sir in caractere.
Functia strcase poate returna un sir de tip text a carui caractere sint transformate in litere mari sau mici.
Functia strcat concateneaza doua sau mai multe siruri.
Analiza sirului in AutoLISP se face cu functia substr.
exercitiul 41: siruri si analiza lor
in acest exercitiu:
Veti concatena siruri pentru a crea cereri la utilizator.
Veti folosi lungimea sirului pentru a determina de cite ori trebuie repetata o bucla.
Veti analiza toate caracterele dintr-un sir, pe rind, si veti elimina toate spatiile din sir.
in editorul de text creati un fisier nou numit nospace.lsp in directorul student.in acest fisier creati o functie numita nospace. Aceasta functie ar trebui sa faca urmatoarele operatii in ordine.
Sa ceara un argument: un sir.
Sa seteze o variabila de indexare la 1.
Sa seteze o variabila de iesire la sirul nul ''.
Sa inceapa o bucla care sa se repete conform numarului de caractere din sir.
Sa extraga un caracter din sir de la pozitia curenta.
in cazul in care caracterul este un spatiu, acesta se ignora; daca nu, adauga caracterul la valoarea concatenata.
Sa incrementeze indexul cu 1.
Sa returneze variabila cu spatiile eliminate.
exercitiul 41: analiza sirurilor cu caractere de delimitare
Puteti rezolva acest exercitiu daca Lotus 1-2-3 si Microsoft Excel sint instalate in computerul dvs.
Programele de calcul tabelar cum sint programele Lotus 1-2-3 si Microsoft Excel pot scrie date intr-un fisier de tip text. Fiecare linie din calculul tabelar reprezinta un singur rind de text in fisierul de iesire. Coloanele dintr-un sir sint separate unele de altele printr-un caracter delimitator. Delimitatorul este selectabil de catre utilizator si de obicei lipsit de TAB sau virgula.
Programul prezentat mai jos implementeaza o functie numita parse. Functia parse citeste un singur rind de text creat dupa formatul descris mai sus. Functia returneaza o lista de siruri unde fiecare coloana dintr-un rind este tratata ca un sir individual.
Functia parse cere trei argumente: sirul de analizat, caracterul folosit ca delimitator in interiorul sirului si un indicator de conditie care daca nu este nil va returna toate pozitiile unde apare delimitatorul care separa sirul in lista returnata.
impreuna cu functia parse este definita si functia c:test_parse. Functia TEST_PARSE citeste o lista de siruri, le analizeaza pe fiecare si scrie rezultatul intr-un fisier asociat numit testpars.txt in directorul curent. Fiecare valoare returnata de parse este testata; daca apare o eroare, se scrie un mesaj in fisierul asociat.
Lansati programul de calcul tabelar.
in acest program deschideti fisierul testpars.xls in directorul student.
Folositi comanda SAVE AS pentru a salva datele ca un format text intr-un fisier. in programul Excel comanda foloseste caracterul TAB ca delimitator.
inchideti programul de calcul tabelar.
in editorul de text, examinati formatul Text din fisier.
incarcati programul parse.lsp in AutoCAD.
Activati comanda PARSETEXT si urmariti cererile.
PARSETEXT va analiza fiecare sir din fisierul text si va afisa pe display lista de siruri returnata pentru fiecare rind de catre functia parse.
; PARSE.LSP
; Version 1.0 3/29/93
; (parse str str expr)
; Parse a delimited text string and return a list of strings. Adds a
; null string between two sequential delimiters.
; Arguments:
; str (required) Text string to parse.
; str (required) Character used to delimit the string.
; expr (required) If t, return delimiter as a separate string.
; Local variables:
; char STR Current character from string.
; index INT Current location of character from string.
; rl LIST Return list of strings.
; sstr STR Current string to add to return list.
; strl INT Length of string.
(defun parse (str delim rd / char index rl sstr strl)
(setq ;initialize
sstr '' ;string to place in list
rl nil ;list to return
index 1 ;character index in string
strl (strlen str) ;length of string
)
continuare pe pagina urmatoare
(if ;if string length is zero
(zerop strl) ;return list with null string
'('')
(progn
(repeat ;repeat for the length of string
strl
(setq char (substr str index 1)) ;get a character
(cond
(
(= char delim) ;if it's a delimiter
(if ;and the string is null, it's
(= str '') ;line start or last was delim so
(setq rl (cons '' rl)) ;add null string to return list
(progn ;else
(setq rl (cons sstr rl)) ;add string to return list
(setq sstr '') ;then reinitialize string
)
(if ;if flag is true
rd
(setq rl (cons char rl)) ;add delimiter to return list
)
(if ;if it's the last char in string
(= index strl)
(setq rl (cons '' rl)) ;add null string to return list
)
)
(
t ;if we're here, just append the
(setq sstr (strcat sstr char)) ;current string to the char
(if
(= index strl) ;if it's the last char in string
(progn
(setq rl (cons sstr rl)) ;add string to return list
)
)
)
);end cond
(setq index (1+ index)) ;increment the char index
);end repeat
(reverse rl) ;reverse the list to return so the
;strings are in original order
);end progn
);end if
continuare pe pagina urmatoare
; TEST_PARSE.LSP
; Version 1.0 3/30/93
; test_parse
; Test the function (parse). Use two lists of strings with different
; delimiter characters: 'at' and ','. Test for both nil and t delimiter
; flag. Write test results to the log file TESTPARS.TXT in the current
; directory. Write an error message with index every time (parse) fails
; to match a value in a result list.
; Local variables:
; fp FILE Pointer to log file
; string STR Current string argument to parse
; t1 LIST List of strings to test
; t2 LIST List of strings to test
; t1_r1 LIST List of t1 results for nil delim flag
; t1_r2 LIST List of t1 results for t delim flag
; t2_r1 LIST List of t2 results for nil delim flag
; t2_r2 LIST List of t2 results for t delim flag
(defun c:test_parse (/ fp string t1 t1_r1 t1_r2 t2 t2_r1 t2_r2)
(setq
t1
'('' 'at' 'a' 'ab' 'aat' 'ata' 'aatb' 'aatbat' 'ataat' 'atat')
t1_r1
'(('') ('' '') ('a') ('ab') ('a' '') ('' 'a') ('a' 'b') ('a' 'b' '')
('' 'a' '') ('' '' '')
)
t1_r2
'(('') ('' 'at' '') ('a') ('ab') ('a' 'at' '') ('' 'at' 'a')
('a' 'at' 'b') ('a' 'at' 'b' 'at' '') ('' 'at' 'a' 'at' '')
('' 'at' '' 'at' '')
)
t2
'('' ',' 'a' 'ab' 'a,' ',a' 'a,b' 'a,b,' ',a,' ',,')
t2_r1
'(('') ('' '') ('a') ('ab') ('a' '') ('' 'a') ('a' 'b') ('a' 'b' '')
('' 'a' '') ('' '' '')
)
t2_r2
'(('') ('' ',' '') ('a') ('ab') ('a' ',' '') ('' ',' 'a')
('a' ',' 'b') ('a' ',' 'b' ',' '') ('' ',' 'a' ',' '')
('' ',' '' ',' '')
)
)
(setq fp (open 'testpars.txt' 'w'))
continuare pe pagina urmatoare
(setq index 0)
(repeat
(length t1)
(setq string (nth index t1))
(print string fp)
(print (parse string 'at' nil) fp)
(print (parse string 'at' t) fp)
(if
(not
(equal
(setq x (parse string 'at' nil))
(setq y (nth index t1_r1))
)
)
(strcat
'Test t1_r1 failed in index ' (itoa index) '.'
)
fp
)
);end if
(if
(not
(equal
(parse string 'at' t)
(nth index t1_r2)
)
)
(strcat
'Test t1_r2 failed in index ' (itoa index) '.'
)
fp
)
);end if
(setq index (1+ index))
);end repeat
continuare pe pagina urmatoare
(setq index 0)
(repeat
(length t2)
(setq string (nth index t2))
(print string fp)
(print (parse string ',' nil) fp)
(print (parse string ',' t) fp)
(if
(not
(equal
(parse string ',' nil)
(nth index t2_r1)
)
)
(strcat
'Test t2_r1 failed in index ' (itoa index) '.'
)
fp
)
);end if
(if
(not
(equal
(parse string ',' t)
(nth index t2_r2)
)
)
(strcat
'Test t2_r2 failed in index ' (itoa index) '.'
)
fp
)
);end if
(setq index (1+ index))
);end repeat
(setq fp (close fp))
(prin1)
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1118
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved