JASON HIRSCHHORN: Welcome të A5, të gjithë. Ne kemi një javë emocionuese përpara nesh, kryesisht për shkak se ka kaq shumë të reja përballet në këtë dhomë. Është e mrekullueshme. Një shumë prej jush jeni këtu rastësisht, e cila është edhe më mirë. Kështu që shpresojmë se ju do të mbani t'u bashkuar me ne. Këtë javë ne jemi duke shkuar për të shpenzuar pjesa më e madhe e seksionit përgatitur për quiz. Pra, për agjendën tonë, ne do të flasim pak për burime për klasë, por edhe për të quiz, dhe pastaj, përsëri, shpenzojnë pjesën më të madhe të klasit të folur për pyetje. Pasi ne jemi duke bërë përgjigjur tuaj pyetje, ose në qoftë se pyetjet tuaja natyrshëm na çojë në disa kodim, unë kanë probleme mostër nga midterms kaluara që ne do të kodojnë jetojnë në nenin së bashku që të sjellë deri disa të tjera Tema të mira për të mbuluar. Pra, së pari, siç e kemi kaluar nëpër të dy javëve të shkuara për të ju kujtoj djema, ka një ton të burimeve në dispozicion për këtë kurs. Shumë prej tyre do të jetë tepër e dobishme për ju si ju vazhdoni të studiuar për quiz 0, sepse kjo është të martën pasdite. Pra, të gjithë ju kanë qenë studiuar për një grimë. Ka shënime leksion dhe burimi kodin që ju duhet patjetër të shikoni. Watch pantallona të shkurtra. Kontrolloni study.cs50.net. Dhe pastaj, të shënuara më poshtë, një numër e burimeve të tjera. Përsëri, quiz 0 është nesër në ora 1. Nëse ju nuk e keni bërë deri tani, kontrolloni jashtë Rreth Quiz 0 dokumentit për homepage kurs për të kuptoj se ku ju jeni duke marrë quiz. Quiz fillon at 1:10 dhe përfundon 70 minuta më vonë. Pra, nëse ju të tregojë deri pas 1:10 ju jeni do të merrni se shumë pak minuta shumë se 70 për të marrë quiz. Pra, sigurohuni që ju jeni atje në kohë. Nëse ju jeni një student zgjerim ose kanë disa konsiderata të tjera të testimit, ajo mund të mos jetë në 1:00 nesër. Por përsëri, kontrolloni Rreth Quiz 0 dokumentojnë për t'u siguruar që ju e dini kur ju jeni duke marrë quiz. I shkroi 75 minuta deri këtu. Unë mendoj se është e drejtë jo, 70. Ai mbulon të gjithë materialin nga një javë 0 në leksionin e javës së kaluar të mërkurën. Dhe përsëri, për këtë quiz, per se dokument, ju merrni një dy anë dhe 8 1/2 nga 11 fletë letre që ju të merrni për të përdorur si shënime gjatë quiz. Shumë njerëz, në mos shumica e njerëzve, kanë gjetur se mënyra e vetme më e dobishme për të studiuar për quiz është që të të bëjë një fletë studim, një një-sider, e tyre. Pra, shikoni në ato të fundit, nëse ju keni parë ato të kaluara. Të arritur deri te miqtë për të parë atë ata janë vënë në tyre. Por duart-down, mënyra më e mirë që ju mund të Studimi është që të kalojnë nëpër çdo gjë dhe pres me thikë atë poshtë për atë që duhet apo duhet nuk i përkasin në atë fletë të letër, sepse kjo është vetëm një të vërtetë mënyrë e dobishme për ju për të siguruar ju jeni do me çdo gjë dhe kanë disa familjaritet me të. Shumica e njerëzve, ne gjejmë, edhe pse ata kanë fletë letre ulur të drejtë pranë tyre në quiz, nuk do të kthehet për të, për shkak se, përsëri, se shumë Procesi i kalon informacionit i ka ndihmuar ata të mësojnë atë. A ka dikush ndonjë pyetje rreth quiz 0? Ka të gjithë - Unë nuk jam duke shkuar për të bërë një shfaqje e duarve. S'ka gjë Unë do të pyes kush filloi duke studiuar. Por unë nuk dua të bëj ty të gjithë nuk ngrenë duart tuaja. Pra, si i tha - po, Avi, të shkojnë përpara. AVI: Çfarë do të ishte një gjë e dobishme për të vënë në një të pager? STUDENT: Kjo është deri te ju. JASON HIRSCHHORN: Ju merrni për të përdorur gjykimin tuaj. Gjëra të dobishme për të vënë në një të pager, në qoftë se jeni të hutuar në lidhje me e madhe O Runtime të llojeve të ndryshme të kërkimeve dhe llojet, që vënë në atje në një Grafiku i dobishëm i shkëlqyer. Në këtë mënyrë, nëse ju jeni duke kërkuar që në quiz, ju nuk keni nevojë që të përpiqen dhe figura ajo jashtë apo arsye nëpërmjet duhur. Ju vetëm mund të kopjoni atë. Nëse ju shikoni në kuize kaluarën, shumë herë, nuk është drejtimin e pyetjeve në kohë. Kështu që do të ishte një shembull i një të mirë gjë për të vënë në tuaj një të pager. Gjëra të tjera të mira për të vënë në, në qoftë se ju jeni hutuar për mënyrën se si për të deklaruar një funksioni ose çfarë pjesë të ndryshme të Deklarata funksioni janë, shkruani që atje, një version generic dhe pastaj ndoshta një shembull. Nëse jeni të hutuar për pointers, një diagram se si pointers puna është ndoshta me të vërtetë të dobishme. Nëse jeni të hutuar për recursion, a mostrës funksion gjithkund rekursive në atje mund të provojë të jetë me të vërtetë të dobishme. A do të ju jap disa ide? AVI: Ju duhet të kuptoni gjithë procesi që përpiluan, si se si të gjitha veprat? JASON HIRSCHHORN: Çdo gjë që ka qenë e mbuluar mund të shfaqen në quiz. Pyetje - por përsëri, disa gjëra do të jetë i peshuar rëndë se të tjerët. Disa gjëra kanë dalë përsëri dhe përsëri në klasë, në leksion, dhe seksioni. Gjëra të tjera nuk kanë dalë që shpesh. Ne kemi folur shumë për # përfshijnë dhe -L diçka dhe atë që ata do të thotë në proces hartimi. Ne kemi folur shumë për gdb, kapem, ato flamuj të ndryshme që ne përdorim kur ne përpilojnë diçka, dhe çfarë make15, për shembull, me të vërtetë do të thotë dhe të vërtetë ka. Ne nuk flasim sa më shumë rreth çdo hap të vetëm në proces hartimi. Ne kemi folur ende për të. Pra, kjo është ende diçka që ju duhet të jenë të njohur me të. Por përsëri, ne nuk do të jetë - gjëra që dalin më shpesh në klasë kanë më shumë gjasa për të dalë më shumë shpesh dhe të jetë më i rëndë ponderuar në quiz. Ftohtë. Çdo pyetje të tjera rreth quiz 0? OK, kështu që kam vënë një listë të Temat në bord. Unë shkova me planin mësimor. Unë shkova përmes seksionit të shqyrtimit nga natën e kaluar dhe ato slides për të dalë me një listë jo shterruese e temave që ne kemi mbuluar deri më tani në CS50 dhe gjëra që mund shfaqen në quiz. Kështu që unë nuk jam do të kalojnë nëpër çdo një të vetme prej tyre. Kjo do të marrë shumë më tepër kohë sesa që kemi tani. Por unë vënë këtë deri këtu për shpresë goditje e lehtë kujtesën tuaj, si për të gjëra që mund të ose nuk mund të jetë aq i njohur me ju. Dhe unë do të të duan të shpenzojnë më të madhe të Seksioni përgjigjur pyetjeve tuaja në lidhje me këto tema, tema që nuk janë të përfshira këtu. Ne mund të shkruani pseudo kodin. Ne mund të shkruani kodin e vërtetë për të siguruar që ju të - Unë mund të përgjigjem pyetjes tuaj dhe për të ndihmuar të gjithë e kuptojnë krejtësisht një Shumë nga këto tema kështu që ju do të ndiheni përgatitur dhe të rehatshme duke shkuar në nesër quiz. Pra, lexoni mbi listën. Ju shpresojmë se keni ardhur në nenin me disa pyetje si. Kur të jeni gati, ngrini dorën dhe ne do të ketë filluar. Mbani në mend, pyetjet që ju keni, nuk ka pyetje budallaqe. Ne e kemi dëgjuar se shumë. Dhe pyetjet që ju keni, unë jam i gatshëm për bast, shumë njerëz të tjerë të dy ulur këtu dhe shikuar Online kanë si. Kështu që ju mund të ndihmojë vetëm njerëzit duke bërë pyetje. Marcus. MARCUS: Në mes të rafte dhe tog, a ka një para-ndarë përqindja e kujtesës që është definuar si kjo eshte per pirg ose për grumbull? Ose si e bën atë punë, saktësisht? JASON HIRSCHHORN: pyetje e Madhe. Unë jam duke shkuar për të mbështetur pak gjurmë. A të gjithë - ju lutem jetë i sinqertë këtu. Unë e di unë jam duke kërkuar që ju të rritur tuaj dora para kolegët tuaj. Por a ka njerëz që ndihen pakëndshme me rafte dhe tog dhe do të donte për të shqyrtuar se dhe çfarë ata do të thotë? Ngritja dorën tuaj nëse - OK. Falemnderit. Pra, ne jemi duke shkuar për të shkuar mbi rafte dhe grumbull të vërtetë shpejt dhe më pas të shkojë në përgjigjur pyetjes tuaj. Pra, në qoftë se ne të nxjerrë një kuti për të përfaqësuar kujtesës në kompjuterin tuaj, cilat janë disa gjëra që shkojnë në këtë kuti? Kryesor. Një funksion kryesor. Ku kryesor të shkojnë? STUDENT: [padëgjueshme]. JASON HIRSCHHORN: Pra, ne do të vënë poshtë këtu kryesor. Çfarë tjetër shkon në këtë kuti? STUDENT: Funksionet që ju telefononi. Jason Hirschhorn: Funksionet që ne e quajmë. Dhe ku mund ata të shkojnë? STUDENT: Në rafte. JASON HIRSCHHORN: Ata shkojnë në rafte. Pra, ne jemi duke shkuar për të thirrur këtë gjë e poshtë këtu rafte. Dhe deri të lartë, ne kemi tog. Pra, kujtesa nuk është një kuti të vetëm si kjo. Por në fakt është shumë e ngjashme. Ajo do të jetë një shumë e kutive mbi dhe mbi, në varësi se si e madhe tuaj kompjuteri është apo sa i madh është kujtesën tuaj. Në quote-mbyll thonjëzat "fund" është pirg. Dhe ka gjëra të shumta që shkojnë në rafte. Dhe ata të varet nga funksionet ju keni në kodin tuaj. Ju gjithmonë kanë një funksion në tuaj Kodi quajtur kryesor, kështu që ka gjithmonë një Seksioni poshtë këtu në rafte të përkushtuar për të kryesore. Këto seksione në rafte quhen korniza rafte. Kur ju telefononi një funksion tjetër, thonë kryesore e quan një funksion kërkimi binar, ne kemi vënë një tjetër kornizë në rafte. Më konkretisht, ne do të dhurojë një pjesë të kujtesës mbi tona kompjuter për të ruajtur binar kërkim të lokale variablave dhe për të drejtuar binare Kodi kërko. Kështu që ne e quajmë kërko binar. Në këtë copë të kujtesës, ne jemi duke shkuar për të ruajtur e saj variablat lokale. Ne jemi duke shkuar për të ruajtur thirrjet e saj printf. Çfarëdo që të ndodhë, se funksioni është do të ruhen të drejtë atje. Kërko binar është duke shkuar për të ekzekutuar. Ajo është duke shkuar për të përfunduar ekzekutimin. Çfarë është fjala në C që nënkupton që një funksion duhet të përfunduar zbatimin e tij? STUDENT: Kthimi. JASON HIRSCHHORN: Kthehu. Pra, sa herë që ju të shihni një deklaratë të kthimit, skajet funksion kur ajo godet atë. Kërko Pra binar do të goditur kthimin e tij. Kjo pjesë e kujtesës do të në thelb të lirohen deri. Dhe kryesor do të kthehem në ekzekutimin. Pra kryesor do të bëj një pauzë kudo që ishte, thirrje kërko binar, të merrni disa kthimi i vlerës, dhe vazhdojnë ekzekutimin. Kjo kornizë pirg do të shkojnë larg. Nëse ne e quajmë një funksion gjithkund rekursive, të cilat është një funksion që e quan veten mbi dhe mbi, ne mund të merrni - thonë se ne bëri kërko binar Recursively. Ne mund të merrni versionin e kërkimit binar një, kërko binar dy, kërko binar tre, kërko binar katër, kërko binar pesë. Dhe pastaj këtë kërkim përfundimtar binar pesë do të goditur rastin bazë, dhe rafte korniza do të shkojnë prapa dhe për të mbajtur mbylljen derisa ne të kthehemi në kryesore. Ne mund të shkojë mbi recursion në një grimë. Por e gjithë kjo do të thotë, nëse ju jeni duke e quajtur funksione të shumta në një kohë, do të ketë rafte të shumta korniza në rafte. Grumbull, nga ana tjetër, deri këtu, nuk është për funksionet, jo për variablat lokale. Është e ndarë në mënyrë dinamike variablave. Pra, këto janë variablat që mund të jenë initialized në qoftë kryesor ose një funksionojnë që thirrjet kryesore. Kudo në kodin tuaj, ata mund të niset. Dhe nisja e një dinamike ndarë ndryshueshme. Ajo që funksion në C i përdorim? STUDENT: malloc. JASON HIRSCHHORN: malloc. Ju telefononi malloc. Ju merrni një hapësirë ​​të kujtesës. Dhe kjo hapësirë ​​e kujtesës është në grumbull. Dhe kjo hapësirë ​​e kujtesës qëndron aty derisa të telefononi pa pagesë. Variablat Pra alokuara dinamike në grumbull do të ekzistojnë për aq kohë sa ju duam që ata të ekzistojnë, dhe ata nuk do të të shkojë larg deri në ju në mënyrë të qartë tregoni atyre për të shkuar larg. Ju mund të krijoni ato në një funksion. Rafte atë funksion-së kornizë do të shkojnë larg. Por kjo ndryshore do të ekzistojnë ende në grumbull deri sa ajo është e liruar, potencialisht nga funksioni që quhet kërko binar apo çfarëdo. Pra, këto variabla grumbull të qëndrojnë atje për aq kohë sa të doni ata të qëndrojnë atje. Dhe ata marrin të vënë këtu. Dhe pastaj një tjetër merr vënë atje. Ata mbajnë duke u plotësuar, dhe ata rrini aty derisa të telefononi pa pagesë. Dhe në thelb, grumbull dhe rafte, marrjen në pyetje Marcus-së, rritet ndaj njëri-tjetrit. Dhe në qoftë se ata të drejtuar në një tjetër, ju keni përdorur të gjithë kujtesën e në tuaj kompjuter, dhe programi juaj do të lë sepse ju nuk keni ndonjë memorie më shumë lënë për t'u përdorur. Në mes tyre, ka gjëra të potencialisht të tjera. Por për qëllimin e këtij kursi, ju nuk kanë nevojë të shqetësohen për këtë. Pra, kjo ishte përgjigja në pyetjen tuaj. Mos u shqetësoni. Por kjo ishte përgjigja e gjatë. Të gjithë ju duhet të dini është grumbull dhe rafte do të - një fillon në fund. Rafte bën. Tog është deri atje. Do rritet pranë njëri-tjetrit. Dhe në qoftë se të kontaktojnë, ky është një problem. Ju u jashtë kujtesës. Por gjithashtu, përveç ditur se ku ata janë, ajo që është ruajtur në të dy rafte dhe tog. Curtis. CURTIS: Kur ata përplasen, është se një overflow rafte? JASON HIRSCHHORN: Kur ata përplasen, kjo nuk është një pirg del nga shtrati. A del nga shtrati rafte është një zonë të ndryshme që ne mund të shkojë mbi në qoftë se ju doni të. OK, ne do të vijnë përsëri në se në një grimë. STUDENT: Çfarë është fjala e quajtur kur ata goditur njëri tjetrin, rafte dhe tog? JASON HIRSCHHORN: Tani për tani, mos u shqetësoni për. Vetëm e di - Unë do të përgjigjem kësaj pyetje pas klasës. Nëse ata të drejtuar në njëri-tjetrin, ju u jashtë e kujtesës, sepse nuk ka më shumë hapësirë ​​atje. STUDENT: Na vjen keq, çfarë është një faj seg? JASON HIRSCHHORN: Një segment faji mund të quhet për - kjo varet se pse quhet faji seg-së. Ndonjëherë, del nga shtrati juaj rafte, ajo do të thonë seg faji si gabim. STUDENT: Po në lidhje me dereferencing një variabël null? A është ky një gabim seg? JASON HIRSCHHORN: Dereferencing një tregues null - OK, kështu që nëse ju keni një tregues që ju vendosur barabartë me null, pointers, risjell, adresat dyqan kujtesës si vlerat e tyre. Dhe një akrep null është në thelb ruajtjen 0, 0-të adresuar në atë variabël. Pra 0x, 0, 0, 0, 0, e të tjera. Kjo adresë 0-të në kujtim se nuk është e në foto tonë, kjo është deri atje diku, që është rezervuara për kompjuter. Ne nuk jemi të lejuar për të prekur atë. Pra, kur programi juaj është ekzekutuar, në qoftë se diçka është duke u përpjekur për të shkuar në kujtesë Adresa 0, ajo e di se që është një vlerë bosh. Ajo e di se asgjë nuk duhet të jetë atje. Pra, nëse ju provoni dhe të përdorni diçka atje dhe të trajtojnë si diçka atje apo duke u përpjekur për të shkuar në atë vend, ju jeni do të merrni një gabim seg apo një gabim. A do të përgjigjem pyetjes tuaj? Dhe tani ne do të kthehemi për të rafte del nga shtrati. Gjërat në rafte, si ju djema kanë parë më parë, në - le të nxjerrë një të ngushtë përbërë nga një kornizë rafte. A mund të shohim se të gjithë? Pra, ne kemi natyrën tonë rafte. Ne jeni të shpëtuar një grup në si një lokal ndryshueshme në këtë funksion. Pra, thonë koleksion tona ka pesë pika të. Të pesë nga ato do të ruhen në atë kornizë rafte. Nëse do të filloni të shkruani përtej caqeve të kësaj grup - kështu që nëse ne filloni të shkruani në, le të themi se është 0. Ata janë pesë indekseve e array tonë. Nëse do të filloni të shkruani në indeksin 5, e cila ne nuk kemi kur ne kemi një Grup i madhësisë 5, ne filloni të shkruani në Indeksi 6, 7, 8, 9, ne mund të merrni një Stack Error del nga shtrati. Në përgjithësi kjo nuk është - ju ndoshta do të merrni në telashe në qoftë se ju shkoni mbi nga një. Por në përgjithësi, ju do të merrni në më probleme në qoftë se ju shkoni mbi nga një shumë dhe ju shkoni deri më tani gjatë që ju të shkruani mbi adresën e kthimit e që funksion, e cila është vendosur në fund e kuadrit rafte. Sepse, e drejtë? Ju - në - sorry. Jo "për shkak të drejtë." Në kuadër rafte, ju keni variablave tuaj lokale. Në fund shumë të rafte kornizë është adresa e kthimit. Kjo është ku funksioni shkon kur është e gjatë. Dhe nëse ju prishësh se kthimi adresën, atëherë kur kjo kornizë rafte, kur ju jeni duke shkuar nëpër rafte kornizë dhe ekzekutimin e çdo linjë, ju jeni do të shkojnë të ri adresën tuaj të kthimit që është shkruar atje në vend të një aktuale. Dhe kjo është se si ne kemi parë disa shkelje të sigurisë mund të ndodhë me kompjutera. Del nga shtrati Pra rafte, me pak fjalë, është kur ju prishësh pjesë në rafte ju jeni duke menduar për të përdorur, lokal variabël jeni duke menduar për të përdorur, dhe veçanërisht kur ju filloni overwriting gjëra të rëndësishme si adresë të kthehen. Dhe kjo është ajo ku ju do të merrni një gabim. Apo ndoshta edhe ju mund të filloni edhe në shkrim - thonë se kërkimi binar ishte mbi të drejtën kryesore. Nëse ju mbikaloi një shumë, ju mund të shkruaj në kryesore. Por në përgjithësi, ju merrni një gabim para atëherë, sepse kompjuteri e di ju jeni duke bërë diçka që ju nuk duhet të jetë bërë. Po. STUDENT: Cila është diferenca në mes të një rafte del nga shtrati dhe një tampon del nga shtrati? JASON HIRSCHHORN: Buffer overflow është një lloj më të përgjithshme të ajo që unë kam përshkruar vetëm. STUDENT: Pra, a del nga shtrati rafte është një shembull i një tampon del nga shtrati. JASON HIRSCHHORN: Pikërisht. Ky është një koleksion që ne mund të mendoj si një tampon, një hapësirë ​​për gjëra për të shkuar in Kjo është një pirg tampon del nga shtrati. Ne mund të kemi një tampon del nga shtrati grumbull. Nëse ka pasur një tampon, i cili ka shpesh është një grup grumbull, dhe ne mbikaloi atyre caqeve, atëherë ne do të kanë një tampon del nga shtrati grumbull. Dhe përtej fushëveprimit të këtij kursi, ata janë duke zbuluar pak ndryshe. Përpilues ka të veçantë mënyrat e zbulimit të secilit. Por një tampon del nga shtrati është një më të përgjithshme Lloji i asaj që unë përshkruar, e cila ishte një pirg tampon del nga shtrati. A se përgjigjem pyetjes tuaj? Sweet. A kishte ndonjë pyetje të tjera të ngjashme në pirg ose pirgut? Po. STUDENT: Unë e di që ju keni për të strings falas për shkak se ata janë në grumbull dhe ju nuk doni të rrjedhje kujtesës. Por ju keni për të liruar të ndryshueshmeve globale dhe stuff like that? Apo ata janë liruar automatikisht? JASON HIRSCHHORN: Pyetje e mirë. Pra në CS50.H, ne krijojmë këtë gjë për ju të quajtur një varg. Një string është me të vërtetë ajo? STUDENT: Char yll. JASON HIRSCHHORN: Një yll char, një akrep me një karakter, një tregues për një grup të karaktereve. Kjo është ajo që është string. Pra, ne kemi nevojë për të liruar atë, sepse getString, të cilën kemi përdorur një shumë - Emri string barabartë getString - që mallocs për ne disa kujtesës në të grumbullosh dhe pastaj kthehet një tregues për karakteri i parë i që string, një yll char. Pra, gjoja, në qoftë se ju nuk keni qenë shkrim i lirë në ndonjë nga vargjet tuaja që e keni quajtur deri më tani, ju keni bërë të rrjedhin disa kujtesës. Sigurisht që ne nuk kemi biseduar për ajo, kështu që askush nuk është marrë në probleme për të bërë atë. Por duke shkuar përpara, po. Kur ju telefononi getString, ju jeni mallocing një hapësirë ​​në grumbull. Dhe në qoftë se ju nuk e quajnë të lirë më vonë se string, ju keni një rrjedhje kujtesës. Kjo përgjigjem pyetjes tuaj? Vërtet STUDENT: Pra, për të bërë këtë, i përdorim drejtë të lirë para kthimit? Si, brenda fushës së, I guess nëse të themi, si, int kryesore, brenda Shtrirja e kodit që është brenda atyre formatimin e teksteve kaçurrel, e drejtë para - ju e dini se ku ju dëshironi zakonisht vënë kthimit. A keni vënë të lirë para se? JASON HIRSCHHORN: Kështu që ju mund të vënë falas kudo që ju dëshironi për të vënë pa pagesë. Për shkak se këto janë të ndarë në mënyrë dinamike variablave, sepse ata mund të jetojnë përtej fushëveprimit të një të veçantë funksion, në qoftë se ju e quani malloc në një funksion të veçantë, për shembull, getString, ju mund të telefononi pa pagesë në kryesore. Ju nuk keni nevojë për të thirrur atë në funksion specifik ku malloc është quajtur. Por ju keni nevojë për të thirrur atë para kthimit kryesore. Dhe kjo varet me të vërtetë. Kjo varet nga arsyeja pse ju malloced se hapësirë ​​në vendin e parë. Disa njerëz do të thërrasë të liruar shumë shpejt. Disa njerëz nuk do të thërrasë të lirë deri në fund të programit të tyre. Dhe ata do të shkojnë nëpër dhe çdo gjë falas. Kjo varet nga arsyeja pse ju të quajtur malloc. STUDENT: Dhe çfarë do të thoni në qoftë se ju e quajti përdorim getString? Ju do të thoni çfarë të lirë? JASON HIRSCHHORN: Pra, sintaksa falas është thjesht e lirë, Paren hapur, të ngushtë Paren, dhe emri i treguesin. Pra, nëse ju shkruani emrin string është e barabartë me getString, ju vënë emrin në këtu. Kjo është emri i treguesin. Dhe ai e di për këtë kujtesë. STUDENT: Pra, kur ai e çliron atë kujtesës, tregues ende tregon për atë vend ne memorien? Apo është tregues edhe i zbrazur adresa që tregon. JASON HIRSCHHORN: Ne duhet të përpiqemi që. Ne duhet kodin që. Le të kthehen kur kemi të kodim, dhe le të kodin që. Dhe në qoftë se ju doni të gjej përgjigje të kësaj, ju gjithashtu mund të kodin që në ndërkohë. Por kjo është një pyetje e madhe. STUDENT: A është e mundur që të diçka e lirë shumë shpejt? Pra, ju ende nevojë për programin tuaj, dhe ju liruar atë hapësirë ​​e kujtesës? JASON HIRSCHHORN: Po. Është e mundur, nëse ju diçka të lirë dhe pastaj ju përdorni atë përsëri, ju do të drejtuar në një gabim. Por kjo është në ju, sepse ju liruar diçka dhe më pas e quajti atë më vonë. Kështu që ishte gabim i një programues. Por po. Ju mund të shkruani se. Çdo më shumë pyetje në - po. STUDENT: Pra, nëse ju jeni duke menduar për të vetëm pa atë në përgjithësi para programi përfundon, nuk do të thotë në qoftë se Programi përfundon dhe ju nuk e pa atë, se kujtesa është ndarë ende? JASON HIRSCHHORN: Nëse programi juaj mbaron dhe ju harroni të diçka të lirë, atëherë se kujtesa është ndarë gjatë gjithë jetës e programit tuaj. Kur programi juaj mbyllet krejtësisht, se kujtesa nuk është duke shkuar të qëndrojnë aty përgjithmonë. Kompjuteri është i zgjuar sa të dijë që kur mbyllet program, ajo duhet të shpëtoj të gjithë kujtesën e që ishte e lidhur me atë program. Megjithatë, nuk janë mjete që ju mund të kandidojë në një program për të zbuluar nëse, kur Programi i përfunduar, keni harruar për të liruar disa kujtesës. Dhe për problemin tuaj të ardhshëm të vendosur ku ju do të jetë duke përdorur malloc dhe duke përdorur pointers, ju do të konkurrojnë këtë programit në programin tuaj për të parë nëse, kur kthimet kryesore, keni pasur disa gjëra që i kishin mbetur unfreed. Pra, ata nuk do të qëndrojnë malloced përgjithmonë në kompjuterin tuaj. Kjo do të ishte e kota, sepse shumë shpejt, kompjutera do të dalë jashtë kujtesës. Por nëse ata të drejtuar deri në fund të tuaj programit dhe ata nuk janë të lirë dhe tuaj program daljet, kjo është ende një problem i se ky mjet do t'ju ndihmojë të trajtojë. STUDENT: A është kjo Valgrind? JASON HIRSCHHORN: Kjo është quajtur Valgrind. Dhe ju do të jetë - STUDENT: Por ne nuk duhet të dini se për quiz, pse? Unë do të thotë, është folur për pak në leksion. JASON HIRSCHHORN: Pra Valgrind është emri i atij mjeti. Duke ditur atë që nuk është mjaftueshme për quiz. Por ju nuk e kanë përdorur atë ende në tuaj Problemi vendosur sepse ne nuk kemi pasur një vendosur problem që e ka trajtuar në mënyrë të qartë me malloc ose ju përdorni malloc. Pra, ju nuk keni përdorur Valgrind ende. Por ju do të përdorin atë më shpejt se sa më vonë. STUDENT: A mund të përsëris çfarë Valgrind është? JASON HIRSCHHORN: Na vjen keq? STUDENT: A mund të përsëris atë qëllimi i Valgring është? JASON HIRSCHHORN: Valgrind është emri - si Gdb ju ndihmon të korrigjoj programin tuaj, Valgrind ju ndihmon të kuptoj se nëse gjërat nuk janë liruar kur programi juaj mbyllet. Pra, ju do të kandidojë atë në programin tuaj. Dhe programi juaj daljet, dhe kjo do të thotë programi juaj i quajtur malloc kjo shumë herë për këtë shumë bytes, dhe ju vetëm quajtur falas këtë shumë herë. Dhe kështu që ju la këto bytes shumë pa u liruar. Ose ajo do të thonë se ju keni liruar çdo gjë. Good job. STUDENT: OK. Dhe është quajtur Valgring? JASON HIRSCHHORN: V-L-A-G-R-N-I-D. STUDENT: Një pyetje rreth pointers. Pra, thonë se ju keni n yll x është e barabartë me diçka. Kjo është e barabartë, çdo gjë që ju jeni duke ka, është se çfarë është duke u vënë brenda ajo që x është duke treguar për të, ose tregues i x? JASON HIRSCHHORN: A mund të përsëris pyetjen? A mund ta tërheqë atë ndërsa ju thonë se ai? STUDENT: Në quiz, në të vërtetë, një që ju na dërgoi, ai ishte si, char vërteta yll barabartë gurë CS50, e drejtë? Pra, a do të thotë se se shkëmbinj CS50 është ajo e vërteta është duke treguar për të? JASON HIRSCHHORN: Pra, ju jeni duke folur rreth një ylli char në një varg, si që punon? Po. OK. Le të nxjerrë këtë këtu. [SIDE BISEDA] JASON HIRSCHHORN: Pra, ky variabël do të jetë e tipit char ylli. Sa i madh është një variabël i yllit Lloji char? Sa bytes? STUDENTËT: Katër. JASON HIRSCHHORN: Kjo është katër bytes. Sa të drejta është një variabël i yllit lloj int? STUDENTËT: Katër. JASON HIRSCHHORN: Katër bytes. Në qoftë se kjo është një akrep, atëherë ajo është gjithmonë katër bytes, sepse pointers, tyre Vlera është një adresë memorie. Dhe adresat e kujtesës në CS50 aplikim janë katër bytes të gjatë. Pra, kur ne e quajmë getString, ose kur të themi, stringname barabartë, dhe më pas në Kuotat e dyfishtë vënë një varg, ne jemi duke - mirë, kjo është pak më ndryshe. Ne do e getString si shembull. Apo yll char diçka është e barabartë me string. Na vjen keq, më jep shembullin që keni lexuar? STUDENT: char yll vërteta është e barabartë me "shkëmbinj CS50" në thonjëza të dyfishta. JASON HIRSCHHORN: Pra, ky yll, kjo ne do të quajmë këtë variabël x për tonë qëllime të përgjithshme. Ne kemi krijuar një ndryshore të quajtur x. Kjo është lloj char yll. Kjo është një tregues për një seri të karaktereve. Kështu që këtu - Pra, kjo është se si kjo do të punojnë në kujtesën. Kjo do të ruajtur një adresë memorie. Ajo do të ruajë adresën e memories së karakteri i parë në rrjet. Dhe atëherë kur të ndjekur akrep, ju do të marrë karakterin e parë. Dhe në qoftë se jeni duke e lexuar këtë gjë si një varg, kompjuteri juaj është i zgjuar të mjaftueshme për të dini, lexoni këtë gjë të gjithë derisa ajo merr në një reagim 0. Por nëse ju jeni të lexuar atë një karakter në një kohë, kështu që ju jeni iterating përmes këtë varg, atëherë ju do të lexoni vetëm një karakter në një kohë deri sa ju të merrni për të backslash 0. Kjo nuk mund të përgjigjen tuaj pyetje, pse. STUDENT: Po, por ju nuk e keni malloced se hapësira ende për këtë tregues. JASON HIRSCHHORN: Kështu që unë nuk jam mjaft i sigurt pikërisht ajo që ju jeni duke kërkuar në, sepse nuk e kam bërë këtë quiz. Kjo është dashur të jetë një dobishme burimeve nga një tjetër TF. Nëse ju jeni duke krijuar një varg të rafte apo si një variabël lokale, ajo do të vetëm të jetë grup nga akuzat në vend se në përgjithësi një yll char duke treguar për një tjetër varg. Por unë nuk e di. Kjo mund të jetë një tregues për një tjetër string në rafte si. Po. STUDENT: Unë e di që ju keni nevojë për të përgatitja e kujtesës nëse akrep është duke u deklaruar brenda e një tjetër funksion. A ju duhet të bëni të njëjtën gjë nëse është e duke u deklaruar brenda kryesore, ju jeni duke e përdorur atë brenda kryesore? JASON HIRSCHHORN: Pra, po. Ju mund të deklarojë një tregues për ndonjë Adresa e kujtesës në kujtesën. Ajo mund të jetë adresa kujtesa e një lokal ndryshueshme, edhe pse shumë herë, njerëzit nuk e deklarojnë adresat e memories të variablave lokale për shkak se ata të shkojnë larg një herë se funksion të kthimit, e cila është arsyeja pse ne në përgjithësi malloc gjëra. Por po, ju mund të shpallë një tregues tjetër variable lokal. Ajo është vetëm në përgjithësi nuk bëhet. Por unë mund të marrë një sy në se gjë të veçantë pas klasës. Po. STUDENT: Unë mendoj se kjo është lloj e asaj që është duke u kërkuar. Ajo duket e çuditshme për të Initializing një tregues jo si një adresa, por si ajo që duket si një vlerë. Duket si CS50 është ajo që ka brenda gjë që vuri në dukje dhe të Nuk adresa aktuale, e drejtë? JASON HIRSCHHORN: Pra, kjo është nuk është rasti, pse. Kjo nuk është ajo që po ndodh. Kur ju të deklarojë një yll char, kjo është një adresë memorie. Pointers janë të gjitha adresat e memories duke treguar për diçka tjetër. Se diçka tjetër do të mund të jetë në rafte, por pothuajse gjithmonë është në të grumbullosh në mënyrën se si ne do të shohim të përdoret. Por stringname është e barabartë me dy kuotë "GetString," ne mund të shohim se dhe ne mund të shikoni me se dhe kodin që. getString string nuk është duke u ruajtur në që variabël, ose çfarëdo string Emri i nuk është duke u ruajtur në atë variabël, jo sepse kjo është se si pointers të punuar. A ka kjo kuptim? STUDENT: Po. JASON HIRSCHHORN: OK. Shpresojmë, që nuk ishte i konfuze për të gjithë. Por në qoftë se ajo ishte, ne mund të shohim atë përsëri në pak, sepse ne jemi të vërtetë do të kodit diçka që do të shpresojmë se punojnë me vargjet dhe të ndihmojë të ndjeheni më të rehatshme me ta. Çdo pyetje të tjera në lidhje me këto tema apo tema të tjera që Unë do të vënë back up? Dhe - tani. Po, Alden. Alden: Pra, kjo është krejtësisht pa lidhje, por ne vetëm mund të shkojë mbi me të vërtetë shpejt ajo që ne duhet të dimë për dallimin në mes të një 32 dhe Makinë 64-bit? JASON HIRSCHHORN: Po. Kështu që 32 bit është se sa bytes? Alden: Kjo është katër bytes. JASON HIRSCHHORN: Kjo është katër bytes. Dhe 64 bit është se sa bytes? STUDENT: Tetë. JASON HIRSCHHORN: Tetë bytes. Pra, përsëri, tetë BITS është një bajt. Pajisja juaj është CS50 një makinë 32-bit. Pra, adresat e kujtesës janë katër bytes të gjatë. Ka 2 e 32 adresat e kujtesës. 0 në 2 me minus 1 32. Dhe unë nuk jam pozitive, por kjo është ndoshta qëllimi i asaj që ju duhet për të e di për një makinë 32-bit, se kujtesa adresat janë, përsëri, katër bytes të gjatë, dhe kjo është shuma maksimale i adresave të kujtesës. Gjithashtu, lloje të të dhënave - kjo mund të jetë diçka si edhe kjo është me vlerë të përmendet. Madhësia e një lloji të dhënave varet nga makinë ju jeni duke punuar me të. Pra, një char, një karakter të vetëm, është se si shumë bytes për aplikim tonë CS50? Një bajt. Dhe kjo është në fakt një bajt si mirë në një makinë 64-bit. Dhe shumica e lloje të të dhënave janë të njëjta numër i bytes në të dy makina. Por disa lloje të të dhënave do të jenë të ndryshme në të dy makina. Kështu që do të ishte potencialisht vetmja gjë që ju duhet të dini. Por edhe që, unë mendoj se, është përtej kufijve - Unë jam gati pozitive, në qoftë se ju shikoni mbrapa në kuize vjetra, ai thotë se, për të marrë coding probleme ju jeni duke përdorur një makinë 32-bit. Por ka, për të shkuar së bashku me atë në rast se ju jeni të interesuar, ka lloje të të dhënave që janë të njëjta Madhësia në të gjitha makinat. Nëse e keni parë diçka si uint32_t, ju mund ose mund të nuk e kanë parë këtë. Kjo është një lloj i të dhënave. Që është duke thënë, të jetë 32 bit pa marrë parasysh çfarë makine kjo është më. Pra, kur njerëzit janë shkruar portativ Kodi, ata ndoshta nuk do të përdorin ints. Ata në vend të kësaj do të përdorin këto të dhëna të tjera Llojet se ata e dinë do të jetë e njëjtë Madhësia në çdo makinë të vetme. Madhu. Madhu: Unë kisha një pyetje rreth proces hartimi. Pra, nëse ju jeni duke shkruar një program që përdor një bibliotekë si CS50 apo diçka si kjo, unë e di se se biblioteka ka për të, në një pikë, të jetë hartuar dhe të lidhura in Por si shumë e që ndodh gjatë hartimin e programit tuaj? Cila pjesë e atij procesi të bibliotekës ndodh kur ju jeni hartimin e programit tuaj? JASON HIRSCHHORN: Pra, le të shkojë mbi përgjithësi hapat e këtij procesi. Ju shkruani file. Tuaj c. Në. Dosjen tuaj c, ju # përfshijë tuaj header bibliotekat, për shembull, cs50.h. Çfarë e bën këtë të mprehta përfshijnë Linja të bëni për programin tuaj? Akchar. AKCHAR: Ajo shton prototipet e funksionet nga header fotografi në bibliotekat. JASON HIRSCHHORN: Pikërisht. Ajo shton ato prototypes funksion në kodin tuaj. Pra, kur kodi juaj është duke u hartuar në në fazat e para, përpiluesit e di se këto funksione të vërtetë ekziston, dhe se diku ata kanë qenë të përcaktuar. Dosjet. H nuk përfshijnë përkufizime për këto funksione ose se si ata në të vërtetë punojnë. Cs50.h vetëm përfshin diçka që thotë se getString është një gjë e vërtetë që mund të ndodhë. Dhe standardio.h thotë printf është një gjë e vërtetë që mund të ndodhë. Pra, gjuha juaj c me këtë. Header fotografi merr kthyer në disa makinë-i lexueshëm kodi, i cili përfundimisht merr kthyer në binar Kodi, 0 dhe 1 i. Dhe kjo është kodin që në fund të fundit merr ekzekutuar. -L CS50 linjë - për shembull, kur ju jeni me shkrim tingëllimë - dhe pastaj ju të përfshijë-l CS50, ju shkruani se in Dhe ju shihni se. Kur ju shkruani bëni, ju do të shihni këtë linjë deri këtu. Dhe ne do të shohim se në një të dytë, kur ne kodin ose më vonë kur ne kod. Por kjo-l linjë CS50 bën diçka pak më të ndryshme se # të përfshijnë cs50.h. Çfarë do të vijë se-l CS50 bëj? Avi? AVI: Unë dua të them se ajo lidhje biblioteka të funksionit telefononi, si fotografi. o. JASON HIRSCHHORN: Pra, shumë ngushtë, nëse jo vend-on. -L CS50 merr file binar dhe bashkon atë me dosjen tuaj binar. Pra cs50.h, nuk ka asnjë pikë kthese në cs50.h nga gjuha C në binar çdo herë të vetme është duke u përdorur. Kjo do të ishte pa kuptim, sepse kjo do të mbeturinave shumë kohë. Pra, ajo tashmë është hartuar dhe u kthye në një ekzekutues. Dhe tani ajo do të bashkohen me dosjen tuaj në fund. Pra ato 1 dhe 0 do të bashkohen me ato tuaj dhe 0-së në fund. Deri tani ju do të duhet të vërtetë aktuale 1 dhe 0 se përcaktojnë se si getString, për shembull, punon, ose se si printf, për shembull, punon. Dhe për më shumë informacion, ka një Hartuesit e shkurtër se Nate jep se ju duhet të shikoni se shkon nëpër këto hapa. Por - po. STUDENT: A janë ata gjithmonë në o fotografi. kur ata janë në formën e bibliotekës, gati të bashkohen, të lidhura - si ata janë në kodin binar? JASON HIRSCHHORN: OK. Çfarë - STUDENT: A është ky gjithmonë rasti për bibliotekat kur lidhjen e tyre? JASON HIRSCHHORN: Po. Pra, nuk ka. S fotografi, të cilat do të jenë Kodi makine, e cila gjithashtu do të jenë të i fshehtë për ju. Ju nuk duhet të shqetësohen për ato. Por në përgjithësi, vërtet, ata do të të jetë në. o fotografi gati për të shkuar. STUDENT: Pra, kur ju anije në një bibliotekë, ju anije vetëm . h dhe. o? Ju nuk anije. C apo. S. JASON HIRSCHHORN: Pra, - dhe kjo është në këtë të shkurtër, si dhe, në qoftë se ky informacion duket se vjen një pak shpejt. Por short mbi hartuesit flet për këtë si. Kur ju anije një bibliotekë, në qoftë se ju anije . h, header fotografi, ata prototypes funksion, dhe 1-të dhe 0-së, që të gjithë ju duhet të jepni. Ju nuk keni nevojë për të dhënë se si funksion punon,. fotografi c. Për shkak se pika e abstraksionit, ose pikë e TV, pika në këtë SPL, biblioteka portativ Stanford, është e për ju të mos shqetësohen për mënyrën se si e re GRect punon, ose se si të shkojë vepra, apo se si të shtoni vepra. Të gjithë ju duhet të dini është se add është një funksion që ju mund të përdorur, dhe kjo e bën këtë. Pra, ju me të vërtetë nuk keni nevojë të dini se si është e shkruar në C. Ju vetëm duhet të e di, këtu janë funksionet, atë që ata bëni, dhe këtu janë të 1 dhe 0 kur ju me të vërtetë dëshironi të përdorni ato. Ftohtë. Çdo më shumë pyetje mbi hartuesit ose tema të tjera në bord? STUDENT: Unë kam një pyetje të zbatuar funksionet gjithkund rekursive. Një pyetje në lidhje recursion. Unë kisha një ndjenjë se do të dalë. Pra, le të shkojë shpejt nëpër recursion me një të veçantë shembull, një funksion faktorial. Për shkak se ky është një shembull që shpesh vjen deri ose të përdoret për të ilustruar recursion. Pra "4!" lexohet si 4 faktoriale. Dhe çfarë do të thotë 4 faktorial? Çfarë do të bëni? Si mund të llogaritur 4 faktoriale? 4 herë 3 herë 2 herë 1. Pra, një mënyrë tjetër për të shkruar 4 faktoriale është për të shkruar këtë. 4 herë 3 faktorial. Për shkak se 3 faktoriale është 3 herë 2 herë 1. Pra 4 herë 3 faktoriale është 4 herë 3 herë 2 herë 1. Kjo është arsyeja pse faktoriale është një e madhe kandidat për recursion, sepse është e qartë se ka diçka që ndodh mbi dhe mbi dhe mbi në një Numri më i vogël i gjërave deri të arrini në fund. Kur të keni arritur 1, 1 faktoriale është 1. Ju nuk mund të shkojnë shumë më tej. 0 faktoriale është përcaktuar edhe si 1. Pra, kur ju të merrni në 1 ose 0, ju jeni në fund, dhe qe mund filloni kthim prapa deri. Pra, nëse ne të kërkuar për të shkruar një recursive Funksioni për të llogaritur një faktoriale, ne jemi duke shkuar për të shkruar disa pseudokod për këtë tani. Para se të shkruani se pseudokod - Unë do të jap ju djema disa minuta për të shkruar kodin pseudo ose thjesht mendoj në lidhje me të - ka dy gjëra çdo ka nevojë për funksion recursive. Cilat janë këto dy gjëra? JACK: Ajo ka për të thirrur vetë. JASON HIRSCHHORN: Noah? Oh, Jack. Shkoni përpara. JACK: Ajo ka për të thirrur vetë. JASON HIRSCHHORN: Pra a recursive funksion ka nevojë për një thirrje rekursive, një telefononi në vetvete. Kjo është një. Dhe çfarë është gjë tjetër? JACK: Një rast bazë. JASON HIRSCHHORN: Një rast bazë. Një rast bazë është, këtu është kur ne të ndaluar. Pra, funksioni juaj merr të quajtur. Rastit bazë vjen e para. Ju dëshironi të dini nëse ju jeni në fund. Dhe në qoftë se ju nuk jeni në fund, ju bëni thirrjen tuaj rekursive. Dhe ju shkoni nëpër këtë funksion përsëri, kontrolloni rastin tuaj bazë përsëri. Nëse ju nuk jeni në fund, ju bëni një tjetër thirrje rekursive, e të tjera, e të tjera. Kjo është arsyeja pse funksionet gjithkund rekursive gjithmonë nevojë për ato raste bazë dhe ato të thirrjet gjithkund rekursive. Nëse ju nuk keni një thirrje rekursive, ajo nuk do të jetë një funksion gjithkund rekursive. Nëse ju nuk e keni një rast bazë, ju do të shkoni në shekuj të nuk do të kishte dhënë fund. Dhe rasti baza gjithmonë vjen e para, sepse ju gjithmonë do të dëshironi të kontrolloni nëse ju jeni në fund të parë. Pra, para se të bëjmë disa pseudokod, pse nuk keni marrë një minutë për të menduar për se si një funksion recursive faktoriale do të jetë e shkruar? Gjithashtu, sa më shumë që ju po bëni, shkrim ajo jashtë në një fletë letre është atë që ju jeni do të duhet të bëni në quiz nesër. Praktika Pra ndoshta e mirë për të bërë sigurt Kodi jeni të shkruar poshtë në fletë letre - ose ju mund ta bëjë këtë. Ti e di se ku janë pikpresje. Ju kujtohet sintaksë. Sepse ju nuk jeni të jetë në gjendje të ketë një përpilues thoni keni bërë një gabim. Gjithashtu, në këto linja, nesër, kur ju keni kodim probleme, në qoftë se ju janë nxituan për kohën, ose në qoftë se ju jeni shumë të hutuar se si ju jeni duke menduar për të shkruaj gjë të veçantë në c, ajo do të behoove ju të shkruani pseudo-kod ose shkruani komente në si. Sepse nuk ka kredi të pjesshme për një Shumë prej pyetjeve në quiz. Kështu që ju mund të jenë të ngutshme, ose ju vetëm mund të ngatërrohet. Duke shkruar në komentet apo pseudo-kod janë shpesh mënyra që ju mund të merrni kredi të pjesshme. Pra, nuk do të lënë diçka bosh në quiz. Nuk ka dënime për vënë gjërat in Në fakt, duke vënë në pseudo-kod ose Komentet do të ndihmojë grader kuptoj se në qoftë se ju në të vërtetë e di se çfarë ju jeni duke folur për, dhe ndoshta çmimin ju disa kredi të pjesshme për këtë. Gjithashtu në këto linja, shkruar në mënyrë të qartë. Në qoftë se ne nuk mund të vërtetë atë që ju jeni me shkrim, ne nuk jemi duke shkuar për të thirrur ju në mesnatë nesër në figurë se çfarë keni shkruar. Ne jemi vetëm do të marrë off pikë. Shkruani në mënyrë të qartë kështu që ne mund të dëgjojmë, ose më mirë, ne mund të lexoni se çfarë keni shkruar. Dhe në qoftë se ajo thotë dy fjali, mos shkruani një paragraf. Ndiqni udhëzimet. Shkruani qartë. Dhe shkruani në këto komente apo pseudokod për pyetjet që mund të çmimin e kreditit pjesshëm. OK, le të shkojnë në faktoriale. Pra, ne kemi një faktoriale funksion. Nëse unë do të të vërtetë të shkruar këtë në C, ajo që nuk kam nevojë për të vënë para emrit i funksionit? Lloji kthimit, e cila, në këtë rast, ne do të të jap int. Dhe pastaj brenda formatimin e teksteve kaçurrel, është çfarë shkon brenda formatimin e teksteve kaçurrel për një funksion? STUDENTËT: Lloji Argument. JASON HIRSCHHORN: argumentet e saj. Pra faktorial ndoshta do të të marrë një argument. Kjo ndoshta do të marrë vetëm një argument. Dhe ne do të thonë se kjo do të marrë nje integer quajtur X. Dhe përsëri, kur shkruani prototip të një funksion ose shkrim funksionin në kodin tuaj para e përcaktuar atë, ju shkruani llojin e të dhënave dhe emrin e që e ndryshueshme për atë funksion vetëm. Kështu që ju mund të kalojë një numër në këtë funksion, ai do t'i referohemi si x brenda vendit. Ne kemi funksionin faktorial tonë. Ne kemi nevojë për dy gjëra, një rast bazë dhe një thirrje rekursive. Cila është rasti bazë për faktorial? Dikush që e ka shkruar atë dhe që nuk ka ende flitet, çfarë është baza rast për faktorial? STUDENT: Nëse n është më pak se 2, kthehen 1. JASON HIRSCHHORN: Nëse n është më pak se 2, kthehen 1. Më pëlqen që, për shkak se kujdeset për 0 dhe 1. Pra, ne do të bëjmë x <2, kthehen 1. Nëse do të marrë kaluar 0, në qoftë se ne të merrni kaloi 1, ky funksion do të menjëherë të kthehen 1. Nëse do të marrë kaluar disa numër më të madh se ose e barabartë me 2, ne jemi duke shkuar për të kemi thirrjen tonë rekursive. Dhe kështu si është që do të punojë? A mund dikush tjetër i cili ka punuar në këtë i cili nuk ka folur ende më japë thirrje rekursive për këtë funksion në pseudokod? Nëse do të merrni kaluar në një numër x dhe është më i madh se 2, ajo duam të bëjmë? Ne gjithashtu kemi një shembull shkruar në pala që mund të ju jap një hint. STUDENT: Call x herë faktorial i x minus 1? JASON HIRSCHHORN: Pikërisht drejtë. Ne jemi do të kthehen x herë faktorial i x minus 1. Dhe kjo, edhe pse kam shkruar lart, në thelb, ajo që keni thënë në anglisht, ky funksion faktorial do të merrni të quajtur përsëri. Ajo do të ekzekutojë në x minus 1. Ajo do të kthehet me një numër të plotë, dhe atëherë ajo do të shumohen këto dy bashku, dhe se vlera do të jetë u kthye në çfarëdo quajtur këtë funksionin faktorial, të cilat mund të të jetë një tjetër shembull i ky funksion faktorial. Kështu që është një shembull i një rekurzive funksion, një shumë të funksion i thjeshtë recursive. Por shumica e tyre do të jetë si kjo. Nëse ju do të doja një gjithkund rekursive të mirë të sfiduar për të quiz, provoni coding kërko binar Recursively. Sepse në qoftë se keni kryer kërkim binar për Problemi vendosur tre, ju ndoshta e bëri atë iteratively në një lak kohë. Por ai gjithashtu mund të jetë e shkruar Recursively. Ju jeni do të duhet për të shkruar tuaj funksion të veçantë që merr disa argumente të ndryshme command-line - ose jo argumente command-line, disa argumente të ndryshme vetëm të rregullta. Por ju mund të shkruani kërko binar Recursively si. STUDENT: Pra, ju mund të ketë shkruar edhe, në vend të x minus 1, ju mund të kishte shkruar edhe x minus minus, ose ju mund të keni shkruar x minus minus. A mund të shpjegojë vetëm të vërtetë shpejt pse ata do të ishin gjëra të ndryshme, si se çfarë është dallimi në mes të x minus minus dhe minus minus x? JASON HIRSCHHORN: Jo, unë nuk jam do të shkojë në atë. Por unë do të flas me ju në lidhje me të pas klasë. x minus minus, minus minus x pakësim x me 1. Por ata e bëjnë atë pak ndryshe. Por unë nuk dua të shkoj në atë. Pyetje të tjera rreth recursion apo ky funksion? Kjo nuk është e vërtetë edhe pseudokod. Kjo është në thelb kodi në C ju do të shkruaj për këtë. OK, çdo pyetje të tjera për tema deri këtu? Po. STUDENT: Unë kam një i dobët e shpejtë të lundrues pikë dhe saktësi. JASON HIRSCHHORN: Floating pikë dhe saktësi. A mund dikush të vërtetë shpejt më jepni një i lodhur të lundrues pikë dhe saktësi? Ju të gjithë e kishin për të bërë këtë për tuaja Problemi vendosur, kështu që ju jeni të gjithë njohur me të. Apo ndoshta jo të gjithë ju. Çdokush? Më jepni një vend të filluar. Lundrues pikë dhe saktësi. Çfarë është problemi? Po. Victoria? VANESSA: Vanessa. JASON HIRSCHHORN: Vanessa. Më vjen keq. VANESSA: Ka vetëm një numër i caktuar e numrave që mund të përfaqësohen sepse ju jeni në një, në tonë rast, një sistem 32-bit. Pra, ju lloj i duhet të përbëjnë disa numra. JASON HIRSCHHORN: Pra, kjo është saktësisht e drejtë. Ka vetëm një sasi të caktuar të numrat që mund të përfaqësohen. Nëse ju të shumëzohen dy numra shumë të mëdha, ajo mund të del nga shtrati shumën e hapësirave që ju keni për të përfaqësuar një numër të plotë. Kjo është arsyeja pse nganjëherë ne i përdorim një kohë të gjatë në vend të një int. Kjo ka më shumë hapësira. Që mund të mbajë një numër më të madh. Floating pikë saktësi ka të bëjë me se, por gjithashtu ka të bëjë me Fakti që numrat decimal të jo përfaqësuar gjithmonë. Më vjen keq. Më lejoni të vënë këtë back up. Numri dhjetor 1.0 nuk është gjithmonë të përfaqësuara si ju do të presin, 1,000000000. Ajo është e përfaqësuar ndonjëherë si 1,000000001 ose ,999999999. Ajo mund të jetë edhe 89 hidhet në atje diku. Pra, ato numra decimal nuk janë përfaqësuar pikërisht si ju do presim që ata të jenë të përfaqësuara. Pra, në problemit të vendosur - ishte ajo dy? - Problemi vendosur dy, ku kemi trajtuar me Numrat pikë lundrues, kur donin ata për të përfaqësuar pikërisht ajo që kemi dashur ata të përfaqësojnë, numri i pennies, ose numri i cent, ne shumoj me 100. Ne rrumbullakuar ato. Dhe pastaj ne të prerë çdo gjë pas pikës dhjetore. Kjo ishte për të siguruar se ata do të në të vërtetë të barabartë pikërisht ajo që kemi dashur ata të barabartë. Sepse kur ju merrni diçka që është një noton dhe kthyer atë në një int, ju prerë çdo gjë në të djathtë e pikës dhjetore. Sepse ka disa pika lundrues pasaktësi, 100.000 mund të jetë të përfaqësuara si të 99,999999999. Dhe në qoftë se ju vetëm prerë çdo gjë për të e drejta menjëherë, ju jeni do të të marrë numrin e gabuar. Po. STUDENT: Unë kisha një pyetje rreth hedh. Çfarë mënyrë e bën atë të ndodhë në? Nëse ju do të bëni noton, kllapa, 1 i ndarë me 10, e bën atë e 1 ndahet nga 10, pastaj të marrë 0.1, pastaj kthehet atë në një noton? JASON HIRSCHHORN: Nëse ju bëni noton me 1 ndahet nga 10 - STUDENT: Po, dhe pastaj të barabartë - mirë, kjo do të normalisht e kanë të barabartë në - Po. Ju dëshironi të bëni atë një noton, e drejtë? JASON HIRSCHHORN: OK, kështu që ne jemi duke shkuar për përdorin që të segue në zbulimin përgjigjet e këtyre pyetjeve përmes coding. Sepse ju do të keni një shumë të këto pyetje minutë, dhe një mënyrë e mirë për zgjidhjen e tyre është përmes coding. Pra, ne jemi duke shkuar për të koduar këtë të drejtë tani, dhe atëherë ne jemi duke shkuar për të shkuar mbrapa dhe kodojnë pyetjen keni pasur. Pra, linja e parë - Unë nuk duhet të ketë shkruar atë - çka është gjëja e parë që ne duam të bëjmë kur ne të hapur një skedë të re në gedit? STUDENT: Përfshini. JASON HIRSCHHORN: Përfshini çfarë? STUDENT: Biblioteka CS50. JASON HIRSCHHORN: OK. Çfarë tjetër duhet të përfshijë? Ne jemi vetëm do të shikoni se çfarë ndodh kur ju të hedhur diçka në një noton. Por ajo që na duhet për të përfshirë në qoftë se ne jemi do të shkruani një program C? STUDENT: Standard I / O. JASON HIRSCHHORN: stdio.h. Ne në fakt nuk kemi nevojë, për këtë program, cs50.h, edhe pse kjo është gjithmonë e dobishme për të përfshirë atë. Por ne gjithmonë nevojë stdio.h. STUDENT: Kur kodim në C? JASON HIRSCHHORN: Kur kodim në C. Kështu që unë të shpëtuar atë si kjo. Dosjen c. Kam marrë disa theksim i sintaksës bukur. Kam shkruar boshllëk brenda kryesor. Çfarë do të thotë të pavlefshme? STUDENT: A nuk të marrë asnjë argumente command-line. Jason Hirschhorn: mjetet e pavlefshme, në këtë rast, kryesore nuk merr asnjë argumente command-line. Në rastet e tjera, që do të thotë funksionin nuk merr argumente command-line. Ose funksion, nëse unë do të shkruaj zbrazëti kryesor (i pavlefshëm), që do të thotë-së kryesore nuk kthehen asgjë. Pra pavlefshme thjesht do të thotë asgjë. Çfarë do të shkruaj në qoftë se unë do të të marrë argumente command-line? STUDENT: int hark c v string hark JASON HIRSCHHORN: int argc string ARGV. A është kjo e drejtë? STUDENT: Kjo është char kllapa yll ARGV. JASON HIRSCHHORN: Pra, ju mund të shkruani kllapa string ARGV apo yll char ARGV kllapa, por ju duhet kllapa. Për shkak se ARGV është një koleksion e vargjet, mos harroni. Kjo nuk është vetëm një varg. Pra string ARGV është, këtu është një varg të quajtur ARGV. Kllapa String ARGV është, këtu është një koleksion të strings. Pra int kllapa ARGV argc string do të ishte diçka që unë ndoshta do të shkruaj. Kështu që ju të kërkuar për të ruajtur në një numër të plotë? STUDENT: Po, numër i plotë. Ose në një noton. JASON HIRSCHHORN: Në një noton? Si, float x është e barabartë me 1 ndahet nga 10. JASON HIRSCHHORN: OK. Si mund të shtypura nga një noton në printf? Çfarë? STUDENT:% f. JASON HIRSCHHORN:% f. Çfarë është një numër i plotë? d ose i. Çfarë është një varg? STUDENT: s. JASON HIRSCHHORN: s. Si mund të merrni një linjë të re? STUDENT: Backslash n. JASON HIRSCHHORN: Çfarë mund të kthehen në qoftë se shkon kryesore në mënyrë korrekte? STUDENT: 0. A kam nevojë për të shkruar këtë linjë, pse? STUDENT: Jo. OK, ne nuk do të shkruaj atë, atëherë. A mund të gjithë e lexuar këtë? Ajo duket pak e vogël. A mund të shihni të gjithë, ose duhet Unë e bëjnë atë më të mëdha? Unë mendoj se për kamera, ne do të bëjnë atë pak më e madhe, edhe pse. JASON HIRSCHHORN: Nëse unë dua të kthehet këtë . C paraqesë në një ekzekutues, çfarë mund të shkruaj? STUDENT: Bëni testin. JASON HIRSCHHORN: Na vjen keq? STUDENT: Bëni testin. JASON HIRSCHHORN: Bëni testin. Ne ishim duke folur për kjo vijë më parë. Tingëllimë. Çfarë është tingëllimë? Emri i përpiluesit. Ç'është kjo linjë? STUDENT: vë atë për përdorim të gdb. Jason Hirschhorn: Sets ajo për përdorim të gdb. Kjo linjë, çfarë është kjo? STUDENT: kodi burim. JASON HIRSCHHORN: Kjo është fotografi burim,. fotografi c. Çfarë bëjnë këto dy linja? Ose këto dy linja jo. STUDENT: Ajo emra të testuar. JASON HIRSCHHORN: Pra dash o thotë, emërojë atë diçka ndryshe. Dhe këtu ju jeni duke e quajtur atë provë. Nëse unë nuk e kanë atë në, çfarë do atë emër kjo? STUDENT: A.out. JASON HIRSCHHORN: A.out. Çfarë do të bëni këtë? STUDENT: Links bibliotekën matematikë. JASON HIRSCHHORN: Ajo lidh në bibliotekë matematikë. Ne nuk përfshinte bibliotekën matematikë, por pasi kjo është aq e zakonshme, ata kanë make shkruar për të gjithmonë të përfshirë biblioteka matematikë. Dhe po kështu, kjo përfshin biblioteka CS50. OK, kështu që nëse ne lista, ne tani kemi një ekzekutueshme quajtur provë. Për ta ekzekutuar atë, unë shkruaj testin. Unë shoh se pika ime lundrues, siç pritej, është e barabartë me 0. A do të - kështu - STUDENT: Pastaj në qoftë se ju vendosni noton tani, si ju hedhur atë si noton - JASON HIRSCHHORN: Cast 1 për një noton? STUDENT: Jo, hedhin gjë të plotë - po. Nëse ju vetëm e bëri atë, do të që e bëjnë të 0.1? JASON HIRSCHHORN: OK, kështu që me të vërtetë të shpejtë, 1 ndahet nga 10, ata janë integers duke u ndarë. Pra, kur ju ndani integers, ata janë 0, dhe ju jeni të shpëtuar se 0 në një noton, sepse slash është vetëm ndarje numër i plotë. Deri tani ne jemi kthyer diçka në një noton. Le të shohim se çfarë ndodh. Ne do të bëjë testin. Deri tani ne shohim se se slash nuk ishte Ndarja numër i plotë, ajo u lundrues ndarje pikë. Për shkak se një prej argumenteve të saj ishte hedhur në një noton. Deri tani ajo po thoshte, trajtuar kjo ndarje si ne jemi që kanë të bëjnë me pikë lundrues, jo me integers. Dhe kështu që ne të merrni përgjigje që ne presim. Le të shohim se çfarë ndodh - oops. Në qoftë se unë të kërkuar për të shtypur më shumë decimal të spote, si mund ta bëj këtë? STUDENT: Pika dot f, ose sa më shumë vende dhjetore e te. JASON HIRSCHHORN: Kështu që unë të shtypura 10 spote dhjetore. Dhe ne shohim tani ne jemi duke marrë disa sende të pazakontë. Dhe kjo shkon prapa në pyetjen tuaj rreth lundrues pikë pasaktësi. Ka një gjë e çuditshme ruajtur në këtu. OK, bën që të përgjigjem pyetjes tuaj? Çfarë tjetër e doni të kodit shpejt? STUDENT: Unë vetëm të kërkuar për të parë nëse janë apo jo, në qoftë se ju të lirë deri disa tregues, nëse ky tregues ende kishte ruajtur në ajo adresa e asaj që kishte qenë duke treguar më parë. JASON HIRSCHHORN: OK, kështu që le të bëjnë këtë. Yll ptr char, kjo krijon një ndryshore quajtur ptr i tipit char ylli. Si mund të shkruaj malloc? Alden? Alden: Vetëm malloc. Por pastaj ajo duhet të jetë madhësia e, dhe në këtë rast, unë mendoj që do të të treguar char. Pra, kjo do të jetë char. JASON HIRSCHHORN: OK, kështu që më shumë përgjithësisht, Brenda - le të redaktoni. Brenda malloc, ju doni numrin i bytes në grumbull. Në përgjithësi, ajo që ne kemi parë se ne jemi duke bërë është që ne jemi duke shkuar për malloc vargjet, për shembull, ose vargjeve të numrave të plotë. Pra, nëse ne duam 10 numra të plotë, ose 10 chars, 10 do të na japë 10. Dhe pastaj madhësia e karaktere do të japë na se madhësia e karaktere, të cilat në ky rast është 1 bajt. Ne kemi marrë 10 bytes. Nëse do të shkruani madhësinë e int, që do të na japë 40 bytes. Pra, më përgjithësisht, në brendësi të malloc është numri i bytes ju dëshironi. Në këtë rast, ne jemi duke marrë 1 bajt. E cila duket si një përdorim të pazakontë e malloc, por për tonë qëllime kuptim. Pra, nuk është se. Ne jemi duke shkuar për të thirrur të lirë. Ne të shpëtoj prej tij dhe ne i përdorim PTR përsëri. Dhe çfarë ju doni të kontrolloni? STUDENT: Unë vetëm të kërkuar për të parë nëse apo nuk ka pasur asgjë në brendësi të saj. JASON HIRSCHHORN: Pra, nëse ai vuri në dukje çdo gjë? STUDENT: Po, pikërisht, nëse ajo ende kishte një adresë memorie. JASON HIRSCHHORN: Pra, ju doni për të kontrolluar vlerën e PTR? STUDENT: Po, pikërisht. JASON HIRSCHHORN: Çfarë unë shkruaj këtu në qoftë se unë dua të kontrolloni vlerën e Pika - çfarë është, Jordan tha, vlera? Apo çfarë është ruajtur brenda PTR? STUDENT: Adresa e memories. JASON HIRSCHHORN: Adresa e memories. Pra, nëse unë shkruaj vetëm këtë, ajo do të më jepni vlerën e PTR. Dhe si mund të shtypura nga një adresë memorie? Çfarë është string format për një adresë memorie? STUDENT:% p. JASON HIRSCHHORN:% p. % S është një varg. % P për treguesin. A është kjo e drejtë? Kjo është e drejtë. Pra, është e barabartë me ptr - ajo ende ka diçka në të. Kjo është ndoshta një më të pyetje interesante. Çfarë do të vijë të bëjë? STUDENT: gabimet seg. JASON HIRSCHHORN: Çfarë? STUDENT: Mendoj se seg gabimet. JASON HIRSCHHORN: Hm? STUDENT: Unë mendoj se kjo do të seg faj. JASON HIRSCHHORN: Pra, kjo linjë Kodi i, yll PTR, çfarë do të thotë yll? STUDENT: Përmbajtja e. JASON HIRSCHHORN: Po. Shkoni për të marrë përmbajtjen e. Pra, kjo do të shkojë në kujtesën adresojë atje dhe të më japë atë. I përdorur për% c drejtë këtu, sepse nuk janë karaktere ruajtur atje. Pra, ne jemi duke shkuar për të shkuar në atë të adresave ne vetëm e pa - apo ajo ndoshta do të jetë një pak më ndryshe këtë herë që ne të drejtuar programin. Por ne do të shkojnë në atë adresë të cilat ne e dimë ende ekziston dhe të shohim se çfarë është atje. Pra, ajo nuk ka faj seg. Ajo thjesht nuk na ka dhënë asgjë. Ajo mund të ketë na dhënë në të vërtetë diçka, ne thjesht nuk mund ta shohin atë. Dhe kjo shkon prapa në këtë ide - dhe ne nuk do të marrë shumë në kjo, sepse kjo është përtej Qëllimi i këtij kursi. Por kemi folur për këtu, në qoftë se ne shkoi përtej kufijve të array nga 1, ne nuk mund të merrni në telashe. Ndonjëherë, kur ju thjesht shkoni jashtë me 1, ju jeni duke bërë diçka të gabuar, dhe ju mund të merrni në telashe. Por ju nuk gjithmonë të marrë në telashe. Kjo varet se sa e një gjë e keqe që ju bëni, ju jeni do të merrni në telashe. Cili nuk do të thotë, të jetë i lëngshëm me kodin tuaj. Por është për të thënë, programi nuk do të gjithmonë të lë, edhe në qoftë se ju shkoni diku ju nuk jemi duke menduar për të shkuar. Një shembull i mirë i kësaj është, një shumë e njerëzit në problemin e tyre të vendosur 3, e cila u 15, nuk e shikoni caqeve të bordit. Kështu që ju shikuar në të majtë, dukej për të drejtë, dukej në krye, dukej në fund. Por ju nuk e kontrolloni për të parë nëse i lartë në të vërtetë do të ishte në bord. Dhe shumë njerëz që bënë këtë dhe u kthye se në, programi i tyre ka punuar të përkryer, sepse kur se bordi i ishte ruajtur në kujtesë, në qoftë se ju shkoi një të tillë mbi të apo kontrolluar se kujtesa adresën, nuk pati asnjë gjë veçanërisht të tmerrshme për këtë, kështu që programi juaj nuk ka qenë do të bërtas në ju. Por ne ende do të marrë off pikë në qoftë se ju nuk e kontrolloni atë, sepse ju ishin duke bërë diçka që ju nuk ishin menduar për të bërë, dhe ju mund të ketë marrë në telashe. Shanset janë, megjithatë, ju ndoshta nuk e bëri. Pra, kjo është për të treguar se, po, ne ende mund të shkojnë për të. Dhe ne nuk jemi duke marrë në Problemi në këtë rast. Nëse ne u përpoq të bëjë të lexuar 100 karaktere të ardhshëm, ne do të ndoshta merrni në telashe. Dhe ju mund të kodin leximin e ardhshëm 100 karaktere në qoftë se ju doni duke bërë disa lloj për lak. Po. STUDENT: Që nga viti ne kemi qenë të caktuar që Hapësira një vlerë aktuale, ne nuk do të në të vërtetë të jetë në gjendje për të parë asgjë. A duhet të provoni me vendosjen që barabartë për të si c apo diçka? JASON HIRSCHHORN: pyetje e Madhe. Si mund të vendos se vlera - çfarë linjë e kodit mund të shkruaj në linjë shtatë për të bërë atë që keni thënë? STUDENT: Star ptr është e barabartë vetëm quote c përfundojë kuotë të vetme. JASON HIRSCHHORN: Kështu që është vënë një karakter, c, në atë vend, sepse përsëri, se yll do të thotë të shkojnë në atje. Dhe kur përdoret në anën e majtë të një operator detyrë, që është e barabartë me nënshkruajë, ne nuk jemi duke shkuar për të marrë atë vlera aq shumë sa të vendosur këtë vlerë. Tani le të shohim se çfarë ndodh. Ne kemi vënë diçka atje dhe ai ishte aty. Ne quhet pa pagesë. Disa sende ndodhur ndoshta në grumbull. Pra, nuk është më atje. Por përsëri, ne nuk jemi duke marrë në vështirësi për të shkuar atje. Unë jam duke bërë këtë në kodin për të ilustruar se shumë prej këtyre pyetje që ju duhet, ata janë me të vërtetë interesante përgjigjet shumë kohë. Dhe ata janë pyetje me të vërtetë të mirë. Dhe ju mund të kuptoj ato në tuaj në qoftë se, për shembull, ne nuk jemi në seksion. Po. STUDENT: Për shkak se ju nuk jeni dërguar treguesin kudo, ju duhet të përdorin malloc? JASON HIRSCHHORN: Pra, kjo shkon prapa në pyetjen tuaj fillestare. [? ?] A është kjo vetëm një variabël lokale? Malloc këtu nuk është se bindëse. Përdorimi i malloc këtu nuk është se bindëse sepse është e vetëm një variabël lokale. STUDENT: Pra, mund të bëni char yll ptr është e barabartë me përshëndetje? JASON HIRSCHHORN: Oh. Pra, ne jemi duke shkuar për tani të kthehet në pyetjen tuaj fillestare. Unë mendoj se ju nuk janë të kënaqur me përgjigjen time. OK? Si kjo? STUDENT: Po. Prisni. JASON HIRSCHHORN: Dhe ku nuk ju duan të shtypura nga? Pra, ne do të shtypura nga një varg të tillë? STUDENT: Interesting. JASON HIRSCHHORN: Pra, kjo thotë kjo Argumenti ka llojin e karakterit. Pra, kjo duhet të jetë një karakter. STUDENT: Vetëm merr një të parë. JASON HIRSCHHORN: Pra, kjo është ajo që kam thënë më parë. Ashtu si thashë, kjo nuk është e ruajtjen string brenda akrep ndryshueshme. Është ruajtjen - STUDENT: Vlera e parë e vargut. JASON HIRSCHHORN: adresa e vlera e parë e vargut. Nëse ne do të shtypura nga kjo, ne jemi duke marrë vlera brenda akrep. Dhe ne do të shohim se është, me të vërtetë, një adresë memorie. A ka kjo kuptim? Më vjen keq. Prisni, bën që të përgjigjen tuaj pyetja, pse? STUDENT: Po. JASON HIRSCHHORN: Kjo linjë e kodit është duke krijuar një varg dhe pastaj një tjetër akrep variabël që është vënë në atë varg, se array. Po. STUDENT: Pra, nëse ne shkuam një memorie trajtuar më tej, do të kemi h? A ka qenë e ruajtur si një varg? JASON HIRSCHHORN: Si, ne e bëmë - kështu që kjo është e vlefshme për të bërë. Kjo është pika aritmetike, e cila ju djema e kanë parë më parë dhe duhet të jetë relativisht të kënaqur me të. Kjo është e ngjashme me shkrim - nëse do të shkruaj këtë linjë të kodit, ne kemi parë array simbol para. Kjo duhet të na japin të dytën vlera në këtë array, h. Në qoftë se ne e bëmë këtë, kjo duhet të japin Na vlera e dytë në atë rrjet. Për shkak se ajo nuk është duke shkuar në kujtesën Adresa e gjëja e parë, por Adresa kujtim i sendit mbi një. Dhe pastaj dereferences operatori yll që akrep. Dhe përsëri, le të shohim. Ne kemi marrë përsëri h. STUDENT: Çfarë bën pikërisht dereference të thotë? JASON HIRSCHHORN: dereference është një fjalë e zbukuruar për të shkuar në. Shkoni tek kjo dhe për të marrë atë që është atje është që të dereference një akrep. Është vetëm një fjalë për të zbukuruar atë. STUDENT: Nëse do të donte të shtypura të vargut të tërë, mund të kemi të bëjë treguesin ampersand? JASON HIRSCHHORN: OK, ne jemi të do të bëj një pauzë këtu. Ne do të përfundojnë këtu. Simbol ju jep adresën e një vend, kështu që kur ju bëni zëvendësojeni me të një variabël, kjo ju jep adresën ku që variabël është ruajtur. Akrep simbol do të ju jap Adresa e PTR ku ptr është në kujtesën. Ne nuk jemi duke shkuar për të shkuar në me këtë shembull. Ju mund të kuptoj se këto gjëra në tuaj. Por përsëri, kjo mund edhe të jetë një verging bit përtej asaj që ju duhet të dini për Qëllimi i këtij termi-mes - ose ky quiz, në vend. Më vjen keq. Ne do të lëvizin më, sepse unë do të si për të bërë një problem kodim para se të koha është deri. Dhe ne do të kodin atë që unë mendoj se është më bindëse e këtyre shembuj, atoi. Pra, kjo ishte një pyetje në një quiz dy vjet më parë. Dhe unë kam atë në bord këtu. Njerëzit u pyetën në quiz - ata ishin të dhënë pak më shumë tesxt në pyetje, por unë eliminohen Teksti sepse ajo ishte e panevojshme për qëllimet tona tani. Ajo ishte vetëm disa sfond në atë që atoi bëri. Por ju të gjithë e dimë dhe jemi shumë të njohur me atoi. Unë sugjeroj që ju të Kodit, ky në një fletë letre. Unë gjithashtu sugjeroj që ju përdorni strategji se ne kemi shkuar mbi shumë në seksionin tonë. Së pari, sigurohuni që ju kuptoni çfarë atoi vepër. Vizatoni një foto ose të dalë me disa imazhi mendor të tij në kokën tuaj. Tjetra, shkruani nga pseudokod për këtë. Në quiz, në qoftë se të gjithë ju merrni është pseudokod, të paktën ju vënë diçka poshtë. Dhe pastaj hartë që pseudokod onto C. Nëse ju keni një kontroll në tuaj pseudokod, si kontrolloni nëse diçka është 1, se MAP nëse mbi një Gjendja e kështu me radhë. Dhe së fundi, kodin e programit në C. Pra, të kthehemi në atoi dhe të marrë pesë minuta të kodit këtë në një fletë të letër, e cila është ndoshta rreth sasinë e kohës që ju do të marrë në një quiz për atoi kodit. Pesë deri në 15 minuta, pesë deri në 12, për të pesë 10 minuta, është në lidhje me sasinë e kohë ju do të shpenzojnë në këtë pyetje në quiz. Pra, të marrë pesë minuta tani, ju lutem. Dhe në qoftë se keni ndonjë pyetje, të rritur dora jote dhe unë do të vijnë rreth. [biseda SIDE] JASON HIRSCHHORN: OK, kështu që që ishte pesë minuta. Kjo ishte ndoshta për sasinë e kohë ju do të shpenzojnë në se në një quiz, ndoshta në fund të ulët të asaj kohe. Ne do të radhitje në pak. Le të fillojmë coding këtë. Dhe në qoftë se ne nuk do të marrë të gjithë rrugën nëpër, përgjigjet për këtë dhe kjo pyetje quiz janë në dispozicion, përsëri, Fall 2011 është kur kjo pyetje u shfaq në quiz. Dhe kjo ishte me vlerë tetë pikë në quiz pastaj. Tetë pikë është në fund të lartë të Shuma e pikëve diçka vlen. Shumica e pyetjeve janë në varg nje deri gjashte pika. Pra, kjo është një më sfidues pyetje, me siguri. A mund dikush merrni mua filloi? Në përgjithësi, ajo që do të shkojmë të doni të bëni me këtë funksionojë atoi, logjikisht? Çfarë duam të bëjmë? Pra, ne jemi duke shkuar për të shkruar disa pseudokod. STUDENT: Convert karaktere në integers. JASON HIRSCHHORN: Convert karaktere në integers. OK. Pra, sa karaktere jemi ne do të duhet të kalojnë nëpër? STUDENT: Të gjithë ata. STUDENT: Të gjitha personazhet në vargun. JASON HIRSCHHORN: Të gjitha karaktere në vargun. Pra, nëse kemi dashur të kalojnë nëpër çdo karakter në një varg, ajo është një gjë e në C ne kemi parë se ka lejuar ne të kalojnë nëpër çdo karakter në një varg? STUDENTËT: Një për lak. JASON HIRSCHHORN: Një për lak. Pra, ne do të lak nëpër çdo karakter në s. Atëherë çfarë do të shkojmë të dëshironi të bëni kur të kemi një karakter të veçantë? Thuaj ne jemi duke kaluar një 90. Ne kemi marrë 9. Kjo është një karakter. Çfarë duam të bëjmë me që karakteri 9? STUDENT: Zbres atë nga karakteri 0? STUDENT: Add 0? JASON HIRSCHHORN: Zbres ajo nga karakteri 0? STUDENT: Po. JASON HIRSCHHORN: Pse ju doni të bëni këtë? STUDENT: [padëgjueshme] vlera. Vlera e tij int. JASON HIRSCHHORN: OK, kështu që ne të karakter 9, zbres atë nga Karakteri 0 për të marrë një integer aktual 9. Sweet. Dhe si nuk e dini që karakteri 9 minus 0 karakteri është 9? Çfarë tabelë e ju duken? STUDENT: Nuk logjikisht nëntë vende midis 9 dhe 0. Ose ju mund të shikoni në tabelën ASCII. JASON HIRSCHHORN: Tabela ASCII. Por po, ju jeni të saktë si. Pra, ne zbres 0. Deri tani ne kemi numër i plotë 9. Dhe ajo që duam të bëjmë me këtë? Në qoftë se ne kemi 90, është numër i plotë i parë ne kemi, ajo që ne duam të bëjmë? STUDENT: Unë do të vënë në një numër të plotë të përkohshme array, pastaj të bëjë matematikë në të më vonë për ta bërë atë në fund. JASON HIRSCHHORN: OK. STUDENT: Ju mund të fillojnë në fund të array dhe më pas të shkojë përpara në mënyrë se çdo herë që ju të ecur përpara, ju shumohen atë me 10. JASON HIRSCHHORN: OK. Kjo tingëllon si një shumë e ide bindëse. Ne mund të fillojnë në fund të array tonë, dhe ne mund të përdorim strleng. Ne mund të përdorim strleng në këtu. Ne do të merrni gjatësinë e vargut tonë. Ne të fillojë në fund. Dhe + një të parë, ne vetëm të marrë atë numër i plotë, dhe ndoshta ne krijimin si një variabël i ri numër i plotë deri të lartë, ku ne jemi ruajtjen e çdo gjë. Pra, ne lak nëpër çdo char në s nga përsëri në front, zbresim 0, dhe atëherë ne të marrë atë, dhe në varësi të ku është, ne e shumohen atë me një fuqi prej 10. Për shkak se e para, ajo që bëjmë ne shumohen karakterin rightmost nga? STUDENT: 10 me 0. JASON HIRSCHHORN: 10 me 0. Çka shumohen i dyti Karakteri rightmost nga? STUDENT: [padëgjueshme]. JASON HIRSCHHORN: Çfarë? STUDENT: 10 me 1. JASON HIRSCHHORN: 10 me 1. Karakteri i tretë-rightmost? STUDENT: 10 me 2. JASON HIRSCHHORN: 10 me 2. STUDENT: Na vjen keq, unë nuk e kuptoj ajo që ne po bëjmë këtu. JASON HIRSCHHORN: OK, le të kthehemi, atëherë. Pra, ne jemi duke shkuar për të marrë kaloi në një varg. Sepse ne jemi me shkrim atoi. Pra, ne të marrë kaluar në një varg. Thuaj ne jemi duke kaluar në vargun 90. Gjëja e parë që ne jemi duke shkuar për të bërë është vendosur një variabël i ri numër i plotë që ne jemi vetëm do të krijojë si numër të plotë tonë të ri. Kjo është ajo që ne jemi duke shkuar te kthyer ne fund. Ne duhet të kalojnë nëpër çdo karakter në string sepse ne kemi vendosur se ne kemi nevojë për të prekur çdo një dhe pastaj shtoni atë në numër të plotë tonë të ri. Por ne nuk mund të shtoni atë si një numër. Ne nuk mund të marrë vetëm 9 dhe shtoni 9 me numër të plotë tonë. Kjo varet nga ajo që vendi ajo është në varg. Ne do të duhet për të shumëfishohen ajo me një fuqi prej 10. Sepse kjo është se si bazë 10 punon. Pra, ne jemi duke shkuar për të marrë aktuale karakter, ose integer aktuale numër, duke zbritur karakter 0 nga karakteri 9 si ne e bëmë me zbritur kapitalit karakter A nga çfarëdo karakteri kemi pasur në një nga ato probleme. Pra, ne do të vërtetë të marrë një numër nga 0 deri 9 ruhen si një numër të vërtetë, dhe ne do të shumohen atë me një fuqi prej 10 në varësi se ku ne jemi në vargun. Dhe pastaj ne do të shtoni atë në variabël integer tonë të ri. Pra, çfarë do të duken si kjo do të të - ne do të tërheqë mbi këtu. Nëse do të marrë kaluar në vargun 90 - STUDENT: [padëgjueshme]. JASON HIRSCHHORN: Po atoi merr një varg. Pra, ne jemi duke shkuar për të shkuar nëpërmjet mbajnë. Ne do të marrë kaluar në 90. Ne do të shkojmë nga mbrapa në front. Ne të marrë 0. STUDENT: Më vjen keq. Ndoshta kjo është budalla. Nëse ne jemi duke kaluar në një varg, pse është ajo që ne jemi 90 duke kaluar në? Sepse 90 eshte nje numer i plote. JASON HIRSCHHORN: Për shkak se atoi merr një string dhe e kthen atë në numër të plotë përfaqësimin e atë varg. Por vargu 90 nuk është numër i plotë 90 ose numri 90. Vargu 90 është një grup i dy, apo tre karaktere, në vend, 9 Karakteri, karakteri 0, dhe backslash 0 karakteri. Dhe ne jemi me shkrim atoi sepse, për shembull, kur ju keni marrë komandën Argumenti line, dhe është e ruajtur në ARGV, është e ruajtur si një varg. Por në qoftë se ju dëshironi për të trajtuar atë si një numër, ju keni nevojë për të kthyer atë në një numër i plotë aktuale. Të cilat ne e bëmë një nga grupe tona problemit. Të cilat ne e bëmë në një numër e përcakton tonë me probleme. Gjithkush që ka një numër të plotë si një argument command line. Pra, kjo është arsyeja pse funksioni ynë atoi merr një varg. Pra, përsëri, në shembullin tonë këtu, ne jemi do të marrë një të fundit. Ne do të zbres karakterin 0 prej saj, sepse personazhet 0 zbritet nga karakteri 0 ju jep Numri aktual 0, sipas ASCII math që ne bëjmë. Sepse personazhet janë të përfaqësuara si të ndryshme se sa aktual i tyre - karakter një, për shembull, vogle a është 97. Nuk është - oops! Kjo nuk është çdo gjë që ju do të presin ajo që të jetë, 0, per shembull. Kështu që ju duhet të zbres karakter një për të marrë 0. Pra, ne jemi duke shkuar për të bërë këtë këtu për të marrë numrin aktual. Dhe pastaj ne do të shumohen atë me një fuqi prej 10 në varësi të ku të është në varg, dhe pastaj të marrë atë dhe shtoni atë në mbajtës tonë vend variabël kështu që ne mund të dalë me numër i plotë ynë final të ri. A që ka kuptim për të gjithë? Pra, ne nuk do të Kodit, ky tani për tani, sepse ne jemi duke marrë të shkurtër në kohë. Unë kërkoj falje për kohën e që. Por kjo është ajo që, me shpresë, ju do të jetë në gjendje të bëjë në quiz - në të fundit, të marrë këtë pseudokod shkruar jashtë. Dhe pastaj, në qoftë se ne ishim për të shkruar pseudokod, në të vërtetë, ne mund të bëjmë këtë shumë shpejt. Çdo linjë e komenteve ne kemi shkruar këtu përkthehet në rreth një linjë e kodit C. Shpalljen e ndryshueshme të ri, shkrim një lak, disa zbritje, disa shumëzim, dhe disa detyrë. Ne ndoshta do të duan gjithashtu të shkruar një linjë të kthimit. Ne gjithashtu mund të duan të vënë disa kontrolle në këtu. Po. STUDENT: Pra, mund të trajtojmë s si vargun aktual? Sepse unë e di se është vetëm një adresë. Si, si do ta merrni gjatësinë e string duke kaluar nëpër? JASON HIRSCHHORN: Pra, si e bëri gjatësia e vargut? Strlen. STUDENT: strlen, po. Por mund të vendosni s si argument për këtë? JASON HIRSCHHORN: Pra strlen merr një yll char. Dhe ai vijon yllin char, dhe kjo mban numëruar deri sa ajo merr për një backslash 0. strlen ishte në të vërtetë një nga programet e tjera ne ishin duke shkuar për kodin. Kjo është një tjetër e mirë për të kodit. Se një është pak më e lehtë, sepse nëse ju jeni do të mendoni për atë konceptualisht - Unë vetëm tha me zë të lartë - strlen poshtë një tregues dhe mban sipër dhe numërimin dhe regjistrimin deri keni arritur një backslash 0. STUDENT: OK, got it. JASON HIRSCHHORN: Pra, më të mirë të fat në quiz 0 nesër. Nëse keni ndonjë pyetje, unë do të jetë jashtë pas kësaj. Të ndjehen të lirë të email mua. Arrijnë nga vetë TF tuaj nëse ju jeni jo në seksionin tim, ose të merrni tim qoftë se ju e doni atë. Nëse ju doni të trullos dhe të thjesht dërgoni mua një e-mail, një email freakout, unë do të shkosh, si, një fytyrë smiley, apo, si, një shaka apo diçka. Pra, të ndjehen të lirë për të bërë këtë si. Fat të mirë përsëri, dhe unë do shoh se jeni të gjithë javën e ardhshme.