>> [Rishikimi: Quiz 1]
[Ali Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Universiteti i Harvardit]
[Kjo është CS50.] [CS50.TV]
[Lucas Freitas] Mirë se vini të gjithë. Ky shqyrtim është për quiz 1.
Ashtu si një mohim, ky është - Unë do të thotë, ne do të përpiqemi për të mbuluar
sa më shumë material të jetë e mundur, por kjo nuk do të thotë se
ne jemi duke shkuar për të mbuluar të gjitha gjërat që mund të jenë në quiz 1.
Pra, të jetë i sigurt që ju të merrni një vështrim në leksion, seksione, çdo gjë që ju mund.
Quiz 1 do të jetë të mërkurën, të mërkurën e ardhshme.
Pra, të jetë i sigurt për të studiuar. Ajo do të jetë, shumë e shumë, si quiz e parë
në lidhje me format e saj, por ajo ndoshta do të jetë shumë më të vështirë.
Të paktën, vitin e kaluar kur mora 50, kam menduar se ishte shumë më të vështirë.
Kështu që studiojnë shumë.
>> Unë jam duke shkuar për të mbuluar të strukturave të të dhënave dhe Huffman kodimit.
Kjo është diçka që shumë njerëz mendojnë se është komplekse,
por unë do të përpiqet për ta bërë atë sa më lehtë.
Para së gjithash, ajo që ne duam që ju djema të dini për quiz 1 është që të
kuptojnë përshkrimet konceptuale të secilës prej strukturave të të dhënave që unë jam duke shkuar për të paraqitur.
Kjo do të thotë që ju nuk duhet të vërtetë
zbatojë një tabelë hash në quiz tuaj 1.
Ne nuk duam që ju të zbatuar një tabelë hash të tërë, ndoshta ne do të përpiqemi
për të bërë ju të zbatojë disa funksione,
operacionet më të zakonshme, por ne nuk do të bëjë që ju të zbatuar çdo gjë.
Pra, është e rëndësishme që ju të kuptoni konceptin pas çdo strukturën e të dhënave
dhe gjithashtu se ju jeni në gjendje të kodin në C,
vetëm operacionet më të zakonshme që ata kanë për çdo strukturën e të dhënave.
Dhe gjithashtu të jetë në gjendje për të shqyrtuar pointers dhe structs,
sepse ata shfaqen shumë në këto struktura të dhënave.
>> Së pari, listat e lidhura. Listat e lidhura në të vërtetë janë shumë të ngjashme me vargjeve,
por diferenca midis listën e lidhur dhe një grup,
para së gjithash, është se një listë e lidhur ka një madhësi shumë fleksibil,
ndërsa në vargjeve ju duhet ose të zgjidhni një madhësi shumë të madhe për grup,
kështu që ju e dini se ju jeni do të jetë në gjendje për të ruajtur të gjitha të dhënat tuaja në këtë grup,
ose ju duhet të përdorin malloc që të ketë një gjatësi fleksibël të array.
Në listat e lidhura është shumë e lehtë për të vetëm të merrni më shumë elemente,
vënë më shumë elemente në listën e lidhur ose hequr elementet.
Dhe në të vërtetë, në qoftë se ju nuk doni në listën e lidhur të zgjidhet,
ju mund të kërkoni dhe të hequr elementet në kohë të vazhdueshme,
kështu O (1) herë, kështu që është shumë i përshtatshëm.
Ju vetëm duhet të jenë të kujdesshëm për të gjithmonë mos harroni të malloc dhe pa nyjet,
vetëm për shkak se në qoftë se ju nuk e bëni, ju do të keni rrjedhjet e kujtesës.
Listat Pra lidhura - përkufizimi i një nyje është vetëm si ajo që ne kemi të drejtë atje.
I vënë int n, por ju mund të ruajë ndonjë të dhënat që ju dëshironi.
Pra, nëse ju doni të ruajtur një varg, kjo është në rregull.
Nëse ju doni të ruajtur një e strukturës, kjo është në rregull, një të dyfishtë, çdo gjë që dëshironi.
Unë vetëm vënë int n për shembujt këtu.
Dhe ju keni një tregues për nyjen e ardhshëm.
Pra, në thelb, një listë e lidhur ka disa të dhëna, dhe më pas ajo vë në nyjen e ardhshëm.
Në qoftë se kjo është elementi i fundit në listën e lidhur, ajo do të tregojnë për null.
Pra, ky është një shembull i një liste të lidhura.
>> Mirë, kështu që tani le të shohim se çfarë duhet të bëjmë në qoftë se unë dua të futur një element në listën e lidhur.
Së pari, një insert funksion do të jetë e tipit pavlefshme
sepse unë nuk dua të kthehen asgjë.
Dhe unë jam duke shkuar për të marrë një int si argument,
sepse unë dua të di se çfarë unë dua të futur.
Pra, çfarë është gjëja e parë që duhet të bëjë? E pra, unë duhet të malloc në newNode,
kështu që është vija e parë.
Unë jam vetëm duke krijuar një nyje të re për të vënë në listën e lidhur.
Pra, çfarë mund të bëj? E pra, ne e dimë se në Implementimi tona të listave të lidhur
në klasë, ne gjithmonë vënë kokën si një ndryshore globale.
Pra, çfarë mund të bëjmë është të ndryshojë kokën.
Unë mund të bëjë këtë nyjë e re të jetë kreu i ri,
dhe ajo do të tregojnë për kokë mëparshme.
Si mund ta bëjë këtë? Gjëja e parë që duhet të bëni
është ndryshuar 'n' në nyjen e re në vlerë,
e cila u miratua me funksionin.
Pastaj newNode më tej do të jetë kreu.
Kreu do të jetë newNode. Pra, është shumë e thjeshtë.
Për të fshirë një nyje, ne mund të bëjmë atë si -
Një mënyrë ne mund të bëjmë që do të thotë,
në rregull, nëse kam kërkuar për të fshirë, për shembull, 3,
ajo që unë mund të bëj është vetëm pikë nyjen e mëparshme
në nyjen e ardhshëm të 3.
Kështu që unë vetëm do të bëjë diçka të tillë.
Por ajo që është problem me të bërë këtë?
Unë kam një rrjedhje kujtesës, kështu që unë nuk kanë qasje në numrin 3 më.
Problemi me këtë është se unë nuk jam do të jetë në gjendje për atë nyje lirë.
Unë jam do të ketë rrjedhje kujtesës dhe (i pakuptueshëm) do të më urrejnë.
Pra, në vend të bërë këtë, unë duhet të kishte një tregues të përkohshme.
Kështu që unë vë temp. Ajo do të tregojnë për nyjen që dëshironi të fshini.
Dhe atëherë unë mund të lëvizin nyjet mëparshme pikës në nyjen e ardhshëm
i nyjeve që dëshironi të fshini.
Dhe së fundi, unë mund të lirë akrep.
A duhet për të liruar treguesin që kam krijuar atje?
Unë nuk kam për të, vetëm për shkak se -
Dallimi është se kjo nyje është krijuar duke përdorur malloc,
kështu që është në grumbull, ndërsa kjo u shpall vetëm si një kaloni NULL në rafte.
Kështu që unë nuk kam për të liruar atë.
Mirë >>. Pra, tani le të flasim për oxhaqet.
Oxhaqet janë shumë i thjeshtë.
Ne e bëmë shumë paratë dhe radhët e gjata në klasë vetëm duke përdorur vargjeve,
por ju duhet të jetë njohur - vetëm të jetë i vetëdijshëm
që ju mund të bëni shumë paratë në rradhë duke përdorur listat e lidhura si.
Pra, nëse ju keni një rrjet, çfarë do të jetë e bollshme?
Një turrë, së pari, do të duhet të ketë një madhësi.
Ju duhet për të ruajtur atë që është madhësia e rafte që ju keni të drejtë tani.
Dhe gjithashtu ju do të keni një rrjet, në këtë rast të numrave,
por në qoftë se ju dëshironi, ajo mund të jetë një grup
e strings, një grup i struct, çdo gjë që ju dëshironi për të ruajtur.
Rreth rafte: Dallimi në mes të një pirg dhe listën e lidhur
është se në rafte ju vetëm keni qasje në element i fundit që ishte vënë në rafte.
Ajo që quhet e shkuar në, së pari jashtë.
Ashtu si ju keni një pirg të tabaka,
në qoftë se ju vendosni një tabaka në krye të rafte,
ju duhet të hiqni atë tabaka pari që të ketë qasje në tabaka të tjera.
Është e njëjta gjë me oxhaqet.
Pra, nëse unë dua të, për shembull, shtoni një element në një pirg, çfarë duhet të bëj?
Ajo që quhet shtytje, dhe kjo është shumë i thjeshtë.
Gjëja e parë që ju duhet të bëni është të kontrolloni nëse madhësia e rafte
nuk eshte me e madhe ose e barabarte me kapacitet të pirg.
Sepse në qoftë se ju tashmë jeni në kapacitet të plotë, ju nuk mund të shtoni ndonjë gjë tjetër.
Dhe pastaj në qoftë se jo, ju vetëm duhet të shtoni element të rafte.
Dhe së fundi, rritje e madhësisë. Pra, është shumë i thjeshtë.
Kështu që unë vetëm të shtoni numrin 2.
Dhe në qoftë se unë dua të pop, që do të thotë se unë dua të hequr
element i fundit që u shtua dhe kthimin vlerën e elementit,
gjëja e parë që duhet të kontrolloni është se nuk rafte është bosh.
Sepse në qoftë se është bosh, unë nuk mund të kthehen asgjë.
Në këtë rast, unë jam kthyer -1.
Përndryshe, unë jam duke shkuar për pakësim madhësinë e spekulim,
dhe të kthehen numrat (s.size).
Pse unë pakësim madhësinë dhe pastaj s.size kthehen?
Kjo për shkak se, në këtë rast, spekulim ka madhësi 4,
dhe unë dua të kthehen elementin e katërt, e drejtë?
Por ajo që është indeksi i elementit të katërt? Tre.
Që unë e madhësisë - do të jetë 3, unë vetëm mund të kthehen s.numbers (s.size)
sepse është e 3. Pra, kjo është vetëm indeksi.
Tani >> rradhët. Radhët e gjata janë shumë e shumë të njëjtën gjë.
I vetmi ndryshim është se në vend të fundit në, së pari jashtë,
ju keni parë në, e parë jashtë.
Ndoshta, nëse ju jeni duke pritur për të shkuar në një koncert,
ju nuk do të jenë të lumtur nëse keni pasur një pirg në vend të një radhë.
Duke qenë personi i fundit që do të vijnë do të jetë personi i parë për të hyrë në koncert.
Ju ndoshta nuk do të jenë të lumtur.
Në radhë, personi i parë për të marrë në është edhe personi i parë për të marrë jashtë.
Pra, në përkufizimin e një radhë, përveç që ka madhësinë në rrjet,
ju gjithashtu duhet të ketë kokë, e cila është indeksi në krye të rafte.
Pra, elementi i parë tani.
Enqueue është e njëjta gjë si shtytje për oxhaqet.
Nëse keni qenë shumë naive, ju do të thonë vetëm,
mirë, unë vetëm mund të bëjë të njëjtën gjë si unë e bëri për shtytje.
Unë mund të shikoni vetëm në qoftë se ajo nuk është përtej kapacitetit.
Në qoftë se kjo është, unë kthimit të rreme, përndryshe unë mund vetëm të eksportit vlera të reja
dhe pastaj rritje e madhësisë.
Por pse është kjo e gabuar?
Le të shohim këtë shembull.
Unë jam duke u përpjekur për të enqueue një bandë e gjëra,
dhe atëherë unë jam duke shkuar për të dequeue dhe enqueue.
Ka shumë e komandave, por kjo është shumë e thjeshtë.
Unë jam duke shkuar për enqueue 5, kështu që shtoni 5, dhe pastaj 7,
1, 4, 6, dhe pastaj unë dua të dequeue diçka,
që do të thotë se unë jam duke shkuar për të hequr elementin e parë.
Kështu që unë jam duke shkuar për të hequr numrin 3, e drejtë?
Elementi i parë. Mirë.
Tani në qoftë se unë të përpiqet për të enqueue diçka tjetër, çfarë do të ndodhë?
Sipas zbatimit tim,
Unë kam qenë duke shkuar për të vënë numrin e ardhshëm në tregues të q.size.
Në këtë rast, madhësia është 8,
kështu që indeksi 8 do të jetë e drejtë këtu në pozitën e fundit.
Nëse unë të përpiqet për të enqueue 1 të drejtë këtu, unë do të overwriting pozitën e fundit
me numrin 1, i cili eshte teresisht keq.
Ajo që unë dua të bëj është të përfundojë rreth dhe të shkojnë në vendin e parë.
Ndoshta ju do të them vetëm, mirë, unë vetëm duhet të kontrolloni
në qoftë se unë në fakt mund të vënë diçka atje.
Nëse jo, unë vetëm them, oh, kapaciteti i ri i plotë
është në fakt kapaciteti - 1, dhe ju nuk mund të vendos një element atje.
Por, çfarë është problemi? Problemi është se në qoftë se unë vetëm dequeue çdo gjë të drejtë këtu
dhe atëherë unë të përpiqet për të shtuar diçka tjetër, ajo do të thonë vetëm,
mirë, keni qenë në kapacitet të plotë, e cila është 0.
Pra, radhë juaj është zhdukur.
Ju duhet të përfundojë rreth, dhe një mënyrë për mbështjellës rreth
se ju djema mësuar në vizionare dhe të tjera psets është duke përdorur mod.
Ju mund ta provoni atë në shtëpi për të kuptuar pse ju do të bëni q.size + q.head
Kapaciteti mod, por në qoftë se ju kontrolloni të drejtë këtu,
ne mund të shohim se ajo punon.
Kështu në shembullin e fundit, q.size ishte 8
dhe kreu ishte 1, sepse ishte ky pozicion këtu e array.
Pra, kjo do të jetë 8 + 1, 9. Kapaciteti Mod 9 do të jetë 0.
Ajo do të shkojë në indeksin 0. Ne do të jetë në pozitën e drejtë.
Dhe pastaj të përpiqet radhë në shtëpi.
Disa gjëra të rëndësishme: të përpiqet për të kuptuar dallimin në mes të një pirg dhe një radhë.
Në shtëpi, të përpiqet të marrë shumë të njohur me zbatimin e enqueue, dequeue, shtytje dhe pop.
Dhe gjithashtu e kuptojnë kur ju do të përdorni secilin prej tyre.
>> Pra, le të pushojnë për 10 sekonda me një bandë e Pokemons.
Dhe tani le të kthehemi në strukturat e të dhënave.
Hash tavolina. Shumë njerëz ishin të frikësuar e tabelave hash.
në problem i vendosur 6, Spell Checker.
Tavolina Hash dhe përpiqet, shumë njerëz të frikësuar prej tyre.
Ata mendojnë se ata janë aq të vështirë për t'u kuptuar. Po?
[Rob Bowden] Problem vendosur 5. >> Problem vendosur 5, po. Faleminderit Rob.
Po. Gjashtë ishte Huff n 'pudre, po.
Problem vendosur me 5 u Spell Checker, dhe keni pasur për të përdorur një tabelë hash apo një provoni.
Shumë njerëz mendonin se ata ishin super e vështirë për të kuptuar, por ata janë në të vërtetë shumë e thjeshtë.
Çfarë është një tabelë hash, në thelb? Një tabelë hash është një grup i listave të lidhura.
I vetmi ndryshim midis një rrjet dhe një tabelë hash
është se në tabelën hash ju keni diçka të quajtur një funksion hash.
Çfarë është një funksion hash?
Unë nuk e di nëse ju djema mund të lexoni këtu.
Ky është një shembull i një tabelë hash.
Kështu që ju mund të shihni se ju keni një rrjet me 31 elemente.
Dhe ajo që ne bëjmë në një tabelë hash po kanë një funksion hash
që do për të përkthyer një çelës, çdo int të një indeksi.
Nëse, për shembull, në qoftë se unë dua të zgjedhin për B. Harrison,
Unë do të vënë B. Harrison në funksionet e mia hash,
dhe funksion hash do të kthehen 24.
Kështu që unë e di që unë dua të ruajtur B. Harrison në 24.
Pra, kjo është dallimi në mes të vetëm duke pasur një rrjet dhe të kesh një tabelë hash.
Në tabelën hash ju do të keni një funksion që do të ju tregojnë se
ku për të ruajtur të dhënat që ju dëshironi për të ruajtur.
Për funksionin hash, ju dëshironi të shikoni për një funksion hash
që është determinist dhe i shpërndarë.
Siç mund ta shikoni këtu, ju shihni se një shumë e të dhënave që kam kërkuar për të dyqan ishte në të vërtetë 19
në vend të përdorimit 31 dhe 30 dhe 29, të cilat ishin të gjithë të lirë.
Pra funksion hash që kam përdorur nuk ishte shumë mirë-shpërndarë.
Kur themi të mirë-shpërndarë, kjo do të thotë se ne duam të kemi,
afërsisht, të paktën 1 ose 2 për secilin prej -
si, një diferencë prej 1 ose 2 për secilin nga treguesit në vargjeve.
Ju dëshironi që të ketë, afërsisht, numër të njëjtë të elementeve në çdo listë e lidhur në rrjet.
Dhe është e lehtë për të parë nëse është e vlefshme në tabelë hash, shohin si tavolina hash.
Pastaj >> pemë. Kjo është një pemë.
Pemë në shkenca kompjuterike janë me kokë poshtë për disa arsye.
Pra, këtu ju keni rrënja e pemës dhe pastaj gjethet.
Ju duhet vetëm të dini nomenklatura për prindërit dhe fëmijën.
Çdo nyjë ka fëmijë të saj, të cilat janë nyjet që janë nën prind.
Kështu, për shembull, 2 do të jetë prind për 3 dhe për fëmijën tjetër të drejtë atje,
ndërkohë që 3 do të jetë prind për 1 dhe fëmijët e tjerë që janë atje.
Dhe 1 do të jetë fëmija i 3 është, dhe kështu me radhë.
Ne kemi diçka shumë më interesante, të quajtur një pemë kërkim binar,
në të cilat të gjitha vlerat për të drejtën e një nyje
do të jetë në të djathtë, të drejtë këtu - në të djathtë,
do të jetë më i madh se elementit në të rrënjës.
Pra, në qoftë se unë kanë numrin 5 të drejtë këtu, të gjitha elementet për të drejtën
do të jetë më i madh se 5, dhe majtas
të gjitha elementet do të jetë më pak se 5.
Pse është kjo e dobishme?
E pra, në qoftë se unë dua të kontrolloni nëse numri 7 është këtu, për shembull,
Unë thjesht shkoni në 5 të parë dhe unë jam duke shkuar për të parë, është i 7 më i madh apo më pak se 5?
Kjo është më e madhe, kështu që unë e di se do të duhet të jetë në të djathtë të pemës.
Pra, unë kam shumë më pak gjëra për të parë.
Në zbatim të një pemë binare e kërkimit, nyjen, unë jam vetëm do të duhet të ketë të dhëna,
kështu int n, ju gjithashtu mund të ketë një varg
ose çdo gjë që ju të kërkuar.
Ju vetëm duhet të jenë të kujdesshëm në përcaktimin e asaj që është më e madhe, ajo që është më pak.
Pra, në qoftë se keni pasur vargjet, për shembull, ju mund të përcaktojë
se të gjitha ato gjëra për të drejtën do të ketë gjatësi më të madhe,
majtë do të kenë gjatësi të ulëta, kështu që është me të vërtetë deri te ju.
>> Si mund të zbatojë të gjejnë për BST?
Gjëja e parë që ne do të duhet të bëni është të kontrolloni nëse rrënja është NULL.
Nëse është e NULL, kjo do të thotë se gjëja nuk është atje
sepse ju nuk keni edhe një pemë, të drejtë?
Kështu që unë kthimit të rreme.
Përndryshe, unë jam duke shkuar për të parë nëse numri është më i madh
se vlera në rrënjë.
Unë do të përpiqen për të gjetur elementin në të djathtë
nga pema.
Ju shikoni që unë jam duke përdorur recursion këtu.
Atëherë, nëse është më pak, unë jam duke shkuar për të parë në të majtë.
Dhe së fundi, përndryshe, në qoftë se nuk është pak apo jo më e madhe,
kjo do të thotë se kjo është vlera e vetë.
Kështu që unë vetëm të kthehet e vërtetë.
Ju mund të shihni këtu se kam përdorur në qoftë se, në qoftë se, në qoftë se.
Dhe mbani mend, në quiz 0, kemi pasur një problem që kishte, nëse, nëse, nëse,
dhe ju është dashur për të gjetur jo-efikasitetin,
dhe mungesa e efikasitetit ishte se nëse keni përdorur.
Ju duhet të keni përdorur në qoftë se, tjetër në qoftë se, tjetër në qoftë se, dhe tjetër.
Pra, duhet të përdor tjetër në qoftë se dhe tjetër në qoftë se dhe tjetër këtu?
A ka dikush - po?
[Student folurit, e padëgjueshme]
Është i përsosur. Kështu ajo është duke thënë se kjo nuk ka rëndësi,
vetëm për shkak se mosefikasiteti që kemi pasur më parë
ishte se për shkak se, ndoshta në qoftë se disa kusht është i kënaqur,
kështu që ju keni kryer një veprim, por atëherë keni qenë duke shkuar për të kontrolluar të gjitha kushtet e tjera.
Por në këtë rast, ai u kthye menjëherë, kështu që nuk ka rëndësi.
Pra, ju nuk keni për të përdorur tjetër në qoftë se.
>> Dhe së fundi, le të flasim për përpiqet,
e cila është e preferuar të gjithëve.
Një try është një dru i vargjeve.
Është shumë shpejt për të parë deri vlerave, por ai përdor një shumë të kujtesës.
Dhe kjo është zakonisht për të filtruar fjalë, kështu që kur ju
duan për të zbatuar, për shembull, unë nuk e di, si një libër telefoni në telefonin tuaj
dhe ju duan të jenë në gjendje të tipit B
dhe vetëm kanë emrat e njerëzve që kanë B.
Është shumë e lehtë për të zbatuar se duke përdorur një provoni, për shembull.
Si mund të përcaktojë një nyje në një provoni?
Ju vetëm duhet të ketë një bool që do të jetë is_word.
Kjo përfaqëson se duke përdorur të gjitha personazhet para kësaj nyje,
ju jeni në gjendje për të formuar një fjalë,
dhe pastaj ju do të keni një rrjet të pointers në nyje.
A mund të shihni se ne kemi një rrjet të nyjave prind, kështu nyje * rrjet? Po?
Pra, le të shohim se si do të punojnë. Për spell check,
ne kemi një rrjet të 27 elementeve,
sepse ne kemi të gjitha letrat e plus apostrof.
Para se këtu unë jam vetëm do të përdorë 2 sepse unë dua të jem në gjendje për të shkruar në bord.
Mirë. Pra, ky është një shembull i një përpjekje.
Në qoftë se unë vetëm të përcaktojë nyjen e parë, unë do të ketë një rrjet të 2 elementeve
se janë 2 pointers në NULL, kështu që unë vetëm vënë 'a' dhe 'b'.
Dhe unë jam i do të ketë një bool që thotë is_word.
Ajo do të jetë e rreme për një të parë,
vetëm për shkak se, para se ju nuk keni ndonjë karakter.
Pra, një fjalë e zbrazët nuk është një fjalë. Kështu që është e rreme.
Nëse unë dua të shtoj 'a' të këtij fjalori, çfarë do të duhet të bëj?
Unë vetëm do të duhet të malloc një nyje të re për 'a',
dhe pastaj shtoni fjalën e saj të vërtetë.
Pra, ai thjesht përfaqëson se ka 'një' do të jetë e vërtetë. Kuptim?
Pastaj në qoftë se unë dua të shtoj 'ba', unë do të duhet të malloc 1 për "b",
dhe atëherë unë jam duke shkuar për të ngritur boolean të rreme,
sepse 'b' në vetvete nuk është një fjalë.
Atëherë unë jam duke shkuar për malloc një tjetër për 'a', kështu që 'ba',
dhe atëherë unë jam duke shkuar për të ngritur kjo është një fjalë të vërtetë.
Sepse 'ba' është një fjalë.
Atëherë, nëse unë dua të parë nëse 'b' është në këtë fjalor,
Unë vetëm mund të shkojnë në një të parë, "b". Unë shkoj poshtë, dhe unë shoh në është fjala, dhe ai thotë se rreme.
Pra, kjo nuk është një fjalë. Nëse unë dua të shikoni 'ba',
Unë shkoj në një të parë, "b", dhe pastaj të shkoni në 'a', dhe unë shoh e vërtetë, kështu që është një fjalë. Kuptim?
Shumë njerëz të marrë hutuar nga përpiqet. Nuk ka?
>> Së fundi, Huffman coding. Huffman coding është shumë i dobishëm
për të ruajtur kujtesën dhe compress fotografi tekst,
vetëm për shkak se shumë herë që ju përdorni 'a' dhe 'e', ​​për shembull,
në dokumentet tuaja, por unë nuk e di nëse ju djema përdorni 'q' ose 'z' sa më shumë.
Duke pasur vetëm 1 bajt për çdo karakter të vetëm,
çdo të vetme - të 256 karaktere që kemi në tabelën ASCII nuk është shumë optimale,
vetëm për shkak se ka disa karaktere që ju përdorni shumë më tepër,
kështu që ju ndoshta duhet të përdorin më pak memorie për ata.
Si mund ta përdor Huffman coding?
Ne duhet të bëjmë një pemë Huffman.
Një pemë Huffman ka nyje
që kanë një simbol që do të jetë si, 'a', 'b', 'c', letër,
çdo gjë që ju keni letër, një frekuencë që është frekuenca që shfaqet fjala në tekst,
se ju jeni duke krijuar pemën Huffman për,
dhe pastaj një nyje që do të tregojnë në të majtë të pemës Huffman
dhe një tjetër nyje që do të nxjerr në të djathtë. Pra, ashtu si një pemë.
Si mund të ndërtuar një pemë Huffman?
Ju jeni do të marr 2 nyje që kanë frekuencat më të ulët.
Nëse ju keni një kravatë ju jeni do të marr 2 nyje
që kanë vlerat më të ulëta ASCII si.
Pastaj ju jeni do të krijoni një pemë të re nga ato nyjet 2
që do të ketë frekuenca kombinuar në nyjen prind.
Dhe atëherë ju do të jeni për të hequr 2 fëmijë nga pylli
dhe t'i zëvendësojë me prindin.
Dhe ju jeni do të përsëris se deri sa ju keni vetem 1 pemë në pyll.
Pra, le të shohim se si ju do të bëni një pemë Huffman për ZAMYLA.
Ju mund të shihni këtu se të gjitha shkronjat kanë frekuencë 1 me përjashtim të 'A', që ka frekuencë 2.
Kështu që unë krijuar nyje për të gjitha letrat I vënë në mënyrë të vlerë ASCII dhe frekuencë.
Pra, nëse unë dua të krijuar pemën e parë, ajo do të jetë me 'L' dhe 'M'.
Pra, është këtu. Frekuenca e palë do të jetë 2
sepse është 1 + 1, atëherë e ardhshme 2 me frekuenca më të ulëta janë 'Y' dhe 'Z'.
Dhe atëherë unë kam të gjithë prej tyre janë - kanë një frekuencë prej 2.
Pra, cilat janë ato që kanë vlerën më të ulët ASCII për një tjetër?
'A' dhe 'L'. Kështu që unë krijuar nyje të re,
dhe më në fund, është 4 dhe 2, kështu që 2 do të jetë në të majtë.
Dhe kjo është pema Huffman.
Pastaj në qoftë se unë dua të shkruaj një tekst,
si në binar të kthyer në tekst, duke përdorur pemë Huffman është shumë e lehtë.
Për shembull, në qoftë se unë them se duke lëvizur në të majtë është një 0 dhe lëviz në të djathtë është një 1,
Çfarë është që do të përfaqësojnë?
Pra si 1, 1, në mënyrë të drejtë, e drejtë,
dhe pastaj 0, la kështu do të jetë L, dhe pastaj 1, 0, 0.
Pra, 1, 0, kështu që vetëm 1, 0, 'A'.
Dhe pastaj 0, 1, kështu 'Z'.
Dhe pastaj 1, 0, 0 - nr.
0, 0 do të jetë 'Y', kështu Lazy.
Pra, kjo është e gjitha për mua, Rob-së do të marrë përsipër.
>> [Rob Bowden] Pra, java 7 gjëra.
Ne kemi marrë një shumë për të shkuar mbi të vërtetë të shpejtë.
Operatorët bitwise, tampon del nga shtrati,
Biblioteka CS50, atëherë HTML, HTTP, CSS.
Gjitha në si 15 deri 20 minuta.
Operatorët bitwise. Ka 6 prej tyre që ju duhet të dini.
Bitwise dhe, bitwise ose, XOR, ndryshim majtë, ndryshim e drejtë, dhe jo.
Tani për ndryshim dhe nuk ju mezi e panë në të leksion në të gjitha.
Ne do të shkoj për të shpejt këtu, por është mirë të dihet se këto janë 6 që ekzistojnë.
Mos harroni se operatorët bitwise janë si kur ju bëni 3 + 4.
Ju nuk jeni që kanë të bëjnë me binar e 3 dhe 4.
Me operatorëve bitwise ju jeni në të vërtetë kanë të bëjnë me copa individuale të numrave 3 dhe 4.
>> Pra, e para që ne do të thonë se është bitwise jo,
dhe të gjithë kjo nuk është rrokullisje të gjitha pjesë.
Kështu që këtu, në qoftë se jeni të shkruar këtë në C, ju do të nuk e shkruajnë atë
si ~ 11011 apo çfarëdo, ju do të shkruani atë si ~ 4,
dhe pastaj ajo do të rrokullisje përfaqësimin binar prej 4.
Kështu që këtu, ~ i një numri binar 1101101 do të rrokullisje saktësisht të gjithë 1 në 0-së dhe të gjitha 0-së të 1-së.
Si unë them se, përdorimi i shpeshtë i kësaj,
dhe ne do të shohim atë në pak, është si ne duam që të dalë me një numër të
ku të gjitha bit jane 1, me përjashtim të njërit prej tyre.
Kështu që është zakonisht më e lehtë për të shprehur numrin
ku vetëm se pak i vetëm është vendosur,
dhe pastaj të marrin ~ e saj, kështu që në çdo hap tjetër është vendosur përveç se një.
Pra, kjo është ajo që ne jemi duke shkuar për të përdorur më shumë në pak.
>> Bitwise ose. Këtu janë 2 numra binar, dhe këto 2 numra
janë mjaft përfaqësuese, pasi ato përfaqësojnë çdo mundur
Kombinimi i bit që ju mund të duhet për të vepruar në.
Këtu, kur unë or'd çdo grimë, ne jemi vetëm do të krahasuar drejt poshtë.
Pra, në anën e majtë që ne kemi një 1 dhe një 1.
Kur unë bitwise | ata, çfarë jam unë do të merrni? Një.
Pastaj bitwise | 0 dhe 1 do të më jepni? Një.
Bitwise 1 dhe 0 do të jetë e njëjta gjë, e.
Bitwise 0 | 0 do të më jepni 0.
Pra, rasti i vetëm ku unë të marrë është 0 në 0 | 0 rasti.
Dhe ju mund të mendoni se vetëm si ORS tuaja logjike.
Pra, nëse ju mendoni se e 1 si të vërtetë dhe 0 si të rreme, e njëjta gjë vlen edhe këtu.
Pra, e vërtetë apo e vërtetë është e vërtetë, e vërtetë apo e rreme është e vërtetë.
Rreme apo e vërtetë është e vërtetë, false apo e rreme është e vetmja gjë që është në të vërtetë të rreme.
Ja shembulli që ju duhet të dini
si një shembull mjaft të mirë të kur operatorët bitwise përdoren.
Këtu në qoftë se ne ose kapitali 'A' me Ox20,
dhe ne do të shikojmë këto në një të dytë, ne kemi marrë diçka.
Dhe në qoftë se ne ose me të vogla 'një' me Ox20, ne kemi marrë diçka.
Pra, le të tërheqë deri tabelën ASCII.
Mirë. Këtu ne shohim se 'A' është -
këtu ne kemi "A" është decimal 65.
Por unë do të shkoj me të heksadecimal, e cila është Ox41.
Goxha i sigurt ne e pamë atë në klasë. Unë mendoj se ne e pamë atë në klasë
se kjo është goxha e lehtë për të kthyer nga heksadecimal në binar.
Kështu që këtu, në qoftë se unë dua të vënë 4 në binar,
kjo është vetëm do të jetë 0100.
Kjo eshte 1 e vendi, vendi 2 e, Vendi 4-së, kështu që kjo është 4.
Pastaj unë mund të ndarë me 1 në binar, i cili do të jetë 0001.
Dhe kështu kjo do të jetë përfaqësimi i 'A' në binar.
Duke marrë me të vogla 'a', ajo tani do të jetë Ox61,
ku, ndarë këto deri në binar të saj, kështu që një 6 -
Le të vërtetë të bëjë atë - nuk ka ndonjë gomë? Eraser.
Ox61. Pra, ndarja 6 në binar do të jetë 0 + 4 + 2 + 0.
Dhe ndarjen 1 do të jetë 0001.
Duke parë dallimin në mes këtyre 2,
ne shohim se i vetmi ndryshim midis një Fjala dhe një 'A' kapitalit është kjo pak e vetme.
Pra, të vijnë në këtu - në rregull.
Të vijnë në këtu, në qoftë se ne e shikojmë se çfarë bit Ox20 është,
Ox20 kështu ndarjen në binar të saj,
është 0010, 0000.
Ox20, vetëm pak që është vendosur është kjo pak që ne jemi të shqetësuar me të,
me switching midis kapitalit dhe Fjala 'a'.
Nëse I ose 'A', e cila është një nga kjo, 'A',
nëse unë ose 'A' me Ox20,
çfarë jam unë do të merrni?
[Student, e padëgjueshme] >> me të vogla 'a', për shkak se ajo do të rrokullisje këtë pak në një 1.
Dhe në qoftë se unë ose 'një' me Ox20, çfarë jam unë do të merrni?
Vogle një, sepse vetëm oring 'një' me Ox20,
Unë jam vetëm do të jetë oring këtë grimë të vetme të një 1, kjo është tashmë një 1, kështu që nuk ka rëndësi.
Pra, ne të merrni 'a' dhe 'a'.
>> Bitwise dhe. Përsëri, ne mund të mendojnë për këtë si homologut tonë logjike dhe.
Në anën e majtë kemi vërtetë dhe e vërtetë.
Ajo do të jetë e vërtetë, dhe për të gjitha rastet,
false dhe e vërtetë apo e vërtetë dhe e rreme, ose false dhe të rreme,
asnjë nga këto gjëra janë të vërteta.
Pra, ajo që ne të përfundojnë duke është 1000.
Deri tani, këtu, këtu është ku unë e kam përdorur bitwise besueshëm jo,
ku kemi pasur Ox20.
Pra, kjo është Ox20.
Tani ajo që unë dua të bëj, bitwise ~ i Ox20.
Kjo do të rrokullisje të gjitha pjesë.
Pra, unë kam 1101, 1111.
Dhe kështu 'A' anded me ~ Ox20 do të më jep atë?
Vetëm pak ne me të vërtetë duhet të mendoni se është ky,
që, në qoftë se të gjitha këto janë të vendosur copa në 1,
atëherë ne jemi duke shkuar për të marrë saktësisht atë 'A' ishte,
përveç, ndoshta, ajo që kjo është pak.
Sepse në qoftë se ajo ishte një 1, tani ajo do të jetë vendosur në një 0,
sepse çdo gjë që kjo është, anded me këtë do të jetë 0.
Pra, çfarë është 'A' & ~ Ox20 do të më jepni?
[Studentët përgjigje, e padëgjueshme] >> Dhe çfarë është "një" dhe - është e "A".
Dhe ajo që është 'një' & ~ Ox20 do të më jepni?
'A.' Për shkak se kjo është aktualisht një 1.
Anding me këtë 0 do të bëjë atë një 0,
dhe tani ne jemi duke shkuar për të marrë një 'A'.
>> Dyja janë "A", dhe e fundit por jo më pak të këtij lloji,
ne kemi XOR. Është shumë e shumë si ose,
me përjashtim të kjo do të thotë vetëm ose.
Kjo është si ajo që ju zakonisht mendojnë për të, ose në botën e vërtetë.
Kështu që ju të bërë të 'x' apo 'y', por jo të dyja.
Këtu 1 ^ 1 do të jetë 0.
Për shkak se e vërtetë, kjo është - ai nuk punon, si dhe me logjike e vërtetë dhe të rreme
si bitwise & dhe ose të bëjë,
por e vërtetë ^ e vërtetë është e rreme.
Sepse ne vetëm duam të kthehen e vërtetë në qoftë se vetëm një prej tyre është e vërtetë.
Kështu 1 ^ 1 është 0. Po në lidhje me 0 ^ 1?
Është 1. 1 ^ 0 eshte 1, 0 ^ 0 është 0.
Pra, në të gjitha rrethanat, 0 bitwise diçka 0 do të jetë 0.
1 bitwise diçka 0 ose 0 bitwise 1,
në qoftë se është | apo ^, ajo do të jetë një 1, dhe në qoftë se është dhe ajo do të jetë 0.
Dhe rasti i vetëm ku 1 bitwise 1 nuk është 1 është me ekskluzive ose.
Kjo është 0110.
Kështu që këtu tani, duke përdorur XOR - kështu që ne jemi kthyer në 20.
'Një' ^ Ox20 është këto 2 bit ne jemi krahasuar.
Pra, një 1 ^ 0 do të më jepni një çfarë? Një një.
'Një' ^ Ox20 do të më jepni? Me të vogla një.
'A' ^ Ox20 do të më jepni? Capital A.
Sepse çdo gjë që kjo është duke bërë, kjo XORing me Ox20
është efektivisht Flipping çdo gjë që kjo është pak.
Në qoftë se kjo është një 0, ajo tani do të bëhet një 1.
Që kjo është një 1, 1 ^ 1 është 0.
Pra jonë 'a' është bërë 'A', dhe 'A' jonë ka bërë 'një'.
Pra XOR është një mënyrë të vërtetë i përshtatshëm i vetëm Flipping rastin.
Ju thjesht doni të iterate mbi një varg të letrave
dhe alternative rastin e çdo karakter të vetëm,
ju vetëm XOR gjithçka me Ox20.
>> Tani ne kemi lënë ndryshim. Ndryshim majtë është vetëm do të, në thelb,
shtytje të gjithë numrat në, ose në të majtë, dhe futur 0-së pas tyre.
Pra, këtu kemi 00.001.101.
Ne jemi duke shkuar për të nxitur 3 0-së nga e djathta,
dhe ne kemi marrë 01.101.000.
Në terma nonbinary,
ne shohim se kjo është me të vërtetë kanë të bëjnë majtë 13-zhvendosur me 3, i cili na jep 104.
Pra zhvendosur majtas, ne shohim këtu, x << y është në thelb x * 2 ^ y.
13 * 2 ^ 3, 2 ^ 3 është 8, kështu 13 * 8 është 104.
Nëse ju vetëm mendoni për binar në përgjithësi, si për çdo shifër,
në qoftë se ne fillojmë nga e djathta, është 1 e vendi, atëherë vendi e 2 e, atëherë vendi i 4-së.
Pra, duke i shtyrë në 0-ta nga e djathta,
ne jemi vetëm shtyjnë gjërat që ishin në vendin e 4-së në vendin e 8-së,
dhe gjërat që ishin në vendin e 8-së në vendin e 16-së.
Çdo ndryshim i vetëm shumëfishon me 2. Po?
[Student] Çfarë ndodh nëse ju zhvendosur nga 5?
[Bowden] Nëse jeni zhvendosur nga 5 ju do të humbni vetëm shifra.
Në mënyrë të pashmangshme, kjo është e njëjta gjë. Si, integers janë vetëm 32 bit,
kështu që nëse ju shtoni 2 integers të vërtetë të mëdha, ai thjesht nuk i përshtatet në një numër të plotë.
Pra, është e njëjta gjë këtu. Nëse ju zhvendosur nga 5,
ne vetëm do të humbasë këtë një të tillë.
Dhe kjo është lloj i asaj që dua të them me "afërsisht"
ku në qoftë se ju të kalojë shumë larg, ju humbni bit.
E drejta >> ndryshim do të jetë e kundërta,
ku ne jemi duke shkuar për të fus 0-së jashtë në fund,
dhe për qëllimet tona, plotësoni 0 nga e majta.
Pra, duke bërë këtë, ne jemi në thelb përmbysur atë që kishte bërë tashmë.
Dhe ne shohim se të tre 0-të në të djathtë kanë rënë vetëm jashtë,
dhe ne kemi shtyrë 1101 gjatë gjithë rrugës në të djathtë.
Kjo është bërë 104 >> 3, i cili është, efektive, x / 2 ^ y.
Deri tani, këtu, kjo është një ide e ngjashme.
Pse është vetëm afërsisht x / 2 ^ y, dhe jo në fakt x / 2 ^ y?
Sepse në qoftë se unë kam zhvendos me 4, unë do të kishte humbur një 1.
Në thelb, ajo që ju mendoni, vetëm se e ndarjes numër i plotë në përgjithësi.
Pra, si 5/2 është 2. Nuk është 2.5.
Është e njëjta ide këtu. Kur ne ndarje me 2,
ne mund të humbasin bit rastësishëm gjatë rrugës.
Deri tani - kjo është ajo për bitwise. Kjo është e gjitha që ju duhet të dini.
Mos harroni të rasteve të përdorimit kemi parë në klasë,
si një maskë pak është e dobishme për operatorët bitwise,
ose ju përdorni ato për maska ​​bit.
Shkronja kapitale dhe letra vogle, conversions është një shembull mjaft prototip.
>> Mirë, kështu që del nga shtrati tampon sulmet.
Çdokush mbani mend se çfarë ishte e gabuar me këtë funksion?
Vini re ne shpalli një rrjet të 12 bytes, 12 chars,
dhe pastaj ne kopje në tampon tonë të 12 gërma gjithë bar string.
Pra, çfarë është problemi këtu?
Numri magjik 12 duhet shumë e shumë të menjëherë pop jashtë si - pse 12?
Çka nëse bar ndodh të jetë më shumë se 12 karaktere?
Po në qoftë se bar është miliona karaktere?
Këtu çështja është memcpy. Nëse bar është kohë e mjaftueshme,
ajo do vetëm plotësisht - 'c', 'c' nuk kujdeset se ajo ishte vetëm 12 karaktere;
'C' nuk ka kujdes se ajo nuk mund të përshtatet që shumë bytes.
Ajo do të prishësh vetëm krejtësisht char, 12 bytes kemi alokuara për të,
dhe çdo gjë të fundit atë në kujtesë që në fakt nuk i përkasin asaj tampon
me çfarëdo bar string është.
Pra, kjo ishte foto pamë në klasë
ku ne kemi rafte tonë në rritje deri.
Ju duhet të përdoret për këto foto apo të merrni të njohur me ta përsëri.
Ne kemi rafte tonë në rritje deri, adresat e kujtesës fillon nga 0 në krye
dhe të rritet poshtë për të si 4 miliardë në fund.
Ne kemi array tonë 'c' diku në kujtesë,
atëherë ne kemi treguesin tonë të ndalojë të drejtë nën të,
dhe atëherë ne e kemi këtë treguesin ruajtur kornizë në adresën tonë e kthimit dhe rafte rutinë tonë mëmë.
Mos harroni çfarë adresa e kthimit është?
Kjo është kur kryesore quan një foo funksion, e quan një bar funksion,
në mënyrë të pashmangshme, bar kthimit.
Pra, kur kthimet bar, ata duhet të dinë se ajo do të kthehet në foo që quajtur atë.
Pra Adresa e kthimit është adresa e funksionit që ajo ka për t'u kthyer në kur kthehet funksionit.
Arsyeja kjo është e rëndësishme për sulme del nga shtrati tampon është për shkak, të përshtatshme,
hakerat të donte për të ndryshuar atë adresë e kthimit.
Në vend që të shkojnë prapa në foo, Unë do të kthehem në kudo hacker do që unë të kthehem në.
Dhe, të përshtatshme, ku hacker shpesh do të kthehen në
është fillimi i tampon që kemi pasur në fillim.
Pra të vini re, përsëri, Vogël indian.
Pajisja është një shembull i një sistemi të vogël indian,
kështu që një numër i plotë apo një akrep është ruajtur me bytes kthyera.
Pra, këtu ne shohim - është kjo? Po.
Ne e shohim Ox80, OxC0, Ox35, OxO8.
Mos harroni numra heksadecimal?
Ne nuk e kundërt numra heksadecimal në pak indian,
sepse 2 shifrat hexadecimal përbëjnë një bajt të vetëm, dhe ne të korrigjuar bytes.
Kjo është arsyeja pse ne nuk e ruajtur, si, 80530CO8.
Ne dyqan, në vend të kësaj, çdo palë e 2 shifra, duke filluar nga e djathta.
Kjo adresë referohet adresën e fillimit
të tampon tonë që ne të vërtetë donte të kopje në në vendin e parë.
Arsyeja kjo është e dobishme për shkak se, çka nëse sulmuesi
ndodhi, në vend të një varg që ishte vetëm
një varg të padëmshme si, emrin e tyre apo diçka,
çfarë nëse, në vend të kësaj, se string ishin vetëm disa kodin arbitrare
që bëri çdo gjë që ata donin që ajo të bëjë?
Pra, ata mund - Unë nuk mund të mendoj për ndonjë kod të ftohtë.
Ajo mund të jetë çdo gjë, edhe pse. Çdo kod katastrofike.
Në qoftë se ata donin, ata mund vetëm të bëjë diçka në gabimet segmentet, por që do të ishte e pakuptimtë.
Ata zakonisht e bëjnë atë të kollitem sistemin tuaj.
Mirë >>. Biblioteka CS50.
Kjo është, në thelb, getInt, getString, të gjitha ato funksione ne kemi dhënë për ju.
Pra, ne kemi varg char *, dhe kjo është abstraksion që shpërtheu larg
në një moment gjatë semestrit.
Mos harroni se një varg është vetëm një grup të karaktereve.
Pra, këtu ne shohim një version i shkurtuar i getString.
Ju duhet të shikojnë mbrapa në atë për të kujtuar se si është zbatuar në të vërtetë.
Detajet kryesore janë, vini re ne kemi marrë në një karakter të vetëm në një kohë
nga standarde në të, e cila është vetëm si të na shtypni në tastierë.
Pra, një karakter të vetëm në një kohë, dhe në qoftë se ne të merrni edhe shumë karaktere,
kështu nëse n + 1 është më e madhe se sa kapacitet,
atëherë ne kemi nevojë për të rritur kapacitetin e tampon tonë.
Pra, këtu ne jemi duke dyfishuar madhësinë e tampon tonë.
Dhe kjo e mban sipër, ne të futur karakterin në tampon tonë
deri sa të marrë një linjë të re ose fundin e file apo çfarëdo,
në të cilin rast, ne jemi duke bërë me vargun dhe pastaj të getString reale
zvogëlohet e kujtesës, si në qoftë se ne kemi ndarë shumë memorie ajo do të kthehemi dhe të tkurret pak.
Pra, ne nuk tregojnë se, por ideja kryesore është
ajo ka te lexuar ne nje karakter vetme në një kohë.
Ajo nuk mund të lexohet vetëm në një gjë të gjithë në të njëjtën kohë,
sepse buffer tyre është vetëm i një madhësie të caktuar.
Pra, nëse vargu që ajo përpiqet për të futur në tampon është shumë i madh, atëherë ajo do të del nga shtrati.
Pra, këtu kemi parandaluar që duke lexuar vetëm për një karakter të vetëm
në një kohë dhe në rritje sa herë që ne kemi nevojë për të.
Pra getInt dhe funksionet e tjera të bibliotekës CS50 kanë tendencë për të përdorur getString
në implementimin e tyre.
Kështu që unë theksoi gjëra të rëndësishme këtu.
Ajo bën thirrje getString për të marrë një varg.
Nëse getString nuk u kthye kujtesës,
mos harroni se getString mallocs diçka, kështu që sa herë që ju të telefononi getString
ju nuk duhet të (i pakuptueshëm) të liruar atë varg që ju mori.
Kështu që këtu, në qoftë se ajo nuk arriti të malloc diçka, do të kthehemi INT_MAX si vetëm një flamur që,
hej, ne nuk ishim në të vërtetë në gjendje për të marrë një numër të plotë.
Ju duhet të injorojnë çdo gjë që unë të kthehem te ti, ose
ju nuk duhet të trajtojnë këtë si një input vlefshme.
Së fundi, duke supozuar se ka sukses, ne përdorim sscanf me atë flamur të veçantë,
që do të thotë, së pari të shkojë me një numër të plotë,
pastaj të shkojë me ndonjë karakter pas atij numër të plotë.
Pra, vini re ne duam që ajo të barabartë 1.
Kthimet Pra sscanf sa shumë ndeshje në qoftë se bëhet me sukses?
Ajo do të kthehet me 1 nëse ajo përputhet me sukses një numër të plotë,
ajo do të kthehet në 0 nëse nuk korespondon me një numër të plotë, dhe ajo do të kthehet 2
nëse ajo përputhet një numër të plotë e ndjekur nga disa karakter.
Pra, vini re ne rigjykuar në qoftë se ne të përputhen asgjë, por 1.
Kështu që nëse futur 1, 2, 3, C, ose 1, 2, 3, X,
atëherë 1, 2, 3 do të ruhet ne integer,
X do të ruhet në karakter,
sscanf do të kthehen 2, dhe ne do të provoni përsëri, sepse ne vetëm duam një numër të plotë.
Shpejt >> defekt me HTML, HTTP, CSS.
HyperText Markup Language është struktura dhe semantikë të internetit.
Këtu është shembull nga leksion ku ne kemi HTML tags.
Ne kemi tags kryesore, tags trupit,
ne kemi shembuj të etiketave boshe ku ne të vërtetë nuk kanë një fillim dhe tag të ngushtë,
ne vetëm kemi lidhje dhe imazhin.
Nuk ka imazh mbylljes tag, nuk është vetëm një tag i vetëm që kryen çdo gjë tag ka nevojë për të bërë.
Lidhja është një shembull, ne do të shohim se si ju lidhje me CSS,
script është një shembull se si ju lidhje me një JavaScript të jashtme.
Është shumë i thjeshtë, dhe mos harroni, HTML nuk është një gjuhë programimi.
Këtu, mos harroni se si ju do të përcaktojë një formë ose të paktën atë që kjo do të bëjë?
Një formë e tillë ka një veprim dhe një metodë.
Metodat e ju do të shihni vetëm ndonjëherë janë GET dhe POST.
Pra GET është versioni ku gjëja merr vënë në URL.
POST është vendi ku ajo nuk është vënë në URL.
Në vend të kësaj, çdo e dhënë nga formë është futur më i fshehur në HTTP kërkesë.
Kështu që këtu, veprimi përcakton ku HTTP kërkesa shkon.
Ku është duke shkuar është google.com / kërkim.
Metoda. Mos harroni dallimet mes GET dhe POST,
dhe, të them vetëm si shembull, në qoftë se ju dëshironi të bookmark diçka.
Ju kurrë nuk do të jetë në gjendje të bookmark një post URL
për shkak se të dhënat nuk është përfshirë në URL.
>> HTTP, tani, është HyperText Transfer Protocol.
HyperText Transfer Protocol, ju do të presin që ai të transferuar
HyperText Markup Language, dhe kjo e bën.
Por ajo gjithashtu transferon ndonjë imazhet që ju të gjeni në Web,
ndonjë shkarkime të bëni të fillojë si një kërkesë HTTP.
Pra HTTP është vetëm gjuha e World Wide Web.
Dhe këtu ju duhet të njohin këtë lloj të një kërkese HTTP.
Këtu HTTP/1.1 në anën vetëm thotë se është version
të protokollit unë jam duke përdorur.
Është shumë e shumë të gjithmonë do të jetë HTTP/1.1, si ju do të shihni atë.
Pastaj ne shohim se kjo ishte GET, alternative duke qenë POST, që ju mund të shihni.
Dhe URL që unë kam qenë duke u përpjekur për të vizituar ishte www.google.com/search?q = blah, blah, blah.
Pra, mos harroni se kjo, q pikëpyetje = blah blah blah,
është lloj gjëra që është dorëzuar nga një formë.
Përgjigja mund të kthehet tek unë do të dukej diçka si kjo.
Përsëri, duke filluar me protokollin, i cili do të jetë se,
pasuar nga kodin e statusit. Ja kjo është 200 në rregull.
Dhe së fundi, web faqja që unë në fakt të kërkuar do të ndiqet.
Kodi mundur Statusi ju mund të shihni, dhe ju duhet të dini disa prej tyre.
200 OK ju keni parë ndoshta para.
403 Forbidden, 404 Not Found, 500 Server Gabim i brendshëm
është zakonisht në qoftë se ju shkoni në një faqe interneti dhe diçka është thyer ose crashes e tyre kodin PHP,
ndërsa në aplikim ne kemi se kuti e madhe portokalli
që vjen deri dhe thotë, si, diçka është e gabuar, ky kod nuk punon
ose ky funksion e keqe.
Zakonisht faqet e internetit nuk duan që ju të dish se çfarë funksione janë në të vërtetë të këqija,
kështu që në vend të kësaj ata do të ju jap vetëm 500 Gabimet Server brendshme.
>> TCP / IP është 1 shtresë nën HTTP.
Mos harroni se ka internet jashtë e World Wide Web.
Ashtu si në qoftë se ju të luajnë një lojë online që nuk kalojnë nëpër të HTTP,
ajo është duke kaluar një tjetër - është ende duke përdorur internetin,
por ajo nuk e përdor HTTP.
HTTP është vetëm një shembull i protokollit ndërtuar mbi TCP / IP.
IP fjalë për fjalë do të thotë Internet Protocol.
Çdo kompjuter ka një adresë IP, ata janë ato gjëra 4-shifrore
si 192.168.2.1, apo çfarëdo, që ka tendencë të jetë një një lokal.
Por kjo është modeli i një adresë IP.
Pra DNS, Domain Name Service,
kjo është ajo që përkthehet gjëra të tilla si google.com në një adresë IP aktuale.
Pra, nëse ju shkruani se IP adresën në një URL,
që do t'ju sjellë në Google, por ju nuk priren për të kujtuar ato gjëra.
Ju kanë tendencë për të kujtuar google.com në vend.
Gjëja e fundit që ne kemi është portet, ku kjo është pjesa TCP e IP.
TCP bën më shumë. Mendoni për, si, ju keni të internetit të shfletuesit running.
Ndoshta ju keni disa aplikimit email running;
ndoshta ju keni disa program tjetër që përdor internet running.
Ata të gjithë kanë nevojë për qasje në internet,
por kompjuteri juaj ka vetëm 1 kartë WiFi apo çfarëdo.
Pra, portet janë mënyra që ne jemi në gjendje për të ndarë
se si këto aplikacione janë në gjendje të përdorin internetin.
Çdo aplikim merr 1 port të veçantë që të mund të dëgjojnë për,
dhe nga default, HTTP përdor portin 80.
Disa shërbime email përdorim 25.
Të ulët të numëruar ato priren të jenë të rezervuara.
Ju zakonisht janë në gjendje për të marrë ato më të larta-numëruara për veten tuaj.
>> CSS, Cascading Style Sheets.
Ne faqet e internetit stil me CSS, jo me HTML.
Ka 3 vende që ju mund të vënë CSS tuaj.
Ajo mund të jetë inline, midis tags stil, ose në një dosje tërësisht të veçantë dhe pastaj të lidhura in
Dhe këtu është vetëm një shembull i CSS.
Ju duhet të njohin këtë model,
ku shembulli i parë është që ne jemi të ngjashëm me tag trupit,
dhe këtu ne jemi qendërzim tag trupit.
Shembulli i dytë, ne jemi të ngjashëm me atë që është e
me ID futboll, dhe ne jemi duke aplikuar disa stile me atë.
Vini re se identitetit futboll tekst-aligns në të majtë,
ndërsa trupi tekst-aligns qendër.
Footer është brenda trupit.
Ajo do të, në vend të kësaj, text-align majtë, edhe pse trupi thotë qendër text-align.
Kjo është e tërë pjesa Cascading e saj.
Ju mund të keni - ju mund të specifikoni stilet për trupin,
dhe pastaj gjërat në trup që ju mund të specifikoni stilet më të veçanta,
dhe gjëra si ju presin.
Specifiers më specifike CSS kenë përparësi.
Unë mendoj se kjo është ajo.
>> [Ali Nahm] Hi everyone. Në qoftë se unë mund vetëm të marrë vëmendjen tuaj.
Unë jam Ali dhe unë jam duke shkuar për të shkuar nëpër PHP dhe SQL të vërtetë të shpejtë.
Pra, ne mund të fillojnë. PHP është e shkurtër për PHP: Hypertext Preprocessor.
Dhe si ju të gjithë duhet të dini, kjo është një server-side gjuhë e shkruar,
dhe ne e përdorin atë për në fund kthehet të faqet e internetit,
dhe se si ajo ka një shumë të llogaritjeve, pjesën prapa skenës.
Sintaksa. Ajo nuk është si C, befasi, befasi.
Ajo gjithmonë ka për të filluar me të, në qoftë se ju mund të shihni, - unë nuk mund të lëvizin përpara.
Ju mund të shihni keni nevojë për lloje të reja të formatimin e teksteve dhe atëherë edhe ju duhet? Php.
Kjo është gjithmonë se si ju duhet të formojë tekstin tuaj PHP, kodin PHP.
Kështu që nuk mund të jetë si C, ku ju lloj i vënë atë në të parë.
Ju duhet të gjithmonë e rrethojnë atë.
Dhe tani, Sintaksa e madhe është se të gjitha variablat duhet të fillojë me karakter $.
Ju duhet të bëni atë kur ju jeni definimin e tyre, ju duhet të bëni atë
kur ju jeni duke iu referuar atyre më vonë.
Ju gjithmonë duhet se $. Është shoku më i ri më i mirë, shumë e shumë.
Ju nuk - ndryshe nga C, ju nuk keni nevojë për të vënë çfarë lloji është e ndryshueshme.
Kështu, ndërsa ju keni nevojë për të $, ju nuk keni nevojë për të vënë, si,
int x apo y string, më tej, më tej.
Pra një ndryshim të vogël.
Si rezultat i kësaj, kjo do të thotë se PHP është një lloj i dobët.
PHP është një gjuhë dobët lloji, dhe ai ka shtypur dobët variablave.
Me fjalë të tjera, kjo do të thotë që ju mund të kaloni në mes të llojeve të ndryshme të llojeve të ndryshueshme.
Ju mund të ruajë numrin tuaj 1 si një int,
ju mund të ruajë atë si një varg, dhe ju mund të ruajë atë si një noton,
dhe të gjithë do të jetë ai numër 1.
Edhe pse ju jeni ruajtjen atë në forma të ndryshme,
është ende - llojet e ndryshueshme janë ende mbajnë në fund.
Pra, nëse ju shikoni këtu, nëse ju kujtohet nga pset 7,
shumë prej jush ndoshta kishte çështje me këtë.
Dy shenja të barabarta, 3 shenjat e barabarta, 4 shenjat e barabarta.
Mirë, nuk ka 4 shenja të barabartë, por ka 2 dhe 3.
Ju përdorni 2 shenja të barabarta për të kontrolluar vlerat.
Ajo mund të shikoni të gjithë llojeve.
Pra, nëse ju mund të shihni në shembullin e parë,
Unë kam num_string num_int ==.
Pra int tuaj dhe string tuaj janë të dy, teknikisht, 1,
por ata janë lloje të ndryshme. Por, për të barabartëve të dyfishtë, ai ende do të kalojë.
Megjithatë, për të barabartëve trefishtë, ajo kontrollon vlerë, si dhe llojet e ndryshme.
Kjo do të thotë se nuk do të kalojë në këtë rast të dytë këtu,
ku ju jeni duke përdorur 3 shenja të barabarta në vend.
Pra, kjo është një ndryshim i madh që ju duhet të gjithë kanë treguar tani.
>> String varg është një tjetër gjë e fuqishme që ju mund të përdorni në PHP.
Kjo është në thelb vetëm këtë dobishëm dot simbol,
dhe kjo është se si ju mund të lidh vargjet bashku.
Pra, nëse ju keni Cat dhe ju keni qen, dhe ju doni për të vënë 2 strings së bashku,
ju mund të përdorni periudhën, dhe kjo është lloj i si funksionon.
Ju gjithashtu mund vetëm vendin e tyre pranë njëri-tjetrit,
si ju mund të shihni këtu në shembullin e poshtme,
ku kam jehonë string 1, string hapësirë ​​2.
PHP do të dinë për të zëvendësuar ato si të tilla.
Vargjeve. Tani, në PHP, ka 2 lloje të ndryshme të vargjeve.
Ju mund të keni vargjeve të rregullta, dhe ju gjithashtu mund të ketë vargjeve të shoqatave,
dhe ne jemi duke shkuar për të shkuar nëpërmjet tyre tani.
Vargjeve e rregullta janë vetëm këtë në C,
dhe kështu ju keni indekseve që janë të numëruara.
Tani për tani ne jemi vetëm do të krijojë një dhe vënë -
kështu që kjo është se si ne të krijojë një rrjet të zbrazët, atëherë ne do të
vënë në indeksin e numrit 0.
Ne jemi duke shkuar për të vënë numrin 6, vlera 6.
Ju mund të shihni atë në fund këtu.
Where's - at indeksi i 1 ne jemi duke shkuar për të vënë numrin vlerë 4,
dhe kështu ju mund të shihni se ka një 6, ka një 4,
dhe pastaj si ne jeni shtypjen gjëra,
kur ne përpiqemi dhe të shtypura vlerën e ruajtur në indeks numrin 0,
atëherë ne do të shohim vlerën 6 duke u shtypur. Ftohtë?
Pra, kjo është vargjeve të rregullta për ju.
Një mënyrë tjetër ju mund të shtoni gjëra të vargjeve të rregullta tani
është që ju vetëm mund të append ato në fund.
Kjo do të thotë që ju nuk keni për të specifikojë e indeksit të veçantë.
Ju mund të shihni numrin, dhe pastaj në kllapa katrore nuk ka indeksin e specifikuar.
Dhe kjo do të di - PHP do të dinë për të vetëm të shtoni atë në fund të listës, vend tjetër të lirë.
Kështu që ju mund të shihni me 1 të drejtë atje në atë vend 0,
2 shkoi drejtë atje në vendin e parë.
3 shkon - shtohet edhe atje.
Pra, kjo lloj kuptim. Ju jeni vetëm vazhdimisht duke shtuar atë,
dhe atëherë kur ne jemi duke i bërë jehonë indeksin e numrit 1,
ajo do të shtypura nga vlerën 2.
Pastaj ne kemi >> vargjeve që janë vargjeve asociative.
Vargjeve asociative, në vend të paturit e indekseve numerike,
atë që bëjnë ata është, ata kanë indekset që janë nga varg.
Ju mund të shihni, në vend të - i hoqa qafe të gjithë ata indekseve të numrave,
dhe tani është e key1, key2, key3, dhe ata janë në kuotat e dyfishtë për të ditur se ata janë të gjitha vargjet.
Pra, ne mund të kemi një shembull të kësaj.
Shembulli i kësaj është se kemi të tf, dhe kjo është emri indeksi.
Ne jemi duke shkuar për të vënë "Aliun" si emër, në indeksin, kalorive ngrënë,
ne mund të vënë një int këtë herë në vend të një varg,
dhe pastaj në sërën e indeksit, ne mund të vënë një rrjet të tërë në brendësi të saj.
Pra, kjo është lloj - kjo është një koncept të ngjashme me mënyrën se si kemi pasur
indekset me numra, por tani ne mund të ndryshojmë indekset rreth
të kenë ato si vargjet në vend.
Ju gjithashtu mund të bëjë këtë, përveç vetëm duke bërë atë në mënyrë individuale,
ju mund të bëni të gjitha në një copë. Kështu që ju mund të shihni se tf i asaj grup,
dhe pastaj ne kemi vendosur ato të gjitha në një grup gjigant i kllapave katrore.
Kështu që mund të shpejtojë gjërat.
Kjo është më shumë një zgjedhje stilistik se sa jo.
Ne gjithashtu kemi sythe.
Në C ne kemi sythe që punojnë si kjo.
Ne kishim grup tonë, dhe kemi shkuar nga indeksi 0 deri në fund të listës,
dhe kemi shkruar të gjitha, apo jo?
Përveç problemi është, për vargjeve associative,
ne nuk e dimë me domosdo ato indekse numerike
sepse tani ne kemi indekset string.
Tani ne përdorim sythe foreach, e cila, përsëri, ju shpresojmë të përdorura në pset 7.
Sythe foreach thjesht do të dinë çdo pjesë të vetme të listës.
Dhe kjo nuk duhet të dinë saktësisht indeks numerik që ju keni.
Pra, ju keni sintaksë foreach, kështu që është e foreach, ju vënë array.
Pra array ime quhet pset, dhe pastaj si, fjala si,
dhe pastaj të vendosni këtë ndryshore të përkohshme lokale që ju jeni do të përdorin
vetëm për gjë të veçantë që do të mbajë të veçantë -
një rast apo një pjesë e vektorit.
Pset num do të mbajë me 1, dhe atëherë ndoshta ai do të mbajë numrin 6,
dhe pastaj ajo do të mbajë numrin 2.
Por është e garantuar për të shkuar nëpër çdo vlerë të vetme që është në rrjet.
Funksionet të dobishme që ju duhet të dini në PHP janë të kërkojë,
në mënyrë që e bën të sigurt që ju jeni duke përfshirë edhe disa fotografi, jehonë, dalje, bosh.
Unë rekomandoj që ju shikoni në pset 7 dhe të kërkoni në këto funksione.
Ju mund të keni të dini ato,
kështu që unë patjetër do të dinë se çfarë, saktësisht, ata janë të gjithë duke bërë.
>> Dhe tani ne jemi duke shkuar për të shkuar nëpërmjet qëllimit të vërtetë të shpejtë.
Në fushëveprimin, PHP është lloj i një gjë shokuar, ndryshe nga C,
dhe kështu që ne jemi vetëm do të shkojnë nëpërmjet saj shpejt.
Pra, le të thonë se të fillojmë në atë shigjetë që ne kemi atje.
Dhe ne jemi duke shkuar për të filluar me $ i. Pra ndryshueshme 'i' do të jetë 0,
dhe ne jemi vetëm do të mbajnë shtypjen atë në atë kuti e madhe e bardhë atje.
Ne jemi duke shkuar për të filluar me I0, dhe pastaj ne do të jehonë atë.
Pra, ka 0.
Dhe pastaj ne do të rritje atë nga për lak,
dhe pastaj ajo do të jetë vlera e 1.
Njëra është më pak se 3, kështu që ajo do të kalojë nëpër të cilat për lak,
dhe pastaj ne do të shohim atë të shtypura përsëri.
Ne jemi duke shkuar për rritje atë përsëri në 2,
dhe 2 është më pak se 3, kështu që do të kalojë për lak, dhe ajo do të shtypura 2.
Pastaj ju do të vini re se 3 nuk është më pak se 3, kështu që ne do të thyer nga për lak.
Deri tani ne kemi dalë, dhe pastaj ne do të shkojnë në aFunction.
Mirë. Kështu që ju duhet të vini re se kjo është e ndryshueshme që ne kemi krijuar,
'i' variabël, nuk është scoped në nivel lokal.
Kjo do të thotë se nuk është lokal në lak,
dhe se ndryshueshme ne ende mund të hyni dhe të ndryshojë më pas, dhe ajo do të vazhdojë të jetë në fuqi.
Pra, nëse ju shkoni në funksion tani, ju do të shihni se ne gjithashtu e përdorin 'i' variabël,
dhe ne jemi duke shkuar për rritje 'i' + +.
Ju do të mendoni se, në fillim, të bazuar në C, se kjo është një kopje e 'i' variabël.
Kjo është një gjë krejtësisht të ndryshme, e cila është e saktë.
Pra, kur ne të shtypura atë, ne jemi duke shkuar për të shtypur 'i' + +, e cila do të shtypura nga të cilat 4,
dhe pastaj ne do të - vjen keq.
Pastaj ne do të përfundojë jashtë atë funksion,
dhe ne do të jetë aty ku se shigjeta është e drejtë tani.
Kjo do të thotë se atëherë, megjithatë, edhe pse funksioni ndryshuar vlerën e 'i',
ajo nuk ka ndryshuar jashtë funksionit,
sepse funksioni ka një fushë të veçantë.
Kjo do të thotë se kur ne echo 'i', ajo nuk ka ndryshuar në kuadër të funksionit,
dhe kështu atëherë ne jemi duke shkuar për të shtypur 3 përsëri.
Gjëra të ndryshme rreth qëllimit në PHP se në C.
>> Tani në PHP dhe HTML.
PHP është përdorur për të bërë faqet e internetit dinamike.
Kjo lloj e bën gjëra të ndryshme.
Ne kemi atë të ndryshme nga HTML.
Me HTML, ne gjithmonë vetëm kemi të njëjtën gjë statike, si se si Rob tregoi,
ndërsa PHP, ju mund të ndryshojë gjërat në bazë të kush është përdoruesi.
Pra, nëse unë kam këtë, unë, "Ju jeni regjistruar si -" dhe pastaj emrin,
dhe unë mund të ndryshojë emrin. Deri tani emri është Joseph,
dhe ajo ka "për mua", por pastaj unë mund të ndryshojë emrin që të ketë Tommy.
Dhe kjo do të ishte një gjë tjetër.
Pra, atëherë ne mund të ndryshoni gjëra të ndryshme rreth tij,
dhe ajo do të tregojë përmbajtje të ndryshme në bazë të emrit.
Pra PHP mund të lloj të ndryshojë atë që po ndodh në faqen tuaj te internetit.
Same here. Megjithatë, kini parasysh se ata kanë përmbajtje të ndryshme,
edhe pse ju jeni teknikisht ende qasjes që të njëjtën faqe web në sipërfaqe.
Gjenerimi i HTML. Ka 2 mënyra të ndryshme që ju mund të bëni këtë.
Pra, ne do të kalojnë nëpër këtë të drejtë tani. Mënyra e parë është, ju keni - po, sorry.
Pra, ju vetëm duhet të rregullt tuaj për lak në PHP,
dhe pastaj ju jehonë në PHP dhe ju jehonë jashtë HTML.
Duke përdorur atë që ju tregoi Rob i HTML shkrimit
dhe pastaj duke përdorur të shtypura të PHP për të vetëm të shtypura atë në faqen e internetit.
Mënyrë alternative është që të bëjë atë si në qoftë se ju ndarë nga PHP dhe HTML.
Kështu që ju mund të ketë një linjë të PHP që fillon për lak,
atëherë ju mund të ketë vijën e HTML në një gjë të veçantë,
dhe pastaj në fund loop, përsëri, me një PHP.
Pra, kjo është lloj i ndan atë.
Në anën e majtë, ju mund që ju keni të gjithë -
kjo është vetëm 1 copë e PHP.
Në të djathtë ju mund të shihni se ju keni një linjë të PHP,
ju keni një linjë të HTML, dhe ju keni një linjë të PHP përsëri.
Kështu që ndan atë në atë që ata po bëjnë.
Dhe ju do të vini re se as mënyrë, për secilin prej tyre,
ata ende shtypura imazhin, imazh, image,
në mënyrë që HTML ende është e shtypur në të njëjtën mënyrë.
Dhe pastaj ju do të shohin ende e 3 imazhet shfaqen në faqen tuaj te internetit.
Pra, është 2 mënyra të ndryshme të bërë të njëjtën gjë.
>> Tani ne kemi forma dhe kërkesat. Si Rob ju tregoi,
ka forma të HTML, dhe ne vetëm do të fllad përmes këtë.
Ju keni një veprim dhe ju keni një metodë, dhe veprimi juaj
lloj ju ku do jeni për të dërguar atë tregon, dhe metoda është nëse
ajo do të jetë një GET ose POST një.
Dhe një kërkesë GET, siç tha Rob, do të thotë se ju jeni do të vënë atë në një formë të
dhe ju do të shihni atë si një URL, ndërsa një kërkesë POST ju nuk do të shihni në një URL.
Pra një ndryshim të vogël.
Megjithatë, një gjë që është një gjë e ngjashme
është se POST dhe GET janë po aq të pasigurt.
Kështu që ju mund të mendoni se vetëm për shkak se ju nuk e shihni atë në URL,
që do të thotë POST është më i sigurt,
por ju mund të shihni se në cookie-t në informatat që ju jeni dërguar.
Pra, nuk mendoj se për një ose tjetër.
Një tjetër gjë të theksohet është se edhe ju keni variablave seksion.
Ju djema përdorur këtë në pset 7 për të marrë informacionin tuaj përdorues ID.
Ajo që ndodhi ishte se ju mund të përdorni këtë rrjet asociative,
$ _SESSION, dhe pastaj ju jeni në gjendje për të hyrë në gjëra të ndryshme
dhe dyqan gjëra të ndryshme në të gjithë faqet.
>> Gjë e kaluar është se ne kemi SQL, të strukturuar Query Language,
dhe kjo është një gjuhë programimi për të menaxhuar bazat e të dhënave.
Çfarë, saktësisht, janë bazat e të dhënave? Ata janë koleksionet e tabelave,
dhe çdo tavolinë mund të ketë lloje të ngjashme të objekteve.
Pra, kemi pasur një tabelë të përdoruesve në pset tuaj financave.
Dhe pse janë ata të dobishme? Për shkak se ajo është një mënyrë për ruajtjen e informacionit të përhershme.
Kjo është një mënyrë e gjetjes gjërat dhe menaxhimin e gjëra
dhe në fakt duke parë atë në faqe të ndryshme dhe udhë mbajtjen.
Ndërsa në qoftë se ju vetëm të ruajtur atë në atë një moment të menjëhershëm
dhe pastaj e përdorin atë më vonë, ju nuk do të jetë në gjendje për të hyrë në çdo gjë që ju keni ruajtur.
Ne kemi 4 gjëra të mëdha që ne përdorim për komandat e SQL.
Ne kemi zgjedhur, insert, fshini, dhe update.
Ata janë me të vërtetë e rëndësishme për ju djema të dini për quiz tuaj.
>> Ne do të shkojnë të shpejtë gjatë zgjidhni tani.
Në thelb, ju jeni zgjedhur rreshtave nga një bazë të dhënash.
Pra, nëse ju keni, të drejtë këtu -
ne kemi këto 2 gjëra të ndryshme, dhe ne duam të zgjidhni nga tabela klasa
ku tmerrshëm - ku në kolonën jashtezakonshme vlerë është 1.
Kështu që ju mund të shihni këtu, ne kemi këto 2 gjëra të emrit të klasës,
CS50 dhe Stat110, dhe ne kemi kartat e identitetit të klasës dhe sloganin.
Pra, ne duam të zgjidhni të gjithë këtë informacion.
Pastaj ju mund të shihni të drejtë këtu se kjo është lloj i picking nga kjo kolonë jashtezakonshme,
ku të gjitha gjërat janë 1, dhe atëherë ajo ka të klasit ID, emër të klasës dhe Zëri që ajo mund të marr nga.
Pikërisht si ju bëni këtë në kodin? Ju duhet të përdorni PHP.
Pra, kjo është lloj i si PHP dhe SQL janë të lidhura me njëra-tjetrën.
Tani ne kemi kodin tonë, dhe ne jemi duke shkuar për të përdorur funksionin tonë query
siç bëmë në pset 7, dhe ne jemi duke shkuar për të drejtuar SQL query.
Pastaj ne do të kemi -
ne gjithmonë duhet të kontrolloni nëse rresht së trefishtë të barabartë në qoftë se rreme.
Pra, përsëri, ju doni të kontrolloni llojin dhe vlerën,
dhe pastaj në qoftë se ajo nuk punon, atëherë ju doni të kërkoj falje, si zakonisht, siç bëmë në pset 7.
Përndryshe, ju doni të lak nëpër çdo gjë me ato të dobishëm
foreach sythe që ne sapo kaloi.
Tani që ne jemi looping anë dhe ne kemi bërë atë të fundit,
le të supozojmë se query jonë kaloi, tani ne kemi lak foreach tonë.
Në radhën e parë ajo ka, kështu që këtu është në radhën, të drejtë këtu, është e boxed.
Ajo do të shtypura nga të gjitha informatat që Është për të marrë.
Pra, ajo do të shtypura nga në fund "Wanna Mëso HTML?"
Atëherë ajo do të shkojë në rreshtin tjetër, sepse është e përfunduar e parë për lak,
dhe kështu atëherë ajo do të shtypura nga rreshtin e dytë të saj,
e cila do të jetë STAT110, Gjej të gjitha momentet.
>> Një gjë e fundit është në SQL dobësi.
Unë e di se David preku kjo pak në leksion.
Ju mund të lexoni këtë më vonë. Është me të vërtetë qesharake.
SQL Injection eshte nje lloj gjë ndërlikuar.
Le të thonë se ju vetëm rrinë ato variabla të drejtë në pyetjen tuaj,
si ju mund të shihni në atë linjë të parë.
Pra, duket e mirë, e drejtë? Ju jeni vetëm duke vënë në emrin e përdoruesit
dhe fjalëkalimin tek query juaj SQL, dhe ju doni të anijes atë dhe për të marrë çdo gjë që është në tryezën tuaj të të dhënave.
Kjo duket shumë e thjeshtë. Kështu që lejon të thonë se dikush vë në,
për fjalëkalim, ky tekst OSE drejtë këtu -
në të vërtetë duhet të jetë në kutinë e kuqe.
Pra, le të thonë se ata vënë se fjalëkalimin në - kjo është ajo që ata hyjnë.
Pra, ata janë vënë OSE "1" = 1.
Lloj i një fjalëkalim pa kuptim që të ketë.
Tani le të vetëm të zëvendësojë atë në, dhe ju do të vini re se në këtë query SQL tani,
ajo vlerëson që gjithmonë e vërtetë, sepse ju do të vini re se
ju mund të zgjidhni SQL query të gjithë këtë informacion
ose ju mund të ketë vetëm 1 = 1.
Kështu që është gjithmonë do të vlerësojë të vërtetë.
Kjo nuk do të vërtetë punojnë, sepse kjo do të thotë se hacker mund të thyer në sistemin tuaj.
Zgjidhja për këtë është se ju duhet të përdorni sistemin PDO,
që do të thotë se ju duhet të përdorni pikëpyetje,
e cila është ajo që ju djema të përdorura në pset 7,
ku ju jeni do të përdorin një pikëpyetje në vend të ku ju doni të vendosni diçka,
dhe pastaj ju jeni do të ketë një presje, dhe pastaj ju do të keni më pas,
pas vargut tuaj, variablat të ndryshme që ju dëshironi për të zëvendësuar në shenjën tuaj pyetje.
Pra, ju do të vini re këtu se tani unë kanë këto shenja të kuqe pyetje.
Pastaj kam vënë variablat pas vargjet e mia kështu që unë e di për të zëvendësuar ato në atë mënyrë që më pas.
Kjo do të sigurt se nëse dikush e bën atë si kjo,
dhe ata kanë ose 1 = 1 situatës, që do të sigurt,
në fund kthehet, të sigurt se ajo nuk do të të vërtetë të thyejnë SQL query.
Mirë, kështu që kjo është shumë e shumë ajo, furtuna e PHP dhe SQL.
Best of luck për të gjithë ju, dhe tani për të Ore
>> [Oreoluwatomiwa Babarinsa] të gjithë të Mirë. Koha për të shkuar mbi disa JavaScript
dhe disa gjëra të tjera shumë shpejt kështu që ne nuk e mbajnë ju deri sonte.
JavaScript. Po. JavaScript është lloj i një gjë e ftohtë, qëllimisht.
Gjërat që ju me të vërtetë duhet të dini për JavaScript, kjo është lloj si
fundi klient-side për atë app tuaj web është e do të jetë bërë.
Ka disa gjëra që ju thjesht nuk duan të kujdeset për të gjithë kohën në anën e serverit.
Të gjitha ndërveprime të vogla, duke theksuar një gjë, duke e bërë diçka të zhduket.
Ju me të vërtetë nuk duan të duhet të bisedoni me serverin tuaj të gjithë kohën për këtë.
Dhe disa nga të cilat nuk është edhe më e mundur për të bërë në anën server.
Kjo është arsyeja pse ne kemi nevojë për diçka si JavaScript.
Gjëra të ftohtë për JavaScript: Ajo është e shtypur në mënyrë dinamike.
Kjo do të thotë se programi juaj nuk ka nevojë të dini
çka, saktësisht, variablat janë kur ju shkruani atë.
Ajo do vetëm lloj i kuptoj atë si ajo e running.
Gjëra të tjera që janë të ftohtë në lidhje me të: Kjo është një gjuhë e kaçurrel mbajtëse,
që do të thotë Sintaksa është e ngjashme me C dhe PHP.
Ju nuk keni për të bërë shumë Rework kur ju jeni mësuar JavaScript.
Këtu kemi pak JavaScript.
Gjë interesante këtu është se, në qoftë se ju shikoni në atë,
ne kemi një grimë JavaScript drejtë ka në tag kokë.
Çfarë është nuk është në thelb vetëm të përfshijë një skedar JavaScript.
Kjo është një mënyrë ju mund të përfshijnë JavaScript në programin tuaj.
Pastaj e dyta pak në fakt është një inline JavaScript,
shumë e ngjashme me një stil inline me CSS,
dhe ju jeni vetëm duke shkruar një kod shumë shpejt atje.
JavaScript është vargjeve.
Vetëm një tjetër mënyrë për të mbajtur të dhënat e rreth, shumë të dobishme.
Shumë e bukur dhe e lehtë sintaksë.
Ju përdorni kllapa katrore për të hyrë në çdo gjë dhe të mbajë çdo gjë së bashku.
Asgjë shumë komplekse.
Cool gjë në lidhje me JavaScript dhe gjuhë e shkruar në përgjithësi
është se ju nuk duhet të shqetësohen për madhësive array.
Ju mund të përdorni vetëm array.length dhe të mbajnë gjurmët e saj,
dhe gjithashtu array mund të rritet apo të tkurret si keni nevojë për të.
Pra, ju as nuk duhet të shqetësohen për çdo lloj,
oh jo, unë duhet të ndajë më shumë gjëra, ose diçka të tillë.
>> Cool gjë është se këtu ka diçka të quajtur JavaScript objekte.
Kjo është një gjuhë object-oriented, kështu që atë që ka është, në thelb,
një mënyrë për ju për të dhënat e grupit së bashku, disi të ngjashme me një struct,
por ju mund të përdorni atë si një struct ose në një sintaksë asociative array.
Është shumë e thjeshtë dhe çfarë mund të bëni me këtë është të dhënave grup së bashku
në qoftë se ju keni një bandë e të dhënave që është lidhur.
Sepse është e gjitha gjëra që ju duhet për të përshkruar një makinë,
ju nuk keni nevojë që të ketë atë në një bandë e vende të ndryshme.
Ju vetëm mund të rrinë atë në 1 objekt në JavaScript.
Si ju ndoshta e dini, iterating është një nga ato detyra të lodhshme.
Ju vetëm të bëjë atë mbi një pushim. Ju duhet të bisedoni me çdo objekt në makinë,
ose ju duhet të shkoni nëpër çdo send në një listë ose diçka të tillë.
Pra JavaScript ka, të ngjashme me PHP, një sintaksë foreach.
Në këtë rast, kjo është një për në lak.
Ju dëshironi të përdorni këtë vetëm në objekte.
Ka disa probleme që ndodhin në qoftë se ju përdorni këtë në vargjeve.
Kjo në përgjithësi është një nga ato gjëra, pse, se është shumë i dobishëm,
për shkak se ju të eleminuar një shumë të sipërm
sepse ju nuk keni për të tërhequr çdo gjë në objektin tuaj me veten.
Ju nuk duhet të mbani mend të gjithë emrat kryesorë.
Ju vetëm lloj të marrë ato përsëri në këtë sintaksë.
Në këtë, me për të, ju vetëm dëshironi të mbani mend
që ju jeni marrë përsëri të gjitha çelësat, në një mënyrë shumë të ngjashme me Hash tryezë.
Në qoftë se ju mbani mend nga ajo, kur ju do të vihet në një varg që ju mund të merrni diçka nga
se do të ketë një vlerë të lidhur me të.
Çfarë ju mund të bëni me këtë është që ju mund të them, të gjithë të drejtë,
I vënë në një makinë, dhe unë e quajti atë një Ferrari.
Kështu që ju mund të vënë në varg Ferrari përsëri më vonë, dhe ju mund të merrni atë jashtë.
Dhe ju mund ta bëni këtë në një lak, me sepse në lak.
Pra, vetëm më shumë rreth objekteve. Gjëja kryesore nga kjo që ju duhet të mbani mend
është se ju mund të përdorni e strukturës objekt si sintaksë sa herë që ju doni me këto,
përveç nëse ajo që tuaj do të përdorin si një varg nuk është një emër i vlefshëm ndryshueshme.
Pra, nëse ju shikoni në se ka, ne e kemi çelësin me hapësira.
E pra, në qoftë se keni qenë për të vënë object.key, hapësirë, me, hapësirë, hapësira,
që vetëm nuk do të kishte kuptim syntactically.
Kështu që ju vetëm mund të bëni që me këtë lloj kllapa sintaksës.
>> Gjithashtu, JavaScript është shumë Shtrirja-i mençur për PHP.
Ju keni 2 mënyrat e trajtimit fushës.
Ju nuk mund të ketë var para një ndryshore,
dhe se vetëm do të thotë kjo është globale.
Ju mund të shihni atë nga kudo. Edhe në qoftë se ju do të vënë këtë në një nëse deklaratë,
kudo tjetër në kodin tuaj pas atë pikë ju mund të shihni se ndryshore.
Një tjetër gjë, megjithatë, është me var, është e kufizuar në çdo gjë funksion ju jeni futur me emrin
Nëse ju nuk jeni në një funksion, mirë, kjo është globale.
Por nëse ju jeni në një funksion që është në dukje vetëm në atë funksion.
Unë nuk kam një shembull, por, po. Kjo është një nga ato gjëra ku
ju mund të menaxhoni atë që variablat që ju doni të jetë globale,
ajo që variablat që ju duan të jenë vendas, por ju nuk duhet të jenë të kujdesshëm në lidhje me këtë,
sepse ju nuk keni llojin e kontrollit të hollë të grurit që ju bëni në C,
ku nëse diçka është deklaruar në një për lak, ajo do të qëndrojë në atë për lak.
Gjë që ne në të vërtetë e kujdesit për përdorimin e JavaScript për po manipulon faqet e internetit, e drejtë?
Unë do të thotë, kjo është arsyeja pse ne jemi duke e bërë këtë.
>> Për ta bërë këtë, ne përdorim diçka të quajtur DOM.
Object Model Document.
Në thelb, ajo që bën është ajo merr të gjitha HTML tuaj
dhe modele atë në një bandë e objekteve që janë mbivendosur në njëri-tjetrin.
Ju filloni me diçka si kjo.
Ju keni, në të djathtë për mua, një bandë e kodit atje që është lloj i -
Ju do të mendojnë se do të jetë shumë e vështirë për të manipuluar,
sepse ju do të parsing përmes një bandë e tekstit
dhe që ka për të kuptuar gjërat larg. Dhe çka nëse ajo nuk është formatuar si duhet?
Gjëra të këqija do të ndodhë.
Pra JavaScript kujdeset për këtë për ju, dhe që ju të merrni një strukturë e të dhënave të bukur,
si ajo në të majtë e mia, ku ju vetëm duhet një dokument,
dhe brenda se ju keni diçka të quajtur HTML,
dhe brenda se ju keni një kokë dhe një trup,
dhe brenda këtij kreu ju keni një titull, e të tjera, e të tjera, e të tjera.
Kjo thjeshton manipulimin e një faqe web në mënyrë që ajo është vetëm,
oh, unë vetëm dua të flas për këtë objekt.
Lloj i një mënyrë shumë të ngjashme që do të flisni me një tjetër objekt që keni bërë vetë.
Ashtu si thashë, të gjithë DOM është në objekt dokument.
Ose kjo është vetëm një vend dhe pastaj ju mund të shkoni brenda saj për të gjetur gjëra,
dhe ju mund ta bëjë këtë - kjo është stil i vjetër për të bërë atë, deri atje,
ku ju bëni document.getElementById, dhe pastaj emrin,
dhe si ju ndoshta mund të them, kjo merr shumë të ngathët pas një kohë.
Pra, ju ndoshta nuk dëshironi të bëni këtë. Kjo është arsyeja pse ne kemi
gjë tjetër që ne do të flasim për këtë pas.
Gjëja kryesore këtu është që, të gjithë të drejtë, ju keni të gjitha këto elemente, e drejtë?
Pra, ndoshta unë mund të ndryshojë ngjyra e diçka kur loja është loading faqe.
Pra, çfarë? Çfarë ndodh nëse përdoruesi klikon im diçka?
Unë dua që ajo të bëjë diçka interesante kur ata klikoni diçka.
Kjo është arsyeja pse ne kemi ngjarje.
Ju mund të, në thelb, të gjetur ndonjë element në DOM tuaj,
dhe pastaj të thotë, hej. Kur kjo ngarkon apo dikush klikimeve atë,
ose kur ata miut mbi të, të bëjë diçka me të.
Dhe atë që ju keni është, ju kanë funksione që të trajtojë këtë për ju.
Këto funksione janë të handlers ngjarje.
Çfarë they're - kjo është vetëm një mënyrë e sofistikuar për të thënë,
ky funksion është ekzekutuar vetëm kur kjo ngjarje ndodh.
Pra, merret me ngjarje që ndodh.
Kjo është se si ju do të nxjerr një mbajtës ngjarje.
Unë kam disa butonin, dhe kur ju klikoni atë, ajo shpërthen.
Pra, nuk do të klikoni butonin.
Kjo është një mënyrë për të afruar atë, e drejtë?
Ju keni një tag butonin, dhe të klikoni ju keni një varg që thotë,
oh, nga rruga, e bëra këtë shpërthyese për mua.
Përndryshe, kjo është vetëm si një buton i rregullt ju bërë vetëm.
Ju gjithashtu mund të bëjë këtë një mënyrë tjetër,
duke grabbing elementin DOM, por ne do të ruaj se pasi ne flasim për jQuery.
>> JQuery: Kjo është një bibliotekë që është ndër-shfletues.
Ju mund ta përdorni atë në shumë e shumë çdo gjë.
Dhe vetëm ajo ju jep një shumë e mjeteve për të punuar me të.
Sepse JavaScript, ndërsa të fuqishme, nuk i kanë të gjitha mjetet që ju duhet
nga kutia për të vërtetë të trajtuar një app web ju mund të dëshironi të bëni.
Kështu që thjeshton shumë gjëra, ju jep një shumë të funksioneve
nga kutia që normalisht do të duhet për të shkruar vetë, mbi dhe pa pushim.
Dhe vetëm i bën gjërat shumë e thjeshtë.
Ju gjithashtu keni selectors, të cilat ju lejojnë të marrë të gjitha ato elemente
nga DOM tuaj shumë më thjesht, në vend që të përdorin këto thirrje shumë të gjatë funksion.
Më shumë në këto selectors. Ju keni, deri atje ju keni, le të themi
Unë dua të të marrë një element me ID "shkëmb."
E pra, në jQuery, kjo është vetëm $ dhe pastaj një varg që ka një kile, dhe pastaj "shkëmb."
Është shumë e thjeshtë dhe shumë më të shpejtë se sa mënyrën tradicionale JavaScript e trajtimin e këtij problemi.
Dhe ju keni gjëra të ngjashme për klasat dhe llojet element.
jQuery është - një nga veçoritë e ftohtë është që ju mund të lloj të compress
poshtë pyetjet tuaja në DOM tuaj shumë, shumë shpejt.
Tani ne jemi kthyer në trajtimin ngjarje, dhe kjo është se si ju do të trajtojë një ngjarje në jQuery.
Pra, ajo që ne jemi duke shkuar këtu është që ne jemi duke thënë, të gjithë të drejtë. Unë kam një tag script, apo jo?
Kështu që unë kam këtë inline JavaScript.
Ajo që ne jemi duke shkuar për të bërë është që ne jemi duke shkuar për të thënë, të gjithë të drejtë.
Kur dokumenti është i gatshëm, që do të thotë dokumenti i është ngarkuar,
ne do të shkojnë në për atë funksion, dhe ne jemi duke shkuar për të thënë, të gjithë të drejtë,
ky funksion është në të vërtetë duke bërë diçka tjetër.
Është në thelb duke thënë, të gjithë të drejtë, të merrni më elementin me ID "myid."
Dhe atëherë të japë këtë një mbajtës funksion që ekzekuton kur ju klikoni atë.
Në thelb ajo që kjo nuk është, ai thotë, të gjithë të drejtë.
Faqe është ngarkuar, kështu që unë jam duke shkuar për të, të gjetur këtë element,
t'i jepte këtë mbajtës ngjarje, dhe kjo në thelb krijon faqen tuaj për ju.
Dhe kjo është se si ju doni të mendoni për trajtimin ngjarje.
Ju thjesht doni të mendoni për, të gjithë të drejtë, kur diçka ndodh, çfarë unë dua të ndodhë?
Ju nuk doni të mendoni për, në rregull, kam nevojë për t'u siguruar që bisedimet këtë gjë për këtë gjë,
këtë gjë e blah blah blah, sepse ju vetëm doni të flisni gjë në aspektin e ngjarjeve.
Kur kjo ndodh, kjo ndodh. Kur kjo ndodh, kjo ndodh.
Dhe në qoftë se gjëra të shkaktojnë gjëra të tjera, që e madhe.
Por ju nuk doni të përpiqet dhe të bëjë kodin e komplikuar
ku ju jeni duke shkaktuar gjëra të shumta në të njëjtën kohë,
sepse ju jeni vetëm do të japë vetes një dhimbje koke.
>> Rregull. Tani ne mund të merrni faqen tonë për të trajtuar ngjarjet,
por le të themi përdorues ime klikimeve një buton.
Çka nëse unë dua të dërgoj atë prapa kërkesë në server,
por unë nuk dua të rifreskoni faqen, sepse që ka për të rifreskoni një faqe të re
çdo herë të vetme merr lloj i lodhshëm, dhe pse nuk kam nevojë
për të tërhequr poshtë header përsëri, dhe përsëri futboll,
dhe të gjitha elementet e faqes përsëri
vetëm për të rifreskuar përshëndetje apo kohë?
Pra, kjo është arsyeja pse ne kemi diçka si Ajax.
Ajo që ne mund të bëjmë këtu me Ajax është që ne mund të themi, të gjithë të drejtë,
Unë dua të dërgoj disa të dhëna në server,
dhe unë dua të të marrë një përgjigje mbrapa kështu që unë mund update faqen time,
apo ndoshta vetëm të bëjë disa llogaritje algorithmic se nuk do të tregojë asgjë për të përdoruesit.
Çfarë ju duhet të bëni këtë? E pra, ju keni nevojë për një URL që ju duhet për të folur për të.
Serveri juaj nuk mund vetëm të magjike të dëgjojnë nga askund.
Ju duhet të ketë një vend të veçantë që ju jeni dërguar këto të dhëna për të.
Dhe ju gjithashtu duhet disa të dhëna për të dërguar, apo ndoshta kjo është një pyetje dataless.
Ju thjesht doni të ping përsëri në server dhe të thotë, hej, unë jam gjallë, ose diçka të tillë.
Dhe pastaj ju doni një funksion që në thelb merret me sukses.
Le të thonë se të kthehet disa informacione nga serveri juaj,
dhe ju doni për të ndryshuar titullin e përdoruesit në faqen e tyre.
Pra, ju do të merrni informacionin e mbrapa,
dhe ju do të shtyjë që në ekran.
Çfarë ndodh është, kur faqja është gati,
ju e krijoni një klikim në funksion për këtë buton të quajtur greeter.
Çfarë kjo atëherë nuk është, kur se butonin është shtyrë,
ju flisni me greetings.php, ju bëni një kërkesë POST,
dhe ju thoni, hej, merrni mua diçka nga faqja e juaj.
Ne nuk duhet të vërtetë për të përshkruar atë, por greetings.php,
le të them vetëm, i kthen "hello botë."
Pra, ne të kthehemi këtë "Hello World", dhe në suksesin e këtij,
duke supozuar asgjë nuk shkon keq, atëherë ne thjesht shkoni në këtë vend të synuar
që ne të specifikuara dhe ne vetëm rrinë përgjigje në atje.
Dhe kjo është një mënyrë shumë e thjeshtë për ngritjen e një pyetje Ajax.
>> Shumë shpejt, Rob lloj i përmendur këtë tashmë,
gjërat mund të shkojnë keq, gjëra të këqija mund të ndodhë,
kështu që ju doni të njoh veten me këto kode HTTP përgjigje.
Cilat janë këto janë vetëm, si, 200, çdo gjë shkoi në rregull.
Diçka tjetër, gjëra të këqija ndodhur.
Kjo është përgjithësisht gjë që ju doni të mbani mend.
Por është mirë të dish të gjitha këto.
Dhe së fundi, pasi ne kemi kaluar nëpër të gjithë se,
ne duhet të flasim shumë shpejt për projektimin,
dhe pastaj ne mund të ju lejojnë të gjithë largohen.
Dizajn. Gjërat që ju doni të mbani mend.
Pyetni veten këto pyetje: Kush do të jetë duke përdorur këtë?
Çfarë do të jenë duke e përdorur atë për të? Çfarë my users intereson?
Çfarë nuk të intereson?
Ju thjesht nuk duan të bëjnë një app dhe le të vetëm të rritet
dhe të bëhet ky gjigant, që ha gjë që ju nuk mund edhe të përfundojë.
Ju dëshironi që të kenë qëllime të posaçme dhe plane dhe gjërat që ju doni të adresuar.
Bëni të lehtë. E gjithë kjo thotë, në thelb,
e bëjnë të lehtë për përdoruesit për të përdorur atë, nuk e bëjnë atë një pikë gjigandi i tekstit si kjo rrëshqitje është, në të vërtetë.
Ju thjesht duan që ajo të jetë diçka ku është shumë e lehtë për dikë që të shkojnë në
dhe të bëjnë atë që ata duan të bëjnë.
Ju nuk doni që ata të kenë për të lundruar 5 faqe
për të marrë në funksion juaj kryesor e faqes tuaj.
Në qoftë se Google kishte 5 faqe para se të mund edhe të kërkoni diçka,
askush nuk do të përdorin atë.
Dhe së fundi, prototip letër, grup fokusi.
Kanë dizajn të mirë dhe praktikat e testimit.
Vetëm për shkak se ju mendoni se ajo punon për ju,
nuk do të thotë dikush tjetër mendon ajo punon.
Por, vërtet, kjo është ajo.
[CS50.TV]