DAVID J MALAN: Toate dreapta, astfel încât acesta este CS50. Și aceasta este în mod clar o zi de vineri. Și acesta este sfârșitul săptămânii o. Deci s-ar putea aminti că am rămas, ultima dată, cu o cliffhanger de felul. Prin care ne-am expune această minciună, că nu indiferent de ce ai fost învățat în creștere up, 1 împărțit la 10, nu este, în De fapt, 0.1 sau 0.100 sau 0.10000. De fapt, dacă ne-am compila acest Programul, așa cum am făcut ieri, cu, face imprecizie, și apoi face punct, slash, imprecizie, am aflat că aceasta este ceea ce este 1 împărțit la 10 este de fapt. Așa că nu e într-adevăr destul cazul. Dar acest lucru nu aluzie la un limitare fundamentală de calculatoare. Și într-adevăr, printre lucruri pe care le de gând să faci astăzi este aruncăm o privire la ce are acest sa întâmplat, ce implicații are acest lucru, cum umanitatea nu a reușit pentru a înțelege acest lucru în unele foarte situations-- gravă rezultatul pe care a fost destul de tragice și, de asemenea, și expensive-- aruncăm o privire la modul în care poate apăra de fapt împotriva acestor tipuri de limitari. Deci intuitiv, probabil, de ce este 1 împărțit la 10, în conformitate cu computerul meu aici, nu doar 1/10, 0,10? Da. Ce crezi? AUDIENTA MEMBRU: radix este diferit? DAVID J MALAN: a ceea ce este? Oh, radix este diferit? Deci, nu destul. Este de fapt mai mult fundamentală pentru hardware-ul. Alte gânduri? Da. AUDIENTA MEMBRU: Ei reprezintă numere diferit? DAVID J MALAN: Deci they-- dreapta. Aceștia reprezintă un număr diferit. Inexact, aparent. Astfel încât este-- Ei bine, diferit de ceea ce? Sau de la cine? De la noi? AUDIENTA MEMBRU: Da. Ei nu folosesc zecimal sistem de [neauzit]. DAVID J MALAN: OK. Deci, într-un sens, ei nu folositi sistemul zecimal. Sub capota, totul este, într-adevăr, binar, si asta e relevant, de fapt. Dar este chiar un simplu explicație decât că. Da. AUDIENTA MEMBRU: Ei doar atât de multe de biți. Ele pot stoca doar până la o anumită măsură, cum ar fi cu zecimale. DAVID J MALAN: Da. Aceasta este ceea ce adevărat obtinerea la ea. Se pare că de calculatoare de obicei, întotdeauna va numai utilizați o cantitate finită de informație pentru a reprezenta ceva. Corect? La urma urmei, avem doar un fix cantitate de spațiu pe hard disk. Avem doar o sumă fixă de RAM, sau memoria unui calculator. Și, dacă aveți doar un sumă fixă ​​de ceva, cu siguranță nu se poate conta de fapt, la infinit sau orice număr pe care doriți. Tu, un fel de, trebuie să alege și alege ceea ce gamă de valori ai de gând să sprijine. Și astfel, de exemplu, o săptămână sau două Acum, când am vorbit despre ASCII, si am vorbit aproximativ 8 biți, sau un octet, ca să spunem așa, cel mai mare număr am putut reprezintă cu 8 biți a fost ce? 255. Și putem reprezenta 256 de valori totale dar nu în cazul în care ne petrecem una dintre ele pe 0-- Ei bine, dar dacă petrece una dintre ele pe 0, apoi cel mai mare număr este, desigur, 255. Deci, se dovedește, că acest lucru este cazul de asemenea, în acest context. Am început să vorbim, ultima dată, despre numere în virgulă mobilă, care sunt diferite de numere întregi, în că au un punct zecimal și, să sperăm, unele numere după aceea, dar ele sunt prea. Un computer este doar de obicei merge de a utiliza 32 de biți, poate 64 biți pentru a reprezenta o valoare în virgulă mobilă. Deci, chiar dacă ne-am crescut matematica de învățare și cunoscând pe care le puteți avea absolut un număr infinit de numere după virgulă, nu dacă aveți memorie finită. Tu, un fel de, trebuie să rotund, sau alege și alegeți care Numerele ai de gând să reprezinte. Și astfel vă puteți gândi, într-un sens, aceasta fiind apropiată calculatorului aproximare a valorii 1/10 care se poate obține, cu doar 32 de biți sau cam asa ceva. Și nu este vorba doar 1/10. De exemplu, dacă am schimba acest lucru 1/3, care noi credem ca este chiar simplu. Deci, 1 împărțit la 3. Permiteți-mi să salvați fișierul. Lasă-mă să merg mai departe și recompilați-l. Și lasă-mă să re-a alerga it. Aici de asemenea, se pare, nu este de 0,3 1/3 și apoi un număr infinit de 3 lui după aceea. Aveți această imprecizie la sfârșitul anului. Deci, noi, oamenii, sunt corecte, și ceea ce ai învățat este, de fapt, corect, dar suntem lovire până împotriva unele limitări. Și ce m-am gândit am face astăzi, este începe uitandu-se la, sincer, The consecințe tragice ale acestui uneori, atunci când omenirea nu destul de punerea în aplicare a pentru această realitate, iar aceste limitări. Și vom vedea o serie de viniete de la Canalul History care are o privire la modul lucrurile au mers prost. Este de aproximativ 8 minute, și vom reveni după acest și să ia o privire la exact ce altceva poate merge prost. Dacă am putea dim lights-- [VIDEO PLAYBACK] -Computers, Am ajuns toți să accepte problemele de multe ori frustrant că du-te cu ei. Bug-uri, viruși, și software-ul glitches sunt preturi mici să plătească pentru comoditatea. Dar, în high-tech și de mare viteză aplicatii de program spațiu militare și, cea mai mică problemă poate fi amplificat în caz de dezastru. Pe 4 iunie, 1996, oamenii de stiinta pregătit pentru a lansa o racheta fara pilot Ariane 5. Acesta a fost transportă științifice sateliți proiectat pentru a stabili precis cum Interacționează campul magnetic al Pamantului cu vânturi solare. Racheta a fost construit pentru Agenția Spațială Europeană și a ridicat off de la facilitatea de pe coasta Guyanei Franceze. -Si Aproximativ 30 de secunde în zborul, ei mai întâi observat ceva mergea prost. Că duzele au fost rotativ într-un mod care într-adevăr nu ar trebui. În jurul valorii de 40 de secunde în zbor, în mod clar vehiculul a fost în necaz, și că este atunci când au făcut decizia să-l distrugă. Range Officer de siguranță cu curaj extraordinare apăsat butonul, aruncat în aer racheta înainte de a putea deveni un pericol pentru siguranța publică. -Asta A fost fecioara călătorie de Ariane 5, și distrugerea ei a luat loc din cauza unui defect încorporat în software-ul racheta lui. -cele Problemă cu privire la Ariane a fost că nu există a fost un număr care este necesar 64 de biți pentru a exprima, și a vrut să transforme l la un număr de 16 biți. Ei au presupus că numărul nu a fost niciodată de gând să fie foarte mare, că cele mai multe dintre aceste cifre în numărul 64 biți au fost de 0 lui. Ei au fost greșit. -cele Incapacitatea de o program software pentru a accepta tipul de număr generat de alta a fost la originea eșecului. Dezvoltare de software a devenit o parte foarte costisitoare de noi tehnologii. Ariane 4 Racheta a fost foarte de succes, atât de mult a software-ului creat pentru ea a fost de asemenea folosit pe Ariane 5. -cele Problemă de bază a fost că Ariane 5 a fost mai rapid, accelerat rapid. Și software-ul nu a avut a reprezentat pentru asta. -cele Distrugerea rachetei a fost un dezastru financiar imens, toate din cauza unei erori de software minut. Dar acest lucru nu a fost primul Probleme de conversie a datelor în timp a afectat tehnologiei moderne de rachete. -În 1991, cu începutul din primul război din Golf, de rachete Patriot experimentat un fel similară de probleme de conversie număr. Ca urmare, 28 de persoane, 28 soldați americani au fost ucise și aproximativ 100 alții răniți, în cazul în care Patriot, care trebuia pentru a proteja împotriva scuds primite, nu a reușit să tragă o rachetă. -Când Irakul a invadat Kuweitul și America lansat Desert Storm, la începutul anului 1991, Baterii de rachete Patriot au fost dislocate pentru a proteja Arabia Saudită și Israel de atacuri cu rachete irakiene Scud. Patriot este un mediu-gama de SUA sol-aer sistem fabricat de compania Raytheon. -cele Dimensiunea separatorului Patriot, în sine, este de aproximativ, aproximativ 20 de picioare lungime. Si cantareste aproximativ 2000 de lire sterline. Și-l poartă un focos de about-- Cred că e cam 150 de lire sterline. Și focosul, în sine, este un exploziv de mare, care are fragmente din jurul ei. Carcasa de focosul este concepute pentru a acționa ca alice. -cele Rachete sunt transportate, 4 per container, și sunt transportate de o semi-remorcă. -Sistemul De rachete anti Patriot datează de cel puțin 20 de ani acum. Acesta a fost proiectat inițial ca o rachetă de apărare aeriană pentru a trage în jos avioane inamice. În primul război din Golf, în momentul în care războiul a venit de-a lungul, Armata a vrut să-l folosească pentru a trage în jos scuds, nu avioane. Forța irakian nu a fost atât de mult de o problemă, dar armata a fost îngrijorat scuds. Și astfel au încercat să upgrade de Patriot. -Intercepting Un dușman rachetă care călătoresc la cinci următor a fost de gând să fie o provocare destul. Dar când Patriot a fost grăbit în funcțiune, Armata nu a fost conștient de un Modificarea irakian care a făcut scuds lor aproape imposibil de a lovi. Ce sa întâmplat, este scuds care veneau în, au fost instabile, au fost deteriorate. Motivul pentru aceasta, a fost irakienii, pentru pentru a obține 600 de kilometri de o gamă de rachete 300 km, a luat în greutate din focosul față și a făcut focosul brichetă. Deci, acum, lui Patriot încearcă să vină la Scud, și cele mai multe ori, marea majoritate a timp, s-ar zbura doar de Scud. -După Operatorii de sisteme Patriot realizat Patriot ratat ținta, au detonat focos Patriot, a pentru a evita posibilele victime dacă ea a fost lăsat să cadă la pământ. Asta a fost ceea ce a văzut mai mulți oameni, aceste mingi de foc mari de pe cer, și înțeleasă greșit ca interceptări de focoase Scud. Deși în noaptea Cer, Patriots a apărut pentru a fi cu succes distrugerea scuds, la Dhahran, ar putea exista nici o greșeală despre performanțele sale. Există, sistem radar Patriot de pierdut urma unui Scud de intrare, și niciodată nu a lansat, din cauza unui defect de software. Acesta a fost israelienii care au descoperit primul că mai era sistemul pe, cea mai mare de timp diferența devenit, datorită un ceas încorporat în calculatorul sistemului. -Despre Două săptămâni înainte de tragedia din Dhahran, israelienii au raportat la Departamentul Apararii, că sistemul a fost pierdut timp, că după aproximativ 8 ore de funcționare, au observat că sistemul a fost devenind vizibil mai puțin precisă. Departamentul de Apărare a răspuns prin spune toate bateriile Patriot să nu părăsească sistemele pe de o lungă perioadă de timp. Ei nu au spus ceea ce a fost de mult timp. 8 ore? 10 oră? 1000 ore? Nimeni nu știa. -cele Baterie Patriot staționate la cazarma la Dhahran, și defecte interne de ceas, fusese pe peste 100 de ore în noaptea din 25 februarie. -Este Timpul urmarite cu o acuratețe de aproximativ 1/10 dintr-o secundă. Acum 1/10 dintr-o secundă este un număr de interesant deoarece nu poate fi exprimată în binar, exact. Ceea ce înseamnă, nu se poate se exprimă, exact, în orice computer digitale moderne. E greu de crezut, dar folosi acest lucru ca un exemplu. Să luăm numărul, 1/3. 1/3 nu poate fi exprimat în zecimal, exact. 1/3 este 0.333 întâmplă pentru infinit. Nu există nici o modalitate de a face acest lucru, cu precizie absolută, în zecimal. Asta e exact același tip de problemă care sa întâmplat în Patriot. Cu cât sistemul a fugit, The mai rău eroarea de timp a devenit. -După 100 de ore de funcționare, eroarea în timp a fost doar aproximativ 1/3 de secundă. Dar, în ceea ce privește o direcționare rachetă care călătoresc la mach 5, aceasta a dus la o urmărire eroare de peste 600 de metri. Ar fi o eroare fatală pentru soldații de la Dhahran. Ce sa întâmplat, este o lansare Scud fost detectat de sateliți de avertizare timpurie, și ei noi că a fost Scud venind în direcția lor generală. Ei nu știu de unde venea. -A Fost acum până la radar componentă a sistemului Patriot, apărarea Dhahran, pentru a localiza și să păstreze evidența rachete inamice primite. -cele Radar a fost foarte inteligent. Aceasta ar urmări de fapt poziția Scud și apoi prezice unde probabil ar fi, data viitoare, radar a trimis un puls afară. Care a fost numit poarta gama. -Atunci, Odată Patriot decide suficient timp are trecut să se întoarcă și să verifice următoarea locație pentru acest obiect detectat, merge înapoi. Deci, atunci când s-au întors la greșit loc, se vede atunci nici un obiect și se decide că nu a existat nici obiect, a fost o detectare falsă, și picături pista. Viitorul Scud dispărut Din ecranul radar, și secunde mai târziu, ea trântit în barăci. Scud ucis 28 și a fost ultima unul a tras în timpul Primului Război din Golf. Tragic, software-ul actualizat a ajuns la Dhahran în ziua următoare. Defect de software a avut fost determinată, de închidere un capitol în tulbure istoria de rachete Patriot. [END PLAYBACK] DAVID J MALAN: Deci, vom arunca o privire la unele limitări similare în doar un pic. Dar, mai întâi, să trecerea la câteva FYI e. Deci Unu acest weekend, acolo va fi super secțiuni, care sunt menite să înlocuiască secțiuni programate regulat, care va începe o săptămână de aici. Uitați-vă la site-ul de CS50 pentru mai multe informații cu privire la acestea. Acestea vor fi, de asemenea, filmat și difuzat traiesc pentru cei care nu pot participa. Problema set 1 este pe site-ul cursului deja, și vom arunca o privire la că, în doar un pic. Și ore de birou de asemenea, va lua plasa acest luni până joi. Deci aceasta a fost cea mai canonice Programul ne-am uitat la ultima dată. E ca și cum cel mai simplu program puteți scrie în C, și chiar că este un pic de o cerere îndrăzneață. Corect? Pentru că există o mulțime de părând complexitate la acest lucru. Deci, haideți să aruncăm o privire rapidă la ce unele dintre aceste elemente au fost și apoi încercați să furnizeze un model mental pentru modul acestea mai simplă de programe de lucru, iar apoi vom începe privi lucrurile tot mai complexe. Deci, această linie de aici, a subliniat acum, în galben, ceea ce a spunem, ultima dată, că acest lucru nu pentru noi? Care este scopul servește? Oricine de la mai departe înapoi? Da. AUDIENTA MEMBRU: [inaudibil] DAVID J MALAN: Bine. Așa că vă oferă acces la comenzi, sau să le numesc funcții, că cineva altceva scris, care sunt declarate, ca să spunem așa, într-un alt dosar. Deci, vom vedea exact ceea ce un fișier .h este versus un fișier .c, în cele din urmă. Dar pentru moment, doar știu care printf, de exemplu, este printre funcțiile care au fost a declarat într-un alt fișier, undeva altceva de pe hard disk nor de care ne permite să acceseze printf și de a folosi fără a fi nevoie să reinventeze că noi roți. Între timp, principala. Care a fost analogul de principal săptămâni, trecută? Da. AUDIENTA MEMBRU: pavilion verde se face clic. DAVID J MALAN: Da. Scratch lui, atunci când steagul verde clic. E ca și cum piesa de puzzle care începe things off. Și așa în mod similar, a făcut lumea a decis câțiva ani în urmă că în C, și o grămadă de alte limbi, dacă doriți să scrie un program, prima funcția trebuie să fie numit, principal. Și trebuie să arate ca aceasta. Dar ne vom întoarce, un alt timp, ceea ce, Int, și, gol, înseamnă în acest context. Pentru moment, acolade sunt un fel de ca formă piesa de puzzle Scratch lui care încapsulează un numar de linii. Și printre pe liniile aici, este cel de aici. printf este o funcție al cărei scop în viață este de a imprima un șir formatat. Și de formatat, vă spun pot conecta în valori substituent, și puteți să specificați cât de multe zecimal puncte, câte numere pentru a imprima după un punct zecimal și altele asemenea. Și printf, desigur, ia unul sau mai multe argumente sau parametri, altfel cunoscut, mai simplu, ca intrări. Deci printf, ca o mulțime de funcții, ia intrări. Și aceste intrări sunt îmbrățișat de cele două paranteze aici. Si in interior dintre acestea este o intrare. Este un șir de caractere, așa cum l-am numit, care este doar o secvență de caractere, ca un cuvânt, sau o frază, sau un întreg eseu chiar, între ghilimele duble. Și asta e ceea ce se întâmplă la influența Comportamentul de printf cauza, desigur, e doar o funcție de imprimare generic. Nu va ști ce să pentru a imprima, dacă nu-l spun. Și apoi, unii punctelor caracteristice. Ce am spus acest lucru ciudat secvență de simboluri este? Da. AUDIENTA MEMBRU: linie nouă. DAVID J MALAN: linie nouă. Deci, se dovedește, nu poți pur și simplu lovit, intra, atunci când scrii programului. În general, compilatorul este mergi la a lua un pic confuz cu privire la ceea ce vrei să spui. Mai degrabă, trebuie să literalmente spun, da-mi o nouă linie aici. Și așa / n, în general, este ceea ce am apela un caracter de evacuare. Deci n, pentru noua linie. Și compilatorul stie că, atunci când vede / n, aceasta ar trebui să inducă fapt calculator, în cele din urmă, sau printf, în acest caz, pentru a imprima un nou real line, cum ar fi lovind, intra, tastă de pe tastatură. Și, în fine, ceea ce a făcut spunem această bucată de sintaxă este pentru? Ce nu-l reprezintă? Da. AUDIENTA MEMBRU: [inaudibil] DAVID J MALAN: E doar capătul liniei. Este sfarsitul declarația. Și să realizeze că noi nu le-a pus peste tot. Noi cu siguranță nu le-a pus la capetele de fiecare linie. De exemplu, există nimeni cu privire la de prima linie, nu e nimeni pe linie cu, principala, nu e nici unul după acolade, dar veți începe să vedeți și de a lua familiarizat cu unde este solicitat. Și e aproape întotdeauna după o funcție apel sau o declarație, o acțiune că sunteți de fapt luați. Și știu acum, mai ales dacă printre cei mai puțin confortabil, Acestea sunt tipurile de lucruri stupide că veți termina trage accidental capul de perete de peste. Pentru că vei putea logic încrezător în unele probleme ai rezolvat o problemă pentru set, și al naibii lucru doar nu va compila sau chiar executați. Și atât de des, de timpuriu, o să fie pentru că ai ratat o paranteză, sau ai ratat un punct și virgulă. Și așa doar să fie conștient din aceste tipuri de lucruri, și încercați să nu pentru a obține frustrat de ei, deoarece foarte repede face acest lucru devin pălărie vechi. Dar este foarte ușor pentru a obține frustrat timpuriu, ca un rezultat. Deci, acum, haideți să aruncăm o privire la modul în care această linie este, de fapt de lucru și apoi uita-te la un ușor unul mai complicat. Deci, avem peste Aici, capacitatea de a se bazeze pe acest ecran. Și să presupunem că acest lucru este ecranul computerului meu, dar am scris, salut programul, și nu au pus în aplicare, printf. Altcineva a pus în aplicare, printf. Cine ar dori să pretindă la au pus în aplicare, printf? Dacă am putea? Bine, care e numele tău? STUDENT 1: [? Copal. ?] DAVID J MALAN: Copal, haide sus. Haide sus. In regula. Deci avem, aici, unele etichete de nume, din moment ce vom face un mic joc de acest lucru. Și vă vom suna, printf. Și dacă vrei să vii aici, ceea ce tocmai am desenat pe ecran, este destul de simplu, nu sunt eu, asta. Bine, deci, Buna ziua numele meu este, printf, dacă doriți pentru a pune asta pe. In regula. Și dacă puteți merge suport de pe ecranul computerului ca și cum sunteți funcția pe care a venit cu acest sistem informatic. Și scopul tău în viață este pentru a imprima de fapt ceva. Dar la fel ca programul ne a avut doar pe ecran, aici, vom trebui să de fapt, vă dau câteva intrare. Și astfel, în cazul în care de intrare meu, aici, este aparent, ceea ce este trecut la printf, hai fel de ea bate joc așa. Am de gând să scrie literalmente pe o bucată de hârtie, "Bună ziua, lume," backslash N. Și să fie clar, ceea ce Tocmai am desenat pe această bucată de hârtie, arata ca acest lucru. Așa că atunci când am rula acest program, iar acest lucru linie de cod galben este executat, e ca și cum I, programul salut, Sunt predarea unele de intrare pe la o funcție că altcineva a scris. Și dacă, cu degetul, ar putea, de fapt, cu degetul, desena pe ecran, indiferent de este ați fost înmânat, efectul, în cele din urmă, este de a vedea exact care, pe ecran. Și un caz mic colt aici. Si bine, noi nu ar trebui să vedeți , linia noua, în acest moment. Ar fi incorect pentru tine să atragă în mod explicit newline. Dar dacă ne-am păstrat scris cuvinte pe ecran, s-ar ajunge mai jos care. Așa că vă mulțumesc foarte mult, dar stick în jurul valorii de aici pentru doar un moment. Avem nevoie acum un alt voluntar, dacă am putea, care va trebui să joace rolul de-- E doar oameni din orchestra acum. Cum about-- OK. Chiar aici. Haide sus. Care e numele tău? STUDENT 2: [? Ivay. ?] DAVID J MALAN: Ne pare rău? STUDENT 2: [? Ivay. ?] DAVID J MALAN: Ethan, haide sus. Nu? Am primit asta greșit, chiar după ce ai spus de două ori? Haide sus. E greu să auzi aici. BINE. Și îmi pare rău, care e numele tău? STUDENT 2: [? Ivay. ?] [? DAVID J MALAN: Ivay. ?] BINE. Pentru moment, dacă nu minte, ești getString. STUDENT 2: OK. Misto. DAVID J MALAN: Deci, dacă doriți să stea aici pentru o clipă, haideți să aruncăm o privire la o ușoară Programul mai complex, care are acum trei linii de cod. Deci avem, o, afirma numele dvs. folosind printf; doi, un apel la getString, urmată de o misiune într-o variabilă numită, string s, sau numit s; și apoi un alt apel la, printf, dar de data aceasta cu două intrări. Stat așa că am făcut deja numele dvs., sau, mai degrabă, ne-am deja făcut un apel printf. Deci, am de gând să scrie, de stat numele tau. Și astfel, ce am de gând să trece, printf, într-o clipă, este destul de simplu, acest lucru. Deci, dacă vrei să mergi mai departe și să acest pe ecran, care este de intrare dumneavoastră acum. In regula. Și uita șir, acum avem propria noastră linie de cod aici. Deci, în, getString, avem nevoie de pentru a apela de fapt, getString. Deci, scopul tău în viață este de a merge doar afară, în orchestra, dacă ai putea, și de a lua numele cuiva. Dar să vă dau ceva să-l puneți pe. Dacă doriți să, du-te înainte și a obține un șir de caractere, obține numele cuiva pe care bucată de hârtie, dacă ai putea. In regula. Și vom vedea, într-o clipă, al cărui nume ne apropiem. Între timp, ceea ce am de gând să au pregătit, este o piesă goală de hârtie, în care, am de gând pentru a stoca orice valoare se este că getString se întoarce la mine, I, fiind o variabilă string numit, s. In regula. Deci, ce ai aici? Nik. In regula. Deci avem numele lui Nik aici. Deci, asta este ceea ce literalmente a fost returnat pentru mine, ca să spunem așa, de getString. Eu, acum, am de gând să executa partea stângă de această expresie, în cazul în care pur și simplu notați, în scopuri de astăzi, Nik. Deci, acum, am o variabilă numit, s, stocarea numele lui Nik. Am dat deja la printf, un argument anterior. Dar, în noastră linie de a treia și ultima cod, am de fapt, să printf mână ceva un pic different-- "Bună ziua,% s" backslash n. Și astfel ultima linie am de gând la send-- ultimul lucru sunt O să scriu acum, este aceasta. Deci, cele două linii de cod, sau mai degrabă ultima linie de cod, solicită două inputs-- unul, acest, și doi, aceasta. Deci, dacă funcția noastră printf poate lua acum cum ar fi de intrare, permiteți-mi să goli ecranul pentru tine. De fapt nu, poti sa te duci mai departe. Vom lăsa în sus, din moment ce E pe același program. Ar trebui să vedem, salut, Nik. In regula. Deci, acest lucru a fost destul de puține cercuri pentru a sari prin, doar pentru a scrie, starea ta numele, si, Buna, ziua, Nik. Dar această idee simplă de mesaj care trece, de trecere intrare și de ieșire de recepție, este exact modelul vom avea chiar și pentru cele mai complexe funcții. Așa că vă mulțumesc foarte mult pentru amândoi. Avem o stres minunat minge aici pentru tine. Și vă mulțumesc pentru getString nostru și voluntari printf deopotrivă. Multumesc. In regula. Vă mulțumesc pentru amândoi. Deci am vorbit despre Până în prezent, cea mai mare parte despre siruri de caractere. Și se pare că C poate de fapt înțelege câteva tipuri de date diferite. De fapt, haideți să aruncăm o privire la aceste aici. Deci C, și o mulțime de limbi, înțelege lucrurile numite caractere. O char este, în general, o octet unic, sau opt biți. Și reprezintă un singur caracter, ca litera A, sau de capital scrisoare A, sau scrisoarea litere mici A, sau un semn de exclamare, sau orice caracter care aveți posibilitatea să tastați pe tastatura, și, uneori, chiar mai mult. De asemenea, se întâmplă să vedem flotoare. Un float este, în general, o 32-bit valoare, sau patru octeți pentru că, din nou, un octet este de opt biți. Deci, un float este o valoare în virgulă mobilă, ceva cu un punct zecimal. Și într-adevăr, asta e ceea ce filmul vorbea când au vorbit despre plutitoare Valorile de punct, un numar fix de biti fiind folosit pentru a reprezenta un număr real. Dar există, de asemenea, lucruri numite dublu. Acestea există în Java, dacă ați luat APCS, și un dublu, ca nume de fericire sugerează, este de două ori la fel de mare ca un float. Este încă un număr real, are doar mai mult de biți cu care să fie tot mai precise, sau pentru a stoca numere și mai mari. Int este ușor. Am vorbit despre asta ultima oară. E doar un număr întreg. Și este, în general, 32 biți, sau patru octeți. Și așa, dacă aveți, să vedem acum, 32 bits-- și am făcut acest lucru în săptămâna 0, vreodată atât de pentru scurt timp, dacă aveți 32 de biți, ceea ce este cel mai mare numărul pe care poate reprezenta ca un întreg? Dă sau ia? E ca și cum 4000000000, și asta doar dacă suntem reprezentând doar numere pozitive. Dacă aveți 32 de biți, și doriți să reprezintă numere negative, precum și, Gama este, în esență, negativ 2 miliarde la pozitiv 2000000000. Dar, în general, vom începe la 0 merge până la 4 miliarde. Nu trebuie să știe cu precizie, dar putem vedea acest lucru, de fapt, dacă am doar deschide un pic calculator, aici. Pot face 2 32, și care este exact cat de mare, cât de multe valori puteți reprezintă, cu 32 de biți. Și este de aproximativ 4 miliarde de euro. Așa că vom păstra văzând că numărul în câteva locuri diferite. Dar dacă ai nevoie de mai mult numere decât atât, se pare nu e ceva numit un lung lung. Și un lung lung este în general 64 de biți, care înseamnă că este un ordin de mărime chiar mai mare decât un int. Deci, eu nu pot pronunța cel mai mare Numărul pe care le poate reprezenta, dar e semnificativ mai mare. Acum ca parte, istoric, dacă un int este de 32 de biți, și o lungă lung este de 64 de biți, cum mare este un lung, nu o lungă lung? Ai crede că e mai mult decât un int dar poate mai lung decât un lung lung, dar de fapt depinde. Și așa se pare că unul de frustrările de asemenea, cu scrierea de cod pe anumite sisteme, este faptul că nu toate aceste tipuri de date au valori pre-determinate. Uneori este atât de multe de biți. Uneori este că multe biți. Deci, va trebui de fapt să știe, uneori, ceea ce hardware rulați software-ul pe. Din fericire, alte limbi și alte tipuri de date care există în prezent, vă permit să fie mai precise. Ei bine, am văzut șir, și am văzut bool, de asemenea, dar se pare că cei vin numai cu biblioteca CS50. Deci, cei care nu sunt construite în C. Cei schimb, vin în acel fișier numit CS50.h, că vom în cele din urmă coaja înapoi straturile de. Dar pentru moment, acestea sunt doar Tipuri de date suplimentare. Un bool este un adevărat sau fals, precum și o string este o secvență de caractere, ca un cuvânt. Acum printf, am văzut, are substituenți,% s este unul. Și s-ar putea, de acum, deduce din aceste exemple, cum alte ai putea avea un substituent pentru diferite tipuri de date. De exemplu, să ia o presupunere, dacă a vrut să imprima o singură char folosind printf, substituent este, probabil,% c. Și dacă doriți să imprimați o întreg cu substituent,% i. % LLD este o valoare zecimală lung lung, dar mult timp mult timp, astfel încât hărțile la asta. Și apoi% f pentru plutitoare Valoarea punct sau pentru un dublu, astfel încât, uneori acestea sunt reutilizate în diferite contexte. Deci, vom vedea și de a folosi unii dintre cei lungul timpului. Și printf și alte funcții, de asemenea, secvențe escape altora sprijin ", și uneori, acestea sunt necesare. Deci n backslash este o noua linie. Backslash T, nimeni nu doresc să ia o lovitură de cuțit? AUDIENTA MEMBRU: Tab. DAVID J MALAN: Tab. Deci, dacă doriți de fapt pentru a imprima o filă, nu un număr fix de locuri de real, ci o caracter tab, nu a lovit-ul, fila, tastă de pe tastatură, în general, ce faci de fapt backslash T. Citat dublu backslash, de ce aș dori vreodată asta? Corect? De ce nu pot doar să tastați un citat dublu pe tastatura mea? PUBLICUL MEMBRU: Pentru că, în caz contrar, este O să cred că e sfârșitul de ca print-ul [? text. ?] DAVID J MALAN: Exact. Amintiți-vă, cu nostru exemple printf, atunci când am treceau la printf în intrare, pe partea stângă a șir de intrare care și cu privire la dreptul de intrare care primăvară, desigur, a fost un citat dublu. În cazul în care propria intrare are un dublu citat în mijlocul care, calculatorul ar putea potențial obține confuz, cu privire la, face acest citat dublu aparțin la mijloc? Are parte de cea din stânga? Are parte de un drept? Și astfel, dacă doriți să-l facă super- clar, ce faci backslash citat dublu, astfel că este scăpat, ca să spunem așa, și nu este confundat de altceva. Și există alte câteva aici, R backslash, ghilimele simple, 0, ca să vedem în timp, precum și. Și acum, ce despre funcții? Deci acțiunile pe care le pot lua până acum în această limbă, C, ei bine, ne-am văzut, printf, desigur, și toate de celelalte de pe ecran, aici, că vom folosi pentru Primele doar câteva săptămâni de curs, de veni atunci când biblioteca CS50. Și ele fac mult mai ușor, în C, pentru a obține de fapt, introduse de utilizator. Se pare că, în C, și sincer în câteva limbi, este o adevarata durere în gât pentru a face ceva simplu, cum ar fi solicita utilizatorului pentru tastatură, pentru intrare lui sau a ei. Și astfel aceste funcții face mai ușor. Și are, de asemenea eroare verificarea pe tot parcursul, astfel încât, atunci când amintesc de miercuri, am a văzut, încercați din nou, de avertizare, atunci când nu a cooperat, și am scris un cuvânt, în loc de un număr? Am făcut ridicarea grele devreme pe pentru a vă asigura utilizatorului cooperează. Dar acestea sunt doar de formare roți pe care le vom în cele din urmă, și rapid, scoate. Deci, pentru a recapitulare, apoi, haideți să aruncăm o privire rapidă, la fel ca am facut cu Scratch, la unele construcții canonice în C. Acest lucru este menit să, un fel de, să fie un turneu vârtej de vânt, doar astfel încât să aveți o referință și care le-ați văzut lucruri la inceput. Dar apoi ne vom uita la codificare reală utiliza unele dintre aceste blocuri. Atât de mult ca în Scratch, când ne-am afirmații de genul, spune sau, așteptați, în C, avem funcții precum, cum ar fi printf. Dacă vrem să-și exprime o stare în C, este similară, în spirit, pentru că piesa de puzzle care arata ca acest lucru în Scratch. Dar, în loc, ne-am literalmente doar scrie, dacă. Și apoi, în paranteze, am pus o condiție, în cazul în care această condiție este ceea ce vom apel, din nou, o expresie booleană. Și din nou, aceasta este un fel de pseudocod. Și, de fapt, //, este un comentariu. E doar cuvinte limba engleză pentru mine. Dar acest lucru este general Structura unei, în cazul în care, condiție. Dar vom vedea beton exemple în doar un moment. Dacă doriți să aveți o în ambele sensuri furculiță în drum, mai mult cum am făcut cu voluntar nostru Miercuri, puteți avea o, altfel dacă. Și dacă doriți să aveți un al treilea și starea finală, sau situație implicit, puteți avea doar un bloc altceva, acolo. Și în mod similar, cu expresii booleene, puteți, și, împreună. Și am văzut miercuri, că nu este un singur ampersand, e doi, din motive de nivel inferior, care vom vedea în cele din urmă și să se joace cu. Sau ING-lucruri împreună este de 2 bare verticale. Pe o tastatură SUA, acest este, în general, o cheie cu tasta Shift de mai sus dvs. tasta Enter sau tasta RETURN. Apoi, există aceste lucruri pe care vom folosi poate o dată sau de două ori. Ele sunt funcțional echivalente cu ceea ce se poate face cu o, în cazul în care, în cazul în care altcineva, altceva în cazul în care altcineva, construi, dar se numesc un comutator. Acestea arata foarte diferit, dar vom a se vedea în unele din codul nostru de distribuție, pentru un viitor set problemă, cel mai probabil, că este, uneori, doar o frumoasa modalitate de exprimare ansamblu grămadă de condiții, fără a avea o mulțime de acolade și o mulțime de paranteze și indentare. Dar ne dau mai energie decât avem deja. Și acum bucle. Și aceasta, ne vom uita la un pic mai lent. Dar apoi, vom începe să utilizeze aceste, în special pentru cei deja familiarizați. Aceasta este calea canonic, în cazul în care incredibil mod de arcane, pentru a scrie o buclă în C. Acum o buclă în Scratch a fost destul de simplă. Aveți un, pentru totdeauna, bloc. Aveți un, repeta, bloc cu doar un număr, trebuie să tastați în. Și cu, pentru bucla, puteți pună în aplicare atât de aceste idei, dar e un pic mai tehnic. Dar sincer, e, de asemenea, relativ simplu. Odata ce stii ordinea de operații, vă literalmente sunt doar de gând să conectați în valori și spune calculatorul ce să facă. Deci, aici este un exemplu. Aceasta este o buclă care, destul de pur și simplu, contează de la un număr de până printr-o altă. Și uite de la ea, chiar dacă aveți nici o experiență anterioară cu această limbă, ce număr nu-l, probabil, începe numărarea de la? OK, 0. Și bănuiesc că e pentru că vezi că există un int și un i, care este o variabilă. Este inițializată la 0. Și apoi mai târziu, se pare ca suntem trece printf, o valoare. Și, de fapt, am făcut o greșeală de scriere pic aici. Dar asta e ușor de stabilit. Permiteți-mi să adăugați în, am aici. Avem acum printf ființă a trecut această valoare substituent. Și ce se întâmplă să numere până prin? Audiența: 50. 50. 49. DAVID J MALAN: 49. Deci 50, la prima vedere, pare corect. Dar că, se pare, va fi condiția noastră că păstrăm verificare. Și am de gând să se oprească odată i nu mai este mai mică de 50. Deci această buclă, în schimb, ar trebui să executa, atât timp cât i este mai mic de 50. Dar, de îndată ce acesta devine 50, sau 51, sau, mai rău, ar trebui să se oprească automat. In regula. Deci, ce se întâmplă de fapt aici? Astfel încât acesta este de ordinul a operații pentru o buclă. Unul, aveți așa-numitele inițializare. Acest bucată galben evidențiat de cod este executat în primul rând, și are ca efect faptul că, pe Miercuri, probabil vă imaginați. Se creează o variabilă i și a numit- magazine în care variabila valoarea 0. Deci i este 0 în acest moment în povestea. Următorul lucru pe care se întâmplă în acest construct, este că această condiție devine verificat. Asa ca am verifica imediat, este i mai mică de 50? Și, desigur, răspunsul pentru acum este, cu siguranță, da. Da, pentru că i este 0, și care este cu siguranță mai puțin de 50. Apoi ce se întâmplă, este faptul că această linie de cod este executat. Și, de fapt, în cazul în care există mai multe de linii de cod în aceste acolade, toate se execută una după alta. Și în efectul de aici, este aparent, să imprime I numărul, care este de gând să fie 0, iar apoi 1, și apoi 2. Dar de ce? De ce nu-l crește? Ei bine, al patrulea lucru pe care se întâmplă este că această sintaxă este executat, după virgulă. Am ++ este un mod de a spune prescurtare; ia valoarea I, și se adaugă 1 la acesta; și apoi data viitoare în jurul valorii de, adaugă 1 la acesta; și data viitoare în jurul valorii de, adăugați 1 la acesta. Deci, dacă vom păstra merge, ce se va întâmpla următor este ca eu nu am de gând să inițializa am vreodată. Dacă am păstrat inițializare i la 0, acest exemplu nu s-ar termina, deoarece i-ar fi blocat la 0. Dar ce se va întâmpla este că această condiție vor fi verificate, linia de cod vor fi executate, I va fi incrementat, condiție vor fi verificate, cod va primi executat. Și a ținut din nou cu bicicleta, și din nou, și din nou, până când am ++ induce o valoare de 50. Condiția spune apoi, este mai mică de 50 50? Răspunsul, desigur, nu este, și astfel încât întregul cod se oprește de executare. Și, dacă aveți mai mult de cod de pe ecran jos, asta e ceea ce se întâmplă în continuare. Se iese din aceste acolade și continuă să imprime mai după aceea. Deci, o gluma acum, de la foxtrot, care poate vei înțelege acum. Este intotdeauna amuzant. E ca Chuckles fel de pătrunde, și apoi îți dai seama nu ar trebui fi râs la umor ca asta. Dar există unele Takeaway aici, pedagogic, de asemenea. Deci, se dovedește că eu sunt lipsește o bucată de sintaxă, sau a Foxtrot lipsește o bucată de sintaxă aici. Ceea ce lipsește, că am avut în orice alt exemplu, până acum? Întoarcere, este acolo, așa asta e altceva, că ne vom întoarce la timp, înainte de. Ce lipsește, totuși? Da. AUDIENTA membru: inițializare de [neauzit]. DAVID J MALAN: OK. Deci da. Deci, de fapt, acest este-- Ei bine, și numărul de este initializat deasupra, sau, mai degrabă, a declarat deasupra. Deci, acesta este un alt mod de a face aceasta. Dar nu într-o singură linie este valabil, deși. Ce zici de aici? AUDIENTA MEMBRU: Este acolade? DAVID J MALAN: Da. Deci acolade lipsesc. Dar acest cod, vreau să spun, să lor de credit, este, de fapt, sintactic valabil. Se pare, tu nu nevoie de acolade dacă aveți doar o linie de cod care vrei să execute în interiorul buclei. Acum ne-am mereu, în clasă și în toate de cod de distributie, includ acolade oricum, doar de dragul lui claritate. Dar dau seama că în manuale și exemple on-line, s-ar putea vedea foarte bine ondulat bretele lipsesc uneori. Și asta e în regulă, dacă ceea ce au indentate și destinate este doar o singură linie de cod, și nu mai multe linii de cod, potențial. In regula. Deci, legate de problema imprecizie, este o problemă de preaplin, în sensul că, în mod similar, Nu întregi au limite pentru a le la fel ca valorile în virgulă mobilă? În lumea o virgulă mobilă valori, putem fi atât de precis numai, după care, uneori lucruri rele se poate întâmpla, și programele noastre pot fi buggy și de eroare. Acum, chiar și cu numere întregi, puteți rula în probleme. Acum un număr întreg nu are un punct zecimal sau numere după el. E doar un număr natural, de obicei. Deci, ceea ce ar putea merge în neregulă cu un int? Dacă eu sunt, folosind un int a Contele, ceea ce ar putea merge prost? Pare mult mai simplu. Da. AUDIENTA MEMBRU: în cazul în care Numărul devine [Inaudibil] DAVID J MALAN: Da. Ce se întâmplă dacă te numeri atât de mare, pe care le nu se poate exprima ca număr într-adevăr mare. Corect? La un moment dat, ai de gând să depășească limitele cu o valoare pe 32 de biți sau o valoare pe 64 de biți. Acum, din nou, eu nu sunt sigur cum se pronunță o valoare pe 64 de biți, dar știu cu un întreg pe 32 de biți, cea mai mare valoare poate fi, dacă este doar pozitiv valori, este de aproximativ 4 miliarde de euro. Deci, dacă am încerca să numere până la 5 miliarde de euro, ceva se va întâmpla. Dar să vedem ce, de fapt, se poate întâmpla. În lumea de număr întreg preaplin, în cazul în care, într-un sens, îneca capacitatea unei întreg, ce se poate întâmpla? Deci, aici e un număr binar, este o intoarcere la 0. Este toate 1, iar substituenții acolo, sunt puteri ale lui 2, astfel încât acesta este binar. Deci acestea sunt 8, 1 biți pe ecran. Și dacă vă amintiți sau faci repede matematica, ce valoare se reprezentat aici, cu aceste opt 1 biți? 255. Și chiar dacă nu au fost destul de sigur de matematica, ai putea face afară. Sau ai putea pur și simplu un fel de motiv prin ea, Stai puțin, dacă sunt reprezentând o valoare de 8 biți, și am 256 de valori posibile, dar dintre care primul este 0, Știu că cea mai mare va fi 255, și asta e ceea ce ar putea fi aceasta. Deci, să presupunem că am încercați să adăugați 1 la această valoare. Ce ați face în clasa a școală atunci când se adaugă un 1, și nu se potrivește cu adevărat, deoarece trebuie să poarte 1? Ce este acest număr va pentru a deveni atunci când adăugați 1? Se va deveni 0. Corect? Pentru că dacă ai avea mai mult bits-- și voi încercați să, un fel de, tip l here-- dacă am fi avut mai mulți biți, ceea ce ar putea face aici este să adăugați 1, și apoi am obține acest lucru. Hopa. Am avea un pic de 1 tot drumul până aici. Dar dacă acest lucru este un finit valoare, e numai 8 biți, și asta e de pre-determinate de calculator, că 1 este efectiv nu acolo. Este doar un fel de cade de pe o stâncă. Și așa că, dacă adăugați 1-255, ceea ce Valoarea te aparent obține? 0. Și astfel de numere accidental, și poate, în mod neintenționat, ajunge în jurul valorii de ambalaj ca aceasta. Deci, ceea ce poate fi implicațiile acestei? Ei bine, există câteva lucruri diferite. Deci unul, se ajunge în căutarea ca 0, în mod neintenționat, dar puteți vedea un fel de, chiar și în lumea reală, pentru mai bine sau pentru rău, manifestări ale acestei idei de o limită. De exemplu, oricare dintre voi care au jucat vreodata Lego Star Wars, nimeni nu se întâmplă să știu numărul maxim de monede puteți colecta în Lego Star Wars? Ia-o ghici pe baza întrebări de conducere de astăzi. E mai mare decât 256 sau 255. E 4000000000. Deci, se dovedește, și există unele people-- unele googling confirmat aseară au ajuns 4 miliarde de monede de aur, sau fleacuri, în Lego Star Wars. Deși aparent, nu e o modalitate de a truc de joc, există un bug sau o caracteristică, care vă permite să doar acumulează o mulțime și o mulțime de puncte. Dar cea mai mare posibil valoare, potrivit la această captură de ecran a cineva găsite online, este într-adevăr, 4 miliarde. Acum, de ce este asta? Este exact 4 miliarde, probabil pentru că cineva a decis, care a fost scris acest joc, că ar putea face 4 miliarde, ceva, ceva, ceva, ca valoarea am pus cu calculatorul mai devreme, dar e doar un pic mai curat pentru oameni să spună numărul maxim de coins-- sau periculos, ca ei numesc them-- pe care le poate colecta este de 4 miliarde de euro. Și așa, de ce este acest lucru? Cum este jocul LEGO de punere în aplicare contra care este ține evidența Numărul de monede ai? Ei ce folosesc? AUDIENTA MEMBRU: Se oprește numărare după 4 miliarde. DAVID J MALAN: Se oprește numărare după 4 miliarde, pe care le puteți inseamna deduce, ca un programator, că acestea sunt, probabil, folosind un număr întreg pe 32 de biți. Ca programator literalmente doar dactilografiate, Int, codul său, și asta e tipul de variabilă care că folosesc pentru a stoca cod cuiva. Deci nu e alte manifestări din aceste tipuri de limite. Deci, eu nu am jucat acest JOCUL_ _selectați ORA_ Privire și am fost citit pe istoria pentru a confirma ca much-- dar în Versiunea originală de civilizație, în cazul în care vă pare că interacționează cu fiecare altele și pot purta război sau au pace, Gandhi a fost trebuia să fie una dintre personajele cele mai pașnice, așa cum am înțelegem, în primul Versiunea de civilizație. Și, de fapt, pe o scară de la 1 la 10, agresivitatea lui a fost doar un 1. Deci, foarte ușor agresiv, aparent. Dar la un moment dat, se pare că puteți instala democrației în geografie ta. Și dacă instalați democrației în versiunea de joc, apoi nivelul de agresivitate se duce în jos. E un lucru bun. Oamenii sunt mult mai liniștit aparent, în această situație. Dar se pare că, cineva a făcut nu au o, în cazul în care, condiție în versiunea originală a codului. Deci, nivelul agresiunii lui Gandhi a plecat de la pozitiv 1, minus 2, la negativ 1, dar jocul nu înțelege numere negative. Deci, ce sa întâmplat a fost agresiunea lui Gandhi Nivelul a variat de la 1, la 0, la negativ 1, care a avut ca efect ambalaj în jurul valorii de a fi personajul cel mai agresiv în joc, la o valoare de 255, pe o scară de la 1 la 10. Și de atunci, nu a fost mai multe încarnări ale acestui joc, și le-am pastrat ca un fel de ou de Paște, că Gandhi este aparent așa teribil agresiv. Dar a fost rezultatul unei eroare de programare foarte simplu în această versiune foarte timpurie a jocului. Acum mai tulburator, mai mult recent, Boeing 787 fost înregistrați ca având o bug, nu tipul de dispozitiv vă în special doriți să aveți un bug. Și simptome, pe care le voi citi aici, dintr-un articol on-line, a fost acest lucru, un model de 787 de avion care a fost alimentat continuu pentru 248 de zile poate pierde tot curent alternativ, AC, energie electrică, din cauza unitățile de control generator de, GCUs, simultan a intra în modul de de siguranță. Deci, acest lucru a fost un avertisment emis când a fost descoperit această problemă. Această condiție este cauzată de un contor de software, intern la GCUs, așa un număr întreg sau o variabilă, care se vor revărsa, după 248 zile de curent continuu. Boeing este în procesul de dezvoltarea unui upgrade de software care CGU va remedia starea nesigure. Atât de mult ca de rachete scenariu, în care au avut un fel de variabile care a fost de numărare, și de numărare, și de numărare, dar debordant treptat limitele capacității sale, a făcut în mod similar naibii avionul au un preaplin variabilă după suficient timp de funcționare. Și astfel modul limba-in-obraz de lucru în jurul valorii de această problemă este de a cu adevărat, reboot, avionul fiecare 247 de zile, astfel încât memoria devine șterse și variabila revine la 0. Dar își dau seama, acesta este un foarte încarnare mare de software, dar mai ales ca am auzit despre Apple sistemele de operare merge în mașini, și mașini de auto-conducere de la Google, și orice număr de încarnări ale software-ului În viața de zi cu zi noastre, televizoare și ceasuri, și mai mult, dau seama fost înconjurat de software, toate, care este scris de noi, oamenii. Și, după cum vom descoperi toate curând, este foarte ușor și foarte tipic să facă greșeli când scris software-ul. Și dacă nu-i prindă, unele lucruri rele se poate întâmpla. Acum, uneori, unele lucruri amuzante se poate întâmpla, sau cel puțin uneori ne știu să aștepte ceva răutate. Deci 0 împărțit la 0, de la clasa a scoala, este, în general un lucru rău. E nedefinit. Și se pare out-- și să vedem dacă Mic meu poate alege acest up-- că Apple a avut unele distractiv cu acest recent. Așa că am un iPhone aici. Mă duc să vorbesc cu Siri și de a pune pe ea să-mi dea răspunsul la 0 împărțit la 0. Ce este 0 împărțit de 0? Siri: Imaginați-vă că aveți 0 cookie-uri, și le împărți în mod egal printre 0 prieteni. Cât de multe cookie-uri nu fiecare persoană obține? Vezi? Nu are nici un sens. Și Cookie Monster este trist că nu există cookies. Și tu ești trist că nu ai prieteni. DAVID J MALAN: E un fel de neplăcut. Deci, aceasta este ceea ce a fost doar a spus că. E nedeterminată, nu este definit, Într-adevăr, multe limbaje de programare sau, într-adevăr, compilatoare va detecta atunci când, într-un program, încercați să împartă 0 cu 0. Mai distractiv decât acest lucru, deși, este care se pare că, Cookie Monster este pe Twitter in aceste zile. Și el a răspuns la acest lucru, cu acest lucru, care este absolut adorabil. Dar haideți să aruncăm o privire rapidă la un cuplu de alte constructe, și apoi a pus o parte din această cod pentru a utiliza, în moduri bune. Deci, se dovedește, pe lângă pentru bucle, nu e ceva numit o buclă în timp ce, ca arată diferit și este implementat un pic differently-- și vom vedea în cele din urmă examples-- dar într-un fel, e simplu, pentru că nu vă permite pentru a inițializa și actualiza în limita a buclei. Puteți să-l pună în aplicare în continuare. Astfel încât să puteți face aceleași lucruri exact cu o buclă în timp ce, ca și cu o buclă pentru, dar sintaxa, ultimately-- în cele din urmă cum vom see-- va fi diferit. Există chiar și o face în timp ce bucla, care este de fapt un pic diferit, în timp ce o buclă pentru și o buclă în timp ce întotdeauna verifica starea lor în primul rând, în cazul în care ai citit acest lucru de sus în jos, un fel de pare că va verifica starea E ultima pentru că este cu adevărat ultima linie de cod. Și într-adevăr, că va fi util în anumite programe pe care le scrie, dacă vrei să faci ceva doar orbește și, eventual, verificați starea. Asta nu e neapărat un lucru rău. Dacă vrem variabile, putem face într-un cuplu de moduri diferite. Și am văzut în Foxtrot desene animate, un mod de a face aceasta, în cazul în care declara variabila, ca Int contra virgulă, și apoi later-- poate următoare line, poate 10 linii later-- tu de fapt inițializa. Deci, aceste 2 linii de cod declara o variabila de tip int și o numesc contra, asa ca da mine suficient de biți de a organiza un int. Și apoi în cele din urmă, se pune valoarea 0 în care variabila. Acesta aranjează 0 și 1 într-un model, care stim de la săptămâna trecută, reprezintă numărul stim ca 0. Sau sincer, puteți face acest lucru mult mai succint, la fel ca aceasta. Acum avem, de asemenea, capacitatea de a apela funcțiile. Și, de fapt, aici e un line 2 program sau un fragment al acestuia, care ne permite să efectiv scrie un cod care devine un șir de user-- mult ca voluntar nostru un moment ago-- stocarea rezultatul în o variabilă numită nume, și then-- la fel ca cu voluntar nostru cu imprimeuri printf-- acele valori prin trecerea în două argumente, șir, urmat de variabila numit, numele, în sine. Deci, haideți să aruncăm o privire, înainte de ne întoarcem la Mario acolo, la un cuplu de pe acum, exemple în acest sens. Am de gând să merg mai departe și deschis up, să zicem, funcția-0.c. Și, ca întotdeauna, acest cod este disponibil pe site-ul cursului, astfel încât să puteți juca de-a lungul la acasă și se uite la ea mai târziu. Dar aici e programul în e esență, de la linia 17-22. Programul principal este în cazul în care Programul este întotdeauna o să înceapă. Acest program, se pare, va pentru a imprima numele dvs., colon. Se apoi merge pentru a apela getString, la fel cum am făcut cu voluntarii noștri. Si apoi, acest lucru este interesant, se va suna PrintName. Se pare, în tot acest timp, nu pare a fi o funcție numită PrintName. Care imprimă numele cuiva. Nu am nevoie pentru a utiliza printf din odinioară, există PrintName. Dar asta e înșelătoare pentru că nu PrintName vin cu C. oameni nu au inventeze o acum 40 de ani sau 50 de, Am făcut-o, în schimb. Și, de fapt, dacă aș defila jos în continuare, o notificare cum pot scrie propria mea funcționează în C. Vom în cele din urmă explica de ce am mereu spun, nule, în câteva locuri, dar pentru ziua de azi, sa doar uita-te la numele. Pe linia 24, în cazul în care doriți să crea propriul funcție, vă scrieþi literalmente Numele funcției. Am ales PrintName. În paranteze, tu apoi specificați ce fel de intrări, și cât de multe ai doresc această funcție pentru a lua. În acest caz, vreau să iau 1 variabilă numită, nume, și va fi de tip, string, asa ca va să fie o secvență de caractere. Și apoi, această program-- la fel ca în Scratch, puteți avea puzzle personalizat pieces-- va avea acest comportament personalizat. O să sun printf trece in, salut, substituent, și apoi se va conecta în orice numit utilizator. Deci acesta este un exemplu de ceea ce un om de stiinta de calculator ar abstracție apel sau funcțional descompunere, care sunt doar moduri de lux de saying-- este, dacă iti place aceasta idee la nivel înalt, ca vreau funcționalitate că imprimă numele cuiva, absolut te poate scrie literalmente printf și apoi trece în argumentele pe care doriți, și programul va funcționa, deoarece are de miercuri. Dar puteți începe să abstract departe noțiunea de imprimarea unui nume. Puteți da un nume, ca PrintName, iar acest lucru este această idee de stratificare de la saptamana 0. De acum înainte, eu și nu trebuie să știi sau de îngrijire cum este pusă în aplicare PrintName. Da, folosește printf, poate nu, cine știe ce folosește? Cui îi pasă? Acum vorbesc aici, în loc de aici. Și într-adevăr, așa cum programele noastre minim mai avansate și sofisticate, vom să continuați să luați de la sine că există piese de puzzle nivel inferior. Pentru că le-am scris sau altcineva a făcut, astfel încât că putem construi apoi pe partea de sus a ei. Să aruncăm o privire la acest variantă, funcționează o. Deci asta e un pic mai mult avansat, dar se pare că în biblioteca lui CS50, există doar o funcție getint. Noi nu cred că, cu ani în urmă, pentru a pune în aplicare o funcție GetPositiveInt. Și asta e un pic enervant pentru că dacă voi scriu un program în care doriți să obțineți un rezultat pozitiv număr întreg de la utilizator, puteți folosi absolut getint. Și puteți verifica absolut cu starea și poate o buclă dacă este mai mare Int decât 0 și țipi la utilizatorul dacă el sau ea nu da ai un număr pozitiv. Dar să construiască această Building Block noi înșine, o, bucată Scratch personalizat, dacă vreți. Am de gând să aibă un program de aici că în cele din urmă, m-am doresc să fie în măsură să sun GetPositiveInt, și eu vreau să fiu posibilitatea de a imprima orice ar Int este. Dar acest lucru este captată departe acum. Este tocmai a fost dat un nivel ridicat Numele care spune ceea ce face, care este minunat, deoarece este foarte intuitiv acum pentru a citi. Și dacă-mi pasă ce e dedesubt capota, lasă-mă să defilați în jos. Și e un pic de intimidare la prima, în special dacă aceasta este prima ta programului, dar să aruncăm o privire. Eu nu mai spun, gol, pentru că se pare funcții, la fel ca getString, poate returnează o valoare pentru mine. Ei nu doar au pentru a imprima pe ecran, ei pot depune de fapt mi ceva înapoi. Și întrucât înainte de PrintName, Nu am nevoie de nimic înapoi. Am nevoie de efectul secundar al ceva care arată pe ecran, dar nu am nevoie de un om să-mi dai ceva înapoi. Aici, cu GetPositiveInt, cum ar fi cu getint, Vreau să fiu dat ceva înapoi. Deci, eu spun nu, gol, pe linia 23, dar Int, care spune, această funcție că scriu, numit GetPositiveInt este de gând să dă-mi înapoi un număr întreg, nu nimic, nu nule. Între timp, se va lua nici o intrări, așa că am, un fel de, ea inversat. Nu dau nici un GetPositiveInt de intrare, vreau să-mi dea producția sa. Și apoi ce se întâmplă acum? Deci, iată cum pot declara o variabilă. Am făcut în afara buclei, din motive vom vedea în cele din urmă, dar acest lucru dă doar ma sunat 32 de biți, n, Și am pre-determinare le pentru a stoca număr întreg. Și aici este că, în timp ce face construct, și de aceea este util. Literalmente face acest lucru, în timp ce n este mai mic de 1. Deci, haideți să vedem ce se întâmplă. Am imprima, vă rugăm să da-mi un Int pozitiv. Apoi am obține un int, folosind CS50 lui funcționează și depozitate în n. Și apoi, ce linie de cod, probabil, este executat următor, în mod logic? Care linie numărul? Da, așa 31. Tu nu ar ști acest lucru până când nu ați sa spus sau un fel de ea deduce, dar e adevărat. Se merge de sus în jos și apoi se repetă. Deci, dacă am scris în zicem, numărul negativ 1, este n mai puțin de 1 negativ? Da. Deoarece negativ 1 este mai mică de 1. Deci, ce ar trebui să se întâmple? Am de gând să facă acest lucru în timp ce n este mai mic de 1, așa că am de gând să mă întorc la linia 28. Și fiecare time-- și să ruleze astea-- face funcția 1 pentru a compila, și acum dot funcția 1 slash. Dacă aș tip negativ 1, este continua să urle la mine până când am să coopereze pentru că fiecare de intrări mele este mai mică de 1 și dacă e vreme mai puțin de 1, Am de gând să face asta. Dacă în cele din urmă dau un număr ca 50, Din fericire, se spune, mulțumesc pentru 50. Ce? Deoarece de îndată ce n nu este mai mică de 1, ma opresc obtinerea blocat în această buclă, și acest cuvânt cheie nou astăzi, întoarcere, literalmente face asta. Așa că tocmai am implementat, într-un sens, echivalentul a getString, în cazul în care mă întorc la predarea oricine folosește-mă, o anumită valoare. Aceasta nu trebuie să fie un șir, e un întreg. Deci un simplu, rapid exemplu, dar vom în curând vedea unele mai sofisticate Versiunile încă. De fapt, haideți să aruncăm o privire la o o numeric, care se numește return.c. Și asta este de fapt un pic mai simplu. Deci, scopul acestui program în life-- să compila și rulați-l, asa ca întoarcere, dot slash, aviz return-- programul pur și simplu cuburi valoarea 2. E destul de stupid, e greu cod, nu ia nici o intrare, dar nu demonstrează un alt funcție care M-am scris. Deci, aici, am declarat o variabilă, numit X, de tip int, egal cu numărul 2, complet arbitrară. Aceasta este doar o imprimare pufos. Se spune x este acum, cum și astfel, cubaj punct punct punct. Și magia este aparent în linie 21. Sun-o funcție numită, cub, Am predarea acestuia o foaie de hârtie cu numărul 2 scris pe ea, și ce valoare, matematic, vreau să ies din ea? Doar ca o verificare bun-simț? 8. Corect? Vreau 2 tocata înapoi, 2 la puterea de 3, așa 8 spate. Deci, în cazul în care este pus în aplicare cub? Ei bine, observați că este pus în aplicare aici. Și la fel ca înainte, în mod logic, chiar dacă sintaxa este, probabil, foarte nou pentru mulți dintre voi, Vreau aceasta functie să-mi dai înapoi o foaie de hârtie cu un întreg pe ea. Deci, am o int, The Numele este arbitrar, dar convenabil numit cub. Intrarea la aceasta, este n de tip întreg, așa că e cum pot trece în numărul 2 pe o foaie de hârtie. Și apoi se dovedește C suporturi matematica, astfel încât să nu aveți x lui pentru ori, utilizați doar asteriscul pentru multiplicare. Și aceasta se întoarce de n ori n ori n, care este pur și simplu o valoare tocata. Deci, unde mergem cu toate astea? Aceasta este cu siguranta un tur vârtej de vânt, fiți siguri, că în super secțiunile și în problema set 1, veți fi plimbat prin Toate acestea și mai mult. Și în problema set 1, vom tranziție din lumea grafică a Scratch la ceva mai mult de linie de comandă în C. Dar vom inspira din acest joc aici de la odinioară, în care folosind C și ediția standard a p set vei pune în aplicare piramida lui Mario. Și în hacker-a ediție a p set, dacă alegeți ca să aleagă, vă va pune în aplicare un pic mai mult provocatoare piramidă cu două vârfuri. Veți pune în aplicare, de asemenea, un algoritm, un algoritm lacom. Se pare nu e unele logica interesant în spatele procesului de rulează stație un casier de și de fapt, predarea cineva schimba înapoi. Există un algoritm care este destul de simplu, că s-ar putea chiar înțeles intuitiv atunci când ai citit prima it-- seama că este ceea ce am mereu făcut orice moment m-am dat pe cineva unele back-- bani care vă permite să întotdeauna reduce numărul de Note de hârtie sau monede metalice ca esti predarea înapoi la utilizator. Și aceasta, desigur, este convingătoare pentru că dacă te duci la CVS sau fleacuri, nu vrei să fi predat o grămadă de cele sau o grămadă de mărunțiș. Vrei cele mai puține monede, probabil, posibil. În cele din urmă, veți fi, de asemenea, contestate la dabble în lumea de apă și obține de fapt, o apreciere pentru o mapare între ratele de curgere, de ca, într-o cabină de duș cu apă, cat de mult se folosește apa. Și aluzia aceasta, va fi acest clip aici, care vom termina pe de doar 60 de secunde, în care vopsele o imagine de -flux redus de duș. capete [VIDEO PLAYBACK] -In regula. Am totul aici. Am Cyclone F Series, Hydra, Jetflow, Stockholm Supersteam, îl nume. -Si Ce ai recomanda? -Ce căutați? Om Power. Putere. -cum Ar fi Silkwood. Asta e pentru radiații. -Asa este. -Acum Ce e asta? Asta e Commando 450. Eu nu vând ca unul. Dar asta e ceea ce ne dorim. Este un comando 450. -Nu Mă crezi. Este folosit doar în circ. E pentru elefanți. -Voi Plăti nimic. Ce despre Jerry? -El Nu a putut face asta. E delicat. Oh da. [END PLAYBACK] DAVID J MALAN: Bine. Asta dacă pentru CS50. Ne vedem săptămâna viitoare. SPEAKER 1: [? Scully?], [? Ian,?] în măsura în care acest proiect outro, ce-ai venit cu voi? SPEAKER 2: Ei bine, ne-am dat un soi de gândire, și credem că cel mai bun mod sa-- SPEAKER 3: Mai am? SPEAKER 2: Da. Prin toate mijloacele, de fapt. SPEAKER 3: Deci, eu cred ne putem rezuma ideea noastră pentru Outros cu un nimic word--. DAVID J MALAN: Nimic? SPEAKER 3: Nimic. DAVID J MALAN: Ce înseamnă asta? SPEAKER 3: Outros sunt despre nimic. SPEAKER 2: Ei bine, vreau să spun, în filosofie, Adică, nimic nu este întotdeauna ceva. SPEAKER 1: Deci what's-- ceea ce este premisa? SPEAKER 3: Deci, e ca și cum viața. BINE. Ce ai facut astazi? DAVID J MALAN: m-am trezit, a avut micul dejun, și a venit la locul de muncă. SPEAKER 3: Asta e un outro. SPEAKER 2: Dar, vreau sa spun, nu ar trebui ceva se întâmplă să-l pe the-- SPEAKER 3: Nu, nu, nu, nu. Nimic nu se intampla. SPEAKER 1: Deci, de ce ne uitam? SPEAKER 3: Deoarece este un outro pentru CS50. DAVID J MALAN: Nu încă.