[Powered by Google Translate] David J. MALAN: Bine, acest lucru este CS50 și acest lucru este
sfârșitul săptămânii 1, astfel încât cardurile de studiu sunt în și numărul total de
colegii de clasă pe care le au în acest an este de 745.
Și suntem atât de încântați să aibă atât de mulți dintre voi în cursul
acest semestru, dar chiar dacă acest curs este atât de mare,
dau seama că e ca și cum aceste lucruri prânzuri vineri, la fel ca
orele de birou, 15-persoană secțiuni, și așa mai departe, care
sunt într-adevăr menite să creeze acest lucru mai intim
mediu.
Deci, chiar dacă am putea aduna o dată sau de două ori pe săptămână, aici, în
Sanders, știu că o mare parte din experiența dumneavoastră în acest curs
va fi foarte mult hands-on cu privire alături de colegii dvs.
și cadrelor didactice.
>> Deci, aici vom merge, Fall 2012.
Reamintim astfel că ultima oară când am încheiat într-o notă de
imprecizie, vorbind despre reprezentarea numerelor.
Și ne-am uitat la unul dintre eșecurile care au avut loc, în
lumea reală, atunci când a venit la neînțelegeri
cum funcționează computerele.
Ei bine, azi vom revizui un alt una dintre acele idei ca
și continua discuția noastră a clientului CS50
și C și ce înseamnă cu adevărat la program.
Dar mai întâi, doar o pereche de anunțuri vârtej.
>> Secțiuni începe această duminică, iar prima săptămână este întotdeauna un
bit de un start rapid, pentru că tocmai am ajuns în
formularele secțiune.
Facem același, acum, cu semenii didactice, acum
că ei știu programele lor, așa că scopul, prin
Sâmbătă dimineața, pentru a urmări cu tine, cu secțiunea dvs.
de atribuire și de TF.
Dau seama că acestea vor începe a doua zi, duminică
sau luni sau marți.
Și apoi vom potrivi cu modificările secțiune în care acestea apar
în zilele următoare.
Orelor de lucru, între timp, sunt, din nou, în seara asta, 20 la 11, în
Annenberg, precum și mâine seară.
Chiar dacă seturi de probleme sunt, în general datorate în zilele de joi
la prânz, dat seama că avea până la cinci zile întârziere să-și petreacă,
prin urmare, disponibilitatea de ore de birou în zilele de joi, dacă
te de numerar într-una din acele zile întârziere și, prin urmare, prezintă
ceva vineri.
Permiteți-mi să sugerez faptul că Scratch este printre mult mai distractiv, printre
mai multe seturi de low-cheie problemă.
Și aș atârna pe acele zile întârziere, strategic, doar
pentru mai târziu în semestrul atunci când viața începe să stea în calea
cu examene și alte clase.
Set Problema 1, între timp, ar fi postate pe cursul de
site-ul în această vineri, ca va fi la plimbare cursului
prin video, care va fi filmat la 2:30 pm vineri
și apoi postat on-line de zi.
>> Așa că am încheiat luni.
Vreau sa - de fapt, o notă aici.
Deoarece clasele - pentru că Sanders nu împrumuta exact
se la casual Q & A înainte și înapoi teribil de bine, suntem
O să încerc ceva un pic mai nou in acest an, prin care
dacă nu sunteți confortabil ridica mâna sau pur si simplu
nu s-ar ridica mai degrabă mâna într-o cameră ca asta,
vom avea unele dintre semenii didactice și CAS
manevrarea cs50.net/discuss în timpul prelegerii.
Deci, dacă aveți o întrebare pentru că am fost complet
neclar despre ceva sau esti curios despre unele
subiect, încercați să postați acolo.
Etichetați-l cu o etichetă de Lectura, iar noi vom face tot posibilul
de azi si saptamana viitoare - Vom încerca acest lucru - pentru domeniul IT
fie electronic, on-line, sau în cazul în care se simte ca și cum ar trebui să ne
într-adevăr i se adreseze în masă, unul dintre cele semenii didactice sau
AC va ridica mâna lor și să ceară
anonim în numele dumneavoastră.
Deci, vom da un try această și a vedea cât de bine functioneaza.
Dar, prin toate mijloacele, să continue să ridice mâinile ca și cum ați dori.
>> Deci, ultima dată când am arătat că 10% sau de o zecime nu este, în
fapt, 0,1, la fel ca ai fost învățat mulți ani în urmă.
Este, de fapt, o valoare de genul asta.
Dar asta nu e în întregime adevărat, nu?
Noi avem doar această constrângere în computere prin care, dacă
au doar o cantitate finită de memorie, RAM, sau mai mult
în special biți, ei bine, nu e numai un număr finit
de lucruri pe care le poate reprezenta.
De exemplu, dacă avem numărul zero, și dorim să
reprezintă în binar, folosind opt biți, în cazul în care un pic,
din nou, este un zero sau unul, am putea
reprezintă o ca 00000000.
Și asta e un pic inutil verbose.
La fel ca în sistemul zecimal în lumea reală,
în general, în cazul în care doriți să scrieți numărul 123, am
oameni, probabil, nu scrieți 00000123, chiar dacă,
funcțional, care e numărul exact acelasi.
Noi doar picătură zerouri, ca să spunem așa.
>> În binar, putem face același lucru.
Binar și de zero, zero și binar este doar de zero.
Ai nevoie doar de un singur bit.
Dar, din nou, unitatea cea mai comună a măsurii în lume
de calcul este de octeți, opt biți.
Doar pentru că un pic, destul de inutil.
Opt biți, nu foarte utile, dar cel puțin e mai mult
utilă decât o singură unitate de măsură.
Deci, cu opt biți, vom reprezenta de obicei binar.
Deci, aici avem numerele de la zero, unu, doi, și apoi, în calitate de
Nate făcut-o în videoclipul nostru de miercurea trecută, putem continua
de numărare până la șapte, la opt.
Și apoi, dacă vom folosi mai multi biti si mai mult, am
poate conta până la infinit.
Dar dacă aveți doar un număr finit de biți aceste, așa cum este
cazul în orice sistem de calculator, sau chiar rachete
sistem, ei bine, într-adevăr, aveți doar o
cantitate finită de precizie.
Deci, dacă doriți să reprezinte numărul ca 0.1, ei bine,
computerul trebuie să aleagă și să aleagă.
Și dacă are numai un număr finit de numere se poate
reprezintă, ea poate veni aproape de 0,1 pentru tine, dar nu poate
neapărat a vă oferi exact valoarea pe care o doriți.
Și aceasta este doar una dintre provocările de calculatoare,
sub capota, din fericire.
>> Așa cum ne mișcăm mai departe în semestrul, aceste nivel mai redus
Detalii deveni mult mai puțin interesant, dar cu siguranță
de aplicare a acestor idei poate avea unele lumea foarte real
ramificații.
Una dintre ele este o distracție pic.
Câți dintre voi ați văzut uimitoare Office Space film?
Dacă nu aveți, că e neoficial dvs.
temele pentru săptămâna.
Dar, în Office Space, colegii din acel film ia
Avantajul tocmai această idee, dar ei de fapt furat
l de la un alt film pe care le-ar putea avea
văzut, chiar și ani înainte.
Deci, permiteți-mi să vă dau câteva secunde de la acest trailer
acest film uimitor și acest lucru este foarte mult
academic relevant.
>> [Joacă MOVIE]
De fapt, am fost promovat.
Pot programa un virus care va rupe că
plasa pe mare de timp.
Ei bine, cum functioneaza?
De fiecare dată când există o tranzacție bancară în cazul în care dobânda este
computerizata, există mii de o zi, calculatorul sfârșește
cu aceste fracții de un cent.
Dar eu nu am de gând să fac nimic ilegal.
Ilegal? Samir, asta e America.
Trebuie sa jur pe Dumnezeu.
În cazul în care nimeni nu știe despre acest lucru, dar noi, bine? Nu există membri ai familiei, nu
prietene, nimeni.
[Neauzit].
Nu-ți face griji, omule, nu voi spune nimănui, fie.
[MOVIE ENDS]
>> Bine, asa ca poate am gasit acest film mai bun decât majoritatea
oamenii de aici, dar, în orice caz, virusul care au fost
încercarea de a crea -
și în filme, oricând ei ar suna ceva de un virus,
nu e, în general, de fapt, un virus.
E doar un program care cineva a scris de a face ceva.
Și în acest caz, baietii au încercat să scrie un program de
care a avut avantajul de a companiei lor, numit de Innotech
sistem de calcul, prin care computerele, de asemenea, chiar și atunci când
vine vorba de bani, poate nu neapărat
reprezintă bani cu precizie.
Deci, chiar dacă ar putea avea 0.10 dolari în contul dvs. bancar,
0.10, ei bine, s-ar putea crede computerul de fapt, că aveți
acest cenți multe în contul dvs. bancar.
Și deci ce acesti baieti au fost aspiră să facă - și ei
a furat ideea, se pare că de la Superman III, în cazul în care
Richard Pryor a făcut același lucru - au fost în esență,
programe de scriere care aspiră să ia toate posterioară
numere, toate de mici, fracțiunile mici, mici de
mărunțiș, și sustrage cele de pe astfel că oamenii pur și simplu
gând, oh, e doar 0.10 dolari acolo, dar toti cei
Numerele trailing adăuga în cele din urmă.
Deci, o idee minunată și hilar eșuat în această
special de film.
>> Dar în lumea reală, de asemenea, există mult mai mult în ceea ce privește
implicații ale acestor tipuri de lucruri.
Iar unul dintre motivele să se scufunde în domeniul calculatorului
știința este, din nou, aplicabilitatea acesteia de a nu
științe inginerești singur, ci doar pentru a
alte domenii precum.
Deci, aceasta este o privire mai lighthearted la ceea ce poate merge prost, dar
E, de asemenea, destul de deschiderea ochilor, cred că, atunci când vine vorba de
înțelegerea exact cum omniprezent tehnologii cum ar fi
calculatoare și de programare sau in aceste zile,
în formă de software.
Deci, acest clip următor este vorba doar de șase minute, continuă
unde am rămas data trecută, dar ne permite să privim un pic
mai în profunzime la o astfel de aceste probleme unul.
Lasă-mă să treceți de unde am plecat oprit,
care a fost chiar aici.
Și avem partea a doua a doua, pentru aproximativ șase minute aici.
>> [PLAY MOVIE]
Chinuit de tehnologie modernă rachetă.
În 1991, odată cu începerea primului Război din Golf, Patriot
rachetă experimentat un fel similar de
Numărul de conversie problema.
Și, ca urmare, 20 de persoane, 20 de soldați americani au fost uciși,
și aproximativ 100 de răniți alții, atunci când Patriot, care ar fi trebuit
pentru a proteja împotriva Scuds primite,
nu a reușit la foc o rachetă.
>> Atunci când Irakul a invadat Kuweitul și America a lansat un Desert
Furtună la începutul anului 1991, au fost rachete Patriot baterii
dislocate pentru a proteja Arabia Saudită și Israel din Irak
Scud rachete atacuri.
Patriot este un american cu raza medie de suprafață-aer sistem,
fabricat de compania Raytheon.
Dimensiunea de interceptare Patriot în sine, este vorba despre
aproximativ 20 de metri lungime si cantareste aproximativ 2.000 de lire sterline.
Și este poarta un focos de aproximativ - Cred că e aproape
150 de lire sterline.
Și focosul în sine este un exploziv de mare, care are
fragmente din jurul ei.
Carcasa de focos este conceput pentru a acționa ca alice mari.
Rachetele sunt realizate patru per recipient și sunt
transportate de către o semiremorcă.
>> Patriot anti-rachetă sistem merge înapoi, cel puțin la
20 de ani.
Aceasta a fost inițial conceput ca o rachetă de apărare aeriană a
trage în jos avioane inamice, în Războiul din Golf.
Atunci când a venit acel război de-a lungul, Armata a vrut să-l folosească pentru a trage
Scuds jos, nu avioane.
Air Force irakian nu a fost atât de mult de o problemă, dar armata
a fost îngrijorat Scuds.
Și astfel au încercat să faceți upgrade Patriot.
Interceptarea unei rachete inamic călătorie la Mach 5 a fost de gând
să fie suficient de provocatoare.
Dar când Patriot a fost grăbit în funcțiune, Armata
nu a fost conștient de o modificare irakian care a făcut lor
Scuds aproape imposibil pentru a lovi.
>> Ceea ce sa întâmplat este Scuds care au fost
venind în instabile au fost.
Ei au fost trepideaza.
Motivul pentru acest lucru a fost irakieni, în scopul de a obține 600
km dintr-un rachete distanță de 300 km, a avut
greutate din față și focos
a făcut focos bricheta.
Deci, acum Patriot încearcă să vină la Scud, și de cele mai multe
timp, marea majoritate a timpului, aceasta ar
doar bilete de Scud.
Odată ce operatorii de sisteme de realizat Patriot Patriot
ratat ținta, au detonat focosul Patriot.
Pentru a evita posibilele accidente, a fost permisă
să cadă la pământ.
Asta a fost ceea ce majoritatea oamenilor au văzut, ca mingi de foc mari din cer,
și înțeleasă greșit ca intercepteaza de focoase Scud.
>> Deși, în cerul nopții, Patrioții părea să fie
Scuds succes distruse, la Dhahran, nu ar putea exista
greseala cu privire la performanțele sale.
Nu, sistemul Patriot radar pierdut urma unei
intrare Scud și niciodată nu a lansat datorită
la un defect de software.
Acesta a fost primul care a descoperit israelieni care mai mult
sistemul a fost pornit, mai mare discrepanta de timp a devenit,
din cauza un ceas încorporat în calculatorul sistemului.
Aproximativ două săptămâni înainte de tragedia din Dhahran,
Israelienii au raportat la Departamentul Apărării, care
Sistemul a fost pierde timp.
După aproximativ opt ore de funcționare, au observat că
Sistemul a fost din ce în ce mai puțin vizibil corecte.
Departamentul Apararii a răspuns prin a spune toate
bateriile Patriot a nu părăsi sistemele de
pe de o lungă perioadă de timp.
Ei au spus niciodată ce o lungă perioadă de timp a fost de - 8 ore, 10
ore, 1.000 de ore.
Nimeni nu știa.
>> Bateria Patriot staționate la cazarma de la Dhahran
și de ceas eronată intern a fost pe peste 100 de ore pe
noaptea de 25 februarie.
Acesta urmarite timp cu o precizie de aproximativ o zecime de secundă.
Acum, o zecime din al doilea este un număr de interesant, deoarece
acesta nu poate fi exprimat în binar, exact, ceea ce înseamnă
acesta nu poate fi exprimat exact în orice
digital modern calculator.
E greu de crezut.
Dar folosesc acest lucru ca un exemplu.
>> Să luăm numărul unu al treilea.
O treime nu poate fi exprimat în zecimal, exact.
Un al treilea se întâmplă 0.333 de 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.
Mai mult sistemul de alergat, mai rău eroare de timp a devenit.
După 100 de ore de funcționare, eroarea în timp a fost de numai
aproximativ o treime dintr-o secundă.
Dar, în ceea ce privește direcționarea unei rachete de călătorie de la Mach 5,
aceasta a dus la o eroare de urmărire de peste 600 de metri.
Ar fi o eroare fatală pentru soldații de la Dhahran.
>> Ceea ce sa întâmplat este o lansare Scud a fost detectată de avertizare timpurie
sateliți și ei știau că Scud venea în lor
general de direcție.
Ei nu știu de unde venea.
A fost acum pana la componenta de radar Patriot
sistem, apărarea Dhahran, pentru a localiza și urmări
sosite inamic rachete.
Radar a fost foarte inteligent.
Te-ar urmări de fapt, poziția de Scud și apoi
prezice în cazul în care, probabil, ar fi data viitoare
Radar trimis un puls afară.
Care a fost numit poarta gama.
Apoi, odată ce Patriot decide destul timp a trecut pentru a merge
înapoi și să verificați următoarea locație pentru acest detectată
obiect, merge înapoi.
Deci, atunci când acesta a plecat înapoi la locul nepotrivit, atunci el nu vede niciun
obiecții, și se decide că nu a existat nici un obiect.
A fost o detectie fals și scade pista.
>> Intrare Scud dispărut de pe ecranul radarului.
Si secunde mai târziu, el trântit în cazarmă. Scud
28 și a fost ucis ultima concediat în timpul
primul război din Golf.
În mod tragic, software-ul actualizat ajuns la Dhahran
ziua următoare.
Și software-ul defect a fost stabilită, închiderea unui capitol în
zbuciumata istorie a rachetelor Patriot.
PATRIOT este de fapt un acronim pentru "Urmărirea rețele fazate
Interceptate de țintă. "
>> În regulă, deci un rezultat mult mai trist de a nu destul
înțelegerea acestei lumi.
Și takeaway, într-adevăr, de la film este că soluția
a fost reporniți sistemul de apărare antirachetă
fiecare dată într-un timp.
Și astfel, din nou, unul dintre obiectivele acestui curs, cu siguranță,
pe o scară de mai umil decât aceste aplicații, este acela de a
într-adevăr toată lumea deschide ochii la exact cum te duci despre
Mașini de luare a face ceea ce vrei să faci și cum te duci
despre a face asta în mod corect, în timp ce de-a lungul modul în care face
ei bine, elegant, și așa mai departe.
Și așa astăzi, să se arunca cu capul într-un pic mai mult de acest lucru, dar
astfel încât să nu merg prea repede, în special pentru cei mai puțin
confortabil, dar, de asemenea, astfel încât să putem păstra interesul
cei mai confortabil, hai să începem rapid, cu un pic
de recapitulare a unora dintre aceste idei.
Și din nou, cere la distanță, atât în ​​persoană sau online, în cazul în care aveți
întrebări astfel încât să putem păstra toată lumea de pe aceeași pagină.
>> Deci, Aparatura CS50, pas rapid înapoi, este
ceea ce, în cuvintele tale?
E în regulă, dacă nu aveți nici o idee ce ar putea fi acele cuvinte încă.
[Neauzit]
Ok, deci o interfață universală pentru -
că putem împărtășim cu toții.
Absolut.
Deci, am putea, de exemplu, vă spun să mergeți la unele
site-ul, descărca acest software pentru Mac OS.
Descarca acest software-ul pentru Windows, configura în
în acest fel și că.
Dar realitatea este, atunci vom rula în nenumărate tehnic
sprijini probleme.
Și, de asemenea în aceste zile, o mare parte din ceea ce se face partea de server,
în lumea de calcul, mai ales atunci când vine vorba de
dezvoltare web si aplicatii web bazate pe, este de fapt
destul de des face pe computere Unix sau Linux, spre deosebire de
Mac-urile sau PC-urile Windows.
>> Deci, printre upsides, apoi, de a folosi acest lucru numit
Aparatura este CS50 vom avea toate același mediu.
Astfel încât toată lumea e pe aceeași pagină, indiferent de ce hardware pe care
a venit la campus, cu dar, de asemenea, vor fi abuza de exact
același mediu pe care le veți folosi pentru
semestru de terminare, precum și pentru dezvoltarea web, precum și în
viitor pentru aplicațiile reale ale acestora.
Deci mai concret, Aparatura CS50 este o bucată gratuit
software-ul care vă permite să rulați un alt sistem de operare,
Linux, în acest caz, pe propriul computer, într-o fereastră.
Acum nu mai puteți descărca doar aparatul.
Ai nevoie de un program cu care să se joace sau a alerga aparatul.
Și acea bucată de software-ul este, în general, cunoscut ca un
hypervisor.
Hypervisori vin în formă de produse, cum ar fi VMware,
Virtual Box, Parallels.
Tot felul de societăți fac software-ul, ambele gratuite și
comercial, deopotrivă.
Ceea ce veți vedea în problema Set 1 sunt instrucțiuni despre cum să
a obține software-ul gratuit cu care să
executați Aparatura CS50.
Și odată ce faci, vei avea, într-o fereastră de pe Mac sau PC,
un mediu de desktop care arata destul de în acest fel, în cazul în care
are un meniu Start-ca lucru în
jos colțul din stânga.
Ea are un dosar întâmpinare, sau director de pornire, în stânga sus
acolo, un coș de gunoi, și așa mai departe.
Deci, vom tachineze pe langa detaliile necesare ca vom merge.
>> Dar acum să înceapă să se scufunde în C.
Deci C este acest limbaj de programare, similare în spirit
Zero, dar mult mai puțin grafic, dar în mod ironic, de departe
mai puternic odată ce te savvy cu ea.
Deci, în C, vom scrie programe prin scrierea de cod sursă, care este
această sintaxă engleză-ca, similar cu șosete
demonstrarea faptului că am făcut data trecută, care vă permite să
te exprimi destul de precis, în cazul în care
arcanely, la calculator.
>> Deci, ce fel de software-ul produsului nu aveți nevoie de fapt,
pentru a scrie programe într-un limbaj ca C, în baza noastră de
conversație luni?
[Neauzit]
OK, ai nevoie doar de un editor de text.
Nu aveți nevoie de nici un software special
în sine pentru a scrie programe.
Ai nevoie doar de un editor de text cum ar fi Notepad, pe Windows,
TextEdit pe Mac, sau ceva numit gedit, în lumea
Linux, pe care le vom folosi aici.
Și asta e tot, pentru a scrie programe.
>> Dar scrisul e doar jumătate din ecuație.
Va trebui apoi să le executați.
Dar, în scopul de a rula programe -
nu puteți rula codul sursa.
Aveți în schimb trebuie să faci ce-l mai întâi?
Da.
David J. MALAN: Trebuie să vă
compilați-l.
Și, altcineva, compilarea codului sursă înseamnă -
[Neauzit]
David J. MALAN: Exact.
Traducându-l la zero și unu.
Pentru că toți dintre noi, în aceste zile, au computere care au procesoare,
aproape toate din care sunt realizate de o companie numita Intel, și
Intel Inside, înseamnă că e în interiorul creierului de dvs.
calculator, cunoscut sub numele de CPU.
Iar unul dintre lucrurile pe care pe care creierul nu este, ea știe
cum să înțeleagă modelele de zero și unu.
El stie ce model de biți reprezintă plus, ceea ce
model reprezinta scaderi, ce model de
biți reprezinta imprimare, precum și crearea unui sunet audibil.
>> Deci, pe scurt, CPU, cuplat cu sistemul de operare,
care este o bucată de software care rulează pe partea de sus a procesorului,
ca să spunem așa.
Împreună, aceste două piese știu cum să execute programe care
noi, oamenii, scrie.
>> Așa că, dacă mă duc în Appliance CS50 aici, am nevoie pentru a deschide
un editor de text și pot accesa acest
în câteva moduri.
Eu pot merge la Meniu, Programare,
și apoi pot selecta -
nope, nu că meniul.
Eu pot merge la Accesorii / gedit aici pentru a deschide
editorul meu de text mic.
Sau, mai simplu, am posibilitatea să faceți clic pe această pictogramă mică în partea de jos
colțul din stânga.
Și acum ajung aici acest mediu.
E destul de amintește de un editor de text simplu, cu doar
una sau două diferențe.
În partea de sus, în cazul în care cursorul clipește acum, acest lucru este în cazul în care
Pot începe să scrieți codul meu.
În partea de jos este acest lucru numit fereastră de terminal.
Și ce fel de lucruri pot să fac în acest
așa-numita fereastră de terminal?
[Neauzit]
>> Bine, asa ca voi executa comenzi.
Iar unele dintre comenzile Am alergat pe luni au fost un pic
criptice la început, dar ls pentru lista, cd pentru directorul schimbare,
rm, pentru al scoate.
Deci e un fel de un mod vechi de-școală de navigație dvs.
calculator, folosind doar tastatura și comenzi textuale,
și nu, în general, cu ajutorul mouse-ului.
Dar vom vedea, înainte de timp, acest fapt ne oferă o
putere pic mai mult și cu o precizie pic mai mult, cu care să
exprimă pe noi înșine.
Și apoi aici, la stânga, suntem doar de gând să văd,
cum vom începe software-ul scris, un rezumat mic de
Programul pe care l-am scris in stanga sus.
Dar vom vedea că din nou înainte de mult timp.
>> Deci, hai sa facem ceva destul de simplu aici.
Lasă-mă să merg mai departe și primul du-te la File, Save, iar eu sunt doar
de gând să faceți clic pe jharvard aici, pe la stânga, și
jharvard este, din nou, numele de folder casa mea, mea
fișiere personale, mine, acum fiind John Harvard, ca voi toți
va fi în curând John Harvard, în acest mediu.
Are acest director Acasă, Documentele mele și așa mai departe,
pe care vreau să le salvați, acum, acest fisier inch
Așa că am de gând să-l sun hello.c. Apoi, am de gând să merg
înainte și faceți clic pe Salvare, și acum ceea ce am aici este o filă
numit hello.c, atât de mult ca un alt tip de editor.
>> Asa ca lasa-ma acum mergeți mai departe și a începe scrierea unui program.
int main (void).
Și apoi am făcut doar ultima dată, printf, pentru print formatat,
("Bună ziua, lume!"
);.
Aproape finaliza.
Dar Îmi lipsește o pereche de detalii.
Ceea ce lipsește din acest program de care am nevoie pentru
este de a compila, de fapt?
Da.
[Neauzit]?
>> David J. MALAN: Da, așa că am nevoie pentru a include standardul
I / O bibliotecă.
Deci, acest lucru trebuie să meargă mai sus principal, așa că am de gând să
face unele cameră pentru el acolo.
Și am de gând să fac # include .
Și observați paranteze unghiulare acolo.
Și, ca o paranteză, gedit este un pic de utilizator prietenoasa, în cazul în care
uneori, un pic confuz, în măsura în care încearcă să ajute dvs.
Ochii observați ce linii cu ce.
Deci, faptul că cursorul mea este chiar lângă acest unghi
suport, observați cum se subliniază în unghi celălalt
Suport plus aceasta.
Si asta e doar să atrag atenția asupra mea faptul că am
au simetrie.
Și simetrie în programarea este, în general, un lucru bun.
În mod similar, dacă am muta cursorul la sfârșitul meu, observați cum
acolade linie până să demonstreze că, da, am una deschisă
și una închisă, ca să spunem așa.
>> Bine, și eu pot face un alt lucru.
Nu este strict necesar, dar de bune practici, pentru a spune
întoarce 0.
Și 0 schimbul ce face pentru noi aici?
Sau semnifică ce?
[Neauzit]
David J. MALAN: Dar nimic nu e în neregulă.
Și, sincer, e greu pentru mai mult sa mearga prost într-o
programa acest scurt.
Deci, eu sunt doar a fi super-explicite ca totul este bine.
Eu, om, atunci când am rula acest program, probabil nu va
a se vedea că 0.
În general, aceste numere care sunt returnate de la principal
crească doar capetele lor la om, atunci când
ceva nu merge bine.
Si veti obtine un pop up pic de eroare de sistem de zis, o,
doi, trei, sau indiferent de numărul care a fost
a fost de fapt returnate.
Deci, orice altceva în neregulă cu asta?
[Neauzit]
>> David J. MALAN: Deci, acest lucru nu este atât de mult o greșeală funcțională
ci una estetică.
Am ar trebui să pună, probabil, într-un caracter linie noua acolo, la
sfârșitul acestui șir, astfel încât să ne mutăm de fapt, cursorul
linia următoare, precum și programul de doar arata un pic mai frumoasa.
>> Asa ca lasa-ma sa plec acum în jos la fereastra mea terminalul
și zoom înapoi inch
Și acest lucru aici, se numește prompt.
E doar amintindu-mi cine sunt, jharvard @ aparat, în cazul în care
Aparatul este numele calculatorului Sunt pe.
În paranteze este acest tilda, simbolul squiggle, care
reprezintă ceea ce?
PUBLICUL: director Acasă.
David J. MALAN: director Acasă.
Deci, asta e doar o notație prescurtare pentru spui că sunt în
dosarul personal în cazul în care toate fișierele merge în mod implicit.
Deci, acum, aici, am posibilitatea să tastați ls pentru lista.
Și singurul lucru pe care văd aici, în acest moment este hello.c.
Și asta e bine pentru ca am scris asta.
>> Așa că lasă-mă să merg mai departe și fac salut.
Și observați nu mă face tastarea hello.c.
În schimb, eu sunt tastarea doar numele de bază a fișierului, salut.
Și fă, așa cum am văzut de luni, se va deduce doar că vreau
c fisier..
Așa că acum am tastat fac salut.
Acum văd această comandă destul de lung și va continua
văzând asta din nou și din nou.
Dar pentru a fi zăngănit clar,, cuvântul pe care tocmai a apărut,
asta e compilator real.
Asigurați-este doar un utilitar de build.
E doar un program de utilizare mult mai prietenoasa, care mă salvează, în
pe termen lung, de la a fi nevoie să tastați în incredibil de plictisitor lung
comenzi, cum ar fi faptul că unul.
Deci, ai putea fugi zăngănit manual.
Ai putea tastați tot acel manual.
Doar devine foarte obositor.
Și face acest lucru este doar un program care simplifică viața noastră și
ruleaza comenzi mai complexe pentru noi.
>> În regulă, deci acum ce ar trebui să am fișier
în directorul meu actual?
Nu doar hello.c, dar, de asemenea, salut.
Deci, dacă vreau să ruleze salut, se amintească faptul că am spus punct slash,
în cazul în care mijloacele dot merge în folderul curent, oriunde te-ai
sunt, și apoi executați programul numit salut, și într-adevăr, acum,
Am Salut lume.
În regulă, orice întrebări cu privire la fluxul de lucru sau sintaxa
ceea ce am făcut?
>> În regulă, deci haideți să aruncăm lucrurile la un alt nivel din nou.
Deci, acest lucru a fost underwhelming să scrie doar un program care doar
vreodată spune salut, lume.
Deci, l-am schimbat, luni, să spunem, Buna, ziua, David.
E un pic mai personal, dar la fel de greu ca și codificate
prima versiune.
Așa că nu tot ceea ce convingătoare.
Dar există, în C, cu siguranță, pe lângă funcțiile de
imprimare, funcții care vă permit să obțineți date introduse de utilizator.
Și felul în care a făcut acest lucru, zilele trecute, a fost după cum urmează.
Înainte de a imprima de fapt am ceva, am ajuns prima dată
ceva de la utilizator.
Așa că lasă-mă să fac asta din nou.
>> String s, unde s este doar un nume arbitrar, aici, pentru o
șir, adică getString.
Deci, ceea ce a fost getString?
Ea devine, evident, un șir de caractere, bazat pe numele său.
Dar ceea ce este, mai tehnic?
E o funcție.
Deci, este o funcție care nu vine cu C per se.
CS50 personal a scris acest lucru.
Și astfel pentru a utiliza aceasta, nu puteți include doar stdio.h,
De asemenea, trebuie să includă ce?
Da.
Deci cs50.h, care este doar un fisier am scris cu câțiva ani în urmă.
Am instalat pe aparat pentru tine alături de
toate fișierele standard.
Și astfel, în aceste primele câteva săptămâni de clasa, vom folosi
asta doar pentru a simplifica procesul de a face foarte de bază,
lucrurile dori introduse de utilizator obtinerea.
Pentru că așa cum vom vedea în câteva săptămâni, datele introduse de utilizator obținerea într-un
limbajul C ca este de fapt surprinzator de complex,
mai ales pentru că nu știți în avans, de obicei, cum
multe lucruri utilizatorul este de gând să tastați inch
Iar atunci când nu știi cât de mult să se aștepte de date, nu aveți
Știi cât de mult de memorie pentru a aloca.
Și dacă aveți de fapt, un utilizator contradictorie, care incearca
să hack în sistemul dvs., blocheaza computerul, bine,
în general, prima metodă de atac este, așa cum am făcut-o pe
Luni, tastați o secvență întreagă de caractere aleatoare lung,
apăsați Enter, și să vedem ce se rupe.
Pentru că, în general, în cazul în care un program de pauze, ca aluzie la
un defect de securitate, potențial.
Este cu siguranță aluzie la tine, programator, care a făcut o
greșeală, dar mai periculos, este posibil să fi făcut o
legate de securitate greșeală, și, în general, vom vedea că
asta e modul în care mașinile sunt compromise la această zi, atât
în lumea de web și programe la
linia de comandă, cum ar fi acest lucru.
>> Bine.
Deci sirul s este egal cu getString.
Deci, mai concret acum, ceea ce face linia 6 face aici?
Deci, funcția pe dreapta devine șir,
ia câte argumente?
Bine.
Deci nimic.
Un pic de bun-simț verifica.
Un argument, din nou, este doar o intrare pentru o funcție pentru a modifica
comportamentul său implicit într-un fel.
Dar în acest caz, nu vreau să-și modifice
comportamentul getString.
Am vrut doar pentru a obține un șir.
Așa că am pus nimic în paranteze, și apoi am pus-o
punct și virgulă demarcată sfârșitul linie de cod.
Acum, semnul egalității nu înseamnă egal, per se.
Aceasta înseamnă misiune, ceea ce înseamnă că pune orice devine
scoase pe interior dreapta de tot ce este pe stânga.
>> Deci, pe stânga, spunem că ne-am declarat-o
de coarde numit uri.
Și, mai precis, am alocat de memorie în interiorul
pe care vom pune biți care reprezintă o secvență de
caractere.
Dar pentru ziua de azi, am alocat
sau declarată un șir.
Bine.
Deci, acum, odată ce am făcut acest lucru, vreau să conectați în valoare de
Nu e, valoarea lui David.
Deci asta e bine de ce?
Deci, aceasta este doar literalmente s hard-coded.
E a spune "Bună ziua, s," care nu este ceea ce vreau.
Deci, eu pot face asta.
Semnul procent este un substituent, dar acum am nevoie să
a trece în a imprima un al doilea argument.
Amintiti-va ca argumente pentru functii sunt separate prin
virgule, astfel încât virgula următoarea aici, mi-am pus după acest e scrisoarea.
Și în acest context acum, s este variabilă, și printf,
La primirea acestor două intrări -
șir pe stânga și numele variabilei pe dreapta -
se va conecta în urmă fosta pentru noi, și
doar imprima un șir frumos frumos care conțin
orice este faptul că am tastat inch
>> Deci, haideți să încercăm asta.
De gând să meargă înainte și zoom out, spate
la fereastra mea terminal.
Măriți la partea de jos aici.
Scrieți face salut.
Zăngănit pare să fi fost executați din nou.
Am de gând să tastați / salut, Enter..
Nimic nu pare să se întâmple încă, dar e la acest prompt
că am posibilitatea să tastați ceva de genul Nate, Enter, și acum avem
Bună, Nate.
Și pot să-l fac din nou cu Rob, și așa mai departe.
Deci, sperăm că acum acest program se comportă ca am de gând.
>> Acum nu, tot ce user friendly.
N-am nici o idee ce se asteapta de la mine.
Astfel încât să putem curăța cu siguranta asta un pic.
Lasă-mă să mă întorc aici, și în loc de doar scufundări în și
cere utilizatorului pentru un șir, permiteți-mi să spun în mod explicit
ghidul de ceea ce am asteptam.
Deci printf ("Introduceți un șir:"
);
Deci, nu variabile aici.
Nu există semne de procente.
Doar fraza simpla limba engleză.
Lasă-mă să plec acum la partea de jos aici și executați din nou programul meu.
Dar nimic nu pare să se fi schimbat.
De ce?
Trebuie să-l recompilați.
Deci greșeală ușor de făcut.
Dar trebuie să nu numai salvați fișierul, dar
recompilați programului.
Și așa, dacă am re-rulați make salut, acum zăngănit ruleaza.
Acum, eu pot rula / salut.. Și acum văd "Introduceți un șir:".
Bine.
Acum e un pic mai user-friendly.
Nate, Enter, Buna, ziua, Nate.
>> Ei bine, hai să încercăm din nou și începe să gândesc
despre cazurile de colț.
Deci, la fel ca în Scratch, sunteți încurajat sau sunt în curs de
încurajate în spec. la fel de gândească la ceea ce ar putea merge
greșit, dacă nu anticipa totul utilizatorul ar putea face.
Bug-uri, prin urmare, s-ar putea rezulta.
Deci, introduceți un șir -
ceea ce e un caz colț aici?
Ce este un scenariu pe care eu, programator, nu ar putea avea
anticipat?
Da.
Bine.
Și ce dacă am introduce un număr ca asta?
Bine.
Deci, încă mai funcționează.
Are nici un sens Gramatically.
Dar cel puțin programul de lucrări.
>> Ce e un alt caz colt?
Ceva ce eu nu m-am așteptat.
Da?
Bine.
Deci, am putea face ceva ca un număr foarte, foarte mare.
Deci, hai sa facem asta aici.
Lasă-mă să zoom out pentru o secundă, lasă-mă să evidențiați.
Nu se poate copia și lipiți-vă aici.
Bine.
Deci, eu nu pot copia și lipi în această fereastră de terminal, Deci, vom
doar simula.
Lasă-mă să micșora, merge să-și încheie.
Eu nu am de gând să fac asta pentru prea mult timp, pentru că nu va fi
de fapt, rupe în acest program.
Dar ar putea.
Enter.
Dar nu a făcut.
Bine.
Dar e un caz colt autentic.
Și singurul motiv pentru care s-au comportat în mod corect, astfel încât să
Vorbim, se datorează faptului că funcția de getString CS50 este de fapt
conceput sub capota, așa cum vom vedea în câteva săptămâni,
să aloce automat mai mult RAM și mai mult, mai mult și mai mult
de memorie din sistemul de operare, atunci când își dă seama, wow,
Chiar ai tastat în ceva destul de mult timp.
Acum, acest lucru este un pic de o minciună albă.
Dacă avem de fapt oprit pentru un timp destul și am scris în
ceva de genul 5 miliarde de caractere de la tastatură
aici, sau într-adevăr a lovit copy-paste destul de un pic, am destul de posibil
ar putea cauza programului sa se prabuseasca.
Doar un pic mai greu pentru a simula că, cu o finit
suma de timp.
>> Ce e un alt caz colt am putea încerca?
Da?
Da.
Deci, de ce nu ne raspunde nimic?
Așa că de fapt trebuie să ia o acțiune, pentru că în caz contrar
Programul va sta acolo toată ziua clipească.
Dar dacă am lovit Enter -
OK, acum, încă arată bine.
Nu ati accident, dar poate există acum o oportunitate de a
începe punerea în aplicare a unui program mai riguros
că de fapt verifică.
Și dacă șirul, teză, cuvântul pe care am
tastat în lungime are 0, ei bine, poate că ar trebui să țipi la
utilizator, sau spune-i sau ea pentru a introduce un șir de caractere, din nou, astfel încât
ajungem de fapt, ceea ce arata ca un comportament corect și nu
Tocmai de supraveghere completă din partea mea.
>> Întrebarea în spate?
Zecimale număr.
Deci, am putea încerca asta.
1.10000005.
Se pare ca asta va merge doar de fapt bine.
Și că de fapt este de așteptat.
Chiar dacă ne-am fi tastat acel număr nu există, sau o
număr mai mare mai devreme, atunci când realizăm că suntem tastarea de utilizare
de intrare și suntem folosind funcția getString, nu
Indiferent dacă ceea ce am tastarea arata ca un număr.
Reamintească faptul că în conformitate cu ASCII, totul pe dvs.
Tastatura are o valoare numerică ce poate fi mapat la un
caracter, un caracter.
Deci, în acest caz, chiar dacă s-ar putea introduce un număr,
calculator este de gând să mă gândesc, ca să zic așa, ca un șir -
ceva care arată ca un număr, dar este
de fapt, nu un număr.
Dar asta e de fapt o segue perfectă, pentru că acum putem
de fapt, trecerea la programe de scriere care
utilizați alte tipuri de date.
>> Deci, în afară de utilizarea de caractere, sau mai degrabă, pe lângă utilizarea siruri de caractere,
seama că avem alte tipuri de date în C, precum și în
alte limbi.
O char, astfel cum sugerează și numele, este doar un singur caracter.
Un float este o valoare în virgulă mobilă, și asta e doar o fantezie
fel de a spune un număr real - ceva care are o zecimală
punct în ea cu niste numere la stânga și / sau dreapta.
Un int este un întreg, care este la doar un număr ca 123.
Și acum mai interesant sunt lucruri cum ar fi dublu.
Ce am spus-o dublă a fost ultima data?
E 64, dreapta.
Deci, întrucât de obicei, un fond de trezorerie este 32-bit -
așa că este atât de mult în memorie, ea folosește 32 zerouri și cele pentru
reprezintă valori - un dublu este literalmente două ori, ceea ce
înseamnă că puteți reprezenta fie numere mai mari, sau
vă pot reprezenta numere mai precise.
Astfel încât să puteți avea mai multe numere, după punctul zecimal, dar
cum colegii spus în filme, chiar ceva simplu
conceptual ca 1/3 nu poate fi reprezentată printr-o precizie
calculator, pentru ca în cele din urmă a alerga afară de biți, și
Prin urmare, se poate face doar .33333333 de atâtea ori, la
ce punct trebuie doar să spun că sunt de reprezentare
spațiu, am să sun doar o zi și-l reprezintă
oarecum imprecis place asta.
Și o lungă lung -
nume stupid, dar e pentru că e un tip de date cunoscut ca un
lung în C, care întâmplător este de multe ori 32 de biți, la fel ca un
int este de 32 de biți, dar o lungă lung este
în general, 64 de biți.
Deci, doar înseamnă că puteți reprezenta mai mare
Numerele decât aceasta.
>> Bine.
Deci, dacă am de fapt, doresc să înceapă reprezentând lucruri, am
s-ar putea avea nevoie de mai multe tipuri de sofisticate, și
de aceea avem șir.
Deci, în bibliotecă CS50, ca fișier numit cs50.h, ne-am
de fapt, a declarat un tip de date, ca să spunem așa, numit string,
dar șir nu există de fapt.
Acest lucru este, din nou, una din aceste straturi ne vom coaja
înapoi într-o săptămână sau două și aruncați-l, și de fapt
uite sub capota la ceea ce este de fapt un șir de caractere, iar
cum se reprezentat.
Suntem, de asemenea, de gând să se uite la valori booleene.
>> Deci, ceea ce a fost un bool, în contextul Scratch?
E adevărat sau fals.
Deci e doar o valoare care e adevărat sau fals, pornit sau oprit, 1 sau
0, cu toate acestea doriți să vizualizați lume.
Deci, în C, datorită biblioteca CS50, care, la rândul său,
include o altă bibliotecă sub capota, avem
acces la un tip de date care se numește bool, care va
literalmente ne permit să atribuie valorile adevărate sau false pentru a
lucrurile într-un program.
>> Așa că hai să mergem mai departe aici și scrie un mic program care
face ceva care implică numere în loc.
Așa că lasă-mă să mă întorc la Appliance CS50, lasă-mă să merg mai departe și
crea un nou fișier numit aici -
hai să spunem ceva simplu, cum ar fi math.c.
Bine.
Și acum du-te până la partea de sus a programului meu, eu sunt
de gând să faci de obicei -
# Include , astfel încât să pot folosi
printf, int main (void) -
ne vom întoarce la, în cele din urmă, ceea ce înseamnă int
aici, ceea ce înseamnă vid aici, dar pentru acum, știu doar că
va trebui să înceapă programe de acest gen.
Acum am de gând să merg mai departe și spun ceva un pic
diferit - printf ("Dă-mi un număr de:"
);.
Apoi, am de gând să fac int n = GetInt, deoarece
rotații faptul GetInt este o altă funcție în bibliotecă CS50
în afară de getString.
Și acum am de gând să fac ceva stupid, cum ar fi "mulțumesc
pentru d%, "pentru intreg zecimal, iar apoi n virgulă, și
atunci intoarce 0.
Deci, din nou, returnați valoarea 0 nu are nimic de-a face cu numărul eu sunt
cere utilizatorului pentru.
Doar semnifică la sfârșitul că toți, probabil, este bine.
>> Așa că lasă-mă să merg în jos la fereastra terminalul meu aici.
Lasă-mă să tastați fac matematica, introduceți.
Și ceva e în neregulă.
Asigurați-matematica nu au de lucru.
Iată prima mesaje de eroare noastre.
De ce?
Un pic de criptic, dar -
Da.
Deci, cs50.h.
Deci, din nou, mai ales la început, veți scrie prima dvs.
Programul pentru PSET 1 în secțiunile, în ore de birou, precum și
sincer, acesta va fi copleșitoare uneori, ceea ce aceste lucruri
sunt de fapt spun.
Dar vă veți da seama foarte repede au început să scadă
în compartimente prin care aceasta înseamnă că ați lăsat pe una
a # include în partea de sus a fișierului.
Și zăngănit, compilator, te informarea de acest lucru,
spunând, mai degrabă fancifully, declarația implicită a
GetInt funcție este nevalid.
>> Bine.
Deci, ce înseamnă asta?
Aceasta înseamnă doar v-ați implicit declarat în GetInt
sensul că nu ați mod explicit declarate.
Pentru a declara în mod explicit int, va trebui să învețe
Zăngănit că ea există.
Și soluție foarte simplă pentru că este să-l învețe de
inclusiv acest fișier alta, cs50.h, la
partea de sus a fișierului.
Pentru că literalmente, ceea ce nu este: # include ea spune zăngănit
destul de mult pentru a merge găsi fișierul numit cs50.h, copie,
inserați-l în mod automat în partea de sus a programului meu pentru mine,
și de a converti apoi codul sursă pentru zero și unu.
Dar care ar fi, evident, foarte obositor dacă noi, oamenii, au avut
pentru a merge copierea și lipirea aceste fișiere mari tot timpul,
astfel: # include doar face tot ceea ce în mod automat, fără
tulburarea codul meu cu biblioteca altcuiva.
Și o bibliotecă este doar un alt dosar cuprinzând funcții și
alte lucruri pe care altcineva a scris, că suntem
pârghie de dragul nostru.
>> Bine.
Să încercăm din nou.
Asigurați-matematica.
Enter.
Bine.
Așa că pare să fi funcționat.
Așa că lasă-mă să ruleze, acum, matematică;. / Matematică.
Introduceți îmi dă un număr, 123.
Multumesc pentru 123.
Acum, haideți să încercăm un alt caz colt.
Un șir este destul de generos, deoarece o
șir poate fi orice.
Poate arata ca numere, arata ca
caractere, arata ca cuvintele.
Dar un int este un int.
Deci, acum, dacă eu sunt utilizator de dificil, iar ea spune "Dă-mi
un număr, "ce dacă am încerca să fac ceva de genul 0.1?
Ei bine, asta e un număr, și este în concordanță cu
gramatica am folosit aici, dar sub capota, eu sunt de
Desigur folosind funcția GetInt.
>> Deci, haideți să vedem ce se întâmplă.
Introduceți, încercați din nou.
Bine.
Permiteți-mi să fie dificil și doar a lovit din nou Enter.
Introduceți, Enter.
Deci, acum se pare că GetInt este un pic mai mult
puternică decât getString.
Noi, personalul, pus în aplicare în așa fel încât, dacă observăm
nu ne-au dat un int - si un int este un număr zecimal
zerouri, care conțin cele două câte două, trei, patru labe,, cinciari, șesari,
șeptari, optari, sau nouari.
Și asta e tot.
Nu există puncte zecimale, fără caractere, fără semne de punctuație.
Se pare că avem de a coopera.
Așa că lasă-mă să încerc patru, cinci, șase, și care ma primeste prin intermediul.
Deci, într-adevăr, să fie anal aici, ar trebui să spun, probabil, "Dă-mi
un întreg ", în scopul de a transmite utilizatorului
exact ceea ce am de gând.
>> Acum, haideți să gândim sub capota.
Noi nu te vom uita la modul în care este pusă în aplicare cs50.h astăzi,
acea bibliotecă.
Dar, în cazul în care tot spune reîncercare, retry, retry, ce programare
construi eu probabil folosind sub capota pentru a
pună în aplicare asta?
Deci, doar o buclă, nu?
Una dintre cele mai simple idei pe care am văzut-o pe Scratch.
Construi totdeauna, Repetare construi.
Probabil, în acest program, sub capota, chiar
deși este scris in C si nu zero, se face
ceva numit echivalent pentru totdeauna, dacă utilizatorul nu are
tastat într-un întreg, să zicem reîncercare, retry, retry, retry, deci
apoi în cele din urmă atunci când vom obține un număr întreg, atunci
izbucni din bucla.
>> Deci, ce alte funcții putem folosi aici, în biblioteca lui CS50?
Ei bine, un fel de cele evidente, cel puțin pe
tipurile de date pe care le cunoaștem acum există.
Am implementat getString, GetInt, dar de-a lungul
primele săptămâni ale termenului, puteți utiliza, de asemenea, și GetFloat
GetDouble și GetLongLong, în scopul de a obține exact
tipurile de date pe care doriți.
Deoarece detaliu cheie aici este faptul că, spre deosebire de unele limbi,
cum ar fi Python și Ruby, în cazul în care nu trebuie neapărat să
declare tipul de date al unei variabile -
nu trebuie să-i spun ce fel de calculator chestii
ai de gând să pună în variabila -
în C, trebuie să fie vreodată atât de precis.
Deci, dacă doriți o variabilă numită n, o bucată de stocare
că, în acest caz, se întâmplă să fie 32 de biți, prin convenție, te
Trebuie să-i spun de calculator ce acești biți sunt
de gând să stocați un număr -
nu un personaj, nu un șir de caractere, nu un fond de trezorerie.
Și aceasta abordează problema în mod eficient ne
a fugit în săptămâna trecută.
Daca folosim zerouri și numere pentru a reprezenta cele nu doar
Dar, ca și numerele B si C, cum în lume este un
calculator de gând să știți că acest model de biți de fapt
reprezintă numărul de 65 de ani, spre deosebire de reprezentare a
O scrisoare, care coincidență, în conformitate cu
ASCII, amintesc, era echivalent cu 65 de ani?
>> Deci, aceste tipuri de date furnizează context, la calculator, așa
că nu știe dacă aceste biți ar trebui să fie interpretată ca o
int sau ca un șir de caractere.
Orice întrebări, apoi, pe asta?
Da?
David J. MALAN: Bună întrebare.
Dacă luăm în stdio.h, vom salva fișierul -
lasă-mă să merg în jos la fereastră terminal și rulați make matematica, zoom
și introduceți -
acum am o eroare diferit, pentru că eu sunt, implicit,
declarare a ceea ce funcționează acum?
Printf.
Deci, acum am creat o nouă problemă, a cărei soluție este
în esență același.
Am nevoie pentru a pune-o înapoi.
PUBLICUL: [inaudibil]
David J. MALAN: Oh.
Deci, dacă am scoate -
Bine, da.
Deci, dacă am elimina includerea I / O standard bibliotecii sus
aici, și apoi spui că dacă aș scăpa de printf, pentru a primi
scăpa de printf?
Da.
Acest lucru ar trebui să funcționeze, pentru că eu nu mai sunt folosind orice - Ups.
Credeți mint pur și simplu?
Oh, bine.
Acest lucru nu va funcționa, din cauza unei erori de noi ne-am introdus.
Și aceasta este un pic mai mult de auto-explicativ.
>> Care e problema?
Neutilizate n variabile.
Deci, această eroare este rezultatul faptului că am configurat
aparatul să fie deosebit de pedant, să țipe într-adevăr la
multumim pentru fiecare greșeală este posibil, chiar dacă e un fel de
o greșeală, non-fatale ca aceasta - este într-adevăr o astfel de mare
face că am alocat un int, a pus un număr în ea, și apoi
doar nu a făcut nimic cu ea?
Deci funcțional, nr.
Asta nu se va rupe programului.
E doar un fel de prost, nu?
Nu există nici o valoare pentru care au cerut acest număr, stocate
într-o variabilă, dacă nu sunteți niciodată de gând să faci nimic
cu el, dacă acesta imprima sau salva.
Deci, în acest caz, este zăngănit recunoaște la fel de mult, și
se spune n variabile neutilizate.
>> Astfel încât să putem rezolva acest lucru, dacă ne dorim cu adevărat.
Dar, din nou, acest lucru nu este de programare bine acum.
Asa ca am putut face acest lucru -
du-te aici, lasă-mă să goli ecranul, fac matematica.
Care funcționează.
Acum, eu pot rula programul meu de matematica, ia de intrare -
Ei bine, asta a fost rău.
Ia de intrare, și că este tot ce face, în acest caz.
>> Deci, de fapt, să încercăm un caz alt colț pe care le
Nu m-am gândit de mai devreme.
În acest caz - aici, sa ne intoarcem la una care e un
puțin mai user-friendly.
Lasă-mă să mă întorc aici și rulați make matematica din nou.
Hopa, ce am gresit?
Trebuie să se rostogolească înapoi în continuare.
Bine.
Acum ne-am întors în starea inițială, în cazul în care toate
este, sperăm, bine.
Și acum, dacă am alerga matematica, 123 pare să funcționeze.
Dar acest lucru nu este cu adevărat o dovadă efectivă, doar pentru a spune
ok, care funcționează.
789, care funcționează.
E timpul să trimiteți.
Pentru că nu e colț alte cazuri aici.
Un șir nu a dat într-adevăr ne-necazuri prin tastarea într-un
mulțime de caractere.
Dar ce se întâmplă dacă am tip în asta?
Lovirea numărul 1 un întreg lot, mulțime aici -
regulă, se face un pic plictisitor, așa că am de gând să
opri aici, și am de gând să lovi Enter.
>> Ce naiba sa întâmplat?
Deci, acest lucru poate fi explicat de fapt.
Deci, l-am luați-o ca un binar?
Un gând bun, dar nu, nu e faptul că ea a luat
ca un binar, deoarece, într-adevăr, faptul că a fost doar un fel de
coincidență.
Putem face asta din nou.
Deci nu e nici 2 în sistem binar, asta e
oricum, probabil, suficient.
Enter.
Așa că nu a fost problema.
Ce altceva?
Exact.
>> Deci, cred că înapoi la ceea ce este de fapt un int.
E 32 de biți, care sunt interpretate în mod colectiv
ca număr.
Dacă aveți 32 de biți, ceea ce înseamnă fiecare dintre biți pot fi
un 0 sau un. 1, 0 sau 1
Deci asta înseamnă că e două posibilități pentru acest bit,
două posibilități pentru aceasta, două posibilități pentru aceasta
bit - așa că e de 2 ori de 2 ori -
asa ca asta e 2 la puterea 32 este numărul total de
permutări de zero și unu, dacă aveți 32
substituenți, sau cele zerouri, în fața ta.
Deci, dacă am 2 la 32, matematic, asta e ceea ce?
Deci, este foarte mult.
E 4 miliarde dolari, da sau de a lua.
Și 4 miliarde nu pare a fi ceea ce a fost tipărită aici.
De fapt, acest lucru pare mai aproape de la 2 miliarde de euro.
Dar aceasta nu este o coincidență.
Faptul că computerul a interpretat greșit numărul meu imens,
mea secvență uriașă de unu și apoi secventa mea foarte mare de câte doi,
ca aproximativ 2 miliarde de euro, se explică cum?
E un capac pe int.
Există o siguranță de o valoare maximă pe care îl poate reprezenta.
Dar e de obicei 4 miliarde de euro, nu?
Dacă 2 la 32 este de aproximativ 4 miliarde de euro, care pare ca
asta e cel mai mare număr.
Deci, nu un rest, dar un gand bun.
Numere negative.
Deci, dacă aveți 4 miliarde lucruri posibile poți
reprezintă cu aceste permutări diferite de 32 0s și
1s, ei bine, este evident motivul pentru care noi, oamenii, ar putea dori să
reprezintă nu doar numere întregi pozitive
dar întregi negative.
Și într-adevăr, asta e presupunerea că C face.
Deci, cu 32 de biți, puteți reprezenta aproximativ 2 negativ
miliarde de euro tot drumul până la pozitivă 2 miliarde de euro.
Și astfel, în acest caz, ceea ce sunteți cu adevărat vedem este doar
franjuri de capacitatea noastră de întreg, și avem, astfel încât
de a vorbi, au umplut un număr întreg.
Am încercat să se ghiftui mai multi biti în ea decât poate potrivi de fapt.
Deci, rezultatul final este, în esență, avem toate cele 1 biți.
Ne-am intors tot de biți noastre pe, am încercat să reprezinte
cel mai mare număr posibil, dar nu e clar de aproape
suficient de mare pentru a reprezenta cele două lucruri tocmai am tastate inch
Da?
PUBLICUL: [inaudibil]
>> David J. MALAN: Bună întrebare.
De ce nu putem pur și simplu că reprezenta negativ
semneze ca doar un personaj?
Așa că am absolut putut, și am putea salva atunci
o suplimentare de biți.
Dar tu ești încă va trebui să reprezinte acea linie, și
care va costa cel puțin ceva,
probabil un pic.
Deci da, am putea avea 32 de biți utilizate pentru numărul nostru, dar acum
avem nevoie de un alt biți folosit pentru bord nostru
simbol, semnul minus.
Deci, acum avem 33 de biți, valori pe care le-ar putea face, dar e
Pur și simplu nu se face felul.
Am făcut-o hotărâre ani în urmă apel, 32 biți este un fel de
unitate de măsură aici.
Deci, vom folosi una dintre aceste biți în mod eficient la
reprezintă negativitate, și 31 biți pentru a reprezenta numărul.
Alte întrebări?
Bine.
Asta e mult.
De ce nu mergem mai departe și să ia noastră de cinci minute pauză aici?
>> Bine.
Deci, din nou, nu de a sublinia exagerat aplicațiile matematice
de programare, hai să smulgă chiar lângă acest exemplu, o
înainte de a ne muta în alte constructe, doar pentru că
va ilustra câteva puncte comune obstacole pe unele dintre
elementele de bază atunci când vine vorba de programe de scris.
În acest caz, face expresii aritmetice, care au unele
relevanță interesant de sintaxa.
>> Deci, aceasta este doar o formulă cu care putem converti
temperaturi de la Fahrenheit în grade Celsius.
Dacă nu-mi aduc aminte, aceasta este doar formula.
Deci, dacă am conectați în grade Fahrenheit valoare de 32 de grade, ceea ce este
congelare, care va fi de 32 la minus 32 este 0, și, într-adevăr,
0 în Celsius este de asemenea congelare.
Deci, bun-simț rapidă verifica acolo - asta e formula familiar.
Lasă-mă să merg pe la aparat, însă, și începe
scrie un program numit, cum ar fi, f2c; "Fahrenheit la
Celsius dot C ".
Și până la partea de sus aici, am de gând încep cu # include
stdio.h, și am de gând să fac int main (void), si
din nou, ne vom întoarce în viitor, la ceea ce înseamnă int
acolo și ce înseamnă că nu există vid.
Și acum să-mi merge mai departe și să implementeze un program care
în esență, face acest lucru de conversie pentru noi.
>> Deci printf, să zicem, temperatura în grade Fahrenheit.
Și atunci să-mi merge mai departe și să obțină valoare din ghidul.
Ce fel de valoare ar trebui să I a lua de la utilizatorul daca vreau
le să-mi dea o temperatură în grade Fahrenheit?
Da?
Ce ti-ar propune?
Da.
Deci, float se simte destul de rezonabil.
Avem, din nou, la doar câteva opțiuni care
am văzut până acum.
Avem lucruri, cum ar fi char, float double,, int, lung lung,
bool, string.
Deci acestea, float se simte destul de rezonabil.
Am putea folosi un drept dublu, pentru că, dacă vrem cu adevărat să
reprezintă temperatura unui om -
98.60000 -
am putea folosi pe 64 de biți pentru a face acest lucru, dar se simte ca
nejustificată pentru temperatura.
Așa că hai să mergem cu flotor.
Acum am nevoie de o variabilă.
Doar pentru a menține lucrurile simple, am de gând să-l sun f, dar am
ar putea numi la fel de corect, temperatura,
dar, fie este bine.
Deci, float f = GetFloat.
De îndată ce am acum au decis să utilizeze GetFloat, deși, am
trebuie să facă o corecție.
Da.
Deci, avem nevoie de a include # , în caz contrar compilatorul este
de gând să țipi la noi.
Acum, că am un flotor, lasă-mă să mergeți mai departe și de a face
de conversie.
>> Deci în primul rând, permiteți-mi să obține, de asemenea în obiceiul de aici
comentând codul meu.
Deci, din nou, un comentariu este doar o notație a omului care este
nu fac parte din programul în sine, ci unul, vă ajută să
înțeleg ce ai făcut în dimineața următoare, sau următoare
luni, ajută colegii dumneavoastră de predare înțeleg ce-ai făcut
sau ceea ce ați intenționat să facă, așa că e
în general, foarte bune practici.
La fiecare câteva linii de cod, scrie un comentariu la
te sau coleg.
Deci, aici, am de gând să spun, "Cere de utilizare pentru temperatura."
Nu trebuie să fie o propoziție completă, doar o frază scurtă.
Dar ideea din spatele comentând în C este faptul că fiecare dintre dvs.
comentariile ar trebui sa imputernici - sau, să zicem, un TF sau unui coleg -
să răsfoiesc programul dvs. și să știu exact ce face, prin faptul că nu
atât de mult citirea codului, dar citind comentariile, care
ar trebui să fie succint și clar.
În regulă, asa ca lasa-ma acum merge mai departe și spune, "Conversia
Fahrenheit în grade Celsius. "Așa că am de gând să merg mai departe și de a face,
să zicem, float c.
Vom păstra grade Celsius ca o valoare în virgulă mobilă.
>> Și lasă-mă să iau o lovitură de cuțit la asta.
Formula este, din nou, aici.
Ca 5/9 ori F minus 32.
Deci, hai sa facem asta.
Deci, 5 împărțit la 9, minus -
Ne pare rău, am incurcat deja.
Ori.
Deci, 5/9 ori F minus 32.
Deci, F minus 32, punct și virgulă.
Și acum, aici, am de gând să merg mai departe
și spun, imprimați rezultat.
Și această parte e ușor. Printf.
Cum pot să merg despre imprimarea asta?
Ei bine, am putea spune "Acest număr este în Celsius% f \ n",
doar pentru unele estetica.
Și apoi ce valoare vreau să conectați aici ca a lui printf
al doilea argument?
Bine.
Deci, doar c.
Deci, vom începe cu acest lucru și apoi să se întoarcă doar 0.
Din nou, nu are nimic de-a face cu matematica.
Aceasta înseamnă doar totul este bine.
>> Acum, este acest corectă, acest program?
Bine.
Așa că am făcut unele greșeli.
Chiar dacă nu aveți nici o idee despre ceea ce este de programare, aveți posibilitatea să sortați
de spate deduc la scoala clasa a ceea ce
Greșeli de aici s-ar putea să fie.
Care este unul din prima?
PUBLICUL: [inaudibil]
David J. MALAN: Da.
Deci ne lipsește paranteze.
Acesta a fost în mod deliberat că am făcut-o în paranteze keynote
glisați aici, pentru că de fapt această noțiune de ordine
operațiunilor, sau prioritate, prin care anumite operațiuni -
multiplicare -
au caracter obligatoriu mai mare, au prioritate mai mare, decât lucruri
cum ar fi adunarea sau scăderea.
Deci, am făcut asta de ani de zile doar pentru a face clar exact
ce operații matematice ar trebui să se facă mai întâi.
Deci ar trebui, probabil, imita exact acest lucru.
În caz contrar, computerul este probabil de gând să încercați să faceți
ceva de genul decalajul 5 până la 9, apoi înmulțiți F, apoi scade
32 din totul.
Care nu este, de fapt, ceea ce vrem să facem.
Deci, haideți să o paranteză.
Să adăugăm paranteze mea aici, aici paranteze.
Să pun asta aici.
Aici, am observat doar o alta greseala am facut de-a lungul drum.
Da?
PUBLICUL: [inaudibil]
>> David J. MALAN: Ah.
Bine.
Deci, avem de fapt, întreg același
problemă divizia de dinainte.
Am corecta că, să vedem ce este simptom.
Dar vom avea pentru a corecta o
greșeală altă aici.
Da?
PUBLICUL: [inaudibil]
David J. MALAN: Da.
Deci, am facut greseala stupida, dar incredibil de important.
Computerul nu este de gând să transforme doar un ochi orb și să
mă folosesc de capital F, atunci când am declarat, de fapt variabila
ca un f mici aici, în linia 8.
Așa că am nevoie pentru a corecta linia 11, în mea de capitalizare, pe care o
moment în urmă a fost un F de capital din greșeală.
Ce zici de aici?
Acest lucru ar fi cu litere mici, precum și?
Ar trebui să fie, dar asta eo coincidență.
Asta nu are nimic de f% de a face cu variabila.
Deci, doar pentru a fi super clar aici, lasă-mă să merg mai departe și
redenumi acest lucru, pe scurt, "temperatura". Lasă-mă să redenumiți
acest "temperatură". Permiteți-mi să nu redenumi asta.
Pentru că, din nou, f% la nivel global înseamnă, "plutind valoarea punctului."
Nu are nimic de-a face cu variabila mea.
Dar "temperatura" peste tot locul este doar un pic prolix,
așa că am de gând să mă întorc pentru a-mi cu litere mici "f" e.
>> Acum, lasă-mă să merg mai departe în jos la fereastra mea aici.
Asigurați-f2c -
care a fost, din nou, numele arbitrar I
a dat acest fișier.
Pare să fi compilat.
Lasă-mă să fugi f2c.
Enter.
Temperatura în grade Fahrenheit - hai sa facem una usoara.
32.
OK, corecta.
Dar, dacă eu fac acum 212 de fierbere -
al naibii.
Bine.
Deci, nu este corect în mod clar, în cazul în care TF dumneavoastră încearcă
cel puțin două valori.
Deci, care e problema aici?
Ei bine, ai pus deja degetul pe ceea ce este problema.
Dar de ce este că acest caz?
Până aici, atunci când fac matematica din 5 împărțit la 9.
Deci conceptual, asta e perfect corect.
În totalitate în conformitate cu formula.
Dar computerele doar fac exact ceea ce
spune-le sa faca.
Și ceea ce ne spune în mod eficient computerul este aici
împărți întreg de 5 intreg 9
și dă-mi rezultatul.
Problema este, însă, atunci când veți face folosind datele de diviziune
tipuri, de ieșire este aceeași ca și tipul de date intrări.
Și astfel, dacă cele două intrări sunt ambele Ints, de ieșire se întâmplă
să fie un int.
Și astfel 5 împărțit cu 9 puncte este ceva.
Dar ceea ce este cel mai apropiat număr întreg de la punctul ceva?
Deci, e de fapt 0.
Deci, așa cum am discutat, luni, totul după zecimală
punctul devine trunchiat.
Pur și simplu se aruncă.
Deci, aceasta este o greșeală completă, pentru că am putea la fel de bine doar
înmulțiți totul cu 0 aici.
>> Acum, eu pot rezolva acest lucru în câteva moduri.
Am putea face asta.
5.0 împărțit la 9,0.
Punct de vedere tehnic, nu am nevoie chiar de a face acest lucru.
Acesta este suficient pentru a face doar unul dintre numerele de un flotor -
sau dublu - prin punerea la punctul zecimal aici.
Pentru că ceea ce se întâmplă acum este atunci când diviza un întreg de
un flotor, sau un dublu, computerul va realiza
oh, unul dintre acestea este mai precisă.
Permiteți-mi să greșească pe partea laterală a oferindu-vă mai multă precizie decât
ați intenționat.
Deci, aceasta va converti rezultatul -
acesta va returna rezultatul ca valoare în virgulă mobilă, de asemenea.
Deci, care ar funcționa.
Acest lucru ar funcționa.
Și mai există un alt mecanism pe care le veți vedea în
mai multe detalii săptămâna viitoare.
Puteți, de fapt, ca programator, spune calculatorul
pentru a trata de fapt, un tip de date ca
ar fi fost alta.
>> Așa că am putea face de fapt acest lucru.
În paranteze, pot spune ceva de genul (float), deschis
paren, paren aproape.
Și aceasta este ceea ce se numește "casting". Din nou, mai mult
pe această săptămâna viitoare.
Dar aceasta este doar modul programatic de a spune
calculatorul, da eu știu 9 este un număr întreg sau un lung.
Știu că nu este o valoare în virgulă mobilă.
Dar l trateze ca atare oricum.
Deci, pentru a arunca un tip de date înseamnă a converti
de la unul la altul.
Sincer, aceasta este doar un pic urât, așa că propun să mergem
Înapoi la sugestia inițială de doar conversie
aceste lucruri să plutesc valorile punctelor manual.
Pentru că acum e doar foarte clar ce se întâmplă, și
nu e tot ceea ce distrage atenția.
>> Așa că hai să mergem acum înapoi în fereastra terminalul meu.
Asigurați-f2c.
Lasă-mă să mergeți mai departe și a alerga acest lucru.
Și, ca o paranteză, te plictisesti tastarea aceste comenzi
din nou și din nou, că dai seama calculatoare, cum ar fi Linux aici,
tind să fie destul de inteligent.
Și dacă m-am lovit de Sus, putem merge prin istoria mea toată
comenzi, sus și jos.
Deci, în acest caz aici, eu pot merge doar până la a face rula f2c.
Am fost strigat la, pentru că tocmai am făcut-o o secundă în urmă.
E deja până la data de.
Asa ca acum pot rula f2c din nou.
Să încercăm 32 Fahrenheit.
Acum, haideți să încercăm 212 Fahrenheit.
>> Pfiu.
Pare să funcționeze.
Acum, acest lucru este bun, dar se simte un pic arbitrar, care
Eu arăt șase numere după zecimale.
Corect?
Daca esti persoana meteo la TV, tu ești un fel de babalaule
dacă sunteți de lectură a temperaturii
acest grad de precizie.
Deci, haideți să simplifica acest lucru.
Așa că hai să mergem de fapt, până aici, la printf mea.
Și da, vreau să plutească.
Dar vreau să specificați acum de precizie.
Și am de gând să fie un pic succint.
Mă duc să spun, da-mi un punct după zecimală.
Deci, mai degrabă decât, să spunem f%, am de gând să spun% .1 f.
Și asta înseamnă doar da-mi-o singură poziție
după punctul zecimal.
Bine.
Să mai încercăm o dată.
Lasă-mă să-l re-rula după compilare.
Și acum am tip în 32, și mă întorc un
mai succint valoare.
Și am posibilitatea să tastați în, acum, 212, și de a lua înapoi o mai succintă
valoare, de asemenea.
Și nu există alte lucruri care le puteți face cu printf.
Puteți specifica de fapt, cât de mare ar trebui să fie numărul.
Dacă doriți să aveți padding pe el, astfel încât să puteți alinia la dreapta sau
stânga-align toate numerele dumneavoastră sau
încercați să lucruri centru.
Deci dau seama, există mici trucuri care le puteți face acolo.
Dar ei se fierbe doar până la codurile de format,
ca și cum avem acolo.
>> Deci, în ceea ce privește această chestiune de prioritate.
Acesta este un tabel foarte plictisitor să treacă prin metodic.
Dar seama că autorii C au venit cu
norme care specifică pe care operatorii au mai mare
prioritate, mai multa putere obligatorie, decât altele.
Deci, întrucât, în școala primară, în general, am știut că aceasta a fost
înmulțire și împărțire, apoi adunarea și scăderea,
apoi alte chestii.
Într-o lume de programare, există o mult mai
listă mai lungă de lucruri.
Și acest lucru nu este ceva ce merita memorarea acum.
Veți fi aclimatizarea la aceasta înainte de mult timp.
Dar, la fel ca în școala primară, în general, între paranteze rezolva
problemele de prioritate, prin realizarea de super-clar
calculator și umane, cât ceea ce este destinat.
Deci luați în considerare aceasta doar o foaie de ieftin pic acolo.
Dar cele mai multe dintre aceste detalii nu vom ajunge la timp pentru ceva.
>> Bine.
Acum, hai să construim și să se mute departe de aceste mici prostie
exemple matematice.
Încă mai folosesc fundamentele aceleași, dar începe
exprimându-ne un pic mai mult ca Scratch.
Deci, în Scratch, am avut aceste expresii booleene.
Și în limba engleză, o expresie booleană este ceea ce?
Adevărat sau fals.
E ceva ce se evaluează la true sau false.
1 sau 0.
ON sau OFF.
Orice ai vrea să-l sun.
Acum in Scratch, piesele puzzle-ului arata ca aceasta.
Și asta e combinația, pe partea de jos acolo, de trei
puzzle piese.
Un coroborat -
ceva care are martor și gol.
Și apoi două expresii booleene în interiorul de ea.
Deci, poți expresii booleene cuib pentru a obține mai mult
complicat expresii booleene.
De exemplu, în cazul în care e sâmbătă, și este frumos
vremea, du-te apoi afara.
Sau arbitrare așa ceva.
Deci, vă puteți alătura expresii booleene de a veni cu un
valoare de adevăr mai mare, a cărui răspuns se bazează
pe cele mai mici.
>> Acum, în C, din fericire, aceasta este de cartografiere
de fapt destul de simplu.
Parantezele ajuta la a face lucrurile clar aici.
&& Este ceea ce înseamnă "și". Deci asta e modul în care
am de gând să transforme aceste blocuri de la zero la C.
Și pentru condițiile am văzut în Scratch, pe mâna stângă
Partea acolo, eu le pot stivui în mod similar în C. Dacă x este mai puțin
decât y, atunci fac asta.
Altfel daca x este mai mare decât y, atunci fac asta.
Altele logic, acestea trebuie să fie egal, așa spun
că ele sunt egale.
Deci, putem începe acum pentru a construi aceste lucruri.
>> Deci, hai sa facem un exemplu.
Lasă-mă să deschid un fișier care este pe site-ul cursului, care
Am scris în prealabil.
Asta se numește nonswitch.c.
Și vom vedea de ce într-o clipă.
Deci, în acest dosar - nonswitch.c--
prima dat seama că există o grămadă de
comentariile de la partea de sus.
Asta explică doar numele fișierului, ceea ce
face, și așa mai departe.
Și aceasta demonstrează aparent utilizarea de Boolean AND-ING -
conjoining două expresii.
>> Deci, hai sa vedem cum functioneaza acest program.
Am inclus mele două fișiere, cs50.h și stdio.h.
Dacă aș defila în jos, acum, la programul, e un pic mai mult
decât am scris înainte, dar destul de ușor de citit.
Așa că am imprima primul utilizator, pe linia 18,
"Dă-mi un număr întreg între 1 și 10." Astfel
asta e chiar acolo.
Acum am să număr întreg.
Dar dau seama că GetInt - destul de simplu.
Este doar mergi la a lua un int.
Se va asigura că se obține un int și nu o
șir sau un flotor.
Dar nu va face nici un fel de verificare frontierei.
Acesta nu va filtra numerele să fie între un
anumită gamă.
Așa că trebuie să pună în aplicare acea noi înșine.
Deci, la fel ca în Scratch, unde am putea face o conjuncție de
două expresii, pot să fac asta în C, după cum urmează.
Daca n este mai mare sau egală cu 1, iar n este mai puțin decât și
sau egal cu 3, am de gând să decretăm că foarte arbitrar
număr să fie un număr mic.
Doar de dragul de a o declarație.
Altfel, dacă n este între 4 și 6, de imprimare "Ai ales un mediu
numărul. "Altele în cazul în care n este între 7 și 10, de imprimare" Ai ales un
Numărul mare. "Altele tipărarea" Tu alegi un numar invalid. "
Pentru că în mod logic, care urmează dacă am
epuizat gama noastră.
>> Deci realiza acest lucru nu este destul de modul în care vom scrie mai mare sau
egal la o clasă de matematică.
Corect?
Tu trage de obicei ca aceasta, cu linia de sub ea.
Dar nu există nici o cheie de pe tastatură, cum ar mea.
Deci, simbolul în C pentru exprimarea de mai mare sau
este egală cu două caractere, și simbolul de mai puțin de
sau egală cu două caractere este la fel de bine.
Bine.
Deci, dacă am rula acest program, puteți ghici, probabil, ceea ce e
de gând să faci.
Dacă aș merge mai departe și de a face nonswitch, Enter.
Și apoi executați nonswitch.
Dă-mi un număr între 1 și 10.
Am de gând să-i dea 11.
Am ales un număr nevalid.
Lasă-mă să încerc numărul 3.
Am ales un număr mic.
Deci, destul de simplă acolo.
>> Ce se întâmplă dacă doriți să schimbați comportamentul acestui program și
face ceva un pic diferit în schimb?
Lasă-mă să mergeți mai departe și spun acest lucru.
Lasă-mă să scap de toate astea.
Și permiteți-mi să spun că dacă (n == 42).
Și apoi am de gând să merg mai departe și spun print "Ai ales
răspunsul corect. "Altele vom merge mai departe și spune,
printf ("Ai ales
răspuns greșit ");. Bine.
Doar pentru ca.
>> Acum, câteva puncte putem face aici.
Unu, nu am tastați simbolul pe care ar trebui să cred este
cea mai rezonabilă.
Când vreau să verifice egalitatea, se dovedește că nu utilizați
egală semn.
Puteți utiliza în schimb semnul egal egal.
Și de ce s-ar putea fi asta, pur și simplu intuitiv?
Da.
PUBLICUL: [inaudibil]
David J. MALAN: Corect.
Semnul egal este deja folosit pentru misiune.
Cineva nu cred cu adevărat la asta.
Și acum, când vine vorba de testarea egalității, trebuie să ne
fi mai explicit, și spune egal egal.
O greșeală foarte comună este de a face acest lucru.
Și, în cazul în care în ore de birou sau de săptămâna viitoare cândva sau în
următoarele două săptămâni să faci ceva de genul asta si apoi
lupta cu ea timp de 10, 20 de minute încercând să dau seama
ceea ce este al naibii de bug-ul, dai seama că ești unul dintre cei
oameni care au făcut această greșeală.
Deci, super simplu de a face.
Dar acum este scopul de a îndepărta această greșeală.
Acest lucru ar putea evalua, pentru că ceea ce se spune acest adevăr?
Dacă n devine 42.
Deci, oamenii folosesc verbul, verbal, pentru a exprima
Noțiunea de atribuire este "devine". Deci, dacă n devine 42.
Deci asta înseamnă atribuie 42 la nr.
Acum am o expresie booleană, în paranteze,
în interiorul acestei condiții, a căror valoare este de 42.
Corect?
Pentru că dacă l-ați evalua de la interior spre exterior, totalul
Răspunsul, acum, este de 42.
>> Deci, dacă te-am întrebat întrebarea, "în cazul în care (42)," ceea ce este
că într-adevăr spui?
Ei bine, expresii booleene pot fi doar adevărate sau false.
1 sau 0.
ON sau OFF.
Deci, se pare că avem un caz colț aici, prin care toate dintr-o
bruscă, eu spun "dacă (42)". Asta nu este o valoare booleană.
Deci, ceea ce computerele fac, deși, este în esență echivalează
ceva care nu e 0 este interpretată ca sa fie adevarat.
1.
La data de.
Sunt toate echivalentă funcțional.
Numai valoarea 0, sau cuvântul cheie falsă, după cum vom
în cele din urmă a se vedea, este de fapt falsă.
Deci, "în cazul în care (42)" ar fi de fapt adevărat, pentru că este non-zero.
Deci, pentru a fi mai exact aici, o valoare booleană este într-adevăr nu atât de
mult mai adevărat sau fals, dar pentru aceasta
caz, în cazul în care este 0 sau non-zero.
Deci, false sau nu false.
Și care ne permite să cuprindă toate mai mult
Posibilitățile de expresie în paranteză.
Deci, avem nevoie să, tot atât de atent, spun acest lucru -
în cazul în care (n == 42).
Pur și simplu pentru că avem nevoie de a specifica un test de egalitate,
nu o cesiune de o valoare.
>> Ce altceva este demn de remarcat aici?
Aceste acolade nu sunt de fapt necesare.
Am fost le faci doar pentru a fi NIT-pretentios aici.
Dar atunci când aveți o afecțiune care are doar o linie de
cod, ca o comoditate, programatorii nu trebuie să utilizați
de acolade.
Este suficient să se doar liniuță, din motive estetice, și
apoi scrie linia de cod.
Numai atunci când doriți să scrieți două linii de cod - pentru
exemplu, else printf ("La revedere!"). Dacă doriți să faceți
faptul că, acest lucru este rupt.
Puteți liniuță tot ce vrei, dar faptul că aveți
tastat două linii de cod, fără a utiliza acolade
înseamnă că acest program nu ar fi corect sau ar putea
nu compila chiar corect.
Deci, de acum, să fiu sincer, cred că cel mai bun obicei este doar
utiliza acolade, și veți găsi că acestea fac
super-clar ce se întâmplă.
>> De asemenea, ca o parte - mai ales daca esti printre cei care folosesc
cărțile recomandate sau resurse online -
dau seama că există această noțiune de stil în
de programare.
Și de fapt, unii oameni preferă să afișezi bretele cret
aici pe o linie.
Unii oameni preferă să facă lucruri ridicole,
Vrei pune-le aici.
Nu e nici un răspuns greșit atunci când vine vorba de
stil, dar acest lucru este greșit.
Dar unii oameni o fac.
[Râsete]
David J. MALAN: Deci, am spus acest lucru acum, pur și simplu pentru că așa cum
ai citit pe lucruri în cărți sau on-line, ai de gând să obțineți
diferite mesaje de la profesori diferite și
autori diferiți.
Și dau seama doar că, funcțional, ele sunt
în general, echivalent, dar să fie în concordanță.
Deci, în acest caz, vom standardiza pe cret
bretele alinierea aici, pe stânga.
>> Bine.
Așa că hai să mergem mai departe acum și a alerga acest lucru, și să vedem ce se întâmplă
cu acest program.
Asigurați-nonswitch.
Apoi rulați nonswitch.
Dă-mi un număr întreg între 0 și - astfel încât nu este relevant
mai, dar eu doar de gând să spun arbitrar 42.
Și am ales răspunsul corect.
Ei bine, acum, să luăm de fapt, această într-o direcție diferită.
Se pare că există unele sintaxă alte noi
poate folosi într-un program.
Iata o noua piesa de sintaxă, care este funcțional aceeași,
ci doar introduce un alt mod de a exprima noi înșine.
Deci, asta este ceea ce se numește o "declarație comutator." Și o
switch funcționează după cum urmează.
Este nevoie de, în paranteze, o valoare pe care doriți să o
"Comutator" pe.
Doriți să se comporte diferit bazat pe valoarea sa.
Deci, aceasta înseamnă comutator pe valoarea n.
Și ce înseamnă?
Ei bine, în cazul în care n este 1 sau 2 sau 3, mergeți mai departe și tipări "Tu
ales un număr mare "și apoi rupe.
Motivul pentru pauza este faptul că modul în care funcționează C este la fel de
îndată ce constată un caz care se potrivește, începe de executare
toate codul de mai jos ea.
Deci, dacă am avea o linie de cod, așa cum fac eu aici, pe linia 27,
este executat.
Dacă am adăuga o altă linie aici, este executat.
O altă linie aici, este executat.
Programul se oprește doar ce e mai jos in functie de executare
Declarație de caz se aplică atunci când I specifică explicit
spun "pauză". Atât de greșit.
Corect, în acest caz, ca un rezultat.
Cazul 4 sau 5 sau 6, în mod similar, se va
pentru a imprima un mesaj.
În acest caz, numărul mediu.
Break.
Cazul 7, 8, 9, 10, se va imprima "Ai ales un mare
Numărul "Break..
Și apoi există literalmente un cuvânt cheie numit "default"
asta e efectiv ca "altceva" construi.
Deci noua sintaxă, dar intelectual,
nimic nou aici.
E la fel ca Scratch.
În cazul în care, în cazul în care altcineva, altceva în cazul în care, un fel de bloc.
>> Deci, asta e versiunea pornit a acestui program.
Dar observați că am făcut-o cu numere aici.
Lasă-mă să deschid o a doua versiune, doar pentru a vedea
un pic mai mult ceva concret.
Deci, aici avem clase în loc.
Se pare că aveți posibilitatea să utilizați comutatoare nu doar pe numere întregi, ci pe
caractere.
Nu în toate tipurile de date, dar cel puțin în caractere.
Deci, aici, am putea face ceva de genul, dacă valoarea de C, care
utilizatorul tastat în, în linia 19, prin utilizarea funcției getchar,
este capitalul A sau litere mici o, hai să-l interpreteze ca un grad,
și spun au ales un grad excelent.
Și în jos de-a lungul declarația comutatorul, nu avem altă
cazuri pentru "B" s si "C", și așa mai departe.
Dar hai să rotunjească acum afară un alt lucru.
Și din nou, un fel de zbor, prin
unele dintre aceste exemple.
Dar e într-adevăr, astfel încât să le putem aplica, acum -
sau într-adevăr, să traducem doar le acum -
la C.
>> Așa că lasă-mă să mergeți mai departe și de a face acest lucru.
Am de gând să deschidă un fișier nou.
Și am de gând să fac include .
Și apoi m-am de gând să fac int main (void).
Lasă-mă să salvați acest fișier ca un loop.c.
Doar ca un exemplu.
Și am de gând să merg mai departe și procedați în felul următor.
Vreau să scriu un program foarte obositor.
Deci, 10.
Hai să facem asta.
9.
Bine.
De îndată ce ați începe să faci acest lucru în programare, ești
face, probabil, ceva în neregulă.
Dar vom începe acolo oricum.
Hopa.
Asta este de fapt greșit.
7.
6.
5.
4.
Nimic nu se va întâmpla când vom ajunge la 0.
3.
2.
1.
Bine.
0.
Ștergeți.
>> Bine.
A reveni astfel încât cifra 0.
Deci, acest program se va face în mod evident ceea ce este foarte
plictisitor spune că va face.
Se va imprima tuturor celor
valori, de sus în jos.
Așa că lasă-mă să fac fac bucla.
Și apoi - Ups.
Asigurați-bucla.
Am fost în directorul greșit.
Și acum să-mi alerga bucla.
Enter.
Woohoo.
Foarte frumos.
Frumos, lung program.
>> În regulă, dar acum să facem acest lucru mai bine.
La fel ca în Scratch, atunci când au inceput sa foloseasca un looping
construi, în loc de doar copierea și lipirea toate
piese de puzzle, permiteți-mi să introducă acest lucru.
Deci, în C, există diverse constructe buclă,
dintre care unul arata ca acest lucru.
O "pentru" buclă are trei lucruri, separate prin două semne punct și virgulă.
Și apoi, în interiorul corpului a buclei, ca să spunem așa -
în interiorul aparatului de lucru al acolade -
putem face ceva nou și din nou.
Deci, ceea ce am aici, pe ecran, acest lucru este
literalmente doar un comentariu.
/ / Se înțelege aici vine un comentariu.
Acest lucru nu este cod.
Acest lucru este pur și simplu descriere engleza, pentru mine, uman.
>> Inițializări Deci, condițiile și actualizări.
Ei bine, hai să vedem cum funcționează.
Acest lucru permite-mi să rescrie acest program, după cum urmează.
Pentru -
deci aici vine buclă mea -
int i -
aici vine o variabilă numită "i" -
ajunge la 10 inițializate.
Deci, nu este de inițializare mea.
Vreau să fac asta bucla atât timp cât "i" este mai mare sau
egal cu 0.
Și pe fiecare iterație a buclei acest, vreau
să i do -.
Deci, am văzut + + luni.
- Este opusul.
Ea diminuări valoarea de 1.
În interiorul acestui bucla, vreau să fac ceva, de fapt.
Așa că am de gând să spun ceva de genul printf.
Nu vreau să spun 10 acum, pentru că în mod evident este doar
O să imprimați aceeași valoare.
Ce vreau să imprimați în schimb, probabil?
Da.
Deci, "i". Deci d%, am.
>> Așa că am de gând să fur una dintre acele idei de la mai devreme -
această substituire pentru codurile de format -
și apoi aici, în partea de jos, mă voi întoarce 0, doar
pentru o bună măsură.
Dar acum, am un program mai succintă.
E doar câteva linii, și nu unele 10 sau 11 de linii.
Lasă-mă să merg la promptul mea aici jos.
Remake buclă.
Rulați din nou bucla.
Și acesta pare să fie la fel.
Acum, programul nu mai e interesant.
Dar acum am posibilitatea să tastați ceva de genul asta.
Pot schimba asta la 100.
Pot recompila apoi programul meu.
Și atunci pot re-rula programul meu.
Și acum merge super-rapid pe calculatoarele din ziua de azi.
Dar nu am -
si de fapt, tampon mea scrollback nu
chiar merge atât de departe.
Acolo mergem.
Deci nu toti avem 100.
Dar e ușor să faci greșeli aici.
Ce se va fi comportamentul asteptat daca am
face accidental asta?
Deci, se simte ca infinit.
Deci, să vedem dacă computerul se comportă.
>> Așa că lasă-mă să mergeți mai departe și să facă buclă.
Și lasă-mă să ruleze buclă.
Așa că haideți să ne întoarcem la faptul că într-o clipă.
Vom lăsa ca termen.
Pentru că ceea ce ar trebui să ne bazăm până la, minim?
Probabil cel puțin 2 miliarde de euro, în cazul în care avem ca multi biti, și
suntem cu valori pozitive.
Deci, haideți să sari înapoi aici.
Pe lângă aceste tipuri de bucle, avem ceea ce se numește în timp ce
bucle. Deci, la fel ca în Scratch, ai avut totdeauna
blocuri, și le-ai avut blocuri Repetați.
În mod similar, în C, ai doar alte moduri
de a te exprima.
Deci, aveți această noțiune de o buclă în timp ce vă permite să
exprimă-te un pic diferit.
Și apoi ai ceva numit o bucla do-timp,
care funcționează ușor diferit, de asemenea.
Și vom tachineze acestea în afară în timp.
>> Dar haideți să aruncăm o privire la aceasta ultima aici.
Dacă vom merge în -
rulează în continuare.
E destul de infinit.
Așa că lasă-mă să intru în pozitiv, și arată cum putem de fapt,
reglementează datele introduse de utilizator un pic mai eficient.
Este un program destul de scurt.
Și aici avem, în principal, o int n declarație.
Deci, da-mi o variabilă numită nr. Acum, eu spun literalmente
"A face". Și apoi am deschis cret
bretele, bretele aproape cret.
Și observați apoi, imediat după asta, se spune în timp ce n
este mai mică decât 1.
Deci, observăm că aceste linii -
19 - 24 -
compune colectiv o buclă do-timp.
Și din nou, noua sintaxă, nu este o idee nouă.
E doar un alt mod de a looping, punct de vedere sintactic.
Deci, ce face asta?
Efectuați următoarele în timp ce n este mai mic decât 1.
Deci, ce vreau să fac?
Eu cer ca să-mi dați un număr întreg pozitiv.
Apoi am încerca de fapt, pentru a obține un număr întreg de la utilizator.
Dar, în ceea ce privește ordinea de operațiuni aici, deoarece
în timp ce conditie este aici, mă duc apoi să verifice, este n
mai puțin de 1?
Deci, să presupunem că utilizatorul -
după ce a fost cerut în acest mod -
tipurile din valoarea 0.
Această condiție va fi adevărat sau fals?
Ei bine, este de fapt o să fie adevărat.
Deoarece n este 0, iar 0 este mai mică de 1.
Deci, ce implică acest lucru?
Fă-o din nou.
Numai o singură dată această condiție se evaluează la FALSE.
Dacă aș scrie în 42.
Ei bine, nu, 42 nu este mai mică de 1.
Prin urmare, aceasta bucla se face de executare.
Și astfel, în acel moment, programul va spune, mulțumesc pentru
42, în acest caz.
Acum, că aveți acest mod de a te exprima -
Noi nu trebuie să aștepte pentru ca aceasta să termine.
O să ia ceva timp.
Pentru a fi continuat data viitoare, probabil.
>> Dar acum, aveți posibilitatea de a de a înțelege, sperăm, un
pic de umor tocilar.
Ne cerem scuze.
Acest lucru nu este reprezentativa pentru umor în informatică
lume, dar e drăguț.
[Râde] Să se încheie în această notă.
Si te vom vedea pe luni.
[Aplauze]