Practica TLP 1920

Limbi de programare

Fernando López Ostenenero și Ana García Serrano

concurs bine-cunoscut „Cifrele și versurile” propun două tipuri de teste pentru participanții săi: una dintre figurile în care acestea ar trebui abordate cât mai mult posibil pentru o mulțime de compoziții de bază pe o serie de numere și un test de scrisori, unde trebuie să găsească LAPALABRA ( valabilă) mai mult că este posibil să scrieți cu o serie de litere.

În această practică vom crea un program care va rezolva a doua dintre aceste teste. Programul va primi o serie de litere și va reveni Toate cuvintele valabile construi cu ele. Pentru a verifica dacă un cuvânt este valid sau nu, este esențial să utilizați un dicționar.

Pentru a face acest lucru, un fișier va fi furnizat cu Dicționarul 79517 WordSpene dicționar în dicționar a raului, astfel încât elevii să poată Testați-vă programul. Paraving Datorită codificării caracterului, toate cuvintele au fost șterse și accentele grafice au fost eliminate.

Astfel, practica va fi împărțită în două faze diferite:

  1. Crearea dicționarului: Un fișier text care conține cuvintele pe care le vom lua în considerare valid (un cuvânt pe linie) vor fi introduse și fiecare dintre ele va fi introdus într-o structură de dicționar pe care vor fi consultate posibilele cuvinte.
  2. Căutare cuvinte: Odată ce dicționarul este disponibil, programul va solicita utilizatorului secvența de scrisori pentru a analiza și a returna toate cuvintele posibile valide care pot fi construite din aceste scrisori, ordonate în ordine alfabetică și grupate după dimensiune cele mai mari la minore.

Afacerile că intrarea / ieșirea din paradigma funcțională nu face parte din agenda care este studiată subiectului, toate funcțiile responsabile pentru citirea dicționarului dintr-un fișier sau l Afacerile cu utilizatorul vor fi programate pentru studenți. În această afirmație va exista o explicație a funcționării funcțiilor menționate . Odată ce acest lucru se face, programul va cere utilizatorului pentru diferite secvențe de litere și va returna cuvintele valide (cele prezente în edtificare) care pot fi construite pe baza literelor disponibile.

Exemplul 1: Programul solicită Dicționar fișier de cuvinte (dicționar dictionar.txt), construiește dicționarul și se așteaptă ca utilizatorul să introducă o secvență de litere:

* Principal > Lista de cuvinte Maincargo din Dicționar fișier.txt79517 Citiți cuvinte

Introduceți secvența de litere:

Exemplul 2: Cu dicționarul deja deja încărcat, utilizatorul intră în secvența literelor „AOS” și programul returnează toate cuvintele care pot fi construite folosind litere:

Aici putem vedea dicționarul rezultat reprezentat grafic într-o formă de copac. După cum seindicate anterior, nodurile intermediare (cu excepția rădăcinii, reprezentate ca RN) sunt Unic care cunoaște personaje. Și concatenarea personajelor care formează calea de la rădăcina accesibilă a nodurilor de frunze (reprezentate ca WN) indică cuvintele prezente în edicitare.

pentru o mai bună înțelegere a structurii de date care trebuie folosită, noi Sugerați studenții care rulează un turneu în dicționarul prezentat în figura 1 pentru a verifica exact cele unsprezece cuvinte indicate în lista care a fost utilizată pentru ao crea.

2.2 Structura modulelor de practică

Practica este împărțită în două module, fiecare într-un fișier independent al cărui nume (inclusiv majuscule și litere mici) cu numele modulului și a cărei extensie este .hs:

  1. Modulul Modulului: În acest sens Modulul, funcțiile de construcție și accesul la dicționar vor fi programate. Acesta include, de asemenea, definiția tipului de date dicționarului.
  2. Modul principal: Acest modul conține principalul program și toate funcțiile responsabile pentru încărcarea listei de cuvinte și interacțiunea cu utilizatorul.

