>> [MUSIC JOC]
David J. MALAN: Bine.
Acest lucru este CS50, iar această este începutul de săptămână două.
Așa că haideți să ne începem astăzi cu un bug.
Un bug, desigur, este un greșeală într-un program,
și veți obține foarte familiarizat cu acest concept
dacă nu ați programat înainte. pset0 și acum pset1.
Dar să ia în considerare ceva un pic de simplu la început.
Acest program aici că am aruncat împreună în avans,
și eu susțin că acest lucru ar trebui să imprime 10 stele de pe ecran folosind printf,
dar se pare buggy într-un fel.
>> Având în vedere că caietul de sarcini care ar trebui să imprime 10 de stele,
dar ea nu pare ce ai pretinde este bug-ul?
Da?
Deci, este un off de o eroare, și ce vrei să spui cu asta?
OK.
Excelent.
Așa că ne-am specificat un începe o valoare de zero, pentru i,
și am specificat o valoare n de 10, dar ne-am folosit mai mic sau egal cu.
Și motivul pentru care acest lucru este de două caractere și nu doar un simbol,
ca într-o carte de matematică, este că nu aveți
un mod de exprimare a un caracter echivalent.
>> Asta înseamnă că mai puțin de dar dacă începe numărarea de la zero,
dar voi conta tot drumul în sus prin și egal cu 10,
tu ești, desigur, va 11 lucruri conta în total.
Și așa ai de gând să imprimați de 11 stele.
Deci, ceea ce ar putea fi un remediu pentru asta?
Da?
>> Deci, doar ajusta mai puțin decât sau egal să fie doar mai puțin,
și nu există, eu susțin, poate o altă soluție, de asemenea.
Ce s-ar putea mai faci?
Da?
>> Deci, începe egalând-o 1, și lăsa mai mică sau egală cu.
Si sincer mi-ar pretinde ca, pentru un om tipic
aceasta este, probabil, mult mai simplu.
Incepe sa numeri de la 1 și conta în sus prin 10.
În esență, face ce vrei să spui.
>> Dar realitatea este în de programare, așa cum am văzut,
oamenii de stiinta de calculator și programatori în general, se începe numărarea de la zero.
Și așa că e bine odată te obișnuiești cu el.
Starea ta va în general fi ceva de genul mai puțin.
Deci, pur și simplu o logică eroare pe care am putea acum
stabili și în cele din urmă recompilați aceasta și să obțină doar 10.
>> Ei bine, ce zici de asta bug aici?
Aici, din nou, eu pretind că am un obiectiv de imprimare 10 stars--
unul pe fiecare linie de data asta, dar nu o face.
Înainte de a propune ceea ce fix este, ceea ce face acest lucru
imprima vizual dacă ar fi să compila și rula acest program crezi?
Da?
>> Star.
Deci, toate stelele de pe aceeași linie este ceea ce am auzit,
și apoi noul caracter linie.
Deci, haideți să încercăm asta.
Deci, asigurați-buggy 1, intra, și văd comanda zăngănit
despre care am vorbit data trecută.
./buggy-1, și într-adevăr, eu văd toate cele 10 stele pe aceeași linie, chiar dacă eu pretind
în caietul de sarcini mea doar un comentariu pe culmea codul pe care mi-am propus să fac o per
linie.
Dar acest lucru pare corect.
>> Acum, linia 15 se pare ca eu sunt imprimarea unei stele, și apoi linia 16
se pare ca eu sunt de imprimare o nouă linie de caractere,
și ei amândoi identică, astfel Eu sunt în interiorul buclei clar.
Deci, nu ar trebui să face stele, nou linie, stele, noua linie, stea, noua linie?
Da?
>> Da, spre deosebire de un limbaj ca Python, daca esti familiar,
indentare nu conteaza la calculator.
Contează doar la om.
Deci, în timp ce liniile de aici l-am inventat 15 și 16-- care arata frumos,
dar calculatorul nu-i pasă.
Calculatorul îi pasă având de fapt acolade
în jurul acestor linii de cod.
>> Deci asta e clear-- la fel ca în Rămășițe că aceste două linii de cod
trebuie executată.
Ca unul dintre cei puzzle Scratch galben piese din nou și din nou și din nou.
>> Deci, acum, dacă am re-rula acest program-- ./buggy-2-- Hm.
Am o eroare acum.
Ce am uitat sa fac?
Da, deci nu l-am compila.
Deci, asigurați-buggy 2.
Nu există un astfel de fișier pentru că nu am făcut- compila de fapt a doua versiune.
Deci, acum, interesant nedeclarate nu variable-- 2.
Facem 1.
Asigurați-buggy-1-- ./buggy-1-- și acum fiecare dintre ele este pe aceeași linie.
>> Acum, există o excepție de la această afirmație ar trebui de-al meu
că ai nevoie de aceste acolade.
Când este de fapt OK-- dacă ai observat în secțiunea sau textbooks--
a omite acolade?
Da?
>> Exact.
Când există o singură linie de cod pe care le
vrea să fie asociat cu buclă ca în primul nostru exemplu.
Este perfect legitim a omite acolade
doar ca un fel de comoditate de la compilator la tine.
Da?
Bună întrebare.
Ar fi considerată o eroare de stil?
Ne-ar promote-- ca în CS50 Ghid de stil, URL-ul pentru care
este în pset1-- că întotdeauna folosesc acolade.
Cu siguranță dacă sunteți nou la programare.
Realitatea este că nu suntem O să vă interzică
de la a face aceste facilități.
Dar dacă sunteți doar obtinerea în leagăn de lucruri,
absolut doar folosiți întotdeauna cret bretele până când te obișnuiești cu ea.
Bună întrebare.
>> În regulă.
Așa că atunci a fost o eroare.
Cel puțin în ceva destul de simplu la.
Și totuși, s-ar putea crede acest lucru este destul de rudimentar, nu?
Aceasta este un fel de prima săptămână de a privi limba
ca, vezi bug-uri în ea.
Dar realitatea acestea sunt de fapt reprezentant
a unor probleme destul de înfricoșătoare care pot apărea în lumea reală.
>> Deci, unii dintre voi s-ar putea aminti dacă urmați știri tech,
sau poate chiar prins vânt de acest în februarie
de anul trecut că Apple a avut a făcut un pic de o greșeală în ambele iOS,
sistemul de operare pe telefoanele lor, și, de asemenea,
Mac OS, sistemul de operare pe desktop-uri si laptop-urile lor.
Și ai văzut titluri, cum ar fi acest lucru.
Și după aceea, Apple a promis pentru a rezolva această problemă,
și a făcut foarte repede fixați-l în iOS, dar apoi în cele din urmă l fix în Mac OS
de asemenea.
>> Acum, nici unul dintre aceste titluri singur într-adevăr dezvăluie ce problema de baza a fost,
dar bug-ul a fost redus în cele din urmă la un bug în SSL, Secure Sockets Layer.
Și pe scurt, aceasta este software-ul
care browserele noastre și alte program de calculator folosit pentru a face ce?
>> Dacă am spus că SSL este implicat, ori de câte ori
vizitați un URL care începe cu HTTPS, ceea ce s-ar putea apoi SSL fi legate de?
Criptare.
Deci, vom vorbi despre acest lucru în zilele următoare.
Criptare, arta de a urcare informații.
>> Dar pe scurt, Apple ceva timp în urmă a făcut o greșeală
în punerea lor în aplicare de SSL, software-ul care în cele din urmă pune în aplicare
URL-uri, cum ar fi HTTPS sau max Conexiuni acolo.
Rezultatul este că ceea tau conexiuni ar putea potențial
fi interceptate.
Și conexiunile au fost nu neapărat criptate
dacă ați avut un tip rău în între tu și site-ul de destinație care
a știut să profite de acest lucru.
>> Acum, Apple a postat în cele din urmă un fix pentru acest final,
și descrierea de fix lor a fost aceasta.
Transport sigur nu a reușit să valideze autenticitatea conexiunii.
Problema a fost abordată de către restabilirea lipsă pași de validare.
>> Deci, aceasta este o explicație foarte ondulat mână pentru a spune că pur și simplu ne-am dat-o.
Există literalmente o linie de cod care a fost buggy
în punerea lor în aplicare de SSL, și dacă te duci on-line și de căutare pentru acest
puteți găsi de fapt, codul sursă original.
De exemplu, aceasta este o captură de ecran a doar o parte a unui fișier destul de mare,
dar aceasta este o funcție aparent numit SSL verifica Server semn schimb cheie.
Și este nevoie de o grămadă de argumente și intrări.
Și nu ne vom concentra prea mult pe punctele caracteristice acolo,
dar dacă te concentrezi pe codul de interior din care cel mai important function-- să
mări pe care.
S-ar putea suspecta deja ce eroare ar putea
fi chiar dacă nu aveți nici o idee în cele din urmă ceea ce căutați la.
Există un fel de anomalie aici, care este ceea ce?
>> Da, nu-mi place aspectul de două Du-te eșuează.
Sincer, eu nu știu cu adevărat ce Du-te nu înseamnă, însă având două dintre ele
spate în spate.
Că doar un fel de ma freaca intelectual în mod greșit,
și într-adevăr, dacă ne-am apropia pe doar aceste linii, acesta este C.
>> Deci, o mulțime de cod Apple este ea însăși scris în C,
și acest aparent este într-adevăr equivalent--
nu că indentare destul versiune, dar dacă te recunosc faptul
că nu există nici o acolade, ceea ce Apple a într-adevăr a scris a fost cod care arata
ca aceasta.
Așa că m-am mărită și eu doar fixat adâncitura în sensul
că în cazul în care nu exista nici acolade, care Du-te la a doua nu e în galben
se va executa indiferent de ce.
Nu e asociat cu în cazul în care condiția de mai sus se.
>> Deci, chiar din nou, dacă nu faci destul de înțelege ceea ce ar putea, eventual, acest
să-și facă, știu că fiecare dintre acestea conditions-- fiecare dintre aceste linii
este un pas foarte important în procesul de verificare
în cazul în care datele dumneavoastră este, de fapt, criptat.
Deci sărind peste una dintre acestea pași, nu cea mai buna idee.
>> Dar, pentru că avem această Du-te la al doilea eșec în galben,
și pentru că odată ce ne-am un fel de punct de vedere estetic
mutați-l la stânga în cazul în care logic este în acest moment, ceea ce
înseamnă acest lucru pentru linia de de cod de mai jos care a doua Du-te
nu crezi?
Este întotdeauna o să fie omise.
Deci, gotos sunt, în general, se încruntă la pentru motive nu vom merge într-adevăr în,
și într-adevăr în CS50 noi nu tind pentru a preda această afirmație Du-te,
dar vă puteți gândi Du-te nu în sensul sa sarim
la o altă parte a codului.
>> Cu alte cuvinte sari peste aceasta ultima linie cu totul,
și astfel rezultatul acestei prost greșeală simplu că a fost doar
urmare a probabil cineva copierea și lipirea una prea
de multe ori a fost că întregul securitate de iOS și Mac OS
a fost vulnerabile la interceptarea de baietii rai pentru ceva timp.
Până Apple a stabilit în cele din urmă acest lucru.
>> Acum, dacă unii dintre voi sunt de fapt rulează versiuni vechi de iOS sau Mac OS,
poti sa te duci la gotofail.com care este un site care cineva înființat
pentru a determina în mod esențial programatic
în cazul în care computerul este încă vulnerabil.
Și sincer, dacă este, este, probabil, o idee bună
pentru a actualiza telefonul sau Mac-ul la acest punct.
Dar există, doar o dovadă a cât de o apreciere a acestora nivel inferior
detalii și destul de idei simple poate într-adevăr
traduce în deciziile și probleme care
affected-- în acest case-- milioane de oameni.
>> Acum, un cuvânt pe administrare.
Secțiunea va începe duminica viitoare.
Veți primi un e-mail de week-end de secțiune, moment în care
procesul rezecției va începe dacă ai
dat seama că avea acum unor noi conflicte.
Deci, acest lucru se întâmplă în fiecare an, și ne-am va găzdui în zilele care vin.
>> Oficiul hours-- face păstra o cu ochii pe acest program aici.
Modifică un pic în această săptămână, în special ora de începere
și locația, astfel încât nu se consulte că înainte de a merge la orele de birou
oricare din următoarele patru nopți.
Și acum un cuvânt privind evaluarea, mai ales ca se arunca cu capul în problema
stabilește o și dincolo.
>> Deci, pe caietul de sarcini, acestea sunt în general
de-a lungul axelor care vom evalua munca ta.
Domeniul de aplicare se referă la ceea ce măsură instrumente de cod
caracteristicile necesare prin caietul de sarcini nostru.
Cu alte cuvinte, cât de mult din un set de piese ai mușca.
Ai făcut o treime din ea, o jumătate din ea, 100% din ea.
Chiar daca nu e corect, cât de mult ai încerca?
Deci, care surprinde nivelul de de efort și suma
la care te-a mușcat pe Problemă set de.
>> Correctness-- acesta, la ce măsură, este codul
în concordanță cu nostru caietului de sarcini și lipsite de probleme.
Deci functioneaza corect?
Dacă ne-am da unele de intrare, o face ne da puterea pe care ne așteptăm?
Design-- acum aceasta este prima de cele deosebit de calitative,
sau cele care necesită judecata umană.
Și într-adevăr, acesta este motivul pentru care avem un personal de atât de multe colegii de predare și curs
asistenți.
În ce măsură este ta Codul scris bine?
>> Și din nou, aceasta este o foarte evaluare calitativă
care va lucra cu tine pe bi-direcțional în săptămânile ce vor urma.
Așa că, atunci când nu ajunge numai scoruri numerice, dar, de asemenea,
o scoruri scrise, sau feedback-ul tastat, sau feedback-ul scris în cuvinte în limba engleză.
Asta e ceea ce vom folosi pentru a vă conduce spre scrierea de fapt cod mai bine.
Și în curs și secțiune, vom încerca la punctul out-- ori de câte ori ne-am sa--
ceea ce face un program nu numai corectă și funcțional bun,
dar, de asemenea, bine conceput.
Mai eficiente ar putea fi, sau chiar cel mai frumos poate fi.
>> Ceea ce ne duce la stil.
Stil în cele din urmă este o judecată estetică.
V-ati ales bine nume pentru variabilele dumneavoastră?
V-ați aliniat codul corect?
Se pare bine, și, prin urmare, este mai ușor pentru o altă ființă umană
pentru a citi respectiv dvs. corectitudinii sale.
>> Acum, în general, pe programa, am scor aceste lucruri pe o scară de cinci puncte.
Și lasă-mă să ciocan acasă punctul de că trei este într-adevăr bine.
Face foarte repede oameni buni începe să faci aritmetică.
Când ajung trei din cinci pe corectitudine pentru unele PSET
și ei cred că la naiba, am de gând să 60% care este în esență un D sau un E.
>> Asta nu e modul în care ne cred că de aceste numere.
Un trei este într-adevăr bun, și ceea ce ne-am în general se așteaptă la început
a termenului este că, dacă sunteți obtinerea o grămadă de three's-- poate un cuplu
de târguri, o pereche de fours-- sau un cuplu câte doi, un cuplu de fours--
că este un loc bun pentru a începe.
Și, atâta timp cât vom vedea o traiectorie ascendentă în timp,
ești într-un loc deosebit de bun.
>> Formula care le folosim pentru a lucruri de greutate este, în esență,
aceasta pe programa, ceea ce înseamnă doar că ne-am
da mai multă greutate la corectitudine.
Pentru că e foarte des corectitudine care ia cel mai mult timp.
Ai încredere în mine acum.
Veți find-- cel puțin într-un pset-- pe care le
petrec 90% din timpul tau lucrează la 10% a problemei.
>> Și tot un fel de lucrări cu excepția pentru una sau două bug-uri,
și acestea sunt bug-uri care tine pana tarziu in noapte.
Acestea sunt cele care un fel de voi scăpa.
Dar, după dormit pe ea, sau participarea la ore de birou
sau să pună întrebări on-line, este când ajungi la acest obiectiv de 100%,
și de aceea ne-am greutate corectitudine cel mai mult.
Proiectați un pic mai puțin, și stil un pic mai puțin decât atât.
Dar ține în stil mind-- este, probabil, cel mai usor
dintre acestea pentru a mușca conform ghidului de stil.
>> Și acum, o mai serioasă nota pe onestitate academică.
CS50 are distinctia nefericit de fiind cel mai mare producător de Ad Board
cazuri aproape în fiecare an istoric.
Acest lucru nu se datorează faptului că elevii ieftin în CS50 orice astfel mai mult decât orice altă clasă,
ci pentru că prin natura activității, faptul că este electronic,
faptul că ne uităm la ea, și faptul suntem oameni de știință de calculator,
Pot să spun că sunt, din păcate, foarte bun la detectarea el.
>> Deci, ce înseamnă acest lucru în termeni reali?
Deci, pe programa, Filosofia cursului
într-adevăr se fierbe în jos pentru a fi rezonabil.
Există această linie între a face munca sa pe cont propriu
și a obține un pic de ajutor rezonabil de la un prieten,
și de a face pur și simplu că munca pentru dvs. prieten, sau trimite el sau ea codul
astfel încât el sau ea poate pur și simplu ia sau împrumuta-l corect.
Și care traversează linia de că am tras în clasa.
>> A se vedea, programa în cele din urmă pentru liniile
pe care le trage ca fiind rezonabil și comportamentul nerezonabil,
dar o face într-adevăr fierbe până la esența
de munca au nevoie de a fi propriul tau în cele din urmă.
Acum, cu care a spus, există o euristic.
Pentru că așa cum s-ar putea imagine-- de la orele de birou și vizuale
și filmele care le-am arătat astfel far-- CS50
este într-adevăr menit să fie cât de colaborare și de cooperativă și ca sociale
posibil.
Ca de colaborare cum este riguros.
>> Dar, cu aceasta a declarat, euristic, după cum veți vedea în programa,
este că atunci când avea unele probleme.
Ai ceva bug în codul pe care le nu se poate rezolva, este rezonabil pentru tine
pentru a arăta codul de altcineva.
Un prieten chiar în clasa, un prieten care sta langa tine la orele de birou,
sau un membru al personalului.
Dar ei nu pot arăta codul lor pentru tine.
>> Cu alte cuvinte, o răspunde la intrebare dumneavoastră
Am nevoie de help-- nu este oh, aici e codul meu.
Aruncati o privire la acest lucru și deduce din ea ceea ce vrei.
Acum, desigur, nu e un mod clar la joc
acest sistem prin care să-ți arăt codul meu înainte de a avea o întrebare.
Arată-mi-mi codul inainte de a avea o întrebare.
Dar văd din nou programa școlară pentru detalii fine de unde această linie este.
>> Doar pentru a picta acum imaginea și împărtăși cât mai transparent posibil
unde suntem puțin în ultimii ani, acesta este numărul de cazuri Ad Board
că CS50 a avut peste In ultimii sapte ani.
Cu 14 de cazuri in aceasta toamna cel mai recent.
În ceea ce privește elevii implicați, a fost de 20 de unii studenți ciudate
in aceasta toamna trecut.
A existat un vârf de 33 elevii în urmă cu câțiva ani.
Mulți dintre ei sunt, din păcate, nu mai e aici în campus.
>> Elevii implicați ca procent din Clasa a variat istoric de la 0%
la 5,3%, ceea ce este doar de a spune aceasta este anual o provocare.
Și spre acest scop, ceea ce vrem sa facem este transmite un
că am dd-- doar FYI-- compara la o echitate pentru studenții care
sunt pe linia în consecință.
Noi facem compara toți curent observațiile împotriva tuturor misiunilor anterioare
din ultimii ani mulți.
>> Stim prea cum la Google în jurul și pentru a găsi depozite de cod
on-line, forumuri de discuții on-line, site-uri de locuri de muncă on-line.
În cazul în care un student poate găsi, putem cu siguranță se pare la fel de mult ca și noi cu părere de rău.
Deci, ceea ce veți vedea în programa deși este această clauză regret.
Pot cu siguranță aprecia, iar noi are pe toate
Personalul care au facut cursul ca aceasta, sau acesta se în timp,
cu siguranță știe cum e când viața devine în mod, atunci când aveți
unii noapte târziu deadline-- nu numai în această clasă,
dar another-- când ești complet epuizat, stresat,
au un număr exagerat de alte lucruri de făcut.
Vei face la un moment dat în viata cu siguranță un rău, poate târziu
decizie noapte.
>> Deci, pe programa, există această clauză,
astfel încât în ​​cazul în care în termen de 72 de ore de la luarea unele decizii proaste, dețineți până la o
și de a ajunge la mine și unul din capete ale cursului
și vom avea o conversație.
Ne vom ocupa de lucruri pe plan intern, în speranța
de a deveni mai mult de un clipă de predare sau lectie de viata,
și nu ceva cu ramificații în special drastice
cum s-ar putea vedea pe aceste diagrame aici.
>> Deci, asta e un ton foarte serios.
Să ne oprim pentru doar câteva secunde pentru a rupe tensiunea.
>> [MUSIC JOC]
>> David J. MALAN: Bine, astfel cum a fost ca pentru un segue?
Pentru subiecte de astăzi primare.
Prima dintre care este abstractizare.
Un alt care urmează să fie reprezentare a datelor, care sincer
este un mod foarte uscat de a spune cum putem du-te cu privire la rezolvarea problemelor și gândire
despre rezolvarea problemelor?
Deci, l-ați văzut în Scratch, și ai văzut, probabil, deja în pset1 cu C
că nu numai se poate folosi funcții, cum ar fi printf,
ca alte persoane din ultimii ani a scris pentru tine.
Puteți scrie, de asemenea, propriile funcții.
>> Și chiar dacă s-ar putea să nu aibă face acest lucru în C, și sincer în pset1
tu nu într-adevăr nevoie pentru a scrie funcție proprie deoarece problem--
în timp ce, probabil, descurajatoare la primul glance-- veți vedea
poate fi în cele din urmă rezolvată cu nu toate că multe linii de cod.
Dar, cu care a spus, în termeni a scris propria funcție,
dau seama că C nu da ai această capacitate.
>> Am de gând să meargă în codul sursă de astăzi, care este disponibil deja on-line,
și am de gând să merg mai departe și deschis un program numit funcție 0.C,
și în funcție de zero vom vedea câteva lucruri.
In primele linii 18, prin 23 este funcția mea principală.
Și acum că începem să citească cod pe care noi nu scriem pe acoperi,
dar în schimb le-am scris în avans sau pe care le într-o problemă set
s-ar putea primi cu a fost scris în prealabil.
O modalitate buna de a începe citirea codului altcuiva
este uita-te pentru funcția principală.
Seama de unde intrarea punct este de a rula programul,
și apoi urmează în mod logic de acolo.
>> Deci, acest program de aparent printuri numele, urmat de două puncte.
Apoi vom folosi getString de la biblioteca CS50
pentru a obține un șir, sau un cuvânt sau o expresie de utilizator de la tastatura.
Și mai e și asta lucru PrintName aici--.
>> Acum PrintName nu este un funcție care vine cu C.
Nu este în io.h. standard,
Nu este în CS50.h.
Este mai degrabă în același fișier.
Observați dacă derulați în jos o linii bit-- 25 de 27--
e doar un mod destul de de a comenta codul utilizând stele și slash-uri.
Acesta este un multi-linie comentariu, iar acest lucru este doar
descrierea mea în albastru de ceea ce face această funcție.
>> Pentru că în linii 28, prin 31, Am scris o funcție super-simplu
al cărui nume este PrintName.
Este nevoie de câte argumente ai spune?
Deci, un argument-- deoarece există un argument enumerate în paranteze.
Tipul de care este String.
Care este de a spune PrintName este ca aceasta cutie neagră
sau funcție care ia ca intrare un șir.
>> Iar numele acelui String convenabil va fi numele.
Nu e, nu N, dar numele.
Deci, ce face PrintName?
E simplu frumos.
La fel ca o linie de cod pentru printf, dar se pare că
printuri din "Hello", așa și așa.
În cazul în care așa și așa vine de la argumentul.
>> Acum, acest lucru nu este o inovație foarte mare aici.
Într-adevăr, am avut un program care ar putea S-au scris cu o linie de cod
prin punerea asta aici, și-a schimbat de ceva
care implică unele șase sau șapte sau cam asa ceva de linii de cod tot drumul până aici.
>> Dar este practicarea unui principiu cunoscut sub numele de abstractizare.
Un fel de încapsulare în interiorul unei noi funcție care are un nume, și mai bine
dar acest nume literalmente spune ceea ce face.
Adică printf-- că nu-i deosebit de descriptiv.
Dacă vreau să creeze o piesă de puzzle, sau dacă am
doriți să creați o funcție care imprimă numele cuiva,
frumusetea de a face acest lucru este că eu pot de fapt
da ca functia un nume care descrie ceea ce face.
>> Acum este nevoie de la o intrare care Am sunat arbitrar nume,
dar asta este minunat descriptiv în loc să fie puțin mai
generic ca S. și gol, pentru acum, înseamnă doar
că această funcție nu dă-mi înapoi nimic.
Nu e ca getString că literalmente îmi întinde înapoi un șir
cum am făcut cu bucățile de hârtie cu colegii dumneavoastră săptămâna trecută,
ci are doar un efect secundar.
Se imprimă ceva pe ecran.
>> Deci, la sfârșitul zilei, dacă fac funcția de-0,-./function 0,
vom vedea că se cere numele meu.
I tip David, și l tipuri de numele meu.
Dacă o fac din nou cu Rob, se va spune "Bună ziua, Rob."
Deci, o idee simplă, dar poate extrapola de la acest mintal
care ca programele obține un pic mai complicat,
și doriți să scrieți o bucată de cod și apel că code-- invoca
că code-- de unii descriptiv nume ca PrintName,
C nu permite noi această capacitate.
>> Iată un alt exemplu simplu.
De exemplu, dacă am deschide un fișier de la sunat azi return.c,
observa ce am făcut aici.
Cele mai multe dintre această funcție principală este printf.
Prima am inițializa arbitrar o variabilă numită x la numărul 2.
Apoi m-am imprima "x este acum % I "trece în valoare de x.
Deci, eu spun doar ceea ce este.
>> Acum sunt doar cu îndrăzneală susținând cu printf.
Sunt cubaj că valoarea x, si eu sunt face acest lucru prin apelarea unei funcții
denumit trecere cub în x ca argument,
și apoi salvarea de ieșire în variabila sine, x.
Deci, eu sunt clobbering valoarea lui x.
Sunt imperative valoare de x cu orice
rezultatul de asteptare această funcție cub este.
Și apoi am imprima unele chestii pufos aici a spune ceea ce am făcut.
>> Deci, ce este atunci cub?
Observați ce este fundamental diferit aici.
I-am dat funcția un nume ca înainte.
Am specificat un nume pentru un argument.
De data aceasta se numește n loc de nume, dar am putea-o numi tot ce vreau.
Dar acest lucru este diferit.
Acest lucru la stânga.
Anterior, a fost ceea ce cuvinte cheie?
Băieți.
Acum e evident int.
>> Deci, ce se poate lua de aici?
Întrucât semnifică void fel de nimic, și că a fost cazul.
PrintName întors nimic.
A făcut ceva, dar ea nu-mi dai înapoi
ceva ce am putea pune pe partea stângă a unui semn egal
ca și cum am facut aici pe linia 22.
>> Deci, dacă am spune în pe linia 30, ce-i asta, probabil, ceea ce presupune
despre ceea ce cub face pentru mine?
Da?
Se întoarce un număr întreg.
Așa că mi-a dat înapoi, pentru exemplu, o bucată de hârtie
pe care le-a scris răspunsul.
2 tocata, sau 3 tocata, sau 4 cubed-- orice am trecut în,
si cum am pune în aplicare acest lucru?
Ei bine, doar n ori n ori n este modul în care s-ar putea cub valoare.
Deci, din nou, foarte simplu idee, dar demonstrativ
acum cum se poate scrie funcții care de fapt ne-a avut din nou
valori care ar putea fi de interes.
>> Să ne uităm la un ultim exemplu aici numita funcție unul.
În acest exemplu, se începe pentru a obține mai convingătoare.
Deci, în funcție, acest lucru Anunț program-- în cele din urmă
solicită o funcție numită GetPositiveInt.
GetPositiveInt nu este un funcție în biblioteca CS50,
dar ne-am decis noi ar dori să existe.
>> Deci, dacă ne-am defila în jos mai târziu în dosar, observa cum m-am dus cu privire la punerea în aplicare a
obține Int pozitiv, și eu spun că e mai convingatoare
pentru că aceasta este o decent Numărul de linii de cod.
Nu e doar o prostie mic program de jucărie.
Este de fapt niște verificarea erorilor și de a face ceva mai util.
>> Deci, dacă nu ați văzut walkthrough videoclipurile pe care le-am încorporate în pset1,
știu că acesta este un tip de buclă în C, similară în spirit
la felul de lucruri Scratch pot face.
Și nu spune acest lucru.
Printeaza asta.
Apoi, mergeți mai departe și a obține N- obține un int și păstrați-l în n,
și face asta din nou și din nou și din nou, atât timp cât n este cel puțin unul.
>> Deci, n va fi mai mică de un numai în cazul în care omul nu este cooperant.
În cazul în care el sau ea este tastarea în 0 sau -1 sau -50,
această buclă se va păstra executarea din nou și din nou.
Și în cele din urmă observa, am pur și simplu returna valoarea.
Deci, acum avem o funcție că ar fi fost frumos
dacă CS50-ar pune în aplicare în CS50.h și CS50.c pentru tine,
dar aici putem acum punerea în aplicare a acestei noi.
>> Dar două comentarii cu privire la unele detalii importante.
Unu de ce am declara int n, crezi că, pe linia 29
în loc de a face doar acest aici, care este
mai consistent cu ceea ce am făcut săptămâna trecută?
Da?
Un gând bun.
Deci, dacă ar fi să-l pună aici, e ca și cum ne-am
păstrați declarând-o din nou și din nou.
Asta în sine este nu este problematică, în sine,
pentru că avem nevoie de doar valoarea dată și apoi
vom lua unul nou, oricum.
Dar un gand bun.
Da?
>> Close.
Așa că m-am declarat n pe linia 29 în afara buclei,
este accesibil pe tot parcursul toată această funcție.
Nu alte funcții, deoarece n este încă în interiorul dintre acestea ondulat
bretele aici.
Deci-- sigur.
>> Exact.
Deci, acest lucru este chiar mai mult, până la punctul.
Dacă ne-am declarat în schimb n chiar aici pe linia 32,
este problematică, deoarece cred unde altundeva am nevoie pentru a accesa?
Pe linia 34, și regulă simplă este
pe care le puteți folosi doar o variabilă în interiorul celor mai recente acolade
în care l-ai declarat.
>> Din păcate, linia 34 este o linie prea târziu,
pentru că l-am închis deja acoladă pe linia 33
care corespunde acoladă pe linia 30.
Și astfel încât acesta este un fel de a spune că această variabilă int este luneta,
ca să spunem așa, la numai interior din aceste acolade.
Pur și simplu nu există în afara ei.
>> Deci, într-adevăr, dacă am face acest lucru greșit, permiteți-mi salva codul
cum se este-- scris incorect.
Lasă-mă să mergeți mai departe și fac Funcția-1, și de eroare notice--.
Utilizarea nedeclarate identificator n pe linia 35, care este chiar aici.
Și dacă ne-am derula în sus în continuare, un altul.
Utilizarea nedeclarate identificator n pe linia 34.
>> Deci compilator, răsune, se observe că doar
nu există chiar dacă clar că e acolo vizual.
Deci, un remediu simplu este o declarare acolo.
>> Acum, lasă-mă să derulați până la în partea de sus a fișierului.
Ce sare la tine ca fiind un pic diferit
de la lucrurile ne-am uitat săptămâna trecută?
Nu numai că nu am nume, nu numai Am ceva ascuțit include până sus,
Am ceva de care sunt de asteptare un prototip.
Acum, că pare extrem de similar cu ceea ce tocmai am văzut în urmă cu o clipă pe linia 27.
>> Deci, haideți să deducă dintr-un alt mesaj de eroare ce am făcut acest lucru.
Lasă-mă să mergeți mai departe și șterge aceste linii acolo.
Și așa nu știm nimic despre prototip.
Remake acest fișier.
Fă o funcție.
Și acum, la naiba, patru erori.
Să derulați până la prima.
>> Declarație implicită a funcției te int pozitiv este invalid în C99.
C99 înseamnă doar 1999 versiune a limbajului
C, care este ceea ce suntem, într-adevăr, folosind.
Deci, ce înseamnă asta?
Bine C- și, mai precis, C compilers-- sunt programe destul de prost.
Ei știu doar ceea ce ai le-a spus, și asta e
de fapt tematic de săptămâna trecută.
>> Problema este că, dacă mă duc despre implementarea nume aici,
și eu numesc o funcție numită GetPositiveInt aici pe linia 20,
că funcția de punct de vedere tehnic nu exista până compilatorul vede linia 27.
Din păcate, compilatorul este a face lucrurile de sus, jos, stânga, dreapta,
astfel, pentru că nu a văzut punerea în aplicare a GetPositiveInt,
dar se vede încerci să-l folosească până aici,
este doar de gând să țipe la bail-- te cu o eroare mesajul-- poate
criptic, și nu de fapt compila fișierul.
>> Deci, un așa-numit prototip up aici este, desigur, redundant.
Literalmente, m-am dus aici și am copiat și lipit aceasta, și l-am pus aici.
Void ar fi mai buna, asa ca vom literalmente copiați și lipiți-l de data asta.
Eu pur și simplu copiat și inserat-o.
Într-adevăr la fel ca ca o firimitură de pâine.
>> Un pic indiciu de compilator.
Nu știu ce face acest lucru totuși, dar eu promit să vă
că va exista în cele din urmă.
Și de aceea această line-- în linie 16-- se termină cu punct și virgulă.
Este redundant de proiectare.
Da?
>> Dacă nu ați link bibliotecă la-- oh, buna intrebare.
Sharp include incluziuni de fișiere antet.
Necesitatea de a fi-- ar trebui aproape să fie întotdeauna la foarte de sus
a dosarului pentru o similar-- pentru exact același motiv, da.
Pentru că în standardul io.h este literalmente o linie
în acest fel, dar cu printf cuvânt, și cu argumentele sale și tipul său de retur.
Și astfel de a face clare includ în sus aici, de ce ești literalmente faci
este copierea și lipirea conținutului de altcineva a scris sus.
Cluing Astfel codul din la fapt care nu exista aceste funcții.
Da?
>> Absolut.
Deci, un foarte inteligent și corect soluție ar fi, tu stii ce?
Nu știu ce o prototip este, dar eu știu
dacă am înțeles că C este doar mut și regândește sus în jos.
Ei bine, să-l dea ce vrea.
Să tai cod, lipiți-l în sus top, iar acum împingeți principal în jos de mai jos.
Acest lucru prea ar rezolva problema.
>> Dar ai putea veni foarte ușor cu un scenariu în care o nevoie de a apela B,
și, poate, B cheamă înapoi la A. Acest este ceva numit recursivitate,
și vom reveni la asta.
Și aceasta poate sau nu poate fi un bun lucru, dar poți cu siguranță
rupe această soluție.
>> Și mai mult, mi-ar susțin stilistic,
mai ales atunci când programele deveni atât de mult și atât de mult,
e doar foarte convenabil pentru a pune principal la partea de sus
pentru că e lucrul cel mai programatori sunt de gând să-i pese.
Și așa că este un pic mai curat, fără îndoială, să facă pe calea
Am făcut-o inițial cu un prototip chiar
deși se pare un pic redundant la prima vedere.
Da?
Ne pare rău, poți să-l spui mai tare?
>> Dacă schimbați locurile de punerea în aplicare și prototipul?
Deci, asta este o întrebare bună.
Dacă vă re-declare acest lucru în jos aici, să vedem ce se întâmplă.
Deci, dacă am pus aceasta jos aici, vrei să spui.
Oh, îmi pare rău.
Mai tare?
Chiar și mai tare.
Oh, buna intrebare.
Ar anula funcția?
Știi, după toți acești ani, am nu au mai pus un prototip după aceea.
Deci, hai sa facem face funcție-1 după ce face asta.
>> [Mormăind]
David J. MALAN: Oh, așteptați.
Noi încă mai trebuie să pună totul de sus.
Deci, hai sa facem asta aici, în cazul în care sunt înțelegerea corect întrebarea dumneavoastră.
Pun totul, inclusiv prototipul sus principală,
dar eu pun prototipul de mai jos punerii în aplicare.
>> Deci, dacă am face o, eu primesc înapoi un nefolosit n variabile error--.
Oh, nu.
Mulțumesc.
Să vedem, am scăpa de acest lucru.
Asta e un bug diferit, Să ignora asta.
Să adevărat reface repede acest lucru.
>> OK, deci nu argument date folosit de format String
N- oh, asta pentru ca Mi-am schimbat la acestea aici.
Bine, știm ce răspunsul va sa-- bine, aici vom merge.
Ah, multumesc pentru pozitiv.
Bine, voi rezolva acest cod dupa-- ignora această eroare special
deoarece acest fost-- în care funcționează este răspunsul.
>> Deci nu suprascrie ceea ce tocmai ai făcut.
Bănuiesc compilatorul este scris în așa fel
că este ignorarea prototip dumneavoastră deoarece organismul, ca să spunem așa,
a funcției are deja fost implementate mai sus.
Mi-ar trebui să consulte, de fapt manualul de compilator
pentru a înțelege dacă există orice altă implicare, dar la prima vedere
doar prin încercarea și experimentarea, nu pare să existe nici un impact.
Bună întrebare.
>> Deci, hai sa merge înainte acum, în mișcare departe de efecte secundare care
sunt funcții care fac ceva de genul vizual pe ecran cu printf,
dar nu se mai întorc o valoare.
Și funcții care au retur valori ca ne-am văzut câteva.
Am văzut deja această noțiune de domeniul de aplicare, și vom vedea acest lucru din nou și din nou.
Dar pentru acum, din nou, folosi regula de degetul mare
că o variabilă poate fi utilizat numai în interiorul cel mai recent deschis
și acolade inchise ca noi a văzut în acest exemplu particular.
>> Și, după cum ați subliniat, există o ability--
ai putea rezolva unele dintre aceste probleme de a pune o variabilă la nivel global
la foarte de sus a unui fișier.
Dar, în aproape toate cazurile ne-ar încrunta pe care,
și într-adevăr nu mai merge în care soluția de acum.
Deci, pentru moment, Takeaway este că variabile au această noțiune de domeniul de aplicare.
>> Dar acum să ne uităm la un alt mod uscat de fapt, în căutarea
la un moment destul de interesant detalii de implementare.
Cum am putea reprezenta informații.
Și ne-am uitat deja la acest în prima săptămână de clasa.
Privind la binare, și amintindu-ne de zecimale.
>> Dar amintesc de săptămâna trecută că C are diferite tipuri de date și ciorchini mai mult,
dar cele mai utile pentru acum ar putea fi acestea.
Un char, sau caracter, care se întâmplă să fie un octet, sau opt biți totală.
Și asta pentru a spune că dimensiunea unui char este doar un octet.
Un byte este de opt biți, astfel încât acest lucru înseamnă că putem reprezenta cât de multe personaje.
Câte litere sau simboluri de pe tastatura
dacă avem un octet sau opt biți.
Gandeste-te la săptămână la zero.
Dacă aveți de opt biți, cât de multe valori totale
puteți reprezenta cu modele de zero si unu?
Unu mai mult decât atât.
Deci totalul de 256, dacă începe numărarea de la zero.
Deci, dacă aveți opt bits-- așa, dacă ne-am a avut becuri noastre binare aici din nou,
am putea transforma aceste becuri pe și off în orice de 256 de modele unice.
>> Acum, acest lucru este un pic problematic.
Nu atât de mult pentru limba engleză și limbi romanice, dar cu siguranță
atunci când introduce, pentru exemplu, limbi asiatice, care
au mult mai multe simboluri decât ca 26 de litere ale alfabetului.
Avem de fapt ar putea avea nevoie mai mult de un octet.
Și din fericire, în ultimii ani a societății
alte standarde adoptate care folosesc mai mult de un octet pentru fiecare încărcare.
>> Dar pentru acum în C, implicit este doar un octet sau opt biți.
Un întreg, între timp, este de patru bytes, altfel cunoscut sub numele de 32 de biți.
Ceea ce înseamnă ceea ce este cel mai mare posibil Numărul putem reprezenta cu un int
se pare?
Cu un miliard.
Deci, este patru miliarde de da sau de a lua.
2 la puterea 32th, dacă ne-am asuma nici numere negative
și doar folosesc tot pozitiv numere, e patru miliarde de
da sau de a lua posibilități.
Un float, între timp, este un tip diferit de tip de date în C. Este încă un număr,
dar este un număr real.
Ceva cu un punct zecimal.
Și se pare că C folosește, de asemenea, patru bytes
pentru a reprezenta valorile în virgulă mobilă.
>> Din păcate, cât de multe plutitoare Valorile punctuale există în lume?
Câte numere reale sunt acolo?
Există un infinit număr, și pentru care contează
există un număr infinit de numere întregi.
Deci suntem deja un fel de săpat ne o gaură aici.
Care aparent în computers-- la mai puțin programe scrise în C pe them--
poate conta doar la fel de mare ca patru miliarde de da sau de a lua,
și plutitoare Valorile în puncte poate doar aparent
au o anumită cantitate finită de precizie.
Doar atât de multe cifre după punctul lor zecimal.
>> Pentru că, desigur, în cazul în care ai doar 32 de biți,
Nu știu cum vom merge cu privire la reprezentând numere, reală, probabil,
cu diferite tipuri de modele.
Dar există cu siguranță un finit număr de astfel de modele,
deci aici, de asemenea, acest lucru este problematic.
>> Acum putem evita ușor problema.
Dacă nu folosiți un flotor, ai putea folosi un dublu
în C, care vă oferă opt bytes, care este cale mai multe modele posibile de zerouri
și cele.
Dar e finit, care se va a fi problematic dacă scrii software
pentru grafică sau de fantezie formule matematice.
Deci, s-ar putea dori de fapt, pentru a conta în sus mai mult decât atât.
O named-- lung long-- stupid Este, de asemenea, opt octeți sau 64 de biți,
și aceasta este de două ori mai mult timp ca un întreg, și este de o valoare întreg lung.
>> Fact-- Fun dacă un int este de patru bytes, cât timp este un timp în C de obicei?
De asemenea patru bytes, dar o mult timp este de opt bytes,
iar acest lucru este din motive istorice.
>> Dar Takeaway acum este doar faptul că datele trebuie
să fie reprezentate într-un computer-- care este un dispozitiv fizic cu energie electrică,
este în general de conducere acele zerouri și ones--
cu cantități finite de precizie.
Deci, care-i problema atunci?
>> Ei bine, există o problemă de preaplin întreg.
Nu doar în C, dar în calculatoare în general.
De exemplu, în cazul în care acest lucru este un octet în valoare de un bit--
așa că, dacă acest lucru este de opt bit-- toate dintre care sunt numărul unu.
Ce număr este aceasta reprezentând dacă presupunem
e toate valorile pozitive în binar?
>> 255, și nu e de 256, deoarece zero este cel mai mic număr.
Deci, 255 este cea mai mare unul, dar problema
se presupune că am vrut să incrementa această variabilă care
se utilizează opt biți în total dacă vreau să-l incrementa.
>> Ei bine, de îndată ce am adăuga un una la toate acestea,
vă puteți imagina, probabil, doar visually-- cum ar fi realizarea cea folosind decimals--
ceva va curge spre stânga.
Și, într-adevăr, dacă am adăuga numărul una cu aceasta, ceea ce se întâmplă în binar
este că se revarsă înapoi la zero.
>> Deci, dacă nu use-- doar un int, dar un singur octet pentru a conta întregi
într-un program, de îndată ce default-- ajungi la 250, 251, 252, 253, 254,
255-- 0 vine după 255, care nu ceea ce este, probabil,
un utilizator este de gând să se aștepte.
>> Acum, în timp ce în punctul lume plutitoare, aveți, de asemenea, o problemă similară.
Nu atât de mult cu cea mai mare number-- deși e încă o problemă.
Dar, cu suma de precizie pe care le poate reprezenta.
Deci, haideți să aruncăm o privire la acest exemplu aici, de asemenea, de la code-- sursă de astăzi
float-0.c.
>> Și observați că acesta este un super- program simplu care
aparent ar trebui să imprime ce valoare?
Ce vrei să pariezi acest lucru se întâmplă pentru a imprima chiar dacă există un pic de nou sintaxă
aici?
Deci, sperăm 0,1.
Deci echivalentul unei zecimi de pentru că fac eu 1 împărțit la 10.
Am stocarea răspunsul într-o variabilă numită f.
Această variabilă este de tip float, care este un cuvânt cheie am propus existat.
>> Noi nu am văzut acest lucru înainte, dar aceasta este un fel de un mod elegant în printf
pentru a specifica cât de multe cifre tine Vreau să văd după un punct zecimal.
Deci, această notație înseamnă doar că aici e un înlocuitor.
E pentru un punct de flotant valoare, și oh, apropo,
arată o cu virgulă cu un număr de după virgulă.
Deci, asta e numărul de cifre semnificative,
ca să spunem așa, că s-ar putea dori.
>> Așa că lasă-mă să mergeți mai departe și face face-float 0, ./float-0,
și se pare că 1 împărțit la 10 este 0.0.
Acum, de ce este aceasta?
>> Ei bine, din nou, calculatorul este de a lua mă literalmente, și am scris o
și am scris 10, și să ia o ghici ce este tipul de date asumat de cei doi
valori?
Un întreg, este punct de vedere tehnic ceva un pic diferit.
Este de obicei o lungă, dar e în cele din urmă o valoare integrală.
Nu este o valoare în virgulă mobilă.
>> Care este de a spune că în cazul în care acest lucru este un întreg și acest lucru este un int,
Problema este că computerul nu are capacitatea
pentru a stoca chiar acel punct zecimal.
Deci, atunci când faci o divizat de 10 folosind întregi
atât pentru numărător și numitor, răspunsul ar trebui să fie de 0,1.
Dar computer-- deoarece acestea sunt integers--
nu știe ce să facă cu 0.1.
>> Deci, ceea ce o face în mod clar?
E doar o aruncați, și ceea ce văd în cele din urmă
este 0.0 doar pentru că am insistat asupra faptului că printf arată-mi un punct zecimal.
Dar problema este că, dacă împărți un număr întreg de un număr întreg,
va sa--, prin definiție, de C- un număr întreg.
Și nu va face ceva frumos și convenabil
ca în jurul lui până la cel mai apropiat una în sus sau în jos.
Se va trunchia tot după zecimal.
>> Deci, doar intuitiv, ceea ce este, probabil, un fix?
Care este cea mai simplă fix aici?
Da?
Exact.
De ce nu ne-am trata aceste ca valori în virgulă mobilă în mod eficient
transformându-le în flotoare sau duble.
Și acum, dacă eu fac fac flotoare-0, sau dacă am compila pluteste-o,
care este identic cu ceea ce a fost deja propus.
Și acum eu fac flotoare-0, acum primesc mea 0.1.
>> Acum, acest lucru este uimitor.
Dar acum am de gând să fac ceva un pic diferit.
Sunt curios să văd ce e cu adevărat întâmplă sub capotă,
și am de gând să imprimați această la 28 de zecimale.
Vreau să văd într-adevăr 0.1000-- un infinite--
[Inaudibil] 27 zerouri, după care 0,1.
>> Ei bine, să vedem dacă asta ceea ce într-adevăr mă.
Asigurați-pluteste-0 același fișier.
./floats-0.
Să mări răspunsul dramatic.
În tot acest timp, ai fost de gândire 1 împărțit la 10 este de 10%, sau 0,1.
Nu este.
Cel puțin în măsura în computerului în cauză.
>> Acum ce-- OK, asta e complet minciună 1 împărțit la 10 este de 0,1.
Dar ce-- că nu este Takeaway astăzi.
Deci, de ce nu cred calculator, spre deosebire de noi toți în cameră,
ca 1 împărțit la 10 este de fapt, că valoarea nebun?
Care este computerul face aparent?
Ce-i asta?
>> Nu se reverse, în sine.
Overflow este, de obicei, atunci când când înfășurați în jurul unei valori.
Este această chestiune de imprecizie la o valoare în virgulă mobilă
în cazul în care aveți doar 32 sau poate chiar 64 de biți.
Dar dacă există un infinit Numărul de numere, reale
Numere cu zecimale și numerele de thereafter-- cu siguranță
nu se poate reprezenta pe toate.
Deci, computerul a dat ne cea mai apropiată
la valoarea pe care o poate reprezenta utilizarea acestei mulți biți la valoarea vreau de fapt,
care este de 0,1.
>> Din păcate, dacă începe să faci matematica, sau te
începe implică aceste tipuri de plutire Valorile în puncte în programs-- importante
software-ul financiar, nimic software-- militar
în cazul în care percepția este probabil destul de importantă.
Și începe să adăugați numere, cum ar fi acest lucru, și să înceapă
rulare că software-ul cu intrări foarte mari
sau de o mulțime de ore sau loturi de zile sau o mulțime de ani,
aceste greșeli mici mici cu siguranță se pot adăuga de-a lungul timpului.
>> Acum, ca o paranteza, dacă ai vreodată văzut Superman 3 sau Office Space
și s-ar putea aminti cum tipii ăia au furat
o mulțime de bani de pe computerul lor prin utilizarea valorilor în virgulă mobilă
și adunarea putinul resturi, sperăm că filmul
are acum mai mult sens.
Aceasta este ceea ce au fost făcând aluzie la faptul că în film.
Faptul că majoritatea companiile nu s-ar uita
după un anumit număr de zecimale,
dar cei care sunt fracțiuni de cenți.
Așa că începeți să adăugați-le în sus, de a începe să facă o mulțime de bani
în contul tău bancar.
Deci, asta e Birouri explicat.
>> Acum, din păcate, dincolo de Birouri, acolo
sunt unele legitim ingrijoratoare și un impact semnificativ
de aceste tipuri de deciziile de design de bază,
și într-adevăr, unul dintre motivele folosim C în cursul
este, asa vei avea într-adevăr acest motiv până înțelegere a modului în care funcționează calculatoare,
cum software-ul lucrează, și nu ia nimic de la sine.
>> Și într-adevăr, din păcate, chiar și cu că înțelegerea fundamentală,
Noi, oamenii, facem greșeli.
Și ce m-am gândit împărtășesc este acest videoclip opt minute luată aici
de la un episod Minuni moderne, care este un spectacol de învățământ la cum merg lucrurile
care pictează două imagini de când o utilizare improprie
și de înțelegere a valori în virgulă mobilă
condus la unele semnificative rezultate nefericite.
Să aruncăm o privire.
[VIDEO PLAYBACK]
-Noi Acum a reveni la "Inginerie Dezastre "pe Minuni moderne.
Calculatoare.
Am venit pentru a accepta probleme de multe ori frustrant că
Trebuie cu them-- bug-uri, viruși, și glitches-- software pentru preturi mici
să plătească pentru confortul.
Dar, în high tech și de mare viteză aplicatii programul spatial 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 fără pilot racheta Ariane 5.
Acesta a fost transportă științific sateliți proiectat
pentru a stabili exact cum Interactioneaza campul magnetic al Pamantului
cu vânturile solare.
Racheta a fost construit pentru Agenția Spațială Europeană,
și a decolat de la facilitatea de pe coasta Guyanei Franceze.
>> -La Aproximativ 37 secunde în zborul, ei primul
a observat că se întâmplă ceva în neregulă.
Că duzele s-au pivotante într-un mod în care într-adevăr nu ar trebui.
În jurul valorii de 40 secunde în zbor, clar vehiculul a fost în necaz,
și atunci au făcut decizia de a-l distruge.
Responsabilul cu siguranța gamă, cu curaj extraordinar, apăsat butonul
și a explodat racheta înainte de a putea deveni un pericol pentru siguranța publică.
>> Asta a fost fecioara călătorie de Ariane 5,
și distrugere a loc din cauza defectului
încorporat în software-ul rachetei.
-Contravaloarea Problemă pe Ariane a fost că acolo
a fost un număr care este necesar 64 de biți pentru a exprima,
și au 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 de biți sunt zerouri.
Ei au fost greșit.
>> -Contravaloarea Incapacitatea de unul program software pentru a accepta
tipul de număr generat de un alt fost la originea eșecului.
Dezvoltarea de software a devenit o parte foarte costisitor de noi tehnologii.
Ariane 4 racheta a avut fost foarte de succes.
Atât de mult a software-ului creat de a fost, de asemenea, utilizat în Ariane 5.
>> -Contravaloarea Problemă de bază a fost ca Ariane 5.
A fost faster-- accelerat mai rapid, și software-ul nu a reprezentat pentru asta.
>> -Contravaloarea Distrugere a rachetei a fost un dezastru financiar imens.
Tot din cauza unei erori de software minut.
Dar acest lucru nu a fost primul probleme de conversie a datelor în timp
au afectat tehnologiei moderne de rachete.
>> -În 1991 cu începerea din primul război din Golf,
de rachete Patriot experimentat un fel asemănător
a unei probleme de conversie număr.
Și, ca urmare 28 de oameni pana 28 Soldiers-- americani au fost uciși,
și aproximativ o sută de alții răniți.
Când Patriot, care ar fi trebuit pentru a proteja împotriva Scuds de intrare,
nu a reușit să tragă o rachetă.
>> -Când Irakul a invadat Kuweitul, și America de a lansat Desert Storm, la începutul anului 1991,
Baterii de rachete Patriot au fost desfășurate pentru a proteja Arabia Saudită și Israel
de la atacurile cu rachete Scud irakiene.
Patriot este un mediu-gama SUA sol-aer sistem
fabricat de compania Raytheon.
>> -Contravaloarea Dimensiunea Patriot interceptor itself--
este vorba despre aproximativ 20 de metri lungime, si cantareste aproximativ 2.000 de lire sterline.
Și poartă un focos de aproximativ, Cred că e de aproximativ 150 de lire sterline.
Și focosul în sine este un exploziv ridicat, care
are fragmente din jurul lui.
Deci, carcasa de focosul este conceput pentru a acționa ca o alice mari.
>> -Contravaloarea Rachete sunt efectuate patru per container,
și sunt transportate de către o semiremorcă.
>> -Sistemul Patriot anti-rachetă merge înapoi cu cel puțin 20 de ani.
Acesta a fost conceput 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 pe,
Armata a vrut să-l folosească pentru a trage în jos Scuds, nu avioane.
Irakian Air Force a fost nu atât de mult de o problemă,
dar armata a fost îngrijorat Scuds.
Și așa au încercat să upgrade la Patriot.
>> -Intercepting Un inamic rachetă care călătoresc la Mach 5
a fost de gând să fie suficient de provocatoare.
Dar când Patriot a fost dus de urgenta la serviciu,
Armata nu a fost conștient de o modificare irakian care
făcut scuds lor aproape imposibil să-l.
>> Ce sa întâmplat este că Scuds veneau în era instabil.
Ei au fost wobbly.
Motivul pentru acest lucru a fost de Iraqis-- în scopul de a obține 600 km afară
de o gamă missile-- de 300 de kilometri a luat in greutate din focos din față,
și a făcut focosul brichetă.
Deci, acum Patriot încearcă să vină la Scud, și de cele mai multe timp--
Majoritatea covârșitoare a timp-- ar zbura doar prin Scud.
>> -După Operatorii de sisteme Patriot realizat Patriot ratat ținta,
au detonat focos Patrioților 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 ca mingi de foc mari în cer,
și înțeleasă greșit ca intercepteaza de focoase Scud.
>> -Deși În cerul de noapte, Patriots părea să fie distrus cu succes
Scuds, la Dhahran ar putea exista nici o greseala despre performanțele sale.
Acolo sistem radar Patrioților cale pierdut de un Scud de intrare
și niciodată nu a lansat din cauza la un defect de software.
>> Acesta a fost israelienii care au descoperit primul care mai este sistemul a fost pe,
cu atât mai mare diferența de timp au devenit.
Datorită un ceas încorporat în calculator a sistemului.
>> -Despre Două săptămâni înainte tragedia în Dhahran,
israelienii au raportat la Departamentul Apararii
că sistemul pierdea timp.
După aproximativ opt ore de funcționare, au observat
că sistemul de anii din ce în ce considerabil mai puțin precise.
Departamentul Apărării a răspuns prin spune toate bateriile Patriot
să nu părăsească sistemul pe o perioadă îndelungată.
Ei nu au spus ceea ce a fost o lungă perioadă de timp.
8 ore, 10 ore, o mie de ore.
Nimeni nu știa.
>> -Contravaloarea Baterie Patriot staționate la cazarma
la Dhahran și viciate intern sale ceas au fost pe de peste 100 de ore
în noaptea din 25 februarie.
>> -Este Timp urmarite cu o acuratețe de aproximativ o zecime de secundă.
Acum, o zecime de secundă este un număr interesant
deoarece nu poate fi exprimat în binar exact, care
înseamnă că nu poate fi exprimat exact în orice calculator digital modern.
Este greu de crezut, dar folosi acest lucru ca un exemplu.
>> Să luăm numărul treime.
O treime nu poate fi exprimată în zecimal exact.
O treime este 0,333 întâmplă pentru infinit.
Nu există nici o modalitate de a face asta cu precizie absolută într-o zecimală.
Acesta este exact genul de problemă care sa întâmplat în Patriot.
Mai mult sistemul de alergat, mai rău eroarea de timp a devenit.
>> -Dupa 100 de ore de funcționare, eroare în timp a fost doar aproximativ o treime
dintr-o secundă.
Dar, în ceea ce privește orientarea o rachetă care călătoresc la Mach 5,
a rezultat într-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 a fost detectate de sateliți de avertizare timpurie,
și au cunoscut o Scud vine în direcția lor generală.
Ei nu știu de unde a venit.
A fost acum până la radar componentă a sistemului Patriot
apărarea Dhahran pentru a localiza și să păstreze cale de racheta inamic de intrare.
>> -Contravaloarea Radar a fost foarte inteligent.
S-ar urmări de fapt poziția Scud
și apoi prezice unde probabil că ar fi
data viitoare radar a trimis un puls afară.
Care a fost numit poarta gamă.
>> Atunci dată Patriot decide suficient timp are
a trecut pentru a merge înapoi și verifică 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 un obiect.
Aceasta a fost o detecție fals și scade pista.
>> -Contravaloarea Intrare Scud dispărut din ecranul de radar,
și secunde mai târziu, ea trântit în barăci.
Scud ucis 28.
Acesta a fost concediat ultima în timpul primului război din Golf.
În mod tragic, software-ul actualizat a sosit în zori în ziua următoare.
Defect de software a avut fost fixate, de închidere
un capitol în tulbure istorie de rachete Patriot.
>> [END VIDEO PLAYBACK]
>> David J. MALAN: Asta e pentru CS50.
Ne vedem miercuri.
>> [MUSIC JOC]