[Powered by Google Translate] [Secțiunea 4] [mai puțin confortabilă] [Nate Hardison] [Universitatea Harvard] [Acest lucru este CS50.] [CS50.TV] În regulă, bine ai venit înapoi la secțiunea. În secțiunea din această săptămână vom face o serie de lucruri. Mergem să setați mai întâi problema recapitulare 2, care este un set problema Cezar și Vigenere. Și apoi vom arunca cu capul în Quiz comentariu 0 și petrece un pic de timp recapping ceea ce am vorbit despre în fiecare din cele prelegeri până acum, și vom face, de asemenea, câteva probleme la concursuri anului precedent. În acest fel voi avea o bună modalitate de a se pregăti pentru asta. Pentru a începe, am pornit o pereche de soluții bune pentru setul de problema anterioară, problema Set 2, în acest spațiu. Dacă voi lovi toate aceste link-ul, și dacă faceți clic pe numele meu și faceți clic pe prima mea revizuire veți vedea caesar.c, care este exact ceea ce caut eu la. Hai să vorbim despre asta foarte repede. Aceasta este doar o soluție de probă. Acest lucru nu este neapărat soluția perfectă. Există multe moduri diferite de a scrie acest lucru, dar există câteva lucruri pe care am vrut să subliniez că am văzut cum am fost triat, greseli comune pe care cred că această soluție face o treabă foarte bună de manipulare. Prima are un fel de comentariu antet în partea de sus. Pe liniile 1 până la 7 veți vedea detaliile, exact ceea ce acest program este de a face. O bună practică standard, atunci când scrii cod C indiferent dacă programul dumneavoastră este conținută într-un singur fișier sau fie că este vorba împărțită pe mai multe fișiere este de a avea un fel de orientarea comentariu în partea de sus. Acest lucru este, de asemenea, pentru persoanele care ies și să scrie cod în lumea reală. Acest lucru este în cazul în care vor pune informatii de copyright. Mai jos sunt include #. Pe linia 16 e un # define, pe care ne vom întoarce la doar un pic. Și apoi, o dată funcția începe, începe o dată principale, pentru că acest program a fost toate cuprinse într-o singură funcție Primul lucru care se întâmplă și acest lucru este foarte idiomatice și tipic al unui program C care să ia în linia de comandă argumente-este că imediat verifică pentru numărul de argument, argc. Chiar aici vedem că acest program se așteaptă la 2 argumente exact. Amintiți-vă că nu există argument în primul rând că e una specială asta e întotdeauna numele programului care a fost executați, numele fișierului executabil. Și deci ce acest lucru nu este împiedică utilizatorul să ruleze programul de cu argumente mai mult sau mai puține. Motivul pentru care doriți să verificați pentru acest lucru imediat, deoarece este nu putem accesa de fapt, această matrice argv chiar aici fiabil până când ne-am verificat pentru a vedea cât de mare este. Una dintre cele mai comune erori am văzut a fost oamenii ar merge imediat în si apuca argv [1]. Ei ar apuca argumentul-cheie din matrice și nu o să-mi verific pe el, si apoi le-ar face testul pentru argc, precum și următorul test, indiferent dacă sunt sau nu primul argument a fost într-adevăr un număr întreg, în același timp, și că nu funcționează pentru că, în cazul în care nu există argumente furnizate vei fi hapsân un argument care nu este acolo sau încercarea de a apuca unul care nu este acolo. Un alt lucru important pe care ar trebui să observați faptul că este vrei mereu să imprime un fel de mesaj de eroare este utill a utilizatorului să le orienteze. Sunt sigur că ați toate programele pe termen în cazul în care dintr-o dată se avariază, și veți obține acest dialog pic ridicol că apare și spune ceva oribil criptic și poate vă oferă un cod de eroare sau ceva de genul asta care nu face nici un sens. Acest lucru este în cazul în care doriți cu adevărat să ofere ceva de ajutor și direcționate către utilizator, astfel că, atunci când l-au alerga ei merg "Oh," fata de palmier. "Eu știu exact ce să fac eu știu cum să se stabilească acest lucru.". Dacă nu se imprimă un mesaj, apoi va ajunge de fapt, lăsând utilizatorul să meargă examina codul sursă să dau seama ce a mers prost. Există, de asemenea, unele momente pe care le veți folosi diferite coduri de eroare. Aici am folosit doar o să spun că a fost o eroare, A apărut o eroare, nu a fost o eroare. Programe mai mari, de multe ori programele care sunt numite de către alte programe, va returna un fel de coduri de eroare speciale în diferite scenarii de a comunica programatic ceea ce ar fi altfel utilizați doar un mesaj frumos engleză pentru. Mișto. Așa cum vom lucra în jos, puteți vedea vom trage afară cheie. Am testa pentru a vedea dacă se potrivește cheia. Primim un mesaj de la utilizatorul. Motivul pentru care o facem în acest do-while și acest lucru este ceva care ne va acoperi într-un pic, dar se pare că, dacă tastați controlul D atunci când vei ajunge ca getString promptă pe terminalul ce de fapt nu este acesta trimite un caracter special la program. Se numește ELF sau sfârșitul fișierului de caracter. Și în acest caz, șirul mesajul nostru va fi nulă, deci acest lucru nu a fost ceva ne-am cazat la problema stabilit. Dar, așa cum am merge mai departe, acum că am început să vorbim despre pointeri și alocarea dinamică a memoriei pe heap, verificarea nul ori de câte ori aveți o funcție care ar putea intoarce null ca valoare este ceva pe care veți dori să obțineți în obiceiul de a face. Acest lucru este în primul rând aici pentru ilustrare. Dar când te văd getString în viitor, astfel de problema pe Set 4, veți dori să păstrați în vedere acest lucru. Din nou, acest lucru nu este o problemă pentru problema Set 3 ori, deoarece nu am l-au acoperit încă. În cele din urmă, ajungem la prezenta parte în cazul în care vom ajunge la bucla de criptare principală, și există o serie de lucruri se întâmplă pe aici. În primul rând, am repeta peste șirul întregul mesaj în sine. Aici ne-am păstrat apel strlen în stare, care un număr dintre voi au subliniat nu este o modalitate foarte bună de a merge. Se pare, în acest caz, nu este, de asemenea, o mare, în parte pentru că suntem modificarea conținutul mesajului în sine în interiorul pentru bucla, deci, dacă avem un mesaj care este de 10 caractere, prima dată când am începe ca pentru bucla strlen va reveni ce? 10. Dar dacă vom modifica, atunci mesajul, spune vom modifica caracterul său cincea, și ne arunca intr-un \ 0 caracter în locul 5, pe o repetare ulterioară strlen (mesaj) nu va returna ceea ce a făcut prima dată am reiterat, dar va reveni în locul 5, deoarece am aruncat în terminator nul, și lungimea string este definită de poziția pe care \ 0. În acest caz, aceasta este o modalitate foarte bună de a merge pentru că noi îl modificarea în loc. Dar observați că acest lucru este de fapt surprinzator de simplu pentru a cripta în cazul în care puteți obține matematica corecta. Tot ce este necesar este de a verifica dacă este sau nu scrisoarea pe care îl căutați la este mari sau mici. Motivul pentru care trebuie doar pentru a verifica faptul că și noi nu trebuie să verificați caz este alfa este că în cazul în care un personaj este majusculă sau daca e cu litere mici atunci e cu siguranta un caracter alfabetic, pentru că nu avem cifre mari și mici. Un alt lucru facem și acest lucru este un pic cam complicat, este am modificat standardul Cezar cifrul formulei pe care le-a dat, în caietul de sarcini set de probleme. Ce e diferit aici este ca noi scade în cazul de capital majuscule A, iar apoi am adaugat capitalului A Înapoi în la sfârșitul anului. Știu că unii dintre voi ați făcut acest lucru în cod. Credeți vreunul din voi face acest lucru în observațiile tale? Tu ai făcut asta. Poți explica ce face asta, Sahb? Prin scăderea-l, pentru că ai făcut un mod imediat după aceasta, trebuie să-l scot, astfel încât modul în care obține [tuse] poziția. Și apoi, adăugându-l înapoi mai târziu vei schimbat peste cel pe care ai vrut. Da, exact. Ceea ce a spus a fost Sahb că, atunci când dorim să adăugăm Mesajul nostru si cheia noastră împreună și apoi Mod că, în mod ca prin NUM_LETTERS, dacă nu ne scala mesajul nostru în caz intervalul 0 - 25 în primul rând, atunci am putea ajunge obtinerea unui numar foarte ciudat deoarece valorile pe care ne uită puțin atunci când ne uităm la mesaj [i], atunci când ne uităm la caracterul lea al nostru simplu-mesaj text, este o valoare undeva în acest interval 65 - 122 pe baza valorilor ASCII pentru majuscule de la A la Z litere mici. Și așa că atunci când l-am modez cu 26 sau prin NUM_LETTERS, din moment ce a fost ne definesc # la dreapta sus aici, care este de gând să ne dea o valoare care este în intervalul de la 0 la 25, și avem nevoie de o modalitate de a scala atunci înapoi și să-l în intervalul ASCII corespunzător. Cel mai simplu mod de a face acest lucru este pentru a scala totul în jos în intervalul de la 0 la 25 la început, , apoi SHIFT totul înapoi până la sfârșitul anului. O altă eroare comună pe care l-am văzut oamenii rula în faptul că este daca nu face de fapt acest scalare imediat și adăugați mesaj si tasta împreună și să le adăugați, să zicem, într-o variabilă char, problema cu care Este deoarece mesajul [i] este un număr relativ mare pentru a începe cu, amintiți-vă că e cel puțin 65 dacă e un personaj cu litere mari, dacă aveți o cheie mare, să zicem, ceva de genul 100, și adăugați cele două împreună într-un char semnat ai de gând pentru a obține o depășire. Ai de gând să obțineți o valoare care este mai mare decât 127, care este cea mai mare valoare pe care o variabilă char poate stoca. Din nou, asta e ce vrea să facă acest fel de lucru pentru a începe cu. Unii oameni au în jurul valorii de acest caz de a face o dacă altcineva și testarea pentru a vedea dacă acesta ar fi depășire înainte de a face asta, dar în acest fel se în jurul valorii de acest lucru. Și apoi, în această soluție am imprimat șir întreg de la sfârșitul foarte. Alte persoane imprimat un caracter la un moment dat. Ambele sunt minunat. În acest moment, nu voi avea nici întrebări, nici un comentariu cu privire la acest lucru? Lucrurile care iti plac, lucruri care nu vă plac? Am avut o întrebare. Poate l-am ratat în timpul explicația ta, dar cum face acest program de sări peste spațiile pentru conectarea cheia lungimea textului? Acesta este doar cifrul lui Cezar. >> Oh, scuze, da. Da, vom vedea că. În cifrul lui Cezar avem în jurul valorii de faptul că din cauza am intors doar caractere. Noi doar le rotit în cazul în care acestea au fost mari sau mici. Voi simți destul de bine despre asta? Simțiți-vă liber pentru a copia aceasta casa, ia-, compare cu ceea ce voi scrie. Categoric nu ezitați să trimiteți întrebări despre ea. Și din nou, realizăm că scopul aici cu problema ta seturi nu este de a ajunge voi pentru a scrie cod perfect pentru seturi de problema ta. E o experiență de învățare. Da. Înapoi la bucla do în timp ce, în cazul în care este egal cu zero, astfel null înseamnă doar nimic, au lovit pur și simplu introduceți? Nul este o valoare pointer specială, și vom folosi nul atunci când vrem să spunem avem o variabila pointer care indică la nimic. Și așa de obicei, înseamnă că această variabilă, această variabilă mesaj este gol, și aici, pentru că suntem folosind tipul de CS50 șir de construcții, ceea ce este de tip șir CS50? Ați văzut ce se întâmplă atunci când David a tras înapoi capota în curs? E un funky-e un pointer, nu? Bine, da >> E. E un char *. Și într-adevăr așa am putea înlocui această chiar aici cu mesajul char *, și astfel funcția de getString, în cazul în care nu se obține cu succes un șir de utilizator, nu se poate analiza un șir, și un caz în care nu se poate analiza un șir este dacă utilizatorul final tipuri de caracter dosar, D de control, care nu este ceva ce faci de obicei, dar în cazul în care se întâmplă atunci funcția va returna această valoare nulă ca o modalitate de a spune "Hei, eu nu am primit un șir." Ce s-ar întâmpla dacă nu punem mesaj = nul, care este ceva ce nu am făcut încă? De ce ar fi asta o problemă aici? Pentru că eu știu că am vorbit un pic în prelegere despre pierderi de memorie. Da, hai să facem asta, și să vedem ce se întâmplă. Întrebarea lui Vasile a fost ceea ce se întâmplă dacă nu avem de fapt acest mesaj = null testul? Să derulați până la partea de sus. Voi pot comenta acest lucru. De fapt, voi salva într-o revizuire. Acest lucru va fi Revizia 3. Ce va trebui să facă pentru a rula acest program este că va trebui să faceți clic pe această pictogramă să mizeze mai mult aici, și va trebui să adăugați un argument la acesta. Va trebui să-i dea argumentul cheie, deoarece dorim să treacă într-un argument de linie de comandă. Aici am de gând să-i dea numărul 3. Îmi place 3. Acum, zoom înapoi, rularea programului. E de funcționare, compilarea, construirea. Aici vom merge. Se așteaptă a fi atentionat. Dacă aș scrie în ceva de genul salut, în cazul în care a mers? Oh, programul meu a luat prea mult timp pentru a rula. Am fost jawing pentru prea mult timp. Aici merge. Acum scriu în salut. Vedem că criptează în mod corespunzător. Acum, ce se întâmplă dacă facem getString prompt pentru a intoarce null? Amintiți-vă, am spus că am făcut asta prin apăsarea de control D, în același timp. Voi derulați în sus aici. Vă vom rula din nou. Clădire. Momentan nu merge. Acum, când am lovit de control D Am primit această linie care spune opt/sandbox50/bin/run.sh, Segmentation fault. Ați văzut că, înainte de voi? [Student] De ce nu există nici->> Imi pare rau? [Student] De ce nu există nici o benă de bază în acest caz? Benă de bază este întrebarea-se de ce nu există nici o benă de bază aici? Întrebarea este că poate exista, dar groapa de bază este un fișier care se stochează pe hard disk. În acest caz, ne-am dezactivat haldele de bază pe serverul termen, astfel încât să nu avem oameni SEG Faulting și construirea de tone de haldelor de bază. Dar s-ar putea obține unul. Haldele de bază sunt genul de lucruri pe care le puteți dezactiva de multe ori, și, uneori, să faci. Eroare de segmentare, pentru a răspunde la întrebarea dvs., Vasile, se spune că am încercat să acceseze un pointer care nu a fost setat pentru a indica nimic. Amintiți-vă, în Binky video atunci când încearcă să Binky du-te accesa un pointer care nu este îndreptat la ceva? În acest caz, cred punct de vedere tehnic indicatorul indică spre ceva. Este arătând spre nul, care este punct de vedere tehnic 0, dar care este definit a fi într-un segment care nu este accesibil de programul tău, astfel încât să obțineți o eroare de segmentare pentru că nu sunteți accesarea memoriei, care este într-un segment validă cum ar fi segmentul de heap sau segmentul de stiva sau segmentul de date. Mișto. Orice mai multe întrebări despre Cezar? Să trecem mai departe. Să ne uităm la Revizia 2 foarte repede. Asta e Vigenere. Aici, în Vigenere vom trece prin aceasta destul de repede, deoarece, din nou, Vigenere și Cezar sunt destul de asemănătoare. Antet comentariu este înainte, # Define este înainte de a evita folosirea acestor numere magice. Cel mai frumos lucru este spus am vrut să se mute în un alfabet diferit sau ceva de genul asta. Mai degrabă decât a fi nevoie să meargă manual schimba toate 26 în codul am putea schimba acest lucru 27 sau plasați-l în jos dacă am fost folosind alfabete diferite, limbi diferite. Din nou, avem această verificare a numărului de argument, și într-adevăr puteți lua aproape ca pe un șablon. Destul de mult fiecare program pe care il scrie ar trebui să- în cazul în care este nevoie de argumente din linia de comandă-unele secvență de linii , care arată ca aceasta de la bun început. Asta e unul din testele bun-simț primul care doriți să le faceți. Aici ceea ce am făcut a fost că ne-am asigurat cuvântul cheie a fost valabil, iar asta a fost a doua verificări pe care am făcut-o. Observați din nou că ne-am despărțit de această argc și 2. Rețineți că, în acest caz, un lucru pe care am avut de a face a fost în schimb de a folosi un la i ne-am dorit pentru a valida întregul șir, și în scopul de a face acest lucru, de fapt trebuie să mergi caracter cu caracter peste șir. Nu e nici o modalitate buna de a apela ceva pe ea deoarece, chiar, de exemplu, o să i se va returna 0 în cazul în care nu se poate analiza un număr întreg, astfel că nu funcționează, chiar. Din nou, mesaj frumos spune ghidul exact ce sa întâmplat. Atunci aici, din nou, de asemenea, ne ocupam de cazul în care utilizatorul tastează într-un caracter de control aleatoriu D. Și apoi Charlotte a avut o întrebare mai devreme despre cum vom reuși să săriți peste spațiile în șirul nostru aici. Acest lucru a fost un fel de similar cu ceea ce am făcut cu programul Myspace pe care am făcut-o în secțiune, și modul în care aceasta a funcționat este că am urmărit numărul de scrisori pe care le-am văzut. Așa cum ne-am plimbat peste șirul de mesaje, așa cum ne-am plimbat peste caracter cu caracter, am urmărit indicele, ca parte a noastră pentru buclă, și apoi am urmărit, de asemenea, numărul de scrisori, astfel încât non-speciale de caractere, non-cifre, non-spațiu alb că am fi văzut în variabilă separată. Și apoi această soluție modifică tasta pentru a obține un întreg real cheie, și-l face ca pe zbor, chiar înainte de a merge la cripta, apoi caracterul mesajul real. Există câteva soluții care au fost perfect prea mare care ar modifica tasta atunci când testarea de valabilitate a cheii. În plus față de asigurându-vă că personajul și cuvinte cheie a fost un caracter alfabetic, de asemenea, transformat ca într-un întreg în intervalul de la 0 la 25 la săriți, atunci având de a face ca mai târziu, în această buclă pentru. Din nou, veți vedea aici, acest lucru este foarte exact același cod de pe care am folosit în Cezar, la acest punct. Tu faci exact același lucru, astfel încât truc real este imaginind cum să transforme cuvântul cheie într-un întreg. Un lucru pe care am făcut-o aici, că este un pic dens Este am repetat această frază, cred ca ai putea numi, De 3 ori separate pe liniile 58, 59, și 61. Poate cineva explica exact ceea ce această frază nu? E un personaj accesarea, cum ai spus. Da, e [neauzit] un personaj cheie în, și așa este numărul de litere data pentru ca esti doar în mișcare de-a lungul cuvinte cheie după ce ați văzut scrisoarea, astfel că va sări în mod eficient spații și chestii de genul asta. Da, exact. Și apoi, o dată ce ați văzut martor cheie pe care tocmai ați mod, astfel încât să se mute înapoi în jurul valorii de. Exact. Asta e o explicație perfectă. Ceea ce a spus Kevin este că dorim să indice în cheie. Ne dorim pentru a obține caracterul num_letters_seen, dacă vreți, dar dacă num_letters_seen depășește lungimea de cuvinte cheie, modul ajungem înapoi în intervalul corespunzător este vom folosi operatorul mod să-și încheie în jurul valorii de eficient. De exemplu, la fel ca în scurt, cuvântul cheie nostru este slănină, și e 5 litere. Dar am vazut 6 litere din textul nostru simplu în acest moment și criptate 6. Vom ajunge accesarea num_letters_seen, care este de 6, Mod lungime de cuvinte cheie, 5, și astfel vom obține 1, și așa mai departe ceea ce vom face este că voi accesa interiorul primul caracter al cuvintelor cheie la acel moment. În regulă, orice probleme referitoare la Vigenere înainte de a ne muta pe? Voi simți destul de bine despre asta? Rece, mare. Vreau să vă asigurați că voi sunt obtinerea sansa de a vedea codul care credem că arată bine și au șansa de a învăța de la ea. Acest lucru va fi ultimul vom folosi spații pentru moment, și am de gând să tranziției acum, și am de gând să merg la cs50.net/lectures astfel încât să putem face un pic de reexaminare test. Cel mai bun mod de a începe să cred că faci Quiz comentariu este de a veni la această pagină Prelegeri, cs50.net/lectures, și sub fiecare dintre rubricile pe săptămână, așa că dacă mă uit aici, în Săptămâna 0, Văd că avem o listă de subiecte pe care ne-am ocupat în Săptămâna 0. Dacă oricare dintre aceste subiecte par nefamiliare pentru tine veți dori în mod sigur să se întoarcă și cutreiera notele de curs și, eventual, chiar și răsfoiesc prin prelegeri, le uit din nou daca vrei pentru a obține o simt pentru ceea ce se întâmplă cu fiecare dintre aceste subiecte. Eu va spun acest plus de un an de resursele rece ne-am luat este aceste pantaloni scurti pe care le-am creat, și, dacă te uiți la săptămâna 0, nu avem toate subiectele acoperite, dar avem destul de puține dintre ele, unele dintre cele mai complicată, astfel încât aceste pantaloni scurti uitam din nou este o modalitate buna de a te până la viteza. În special, am de gând să pună într-o fișă de 3 pe partea de jos, de când am făcut-o cei. Dar dacă te lupți cu binar, biți, hexagonal, că astfel de lucruri, binar este un loc minunat pentru a începe. ASCII este un alt una care e bine sa poti vedea prea. Puteți viziona chiar mi-a la viteza 1.5x, dacă am de gând prea lent pentru tine. Întrucât comentariu e, nu ezitați să faci asta. Doar pentru a începe foarte repede, vom merge printr-o pereche de aceste probleme test doar pentru a putinei rapid prin acestea. De exemplu, să ne uităm la problema 16, că am dreptul de până aici, pe bord. Avem acest calcul următor, în binar, și vrem să arate orice lucrare. Bine, am de gând să dea această șansă o. Voi ar trebui să urmeze, împreună cu hârtie, și vom face acest lucru foarte repede. Dorim să efectuați următorul calcul în binar. Am 00110010. Și am de gând să se adauge 00110010. Pentru matematica genii în urma de-a lungul la domiciliu, acest lucru este în mod eficient înmulțirea cu 2. Să începem. Mergem să urmeze același algoritm plus pe care o facem cand adaugam numere zecimale împreună. Într-adevăr singura diferență este că ne bucla înapoi în jurul valorii de odată ce avem 1 + 1 în loc de o dată ajungem la 10. Dacă pornim de la dreapta, foarte repede, ceea ce e prima cifră? [Student] 0 >> [Nate H.]. 0. Mare, doua cifră? [Student] 1. [Nate H.] Este un 1? 1 + 1 este? [Student] 10. [Nate H.] Exact, astfel încât ceea ce este cifre, care scriu chiar sub cele 2 cele adăugate împreună? [Student] 1, 0, sau 0 și apoi transporta 1. [Nate H.] 0 și transporta un 1, mai exact. Următorul unul, Vasile, te-ai trezit. Care este al treilea? >> [Vasile] 1. [Nate H.] 1, perfectă. Kevin? [Kevin] 0 >> [Nate H.]. 0, Charlotte? [Charlotte] 0 >> [Nate H.]. Da, și eu ce fac? [Student] 1. [Nate H.] Și eu ce fac? Și apoi m-am transporta 1. Top, Sahb >>? [Sahb] Acum ai 1. [Nate H.] Și trebuie să fac ceva aici? [Sahb] Apoi, pentru cel de langa ai 1, deoarece te-a purtat peste 1. [Nate H.] Mare, așa că aici putem termina. Mișto. [Student] Are 0 + 0 = 0? 0 + 0 = 0. 1 + 1, cum ai spus, este de 10, sau 1, 0, mai degrabă. 10 este un termen impropriu, deoarece pentru mine 10 înseamnă numărul 10, și este capriciu de modul în care ne reprezinta pe noi atunci când îl scriu. Ne reprezintă numărul 2 de 1, 0, iar numărul 10 este ușor diferită. Ce e un fel de frumos despre binar este faptul că există într-adevăr nu sunt atât de multe cazuri aveți nevoie pentru a învăța. Nu e 0 + 0 = 0, 0 + 1 = 1, 1 + 1 este 0, iar apoi transporta un 1, și apoi puteți vedea aici, pe coloana a treia de la dreapta am avut această 1, 1, și 1. Și 1 + 1 + 1 este un 1, și purtați un alt 1. Când faci plus binar, destul de simplu. Aș face-o mult mai tânăr dintre acestea pentru a vă verifica sanatatea înainte de a merge în, deoarece acest lucru este probabil, ceva ce vom vedea pe testul. Acum, hai sa facem asta următor. Să facem problemă 17. Mergem pentru a converti numărul binar în zecimal următorul. Am 10100111001. Amintiți-vă în filme binar pe care am făcut-o M-am plimbat printr-o serie de exemple, și am arătat cum totul funcționează atunci când o faci în zecimal. Când lucrați în reprezentarea zecimală Cred ca suntem în acest moment, în viețile noastre, astfel fluent în ea, care este destul de ușor să treacă peste mecanica de modul în care funcționează de fapt. Dar pentru a face o recapitulare rapidă, dacă am numărul 137 Aceasta inseamna-și, din nou, acest lucru este în zecimal reprezentarea- numărul 137 în zecimal înseamnă că am 1 x 100 + 3 x 10 + 7 x 1. Acest lucru este sejurului pe ecran. Și apoi, dacă te uiți la aceste numere de aici, 100, 10 și 1, veți vedea că de fapt ele sunt toate puterile de 10. Am 10 ², 10 ¹, și 10 la zero. Avem un fel similar de lucru în binar, cu excepția faptului că baza noastră, așa cum o numim, este de 2 în loc de 10. Aceste 10s că am scris aici, la partea de jos, acest ² 10, 10 ¹, 10 la zero, 10 este baza noastră, și exponent, 0, 1, sau 2, este implicat de poziția de cifre, în numărul pe care le scrie. 1, dacă ne uităm la ea, acest 1 este în poziția 2. 3 este în poziția 1, iar 7 este în poziția 0th. Asta e modul în care vom ajunge exponenții diferitelor mai jos pentru bazele noastre. În urma toate acestea noi vom-de fapt, știi ce? Vom face-mi unde ai anulează butonul merge? Momentan nu merge. Îmi place acest lucru anulează. Ca urmare a acestei Cred că pentru mine cel puțin cel mai simplu mod de a începe conversia unui număr din binar sau în cazul în care un număr hexazecimal de bază este de 16 și nu 10 sau 2 este de a merge mai departe și scrie bazele și exponenților pentru toate numerele de la numărul meu de binar în partea de sus. Dacă pornim de la stânga la dreapta din nou, care este un fel de contraintuitiv, Voi reveni la negru aici, avem 2 la poziția 0th, și apoi avem 2 ¹, ² 2, și apoi 2 la 3, 2 la 4, 2 la 5, 6, 7, 8, 9, și 10. Aceste numere le-am scris în toate sunt exponenți. Am scris doar bazele aici, în 3 primul doar pentru spațiu. În acest moment am de gând să merg mai departe și am de fapt de gând să șteargă lucrurile pe care am facut in zecimal, dacă e în regulă. Cu toții ați prins. Aceia dintre voi vizionarea on-line Sunt sigur că va fi capabil să-mi înapoi, dacă doriți. Comutarea înapoi la stilou. Acum, ce putem face-în cazul în care voi nu sunt în totalitate până la viteza pe puterile tale de 2, asta e mișto. Se întâmplă. Am înțeles. Am avut odată un interviu loc de munca unde mi sa spus că ar trebui să știe toate puterile de 2 până prin 2 la 30. Acesta nu a fost un loc de muncă am ajuns. Oricum, voi poate merge mai departe și de a face matematica aici, dar cu binar aceasta nu prea are sens, și nici nu face sens cu zecimale sau hexazecimale, fie, pentru a face matematica de unde ai zerouri. Puteți vedea aici am 0, un 0 aici, aici 0, 0 aici, aici 0, 0 aici. De ce s-ar putea să nu-l face sens pentru a face matematica reală pentru a calcula puterea adecvată a 2 pentru această poziție? Exact, la fel ca Charlotte a declarat, că va fi 0. S-ar putea la fel de bine salvați-vă de timp în cazul în calcul competențele de 2 nu este costumul tău puternic. În acest caz, avem nevoie doar pentru a calcula pentru 2 la 0, care este,? [Student] 1. [Nate H.] 1, 2 la 3, care este,? [Student] 8 >> [Nate H.]. 8. 2 la 4? [Student] 2. Îmi pare rău, 1. [Nate H.] 2 la 4 este de 16, mai exact. 2 la 5, Kevin >> 32.? [Nate H.] 32, 2 la 8? [Student] 32 x 8, 256. [Nate H.] de top. Și 2 la 10? [Student] 1024. [Nate H.] Da, 1024. După ce ne-am luat aceste numere ne pot rezuma-le pe toate. Și acest lucru este în cazul în care este foarte important să se facă o serie de lucruri. Unul este du-te lent și să verificați munca ta. Vă pot spune că există un 1 la sfârșitul acestui număr, așa că am ar trebui să ajunge cu siguranta un numar impar ca rezultatul meu, deoarece toate celelalte vor fi nici măcar numerele de având în vedere că este un număr binar. Un alt lucru de făcut este dacă ajungi la acest punct de pe testul și l-ați scris atât de departe si tu esti in criza de timp uita-te la numărul de puncte pe care această problemă este în valoare de. Această problemă, după cum puteți vedea, dacă am întoarce la laptop-ul meu foarte repede- această problemă este în valoare de 2 puncte, deci acest lucru nu este un fel de adaos ar trebui să fie trece printr-dacă sunteți într-adevăr presat de timp. Dar ne vom reveni la iPad, și vom merge prin ea foarte repede. Îmi place faci primul număr mic pentru că mi se pare că mai ușor. Îmi place 32 și 8, deoarece acestea merg împreună destul de ușor, și vom obține 50. 16 și 1 devine 17. Momentan nu avem 57, și apoi putem face restul de acest lucru, astfel încât să putem face 57, 156. Haide. Om, ei bine, să vedem. Am avut 57, 256, și 1024. În acest moment, aș mai degrabă merg doar prin. Nu am nici o idee. Am nevoie în mod clar să citiți pe acest. 7, 6, și 4, veți obține 17. 1, 5, 5, 2, 13. Apoi ne-am obține 3, iar apoi vom lua 1. 1337. Ouălor de Paște, cineva? Oricine recunoaște acest număr? Chris recunoaște numărul. Ce înseamnă, Chris? [Chris] Leet. Leet, așa că, dacă te uiți la asta, se pare ca leet. Hacker chestii. Ferește-te de astfel de chestii pe termen mediu sau test, mai degrabă. Dacă vedeți acest tip de lucruri și te intrebi "Huh," care ar putea însemna, de fapt ceva. Nu știu. David îi place să-l pune inch E un mod bun de a bun-simț a verifica. Ca regulă, pot să văd ce se întâmplă. Asta e Săptămâna 0/Week 1 chestii. Dacă ne reveni la laptop-ul nostru acum, zoom out, și un cuplu de alte lucruri. Nu e ASCII, care am fost a face o mulțime de probleme cu seturi. Această noțiune de capital A. Ce este asta cu adevărat? Știind că e întreg zecimal. 65 este ceea ce este mapat în tabelul ASCII, și că, prin urmare, este modul în care computerul îl scrie, și că este modul în care am fost obtinerea departe cu efectiv scris capitalul caracterul A și caracterul minuscule un în unele dintre aceste soluții și seturi de probleme pe care le-am făcut. Un tânăr de alte lucruri. Avem declarații, expresii booleene, condiții, bucle, variabile și fire. Cei care par toate să aibă sens pentru cea mai mare parte? Unele din această terminologie este un pic la funky, ori. Îmi place să mă gândesc la o declarație ca pentru ceva mai mare parte, care se termină cu punct și virgulă. Declarații cum ar fi x = 7, care stabilește o variabilă, probabil numit x = 7. Probabil x este, de asemenea, un tip care poate stoca numărul 7, așa că este un int sau, eventual, un flotor sau un scurtcircuit sau un char, ceva de genul asta. O expresie booleană este utilizarea acestor dublu este egal cu și-bang-ului este egală sau mai egal, nu mai puțin de, mai mare decât, mai mică sau egală cu, tot ce fel de lucruri. Starea apoi sunt situații în cazul în care altă parte. Aș aminti că nu poți avea o altă fără un corespondent în cazul în care. De asemenea, nu poti avea o altfel, dacă, fără o corespunzătoare, dacă. Bucle, amintim cele 3 tipuri de bucle am fost cu ciocanul în tine pentru ultimii doi secțiuni și seturi de probleme. Utilizarea în timp ce-mi cand esti introduse de utilizator, în timp ce folosind bucle până la o anumită condiție este adevărată, și apoi, folosind cele pentru bucle, dacă aveți nevoie pentru a știu care iterație a buclei sunteți în prezent pe așa cred eu despre asta. Sau, dacă faci o pentru fiecare caracter dintr-un șir vreau să fac ceva, pentru fiecare element într-o matrice Vreau să fac ceva în acest element. Fire și evenimente. Acestea nu am acoperit în mod explicit în C, dar amintiți-vă acest lucru de la Scratch. Aceasta este noțiunea de a avea diferite scrieri. Acest lucru este, de asemenea, această noțiune de difuzare a unui eveniment. Unii oameni nu au folosit radiodifuziune în proiectele lor inițial, care este total rece, dar acestea sunt 2 moduri diferite de manipulare această problemă mai mare concurenta numite, care este modul în care ajungi să execute programe sau de a executa aparent, în același timp? Sarcini diferite care rulează în timp ce alte sarcini sunt, de asemenea, difuzate. Acesta este modul în care sistemul de operare pare să funcționeze. Acesta este de ce, chiar dacă, de exemplu, Am fost browser-ul meu rulează, pot activa, de asemenea, pe Spotify și reda o melodie. Asta e mai mult o chestie conceptuală pentru a înțelege. Mi-ar lua o privire la firele scurte dacă doriți să aflați mai multe despre asta. Să vedem, cred că ar fi putut fi o problema la aceasta într-una din astea. Din nou, cred ca fire și evenimente nu sunt ceva ce vom acoperi în C doar pentru ca este mult mai dificilă decât în ​​Scratch. Tu nu ar trebui să vă faceți griji despre asta acolo, dar cu siguranta intelege conceptele, înțeleagă ce se întâmplă. Înainte de a trece mai departe, orice întrebări cu privire Săptămâna 0 materiale? Toată lumea simte destul de bine? Înțelegerea și variabile ce o variabilă este? Mergem mai departe. Săptămâna 1. Un tânăr de lucruri aici care nu au fost acoperite în special în revizuirea Quiz necesar și, de asemenea, sunt lucruri mult mai conceptuale să se gândească. Primul este această noțiune a ceea ce de cod sursă, compilatoare și cod obiect sunt. E cineva? Vasile. Este obiect de cod Adică codul sursă este ceea ce ai pus în zăngănit, și codul obiect este ceea ce face să răsune pune în așa fel încât computerul poate citi programul. Exact. Codul sursă este codul C pe care le tastezi sus. Codul obiect este ceea ce te face să răsune din. E 0s și 1s în format binar. Atunci ce se întâmplă este atunci când aveți o grămadă de fișiere obiect, presupunem că întocmirea unui proiect sau a unui program care folosește mai multe fișiere de cod sursă, care, prin convenție, sunt prezentate extensia c.. fișier. De aceea avem vigenère.c caesar.c,. Daca scrii programe Java le dai extensia. Java. Programele Python au extensia pa de multe ori.. Odată ce aveți mai multe fișiere. C, le compilați. Zăngănit scuipa toate vechiturile astea binar. Apoi, pentru ca vrei doar 1 program de aveți link-ul de linker-ul toate aceste obiecte fișierele împreună în 1 fișier executabil. Acest lucru este, de asemenea, ceea ce se întâmplă atunci când utilizați biblioteca CS50, de exemplu. Biblioteca CS50 este atât faptul că fișierul. H header că ai citit, asta # includecs50.h. Și atunci este, de asemenea, o bibliotecă specială fișier binar care a fost compilat care este 0s și 1s, și că-L de pavilion, așa că, dacă ne întoarcem la spațiile noastre și ne uităm foarte repede la ce se întâmplă pe aici, atunci când ne uităm la comanda zăngănit noastră, ceea ce avem este aceasta este codul nostru fișierul sursă, chiar aici. Acestea sunt o grămadă de steaguri de compilare. Și apoi, la sfârșitul foarte, acestea-L link-ul de steaguri în fisierele binare efective pentru aceste 2 biblioteci, biblioteca CS50 și apoi biblioteca matematica. Înțelegerea fiecare tip de fișiere scop " în procesul de compilare este ceva veți dori să fie în măsură să da cel puțin o imagine de ansamblu nivel ridicat de. Codul sursă vine in cod obiect iese. Fișierele cod obiect lega împreună, și veți obține un fișier frumos, executabil. Mișto. Acest lucru este, de asemenea, în cazul în care puteți obține erori de la punctele de mai multe în procesul de compilare. Acest lucru este în cazul în care, de exemplu, dacă vă luați acest pavilion care leagă, pavilion CS50, și îl omite în spațiile sau atunci când execută codul, acest lucru este în cazul în care veți primi o eroare în faza de legătură, și linker-ul va spune, "Hei, ai sunat-o funcție getString care este în bibliotecă CS50. " "Mi-ai spus că a fost în biblioteca CS50, iar eu nu pot găsi codul pentru acesta." Asta e în cazul în care trebuie să-l lega în, și asta e separată dintr-o eroare de compilare deoarece compilatorul se uita la sintaxa si acest gen de lucruri. E bine să știu ce se întâmplă atunci când. Alte lucruri să știți despre. Aș spune cu siguranta ai doriți să aruncăm o privire la scurt typecasting face prin Iordania pentru a înțelege ce Ints sunt sub capota, ce caractere sunt sub capota. Atunci când vorbim despre ASCII si am de fapt, uita-te la masa ASCII, ce face este oferindu-ne o privire sub capota la modul în care calculatorul reprezintă, de fapt capitalul A și cifra 7 și o virgulă și un semn de întrebare. Computerul are, de asemenea, moduri speciale de a reprezenta numărul 7 ca un întreg. Ea are un mod special de a reprezenta numărul 7 ca un număr în virgulă mobilă, și acestea sunt foarte diferite. Typecasting este cum să vă spun calculatorului "Hei, vreau să convertiți de la o reprezentare la alta reprezentare. " De ce nu ne aruncăm o privire la asta. Mi-ar lua, de asemenea, o privire la scurt privind bibliotecile și scurt pe compilatoare. Cei vorbesc despre procesul de compilare, ceea ce este o bibliotecă, și du-te peste unele dintre aceste intrebari pe care le-ar putea fi întrebat. Întrebări cu privire la Săptămâna 1 material? Există subiecte pe aici care par descurajatoare doriți să acopere? Am încercat să arunce în aer prin cele mai multe dintre aceste subiecte anterioare, astfel încât să putem ajunge la Pointeri și face un pic de recursivitate. Gânduri? Orice pentru a acoperi? Timp pentru unele ciocolată poate? Voi sunt de lucru prin ea. Am de gând să păstreze sorbindu pe cafeaua mea. Săptămâna 2. Bine apel, apel bună. În Săptămâna 2 am vorbit un pic mai mult despre funcții. În prima seturi de probleme câteva noi nu am scrie într-adevăr orice funcție, la toate altele decât funcția de care? [Student] Principal >> principal., Exact. Și așa am văzut costume diferite pe care principalul poarta. Nu e cel în care este nevoie de nici un argument, și ne spune doar anulate în între paranteze, și apoi acolo e cealaltă în cazul în care ne dorim să argumente în linia de comandă, și așa cum am văzut, că e în cazul în care aveți argc și argv int string matrice sau acum că ne-am expus, de fapt șir pentru a fi char *, care este vom începe să scrie ca char * argv și apoi paranteze. În set Problema 3, voi a văzut o grămadă de funcții, și vă implementat o grămadă de funcții, elaborează, privi în sus, goana. Prototipurile au fost toate scrise acolo pentru tine. Ceea ce am vrut să vorbesc despre aici cu funcții foarte repede este că există 3 piese pentru a le ori de câte ori vă scrie o funcție. Trebuie să specificați tipul de revenirea funcției. Trebuie să specificați un nume pentru funcția, iar apoi va trebui să specificați lista de argumente sau lista de parametri. De exemplu, dacă ar fi să scriu o funcție pentru a rezuma o grămadă de numere întregi și a reveni apoi la mine suma intre ceea ce ar fi genul meu retur în cazul în care am vrut să rezuma întregi și apoi să se întoarcă suma? Apoi numele funcției. Dacă aș merge mai departe și de a scrie în verde, această parte este de tip întoarcere. Această parte este numele. Și apoi între paranteze este locul unde dau argumente, de multe ori abreviat ca argumente, numite uneori params pentru parametri. Și, dacă aveți unul, voi specifica doar unul. Dacă aveți mai multe vă separați fiecare cu o virgulă. Și pentru fiecare argument voi da 2 lucruri care sunt, Kevin? [Kevin] Trebuie să dea tipul și apoi numele. Și apoi numele, iar numele este numele pe care ai de gând să utilizați să se refere la acest argument în cadrul funcției suma, în cadrul funcției pe care îl scrieți în acel moment. Nu trebuie să-de exemplu, în cazul în care am de gând să rezum, spun, un tablou de întregi, noi vom face matrice int, și eu voi da eu cateva acolade acolo- atunci când trec o matrice a funcției suma Am să-l dați în prima poziție din lista de argumente. Dar matrice pe care am trece în nu trebuie să aibă ARR nume. ARR va fi cum am referi la acest argument în corpul funcției. Un alt lucru de care avem nevoie pentru a lua în considerare, și acest lucru este ușor diferită de funcții, dar cred că e un punct important, este faptul că, în C atunci când am scris o funcție ca aceasta cum știu cât de multe elemente sunt, în această matrice? Acest lucru este oarecum de o întrebare capcană. Am vorbit despre acest lucru un pic la punctul de săptămâna trecută. Cum știu numărul de elemente din interiorul unei matrice în C? Există o cale? Se pare că nu există nici o modalitate de a ști. Trebuie să-l treci în mod separat. Există un truc pe care le puteți face dacă vă aflați în aceeași funcție în care a fost declarată matrice, și lucrați cu o matrice stivă. Dar asta funcționează numai dacă vă aflați în aceeași funcție. După ce treci un tablou la altul funcție sau dacă v-ați declarat o matrice și că ai pus matrice pe heap, malloc ați utilizat  și că astfel de lucruri, atunci toate pariurile sunt oprite. Apoi, de fapt, trebuie să treacă în jurul valorii de un argument special sau un alt parametru vă spune cât de mare este matrice. În acest caz, aș dori să utilizați o virgulă-Îmi pare rău, se merge off-screen aici și aș trece într-un alt argument  și sună-l LEN int pentru lungime. Un lucru care ar putea veni în testul vă cere să scrie sau să implementeze o anumită funcție numită ceva. Dacă nu ne dau prototip, astfel încât toată chestia asta aici, toată mizeria asta se numește declarație a funcției sau prototip funcția, acesta este unul dintre primele lucruri pe care veți dori să vă unghii dacă nu a dat pentru a vă imediat pe testul. Trucul care le-am învățat este că zic sa facem da un prototip pentru o funcție, iar noi spunem, "Hei, ai să-l scrie." În interiorul acolade care le aveți în testul dacă observați că există un tip de întoarcere și observați că revenirea tipul de este altceva decât anulate, ceea ce înseamnă că funcția nu întoarce nimic, atunci cu siguranta ai un singur lucru vreau să faceți este să scrie un fel de întoarcere la situația sfârșitul funcției. Rentabilitatea, și în acest caz, vom pune un martor pentru că vrem să completați în gol. Dar acest lucru devine te gândești în mod corect cu privire la modul în care am de gând să abordeze această problemă? Și îți aduce aminte ai de gând să aibă de a returna o valoare la apelantul a funcției. Da >> [elevului]. Are stil se aplică atunci când suntem scrierea de cod pe testul? Cum ar fi indentarea și că astfel de lucruri >> [Student]? Da. Nu, nu la fel de mult. Cred că o mulțime de-acest lucru este ceva vom clarifica pe testul privind ziua, dar de obicei griji # include și acest tip de lucruri, e un fel de afara. [Student] Ai nevoie pentru a comenta codul de mână? Ai nevoie pentru a comenta codul de mână? Comentând este întotdeauna bună, dacă sunteți îngrijorat de credit parțiale sau dacă doriți să comunicați intenția dumneavoastră de a greder. Dar eu, din nou, se va clarifica pe testul în sine și în ziua test, dar eu nu cred că va fi necesar pentru a scrie comentarii, nr. De obicei nu, dar este cu siguranta genul de lucru în cazul în care puteți comunica intentia voastra, ca "Hei, acest lucru este în cazul în care am de gând cu el." Și, uneori, care poate ajuta cu credit parțiale. Mișto. Vasile. [Vasile] Care este diferența dintre declararea, spune, int lang în argumentele sau parametri față de declarare a unei variabile în cadrul funcției? Wow, cafea coborât trahee. [Vasile] Ca lucrurile pe care ne-o dorim pentru a pune în argumente. Da, asta este o întrebare mare. Cum a face tu alegi ce lucruri pe care doriți să pună în argumentele față de ce lucruri ar trebui să faci în interiorul funcției? În acest caz, am inclus ambele acestea ca argumente pentru că sunt ceva ce oricine se va folosi funcția de suma trebuie să se precizeze aceste lucruri. Funcția SUM, cum am vorbit despre, nu are nici o modalitate de a ști cât de mare este acesta devine matrice de apelant sau oricine este folosind funcția SUM. Ea nu are nici o modalitate de a ști cât de mare este faptul că matrice. Motivul pentru care trece în acest lungime de aici ca un argument este pentru că e ceva ce ne spune în esență apelantul a funcției, oricine se va utiliza funcția suma, "Hei, nu numai că trebuie să ne dai o matrice de Ints, de asemenea, trebuie să ne spună cât de mare matrice pe care le-ați dat noi este. " [Vasile] Acestea vor fi atât argumente de linie de comandă? Nu, acestea sunt argumente reale pe care le-ar trece la funcția. Lasă-mă să fac o pagină nouă aici. [Vasile] Ca și numele ar trece- [Nate H.] Dacă am int main (void), și am de gând să pună la 0 la întoarcerea mea aici, la partea de jos, si spun vreau pentru a apela funcția suma. Vreau să spun int x = suma intre (); Pentru a utiliza funcția de suma trebuie să treacă atât matrice pe care vreau să rezum și lungimea de matrice, astfel încât în ​​cazul în care acest lucru este presupunând Am avut o serie de Ints, spun că am avut int numbaz [] = 1, 2, 3, tip de utilizare, care hacked sus sintaxa chiar acolo, atunci ce aș face este in suma intre aș dori să treacă în atât numbaz și numărul 3 să-i spuneți funcția suma "Bine, aici e matrice vreau să însumați." "Aici e dimensiunea sa." Are vreun sens? Asta răspunde la întrebarea dvs.? În multe feluri face paralel ceea ce facem noi cu principalele atunci când avem argumente în linia de comandă. Un program la fel ca Caesar cifru, de exemplu, că este nevoie argumente în linia de comandă nu ar fi putut să fac nimic. Aceasta nu ar ști cum să cripta, dacă nu ai spune ca ceea ce-cheie pentru a utiliza sau, dacă nu l-ați spus ce ai vrut șir pentru a cripta. Fapt care ia determinat pentru intrare, acest lucru este în cazul în care ne-am luat 2 mecanisme diferite pentru a lua de intrare de la utilizator, pentru a lua informații de la utilizator. Problema pentru Set 1 am vazut acest GetInt, getString, felul GetFloat de a trezi pentru intrare, și că se numește folosind fluxul de intrare standard. E puțin diferit. E ceva ce se poate face la un moment dat, spre deosebire de atunci când invoca programul, atunci când începe programul de funcționare. Argumentele din linia de comandă sunt specificate toate atunci când începe programul de funcționare. Am fost amestecarea celor doi. Când ne-am folosi argumente pentru o funcție, e mai mult ca argumente linia de comandă pentru principal. Este atunci când invoca funcția de care aveți nevoie să-l spun exact ceea ce are nevoie pentru a-și îndeplini sarcinile. Un alt lucru bun să se uite la și te voi lasa sa te uiti la el in timpul liber, și a fost acoperit în Quiz-a fost această noțiune a domeniului de aplicare variabile locale și variabile globale față. Face să acorde o atenție la asta. Acum, că ne apropiem cu privire la acest alte chestii, în Săptămâna 3 am început să vorbim despre căutarea și sortarea. Căutarea și sortarea, cel puțin în CS50, este foarte mult o introducere la unele dintre cele mai multe părți teoretice ale informaticii. Problema căutării, problema de sortare sunt probleme mari, canonice. Cum să găsiți un anumit număr într-o serie de miliarde de numere întregi? Cum veți găsi un anumit nume într-o carte de telefon care este stocat pe laptop-ul? Și așa vom introduce această noțiune de timpul de functionare asimptotice pentru a cuantifica într-adevăr cât timp, cât de greu aceste probleme sunt, Cât timp le iau pentru a rezolva. In, cred, testul lui 2011 există o problemă care cred că merită acoperind foarte rapid, care este aceasta, problema 12. O, nu, e Omega. Aici vorbim despre timpul de functionare cel mai rapid posibil pentru un algoritm special, și apoi timpul de functionare cel mai lent posibil. Acest Omega și O sunt într-adevăr doar comenzi rapide. Sunt rapide notație pentru a spune cat de repede în cazul cel mai bun posibil voința noastră algoritm termen, și cât de lent, în cazul cel mai defavorabil posibil va rula algoritmul nostru? Hai sa facem un cuplu de acestea, iar acestea au fost, de asemenea, acoperite în scurt pe notația asimptotică, pe care am foarte recomanda. Jackson a facut o treaba foarte buna. Cu binar de căutare, vorbim despre binar de căutare ca fiind un algoritm, și, de obicei, vorbim despre ea în termeni de O. său mai mare Care este Big O? Care este timpul de funcționare cel mai lent posibil de căutare binare? [Student] N ²? Aproape, cred similară cu cea. E mult mai repede decat asta. [Student] binară >> Da?, Căutare binară. [Student] E log n. Log n, astfel încât ceea ce face log n înseamnă? Acesta reprize de fiecare iterație. Exact, astfel încât în ​​cazul cel mai lent posibil, spun că dacă aveți o matrice sortate de un milion de numere întregi și numărul pe care îl căutați pentru este fie element foarte prima matrice sau element foarte ultimul în matrice. Amintiți-vă, algoritmul de cautare binara funcționează prin uită la elementul din mijloc, văzând în cazul în care este meciul pe care îl căutați pentru. Dacă este, atunci mare, l-ai găsit. În cazul cel mai bun posibil, cât de repede se caută termen binar? [Studenții] 1. 1, e timpul constanta, Big O de 1. Da. [Student] Am o întrebare. Când spui jurnal de n, adică în ceea ce privește baza 2, nu? Da, așa că e alt lucru. Noi spunem n log, și cred că atunci când am fost în liceu Intotdeauna mi-am presupus că jurnalul a fost baza 10. Da, așa da, log 2 de bază de obicei, este ceea ce vom folosi. Din nou, merge înapoi la binar de căutare, dacă vă căutați pentru oricare element la sfârșitul sau element la început, deoarece începe în mijloc și apoi aruncați în funcție de jumătate nu îndeplinesc criteriile pe care îl căutați, și te duci la urmatoarea jumatate si urmatoarea jumatate si urmatoarea jumatate. Dacă eu caut pentru cel mai mare element din matrice întreg milioane de euro Am de gând să-l reducă la jumătate, la cea mai mare jurnalul de 1 milion de ori înainte de a mă testa în cele din urmă și vezi că elementul caut este în cea mai mare sau în cea mai mare indicele de matrice, și care va avea jurnal de n, jurnal de 1 milion de ori. Sortare Bubble. Nu voi aminti algoritmul de sortare cu bule? Kevin, poți să-mi dai o recapitulare rapidă a ceea ce sa întâmplat în algoritmul de sortare cu bule? [Kevin] Practic merge prin tot în listă. Se uită la primele două. Dacă primul este mai mare decât cea de a doua le swap-urilor. Apoi se compară doilea și al treilea, același lucru, swap-uri, treia și a patra, tot drumul în jos. Numerele mai mari va urmări până la capăt. Și după toate acestea, de multe bucle ați terminat. Exact, deci ceea ce a spus Kevin este că vom urmări numere mai mari bule până la sfârșitul matrice. De exemplu, te superi de mers pe jos ne prin intermediul acestui exemplu, dacă acest lucru este gama noastră? [Kevin] Vei lua 2 și 3. 3 este mai mare decât 2, asa ca le schimba. [Nate H.] Corect, asa ca am schimb de acestea, și astfel ajungem 2, 3, 6, 4, și 9. [Kevin] Apoi, să comparați 3 și 6. 3 este mai mică decât 6, astfel încât să lăsați-le, și 6 și 4, le vei schimba, deoarece 4 este mai mic decât 6. [Nate H.] Corect, așa că am obține 2, 3, 4, 6, 9. [Kevin] și 9 este mai mare decât 6, așa că lăsați-l. Și te-ai întoarce prin asta din nou. [Nate H.] Sunt făcut în acest moment? >> [Kevin] Nr Și de ce nu am făcut în acest moment? Pentru ca se pare ca matrice mea este sortat. Mă uit la ea. [Kevin] Du-te prin ea din nou și asigurați-vă că nu există nici un swap mai înainte de a putea opri în totalitate. Exact, așa că trebuie să continui prin și asigurați-vă că nu există swap pe care le puteți face în acest moment. A fost într-adevăr la fel de norocos, cum ai spus, că am ajuns numai având de a face o trecere prin și suntem sortate. Dar pentru a face acest lucru, în cazul general, vom avea de fapt de a face acest lucru de peste si peste din nou. Și, de fapt, acesta a fost un exemplu de caz cel mai bun posibil, cum am văzut în problema. Am văzut că acest caz a fost cel mai bun posibil n. Am trecut prin matrice 1 dată. Care este cel mai rău caz posibil pentru acest algoritm? [Kevin] N ². Și ce înseamnă acest aspect place? Ce ar fi un aspect matrice de genul asta ar lua n timp ²? [Kevin] [neauzit] sortate. Exact, așa că, dacă am avut matrice 9, 7, 6, 5, 2, prima ar fi 9 bula tot drumul până. După 1 iteratie vom avea 7, 6, 5, 2, 9. Apoi, 7 ar bubble sus, 6, 5, 2, 7, 9, și așa mai departe și așa mai departe. Ne-ar trebui să treacă prin întregul tablou de n ori, și puteți obține de fapt, ceva mai precis decât această pentru că odată ce ne-am mutat 9 tot drumul până în poziția sa posibilă ultimul știm că niciodată nu trebuie să ne compara cu acest element din nou. Odată ce vom începe barbotare 7 în sus știm că ne putem opri o dată 7 este chiar înainte de 9 de când am comparat deja 9 la ea. Dacă faceți acest lucru într-un mod inteligent, nu e adevărat, eu cred, că de mult timp. Nu te duci să compare toate posibilele combinații [] fără sunet de fiecare data cand trece prin fiecare iterație. Dar totuși, atunci când vorbim despre asta legat de sus spunem că cautati la n ² comparații tot drumul prin. Să mergem înapoi, și din moment ce suntem de plecare pentru a obține un pic pe scurt timp Aș spune că ar trebui să meargă cu siguranta prin restul acestui tabel, completați totul afară. Gândiți-vă la exemple. Gândește-te la exemple concrete. Asta e foarte util și de ajutor pentru a face. Desenați-l. Aceasta este un fel de tabel că pe măsură ce trece prin în informatică tu ar trebui să înceapă cu adevărat să știu de inima cu aceste. Acestea sunt tipurile de întrebări care le obține în interviuri. Acestea sunt felul de lucruri care sunt bine de stiut, și cred că despre aceste cazuri de margine, într-adevăr imaginind cum să gândească știind că pentru bula sorta matrice cel mai rau posibil pentru a sorta cu care este unul care e în ordine inversă. Pointeri. Să vorbim un pic despre pointeri. În ultimele minute avem aici Știu că acest lucru este ceva împreună cu dosarul de I / O, care este destul de nou. Atunci când vorbim despre indicii motiv dorim să vorbim despre pointeri este că, o, atunci când lucrăm în C suntem într-adevăr la un nivel destul de scăzut în comparație cu limbile cele mai moderne de programare. Suntem de fapt în măsură de a manipula variabilele din memorie, seama în cazul în care acestea sunt de fapt localizat în RAM nostru. Odată ce ați plecat pentru a lua lecții de sisteme de operare care le veți vedea că e, din nou, un fel de abstractizare. Asta nu e de fapt cazul. Avem de memorie virtuală, care se ascunde aceste detalii de la noi. Dar pentru acum puteți presupune că, atunci când aveți un program, de exemplu, atunci când începe să ruleze programul-ta Cezar cifru Voi reveni la iPad mea foarte repede, faptul că, la început de program, dacă aveți, să zicem, 4 GB de memorie RAM de pe laptop-ul, te deoparte această bucată, și vom numi această memorie RAM. Și începe într-un loc vom apela 0, și se termină într-un loc pe care vom numi 4 gigaocteți. Chiar nu pot scrie. Omul, care este hacked. Atunci când programul tău execută sistemul de operare zugraveste RAM, și specifică segmente diferite pentru diferite părți ale programului tău de a trăi inch Aici jos această zonă este un fel de țară a nimănui. Când te duci un pic mai departe aici le-ați luat de fapt locul unde codul pentru viața programul tău. Acest cod binar, care de fapt fișier executabil se încarcă în memorie atunci când executați un program, și trăiește în segmentul de cod. Și, ca program execute procesorul se uită la acest segment de cod să dau seama ce este următoarea instrucțiune? Care este următoarea linie de cod am nevoie pentru a executa? Există, de asemenea, un segment de date, iar acest lucru este în cazul în care aceste constante șir primi stocate pe care le-ați folosit. Și apoi mai departe acolo e locul numit heap. Am accesa memoria de acolo prin utilizarea malloc, și apoi spre partea de sus a programului e stivă, și că, în cazul în care este ne-am jucat pentru cea mai mare parte de la început. Acest lucru nu este la scară sau nimic. O mulțime de acest lucru este foarte dependentă de mașină, dependentă de sistemul de operare, dar acest lucru este destul de modul în care lucrurile se chunked sus. Când executați un program și vă declara o variabila numita x- Am de gând să tragă o altă casetă de mai jos, iar aceasta va fi RAM, de asemenea. Și am de gând să se uite. Vom desena linii zimțate pentru a indica acest lucru este doar o mică secțiune de RAM și nu toate ca ne trage în partea de sus. Dacă aș declara o variabila integer, numit x, atunci ceea ce primesc de fapt, este o mapare care este stocată în tabela de simboluri a programului meu care conectează x numele în această regiune de memorie care le-am întocmit chiar aici între barele verticale. Dacă am avea o linie de cod in programul meu care spune că x = 7 procesorul știe "Oh, bine, știu că viața x la această locație în memorie." "Am de gând să merg mai departe și scrie un 7 acolo." Cum se știe ce locație este în memorie? Ei bine, asta e tot făcut în timpul compilării. Compilatorul are grija de alocare în cazul în care fiecare dintre cele variabile sunt de gând să meargă și crearea unei hărți speciale sau, mai degrabă, conectarea puncte între un simbol și unde se duce, o variabila numele și în cazul în care se va trăi în memorie. Dar se pare că putem accesa de fapt, în programele noastre, de asemenea. Acest lucru devine important atunci când vom începe să vorbim despre unele dintre structurile de date, care este un concept pe care am de gând să introducă mai târziu. Dar pentru acum, ceea ce poate ști este că pot crea un pointer la această locație, x. De exemplu, pot crea o variabila pointer. Când ne-am crea o variabila pointer vom utiliza notația stele. În acest caz, aceasta spune am de gând să creeze un pointer la un int. E un tip la fel ca oricare alta. Ne da o variabilă ca y, și apoi ne-am stabilit-l egal cu adresa, la o adresă. În acest caz, putem seta y pentru a indica spre x prin luarea adresa lui x, care ne face cu acest ampersand, și apoi ne-am stabilit la punctul y la ea. Ceea ce în esență, nu este dacă ne uităm la RAM nostru acest lucru creează o variabilă separată. Se va numi Y, și atunci când această linie de cod execută este de fapt de gând să creeze un pointer mic, care ne trage de obicei, ca o săgeată, și-l stabilește la punctul y la x. Da. [Student] Dacă x este deja un pointer, ar fi tocmai ați face int * y = x în loc de a avea ampersand? Da. Dacă x este deja un pointer, atunci puteți seta 2 pointeri egale unul de altul, caz în care y nu ar indica x, dar ar indica orice x indică spre. Din păcate, nu mai avem timp. Ce am putea spune în acest moment, putem vorbi despre asta offline, dar aș spune că începe să lucreze prin această problemă, # 14. Puteți vedea acolo e deja un pic completat pentru tine aici. Puteți vedea că atunci când ne pronunțăm 2 pointeri, int * x și y *, și rețineți că arătând * de lângă variabila a fost ceva care a fost făcut anul trecut. Se pare că acest lucru este similar cu ceea ce facem în acest an. Nu contează în cazul în care se scrie * atunci când declară indicatorul. Dar am scris * de lângă tipul de pentru ca face foarte clar faptul că sunteți de declarare a unei variabile pointer. Puteți vedea că declararea cele 2 indicii ne dă 2 cutii. Aici când ne-am stabilit x egal cu malloc ce se spune este anularea de memorie în heap. Această casetă de mic chiar aici, în acest cerc, este situat pe heap. X este îndreptare spre aceasta. Rețineți că y nu este încă indică spre ceva. Pentru a ajunge de memorie pentru a stoca-numărul 42 în x ne-ar folosi notația ce? [Student] * x = 42. Exact, * x = 42. Asta înseamnă că urmați săgeata și arunca 42 acolo. Aici, unde ne-am stabilit y și x y ne-am îndreptat spre x. Din nou, acest lucru este exact ceea ce a spus Kevin unde ne-am stabilit y egal cu x. Y nu este indică spre x. Mai degrabă, este pointing la ceea ce se indică spre x, de asemenea. Și apoi în cele din urmă în această casetă ultima sunt 2 lucruri posibile pe care le-ar putea face. Una dintre ele este, am putea spune * x = 13. Un alt lucru este, am putea spune-Alex, știi ce am putea face aici? Ai putea spune * x = 13 sau- [Student] Ai putea spune orice int. [Nate H.] Dacă acest lucru a fost sesizat ca o variabila int am putea face asta. Am putea spune, de asemenea, * y = 13, deoarece acestea sunt atât subliniind în același loc, asa ca am putea utiliza fie variabilă pentru a ajunge acolo. Da >> [Student]. Cum ar arata daca ne spunem x int este de 13? Asta ar fi declararea o nouă variabilă numită x, ceea ce nu ar funcționa. Am avea o coliziune pentru că declarate x pentru a fi un pointer aici. [Student] Dacă am fi avut doar că declarația de la sine ceea ce ar arata ca din punct de vedere cerc? Dacă am avea x = 13, atunci vom avea o cutie, și, mai degrabă decât având o săgeată iese din cutie am trage-l ca doar o 13. [Student] În caseta. Bine. Vă mulțumim pentru vizionarea și noroc pe Quiz 0. [CS50.TV]