[Powered by Google Translate] David J. MALAN: Bine, acest lucru este CS50, iar acest lucru este începe de doua saptamani. Thank tine. Să ne începem aici cu un telefon. Sunt pe cale să formați 617-BUG-CS50. CS50: Acesta este CS50. Pentru Boy Transfer, apăsați 1. Pentru a porni din nou, apăsați 9. David J. MALAN: Deci, a spus el pentru Boy Transfer, apăsați 1. Deci, vom apăsați 1. CS50: Care este originea ta? Pentru quad, apăsați 1. Mather, apăsați 2. Boylston, apăsați 3. Lamont, apăsați 4. Mem Hall, apăsați 5. Pentru a porni din nou, apăsați 0. David J. MALAN: Vom apăsați 1 pentru quad. CS50: de transfer următoare lasa in acest moment la ora 1:10, și apoi la 1:20, 1:30 pm, 1:40 PM. Acest lucru este CS50. David J. MALAN: Deci asta e vocea lui CS50. Și e un exemplu de felul de proiecte finale, pentru exemplu, puteți mușca spre sfârșitul semestrului. De exemplu, faptul că există shuttleboy.cs50.net - de fapt, un proiect pe care am scris prima după luarea CS51 înapoi, atunci când am fost un student. Și aici a fost sursă de inspirație atunci, tot ce aveam era listele tiparite de autobuz de transfer, și nu a existat nici Noțiunea de a privi lucrurile on-line. Și așa am un fel de porumbel într-un singur week-end, turnat prin tipărite program, și portat la un program de calculator. În timp, program de calculator sa întâmplat să fie scrise în C. Și tu, de fapt ea a fugit de transfer Boy tastarea la o clipește solicita ca ne-am făcut până acum. Dar, peste ani, a evoluat într-o clipă mesaje bot. Este evoluat, mai recent, în acest site, într-o SMS-pe bază de instrument, precum și în acest instrument de voce bazate pe. Și acest lucru este de a face aluzie la felul de lucruri pe care le puteți face pentru tine până la sfârșitul semestrului lui. De exemplu, acolo, versiunea de SMS-uri de transfer se intampla Boy să funcționeze, după cum urmează. În cazul în care, pe telefonul mobil, trimite un mesaj text la 41411 și trimite apoi sboy simbolul special, pentru Boy de transfer, urmat de A și B, unde A este o origine și B este o destinație - de exemplu, Boylston Space Quad - ceea ce ar trebui să mă întorc în câteva secunde este un text mesaj de la Boy Transfer vă spun exact când navete pentru următoarele câteva sunt, din acest punct A merge la faptul că punctul B. Și acesta este un exemplu mai general a ceea ce este cunoscut drept folosind un API. Deci, de exemplu, acest lucru aici este doar shuttleboy.cs50.net, real web-based încarnare de acest lucru. Dar datele care subliniază acest lucru și aplicații de altă natură care CS50 a dezvoltat sunt toate expuse pentru toată lumea aici, în forma de API-uri, interfețe de programare a aplicațiilor. Si asta e doar un mod fantezist de a spune că oamenii ne place pe Internet și altele au petrecut ceva timp pentru a crea software-ul pe care le puteți folosi pentru a apuca de date de la noi și apoi construi aplicații proprii pe partea de sus de acel set de date. Deci, de exemplu, acest băiat de transfer API pagina aici, care se întâmplă să fie în manualul de CS50, în esență, documente cum poti sa te duci despre a cere CS50 serverele de date. De exemplu, dacă sunteți familiarizat cu CSV fișiere, virgula de valori separate, acestea sunt doar un fel de rapid și murdar Excel-cum ar fi fișiere. Astfel, puteți solicita Boy transfer pentru toate datele de pe toate case si coordonatele GPS ale acestora, și veți obține înapoi, în esență, o foaie de calcul ca și că această puteți citi apoi într-un program de propria dvs. și apoi genera rezultate, la fel ca Boy transfer în sine se întâmplă să facem. Pentru cei mai familiare, reprezentări mai moderne de date includ JSON, JavaScript Object Notation. Ceva se va întoarce la tine spre sfârșitul semestrului. Dar, din nou, aceasta este doar una din mai multe de API-uri proprii CS50 lui. Și lucrul interesant este acum, în aceste zile, Facebook și Twitter si Google și destul de mult fiecare site-ul web populare din acolo are un fel de API, ceea ce înseamnă că dacă ai citit documentația pe site-ul lor, vă înscrieți pentru un cont, puteți începe apoi scrierea software-ul pe partea de sus a indiferent de instrumente sau de date care compania nu oferă. Și astfel unul dintre semenii noștri de predare proprii câțiva ani înapoi a scris o versiune pentru Mac a acestui. Deci, la link-ul cu denumirea Mac aici, la stânga sus, puteți de fapt, descărca un Mac OS widget care ruleaza pe Mac ta de a face aceleași tipuri de lucruri. Deci e vorba de bazându-se pe partea de sus a seturilor de date cum ar fi acestea. Dar mai mult pe faptul că spre sfârșitul semestrului. Deci, haideți să se arunca cu capul în foarte repede la un bug, doar pentru a obține un fel de lucrurile încălzit astăzi, și cred că din nou pe unele dintre lucruri ne-am uitat în săptămâna trecută. În special, lasă-mă să mergeți mai departe și trageți în sus, să zicem, acest exemplu aici. Buggy1.c, aceasta este disponibilă pe site-ul cursului, dacă doriți Vrei să-l descărcați și scormoni în jurul valorii de tine. Dar haideți să zoom in, aici, la acest program destul de scurt, și doar o recapitulare super-rapid al unora dintre pietrele de temelie de bază care suntem cu adevărat de gând să înceapă doar luați de la sine. Deci, chestii albastru, în linii la 1 la 9, sunt doar softball întrebări. Deci, acestea sunt doar comentarii. Ei nu au nici o semnificație funcțională. Dar sunt comentarii în sensul că acestea sunt observă că Eu, om, a făcut să mă astfel încât în ​​curs și, după prelegere, îmi amintesc de fapt, ceea ce acest program face fără a fi nevoie de a citi prin ea linie cu linie și recrearea istorie în mintea mea. Mai mult decât atât, în cazul în care am înmâna acest program la altcineva ca te, e mult mai clar pentru tine, din cauza comentariilor de acest gen, ceea ce de fapt face programul, sau cel puțin ceea ce Programul presupune să faci. Indiferent dacă este sau nu este corectă este o altă problemă cu totul. Acum, în C, cu multi-linie comentarii, amintim că pe linia de aici nu e simbolul magie, / *. Aceasta înseamnă aici vine începutul unui comentariu. Și nimic altceva contează până când ajungeți la sfârșitul terminator, care este * /, opusul. Deci, faptul că am 80-unele stele ciudate aici la la stânga la dreapta este de fapt doar un detaliu estetic. Ea nu are nici un sens funcțional. Acum, ce zici line 11? Ce înseamnă acest face în termeni de nespecialist? Ce-i asta? PUBLICUL: Include standard. David J. MALAN: Bine, bine. Deci, aceasta include biblioteca stdio.h. Deci, ce înseamnă asta? Ei bine, în interiorul acelui dosar, stdio.h, sunt o grămadă de funcției declarații - că este, cod care altcineva a scris. Și un exemplu perfect de o funcție care este declarată în stdio.h este - care favorit pana acum? Deci printf, una dintre cele mai comune de a utiliza, cu siguranță, de timpuriu, de la faptul că biblioteca este acolo. Dacă aș exclude această linie de cod, zăngănit este de gând să țipi la mine ceva despre utilizarea unui simbol nedeclarată. Ceva nedeclarată este, probabil, cuvinte cheie, deoarece nu am informat compilatorul ce arată printf Vrei excepția cazului în care vom include acea linie. Și mai mult în jos pe Pământ, într-adevăr, ce linia se spune este deschide acel fișier, stdio.h, ori de câte ori este pe serverul de hard disk sau pe o unitate hard aparatului, și copy-paste-l chiar acolo în dosarul meu, fără să-mi având în a face acest lucru manual. Acum, odată ce vom ajunge aici la principal, nu după mult timp vom începe pune deoparte ceea ce int și ceea ce este nul. Dar pentru moment, să ne uităm la cele trei linii în termen de 15 până la 17. Aceasta aici am pretinde ca buggy. Linia 7 in comentariile mele spune: "Ar trebui să imprimați 10 asteriscuri, dar nu "de ce. acest lucru nu se imprimă, de fapt, 10 stele de acest fel? PUBLICUL: [neauzit]. David J. MALAN: Exact. Deci, observăm că suntem începe să numere de la 0. Și aceasta este de fapt o convenție în programare și informatică, în general, mai mult, începe să numeri de la 0 în loc de 1. Și acest fapt doar derivă din faptul că, pentru exemplu, atunci când am avut opt ​​oameni pe scenă, atunci când nimeni nu a fost ridicarea mâinii lor, au fost toate în mod eficient zerouri. Și așa e doar un fel de convenție computer, astfel, Prin urmare, pentru a începe numărarea de la 0. În cazul în care este cel mai mic număr vă poate reprezenta în binar. Deci, aici am început initializarea i la 0. Ne-am stabilit eu egal cu 0. Dar apoi m-am făcut această greșeală aici, spunând i este mai mică sau egal cu 10. Dar, dacă credeți că prin, dacă am începe de la 0 și apoi plec până la 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, eu de fapt de gând să imprima 11 stele pentru ecran, pentru că m-am dus sus la și egal cu 10. Deci Easy Fix aici, atunci este ceea ce? PUBLICUL: [neauzit]. David J. MALAN: Doar schimba-l la mai puțin de. Dacă chiar vrei, ai putea face acest lucru. Dar, în general, care a dezaprobat. Și astfel începe să numere de la 0 este doar ceva ce ar trebui să de obicei, te obișnuiești. Acum, ce zici de această construcție întreagă în sine? Această linie de 15 demarks o buclă pentru. Deci, pentru a nu este o funcție. E doar o declarație. E o construcție looping, cum am văzut în Scratch. Și are trei părți. Observați că există o prima parte a stânga punct și virgulă. E partea de mijloc între cele două semne punct și virgulă. Și apoi e partea dreapta spre dreapta din punct și virgulă două. Acum, prima dintre acestea nu ce? PUBLICUL: [neauzit]. David J. MALAN: Inapoi acolo? Da? PUBLICUL: inițializare. David J. MALAN: inițializare. Deci, ce înseamnă? Noi am declarat-o variabilă numită i. Acesta este de tip int, pentru că am specificat int i. Iar eu am initializarea la valoarea de 0. Deci, ce e asta spune de fapt? Este eficient pentru a spune calculatorului hei, da-mi destul de de memorie, RAM suficientă, pentru a se potrivi un număr, iar apoi a pus Numărul 0 în acea bucată de RAM. Și, ca o paranteză, cât de mare este un int de obicei, cel puțin în interiorul a aparatului? PUBLICUL: 32 de biți. David J. MALAN: 32 biti. Deci asta înseamnă să-mi dai 32 de biți, altfel cunoscut sub numele de 4 octeți, și a pus în ea valoarea 0, ceea ce este destul de ușor, deoarece Aceasta înseamnă doar selecteaza toate biții la 0. Deci, acum, a doua parte aici este condiție. Și condiție, așa cum sugerează și numele, este ceea ce se verifică din nou și din nou și din nou pentru a stabili dacă e adevărat sau fals. Deci, aceasta este doar că fac următoarele linii de cod - și anume linia 16, pentru că e singurul indentate dedesubt - atât timp cât i este mai mic de 10. Și după fiecare iterație prin aceasta bucla, nu incrementare, care în acest caz este i + +. Acum, nu trebuie să fie i + +. Ar putea fi i -. Dar dacă am făcut acest lucru, ceea ce se întâmplă comportamentul a fi de acest program? PUBLICUL: Va fi o buclă infinită. David J. MALAN: O să fie un fel de buclă infinită, dacă nu vom avea noroc după negativ 2 miliarde sau cam asa ceva. Poate lucrurile se vor încadra în jurul valorii de, doar prin natura finit numărul de biți pe care le-am alocat pentru un int. Dar e cu siguranță o să itera mult mai puțin de 10 și cu siguranță mai mult de 11 de ori aici. Și acum, la fel ca o parte, realizăm că i + + și i - sunt de fapt doar zahar sintactic. E doar notația prescurtată pentru ceea ce e un pic mai mult în mod explicit în scris, după cum urmează: i = i + 1. Care este identic cu i + +. Este doar un fel de a spune pare mai frumoasa i + +. E mai succint, mai ușor de citit. Și astfel, cei mai mulți oameni fac asta în loc. Dar acest lucru este identic funcțional la ceea ce am văzut. Deci, pe scurt, fix rapid aici este doar să spun itera i de la 0 tot drumul până la mai puțin de 10. Și apoi vom avea într-adevăr, 10 stele. Deci, haideți să încercăm asta. Lasă-mă să deschid terminalul de la partea de jos. Lasă-mă să merg în directorul care aceasta este inch Și am de gând să-l compilați manual cu zăngănit de acum. Și am de gând să compilați ca buggy1.c, Enter. Și acum buggy1, de ce nu există un astfel de fișier sau director buggy1 sunat? PUBLICUL: [neauzit]. David J. MALAN: Da. Deci, de fapt numit a.out. Deci, dacă aveți o amintesc doar zăngănit, în cazul în care este zăngănit compilator, si nu specificați numele pe care doriți să da programul, se va implicit a.out. Deci, într-adevăr, dacă fac ls - Hopa. Și am didn't - problema negru-și-alb unele dintre te-ai confruntat a fost stabilit. Dar lasă-mă să fac asta. Momentan nu avem a.out pe partea stângă acolo. Deci avem de a rula a.out loc de buggy1. Așa că lasă-mă să mergeți mai departe și de a face acest lucru. / A.out., Enter. Și eu se pare că nu am făcut ce? PUBLICUL: Salvare. David J. MALAN: Salvați fișierul meu. Astfel încât este ușor de rezolvat prin lovirea S de control, sau de gând să File, Save, la fel ca în cele mai multe programe. Lasă-mă să merg în jos aici, a goli ecranul, rulați-l din nou. Si inca exista un bug. Deci, ceea ce se întâmplă - PUBLICUL: Nu ai compila. David J. MALAN: Ah, bine. Nu l-am compila. Ca un idiot, mă uit la codul pentru a vedea ce sa întâmplat. Deci buggy1.c zăngănit, acum a.out. Și Pfiu, salvat. Deci, se pare un pic urât, deoarece nu exista nici o linie nouă oriunde în program. Dar, din nou, asta e doar un detaliu estetic. Și, cel puțin dacă socotim pe cei afară, ar trebui să ne vedea acum 10 stele respective. Ei bine, ce zici de această a doua de warm-up de exemplu? Deci, în buggy2, eu pretind că această versiune, de asemenea, se va imprima 10 stele, una pe fiecare rând. Deci de data asta, am un caracter linie noua, doar pentru a face lucrurile un pic mai frumoasa. Dar, în loc ceea ce am obține este acest lucru. Așa că lasă-mă să fac buggy2.c zăngănit, Enter. Acum este din nou numit a.out. Enter. Eu văd doar o singură linie nouă, doar ultima linie foarte nou, care se mută promptă mea la linia următoare. Și totuși, în mod clar am fost imprimare *, apoi o linie nouă, *, Apoi o linie nouă. Dar ceea ce este bug aici? Da? PUBLICUL: [neauzit]. David J. MALAN: Exact. Deci, spre deosebire de unele limbi, cum ar fi Python, în cazul în care indentare de fapt, are sens funcțional, într-o Limba precum C - cum vom vedea, PHP, JavaScript - indentare este într-adevăr doar pentru beneficiul oamenilor ". Deci, faptul că am alin 16 și 17 arată foarte bine, dar nu are nici un sens funcțional aici. Dacă vreau să execute ambele linii, ca parte a de buclă, atunci eu trebuie să le includeți în acolade de a face acest lucru. Puteți tăia doar că colț și să omită acolade, dacă ceea ce e cazul? PUBLICUL: Doar o linie. David J. MALAN: Doar o linie. Deci, asta e doar un fel de fel de frumos detalii sintaxă, astfel încât să nu pierdeți timp cu scrierea trei linii, dintre care două sunt acolade, doar pentru a scrie o singură linie de cod. Dar, dacă aveți două sau mai multe linii, am într-adevăr, nevoie de a face acest lucru. Asa ca lasa-ma acum salveze asta. Lasă-mă să merg mai departe și re-rula zăngănit. Atunci lasă-mă să rulați din nou a.out, iar acum primesc câte unul pe linie. Acum, din nou, a.out este un fel de nume de prost pentru un program. Cum îmi pot da seama zăngănit de a da de fapt mi ​​un nume de fișier asta e mult mai user-friendly, cum ar fi buggy2 sine? Un pic mai clar? PUBLICUL: [neauzit]. David J. MALAN: Bine, așa că am putea lua de fapt, foarte user-friendly de comenzi rapide și doar scrie fac buggy2. Eu nu precizează c în acest caz., Și apăsați Enter. Și ceea ce fac nu este compilează buggy2.c pentru mine de către cere zăngănit de a face acest lucru. Mai precis, se solicită zăngănit, zăngănit ruleaza folosind mod mai linia de comandă argumente sau comutatoare de fapt am nevoie. În timp, ne vom întoarce la ceea ce toate aceste diferite expresii criptice despărțite în silabe înseamnă. Dar pentru acum, că e tocmai m-ai salvat de probleme să vă amintiți și de a trebui să introduceți din toate cele diverse expresii despărțite în silabe. Și capul de ea în cele din urmă este ca acum am buggy2. Dacă vreau să fac asta manual, deși, am poate face acest lucru în schimb - zăngănit-o buggy2 și apoi buggy2.c. Și că va da în mod similar mi un fișier numit buggy2. Deci, pe scurt, zăngănit e compilator. Asigurați-este doar un instrument user-friendly care vom folosi mai mult și mai mult, pentru că pur și simplu începe să simplifica lucrurile pentru noi. Și ne vom întoarce 0, în cele din urmă. Pentru moment, doar pentru că, dar vom începe tachinare că o parte azi si miercuri. Orice întrebări cu privire la oricare din astea? Da? PUBLICUL: [inaudibil] E în citate acolo? David J. MALAN: OK. Când am scris în ls citate, care mi-a fost faci unele magie în spatele scenei pentru a repara o eroare. Mi-am uitat, ca ne-am spus multora dintre voi pe forumuri de discuții, de a face - vom face acest lucru acum - sudo yum-y update appliance50. Hopa, că e scris corect. Deci, aparatul este ca un sistem de operare. Se rulează acest sistem de operare numit Fedora. Și acum, din cauza conexiunii mele la internet lent, Am într-adevăr hosed. Rulează atât de actualizare yum sudo, așa cum am să vă spun să faceți în set de probleme, este ca essentially rulează actualizări automate în Mac OS sau Windows. Și motivul pentru care rulează acest lucru la început de Setul Problema este că atunci când am creat aparatul, am încurcat, și am făcut accidental toate programele arata negru pe un ecran negru, care este motivul pentru care nu te-i vadă în mod implicit. Dar cea mai recentă versiune a aparatului stabilește acest lucru. Și eu voi repara asta în timpul pauzei de o dată am internet conectivitate. Deci, citate ascunde doar greșeala mea, foarte discret, aparent. Alte întrebări? Da? PUBLICUL: În cazul în care se face venit? [Neauzit] David J. MALAN: Bună întrebare. În cazul în care se face venit? Acesta este un program de Linux care a existat timp de mulți ani, timp înainte de CS50. Și el vine cu un sistem de operare cum ar fi Fedora. Ea nu vine de la biblioteca CS50. De fapt, singurele lucruri care vin de la biblioteca CS50 până acum, pe care le-am văzut, sunt getString, GetInt, toate Ia cei funcții, precum și șirul de cuvânt, iar pentru unii măsură, cuvântul bool. Dar vom tachineze că, în afară atunci când ne scufunda in CS50 aparatul în sine. Deci da, o întrebare mai mult aici. PUBLICUL: Când ai spus si apoi faceti buggy, cum se calculator stiu [neauzit]? David J. MALAN: Bună întrebare. Deci, atunci când trebuie doar să rulați face buggy1 sau de a face buggy2, cum nu face știe? Deci în mod implicit, dacă tastați face buggy1, face look pentru o fișier numit buggy1.c. Și apoi execută comenzile corespunzătoare zăngănit, imperative astfel fișierul de ieșire implicit numit a.out. De fapt, dacă ne uităm la ceea ce fac, ceea ce - să renunțe la acest lucru. Dacă ne uităm la ceea ce face a fost de fapt a face, a face buggy2, e deja până la data de. Așa că lasă-mă să scoateți comanda rm, Programul-am scris înainte. Tastarea Y-E-S pentru a confirma că vreau să-l eliminați. Dacă aș face acum fac, observăm că în această linie foarte lungă, e chestia asta ultimul aici, o-buggy2. Toate acestea fac este de a face trece acest argument, ca să spunem așa, să Zăngănit, așa că nu trebuie să tastați-o eu. În regulă, deci un cuplu rapidă administrative anunțuri. Deci, pentru secțiuni, care a început în mod oficial această venire Duminica, veți dori întotdeauna să aducă, în cazul în care aveți unul, un laptop. Dacă nu aveți un laptop, nu ajunge la mine prin cădere-mi un e-mail. Și ne vom da seama unui flux de lucru. Ce, în general, veți găsi în secțiunea este că acestea sunt o parte partea conceptuală, hands-on. Vom folosi în mod special secțiunea de întrebări, o parte din set de săptămână problema, sa se plimbe prin intermediul unora dintre Materialul conceptuală de la curs. Și asta e tot în set de probleme actuale. Și vom arunca cu capul, de asemenea, în unele activități hands-on, uneori din care vor fi necesare pentru a fi prezentate, uneori de care nu o va face. De exemplu, aceasta prima saptamana, acestea sunt menite doar ca un warm-up exercitii. Și veți găsi că aceste probleme sunt de fapt doar asta. Ei trebuia să fie destul de mici, dar nu neapărat programe banale pentru a scrie, care nu sunt în mod neapărat incitante în sine și oportunități, dar sunt bune la practica cu sintaxa, cu noi funcții, în confortul unui secțiune în cazul în care aveți câteva dintre colegii dvs. prezinte, cât mai precum și TF ta. Și ce vom face în timp este utilizat un instrument numit CS50 Spatii, prin care în loc de a folosi doar Aparatura CS50, veți in loc sa mearga la o pagină Web într-un browser, în cazul în care veți putea pentru a scrie cod într-o fereastră de browser în timpul secțiune. Și apoi, dacă vă înscrieți, colegul tău de predare poate afișa apoi orice ar fi te tastarea pe ecran în browser-ul tău fereastră în sus la fața clasei, dacă anonim sau public, astfel încât el sau ea poate merge apoi prin intermediul cu colegii tai ce ai facut bine, ceea ce nu a făcut bine. Și din nou, fiți siguri toate acestea pot fi anonimizate frumos. Dar va fi o ocazie frumos pentru mult mai mult interactivitate decat ceva de genul prelegere permite. Între timp, vom avea aceste lucruri numite super- secțiuni, care sunt opționale, dar sunt deschise pentru toată lumea, în clasă, astfel încât să puteți face acest lucru mai mult colectiv pentru Problema setezi una. Iată programul. Acest lucru este, de asemenea, postat pe pagina de pornire de la cs50.net. Observați că acolo va fi un hacker specifică un mâine după-amiază. Și vom filma una azi și una mâine și posta acele on-line în termen de 24 de ore. Deci, nu, dacă nu puteți face oricare din aceste vremuri, să vă faceți griji. Și din nou, programul este online acum la cs50.net. În ceea ce privește secționare în sine, ar trebui să fi ajuns o trimite instrucție să te duci la pagina cursului pentru a găsi sectiunea ta. Dacă viața sa schimbat și aveți nevoie pentru a schimba punctul dumneavoastră, nu este o problemă. Du-te înapoi la același URL, cs50.net/section, singular, și vei completați formularul de asemănătoare, astfel încât să puteți apoi da-ne preferintele tale. Și vom urmări până la sfârșitul săptămânii ca la ceea ce putem găzdui. Săptămâna trecută, amintesc că ne-am propus utilizarea CS50 Discuss, instrument cursului discuției, în curs. Deci, am avut 40 de întrebări care au fost puse și un răspuns în cursul curs. Deci, părea să funcționeze bine, așa că vom continua încercarea de a face acest lucru. În cazul în care, în timpul prelegerii, nu te simți confortabil doar educație mâna, nu este o problemă. Du-te la cs50.net/discuss, posta acolo, și unul dintre predare noastre semenii va răspunde, fie ea electronică sau le ridica mână, pe numele dvs. anonim să întreb, în ​​funcție de privind natura întrebare. Și în ceea ce privește feedback-ul, în general, va fi psets returnat în termen de o săptămână. Deoarece este nevoie de ceva timp pentru a realiza secțiuni echilibru, PSET în primul rând, 0 și 1, va fi un pic întârziată ca lucrurile se stabilească. Dar stați tuned pentru că în următoarele săptămâni să vină. În regulă, asa ca lasa-ma pus pe serios meu voce doar pentru un moment. Deci, aceasta este de fapt un climat interesant pentru a fi având în această discuție, ceea ce cu toate celelalte lucruri întâmplă pe acesta campus conexe. Dar cu siguranță a avut CS50 istoria sa de această special subiect, în la fel de mult ca în fiecare an, acest curs, pentru mulți ani, Ad-Boards aproximativ 3% din clasa. În acest an cea mai recentă, 2011, CS50 Ad-au urcat 35 de studenți. Acest lucru nu este, cred eu, din cauza lipsei de claritate. Realizati ca în programa cursului, există o pagină de declarație care să explice în cazul în care liniile sunt. Această declarație se repetă aceeași pe fiecare dintre Problema stabilește pe o singură pagină. Așa că am menționez acest lucru astăzi într-adevăr doar pentru a face oameni buni Conștientă de acest. Și am încercat lucruri diferite. Și ceea ce am crezut că ne-ar face astăzi este să ia doar un moment pentru a de fapt, uita-te la unele dintre cazuri anterioare care au venit. , Mai degrabă decât să mențină aceste secrete murdare ca, de fapt, subliniez ceea ce elevii au făcut și cum ne-am detectat l și într-adevăr ceea ce este motivația general pentru având în chiar această conversație. Deci, cu care a spus, în esență, linia este aceasta - pe programa, esti binevenit, vă sunt încurajate, pentru a vorbesc cu colegii de clasă. Asta e tot scopul de a avea aceste colaborare orelor de serviciu în Annenberg și încurajarea oamenilor pentru proiect final de a lucra împreună. Dar linia este întocmit atunci când vine vorba de timp pentru a scrie, de fapt Soluția finală. Vorbind în limba engleză, total bine, vorbind în cod pseudo, total bine. Emailing un coleg PSET dvs., permițându-le uite peste ecran ca mâinile continua tastarea, peste linia de asemenea. Nu te uiți la programa școlară pentru liniile particulare. Dar doar pentru a picta o imagine a modului în care acest lucru este, din păcate, un realitate, dau seama că există site-uri web acolo, care au soluții din această clasă și multe alte clase. Faptul că tu sau aproximativ 3% dintre voi știu că există acest înseamnă că știm că aceasta există. Faptul că există site-uri web ca asta în cazul în care pot plăti pe cineva să facă de fapt, seturi de problema ta - acest lucru a fost un caz real care a venit anul trecut. Acesta este un site web numit odesk.com. Si Tim a fost numele persoanei care a fost aici, postarea pe acest site și a rugat pe cineva să facă PSET lui 7 în acest caz particular. Ei bine, este foarte odesk.com Google măsură, și noi suntem foarte bun la cu Google. Aici, de asemenea, există site-uri - si asta e destul de atroce, sincer. [Râsete] David J. MALAN: amuzant lucru despre acest site este în cazul în care ai citit pagina Despre, ei vorbesc despre corporativă lor Serviciul cultura și modul lor de client este numarul unu prioritate, pentru a vă asigura că sarcinile dvs. să obțineți pornit la timp. Dar în toată seriozitatea, din nou, faptul că aceste site-uri există, ne dăm seama, de asemenea, sunt conștienți de aceste tipuri de site-uri. Și pentru a vă oferi un sentiment de ceea ce face, în general, această ia, în general, noi nu avem mari scandaluri în care oamenii colaborează pe orice tip de scară largă, ci mai degrabă E aceste momente de noapte de slabiciune, în cazul în care aveți atât de multe de făcut, e 4:00 AM, ești epuizat, și tu cred că la tine, ei bine, lasa-ma sa ia doar o privire la meu coleg de cameră sau codul prietenul meu sau similar. Și manifestările de acest implică, din păcate, Student Un ceva de genul depunerea și transmiterea Student B ceva de genul asta, care cu siguranță, într-un calculator Clasa de știință, este extrem de ușor pentru oamenii de stiinta de calculator pentru a detecta cu software-ul. Aceasta este o altă paradigmă comună, în cazul în care ați un fel de a fost de lucru alaturi de cineva, poate vorbi în Engleză, bine, pseudocod. Dar apoi vine vorba de timp pentru a prezenta efectiv, precum și psets Tocmai te schimbate prin e-mail sau Dropbox sau similar. Dar, într-o încercare de a face mai puțin evident că acest lucru este ceea ce sa întâmplat, atunci acest lucru este ceea ce se prezentate. Acest lucru, de asemenea, nu excursie la bine-scrise bucăți de software-ul ca și cum am avea de a detecta efectiv aceste tipuri de lucruri. Și într-adevăr, ceea ce facem noi este programul administrat de care compară toate din acest an declarațiile împotriva tuturor a lui anul trecut observațiile, împotriva a tot ce-am găsit pe Internet, față de fiecare site-ul de locuri de muncă acolo. E foarte automatizat. Și așa facem acest lucru într-adevăr, în corectitudinea mare de 97%, care sunt într-adevăr de lucru de pe fundurile lor în acest sens și în alte clase și punerea în tot acest efort de muncă, astfel încât acestea prezintă în cele din urmă este a lor. Și eu pot merge pe pentru vârstele. Acestea sunt doar câteva cazuri de anul trecut. Cativa studenti transmise aceste fișiere în mod identic pentru PSET 2, PSET 3, 4 PSET, PSET 5, 6 PSET, PSET 9. În acest caz, aceasta a fost Quiz 0 și în anul trecut, în care două elevii transmise identic acestei propoziții printre multe altele alții, "cererea de tip -" dot, dot, dot. Deci, chiar intr-o clasa de 600 am detecta acest pe a prezentat teste. Deci, pe scurt, acest lucru - sincer, urăsc cu acest tip de conversație - dar acest lucru este într-adevăr un efort deliberat în acest an pentru a încerca de a conduce în jos acel număr. Pentru că, chiar dacă am spune aceste tipuri de lucruri la fiecare ani, cred că realitatea de a fi locuit pe ea pentru câteva mai multe secunde decât de obicei și de fapt doar subliniind că ceea ce s-ar putea părea, nu-i așa, nu o astfel de afacere de mare, cel puțin gândesc la acest moment, atât în ​​echitate a tine și colegii dumneavoastră pentru a aici. Deci, dacă aveți vreodată orice întrebări cu privire la cazul în care linia de este, te rog ajunge la mine personal. Dar răspunsul este mereu, complet subliniat la last minute, bani într-o zi de întârziere. Sau dacă este o chestiune de a nu avea nici o zi întârziere, sincer, mi e-mail personal. Ne vom da seama ceva. Vă rugăm să nu puneți timp aici la Harvard, la risc. Acum, m-am gândit că ar trebui să lumineze starea de spirit, așa că am inclus aceasta ca slide-ul urmator. [Râsete] David J. MALAN: Acest site a fost grozav. Am de fapt, un pic distras. Nu e asta. Și apoi asta a fost uimitor. Bine, cred că de pisoi noaptea târziu atunci când se face aceste decizii. Toate lucrurile dreapta, astfel încât înapoi la mai multă distracție și mai puțin grave, cum ar fi condiții. În regulă, așa că am vorbit pe scurt despre acestea. Acest lucru este ceva care este, probabil, destul de familiarizat de la lumea Scratch. Iar în lumea Scratch, avem această nevoie, uneori, de a du-te face furcile în drum. Face fie prezenta sau că acest lucru sau alte aici. Și atunci când vrem să facem acest lucru, putem folosi, în C acum, în cazul în care acest altceva construi. Și apoi aici, avem expresii booleene. De exemplu, expresii booleene aici, putem SAU le împreună, în sensul că avem această condiție SAU această condiție. Putem și le împreună, în sensul că dorim să verifica această condiție și că această condiție. Și aici avem o declarație comutator acum, ceea ce nu este atât de similară sintactică a acestor tipuri de condiții, dar ne permite să facem în cazul în care echivalentul a, în cazul în care altcineva, altceva în cazul în care, altfel în cazul în care, la fel ca și prin simpla enumerarea acestora de la caz la caz, de la caz la caz. Deci, am văzut pe cei ultima dată. Și apoi am început atingând la lucruri cum ar fi buclele. Am văzut unul dintre acestea doar o clipă în urmă. Dar există aceste constructe alte buclă. De exemplu, cel de aici. Deci, în timp ce (conditie), face acest lucru din nou și din nou. Deci fundamental, ceea ce pare a fi diferit între acest pentru bucla și această buclă în timp ce aici? Această buclă și pentru această buclă în timp ce. Da? Ce-i asta? PUBLICUL: [neauzit]. David J. MALAN: Bine. Deci, în timp ce în stare de buclă pentru, există în mod clar mai mult sintaxa. Nu e asta initializare, e această actualizare. Într-o buclă în timp ce, e doar această condiție. Deci se pare că e un pic în jos față de comparație pentru buclă, ceea ce înseamnă, dacă vrem să avem variabile și vrem pentru a avea incrementare, avem de fapt să face acest lucru noi înșine. Așa că lasă-mă să mergeți mai departe și să se deschidă gedit. Lasă-mă să comuta la aparatul. Și hai să facem doar un exemplu rapid mic care distinge una dintre acestea de la celălalt. Și în partea din spate a mintea mea aici, ar trebui să spun un singur lucru. Am menționat în mod special numele Tim. Tim a fost de fapt pe cineva care un student a încercat să găsească pentru a face temele pentru ei. Nu am avut Tim în secțiunea special. Deci dau seama, ca nu cumva am dezvăluit un student, nu a fost un student. A fost o persoană aleatoare pe Internet face lucruri de anul trecut proxy. Așa că am găsit că este, de asemenea. Deci, în acest caz aici, lasă-mă să merg mai departe și deschide un fișier nou. Fișier, Noua. Acest lucru îmi dă o filă aici. Lasă-mă să mergeți mai departe și salvați-l ca loop.c. Lasă-mă să merg și faceți clic pe Salvare. Și apoi aici, hai să mergem mai departe și începeți să scrieți # Include . Lasă-mă să zoom inch Acum, vom face int main (void). Acum, lasă-mă să merg mai departe și de a face pentru (int i = 0; i < oh, 10; i + +). Și acum am de gând să merg mai departe și nu imprimați steaua pe care am făcut-o mai devreme. Și apoi, la sfârșitul acestui program, suntem doar de gând să imprima o linie nouă, doar pentru ca mi prompte nu arata tot murdar. întoarce 0. Se pare corect sintactic? Până în prezent. Deci, haideți să vedem. Așa că lasă-mă să zoom out, du-te în fereastra terminalul meu. Și lasă-mă să merg mai departe și a alerga bucla, pentru că am numit acest lucru loop.c. Deci, a face bucla. Pare să compileze OK. Lasă-mă să fugi buclă, și acum Enter. Și se pare că au fost tipărite 10 stele. Așa că hai să converti asta într-o buclă de timp și a vedea ce tipuri de probleme noi de călătorie de peste. Deci, în loc de aceasta, permiteți-mi să merg aici și să spun în timp ce i este mai puțin de 10 - lasă-mă să scap de bucla for. OK, deci avem o serie de probleme deja. Deci, condiția este aceeași, dar eu sunt lipsesc în mod evident inițializare. Sunt lipsesc incrementare. Deci, ce ar trebui să spună probabil compilatorul mine când încerc să compila acest program? Da? PUBLICUL: [neauzit]. David J. MALAN: Bine. Deci, o să spună ceva de genul nedeclarate - în acest caz, i variabilă. Și într-adevăr, utilizarea de identificator nedeclarate i. Și astfel acest lucru este în contrast cu limbi, cum ar fi PHP si Python și Ruby, cu care unii dintre voi s-ar putea să fie familiarizați, în cazul în care puteți doar un fel de a începe să utilizați variabile vrând-nevrând, și nu trebuie să vă faceți griji cu privire la declararea lor în mod explicit întotdeauna. În C și în limbile de, cum ar fi Java și C + +, trebuie să fie super-explicite. Și dacă vrei o variabilă numită i, trebuie să-mi spui ce fel de variabile este. Deci, vom avea pentru a rezolva această, după cum urmează. Am de gând să aibă de a merge în sus și tastați aici int i, prin urmare, Am declarat o variabila numita i. Acum, am sărit un pas. Am, evident, nu-l inițializată, dar să vedem dacă la cel oprire mărci zăngănit plâng. Așa că lasă-mă să refacă acest program. În regulă, acum e doar plange pentru un alt motiv. "Variabila" i "este neinitializata atunci când este utilizat aici." În regulă, așa e destul de explicit. Inițializate înseamnă doar setarea este egală cu o valoare. Și nu ne-am facut asta, asa ca lasa-ma sa incerc este egal cu 0. Acum, haideți să încercăm din nou și re-rula zăngănit. Compilate de data asta. Și eu sunt pe cale să-l rulați. Dar mare buclă infinită vechi, pentru că am făcut initializare, am făcut condiție, dar eu n-am făcut orice fel de incrementare. Deci, cum pot face incrementarea? Ei bine, într-o buclă în timp ce, se simte ca și cum am de gând să aibă pentru a face acest lucru in interiorul buclei, pentru că la fel ca primul săptămânii exemple de constructe face în buclă, cum ar fi cu șosete și cu auto-numărare, am avut de a face ceva de la sfârșitul foarte, ca du-te înapoi la linia următoare. Ce se întâmplă dacă am merge mai departe și de a face acest lucru am + + aici? Să nu compila chiar și această. Prinde-mă deja. Ce sa întâmplat aici? PUBLICUL: [neauzit]. David J. MALAN: Deci nu e sigur int. E i.. Și acolade, ca înainte, indentarea nu este de ajuns. Așa că acum am această construcție. Deci, în timp ce i este mai mic de 10, imprimați o stea, apoi i incrementa. Și modul în care o în timp ce lucrările la bucla este că de îndată ce te-a lovit partea de jos a buclei, care, în acest caz, arata ca linia 10, se va întoarce la linia 6, moment în care condiție va fi verificată din nou. Și dacă i este în continuare mai mic de 10, vom face liniile 8 și apoi 9, apoi ne vom lovi 10, și du-te înapoi la 6, din nou și din nou și din nou și din nou, atât timp cât i este mai mic de 10. Deci, haideți să re-rula face aici. Bine, am compilat bine. Lasă-mă să re-rula bucla. Și acum, de fapt pare să funcționeze. Deci, plusuri și minusuri aici? Ei bine, până acum nu există de fapt, nu un ansamblu de PLO - atât de drăguț. În regulă, asta a fost o - ah, asta a fost un accident. În regulă, așa că hai să ne întoarcem la bucla for. Deci, pentru bucle sunt frumoase, deoarece acestea sunt foarte explicite. Și chiar dacă ele sunt un pic mai greoaie pentru a scrie, e foarte puternic si iti permite sa faci mai multe lucruri deodată. În timp ce buclele nu par a avea o mare cantitate de valoare doar totuși, pentru că se simte ca și cum am doar trebuie să facem mai mult de lucru. Trebuie să punem initializare aici, actualiza aici, iar noi trebuie să ne amintim să facă toate astea. Deci, vom vedea în momentul în care buclele în timp ce împrumuta de fapt, se la doar contexte diferite, date diferite structuri, cum ar fi liste și tabele de dispersie, lucrurile vom ajunge la la mijlocul-semestru. Dar pentru acum, știu că există acest al treilea tip cunoscut ca un do- în timp ce bucla. Și am văzut asta pe scurt. Și acest lucru ar putea fi de ajutor super cu PSET 1. De fiecare dată când vrei să faci ceva și apoi verificați dacă utilizatorul a cooperat, iar dacă acestea nu au, o fac din nou, un do- în timp ce bucla se pretează la acest tip de logică. Deoarece ca comanda de sus în jos sugerează aici, nu înseamnă, literal, face acest lucru. Și de a face acest lucru din nou și din nou, ceea ce ar putea fi? Poate că înseamnă GetInt de asteptare sau getString și apoi verificarea valoarea GetInt sau getString și apoi striga la utilizatorul în cazul în care nu au cooperat, cerându-le din nou și din nou și din nou. În cazul în care vrei să faci ceva o dată, apoi a verifica anumite conditii. Deci, haideți să încercăm asta. Lasă-mă să schimbați, de fapt asta acum într-o buclă do-timp. Și am de gând să merg mai departe și procedați în felul următor. La fel și următorul. Hai sa facem int i = GetInt (), dar hai sa spun in primul rind de utilizare ce să fac. Deci, un pic diferit de data asta. "Dă-mi un int". Așa că voi folosi printf pentru asta. Și acum am de gând să merg aici, și am de gând să fac asta în timp ce i este, să zicem, mai mare decât - Să vedem, i este, să zicem, mai puțin decât 0, sau i se mai mare de 10. Cu alte cuvinte, vreau un număr de la 1 la 9, doar arbitrar. Deci, eu am folosit o expresie booleană aici pentru a combinat asigurați-vă că i este mai mic decât 0 sau mai mare de 10, în care caz că va face acest lucru bucla din nou aici. Deci, din nou, face acest lucru - în timp ce i este mai mic decât 0 sau i este mai mare de 10. Deci, acum să mergem mai departe și face acest lucru după ce am făcut asta. Hai să facem doar o verificare rapidă bun-simț. printf ("Mulțumesc, i este% d", i). Deci, acest program simplu solicită de utilizator pentru un int, face sigur că e ceva în intervalul de la 1 la 9 inclusiv, și apoi mulțumește utilizatorului, amintindu-le ceea ce ei tocmai tastat în, la fel ca și un cec bun-simț pic. Dar hai să vedem dacă asta funcționează astfel cum sa prevăzut. Lasă-mă să merg cu capul în jos aici și re-rulați make buclă. Hmm. "Utilizarea identificator nedeclarate" i "". Asta e ciudat. Am crezut că am rezolvat asta. Același simptom, dar alt cod. Da? PUBLICUL: [inaudibil] în interiorul doi, trebuie să ne [Neauzit]. David J. MALAN: Exact. Deci, acest fapt ne conduce la un subiect cunoscut sub numele de domeniul de aplicare. Se pare că C, din nou, într-adevăr te duce literalmente. Și dacă faci ceva de genul asta în cazul în care declara o int și atribuiți apoi o valoare, dar să faci asta în interiorul unui pereche de acolade, ceea ce face C este se presupune că vreau doar acele biti 32 cunoscuți ca i să existe în cadrul cadrul acestor acolade, în contextul liniilor 6 până la 9. Deci, i este declarată, și se atribuie un valoarea din linia 8, dar de îndată ce ajungi în afara Linia 9 de mai jos bretele cret, i nu mai este în domeniul de aplicare, ca să spunem așa. S-C-O-P-E. E nu mai este în contextul potrivit. Deci, acum nu există nici un i, așa că e ca și cum nu am avut chiar a declarat că, la toate. Deci, ce e un fix atunci pentru așa ceva, în cazul în care Motivul este că i este declarat în cadrul acolade, care este aparent rău? Aici? PUBLICUL: [neauzit]. David J. MALAN: Da. Astfel încât să putem inițializa afara. Așa că lasă-mă să merg mai departe și ștergeți părțile declarație prin care Am specifica tipul, și lasă-mă să-l fac aici. Deci, în linia 5, acum spune: "Dă-mi un int." Spune-i. Observați în linia 9, nu vreau să fac asta, pentru că am au deja biti 32. Nu vreau să solicite un calculator pentru biți diferite 32. Vreau să folosesc aceste aceleași 32 de biți. Și acum, pentru că i se declară în linia 5, este încă legit să-l folosească în linia 11 și linia 12. Așa că lasă-mă să încerc să recompilați acest lucru și a vedea în cazul în care se oprește zăngănit țipa. face bucla. Deci, acum este "declarația implicită a funcției "GetInt" este nul în C99 "Ce este asta.? Da? PUBLICUL: [neauzit]. David J. MALAN: Da. Deci, acum că eu sunt, folosind de fapt GetInt, acest lucru nu este ceva ca doar vine cu C. Acest lucru vine de la CS50. Deci, avem nevoie de asta aici. Și lasă-mă să mă întorc la promptul jos aici și re-rulați make. Bine, în cele din urmă. Acum am rezolvat și că altă eroare. Lasă-mă să ruleze, acum, bucla și a vedea ce se întâmplă. "Dă-mi un int." Eu voi da 11. Eu voi da -1. Eu voi da foo. Eu voi da 5. Și, într-adevăr funcționează acum. Dar promptul schimbat pentru un motiv aici. De ce l-am spus încercați din nou una dintre aceste ori, dar da-mi un int celelalte trei ori? De ce este faptul că un comportament diferit? PUBLICUL: dat un șir. David J. MALAN: Imi pare rau? PUBLICUL: Ai dat un șir. David J. MALAN: Da. Așa că am dat un șir în această a treia încercare, când am tastat foo. Foo este un șir de caractere. E evident ca nu o int. Și modul în care a pus în aplicare CS50 GetInt este că noi Nu verifica dacă ceva e mai mică de 0 sau mai mare de 10 pentru tine, pentru că de unde știm dinainte ce fel de int vrei? Dar putem verifica minim pentru tine, ai ghidul de cel puțin tastați un număr întreg? Și dacă nu au făcut-, am țipa la utilizator prin tastarea "retry" pe ecranului. Deci, acum avem un program care este looping. Bine. Acum, care dintre acestea este un fel de construct mai bine? Deci, acest lucru este în cazul în care lucrurile încep să obțineți un pic dezordonat, Faptul că trebuie să vă amintiți de a declara o variabila aici dacă doriți să-l utilizați în interiorul unor acolade și în afara. Dar, chiar dacă acest lucru pare un pic criptic la prima ochire, doar din nou, amintiți-vă logica simpla. În scopul de a utiliza ceva în C, indiferent dacă este o funcție sau este o variabilă, trebuie să-l includă în cazul în care este o funcție în unele bibliotecă, sau trebuie să-l declare. Dar acum trebuie să fim atenți în plus de faptul că tu îl declară în domeniul de aplicare dreapta. Tu nu-l pune prea tare în interiorul parantezelor. Așa că lasă-mă să se rostogolească de fapt, înapoi. Dacă ne întoarcem la noi, de exemplu, de la mai devreme, și mă duc inapoi la pentru int, int i = 0; i <10; i + +, și am face Stele printf, cum ar fi aceasta, și apoi paren aproape, și acum printf i este acum - conform aceleiași logici, ce se va întâmpla atunci când am încerca să compila acest program? PUBLICUL: identificator invalid. David J. MALAN: Deci e un alt identificator invalid, nedeclarate identificator. Acum, motivul e un pic diferit. Nu e evident, nu acolade aici, dar același Ideea, aceeași poveste a domeniului de aplicare. Dacă ați declarat o variabilă ca și cum aș interiorul unui pentru bucla, chiar dacă nu ați scris în mod explicit cret bretele, cred că de ei mental ca fiind încă acolo, în care caz i este valabil doar în interiorul a buclei pentru. Acesta nu este valabilă odată ce ajunge la linia următoare, care, în acest caz, este acum 10. Deci, doar la câteva aspecte ale domeniului de aplicare și similar. În regulă, întrebări? În regulă, deci asta este un fel de un mic program banal, imprimarea doar stele mici. Dar hai să vedem dacă vă amintiți acest cântec aici. Acesta este un cantec incredibil de enervant copiii vor cânta pe autobuz școlar și similar. Dar ce e frumos despre ea este că are această ciclicitate, care e "99 de sticle de bere pe perete, 99 de sticle de bere. Luați o în jos, trece-l în jurul valorii de, 98 de sticle de bere pe de perete. "Și apoi cântecul repetă 97, apoi 96, apoi 95, apoi 94, tot drumul până la 0 daca tu de fapt ai ca departe pe autobuz. Deci, acesta este un program de frumos pentru a sorta de utilaj, deoarece mea Dumnezeu, dacă ai putea să pună în aplicare acest lucru cu doar câteva de linii de cod, ai putea scuipat versurile întregi la prezentul cântec destul de repede. Dar de-a lungul drum, putem începe să tachineze acum Apart unele acestor constructe de bază buclă și acum, de asemenea, introducă funcții care ne scrie, returna valori pe care le trece în jurul valorii de. Dar, mai întâi, de ce nu mergem mai departe și să ia noastră de cinci minute rupe aici? Și când ne vom întoarce, vom cânta acest cântec. În regulă, deci ne-am întors. Și când spun că voi cânta acest cântec acum, vreau să spun programatic, nu verbal. Deci, aici avem beer1.c, care este unul punerea în aplicare a prezentei cântec special. Și doar pentru a fi clar, pentru cei nefamiliarizați cu ceea ce acest lucru arata ca, lasă-mă să merg mai departe și să facă beer1, Enter. Acum, permiteți-mi să ruleze beer1, și ceea ce vom vedea - cât de multe sticle de bere va fi acolo? Voi tip în 99, cum ar fi cântecul spune. Enter. Și acum, dacă vom parcurge - Hopa - dacă am parcurge toate acestea, vom vedea că această a cantat intr-adevar cântec întreg. Stai un minut. Barul meu defilare E un pic dat peste cap. Să folosim fereastra mai mare. Deci beer1, 99, acolo mergem. Deci, aici avem cântec întreg, cântat mult mai rapid de calculator decât ar fi putut fi de noi. Deci observați, însă, natura ciclică aici. Se spune 99, apoi 99, apoi "ia una în jos, să-l dați în jurul valorii de, ", apoi 98. Și acum se repetă din nou și din nou. Deci, aceasta este de fapt o oportunitate perfecta pentru un fel de looping construi. Observați că eu sunt un fel de tăiere a unui colț aici. Observați că am spus "98 de sticle de bere pe perete, 97 de sticle de bere pe perete, "și că a fost doar atât de că, atunci când vom ajunge la unul de sticle de bere, nu am să vă faceți griji despre gramatica limbii engleze. Dar putem stabili, de asemenea, acest lucru cu un pic de o în cazul în care condiție, probabil. Dacă acest număr este singular, mergeți mai departe și spune "sticla", în caz contrar, dacă e plural, spune "sticle". Dar pentru acum, am tăiat complet acel colț. Deci, haideți să vedem ce avem aici. Deci, ne-am luat unele comentarii de la partea de sus. Mă inclusiv aceste două biblioteci, după cum am fost de obicei. Și acum să-mi defilați în jos la prima de linii efective de cod. Linia 17 va începe principal. Linia 21 și 20 are câte sticle de bere va fi acolo? Și apoi m-am sun GetInt. Și acum am un pic de un cec bun-simț. Deci, aceasta este o convenție pe care o vom începe acum de adoptare a mai riguros verificați de intrare utilizatorului. Uneori, tu chiar nu vrei să-i determine din nou și din nou și din nou. Dacă utilizatorul șuruburi și nu cooperează, bine. Închideți și doar nu face cu ei. Si pentru ca e ceea ce fac eu aici. Dacă n este mai mică de 1, eu doar de gând să țipi la utilizator, "Îmi pare rău, că nu are sens." Și apoi am de gând să a reveni arbitrar 1. Deci, din nou, aceasta este doar o convenție să te obișnuiești cu. Pentru moment, aceasta ia în credință. Dar pana acum, am fost întotdeauna se întoarce 0, deoarece am spus revin 0 denotă ce? PUBLICUL: Succes. David J. MALAN: Succes, asta-i tot. Deci, acum că suntem în cele din urmă începe să se gândească la non-succese - cu alte cuvinte, cazuri de colt, stările de eroare - acum am o aprovizionare infinit, sau cel puțin patru miliarde lucruri posibile care pot merge greșit în programele mele. Și eu pot începe atribuirea de numere individuale. Acum, în general, este suficient doar să se întoarcă altele decât 0 ceva. Deci, vom reveni pur și simplu 1 pentru acum. Dar motivul pentru returnarea 1 este faptul că de îndată ce vă veți întoarce 1, ghici ce se întâmplă cu restul programului? Se oprește. Asta e tot. Deci, faptul că mă întorc 1 este eficient scurt-circuitul execuția acestui program, astfel încât nimic mai jos linia 27 va continua de executare. De îndată ce se întoarce principale, care este. În regulă, așa că, dacă utilizatorul nu cooperează și vom ajunge la linia 30 deoarece acestea tastat într-un număr de legitim, aici este meu punerea în aplicare a acestui cântec. Asa ca am imprimați mai întâi o linie noua de caractere, doar pentru estetica. Am acum o buclă pentru. Și observați că fac lucrurile într-un pic de-o direcție diferită. Eu nu trebuie să fac mai puțin, eu nu trebuie să fac + +. Pot spune în schimb inițializa o variabilă i, setați-l egal cu n, numărul de utilizatorul tastat în, apoi procedați astfel, așa timp cât i este mai mare decât 0, atunci I - După ce ați terminat de o iterație din această buclă. Deci, putem conta în jos folosind o buclă de asemenea. Acum, acest lucru este destul de mult o săptămâna lucruri acum, cu printf. Deci de imprimare "% d de sticle de bere pe perete." Print "% d sticle de bere. "" Luați o în jos, trece-l în jurul valorii de. "Print "% D sticle de bere pe perete." Deci, e încă% d, dar observăm că argumentul cu printf se schimbă. După virgulă, am am, pentru că vreau să spun 99. După această virgulă, am am, pentru că vreau să spun 99. După această virgulă, am am - 1, pentru că vreau să spun 98, în această repetare în primul rând, și așa mai departe. Și acum aici, am doar o remarcă stupid. Și apoi linia 42, ma voi intoarce 0, prin convenție, semnificând faptul că totul este în regulă. Și ce dacă am goofed? Ce s-ar putea o greșeală comună să fie aici? Ei bine, ce dacă am spus accidental bine, eu nu vreau să conteze la 0, vreau 0 sticle de bere pe perete? Așa că am spus, i este mai mare sau egal cu 0. Ce se va fi simptom pe care o văd acum, dacă am recompilați beer1 și rulați-l? PUBLICUL: Negativ. David J. MALAN: Da, o să merg negativ. Aceasta este o eroare off-cu-o, o incredibil de greșeală comună pentru a face. Să mergem de fapt, înapoi la fereastră terminal și fă-o aici, astfel încât să putem vedea mai multe la un moment dat. Introduceți, 99 de sticle de bere. Aproape, dar ne-am dus vreodată atât de ușor prea departe. Am cântat piesa prea departe în jos, astfel că am lovit acum negativă număr. Deci nu merge prea bine. În regulă, astfel încât să putem rezolva cu ușurință că prin a merge înapoi la modul în care aceasta a fost odata. Dar ce sunt unele oportunități acum îmbunătățire? Ei bine, lasă-mă să deschid beer2.c și defilează în jos aici și să ia o uita-te la aceasta versiune. Care e primul lucru pe care sare la tine ca diferite în această versiune aici? PUBLICUL: [neauzit]. David J. MALAN: Da, deci nu mai sunt eu, pentru că aceasta a avut loc la mi știi ce, eu cer de utilizator pentru N, si atunci eu sunt stabilirea i egale cu n, iar apoi eu am schimba, dar eu nu sunt atingând n din nou. Deci, ce naiba a fost punctul de ai aloca alte 32 biți numit i doar pentru ca pot avea o altă variabilă? Deci, în acest caz, am un fel de inutile recunoscut că Design caracteristică. Și am de gând să spun acum în timp ce n este mai mare decât 0, du-te înainte și imprima același cântec, trecerea unui n pentru ca printf al doilea argument, și n - 1 ca al doilea argument aici. Și apoi pe fiecare iterație a buclei acest, mergeți mai departe și doar decrement n sine. Acum, funcțional, acest program va fi identice. Dacă aș scrie în 99, N începe la 99. Am decrement, decrement, scădere, scădere. Mă duc pentru a obține toate drumul până la "O sticlă de bere pe perete, o sticlă de bere. Luați o în jos, trece-l în jurul valorii de. 0 de sticle de bere pe perete ". Finali, pentru că am făcut-o obține starea corectă. E mai mare decât 0. Nu am face această greșeală. Deci, care este mai bună, versiunea unul sau versiunea doi? Așa că am auzit o grămadă de cârtirile pentru doi. De ce două? Ce-i asta? PUBLICUL: [neauzit]. David J. MALAN: Oh, bine. Deci nu va merge sub 0, dar amintiți-vă, în versiunea unul, Versiunea originală corectă nu merge sub 0, fie. Deci, amintiți-vă că aceasta este versiunea corectă. Așa că haideți să-i cel puțin a compara cele două versiuni corecte. Ce este un argument în favoarea versiunii două fiind, mmm, mai bine? Da? PUBLICUL: Se utilizează mai puțin spațiu. David J. MALAN: Ok, deci foloseste mai putin spatiu, nu? Întrucât o versiune pe 32 de biți utilizat pentru n, și apoi un alt 32 de biți pentru i. Versiunea doi foloseste numai 32 de biți pentru n, astfel încât pare a fi un plus. Alte gânduri? Vrea cineva să argumenteze în favoarea unuia? Da? PUBLICUL: Trebuie să utilizați linia de cod suplimentar pentru n -. David J. MALAN: Bine, sigur. Deci asta e corect. Deci asta doar, cel puțin pentru mine - Adică, asta se simte de fapt, un pic de Messier, faptul că Eu nu pot sorta de chintesența tuturor logicii mele într-un singur Linia frumos, pentru bucla, ca pentru bucla poate. Aici, am cam trebui să tac în acest n - la finalul buclei, deoarece e logic necesar. Dar este un fel de freacă-mi mod greșit, doar pentru că pare separat de logica de până aici, chiar dacă, din nou, e necesar. Alte gânduri? Da? PUBLICUL: [neauzit]. David J. MALAN: Da. Deci, ce se întâmplă dacă în schimb, la sfârșitul melodiei, a vrut să imprimați din nou numele melodiei? Ca "Multumesc pentru a juca 99 de sticle de bere", sau ceva de genul o prostie ca asta? Dar punctul este, ai vrut acces la valoarea inițială. Faptul că ați suferit mutatii sau schimbat n pe fiecare repetare și, prin urmare, s-au distrus valoarea sa inițială înseamnă pur și simplu nu se poate face că, la sfârșitul. Acum, fără îndoială, noi în mod evident, nu vreau să fac că, în acest program. Deci, cui îi pasă? Dar asta e un punct foarte valabil. Și ca să fiu sincer, nu e într-adevăr nimeni chiar răspunde aici. Sunt amândoi la fel de corect. Aș putea fi convins nici un fel. Eu va spun ca, in general, este un principiu bun, dacă a solicitat de utilizator pentru o anumită valoare și ați stocat într-o variabilă ca n, doar un fel de principiu privind, e probabil bine pentru a menține în jurul valorii de faptul că. Precum și orice date pe care doriți să transforme din nou și din nou, doar da-te o copie a acestei variabile, doar astfel încât să au acces la versiunea originală. Va petreceti mai mult de 32 de biți, dar realitatea este aceasta calculatorul a, ca, doi gigaocteți de RAM in aceste zile, și suntem quibbling peste 32 de biți? Chiar nu o astfel de afacere mare. Și chiar pe acest dispozitiv aici, cu o jumătate de concert sau o gigaoctet de RAM, 32 biți versus pe 64 de biți, Nu o astfel de afacere mare. Desigur astăzi, o să fie drumul copleșiți de mărimea a programului în sine, care va fi câteva sute de kiloocteți, dacă nu de cativa megabiti, in aceste zile. Preocupări atât de rezonabile, nu un singur raspuns corect. Dar, cel puțin acestea sunt gândurile pe care ar trebui să înceapă să trece prin mintea ta? Pentru că în PSET 0, chiar dacă suntem cu adevarat doar de așteptat corectitudinea, sau cel puțin renuntarii bug-uri diferite care s-ar putea s-au confruntat, așa cum am merge mai departe, design-ul este O să fie un alt aspect-cheie, atât de scrierea de cod și, de asemenea, evaluarea noastră cod. Și astfel, cel puțin da gândit la lucruri de acest gen. Și doar pentru că lucrările ceva nu inseamna ca e bine, nu înseamnă că e bine concepute. Și asta e unul din lucrurile pe care semenii didactice și seturi de probleme ne va ajuta să tachineze parte a lungul timpului. Ei bine, ce zici de, să spunem, această versiune aici? Lasă-mă să fac ceva un pic mai sexy aici, într-un moment. În primul rând permiteți-mi să scap de asta. Și acum să rezolva această problemă gramaticală. Deci, în această versiune, vreau să stabilească gramatica, astfel încât, mai degrabă decât să spun e paranteză, cum ar fi "sticla" sau "sticle" - Nu vreau să taie acel colț - De asemenea, doresc să imprimați dinamic out sugerate de "sticle" sau "sticla", folosind astfel substituenți acestea% s azi. Așa că am nevoie pentru a verifica ceea ce este condiționat valoarea lui i. Și dacă e 1, vreau să spun "sticla", iar dacă ceva e altceva, vreau să spun "sticle". Deci, haideți să încercăm să facem acest lucru. Deci, dacă i == 1, atunci să-mi duc mai departe și să declare - Am nevoie de un șir de caractere, asa ca lasa-mă să fac s1 șir, pentru că este primul șir Îmi pasă acum. Am de gând să spun "sticla". Și apoi, să vedem, string s2 - și voi explica de unde mă duc într-un moment - "Sticle". Deci reamintesc faptul că, în acest cântec, trebuie să fim capabili pentru a imprima lucruri, două cuvinte diferite cu potențial. Deci, dacă ne uităm înapoi aici, observați că atunci când vom ajunge la acest exemplu aici, "două sticle de bere pe perete, doua sticle de bere, ia una jos, treci în jurul valorii de ", vreau această a patra linie de spus acum "o sticla de bere pe perete "Așa că am nevoie pentru a decide,. vreau să spun" sticle "sau "Sticla"? Așa că am de gând să spun arbitrar, în regulă, Am de gând să declare acum o variabilă numită s1, string unul, care este mergi la a lua conectat aici și, de asemenea, aici, deoarece aceste cuvinte sunt întotdeauna identice, doar din cauza natura cântec. Și am de gând să sun s2 orice cuvânt vreau să în cele din urmă să apară aici. Acum, literalmente, de 99 de ori din 100, aceasta va fi aceeași în ambele cazuri, pentru că 3 este la plural, 2 este plural, 4 este la plural. Dar în acest caz colț, în cazul în care se ajunge la 2 și apoi 1, sau chiar 1 si apoi 0, am nevoie de această logică. Deci, am să-și petreacă ceva timp în codul meu obținerea acestui drept. Deci, dacă am face acest lucru, dacă i == 1, atunci s1 stabilite egale cu "sticla" și S2 egal cu "sticle", deoarece acest lucru va fi de 1 sticla, iar acest lucru va fi pentru 0 sticle. Și asta aici, ce înseamnă asta reprezinta? Doar ca să fie clar. Acesta este doar un comentariu. Deci, faptul că puteți avea o singură linie comentariile pe care le reprezintă poate comenta codul dvs. cum ar fi acest lucru, dar un alt comună paradigmă, de asemenea, este că, dacă aveți o expresie super-scurt, care vrei sa te pui si e doar mai ușor de citit pentru a pune se chiar la capătul liniei de cod, puteți face absolut ceva de genul asta. Deci, acum, ce se întâmplă dacă am face acest lucru? Altceva dacă i nu este egal cu 1. Deci, bang egal - semn de exclamare este cunoscut sub numele de "bang". Deci, bang = 1. Deci, dacă i nu este egal cu 1, ceea ce nu am loc doriți să faceți? Ei bine, primul cuvânt Vreau sa fiu ce? Deci, ar trebui să fie un șir de "sticle" pentru sticle plural, și apoi aceasta va fi la plural "sticle", precum și, pentru moment. Și vom vedea dacă acest lucru devine de fapt ne-a în cazul în care vrem să mergem. Deci, acum, dacă aș defila în jos aici, observați că eu sunt de a conecta nu numai eu, ci s1. Sunt conectarea i și s1. Și apoi aici, eu sunt minus 1, care este aceeași ca și înainte, dar s2. Cu alte cuvinte, vreau cuvânt în limba engleză pentru a schimba pe baza pe această logică. Acum, există deja unele probleme în acest cod. Ceea ce este rupt deja de poarta aici? Da? PUBLICUL: [neauzit]. David J. MALAN: Exact. Așa că am încălcat deja lecția de aplicare. Așa că m-am declarat S1 și S2, dar am făcut-o în interiorul acolade, ceea ce înseamnă Da, acest cod va funcționa până până la linia 42, dar de indata ce l-am lovit linia 43, ghici ce nu mai există? Ei bine, ghici ce e nu mai este în sfera de aplicare - nici S1 sau S2. Așa că trebuie să repar asta. Așa că lasă-mă să ștergeți declarațiile. Și voi lăsa nume de variabile și ștergeți această evaluare aici și ștergeți această aici. Și în ce ar trebui să mă declar foarte mult de aceste lucruri? PUBLICUL: [neauzit]. David J. MALAN: Da, așa, probabil, chiar aici, 33-ISH. Deci, s1 șir și apoi șirul s2. Și se pare, eu pot face asta. Daca te declararea două variabile de același tip, de fapt, puteți folosi doar o virgulă și de a face că, în C. Toate Bine, așa că acum am două variabile - S1 și S2. Sunt atribuindu-le valori în aceste condiții de aici, sau aici. Și apoi eu le folosesc de mai jos. Cât de bine este acest lucru acum va merge? Ei bine, e încă un pic buggy, dar hai sa vedem cel puțin cat de departe am ajuns. Așa că lasă-mă să mergeți mai departe și să facă beer3. Este aceasta beer3? Da, acest lucru este beer3. Și acum să-mi merge mai departe și a alerga beer3. 399 99. Ne putem sări peste, probabil, cele mai multe dintre ele. Și aici, uita-te la asta. "O sticlă de bere pe perete, o sticla de bere, ia unul în jos, să-l dați în jurul valorii de, 0 sticle de bere pe perete. " Dar am atrage atenția asupra numai jumătate din soluție. Un fel de greșit aici. Deci se pare că în cazurile de colt apar atunci când i este egal cu ceea ce două valori? PUBLICUL: 2, 1. David J. MALAN: 2 și 1. Nu e 1 si nu 1. E într-adevăr doar aceste ultimele două strofe ale acestui cântec. Deci, ce am în loc doriți să faceți? Asa ca am par să fi prins cazul în care, dacă i este == la 1, apoi primul cuvânt este "sticla", dar al doilea cuvânt este "sticle". Dar aici, vreau să schimbe acest lucru să fie == 2. Și dacă acesta este cazul, ce vreau eu primul cuvânt să fie? PUBLICUL: "Sticle". David J. MALAN: "Sticle", astfel încât pentru două sticle. Și apoi aici, acest cuvânt ar trebui să fie - PUBLICUL: "Sticlă". David J. MALAN: "Bottle", singular. În regulă, hai să zoom out, du-te înapoi aici, re-rulați make, Re-run beer3, de tip 99 din nou. Bine, "Segmentation fault (core fac obiectul unui dumping)." Ce am făcut greșit? PUBLICUL: Nu aveți o valoare de [neauzit]. David J. MALAN: Ah, excelent punct de. În regulă, deci ce sa întâmplat aici? Deci eroare de segmentare, de fapt, și ne vom vedea acest lucru destul de câteva ori în viitor, în mod deliberat. Dar pentru acum, ceea ce înseamnă de fapt? O eroare de segmentare aproape întotdeauna înseamnă că aveți cumva a încercat să acceseze memoria, RAM în calculator, care nu este în proprietatea, că nu ați cerut de fapt, sistemul de operare pentru. Deci, în acest caz, observa ceea ce am făcut, ceea ce este viciate în logica mea. Am alocat S1 și S2 o valoare dacă i este egal cu 1. Am făcut, de asemenea, că, dacă i este egal cu 2. Dar nu am făcut-o în număr infinit de alte Posibilitățile - în special, 3 sau 4 sau dot, dot, dot, 99. Deci, un remediu pentru acest lucru ar putea fi doar hai să avea o condiție de altcineva. Și lasă-mă să merg aici și să spunem s1 este egal cu - ceea ce ar trebui să fie aici? PUBLICUL: [neauzit]. David J. MALAN: "Sticle", deoarece, în caz comun, e doar același lucru. Deci, este egală cu oferta, citatul, "sticle". Deci, pentru plural sticle, iar apoi aici, pentru sticle plural. Bine, deci acum să mă întorc la fereastră terminalul meu, recompilați, se re-rula. 99. Uau. Și hai să facem o verificare rapidă bun-simț. Punct de vedere tehnic, am dori să citească toate acestea pentru a se asigura sunt corecte, dar să ne uităm la cel puțin vinovați cunoscute. 3 sticle, 2 sticle, 2 sticle, 1 flacon, 1 flacon, 0 sticle. Se pare că am cel puțin, fixată pentru acum. Dar captura aici este că ceea ce o mizerie îngrozitoare Dumnezeu, asta este doar pentru a rezolva o prostie de un caracter gramaticale detalii. Deci, există un fel de motiv pentru care m-am tăiat acest colț mai devreme, pentru că e doar enervant complet pentru a avea la scrie acest cod de mult. Dar se pare că există metode ușor mai elegante ale exprima exact același lucru. Și putem face acest lucru, după cum urmează. Lasă-mă lăsa asta pe ecran pentru un moment și introducă ceva cunoscut ca un operator de ternar. Aceasta este un fel de una-liner care a vrut doar să ne facem trăiește un pic mai sexy, așa cum a promis. Și am de gând să fac asta, după cum urmează. Dă-mi un șir numit s1, și lasă-mă să atribui, după cum urmează. (I == 1)? "Bottle", în caz contrar "sticle". String s2 devine (i == 2)? "Bottle", în caz contrar "sticle". Deci, ce este atunci diferența aici? Aceste două linii de cod, eu susțin, pot înlocuiască toată mizeria asta. Așa că îl numesc o mizerie, doar pentru că un fel de freacă mine mod greșit că e atât de multe linii de cod. Nu este greșit. Nu e rău de proiectare. Place, acest lucru este perfect corectă și foarte bine. Dar devine plictisitor de codificare, dacă aveți de a vă exprima astfel la naiba specific din nou și din nou și din nou, cu un simplu scenariu de genul asta. Deci, C are unele comenzi rapide, cum ar fi acest lucru. Deci, în esență, spune aceasta declară un șir s1 numit și atribui fie această valoare sau în cazul în care această valoare i este == - Îmi pare rău, ar trebui să spun asta mai clar. Declare o variabilă s1, aloca această valoare în cazul în care acest lucru este adevărat. În caz contrar, se atribuie această valoare. Deci, cu alte cuvinte, aceasta este un fel de cale de o linie de spun altceva, dar dacă faci o misiune de-a lungul drum. Deci, în cazul în care i este 1, atunci du-te mai departe și numesc acest "sticla". Și atunci acest altceva, îl numesc "sticle". Între timp, s2, al doilea cuvânt de care avem nevoie pentru a defini, dacă i este egal cu 2, vă vom setat s2 la "sticla". În caz contrar, setați-l la "sticle". Și ce aceasta înseamnă acum este ca eu pot trece prin acest lucru și a șterge toate aceste linii de cod. Și când spun, oarecum ridicol, faptul că acest lucru este acum sexy, e mai sexy în fel de sens stilistic. Faptul că funcțional, acest cod este, de fapt de gând să face exact același lucru. Și chiar dacă s-ar putea părea un pic criptic la prima ochire, pentru că nu ne-am mai văzut această construcție înainte, aș susțin că este în cele din urmă va fi atât de mult mai mult ușor de citit și atât de mult mai ușor pentru noi, oamenii, pentru a sorta de înțeles, pentru că acum puteți citi doar Codul de toate pe o singură linie. E încă similară în spirit cu o în cazul în care, în cazul în care acest lucru este Stare și apoi aceasta este ceea ce este în interiorul și în cazul în care acest este ceea ce este în interiorul altceva. Dar putem face acest lucru doar mult mai elegant. Și dacă mă duc acum la terminalul meu, care a eliminat toate a acestor linii și le-a înlocuit cu doar cei doi, recompilare, re-conduse de sticle de bere cu 99, observați că mi gramatica este, de fapt, încă mai corect. Deci, din nou, pentru a începe ceva. 2 sticle de bere, 1 sticlă de bere. Arata bine. Da. Deci nu avem o soluție mult mai succint. Deci aceasta, de asemenea, cum să obțineți mai mult confortabil cu C nu, neapărat cu PSET prima sau chiar două, dar dau seama că aceste concepte ne poate permite să facă lucruri vreodată mai elegant. Acum, hai sa facem un lucru aici. Lasă-mă să mergeți mai departe și să se deschidă return1.c. Acum, hai să începem să rezolve o altă problemă într-un mod care ne permite să scrie cod mai sofisticate. Deci, aici e un program simplu pic, al cărei scop în viață este de a incrementa valori. Și, de fapt, să ia un pas înapoi. Lasă-mă să fac asta manual. Lasă-mă să fac și includ int main (void). Și lasă-mă să numim această increment.c. Și ce vreau să fac? Am de gând să merg mai departe și spune ceva de genul - vom apela numerele de aceeași - x int. Deci x int primește 2; x printf este% d, noua linie, x. Deci, eu sunt tastarea rapidă, dar un fel de lucruri familiare acum. Apoi, am de gând să fac x + +. Apoi, am de gând să imprima că aceeași propoziție din nou. Și apoi am de gând să se întoarcă 0 doar pentru a iesi din program. În regulă, astfel încât acesta este un program care un număr de pași. E primul gând să inițializeze ceva la 2, iar apoi e O să-l incrementa și imprimați-l din nou. Deci haideți să rulați creștere, programul incredibil de simplu. Dar să presupunem acum că vreau să cub valoarea, deci nu oarecum arbitrară ceva. Și eu de fapt vreau să fac x devine cub de ea. Asa ca am putea folosi ceea ce se numește funcția pow, dar eu nu fac într-adevăr știu în cazul în care este încă. Așa că am de gând să fac asta felul de modă veche. x ori x ori aceasta este egală de x ori x. Deci, eu sunt cubaj valoarea, înmulțind-o din nou de la sine și din nou și din nou, astfel încât să putem obține puterea din 3 în acest caz. Așa că acum am numerele trebuie să tipărească ar trebui să fie, după cum vom vedea aici - face creștere, așa că e de fapt, nu incrementa cu adevărat mai, dar vom lăsa în pace numele - 2 și apoi 8. Acum, avem începuturile o oportunitate pentru rafinament aici, prin care acest lucru cubaj de multiplicare a unui număr de de la sine, în sine, de la sine se simte ca acest lucru ar putea fi doar util pentru a avea ca funcție, la fel ca cineva a decis de ani în urmă - știți, un fel de util în cazul în care unul dintre noi se aseaza și scrie printf, astfel încât restul lumii poate folosi, de ce nu stai jos și scrie o funcție numită cub care face acest lucru cubaj pentru noi, asa ca nu trebuie sa manual pună în aplicare noțiunea de cubaj valori aici? Deci, un exemplu simplu, dar hai să mergem mai departe și de a folosi aceasta este ca o posibilitatea de a scrie funcția noastră. Deci pana acum, am folosit doar principală, și am folosit alte Funcțiile oamenilor, dar nu ne-am scris propria noastră. Deci, aici vom merge. Am de gând să merg mai departe și scrie o funcție numită cub. Și am de gând să îl ia o intrare. Deci, intrarea sa este de gând să fie un număr întreg. Și ce-i așa de gând să faci? O să declare iesire int = de intrare ori de intrare ori de intrare. Și apoi o să se întoarcă că producția. Și apoi trebuie să fie specific acum. Această funcție este de gând să se întoarcă un int. Deci, aici, atunci este modul în care te-ai scrie propriile funcții. Tu decizi ce e numele dvs. de Funcția va fi. Și, în general, ceva explicativ este bun, așa că voi numesc cub. Apoi, va trebui să specificați ce se va întoarce, ceea ce este producția sa va fi. Și nu avem opțiunile multe încă. Int, char, float, bool, string. Pentru moment, am de gând să stai cu un int, pentru că eu o vreau pentru a returna un număr întreg. Apoi, va trebui să specificați ce intrările sale, dacă există, sunt. Și dacă cub are un argument, ia ceva între paranteze, trebuie să dai ca argument un nume, astfel încât puteți apela acest ceva ca esti de punere în aplicare sau de scris această funcție, iar tu trebuie să-i dea un tip, care în acest cazul va fi int. Deci, pe scurt, cub este o funcție care are un număr întreg ca intrare și returnează un întreg ca ieșire. Deci, ce face cu asta de intrare? Ei bine, în linia 14, am declara o ieșire variabilă numită, și am atribuie valoarea, de intrare de intrare ori de ori de intrare. Și apoi mă voi întoarce de ieșire. Deci, cum mă folosesc acest lucru, atunci? Ce pot modifica aceste caractere subliniate pe linia 7 să fie, nu crezi? PUBLICUL: [neauzit]. David J. MALAN: Da, așa cub de x. Deci x este o variabilă, ceea ce înseamnă că are o anumită valoare. Din fericire, e de tip întreg. Si pentru ca x este un int, înseamnă că pot să-l trece în cub. Și chiar dacă am imperative valoarea lui x cu valoarea de x cub, așa cum a fost cazul până acum, de fiecare dată când au semnul egal și de o linie de cod, chestii pe dreapta este executat și apoi se atribuie Valoarea pe stânga. Deci, ordinea operațiunilor este ca ne-ar spera. Deci, face acest lucru? Ei bine, lasă-mă să merg în jos aici. Lasă-mă să deschid fereastra mea terminalului. Lasă-mă să fac creștere, Enter. "Declarație implicită de" cub ", funcția este nul în C99 "Ca o paranteza., C99 se referă la limbajul C așa cum a fost definite în 1999, care a fost o actualizare de peste versiunea de la 1989, care este o actualizare de peste original. Deci, asta e tot ceea ce înseamnă. Deci, ce înseamnă că "declarația implicită "cub" funcția este invalid "E chiar aici?. E chiar acolo, în linia 12. PUBLICUL: [neauzit]. David J. MALAN: Ce e asta? PUBLICUL: Nu e înainte. David J. MALAN: Nu e înainte. Deci, asta e chestia. C este un fel de prost, sau compilatoare C sunt un fel de prost. Ei într-adevăr face doar ceea ce-ți spun ei să facă. Și ei, în special, citit numai de sus în jos codul, la stânga la dreapta. Deci, dacă compilator, zăngănit, este citit codul, linia 1, acesta seama cum să facă acest lucru. Oh, aici vine principal. Bine, lasă-mă să merg mai departe și să declare o variabila x. Lasă-mă să imprimați ceva. Linia 7, ceea ce naiba e cubul? Nu e declarate în stdio.h. Ea nu vine cu C. Nu am nici o idee ce să fac. Și așa zăngănit doar bails și se închide cu acest mesaj de eroare. Astfel încât să putem rezolva acest lucru în câteva moduri. Putem învăța ceea ce face să răsune cub este de doar în cazul în care mutarea declarație este. Asa ca am taiat si lipit-l deasupra principal. Acum dau seama că doar pentru că nu mai este principalul în primul rând, e încă executate în mod implicit. Principal este principal. E numele implicit funcția. Nu contează în cazul în care aceasta este într-un fișier. Dar cel puțin acum zăngănit a văzut cub înainte de a-l folosesc. Deci, să vedem dacă zăngănit este mai fericit acum. Asigurați-creștere, aceasta a compila acest moment. Lasă-mă să fugi creștere. Și într-adevăr, se pare a fi de lucru. Acum, puteți veni cu scenarii în cele din urmă în cazul în care nu este posibil să se pună fiecare funcție mai presus de orice altă funcție. Te vei blocat în această buclă infinită în realitate, în cazul în care acest tip vrea sa fie aici, dar acest lucru Tipul trebuie să fie acolo. Așa că nu funcționează întotdeauna. Deci din fericire, C are o soluție mai elegantă. Am de gând să pun asta înapoi în cazul în care acesta a fost, pur și simplu pentru că am preferă, ca o chestiune de principiu, că principalul fi mereu în partea de sus, pentru că e doar frumos pentru a vedea ce acest program face în mod implicit. Și ce am de gând să fac aici este să declare ceea ce se numește un prototip. Am de gând să re-declare funcția mea cub de literalmente copierea și lipirea. De fapt, asta nu e literalmente. Deci, literalmente copierea și lipirea linia 15 deasupra liniei 6. Nu contează ce se termină această linie de pe. Se întâmplă să fie pe linia 4. Dar aceasta nu trebuie să fie înainte de principal. Dar observați diferența. Linia 4 se termină cu punct și virgulă, ceea ce înseamnă hei, Zăngănit, luați cuvântul meu pentru asta că există o funcție numit cub care ia un int și returnează un int. Dar eu nu sunt o să-ți spun ce este încă. Doar știi că îți promit să-ți spun în cele din urmă. Și într-adevăr, acum e în regulă că acest lucru este mai jos. Deci, aceasta este, în general, mai bine, pentru că atunci, la partea de sus a fișierul, aveți posibilitatea să zornăie doar off, rapidă foc, o linie fiecare, ceea ce numele funcțiilor sunt, ceea ce lor intrări sunt, ce ieșirile lor sunt. Și pentru a fi mai clar, înseamnă, în general, de intrare sau de argument parametru, sinonime. De ieșire înseamnă valoarea returnata, ceea ce face mâna înapoi la mine. Deci, în acest caz aici, cubul a fost declarată în partea de sus, dar definite, altfel cunoscut sub numele de pus în aplicare, în partea de jos. Deci, acum să ne întoarcem aici și re-rula acest lucru. Asa ca lasa-ma acum mergeți mai departe și re-rulați make, re-rula increment. Și acum se pare a fi de lucru bine. Deci, acum putem merge mai departe și a factorului de afară ceva de genul bere exemplu în această versiune a patra. Așa că lasă-mă să defilați în jos aici. Și observați că am luat un fel de această lecție la inimă chiar acum. Faptul că am fost cântat aceeași strofă din nou și din nou și din nou, linie de corul același cântec, pâslă place de ce nu am factor de asta într-o funcție? Și într-adevăr, aceasta ar trebui să fie unul dintre motivațiile. Pe lângă faptul că altcineva în lume ar putea dori să utilizați o funcție cub - asta e un motiv bun să țină ceva afară și scrie mesajul Dvs. personalizat funcție - în cazul în care există o bucată de cod in programul tau, care te face sens conceptual, pe care le cam vrea să dea un Nume - ca și în acest caz, cor - atunci se poate scrie în mod similar că, o funcție separată. Nu trebuie să scrie totul în principal în cazul în care doar se simte curat să-l separa si dau un nume. Deci, în acest caz aici, observați că am un comentariu deasupra această funcție că doar cântă despre Numerele specificate de sticle. Observați aici că nu am nevoie să numesc aceste lucruri de intrare și ieșire. De fapt, de data asta i-am sunat doar b meu de intrare pentru sticla. Și observați aici, anulate sugerează ce? Această cor - PUBLICUL: Nu se întoarcă. David J. MALAN: nu returnează o valoare. Și într-adevăr, funcțiile nu trebuie să se întoarcă valori. Ei doar se poate face ceva. Ei pot avea ceea ce se numeste efecte adverse, care, în acest caz este doar o grămadă de imprimare pe ecran. Deci, observăm că acest cod aici, am literalmente doar la furat exemplul anterior. Singura diferență este în loc de a folosi i ca-mi variabilă, eu sunt, folosind acum B ca variabilă meu. Deci, am b aici, am b aici, am b minus 1 aici. Dar codul este exact la fel. Dar, doar pentru a vă arăta acum cum putem folosi acest lucru, permiteți-mi să merg mai departe și de fapt schimba acest lucru să fie un pentru buclă. pentru (int i = n; i> n; i -). Asa ca am furat asta de la exemplul nostru anterior. Anterior, e în linia 37, care mi-ar fi început cântând acest cântec enervant. Dar, în loc, Mă duc să sun acum cor de i.. Adoptată. Deci, acum, în fiecare iterație a buclei acest, eu numesc acest alt funcției, cor, care sa întâmplat să scriu. Ea nu a fost scrisă de altcineva de ani în urmă. Dar cor, între timp, foloseste printf pentru a imprima aceste patru linii. Dar faptul că te-am sunat din nou și din nou cor într-o buclă înseamnă că am de gând pentru a obține, la sfârșitul foarte, cântec exact același ca și până acum am. Deci, pe scurt, acum, dacă mă uit înapoi la codul meu, chiar dacă aceasta este echivalent funcțional, observăm că e incepand pentru a obține chiar mai ușor de citit. Nu știu exact cum GetInt este pusă în aplicare. Sincer, nu știu cum refrenul este pus în aplicare. Dar nu contează pentru mine. Nu-mi pasă, pentru că acum pot sorta a, ca om, citește aceasta de jos, de sus în. Și pentru că funcțiile sunt denumite în funcție de ceea ce au fac, codul meu este din ce în ce poate fi citit. Și, după cum programele noastre obține mult mai complex - până la sfârșitul semestrului, veți fi scris sute de linii de cod în limbaje cum ar fi PHP si JavaScript și cum ar fi - veți găsi că este mult mai ușor decât de a ține evidența ce ai făcut. Și atunci când veți începe colaborarea cu prietenii sau parteneri sau colegi, vei fi capabil să scrie mult mai mult programe masive de plecare pentru a exercita aceste bază constructii blocuri. Deci, cu care a spus, de ce nu o numim o zi? Si te vom vedea miercuri. [Aplauze]