>> [MUSIC Playing]
DAVID J. Malan: Në rregull.
Kjo është CS50, dhe kjo është fillimi i javës dy.
Pra, le të fillojë sot me një bug.
Një bug, sigurisht, është një gabim në një program,
dhe ju do të merrni shumë njohur me këtë koncept
në qoftë se ju kurrë nuk kam programuar para. pset0 dhe tani pset1.
Por le të konsiderojmë diçka një thjeshtë pak në fillim.
Ky program këtu se unë hodhi së bashku më parë,
dhe unë pretendojnë se kjo duhet të shtypura 10 yjet në ekran duke përdorur printf,
por kjo me sa duket buggy në një farë mënyre.
>> Duke pasur parasysh se specifikimi se ajo duhet të shtypura 10 yje,
por kjo nuk ka me sa duket, ajo që do të thonë është bug?
Po?
Pra, kjo është një off nga një gabim, dhe çfarë do të thotë me këtë?
OK.
Excellent.
Pra, ne kemi përcaktuar një fillojnë vlerën zero për i,
dhe ne kemi përcaktuar një vlerë n prej 10, por ne kemi përdorur më pak se ose e barabartë me.
Dhe arsyeja që kjo është dy karaktere dhe jo vetëm një simbol,
si në një libër të matematikës, është se ju nuk keni
një mënyrë për të shprehur një ekuivalente karakter.
>> Kështu që do të thotë më pak se, por në qoftë se ju filloni duke numëruar në zero,
por ju numërimin gjithë rrugës lart përmes dhe barabarte me 10,
ju jeni sigurisht do të numëruar 11 gjërat në total.
Dhe kështu që ju jeni do të shtypura 11 yjet.
Pra, çfarë mund të jetë një fix për këtë?
Po?
>> Pra, vetëm të rregullojë më pak se ose e barabartë me jetë vetëm më pak se,
dhe nuk ka, unë pretendojnë, ndoshta një tjetër zgjidhje, too.
Çfarë mund të tjetër që ju bëni?
Po?
>> Pra, fillojë barazuar atë me 1, dhe largohet me pak se ose e barabartë me.
Dhe sinqerisht unë do të pretendojnë që, për një tipik njeriut,
kjo është ndoshta më e drejtpërdrejtë.
Të fillojë numërimi në 1 dhe numëruar deri me 10.
Në thelb të bërë atë që ju thotë.
>> Por realiteti është në programimit, siç e kemi parë,
Shkencëtarët kompjuterike dhe programuesit përgjithësi do të fillojë numërimi në zero.
Dhe kështu që është në rregull herë ju të mësohen me të.
Gjendja juaj do të në përgjithësi të jetë diçka si më pak se.
Pra, thjesht një logjike gabim që ne mund tani
fix dhe në fund të fundit recompile këtë dhe të marrë vetëm 10.
>> E pra si në lidhje me këtë bug këtu?
Këtu, përsëri, unë pretendojnë se kam një qëllim i shtypjes 10 stars--
një për rresht këtë kohë, por kjo nuk ka.
Para se të propozojë çfarë fix është, ajo që e bën këtë
shtypura me sy nëse unë do të hartojë dhe të drejtuar këtë program mendoni ju?
Po?
>> Star.
Pra, të gjitha yjet në njëjtën linjë është ajo që kam dëgjuar,
dhe pastaj karakteri i ri linjë.
Pra, le të përpiqemi që.
Pra, ti buggy-1, të hyjë, dhe unë shoh komandën tingëllimë
se kemi biseduar për herë të fundit.
./buggy-1, dhe në të vërtetë unë shoh të gjithë 10 yjet në të njëjtën linjë, edhe pse unë pretendojnë
në specifikimet e mi vetëm një koment në majë Kodi që kam për qëllim për të bërë një për
linjë.
Por kjo duket e drejtë.
>> Tani linjë 15 duket sikur jam shtypjen e një yll, dhe pastaj të linjës 16
kjo duket si unë jam shtypjen një karakter të ri linjë,
dhe ata janë të dy prerë në mënyrë Unë jam brenda lak qartë.
Pra, nuk duhet të jetë bërë yll, i ri line, yll, linjë e re, yll, linjë e re?
Po?
>> Po, ndryshe nga një gjuhë si Python, në qoftë se ju jeni të njohur,
gjurmë nuk rëndësi në kompjuter.
Është vetëm çështje për të njeriut.
Kështu linjat ndërsa këtu e kam shpikur 15 dhe 16-- që duket e bukur,
por kompjuteri nuk ka kujdes.
Kompjuter kujdeset për në të vërtetë duke pasur formatimin e teksteve kaçurrel
rreth këtyre rreshta të kodit.
>> Kështu që kjo është clear-- ashtu si në Scratch-- se ato dy rreshta të kodit
duhet të ekzekutohet.
Si një nga ato puzzle verdhë Scratch copa përsëri dhe përsëri dhe përsëri.
>> Deri tani, nëse unë të ri-drejtuar këtë program-- ./buggy-2-- Hm.
Unë kam një gabim tani.
Çfarë kam harruar të bëj?
Yeah, kështu që unë nuk e përpilojnë atë.
Pra, ti buggy-2.
Nuk ka fotografi të tilla, sepse unë nuk e kam fakt hartojë versionin e dytë.
Deri tani interesante pashpallur nuk variable-- 2.
Ne jemi duke bërë 1.
Bëni buggy-1-- ./buggy-1-- dhe tani secili prej tyre është në të njëjtin drejtim.
>> Tani ka një përjashtim të ky pretendim dashur i imi
se keni nevojë për këto formatimin e teksteve kaçurrel.
Kur është ajo në të vërtetë OK-- nëse ju keni vënë re në seksionin ose textbooks--
të heq formatimin e teksteve kaçurrel?
Po?
>> Pikërisht.
Kur ka vetëm një linjë e kodit që ju
duan të jenë të lidhur me lak si në shembullin tonë të parë.
Kjo është krejtësisht e ligjshme të heq formatimin e teksteve kaçurrel
ashtu si lloj i një lehtësi nga përpiluesit për ju.
Po?
Pyetje e mirë.
A do të të konsiderohet si një gabim stil?
Ne do të promote-- si në CS50 udhëzues stil, URL për të cilat
është në pset1-- se gjithmonë përdorni formatimin e teksteve kaçurrel.
Sigurisht në qoftë se ju jeni e re në programimit.
Realiteti është që ne nuk jemi do të ndalojë ju
nga të bërë këto banjë.
Por në qoftë se ju jeni vetëm duke u në ritëm të gjëra,
absolutisht vetëm përdorni përherë kaçurrel formatimin e teksteve deri sa ju të merrni ul receptorin e telefonit të tij.
Pyetje e mirë.
>> Të gjithë të drejtë.
Pra, që atëherë ishte një bug.
Të paktën në diçka mjaft të thjeshtë.
E megjithatë, ju mund të mendoni se kjo është mjaft rudimentare, e drejtë?
Kjo është lloj i javës së parë i kërkuar në gjuhën
si, shih mete tuaj aty.
Por realiteti këto janë në të vërtetë përfaqësuesi
e disa problemeve mjaft të frikshme që mund të lindin në botën e vërtetë.
>> Kështu që disa prej jush mund të kujtojnë në qoftë se ju ndiqni lajmet teknologjisë,
apo ndoshta kapur edhe era e kësaj në shkurt
të këtij viti të kaluar që Apple kishte bërë një grimë e një gabimi në të dy IOS,
sistemit operativ në telefonat e tyre, dhe gjithashtu
Mac OS, sistemi operativ në Desktop dhe laptopë e tyre.
Dhe ju pa tituj të tillë si kjo.
Dhe pas kësaj, Apple premtuar për të rregulluar këtë bug,
dhe shumë shpejt e bëri të rregulluar atë në IOS, por pastaj në fund të fundit fiksuar atë në Mac OS
si.
>> Tani asnjë nga këto tituj vetëm me të vërtetë tregojnë se çfarë problemi themelor ishte,
por bug u reduktua në fund të fundit për të një bug në SSL, Secure Sockets shtresa.
Dhe histori të gjatë të shkurtër, kjo është software
që shfletues tona dhe të tjera software të përdorura për të bërë çfarë?
>> Nëse kam thënë se është SSL përfshirë, kur ju
vizituar një URL që fillon me HTTPS, ajo pastaj mund SSL jetë e lidhur me?
Encryption.
Pra, ne do të flasim për kjo në ditët e ardhshme.
Encryption, arti i përpiqen informacion.
>> Por histori të gjatë të shkurtër, Apple dikur më parë kishte bërë një gabim
në zbatimin e tyre të SSL, të softuer që në fund të fundit zbaton
URL si HTTPS ose max Lidhjet atje.
Rezultat i cili është se ta Lidhjet mund potencialisht
të kapen.
Dhe lidhjet tuaja ishin jo i mbyllur domosdoshmërisht
në qoftë se keni pasur një djalë i keq në mes të ju dhe faqen e internetit destinacion që
e dinte se si të përfitojnë nga kjo.
>> Tani Apple në fund të fundit postuar një fix për këtë më në fund,
dhe përshkrimi e rregulluar e tyre ishte kjo.
Transportit të sigurt dështuar për të vërtetuar origjinalitetin e lidhjes.
Çështja është adresuar nga rivendosjen e humbur hapa validation.
>> Pra, kjo është një onde shpjegim shumë të dorës për thjesht duke thënë që ne të dehur.
Nuk është fjalë për fjalë një linjë e kodit që ishte buggy
në zbatimin e tyre e SSL, dhe në qoftë se ju shkoni në internet dhe të kërkoni për këtë
në të vërtetë ju mund të gjeni Kodi burimi origjinal.
Për shembull, kjo është një e shtënë ekran të vetëm një pjesë e një fotografi mjaft të madhe,
por kjo është një funksion i quajtur me sa duket SSL verifikuar server shenjë shkëmbimin kyç.
Dhe ajo merr një bandë e argumentet dhe inputet.
Dhe ne nuk jemi duke shkuar për të përqëndrohet shumë në minutia atje,
por në qoftë se ju të përqëndrohet në kodin brenda e që i larti function-- Le
zoom në se.
Ju tashmë mund të dyshuar çfarë gabimi mund
të jetë edhe në qoftë se ju nuk kanë idenë në fund të fundit ajo që ju jeni duke kërkuar në.
Nuk është lloj i një anomali këtu, e cila është ajo?
>> Po, unë vërtetë nuk e pëlqen vështrim i dy goto dështon.
Sinqerisht, unë vërtetë nuk e di se çfarë goto dështojnë do të thotë, por që dy prej tyre
të kthehet prapa.
Kjo vetëm lloj i fërkon mua intelektualisht rrugën e gabuar,
dhe në të vërtetë në qoftë se ne të zoom në në vetëm këto drejtime, kjo është C.
>> Pra, një shumë e kodit Apple është vetë shkruar në C,
dhe kjo me sa duket është me të vërtetë equivalent--
jo në atë vulë të bukur version, por në qoftë se ju njohin faktin
se nuk ka formatimin e teksteve kaçurrel, çfarë Apple me të vërtetë shkroi ishte kodi që duket
si kjo.
Kështu që unë kam zoomed jashtë dhe unë vetëm fikse e vulë në kuptimin
se në qoftë se nuk ka asnjë formatimin e teksteve kaçurrel, që goto dytë dështojnë që është në të verdhë
do të ekzekutojë pa marrë parasysh çfarë.
Kjo nuk është e lidhur me nëse kushti mbi të.
>> Pra, edhe një herë, në qoftë se ju bëni mjaft kuptuar se çfarë ky mund ndoshta
të jetë bërë, e di se secili prej tyre conditions-- secili nga këto rreshta
është një hap shumë i rëndësishëm në procesin e kontrolluar
në qoftë se të dhënat e juaj është në të vërtetë i mbyllur.
Pra, duke lënë mënjanë një nga këto hapa, jo ide e mirë.
>> Por për shkak se ne kemi këtë goto dytë dështojnë në të verdhë,
dhe për shkak se një herë ne lloj estetikisht
lëvizin atë në të majtë, ku atë logjikisht është në këtë moment, çfarë
do të thotë kjo për linjë i kodit poshtë asaj goto dytë
nuk do të jeni të kënaqur?
Ajo është gjithmonë do të jetë skipped.
Pra gotos janë frowned në përgjithësi mbi të për arsye që ne nuk do të vërtetë të shkojnë në,
dhe në të vërtetë në CS50 ne nuk priren për të mësuar this goto deklaratë,
por ju mund të mendoni goto dështojnë si kuptimi shkojnë kërcim
në disa pjesë të tjera të kodit.
>> Me fjalë të tjera hidhen mbi kjo linjë e fundit krejt,
dhe kështu që rezultati i kësaj budalla gabim i thjeshtë që ishte vetëm
një rezultat i ndoshta dikujt kopjimi dhe pasting një shumë
shumë herë ishte se i tërë sigurinë e iOS dhe Mac OS
ishte e prekshme për zënie nga djemtë e keqe për mjaft kohë.
Deri në fund Apple fiksuar këtë.
>> Tani në qoftë se disa prej jush janë në të vërtetë drejtimin versionet e vjetra të iOS ose Mac OS,
ju mund të shkoni në gotofail.com cilat është një faqe interneti që dikush të ngritur
në thelb të përcaktuar programuar
në qoftë se kompjuteri juaj është ende e ndjeshme.
Dhe sinqerisht, në qoftë se ajo është, kjo është ndoshta një ide e mirë
për të rinovuar telefonin tuaj ose Mac tuaj në këtë pikë.
Por atje, vetëm testament për të se sa një vlerësim i këtyre nivel më të ulët
detaje dhe në mënyrë të drejtë ide të thjeshtë mund të vërtetë
përkthehet në vendimet dhe problemet që
affected-- në këtë case-- miliona njerëz.
>> Tani një fjalë mbi administratën.
Seksioni do të fillojë këtë të dielë vjen.
Ju do të merrni një email nga fundjavë në lidhje me seksionin, në të cilën pikë
procesi resectioning do të fillojë në qoftë se ju keni
realizuar ju tani keni disa konflikte të reja.
Pra, kjo ndodh çdo vit, dhe ne do të strehojë në ditët që do të vijnë.
>> Zyra hours-- bëjnë të mbajtur një sy në këtë orar këtu.
Ndryshon pak këtë javë, veçanërisht koha e fillimit
dhe vend, kështu që të konsultohet që para se të nisej për të orarit të punës
ndonjë nga katër netët e ardhshme.
Dhe tani një fjalë në vlerësimin, veçanërisht si ju pikiatë në problemin
vendos një dhe më gjerë.
>> Pra, sipas specifikimit, këto janë në përgjithësi
akset së bashku të cilat vlerësojmë punën tuaj.
Fushëveprimi i referohet asaj që mase kodin zbaton tuaj
karakteristikat e nevojshme nga specifikim tonë.
Me fjalë të tjera, sa i një grup copë e bëri të kafshoj.
A ju bëni një të tretën e saj, gjysma e saj, 100% e saj.
Edhe në qoftë se kjo nuk është e saktë, Sa keni të përpiqet?
Kështu që kap nivelin i përpjekjeve dhe shumës
për të cilat ju pak off Problemet Problemi Set-së.
>> Correctness-- këtë, për të në çfarë mase, është kodi juaj
në përputhje me tonë specifikimet dhe pa bugs.
Pra, e bën këtë punë si duhet?
Nëse do t'i jepte disa të dhëna, e bën atë na japë prodhimin që ne presim?
Design-- tani ky është i pari i ato veçanërisht cilësore,
apo ato që kërkojnë gjykimin njerëzor.
Dhe në të vërtetë, kjo është arsyeja pse ne kemi një staf e kaq shumë shokëve të mësimdhënies dhe natyrisht
asistentë.
Deri në çfarë mase është tuaj Kodi i shkruar mirë?
>> Dhe përsëri kjo është një shumë e Vlerësimi cilësor
që do të punojë me ju në bi-directionally në javët që do të vijnë.
Kështu që kur ju nuk merrni vetëm rezultatet numerike, por edhe
një rezultatet e shkruara, ose reagime shtypur, ose reagime të shkruara me fjalë anglisht.
Kjo është ajo që ne do të përdorim për të përzënë ju në drejtim të vërtetë shkruar kodin më të mirë.
Dhe në leksion dhe seksion, ne do të përpiqemi për pikë out-- si shpesh si ne can--
ajo që e bën një program jo vetëm saktë dhe funksionalisht të mirë,
por gjithashtu i projektuar mirë.
Më efikase ajo mund të jetë, ose edhe më e bukur ajo mund të jetë.
>> Cili na çon në stil.
Style në fund të fundit është një gjykim estetike.
A ju zgjidhni mirë emrat për variablave tuaj?
A keni prerë kodin tuaj siç duhet?
A të duket e mirë, dhe për këtë arsye, është e lehtë për një tjetër qenie njerëzore
për të lexuar përkatëse tuaj e korrektësinë e tij.
>> Tani në përgjithësi në planin mësimor, ne të shënuar këto gjëra në një shkallë me pesë pikë.
Dhe më lejoni të çekiç në shtëpi pikë se një tre është me të vërtetë e mirë.
Shumë shpejt të bëjë folks fillojnë të bëjnë aritmetike.
Kur ata marrin një tri të pesë në korrektësinë për disa pset
dhe ata mendojnë mallkuar, kam shkuar në 60% cila është në thelb një D ose një E.
>> Kjo nuk është mënyra që ne mendojnë për këto numra.
Një tre është me të vërtetë e mirë, dhe çfarë ne në përgjithësi presin në fillim
i termit është se në qoftë se ju jeni duke marrë një bandë e three's-- ndoshta një çift
e panaireve, disa fours-- ose një twos çift, disa fours--
kjo është një vend i mirë për të filluar.
Dhe për sa kohë që ne të shohim një trajektore lart me kalimin e kohës,
ju jeni në një vend veçanërisht i mirë.
>> Formula që ne përdorim për të gjërat peshë është në thelb
kjo per planin mësimor, i cili vetëm do të thotë se ne
japin më shumë peshë për korrektësinë.
Për shkak se ajo është shumë e shpesh korrektësi që merr kohë më.
Trust me tani.
Ju do find-- të paktën në një pset-- që ju
shpenzojnë 90% të kohës tuaj duke punuar në 10% të problemit.
>> Dhe çdo gjë lloj punon me përjashtim të një ose dy viruse,
dhe ata janë të mete që mbajtur ju deri natën vonë.
Ata janë ato që lloj të të shpëtojnë.
Por pas fjetur në të, ose ndjekin orarin e punës
ose pyetje online, është kur ju merrni për këtë qëllim 100%,
dhe kjo është arsyeja pse ne peshe korrektesën më.
Hartimi pak më pak, dhe stil pak më pak se kaq.
Por mbani në stilin mind-- është ndoshta më e lehtë
nga këto për të kafshoj sipas udhëzues stil.
>> Dhe tani, një më rëndë vini re në ndershmëri akademik.
CS50 ka dallim të ardhur keq e duke qenë prodhuesi më i madh i Ad Bordit
raste pothuajse çdo vit historikisht.
Kjo nuk është për shkak se studentët mashtrojnë në CS50 më shumë se çdo klasë tjetër,
por për shkak se nga natyra e punës, fakti se është e elektronike,
Fakti që ne e shohim për të, dhe fakti ne jemi shkencëtarët kompjuterike,
Unë mund të them se ne jemi për fat të keq shumë të mirë në zbulimin atë.
>> Pra, çfarë do të thotë kjo në terma reale?
Pra të, për planin mësimor, Filozofia Kursi-së
vërtetë nuk avulloj të jenë të arsyeshme.
Nuk është kjo linjë në mes bërë punë të dikujt në tuaj
dhe për të gjetur pak ndihmë të arsyeshme nga një mik,
dhe të plotë duke bërë atë punë për tuaj mik, apo të dërguar atë kodin tuaj
në mënyrë që ai ose ajo mund të thjesht marrë ose të marrë hua atë të drejtë.
Dhe që kalon vijën që ne të tërhequr në klasë.
>> Shih, planin mësimor në fund të fundit për linjat
që të nxjerrim si të arsyeshme dhe sjellja e paarsyeshme,
por me të vërtetë e bën vlim poshtë në thelb
e puna juaj kanë nevojë për të të jetë vetë në fund.
Tani me se tha, ka një ndihmues.
Për shkak se si ju mund të imagine-- nga të orarit të punës dhe visuals
dhe videot ne kemi treguar kështu far-- CS50
është me të vërtetë qëllim që të jetë sa bashkëpunues dhe si bashkëpunuese dhe si social
të jetë e mundur.
Si Collaborative siç është rigoroz.
>> Por me këtë tha, deduktive, si ju do të shihni në planin mësimor,
është se kur ju jeni që ka disa probleme.
Ju keni disa bug në kodin tuaj që ju nuk mund të zgjidhë, është e arsyeshme për ju
për të treguar kodin tuaj të dikujt tjetër.
Një mik edhe në klasë, një mik ulur pranë jush në orarit të punës,
ose një anëtar i stafit.
Por ata nuk mund të tregojnë kodin e tyre për ju.
>> Me fjalë të tjera, një përgjigje të question-- tuaj
Unë kam nevojë për help-- nuk është oh, këtu është kodi im.
Hidhni një sy në këtë dhe nxjerr një përfundim nga ajo se çfarë do.
Tani, sigurisht, nuk ka një mënyrë e qartë për të lojës
ky sistem ku unë do të ju tregojnë kodi im para se të paturit e një pyetje.
Ju më tregoni kodin tim para se të paturit e një pyetje.
Por shih planin mësimor përsëri për detajet finer e ku kjo linjë është.
>> Vetëm për të tani të pikturuar foto dhe të ndarë sa të jetë e mundur në mënyrë transparente
ku jemi ne në vitet e fundit, ky është numri i rasteve Ad Bordit
që CS50 ka patur mbi shtatë vitet e fundit.
Me 14 raste këtë vjeshtë më të fundit.
Në kushtet e studentëve të përfshirë, ajo ishte 20 disa studentë i rastësishëm
këtë vjeshtë e kaluara.
Nuk ishte një kulmin e 33 studentët disa vite më parë.
Shumë prej të cilëve janë për fat të keq nuk është më këtu në kampus.
>> Studentët e përfshirë si një përqindje e klasë ka shkonin historikisht nga 0%
në 5.3%, e cila është vetëm për të thënë ky është vit një sfidë.
Dhe për këtë qëllim, ajo që ne duam të bëjmë është të përcjellë një
se ne dd-- vetëm FYI-- të krahasuar në një drejtësi për ata studentë të cilët
janë ndjekur linjën në përputhje me rrethanat.
Ne bëjmë të krahasuar të gjitha aktuale parashtresat kundër të gjitha misionet e fundit
nga vitet e fundit shumë.
>> Ne e dimë shumë se si të Google rreth dhe për të gjetur depo kodin
online, forume diskutimi online, vende pune online.
Nëse një student mund të gjeni atë, ne mund me siguri gjeni atë sa më shumë që ne bëjmë me keqardhje.
Pra, ajo që ju do të shihni në planin mësimor pse është kjo klauzolë keqardhje.
Unë mund me siguri vlerësojmë, dhe ne të gjithë ka
Stafi ka bërë kursin si kjo, apo kjo e vetë me kalimin e kohës,
me siguri e di se çfarë është si kur jeta merr në mënyrë, kur ju keni
disa natën vonë deadline-- jo vetëm në këtë klasë,
por another-- kur ju jeni plotësisht i rraskapitur, theksoi,
kanë një numër tepër i madh e gjëra të tjera për të bërë.
Ju do të bëni në një pikë në Jeta sigurisht një të keqe, ndoshta me vonesë
Vendimi natë.
>> Pra, në planin mësimor, nuk është kjo klauzolë,
të tillë që nëse brenda 72 orë duke e bërë disa vendim të varfër, ju vetë deri në atë
dhe për të arritur jashtë për mua dhe një nga krerët e kursit të
dhe ne do të kemi një bisedë.
Ne do të merret me gjëra të brenda me shpresë
nga kjo bëhet më i a moment mësimdhënies apo mësim jetën,
dhe jo diçka me degëzime veçanërisht drastike
si ju mund të shihni në këto Listat këtu.
>> Pra, kjo është një ton shumë serioze.
Le të ndalemi për vetëm disa sekonda për të thyer tensionin.
>> [MUSIC Playing]
>> DAVID J. Malan: Mirë, aq sa ishte se për një Segue?
Temave kryesore të sotme.
Parë e cila është abstraksion.
Tjetër e cila do të jetë Përfaqësimi i të dhënave, të cilat sinqerisht
është një mënyrë të vërtetë të thatë për të thënë se si mund të shkoni në lidhje me zgjidhjen e problemeve dhe të menduarit
për zgjidhjen e problemeve?
Kështu që ju keni parë në Scratch, dhe ju keni parë ndoshta tashmë në pset1 me C
që jo vetëm mund të përdorni funksionet, si printf,
që njerëzit e tjerë në vitet e fundit ka shkruar për ju.
Ju gjithashtu mund të shkruani funksionet tuaj.
>> Dhe, edhe pse ju nuk mund të ketë bërë këtë në C, dhe sinqerisht në pset1
ju nuk duhet të vërtetë për të shkruar tuaj Funksioni i vet për shkak të problem--
ndërsa ndoshta frikshme në parë glance-- ju do të shihni
në fund të fundit mund të zgjidhen me jo të gjithë se shumë rreshta të kodit.
Por me tha se, në aspektin e shkruar funksionin tuaj,
kuptojnë se C jep ju këtë aftësi.
>> Unë jam duke shkuar për të shkuar në kodin e sotme burim, e cila është në dispozicion tashmë në internet,
dhe unë jam duke shkuar për të shkuar përpara dhe të hapur up një program të quajtur funksioni 0.C,
dhe në funksion zero ne do të shohim disa gjëra.
Në linjat e parë 18 me 23 është funksioni im kryesor.
Dhe tani që ne jemi duke filluar për të lexuar Kodi që ne nuk jemi duke shkruar në fluturojnë,
por në vend të kësaj unë kam shkruar më parë ose që ju në një problem të caktuar
mund të marrë që ka janë shkruar paraprakisht.
Një mënyrë e mirë për të filluar lexuar kodin e dikujt tjetër
është të shikoni për funksion kryesor.
Kuptoj se ku se hyrja Çështja është për drejtimin e programit,
dhe pastaj ndiqni atë logjikisht nga atje.
>> Pra ky program dukje printime Emri juaj ndjekur nga një zorrë e trashë.
Ne pastaj të përdorin GetString nga biblioteka CS50
për të marrë një varg, apo një fjalë apo fraza nga përdoruesit në tastierë.
Dhe pastaj nuk ka kjo gjë PrintName here--.
>> Tani PrintName nuk është një funksion që vjen me C.
Kjo nuk është në io.h. standarde
Kjo nuk është në CS50.h.
Është më tepër në të njëjtën dosje.
Njoftim në qoftë se unë lëviz nëpër rreshta bit-- 25 të 27--
kjo është vetëm një mënyrë mjaft të komentuar Kodi juaj duke përdorur yjet dhe ul.
Kjo është një multi-line komentoni, dhe kjo është vetëm
përshkrimi im në blu të ajo që e bën këtë funksion.
>> Për shkak se në linjat 28 përmes 31, Unë kam shkruar një funksion super të thjeshtë
emri i të cilit është PrintName.
Ajo merr si shumë Argumentet do të thoni?
Pra, një argument-- sepse nuk ka një të tillë Argumenti listuara brenda kllapa.
Lloji i cili është String.
Që do të thotë PrintName është si kjo kuti e zezë
apo funksion që merr si input një varg.
>> Dhe emri i atij String përshtatshme do të jetë Emri.
Jo S, jo N, por Emri.
Pra, çfarë do të bëni PrintName?
Është e thjeshtë e bukur.
Ashtu si një linjë e kodit për printf, por me sa duket ajo
printime nga "Përshëndetje," kështu dhe kështu.
Ku kështu dhe kështu vjen nga argumentit.
>> Tani kjo nuk është një risi e madhe këtu.
Vërtet, unë kam marrë një program që do të mund janë shkruar me një linjë të kodit
duke vënë këtë deri këtu, dhe ndryshuar atë për diçka
që përfshin disa gjashtë apo shtatë apo më shumë rreshta të kodit të gjithë rrugën poshtë këtu.
>> Por është praktikimi i një Parimi i njohur si abstraksion.
Lloji i encapsulating brenda një të ri funksion që ka një emër, dhe më të mirë
por që emri fjalë për fjalë thotë atë që bën.
Unë do të thotë printf-- se nuk është e veçanërisht përshkruese.
Nëse unë dua të krijuar një copë mister, ose në qoftë se unë
duan për të krijuar një funksion që printon emrin e dikujt,
bukuria e bërë këtë është se unë mund të vërtetë
japin atë funksion një emër që përshkruan atë që bën.
>> Tani ajo merr në një input që Unë e kam quajtur në mënyrë arbitrare emrin,
por se edhe është mrekullisht përshkrues në vend të qenë një më pak
generic si S. dhe pavlefshme, tani për tani, thjesht do të thotë
se ky funksion nuk ka dorë me mbrapa asgjë.
Ajo nuk është si GetString se fjalë për fjalë duart më prapa një varg
si ne e bëmë me copa letre me shokët e klasës tuaj javën e kaluar,
por ajo vetëm ka një efekt anësor.
Printon diçka në ekran.
>> Deri në fund të ditës, nëse I bëjnë funksion-0, ./function-0,
ne do të shohim se ai e kërkon për emrin tim.
Unë lloji Davidin, dhe ajo lloje jashtë emrin tim.
Nëse unë bëjë atë përsëri me Rob, ajo do të thotë "Pershendetje, Rob."
Pra, një ide e thjeshtë, por ndoshta nxjerrim nga kjo mendërisht
se si programet tuaja të merrni pak më e komplikuar,
dhe ju doni të shkruani një pjesë e Kodi dhe thirrje që code-- kërkoj
që code-- nga disa përshkrues përmendur si PrintName,
C nuk na përballojë këtë aftësi.
>> Ja një tjetër shembull i thjeshtë.
Për shembull, në qoftë se unë të hapur një paraqesë nga sot quhet return.c,
vini re atë që unë kam bërë këtu.
Shumica e këtij funksioni kryesor është printf.
Për herë të parë në mënyrë arbitrare të nisja një variable quajtur x me numrin 2.
Unë pastaj të shtypura nga "x është tani % I "kalon në vlerën e x.
Kështu që unë jam vetëm duke thënë atë që është.
>> Tani unë jam vetëm guxim duke pretenduar me printf.
Unë jam cubing atë vlerë të x, dhe unë jam i duke bërë kështu që duke e quajtur një funksion
quhet kalimi kubike në x si argumenti,
dhe pastaj të shpëtuar e prodhimit në variablin vetë, x.
Kështu që unë jam clobbering vlerën e x.
Unë jam thelbësor vlera e x me çfarëdo
rezultat i quajtur ky funksion kubike është.
Dhe atëherë unë vetëm të shtypura nga disa sende gëzof këtu duke thënë atë që kam bërë.
>> Pra, atë që atëherë është kubike?
Vini re se çfarë është në thelb të ndryshme këtu.
Unë e kam dhënë funksionin një emër si më parë.
Unë e kam dhënë një emër për një argument.
Këtë herë ajo e quajtur n në vend të emrit, por unë mund të telefononi atë çdo gjë që unë dua.
Por kjo është e ndryshme.
Kjo gjë në të majtë.
Më parë ajo ishte ajo fjalen?
Boys.
Tani është e qartë int.
>> Pra, çfarë është ndoshta heq?
Ndërsa të tregon pavlefshëm lloj mosqenie, dhe se ishte rasti.
PrintName kthyer asgjë.
Ai e bëri diçka, por ajo nuk ka dorëzuar me mbrapa
diçka që unë mund të vënë në majtë anën e një shenjë barazimi
si unë kam bërë këtu në linjë 22.
>> Pra, nëse unë them në on line 30, çfarë është se ndoshta duke nënkuptuar
për atë kubike bën për mua?
Po?
Ajo kthehet një numër të plotë.
Pra, duart më mbrapa, për shembull, një copë letër
në të cilën ai e ka shkruar përgjigjen.
2 cubed, ose 3 cubed, ose 4 cubed-- çdo gjë që unë kaloi në,
dhe si e kam zbatuar këtë?
E pra, vetëm n herë n herë n është se si unë mund të kubike një vlerë.
Pra, përsëri, super e thjeshtë ide, por demonstrative
tani si mund të shkruani funksionet që në fakt na kishte mbrapa
vlerat që mund të jenë me interes.
>> Le të shikojmë një shembull i fundit këtu quhet funksion një.
Në këtë shembull, ai fillon për të marrë më shumë bindëse.
Pra, në funksion një, kjo Njoftimi program-- në fund të fundit
quan një funksion të quajtur GetPositiveInt.
GetPositiveInt nuk është një funksion në bibliotekë CS50,
por ne kemi vendosur ne do të donte që ajo të ekzistojë.
>> Pra, nëse ne lëvizni poshtë më vonë në dosje, vini re se si unë shkova për zbatimin
merrni int pozitiv, dhe unë thonë se është më bindëse
sepse kjo është një të mirë Numri i linjave të kodit.
Kjo nuk është vetëm një budalla pak program lodër.
Është në fakt mori disa error checking dhe duke bërë diçka më të dobishme.
>> Pra, nëse ju nuk e keni parë walkthrough videos që kemi ngulitur në pset1,
e dinë se kjo është një lloj i lak në C, të ngjashme në frymë
për llojet e gjërave Scratch mund të bëjë.
Dhe të bëjë thotë e bëjnë këtë.
Print this out.
Pastaj të shkojnë përpara dhe për të marrë n-- të marrë një int dhe ruajtur atë në n,
dhe të vazhdojmë të bëjmë këtë përsëri dhe përsëri dhe të përsëri aq sa n është më pak se një.
>> Kështu n do të jetë më e vogël se një vetëm nëse njeriu nuk është duke bashkëpunuar.
Nëse ai ose ajo është e shtypur në 0 ose -1 apo -50,
ky lak do të mbajë ekzekutimin përsëri dhe përsëri.
Dhe në fund të fundit të vini re, unë thjesht kthimin e vlerës.
Deri tani ne kemi një funksion që do të kemi qenë e bukur
nëse CS50 do të zbatojë në CS50.h dhe CS50.c për ju,
por këtu ne mund tani zbatuar këtë veten.
>> Por dy komente mbi disa detaje kyçe.
One-- pse unë deklaroj int n, a mendoni, on line 29
në vend të vetëm duke bërë kjo ketu, i cili është
më shumë në përputhje me çfarë kemi bërë javën e kaluar?
Po?
Një mendim i mirë.
Pra, nëse ne do të vënë atë këtu, është sikur ne
mbani deklaruar atë përsëri dhe përsëri.
Kjo në vetvete është jo problematike, në vetvete,
sepse ne kemi nevojë vetëm vlera e një herë dhe pastaj të
ne jemi duke shkuar për të marrë një të re anyway.
Por një mendim i mirë.
Po?
>> Mbylle.
Pra, për shkak se unë kam deklaruar n në Linja 29 jashtë lak,
është e arritshme në të gjithë tërë ky funksion.
Jo funksionet e tjera, sepse n është ende në brendësi të këtyre kaçurrel
formatimin e teksteve këtu.
So-- sigurt.
>> Pikërisht.
Pra, kjo është edhe më me vend.
Nëse ne vend deklaroi n të drejtë këtu në linjë 32,
kjo është problematike për shkak mend ku tjetër kam nevojë për të hyrë në të?
Top 34, dhe rregull të thjeshtë e pranoj është
që ju mund të përdorni vetëm një variabël brenda formatimin e teksteve më të fundit kaçurrel
në të cilën ju të deklaruar atë.
>> Për fat të keq, Linja 34 është një linjë shumë vonë,
sepse unë e kam mbyllur tashmë mbajtëse kaçurrel on line 33
që korrespondon me mbajtëse kaçurrel në linjë 30.
Dhe kështu kjo është një mënyrë për të thënë se ky int variabël është scoped,
mënyrë që të flasin, për vetëm brenda e këtyre formatimin e teksteve kaçurrel.
Ajo thjesht nuk ekziston jashtë tyre.
>> Pra, me të vërtetë, po e bëra këtë gabuar, më lejoni të ruajtur kodin
siç is-- shkruar gabimisht.
Më lejoni të shkoj përpara dhe të bëjnë funksion-1, dhe gabim notice--.
Përdorimi i identifikues n padeklaruar on line 35, e cila është e drejtë këtu.
Dhe nëse shkoni lart më tej, një tjetër.
Përdorimi i pashpallur Identifikuesi n on line 34.
>> Pra përpilues, tingëllimë, është vërejtur se ajo vetëm
nuk ekziston edhe pse në mënyrë të qartë se është atje me sy.
Pra një fix thjeshtë është deklaruar aty.
>> Tani më lejoni të shkoni te krye të file.
Ajo që në hedhje nga ju si duke qenë pak më ndryshe
nga gjëra kemi shikuar në javën e fundit?
Jo vetëm që kam emrin, jo vetëm që Unë kam disa të mprehtë përfshin deri të lartë,
Unë kam diçka që unë jam duke e quajtur një prototip.
Tani që duket jashtėzakonisht e ngjashme me atë që ne vetëm e pa një moment më parë në linjë 27.
>> Pra, le të konkludoj nga një tjetër mesazh gabimi pse unë e kam bërë këtë.
Më lejoni të shkoj përpara dhe të fshini këto rreshta aty.
Dhe kështu ne e dimë asgjë për prototip.
Xhirim këtë fotografi.
Bëni një funksion.
Dhe tani, mallkuar, katër gabime.
Le të shkoni deri në një të parë.
>> Deklarata e nënkuptuar e funksionit merrni int pozitiv është i pavlefshëm në C99.
C99 thjesht do të thotë vitit 1999 Versioni i gjuhës
C, e cila është ajo që ne jemi me të vërtetë duke përdorur.
Pra, çfarë do të thotë kjo?
Well C-- dhe më konkretisht C compilers-- janë programe goxha memec.
Ata vetëm e di atë që ju keni u tha atyre, dhe kjo është
në fakt tematike nga java e fundit.
>> Problemi është se në qoftë se unë shkoj në lidhje me zbatimin emrin deri këtu,
dhe unë e quaj një funksion të quajtur GetPositiveInt këtu në linjë 20,
se funksioni teknikisht nuk ekzistojnë deri përpiluesit e sheh linjë 27.
Për fat të keq, përpiluesit është duke bërë gjëra të lartë, poshtë, majtas, djathtas,
kështu për shkak se ajo nuk e ka parë zbatimi i GetPositiveInt,
por ajo e sheh se ju duke u përpjekur ta përdorin atë deri këtu,
ajo është vetëm do të bail-- çirrem në ju me një gabim message-- ndoshta
i fshehtë, dhe jo të vërtetë përpiloni file.
>> Pra, një të ashtu-quajtur prototip up këtu është pa dyshim i tepërt.
Fjalë për fjalë, unë shkova poshtë këtu dhe unë kopjuar dhe ngjit këtë, dhe kam vënë atë deri këtu.
Void do të ishte më e duhur, kështu që ne do të fjalë për fjalë kopjoni dhe ngjisni atë në këtë kohë.
Unë fjalë për fjalë kopjuar dhe ngjit atë.
Me të vërtetë ashtu si si një thërrime bukë.
>> Një e dhënë pak për përpiluesit.
Unë nuk e di se çfarë e bën këtë ende, por unë jam duke premtuar për ju
se ai do të ekzistojë në fund.
Dhe kjo është arsyeja pse kjo linjë të në Linja 16-- përfundon me pikëpresje.
Është e tepërt me dashje.
Po?
>> Nëse ju nuk i lidhi bibliotekën tuaj të the-- oh, pyetje e mirë.
Sharp përfshin header fotografi inclusions.
Nevoja për të be-- duhet pothuajse gjithmonë të jetë në krye
i dosjes për një similar-- për pikërisht të njëjtën arsye, po.
Sepse në standarde io.h është fjalë për fjalë një linjë
si kjo, por me fjalën printf, dhe me argumentet e saj dhe llojit të saj të kthimit.
Dhe kështu duke bërë të mprehta të përfshijë deri këtu, ajo që ju jeni të vërtetë duke bërë
është kopjimi dhe pasting përmbajtjen e dikush tjetër ka shkruar deri të lartë.
Në këtë mënyrë cluing kodin tuaj në të Fakti që ato funksione ekzistojnë.
Po?
>> Absolutisht.
Pra, një shumë të zgjuar dhe korrekte Zgjidhja do të jetë, ju e dini se çfarë?
Unë nuk e di se çfarë një prototip është, por unë e di
në qoftë se unë e kuptoj se C është vetëm memec dhe rethinks lartë deri në fund.
E pra le të japë atë çfarë ajo dëshiron.
Le të prerë atë kod, ngjitur lart lartë, dhe tani rrëzoj poshtë kryesore.
Edhe kjo do të zgjidhë problemin.
>> Por ju mund shumë lehtë të dalë me një skenar në të cilin një nevojë për të thirrur B,
dhe ndoshta B thërret përsëri në A. Kjo është diçka që quhet recursion,
dhe ne do të kthehen me atë.
Dhe kjo mund ose nuk mund të jetë një e mirë gjë, por ju mund të patjetër
të thyer këtë zgjidhje.
>> Dhe për më tepër, unë do pretendojnë stilistikisht,
sidomos kur programet tuaja bërë këtë gjatë dhe kjo e gjatë,
kjo është vetëm super i përshtatshëm për të vënë kryesor në krye
sepse kjo është gjëja më e programuesit do të kujdeset për.
Dhe kështu që është një pastruese pak, ndoshta, për të bërë atë mënyrë
Unë fillimisht e bëri atë me një prototip edhe
edhe pse kjo duket pak tepërt në shikim të parë.
Po?
Na vjen keq, mund të ju them se më fort?
>> Nëse ju kaloni vendet e zbatimi dhe prototip?
Pra, kjo është një pyetje e mirë.
Nëse ju ri-deklarojë këtë poshtë këtu, le të shohim se çfarë ndodh.
Pra, nëse unë vënë këtë poshtë këtu, ju jeni duke thënë.
Oh, më vjen keq.
Më fort?
Edhe më fort.
Oh, pyetje e mirë.
A do të zhvlerësojë funksionin?
Ju e dini, pas gjithë këtyre viteve, unë kurrë nuk kanë vënë një prototip më pas.
Pra, le të bëjë të bëjë funksion-1 pas duke bërë që.
>> [Pëshpëritje]
DAVID J. Malan: Oh, prisni.
Ne ende kemi për të vënë çdo gjë deri të lartë.
Pra, le ta bëjmë këtë deri këtu, në qoftë se unë jam i kuptuar pyetjen tuaj të saktë.
Unë jam vënë çdo gjë, duke përfshirë edhe prototip sipër kryesore,
por unë jam vënë prototip poshtë implementimit.
>> Pra, nëse kam bërë një të tillë, unë jam marrë përsëri një n error-- papërdorur ndryshueshme.
Oh, atje.
Ju faleminderit.
Le të shohim, ne të shpëtoj prej kësaj.
Kjo është një bug të ndryshme, kështu që le të injorojnë se.
Le të vërtetë shpejt xhirim këtë.
>> OK, kështu që të dhënat nuk argumenti përdorur nga format String
n-- oh, kjo është për shkak se I ndryshuar me këto këtu.
Në rregull, ne e dimë se çfarë përgjigje do to-- të gjithë të drejtë, këtu ne do të shkojmë.
Ah, faleminderit për pozitiv.
Në rregull, unë do të rregullojmë këtë kod after-- injorojë këtë bug të veçantë
pasi kjo was-- ajo punon është përgjigje.
>> Pra, kjo nuk do të prishësh atë që e kam bërë vetëm.
I dyshuari përpiluesit është shkruar në mënyrë të tillë
se ajo është injoruar prototip tuaj për shkak të trupit, kështu që të flasin,
nga funksioni ka tashmë është zbatuar deri më të lartë.
Unë do të duhet të vërtetë të konsultohet manual i përpiluesit
për të kuptuar nëse ka ndonjë tjetër Implikimi, por në shikim të parë
vetëm duke u përpjekur dhe eksperimente, nuk duket të ketë asnjë ndikim.
Pyetje e mirë.
>> Pra, le të ecur përpara tani, duke lëvizur larg nga efektet anësore të cilat
janë funksione që bëjnë diçka si vizualisht në ekran me printf,
por nuk do të kthehen një vlerë.
Dhe funksionet që kanë kthim Vlerat si ne vetëm e pa disa.
Ne tashmë e panë këtë nocion të fushës, dhe ne do të shohim këtë përsëri dhe përsëri.
Por tani për tani, përsëri, përdorni sundimin e gishtit
se një variabël mund të përdoren vetëm brenda të hapur kohët e fundit
dhe formatimin e teksteve kaçurrel mbyllura si ne e pa në këtë shembull të veçantë.
>> Dhe si ju vuri në dukje, ka një ability--
ju mund të zgjidhë disa nga këto probleme duke shënuar me një ndryshore globale
në krye të një file.
Por në shumicën e rasteve ne do të shfryj mbi se,
dhe në të vërtetë nuk shkojnë edhe në atë zgjidhje për tani.
Kështu që tani për tani, takeaway është se Variablat e kanë këtë nocion të fushës.
>> Por tani le të shohim në një tjetër Mënyra e thatë të vërtetë në kërkim
në disa goxha interesante Detajet e zbatimit.
Se si ne mund të paraqesin informacione.
Dhe ne tashmë shikuar këtë në javë parë të klasës.
Duke parë në binare, dhe kujtuar veten e dhjetore.
>> Por kujtohet nga java e fundit që C ka lloje të ndryshme të të dhënave dhe rrush më shumë,
por ato më të dobishme tani për tani mund të jetë këto.
Një char, ose karakter, e cila ndodh të jetë një bajt, ose tetë bit totale.
Dhe kjo është për të thonë se me madhësinë e një char është vetëm një bajt.
Një bajt është tetë bit, kështu që kjo do të thotë që ne mund të përfaqësojë si shumë karaktere.
Sa letra ose simbolet në tastierë
në qoftë se ne kemi një bajt apo tetë bit.
Mendoni përsëri për javën zero.
Nëse ju keni tetë bit, sa vlera totale
mund të paraqesin me modelet e zero dhe ato?
One-- më shumë se kaq.
Pra, 256 gjithsej, nëse ju të fillojë numërimi nga zero.
Pra, nëse ju keni tetë bits-- kështu që nëse ne kishte bulbs tona binare këtu përsëri,
ne mund të kthehet këto llamba në dhe jashtë në ndonjë nga 256 modele unike.
>> Tani kjo është pak problematike.
Jo aq shumë për gjuhën angleze dhe gjuhë romanca, por sigurisht
kur ju prezantoj, për shkallës, gjuhë aziatike, të cilat
kanë shumë më shumë simbole se si 26 shkronjat e alfabetit.
Ne në të vërtetë mund të kenë nevojë më shumë se një bajt.
Dhe fatmirësisht në vitet e fundit ka shoqëri
Standardet e miratuara të tjera që përdorin më shumë se një bajt për ngarkuar.
>> Por tani për tani në C, default është vetëm një bajt apo tetë bit.
Një numër i plotë, ndërkohë, është katër bytes, i njohur ndryshe si 32 bit.
Që do të thotë ajo që është më e madhe të jetë e mundur Numri ne mund të përfaqësojë me një int
me sa duket?
Me një miliardë.
Pra, është e kater miliard japë ose të marrë.
2 në fuqinë 32th, nëse ne marrë asnjë numrat negative
dhe vetëm përdorni të gjitha pozitive numra, është e kater miliard
të japë ose të marrë mundësi.
Një noton, ndërkohë, është një lloj tjetër e tipit të të dhënave në C. Kjo është ende një numër,
por kjo është një numër real.
Diçka me një pikë dhjetore.
Dhe kjo rezulton se C gjithashtu përdor katër bytes
për të përfaqësuar vlerat lundrues pikë.
>> Për fat të keq si shumë lundrues Vlerat pikë ka në botë?
Sa numra të vërtetë janë atje?
Ka një pafund numrin, dhe për këtë çështje
ka një numër të pafund të integers.
Pra, ne jemi tashmë të lloj gërmimi vetes një vrimë këtu.
Ku me sa duket në computers-- në Programet më pak të shkruara në C më them--
vetëm mund të llogarisin të larta deri në kater miliard japë ose të marrë,
dhe lundrues vlerat pikë vetëm mund të duket
kanë disa sasi e fundme e saktësi.
Vetëm kaq shumë shifra pas Pika e tyre dhjetore.
>> Sepse, natyrisht, në qoftë se ju keni vetëm 32 bit,
Unë nuk e di se si ne jemi duke shkuar për të shkuar në lidhje me përfaqësojnë numbers-- vërtetë ndoshta
me lloje të ndryshme të modeleve.
Por ka me siguri një fundme Numri i modeleve të tilla,
kështu që këtu, gjithashtu, kjo është problematike.
>> Tani ne mund të shmangur problemin pak.
Nëse ju nuk përdorni një noton, ju mund të përdorni një të dyfishtë
në C, e cila ju jep tetë bytes, të cilat është modele mënyra më e mundshme të zero
dhe ato.
Por është ende e fundme, e cila do të jetë problematike në qoftë se ju shkruani software
për grafikë ose për teket formulat matematikore.
Kështu që ju mund të vërtetë dëshironi për të numëruar deri më e madhe se kaq.
Një kohë të gjatë long-- stupidly named-- është gjithashtu e tetë bytes, ose 64 bit,
dhe kjo është dy herë më gjatë si një int, dhe kjo është për një vlerë të gjatë integer.
>> Fact-- Fun nëse një int është katër bytes, sa kohë është një kohë të gjatë në C tipike?
Gjithashtu katër bytes, por një kohë të gjatë është tetë bytes,
dhe kjo është për arsye historike.
>> Por takeaway tani është vetëm se të dhënat e ka
për t'u përfaqësuar në një computer-- që është një pajisje fizike me energji elektrike,
kjo është në përgjithësi makinës ato zero dhe ones--
me sasi të fundme e saktësi.
Pra, çfarë është problemi atëherë?
>> Pra ka një problem i del nga shtrati numër i plotë.
Jo vetëm në C, por në kompjutera në përgjithësi.
Për shembull, në qoftë se kjo është një bajt vlerë një bit--
kështu që nëse kjo është e tetë bit-- gjitha të cilat janë numër një.
Çfarë numri është kjo përfaqësojnë nëse supozojmë
kjo është e gjitha vlerat pozitive në binar?
>> 255, dhe kjo nuk është 256, sepse zero është numri më i vogël.
Pra, 255 është më e larta një, por problemi
po mendoj se kam kërkuar për të rrisim këtë variabël që
është duke përdorur tetë bit gjithsej në qoftë se unë dua të rrisim atë.
>> Dhe sa më shpejt që të shtoj një një për të gjithë nga këta të,
ju ndoshta mund të imagjinohet visually-- vetëm si mbante një të përdorur decimals--
diçka që do të rrjedhin në të majtë.
Dhe me të vërtetë, në qoftë se unë të shtoni numrin një për këtë, çfarë ndodh në binar
është se ai është i mbushur plot kthehet në zero.
>> Pra, nëse ju nuk use-- vetëm një int, por një bajt vetme për të numëruar integers
në një program, nga default-- sa më shpejt që ju merrni për 250, 251, 252, 253, 254,
255-- 0 vjen pas 255, të cilat ndoshta nuk çfarë është
një përdorues do të presin.
>> Tani ndërkohë në lundrues pikë botën, ju gjithashtu kanë një problem të ngjashëm.
Jo aq shumë me number-- madh edhe pse kjo është ende një çështje.
Por me sasinë e saktësi që ju të mund të përfaqësojë.
Pra, le të marrin një vështrim në këtë shembull këtu edhe nga code-- sotme burim
noton-0.c.
>> Dhe vini re kjo është një super program i thjeshtë që
duhet me sa duket të shtypura nga çfarë vlerë?
Çfarë do të bast kjo do të shtypura edhe pse ka pak e sintaksës së re
këtu?
Kështu që shpresojmë se 0.1.
Pra, ekuivalente e një të dhjetën sepse unë jam duke bërë 1 të ndarë me 10.
Unë jam ruajtjen përgjigje në një ndryshore të quajtur f.
Kjo variabël është e tipit float, e cila është një fjalen Unë vetëm propozuar ekzistuar.
>> Ne nuk kemi parë këtë më parë, por kjo është lloj i një mënyrë i zoti në printf
për të përcaktuar se si shumë shifra të duan të shohin pas presjes dhjetore.
Pra, kjo simbol thjesht do të thotë që këtu është një placeholder.
Është për një pikë lundrues vlera, dhe oh, nga rruga,
tregojnë atë me të presjes dhjetore me një numër pas presjes dhjetore.
Pra, kjo është numri i shifrave të rëndësishme,
mënyrë që të flasin, që ju mund të dëshironi.
>> Pra më lejoni të shkoj përpara dhe të bëjë bërë noton-0, ./float-0,
dhe me sa duket 1 e ndarë nga 10 është 0.0.
Tani pse është kjo?
>> E pra përsëri, kompjuteri është duke marrë më fjalë për fjalë, dhe unë kam shkruar 1
dhe kam shkruar 10, dhe për të marrë me mend se çfarë është lloji supozohet të dhënave për ata dy
Vlerat?
Një int, kjo është teknikisht diçka pak më ndryshe.
Kjo është zakonisht një kohë të gjatë, por është e në fund të fundit një vlerë integrale.
Nuk është një vlerë lundrues pikë.
>> Që do të thotë se në qoftë se kjo është një int dhe kjo është një int,
problemi është që kompjuteri nuk kanë aftësinë
për të edhe të ruajtur atë pikë dhjetore.
Pra, kur ju bëni 1 e ndarë nga 10 duke përdorur numrat e plotë
për të dy numërues dhe Emërues, përgjigja duhet të jetë 0.1.
Por computer-- sepse ato janë integers--
nuk e di se çfarë të bëjë me 0.1.
>> Pra, çfarë është ajo në mënyrë të qartë duke bërë?
Është thjesht duke hedhur atë larg, dhe çfarë unë jam duke parë në fund të fundit
është 0.0 vetëm sepse kam insistuar që printf më tregoni një pikë dhjetore.
Por problemi është se në qoftë se ju ndarë një numër të plotë nga një numër i plotë,
ju do get-- sipas definicionit i C-- një numër të plotë.
Dhe kjo nuk do të bëjë diçka të mirë dhe të përshtatshme
si raundin atë deri në më të afërt e lart ose poshtë.
Ajo do të shkurtoj çdo gjë pas e dhjetore.
>> Pra thjesht intuitive, çfarë është ndoshta një fix?
Çfarë është fix thjeshtë këtu?
Po?
Pikërisht.
Pse nuk kemi vetëm të trajtojnë këto si lundrues Pikë në mënyrë efektive
i kthyer ato në gjithandej apo dyshe.
Dhe tani, nëse unë bëj të bëjë gjithandej-0, ose në qoftë se unë përpilojnë gjithandej-1,
cila është identike tek ajo që ishte propozuar vetëm.
Dhe tani unë bëj gjithandej-0, tani kam marrë 0.1 time.
>> Tani kjo është e mahnitshme.
Por tani unë jam duke shkuar për të bërë diçka pak më ndryshe.
Unë jam kurioz për të parë se çfarë është me të vërtetë ndodh nën kapuç,
dhe unë jam duke shkuar për të shtypur këtë jashtë për 28 vende dhjetore.
Unë dua të shoh me të vërtetë 0.1000-- një infinite--
[Padëgjueshme] 27 zero pas atij 0.1.
>> E pra le të shohim nëse kjo është ajo që unë me të vërtetë të marrë.
Bëni të njëjtën skedë është gjithandej-0.
./floats-0.
Le të zoom në në përgjigje dramatike.
E gjithë kjo kohë, ju keni qenë të menduarit 1 ndarë nga 10 është 10%, ose 0.1.
Kjo nuk është.
Të paktën deri më tani si kompjuter të shqetësuar.
>> Tani why-- OK, kjo është e plotë gënjeshtër 1 e ndarë nga 10 është 0.1.
Por why-- se nuk është sot takeaway.
Pra, pse kompjuteri mendoj, ndryshe nga të gjithë ne në dhomë,
se 1 e ndarë nga 10 është fakt se vlera e çmendur?
Çfarë është duke bërë sa duket kompjuter?
Çfarë është ajo?
>> Kjo nuk është të del nga shtrati, në vetvete.
Del nga shtrati është zakonisht kur ju përfundojë rreth një vlerë.
Është kjo çështje e jo saktësi në një vlerë lundrues pikë
ku ju vetëm keni 32 apo ndoshta edhe 64 bit.
Por në qoftë se ka një pafund Numri i numbers-- reale
numrat me pikë dhjetore dhe numrat thereafter-- siguri
ju nuk mund të përfaqësojë të gjithë ata.
Pra, kompjuteri ka dhënë ne ndeshjen më të afërt
me vlerën ajo mund të përfaqësojë përdorur se shumë bit të vlerës unë në fakt duan,
cila eshte 0.1.
>> Për fat të keq, në qoftë se ju fillojnë të bëjnë matematikë, ose ju
të fillojë që përfshin këto lloj lundrues Vlerat pikë në programs-- rëndësishëm
software financiare, asgjë ushtarake software--
ku perceptimi është ndoshta shumë e rëndësishme.
Dhe ju filloni duke shtuar numra si kjo, dhe të fillojnë të
drejtimin që software me inpute të vërtetë të mëdha
ose për shumë orë ose shumë i ditëve apo shumë vjet,
këto gabime të vogël pak me siguri mund të shtoni deri me kalimin e kohës.
>> Tani si një mënjanë, në qoftë se ju keni ndonjëherë parë Superman 3 ose Office Space
dhe ju mund të kujtojnë se si ata djemtë vodhi
një shumë të holla nga kompjuteri i tyre duke përdorur lundrues vlerat pikë
dhe duke shtuar pak mbetjet, me shpresë se filmi
tani e bën më shumë kuptim.
Kjo është ajo që ata ishin duke aluduar në atë film.
Fakti se më kompanitë nuk do të duken
pas një numër të caktuar e numra pas presjes dhjetore,
por ato janë fraksionet e cent.
Pra, ju filloni duke shtuar ato, ju filloni për të bërë një shumë të holla
në llogarinë tuaj bankare.
Pra, kjo është Office Space shpjegoi.
>> Tani për fat të keq përtej Office Space, ka
janë disa legjitime shqetësuese dhe ndikime të rëndësishme
e këtyre llojeve të Vendimet themel të projektimit,
dhe në të vërtetë një nga arsyet ne përdorim C gjatë
është në mënyrë që ju të vërtetë kanë këtë pikë deri kuptuar se si punojnë kompjuterat,
se si software punon, dhe nuk të marrë ndonjë gjë për të dhënë.
>> Dhe me të vërtetë për fat të keq, madje edhe me se kuptimi themelor,
ne njerëzit bëjnë gabime.
Dhe ajo që unë mendova se do të ndajnë është marrë këtu këtë video minutë tetë
nga një episod mrekulli moderne, e cila është një shfaqje edukative se si gjërat e punës
që pikturon dy foto e kur një përdorim i papërshtatshëm
dhe të kuptuarit e lundrues vlerat pikë
çoi në disa rëndësishëm Rezultatet e pafat.
Le të bëjmë një vështrim.
[VIDEO Playback]
-Ne tani kthehet në "Engineering Fatkeqësitë "në mrekulli moderne.
Kompjuter.
Ne kemi ardhur të gjithë për të pranuar Problemet shpesh frustruese që
mori me them-- bugs, viruset, dhe glitches-- software për çmime të vogla
për të paguar për lehtësi.
Por në të teknologjisë së lartë dhe shpejtësi të lartë aplikacione programore hapësirë ​​ushtarake dhe,
problemi më i vogël mund të të madhërohet në fatkeqësi.
>> Më 4 qershor 1996, shkencëtarët përgatitur për të nisur një pa pilot Ariane 5 raketa.
Ajo mbante shkencore satelitë projektuar
për të vendosur saktësisht se si Bashkëvepron magnetike e Tokës në terren
me erërat diellore.
Raketa ishte ndërtuar për Agjencia Evropiane Hapësirë,
dhe ngriti jashtë nga objekti i saj në bregdetin e French Guiana.
>> -Në Rreth 37 sekonda në fluturimit, ata së pari
diçka e re po shkonte keq.
Kjo nozzles u swiveling në mënyrë që ata me të vërtetë nuk duhet.
Rreth 40 sekonda, në fluturim, në mënyrë të qartë se automjeti ishte në telashe,
dhe kjo është kur ata bënë vendimi për ta shkatërruar atë.
Oficeri sigurisë varg, me guxim të jashtëzakonshme, shtypur butonin
dhe shpërtheu raketa para se të mund të të bëhet një rrezik për sigurinë publike.
>> -Kjo ishte beqare fluturim e 5 Ariane,
dhe shkatërrimi i saj mori vendin për shkak të metë
mishëruar në një softuer me raketa-së.
, Partia problemi më Ariane ishte se atje
ishte një numër që kërkohet 64 bit për të shprehur,
dhe ata donin për të kthyer kjo për një numër të 16-bit.
Ata supozohet se numri kurrë nuk do të jetë shumë i madh.
Se shumica e këtyre shifrave në numri 64-bit ishin zero.
Ata e kishin gabim.
>> , Partia paaftësia e një program software për të pranuar
lloj i numrit të gjeneruara nga një tjetër ishte në rrënjë të dështimit.
Software zhvillimit ishte bërë një pjesë shumë e kushtueshme të teknologjisë së re.
Ariane 4 raketa kishte qenë shumë i suksesshëm.
Pra, shumë e software krijuar për ajo është përdorur edhe në Ariane 5.
>> , Partia Problemi themelor ishte se Ariane 5.
U faster-- përshpejtuar të shpejtë, dhe të software nuk llogariten për këtë.
>> , Partia shkatërrimi i raketave ishte një fatkeqësi e madhe financiare.
Të gjitha për shkak të një gabimi minutë software.
Por ky nuk ishte i pari kohë probleme të dhënat e konvertimit
kishte pllakosur teknologji moderne raketë.
>> -Në 1991, me fillimin e Luftës së parë të Gjirit,
raketave Patriot përjetuar një lloj të ngjashme
e një problemi numër të konvertimit.
Dhe si rezultat 28 people-- 28 Soldiers-- amerikanë u vranë,
dhe rreth njëqind të tjerë u plagosën.
Kur Patriot, të cilat është dashur për të mbrojtur kundër Scuds hyrëse,
dështuar të zjarrit një raketë.
>> -Kur Iraku pushtoi Kuvajtin, dhe Amerika nisur Desert Storm në fillim të vitit 1991,
Bateri të raketave Patriot u vendosën për të mbrojtur Arabinë Saudite dhe Izraelin
nga sulmet e raketave Skud Irakut.
Patriot është një amerikan medium-varg tokë-ajër sistemit
prodhuar nga kompania Raytheon.
>> , Partia Madhësia e Patriot interceptorëve itself--
është rreth rreth 20 metra e gjatë, dhe peshon rreth 2.000 £.
Dhe ajo mbart një kokë rakete prej rreth, Unë mendoj se është rreth 150 £.
Dhe mbush rakete në vetvete është një eksploziv të lartë, i cili
ka fragmente rreth tij.
Pra, shtresë e jashtme e mbushje është projektuar për të vepruar si një buckshot.
>> , Partia raketa janë kryer katër për enë,
dhe të transportohen nga një rimorkio gjysmë.
>> , Partia sistemit Patriot kundër raketave shkon prapa të paktën 20 vjet tani.
Ajo ishte projektuar në fillim si një raketë të mbrojtjes ajrore
për të xhiruar poshtë aeroplanë të armikut.
Në Luftës së parë të Gjirit kur erdhi në këtë luftë,
Ushtria donte të përdorin atë për të xhiruar poshtë Scuds, jo aeroplanë.
Forca Irakut Air ishte jo aq shumë e një problemi,
por ushtria ishte i shqetësuar në lidhje me Scuds.
Dhe kështu ata u përpoqën të përmirësuar Patriot.
>> -Intercepting Një armik raketave udhëtojnë në Mach 5
do të jenë të vështira të mjaftueshme.
Por kur Patriot u nxituan në shërbim,
Ushtria nuk ishte në dijeni të një modifikim Irakut që
bërë scuds tyre gati e pamundur për të.
>> -Çfarë Ndodhur është e Scuds që vinin ishin të paqëndrueshme.
Ata ishin të tundet.
Arsyeja për këtë ishte e Iraqis-- në mënyrë që të merrni 600 kilometra jashtë
e një 300-kilometrash rreze missile-- mori peshë nga mbushje para,
dhe bëri mbushjen lehta.
Deri tani Patriot-së duke u përpjekur për të ardhur në Skud, dhe shumica e time--
shumica dërrmuese e time-- ajo do të fluturojnë vetëm nga Skud.
>> -Pasi Operatorët e sistemit Patriot realizuar Patriot humbur objektivin e saj,
ata shpërthyen kokë rakete atdhetari-së për të shmangur viktima të mundshme nëse ajo
u lejohet të bjerë në tokë.
>> -Kjo Ishte ajo që shumica e njerëzve e pa si fireballs të mëdha në qiell,
dhe keqkuptuar si kap e mbushjet e raketave Skud.
>> -Although Në qiellin e natës, patriotë duket të jetë shkatërruar me sukses
Scuds, në Dhahran nuk mund të jetë asnjë gabim në lidhje me punën e saj.
Ka sistem atdhetari së radar udhë humbur i një Skud në hyrje
dhe kurrë nuk filloi për shkak për një krisje software.
>> Ishte izraelitët që së pari zbuluar se sa më gjatë të sistemit ishte më,
më e madhe koha mospërputhje u bë.
Për shkak të një orë ngulitur në kompjuterin e sistemit.
>> -About Dy javë më parë tragjedi në Dhahran,
izraelitët raportuar Departamenti i Mbrojtjes
se sistemi humb kohë.
Pas rreth tetë orësh e drejtimin, ata vënë re
se duke u bërë sistemit të dukshëm më pak të sakta.
Departamenti i Mbrojtjes u përgjigj duke thënë të gjitha baterive Patriot
për të mos i lënë sistemet më për një kohë të gjatë.
Ata kurrë nuk e thanë atë që një kohë të gjatë ishte.
8 orë, 10 orë, një mijë orë.
Askush nuk e dinte.
>> , Partia bateri Patriot vendosur në kazermë
në Dhahran dhe e brendshme e saj me të meta ora kishte qenë në për më shumë se 100 orë
në natën e 25 shkurt.
>> -Ajo Gjurmuar kohë për një saktësi rreth një të dhjetën e një të dytë.
Tani një e dhjeta e një të dytë është një numër interesant
sepse ajo nuk mund të shprehet në binar saktësisht, të cilat
do të thotë që nuk mund të shprehet saktësisht në çdo kompjuter moderne digjitale.
Është e vështirë të besohet, por përdorin këtë si një shembull.
>> Le të marrin numër një të tretën.
Një e treta nuk mund të jetë shprehur në decimal saktësisht.
Një e treta është 0,333 vazhduar për pafundësi.
Nuk ka asnjë mënyrë për të bërë këtë me saktësi absolute në një decimal.
Kjo është pikërisht lloji i problemit që ndodhi në Patriot.
Sa më gjatë sistemit vrapoi, më keq koha gabim u bë.
>> -Pas 100 orë të operacionit, gabim në kohë ka qenë vetëm rreth një e treta
e një të dytë.
Por për sa i përket synimeve të dhënësit një raketave udhëtojnë në Mach 5,
rezultoi në një ndjekja gabim e mbi 600 metra.
Do të ishte një gabim fatal për ushtarët në Dhahran.
>> -Çfarë Ndodhi është një fillojë Skud ishte zbuluar nga satelitë të paralajmërimit të hershëm,
dhe ata e dinin një Skud po vinte në drejtim të tyre të përgjithshëm.
Ata nuk e dinë se ku po vinte.
Ajo tani ishte deri në radar pjesë përbërëse e sistemit Patriot
mbrojtur Dhahran për të gjetur dhe për të mbajtur udhë të raketave të armikut në hyrje.
>> -The radar ishte shumë i zgjuar.
Ajo do të ndjekur në të vërtetë pozita e Skud
dhe pastaj të parashikohet se ku ajo ndoshta do të jetë
herën tjetër radar dërguar një impuls jashtë.
Kjo u quajt porta varg.
>> -Pastaj Dikur Patriot vendos kohë të mjaftueshme ka
kaluar për të shkuar mbrapa dhe shikoni ardhshëm vend për këtë objekt zbuluar
ajo shkon prapa.
Pra, kur ai u kthye në gabim vend, ai atëherë nuk sheh ndonjë objekt.
Dhe vendos se nuk ka objekt.
Se ka pasur një zbulimin e rreme dhe ajo bie pista.
>> , Partia Skud në hyrje zhdukur nga ekrani i radarit,
dhe sekonda më vonë, atë përplas në fortesë.
Skud vrarë 28.
Ajo ishte e fundit shkarkoi gjatë Luftës së parë të Gjirit.
Tragjikisht, software updated arriti në agim të nesërmen.
Software metë kishte qenë fikse, mbylljes
një kapitull në trazuar Historia e raketave Patriot.
>> [VIDEO END rishikim]
>> DAVID J. Malan: Kjo është ajo për CS50.
Ne do të ju shohim të mërkurën.
>> [MUSIC Playing]