[Powered by Google Translate] [Walkthrough] [Problemă Set 3]
[Zamyla Chan] [Universitatea Harvard]
[Acest lucru este CS50.] [CS50.TV]
În regulă, bine ai venit tuturor să Walkthrough 3.
PSET 3 este unul foarte distractiv.
E unul nou pentru a CS50 numit Scramble,
așa că, dacă v-ați jucat vreodată Scramble sau similară joc Boggle de bord
în esență, este un joc în cazul în care aveți o grilă de scrisori,
și în timpul alocat aveți nevoie pentru a găsi cât mai multe
2-scrisoare sau cuvinte mai lungi, care exista pe bord,
și așa, există anumite reguli, cum ar fi puteți folosi o singură literă
în grila, un bloc în rețea dată, și nu puteți merge înapoi la el.
Puteți construi doar litere prin legarea împreună litere învecinate,
astfel încât aceasta va fi o PSET foarte distractiv, așa că hai să ne uităm la caseta de instrumente.
>> Din nou, aparatul este încă în curs de actualizare, deci asigurați-vă
de fiecare dată când introduceți aparatul dreapta pentru a deschide fereastra terminalului
și în terminalele face comanda sudo yum-y update.
Acest lucru este important, de asemenea, dacă doriți să fie în măsură să
executați soluțiile de personal, pe care le recomanda cu siguranta.
Uneori e bine după ce ați terminat de codul
pentru a testa împotriva soluției de personal, asigurați-vă că totul
intri în soluția de personal, indiferent iese acolo,
Același lucru se întâmplă cu codul tau.
În regulă, deci asigurați-vă pentru a actualiza aparatul.
Acum, de asemenea, din moment ce avem de-a face cu o grilă în acest caz,
ne de fapt, o să fie cercetând 2-dimensionale matrice.
Ne-am ocupat cu 1-dimensionale matrice,
dar acum suntem de gând să le extindă, astfel că au
mai multe rânduri, precum și mai multe coloane.
Apoi, vom folosi cu siguranta funcții în acest PSET,
apelarea practic o funcție, trimiterea unor parametri din
și obținerea apoi o valoare de întoarcere înapoi.
Și în Scramble noi nu te cer pentru a face de fapt, totul de la zero,
ci, mai degrabă, suntem, de fapt, oferindu-vă ceva numit cod de distribuție,
astfel funcțiile de cod pe care le-am scris deja acest tip de stabilește
scheletul PSET, precum și pune în aplicare unele dintre cele mai dure lucruri
că vei fi cu siguranta capabil să citească și să înțeleagă de peste
dar nu trebuie să-l facă destul de încă.
>> Pentru a rehash rapid de-a lungul tablouri 1-dimensionale.
Matricile sunt structuri de date care dețin mai multe valori de același tip,
și ca un memento, aceste matrice sunt zero indexate,
astfel încât cele mai multe dintre voi sunt, probabil, familiarizat cu o matrice, cum ar fi acest lucru.
Dacă ne-am dorit-o matrice int cu lungimea de 3,
atunci am putea initializa prin având valori int
și apoi parantezele pătrate indică lungimea de ea,
și apoi ne-ar atribui valori la elementele specifice din acea matrice.
Aici avem un tablou int cu primul indice la indice 0, 2,
indice 1 este de 4, indicele 2 este 6.
Spune-ne-am dorit-o gamă mai largă și să organizeze mai multe valori.
Apoi ne-am putea avea o matrice 2D.
Acum, acest lucru este foarte similar cu nostru 1-dimensional matrice.
E 0 indexat, astfel încât înseamnă că prima coloană
este indexată la 0.
Următorul este la 1, iar apoi urmatorul este la 2,
și apoi în mod similar avem rânduri, și astfel veți vedea că atunci când ne
declarăm gama noastră avem, de asemenea, la fel ca înainte de a-am arătat dimensiunea matrice.
Am, de asemenea, în mod similar indică dimensiunea în cazul în care suportul prima
arată cât de multe rânduri aveți, iar cea de a doua indică
cât de multe coloane.
>> În regulă, în această PSET veți dori să fie în măsură să
itera peste matrice 2D, putea accesa fiecărui element
în această matrice 2D, deci, în esență doriți să ajungeți
toate combinațiile posibile de rând și de coloană valori.
Dorim să ajungă la rând 0 la coloana 1, 2, și 3.
Dorim să ajungă la rândul 1 la coloana 0, 1 și 2.
Trebuie să avem un fel de structură, care ne permite să
itera peste toate rândurile și toate combinațiile
de coloane în cadrul asta.
Aici am o matrice 2D int.
Acesta are 3 rânduri și 3 coloane,
și astfel aceasta este modalitate rapidă de a
găsi întreaga gamă 2D.
Spun primul rând va avea 2, 4, și 6,
un fel de similar cu exemplul anterior, în acest diapozitiv.
Apoi am de gând să aibă rândul două fie de 3, 6, 9,
și apoi 3-lea rând este de 4, 8, 12.
Avem gama noastră 2D,
și știm că se pare ca asta.
Avem 2, 4, 6,
3, 6, 9,
4, 8, 12.
Acum, dacă am adăuga în indicilor,
acest lucru ar fi rând 0.
Acest lucru ar fi rândul 1.
Acest lucru ar fi rândul 2.
În mod similar, avem coloana 0,
coloana 1, și coloana 2.
Da.
[Barbat] care trei sunt coloana, si care unul este rândul?
Coloanele sunt acestea,
astfel încât coloanele sunt acestea.
Această coloană este 0, iar acest lucru este coloana 1.
Acest lucru este coloana 2.
[Barbat] Cati în declarația de int cu tabelul [3] [3]?
Când sunteți de declarare matrice 2D, apoi primul număr în paranteze pătrate
va fi cât de multe rânduri aveți,
și apoi cea de a doua va fi câte coloane.
>> Mare, așa că am dori un fel de structură,
un fel de buclă, care va să ne dea toate combinațiile posibile.
Spune-ne încep prin a spune-bine, pentru a accesa nimic în acest rând,
hai să uităm la acest rând pentru acum.
Acestea sunt rânduri aici.
Noi știm că indexul nostru rând va fi 0,
dar pentru a accesa acest element este la rândul 0th și coloana 0th,
astfel încât, atunci ne-ar accesa prin indicele de [0] [0].
Apoi, aceasta, în mod similar, este încă în primul rând,
dar e pe coloana a doua, asa ca am acces ca, prin [0] [1].
Apoi, ultima ar fi [0] [2].
Ori de câte ori suntem la un anumit rând am de gând să doriți să
itera peste toate valorile de coloană posibile.
Să începem cu o buclă de
care începe de la 0, și se duce la lungimea de cât de multe rânduri avem.
Acest lucru este cu bicicleta prin fiecare rand.
Atunci, ce vrem să facem este în faptul că,
ori de câte ori suntem la un anumit rând vrem să parcurge toate coloanele disponibile,
astfel încât, atunci vom avea o altă buclă.
Să-i spunem j.
I, J și K sunt foarte frecvente indexare variabile bucla de rând,
astfel încât să puteți utiliza aceste, dacă doriți.
De asemenea, încercați să evitați atunci în cazul în care aceste variabile sunt utilizate în mod obișnuit în bucle
încercați să evitați folosirea ei ca ar fi nume de variabile pentru alte lucruri din codul dvs.
doar pentru ca e convenție comună de a utiliza i, j, și k în cadrul buclei sau indici.
Bine, atunci aici avem o buclă pentru care iterează peste toate rândurile.
Apoi, de fiecare dată că este la un rând diferit
vom repeta peste toate coloanele diferite.
În acest fel putem obține de fapt, la fiecare combinație posibilă
de la 0, 1 și 2 cu 0, 1 și 2.
Asta face sens?
În acest fel suntem capabili de a accesa peste fiecare valoare.
Acum, am fi putut alege să facă coloane primul an, precum.
Este într-adevăr nu contează, atâta timp cât vă itera prin
toate coloanele și toate rândurile.
>> Acum, hai sa facem ceva cu aceste valori.
Să spunem de imprimare.
Acum, haideți să imprimați numere întregi lor
si apoi variabila de la acest loc este-o să fie o valoare n tabel.
Acum, indicele anumit rând pentru că ar fi i că am folosit pentru a itera prin rândurile noastre,
și apoi j pentru a itera prin coloanele noastre.
Acum, hai să facem 2D.
Acum, când vom rula 2D se imprimă toate valorile
în ordinea în care am specificat mai sus,
astfel încât să vezi că merge prin toate rândurile în primul rând,
asa e la rând 0, și apoi imprimă toate valorile în acel rând
și apoi continuă.
Asta e un exemplu de modul în care v-ați putea repeta peste
și să desfășoare acțiuni de valori în termen de o matrice 2D.
Minunat, acum, ceea ce vom vedea în codul de distribuție sunt multe funcții,
și astfel unele dintre aceste funcții vor fi funcții booleene
în cazul în care se întorc o boolean pentru tine.
>> Unii vor fi întregi, de exemplu, și așa în esență, să
recenzie funcționează un pic practic funcții au
o valoare întoarcere, un nume, cu care le utilizați pentru a apela programul,
și atunci ei pot avea orice număr de parametri.
În esență, atunci când apelați funcția în cadrul funcției următoare,
practic ca și cum ai spune acum vreau să execute această funcție,
va trebui să treci în anumite valori, astfel încât în ​​acest caz, functia foo nostru
ar trebui să ia 2 numere întregi, și în această funcție, atunci
ar fi în măsură să le acceseze, se referă la ele ca x si y.
Un exemplu similar este funcții inferioare
care este posibil să fi folosit în programul dumneavoastră cripto,
și astfel, în esență aceste funcții au fost deja scrise pentru tine,
dar în funcție de tipul lor de întoarcere le-ai putea folosi în cadrul funcțiilor.
Să presupunem că aveți o funcție boolean numit foo.
Atunci ai putea folosi asta pentru că știi că acesta va reprezenta un boolean.
În esență, atunci când îl numesc, se va întoarce înapoi un boolean,
astfel încât să puteți trata ca, aceasta va reprezenta un boolean.
În termen de starea dumneavoastră vă poate spune pur și simplu
daca foo, iar apoi treci la parametrii necesari sale,
5 și 9, de exemplu, 2 numere întregi,
atunci știi că se va întoarce fie adevărate sau false,
și astfel le puteti folosi ca starea dumneavoastră în sine.
În mod similar se poate spune, de asemenea, foo (5, 9) == true
sau == fals sau ceva de genul asta,
dar faptul că este ușor inutil ca funcția în sine
deja valori fie adevărat sau fals.
Vom păstra acest lucru în minte atunci când vom vedea câteva exemple în codul de distribuție.
>> Ok, înapoi la Scramble după ce au matrici 2D
și înțelegerea funcțiilor sub centurile noastre.
În esență, Scramble ai de gând să aibă o grilă de scrisori,
si apoi ai de gând să contribui la punerea în aplicare a unui program de
prin care utilizatorul poate introduce litere diferite, pe care le vezi pe grila de start,
astfel încât, de asemenea, înseamnă că sunteți de asemenea, va trebui să elaboreze tabla de joc.
Apoi, utilizatorul va fi introducerea anumite cuvinte,
dar va trebui să verifice, A, dacă aceste cuvinte sunt valabile în dicționar,
sau B, dacă acestea există, de fapt, în bord, pot fi găsite în bord.
Apoi, în codul de distribuție, vom trece peste faptul că într-o secundă.
Veți vedea ce se deja făcut pentru tine,
și apoi în cadrul structurii dat de Codul de distribuție a adăuga funcții.
Există anumite funcții, care sunt lăsate goale.
Există anumite funcții pe care tocmai l-ați trebuie să adăugați.
O anumită funcție pe care ai de gând să fie de lucru cu este remiză,
deci va trebui să pună în aplicare funcția remiză,
elaborarea de fapt, toate literele de pe bord.
Ai de gând să aibă de a pune în aplicare funcția de căutare, prin care va trebui să verificați
dacă șirul pe care utilizatorul introduse este un cuvânt valid,
și așa, apoi așa cum am menționat mai înainte, care include fie că e în dicționarul sau nu
precum și dacă este o mișcare valabil de joc.
Atunci ai de gând să pună în aplicare Scramble
în cazul în care în joc în cazul în care utilizatorul este, de exemplu, având probleme în a găsi orice cuvânt
apoi în cazul în care tastați în "scramble" în promptul
apoi tabla de joc se rotește de fapt 90 °,
păstrând aceleași litere, ci doar de rotație 90 ° sensul acelor de ceasornic.
Și apoi în cele din urmă ne vom ocupa de cazul și sensibilitate,
în esență, atunci când toate cuvintele din dicționarul incluse în codul de distribuție
sunt toate stocate ca majuscule, dar vrem să permită utilizatorului, de exemplu,
în cazul în care intră într-un amestec de litere mici și majuscule
sau litere mici doar litere, apoi în cazul în care cuvântul este valabil
atunci acestea ar trebui să fie în măsură pentru a obține puncte pentru asta la fel de bine.
>> Ok, deci codul de distribuție, ar putea fi un pic greu pentru a obține prin intermediul la început.
Tu nu ar dori să citească totul și chiar a lua direct la
scris programul, dar vă rugăm să-l citiți o dată,
citit-o de două ori, de trei ori citit, citit-o de peste si peste din nou
astfel încât să aveți un bun simț și poate simti cu adevarat confortabil
cu cod, chiar daca nu am scris aceste funcții tine,
că tu știi fel de ceea ce fac și vă puteți aștepta
modul în care acestea ar putea interacționa cu funcțiile pe care le vor implementa.
Fără alte formalități, să trecem de fapt, în acest cod de distribuție,
și eu voi ajuta voi face sens din ea.
Am descarcat deja codul de distribuție.
Puteți face acest lucru.
E instrucțiunile din spec. în cazul în care aveți pentru a face directorul dvs. propria PSET 3,
și apoi, dacă executați o comandă care a găsit în spec.
atunci vei fi capabil de a descărca fișierul cuvinte,
care conține practic fișierul dicționar, dacă ne uităm doar la asta repede.
Aceasta conține în esență, o listă întreagă de cuvinte care urmează să fie dicționarul nostru.
>> Bine, hai să încep de la partea de sus.
De asemenea, aici veți observa că stilul bună a acestui cod de distribuție
este în beneficiul nostru, deoarece putem vedea comentariile
care explică modul în care codul este utilizat.
Avem acest lucru, inclusiv bibliotecile noastre.
Observați că aici ne-am # include ,
și astfel încât biblioteca ne permite să urmăriți de timp, deoarece
în Scramble va trebui să introduceți în esență, în cât mai multe cuvinte posibil
într-un interval de timp dat.
Aici avem câteva variabile.
Durata de joc l-am setat sa fie 30 de secunde.
Noi spunem că dimensiunea grilei-e un patrat grilă-
va fi 4 x 4.
Noi spunem că există cuvinte, un număr de cuvinte în dicționar,
că oriunde poate avea doar un maxim de 29 de litere.
Atunci aici e un fișier numit jurnal.
În esență, vom fi automatizarea unor rezultate din codul dvs.,
astfel încât să nu încercați să modifice nimic de a face cu jurnalul pentru că vom fi de-a face cu asta.
Nu trebuie să înțelegem destul de faptul că încă,
dar pur si simplu nu încercați să modifice nimic de a face cu jurnalul.
Observați că aici, în această grilă variabilă, care este o matrice 2D de caractere,
este declarat în afara funcției nostru principal,
Deci, asta este ceea ce noi numim o variabila globala.
Pentru că avem de a face cu un joc aici,
dacă vă amintiți tot drumul înapoi la zero
când am avut ceva de genul un scor, de exemplu,
atunci când am fost de-a face cu un joc, care a trebuit să fie accesibile
o mulțime de scenarii diferite, astfel în mod similar, avem această variabilă
care trebuie să fie accesibile la o mulțime de funcții în programul nostru,
astfel încât grila de aici este o matrice 2-dimensional, care va stoca
literele din jocul Scramble.
Mai târziu vom vedea utilizarea de asta mai târziu,
dar atunci avem, de asemenea, o gamă 2D de Booleans numite mărci,
și astfel, în esență atunci când vom merge într-un cuvânt a verifica dacă
este valabil sau nu, avem nevoie să știm dacă am fost vizitate de un anumit bloc,
a vizitat o anumita litera, și așa mai apoi mărcile practic este de gând să
conțin fie adevărat sau fals la un anumit indice,
așa că ne va lăsa să știu dacă am fost acolo înainte,
dacă ne-am vizitat această scrisoare în timpul verificării nostru sigur,
și așa mărci, după cum veți vedea mai târziu,
în esență, se va reflecta exact grila.
>> Aici am decis că vrem propriul nostru tip de date.
Noi nu am fost fericit cu doar șir.
Am vrut, de fapt ceva numit un cuvânt,
deci avem această typedef struct aici,
și apoi în cadrul acesteia are un boolean numit găsit,
Deci, dacă acest cuvânt a fost găsit sau nu.
Apoi, are o serie de caractere,
în esență, cuvântul reală că este.
Acum, cuvântul este o reală nou tip de date pe care le-am făcut,
astfel încât să putem avea o serie de cuvinte, de exemplu,
sau putem face un cuvânt nou și au mai multe instanțe ale acestora.
Dar avem un singur dicționar, și deci de aceea avem doar o
struct apela un dicționar spre deosebire de un typedef struct.
Struct are un număr întreg, cu dimensiunea dicționarului
precum și o serie de cuvinte, și, din nou,
vom folosi aceste cuvinte globale variabile, care este definit mai sus,
pentru a fi numărul de cuvinte care este, de fapt, în dicționarul nostru.
Aici avem o listă întreagă de prototipuri, prototipuri funcționale,
în esență, spunând, bine, acum vă puteți aștepta să aveți
toate aceste funcții mai târziu în program.
Am de gând să aibă o funcție de vid numit clare,
o functie boolean numit de accesare cu crawlere, care să ia în
un șir de numere întregi și apoi 2, et cetera, astfel încât veți vedea aceste aici.
De asemenea, o caracteristică frumos în gedit este faptul că de-a lungul partea de aici
dacă vă asigurați-vă că ați selectat această filă funcțiile aici,
codul sursă fila, apoi se va arăta de fapt, vă toate funcțiile
pe care le au în programul dumneavoastră.
Acesta vă va arăta mai multe lucruri pe care le puteți utiliza.
De exemplu, aici se are că ați definit un nou tip de date numit cuvânt
și apoi anumite variabile globale pe care le au.
Dar această filă funcții este destul de util, deoarece aveți posibilitatea să faceți clic pe înapoi și înainte
și sari la punctele specifice din programul dumneavoastră.
>> În regulă, suntem la funcția principală acum.
Atunci când utilizatorul intră în comandă,
practic ei pot spune, fie / scramble.,
sau se pot introduce, de asemenea, într-un număr de după care să indice în principal
care consiliul doresc să se joace cu.
De obicei, ori de câte ori introduceți numai într-un singur argument de linie de comandă
Apoi, este doar de gând să vă dau un consiliu aleatoare, dar spun pentru scopuri de depanare
doriți să vă asigurați că vă verificați doar placa de același de peste si peste din nou
atunci ce poti sa faci este doar ./scramble1 spune, de exemplu,
și va oferi întotdeauna același bord.
Aici se asigure utilizarea corectă,
așa că, dacă utilizatorul introduce în mai mult de 2 argumente de linie de comandă,
apoi le va instrui cu privire la modul de a utiliza corect programul
și apoi ieșiți.
Aici daca argc este de 2, înseamnă că în cazul în care utilizatorul a introduse un număr de
a cuvântului specifice pe care le doriți să o utilizați, apoi
în esență, atunci când programul mai târziu, de la bord face o întâmplare
atunci în esență, oferă o sămânță, un fel de fortandu-l
de a utiliza o anumită valoare.
Atunci aici ne încărca fișierul nostru de cuvinte.
Practic, dacă nu se poate deschide dicționarul, în cazul în care ceva nu merge bine,
atunci acesta va reveni 1.
Am inițializa grila. Ne vom uita în această funcție mai târziu.
Ne-am propus scorul la 0.
Se calculează atunci când jocul se va termina,
asa ca asta e 30 de secunde, așa cum am stabilit.
Atunci aici, din nou, este fișierul jurnal, care nu trebuie să-și modifice.
>> Iată carne de program unde avem o vreme (adevărat) buclă,
astfel observa că, dacă aveți doar o vreme (adevărat) bucla de la sine
atunci se va păstra doar pe de executare tot ceea ce este în corpul său,
dar după cum veți vedea mai târziu, avem de fapt o pauză
asa ca am de fapt, permite-avem un mod de a-l efectiv de rupere afară
a funcției, și nu de executare pentru totdeauna.
În primul rând ceea ce se întâmplă este ecranul va șterge
astfel încât să puteți trage un nou consiliu, și apoi va avea funcția numită remiză.
Din nou, aceasta va log, deci în esență, de fiecare dată că aceasta trece prin această buclă
se va raporta la tine scorul.
Verificați dacă jocul ar trebui să fie încheiată,
dacă sunteți în afara timpului sau nu, iar apoi sa raporteze cat de mult timp le-ați lăsat
în cazul în care jocul este încă în joc.
Atunci aici avem o solicitare pentru un cuvânt,
si apoi ne-am functia getString,
asa ca asta e în cazul în care utilizatorul introduce de fapt un sugerate pentru tine.
Apoi, în esență, în cazul în care am intrat de fapt un cuvânt, dacă nu e nul,
atunci programul va logati.
Apoi, doriți să verificați dacă aveți nevoie pentru a se lupta rețea,
Deci, practic, dacă acestea intră în scramble comanda, scramble cuvânt,
apoi se va roti 90 °.
Apoi, în caz contrar, dacă nu e scramble cuvânt
atunci ceea ce vrei sa faci este veți dori să caute cuvântul.
(Găsiți (cuvânt) este adevărată. Vom merge în această funcție mai târziu.
Și atunci veți dori să-l căutați, deci practic este pe grila,
și este în dicționar?
Și dacă acesta este cazul, atunci acesta va crește scorul dvs. de numărul de litere
că acest cuvânt este.
Asta e funcția nostru principal acolo.
>> Aceasta este aici ca esență, un cod de evadare,
astfel încât nu aveți nevoie să vă faceți griji cu privire la faptul că destul de atât de mult,
dar, în esență ori de câte ori suna clar că va șterge terminalul
și pentru a muta cursorul înapoi și tipul de stergere orice ar fi scris înainte.
Să nu mergem să se târască destul de încă.
În schimb vom defilați în jos și a vedea funcția remiză aici,
care este TODO treaba ta.
În esență, trebuie să imprimați rețea în starea sa actuală,
asa ne-am ocupat deja de inițializare, de fapt grila,
și așa nu aveți nevoie să vă faceți griji cu privire la care literele pentru a pune în grila de
sau ceva de genul asta, dar în funcție de remiză ai de gând să doriți să
imprima tot ce este în grila.
Atunci aici avem o functie boolean numit găsi,
pe care am văzut mai sus, în funcția de principal.
Dacă cuvântul a fost găsit și, de asemenea, a fost căutat în dicționar,
în cazul în care atât a celor returnate adevărat, atunci ar crește scorul.
Aici este funcția găsi în cazul în care este nevoie de în cuvântul ca un șir de caractere,
și trebuie să fie de 2 sau mai multe caractere,
și apoi ce face asta este caută grila pentru acel cuvânt.
Aici vom vedea un exemplu de iterarea peste fiecare element din grila
în cazul în care acestea itera peste rânduri și apoi, în cadrul că itera peste coloanele.
Amintim aici matrice 2D mărcile care practic stochează fie adevărat sau fals
dacă am fost la această scrisoare deja.
În esență, această resetează toate mărcile, deoarece avem de-a face numai cu mărcile
de fiecare dată că suntem verificarea unui anumit cuvânt.
Atunci aici după ce vom reseta toate mărcile
de fapt caută cuvântul, și astfel pentru a căuta cuvântul
asta e în cazul în care vom folosi funcția de crawl, așa că hai să mergem înapoi să se târască
și să ia o privire la ea.
Ce face crawl este nevoie într-un șir numit scrisori
precum și practic x și y, care este indicele de pornire
de unde utilizatorul a spus cuvântul este.
În esență, aceasta verifică dacă x este <0 sau> dimensiune
în esență ceea ce înseamnă că indicele de fapt, nu există în jocul nostru,
astfel încât atunci returneaza false.
Dacă ați vizitat deja anumită literă
apoi că o să se întoarcă fals, precum și pentru că de regulă în Scramble
este că, atunci când aveți
o scrisoare de aici, de exemplu,
vă puteți alătura o scrisoare de a merge în sus sau în diagonală în acest fel,
Deci, practic scrisoarea dumneavoastră următoarea poate fi la oricare din aceste blocuri adiacente,
dar ceea ce nu se poate face, de exemplu, se merge la prezenta scrisoare
și du-te înapoi la A, astfel încât să puteți utiliza numai fiecare literă o dată.
Apoi, faptul că are sens faptul că aici sunt mărci că, dacă am fost acolo înainte,
dacă marcajele este setat la true, atunci nu e un cuvânt valabil.
>> Atunci ceea ce face este verifică.
Se spune că de gând să verifice dacă, la această locație specifică
scrisoarea pe care ne-o dorim este acolo.
Dacă nu e, returnează false.
Din moment ce este verificat deja acel bloc, atunci o să setați marca
în acel moment specific adevărat.
Acum, verifică dacă aceasta practic, dacă suntem în continuare
ceea ce înseamnă că vom căuta următoarea literă
în cuvântul pe care utilizatorul încearcă să-și prezinte.
Aici amintesc înapoi la regulile.
Tu încerci să verifice toate valorile adiacente,
cele de mai sus, mai jos, la stânga și la dreapta, precum și diagonale,
și astfel în mod similar atunci când ne-am gândit iterarea peste matrice 2D
în cazul în care am vrut să itera peste fiecare posibil și să verificați
fiecare permutare posibil între indicii de rând și indicii coloană
aici vrem să verifice fiecare combinație posibilă,
dacă e în partea stângă a scrisorii, în mod direct de mai sus, sau la dreapta.
Aici vom vedea că această buclă verifică la stânga
atunci când i este -1.
Cand e la 0 verifică în aceeași coloană ca scrisoarea este de la,
și apoi, dacă i este 1, care este valoarea sa finală, apoi se verifică la dreapta,
si apoi asta nu e suficient, nu?
Avem nevoie pentru a verifica toate valorile verticale,
astfel încât atunci aici avem o buclă care se verifică dacă este vorba de mai jos
la același nivel sau mai sus, astfel încât atunci combinația de care
va accesa fiecare singur bloc adiacent A.
Cu toate acestea, verifică, de asemenea, aici, la blocul A,
da, atunci vrem să ne asigurăm că nu vom verifica asta.
Acum, pentru a verifica dacă, de fapt, cuvintele precedente sunt valabile sau nu
Apoi vrem să facem același proces pentru restul cuvântului
restricționare una pe care am făcut deja, deci atunci aici este o funcție precursor.
Se cheamă, și vom intra în faptul că un pic mai târziu,
dar acesta le exercită același proces pentru toate siruri de caractere ulterioare.
Am vorbit despre funcția find.
Noi înțelegem ce face.
Este practic verificarea dacă acest cuvânt pe care utilizatorul a dat
de fapt, există pe bord și, dacă este o mișcare de prim rang.
Aici avem o funcție de initializare.
Observați că vidul e, așa că nu o să fie returnarea noi nimic,
dar este doar de gând să faci ceva pentru noi.
>> Aici off de pe Wikipedia există o frecvență
pentru fiecare literă a alfabetului pe baza de cât de des
este utilizat în limba engleză.
Veți vedea că e este, de exemplu, una dintre cele mai populare folosite litere.
Dorim să populeze grila.
Ce face această funcție este popula grila cu litere
un fel de raport cu frecvența lor în această matrice.
Acum, acest lucru este folosind acest limbaj aici
Dimensiunea spunând de frecvențe,
E un fel de numai caz specific.
Putem folosi, de fapt dimensiunea a frecvențelor, așa că atunci când tu de fapt vrei să
găsi lungimea unei matrice probabil că nu se vor folosi mărimea
ci, mai degrabă folosind doar lungimea matrice.
Puteți cere TFS dvs. să vorbesc cu tine un pic mai mult despre asta,
dar știu doar că această sintaxă aici este mai mult de un caz special.
Acum, pentru fiecare element în grila de
vrem să facem o scrisoare, iar acest lucru va fi pseudoaleatoare,
astfel aleatoare, dar nu destul.
În esență, ceea ce face aceasta este am stabilit o nouă dublă
cu o valoare aleatoare între 0 și 1.
Bazat pe faptul că vom harta faptul că,
astfel spune că d este setat la 0,6, de exemplu.
Apoi, în cazul în care d este de 60% în
apoi ne vom uita la toate literele și de a găsi
relativ la cât de des acestea sunt utilizate
ceea ce este de 60% inch
Aceasta nu este doar de 60% din alfabet, ci mai degrabă
o ocupă acest spațiu mult, și apoi b ocupă atât de mult,
si apoi e, de exemplu, va prelua atât de mult.
Bazat pe lungimi relative sau frecvențele
dintre aceste scrisori vom harta această valoare aleatoare
între 0 și 1 într-o anumită literă.
Asta e ceea ce acest cod face aici,
si apoi aici k este ca trecerea de unde de-a lungul
în scrisoarea vrem să fim, și astfel ne-am stabilit caracterul în grila de
Pentru a fi un K +.
>> Observați că înapoi la gândire lacomi
am avut de a utiliza funcția de runda a face cu virgulă mobilă imprecizie aici,
deci în mod similar a trebuit să luăm în considerare faptul că, uneori,
flotoare nu sunt exact ceea ce ne propunem ca acestea să fie,
așa că am dori să fac o captură pentru asta.
Atunci aici vom merge într-un fișier I / O, practic citirea și scrierea în fișiere,
care va intra în mai tarziu, dar nu destul de încă,
deci în esență, acest deschide un fișier dicționar, citește ceea ce e în ea,
și apoi stabilește într-o matrice.
Observați că l-am pus în struct pe care le-am declarat, struct dicționarul,
și așa dicționarul are o matrice numita cuvinte asociate cu aceasta,
deci ceea ce face se spune dicționarul, cuvintele de la acest indice special,
sunt de așa natură și valoare, cum ar.
Apoi, aproape am terminat cu codul de distribuție.
Avem în sfârșit funcția de căutare în cazul în care aveți comentarii
instrucțiuni privind ce ar trebui să facă cod.
Căutare va căuta un cuvânt în dicționar
și atâta timp cât acel cuvânt nu a fost gasit deja
apoi steaguri ca găsite în astfel utilizatorul poate folosi din nou
dar, de asemenea, gândirea se întoarce înapoi la adevărata funcția principală din nou,
returnează true, așa spune că acest cuvânt poate fi înscrise.
>> Și apoi în cele din urmă aveți funcția scramble,
care este o altă funcție nule, pentru că face ceva
dar nu se întoarce nimic, deci ce funcția scramble va face
este rotiți grila de 90 ° sensul acelor de ceasornic.
Știu că ar fi putut fi un pic cam dur, dar e important să faci.
Uita-te la mine trece prin codul de distribuție,
dar la fel de bine, încercați să mergeți prin ea singur.
Ceea ce îmi place să fac este hartă pentru a înțelege
Ce înseamnă acest program cu toate aceste funcții de fapt, nu?
Dacă ar fi să trec prin codul de distribuție din nou,
acum că am un fel de au un sentiment de ceea ce se întâmplă atunci aș spune
vom începe cu funcție nostru principal,
și atunci cred că primul lucru pe care îl face este o numește sarcină,
astfel principal solicită sarcină, dar sarcina este o funcție nulă,
deci atunci ce să fac pentru a indica faptul că este de a pune doar o singură săgeată
arătând că pentru a încărca principal se solicită.
Următorul lucru este inițializat.
Solicită Principalele inițializa,
și apoi, dacă ne uităm înapoi în funcție de principalul nostru
Cred că acest lucru următoare, care o face,
aici sunt de tone de lucruri diferite, care este principala de asteptare,
dar acum eu sunt doar concentrându-se pe cele mai importante
relevante pentru cod, asa ca nu am inclusiv un. la I sau chestii de genul asta
Apoi, următorul lucru pe care îl face este îl curăță,
și apoi le-a trage,
și așa știu că remiza este ceva ce vom face.
Asta e funcția remiză.
Mai târziu vom vedea că următoarea este un pic-
astfel încât, atunci avem scramble.
Și atunci ne-am găsi, așa că este o altă funcție.
Vedem că găsim este-dacă vă amintiți înapoi este o funcție booleană,
Deci, asta e de fapt de gând să se întoarcă înapoi la noi ceva.
Atunci aici am indică faptul că avem de găsit,
și apoi ne-am, de asemenea, de căutare.
Dar amintiți-vă apoi că există, de asemenea, această funcție de accesare cu crawlere
care nu pare să fi fost chemat în principal,
Asta înseamnă că o alta functie este de asteptare de accesare cu crawlere,
și dacă veți căuta înapoi prin codul de distribuție
vedeți că găsiți aici este una care utilizează crawl,
așa că, apoi, de asemenea, link-uri sa se tarasca,
care este o valoare boolean, care returnează ceva,
așa că eu sunt adăugarea de un alt lucru, și apoi deoarece crawl este recursiv
este, de asemenea, bucle înapoi pe ea însăși.
>> Apoi, dacă te văd aici, am desenat o imagine a ceea ce programul nostru arata ca,
astfel înțelegerea relațiilor dintre anumite funcții,
și merge înapoi la voi vedea, de asemenea, ordinea de joc
și a modului în logica programului jocul se va continua.
Am citit codul de distribuție.
Prima funcție pe care ai de gând să doriți să pună în aplicare,
sau una dintre funcțiile pe care doriți să le pună în aplicare este egal,
și așa mai departe aici, aveți de fapt, un pic de libertate cu asta.
Dacă ne uităm la personalul soluția-
Mă duc pentru a deschide fereastra de terminal, de fapt,
pset3/scramble.
Scratch asta. Cred că am nevoie pentru a actualiza aparatul meu.
Dacă te joci cu soluție de personalul de scramble-
Instrucțiunile sunt în spec. pentru că-
le puteti vedea cum le-am imprimat tabla de joc,
dar, în esență ceea ce fac ei este că ei pun spații între fiecare caracter,
dar ai un pic de libertate cu acest lucru, așa că dacă doriți să imprimați linii, de exemplu,
între ele, atunci poti sa faci asta.
Vrei să gândesc la modul în care ne itera peste toate elementele unei matrice 2D,
și veți dori să imprimați pe cei, asigurați-vă că aveți bucla dvs.
și au funcții de imprimare astfel încât sunteți de imprimare în ordinea corectă.
Dacă doriți ca bucla ta repetare a-atunci când itera peste el
și să utilizați indicii asigurați-vă că sunteți de imprimare în ordinea corectă.
>> Confruntarea cu matrice 2D la început poate fi un pic confuz,
Deci, aici pe acest diapozitiv am făcut un tabel care vă arată
pentru fiecare loc dat în matrice 2D care indicii sunt,
așa că, dacă doriți să se refere la aceasta pentru o verificare rapidă
sau pentru o referință sau ceva de genul asta, atunci puteți folosi acest.
Coloanele sunt în albastru, iar rândurile sunt în roșu.
Funcția de căutare este dublu.
Căutare și este un boolean funcție-ne va spune
adevărat sau fals dacă cuvântul de utilizator-a prezentat
poate fi acceptată ca o valoare validă,
și astfel un cuvânt în goana este valabilă numai
în cazul în care este găsit în dicționar și, dacă este de fapt găsit în bord,
și amintiți-vă astfel încât de căutare va trebui să pună în aplicare acest lucru prin tine,
așa că vă doriți să verificați ambele lucruri,
dacă cuvântul este, de fapt, în dicționarul și dacă aceasta a fost deja găsit.
Amintiți-înapoi la dicționarul variabila globala,
care este un struct care le-am făcut, care are practic o dimensiune int numit
asociate cu acesta, precum și o serie de cuvinte,
în cazul în care cuvântul este un nou tip de date.
Deci, pentru a accesa, de exemplu, dimensiunea de dicționar sau matrice cuvinte,
atunci ce poti sa faci este doar scrie "dictionary.size,"
similar cu modul în care ar trebui să utilizați orice fel de alte variabile.
Deci, dacă dictionary.size reprezintă dimensiunea dicționarului,
În mod similar, dictionary.words reprezinta matrice.
Deci, dacă ai vrut să accesați un anumit cuvânt în cadrul dicționarul,
atunci va trebui să adăugați un index
pentru că ar trebui să spun "dictionary.words la indicele i"
și de a face apoi ceva bazat pe asta.
Deci, știind că dicționarul are o anumită dimensiune asociate cu aceasta,
precum și o serie de cuvinte, pentru a verifica dacă ceva e în dicționar,
atunci ar trebui să interate peste dicționarul
pentru a verifica dacă acest cuvânt se găsește.
>> Acum, dacă credeți înapoi la prelegere, atunci când am vorbit despre moduri diferite de a căuta lucruri,
apoi amintiți-vă că, probabil, căutarea liniară nu este întotdeauna cel mai bun mod de a merge.
Dar cu siguranta este o modalitate de a căuta ceva.
Uneori s-ar putea găsi pe care le pune în aplicare funcția găsi cu
căutarea liniară la început și apoi ajunge restul de programul tău merge.
Și apoi mai târziu puteți să mergeți înapoi și să modifice modul în care să căutați prin intermediul pentru un cuvânt.
Așa că abordează - practic știind că - a ști cum să acceseze
matrice cuvinte de dictionar, care abordează în căutarea pentru a vedea
dacă acest cuvânt este, de fapt, în dicționarul sau nu.
Dar apoi am nevoie pentru a aborda, de asemenea, dacă acest cuvânt este pe bord.
Și dacă această a fost găsit deja.
Deci, avem deja la funcția de găsire, amintiți-vă.
Acesta prezinta su, dar ceea ce este un cuvânt?
Aceasta nu este o întrebare filozofică, ci, mai degrabă, uita-te la definițiile de tip.
Avem un boolean numit "găsit", precum și matrice de caractere
care reprezintă acel cuvânt.
Deci, atunci când vă întoarceți de căutare, veți dori să verificați dacă acest cuvânt a fost găsit sau nu.
Acum, știind că boolean găsit - găsit este numele boolean
care este asociat cu fiecare cuvânt - atunci cum ar putea să vă accesați că variabila,
gândire înapoi la modul în care am accesat variabile în cadrul dicționar?
Deci, aici am avut dicționarul, iar apoi am spus dimensiune de punct, nu?
În mod similar, atunci când avem un cuvânt și, în acest caz, să fie atenți, pentru că
Cuvântul este orice fel de tip de date altul, la fel ca un int sau un șir de caractere.
Deci, nu se poate spune doar "cuvânt", cu excepția cazului în care este numele de ea.
Ai de gând să trebuie să aibă o variabilă cu un nume, și apoi o dată ce ați că,
spun că se numește foo, de exemplu, atunci vă pot spune "foo.found,"
și că va veți reveni valoarea Boolean dacă acest cuvânt a fost găsit sau nu.
>> Deci, atunci următoarea parte a PSET este de a pune în aplicare scramble,
prin care ori de câte ori utilizatorul introduce încăierare - și care a fost deja tratate cu
aici, în codul de distribuție - trebuie doar să pună în aplicare
scramble funcția pe care a fost deja instruit să vă rotiți bord 90 ° sensul acelor de ceasornic.
Ca pe spec., instrucțiunile spun că placa se rotește la 90 ° sensul acelor de ceasornic
astfel încât valoarea la grila [0] [0], apoi se mută la rețea [0] [dimensiune -1.]
În acest caz, pentru goana, dimensiunea noastră este de 4, deci ar mapa 0-0, apoi la 0-3.
Să trage asta pentru a vedea ce s-ar putea arata.
Eu nu am de gând să fac un 4 x 4 grilă, ci mai degrabă o x 3 3 una.
Să spunem acest lucru este o matrice 2D inch.
Sunt doar de gând să aibă doar - în regulă.
Deci, spune că vrem să coate în acest sens; vrem să-l rotiți 90 ° sensul acelor de ceasornic.
Știm că, ca punct de plecare, valoarea la 0-0, care în acest caz este de 0 număr,
este de gând să se mapeze la rând 0, apoi dimensiune coloana -1.
Și așa că, în acest caz, dimensiunea este de 3.
Deci, apoi 0 s-ar muta la rând 0, coloana 2.
Deci, avem 0 Numărul acolo.
În esență, ceea ce facem este că luăm acest lucru,
fizic o mișcare de rotație, astfel, atunci 2 va merge la acest colț,
8 ar merge apoi la acest colț, 6 la aceasta.
Și apoi restul va arăta -
Deci, asta e ceea ce pare a fi o grilă de când v-ați-l amestecate.
Când sunteți de punere în aplicare funcția scramble, ceea ce veți dori să facă
este a se vedea, de asemenea, cum pot înlocui aceste valori?
Există un fel de tipar sau un fel de formulă pentru a determina
în cazul în care un anumit indice merge?
De exemplu, s-ar putea să vedem că aici este 3-4-5 un rând.
Unde altundeva văd 3-4-5?
Ei bine, eu o văd aici.
În mod similar, văd ca un rând 6-7-8, dar apoi este de fapt o coloană aici.
Asta e modelul pe care văd chiar acum, dar există, probabil, cele cateva altele.
Bazat pe faptul că, cred că de un fel de model, un fel de drum.
Odată ce ați identificat pe unul, atunci ai de gând să doriți să resetați valorile din grila.
Deci, grila va deveni 0-0 6, 0-1 grila va deveni 3.
Dar amintiți-vă că veți avea - de exemplu, dacă vă resetați imediat,
spun că grila 0-2 devine 0 acum, atunci vei pierde ceea ce 2 a fost acolo.
Deci gândire înapoi, nu e suficient să realocați doar imediat.
Veți dori probabil să faceți o copie temporară a ceva
înainte de a vă pune de fapt l la locul potrivit.
>> Ultimul lucru este de a pune în aplicare insensibilitate caz.
Dacă te uiți înapoi, căutare la fața locului, în cazul în care specificațiile de utilizare intrări un șir.
Dacă vă amintiți înapoi, gândindu-mă înapoi la - oh, am sters harta.
Dacă credeți că înapoi la harta de programul tau, e în funcția principală,
asa ca uite unde ai de a face cu șirul de utilizator introduse,
și apoi, în cadrul acolo, cred că de instrumentele pe care le-ați învățat de la dvs.
cripto PSET, PSET 2, și atunci cred că de moduri în care ați putea fi în măsură să
permite ca datele introduse de utilizator regim mixt.
Astfel încât acestea ar putea avea un amestec de litere mari și a minusculelor, dar că ar trebui să fie încă valabile.
În dicționar, amintesc când am deschis acel fișier, fiecare cuvânt a fost depozitat ca toate majuscule.
Dar noi nu vrem ca utilizatorul să aibă la intrare majuscule tot timpul.
Poate cineva gândi la o modalitate pe care am putea fi în măsură să permită utilizatorului,
chiar dacă acestea introduse toate cu litere mici, de exemplu? Da?
[Student] Ai putea face pentru a sus?
Da, exact. Ai putea face la partea superioară.
Deci, ai putea converti toate literele în majuscule, iar apoi
în acest fel vă asigurați că va fi o copie exacta
de ce a mai găsit în dicționar, dacă e în dicționar.
Mare. Avem un pic de timp stanga.
>> Deci, unele lucruri pe care le-ar putea întâlni în această PSET este nevoie să știi
ce variabilele sunt la un anumit moment în timp.
Pentru ca in spec. avem funcția de clar că practic
șterge tot ce ați desenat pe tablă, șterge totul și apoi rescrie pe deasupra,
s-ar putea, în timp ce scrii PSET nu, vreau să se întâmple asta.
Pentru că veți dori să vedeți, bine, o dată ce am introduceți în această încăierare, de exemplu,
o dată am intra în încăierare, ce face și ceea ce a fost înainte, doar pentru referință.
Deci, atunci ceea ce ați putea dori să faceți este să mergeți înapoi la funcția principală
și comentați clar, de exemplu.
Deci, atunci când executați programul data viitoare,
programul nu va fi clar în loc și va păstra doar pe imprimarea pe deasupra.
Există câteva modalități de a diagnostica alte asemenea.
Ce ai putea face este puteți include declarații de imprimare f, cred.
Un lucru pe care l-am văzut în psets că am fost clasificate ca oamenii inclus declarații de imprimare f
pentru a imprima variabile la un anumit moment în timp pentru a urmări.
Dar asigurați-vă doar că, la final, după ce ați terminat de scris toate declarațiile de imprimare f
pentru tine de a urmări lucrurile, pe care le comentati după aceea,
sau a le șterge o dată ce ați terminat.
Asta e un alt mod de faptul că ai putea face ceva, ai putea scrie doar intr-o declaratie f imprimare
undeva că e relevant și să vedeți, bazat pe ceea ce terminalul imprimă,
ce a fost variabila.
>> Un alt mod de a face acest lucru, că vom intra în mai multe detalii în timpul prelegerii,
este GDB, care este un instrument de depanare.
În esență, atunci când îl rulați, acesta va intra în programul tău și tu îl poți avea avansa
un singur pas la un moment dat în loc de evaluare a tot ceea ce.
Deci, atunci puteți să-l rupe în sus, în pași mici, iar apoi pe drum -
și apoi de-a lungul modul în care lucrurile de imprimare și a vedea ce valori sunt.
Și care vă ajută să îți dai seama în cazul în care un bug în codul dvs. s-ar putea sa fie.
Ce am putea face chiar acum este a scrie o funcție rapidă și apoi
a se vedea modul în care am putea fi capabili de a utiliza GDB pentru a vedea ce se întâmplă.
Așa că haideți să avem un int principal, și apoi ce avem ca parametri principal?
Avem int arg C, și arg șir V.
Am de gând să salveze acest pas cu pas cum GDB.z. Bine.
Am de gând să aibă retur 0.
Deci, cum despre hai sa avem doar o simplă pentru buclă; să aibă 12.
Să aibă, de asemenea, un nume int contor, și
putem porni de la faptul că 0. Bine.
Deci, la fiecare punct în bucla de, să spunem că dorim să crească contra
sau multiplica prin orice i este.
Aceasta este o funcție destul de scurt.
Să facem GDB. Oh! Și apoi - zăngănit este inteligent.
Spune-mi că nu am includ cs50.h.
Bine. Deci, acum vrem să -
De fapt, Îmi pare rău băieți. Am de gând să redenumiți fișierul doar pentru că e un pic confuz.
>> Bine. Deci, acum ce vrem să facem este, vrem să pornim de GDB.
I-am spus "depanare GDB,", astfel încât în ​​esență, că va fi setat pentru a concentrându-se pe această depanare,
depanarea fișierului.
Am de gând să pun un punct de întrerupere.
În esență, programul este de gând să ruleze până când hit-uri la un punct de întrerupere anumit.
Am de gând să spun pauza la funcția principală.
Deci, acum am de gând să ruleze depanare, așa interiorul GDB pot rula cod.
Este rularea programului, și chiar dacă principal a fost unul din primele lucruri pe care le-a scris,
avem, de asemenea, fișierele includ; acolo se întâmplă lucruri pe deja.
Ea are punct de control la principal.
Să spunem "viitor", astfel încât să putem continua.
Se spune "int contor = 0."
Am de gând să spun "imprima contra."
Acest lucru este ciudat. Deci, în esență, ne așteptăm să fie contoare 0,
dar GDB este un pas înapoi, astfel încât de fiecare dată când spune în continuare,
se spune contorul int = 0. Asta e urmatorul lucru pe care-l va executa.
Apoi faceți clic - vă pot spune următorul nou, sau vă pot spune doar "n",
și acum dacă imprimați contra, contor este 0, așa cum ne așteptăm.
Practic, se creează un fel propriu de variabile pentru ea, dar orice e acolo -
Vrei chiar aici, că e ceea ce reprezintă contra.
Așa că am de gând să faceți clic pe Următorul, și vreau să știu ce i este.
Vei imprima i, i este 0, așa cum ne așteptăm.
Next din nou, se indică faptul că se trece prin bucla din nou pentru,
așa că, dacă I ​​i imprima, de exemplu, pot vedea că suntem pe - care i este în prezent 1.
Deci asta e un fel, că, dacă setați un punct de întrerupere la o anumită funcție
și să păstreze apoi pe merge următoare, și apoi verificând ceea ce i este,
dacă aveți o bănuială că poate undeva, ceva nu se întâmplă așa cum ar trebui,
și bănuiți că poate e de la primul indice sau indicele ultimul sau ceva,
puteți utiliza GDB, continua imprimarea i, pentru a fi în măsură să verificați aceste valori sunt.
Deci, în GDB, deoarece imprimare și viitoare sunt astfel de argumente comune,
comenzi comune, așa cum am abreviat lângă la n,
Eu pot, de asemenea, spun doar p. contra, că e încă 0.
Apoi am faceți clic pe Următorul. Vreau să imprimați din nou contra.
Ei bine, așa că e încă 0.
>> Și tu ești un fel de mirat - ei bine, vreau să fie contra o funcție factorial.
De ce - doar în tehnici de depanare - de ce ar putea fi?
De ce nu este în creștere contra valoarea acestuia?
De ce este sejurului lor la 0?
Ei bine, aici am - înapoi aici, eu zic contra = x i contra.
Deci, dacă mă întorc la începutul funcția mea,
Văd că atunci când am am imprimat, i este 0, și ceea ce este 0 x ceva?
E 0, nu? Deci, asta e, probabil, motivul pentru care contorul
nu este niciodată de gând să fie orice alt număr.
Deci, atunci ceea ce am putea dori să faceți este să se întoarcă la fuction meu,
cuvânt de spus, bine, bine, de fapt, vreau să-l înceapă la 1.
Este că va rezolva lucrurile?
Nu chiar, deoarece contorul este încă 0 aici.
Deci, haideți să stabilit că la 1.
Dorim să resetați instrumentul nostru de depanare, asa ca hai sa renunte.
Și atunci ce putem face este, putem GDB depanare din nou,
pune o pauza de la principal, iar apoi executați din nou depanare, viitoare, în continuare, următoarea.
Să lovit următoare de câteva ori, iar apoi vom imprima contra, văd că -
nu am face în mod corect fișierul din nou.
Chiar dacă am schimbat codul sursă, atunci noi de fapt
nu au actualizat executabil nostru.
Eu cred că puteți face - Da.
În cadrul GDB în sine, puteți face de fapt fișierul.
Deci, tu nu trebuie să renunțe la GDB din nou.
Puteți reveni la fișierul sursă, salvați-l, înapoi în GDB, poți face din nou.
Mare. Deci, haideți să fugi de depanare.
Vrem să-l pornească de la început, deoarece avem un executabil nou.
Putem merge printr-o de câteva ori, iar apoi imprimați i, imprimați contra, continua.
Bine. Deci, acum vedem că, de fapt contra este în creștere valoarea sa ca vrem sa-l.
>> Asta e doar o mica mica muscatura de dimensiuni exemplu despre cum ați putea folosi GDB
pentru a introduce codul dvs., imprimați anumite valori, faceți clic pe lângă pentru a trece la următoarea linie,
și abrevierea și imprima-l.
În mod evident, codul în scramble este un pic mai complex decât atât, dar ceea ce se poate face
este stabilit un punct de control la - puteți seta un punct de control la funcțiile de căutare, ceva de genul asta.
Deci, ori de câte ori acesta ajunge la punctul în care trebuie să se uite ceva,
atunci GDB va rula tot până în acel moment și apoi puteți începe valori de imprimare afară.
Ca este mărcile în acest moment fals sau este adevarat?
Asta e, probabil, ceva care ar putea să doriți să utilizați.
GDB, nu te stresa prea mult despre asta,
pentru că vom intra în mai multe detalii în curs,
dar am vrut doar sa stiu cum voi ați putea fi capabil să-l utilizați
dacă sunteți obtinerea început cu PSET și doresc să înțeleagă
o cale mai bună decât a pune doar declarații de imprimare f și aruncării la gunoi-le pe toate prin codul.
Având în GDB pentru a imprima de fapt, pentru tine și pentru a fi în măsură să stabilească aceste puncte de întrerupere
astfel încât programul poate rula până la un anumit punct
și se lasă apoi să-și intensifice într-adevăr în ea și dau seama de problema acolo.
>> Corect. Deci, dacă ne uităm înapoi la încăierare, am citit codul de distribuție.
Am vorbit despre o modalitate de a itera peste matrice 2D, și veți siguranta
să fie dorința de a repeta peste matrice 2D, atunci când vin la desen grila de joc.
Am vorbit despre funcția de căutare, despre modul în care vrem să ne asigurăm de un cuplu de lucruri.
Dorim să ne asigurăm că nu am fost la cuvântul înainte.
De asemenea, dorim să vă asigurați că acesta este de fapt în dicționar.
Apoi am vorbit despre goana, despre cum vrem să rotiți bord.
Și știind că ați putea dori să faceți o copie a ceva
pentru a fi capabil să-l mute.
În cele din urmă, am vorbit despre caz și sensibilitate, despre modul în care doriți să vă asigurați
că, în ciuda indiferent de combinație de cazul în care intrările de utilizator,
dacă e un cuvânt valabil în dicționar,
atunci va fi găsit în mod corect.
Deci, atunci toate că împreună este PSET scramble, și că este walkthrough 3.
Multumesc tuturor pentru venit, și de noroc cu scramble.
CS50.TV