ROB: În regulă. Bine ați venit la prima secțiune. Sunt Rob. JOSEPH: Eu sunt Iosif. ROB: Deci, vom arunca cu capul dreapta inch Primul lucru pentru a vorbi despre este Appliance. Deci sperăm că cele mai multe dintre voi au descărcat-o deja. Dar puteți vedea instrucțiunile la cs50.net/appliance. Oh, Doamne, acum eu sunt constient de sine. Am încă o aud. JOSEPH: Wow, se pare ca e dezorientat. ROB: Deci, unii oameni au fost cu probleme cu ea, asa ca nu asteptati pana în ultimul moment a problemei setat la încercați și de a rezolva aparatul și afla că nu este de lucru. JOSEPH: Si daca ceva nu merge și aveți nevoie de ajutor, poti sa te duci la cs50.net/discussion unde am au un forum unde pot posta întrebările dumneavoastră. Și vom ajunge la ele în cele din urmă. ROB: În regulă. Deci, aceasta este ceea ce Appliance arata ca. Din nou, e doar un complet separat sistem de operare care rulează în indiferent de sistemul de operare se rulează pe laptop-ul. Și principalele lucruri pe care va folosi sunt gedit. Deci sperăm că acest lucru are deja deveni un loc familiar. Terminalul. Și puteți rula, de asemenea, Chrome în cadrul aparatului. Au fost un cuplu de oameni care au raportat internet nu lucrează în aparatul. Iar unii dintre ei chiar și-au asumat că nu ar trebui să fie internet în aparat. Dar, da, acolo se presupune pentru a fi pe internet. Eu voi spune chiar acum, dar ea nu are înseamnă cu adevărat ceva. În cazul în care internetul nu este de lucru, aceasta este ceea ce aveți tendința de a avea nevoie de pentru a rula pentru a remedia problema. Dacă aveți probleme de internet, nu face amintiți-vă că, chiar posta pe Discutați, și vom spune, că a alerga. Dar pe internet ar trebui să fie de lucru. Deci, singurul lucru - Da, nimic altceva este cu adevărat relevant. Dar am vrut doar să subliniez faptul că - a se vedea în acest colțul dreapta-jos. Deci, fiecare dintre aparatele dvs. ar trebui să au o adresă IP. Și mai târziu în semestrul, acest IP adresă va deveni mai relevant atunci când lucrați pe web p-set, pentru că veți avea posibilitatea de a accesa site-ul sunteți de lucru pe la dvs. Chrome locale prin utilizarea acestei adrese IP. Dar ce-mi place sa folosesc adresa IP pentru - și tu nu trebuie să faci asta, eu Vreau doar să-l subliniez - este aici. Deci, aceasta este o fereastră de terminal de pe Mac-ul meu, acest lucru nu este în Aparat la toate. Si poti sa te uiti la ceea ce această comandă nu. Dar am de gând să SSH direct la Appliance mea. Nu știu ce este de anchetă. JOSEPH: 168 - 168.224.1.0. ROB: Deci, odată ce am terminat cu acest lucru, va autentifica Acum, în esență, aceasta este identică cu o fereastră de terminal în Appliance mea. Așa că am destul de mult nu a lucrat de fapt, din cadrul Appliance în sine. Eu doar l întotdeauna de funcționare în fundal minimizat și SSHed în ea. Problema cu acest lucru este nu vi se întâmplă pentru a putea folosi cu ușurință gedit direct de la acest lucru. Dar dacă vrei să fii un adevărat rece hacker, atunci ar trebui sa folosit de o linie de comandă editor de text, oricum. Deci, Vim și Emacs și Nano, toate acestea sunt diferite alternative. Nano tinde să fie cel mai ușor. Și cred că nu are nici o sintaxă evidențierea. Oh, nu, totul face. Astfel, puteți folosi Nano, deoarece că unul e destul de ușor. Veți vedea toate aceste comenzi în partea de jos. Acest simbol morcov mic. Dacă nu ați văzut-o înainte, veți probabil se vedea o mulțime acum. Aceasta înseamnă, în general, morcovul de control, cum ar fi partea de jos-stânga a tastaturii caracter de control. Deci, aici îmi spune aici - oh, nu este tăiat, dacă am zoom inch Deci control, X este modul Am de gând să ieși. Și se spune că poate lovi Y pentru Da, de economisire, N pentru Nu. Deci, asta e Nano. Vim și Emacs tind să fie puțin mai complicată și copleșitoare. Dar aveți posibilitatea să te obișnuiești cu el, și apoi să-ți placă. Deci, asta e. JOSEPH: Nu e nevoie să faci asta. ROB: Da. Sunteți liber să utilizeze gedit pentru restul semestrului. Astfel încât orice întrebări legate de aparat? Sau aveți vreo idee cu privire la ce altceva trebuie să fie vorbit despre despre aparat? Da. SPEAKER 1: Când SSHed în ta lucru, a fost Crimson parola? ROB: Da. Parola pentru destul de mult tot ceea ce în aparat se întâmplă pentru a fi Crimson. SPEAKER 2: Instalarea ca un IDE reală pe aparatul, va funcționa? ROB: Îmi imaginez Eclipse are un Versiune Fedora, caz în care, da, poți face asta. Probabil că nu e într-adevăr merită. SPEAKER 2: OK. Deci, este, probabil, mai ușor dacă am vrut să folosesc Eclipse, trebuie doar să utilizați nativ și apoi încărcați până la - ROB: Oh, care este, de asemenea, probabil, mai ușor. Dar puteți să-l de lucru în cadrul aparatului. JOSEPH: Și pentru aparatul de fotografiat, întrebarea a fost, se poate instala un alt IDE interiorul aparatului? ROB: Eclipse a fi o exemplu de un IDE. Orice alte întrebări Appliance? Bine. Deci, vom trece acum la linia de comandă lucruri legate de interfață, așa CLI. Și din nou, eu sunt doar de gând să lucreze în aici, pentru că aceasta este identică cu de lucru într-o fereastră terminal în cadrul aparatului. Cum că font căutați? Este suficient de mare? Bine. Deci, există o mulțime de comenzi care tu ar trebui sa destul de folosit pentru de-a lungul semestrului. Mare pentru doi navigarea sunt ls, lista fișierele din acest director; și cd, așa schimba directorul. Deci, eu pot schimba pe desktop și apoi un model foarte comun este cd la un director și imediat ls ceea ce este în directorul. Oamenii, de asemenea, uneori, nu-și dau seama că finalizarea Tab este un lucru. Cd așa cum ar fi, VH, iar apoi m-am lovit Tab. Aproape niciodată nu am tip de întregul lucru. Și apoi, dacă am ține lovind Tab din nou, acesta va automat începe listarea pentru mine. Deci, eu pot cd vhosts, local host. Și care este doar de gând să - în cazul în care nu ați auzit termenul de înainte, directorul este doar un alt cuvânt pentru dosar. Deci, acum, dacă vedeți - Să aducem că în partea de sus. Deci, acum, dacă vedeți în paranteze, te a se vedea mic tilda, slash, vhost, slash, local host. Deci tilda, care se referă la directorul meu acasă. Este un director esti în când SSH inch Este directorul sunteți în când vă deschideți un terminal. Este cazul în care începe. Și așa că eu sunt în interiorul directorul meu home, și eu sunt în interiorul a vhost director în interiorul directorului casa mea. Și atunci eu sunt în interiorul de la nivel local gazdă director interiorul asta. Astfel încât alte lucruri utile cu cd - sau bine, în general, așa dot întotdeauna se referă la directorul curent. Cd, punct este o comandă destul de lipsit de valoare. Dar care se schimbă la directorul curent. O una mai util din punct de vedere cd este punct, punct, care este du-te în sus un director. Și rețineți că acestea - Vreau să spun alias-uri, dar acestea simboluri, punct, și dot, dot, cei de muncă pentru destul de mult orice comanda esti O să fie de gândire de funcționare. Deci, cum ar fi CD-ul este, probabil, în cazul în care veți fi folosind cele mai multe, dar acestea nu sunt lucruri pe care doar cd înțelege. Este destul de mult ceva întregul linie de comandă înțelege. O mulțime de programe de înțeles punct și dot, dot. Astfel încât celelalte utile - cd, bord. Astfel că este de gând să-mi aducă la Ultima director care am fost inch Așa că, uneori, voi face ceva de genul, oh, eu lucrez aici. Și văd o eroare cu ceva, și Mă duc să-l investigheze de a merge la unele directorul aleatoriu undeva. Și nu știu dacă-l voi lasă-mă acolo. Acesta va. Deci eu fac ce vreau eu în acest director. Bla, bla, bla, bla, bla. Și am fost ca, bine, vreau pentru a merge înapoi de unde am fost. cd, liniuță, și mă aduce înapoi. Așa că am de gând să arunce o mulțime dintre acestea la tine azi. Nu mă aștept să memoreze toate. Este un fel de doar știu că ele există. Si apoi, mai târziu, pe când esti ca, hmm, vreau să mă întorc la director care am fost doar la, oh, așteptați, există ceva de genul asta. Nu trebuie doar să tastați Întreg directorul nou. JOSEPH: Și în cele din urmă va fi doar le folosesc de peste si peste din nou, și acesta va deveni memorie musculare. ROB: Da. Deci, cum am spus mai înainte, că tilda este directorul tau de casa. Deci pot cd, tilda. Dar eu nici măcar nu trebuie să face că, dacă eu doar - Voi reveni la directorul astfel nu este un exemplu rost. Dar dacă am face cd, care este, de asemenea, același ca, du-te la directorul meu acasă. Eu fac de comandă, K. JOSEPH: Puteți introduce, de asemenea, clar, cuvânt, și ar trebui să-l clar. ROB: Și cred că, de asemenea, de control, L, de asemenea, o face. Deci, o mulțime de moduri diferite. Cred că există unele diferențe în cazul în care clar și control, L va fi doar într-adevăr se împinge în partea de sus și Eu pot derula în continuare înapoi. Comandă, K distruge literalmente tot, și tu nu se poate derula în sus. Cel puțin, asta e cum funcționează în iTerm2. Nu știu cât de alte lucruri - oh. Cu SSHing, așa că, dacă sunteți pe Windows, ai de gând să aibă de a descărca PuTTY în scopul de a SSH, deoarece Windows nu are au ca un instrument de built-in SSH. De la Mac-uri, puteți doar SSH direct de la o fereastră terminal. OK. Întrebări? Cu E, așa ceva pentru a obține utilizate pentru a cu cele mai multe dintre aceste comenzi este - bine, voi face doar unul. Ls, linie, l. Deci linie, l este ceea ce vom pentru a apela un steag pentru ls. Și o mulțime de aceste comenzi au steaguri pe care le puteți trece la ei. Deci, în acest caz, linie, l este un steag care se spune să-mi dea un complet lista cu toate informațiile din aceste fișiere. Asa ca am vedea aici că desktop a fost modificat la 30 iulie, la 12:54. Download-uri a fost modificat la 06 septembrie. Acestea sunt dimensiunea actuală și bytes din aceste directoare. Nu trebuie să înțeleagă toate acestea. Chestia asta pe partea stângă, aceste lui drwx, care vor deveni mult mai relevantă mai târziu, atunci când aveți de a face cu - care are de a face cu care are permisiuni să se uite la aceste fișiere. Și așa că, dacă nu a fost singurul utilizator pe acest computer, v-ar putea să să zicem, OK, eu ar trebui să fie singurul a permis să se uite la acest fișier sau sunt va permite toată lumea să se uite la acest dosar. Deci, cineva de pe computerul meu se pot uita la acest fișier. Nici măcar nu știu ce acest lucru - ceea ce face acest lucru? JOSEPH: Eu nu sunt destul de sigur, de fapt. ROB: Nu am idee. JOSEPH: Dar dacă nu știți, există o comandă de ajutor pe care le puteți utiliza să-ți spun ce înseamnă puterea. Și dacă tastați în om inainte de comanda - așa M-A-N. ROB: Man. Deci, omul este un alt unul care este foarte util. Și om, ls. Deci, paginile man, ei au atât comenzile pe care ai de gând să fie utilizând la linia de comandă, și au, de asemenea, funcții care vor fi relevante cu C. Astfel, puteți omul - și am ignorat 3. Dar omul 3 printf va aduce versiunii C de printf. Dar dacă am face om printf, aceasta este va aduce printf comandă care se întâmplă de la linia de comandă. Deci omul, ls. Paginile de manual pot fi destul de copleșitoare. Aici, deși, veți vedea această listare de toate aceste steaguri care ls înțelege. Deci, dacă am merge la bord, l, și - Mă duc să arunc la tine. Dar, în scopul de a căuta, vrei a lovit în primul rând la întrebarea marca sau butonul de slash. Așa slash. Și atunci pot căuta pentru ce vreau eu. Așa că am de gând să taie de bord, l. Și acolo a fost. Asa ca foloseste un format de listare lung. Asta nu ajuta-mi dau seama ce coloana special a însemnat, dar am asuma undeva în aici s-ar explica faptul că. Deci, utilizarea paginile de manual pentru orice comanda pe care nu le înțelegeți imediat. Sunt destul de sigur că poți chiar om, omule. O interfață de on-line manuale de referință. Oh, o ultima care-i poate ușor ls relevante, linie, o. Deci, observa dacă am face ls, Primesc aceste cinci dosare. Dacă fac ls, zdrobi, o, eu a obține o mult mai multe fișiere. Deci, lucrul în comun între toate acestea fișiere noi este punctul în prealabil. Deci, convenția este că un fișier care începe cu un punct este ascuns. Deci, nu doriți să vedeți că fișier, Nu vreau să-l aibă pui cu listarea dvs. director. Este doar atunci când vă întreb în mod explicit, în regulă, ls, linie, o, arată-mi. A standuri pentru toate fișierele, inclusiv cele ascunse. Deci, alte comenzi. Oh, întrebări la acel moment? Da. SPEAKER 3: Când faci ls, o, ce-i punct, punctul? ROB: Oh. Deci, asta este ceea ce am vorbit despre. Este același lucru în cazul în care Pot place cd, punct, punct. Deci, punct de vedere tehnic, punct și punct, punct sunt fișiere care există în fiecare directorul unde fișierul punct se referă la directorul curent. Deci, dacă am cd, punct, eu sunt doar de gând pentru a rămâne în directorul. Și dot, dot se referă întotdeauna la anterior directorul de un nivel mai sus. Deci, dacă mă duc în busteni si LS, bord, al, Voi vedea punct, punct. cd la dot, dot ma aduce la directorul anterior. Da. OK. Deci, un alt foarte important comandă este rm. Deci, asta e ceea ce vom de a utiliza pentru a elimina. Și lasă-mă de fapt face o altă comandă întâi. Așa mkdir. Mkdir este modul în care se poate crea directoare. Și voi crea un director temporar și du-te în acel director temporar. Și, cum era de asteptat, e gol. Dar dacă ls I, linie, o, eu încă mai au dot și dot, dot, deoarece punct se referă la directorul curent. Și punct, punct se referă la directorul anterior. Iar cei care vor exista întotdeauna, indiferent de directorul în care vă aflați Și aceasta este o cu totul inutil comandă, dar atinge. Eu doar l utilizați, pentru că e o modalitate ușoară de a crea fișiere. Deci atinge o, atinge b, c atinge este doar va crea trei fișiere numit-o, b și c, care sunt complet goale. Astfel încât punctul de a-mi crea cele din Primul loc este doar pentru ca RM este cum le putem elimina. Deci rm, o. O să mă întrebi pe mine, scoateți regulat gol fișier o? Și apoi voi spune da. Deci, dacă eu știu sigur că vreau să șterge acel fișier, fără a fi nevoie să fie vi se solicită, scoateți fișier gol regulat?, apoi rm, liniuță, F va fi steag care spune, forța elimină, fără chiar ma determinat, oh, esti Sigur doriți să ștergeți fișierul? Da, sunt sigur. Deci rm, liniuță, fb vor doar face fără a cere. Deci, haideți să facă unele mai multe directoare. mkdir, TMP2, CD, TMP2, atinge o, atingeți b. OK. Deci, acum vreau să eliminați TMP2 ca un director. TMP2 așa rm. Nu se poate elimina TMP2, acesta este un director. Deci, problema aici este că RM nu are funcționeze imediat pe directoare. Este menit doar pentru fișiere, cum ar fi fișiere non-director. Și deci ce putem face aici este rm, bord, r.. Care vine de la recursiv, care ar putea Nu înseamnă nimic pentru tine încă. Dar atunci când vei ajunge la recursivitate, va spun mai mult. Deci rm, bord, r, TMP2 se va recursiv intra în acel director. Astfel coborî în directorul TMP2? Da, să mergem în asta. Nu vrem să eliminați TMP2 / a? Da. Nu vrem să eliminați TMP2 / b? Da. Acum vrem să eliminați TMP2 director? Da. Și astfel acum directorul și tot ceea ce în interiorul din acesta a fost îndepărtat. Există un punct de vedere tehnic rmdir comandă pe care le puteți folosi pentru a elimina directoare, dar ea funcționează doar pe directoare goale oricum. Și pentru a vedea că, hai să face din nou mkdir, TMP2. TMP2, atinge o. OK. Deci, dacă am încerca să eliminați dirtmp2, acesta va spune, directorul nu este gol. Așa că am destul de mult nu folosiți niciodată Eliminare comanda dir oricum, pentru că RM, liniuță, r va lucra pe directoare goale și directoarele non-goale. Și, de asemenea, dacă nu vreau să aibă de a du-te prin faptul că întregul proces de descendent în directorul și îndepărtarea fiecare dosar în parte, rm, bord, rf, TMP2. Și acum a dispărut. Ceva să fie atenți este despre rm, bord, rf. Și-l sperie pe mine să-l chiar de tip, pentru că dacă am accidental lovi Enter sau ceva. Deci rm, bord, rf, tilda ar fi, fără ma determinat, f nu cere mă, se va elimina în mod automat întreaga mea directorul home și totul în ea. Deci, ați putea crede că este un lucru stupid de a face. Și bine, este. Dar se poate întâmpla foarte ușor de accident dacă, să zicem, mi-am dorit pentru a elimina slash mea, director vhost. Și doar în dactilografiere rapid, Eu fac acest lucru accidental. Care va elimina recursiv atât meu directorul home și directorul vhost în acest director special, că doar Nu se întâmplă să existe chiar acum. Dar acest lucru ar elimina încă mea de director întreg acasă. Cel puțin de a nu avea un f, mi-ar cere în primul rând. Și mi-ar fi ca, oh, nu, eu Nu vreau să fac asta. Dar oamenii, slash, inclusiv mi-au tendința de a intra în obiceiul de a întotdeauna rf-ing. Chiar și fișiere obișnuite pe care le pot doar RM, c, am tendința de a doar rm, bord, rf, c. Trebuie doar să fiți atenți atunci când sunteți rf-ing. SPEAKER 4: Ce face C? ROB: C este Vorbesc despre acel fișier C în acest director, care rm, c. JOSEPH: Și mai periculos, dacă utilizați o stea, se referă la tot ceea ce în directorul. Deci, ce am de obicei tendința de a face este de voi du-te într-un director și vreau să eliminați toate fișierele de acolo. Deci rm, bord, rf, stele. ROB: Da. Rm, bord, rf, stele. JOSEPH: Și dacă nu ești atent ceea ce directorul esti in - Eu nu am fost în temp, dar am fost accidental în directorul meu home, atunci voi scoate totul în directorul meu acasă. Și am făcut de fapt că, înainte, și Cred că ați făcut acest lucru înainte de sau Jay a făcut asta înainte. ROB: Am scos accidental - astfel ignora faptul că comanda pentru un pic. JOSEPH: Nu este distractiv. ROB: Deci, în directorul bin slash este o grămadă de fișiere binare în cazul în care nu va mai fi cele familiare, cum ar fi zăngănit. Ei bine, zăngăni și, practic, toate acestea lucruri pe care eu sunt rulează la comanda linie sunt în acest director bin slash. JOSEPH: Ca ls este aici. ROB: Deci dot, slash, ls-ar lista acest director. JOSEPH: Rm este, de asemenea, în acest director. ROB: Am rm accidental, rf-ed bin, care a eliminat orice comanda am putut poate dori vreodată. Pe care apoi am reinstala un aparat nou la acel moment. JOSEPH: Deci, să fie foarte atenți atunci când utilizați această comandă. Audiența: [inaudibil]? ROB: Da. Acesta este, de asemenea, un obicei prost de a intra in. Dacă observați, eu sunt acum - ei bine, nu se poate observa, dar meu de zoom-in, poate poate. Deci, eu sunt acum root @ aparat. Deci, jharvard este utilizatorul vrem să fie întotdeauna folosind. Root este utilizatorul care are permisiunea de de a face absolut nimic. Așa observa atunci când sunt jharvard, dacă am încerca să cd - ceea ce este un director care? Oh, rădăcină este un exemplu bun. Astfel cd, rădăcină. Permission denied. Pentru că dacă ne uităm la această listare - și din nou, nu trebuie să înțelege în totalitate acest lucru. Dar aceste trei linii spun care nu lasa nici un alt utilizator în acest director. Și directorul se întâmplă la fie deținute de root. Deci, faptul că am jharvard și nu unul care nu este rădăcină este permis în acest director, ceea ce înseamnă că sunt de gând pentru a obține permisiunea de a negat atunci când am încercați să cd în el. Așa că atunci când eu sunt rădăcină, am permisiunea de a face absolut orice, inclusiv șterge fișiere esențiale aparatului și distruge întregul lucru. Deci, este un obicei prost de a intra in doar rătăcire în jurul dvs. sistem de operare ca root. Eu o fac oricum. Întrebări? Și eu voi ieși din rădăcină, rămâne ca jharvard. OK. Comenzi mai relevante. Deci, merge înapoi în temp nostru, mv comanda standuri pentru mutare. Puteți muta o. Acum vrem să-i spunem b, așa că acum se numește b. Sau poate ne-o dorim pentru a muta b sus un director. Deci, acum gol acest director a lui. Mă voi întoarce la directorul meu acasă, și vom vedea că b este aici, pentru că directorul acasă a fost un director de la directorul care b au fost inch Există, de asemenea, cp. Astfel cp este copia secțiune super, punct, text. Pot să-l sun e, punct, text. Acum avem amândoi secțiune super, punct, text, și s, punct, text. Aceasta funcționează, de asemenea, pe directoare. I RF-ed-un singur fișier. Așa cp - bine, în primul rând haideți să încercăm cp, tmp, TMP2. Deci, omițând directorul tmp. Atât de asemănătoare cu rm, comportamentul implicit nu este de a lucra pe directoare. Și din nou, similar cu rm, implicit comportament - ei bine, obtinerea-l la locul de muncă cu directoare este o, linie-r departe. Astfel încât copia recursiv temperatura director în TMP2. Și astfel acum avem atât tmp și TMP2, și că nu este util, deoarece tmp a fost gol, în primul rând. TMP2. Acum, haideți să copiați tmp în TMP2. Și vedem că TMP2 are, de asemenea, fișierul o, pentru că directorul și tot în interiorul de care director a fost copiat. Și care poate fi oarecum de ajutor dacă, spune lucrați pe problema set unul - sau de fapt, seturi de probleme mai târziu sunt chiar mai important, pentru că nu există va fi o grămadă de fișiere și lucruri. Dar vrei doar să, pentru un split în al doilea rând, tu esti ca, bine, eu sunt O să încerc ceva diferit. Permiteți-mi doar să copiați întreaga mea pset1 director în pset1 de rezervă, astfel încât, dacă Ajung înșurubare lucrurile, eu pot du-te înapoi în directorul meu de rezervă. Există modalități mai adecvate de versiunilor backup codul dvs., dar aceasta este întotdeauna o modalitate rapidă de a face doar vă că aveți o copie a ceva care esti pe cale de a modifica. Deci ecou este, de asemenea, o comandă unică, care fel de sillily va imprima doar la linie de comandă exact ceea ce ai vrut să ecou. Așa ecou hi. Vom imprima doar hi. Echo salut lume. Vom imprima Hello World. Care vine în utilizare atunci când începe combinarea comenzilor. Și din nou, nu mă aștept să complet înțelege acest lucru încă, dar e ceva pentru a vedea. Și apoi, dacă sunteți cu Google pentru exemple sau iti dai seama ce vrei să faci ceva, ea poate fi de ajutor. Deci, haideți, ca un exemplu, astfel încât ls, linie, l. Deci, aici am vedea de ieșire de ls, bord, l. Și eu spun, OK, vreau să stoca că într-un fișier. Toate din această ieșire de aici, vreau pentru a pune într-un fișier separat. Deci, acest mic mai mare simbol este ceea ce am de gând pentru a apela. Suntem redirecționarea de ieșire într-un fișier. Să numim bla fișier, pentru că asta e ceea ce am tendința să-i spun mereu. Deci, acum vedem că avem o fișier bla chiar aici. Și dacă am deschide, voi vedea că este exact output-ul comenzii că doar am fugit. Și în mod similar, se poate - dacă acest lucru a fost de ieșire într-un fișier, această se obține de intrare de la un fișier. Ce este o comandă pe care I - JOSEPH: Cred că puteți utiliza mai puțin sau mai mult, probabil. ROB: Dar cum despre pur și simplu mai puțin bla? Nu știu. Dacă veniți în acest scenariu, cum ar fi există psets că este util pentru. JOSEPH: Puteți țeavă-l în ecou. Țeavă fișierul în ecou să-l văd. ROB: Este țeavă. JOSEPH: Îmi pare rău. ROB: În regulă. Deci, acest lucru este de ieșire într-un fișier. Aceasta este a obține textul din fișierul și-l predea la program. Și veți vedea, de asemenea, acest tip. Deci, aceasta este un fel de a face ambele simultan. Și, de fapt, voi introduce două noi comenzi doar pentru a face uz de ea. Istoria este o comandă la îndemână, care este doar va imprima o listă de nimic din ce-am alerga vreodată o linie de comandă. Așa că am vedea aici tot ce am fost difuzate tot acest timp. O mulțime de de ls. Și o altă comandă utilă este grep care scopul său este de a căuta peste text, în căutarea de modele, ei bine, în căutarea pentru orice doriți să-l caute. Și astfel o utilizare la îndemână aici este, să zicem ne-o dorim pentru a apuca istoria. Și vreau să se uite pentru comenzile unde I - ceea ce este o un util să se uite pentru? JOSEPH: [inaudibil]? ROB: Sau să ne uităm doar pentru toți atinge, indiferent de motiv. Deci, asta este ceea ce se va arata. Și nu trebuie să complet să înțeleagă că. Dar ideea este aici, istorie dă aceeași ieșire a făcut-o aici în cazul în care se imprimă pe întregul istorie de tot ceea ce am alerga vreodată. Ne sunt apoi trece că - Deci, în loc de imprimare-l pe ecran, ne-o dorim pentru a trece că la grep comandă care este în căutarea pentru toate cazurile de atingere cuvânt. Și astfel, folosind această combinație a istorie instrumente și grep, eu pot vedea, OK, aici e toate comenzile am vreodată a alerga, și aici este una oarecum comun. Suntem în partea de jos. Și este, de asemenea, să-mi dea comanda Tocmai am fugit care a avut atingere cuvânt în ea. Dar conducta este un lucru destul de util pentru combinarea mai multor programe. Și, de fapt, este o scurtătură pentru lit istorie de ieșire mă la dosar bla, și permiteți-mi să grep folosind bla fișier ca ceea ce vreau să se uite peste. Deci, conducta este doar o comandă rapidă pentru cele două comenzi. Da. SPEAKER 4: [inaudibil]? ROB: Da. Ce este - Oh. Hai să testăm. Deci pisică, câine, pește. Deci, vreau să grep. Dash, r, din nou, va fi recursiv, așa că vreau să coboare în jos toate directoarele. Vreau să grep recursiv pentru toate - și lasă-mă să temporar aceasta din drum. Ignora-ma. OK. Deci, vreau să grep temporar pentru toate instanțele de pește cuvânt. Și așa mai departe aici, ceea ce fac este grepping recursiv pentru pește cuvânt. Și stele înseamnă peste toate acestea fișierele din acest director. Și așa mi-a dat o Permission denied, pentru că nu este permis să citesc anumit fișier. Dar a găsit pește în dosar, testul. Am putea spune, de asemenea, în mod special, doar am vrea să se uite în bla dosar, în caz în care nu vor găsi nimic. Vreau doar să se uite în dosar, testul. Se va găsi pește. Că este o comandă destul de util să știe, în general. Există unele alternative la grep care ar trebui să fie mai mult programator prietenos, dar eu tind să cadă încă din nou pe grep. Întrebări? OK. Există alte comenzi? Oh. Doar un one-off una pe care am mereu găsi să fie distractiv este cal. Așa observa atunci când sunt în acest minunat modul ecran complet, nu am nici top cum ar fi bara de instrumente sau nimic. Deci, cal doar dă-mi un pic de frumos calendar care este corect acum taie, presupun. Dar puțin comanda frumos. JOSEPH: Este [neauzit]. Alte comenzi pe care le-ar putea avea văzut includ zăngănit și de a face. Vom merge peste ei în detaliu mai târziu. Dar, dacă ați fost de lucru pe PSET, ar trebui să fie familiarizat cu cele. ROB: În regulă. Întrebări cu privire la lucrurile linia de comandă? Bine. Deci, haideți să trecem la unele Chestii C-legate. Variabile matematica. OK. Deci, doar ca am avut matematică în Scratch, puteți utiliza, de asemenea, matematica in C. Înainte de a ajunge la faptul că în întregime, astfel variabile. Amintiți-vă că de fiecare dată când declara un variabile cum ar fi int x sau y float, te trebuie să-i dea de tip înainte numele variabilei. Deci tipuri le-am văzut până acum sunt int, float, dublu, lung, lung, pe care am Nu știu de fapt dacă ne-am văzut că până în prezent. Există unele altele. Ne-am vedea char. Nu e scurt, care este ca e vizavi de mult timp în cazul în care este mai mic decât un număr întreg. Am văzut, de asemenea, șir. Deci, ce este special despre șir? De ce aș spune că e nu destul ca int? SPEAKER 4: Nu există cu adevărat. ROB: Da. Deci, singurul motiv pentru care ne-am string se datorează faptului că atunci când faci hash, includ cs50.h. Și vom vedea exemple de mai târziu - oh, că nu se ocupă atât de bine - unde cs50.h este de a face ceva lungul liniilor de tip def, stele char, string. Și astfel încât spune că nu avem nici știu ce o stea char este încă. Dar acest lucru este de a spune ne-o dorim șir. Orice loc ați fost utilizați șir, te ar fi putut fi utilizați stea char, care de fapt este un tip care există în limbajul C. Dar vom ajunge la asta. Oh, și merge chiar înapoi. Îngrijite. Deci, același lucru cu bool unde adevărat și fals. Că nu este într-adevăr un tip built-in în C. În schimb, e doar, are această zero valoare? Atunci vom lua în considerare doar se a fi false. Are aceasta valoare - bine, acest lucru nici valoare care nu este zero? Atunci vom considera că este adevărat. Deci, un lucru este adevărat, doi este adevărat, nimic diferită de zero este adevărat. Deci, acestea sunt cele. Întrebări cu privire la variabilele declararea și Tipuri de variabile și tot ce? Da. SPEAKER 4: De mult timp, în carte, ea a spus că a trebuit să fie long int lung. Dar va funcționa mult timp? ROB: Deci, aceste modificatori de tip. Deci, int x. Deci, putem spune, de asemenea, nesemnate int x. Putem spune int scurt x. Putem spune de mult timp int x. Dar destul de mult oricare dintre aceste lucruri pe care le tocmai a spus, unsigned int, int scurt, mult timp Int, puteți scăpa de int și se va presupune doar care te-ai referit Int. X astfel nesemnate, ceea ce înseamnă doar - Știi cum în mod normal cu un int, vă pot spune x este egal cu negativ 3? Cu un int nesemnate, nu poți. JOSEPH: Și, din nou, pentru aparatul de fotografiat, întrebare a fost, ceea ce este diferența între long int lung și tocmai de mult timp? ROB: Da. Așa că va fi aproape niciodată Trimite mult long int. Voi scrie mult timp. JOSEPH: Orice întrebări? ROB: OK. Memento atât de prost puțin de care este modul în care declarăm o variabilă și inițializa variabila si declare un alt variabilă și inițializa totul într-un singur pas. Deci, declarația de variabile și variabila de inițializare nu au a dar poate fi pe aceeași linie. Deci avem operatorii de matematica standard de că v-ați obișnuit - plus, minus, divide, ori. Există, de asemenea modulo, pe care vom vedea. Nu este, cel puțin în C, o putere built-in exponentiala operatorului caret. Ei bine, există un operator de caret, dar nu este putere. JOSEPH: Dar nu este exponentiala, Da. ROB: Nu utilizați cursorul să se presupună că aceasta înseamnă cum ar fi pătrat sau orice altceva. Deci, unele lucruri pentru a păstra în minte cu privire la divizare. Voi sta. Deci, a declarat răspuns Initialize. Deci, noi spunem răspuns float este egal cu 1 împărțit la 10. Tipărește răspunsul la două zecimale. Și aceasta este genul de lucru pe care am ar omul printf să dau seama că ce naiba nu%, punct, 2F înseamnă? Și asta înseamnă doar, ei bine, ignorând 0.2. Și%, f este ceea ce vom folosi pentru a imprima să plutească. 0.2 se spune, de imprimare plutesc la două zecimale. Deci, acest program are un bug, și s-ar putea au văzut acest lucru înainte, în unele înainte de curs CS. Dar ceea ce este că bug? SPEAKER 5: Zero. ROB: Da. Asa ca atunci cand spunem, răspunsul este egal 1 împărțit la 10, ne-o dorim răspunde la 0,1. Dar 1 împărțit la 10, 1 este un număr întreg, 10 este un număr întreg. Și astfel, atunci când facem un întreg împărțit de către un întreg, ne vom lua înapoi un număr întreg. Deci, 1 împărțit la 10 este de 0,1. Având în vedere că trebuie să ne dea un întreg, este doar de gând să arunce care zecimală și spune că raspunsul este 0. Așa că atunci când ne-am imprima răspundem aici, se va imprima 0.00. JOSEPH: Și, la fel ca și o notă, este de fapt aruncă ceea ce este după punctul zecimal. Deci, dacă a avut loc 6 împărțit la 10, s-ar putea crede că aceasta s-ar da 0,6 și apoi v-ar rotunji la 1. Dar, de fapt, ceea ce se întâmplă atunci când introduceți sarcini este că acesta scade ceea ce este după virgulă. Deci, 0.6 devine 0. ROB: Da. Și vom spune trunchia pentru asta. Deci, ori de câte ori aruncat la un int, zecimal este trunchiat. Deci, fix pentru că - nu există de fapt două. Și am de gând să fac asta în al doilea rând, pentru că aceasta este o soluție mult mai ușor. Deci, unul fix este de a utiliza flotoare în divizia. Și într-adevăr, trebuie doar să face unul dintre ei un flotor. Dar e oarecum mai clar doar pentru a face ambele pluteste. Deci, 1,0 împărțit la 10.0 este împărțirea două flotoare. Deci, răspunsul se va sfârși prin a fi un float, și așa veți imprima corect 0,10 aici. Ceva care nu funcționează atât de bine despre care este, ei bine, sigur, a fost ușor suficient pentru a converti 1 la un pluti prin ceea ce face 1.0. Dar ce se întâmplă dacă în loc am avut două numere întregi cum ar fi int x este egal cu 1 și int y este egal cu 10, iar apoi ne-am dorit Pentru a face x împărțit la y? Deci, nu este ușor de doar face X.0 sau ceva. Deci, fix la care se turnare. Deci turnare este o modalitate de a converti în C de la un tip variabilă la altul. Deci, aici, o este un număr întreg. Și de a pune această float în fața ea, suntem turnare 1 la un float. Și astfel aceasta va converti 1 a unui 1.0. Și acest lucru va converti 10 la 10,0. Și atunci lucrurile se comportă în mod similar la versiunea anterioară ne-am arătat unde, cum era de asteptat, avem 0,10 și se va imprima ca. Și putem face acest lucru cu variabile, de asemenea. Deci, putem spune, float x împărțit de float y. JOSEPH: Orice întrebări? ROB: Deci, la fel ca și în matematică regulat, avem operator de prioritate. Deci, în clasa de matematică, ai mai multe sanse să-l numesc ordine de operațiuni. Aici, termenul oficial este operator de prioritate. Dar prioritatea operatorului, sau mai mult operatori, este ca și cum ați aștepta. Deci, la fel ca și în matematică, de 2 ori 10 este vor fi grupate mai strâns decât aceasta 10 împărțit la 2 și apoi 2. Ordinea operațiilor, se va face 2 ori 10, 10 împărțit la 2, și apoi se va face 20 plus 5 plus 2. Deci e cum era de așteptat, și puteți utiliza paranteze pentru expresii de grup. Nu puteți utiliza paranteze pătrate pentru expresii de grup. Da? SPEAKER 5: Ai putea de fapt, du-te înapoi cu o secundă? Poți arunca o int la un șir? ROB: Deci, în C, vă poate arunca nimic pe care doriți să tot ce vrei. Asta nu înseamnă că e un lucru bun de făcut. Deci, atunci când aruncat un int a un șir de caractere, ceea ce înseamnă - și vom obține în acest mult mai bine - JOSEPH: Mult mai târziu. ROB: Nu am vrut să spun mult mai târziu, așa că am încercat să schimbe sentința. Vom ajunge în ea mult mai bine mai târziu, în cazul în care într-adevăr, atunci când aveți un variabilă șir - astfel încât un șir poate fi arbitrar mult timp, nu? Și ne-am spus că este un int patru bytes și lung lung este de opt bytes și un float este de patru octeți. Deci, un șir de caractere, la fel ca un întreg, are doar un anumit număr de octeți pentru ea. Și care va fi de patru bytes. Dar un șir poate fi destul de arbitrar de mult, corect? Deci, salut lume deja, în cazul în care este de 10 caractere sau orice altceva, asta e deja va fi peste 4 octeți Eu pot încăpea într-un șir. Și așa cum funcționează de fapt siruri de caractere este că acestea sunt în cazul în care în memorie acel șir se păstrează. Și așa aici, când spun șir x este egal cu lumea salut, în interiorul a x este doar că, oh, salut lume este stocat în acest loc special în memorie. Deci, dacă am încerca să arunce un întreg la un șir, apoi încercăm să interpreteze o parte aleatorie a memoriei ca un șir. Și care rupe aproape întotdeauna lucruri. JOSEPH: Dar, în cazul în care confundă te, vom fi acoperind o mai în profunzime mai târziu. ROB: Da. Acest lucru este în cazul în care ai de gând pentru a intra în indicii. Și că este o bucată semnificativă de două săptămâni de acest curs. SPEAKER 6: Functioneaza ca obiecte în alte limbi sau nu adevărat? ROB: Deci, în alte limbi, obiecte ar fi reprezentat folosind indicatori. Nu e același lucru, totuși. Orice gândurile? JOSEPH: Nu. Nu sunt gânduri. ROB: OK. JOSEPH: Next. ROB: Du-te cu asta. Bine. Așa modulo. La fel cum ne-am plus, minus, diviza, și să se înmulțească. Deci, modulo este unul s-ar putea nu s-au văzut înainte. Și se spune doar, da mi restul. Deci 55% 10. Restul face 55 împărțit de 10 ar fi 5. Deci 55% 10 este 5. Și 3% 5 ar fi 3. 8% 8 va fi 0. 16% 15 va fi 1. JOSEPH: Un lucru de remarcat cu acest lucru, de asemenea, este că nu ar putea să funcționeze conform așteptărilor dacă utilizați un număr negativ. Astfel negativ 5% 4, unii oameni s-ar putea crede că este - ce crezi negativ 5%, 4 ar fi? SPEAKER 5: One. JOSEPH: Deci, unii oameni spun una, unii oameni spun unul negativ. Dar ceea ce - ROB: Nici nu ar avea a declarat unul dintre cei. JOSEPH: Doi, îmi pare rău. Unii oameni spun - ROB: Trei. JOSEPH: Trei? ROB: Negative - ceea ce a fost - negativ cinci - JOSEPH: Trei, trei, trei. Scuze. Deoarece modulo, în general, atunci când ai văzut-o în altă parte, aceasta înseamnă, de obicei, returna un număr pozitiv, corect? ROB: Deci, atunci când spunem la matematica, 10%, a ele tind să vrea să vă dau - dacă Mod de 10, atunci ne așteptăm să a obține un număr între 0 și 9. În aici, că nu este cazul în care vă vor primi numere negative întors. JOSEPH: Deci negativ de 5% 4 ar fi negativ 1. ROB: Dar este rar ca esti mod-ing numere negative pentru a începe cu. Săriți peste acest lucru. JOSEPH: Da. ROB: Meh. OK. Deci, un ultim lucru pentru a sublinia despre flotoare este că este un comportament periculos, dar flotoare nu sunt un exacte reprezentare. Deci, merge înapoi la bytes din nou, amintiți-vă ca un întreg este întotdeauna patru octeți și un float este întotdeauna patru bytes. Deci, de exemplu, Lucas este destul de bun. Deci, cred că de 1 împărțit la 3. Așa 0.3333333. Dacă am doar 32 de biți, cum poate Am stoca 0.33333 exact? Și poate, indiferent de motiv, vă spun, bine, bine, hai să spunem că această special 1011001, să spun doar că ar trebui să fie 0.333333. Ei bine, ai doar un număr finit de aceste biți, așa că este imposibil să reprezintă fiecare virgulă mobilă Valoarea dat doar 32 de biți. Ei bine, este imposibil să reprezinte orice valoare în virgulă mobilă dat infinit - bine, având în vedere orice număr finit de biți. Deci, problema aici este, ei bine, atunci când am folosit pentru a imprima la două zecimale, ne-am primit în mod corect răspunsul 0.10. Dar sub capota, e într-adevăr fiind stocate cât mai aproape posibil de 0,10 în care aceste biți poate reprezenta. Este acest lucru pe slide-ul urmator? Sau nu-i așa? JOSEPH: Da, e ca. ROB: Blegh, blegh. JOSEPH: Da, puteți doar trage notele un pic. ROB: Mă duc pentru a mări în pe ultimul pe care. Oh, Doamne, asta e [neauzit]. Astfel încât numărul. Asta este ceea ce va fi imprimat dacă vom rula acest program. Și observați că nu este într-adevăr o afacere mare dacă suntem doar pese ca doi la trei zecimale. Ca și cum ne-am doar inițial tipărite 0.10, și de aceea am văzut nimic greșit. Dar, odată ce vom începe Noțiuni de bază în exactă, numărul exact care este reprezentând, vom vedea că nu se poate exact reprezintă 0,1. Și o parte a problemei aici este ca, bine, asta e bine, dar, ei bine, în primul rând, ceea ce în cazul în care am încercat să facem, Răspunsul este egal este egal cu 0.1? Este că merge să se întoarcă adevărat sau fals? Și deci este greu de spus. Cred că de fapt s-ar putea întoarce adevărat. Mai întâi va fi - Nu știu. Răspunsul este dată de a începe a face cu valori în virgulă mobilă, ai destul de de mult nu ar trebui să fie folosind egalitate din cauza acestei imprecizie. Și pentru tot ce știi, e sutime zecimală că virgulă mobilă nu a fost în măsură să se ocupe în mod corect. Și astfel egalitatea nu va reuși doar chiar deși numărul - dacă ai fi fost folosind numere exacte, numerele ar trebui să au fost exact la fel. Este de-a lungul ca 50 calcule utilizând aceste plutitoare Valorile în puncte, eroarea poate construi în sus și în sus și în sus, și lucrurile devin pur și simplu greșit. JOSEPH: Și au fost într-adevăr exemple celebre de acest lucru se întâmplă. Ca inginerii de la NASA au ajuns aceasta greșite, rachete provocând la exploda în aer după ce au fost lansate. Și o mulțime de probleme de genul asta. Deci, da. SPEAKER 6: Când spui 0,3 f, nu-l trunchia restul? Sau nu-l rotunji în plus sau în jos? ROB: Va printf în jurul lui? JOSEPH: Cred trunchieri printf. ROB: OK. Astfel încât să putem merge în mod similar în opusul direcție de acest lucru în cazul, în acest caz, cel mai aproape de ea ar putea reprezenta 0.1 a fost cu acest număr. Cel mai aproape ar putea reprezintă 0,2 este în direcția opusă direcție, .199999996356 sau ceva. Deci, dacă ne-am dus în această direcție de lucruri, atunci printf 0.3 f-ar întoarce 1,99 în loc de 2,00. JOSEPH: Și eu nu sunt în totalitate sigur pe asta. S-ar putea dori să scrie un mic, mic program pentru a verifica doar asta. ROB: Deși, ceea ce sunt sigur este că dacă ați încercat să arunce că la un Int, și turnare pentru un int este de gând să determina să trunchia zecimale, în cazul în care ce încerca să arunce 1.9999999 la un int, veți obține 1. Și așa ar trebui, în general, utilizați Funcția rotund în biblioteca matematica. Întrebări? OK. JOSEPH: Deci, de a trece la condițiile de și expresii booleene. Deci, ați văzut aceste înainte. Și, de fapt, permiteți-mi să vă meu calculator este în formatul potrivit aici. Spațiu. Ne pare rău, vom avea de a face o pic cu cutoff la margini. Dar da, voi ați văzut acest lucru înainte în Scratch. Deci, asta de aici este o expresie care este folosit în o declarație condiționată. Astfel încât să răspundă mai mare decât voința de zero vă spun adevărat sau fals. Și acestea sunt foarte importante, deoarece ele ne permit să introducă logică în codul nostru. Deci, de exemplu, acesta este un program scris în Scratch care cere utilizatorului pentru un întreg și le spune dacă întreg pe care le-au dat a fost o număr pozitiv sau negativ. Și conversia aici pentru a vedea este imprimați mai întâi declarația, da-mi un întreg. Și apoi le cere pentru un întreg. Și apoi să utilizați logica condiționată peste aici pentru a verifica dacă acest număr a fost de fapt mai mare decât zero sau nu. Deci, aici avem o expresie booleană în interiorul unui condiționată Dacă declaratie. Există întrebări? Există întrebări despre asta? OK. Deci, nu e mai mult decât mai mare decât, desigur. Puteți construi expresii booleene folosind de cele mai multe tipuri de lucruri pe care le s-ar gândi la matematică. Deci, mai mare. Că ar trebui să fie o mai mică decât. Scuze. Și spațierea. ROB: Doamne ferește să-l părăsească. JOSEPH: În regulă. Deci mai mare, mai puțin, mai mare decât, sau egal cu, mai puțin decât, sau egal cu. Noi folosim egal duble pentru a verifica egalitate, pentru că singur este egal cu mijloace cesiune, corect? Da. Și apoi putem, de asemenea, nu este egal cu folosind semn de exclamare, este egal. Și acest simbol semn de exclamare poate de asemenea, să fie extins, astfel încât, dacă doriți pentru a inversa orice fel de booleene expresie, puteți face acest lucru. Deci, acest lucru se va evalua la adevărata numai în cazul în care răspunsul este mai puțin mare sau egal cu zero. Orice întrebări cu privire la asta? OK. Astfel încât să puteți combina, de asemenea, aceste expresii care utilizează logică și și logic Or. Deci, aceasta este doar simbolul Si, care trebuie să fie Shift, 7. Și aceasta este simbolul conductă, care este nu un caz mai mic L. Este cea E chiar deasupra cheia Enter. Astfel încât să utilizați două dintre acestea pentru a simboliza logic Și logică sau. Deci, aceasta va reveni adevărat numai în cazul în care răspunsul unul, doi, trei, sau patru. Iar acest lucru se va întoarce adevărat numai în cazul în care răspunsul este dincolo de faptul că pe fiecare parte. Deci, nu e unul, doi, trei, sau patru. Și modul în care ar trebui să utilizați că într-o expresie - ROB: Sau un zero sau un cinci. JOSEPH: Zero sau un cinci. Scuze. Da, da, da. OK. Și aici acum, la fel ca tine ar folosi această expresie, o mai mică partea de exprimare a unui condițională Dacă afirmație, ar trebui să de asemenea, utiliza același mod de doar punerea în interiorul parantezele de declarația Dacă. Deci, acest printf va concedia doar în cazul în care răspunsul unul, doi, trei, sau patru. Orice întrebări cu privire la combinarea expresii? Deci, există un alt condiționată construct numim un Dacă / Altfel. Deci, practic, acest lucru înseamnă acum, OK, Daca ceva ce am vrut pentru a verifica nu a fost adevărat, atunci du-te la altceva și efectua că alte acțiuni. Deci, în acest caz particular, l-am întrebat utilizatorul pentru un număr întreg. Este numărul întreg mai mare decât zero? Da? Ei bine, apoi au captat un număr pozitiv. Dacă nu, atunci aceasta trebuie să aibă a fost negativ sau zero. Deci, ai ales un număr negativ sau un zero în acest caz. Da. Sau un zero. Și apoi ne-au, de asemenea Dacă / Altfel, Dacă și Else. Deci, acest lucru ne permite să execute o secvență de lucrurile doar în cazul în care primele nu. Deci, în acest caz, acum facem ultima alegi zero. Deci, dacă ei nu a luat-o pozitiv, nici un număr negativ, atunci ei trebuie să au ales zero. Deci, doar se duce în jos lanț de genul asta. Deci, un exemplu de modul în care o Dacă este diferit de - o Dacă / Altfel este diferit de doar o secvență de Ifs. Și aceasta este o întrebare comună, care oameni cer este, ei bine, dacă aveți ca un 95 în CS50, ce va prezenta Programul vă spun? SPEAKER 5: Ai o A. JOSEPH: Da. Ai fiecare unul dintre cei drept. Ai un A, ai un B, te primit un C și un D, ​​nu? Deci, toate acestea se evaluate în ordine. Deci, în timp ce o 95 este mai mare de 90, este De asemenea, mai mare de 80, este, de asemenea, mai mare de 70, și este de asemenea, mai mare de 60. Deci ai toate aceste clase. Și eu presupun că ar fi Vreau doar A. Modul de a stabili care este de a înlocui cei cu Else / Dacă-s. Deci, în acest scenariu, se vede că 95 este mai mare de 90, iar apoi o face nu evaluează restul a declarațiilor. Orice întrebări despre asta? Deci, există un alt fel condiționată de structura pe care o avem aici pe care ne-am numim o declarație comutator. Deci, acest lucru vă permite să verificați practic ce valoarea a unui număr de pui în declarația de switch este. Deci, în acest scenariu, suntem de comutare la n, și noi spunem, oh, în cazul în care n este unul, apoi imprimați această afirmație. Și apoi rupe, ceea ce înseamnă ieșire din declarația de switch. În cazul în care nu a fost unul, atunci, ei bine, doar în cele din urmă a verifica toate aceste cazuri. Și așa se verifică dacă e una sau două sau trei, și se imprimă în consecință. Și ce acest cuvânt cheie implicit aici mijloc este, dacă acestea nu au intrat nici un Dintre acestea, atunci spune invalid. Deci, haideți să spunem cer n și utilizatorul dă-mi patru. Ei bine, se potrivește cu nici unul din aceste cazuri, asa ca va imprima ceea ce este în secțiunea implicită. Da, întrebarea? SPEAKER 5: Poti folosi Boolean expresii în loc de unul, doi, sau trei? JOSEPH: Deci, întrebarea este poate să utilizați Expresii booleene în loc de unul, doi, trei? Și în C, te cred Nu pot face asta. Dar în alte limbi, pe care s-ar putea întâlni la sfârșitul semestru ca JavaScript, poți. Ei bine, va trebui să calculeze întâi ca valoare și apoi l utilizați în comuta declarație. Da? ROB: Deci, o parte din beneficiul comutator declarații se gândesc dacă ați făcut acest lucru ca un Dacă / Altfel, așa cum ar fi în cazul în care n este egal cu este egal cu una sau orice altceva. Else / Daca n este egal este egal cu doi, orice. Else / Daca n este egal este egal cu trei. Deci, modul în care programul ar fi e ar merge secvențial jos lista și a verifica, este N unul? Nope. Este n doi? Nope. Este n trei? Da. Face acest lucru. Întrucât, cu declarații de comutare, este de fapt, posibilitatea de a compila ca acesta să fie foarte repede. Și, de îndată ce se spune comutator, acesta spune, în regulă, n este doi, eu sunt imediat de gând să sari în cazul în care Eu trebuia să înceapă de executare. Eu nu am de gând să verifice în primul rând, n este o, este n doi? Se poate începe imediat face ceea ce ar trebui să facă. Și din acest motiv, nu se poate ia condiții booleene. Sau altceva, ar trebui să facă secvențială, cum ar fi, bine, este n mai mare decât zero? Altceva este n mai mare de 10 sau orice altceva. JOSEPH: În acest caz, dacă ați folosit Dacă / Altfel, Daca, apoi comutatorul ar fi rula aproximativ trei ori mai repede decât Dacă / Altfel, dacă. Putem organiza comutatorul în astfel de un mod care nu ne rupe după fiecare din cazuri. Deci, în acest caz, eu sunt partiționarea Numerele pe care le alege într-o singură și două nu este un număr mare și trei fiind un număr mare. Deci, în acest caz, dacă n este unu sau doi, ea va lovi cazul și apoi se va cad prin, deoarece nu există nici o pauză. Și se va termina aici. Deci, dacă vom alege unul, se va face printf și apoi rupe, astfel încât nici una dintre aceasta este executată. Și, bineînțeles, în cazul în care acestea intră în trei sau altceva, atunci se va trece cei care nu merg acolo, și-l va executa în schimb linie corespunzător. Există întrebări despre asta? Da? SPEAKER 4: Vrei primi o eroare dacă a avut o pauză, după caz, un dar nu am avut ceva pentru ca acesta să facă? JOSEPH: Deci, întrebarea este să ai o eroare dacă aveți o pauză după cazul în care una dar nu e nimic de făcut? Și răspunsul este nu. Tu nu va primi de fapt o eroare. Da, mm hmm. Deci, ca un fel de mica schimbare aici, Am de gând să pună o printf aici. Hopa. Deci, ce-ar imprima aceasta dacă Am pus-o în la fel de intrare? Da. Acesta vă va spune că nu a luat un număr mare de două ori, nu? Pentru că ar fi lovit primul caz, nu s-ar rupe, și ar cădea până la al doilea caz. Orice întrebări despre asta? ROB: Ai avut o altă întrebare? JOSEPH: OK, se răcească. Bine. Deci nu este ceva ce numim un operatorul ternar care este de fapt o sintaxa alternativă de a face Dacă și apoi altceva. Și vă permite să faceți totul pe o singură linie. Deci, în acest program special, Eu cer utilizatorului pentru n. Și dacă n este mai mare de 100, am spune le-au luat un număr mare. Altfel le spun ei ales un număr mic. Deci, putem folosi această sintaxă foarte lung, șir, S, iar apoi verificați dacă n este mai mare de 100 și atribuie ea în consecință. Dar putem face acest lucru mult mai concis folosind această sintaxă operatorul ternar care implică o întrebare marca și un colon. Deci, semnul de întrebare este, în esență, pune o întrebare, nu? ROB: Poate mări pe asta. JOSEPH: Da. Bun punct. Deci, aceasta este operatorul ternar. Eu întreb mai întâi problema, n este mai mare de 100? Dacă este, atunci am executa primul parte înainte de colon. Dacă nu este, atunci am executa a doua parte după colon. Deci, dacă n este mai mare de 100, apoi se ridică înalt și pune că în șir s. Dacă n este mai mic de 100, se ridică scăzută și apoi pune că în șir s. Astfel că va condensa această bucată mare jos în doar că o singură linie. SPEAKER 5: E popular? JOSEPH: Da, este destul de popular pentru lucruri în care, în esență, pe care doriți să Nu o misiune bazată pe un fel de stare. Și în acest caz, am încercat pentru a atribui o valoare de șir s. Nu e așa de - Cred că nu-mi place cu adevărat în alte cazuri. Dar este deosebit de util pentru această misiune. ROB: Acesta este un model destul de comun în cazul în care aveți unele variabile care ai de gând să spui, în cazul în care ceva, setați această variabilă pentru o valoare, altfel, setați această variabilă de la o altă valoare. Și că este scenariul în cazul în care utilizați un ternar. JOSEPH: Și tu economisire o mulțime de linii, nu? Și-l face doar codul, fără îndoială, un pic mai ușor de citit. Da, întrebarea? SPEAKER 6: Pentru un ternar, ai putea merge, egali șir s s, semn de întrebare? Și atunci ai putea avea, să zicem, cinci opțiuni diferite. Și în funcție de ce numărul n a fost, ai alege una dintre cele? JOSEPH: Deci, întrebarea este, există o un fel de sintaxă, unde puteți face șir s este egal cu n, iar apoi au mai mult de două Opțiuni după care semn de întrebare? Și un răspuns simplu este nu, nu e într-adevăr o modalitate buna de a face acest lucru, cu excepția cazului pe care doriți să cuib ternare multiple Operatorii interiorul unul de celălalt. Ai putea face ca n mai mare de 100, semn de întrebare, și apoi un alt operatorul ternar, n mai mare de 50, semn de întrebare, și cuib în felul acesta. Dar, în acest scenariu, codul este obtinerea fel de greu de citit și murdar, și ar fi mai bine să meargă doar la În cazul în care o declarație / Altele, la acel moment. ROB: Și, de asemenea, ca o notă separată, PHP pune în aplicare în mod incorect ternar Operatorul astfel încât ternaries imbricate chiar nu funcționează așa cum ar trebui. JOSEPH: Da. Deci, devine un pic confuz, mai ales atunci când te duci de limbi diferite. ROB: Este confuz suficient ca limbi sunt în neregulă cu el. JOSEPH: Deci, de fapt, doar pentru a clarifica, știe toată lumea ce că % S nu pe aici? Orice întrebări despre asta? Cred că doar pentru aparatul de fotografiat,% s de fapt ne permite să pună un substituent pentru un șir. Și apoi, la final, vom preciza că variabilă dorim să punem în acest loc de titular este s. Astfel că are de fapt e și îl pune în aici. Și apoi se va imprima, ai ales un mare sau ai ales un număr mic. OK. Astfel încât buclele permite să efectuați lucruri cu mișcări circulare, corect? S-ar putea s-au confruntat în acest Zero în formă de totdeauna bucle sau Repetare Până sau Repetați o anumită număr de ori. Deci, de ce este acest lucru bun pentru noi? Ei bine, în C, să spunem că avem această cântec implementat în Scratch care cântă, aceasta este piesa care nu se termină niciodată. Se merge doar pe și de pe și pe totdeauna și pentru totdeauna. Ei bine, nu se poate face cu adevărat un program de care are un număr infinit de printf declarații în asta, nu? Deci, în acest scenariu special, într-un fel care le-ar putea face acest lucru și pentru a imprima pentru totdeauna este de a în loc să utilizați o buclă de timp. Deci, o buclă în timp ce va executa ceea ce este în organism a celor două acolade care îi aparține bazat pe ceea ce conditie este. Deci, în acest exemplu particular înainte, dacă ne-o dorim pentru a imprima aceasta pentru totdeauna, ceea ce am putea face? Ei bine, sigur, corect? Deci, acest tip de combină ideea unor expresie booleană împreună cu o buclă. Și am aflat despre Boolean expresii anterioare. Deci, ori de câte ori starea de interior că în timp ce rămâne adevărat, această buclă se va executa pe și de pe și pe. Și în acest caz, dacă ne-am furniza cu adevărat, acest lucru duce la un infinit buclă care imprimă piesa de pe și pe și pe așa cum ne-am dorit mai înainte, fără având un program care are un infinit numărul de declarații printf, care este nu este posibil. Deci mai convingător, deși, aveți posibilitatea să utilizați acest lucru cu un variabilă și o condiție. Deci, haideți să spunem că vrem să se repete frază, total de slab, de 10 ori. Deci, ce se poate face cu o buclă în timp ce este puteți inițializa în primul rând un contor în afara variabilă a În timp ce buclă la 10. Și apoi, practic, de fiecare dată când mergeți prin bucla timp, să tipăriți declarația și apoi scădea contra variabilă, până la sfârșitul anului, la un moment dat, odată ce scade am suficient ori, 1 de la I ori suficiente - și doar pentru a clarifica, am minus minus înseamnă că este egal cu I minus 1. Care va aduce, practic, am jos la punct în care o dată am lovit la zero, aceasta condiție nu mai este valabil și deci ce iese din bucla. Astfel total de slab imprimă doar de 10 ori. Orice întrebări cu privire la o buclă în timp ce? OK. Deci, există un fel putem face ceea ce ne-am a făcut într-un mod mult mai concis cu ceea ce noi numim o pentru buclă. Deci, o buclă Pentru constă dintr-un inițializare, o condiție, și un actualizare, așa cum am avut-o înainte în această buclă în timp ce. Deci, haideți să aruncăm o privire. În această buclă în timp ce, am avut o inițializare, apoi am avut o condiție pe care am verificat. Și apoi am avut o actualizare pas în partea de sus. Cu o buclă pentru, aceasta, practic, ia aceste trei lucruri și se condensează în jos într-o singură linie. Deci, primul lucru pe care-l face în Pentru buclă este inițializarea. Și apoi faci o virgulă, și apoi faci starea, care este I mai mare decât zero se duce acolo, și apoi etapa de actualizare. Deci, acest lucru se face la foarte capăt al corpului buclei. Deci, aceste două programe sunt în esență echivalente. Orice întrebări? Deci, ceea ce este o diferență între aceste două? Poate cineva sa-l subliniez? Acesta ar putea fi un pic mai subtil. Este doar o foarte mică diferență. Da? DIFUZOR 5: N-ar putea folosi variabila eu afara pentru bucla [Inaudibil]? JOSEPH: Exact. Deci, acest lucru este ceva vom ajunge la mai târziu numit domeniu de aplicare variabil. Dar, în esență, această int i viața în afara de această buclă în timp ce. Deci, odată ce această buclă în timp ce se face de executare, voi putea folosi mai târziu am pe în program. Întrucât, cu acest lucru pentru bucla, aceasta int i este luneta interiorul acestei pentru buclă. Și pentru că este în interiorul acestei porțiuni buclei Pentru, care începe la parantezele și se termină cu bretele buclat acolo. Orice lucru care este declarat în interiorul aici nu pot fi utilizate în afara. Deci, dacă am încerca să folosesc in afara, acesta va Spune-mi, simbol nedeclarate. Și în esență, eu nu ar fi putea să-l utilizeze. ROB: Și, ei bine, acum 10 ani, în literalmente toate cazurile, acolade sunt ceea ce folosit pentru a determina Domeniul unei variabile. Deci acolo, int I este egal cu 10 este declarat în interiorul acestui set de acolade. Și așa, atunci, atâta timp cât încercați să utilizați I înainte de această acoladă, e în regulă. S-ar putea vedea atunci când tastați face, te vezi liniuță, liniuță, std, egal, C99. Astfel că este o versiune mai recentă de C care GCC a pus în aplicare, care oferă, de asemenea, această comandă rapidă. Deci, acest lucru folosit pentru a nu fi permisă în C. Și puteți vedea de ce, pentru că acest lucru int I este în afara acestui acoladă, dar este încă considerată a fi în domeniul de aplicare a acestor acolade. Dar acesta este un lucru foarte convenabil, și de aceea este o extensie bun. JOSEPH: Orice întrebări? OK. Deci, ceea ce este mai util este faptul că, uneori, vrei un fel de dinamism în bucla, nu? Tu nu vrei doar pentru a imprima în mod necesar total de slab tot timpul, te Vreau să conta în jos de la 10 sau ceva. Și astfel încât să puteți utiliza variabila contor interiorul buclei, de asemenea. Și în acest caz, acest program doar contează în jos de la 10 tot drumul în jos. Și ceea ce nu imprima? Acesta nu se imprimă de zero, dreapta, pentru că atunci când - Da, de asemenea, nu se imprimă 11. Deci, nu se imprimă de zero, pentru că atunci când I este zero, amintiți-vă, aceasta evaluează condiție înainte de a intra pe a executa corpul buclei. Și când am este zero, acest lucru este fals, așa nu se imprima de numărare în jos la zero, doar afiseaza numărare pe 10 tot drumul până la 1. Dacă am vrut de fapt o pentru a imprima la zero, atunci ne-ar pune un semn egal după această mare de semn. OK. Deci, un mod de a face validare de intrare, care este atunci când cere utilizatorului să facă ceva, doriți să vă asigurați că acestea urmați instrucțiunile dumneavoastră, este de a folosi bucla de timp, corect? Deci, în acest caz particular, eu cer pentru un număr pozitiv, iar apoi eu sunt de așteptare pentru intrarea. Și apoi am verificat timp de intrare este mai mică decât zero, păstrați cerându-le. Atâta timp cât mi-au dat un număr că nu este pozitiv, tot întreb, tot întreb, tot întreabă. Dar ceea ce este un fel de ciudat despre asta? Sau ceea ce nu pare a fi optim de această structură aici? Oricine? Da? SPEAKER 6: Te repetarea instrucțiunea de două ori. JOSEPH: Corect. Deci avem două declarații printf aici, nu? Deci, există un fel, am putea obține acest lucru doar până la una care ar face noastre codul mai ușor de citit și un pic mai curat. Și atunci nu ne-ar trebui să au Ia în de două ori la fel de bine. Și într-un fel, puteți face acest lucru este utilizând o buclă Do-timp. Și o buclă Do-În timp ce este de fapt o diferite forme de o buclă în timp ce în cazul în care tot ce este în acolade este executat cel puțin o dată. Deci, aici, declar, int de intrare, în afara primul. Și apoi eu spun doar, face acest lucru instrucțiuni în timp ce de intrare este mai mică decât zero. Așa că lovește facem mai întâi. Acesta va executa întotdeauna cel puțin o dată, așa că va cere întotdeauna utilizatorului de intrare, cel puțin o dată. Și apoi se evaluează că de intrare, și merge pe într-un cerc. Da, întrebarea? SPEAKER 6: Există o modalitate de a face acest lucru [Inaudibil] tipuri, cum ar fi dacă ai spune, GetString, și cineva [inaudibil] există o modalitate de a [inaudibil] JOSEPH: Deci, întrebarea este, există o modalitate de a face validare de intrare în cazul în care utilizatorul nu se pune în dreptul tip de variabile? Deci, dacă am cere pentru un int și ei ne da un șir în loc. Și în funcțiile pe care le pune în aplicare pentru tine, getint, getString în toate aceste funcții, ei de fapt deja face acest tip de intrare tip de bază validare sub capota. Deci, dacă sunteți folosind funcțiile pe care le ți-a dat, nu trebuie cu adevărat să. Dar, dacă vrei să te uiți mai mult în modul în care puteți face de fapt pe care, poti sa te uiti sub capota la dosar I/O-- nu depune, funcțiile standard de I / O ca o lectură de la intrarea standard și de ieșire standard. Și puteți obține un sentiment mai bun de modul în care s-ar putea face asta. ROB: O problemă, însă, este în mod special cu exemplul de tine a spus, vă așteptați un șir și am introduce un int. Cum ar fi să vă spun diferenta între doresc în mod intenționat string 123 versus doresc int 123? Deci șir, e destul de mult nu există nici o validare, e doar ceea ce ei a intrat va interpreta ca un șir. Int este mai ușor, pentru că indiferent de intrare luați de la utilizator, sunteți ținând mereu un șir. Și astfel încât șir puteți apoi verifica, sunt toate acestea cifre numerice de fapt? JOSEPH: OK. Orice întrebări cu privire la o buclă Do-timp? ROB: Oh, iar acest lucru este, de asemenea - merge înapoi la domeniul de aplicare, o oarecum comun greseala este încercarea de a utiliza unele locale variabilă din cadrul acestei Do-timp buclă în interiorul acestei condiții. Și, de fapt, dacă ne-am scăpat de acest lucru și a spus, de intrare int egal Getint, atunci compilatorul va striga la ne, pentru că de intrare nu există în afara domeniului de aplicare al aceste acolade. JOSEPH: Și de aceea noi nevoie de această linie aici. OK. Astfel încât să puteți, de asemenea, rupe dintr-o bucla devreme, dacă doriți să. Deci, acesta este un mod diferit de punerea în aplicare a ceea ce ne-am pus în aplicare. Și în loc de a folosi condiției în paranteze, suntem folosind o If interiorul corpului din bucla Do-timp. Și, practic, atunci când intrarea este în cele din urmă mai mare decât zero, vom iesi din bucla. Și astfel vom merge tot drumul până aici. Și puteți vedea că acest lucru ar probabil să fie preferată în această scenariu, pentru că e un pic bit curat și un pic pic mai ușor de citit. Întrucât acest lucru, un fel de au linii suplimentare în ea. E doar un pic mai urât, Cred că, într-un sens. Da, întrebarea? SPEAKER 4: Va rupe numai obține Ți-ai pierdut un set de aparat dentar? JOSEPH: Corect. Deci, întrebarea este se va rupe doar te scot de o buclă? Iar răspunsul este da. Deci, dacă ați imbricate Pentru bucle, pentru de exemplu, dacă am Pentru int I este egal cu 0 până la 10 și apoi pentru int J este egal cu 0 până la 10, dacă am ieși din interior buclă, voi merge în continuare la bucla exterioară. Asa ca va ține de efectuarea operațiunile de pe exterior. Orice întrebări despre asta? Da? SPEAKER 5: Dar rupe numai funcții pentru acolade, nu pentru alte declarații? [Inaudibil] JOSEPH: Deci, întrebarea este se va rupe Funcția numai pentru bucle, spre deosebire de alte declarații, cum ar fi cazul? Și da, că este cazul, pentru că esti de rupere dintr-o buclă, drept, într-un sens. ROB: În marea majoritate a cazurilor, este aceasta este un fel de cazul în care ceva, apoi pauza. Deci, nu trebuie să rupă să se aplice în cazul în care este împachetat în jurul ei. Și, de asemenea, acest lucru nu este de mult o buclă, dar amintiți-vă că switch-uri sunt, de asemenea, defalcate din de pauze. Am văzut pauze de utilizat cu switch-uri înainte. JOSEPH: Și puteți, de asemenea, să le utilizeze în bucle de timp și pentru bucle. Orice întrebări? OK. Deci, data viitoare up este funcții. Deci, este posibil să fi folosit unul dintre aceste BYOB blocuri în proiect de la zero. Iar acest lucru permite, practic, vă pentru a defini un set de instrucțiuni care trebuie urmate. Și ce vreau să spun prin asta este să ne gândim înapoi la matematica, drept, algebra. Ai ceea ce noi numim o functie de x, unele variabile, și să spunem acest lucru Funcția este f de x este egal cu x plus 5. Astfel încât vă puteți gândi de f de x ca acest negru casetă care ia 15 în și apoi produce 20. Cu atât mai mult, în general, o funcție este ceva care are unele intrări și apoi produce unele rezultate. Și de ce sunt funcții de bun? Sunt bune pentru un număr de motive. Deci, poate cineva vrea să ia o lovitură de cuțit la ce organizație înseamnă? În ceea ce privește ce funcții sunt de ajutor? Da? SPEAKER 4: Se face dvs. codul mai ușor de citit. JOSEPH: Corect. Deci unul dintre lucrurile se face codul mai ușor de citit, nu? În loc de a avea ca int x este egal cu x ori x ori x, pot avea cub de x, care este mai ușor de citit și mai mult ușor de înțeles pentru un cititor. Organizație este, de asemenea, din punct de vedere despart codul de gestionat în porțiuni, astfel că, în loc de a încerca să să pună în aplicare toate astea într-o singură secțiune lung în principal, puteți fel de ea divizat în ca, OK, hai să scrie o funcție la cub ceva, să scrie o funcționeze la pătrat ceva. În acest fel, puteți să-l împărți în mici, piese mici pe care le puteți aborda spre deosebire de încercarea de a aborda o mare problemă dintr-o dată. Piese sau chiar mici, mici care: ROB tu și un partener poate aborda. JOSEPH: Da. ROB: Deci, în loc de atât de Încerci să implanteze un funcționeze în același timp. JOSEPH: Simplificare. Oricine vrea să ia o presupunere? Da? SPEAKER 5: Mai mult repetiție. JOSEPH: Corect. Deci, un lucru pe care le puteți face cu simplificare este că e un fel de pe aceleași linii ca re-utilizare este că o dată ce am scrie o funcție cub, eu pot doar folosi acest peste si peste si peste din nou în programul meu în loc de tastare x ori x ori x și peste de peste si peste din nou. Și simplificarea aici, de asemenea, doar înseamnă că face codul fel dumneavoastră de mai ușor pentru a depana o dată ce împărți asta în funcții. Pentru că atunci puteți localiza unde problemele tale sunt un fel de. Orice întrebări? Deci, o altă idee este de abstractizare, corect? Această cutie neagră. Ca nu stii ce face getint să primească input de la utilizator? Noi nu am cu adevărat ți-a spus, nu? Tot ce v-am spus este getint nu exact ceea ce spune că face. Deci, chiar dacă noi nu-ți spun cât de funcționează, vei ști. Deci, în acest caz particular, acest lucru este o funcție de patru ori, care nu lucruri diferite pentru o intrare pentru a produce o ieșire. Și vă puteți patru ori un număr prin înmulțirea cu patru. Sau poti ceea ce noi numim bit o schimbare de două. Și vom acoperi acest un pic mai târziu. Și nu e nevoie să știe cum acest Funcția de fapt, funcționează atât timp cât funcționează după cum se menționează. Deci, sub capota, am putea fi cum ar fi, reveni ori de intrare opt împărțit la doi. Și tu nu ar ști, nu? Tot ce trebuie să știți este ea face ceea ce spune. Deci, asta e un lucru util despre abstractizare. Și un alt lucru este un fel de această idee de localizarea codul la un special secțiune. Deci, dacă aveți o problemă, tu nu faci trebuie să te duci peste tot codul încercând pentru a rezolva cazul în care problema a fost. Deci, în acest caz, am pus în aplicare cub greșit. M-am gândit cub fost înmulțirea de trei. Deci, în acest caz, acesta este un program de care tocmai a înmulțirea cu trei peste tot. Și există un alt program care are cub factorizata afară într-o funcție. Iar acum, dacă vreau să repar greșeala mea aici, trebuie să se stabilească în fiecare linie de cod în acest program. Întrucât, pe de altă parte, dacă am folosi funcție, am nevoie doar de a schimba ceea ce a fost greșit într-un singur loc. Deci, în informatică, am apel intrări și ieșiri. Intrări sunt numite parametri sau argumente, și ieșirile sunt numite Valorile reveni. Și vom vedea cum acest lucru ne ajută fel a defini o funcție într-o secundă. Deci, aceasta este o definiție funcție pentru cubaj. Deci, este nevoie de o intrare, și apoi se întoarce că ori de numere sine trei ori. Deci, haideți să rupe acest jos. Deci, avem un antet funcție, care de fapt constă din trei lucruri. Deci, avem parametrii, care sunt, așa cum am spus mai înainte, intrări în această funcție. Și apoi ne-am da functia un nume. În acest caz, se numește cub. Și apoi am specifica ce tip din valoarea de returnare este. Deci, în acest caz, funcția mea cub ia într-un număr întreg și este, de asemenea, returneaza un întreg. Deci, dacă am trece în două, două este un număr întreg, se întoarce opt la mie, care este un număr întreg. Deci reveni parametrii nume de tip. Întrebări despre asta? Și apoi valoarea de returnare este de fapt specificată la sfârșitul spunând retur și apoi se întoarce, indiferent de conține valoarea de returnare. Deci, în acest caz, dacă vom pune totul împreună, o functie are în parametri, se numește ceva, și returnează ceva care este tipul că ne spune că a fost de gând să fie. Orice întrebări? Deci, cum putem folosi o funcție? Ei bine, vom scrie o funcție și apoi le folosim în programul nostru, nu? Așa că am chemat cub, și atunci eu pot folosi cub. Dar ceea ce este important de reținut este faptul că problemele de ordine. Dacă am cub de mai jos principal, este va rula în cub. Și la acest punct, nu e nimic numit cub în program, și este doar de gând să fie ca, am nici o idee despre ceea ce este de cub. Așa că vă va spune, implicit declarație de funcție. Asta e eroarea care apare. Și astfel, în acest caz, cub este de mai jos principal, așa că nu se va să știu despre el. SPEAKER 5: Deci principal este, de obicei, definit ultima funcție? JOSEPH: Deci, întrebarea este, este principalul obicei ultima lucru pe care te-ai defini? Și nr. Este pentru că ne place, de obicei, principala să fie în partea de sus, nu? Pentru că asta e primul lucru pe care doresc deschiderea programator program pentru a vedea. Și așa cum putem rezolva această problemă de noi Vreau principal să fie în partea de sus, dar Funcțiile pe care le doresc, le vrem să fie sub principala încă putea folosi le în interiorul de principal? Ei bine, vom folosi ceea ce numim un prototip funcție. Deci, ce este un prototip funcție, în esență, este este este nevoie în primul rând ceea ce semnătura sau antetul funcției de ceea ce vrem să pună în aplicare în jos aici, și l-am pus la partea de sus a unui program. Deci, în acest caz, spunem că, ei bine, mai târziu în programul nostru, vom pentru a face o promisiune pentru a implementa acest Funcția numit cub int, care are un număr întreg de intrare. Deci, acum, pentru că este mai presus de principal, principal, se va spune, oh, bine, mai târziu, în cadrul programului, care va fi acolo, așa că am putea referi la ea, așa că am să pur și simplu lăsați-l să meargă prin intermediul pentru acum. Și apoi în partea de jos, vom pune în aplicare cub. Și apoi principal va spune doar, bine, se va sorta de legătură aceste două simboluri împreună. Și vom acoperi ceea ce că înseamnă mai târziu. Și astfel se va ști că aceasta este Funcția cub că ar trebui să folosească. ROB: [inaudibil] despre care doresc principal în partea de jos sau top, l-am văzut atât. Există lucruri pe care le place doar să pună principal în partea de jos. Dar, odată ce un proiect devine deosebit de mare, de obicei principal este într-o fișier propriu. Și în acel moment, la fel ca int linie cub ar fi - interiorul stdio.h sunt o adunătură de linii la fel ca asta int linie de intrare cub Int. Și astfel aceste prototipuri sunt lucruri pe care le tendința de a pune în fișiere antet, la care punct, nu contează. Ei bine, nu contează. Cei care merg întotdeauna în partea de sus. Și dacă principal nu este un fișier propriu, nu trebuie să vă faceți griji cu privire la punerea prototipuri funcționale individuale în fișierul. JOSEPH: Și vom ajunge la asta un pic Puțin mai târziu, când Rob începe să vorbească despre compilarea. Și deci nu este, de asemenea, o diferență între parametru și argument. Și parametru este doar ceea ce noi numim aceste intrări atunci când definim funcția. Și noi numim un argument, atunci când ne-am de fapt, se trece în funcția. Deci, în acest caz, acest lucru este un parametru, așa cum am spus mai înainte. Și când ne-am folosi de fapt acolo, cub de x, atunci x este în sine ceea ce noi numim un argument la cub funcția. ROB: Deci, argumentele parametrilor sunt - există această distincție, foarte confuz interschimbabil. În acest moment, pentru mine, e ca unul din aceste cuvinte că, atunci când o văd în sălbăticie, eu nu pot ajuta, dar imediat întrebarea dacă acestea sunt folosind-o în contextul corect, pentru că Diferența este destul de subtil că doar toată lumea tinde - Eu spun aproape întotdeauna argument indiferent de ceea ce vreau să spun. Iosif și funcții sunt de asemenea utile pentru ceea ce noi numim efecte secundare. Deci, o funcție poate lua nici intrări, și se poate produce, de asemenea, nu există rezultate. Deci, în acest caz particular, eu sunt definind o subrutină care nu are valoare reveni. Și în scopul de a preciza că, vom folosi ceea ce noi numim un gol aici. Și astfel efectul secundar al acestei funcții este că se imprimă doar lucruri de la pagina. Aceasta nu ia de fapt, orice intrări, și nu produc de fapt orice rezultate. Dar acest lucru ar putea fi util, în sensul dacă doriți, de exemplu, depanare ceva în programul tău, dacă vrei pentru a scrie un pic de subrutină care imprimă, să zicem, conținutul de memorie sau ceva. Și astfel aceste efecte secundare sunt uneori utilă în afara contextului de la fel ca intrări și ieșiri. Orice întrebări? Și pentru a pune capăt acestui segment special, ceea ce face acest program face? Vă voi da voi o pereche de secunde pentru a citi prin ea. La un nivel foarte de bază, ceea ce vrem să spune este că swap-uri x și y, corect? Deci, câți dintre voi cred de fapt aceasta va schimba x și y? Ridică mâna. Nici unul. OK. Cine crede că se va nu schimba x și y? Și suma care a fost nu întreaga cameră. Deci, unii oameni nu sunt sigur. OK. Asta e rezonabil. Deci, haideți să mergem prin ceea ce se întâmplă atunci când Te sun de fapt funcții pentru prima dată în Pentru a răspunde la această întrebare. Deci, asta este ceea ce de memorie un fel de arata ca. Acest lucru este ca un fel de model simplificat de ce memorie arată ca atunci când executați un program. Deci, există ceva numit stiva de aici și ceva numit heap. Și acestea să crească față de mijlocul de memorie. Deci, în acest caz particular, atunci când apela o funcție, ea se pune pe stiva. Și apoi tot ce este conținută în acea Funcția rămâne în ceea ce noi numim asta cadru stivă funcția lui. Și așa mai departe pentru a obține o vizualizare frumoasă a acest, hai - de exemplu, am avut Programul principal mai devreme. Și în interiorul principal, am sunat cub. Deci principal ar merge în primul rând pe stivă cadru, pentru că este prima funcție care se numește. Și atunci când cub se numește în interiorul principal, aceasta se pune pe partea de sus de principal în interiorul memoriei. Deci, ceea ce veți observa aici este că cub are propriile sale parametri și ei localnici proprii. Deci, atunci când treci de fapt, ceva de o funcție, parametrii care se devine sunt copii de ceea ce a fost a trecut de la principal. Și la fel a explica acest lucru, să mers pe jos printr-un program. Deci avem stiva, acest lucru este doar porțiunea stivă. Și ceea ce facem este să inițializa primul x și y pentru a unu și doi. Deci avem aceste cutii mici. Stau în stiva principală de încadra pe stiva. Acestea conțin unu și doi. Acum, noi numim de swap. Ce se întâmplă este că trece x și y în swap, și de swap creează propriile sale copii de aceste variabile de a utiliza în interiorul a cadrului de stivă. Deci, acum, acolo, avem o, care conține valoarea pe care a avut x, și b, care conține valoarea pe care a avut y. Deci unul, doi. Și veți observa că acest lucru este separată de x și y în interiorul principal. Deci, acum vom crea o temporar variabilă să conțină o. Am stabilit un egal cu b, așa că modificări la unu la doi. Și apoi ne-am stabilit b egal la temp, care este unul. Și atunci acum ne-am ieși afară din această funcție. Când ieșiți din funcție, cadru stivă se mi-a venit de pe stivă. Noi o numim împinge. Vă împinge un cadru de stivă pe stiva și pop, dacă de pe stiva. Și astfel ceea ce se întâmplă este tot ceea ce era în care stiva cadru fel de doar merge până în flăcări. Și astfel încât nu mai există. Dar ce am observat? Noi nu sa schimbat, de fapt, valori ale lui x și y, nu? Deci, cei care au rămas în principal locale. Și prin trecerea lucruri în schimb, ne-am de fapt, a schimbat niciodată aceste valori. Și ce noi numim acest lucru? Noi numim această trecere de valoare. Deci, în C, atunci când trece lucrurile în funcții, le trece de valoare și face o copie a acestora pentru funcția de utilizat. Și vom învăța despre ceva numit trecând de referință mai târziu, dar asta e un fel, puteți rezolva această problemă. Dar nu va faceti griji cu privire la care până mai târziu. ROB: Și, de fapt, că pe termen lung, care trece de referință, deci C nu are nici măcar trece prin corelarea. C exclusiv de a trece de valoare. Indiferent de ceea ce faci, ești mereu trece o copie a ceva. E doar faptul că, la fel ca un fel de am menționat că, înainte cu indicii și că un șir este de fapt doar patru bytes indicând undeva în memorie. Ei bine, dacă am avea acest șir și este spunându-mi că este în cazul în care șirul - bine, dacă am avea acest pointer la această loc în memorie, atunci eu pot trece o copie de care pointer la o funcție, și că funcția de încă știe unde în memorie este. Deci, ambele aceste indicii sunt orientate în același loc în memorie, și care este modul în care vom fi capabili de a modifica lucruri dincolo cadru stivă curent. JOSEPH: Vrei sa faci compilarea? ROB: Nu, e 5:30. JOSEPH: OK. Este 05:30. OK. Deci, vom acoperi compilarea Cred că în secțiunea următoare, sau secțiune dvs. Leader va la acel moment. Și - ROB: Orice întrebări? JOSEPH: Orice întrebări? Da? SPEAKER 5: Folosind siruri de caractere de la CS50, orice funcțiile pe care le doriți să le utilizați pentru cei, care va fi ca funcții C. CS50 nu a mers în și făcut orice suplimentare. ROB: Corect. Oricare din C ca [inaudibil], tu ar folosi cele de pe siruri de caractere noastre. JOSEPH: Si un ultim lucru pe care vreau să menționat este că avem un ghid de stil pentru această clasă. ROB: Oh, da. JOSEPH: Deci, dacă ai venit de la un programare fundal înainte, ar putea avea anumite convenții, atunci când esti scris cod ca punerea bretele de pe aceeași linie sau special modalități de crestarea sau numirea variabilele. În această clasă, dorim să urmeze o Ghid de stil specific doar pentru că, bine, dacă te duci afară și să lucreze în industrie, ai de gând să fi așteptat să urmeze ghidul de stil al Compania la care te duci la. Cum ar fi de exemplu, Facebook cred are un anumit fel de a numi convenție. Și nu există diferențe între cămilă variabile carcasei și la fel ca separându-le cu subliniere. Și, de asemenea, cred că cel mai important, cum ar fi de exemplu, indentare, corect? Noi nu începe acolade unde Condiția este, și ei sunt pe linia următoare. Și am pus, de asemenea, acolade în chiar dacă este o singură linie. Și o mulțime de ori, există modalități de a face aceasta în cazul în care vă puteți lăsa aceste bretele off dacă este o singură linie în cazul în care declarația. Dar în această clasă, dorim să urmeze o Ghid de stil specific doar astfel încât să obțineți utilizate pentru astfel de lucruri. ROB: Da, și stil de 50 se va pune în aplicare acest ghid de stil, și suntem de gând să utilizeze Style 50 la gradul codul. Deci, ea face lucrurile mai ușor pentru noi și sperăm că nu ar trebui să facă lucrurile pe care mult mai rău pentru tine, având în vedere stil standardizat nu ar trebui să fie faptul că nerealiste. JOSEPH: Și, în sfârșit, pentru a găsi stilul Ghid, du-te la manual.cs50.net/style. Și da. SPEAKER 4: Ai de gând să pună în aplicare orice caractere pe linie? ROB: Da. JOSEPH: Îmi pare rău, băieți. ROB: E ca unul dintre singurii. În acest moment, eu sunt OK cu 120. Sunt OK cu a spune 120 caractere pe linie. Am înțeles că a fi unele limite. Cred că 80 este atât de mic, dar suntem o aplicare. JOSEPH: Personal, cred cu C, 80 de caractere este mai bine. Odată ce ați începe obtinerea de alte limbi, cum ar fi JavaScript și PHP, nu deci rezonabil să se limiteze doar l la 80 de caractere. OK. Ei bine, asta a fost secțiunea de super. Vrea cineva bomboane? SPEAKER 4: Da.