[Powered by Google Translate] [Vika 4] [David J. Malan] [Harvard University] [Þetta er CS50.] [CS50.TV] Allt í lagi, þetta er CS50, og þetta er upphaf 4. viku, og þetta er einn af the hægur mögulega flokkun reiknirit. Hver var það sem við horfðum bara þarna? Það var kúla tegund, í því skyni stór O (n ^ 2) + summa, og vér erum ekki þeir einu í þessum heimi til að virðast vita hvaða kúla tegund er eða hlaupandi tími til þess. Reyndar var þetta viðtal við Eric Schmidt Google og fyrrum Senator Barack Obama bara fyrir nokkrum árum síðan. Nú, Senator, þú ert hér á Google, og ég eins og til hugsa af formennsku sem atvinnuviðtal. Nú er það erfitt að fá starf sem forseti, og þú ert að fara í gegnum álagið nú. Það er líka erfitt að fá vinnu á Google. Við höfum spurningar, og við biðjum frambjóðendur spurningum okkar, og þetta er frá Larry Schwimmer. Þið krakkar held ég að grínast? Það er hérna. Hvað er skilvirkasta leiðin til að raða milljón 32-bita heiltölur? [Hlátur] Vel Fyrirgefðu. >> Nei, nei, nei, nei. Ég held að kúla tegund væri röng leið til að fara. Svona, sem sagði honum þetta? Síðasta vika muna við tókum pásu frá kóða, að minnsta kosti í einn dag, og byrjaði með áherslu á sumum meiri hugmyndum og leysa vandamál almennt í tengslum við að leita og flokka, og við kynna eitthvað sem við vissum ekki smellu þetta nafn á síðustu viku, en asymptotic ritháttur, Big O, Big Omega, og stundum Big Þeta tákn, og þetta voru einfaldlega leiðir að lýsa gangi tíma reiknirit, hversu mikinn tíma það tekur fyrir reiknirit til að keyra. Og þú getur muna að þú talaði um að keyra tíma hvað varðar stærð inntak, sem við köllum yfirleitt n, hvað sem vandamálið kann að vera, þar sem n er fjöldi fólks í herberginu, fjölda síðna í símaskránni, og við byrjuðum að skrifa það út eins og O (n ^ 2) eða O (n) eða O (n log n), og jafnvel þegar stærðfræði ekki alveg að vinna út svo fullkomlega og það var N ² - N / 2 eða eitthvað svoleiðis við viljum í staðinn bara henda burt sumir af the lægri röð skilmálum, og hvatning er það sem við viljum í raun konar markmið leið að meta árangur af forritum eða árangur reiknirit að í lok dags hefur ekkert að gera, til dæmis, með hraða tölvunni þinni í dag. Fyrir dæmi, ef þú framkvæma kúla konar, eða þú koma Mergesort eða val sort á tölvunni í dag, a 2 GHz tölva, og þú keyrir það, og það tekur nokkurn fjölda sekúndur, á næsta ári það er 3 GHz eða 4 GHz tölva, og þú gætir þá halda því fram að "Wow, reiknirit minn er nú tvisvar sinnum eins hratt, "þegar í raun það er augljóslega ekki málið. Það er bara vélbúnaður hefur fengið hraðar en tölvan hefur ekki, og svo að við viljum virkilega að henda hlutum eins margfeldi af 2, fleiri eða 3 þegar kemur að því að lýsa hversu hratt eða hvernig hægt er reiknirit er og í raun bara að einbeita á n eða einhverju þáttur hennar, sumir máttur þeirra eins og um er að ræða tegund frá síðustu viku. Og muna að með hjálp Mergesort gátum við gert svo miklu betur en tegund kúla og val sortera og jafnvel insertion sort. Við fengum niður n log n, og aftur, muna að log n almennt er átt við eitthvað sem vex hægar en N, svo N log n svona langt var góð vegna þess að það var minna en n ². En til að ná N log n með Mergesort hvað var grunn sýkill um hugmynd sem við þurftum að nýta að við skuldsett einnig aftur í viku 0? Hvernig fengum við takast á við flokkun vandamál snjall með Mergesort? Hver var lykillinn innsýn, kannski? Einhver á öllum. Jæja, við skulum taka skref til baka. Lýsið Mergesort á eigin orðum. Hvernig var það? Jæja, munum við róa aftur viku 0. Jæja, já. [Inaudible nemanda] Jæja, gott, svo við skipt array af tölum í 2 stykki. Við raðað hvert þessara verka, og þá erum við sameinuð þeim, og við höfum séð þessa hugmynd áður en að taka vandamál sem er þetta stór og chopping það upp í vandamál sem er þetta stór eða þetta stór. Muna Símaskrárstillingar dæmi. Muna sjálf-Talning reiknirit frá vikum, svo Mergesort var tekin þessi sauðakóðanum hér. Þegar þú ert að fá n þætti, fyrst það var geðheilbrigði stöðva. Ef n <2 þá gera ekki neitt yfirleitt því ef n <2 þá n er augljóslega 0 eða 1, og svo ef það er annað hvort 0 eða 1 er ekkert að flokka. Þú ert búinn. Listinn er þegar trivially raðað. En annars ef þú hefur fengið 2 eða fleiri þætti fara á undan og skipta þá í 2 helminga, vinstri og hægri. Raða öllum þessum helminga, og síðan sameina flokkuð helminga. En vandamálið hér er að við fyrstu sýn þetta er eins og við erum punting. Þetta er hringlaga skilgreining á því ef ég hef spurt þig að raða þessum n þætti og þú ert að segja mér "Allt í lagi, allt í lagi, munum við raða þeim n / 2 og þá N / 2 þætti," þá næsta spurning mín er að fara að vera "Fine, hvernig raða þér n / 2 þættir?" En vegna uppbyggingu þessarar áætlunar, vegna þess að það er þessi grunn tilfelli, svo að segja, þetta sérstaka mál sem segir ef n er > Sara, allt í lagi. Kelly. >> Kelly og? Willy. >> Willy, Sara, Kelly, og Willy. Núna hef ég verið beðin um málið með einhverjum hversu margir eru upp á þessu stigi, og ég hef ekki hugmynd. Þetta er mjög langur listi, og svo í staðinn ætla ég að gera þetta bragð. Ég ætla að spyrja mann við hliðina á mér til að gera mest af vinnu, og þegar hún er búin að gera mest af vinnu Ég ætla að gera sem minnst magn af vinnu hægt og bara bæta við 1 til hvað svarið hennar er, svo hér við fara. Ég hef verið beðin um hversu margir eru á sviðinu. Hversu margir eru á sviðinu vinstra megin við þig? Vinstri mig? >> Jæja, en ekki svindla ekki. Það er gott, það er rétt, en ef við viljum halda áfram þessum reglum við skulum gera ráð fyrir að þú vilt álíka Punt þetta vandamál vinstra megin við þig, Svo frekar en að svara beint að fara á undan og bara framhjá peninginn. Ó, hversu margir til vinstri á mig? Hversu margir eru til vinstri? 1. [Hlátur] Jæja, svo 0, svo hvað nú Willy hefur gert er þú hefur skilað svari þínu þessa stefnu segja 0. Nú, hvað ættir þú að gera? >> 1. Jæja, svo þú ert 1, þannig að þú segir, "Allt í lagi, ég ætla að bæta við 1 til hvað telja Willy var, "svo 1 + 0. Þú ert nú 1 svo svar þitt til hægri er nú- 1. >> Og mitt væri 2. Gott, svo þú ert að taka fyrri svar 1, bæta lágmarks magn af vinna sem þú vilt gera, sem er 1. Þú hefur nú 2, og þú lætur þá mér hvaða gildi? 3, meina ég, því miður, 2. Gott. Jæja, við höfðum 0 til vinstri. Þá höfðum við 1, og þá erum við að bæta við 2, og nú þú ert að fötlun mér númer 2, og svo ég er að segja, allt í lagi, 1, 3. Það er örugglega 3 menn standa við hliðina á mér á þessu stigi, þannig að við gætum hafa augljóslega gert þetta mjög línulega, mjög mikið í augljós tísku, en hvað gerði við gerum í raun? Við tókum vandamál af stærð 3 í upphafi. Við braut þá niður í vandamál af stærð 2, þá vandamál af stærð 1, og þá loks grunn tilfelli var í raun, ó, það er enginn þarna, á hver benda Willy aftur í raun a harður-dulmáli svara nokkrum sinnum, og sú síðari var þá bubbled upp, bubbled upp, bubbled upp, og þá með því að bæta í þessu einn til viðbótar 1 við höfum innleitt þessa undirstöðu hugmynd um endurkvæmni. Nú, í þessu tilfelli er ekki í raun að leysa vandamál einhver betur þá höfum við séð svona langt. En hugsa um reiknirit sem við höfum gert á sviðinu svona langt. Við fengum 8 stykki af pappír á chalkboard, á vídeó þegar Sean var að leita að númer 7, og hvað gerði hann í raun? Jæja, gerði hann ekki hvers konar deila og sigra. Hann hafi ekki gert neina endurkvæmni. Frekar að hann gerði bara þetta línulega reiknirit. En þegar við kynnt hugmyndir um raðað númer á sviðinu lifandi í síðustu viku svo við höfðum þetta eðlishvöt að fara í miðju, á hver benda höfðum minni lista af stærð 4 eða annan lista af stærð 4, og þá höfðum við nákvæmlega sama vandamál, þannig að við endurtekið, endurtekið, endurtekið. Með öðrum orðum, recursed við. Þakka þér kærlega fyrir að 3 sjálfboðaliðum okkar hér til að sýna fram endurkvæmni með okkur. Við skulum sjá hvort við getum ekki gert þetta nú aðeins meiri steypu, leysa vandamál sem aftur við gætum gert nokkuð auðveldlega, en við munum nota það sem stepping steinn til að innleiða þessa undirstöðu hugmynd. Ef ég vil að reikna samantekt á fullt af tölum, til dæmis, ef þú framhjá á númer 3, Mig langar að gefa þér gildi Sigma 3, þannig að summan af 3 + 2 + 1 + 0. Ég vil fá til baka svar 6, þannig að við munum innleiða þessa Sigma virka, þessi samantekt virka sem aftur tekur í inntak, og þá skilar samantekt af þeim fjölda alla leið niður í 0. Við gætum gert þetta nokkuð einfaldlega, ekki satt? Við gætum gert þetta með einhvers konar lykkja uppbyggingu, svo látið mig fara á undan og fá það byrjaði. Hafa stdio.h. Leyfðu mér að fá mér í haf til að vinna með hér. Við skulum spara þetta sem sigma.c. Og ég ætla að fara í hér, og ég ætla að lýsa því yfir að int n, og ég ætla að gera eftirfarandi á meðan notandinn er ekki vinna. Þó að notandi hefur ekki gefið mér jákvæða tölu láta mig fara á undan og hvetja þau til n = GetInt, og láta mig gefa þeim nokkrar leiðbeiningar um hvað á að gera, svo printf ("jákvæð heiltala vinsamlegast"). Bara eitthvað tiltölulega einfalt eins og þetta þannig að þegar við högg línu 14 við höfum nú jákvæð heiltala væntanlega í n. Nú skulum gera eitthvað með það. Leyfðu mér að fara á undan og reikna samantekt, svo int summa = Sigma (n). Sigma er bara samantekt, svo ég ætla bara að skrifa það á áhugamaður hátt. Við munum bara kalla það það Sigma. Það er summa, og nú ætla ég að prenta út niðurstöðu, printf ("Summa er% d \ n", summa). Og þá ég aftur 0 fyrir gott mál. Við höfum gert allt sem þetta forrit krefst nema áhugaverða hluti, sem er til í raun innleiða Sigma virka. Leyfðu mér að fara niður á botn, og láta mig lýsa virka Sigma. Það er got að taka breytu sem er í heiltölu tegund, og hvaða gögn gerð vil ég aftur væntanlega frá Sigma? Int, vegna þess að ég vil það til að passa væntingar mínar á línu 15. Í hér láta mig fara á undan og framkvæma þetta á mjög einfaldan hátt. Við skulum fara á undan og segja int summa = 0, og nú ætla ég að fara að hafa smá fyrir lykkju hér það er að fara að segja eitthvað eins og þetta, fyrir (INT i = 0; I <= fjöldi, i + +) summan + = i. Og svo ætla ég að fara aftur summa. Ég gæti hafa innleitt þetta í allir tala af lifnaðarhættir. Ég hefði getað notað meðan lykkja. Ég hefði getað sleppt því að nota summu breytu ef ég vildi virkilega að, en í stuttu máli, höfum við bara virka að ef ég gerði ekki Goof lýsir summa er 0. Þá iterates það frá 0 á allt í gegnum fjölda, og á hverjum endurtekning það bætir að núverandi gildi fjárhæð og þá skilar summu. Nú, það er smá hagræðingu hér. Þetta er sennilega sóun skref, en svo vera það. Það er allt í lagi í bili. Við erum að minnsta kosti að vera ítarlegur og fara 0 alla leið upp. Ekki mjög erfitt og frekar einfalt, en það kemur í ljós að við Sigma virka við höfum sömu tækifæri eins og við gerðum hér á sviðinu. Á sviðinu við telja hversu margir voru við hliðina á mér, en í stað þess að ef við vildum að telja númer 3 + 2 + 1 niður í 0 við gátum álíka Punt að virka að ég mun í staðinn lýsa eins og að vera endurkvæma. Hér skulum gera athuga fljótur geðheilbrigði og ganga úr skugga um að ég gerði ekki Goof. Ég veit að það er að minnsta kosti eitt í þessu forriti sem ég gerði rangt. Þegar ég högg koma inn er ég að fara til að fá hvers konar öskra á mig? Hvað er ég að fara að æpa á um? Já, ég gleymdi frumgerð, þannig að ég er að nota aðgerð sem heitir Sigma á línu 15, en það er ekki lýst fyrr en línu 22, svo ég fara best stanslaust upp hér og lýsa frumgerð, og ég segi int sigma (int tala), og það er það. Það er framkvæmd í botn. Eða önnur leið að ég gæti leyst þetta, Ég gæti farið að virka þarna, sem er ekki slæmt, en að minnsta kosti þegar forrit fara að fá lengri, hreinskilnislega, Ég held að það sé nokkur gildi í alltaf hafa helstu efst svo að þú í lesandanum að opna skrána og þá strax sjá hvað forrit er að gera án þess að þurfa að leita í gegnum það að leita að helstu virkni. Við skulum fara niður í flugstöðinni glugga mínum hér, að reyna að gera Sigma gera Sigma, og ég ruglaður upp hér líka. Óbeina yfirlýsingu um GetInt virka þýðir að ég hef gleymt að gera hvað? [Inaudible nemanda] Gott, svo virðist algeng mistök, þannig að við skulum setja þetta upp hér, cs50.h, og nú skulum við fara aftur til stöðvarinnar gluggann minn. Ég hreinsa skjáinn, og ég mun endursýning að Sigma. Það virðist hafa tekið saman. Leyfðu mér að hlaupa Sigma. Ég slá í númer 3, og ég var að fá 6, svo ekki strangt stöðva, en að minnsta kosti það virðist vera að vinna við fyrstu sýn, en nú skulum rífa það í sundur, og við skulum nýta í raun hugmynd um endurkvæmni, aftur, á mjög einfaldan samhengi þannig að í tíma nokkrar vikur þegar við byrjum að kanna áhugamaður gögn uppbygging en fylki höfum við annað tól í tól sem að vinna þau gögn uppbygging sem við munum sjá. Þetta er endurtekningu nálgun, lykkja sem byggir á aðferðum. Láttu mig frekar nú að gera þetta. Leyfðu mér í staðinn segja að samantekt á fjölda niður í 0 er í raun það sama og númer + Sigma (tala - 1). Með öðrum orðum, alveg eins og á sviðinu ég punted hvert af fólki við hliðina á mér, og þeir síðan haldið punting þar við botninum loksins út á Willy, sem þurfti að skila harða dulmáli svar eins 0. Hér nú erum við álíka punting í Sigma sama virka eins og var upphaflega kallað, en lykillinn innsýn hér er að við erum ekki að kalla Sigma samur. Við erum ekki farið í n. Við erum greinilega farið í fjölda - 1, svo örlítið minni vandamál, örlítið minni vandamál. Því miður, þetta er ekki alveg lausn enn, og áður en við gætum hvað gæti verið stökk út eins og augljóst við sum ykkar láta mig fara á undan og endursýning gera. Það virðist að safna saman í lagi. Leyfðu mér að endursýning Sigma með 6. Úpps, láttu mig endursýning Sigma með 6. Við höfum séð þetta áður, að vísu óvart síðasta tíma eins og heilbrigður. Af hverju gerði ég þetta dulinn skiptingu kenna? Já. [Inaudible nemanda] Það er engin stöð tilfelli, og nánar tiltekið, það gerðist sennilega? Þetta er einkenni um hvaða hegðun? Segðu það svolítið hávær. [Inaudible nemanda] Það er óendanlegur lykkja raun, og vandamálið með óendanlega lykkjur þegar þeir taka endurkvæmni í þessu tilviki virka kalla sig, hvað gerist í hvert skipti sem þú hringja í aðgerð? Jæja, hugsa til baka hvernig við lagt út á minni tölvu. Við sögðum að það er þessi klumpur af minni kallast stafla sem er neðst, og í hvert skipti sem þú kalla virka aðeins meira minni fær setja á þetta svokallaða stafla inniheldur staðbundnar breytur sem virka á eða breytur, svo ef Sigma kallar Sigma símtöl Sigma kallar Sigma  kallar Sigma Hvar endar þessi saga enda? Jæja, overruns að lokum heildarfjárhæð af minni sem þú hefur í boði fyrir tölvuna þína. Þú umframmagn hluti sem þú átt að vera í, og þú færð þessa skiptingu kenna, algerlega varpað, og hvað algerlega varpað þýðir að ég hef nú til skrá sem kallast algerlega sem er skrá sem inniheldur núll og sjálfur sem í raun í framtíðinni verður greiningarskyni gagnlegt. Ef það er ekki augljóst að þér þar sem galla er þú getur raunverulega gera a hluti af réttar greiningar, svo að segja, á þessum sorphaugur algerlega skrá, sem, aftur, er bara allt fullt af núllum og sjálfur sem sýnir í raun stöðu forritinu í minni Um leið og hún hrundi á þennan hátt. The festa hér er að við getum ekki bara í blindni aftur Sigma, fjöldi + Sigma á örlítið minni vandamál. Við þurfum að hafa einhvers konar tilfelli stöð hér, og hvað ætti að byggja málið sé sennilega? [Inaudible nemanda] Jæja, svo lengi sem talan er jákvætt að við ættum í raun að skila þessu, eða setja annan hátt, ef talan er, segjum, <= á 0 þú veist hvað, ég fara á undan og aftur 0, líkt Willy gerði, og annað, ég ætla að fara á undan og aftur þetta, svo það er ekki það mikið styttri en endurtekningu útgáfa sem við þeyttum upp fyrst með a for lykkju, en taka eftir því að það er þetta tegund af glæsileika þess. Í stað þess að skila sumir tala og framkvæma allt þetta stærðfræði og bæta það upp með staðbundnum breytur þú ert staðinn að segja "Allt í lagi, ef þetta er frábær auðvelt vandamál, eins og talan er <0, láttu mig aftur strax 0. " Við ætlum ekki að standa styðja neikvæðar tölur, þannig að ég ætla að harður kóða gildi 0. En annars, til að framkvæma þessa hugmynd toppur allar þessar tölur saman sem þú getur í raun að taka smá bita út af vandamálinu, alveg eins og við gerðum hér á sviðinu, þá Punt the hvíla af the vandamál að næsta manni, en í þessu tilfelli er næsta manneskja er sjálfur. Það er samur heitir virka. Bara gefa það í minni og minni og minni vandamál í hvert skipti, og jafnvel þó að við höfum ekki alveg formlega hluti í kóðann hér þetta er nákvæmlega það sem var að gerast í viku 0 með símaskránni. Þetta er nákvæmlega það sem var að gerast á undanförnum vikum við Sean og með sýnikennslu okkar að leita að tölum. Það er að taka vandamál og deila honum aftur og aftur. Með öðrum orðum, það er leið nú að þýða þetta raunverulegur veröld byggja, þetta hærra stigi reisa að skipta og sigra og gera eitthvað aftur og aftur í kóða, þannig að þetta er eitthvað sem við munum sjá aftur með tímanum. Nú, eins og innskot, ef þú ert nýr til endurkvæmni þú ættir að minnsta kosti að skilja nú hvers vegna þetta er fyndið. Ég ætla að fara á google.com, og ég ætla að leita að nokkrar ábendingar og bragðarefur um endurkvæmni, slá. Segðu mann við hliðina á þér ef þeir voru ekki að hlæja núna. Áttir þú við endurkvæmni? Áttir þú við-Ah, svona. Jæja, nú það er restin af öllum. Smá páska egg embed einhversstaðar þar í Google. Sem innskot, einn af the hlekkur við að setja á heimasíðu á námskeiði á í dag er bara þetta net af ýmsum reiknirita flokkun, sum sem við skoðuðum í síðustu viku, en það er gott um þessa sjónsköpun eins og þú reynir að vefja huganum um ýmsa hluti sem tengjast reiknirit veit að þú getur mjög auðveldlega byrjað með mismunandi gerðir af aðföngum. Inntak baka allt, inntak mestu raðað, að inntak handahófi og svo framvegis. Eins og þú reynir að, aftur, greina þessi atriði í huga þínum átta sig á að þetta URL á heimasíðu Námskeiðið er á fyrirlestrum síðu gæti hjálpað þér ástæða gegnum eitthvað af þeim. Í dag fáum við að lokum að leysa þetta vandamál frá stund til baka, sem var að þetta skipti virka bara ekki að vinna, og það var grundvallaratriði vandamál með þessu virka skipti, markmiðið sem var, aftur, til að skiptast á gildi hér og hér svo að þetta gerist? Þetta var í raun ekki vinna. Hvers vegna? Já. [Inaudible nemanda] Einmitt, er skýringin á þessu bugginess einfaldlega var vegna þess að þegar þú hringir aðgerðir í C og þær aðgerðir taka rökum, eins og a og b hér þú liggur í afrit af hvaða gildi þú ert að veita til að virka. Þú ert ekki að veita upprunalegu gildi sig, þannig að við sáum þetta í samhengi buggyc, buggy3.c sem horfði smá eitthvað eins og this. Muna að við höfðum x og y frumstilla í 1 og 2. Við prenta þá út það sem þeir voru. Ég hélt þá að ég var að skipta þeim með því að kalla skipti af x, y. En vandamálið var að skipta unnið, en aðeins í umfangi skipti virka sig. Um leið og við högg línu 40 þá skipti gildi var hent, og svo ekkert í upphaflegu hlutverki helsta var í raun breyst, þannig að ef þú hugsa til baka þá á því hvað það lítur út eins og í skilmálar af minni okkar ef vinstri-hönd hlið af the borð táknar- og ég ætla að gera mitt besta fyrir alla til að sjá þetta, ef þetta vinstri-hönd hlið af the borð táknar, segja, RAM, og stafla er að fara að vaxa á upp þennan hátt, og við köllum virka eins og helstu, og helstu hefur 2 staðbundnar breytur, x og y, skulum lýsa þeim sem X hér, og við skulum lýsa þessum sem y hér, og við skulum setja í gildi 1 og 2, þannig að þetta hér er aðal, og þegar helstu kallar skipti virka stýrikerfi gefur skiptasamninga virka eigin swath sitt minni á mánudaginn, eigin ramma hennar á mánudaginn, svo að segja. Það úthlutar einnig 32 bita fyrir þessar ints. Það gerist að kalla þá A og B, en það er algerlega handahófskennt. Það gæti hafa kallað þær hvað sem það vill, en hvað gerist þegar helstu símtöl skipti er það tekur þetta 1, leggur eintak þar, leggur eintak þar. Það er 1 önnur staðbundin breytu í skipti, þó kallast hvað? >> Tmp. Tmp, svo látið mig gefa mér annan 32 bita hér, og hvað gerði ég í þessa aðgerð? Ég sagði int tmp fær, svo hefur a 1, svo ég gerði þetta þegar við spiluðum síðast með þessu dæmi. Þá fær B, svo B er 2, svo nú þetta verður 2, og nú fær B afleysingamanneskja, svo afleysingamanneskja er 1, svo nú verður B þetta. Það er frábært. Það í uppnámi. En þá um leið sem skilar minni swap er hverfur í raun þannig að það er hægt að endurnýta af einhverju öðru hlutverki í framtíðinni, og helstu er augljóslega alveg óbreytt. Við þurfum a vegur af grundvallaratriðum að leysa þetta vandamál, og í dag munum við að lokum hafa a vegur til að gera þetta þannig við getum kynna eitthvað sem kallast músina. Það kemur í ljós að við getum leyst þetta vandamál ekki með því að farið í afrit af x og y heldur með því að láta í hvað, heldur þú, að skipti aðgerð? Já, hvað um heimilisfang? Við höfum í raun ekki talað um tölur í miklum smáatriðum, en ef þetta Blackboard táknar minni tölvu míns við gætum vissulega byrjað tala bæti í RAM minni og segja að þetta er bæti # 1, þetta er bæti # 2, bæti # 3, bæti # 4, bæti # ... 2 milljarðar ef ég hef 2 gígabæta vinnsluminni, svo við gætum örugglega koma upp með sumir handahófi númerakerfið fyrir öll einstök bæti í minni tölvunnar minnar. Hvað ef í stað þegar ég kalla skipti frekar en að fara í afrit af x og y hvers vegna þarf ég ekki að fara í staðinn í tölu x hér, heimilisfang y hér, í raun póstfang x og y af því skipta þá, ef hann er upplýstur á heimilisfang í minni x og y, þá skipti, ef við þjálfun honum smá, hann gæti hugsanlega aka á þetta netfang, svo að segja, x og breyta fjölda þar, þá reka á heimilisfang y, breyta fjölda þar, jafnvel þó að í raun að fá afrit af þeim gildum sjálfur, svo jafnvel þó að við töluðum um þetta eins og að vera minni aðal- og þetta sem að skipta á um minni öflugur og hættuleg hluti C er að allir virka getur snerta minni hvar sem er í tölvunni, og þetta er öflugur í að þú getur gert mjög fínt hluti með tölvuforritum í C. Þetta er hættulegt því að þú getur líka skrúfa upp mjög auðveldlega. Í raun, að einn af algengustu leiðir til forrit þessa dagana að nýta enn er fyrir forritara að gera sér grein að hann eða hún er að leyfa gögn til að skrifa í stað í minni sem var ekki ætlað. Til dæmis, að hann eða hún lýsir fjölda stærð 10 en þá reynir óvart að setja 11 bæti í þann fjölda minni, og þú byrjar að snerta hluta af minni sem eru ekki lengur í gildi. Bara að samhengi það, sumir af þú might vita að hugbúnaður hvetja oft þér fyrir raðnúmer eða skráning takkana, Photoshop og Word og forrit eins og þetta. Það eru sprungur, eins og sumir vita, þá á netinu þar sem þú getur keyrt litla forrit, og voila, ekkert meira Beiðni um raðnúmer. Hvernig er að vinna? Í mörgum tilfellum þetta er einfaldlega að finna á tölvum texti hluti í raunverulegum núllum í tölvunni og sjálfur hvar er þessi virka þar sem raðnúmer er óskað, og þú skrifa þessi rúm, eða á meðan forritið er í gangi getur þú reikna út hvar lykillinn er í raun geymdar með eitthvað sem kallast a aflúsara, og þú getur sprunga hugbúnaður þannig. Þetta er ekki að segja að þetta er markmið okkar á næstu dögum, en það er mjög raunverulegur-veröld afleiðingar. Það eitt gerist til að fela þjófnað á hugbúnaði, en það er líka málamiðlun alls vélum. Í raun, þegar vefsíður þessa dagana eru nýtt og hættu og gögn er leki og lykilorð er stolið þetta mjög oft tengist lélega stjórnun minni manns, eða, ef um gagnagrunna, bilun til að sjá andstæðinga inntak, svo meira um það á næstu vikum til að koma, en nú bara laumast sýnishorn af konar skaða sem þú getur gert því ekki alveg að skilja hvernig hlutirnir virka undir hetta. Við skulum fara um að skilja hvers vegna þetta er brotinn með tól sem mun verða meira og meira gagnlegt sem áætlanir okkar fá flóknari. Svona langt þegar þú hefur fengið villu í forritinu hvernig hefur þú farið um kembiforrit það? Hvað hefur tækni þinn verið svona langt, hvort sem kenndi TF þinni eða bara sjálf-kennd? [Nemandi] printf. Printf, svo printf hefur sennilega verið vinur þinn á að ef þú vilt sjá hvað er að gerast inni í forritinu þú setur bara printf hér printf hér printf hér. Síðan sem þú hlaupa það, og þú fá a heild búnt af efni á skjánum sem þú getur notað til að þá deduce hvað er í raun að fara úrskeiðis í forritinu. Printf tilhneigingu til að vera mjög öflugur hlutur, en það er mjög handbók aðferð. Þú þarft að setja printf hér a printf hér, og ef þú setur það inn í lykkju sem þú gætir fengið 100 línur framleiðsla sem þú hefur þá til að sigta í gegnum. Það er ekki mjög notandi-vingjarnlegur og gagnvirk kerfi fyrir kembiforrit forrit, en sem betur fer er það val. There er a program, til dæmis, kallaði GDB, GNU Debugger, sem er lítið Bogagöng í hvernig þú notar það. Það er lítið flókið, en hreinskilnislega, þetta er einn af þessum hlutum þar sem ef þú setur í þessari viku og næstu auka klukkutíma til að skilja eitthvað eins gdb það mun spara þér sennilega tugum klukkustunda í the langur hlaupa, svo með það, láta mig gefa þú a beitu um hvernig þessi hlutur virkar. Ég er í Telnet mínu. Leyfðu mér að fara á undan og taka saman þetta forrit, buggy3. Það er nú þegar upp til dagsetning. Leyfðu mér að keyra það eins og við gerðum á meðan bak, og örugglega, það er brotinn. En af hverju er þetta? Kannski ég ruglaður upp skipti virka. Kannski er það a og b. Ég er ekki alveg að færa þá í kring rétt. Leyfðu mér að fara á undan og gera það. Frekar en bara að hlaupa buggy3 láta mig hlaupa í staðinn þetta forrit GDB, og ég ætla að segja það að hlaupa buggy3, og ég ætla að fela stjórn lína rifrildi,-Tui, og við munum setja þetta í framtíðinni vandamál í sérstakur til að minna. Og nú þetta svart og hvítt tengi smella upp að aftur, er svolítið yfirþyrmandi í fyrstu vegna þess að það er allt þetta ábyrgð upplýsingar hérna, en að minnsta kosti það er eitthvað kunnuglegt. Á toppur af the gluggi er raunverulegur númerið mitt, og ef ég fletta upp hér láta mig fletta til the mjög toppur af skrá minn, og örugglega, það er buggy3.c og tilkynning neðst í þessum glugga Ég hef þetta gdb hvetja. Þetta er ekki það sama eins og venjulega John Harvard minn hvetja. Þetta er hvetja sem er að fara að leyfa mér að stjórna gdb. GDB er aflúsara. A aflúsara er forrit sem gerir þér kleift að ganga gegnum framkvæmd línu program með línu fyrir línu, á leiðinni að gera eitthvað sem þú vilt að áætluninni, jafnvel kalla virka, eða útlit, meira um vert, á gildi Ýmsar Variable er. Við skulum fara á undan og gera það. Ég ætla að fara á undan og slá í að keyra á hvetja gdb er, svo taka á the botn vinstri á skjánum sem ég hef slegið hlaupa, og ég hef slá högg, og hvað gerði það ekki? Það hljóp bókstaflega forritið mitt, en ég var í raun ekki séð mikið fara hér vegna þess að ég hef í raun ekki sagt aflúsara að gera hlé á tilteknu augnabliki í tíma. Bara slá hlaupa keyrir forritið. Ég í raun ekki séð neitt. Ég get ekki vinna það. Í stað þess að láta mig gera þetta. Á þessum gdb hvetja láta mig slá staðinn brot, slá. Það er ekki það sem ég ætlaði að skrifa. Við skulum í staðinn tegund brot helstu. Með öðrum orðum, ég vil að setja eitthvað sem kallast a breakpoint, sem er viðeigandi nefnd vegna þess að það mun brjóta eða gera hlé framkvæmd program á viðkomandi stað. Main er nafn virka minni. Takið eftir að GDB er ansi klár. Það mynstrağur út að helstu gerast til að byrja u.þ.b. í línu 18 á buggy3.c, og þá taka hér efst til vinstri B + er rétt við hliðina á línu 18. Það er að minna mig á að ég hef sett breakpoint á línu 18. Í þetta sinn þegar ég tegund hlaupa, ætla ég að keyra forritið mitt allt þar til hann lendir að breakpoint, þannig að forritið mun gera hlé eftir mér á línu 18. Hér förum við, hlaupa. Ekkert virðist hafa gerst, en tilkynning neðst til vinstri byrja program, buggy3, breakpoint 1 í helstu við buggy3.c línu 18. Hvað get ég gert núna? Tilkynning Ég get byrjað að skrifa hluti eins og prentun, ekki printf, prenta x, og nú það er skrítið. The $ 1 er bara forvitni, eins og við munum sjá hvert skipti sem þú prenta eitthvað sem þú færð nýjan $ gildi. Það er svo að þú getur átt til baka til fyrri gildi bara ef, en nú hvað prenta er að segja mér er að verðmæti x á þessum tímapunkti í sögunni er greinilega 134514032. Hvað? Hvaðan sem jafnvel koma frá? [Inaudible nemanda] Reyndar, þetta er það sem við munum kalla sorp gildi, og við höfum ekki talað um þetta enn, en ástæðan fyrir því að þú frumstilla breytur er augljóslega þannig að þeir hafa sumir gildi sem þú vilt að þeir hafa. En aflinn muna að þú getur lýst því yfir breytur eins og ég gerði smá stund síðan í Sigma dæmi mínu án þess í raun að gefa þeim gildi. Muna það sem ég gerði hérna í Sigma. Ég lýsti n, en hvað gildi gerði ég gefa það? Engin, því ég vissi að í næstu línum GetInt myndi gæta af vandamálinu að setja gildi innan n. En á þessum tímapunkti í sögunni línu 11 og línu 12 og línu 13 og línu 14 um þessum nokkrum línum hvað er gildi n? Í C er bara veit ekki. Það er yfirleitt einhver sorp gildi, sumir alveg handahófi númer sem eftir er í raun frá einhverjum fyrri aðgerð hafi verið að keyra, svo sem program keyrir muna að virka fær virka, virka, virka. Allir þessir rammar fá að setja á minni, og þá slíkar aðgerðir aftur, og bara eins og ég lagði við strokleður minni þeirra er loksins endurnýta. Jæja, bara það svo gerist að þetta breytu x í þessari áætlun virðist hafa innihélt nokkur sorp gildi eins 134514032 frá sumum fyrri starfsemi, ekki sá sem ég skrifaði. Það gæti verið eitthvað sem kemur í raun með stýrikerfi, fall undir hetta. Jæja, það er allt í lagi, en við skulum nú fara í næstu línu. Ef ég skrifar "Áfram" á hvetja gdb minn og ég högg koma inn í, eftir því að undirstrika færist niður í línu 19, en rökrétt vísbendingu er þessi lína 18 hefur nú lokið framkvæmd, þannig að ef ég tegund aftur "Print x" Ég ætti nú að sjá 1, og reyndar ég. Again, the $ efni er leið GDB minna þig hvaða sögu prent að þú hafir gert. Nú láta mig fara á undan og prenta út y og örugglega, Y er einhver brjálaður gildi eins og heilbrigður, en ekki máli vegna þess að í línu 19 við erum að fara að tengja það gildið 2, svo láta mig slá "næsta" aftur. Og nú erum við á printf línu. Leyfðu mér að gera prenta x. Leyfðu mér að gera prenta y. Frankly, ég er að fá smá þreytt á prentun á þessu. Leyfðu mér að slá í staðinn "sýna x" og "sýna y," og nú þegar ég skrifa skipun í framtíðinni Ég mun vera minnt á hvað er x og y, sem er x og y, sem er x og y. Ég get einnig, sem til hliðar, slærð inn í "heimamenn info." Upplýsingar er sérstök stjórn. Heimamenn þýðir það sýnir mér staðbundnar breytur. Bara ef ég gleymi eða þetta er brjálaður, flókið virka að ég eða einhver annar skrifaði upplýsa heimamenn munu segja þér það eru allar staðbundnar breytur inni þessa staðbundnu virka að þú gætir hugsa um ef þú vilt að pota í kring. Nú, printf er um að framkvæma, svo látið mig fara á undan og bara tegund "næst." Þar sem við erum í þessu umhverfi sem við erum í raun ekki að sjá það framkvæma niður hér, en eftir það er að fá smá sannindamerkis hér. En eftir það er vega þyngra skjáinn þar, svo það er ekki fullkomið forrit hér, en það er allt í lagi því ég get alltaf pota í kring nota prenta ef ég vil. Leyfðu mér að slá næst aftur, og nú er hér áhugaverður hluti. Á þessum tímapunkti í sögunni Y er 2 og x er 1, sem leiðbeinandi hér, og aftur, Ástæðan er þetta sjálfkrafa að birta nú er vegna þess að ég nota skipunina sýna x og sýna y, svo leið og ég gerð næstu í orði x og y að verða skipti. Nú vitum við nú þegar það er ekki að fara að vera raunin, en við munum sjá í smá stund hvernig við getum kafa dýpra til að finna út hvers vegna það er satt. Næst, og því miður, Y er enn 2 og x er enn 1, og ég get staðfest eins mikið. Print x, prenta y. Reyndar ekki skipta raunverulega hefur gerst, þannig að við skulum byrja þetta yfir. Augljóslega skipti er brotinn. Við skulum í staðinn tegund "hlaupa" aftur. Leyfðu mér að segja já, ég vil að endurræsa það frá upphafi, slá. Nú er ég aftur upp á línu 18. Nú eftir x og y eru sorp gildi aftur. Næst, næst, næst, næst. Ef ég fá leiðindi ég get líka bara slegið N fyrir næstu. Þú getur stytt það til stystu mögulegu röð af stöfum. Víxla er nú brotinn. Við skulum kafa í, svo í staðinn fyrir að slá næst, nú ætla ég að slá skref þannig að ég ætla að stepping inni í þessa aðgerð þannig að ég er að ganga í gegnum það, þannig að ég lenti skref og svo inn. Takið eftir að lagt áherslu stökk niður lægri í áætlun mína á línu 36. Nú hvað eru staðbundnar breytur? Upplýsingar heimamenn. Ekkert bara enn vegna þess að við höfum ekki fengið að þessi lína, þannig að við skulum fara á undan og segja "næst." Nú við virðast hafa tmp, prenta tmp. Sorp gildi, ekki satt? Ég held það. Hvernig væri að prenta út, prenta b, 1 og 2? Í eitt augnablik, um leið og ég tegund næst aftur tmp er að fara að taka á gildi 1., vonandi, því tmp er að fara að vera úthlutað verðmæti a. Nú skulum gera prenta út, prenta b, en nú prenta tmp, og það er örugglega 1. Leyfðu mér að gera næst. Leyfðu mér að gera næst. Ég hef lokið við skipti virka. Ég er enn inni í henni í línu 40, svo látið mig prenta út, prenta b, og ég er alveg sama hvað tmp er. Það lítur út eins og skipti er rétt þegar það kemur að því að skipta a og b. En ef ég gerð nú næst, stökk ég aftur á línu 25, og auðvitað, ef ég tegund í x og prenta y þeir eru samt óbreytt, svo að við höfum ekki fastur the vandamál. En greiningarskyni nú kannski við þessu gdb áætlun við höfum að minnsta kosti fengið eitt skref nær því að skilja hvað er að gerast rangt án þess að þurfa að rusl númer okkar með því að setja a printf hér, printf hér printf hér og þá að keyra hana aftur og aftur reyna að reikna út hvað er að fara úrskeiðis. Ég ætla að halda áfram og hætta út af þessu öllu og hætta. Það er að fara að þá segja, "Hætta samt?" Já. Nú er ég aftur á venjulegan hvetja minn, og ég er búinn að nota gdb. Sem innskot, þú þarft ekki að nota þetta-Tui fána. Í staðreynd, ef þú sleppa því að þú færð í raun the botn helmingur af the skjár. Ef ég gerð þá brjóta aðal og svo keyra Ég get samt keyrt forritið mitt, en það mun gera er textatengdu bara að sýna mér núverandi línu eitt í einu. The-Tui, texta notandi tengi, bara sýnir þér meira af the program í einu, sem er líklega svolítið eðli auðveldara. En reyndar get ég bara gert næst, næst, næst, og ég ætla að sjá eina línu í einu, og ef ég vil virkilega að sjá hvað er að gerast Ég get tegund lista og sjá a heild búnt af nálægum línum. There er a vídeó sem við höfum beðið um að þú horfir á vandamál setur 3 þar sem Nate nær sum ranghala gdb, og þetta er eitt af þessum hlutum, heiðarleika, þar sem sumir non-léttvæg hluti af þér mun aldrei snerta gdb, og það mun vera slæmt því bókstaflega að þú munt á endanum að eyða meiri tíma síðar önn elta niður galla þá myndi ef þú setur í þeirri hálftíma / klst í þessari viku og næsta nám fá þægilegri með GDB. Printf var vinur þinn. GDB ætti nú að vera vinur þinn. Einhverjar spurningar um gdb? Og hér er a fljótur listi af sumir af the öflugur og gagnlegar skipanir. Já. >> Getur þú prenta streng? Getur þú prenta streng? Endilega. Það þarf ekki bara að vera heiltölur. Ef breyta s er strengur réttlátur tegund í s prenta. Það mun sýna þér hvað það band breytu er. [Inaudible nemanda] Það mun gefa þér heimilisfang og band sjálft. Það mun sýna þér bæði. Og einn síðastur hlutur, bara vegna þess að þetta er gott að vita líka. Rakningin og ramma, láta mig kafa inn í þetta síðasta skipti, sama nákvæmlega program með gdb. Leyfðu mér að fara á undan og keyra texta notandi tengi útgáfa, brjóta helstu. Leyfðu mér að fara á undan og keyra aftur. Hér er ég. Nú láta mig fara næst, næst, næst, næst, næst, skref, inn. Og nú ætla ég nú í skipti vísvitandi, en ég er eins og "Damn, hvað var gildi x?" Ég get ekki gert x lengur. Ég get ekki gert Y vegna þess að þeir eru ekki að umfangi. Þeir eru ekki í samhengi, en ekki vandamál. Ég get slegið rakningarskýrslu. Það sýnir mér allar aðgerðir sem hafa gengið upp á þessum tímapunkti. Takið eftir því að einn á the botn, helstu, línur upp með helstu vera á the botn af myndinni okkar hér. Sú staðreynd að skipti er yfir það línur upp með að skipta yfir í minni hér, og ef ég vil komast aftur til helstu tímabundið ég get sagt "ramma." Hvaða númer? Main er rammi # 1. Ég ætla að halda áfram og segja "Rammi 1." Nú er ég aftur á helstu, og ég get prentað x, og ég get prentað y, en ég get ekki prentað eða b. En ég get ef ég segi: "Jæja, bíddu í eina mínútu. Hvar var skipti?" Leyfðu mér að fara á undan og segja "grind 0." Nú er ég aftur þar sem ég vil vera, og sem innskot, það er önnur stjórn líka, eins og ef þú ert virkilega að leiðast að skrifa næst, næst, næst, næst, þú getur almennt segja hluti eins og "næstu 10", og það mun stíga í næstu 10 línum. Þú getur líka skrifað "áfram" þegar þú virkilega fá fed upp með stepping í gegnum það. Halda áfram að keyra forritið án vandræða þar til hann lendir annar breakpoint, hvort í lykkju eða lækka niður í forritinu. Í þessu tilfelli erum við áfram til enda, og forritið lauk venjulega. Þetta er fínt leið, óæðri ferli. Bara program lauk venjulega. Meira um það í the vídeó og kembiforrit fundur til að koma. Það var mikið. Við skulum taka 5-mínútna hlé okkar hér, og við munum aftur með structs og skrár. Ef þú kafa inn pset þessari viku þegar þú munt vita að við notum í dreifingu kóða, kóðinn sem við bjóðum þér sem útgangspunkt, nokkrar nýjar tækni. Einkum kynnti við þetta nýja leitarorð kallast struct, fyrir uppbyggingu, þannig að við getum búið til sérsniðnar breytur af tagi. Við kynntum líka hugmyndina um skrá I / O, skrá inntak og úttak, og þetta er svo að við getum spara ríki stjórnar Scramble til skrá á disk þannig að kennslu félagar og ég skil hvað er að gerast inni í forritinu án þess að þurfa að höndunum spila heilmikið af leikjum Scramble. Við getum gert þetta meira automatedly. Þessi hugmynd um strúktúr leysa nokkuð sannfærandi vandamál. Segjum að við viljum að innleiða áætlun sem heldur einhvern veginn utan um upplýsingar um nemendur, og nemendur gætu hafa, til dæmis, kenni, nafn og hús í stað eins og Harvard, svo þetta eru 3 stykki af upplýsingum við viljum halda í kring, svo að láta mig fara á undan og byrja að skrifa lítið forrit hér, fela stdio.h. Leyfðu mér að gera eru cs50.h. Og þá byrja meginhlutverki minn. Ég mun ekki nenna með hvaða lína rök, og hér vil ég að hafa nemanda, þannig að ég ætla að segja nemandi hefur nafn, þannig að ég ætla að segja "String nafn." Og ég ætla að segja námsmaður hefur einnig auðkenni, svo int id, og nemandi hefur hús, þannig að ég ætla líka að fara að segja "band hús." Og ég ætla að panta þetta svolítið eðlilega svona. Jæja, nú hef ég 3 breytur sem að tákna nemanda, svo "nemandi." Og nú vil ég að byggja þessi gildi, svo látið mig fara á undan og segja eitthvað eins og "Id = 123". Nafn er að fara að fá Davíð. Segjum hús er að fara að fá Mather, og þá er ég að fara að gera eitthvað geðþótta eins printf ("% s, sem ID er% d, býr í% s. Og nú, hvað ég vil stinga hér, einn á eftir öðrum? Nafn, kt, hús, aftur 0. Allt í lagi, nema ég ruglaður upp einhvers staðar hér Ég held að við höfum mjög gott forrit sem geymir einn nemanda. Auðvitað, þetta er ekki allt sem áhugavert. Hvað ef ég vil hafa 2 nemendur? Það er ekki stór samningur. Ég get styðja 2 manns. Leyfðu mér að fara á undan og varpa þessu og fara niður hér, og ég get sagt "id = 456" fyrir fólk eins og Rob sem býr í Kirkland. Jæja, bíddu, en ég get ekki kalla þetta það sama, og það lítur út eins og ég ætla að hafa til að afrita þetta, svo láta mig segja að þetta mun vera breytur Davíðs, og láta mig fá afrit af þessum fyrir Rob. Við munum kalla þetta er Rob en þetta er ekki að fara að vinna núna vegna þess að ég hef bíða, við skulum breyta mér id1, name1 og house1. Rob verður 2, 2. Ég hef fengið að breyta þessu hér, hér, hér, hér, hér, hér. Bíddu, hvað með Tommy? Við skulum gera þetta aftur. Vitanlega ef þú heldur enn þetta er góð leið til að gera þetta, er það ekki, svo afrita / líma slæmt. En við leyst þetta fyrir viku síðan. Hvað var lausn okkar þegar við vildum að hafa mörg tilvik af sömu gögn tegund? [Nemendur] Fylki. An array, svo látið mig reyna að þrífa þetta upp. Leyfðu mér að gera smá pláss fyrir mig efst, og láta mig gera í staðinn hér. Við munum kalla þetta fólk, og í staðinn ætla ég að segja "int auðkenni," og ég ætla að styðja 3 af okkur í bili. Ég ætla að segja "band nöfn," og ég mun styðja 3 af okkur, og þá ætla ég að segja "band hús," og ég ætla að styðja 3 af okkur. Nú hér í stað David getting eigin staðbundna hans breytur við getum fá losa af þeim. Það er gott að við erum að þrífa þetta upp. Ég get þá sagt Davíð er að fara að vera [0] og nöfn [0] og hús [0]. Og þá Rob getum sömuleiðis spara á þessu. Við skulum setja þetta hérna, svo hann er að fara að geðþótta að auðkenni [1]. Hann er að fara að vera nöfn [1], og svo loksins, hús [1]. Enn smá leiðinlegur, og nú þarf ég að reikna þetta út, þannig að við skulum segja "nöfn [0], id [0], hús [0] og við skulum pluralize þetta. Auðkenni, auðkenni, auðkenni. Og aftur, ég er að gera það, svo aftur, ég er nú þegar gripið til að afrita / líma aftur, þannig að líkurnar eru að það er annar lausn hér. Ég get sennilega þrífa það upp frekar með lykkju eða eitthvað svoleiðis, svo í stuttu máli, það er lítið betra en samt er eins og Ég er gripið til að afrita / líma, en jafnvel þessi, ég halda því fram, er í raun ekki í grundvallaratriðum rétt lausn þar hvað ef einhvern við ákveðum að þú veist hvað? Við í raun ætti að hafa verið að geyma netföng Davíð og Rob og allir aðrir í þessu forriti. Við ættum einnig að geyma símanúmer. Við ættum einnig að geyma neyðarnúmer samband númer. Við höfum öll þessi stykki af gögnum sem við viljum geyma, svo hvernig gera þú fara óður í að gera það? Þú lýsa annað array efst, og þá bæta við handvirkt netfang [0], netfang [1] Davíð og Rob og svo framvegis. En það er í raun bara forsenda Undirliggjandi hönnun að ég er með þann heiður kerfi til að vita að [I] í hvert nokkra fylki bara gerist svo að vísa til sömu aðila, svo [0] í ids er númer 123, og ég ætla að gera ráð fyrir að nöfn [0] er sami maður nafn og hús [0] er hús sami maður og svo framvegis fyrir öll mismunandi fylki sem ég bý. En eftir að það er ekki grundvallaratriði tengsl meðal þeirra 3 stykki af upplýsingar, id, nafn og hús, jafnvel þótt aðili sem við erum að reyna að fyrirmynd í þessu forriti er ekki fylki. Fylki er bara þetta forritanlegur leið til að gera þetta. Það sem við viljum virkilega að sitja í kerfi okkar er manneskja eins og Davíð, maður eins og Rob inni sem eða encapsulating er nafn og kennitala og hús. Getur látið einhvern veginn þessa hugmynd um hjúpun þar sem maður hefur auðkenni, nafn og hús og ekki grípa til raun þetta hakk þar sem við bara treysta því að krappi eitthvað vísar til sömu manna aðila í hverjum þessara ólíku fylki? Við getum í raun gera þetta. Leyfðu mér að fara yfir helstu nú, og láta mig búa til eigin gögn tegund mína í raun í fyrsta sinn. Við notuðum þessa tækni í Scramble, en hér ætla ég að fara á undan og búa til gögn tegund, og þú veist hvað ég ætla að kalla það nemandi eða einstaklingur, og ég ætla að nota typedef að skilgreina tegund. Ég ætla að segja að þetta er mannvirki, og þá er þetta uppbygging er að fara að vera nemanda tegund, munum við segja, jafnvel þó að það er smá gamaldags fyrir mig. Við munum segja "int id." Við munum segja "String nafn." Þá munum við segja "band hús," Svo nú í lok þessara nokkrum línum af kóða Ég hef bara kennt clang að til a gagnatag auki ints, auk strengja, auk tveggja manna, auk fljóta. Eins og með þessari stundu í línu tíma 11, það er nú ný gögn tegund kallast nemendur, og nú get ég lýsa nemanda breytu hvar ég vil, svo látið mig skruna niður til fólks. Nú get ég losna við þetta, og ég get fara aftur niður til Davíðs hér, og Davíð ég get í raun sagt að Davíð, getum við bókstaflega nafn breytu eftir mér, er að fara að vera nemanda tegund. Þetta getur litið svolítið skrítið, en þetta er ekki allt sem mismunandi frá því að lýsa yfir eitthvað sem heiltala eða streng eða fljóta. Það bara gerist svo að vera kölluð nemanda nú, og ef ég vil að setja eitthvað inn í þessa uppbyggingu Ég hef nú að nota nýja stykki af setningafræði, en það er nokkuð augljóst, david.id = 123, david.name = "Davíð" í höfuðborginni D, og david.house = "Mather," og nú get ég losna við þetta efni hér. Tilkynning við höfum nú endurhannað program okkar í raun miklu betri leið á að nú speglar program okkar raunverulega heimi. There er a raunverulegur-veröld hugmynd einstaklings eða nemandi. Hér höfum við nú C útgáfa af einstaklingi eða nánar tiltekið nemandi. Inni í þeirri manneskju eru þessar viðeigandi eiginleikar, ID, nafn og heimili, svo verður Rob meginatriðum það sama hérna, svo nemandi Rob, og nú rob.id = 456, rob.name = "Rob." Sú staðreynd að breyta heitir Rob er svona tilgangslaust. Við hefðum getað kallað það x eða y eða z. Við nefndi bara það Rob að merkingu í samræmi, en í raun er nafn innan þess sviði sjálfs, svo nú er ég með þetta. Þetta líka ekki finnst eins og bestu hönnun á sem ég hef erfitt dulmáli Davíð. Ég hef harður dulmáli Rob. Og ég er enn að grípa til einhvers afrita og líma í hvert sinn sem ég vil nýjar breytur. Þar að auki hef ég víst að gefa öllum þessum breytum nafn, jafnvel þó að ég myndi miklu frekar lýsa þessar breytur  meira generically sem nemendur. Nú getum við sameinast þeim hugmyndum sem hafa verið að vinna vel fyrir okkur og í staðinn að segja, "Þú veist hvað, gefa mér breytilega heitir nemendur, og við skulum hafa verið það af stærð 3, "svo nú get ég hreinsa þetta lengra, losna við handvirkt lýst Davíð og ég get í staðinn að segja eitthvað eins og nemendur [0] hér. Ég get þá sagt nemendum [0] hér, nemendur [0] hér, og svo framvegis, og ég get farið í kringum og hreinsa það upp fyrir Rob. Ég gæti líka farið um nú kannski að bæta við lykkju og nota GetString og GetInt til raunverulega fá þessa gildi frá notanda. Ég gæti farið um að bæta stöðugt vegna þess að þetta er yfirleitt slæmt starf á harða kóða sumir handahófi tala eins og 3 hérna og svo bara muna að þú ættir að setja ekki meira en 3 nemendur í honum. Það hefði líklega verið betra að nota # define efst á minn skrá og þáttur sem út, svo örugglega, láta mig fara á undan og alhæfa þetta. Leyfðu mér að opna upp dæmi sem er á meðal er í dag dæmi fyrirfram, structs1. Þetta er meira heill forrit sem notar # skilgreina upp hér og segir að við ætlum að hafa 3 nemendur sjálfgefið. Hér ég lýsa í flokki virði af nemendum, svo kennslustofu nemenda, og nú er ég með lykkju bara til að gera kóðann svolítið meira glæsilegur, byggja á bekknum með inntak notanda, svo iterate frá i = 0 á allt að nemendur, sem er 3. Og svo ég hvetja notandann í þessari útgáfu  hvað er ID nemandans, og ég fæ það með GetInt. Hvað er nafn nemanda, og þá fæ ég það með GetString. Hvað er hús nemandans? Ég fá það með GetString. Og svo neðst hér ég ákvað bara að breyta hvernig ég er að prenta þetta út og í raun nota lykkju, og hver er ég að prenta? Samkvæmt athugasemd ég prenta einhver í Mather, og það er það svo Rob og Tommy og svo framvegis-reyndar er Tommy í Mather. Tommy og Davíð yrði prentuð í þessu tilfelli, en hvernig er þetta að virka? Við höfum ekki séð þessa aðgerð áður, en taka giska á því hvað þetta gerir. Saman strengi. Það er svolítið ekki augljóst hvernig það saman strengi vegna þess að það kemur í ljós Ef það skilar 0 sem þýðir strengir eru jafnir. Ef það skilar -1 sem þýðir maður kemur í stafrófsröð fyrir öðrum, og ef það skilar +1 sem þýðir að annað orð kemur stafrófsröð fyrir aðra, og þú getur litið á netinu eða á man síðunnar til að sjá nákvæmlega hvaða leið er hver, en allt þetta er nú að gera það er að segja ef [i]. hús er jafn "Mather" þá fara á undan og prenta út svo og svo er í Mather. En hér er eitthvað sem við höfum ekki séð áður, og við munum koma aftur til þetta. Ég man ekki alltaf að þurfa að gera þetta í einhverju áætlunum mínum. Frítt er greinilega að vísa til minni, frjáls minni, En hvað minni er ég frjáls virðist í lykkju neðst á þessari áætlun? Það lítur út eins og ég er frjáls nafn einstaklingsins og húsið manns, en af ​​hverju er það? Það kemur í ljós allar þessar vikur sem þú hefur verið að nota GetString við höfum konar verið að kynna galla í hvert eitt af áætlunum þínum. GetString með hönnun úthlutar minni þannig að það er hægt að fara aftur til þín streng, eins og Davíð, eða Rob, og þú getur þá gert hvað sem þú vilt með því að band í forritinu því að við höfum áskilið minni fyrir þig. Vandamálið er allur þessi tími í hvert sinn sem þú hringja GetString við, höfundar GetString, hafa verið að biðja stýrikerfið að gefa okkur smá vinnsluminni fyrir þessum streng. Gefðu okkur smá RAM fyrir þetta næsta streng. Gefðu okkur sumir meira vinnsluminni fyrir þetta næsta streng. Það sem þú, sem forritari, hafa aldrei verið að gera er að gefa okkur að minni baka, svo fyrir þessar nokkrar vikur öll forrit sem þú hefur skrifað hafa haft það sem er kallað minni stökk þar sem þeir halda áfram að nota meira og meira minni í hvert skipti sem þú hringja GetString, og það er allt í lagi. Við gerum vísvitandi að fyrstu vikurnar því það er ekki áhugavert að þurfa að hafa áhyggjur af þar sem strengur er að koma frá. Allt sem þú vilt er orðið Rob að koma aftur þegar notandinn slær það inn En áfram verðum við nú að byrja flóknari um þetta. Í hvert sinn sem við úthluta minni við betur að lokum afhenda það aftur. Annars í hinum raunverulega heimi á Mac tölvuna eða þú gætir hafa stundum reynslu einkenni þar sem tölvan þín er að mala að stöðva að lokum eða heimskur spuna ströndinni boltinn er bara hernema the tölva ' Allt athygli og þú getur ekki gert það. Það má skýra með því að allir tala um galla, en meðal þeirra mögulega galla eru hlutir sem kallast minni lekur þar einhver sem skrifaði að stykki af hugbúnaður þú ert að nota ekki muna að losa um minni að hann eða hún spurði stýrikerfi, ekki nota GetString, því það er CS50 hlutur, en nota svipaðar aðgerðir að spyrja stýrikerfi fyrir minni. Ef þú eða þeir skrúfa upp og aldrei aftur að minni einkenni um það sem hægt er að forrit hægir og hægir og hægir nema þú að muna eftir að hringja frítt. Við munum koma til baka þegar og hvers vegna þú vilt kalla frjáls, en við skulum fara á undan bara fyrir gott mál og reyna að keyra þetta tiltekna forrit. Þetta var kallað structs1, slá. Leyfðu mér að fara á undan og keyra structs1, 123, David Mather, 456, Rob Kirkland, 789, Tommy Mather, og við sjáum Davíðs í Mather, er Tommy í Mather. Þetta er bara lítið geðheilbrigði athuga að forritið er að vinna. Nú, því miður, this program er a lítill pirrandi í því Ég gerði allt sem vinna, ég slóst í 9 mismunandi strengir, högg inn, var sagt sem var í Mather, en vitanlega vissi ég sem var í Mather þegar því ég slegið hana. Það væri að minnsta kosti gaman ef þetta forrit er meira eins og gagnagrunns og það man í raun það sem ég hef slegið í svo ég aldrei aftur að inntak þessara nemenda færslur. Kannski er það eins og registrarial kerfi. Við getum gert þetta með því að nota þessa tækni sem kallast skrá I / O, skrá inntak og úttak, mjög almenn leið til að segja hvenær sem þú vilt lesa skrár eða skrifa skrá þú getur gert þetta með ákveðna setja af aðgerðum. Leyfðu mér að fara á undan og opna þetta dæmi structs2.c, sem er næstum eins, en við skulum sjá hvað það er nú. Efst á skrá Ég lýsi flokk nemenda. Ég byggja þá á bekknum með inntak notanda, svo þessum línum af kóða eru eins nákvæmlega áður. Þá ef ég skruna niður ég prenta allir sem eru í Mather eins geðþótta áður, en þetta er áhugaverður nýr lögun. Þessar línur af kóða eru ný, og þeir kynna eitthvað hér, Skrá, allar húfur, og það hefur * í hér eins og heilbrigður. Leyfðu mér að færa þetta hérna, A * á hér eins og heilbrigður. Þessi aðgerð sem við höfum ekki séð áður, fopen, en það þýðir að skrá opinn, þannig að við skulum Lögð gegnum þetta, og þetta er eitthvað sem við munum koma til baka í framtíðinni psets, en þessi lína hér opnar raun skrá sem kallast gagnasafn, og opnar sérstaklega það á þann hátt að það getur gert það til þess? [Inaudible nemanda] Einmitt, svo "W" þýðir bara að það er að segja á stýrikerfi opna þessa skrá á þann hátt sem ég get skrifa á það. Ég vil ekki að lesa það. Ég vil ekki bara að líta á það. Ég vil breyta því og bæta við efni hugsanlega við það, og þá er að fara að vera kölluð gagnagrunn. Þetta gæti verið kallað neitt. Þetta gæti verið database.txt. Þetta gæti verið. DB. Þetta gæti verið orð eins og foo, en ég valdi geðþótta að nefna skrána gagnagrunninum. Þetta er lítið geðheilbrigði athuga að við munum koma aftur í smáatriðum með tímanum, ef FP fyrir músina skrá, ekki jafn NULL sem þýðir allt er vel. Long saga stutt, virka eins fopen mistakast stundum. Kannski skrá er ekki til. Kannski þú ert með pláss diskur. Kannski þú hefur ekki leyfi til að mappa, svo ef fopen skilar núll eitthvað slæmt gerðist. Hins vegar ef fopen ekki aftur null allt er vel og ég get byrjað að skrifa í þessa skrá. Hér er nýtt bragð. Þetta er til lykkja sem er iterating yfir hvor af nemendum mínum, og þetta lítur svo svipað og við höfum gert áður, en þessi aðgerð er frændi printf kallað fprintf að skrá printf, og eftir það er öðruvísi á aðeins 2 vegu. Einn, byrjar það með f í stað p, en þá er fyrsta rifrildi hennar virðist það? [Nemendur] File. >> Það er skrá. Þessi hlutur heitir FP, sem við munum loksins stríða sundur hvað skrá bendillinn er en nú FP táknar einfaldlega skrána sem ég hef opnað, svo fprintf hér er að segja prenta auðkenni notanda til að skrá, ekki á skjáinn. Prenta nafn notandans að skrá, ekki á skjáinn, húsið að skrá, ekki á skjáinn, og þá hérna, augljóslega, loka skrá, og þá niður frjálsa minni. Eini munurinn á milli þessa útgáfu 2 og útgáfu 1 er kynning á fopen og þessari skrá með * og þetta hugmynd af fprintf, þannig að við skulum sjá hvað niðurstaðan er. Leyfðu mér að fara í Telnet minn. Leyfðu mér að hlaupa structs2, slá. Útlit eins og allt er vel. Skulum endursýning structs2. 123, David Mather, 456, Rob Kirkland, 789, Tommy Mather, slá. Útlit eins og það haga sér eins, en ef ég geri nú LS eftir hvaða skrá er hér meðal allra númerið mitt, gagnasafn, þannig að við skulum opna að gedit af gagnasafn, og líta á það. Það er ekki kynjamisrétti af skrá snið. Það er í raun eitt stykki línu gögn á línu á línu, en þeir sem nota Excel eða CSV skrár, aðgreind með kommum gildi, Ég gæti vissulega hafa notað fprintf í staðinn kannski gert eitthvað eins og this svo að ég gæti í raun búið jafngildi Excel skrá með því að aðskilja hlutina með kommum, ekki bara nýjar línur. Í þessu tilfelli hefði ég í staðinn nota kommur í stað nýjar línur Ég gat bókstaflega opna gagnagrunn í Excel ef ég gerði í staðinn það líta svona út. Í stuttu máli, nú að við höfum vald til að skrifa skrár við getum nú byrjað viðvarandi gögn, halda það í kring á disk svo að við getum haldið upplýsingum um aftur og aftur. Takið nokkra aðra hluti sem eru nú aðeins fleiri kunnugleg. Efst á þessa C skrá við höfum typedef vegna þess að við viljum búa til gögn gerð sem sýnir orð svo þessi tegund er kölluð orð, og innan þessa uppbyggingu það er lítill áhugamaður núna. Hvers vegna er orð samsett úr augljósri fylki? Hvað er orðið bara innsæi? Það er fylki af stöfum. Það er röð af stöfum aftur til baka til baka. BRÉF í öllum húfur gerist að við segjum geðþótta hámarkslengd á hvaða orð í orðabókinni sem við erum að nota til Scramble. Hvers vegna hef ég 1? The null staf. Muna þegar við gerðum Bananagrams dæmi við þurftum sérstaka gildi í lok orðsins til að halda utan um þar sem orðin í raun lokið, og eins og setja vandamál forskrift segir hér erum við að tengja við tiltekið orð Boolean gildi, fáni, svo að segja, satt eða ósatt. Hefur þú fundið þetta orð nú þegar, vegna þess að við skiljum þurfum við virkilega leið að muna ekki aðeins hvað orðið er í Scramble en hvort þú, manna, hafa fundið það þannig að ef þú finnur orðið "" Þú getur ekki bara slá, slá, sem, inn, í, slá inn og fá 3 stig, 3 stig, 3 stig, 3 stig. Við viljum vera fær um að svartan lista þessi orð með því að setja a bool á við ef þú hefur þegar fundið það, og svo er það þess vegna sem við encapsulated það í þessari uppbyggingu. Nú, hér niðri í Scramble það er þetta annar strúktúr heitir orðabók. Fjarverandi hér er orðið typedef vegna þess að í þessu tilfelli við þurftum að þjappa saman hugmyndinni um orðabók, og orðabók inniheldur allt fullt af orðum, eins og gefið í skyn með þessum fjölda, og hversu margir af þessum orðum eru? Jæja, hvað þetta breytu sem heitir stærð segir. En við þurfum bara eina orðabók. Við þurfum ekki að gögn tegund sem heitir orðabók. Við þurfum bara einn af þeim, þannig að það kemur í ljós í C að ef þú segir ekki typedef, þú segir bara strúktúr, þá inni í hrokkið axlabönd að setja breytur, þá setja nafnið. Þetta er lýsa einni breytistærð heitir orðabók sem lítur svona út. Hins vegar eru þessar línur að búa til einnota gögn uppbygging kallast orð að þú getur búið til mörg afrit af, rétt eins og við bjuggum mörg eintök nemenda. Hvað er þetta að leyfa lokum okkur að gera? Leyfðu mér að fara aftur í, við skulum segja, einfaldari dæmi frá einfaldari tímum, og láta mig opna, við skulum segja, compare1.c. Vandamálið hér á móti er að í raun afhýða aftur lag á band og byrjar að taka burt þessar þjálfun hjól vegna þess að það kemur í ljós að band allan þennan tíma er eins og við lofað í viku 1 raun bara gælunafn, samheiti frá CS50 bókasafn fyrir eitthvað sem lítur svolítið dulinn, char *, og við höfum séð þessa stjörnu áður. Við sáum það í tengslum við skrá. Við skulum nú sjá hvers vegna við höfum verið að fela þetta smáatriði um nokkurt skeið. Hér er skrá sem heitir compare1.c, og spyr greinilega notandi í 2 strengi, s og t, og þá reynir hann að bera saman þá strengi fyrir jafnrétti í línu 26, og ef þeir eru jafnir og það segir, "þú gafst það sama," og ef þeir eru ekki jafn segir, "þú gafst mismunandi hluti." Leyfðu mér að fara á undan og keyra þetta forrit. Leyfðu mér að fara inn í skrá uppspretta minn, gera compare1. Það saman í lagi. Leyfðu mér að hlaupa compare1. Ég súmma inn, inn. Segja eitthvað. HELLO. Ég segi þér eitthvað aftur. HELLO. Ég örugglega ekki slá mismunandi hluti. Leyfðu mér að reyna þetta aftur. Bless bless. Örugglega ekki öðruvísi, þannig að hvað er að gerast hér? Jæja, hvað er í raun verið saman í línu 26? [Inaudible nemanda] Já, svo kemur í ljós að band, gögn tegund er góður af hvítum lygi. A band er char *, en hvað er char *? A char *, eins og þeir segja, er bendillinn, og bendillinn er í raun netfang, summu stað í minni, og ef þú skyldir til að hafa slegið inn orð eins og halló, muna frá fyrri umræðum um strengi þetta er eins og orð HELLO. Mundu að orð eins og hello má fulltrúa sem fylki af stöfum eins og þetta og þá með sérstökum karakter í lok kölluð núll staf, sem \ táknar. Hvað er í raun band? Takið eftir að þetta er margar klumpur af minni, og í raun er endir af það aðeins þekkt þegar þú horfir í gegnum allt band að leita að sérstökum null staf. En ef þetta er klumpur af minni úr minni tölvunnar minnar, segjum geðþótta að þetta band bara heppinn, og það fékk sett í upphafi RAM tölvunnar minnar. Þetta er bæti 0, 1, 2, 3, 4, 5, 6 ... Þegar ég segi eitthvað eins GetString og ég band S = GetString hvað er í raun að koma aftur? Í þessum undanförnum vikum, er það virkilega verið geymt í s er þetta ekki band í sjálfu sér, en í þessu tilfelli hvað er verið geymt er númer 0 því hvað GetString raun er er það ekki líkamlega aftur a band. Það þýðir ekki einu sinni í raun að gera huglæg vit. Hvað það gerir aftur er tala. Þessi tala er heimilisfang HELLO í minni, og band er þá, ef við afhýða aftur þetta lag, band er í raun ekki til. Það er bara einföldun á CS50 bókasafn. Þetta er í raun eitthvað sem heitir char *. Char vit vegna þess að það er orð, eins HELLO? Jæja, það er röð af chars, röð af stöfum. Char * merkir veffang staf, svo hvað þýðir það að skila streng? A ágætur, einföld leið til að koma aftur a band er frekar en að reyna að reikna út hvernig ég aftur 5 eða 6 mismunandi bæti láta mig aftur á heimilisfang sem bæti? Sú fyrsta. Með öðrum orðum, láta mig gefa þér heimilisfang staf í minni. Það er það char * táknar, heimilisfang einn staf í minni. Hringdu þá breytu s. Geymið í s viðkomandi tölu, sem ég sagði geðþótta er 0, bara til að halda hlutum einfalt, en í raun það er yfirleitt stærri tala. Bíddu. Ef þú ert bara að gefa mér heimilisfang fyrsta staf, hvernig veit ég hvað heimilisfangið er annars eðli, þriðja, fjórða og fimmta? [Inaudible nemanda] Þú veist bara hvar the endir af the band er við vegur af þessu handhæga bragð, þannig að þegar þú notar eitthvað eins og printf, hvað printf bókstaflega tekur sem rök þess, muna að við notum tákn þessa% s, og þá fara í breytan sem er sögufrægur a band. Það sem þú ert í raun farið er heimilisfang fyrsta staf strengsins. Printf notar þá til lykkja eða meðan lykkja fenginni þetta netfang, til dæmis, 0, svo látið mig gera þetta núna, printf ("% s \ n" s); Þegar ég kalla printf ("% s \ n" s), það sem ég er í raun að veita printf með er heimilisfang fyrsta staf í s, sem í þessu handahófskennt tilfelli er H. Hvernig printf vita nákvæmlega hvað á að birta á skjánum? Sá sem framkvæmd framkvæmda printf á meðan lykkja eða til hliðar sem segir er þetta eðli jafna sérstaka null staf? Ef ekki, prenta það. Hvernig óður í this einn? Ef ekki prenta það, prenta það, prenta það, prenta það. Oh, þetta er sérstakt. Hættu að prentun og skila til notandans. Og það er bókstaflega allt sem er verið að gerast undir hetta, og það er mikið að melta í fyrsta dag í bekknum, en nú að það er í raun að byggja blokk af öllu að skilja sem hefur verið að gerast inni í minni tölvu okkar, og að lokum munum stríða þetta sundur með smá hjálp frá einum af vinum okkar í Stanford. Prófessor Nick Parlante í Stanford hefur gert þetta frábæra vídeó röð úr alls konar mismunandi tungumálum sem kynnt þetta litla Claymation eðli Binky. Röddin sem þú ert að fara að heyra í örfáum öðrum innsýn er að Stanford prófessor, og þú ert að fá aðeins 5 eða 6 sekúndur af þessu núna, en þetta er í huga sem við munum gera í dag og byrja á miðvikudag. Ég gef þér Pointer gaman með Binky, sýnishorn. [♪ Music ♪] [prófessor Parlante] Hey, Binky. Wake upp. Það er kominn tími fyrir gaman músina. [Binky] Hvað er það? Frekari upplýsingar um punkta? Ó, Goody! Við munum sjá þig á miðvikudag. [CS50.TV]