[Powered by Google Translate] [Wiki 4] [David J. Malan] [Chuo Kikuu cha Harvard] [Hii ni CS50.] [CS50.TV] Haki zote, hii ni CS50, na hii ni mwanzo wa wiki 4, na hii ni moja ya algorithms slowest iwezekanavyo upangaji. Ambayo moja ilikuwa ni kwamba sisi wanaangalia tu huko? Hiyo ilikuwa Bubble aina, ili kubwa O (n ^ 2) + Jumla, na kwa kweli sisi si wale tu katika ulimwengu huu ili wanaonekana kujua nini Bubble aina ni wakati wake au kukimbia. Hakika, huyu alikuwa mahojiano na Eric Schmidt ya Google na seneta wa zamani wa Barack Obama miaka michache tu iliyopita. Sasa, Seneta, uko hapa katika Google, na mimi kama kufikiri ya urais kama mahojiano ya kazi. Sasa, ni vigumu kupata kazi kama rais, na mtaenda kupitia rigors sasa. Ni pia vigumu kupata kazi saa Google. Tuna maswali, na sisi kuuliza maswali wagombea wetu, na hii ni moja ya kutoka Larry Schwimmer. You guys kufikiri mimi nina kidding? Ni haki hapa. Ni njia gani bora zaidi ya kutatua milioni integers 32-bit? [Kicheko] Naam- Samahani. >> Hapana, hapana, hapana, hapana. Nadhani aina Bubble itakuwa njia sahihi ya kwenda. Haya, ambaye alimwambia hii? Wiki iliyopita wanakumbuka sisi alichukua kuvunja kutoka code, angalau kwa siku, na kuanza kuelekeza nguvu katika mawazo ya baadhi ya ngazi za juu na kutatua tatizo zaidi kwa ujumla katika muktadha wa kutafuta na kuchagua, na sisi ilianzisha kitu ambacho hatukuwa kofi jina hili katika wiki ya mwisho, lakini asymptotic nukuu, O Big, Omega Big, na wakati mwingine Big Theta nukuu, na hawa walikuwa tu njia ya kuelezea wakati mbio ya algorithms, muda kiasi gani inachukua kwa algorithm kukimbia. Na unaweza kukumbuka kuwa wewe kuongelea wakati mbio katika suala la kawaida wa pembejeo, ambayo sisi ujumla kuwaita n, chochote tatizo inaweza kuwa, ambapo n ni idadi ya watu katika chumba, idadi ya kurasa katika kitabu cha simu, na sisi kuanza kuandika mambo ya nje kama O (n ^ 2) au O (n) au O (n logi n), na hata wakati math haikuweza kufanya kazi nje hivyo kikamilifu na ilikuwa n ² - n / 2 au kitu kama hicho tunataka badala tu kutupa baadhi ya maneno ya chini ili, na motisha huko ni kwamba sisi kweli unataka aina ya njia lengo la kutathmini utendaji wa mipango au utendaji wa algorithms kwamba, mwisho wa siku hauhusiani, kwa mfano, kwa kasi ya leo ya kompyuta yako. Kwa mfano, kama wewe kutekeleza Bubble aina ya, au wewe kutekeleza kuchanganya aina au uteuzi aina ya kompyuta ya leo, 2 GHz kompyuta, na wewe kukimbia, na inachukua baadhi ya idadi ya sekunde, mwaka ujao kuna GHz 3 au 4 GHz kompyuta, na unaweza kisha kudai kwamba "Wow, algorithm yangu sasa ni mara mbili kwa haraka, "wakati katika hali halisi hiyo ni wazi si kesi. Ni tu vifaa imenipatia kasi, lakini yako kompyuta hana, na hivyo sisi kweli unataka kutupa mbali mambo kama kigawe cha 2 au 3 vigawe vya linapokuja kuelezea jinsi ya kufunga au jinsi polepole algorithm ni kweli na mtazamo tu juu ya n au baadhi ya sababu yake, baadhi ya nguvu zake kama katika kesi ya aina kutoka wiki iliyopita. Na kukumbuka kwamba kwa msaada wa aina kuunganisha tulikuwa na uwezo wa kufanya hivyo bora zaidi kuliko aina Bubble na aina uteuzi na hata insertion aina. Sisi got chini n logi n, na tena, kukumbuka kwamba kwa logi n ujumla inahusu kitu ambacho hukua zaidi polepole basi n, hivyo n logi n hivi sasa ilikuwa nzuri kwa sababu ilikuwa chini ya ² n. Lakini kufikia n logi n pamoja na aina kuunganisha nini ilikuwa kijidudu msingi wa wazo kwamba tulikuwa na kujiinua kwamba sisi pia leveraged nyuma katika wiki 0? Jinsi gani sisi kukabiliana na tatizo kuchagua cleverly na aina kuunganisha? Nini ilikuwa ufahamu muhimu, labda? Mtu yeyote wakati wote. Okay, hebu kuchukua hatua nyuma. Elezea kuchanganya aina katika maneno yako mwenyewe. Jinsi gani kazi? Okay, tutaweza mstari nyuma 0 wiki. Okay, yeah. [Inaudible-mwanafunzi] Okay, nzuri, hivyo sisi kugawanywa safu ya idadi katika vipande 2. Sisi sorted kila vipande hizo, na kisha sisi ilijiunga nao, na tumeona wazo hili kabla ya kuchukua tatizo hilo ni kubwa hii na chopping ni juu katika tatizo hilo ni kubwa au hii hii kubwa. Kumbuka kitabu cha simu mfano. Kumbuka algorithm binafsi kuhesabu kutoka wiki iliyopita, aina hivyo kuunganisha kilifanyiwa ufupisho na hii pseudocode hapa. Wakati wewe ni kupewa vipengele n, kwanza ilikuwa sanity kuangalia. Kama n <2 basi si kufanya chochote wakati wote kwa sababu kama n <2 kisha n ni wazi 0 au 1, na hivyo kama ni aidha 0 au 1 kuna kitu kutatua. Wewe ni kosa. Orodha yako tayari trivially Iliyopangwa. Lakini vinginevyo kama nimepata vipengele 2 au zaidi kwenda mbele na kugawanya yao ndani ya 2 halves, kushoto na kulia. Aina ya kila halves hizo, na kisha kuunganisha halves Iliyopangwa. Lakini tatizo hapa ni kwamba katika mtazamo wa kwanza hii anahisi kama tuko punting. Hii ni ufafanuzi katika mviringo kwamba kama nimekuwa aliuliza wewe kuchambua mambo haya n na wewe kuniambia "Sawa, faini, tutaweza kuchambua vipengele wale n / 2 na wale n / 2," basi swali yangu ijayo itakuwa ni "Sawa, ni jinsi gani unaweza kutatua n / vipengele 2?" Lakini kwa sababu ya muundo wa mpango huu, kwa sababu kuna kesi hii ya msingi, ili kuzungumza, kesi hii maalum kwamba anasema kama ni n > Sara, wote haki. Kelly. >> Kelly na? Willy >> Willy, Sara, Kelly, na Willy.. Hivi sasa nimekuwa aliuliza swali na mtu jinsi watu wengi juu ya hatua hii, na mimi sina wazo. Hii ni orodha kweli kwa muda mrefu, na hivyo badala mimi naenda kufanya hila hii. Mimi naenda kuuliza mtu karibu na mimi kufanya zaidi ya kazi, na mara moja yeye ni kufanyika kufanya zaidi ya kazi Mimi naenda kufanya kiasi mdogo wa kazi iwezekanavyo na kuongeza tu 1 kwa kila jibu lake, hivyo hapa sisi kwenda. Nimekuwa aliuliza jinsi watu wengi juu ya hatua. Jinsi watu wengi ni juu ya hatua ya kushoto ya wewe? kushoto kwangu? >> Sawa, lakini si kudanganya. Hiyo ni nzuri, hiyo ni sahihi, lakini kama tunataka kuendelea mantiki hii hebu kudhani kuwa wewe vile vile wanataka punt tatizo hili kwa upande wa kushoto wa wewe, hivyo badala ya jibu moja kwa moja kwenda mbele na kupita tu mume. Oh, jinsi watu wengi ni ya kushoto ya mimi? Jinsi watu wengi ni wa kushoto? 1. [Kicheko] Sawa, hivyo 0, ili kile sasa Willy amefanya ni ve akarudi jibu lako mwelekeo huu akisema 0. Sasa, unapaswa kufanya nini >> 1?. Okay, hivyo wewe ni 1, hivyo kusema, "Sawa, mimi nina kwenda kuongeza 1 kwa chochote kuhesabu Willy ilikuwa, "hivyo 1 + 0. Wewe ni sasa 1 hivyo jibu lako kwa haki ni sasa- 1. >> Na mgodi itakuwa 2. Nzuri, hivyo wewe ni kuchukua jibu la awali la 1, kuongeza kiwango cha chini cha kazi unataka kufanya, ambayo ni 1. Sasa una 2, na wewe kisha mkono mimi ambayo thamani? 3, I mean, sorry, 2. Nzuri. Naam, tulikuwa 0 wa kushoto. Kisha sisi alikuwa 1, na kisha sisi kuongeza 2, na sasa wewe ni handing alinipa namba 2, na hivyo mimi kusema, sawa, 1, 3. Kuna hakika 3 watu wamesimama karibu na mimi juu ya hatua hii, hivyo tunaweza kuwa wazi jambo hili sana linearly, sana katika mtindo wazi, lakini nini sisi kwa kweli kufanya? Sisi alichukua tatizo la ukubwa 3 awali. Sisi basi wakaiangusha katika tatizo la ukubwa 2, basi tatizo ya kawaida ya 1, na kisha hatimaye kesi ya msingi alikuwa kweli, oh, hakuna mtu huko, ambapo kiwango Willy akarudi ufanisi jibu ngumu-coded michache mara, na wa pili alikuwa kisha bubbled up, bubbled up, bubbled up, na kisha kwa kuongeza katika 1 hii moja ya ziada tumekuwa kutekelezwa hii wazo msingi wa recursion. Sasa, katika kesi hii ni kweli hakuwa kutatua tatizo yoyote kwa ufanisi zaidi kisha tumeona hivi sasa. Lakini kufikiri kuhusu algorithms tumefanya juu ya hatua ya hivi sasa. Tulikuwa na vipande 8 ya karatasi ubaoni, kwenye video wakati Sean mara kutafuta namba 7, na nini alifanya kweli kufanya? Naam, hakufanya aina yoyote ya mgawanyiko na kushinda. Hakufanya aina yoyote ya recursion. Badala yake yeye tu alifanya hivyo algorithm linear. Lakini wakati sisi alianzisha wazo la idadi sorted juu ya hatua ya kuishi wiki iliyopita kisha sisi alikuwa na haya Instinct ya kwenda katikati, ambapo kiwango tulikuwa orodha ndogo ya kawaida 4 au nyingine orodha ya ukubwa 4, na kisha sisi alikuwa exact tatizo, hivyo sisi mara kwa mara, mara kwa mara, mara kwa mara. Kwa maneno mengine, sisi recursed. Asante sana kwa kujitolea wetu 3 hapa kwa kuonyesha recursion na sisi. Hebu angalia kama hatuwezi kufanya hii sasa kidogo zaidi halisi, kutatua tatizo hilo tena tunaweza kufanya pretty urahisi, lakini tutaweza kutumia kama jiwe la kuvukia kwa kutekeleza wazo la msingi. Kama mimi nataka compute summation ya rundo la idadi, kwa mfano, kama wewe kupita katika namba 3, Nataka kukupa thamani ya sigma 3, hivyo Jumla ya 3 + 2 + 1 + 0. Nataka kupata nyuma jibu 6, hivyo tutaweza kutekeleza kazi hii sigma, kazi hii summation tena kuwa, inachukua katika pembejeo, na kisha anarudi summation ya idadi hiyo njia yote chini 0. Tunaweza kufanya hili pretty tu, sawa? Tunaweza kufanya hili kwa baadhi ya aina ya muundo looping, hivyo basi mimi kwenda mbele na kupata hii ilianza. Pamoja stdio.h. Hebu kupata mwenyewe ndani ya kuu ya kufanya kazi na hapa. Hebu kuokoa hii kama sigma.c. Kisha mimi nina kwenda katika hapa, na mimi nina kwenda kutangaza n int, na mimi naenda kufanya yafuatayo wakati mtumiaji hana kushirikiana. Wakati mtumiaji kwamba hakunipa idadi chanya napenda kwenda mbele na kuwachochea kwa n GetInt =, na napenda kuwapa baadhi ya maelekezo kama kwa nini cha kufanya, hivyo printf ("Chanya integer tafadhali"). Tu kitu rahisi kama hii ili kwa wakati sisi hit line 14 sisi sasa kuwa na integer chanya ikatengeneza katika n. Sasa hebu kufanya kitu kwa hayo. Hebu kwenda mbele na compute summation, hivyo int Jumla = sigma (n). Sigma ni summation, hivyo mimi nina kuandika tu katika njia fancier. Tutaweza tu kuiita sigma huko. Hiyo ni jumla, na sasa mimi naenda magazeti nje matokeo, printf ("Jumla ni% d, \ n", jumla). Na basi mimi itabidi kurudi 0 ajili ya hatua nzuri. Tumefanya kila kitu kwamba mpango huu inahitaji isipokuwa sehemu ya kuvutia, ambayo ni ya kweli kutekeleza kazi sigma. Hebu kwenda chini hapa chini, na napenda kutangaza kazi sigma. Ni got kuchukua variable kwamba integer ya aina, na kile data aina mimi nataka kurudi ikatengeneza kutoka sigma? Int, kwa sababu mimi nataka mechi matarajio yangu juu ya mstari 15. Katika hapa napenda kwenda mbele na kutekeleza mpango huu wa katika njia pretty moja kwa moja. Hebu kwenda mbele na kusema int Jumla = 0, na sasa mimi nina kwenda kuwa kidogo kwa kitanzi hapa kwamba kinaendelea kusema kitu kama hiki, kwa ajili ya (i = 0 int; mimi <= idadi; i + +) Jumla + = i. Na kisha mimi naenda kurudi Jumla. Ningeweza kutekelezwa hii katika idadi yoyote ya njia. Ningeweza kutumika kitanzi wakati. Ningeweza kutumia skipped variable Jumla kama kweli alitaka, lakini katika muda mfupi, sisi tu kazi kwamba kama mimi si goof anatangaza Jumla ni 0. Kisha iterates kutoka 0 juu ya juu kupitia namba, na juu ya kila iteration inaongeza kwamba thamani ya sasa kwa jumla na kisha anarudi Jumla. Sasa, kuna optimization kidogo hapa. Hii pengine ni hatua kupita, lakini na iwe hivyo. Hiyo faini kwa sasa. Sisi ni angalau kuwa ya uhakika na kwenda 0 njia yote juu juu. Si ngumu sana na pretty moja kwa moja, lakini zinageuka kuwa na kazi ya sigma tuna fursa sawa kama tulivyofanya hapa jukwaani. Juu ya hatua sisi tu kuhesabiwa watu wangapi walikuwa karibu na mimi, lakini badala yake kama sisi alitaka kuhesabu idadi 3 + 2 + 1 juu ya chini 0 tunaweza vile vile punt kwa kazi kwamba mimi itabidi badala kuelezea kuwa kujirudia. Hapa hebu kufanya sanity haraka kuangalia na kuhakikisha kuwa sikuweza goof. Najua kuna angalau jambo moja katika mpango huu kwamba sikuwa kufanya makosa. Wakati mimi enter mimi kwenda kupata aina yoyote ya yelling saa yangu? Je, Mimi naenda kuwa yelled saa kuhusu? Yeah, I forgot mfano, hivyo mimi nina kutumia kazi kuitwa sigma kwenye mstari 15, lakini si alitangaza mpaka mstari 22, hivyo mimi bora proactively kwenda hapa na kutangaza mfano, na mimi itabidi kusema int sigma (int idadi), na hiyo ni yake. Ni kutekelezwa chini. Au njia nyingine ningeweza kutatua hili, Mimi nilikuwa hoja kazi huko, ambayo si mbaya, lakini angalau wakati mipango yako kuanza kupata muda mrefu, kusema ukweli, Nadhani kuna baadhi ya thamani katika daima kuwa kuu kwa juu ili katika msomaji anaweza kufungua faili na kisha mara moja kuona nini mpango ni kufanya bila ya kuwa na kutafuta njia hiyo kuangalia kwa kazi ambayo kuu. Hebu kwenda chini kwa terminal dirisha yangu hapa, kujaribu kufanya sigma kufanya sigma, na mimi Star up hapa pia. Kinachojitokeza tamko la GetInt kazi ina maana nimepata wamesahau kufanya nini kingine? [Inaudible-mwanafunzi] Nzuri, hivyo inaonekana makosa ya kawaida, hivyo hebu kuweka hii hapa, cs50.h, na sasa hebu kwenda nyuma terminal dirisha yangu. Mimi itabidi wazi screen, na mimi itabidi kufanya rerun sigma. Inaonekana compiled. Hebu sasa kukimbia sigma. Mimi itabidi aina katika namba 3, na mimi kupata 6, hivyo si cheki ukali, lakini angalau ni inaonekana kufanya kazi katika mtazamo wa kwanza, lakini sasa hebu mpasuko ni mbali, na hebu kweli kujiinua wazo la recursion, tena, katika muktadha rahisi sana hivyo kwamba katika muda wiki chache ' wakati sisi kuanza kuchunguza miundo data fancier kuliko arrays tuna chombo mwingine katika toolkit na ambayo kwa kuendesha miundo hiyo data kama tutaweza kuona. Hii ni njia iterative, mbinu kitanzi-msingi. Hebu badala yake sasa kufanya hili. Hebu badala yake kusema kuwa summation ya idadi juu ya chini 0 ni kweli kitu sawa kama idadi + sigma (idadi - 1). Kwa maneno mengine, kama tu juu ya hatua ya mimi punted kwa kila mmoja wa watu karibu na mimi, na wao kwa upande naendelea punting mpaka sisi hatimaye bottomed nje katika Willy, ambaye alikuwa na kurudi jibu ngumu-coded kama 0. Hapa sasa tuko vile vile punting kwa sigma kazi sawa kama awali ilikuwa inaitwa, lakini ufahamu muhimu hapa ni kwamba sisi siyo wito sigma identically. Sisi siyo kupita katika n. Sisi ni wazi kupita katika idadi - 1, hivyo tatizo kidogo kidogo, kidogo kidogo tatizo. Bahati mbaya, hii si kabisa ufumbuzi bado, na kabla ya sisi kurekebisha kile kinachoweza kuruka nje kama dhahiri katika baadhi ya wewe napenda kwenda mbele na rerun kufanya. Inaonekana kukusanya sawa. Hebu rerun sigma na 6. Whoops, basi mimi rerun sigma na 6. Tumeona hii kabla, angalau wakati ajali mwisho pia. Kwa nini mimi kupata hii cryptic segmentation kosa? Yeah. [Inaudible-mwanafunzi] Hakuna kesi ya msingi, na hasa zaidi, nini pengine kilichotokea? Hii ni dalili ya nini tabia? Sema ni kidogo nguvu zaidi. [Inaudible-mwanafunzi] Ni kitanzi usio ufanisi, na tatizo na matanzi usio wakati wao kuhusisha recursion katika kesi hii, kazi linalojiita, nini kinatokea kila wakati wewe piga kazi? Naam, tafakari jinsi sisi kuweka nje ya kumbukumbu katika kompyuta. Sisi alisema kuwa kuna hii chunk ya kumbukumbu aitwaye stack kwamba chini, na kila wakati wewe piga kazi kidogo zaidi ya kumbukumbu anapata kuweka juu ya hii stack kinachojulikana zenye kwamba kazi ya vigezo ya ndani au vigezo, hivyo kama sigma wito wito sigma sigma wito sigma  wito sigma ambapo gani hii mwisho hadithi? Naam, ni hatimaye kuongezeka kiasi jumla ya ya kumbukumbu kwamba una inapatikana kwa kompyuta yako. Wewe overrun sehemu kwamba wewe wanatakiwa kukaa ndani, na wewe kupata hii kosa segmentation, msingi madini, na nini maana ya msingi zinatupwa ni kwamba mimi sasa wana faili inayoitwa msingi ambayo ni faili zenye zeros na wale kwamba kwa kweli katika siku zijazo itakuwa diagnostically muhimu. Kama siyo dhahiri kwenu ambapo mdudu yako ni unaweza kweli kufanya kidogo ya uchambuzi wa kisayansi, ili kuzungumza, kwenye faili hii dampo ya msingi, ambayo, tena, ni tu rundo zima la zeros na wale kwamba kimsingi inawakilisha hali ya programu yako katika kumbukumbu sasa ni kugonga kwa njia hii. fix hapa ni kwamba hatuwezi tu upofu kurudi sigma, idadi + sigma ya tatizo kidogo kidogo. Tunahitaji kuwa na aina fulani ya kesi ya msingi hapa, na kile lazima kesi ya msingi pengine kuwa? [Inaudible-mwanafunzi] Sawa, hivyo muda mrefu kama idadi ni chanya sisi lazima kweli kurudi huu, au kuweka njia nyingine, ikiwa ni idadi, kusema, <= kwa 0 unajua nini, mimi itabidi kwenda mbele na kurudi 0, kiasi kama Willy alivyofanya, na kingine, mimi nina kwenda mbele na kurudi huu, hivyo si kwamba kiasi mfupi kuliko toleo iterative kwamba sisi kuchapwa up kwanza kutumia kwa kitanzi, lakini taarifa kwamba kuna aina hii ya ulimbwende hayo. Badala ya kurejea baadhi ya idadi na kufanya math hii yote na kuongeza mambo juu kwa vigezo mitaa wewe badala kusema "Sawa, kama hii ni super rahisi tatizo, kama idadi ni <0, basi mimi mara moja kurudi 0. " Sisi siyo kwenda bother kusaidia idadi hasi, hivyo mimi nina kwenda code ngumu thamani ya 0. Lakini vinginevyo, kutekeleza wazo hili la summing yote ya namba hizi pamoja unaweza ufanisi kuchukua bite ndogo nje ya tatizo, kiasi kama tulivyofanya hapa juu ya hatua, kisha punt ya mapumziko ya tatizo kwa mtu mwingine, lakini katika kesi hii mtu mwingine ni wewe mwenyewe. Ni kazi identically jina. Kupita tu ni tatizo na ndogo ndogo na ndogo kila wakati, na hata kama hatuna kabisa rasmi katika mambo code hapa hii ni nini hasa kinachoendelea katika wiki 0 na kitabu cha simu. Hii ni nini hasa kinachoendelea katika kipindi cha wiki na Sean na kwa maandamano yetu ya kutafuta kwa idadi. Ni kuchukua tatizo na kugawa tena na tena. Kwa maneno mengine, kuna njia ya kutafsiri sasa hii ulimwengu halisi ya kujenga, hii ngazi ya juu ya kujenga ya kugawanya na kushinda na kufanya kitu tena na tena katika kanuni, hivyo hii ni kitu tutaona tena baada ya muda. Sasa, kama kando, kama wewe ni mpya kwa recursion unapaswa angalau kuelewa sasa kwa nini hii ni funny. Mimi nina kwenda kwa google.com, na mimi nina kwenda kutafuta baadhi ya vidokezo na tricks juu ya recursion, kuingia. Mwambie mtu karibu na wewe kama walikuwa si kucheka tu sasa. Ulimaanisha recursion? Ulimaanisha-ah, kuna sisi kwenda. Okay, sasa hiyo ni ya mapumziko ya kila mtu. kidogo Pasaka yai iliyoingia mahali fulani huko katika Google. Kama kando, moja ya viungo sisi kuweka kwenye tovuti ya kozi kwa leo ni tu hii gridi ya algorithms mbalimbali kuchagua, baadhi ya ambayo sisi inaonekana katika wiki ya mwisho, lakini nini ni nzuri kuhusu taswira hii kama wewe kujaribu wrap akili yako karibu mambo mbalimbali kuhusiana na algorithms kujua kwamba unaweza kwa urahisi sana sasa kuanza na aina tofauti ya pembejeo. pembejeo zote kuachwa, pembejeo zaidi sorted, pembejeo random na kadhalika. Kama wewe kujaribu, tena, kutofautisha mambo haya katika akili yako kutambua kwamba hii URL kwenye tovuti kozi ya juu ya ukurasa Mihadhara inaweza kukusaidia sababu kupitia baadhi ya wale. Leo sisi hatimaye kupata kutatua tatizo hili kutoka wakati nyuma, ambayo ilikuwa kwamba kazi hii byta tu hakuwa na kazi, na nini ilikuwa tatizo la msingi na byta kazi hii, Lengo la ambayo ilikuwa, tena, kubadilishana thamani hapa na hapa vile kwamba hii hutokea? Hii si kweli kazi. Kwa nini? Yeah. [Inaudible-mwanafunzi] Hasa, maelezo kwa bugginess hii tu kwa sababu wakati wewe piga kazi katika C na wale kazi kuchukua hoja, kama na b hapa, wewe ni kupita katika nakala ya thamani chochote wewe ni kutoa kwa kazi hiyo. Wewe si kutoa maadili awali wenyewe, hivyo tuliona hii katika muktadha wa buggyc, buggy3.c, ambayo inaonekana kitu kidogo kama hii. Kumbuka kwamba tulikuwa x na y initialized kwa 1 na 2, kwa mtiririko huo. Sisi basi kuchapishwa nini hao. Mimi kisha alidai kwamba nilikuwa swapping yao kwa wito byta ya x, y. Lakini tatizo ni kwamba swapping kazi, lakini tu katika upeo wa kubadilishana kazi yenyewe. Haraka kama sisi hit mstari 40 wale maadili walibadilishana walikuwa kutupwa mbali, na hivyo hakuna kitu katika kazi ya awali kuu ilikuwa kweli iliyopita wakati wote, hivyo kama unafikiri nyuma basi kama yale hii inaonekana kama katika suala la kumbukumbu yetu kama hii upande wa mkono wa kushoto wa bodi inawakilisha- na mimi itabidi kufanya bora wangu kwa kila mtu kuona hii-kama hii upande wa mkono wa kushoto wa bodi inawakilisha, kusema, RAM yako, na stack anaenda kukua kwenye up njia hii, na sisi wito kazi kama kuu, na kuu ina vigezo 2 mitaa, x na y, hebu kuelezea wale kama x hapa, na hebu kueleza haya kama y hapa, na tulenge katika maadili 1 na 2, hivyo hii hapa ni kuu, na wakati kuu wito kazi byta mfumo wa uendeshaji anatoa kazi byta rundo yake mwenyewe ya kumbukumbu juu ya stack, sura yake mwenyewe katika stack, hivyo kusema. Ni pia inatenga bits 32 kwa ints haya. Hufanyika kwa kuwaita na b, lakini hiyo ni kabisa holela. Inawezekana niliyowaitia chochote anataka, lakini kile kinachotokea wakati kuu wito byta ni inachukua hii 1, unaweka nakala huko, unaweka nakala huko. Kuna 1 nyingine za mitaa kutofautiana katika byta, ingawa, imeitaja >> TMP?. TMP, hivyo basi mimi kutoa mwenyewe bits nyingine 32 hapa, na kwa nini mimi kufanya katika kazi hii? Mimi alisema TMP int anapata, hivyo ina 1, hivyo sikuwa hii wakati sisi mwisho alicheza na mfano huu. Kisha b anapata, hivyo b ni 2, hivyo sasa hii inakuwa 2, na sasa anapata b temp, hivyo temp ni 1, hivyo sasa b inakuwa hii. Hiyo ni kubwa. Ni kazi. Lakini basi kwa haraka kama anarudi kazi kumbukumbu byta wa ufanisi kutoweka ili iweze kutumika tena kwa kazi nyingine katika siku zijazo, na ni wazi kabisa kuu unchanged. Tunahitaji njia ya kimsingi ya kutatua tatizo hili, na leo hatimaye tutaweza kuwa na njia ya kufanya hili ambapo tunaweza kuanzisha kitu kinachoitwa pointer. Ni zinageuka kuwa tunaweza kutatua tatizo hili si kwa kupita katika nakala za x na y lakini badala yake kwa kupita katika kile, unafikiri, kwa kazi byta? Yeah, nini kuhusu anuani? Sisi si kweli aliyesema kuhusu anwani kwa undani sana, lakini kama ubao huu inawakilisha kumbukumbu ya kompyuta yangu tunaweza kuanza shaka hesabu ka katika RAM yangu na kusema hii ni Byte # 1, hii ni Byte # 2, Byte # 3, Byte # 4, Byte # ... bilioni 2 kama nina 2 gigabytes ya RAM, hivyo tunaweza shaka kuja na mpango wa baadhi holela hesabu kwa ka wote binafsi katika kumbukumbu ya kompyuta yangu. Nini kama badala wakati mimi kuwaita byta badala ya kupita katika nakala za x na y nini si mimi badala kupita katika anuani ya x hapa, anuani ya y hapa, kimsingi anwani ya posta ya x na y kwa sababu kisha wabadilishane, kama yeye habari ya anuani katika kumbukumbu ya x na y, kisha wabadilishane, kama sisi mafunzo yake kidogo, yeye inaweza uwezekano kuendesha gari kwa anuani ya kwamba, ili kuzungumza, x, na mabadiliko ya idadi ya huko, basi gari na anuani ya y, mabadiliko ya idadi ya huko, hata wakati si kweli kupata nakala ya maadili hayo mwenyewe, hivyo hata kama kuongelea hili kuwa kumbukumbu kuu ya na kumbukumbu hii byta kama kuwa wa nguvu na sehemu ya hatari ya C ni kwamba kazi yoyote anaweza kugusa kumbukumbu popote katika kompyuta, na hii ni nguvu katika kuwa unaweza kufanya mambo sana dhana na programu za kompyuta katika C. Hii ni hatari kwa sababu unaweza pia screw up kwa urahisi sana. Kwa kweli, moja ya njia ya kawaida kwa mipango ya siku hizi kutumiwa bado ni kwa ajili ya programu kutotambua kwamba yeye au yeye ni kuruhusu data kwa kuwa imeandikwa katika mahali katika kumbukumbu kuwa mara si nia. Kwa mfano, yeye au yeye anatangaza safu ya kawaida 10 lakini kisha ajali inajaribu kuweka ka 11 ndani ya kwamba safu ya kumbukumbu, na kuanza kugusa sehemu ya kumbukumbu ya kwamba ni halali tena. Tu contextual hili, baadhi ya unaweza kujua kwamba programu mara nyingi prompts kwa idadi Serial au funguo usajili, Photoshop na Neno na mipango kama hii. Zipo nyufa, kama baadhi ya wewe kujua, online ambapo unaweza kuendesha programu kidogo, na voilà, hakuna ombi zaidi kwa idadi Serial. Je hiyo kazi? Katika kesi nyingi mambo haya ni tu kutafuta katika kompyuta Nakala ya makundi katika zeros ya kompyuta halisi na wale ambapo ni kwamba kazi ambapo idadi Serial ni ombi, na wewe overwrite kwamba nafasi, au wakati wa mpango ni mbio unaweza kufikiri ambapo muhimu ni kweli kuhifadhiwa kutumia kitu kinachoitwa kiweua na unaweza ufa programu kwa njia hiyo. Hii si kusema kwamba hii ni lengo letu kwa michache ijayo siku, lakini ina sana ramifications ulimwengu halisi. Hiyo moja kinachotokea kwa kuhusisha wizi wa programu, lakini pia kuna maelewano ya mashine nzima. Kwa kweli, wakati tovuti siku hizi ni kunyonywa na kuathirika na data ni kuvuja na nywila kuibiwa hii mara nyingi sana inahusiana na usimamizi mbaya wa kumbukumbu ya mtu, au, katika kesi ya database, kushindwa wanatarajia adversarial pembejeo, hivyo zaidi juu ya kwamba katika wiki ijayo, lakini kwa sasa tu sneak preview ya aina ya uharibifu kwamba unaweza kufanya na si kabisa kuelewa jinsi mambo kazi chini ya Hood. Hebu kwenda juu kuelewa kwa nini hii ni kuvunjwa na chombo kwamba litakuwa zaidi na muhimu zaidi kama mipango yetu kupata ngumu zaidi. Hivi sasa wakati umeshapata mdudu katika mpango wako jinsi ya kuwa na wewe zimetimia debugging yake? Nini mbinu yako imekuwa hivi sasa, kama kufundishwa na TF yako au tu binafsi kufundishwa? [Mwanafunzi] Printf. Printf, hivyo printf ina pengine imekuwa rafiki yako katika kwamba kama unataka kuona nini kinaendelea ndani ya mpango wako wewe tu kuweka printf hapa, printf hapa, printf hapa. Kisha wewe kukimbia, na kupata rundo zima ya mambo ya screen kwamba unaweza kutumia kisha kuthibitisha kile ni kweli kwenda vibaya katika programu yako. Printf huelekea kuwa kitu chenye nguvu sana, lakini ni mchakato sana mwongozo. Una kuweka printf hapa, printf hapa, na kama wewe kuweka ndani ya kitanzi unaweza kupata mistari 100 ya pato kwamba wewe kisha kuwa na kuchuja. Ni si sana user-kirafiki au maingiliano utaratibu kwa ajili ya programu debugging, bali nashiriki kuna njia mbadala. Kuna programu, kwa mfano, aitwaye GDB, Debugger GNU, ambayo ni arcane kidogo katika jinsi gani matumizi yake. Ni ngumu kidogo, lakini kusema ukweli, hii ni moja ya mambo hayo ambapo kama wewe kuweka katika wiki hii na ijayo saa za ziada kwa kuelewa kitu kama GDB itakuwa ila wewe makumi pengine ya masaa katika muda mrefu, hivyo pamoja na kwamba, nikupe teaser wa jinsi jambo hili kazi. Mimi niko katika terminal dirisha yangu. Hebu kwenda mbele na kukusanya mpango huu, buggy3. Ni tayari hadi sasa. Hebu kukimbia tu kama sisi alifanya nyuma wakati, na kwa kweli, ni kuvunjwa. Lakini kwa nini hii? Labda mimi Star up kazi byta. Labda ni na b. Mimi si kabisa kusonga yao kuzunguka usahihi. Hebu kwenda mbele na kufanya hili. Badala ya kukimbia tu buggy3 basi mimi badala kukimbia hii GDB mpango, na mimi naenda kuwaambia kwa kukimbia buggy3, na mimi naenda kwa pamoja mstari amri hoja,-tui, na tutaweza kuweka hii katika matatizo ya baadaye katika spec kuwakumbusha. Na sasa hii interface nyeusi na nyeupe popped up tena kuwa, ni kidogo mno kwa sababu kwanza kuna haya yote udhamini habari hapa chini, lakini angalau kuna kitu familiar. Katika juu ya dirisha ni code yangu halisi, na kama mimi kitabu juu hapa basi mimi kitabu kwa sana juu ya faili yangu, na kwa kweli, kuna buggy3.c, na ilani chini ya dirisha hili Nina haraka GDB. Hii si sawa kama kawaida yangu John Harvard haraka. Hii ni haraka ambayo inaenda naomba kudhibiti GDB. GDB ni debugger. debugger ni programu ambayo inakuwezesha kutembea kwa njia ya utekelezaji wa mpango wako mstari kwa mstari kwa mstari, njiani kufanya kitu chochote unataka mpango, hata wito kazi, au kuangalia, muhimu zaidi, katika maadili mbalimbali variable ya. Hebu kwenda mbele na kufanya hili. Mimi nina kwenda mbele na aina katika kukimbia katika haraka ya GDB, hivyo ilani chini kushoto ya screen nimekuwa typed kukimbia, na nimekuwa enter, na ni nini kwamba kufanya? Ni literally mbio mpango wangu, lakini sikuweza kwa kweli kuona mengi kwenda juu hapa kwa sababu mimi si kweli aliiambia debugger pause wakati fulani katika muda. Kuandika tu kukimbia anaendesha mpango. Mimi si kweli kuona chochote. Siwezi kuendesha hiyo. Badala yake basi mimi kufanya hili. Wakati huu wa haraka GDB basi mimi badala aina mapumziko, kuingia. Hiyo si kile mimi maana ya aina. Hebu badala aina mapumziko kuu. Kwa maneno mengine, nataka kuweka kitu kinachoitwa breakpoint, ambayo ni aptly aitwaye sababu itakuwa kuvunja au pause utekelezaji wa mpango yako katika mahali fulani. Kuu ni jina ya kazi yangu. Ona kwamba GDB ni pretty smart. Ni figured kwamba kinachotokea kuu kuanza takribani katika mstari 18 ya buggy3.c, na kisha taarifa hapa juu kushoto b + ni haki ya karibu na mstari 18. Hiyo mimi nakukumbusha kuwa nimekuwekea breakpoint katika mstari wa 18. Wakati huu ambapo ninapoandika kukimbia, mimi naenda kuendesha programu yangu hadi hits kwamba breakpoint, hivyo mpango mapenzi pause kwa ajili yangu katika mstari wa 18. Hapa sisi kwenda, kukimbia. Hakuna inaonekana kuwa kilichotokea, lakini taarifa chini kushoto kuanza programu, buggy3, breakpoint 1 katika kuu katika buggy3.c line 18. Naweza kufanya nini sasa? Taarifa mimi unaweza kuanza kuandika mambo kama magazeti, si printf, magazeti x, na sasa hiyo ni ya ajabu. $ 1 ni udadisi, kama tutaweza kuona kila wakati magazeti kitu wewe kupata mwezi $ thamani. Hiyo ni ili uweze kurejea katika maadili uliopita tu katika kesi, lakini kwa sasa nini magazeti ananiambia ni kwamba thamani ya x katika hatua hii ya hadithi inaonekana 134,514,032. Nini? Wapi kwamba hata kuja kutoka? [Inaudible-mwanafunzi] Hakika, huu ni nini Tutamwita thamani ya takataka, na tumekuwa si aliyesema kuhusu hili bado, lakini sababu ya kwamba wewe initialize vigezo ni wazi ili wapate kuwa baadhi ya thamani ya kwamba unataka wao kuwa. Lakini catch ni kukumbuka kuwa unaweza kutangaza vigezo kama nilivyofanya wakati iliyopita katika mfano wangu sigma bila ya kweli kuwapa thamani. Kumbuka nilivyopatenda juu hapa nchini sigma. Mimi alitangaza n, lakini kile thamani gani mimi kuwapa? Hakuna, kwa sababu nilijua kwamba katika mistari michache ijayo GetInt ingekuwa ya utunzaji wa tatizo la kuweka thamani ndani ya n. Lakini katika hatua hii kwa hadithi ya mstari 11 na mstari wa 12 na 13 na line line 14 katika wale mistari kadhaa ni nini thamani ya n? Katika C wewe tu hawajui. Ni kwa ujumla baadhi ya thamani ya takataka, baadhi idadi kabisa random wa kushoto juu ya kimsingi na kazi baadhi ya awali baada ya kukimbia, hivyo kama mpango wako anaendesha kukumbuka kuwa kazi anapata kazi, kazi, kazi. Muafaka haya yote kupata kuweka kwenye kumbukumbu, na kisha wale kurudi kazi, na kama tu mimi alipendekeza na kifutio kumbukumbu yao ni hatimaye kutumika tena. Naam, ni tu hivyo hutokea kwamba hii x variable katika mpango huu inaonekana kuwa zilizomo baadhi thamani takataka kama 134514032 kutoka kwa baadhi kazi ya awali, si moja kwamba mimi aliandika. Ni inaweza kuwa kitu ambacho huja kwa ufanisi na mfumo wa uendeshaji, baadhi ya kazi chini ya Hood. Okay, hiyo ni nzuri, lakini hebu sasa mapema ili line ijayo. Kama mimi aina "ijayo" katika GDB wangu wa haraka na mimi enter, taarifa kuwa katika kuzungumzia hatua chini ya mstari 19, lakini Kidokezo kimantiki ni kwamba mstari 18 sasa kumaliza utekelezaji, hivyo kama mimi tena aina "magazeti x" Mimi lazima sasa angalia 1, na kwa kweli, mimi kufanya. Tena, stuff $ ni njia ya GDB kuwakumbusha nini historia ya prints ni kwamba umefanya kosa. Sasa basi mimi kwenda mbele na magazeti nje y, na kwa hakika, y ni baadhi ya thamani kama mambo vizuri, lakini hakuna mpango mkubwa kwa sababu katika mstari 19 tuko kuhusu hawawajui ni thamani 2, hivyo basi mimi andika "ijayo" tena. Na sasa tuko kwenye mstari printf. Hebu kufanya x magazeti. Hebu kufanya magazeti y. Kusema ukweli, mimi nina kupata uchovu kidogo ya uchapishaji huu. Hebu badala aina "display x" na "kuonyesha y," na sasa wakati kila ninapoandika amri katika siku zijazo Nami kukumbushwa nini x na y, nini x na y, nini x na y. Naweza pia, kama kando, aina katika "wenyeji info." Info ni amri maalum. Wenyeji maana yake inaonyesha mimi vigezo mitaa. Tu katika kesi mimi kusahau au huyu ni mwenda wazimu, ngumu kazi kwamba mimi au mtu mwingine aliandika maelezo wenyeji atakuambia kile ni vigezo mitaa yote ndani ya kazi hii mitaa kwamba unaweza huduma ya juu kama unataka poke kote. Sasa, printf ni kuhusu kutekeleza, hivyo basi mimi kwenda mbele na aina tu "ujao." Kwa sababu tuko katika mazingira haya sisi siyo kweli kuona ni nitafanya hapa chini, lakini taarifa ni kupata kidogo mangled hapa. Lakini taarifa ni kuu screen pale, hivyo si mpango kamili hapa, lakini hiyo ni sawa kwa sababu siwezi daima poke kuzunguka kutumia magazeti kama nataka. Hebu aina ya pili, na sasa hapa ni sehemu ya kuvutia. Katika hatua hii ya hadithi y ni 2, na x ni 1, kama unahitajika hapa, na tena, sababu hii ni moja kwa moja kuonyesha sasa ni kwa sababu mimi kutumika amri kuonyesha x na y kuonyesha, hivyo wakati ninapoandika ijayo katika nadharia x na y wanapaswa kuwa swapped. Sasa, sisi tayari kujua kwamba si kwenda kuwa kesi, lakini tutaweza kuona katika wakati gani tunaweza kupiga mbizi kwa kina takwimu kwa nini hiyo ni kweli. Next, na kwa bahati mbaya, bado ni y 2 x na bado ni 1, na naweza kuthibitisha kama mengi. Print x, y magazeti. Hakika, hakuna swapping ina hasa kilichotokea, hivyo hebu kuanza hii zaidi. Wazi byta ni kuvunjwa. Hebu badala aina "kukimbia" tena. Hebu kusema ndiyo, nataka kuanzisha upya kuanzia mwanzo, kuingia. Sasa mimi nina nyuma hadi mstari 18. Sasa taarifa x na y ni takataka maadili tena. Next, pili, pili, pili. Kama mimi kupata kuchoka naweza pia aina tu n kwa ajili ya pili. Unaweza abbreviate kwa mlolongo mfupi iwezekanavyo ya wahusika. Swap sasa kuvunjwa. Hebu tuzame katika, hivyo badala ya kuandika ijayo, sasa mimi naenda aina hatua hivyo kwamba mimi nina wanazidi ndani ya kazi hii ili niweze kutembea kwa njia yake, hivyo mimi hit hatua na kisha kuingia. Ona kwamba anaruka mwangaza chini ya chini katika mpango wangu mstari 36. Sasa nini ni vigezo mitaa? Info wazawa. Hakuna bado tu kwa sababu tumekuwa si Gotten kwa kuwa mstari, hivyo hebu kwenda mbele na kusema "ujao." Sasa sisi tunaonekana kuwa na TMP, magazeti TMP. Takataka thamani, haki? Nadhani hivyo. Vipi kuhusu magazeti, magazeti b, 1 na 2? Katika wakati huu, haraka kama mimi aina ya pili TMP ni kwenda kuchukua juu ya thamani ya 1, hopefully, kwa sababu TMP ni kwenda kupewa thamani ya. Sasa hebu gani magazeti, magazeti b, lakini sasa magazeti TMP, na ni kweli 1. Hebu kufanya ijayo. Hebu kufanya ijayo. Nimekuwa kumaliza kazi byta. Mimi bado ndani yake katika mstari 40, hivyo basi mimi magazeti, magazeti b, na mimi sijali nini TMP ni. Inaonekana kama byta ni sahihi linapokuja swapping b na. Lakini kama mimi sasa aina ya pili, mimi kuruka nyuma ya mstari 25, na bila shaka, kama mimi aina katika x na y magazeti wao uko bado unchanged, hivyo tuna si fasta tatizo. Lakini diagnostically sasa labda na mpango huu GDB tumekuwa angalau kujipatia hatua moja karibu na uelewa nini kinaendelea vibaya bila ya kuwa na takataka code yetu kwa kuweka printf hapa, printf hapa, printf hapa na kisha kukimbia tena na tena kujaribu kufikiri nini kinaendelea vibaya. Mimi nina kwenda mbele na kuacha nje ya hii kabisa na kuacha. Ni kwenda basi sema, "Simamisha anyway?" Ndiyo. Sasa mimi nina nyuma katika haraka yangu ya kawaida, na mimi nina kufanyika kwa kutumia GDB. Kama kando, huna haja ya kutumia hii-tui bendera. Kwa kweli, kama wewe ni omit kupata kimsingi nusu chini ya screen. Kama mimi basi aina ya mapumziko kuu na kisha kukimbia Mimi bado anaweza kuendesha programu yangu, lakini nini kufanya ni zaidi textually nionyeshe sasa line moja kwa wakati mmoja. Tui-, textual user interface, tu inaonyesha zaidi ya mpango wa saa moja, ambayo pengine ni kidogo conceptually rahisi. Lakini kwa kweli, mimi wanaweza tu kufanya ijayo, pili, pili, na mimi naenda kuona mstari mmoja kwa wakati, na kama kweli wanataka kuona nini kinaendelea Mimi unaweza aina orodha na kuona rundo zima la mistari jirani. Kuna video ambayo tumekuwa aliuliza kwamba wewe kuangalia kwa tatizo seti 3 ambayo inashughulikia Nate baadhi ya intricacies ya GDB, na hii ni moja ya mambo hayo, uaminifu, ambapo baadhi ya asilimia zisizo trivial ya wewe kamwe kugusa GDB, na kwamba itakuwa kitu mbaya kwa sababu literally wewe kuishia kutumia muda zaidi baadaye huu muhula Chasing chini mende basi ingekuwa kama wewe kuweka katika kwamba nusu saa / saa wiki hii na kujifunza ijayo kwa kupata starehe na GDB. Printf alikuwa rafiki yako. GDB lazima sasa kuwa rafiki yako. Maswali yoyote juu ya GDB? Na hapa ni orodha ya haraka ya baadhi ya amri nguvu zaidi na muhimu. Yeah. >> Je, unaweza magazeti kamba? Je, unaweza magazeti kamba? Kabisa. Haina tu kuwa integers. Kama s kutofautiana ni string aina tu katika s magazeti. Ni kuonyesha nini kwamba variable string ni. [Inaudible-mwanafunzi] Nitakupa anuani na kamba yenyewe. Ni nitakuonyesha zote mbili. Na jambo moja la mwisho, kwa sababu tu hizi ni nzuri kujua pia. Backtrace na sura, basi mimi kupiga mbizi katika wakati huu wa mwisho, sawa exact mpango na GDB. Hebu kwenda mbele na kukimbia textual user interface version, kuvunja kuu. Hebu kwenda mbele na kukimbia tena. Mimi hapa. Sasa basi mimi kwenda ijayo, pili, pili, pili, pili, hatua, kuingia. Na sasa nadhani nina sasa katika byta makusudi, lakini nina kama "Damn, nini ilikuwa thamani ya x?" Mimi siwezi kufanya x tena. Mimi siwezi kufanya y sababu wao siyo katika upeo. Hawako katika mazingira, lakini hakuna tatizo. Mimi unaweza aina backtrace. Hiyo inaonyesha yangu yote ya kazi ya kwamba haijanyonga hadi hatua hii kwa wakati. Ona kwamba moja juu ya chini, kuu, yanaendana na kuu kuwa juu ya chini ya picha yetu hapa. ukweli kwamba byta ni juu ya mistari yake juu na byta kuwa juu yake katika kumbukumbu hapa, na kama nataka kupata nyuma kuu kwa muda naweza kusema "frame." Nini namba? Kuu ni sura # 1. Mimi nina kwenda mbele na kusema "sura 1." Sasa mimi nina nyuma katika kuu, na mimi unaweza magazeti x, na mimi unaweza magazeti y, lakini siwezi magazeti b au. Lakini siwezi kusema kama mimi, "Sawa, kusubiri dakika alikuwa wapi byta.?" Hebu kwenda mbele na kusema "frame 0." Sasa mimi nina nyuma ambapo mimi nataka kuwa, na kama kando, kuna amri nyingine pia, kama kama wewe ni kweli kupata kuchoka kuandika ijayo, pili, pili, pili, unaweza ujumla kusema mambo kama "10 ijayo," na kwamba hatua kupitia mistari 10 ijayo. Unaweza pia kuandika "kuendelea" wakati kweli kupata kulishwa juu na wanazidi kwa njia hiyo. Endelea kukimbia programu yako bila usumbufu mpaka hits mwingine breakpoint, iwe katika kitanzi au chini chini katika mpango wako. Katika kesi hii sisi iliendelea hadi mwisho, na mpango exited kawaida. Hii ni njia dhana tu, duni mchakato. Tu programu yako exited kawaida. Zaidi juu ya kwamba katika video na katika vikao debugging kuja. Hiyo ilikuwa mengi. Hebu yetu 5-dakika kuvunja hapa, na tutaweza kurudi pamoja na structs files. Kama una dived katika pset wiki hii tayari utasikia kujua kwamba sisi kutumia katika code usambazaji, chanzo kificho kwamba sisi kutoa na wewe kama kianzio, baadhi ya mbinu mpya. Hasa, sisi ilianzisha hii Keyword mpya iitwayo struct, kwa muundo, ili tuweze kujenga vigezo customized ya aina. Sisi pia ilianzisha dhana ya faili pembejeo I / O, faili na pato, na hii ni ili tuweze kuokoa hali ya kinyang'anyiro bodi yako na faili kwenye disc ili wenzake mafundisho na naweza kuelewa nini kinaendelea ndani ya mpango wako bila ya kuwa na manually kucheza kadhaa ya michezo ya kinyang'anyiro. Tunaweza kufanya hili zaidi automatedly. Wazo hili la struct kutatua tatizo uungwana kulazimisha. Tuseme kwamba tunataka kutekeleza baadhi ya mpango kwamba kwa namna fulani anaendelea kufuatilia kwa taarifa juu ya wanafunzi, na wanafunzi wanaweza kuwa, kwa mfano, kitambulisho, jina na nyumba katika mahali kama Harvard, hivyo hizi ni vipande 3 wa habari tunataka kuweka karibu, hivyo basi mimi kwenda mbele na kuanza kuandika mpango kidogo hapa, pamoja stdio.h. Basi mimi kufanya ni pamoja na cs50.h. Na kisha kuanza kazi yangu kuu. Nami bother na hoja yoyote mstari amri, na hapa mimi nataka kuwa mwanafunzi, hivyo mimi nina kwenda kusema mwanafunzi ana jina, hivyo mimi nina kwenda kusema "string jina." Kisha mimi nina kwenda kusema mwanafunzi pia ina ID, hivyo int id, na mwanafunzi ana nyumba, hivyo nina pia kwenda kusema "kamba ya nyumba." Basi mimi itabidi ili hawa wadogo zaidi cleanly kama hii. Okay, sasa nina vigezo 3 na ambayo kwa kuwakilisha mwanafunzi, hivyo "mwanafunzi." Na sasa nataka populate maadili haya, hivyo basi mimi kwenda mbele na kusema kitu kama "Id = 123." Jina ni kwenda kupata Daudi. Hebu sema nyumba ni kwenda kupata Mather, na kisha mimi naenda kufanya kitu kiholela kama printf ("% s, ambao ni ID% d, anaishi katika% s. Na sasa, je, nataka kuziba katika hapa, moja baada ya nyingine? Jina, id, nyumba; kurudi 0. Okay, isipokuwa mimi Star up mahali fulani hapa Nadhani tuna mpango pretty nzuri kwamba maduka ya mwanafunzi mmoja. Bila shaka, hii si yote ya kuvutia. Nini kama mimi nataka kuwa na wanafunzi 2? Hiyo ni hakuna mpango mkubwa. Mimi inaweza kusaidia watu 2. Hebu kwenda mbele na kuonyesha hii na kwenda chini hapa, na naweza kusema "id = 456" kwa mtu kama Rob ambaye anaishi katika Kirkland. Okay, kusubiri, lakini siwezi kuwaita hawa kitu kimoja, na inaonekana kama mimi nina kwenda kuwa na nakala hii, hivyo basi mimi kusema kwamba hizi itakuwa Daudi vigezo, na napenda kupata nakala baadhi ya hizi kwa Rob. Tutamwita haya ya Rob lakini hii si kwenda kufanya kazi sasa kwa sababu mimi-kusubiri, hebu mimi kubadili id1, NAME1 na house1. Rob itakuwa 2, 2. Mimi nimepata kubadili hili hapa, hapa, hapa, hapa, hapa, hapa. Kusubiri, nini kuhusu Tommy? Hebu kufanya hii tena. Ni wazi kama bado nadhani hii ni njia nzuri ya kufanya hili, siyo, hivyo nakala / kuweka mbaya. Lakini sisi kutatuliwa wiki hii iliyopita. Nini ilikuwa ufumbuzi yetu wakati sisi alitaka kuwa na matukio mbalimbali ya aina moja data? [Wanafunzi] safu. safu, hivyo basi mimi kujaribu safi hii up. Hebu kufanya baadhi ya chumba kwa ajili yangu mwenyewe kwa juu, na basi mimi badala kufanya hili hapa. Tutaweza kuwaita watu hawa, na badala yake nitakacho wanasema "Vitambulisho int," na mimi naenda kwa msaada wa 3 wa sisi kwa sasa. Mimi nina kwenda kusema "majina kamba," na mimi itabidi kusaidia 3 wa kwetu, na kisha nitakacho wanasema "nyumba kamba," na mimi nina kwenda kwa msaada 3 ya kwetu. Sasa katika hapa badala ya Daudi kupata vigezo yake mwenyewe mitaa tunaweza kujikwamua wale. Kwamba anajisikia vizuri kwamba sisi ni kusafisha hii up. Naweza kusema basi Daudi ni kwenda kuwa [0] na majina [0] na nyumba [0]. Na kisha Rob tunaweza vile vile ila kwenye hili. Hebu kuweka hii hapa chini, hivyo yeye kwenda kiholela kuwa Vitambulisho [1]. Yeye anaenda kuwa majina [1], na kisha mwishowe, nyumba [1]. Bado kidogo tedious, na sasa mimi kuwa na takwimu hii nje, hivyo hebu kusema "majina [0], id [0], nyumba [0], na hebu pluralize hii. Vitambulisho, IDS, Vitambulisho. Na tena, mimi nina kufanya hivyo, hivyo tena, mimi niko tayari kutegemea nakala / kuweka tena, hivyo ni tabia mbaya kuna ufumbuzi mwingine hapa. Mimi pengine unaweza safi hii juu zaidi na kitanzi au kitu kama hicho, hivyo katika muda mfupi, ni kidogo bora lakini bado anahisi kama Mimi nina kutegemea nakala / kuweka, lakini hata hii, mimi kudai, si kweli kimsingi ufumbuzi wa haki kwa sababu nini kama wakati mwingine sisi kuamua unajua nini? Sisi kwa kweli lazima wamekuwa kuhifadhi anwani ya barua pepe kwa Daudi na Rob na kila mtu mwingine katika mpango huu. Tunapaswa pia kuhifadhi namba za simu. Tunapaswa pia kuhifadhi namba za kuwasiliana na dharura. Tuna haya yote vipande ya data kwamba tunataka kuhifadhi, hivyo ni jinsi gani wewe kwenda juu ya kufanya hivyo? Wewe kutangaza mwingine safu ya juu, na kisha wewe mwenyewe kuongeza anuani ya barua pepe [0], anwani ya barua pepe [1] kwa Daudi na Rob na kadhalika. Lakini kuna kweli tu dhana ya msingi ya design hii kwamba mimi ni kwa kutumia mfumo wa heshima kujua kuwa [I] katika kila moja ya arrays kadhaa tu hivyo hutokea kwa kutaja mtu mmoja, hivyo [0] katika Vitambulisho ni namba 123, na mimi nina kwenda kudhani kwamba majina [0] ni jina la mtu huyo na nyumba [0] ni nyumba ya mtu huyo na hivyo nje kwa wote wa arrays mbalimbali kwamba mimi kujenga. Lakini ona kwamba hakuna uhusiano wa kimsingi miongoni mwa wale vipande 3 wa habari, jina id, na nyumba, hata kama chombo tunajaribu mfano katika mpango huu ni si arrays. Arrays ni tu njia hii ya programu ya kufanya hili. Nini sisi kweli unataka kwa mfano katika mpango wetu ni mtu kama Daudi, mtu kama Rob ndani ambayo au encapsulating ni jina na ID na nyumba. Je, sisi kwa namna fulani kueleza wazo hili la encapsulation ambapo mtu ana ID, jina na nyumba na si mapumziko kwa kweli hack hii ambapo sisi tu imani kwamba kitu bracket inahusu chombo huo binadamu katika kila moja ya arrays haya disparate? Tunaweza kweli kufanya hili. Hebu kwenda juu kuu kwa sasa, na hebu kuunda yangu data mwenyewe aina kwa kweli mara ya kwanza. Sisi kutumika mbinu hii katika kinyang'anyiro, lakini hapa mimi nina kwenda mbele na kujenga aina data, na unajua nini, Mimi naenda kuwaita kuwa ni mwanafunzi au mtu, na mimi naenda kutumia typedef kwa kufafanua aina. Mimi naenda kusema kwamba hii ni muundo, na kisha muundo huu ni kwenda kuwa mwanafunzi wa aina, tutaweza kusema, hata kama ni kidogo dated sasa kwa ajili yangu. Tutaweza kusema "int id." Tutaweza kusema "string jina." Kisha tutaweza kusema "string nyumba," hivyo sasa na mwisho wa mistari hii michache ya maadili ya I have just kufundishwa Clang kuwa kuna data aina badala ints, badala ya masharti, badala ya mara mbili, badala inaelea. Kama wa wakati huu katika muda mstari 11, sasa kuna data mpya ya aina inayoitwa wanafunzi, na sasa siwezi kutangaza variable mwanafunzi popote nataka, hivyo basi mimi kitabu chini hapa watu. Sasa naweza kujikwamua hii, na mimi siwezi kwenda nyuma chini ya Daudi hapa, na kwa Daudi kweli mimi kusema kwamba Daudi, tunaweza literally jina variable baada ya mwenyewe, ni kwenda kuwa mwanafunzi wa aina. Hii inaweza kuangalia weird kidogo, lakini hii si wote tofauti kutoka kutangaza kitu kama int au kamba au kamba ya kuelea. Ni tu hivyo hutokea kuitwa mwanafunzi sasa, na kama nataka kuweka kitu ndani ya muundo huu Mimi sasa kutumia kipande mpya ya syntax, lakini ni pretty moja kwa moja, david.id = 123, david.name = "Daudi" katika mji mkuu wa D, na david.house = "Mather," na sasa naweza kujikwamua mambo haya hapa. ILANI tumekuwa sasa redesigned mpango wetu katika njia ya kweli bora zaidi kwa kuwa sasa mpango wetu vioo ulimwengu halisi. Kuna dhana halisi ya dunia ya mtu au mwanafunzi. Hapa tuna sasa version C ya mtu au zaidi hasa mwanafunzi. Ndani ya mtu kwamba ni tabia hizi husika, ID, jina na nyumba, hivyo Rob kimsingi inakuwa kitu kimoja hapa chini, hivyo mwanafunzi kuwaibia, na sasa rob.id = 456, rob.name = "Rob." ukweli kwamba variable inaitwa Rob ni ya aina ya maana. Tungeweza kuitwa ni x au y au z. Sisi tu jina hilo Rob kuwa semantically thabiti, lakini kwa kweli ni jina ndani ya lile shamba yenyewe, hivyo sasa nina hii. Hii pia haina kujisikia kama kubuni bora katika kwamba nimepata ngumu coded Daudi. Nimekuwa ngumu coded Rob. Na mimi bado wana mapumziko kwa nakala baadhi na kuweka kila wakati nataka vigezo mpya. Aidha, nina inaonekana kutoa kila ya vigezo hivi jina, hata kama ningependa badala kiasi kuelezea vigezo hizi  zaidi generically kama wanafunzi. Sasa tunaweza kuunganisha mawazo kwamba wamekuwa wakifanya kazi vizuri kwa ajili yetu na badala yake kusema, "Unajua nini, nipe variable wanafunzi walioitwa, na hebu kuwa ni ya kawaida 3, "hivyo sasa siwezi refine hii zaidi, kujikwamua Daudi manually alitangaza, na mimi unaweza badala kusema kitu kama wanafunzi [0] hapa. Naweza kusema kisha wanafunzi [0] hapa, wanafunzi [0] hapa, na kadhalika, na mimi siwezi kwenda karibu na safi kuwa hadi kwa Rob. Mimi naweza pia kwenda juu sasa labda kuongeza kitanzi na kutumia GetString na GetInt kwa kweli kupata maadili haya kutoka kwa mtumiaji. Ningeweza kwenda mara kwa mara kuhusu kuongeza kwa sababu hii ni kwa ujumla mbaya mazoezi kwa kificho ngumu baadhi idadi holela kama 3 hapa hapa na kisha kumbuka tu kwamba unapaswa kuweka wanafunzi wasiozidi 3 ndani yake. Ni pengine ingekuwa bora kutumia # define ya wakati juu ya faili yangu na sababu ya kwamba nje, hivyo kweli kweli, basi mimi kwenda mbele na generalize hii. Hebu kufungua mfano kwamba kati ya leo mifano mapema, structs1. Hii ni programu kamili zaidi kwamba anatumia # define hapa na anasema sisi itawabidi wanafunzi 3 na default. Hapa nina kutangaza thamani ya darasa la wanafunzi, hivyo darasani ya wanafunzi, na sasa mimi nina kutumia kitanzi tu kufanya code kidogo zaidi kifahari, populate darasa na pembejeo mtumiaji, hivyo iterate kutoka i = 0 juu juu kwa wanafunzi, ambayo ni 3. Na kisha mimi kuchochea mtumiaji katika toleo hili  nini ID mwanafunzi, na mimi kupata kwa GetInt. Nini jina mwanafunzi, na kisha mimi kupata kwa GetString. Nini nyumba ya mwanafunzi? Mimi kupata kwa GetString. Na kisha chini hapa mimi tu aliamua kubadili jinsi mimi nina kuchapa haya na kwa kweli matumizi ya kitanzi, na ambaye mimi uchapishaji? Kulingana na maoni nina uchapishaji mtu yeyote katika Mather, na hiyo ni yake hivyo Rob na Tommy na kadhalika-kweli Tommy katika Mather. Tommy na Daudi itakuwa kuchapishwa katika kesi hii, lakini ni jinsi gani hii kazi? Hatujaona kazi hii kabla, lakini nadhani kuchukua kama yale hii gani. Inalinganishwa masharti. Ni kidogo yasiyo dhahiri jinsi inalinganishwa masharti kwa sababu ni zamu nje ikiwa kuirudisha 0 kwamba maana ya masharti ni sawa. Kama kuirudisha -1 kwamba maana ya mtu kuja alphabetically kabla nyingine, na kama anarudi kwamba maana ya neno 1 nyingine inakuja alphabetically kabla ya wengine, na unaweza kuangalia online au katika ukurasa mtu kuona hasa njia ambayo ni ambayo, lakini yote hii sasa ni kufanya ni kusema ni ikiwa [i]. nyumba ni sawa na "Mather" kisha kwenda mbele na magazeti nje hivyo na hivyo ni katika Mather. Lakini hapa ni kitu sisi hawajaona mbele, na tutaweza kurudi huu. Mimi si unakumbuka hata kuwa kufanya hivyo yoyote ya mipango yangu. Bure ni inaonekana akimaanisha kumbukumbu, kumkomboa kumbukumbu, lakini kile kumbukumbu mimi inaonekana kumkomboa katika kitanzi hii chini ya mpango huu? Inaonekana kama mimi nina kumkomboa jina la mtu na nyumba ya mtu, lakini kwa nini ni hivyo? Ni zinageuka wiki hizi zote kwamba tumekuwa kutumia GetString tumekuwa aina ya amekuwa akianzisha mdudu katika kila moja ya mipango yako. GetString kwa kubuni kumbukumbu inatenga hivyo kwamba wanaweza kurudi wewe kamba, kama Daudi, au Rob, na unaweza kisha kufanya chochote unataka na kwamba kamba katika mpango wako kwa sababu tumekuwa zimehifadhiwa kumbukumbu kwa ajili yenu. tatizo ni wakati huu wote kila wakati wewe piga GetString sisi, waandishi wa GetString, wamekuwa wakiuliza mfumo wa uendeshaji kutupatia kidogo ya RAM kwa kamba hii. Utupe kidogo ya RAM kwa kamba hii ijayo. Tupeni zaidi RAM kwa kamba hii ijayo. Nini wewe, programu, hawajawahi kufanya anatupa kwamba nyuma kumbukumbu, hivyo kwa muda wa wiki kadhaa haya yote ya programu ve yameandikwa wamekuwa na kile kinachoitwa leap kumbukumbu ambapo wanaendelea kutumia zaidi na zaidi kumbukumbu kila wakati wewe piga GetString, na hiyo ni faini. Sisi kwa makusudi kufanya hivyo katika wiki ya kwanza kwa sababu si kwamba kuvutia kwa kuwa na wasiwasi kuhusu ambapo string anakuja kutoka. Unataka wote ni neno Rob kurudi wakati mtumiaji aina hiyo in Lakini kusonga mbele kwa sasa tuna kuanza kupata kisasa zaidi kuhusu hili. Wakati wowote sisi kutenga kumbukumbu sisi bora hatimaye mkono ni nyuma. Vinginevyo katika ulimwengu wa kweli juu ya Mac au PC yako unaweza kuwa mara kwa mara na uzoefu dalili ambapo kompyuta yako ni ya kusaga kwa mguu hatimaye au kijinga inazunguka beach mpira ni tu occupying wa kompyuta mzima makini na huwezi kufanya mambo. Hiyo inaweza kuelezwa na idadi yoyote ya mende, lakini miongoni mwa wale mende iwezekanavyo ni mambo kuitwa kumbukumbu uvujaji ambapo mtu ambaye aliandika kwamba kipande cha programu unatumia hakuwa kumbuka kumbukumbu bure kwamba yeye au yeye aliuliza mfumo wa uendeshaji kwa, si kutumia GetString, kwa sababu hilo ni jambo CS50, lakini kwa kutumia kazi sawa kwamba kuuliza mfumo wa uendeshaji kwa ajili ya kumbukumbu. Kama wewe au wao screw up na kweli kamwe kurudi kwamba kumbukumbu dalili ya kwamba unaweza kuwa mpango kupungua na kupungua na kupungua chini isipokuwa wewe kumbuka kuwaita bure. Tutaweza kurudi lini na kwa nini kuita bure, lakini hebu kwenda mbele tu kwa ajili ya hatua nzuri na kujaribu kuendesha programu hii hasa. Hii ilikuwa inaitwa structs1, kuingia. Hebu kwenda mbele na kukimbia structs1, 123, Daudi Mather, 456, Rob Kirkland, 789, Tommy Mather, na tunaona ya Daudi katika Mather, Tommy katika Mather. Hii ni kidogo tu sanity hundi kwamba mpango kazi. Sasa, kwa bahati mbaya, mpango huu ni kidogo frustrating katika kuwa Sikuweza kazi hiyo yote, mimi typed katika masharti 9 tofauti, enter, aliambiwa ambaye alikuwa katika Mather, bado ni wazi nilijua ambaye alikuwa katika Mather tayari kwa sababu mimi niliandika hivyo. Ni angalau ingekuwa nzuri kama mpango huu ni zaidi kama database na ni kweli anakumbuka kile nilicho typed katika hivyo mimi kamwe tena kuwa na pembejeo rekodi hizi mwanafunzi. Labda ni kama mfumo registrarial. Tunaweza kufanya hili kwa kutumia mbinu hii inajulikana kama faili pembejeo I / O, faili na pato, sana njia generic ya kusema lolote wakati unataka kusoma au kuandika files files unaweza kufanya hivyo kwa kuweka baadhi ya kazi. Hebu kwenda mbele na kufungua hili structs2.c mfano, ambayo ni karibu sawa, lakini hebu angalia nini sasa anafanya. Katika juu ya faili mimi kutangaza darasa la wanafunzi. Mimi kisha populate darasa na pembejeo ya mtumiaji, hivyo wale mistari ya maadili ni hasa kama kabla. Kisha kama mimi kitabu chini hapa mimi magazeti kila mtu ambaye ni katika Mather kiholela kama kabla, lakini hii ni ya kuvutia mpya kipengele. Hizi mistari ya maadili ni mpya, na wao kuanzisha kitu hapa, JALADA, kila kofia, na ina * katika hapa pia. Hebu hoja hii zaidi ya hapa, * juu hapa pia. Kazi hii hatujaona kabla, fopen, lakini inamaanisha faili wazi, hivyo hebu skim kupitia haya, na hii ni kitu tutaweza kurudi katika psets baadaye, lakini mstari huu hapa kimsingi kufungua faili inayoitwa database, na hasa kuufungua hivyo kwa njia ambayo inaweza kufanya nini ni vile? [Inaudible-mwanafunzi] Haki, hivyo "w" tu ina maana ni kuwaambia mfumo wa uendeshaji kufungua faili hii kwa njia ambayo naweza kumwandikia ni vile. Sitaki kusoma. Mimi sitaki iangalie tu. Nataka mabadiliko hayo na kuongeza uwezekano wa mambo hayo, na faili ni kwenda kuitwa database. Hii inaweza kuitwa kitu. Hii inaweza kuwa database.txt. Hii inaweza kuwa. Db. Hii inaweza kuwa neno kama foo, lakini mimi kiholela alichagua jina database file. Hii ni kidogo sanity hundi kwamba tutaweza kurudi katika kina kubwa zaidi ya muda, ikiwa fp, kwa pointer SVG, haina null sawa kwamba maana yote ni sawa. Long hadithi fupi, kazi kama fopen wakati mwingine kushindwa. Labda faili haipo. Labda wewe ni nje ya nafasi ya disc. Labda huna ruhusa ya folder kwamba, hivyo kama fopen anarudi kitu null mbaya kilichotokea. Kinyume chake, kama fopen haina kurudi null wote ni vizuri na mimi unaweza kuanza kuandika na faili hii. Hapa ni hila mpya. Hii ni kitanzi kwa hiyo iterating juu ya kila mmoja wa wanafunzi wangu, na hii inaonekana hivyo sawa na kile ambacho tumefanya kabla, lakini kazi hii ni binamu wa printf kuitwa fprintf kwa faili printf, na taarifa hiyo ni tofauti katika njia tu 2. Moja, ni kuanza kwa f badala ya p, lakini basi hoja yake ya kwanza ni inaonekana nini? [Wanafunzi] File. >> Ni faili. Hii kitu inayoitwa fp, ambayo hatimaye tutaweza tease mbali kile pointer faili ni, lakini kwa sasa fp tu inawakilisha faili kwamba mimi na kufunguliwa, hivyo fprintf hapa ni kusema magazeti ID hii mtumiaji SVG, si kwa screen. Andika jina la mtumiaji na faili, si kwa screen, nyumba ya SVG, si kwa screen, na kisha chini hapa, ni wazi, karibu faili, na kisha chini hapa bure kumbukumbu. Tofauti pekee kati ya toleo hili 2 na toleo 1 ni kuanzishwa fopen na hii JALADA na * na wazo hili la fprintf, hivyo hebu angalia nini matokeo ya mwisho ni. Hebu kwenda katika terminal dirisha yangu. Hebu kukimbia structs2, kuingia. Inaonekana kama yote ni sawa. Hebu rerun structs2. 123, Daudi Mather, 456, Rob Kirkland, 789, Tommy Mather, kuingia. Inaonekana kama ni walijivuna sawa, lakini kama mimi sasa kufanya ls taarifa gani faili ni katika hapa kati yangu code yote, database, hivyo hebu kufungua kwamba, gedit wa database, na kuangalia kwamba. Ni si sexiest ya muundo faili. Ni kweli ni moja ya kipande cha data line kwa kila mstari kwa mstari, lakini wale ambao wanatumia files Excel au CSV, comma separated maadili, Mimi naweza shaka kutumika kwa fprintf badala labda kufanya kitu kama hiki ili mimi nilikuwa kwa kweli kujenga sawa ya faili Excel kwa kutenganisha mambo kwa koma, si tu mpya mistari. Katika kesi hii kama alikuwa na badala yake kutumika koma badala ya mistari mpya Mimi nilikuwa literally kufungua faili hii database katika Excel kama mimi badala alifanya ni kuangalia kama hii. Kwa kifupi, sasa kwamba tuna uwezo wa kuandika kwa files tunaweza sasa kuanza data kuendelea, kuweka kuzunguka disc ili tuweze kuweka habari karibu tena na tena. Notice michache ya mambo mengine ambayo ni sasa kidogo zaidi familiar. Katika juu ya faili hii C tuna typedef kwa sababu sisi alitaka kujenga aina data kwamba inawakilisha neno, hivyo aina hii inaitwa neno, na ndani ya muundo huu ni kidogo fancier sasa. Kwa nini ni neno linaloundwa inaonekana safu? Je, ni neno tu intuitively? Ni safu ya wahusika. Ni mlolongo wa wahusika nyuma kwa nyuma kwa nyuma. Barua katika kofia wote hutokea kwa kuwa sisi kiholela kusema upeo urefu yoyote ya neno katika kamusi ya kwamba sisi ni kutumia kwa ajili ya kinyang'anyiro. Kwa nini nina 1? tabia null. Kumbuka wakati sisi tulikuwa mfano Bananagrams sisi zinahitajika thamani maalum mwisho wa neno ili kuweka wimbo ambapo maneno ya kweli kumalizika, na kama tatizo kuweka vipimo anasema hapa sisi ni kujihusisha na neno aliyopewa thamani bulin, bendera, ili kuzungumza, kweli au uongo. Je, umefanikiwa neno hili tayari, kwa sababu tunatambua kweli tunahitaji njia ya kukumbuka si tu maana ya neno ni katika kinyang'anyiro lakini kama au wewe, mwanadamu, wamegundua kuwa ili kwamba kama wewe kufanya kupata neno "" huwezi aina tu, kuingia, ingieni,, kuingia na kupata pointi 3, pointi 3, pointi 3, pointi 3. Tunataka kuwa na uwezo wa Fukuza kwamba neno kwa kuweka bool kwa kweli kama wewe ve tayari kuiona, na hivyo ndiyo sababu sisi zimegawanywa katika muundo huu. Sasa, hapa chini katika kinyang'anyiro kuna hii struct nyingine iitwayo kamusi. Hayupo hapa ni neno typedef kwa sababu katika kesi hii sisi zinahitajika kurejelea wazo la kamusi, na kamusi ina rundo zima la maneno, kama alisema kwa safu hii, na jinsi wengi wa maneno hayo yapo? Naam, chochote hii variable kuitwa ukubwa anasema. Lakini sisi tu haja moja kamusi. Hatuna haja ya data aina ya kuitwa kamusi. Sisi tu haja ya mmoja wao, hivyo ni zamu nje katika C kwamba kama huna kusema typedef, wewe tu kusema struct, basi ndani ya braces curly kuweka vigezo yako, basi unaweza kuweka jina. Hii ni moja kutangaza variable kuitwa kamusi kwamba inaonekana kama hii. Kwa kulinganisha, mistari haya ni kujenga reusable data muundo kuitwa neno kwamba unaweza kujenga nakala nyingi za, kama sisi aliumba nyingi nakala za wanafunzi. Je, hii hatimaye kuruhusu sisi kufanya nini? Hebu nirejee nyuma katika, hebu sema, mfano rahisi kutoka mara rahisi, na napenda kufungua, hebu sema, compare1.c. tatizo hapa chini ya mkono ni kweli peel nyuma safu ya kamba na kuanza kuchukua mbali magurudumu mafunzo haya kwa sababu ni zinageuka kuwa string wakati huu wote ni kama sisi aliahidi katika wiki 1 kweli tu utani, kisawe kutoka maktaba CS50 kwa kitu ambacho inaonekana kidogo zaidi cryptic, * Char, na tumeona nyota hii kabla. Tuliiona katika muktadha wa files. Hebu sasa kuona nini tumekuwa mafichoni hii undani kwa muda sasa. Hapa ni faili inayoitwa compare1.c, na inaonekana anauliza mtumiaji kwa masharti 2, s na t, na kisha anajaribu kulinganisha masharti hayo kwa usawa katika mstari 26, na kama uko sawa inasema, "Wewe typed kitu kimoja," na kama si sawa inasema, "Wewe typed mambo tofauti." Hebu kwenda mbele na kuendesha mpango huu. Hebu kwenda katika chanzo saraka yangu, kufanya compare1. Ni compiled sawa. Hebu kukimbia compare1. Mimi itabidi zoom katika, kuingia. Kusema kitu. HELLO. Mimi itabidi kusema kitu tena. HELLO. Mimi dhahiri hakuwa aina ya mambo mbalimbali. Hebu jaribu hii tena. Bye bye. Dhahiri si tofauti, hivyo nini kinaendelea hapa? Naam, ni nini kweli kuwa ikilinganishwa katika mstari 26? [Inaudible-mwanafunzi] Ndiyo, hivyo ni zinageuka kuwa kamba, data aina, ni aina ya uongo nyeupe. kamba ni * Char, lakini nini ni * Char? * Char, kama wanasema, ni pointer, na pointer ni ufanisi anuani, Jumla mahali katika kumbukumbu, na kama kutokea kwa kuwa typed katika neno kama HELLO, kukumbuka kutoka mijadala ya zamani ya masharti hii ni kama neno HELLO. Kumbuka kwamba neno kama HELLO inaweza kuwakilishwa kama safu ya wahusika kama hii na kisha na tabia maalum mwishoni iitwayo tabia null, kama inaashiria \. Je, ni kweli kamba? Ona kwamba hii ni nyingi chunks ya kumbukumbu, na kwa kweli, mwisho wa ni tu inajulikana mara moja wewe kuangalia njia ya string nzima kuangalia kwa tabia maalum null. Lakini kama hii ni chunk ya kumbukumbu kutoka kumbukumbu ya kompyuta yangu, hebu kiholela kusema kwamba kamba hii tu got bahati, na got kuwekwa katika mwanzo sana ya RAM kompyuta yangu. Hii ni Byte 0, 1, 2, 3, 4, 5, 6 ... Wakati mimi kusema kitu kama GetString na mimi kufanya string s = GetString nini kweli kuwa alirudi? Kwa wiki hizi kadhaa iliyopita, nini kweli kuwa kuhifadhiwa katika s si hii kamba per se, lakini katika kesi hii ya nini kuwa kuhifadhiwa ni 0 idadi sababu kile GetString ya kweli haina ni haina kimwili kurudi kamba. Hiyo haina kweli hata kufanya akili ya kuelewa. Nini hivyo kurudi ni idadi. Kwamba idadi ni anuani ya HELLO katika kumbukumbu, na kamba ya basi, kama sisi Peel nyuma safu hii, kamba si kweli zipo. Ni tu kurahisisha katika maktaba CS50. Hii kweli ni kitu kinachoitwa Char *. Char mantiki kwa sababu nini neno, kama HELLO? Naam, ni mfululizo wa chars, mfululizo wa wahusika. * Char maana anuani ya tabia, hivyo ni nini maana ya kurudi kamba? nzuri, rahisi njia ya kurejea kwa kamba ni badala ya kujaribu kufikiri ni jinsi gani mimi kurudi ka 5 au 6 tofauti napenda kurudi anuani ambayo Byte? moja ya kwanza. Kwa maneno mengine, nikupe anwani ya tabia katika kumbukumbu. Hiyo ni nini * Char inawakilisha, anuani ya tabia moja katika kumbukumbu. Wito kwamba s kutofautiana. Hifadhi katika s fulani anuani, ambayo mimi kiholela alisema ni 0, tu kuweka mambo rahisi, lakini katika hali halisi ni ujumla idadi kubwa. Subiri dakika. Kama wewe ni tu kunipa anuani ya tabia ya kwanza, jinsi gani mimi kujua nini anuani ni wa tabia ya pili, tatu, nne na tano? [Inaudible-mwanafunzi] Wewe tu kujua ambapo mwisho wa kamba ni kwa njia ya hila hii Handy, hivyo wakati wewe kutumia kitu kama printf, nini printf literally inachukua kama hoja yake, kukumbuka kwamba sisi kutumia placeholder hii% s, na kisha kupita katika variable hiyo hifadhi kamba. Nini wewe kweli kupita ni anuani ya tabia ya kwanza ya kamba hiyo. Printf kisha anatumia kwa kitanzi au kitanzi wakati juu ya kupokea kwamba anuani, kwa mfano, 0, hivyo basi mimi kufanya hili sasa, printf ("% s \ n," s); Wakati mimi kuwaita printf ("% s \ n," s); nini mimi kweli kutoa printf na ni anuani ya tabia ya kwanza katika s, ambayo katika kesi hii holela ni H. Jinsi gani printf kujua nini hasa kuonyesha kwenye screen? mtu ambaye kutekelezwa printf kutekelezwa kitanzi wakati au kwa kitanzi kwamba anasema hana tabia hii sawa maalum null tabia? Kama siyo, magazeti hayo. Vipi kuhusu hili? Kama si magazeti hayo, magazeti hayo, magazeti hayo, magazeti hayo. Oh, hii ni moja maalum. Acheni uchapishaji na kurudi kwa mtumiaji. Na kwamba literally yote ya kinachotokea chini ya Hood, na kwamba mengi ya kufungua katika siku ya kwanza ya darasa, lakini kwa sasa ni kweli ya kuzuia ujenzi wa kila kitu uelewa hiyo imekuwa kinaendelea ndani ya kumbukumbu ya kompyuta yetu, na hatimaye tutaweza tease hii mbali na msaada kidogo kutoka kwa mmoja wa marafiki zetu katika Stanford. Profesa Nick Parlante saa Stanford amefanya hii ya ajabu video mlolongo kutoka kila aina ya lugha mbalimbali ambayo ilianzisha hiki kidogo Claymation tabia Binky. sauti uko juu ya kusikia katika hakikisho tu chache pili sneak ni ile ya profesa Stanford, na wewe ni kupata 5 tu au 6 sekunde ya haki hii sasa, lakini hii ni note ambayo tutaweza kuhitimisha leo na kuanza Jumatano. Mimi kukupa Pointer Mziki na Binky, hakikisho. [♪ ♪ Music] [Profesa Parlante] Hey, Binky. Kuamka. Ni wakati kwa ajili ya kujifurahisha pointer. [Binky] Nini hiyo? Jifunze kuhusu kuyatumia? Oh, GOODY! Sisi kuona juu ya Jumatano. [CS50.TV]