Deoarece un studiu mai profund al modulelor din Haskell este în afara domeniului de lansare, vom indica doar faptul că fiecare modul importă o serie de module necesare pentru funcționarea lor. În practica noastră principalele module importă (în plus față de modulul modulului) module suplimentare pentru a putea lucra cu ieșirea, fișierele și pot converti toate literele. În plus, lista de identificatori între paranteze care însoțește anula modulului dicționarului reprezintă definițiile tipurilor și funcțiilor pe care ModuleleExport.Orice altă definiție va fi considerată privată, fiind accesibilă numai de modulul.

Figura 1: Dicționar reprezentat în copac în formă

23 Dicționar tip de date (modul de dicționar)

În această secțiune vom introduce tipul de date pe care îl vom folosi pentru a ne depozita în practică. Acesta este definit în partea modulului dicționar care oferă predarea elegerului. Așa cum am văzut în secțiunea anterioară, un dicționar va fi un copac în care nodurile intermediare vor conține un caracter, în timp ce nodurile de frunze ne vor da formarea cuvintelor care aparțin dicționarului. Deci, definiția tipului de dicționar:

dicționar de date = rootnode | Letternde Char | WordNode

IE, un dicționar este fie un rootnode (nod rădăcină) care conține o listă de dicționare , Unlentnodode (Letter NODE) care conține o listă de dicționari și o listă de dicționare, fie un cuvânt de cuvânt (nod cuvânt) care va fi un nod de foaie care ne va marca că concatenarea tuturor valorilor din nodurile de la rădăcină (care nu Nu conține niciunul) până la tatăl nodului frunzei formează un cuvânt valabil al dicționarului.

Acest tip de date este adăugat ca exemplu a clasei de spectacol, pentru a putea vizualiza conținutul unui tip de dicționar element și, astfel, facilitarea sarcinii de programare a funcțiilor de decretare a dicționarului.

Reprezentarea internă a Dicționarului Figura 1 ar fi următoarea:

rootnode]]], Letternde ‘C’ ], Letterde „O ‘]], Letterde’o”]], Letterde „]]], Letterde”]] ], Letternde ‘o’]]]

Care este un pic mai complicat pentru a citi decât reprezentarea grafică.

2.4 Programul principal (modul principal)

Modul principal conține programul principal, deja programat de echipa de predare. Hayfunctions care utilizează Monadas și sunt scrise folosind „Notația Do”, care este o notație care să faciliteze scrierea concatenărilor de funcții monordice. Fără a intra prea mult.

Tipuri de date

  • Worsen: reprezintă o listă de cuvinte. Vom folosi acest tip pentru a se vedea o listă de aceeași lungime și aranjată în ordine alfabetică.
  • cuvinte: reprezintă o listă de cuvinte. Vom folosi acest lucru Tipul pentru a se referi la o listă de cuvinte grupate în liste de cuvinte de lungime egală și aranjate în ordine alfabetică.

Funcție de inserție

dvs. tipul dvs. ar fi inserttree :: șir – > dicționar – > dicționar. Această funcție este cea care introduce un cuvânt în dicționar, dar deja gândit ca un copac. Primulparateme ar trebui să fie Restul cuvântului care rămâne de a fi introdus și cel de-al doilea parametru de copac NoDodododel de la care trebuie introdus un alt cuvânt de repaus.

InsertChild funcția

de tip InsertChild :: CHAR – > – >. În primul parametru primește primul caracter al restului cuvântului, cel de-al doilea parametru restul cuvântului care urmează să fie introdus (fără acest prim caracter), al treilea parametru o listă de elemente de tipodictionare (care va fi copii ai unui nod). Returnează lista copiilor nodului schimbat corect.

Această funcție este responsabilă pentru căutarea copilului de la nodul curent, unde se continuă inserarea caracterelor care rămân în continuare din cuvântul curent. În cazul în care copilul nu există, funcția lodeber va crea. Odată localizate (sau create) copilul drept, funcția trebuie să continue restul cuvintelor de la acel copil. În acest moment, sugerăm elevii „cu mâna” dicționarul reprezentat în figura 1 pentru o mai bună înțelegere a procesului de introducere a cuvintelor în dicționar.

2.6 interogări în dicționar (modul de dicționar)

În această secțiune vom încerca consultările în dicționar. Scopul nostru va fi de a programa căutarea secvenței care primește o secvență de caractere și un dicționar. Este returnată de lista scutara, comandată în ordine alfabetică, care sunt conținute în Dicționarul și care poate fi convertit cu caracterele de secvență.

Căutare :: șir – >

De exemplu, dacă căutăm secvența „cascao” din dicționar reprezentată în figura 1, ar trebui să obținem următoarea listă de cuvinte:

Rețineți că „cazurile” și ” Sunset „, prezent în dicționar, nu pot fi formate cu scrisorile de feasque, deoarece conține doar un” și „cazuri” are două) și Un „O” (și „Sundo” are două).

Cum vom lua căutarea?Vom presupune că am făcut deja un traseu anterior, ne-a dus la un nod de copac (care nu este o foaie). Prin urmare, vom avea ca caractere de secvențiere încă folosite și începutul unui cuvânt format de caractere prezintă calea de la rădăcină la nodul curent.

Acum analizăm toți copiii nodului curent:

  • Dacă un copil este un cuvânt de cuvinte, va însemna că cuvântul pe care l-am format deja aparține dicționarului, cu care, va fi necesar să o adăugați.
  • Dacă un copil este untternod, acesta va conține un caracter. Numai dacă acest personaj aparține secvenței care nu a fost încă explorată (în nici o poziție, nu neapărat prima), trebuie să exploram recursiv acest copil, adăugând la cuvântul deja format caracterul letterode-ului și eliminând caracterul menționat din secvența încă explorată .

Recomandăm din nou ca studenții să investească un timp în efectuarea acestui scrub pe arborele din Figura 1 pentru secvența „Cascao” și verificați exact cuvintele indicate.

P

Ca și în secțiunea anterioară, funcția de căutare va avea nevoie de o serie de funcții (care nu vor fi vizibile din exteriorul modulului). Cele mai importante sunt următoarele LASDOS:

Funcția SearchinTree H3 . / Div>. În primul parametru primește caracterele secvenței, dar nu utilizează Două, în al doilea primește cuvântul care a fost deja format până când ajunge la nodul de copac care este primit ca al treilea parametru.

Trebuie să returnați toate cuvintele conținute în dicționar a căror pornire este conținutul de către Descoperirea parametrului și continuați de la nodul curent (al treilea parametru) utilizând numai SoleCoarele de secvență care nu sunt încă explorate (primul parametru) 981AC822C0 „> șir – > . Funcția primește încă o secvență explorată, începutul cuvântului deja construit (pe baza traseului utilizat pentru a ajunge la acest nod de la rădăcină) și un nod (fiul nodului care este în prezent explorat). Aceasta este funcția care va Se aplică algoritmul explicat mai sus pentru a returna lista scutara care poate fi formată cu începutul deja construit și cu caracterele care nu sunt încă utilizate.

Probleme privind practica

Răspunsul La aceste întrebări este opțională. Cu toate acestea, în cazul în care studentul nu răspunde la aceste întrebări, calificarea practicii poate ajunge la 6 puncte peste 10.

  1. (1’5 puncte). Să presupunem o implementare a practicii într-o limbă non-declarativă (cum ar fi Java, Pascal, C …). Comentariu Ce avantaje și dezavantaje aș avea în fața implementării în Haskell. Relaxați aceste avantaje din punctul de vedere al eficienței cu privire la programare și execuție. Care ar fi punctul principal în favoarea implementării în limbile non-declarative? Și implementarea în Haskell?
  2. (1’5 puncte). Indicați, cu cuvintele dvs., ceea ce vă permite să gestionați predicatul non-logic predefinit, tăiat (!), În PROLLL. Cum ar fi efectuat acest efect în Java? Justificați răspunsul dvs.
  3. (1 punct). Pentru tipurile de probleme ale problemei definite în Haskell (în ambele module), indicați ce tipuri de constructori de tip au fost utilizați în fiecare caz (vezi capitolul 5 al cărții subiectului).

Documentația pentru a livra

Fiecare elev trebuie să livreze următoarea documentație tutorelui său practic: – codul sursă în Haskell care rezolvă problema pusă. Pentru a face acest lucru, fișierele versuri.hs și dictionary.hs trebuie livrate, cu funcțiile descrise în această declarație, precum și toate funcțiile auxiliare necesare. – o memorie cu: – o mică descriere a funcțiilor programate. – răspunsurile la problemele privind practica.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *