[Powered by Google Translate] [Review] [Quiz 0] [Lexi Ross, Tommy MacWilliam, Lucas Freitas, Joseph Ong] [Chuo Kikuu cha Harvard] [Hii ni CS50.] [CS50.TV] Hey, kila mtu. Karibu kikao mapitio kwa Quiz 0, ambayo ni kuchukua nafasi hii Jumatano. Nini sisi ni kwenda kufanya usiku wa leo, mimi nina kwa TFS 3 nyingine, na pamoja tunakwenda kupitia mapitio ya kile ambacho tumefanya katika shaka hadi sasa. Ni si kwenda kuwa 100% ya kina, lakini ni lazima kukupa wazo bora ya nini wewe tayari chini na kile bado unahitaji kujifunza kabla ya Jumatano. Na kujisikia huru kunyanyua mkono wako na maswali kama tunakwenda pamoja, lakini kukumbuka kwamba tutaweza pia kidogo kidogo ya muda katika mwisho- kama sisi kupata kupitia kwa dakika chache vipuri-kufanya maswali ya jumla, hivyo kuendelea kuwa katika akili, na hivyo sisi ni kwenda kuanza mwanzoni na Wiki 0. [Quiz 0 Review!] [Part 0] [Lexi Ross] Lakini kabla ya sisi kufanya hivyo hebu majadiliano kuhusu vifaa ya chemsha bongo. [Logistics] [Quiz unafanyika Jumatano 10/10 badala ya hotuba] [(Angalia http://cdn.cs50.net/2012/fall/quizzes/0/about0.pdf kwa maelezo zaidi)] Ni juu ya Jumatano, Oktoba 10. Hiyo ni hii Jumatano, na kama wewe kwenda URL hii hapa, ambayo pia ni kupatikana kutoka CS50.net-kuna zilizounganishwa na ni- unaweza kuona taarifa kuhusu ambapo kwenda kwa kuzingatia jina yako ya mwisho au kuyaunganisha shule kama vile ni anaelezea kuhusu nini hasa Jaribio itafikia na aina ya maswali kwamba wewe ni kwenda kupata. Kumbuka kwamba utapata pia kuwa na nafasi ya kupitia kwa chemsha bongo katika sehemu, hivyo TFS yako lazima kwenda juu ya matatizo ya baadhi ya mazoezi, na kwamba ni nafasi nyingine nzuri ya kuona ambapo wewe bado wanahitaji kujifunza kwa ajili ya chemsha bongo. Hebu kuanza mwanzoni na Bytes bits 'n'. Kumbuka kidogo tu ni 0 au 1, na Byte ni mkusanyiko wa 8 wa bits wale. Hebu tuangalie hii ukusanyaji wa bits haki hapa. Tunapaswa kuwa na uwezo wa kufikiri jinsi wengi bits kuna. Ambapo sisi kuhesabu kuna tu 8 wao, nane 0 au 1 vipande. Na tangu kuna 8 bits, hiyo ni 1 Byte, na hebu kubadilisha kwa hexadesimoli. Hexadesimoli ni msingi 16, na ni pretty rahisi kubadili idadi katika binary, ambayo ni kile kwamba ni, na idadi katika hexadesimoli. Wote sisi kufanya ni sisi kuangalia makundi ya 4, na sisi kubadili yao kwa tarakimu sahihi hexadesimoli. Tunaweza kuanza na kundi haki-zaidi ya 4, hivyo 0011. Hiyo inaenda kuwa moja na moja 1 2, hivyo pamoja kwamba inafanya 3. Na kisha hebu tuangalie block nyingine ya 4. 1101. Hiyo inaenda kuwa moja 1, moja 4, na moja 8. Pamoja kwamba ni kwenda kuwa 13, ambayo inafanya D. Na tutaweza kukumbuka kwamba katika hexadesimoli sisi hawaendi tu 0 kupitia 9. Sisi kwenda 0 kupitia F, hivyo baada ya 9, sambamba 10 kwa, 11 A na B, nakadhalika ambapo F ni 15. Hapa ni 13 D, hivyo kwa kubadilisha kwa decimal wote sisi kufanya ni sisi kweli kutibu kila nafasi kama nguvu ya 2. Hiyo ni moja 1, 2 moja, sifuri 4s, sifuri 8s, mmoja 16, nakadhalika, na ni kidogo ngumu kwa compute katika kichwa yako, lakini kama sisi kwenda slide ijayo tunaweza kuona jibu la kwamba. Kimsingi sisi ni kwenda hela kutoka kulia nyuma upande wa kushoto, na sisi ni kuzidisha kila tarakimu kwa nguvu sambamba ya 2. Na kumbuka, kwa hexadesimoli sisi kuashiria namba hizi kwa 0x mwanzoni hivyo hatuna kuchanganya hili na idadi decimal. Kuendelea juu, hii ni Jedwali ASCII, na kile sisi kutumia ASCII kwa ni ramani ya kutoka wahusika kwa maadili ya namba. Kumbuka katika pset cryptography sisi alifanya matumizi makubwa ya Jedwali ASCII ili kutumia mbinu mbalimbali za cryptography, Kaisari na cipher Vigenère, kubadili barua tofauti katika kamba kulingana na muhimu uliotolewa na mtumiaji. Hebu tuangalie kidogo ya math ASCII. Kuangalia 'P' + 1, katika tabia fomu kwamba itakuwa Q, na kukumbuka kwamba '5 '≠ 5. Na jinsi gani hasa ingekuwa sisi kubadilisha kati ya fomu hizo 2? Ni kweli si ngumu sana. Ili kupata 5 sisi Ondoa '0 ' kwa sababu kuna maeneo 5 kati ya '0 'na '5'. Ili kwenda njia nyingine sisi tu kuongeza 0, hivyo ni aina ya kama hesabu ya mara kwa mara. Kumbuka tu kwamba wakati kitu ina quotes pembezoni ni tabia na hivyo sambamba na thamani katika meza ASCII. Kuhamia katika zaidi ya jumla ya mada sayansi ya kompyuta. Tulijifunza nini algorithm ni na jinsi ya kutumia programu kutekeleza algorithms. Baadhi ya mifano ya algorithms ni kitu rahisi kama kweli kuangalia kama idadi ni hata au isiyo ya kawaida. Kwa kuwa kumbuka sisi Mod idadi na 2 na kuangalia kama matokeo ni 0. Kama ni hivyo, ni hata. Kama siyo, ni isiyo ya kawaida. Na kwamba ni mfano wa algorithm kweli ya msingi. kidogo ya moja kushiriki zaidi ni binary tafuta, ambayo tutaweza kwenda juu ya baadaye katika kikao cha mapitio. Na programu hii ni mrefu sisi kutumia kwa ajili ya kuchukua algorithm na kuwageuza kwa code kompyuta unaweza kusoma. 2 mifano ya programu ni Scratch, ambayo ni kile sisi alivyofanya katika Wiki 0. Hata ingawa sisi si kweli aina nje code ni njia ya kutekeleza hii algorithm, ambayo ni uchapishaji idadi 1-10, na hapa sisi kufanya hivyo katika lugha ya programu C. Hizi ni functionally sawa, tu yaliyoandikwa katika lugha tofauti au syntax. Sisi basi kujifunza kuhusu misemo bulin, na bulin ni thamani hiyo ni aidha kweli au uongo, na hapa mara nyingi bulin misemo kwenda ndani ya hali, hivyo kama (x ≤ 5), vizuri, sisi tayari kuweka x = 5, hivyo hali ya kuwa ni kwenda kutathmini kwa kweli. Na kama ni kweli, yo code ni chini ya hali ni kwenda kuwa tathmini na kompyuta, hivyo string kwamba ni kwenda kuwa kuchapishwa pato ya kiwango, na hali mrefu inahusu viliomo ndani ya mabano ya kauli kama. Kumbuka waendeshaji wote. Kumbuka && yake na | | wakati sisi ni kujaribu kuchanganya hali ya 2 au zaidi, == Si = kuangalia kama 2 mambo ni sawa. Kumbuka kwamba ni kwa ajili ya zoezi = ambapo == ni operator bulin. ≤, ≥ na kisha 2 ya mwisho ni self-maelezo. mapitio ya jumla ya mantiki ya bulin hapa. Na maneno ya bulin ni muhimu pia katika tanzi, ambayo tutaweza kwenda juu sasa. Tulijifunza kuhusu aina 3 ya vitanzi hivyo mbali katika CS50, kwa, wakati, na kufanya wakati. Na ni muhimu kujua kwamba wakati kwa makusudi zaidi tunaweza kweli matumizi ya aina yoyote ya kitanzi ujumla kuna aina fulani ya makusudi au ruwaza ya kawaida katika programu ambayo hasa wito kwa moja ya matanzi hizi kwamba kufanya hivyo ni bora zaidi au kifahari kwa kificho katika njia hiyo. Hebu kwenda juu ya nini kila matanzi hizi huelekea kutumika kwa mara nyingi. Katika kwa kitanzi sisi ujumla tayari kujua jinsi mara nyingi tunataka iterate. Hiyo ni nini sisi kuweka katika hali hiyo. Kwa maana, i = 0, i <10, kwa mfano. Sisi tayari kujua kwamba tunataka kufanya kitu mara 10. Sasa, kwa kitanzi wakati, kwa ujumla hatuwezi si lazima kujua jinsi mara nyingi tunataka kitanzi kukimbia. Lakini sisi kujua aina fulani ya hali ya kuwa sisi unataka kwa daima kuwa kweli au daima kuwa uongo. Kwa mfano, wakati ni kuweka. Hebu kusema kwamba variable bulin. Wakati hiyo ni kweli tunataka code kutathmini, hivyo kidogo zaidi extensible, kidogo zaidi ya jumla kuliko kwa kitanzi, lakini yoyote kwa kitanzi pia inaweza kuongoka kwa kitanzi wakati. Hatimaye, kufanya wakati tanzi, ambayo inaweza kuwa trickiest kufahamu haki mbali, zinatumika mara nyingi wakati tunataka kutathmini code kwanza kabla ya wakati wa kwanza sisi kuangalia hali. matumizi ya pamoja kesi kwa kufanya wakati kitanzi ni wakati unataka kupata user pembejeo, na unajua unataka kuuliza mtumiaji kwa ajili ya pembejeo angalau mara moja, lakini kama hawana kukupa pembejeo nzuri haki mbali unataka kuendelea kuuliza nao mpaka kukupa pembejeo nzuri. Hiyo ni matumizi ya kawaida ya kufanya wakati kitanzi, na hebu tuangalie muundo halisi ya matanzi haya. Wao kawaida huwa daima kufuata ruwaza hizi. On kitanzi kwa ajili ya ndani una vipengele 3: initialization, kawaida kitu kama int i = 0 ambapo i ni counter, hali, ambapo tunataka kusema kukimbia hii kwa kitanzi kwa muda mrefu kama hali hii bado anashikilia, kama i <10, na kisha hatimaye, update, ambayo ni jinsi sisi increment variable counter katika kila hatua katika kitanzi. jambo la kawaida kuona kuna tu i + +, ambayo ina maana increment i na 1 kila wakati. Unaweza pia kufanya kitu kama i + = 2, ambayo ina maana ya kuongeza 2 na i kila wakati wewe kwenda kwa njia ya kitanzi. Na kisha kufanya hivyo tu inahusu yoyote kificho kwamba kweli anaendesha kama sehemu ya kitanzi. Na kwa kitanzi wakati, wakati huu sisi kweli kuwa initialization nje ya loop, hivyo kwa mfano, hebu kusema sisi ni kujaribu kufanya aina moja ya loop kama mimi tu ilivyoelezwa. Tunataka kusema int i = 0 kabla kitanzi huanza. Kisha tunaweza kusema wakati i <10 kufanya hili, hivyo kuzuia huo wa kanuni kama kabla, na wakati huu sehemu update ya kificho, kwa mfano, i + +, kweli inakwenda ndani ya kitanzi. Na hatimaye, kwa kufanya wakati, ni sawa na kitanzi wakati, lakini tunahitaji kukumbuka kwamba kanuni itakuwa kutathmini mara moja kabla hali ni checked, hivyo inafanya mengi zaidi akili kama ukiangalia kwa utaratibu wa juu hadi chini. Katika, kufanya wakati kitanzi code kutathmini kabla hata kuangalia hali wakati ambapo kitanzi wakati, hundi ya kwanza. Kauli na vigezo. Wakati tunataka kujenga variable mpya sisi kwanza unataka initialize yake. Kwa mfano, bar int initializes bar variable, lakini haina kuwapa thamani, hivyo ni nini thamani bar sasa? Hatujui. Ni inaweza kuwa baadhi ya thamani ya takataka kwamba awali alikuwa kuhifadhiwa katika kumbukumbu huko, na hatutaki kutumia kwamba variable mpaka sisi kweli kuwapa thamani, hivyo sisi kutangaza hapa. Kisha sisi initialize kuwa ni 42 chini. Sasa, bila shaka, tunajua hii inaweza kufanyika kwenye mstari mmoja, int bar = 42. Lakini tu kuwa wazi hatua mbalimbali ambayo ni kwenda, tamko na initialization yanayotokea tofauti hapa. Ni hufanyika kwenye hatua moja, na moja ijayo, int bazi = bar + 1, kauli hii hapa chini, kwamba bazi nyongeza, hivyo mwisho wa block hii code kama tulikuwa na magazeti thamani ya bazi itakuwa 44 kwa sababu sisi kutangaza na initialize kuwa ni 1> bar, na kisha sisi increment mara moja zaidi na + +. Sisi akaenda juu ufupi hii pretty, lakini ni vizuri kuwa na jumla ya kuelewa nini threads na matukio ni. Sisi hasa alifanya hivyo katika Scratch, hivyo unaweza kufikiri ya nyuzi kama Mwandamano nyingi ya maadili ya mbio kwa wakati mmoja. Katika actuality, basi pengine si mbio wakati huo huo, lakini aina ya abstractly tunaweza kufikiria ni katika njia hiyo. Katika Scratch, kwa mfano, tulikuwa na sprites nyingi. Ni inaweza kuwa utekelezaji code tofauti kwa wakati mmoja. Mtu anaweza kuwa kutembea wakati mwingine kusema kitu katika sehemu mbalimbali ya screen. Matukio ni njia nyingine ya kujitenga kutoka mantiki kati ya mambo mbalimbali ya code yako, na katika Scratch tulikuwa na uwezo wa kuigiza matukio kutumia Broadcast, na hiyo ni kweli Wakati mimi Pokea, si Wakati mimi Sikieni, lakini kimsingi ni njia ya kutangaza habari kutoka sprite mmoja hadi mwingine. Kwa mfano, unaweza kutaka kusambaza mchezo juu, na wakati mwingine sprite inapata mchezo juu, inavyopokea katika njia fulani. Ni mfano wa kuigwa muhimu kuelewa kwa programu. Tu kwenda juu ya Wiki ya msingi 0, nini tumeenda juu hadi sasa, hebu tuangalie mpango huu rahisi C. Nakala inaweza kuwa kidogo kidogo kutoka hapa, lakini mimi nitakwenda juu yake kweli haraka. Sisi ni pamoja na files header 2 saa ya juu, na cs50.h stdio.h. Sisi ni mara kwa mara kisha kufasili kuitwa kikomo kuwa 100. Sisi ni kisha kutekeleza kazi yetu kuu. Tangu sisi si kutumia hoja mstari amri hapa tunahitaji kuweka utupu kama hoja kwa kuu. Tunaona int juu kuu. Hiyo ni aina ya kurudi, hivyo kurudi 0 chini. Na sisi ni kutumia CS50 maktaba kazi kupata int kuuliza mtumiaji kwa ajili ya pembejeo, na sisi kuhifadhi katika x hii variable, hivyo sisi kutangaza x hapo juu, na sisi initialize kwa x = GetInt. Sisi basi kuangalia kuona kama mtumiaji alitupa pembejeo nzuri. Kama ni ≥ LIMIT tunataka kurudi code makosa ya 1 na magazeti ujumbe wa kosa. Na hatimaye, kama mtumiaji ametupa nzuri pembejeo tunakwenda mraba namba na magazeti nje kwamba matokeo. Tu kuhakikisha kwamba wale wote nyumbani hit unaweza kuona maandiko ya sehemu mbalimbali za code hapa. Nilivyoeleza mara kwa mara, files header. Oh, int x. Hakikisha kukumbuka kwamba variable mitaa. Hiyo analinganisha ni kutoka variable kimataifa, ambayo tutaweza majadiliano juu ya kidogo kidogo baadaye katika kikao cha mapitio, na sisi ni wito kazi maktaba printf, hivyo kama sisi alikuwa si pamoja stdio.h header faili sisi isingekuwa na uwezo wa kuwaita printf. Na naamini arrow kwamba got kukatwa hapa ni akizungumzia d%, ambayo ni string formatting katika printf. Ni anasema magazeti nje hii variable kama d idadi,%. Na kwamba ni kwa ajili ya Wiki 0. Sasa Lucas ni kwenda kuendelea. Hey, guys. Jina langu ni Lucas. Mimi nina sophomore katika nyumba bora juu ya chuo, Mather, na mimi nina kwenda kuzungumza kidogo kuhusu Wiki 1 na 2.1. [Wiki 1 na 2.1!] [Lucas Freitas] Kama Lexi alikuwa akisema, wakati sisi ilianza kutafsiri code yako kutoka kwa Scratch C moja ya mambo ambayo sisi niliona ni kwamba unaweza tu kuandika code yako na kukimbia kwa kutumia bendera ya kijani tena. Kweli, una kutumia baadhi ya hatua na kufanya yako C mpango kuwa faili la kutekelezwa. Kimsingi nini unaweza kufanya wakati wewe ni kuandika mpango ni kwamba wewe kutafsiri wazo lako katika lugha ya kwamba compiler anaweza kuelewa, hivyo wakati wewe ni kuandika mpango katika C kile unachokifanya ni kweli kuandika kitu ambacho compiler yako anaenda kuelewa, na kisha compiler ni kwenda kutafsiri kwamba kanuni katika kitu ambacho kompyuta yako, wataelewa. Na jambo lenyewe, kompyuta yako ni kweli sana bubu. Kompyuta yako inaweza tu kuelewa na sekunde 0 1s, hivyo kweli katika kompyuta ya kwanza kwa kawaida watu iliyowekwa kutumia sekunde 0 na 1s, lakini si tena, kumshukuru Mungu. Hatuna kukariri Mwandamano kwa sekunde 0 na 1s kwa ajili ya kitanzi au kwa kitanzi wakati na kadhalika. Hiyo ndiyo sababu tuna compiler. Nini compiler gani ni kimsingi hutafsiriwa code C, katika kesi yetu, kwa lugha ya kwamba kompyuta yako wataelewa, ambayo ni code kitu, na compiler kwamba sisi ni kutumia inaitwa Clang, hivyo hii ni kweli alama kwa Clang. Wakati una mpango wako, una kufanya mambo 2. Kwanza, una mpango wa kukusanya yako, na kisha utaenda kuendesha programu yako. Kukusanya mpango wako una mengi ya chaguzi za kufanya hivyo. moja ya kwanza ni kufanya Clang program.c katika mpango ambayo ni jina la mpango wako. Katika kesi hii unaweza kuona wao ni kusema tu "Hey, kukusanya mpango wangu." Wewe si kusema "Nataka hii jina kwa ajili ya mpango wangu" au kitu chochote. chaguo la pili ni kutoa jina kwa programu yako. Unaweza kusema Clang-o na kisha jina kwamba unataka faili executable kutajwa kama na kisha program.c. Na unaweza pia kufanya kufanya mpango, na kuona jinsi katika kwanza 2 kesi Mimi kuweka c., Na katika moja ya tatu tu mimi kuwa na programu? Yeah, wewe kweli haipaswi kuweka c. Wakati matumizi ya kufanya. Vinginevyo compiler ni kweli kwenda yell saa wewe. Na pia, mimi sijui kama wewe guys kumbuka, lakini mara nyingi sisi pia kutumika-lcs50 au-LM. Hiyo inaitwa kuunganisha. Ni tu anamwambia compiler kwamba utatumia maktaba wale haki pale, hivyo kama unataka kutumia cs50.h wewe kweli kuwa na aina Clang program.c-lcs50. Kama huna kufanya hivyo, compiler si kwenda kujua kwamba wewe ni kutumia kazi hizo katika cs50.h. Na wakati unataka kuendesha programu yako una chaguzi 2. Kama alivyofanya Clang program.c hukutoa jina kwa programu yako. Una kukimbia kutumia. / A.out. A.out ni jina kiwango kwamba Clang anatoa mpango wako kama huna kuwapa jina. Vinginevyo wewe kwenda kufanya. / Mpango kama wewe alitoa jina kwa mpango wako, na pia kama wewe alifanya kufanya mpango jina kwamba mpango ni kwenda kupata tayari kwenda kuwa programmed jina moja kama faili c. Kisha tuliongea kuhusu aina ya data na data. Kimsingi data aina ni kitu kimoja kama masanduku kidogo wao kutumia kuhifadhi maadili, hivyo data aina ni kweli tu kama Pokémons. Wao kuja katika ukubwa wote na aina. Mimi sijui kama mlinganisho kwamba hufanya akili. ukubwa data kweli inategemea usanifu mashine. Ukubwa wote data kwamba nitakacho kuonyesha hapa ni kweli kwa mashine 32-bit, ambayo ni kesi ya appliance yetu, lakini kama wewe ni kweli coding Mac yako au katika Windows pia pengine wewe utaenda kuwa na mashine ya 64-bit, hivyo kumbuka kwamba ukubwa data kwamba nitakacho kuonyesha hapa ni kwa ajili ya mashine 32-bit. moja ya kwanza kuwa tuliona alikuwa int, ambayo ni pretty moja kwa moja. Wewe kutumia int kuhifadhi integer. Tuliona pia tabia, char. Kama unataka kutumia barua au ishara kidogo pengine wewe kwenda kutumia Char. Char ana 1 Byte, ambayo ina maana bits 8, kama Lexi alisema. Kimsingi tuna Jedwali ASCII ambayo ina 256 iwezekanavyo michanganyiko ya sekunde 0 na 1s, na kisha pale unapoandika Char itakavyo kutafsiri tabia ya kuwa wewe pembejeo idadi kuwa katika meza ASCII, kama Lexi alisema. Sisi pia kuwa kuelea, ambayo sisi kutumia na kuhifadhi idadi decimal. Kama unataka kuchagua 3.14, kwa mfano, wewe utaenda kuutumia kuelea au mara mbili ambayo ina zaidi na usahihi. kuelea ana ka 4. mara mbili ana ka 8, hivyo tofauti tu ni usahihi. Sisi pia kuwa kwa muda mrefu kwamba ni kutumika kwa integers, na unaweza kuona kwa mashine 32-bit int na muda mrefu na ukubwa huo, hivyo ni kweli haina mantiki ya kutumia muda katika mashine ya 32-bit. Lakini kama wewe ni kutumia mashine Mac na 64-bit, kwa kweli kwa muda mrefu ina ukubwa 8, hivyo ni kweli inategemea usanifu. Kwa ajili ya mashine 32-bit haina mantiki ya kutumia muda mrefu kweli. Na kisha muda mrefu, kwa upande mwingine, ina ka 8, hivyo ni vizuri sana kama unataka kuwa integer tena. Na hatimaye, tuna kamba, ambayo ni kweli * Char, ambayo ni pointer Char. Ni rahisi sana kufikiri kwamba ukubwa wa string ni kwenda kuwa kama idadi ya herufi kwamba una pale, lakini kwa kweli * Char yenyewe ina ukubwa wa pointer Char, ambayo ni 4 ka. ukubwa wa * Char ni 4 ka. Haijalishi kama una neno dogo au barua au kitu chochote. Ni kwenda kuwa 4 ka. Tulijifunza pia kidogo kuhusu akitoa, hivyo kama unaweza kuona, kama una, kwa mfano, mpango kwamba anasema int x = 3 na kisha printf ("% d", x / 2) kufanya wewe guys kujua nini kinaendelea na magazeti juu ya screen? Mtu >> [Wanafunzi]? 2. 1. >> 1, yeah. Wakati wa kufanya 3/2 ni kwenda kupata 1.5, lakini tangu sisi ni kutumia integer itakavyo kupuuza sehemu decimal, na mtaenda kuwa 1. Kama hutaki kuwa kutokea nini unaweza kufanya, kwa mfano, ni kutangaza kuelea y = x. Kisha x kwamba kutumika kuwa 3 sasa ni kwenda kuwa 3.000 katika y. Na kisha unaweza magazeti y / 2. Kweli, mimi wanapaswa kuwa na 2. zaidi ya hapo. Ni kwenda kufanya 3.00/2.00, na wewe ni kwenda kupata 1.5. Na tuna hii f 0.2 tu ya kuuliza kwa ajili ya vitengo 2 decimal katika sehemu decimal. Kama una f 0.3 itakavyo kuwa kweli 1.500. Kama ni 2 itakavyo kuwa 1.50. Sisi pia kuwa kesi hii hapa. Kama wewe kufanya kuelea x = 3.14 na basi printf x wewe ni kwenda kupata 3.14. Na kama wewe kufanya x = int ya x, ambayo ina maana ya kutibu x kama int na wewe magazeti x sasa wewe utaenda kuwa na 3.00. Je, hiyo mantiki? Kwa sababu wewe ni wa kwanza kutibu x kama integer, hivyo wewe ni kupuuza sehemu decimal, na kisha wewe ni uchapishaji x. Na hatimaye, unaweza pia kufanya hivyo, int x = 65, na kisha kutangaza Char c = x, na kisha kama magazeti c wewe ni kweli kwenda kupata , Hivyo kimsingi kile unachokifanya hapa na kutafsiri integer katika tabia, tu kama Jedwali ASCII gani. Sisi pia alizungumzia waendeshaji math. Wengi wao ni pretty moja kwa moja, hivyo +, -, *, /, na pia kuongelea Mod, ambayo ni salio ya mgawanyiko wa idadi 2. Kama una 10% 3, kwa mfano, maana kugawanya 10 na 3, na nini ni salio? Ni kwenda kuwa 1, hivyo ni muhimu sana kwa kweli mengi ya mipango. Kwa Vigenère na Kaisari nina uhakika pretty kuwa wote nyie kutumika Mod. Kuhusu waendeshaji math, kuwa makini sana wakati kuchanganya * na /. Kwa mfano, kama wewe kufanya (3/2) * 2 nini wewe ni kwenda kupata? [Wanafunzi] 2. Yeah, 2, kwa sababu 3/2 ni kwenda kuwa 1.5, lakini tangu unafanya shughuli kati ya integers 2 wewe ni kweli kwenda tu kufikiria 1, na kisha 1 * 2 ni kwenda kuwa 2, hivyo kuwa mwangalifu sana wakati wa kufanya hesabu kwa sababu integers unaweza kupata kwamba 2 = 3, katika kesi hiyo. Na pia kuwa makini sana juu ya kuendelezwa. Unapaswa kawaida kutumia mabano kuwa na uhakika kwamba unajua nini unachokifanya. Baadhi ya njia za mkato muhimu, bila shaka, moja ni i + + + au i = 1 au kutumia + =. Hiyo ni kitu kimoja kama kufanya i = i + 1. Unaweza pia kufanya i - au i - = 1, ambayo ni kitu sawa kama i = i -1, kitu wewe guys matumizi mengi katika kwa tanzi, angalau. Pia, kwa ajili ya *, kama matumizi * = na kama wewe, kwa mfano, i * = 2 ni kitu sawa na kusema i = i * 2, na kitu kimoja kwa ajili ya mgawanyo. Kama wewe kufanya i / = 2 ni kitu sawa kama i = i / 2. Sasa kuhusu utendaji. You guys kujifunza kwamba kazi ni mkakati mzuri sana kuokoa code wakati wewe programu, hivyo kama unataka kufanya kazi sawa katika code tena na tena, pengine unataka kutumia kazi hivyo tu huna na nakala na kuweka code juu na juu tena. Kweli, kuu ni kazi, na wakati mimi kuonyesha muundo wa kazi wewe utaenda kuona kwamba ni pretty wazi. Sisi pia kutumia kazi kutoka maktaba baadhi, kwa mfano, printf, GetIn, ambayo ni kutoka maktaba CS50, na kazi nyingine kama toupper. Wote wa kazi hizo ni kweli kutekelezwa katika maktaba nyingine, na wakati kuweka files wale tether katika mwanzo wa mpango wako wewe ni kusema unaweza tafadhali nipe code kwa kazi hizo hivyo sina kuitekeleza kwa mwenyewe? Na unaweza pia kuandika yako kazi wenyewe, hivyo wakati wa kuanza programu wewe kutambua kwamba maktaba hawana kazi zote kwamba unahitaji. Kwa pset mwisho, kwa mfano, sisi aliandika kuteka, kinyang'anyiro, na Luke, na ni sana, ni muhimu sana kuwa na uwezo wa kuandika kazi kwa sababu wao ni muhimu, na sisi kutumia muda wao wote katika programu, na anaokoa mengi ya code. muundo wa kazi ni hii moja. Tuna kurudi aina katika mwanzo. Je, ni aina ya kurudi? Ni tu wakati kazi yako ni kwenda na kurudi. Kama una kazi, kwa mfano, factorial, kwamba ni kwenda kwa mahesabu ya factorial integer, pengine ni kwenda na kurudi integer pia. Basi aina ya kurudi ni kwenda kuwa int. Printf kweli ina aina kurudi tupu kwa sababu wewe si kurudi chochote. Wewe tu uchapishaji mambo screen na kuacha kazi baadaye. Kisha una jina la kazi ambayo unaweza kuchagua. Unapaswa kuwa kidogo nafuu, kama huna kuchagua jina kama XYZ au kama x2f. Jaribu kufanya juu ya jina kwamba hufanya akili. Kwa mfano, kama ni factorial, kusema factorial. Kama ni kazi ambayo ni kwenda kuteka kitu, jina hilo kuteka. Na kisha tuna vigezo, ambayo pia inaitwa hoja, ambayo ni kama rasilimali kwamba kazi yako inahitaji kutoka code yako kufanya kazi yake. Kama unataka kufanya mahesabu factorial ya idadi pengine unahitaji kuwa na idadi ya hesabu factorial. Moja ya hoja kwamba utaenda kuwa ni namba yenyewe. Na basi ni kwenda kufanya kitu na kurudi thamani mwishoni isipokuwa ni kazi tupu. Hebu angalia mfano. Kama nataka kuandika kazi kwamba sums namba zote katika safu ya integers, Awali ya yote, aina ya kurudi ni kwenda kuwa int kwa sababu mimi na safu ya integers. Na kisha mimi naenda kuwa jina kazi kama sumArray, na kisha kwenda kuchukua safu yenyewe, kwa nums int, na kisha urefu wa safu hivyo najua jinsi wengi idadi nina jumla. Basi nina initialize variable kuitwa jumla, kwa mfano, 0, na kila wakati mimi kuona kipengele katika safu mimi autoe kwa jumla, hivyo sikuwa kwa kitanzi. Tu kama Lexi alisema, unaweza kufanya int i = 0, i 0 basi ni chanya. Kama ni = 0 kwa basi ni 0, na kama ni <0 basi ni hasi. Na mtu mwingine ni kufanya kama, mwingine kama, mwingine. tofauti kati ya mbili ni kwamba moja hii ni kweli kwenda kuangalia kama> 0, <0 au = 0 mara tatu, hivyo kama una idadi 2, kwa mfano, ni kwenda kuja hapa na kusema kama (x> 0), na ni kwenda kusema ndiyo, hivyo mimi magazeti chanya. Lakini hata ingawa najua kwamba ni> 0 na si kwenda kuwa 0 au <0 Mimi bado kwenda kufanya ni 0, ni <0, hivyo mimi nina kweli kwenda ndani ya ikiwa kwamba sikuwa na kwa kwa sababu tayari najua kwamba si kwenda kukidhi yoyote ya masharti hayo. Naweza kutumia kama, mwingine kama, mwingine taarifa. Ni kimsingi anasema kama x = 0 mimi magazeti chanya. Kama siyo, mimi naenda pia mtihani huu. Kama ni 2 si mimi naenda kufanya hili. Kimsingi kama alikuwa x = 2 ungependa kusema kama (x> 0), ndiyo, hivyo magazeti hii. Sasa kwa kuwa najua kwamba ni> 0 na kwamba ameridhika kwanza ikiwa Mimi si hata kwenda kukimbia hii code. code anaendesha kwa kasi, kwa kweli, mara 3 kwa kasi kama wewe kutumia hii. Sisi pia kujifunza kuhusu na na au. Sitakuja kupitia hii kwa sababu Lexi tayari kuongelea kuhusu wao. Ni tu && na | | operator. Kitu tu nitasema ni kuwa makini wakati una hali ya 3. Matumizi mabano kwa sababu ni utata sana wakati una hali na mwingine mmoja au mwingine. Matumizi ya mabano tu kuwa na uhakika kwamba hali yako ya kufanya maana kwa sababu katika kesi hiyo, kwa mfano, unaweza kufikiria kwamba inaweza kuwa ni hali ya kwanza na moja au nyingine au hali ya 2 pamoja na katika au moja ya tatu, hivyo tu kuwa makini. Na hatimaye, kuongelea swichi. kubadili ni muhimu sana wakati una kutofautiana. Hebu kusema kwamba una variable kama n ambayo inaweza kuwa 0, 1, au 2, na kwa kila kesi hizo utaenda kufanya kazi. Unaweza kusema kubadili variable, na inaonyesha kuwa thamani basi ni kama value1 mimi naenda kufanya hii, na kisha mimi kuvunja, ambayo ina maana mimi si kwenda kuangalia yoyote ya kesi nyingine kwa sababu sisi tayari kuridhika kwamba kesi na kisha value2 na kadhalika, na mimi pia unaweza kuwa na kubadili default. Hiyo ina maana kama hana kukidhi yoyote ya kesi kuwa nilikuwa kwamba mimi naenda kufanya kitu kingine, lakini hiyo ni hiari. Hayo ni yote kwa ajili yangu. Sasa hebu kuwa Tommy. Haki zote, hii ni kwenda kuwa Wiki ya 3-ish. Hizi ni baadhi ya mada tutaweza kuwa kifuniko, crypto, upeo arrays,, nakadhalika. Tu neno ya haraka juu ya crypto. Sisi siyo kwenda nyundo hii nyumbani. Sisi alifanya hivyo katika pset 2, lakini kwa jaribio kuhakikisha kujua tofauti kati ya cipher Kaisari na cipher Vigenère, jinsi ya wale wote kazi ciphers na kile ni kama encrypt na decrypt maandishi kwa kutumia ciphers wale 2. Kumbuka, cipher Kaisari tu rotates kila tabia kwa kiasi sawa, kuhakikisha Mod kwa idadi ya herufi katika alfabeti. Na cipher Vigenère, kwa upande mwingine, rotates kila tabia kwa kiasi tofauti, hivyo badala ya kusema kuzungushwa tabia kila na Vigenère 3 utazunguka kila tabia kwa kiasi tofauti kutegemea Keyword baadhi ambapo kila barua katika Keyword inawakilisha baadhi kiasi tofauti kwa mzunguko Nakala wazi kwa. Hebu kwanza majadiliano kuhusu wigo kutofautiana. Kuna 2 aina tofauti ya vigezo. Tuna vigezo mitaa, na haya ni kwenda kuelezwa nje ya kuu au nje ya kazi yoyote au kuzuia, na haya yatakuwa kupatikana popote katika programu yako. Kama una kazi na katika kazi kwamba ni kitanzi wakati kubwa variable kimataifa ni kupatikana kila mahali. variable mitaa, kwa upande mwingine, ni scoped mahali ambapo ni defined. Kama una kazi hapa, kwa mfano, tuna hii g kazi, na ndani ya g kuna kutofautiana hapa aitwaye y, na hiyo ina maana kwamba hii ni variable mitaa. Hata ingawa variable hii inaitwa y na kutofautiana hii inaitwa y kazi hizi 2 hawana wazo nini kila mmoja vigezo mitaa ni. Kwa upande mwingine, hapa tunasema int x = 5, na hii ni nje ya upeo wa kazi yoyote. Ni nje ya upeo wa kuu, hivyo hii ni variable kimataifa. Hiyo ina maana kwamba ndani ya kazi hizi 2 wakati mimi kusema x - au x + + Mimi nina kupata x huo ambapo hii y na hii ni tofauti y vigezo. Hiyo ni tofauti kati ya variable kimataifa na variable mitaa. Mbali kama design ni wasiwasi, wakati mwingine ni pengine wazo bora kuweka vigezo mitaa wakati wowote wewe waweza tangu akiwa rundo la vigezo kimataifa inaweza kupata kweli utata. Kama wewe kuwa na rundo la utendaji wote kubadilisha kitu kimoja unaweza kusahau nini kama kazi hii ajali hugeuza hii ya kimataifa, na hii kazi nyingine hajui kuhusu hilo, na haina kupata pretty utata kama wewe kupata zaidi code. Kuweka vigezo mitaa wakati wowote wewe waweza ni nzuri tu design. Arrays, kumbuka, ni tu orodha ya mambo ya aina moja. Ndani ya CI haiwezi kuwa na orodha kama 1, 2.0, hello. Sisi tu hawezi kufanya hivyo. Wakati sisi kutangaza safu katika C wote wa mambo kuwa ya aina moja. Hapa nina safu ya integers 3. Hapa nina urefu wa safu, lakini kama mimi tu kutangaza katika syntax hii ambapo mimi bayana nini wote wa mambo ni mimi si kitaalam haja hii 3. compiler ni smart kutosha kufikiri jinsi kubwa safu lazima. Sasa wakati nataka kupata au kuweka thamani ya safu hii ni syntax ya kufanya hivyo. Hii kwa kweli kurekebisha kipengele pili wa safu kwa sababu, kumbuka, hesabu kuanza saa 0, si katika 1. Kama mimi nataka kusoma kwamba thamani siwezi kusema kitu kama int x = array [1]. Au kama nataka kuweka kwamba thamani, kama mimi kufanya hapa, Naweza kusema safu [1] = 4. Kwamba wakati wa kupata vipengele na index yao au nafasi zao au ambapo wao ni katika safu, na tangazo ambalo kuanza saa 0. Tunaweza pia kuwa arrays ya arrays, na hii inaitwa safu multi-dimensional. Wakati tuna safu multi-dimensional hiyo ina maana tunaweza kuwa na kitu kama safu na nguzo, na hii ni moja ya njia ya visualizing hii au kufikiri juu yake. Wakati nina safu multi-dimensional kwamba maana Mimi naenda kuanza wanaohitaji zaidi ya 1 index kwa sababu kama mimi na gridi ya taifa kusema tu kile mstari uko hautupatii idadi. Hiyo ni kweli tu kwenda kutupa orodha ya namba. Hebu sema nina hii safu hapa. Nina safu kuitwa gridi ya taifa, na mimi kusema ni safu ya 2 na 3 nguzo, na hivyo hii ni njia mojawapo ya visualizing yake. Wakati mimi kusema nataka kupata kipengele katika [1] [2] hiyo ina maana kwamba kwa sababu hizi ni safu ya kwanza na kisha nguzo Mimi naenda kuruka kwa mstari 1 tangu mimi alisema 1. Kisha mimi naenda kuja hapa kwa safu 2, na mimi nina kwenda kupata thamani 6. Mantiki? Multi-dimensional arrays, kumbuka, ni utaalamu tu safu ya arrays. Tunaweza kuwa na arrays ya arrays ya arrays. Tunaweza kuendelea, lakini kwa kweli moja ya njia ya kufikiri juu ya jinsi hii ni kuwa aliweka nje na nini kinaendelea ni taswira yake katika gridi ya taifa kama hii. Wakati sisi kupita arrays kwa kazi, wao wanaenda kuishi kidogo tofauti kuliko wakati sisi kupita vigezo mara kwa mara kwa kazi kama kupita int au kuelea. Wakati sisi kupita katika aina int au Char au yoyote ya data hizi nyingine sisi tu alichukua kuangalia kama kazi hugeuza thamani ya variable kwamba kuwa mabadiliko si kwenda kueneza up kwa kazi wito. Na safu, kwa upande mwingine, kwamba kitatokea. Kama mimi kupita katika safu ya kazi baadhi na kazi kwamba mabadiliko ya baadhi ya vipengele, wakati mimi kurudi hadi kazi ambayo kuitwa ni safu yangu sasa ni kwenda kuwa tofauti, na msamiati kwa kuwa arrays ni ni kupita kwa kumbukumbu, kama tutaweza kuona baadaye. Hii ni kuhusiana na jinsi ya kuyatumia kazi, ambapo haya ya msingi data aina, kwa upande mwingine, ni kupita kwa thamani. Tunaweza kufikiria kwamba kama kufanya nakala ya variable baadhi na kisha kupita katika nakala. Haijalishi nini sisi kufanya na variable kwamba. kazi wito si kuwa na ufahamu kwamba ilikuwa iliyopita. Arrays ni kidogo tu tofauti katika suala hilo. Kwa mfano, kama sisi tu nikaona, kuu ni utendaji tu kwamba wanaweza kuchukua katika hoja 2. Hoja ya kwanza kwa kazi kubwa ni argc, au idadi ya hoja, na hoja ya pili inaitwa argv, na wale ni halisi maadili ya hoja hizo. Hebu sema nina mpango ujulikanao this.c, na mimi kusema kufanya hili, na mimi nina kwenda kukimbia hii ifikapo mstari amri. Sasa kupita katika hoja ya baadhi ya programu yangu iitwayo hii, Mimi naweza kusema kitu kama /. Hii ni cs 50. Hii ni nini sisi kufikiria Daudi kufanya kila siku katika terminal. Lakini sasa kuu kazi ndani ya mpango huo ina maadili haya, hivyo argc ni 4. Inaweza kuwa utata kidogo kwa sababu kwa kweli tuko tu kupita katika cs ni 50. Hiyo tu 3. Lakini kumbuka kwamba kipengele kwanza ya argv au hoja ya kwanza ni jina ya kazi yenyewe. Hivyo hiyo ina maana kwamba tuna mambo 4 hapa, na kipengele kwanza ni kwenda kuwa. / huu. Na hii itakuwa kuwakilishwa kama kamba. Kisha mambo iliyobaki ni nini sisi typed katika baada ya jina la mpango. Hivyo tu kama kando, kama sisi pengine aliona katika pset 2, kukumbuka kwamba string 50 ni ≠ 50 integer. Hivyo hatuwezi kusema kitu kama, 'int x = argv 3.' Hiyo tu si kwenda kufanya maana, kwa sababu hii ni kamba, na hii ni integer. Hivyo kama unataka kubadilisha kati ya 2, kumbuka, tunakwenda kuwa kazi hii uchawi kuitwa atoi. Hii inachukua kamba na anarudi integer kuwakilishwa ndani ya kamba hiyo. Basi hiyo ni kosa rahisi kufanya juu ya chemsha bongo, tu kufikiri kwamba hii itakuwa moja kwa moja kuwa na aina sahihi. Lakini tu kujua kwamba hawa daima kuwa masharti hata kama kamba tu ina integer au tabia au kuelea. Hivyo sasa hebu majadiliano kuhusu mbio wakati. Wakati tuna hizi algorithms wote kufanya mambo haya yote mambo, inakuwa muhimu kweli kweli kwa kuuliza swali, "Ni kwa muda gani wao kuchukua?" Sisi kuwakilisha kwamba pamoja na kitu kinachoitwa asymptotic nukuu. Hivyo hii ina maana kwamba - vizuri, hebu sema sisi kutoa algorithm wetu baadhi ya pembejeo kweli, kweli, kweli ni kubwa. Sisi nataka kuuliza swali, "Ni kwa muda gani ni kwenda kuchukua? Wangapi hatua itachukua algorithm yetu ya kuendesha kama kazi ya kawaida ya pembejeo? " Hivyo njia ya kwanza tunaweza kuelezea kukimbia wakati ni pamoja na kubwa O. Na hii ni yetu mbaya zaidi kesi mbio wakati. Hivyo kama tunataka kutatua safu, na sisi kutoa kompyuta yetu safu kwamba katika utaratibu wa kushuka wakati ni lazima kuwa ili wakipanda, ambayo inaenda kuwa kesi mbaya. Hii ni juu yetu amefungwa katika upeo wa urefu wa muda algorithm yetu itachukua. Kwa upande mwingine, hii Ω ni kwenda kuelezea bora kesi mbio wakati. Hivyo kama sisi kutoa safu tayari kwa sorted algorithm kuchagua, jinsi itachukua muda mrefu kwa aina yake? Na hili, basi, inaeleza chini amefungwa kwenye mbio wakati. Hivyo hapa ni baadhi tu ya maneno kwamba kueleza baadhi ya kawaida mara mbio. Hizi ni katika wakipanda ili. muda wa kasi mbio tuna inaitwa mara kwa mara. Hiyo ina maana bila kujali jinsi wengi vipengele sisi kutoa kompyuta yetu, hakuna jambo gani kubwa safu yetu ni, kuchagua ni au kufanya chochote tuko kufanya na safu daima kuchukua kiasi hicho hicho. Hivyo tunaweza kuwakilisha kwamba tu kwa 1, ambayo ni mara kwa mara. Sisi pia inaonekana katika wakati logarithmic kukimbia. Hivyo kitu kama tafuta binary ni logarithmic, ambapo sisi kukata tatizo katika kila nusu wakati na kisha mambo kupata tu juu kutoka huko. Na kama wewe ni milele kuandika O ya algorithm yoyote factorial, pengine haipaswi kufikiria hili kama siku kazi yako. Wakati sisi kulinganisha mara mbio ni muhimu kukumbuka mambo haya. Hivyo kama nina algorithm kwamba O (n), na mtu mwingine ina algorithm ya O (2n) haya ni kweli asymptotically sawa. Hivyo kama sisi kufikiria n kuwa idadi kubwa kama eleventy bilioni: hivyo wakati sisi ni kulinganisha eleventy bilioni kitu kama eleventy bilioni + 3, ghafla 3 kwamba kweli haina kufanya tofauti kubwa tena. Hiyo ni kwa nini sisi ni kwenda kuanza kuzingatia mambo haya kuwa sawa. Hivyo mambo kama constants haya hapa, kuna 2 x hii, au kuongeza 3, hizi ni baadhi tu ya constants, na haya ni kwenda kuacha up. Hivyo kwamba ni kwa nini wote 3 ya nyakati hizi kukimbia ni sawa na kusema wao uko O (n). Vile vile, kama tuna 2 mara kukimbia mwingine, hebu sema O (n + 2n ² ³), tunaweza kuongeza + N, + 7, na kisha tuna wakati mwingine kukimbia kwamba tu O (n ³). tena, hayo ni kitu kimoja kwa sababu hizi - haya si sawa. Haya ni mambo sawa, pole. Basi hizi ni sawa kwa sababu hii ³ n ni kwenda kutawala hii ² 2n. Je, ni si kitu kimoja ni kama sisi kukimbia mara kama O (n ³) na O (n ²) kwa sababu hii ³ n ni kubwa kuliko hii ² n. Hivyo kama tuna mashujaa, ghafla hii kuanza jambo, lakini wakati sisi ni tu kushughulika na mambo kama sisi ni hapa juu, basi si kwenda umuhimu kwa sababu wao ni kwenda tu kuacha shule. Hebu tuangalie baadhi ya algorithms tumeona hivyo mbali na majadiliano juu ya kukimbia muda wao. Njia ya kwanza ya kutafuta namba katika orodha, kuwa tuliona, alikuwa linear tafuta. Na utekelezaji wa tafuta linear ni super moja kwa moja. Sisi tu kuwa na orodha, na sisi ni kwenda kuangalia kila moja ya kipengele katika orodha mpaka sisi kupata idadi sisi ni kuangalia kwa. Hivyo hiyo ina maana kwamba katika kesi mbaya, hii O (n). Na hali mbaya hapa inaweza kuwa kama kipengele ni kipengele mwisho, basi kwa kutumia tafuta linear tuna kuangalia kipengele kila moja mpaka sisi kupata moja ya mwisho ili kujua kwamba ni kweli katika orodha. Hatuwezi kutoa tu juu halfway na kusema, "Ni pengine si huko." Pamoja na tafuta linear tuna kuangalia jambo zima. bora-kesi mbio wakati, kwa upande mwingine, ni mara kwa mara kwa sababu katika kesi bora kipengele sisi ni kuangalia kwa ni moja tu ya kwanza katika orodha. Hivyo ni kwenda kuchukua yetu hasa 1 hatua, bila kujali jinsi kubwa orodha ni kama sisi ni kuangalia kwa kipengele kwanza kila wakati. Hivyo wakati wewe kutafuta, kumbuka, hauhitaji kwamba orodha yetu sorted. Kwa sababu tuko tu kwenda kuangalia juu ya kipengele kila moja, na ni kweli haina jambo utaratibu gani wale vipengele ni in akili zaidi tafuta algorithm ni kitu kama tafuta binary. Kumbuka, utekelezaji wa tafuta binary ni wakati wewe kwenda kushika kuangalia katikati ya orodha. Na kwa sababu sisi ni kuangalia katikati, sisi zinahitaji kwamba orodha ni Iliyopangwa au mwingine hatujui ambapo katikati ni, na inabidi kuangalia juu ya orodha nzima kupata hiyo, na kisha katika hatua hiyo tuko tu kupoteza muda. Hivyo kama tuna orodha Iliyopangwa na sisi kupata katikati, tunakwenda kulinganisha katikati kwa kipengele sisi ni kuangalia kwa. Kama ni ya juu sana, basi tunaweza kusahau nusu haki kwa sababu tunajua kwamba kama kipengele yetu ni tayari kubwa mno na kila kitu na haki ya kipengele hiki ni hata ya juu, basi hatuna haja ya kuangalia humo tena. Ambapo kwa upande mwingine, ikiwa kipengele yetu ni ndogo mno, tunajua kila kitu kwa upande wa kushoto wa kipengele kwamba pia ni ndogo mno, hivyo ni kweli haina maana kufanya kuangalia huko, aidha. Kwa njia hii, kwa kila hatua na kila wakati sisi kuangalia midpoint ya orodha, tunakwenda kupunguza tatizo letu katika nusu kwa sababu tunajua ghafla rundo zima la idadi kwamba hawezi kuwa mmoja sisi ni kuangalia kwa. Katika pseudocode hii bila kuangalia kitu kama hii, na kwa sababu tuko kukata orodha katika wakati moja kila nusu, yetu mbaya zaidi kesi kukimbia wakati anaruka kutoka linear logarithmic. Hivyo ghafla tuna logi-katika hatua ili kupata kipengele katika orodha. bora-kesi mbio wakati, ingawa, bado ni ya mara kwa mara kwa sababu sasa, hebu tu kusema kwamba kipengele sisi ni kuangalia kwa ni daima katikati ya halisi ya orodha ya awali. Hivyo tunaweza kukua orodha yetu kubwa kama tunataka, lakini kama kipengele sisi ni kuangalia kwa ni katika katikati, basi ni kwenda tu kuchukua sisi 1 hatua. Hivyo ndiyo sababu tuko O (logi n) na Ω (1) au mara kwa mara. Hebu kweli kukimbia tafuta binary katika orodha hii. Basi hebu kusema kwamba sisi ni kuangalia kwa kipengele 164. Jambo la kwanza sisi ni kwenda kufanya ni kupata midpoint ya orodha hii. Ni hivyo tu hutokea kwamba midpoint anaenda kuanguka katika kati ya namba hizi 2, hivyo hebu tu kiholela kusema, kila wakati midpoint falls kati ya nambari 2, hebu tu pande zote juu. Sisi tu haja ya kuhakikisha sisi kufanya hili kila hatua ya njia. Hivyo sisi ni kwenda pande zote juu, na sisi ni kwenda kusema kwamba 161 ni katikati ya orodha yetu. Hivyo 161 <164, na kila kipengele ya kushoto ya 161 ni pia <164, hivyo tunajua kwamba si kwenda kutusaidia wakati wote kuanza kuangalia zaidi ya hapa kwa sababu ya kipengele sisi ni kuangalia kwa hawezi kuwa huko. Basi nini tunaweza kufanya ni tunaweza kusahau kuhusu nusu nzima ya kushoto ya orodha, na sasa tu kufikiria na haki ya kuendelea 161. Hivyo tena, hii ni midpoint; hebu tu pande zote juu. Sasa 175 ni kubwa mno. Hivyo tunajua si kwenda kutusaidia kuangalia hapa au hapa, hivyo tunaweza tu kutupa kwamba mbali, na hatimaye tutaweza hit 164. Maswali yoyote juu ya kutafuta binary? Hebu hoja juu ya kutafuta njia ya kutoka orodha tayari-sorted kwa kweli kuchukua orodha ya namba ili yeyote na kufanya kwamba orodha katika wakipanda ili. algorithm kwanza tuliyoyaangalia ilikuwa inaitwa Bubble aina. Na hii itakuwa rahisi ya algorithms tuliona. Bubble aina anasema kwamba wakati wowote ndani ya vipengele 2 orodha ni nje ya mahali, maana kuna idadi kubwa ya kushoto ya idadi ya chini, kisha tunakwenda byta yao, kwa sababu hiyo ina maana kwamba orodha itakuwa "Zaidi sorted" kuliko ilivyokuwa kabla. Na sisi ni kwenda tu kuendelea na mchakato huu tena na tena na tena mpaka hatimaye aina ya mambo ya Bubble mahali wao sahihi na tuna orodha Iliyopangwa. wakati kukimbia ya hii ni kwenda kuwa O (n ²). Kwa nini? Naam, kwa sababu katika hali mbaya, sisi ni kwenda kuchukua kila kipengele, na tunakwenda kuishia kulinganisha na kipengele kila nyingine katika orodha. Lakini katika kesi bora, tuna orodha tayari sorted, Bubble aina ya kwenda tu kupitia mara moja, kusema "Nope sikuweza kufanya swaps yoyote., hivyo mimi nina kufanyika." Hivyo tuna bora kesi mbio wakati wa Ω (n). Hebu kukimbia Bubble aina juu ya orodha. Au kwanza, hebu tu kuangalia pseudocode kweli baadhi ya haraka. Tunataka kusema tunataka kuweka wimbo wa, katika kila iteration ya kitanzi, kuweka wimbo wa kama au sisi iliyopita mambo yoyote. Hivyo sababu ya kuwa ni, sisi ni kwenda kuacha wakati sisi si swapped mambo yoyote. Hivyo wakati wa kuanza kwa kitanzi yetu sisi si swapped kitu chochote, hivyo tutaweza kusema kwamba uongo. Sasa, sisi ni kwenda kupitia orodha na kulinganisha kipengele i kwa kipengele i + 1 na kama ni suala kwamba kuna idadi kubwa ya kushoto ya idadi ndogo, basi sisi ni kwenda tu wabadilishane yao. Na kisha sisi ni kwenda kukumbuka kwamba sisi swapped kipengele. Hiyo ina maana kwamba tunahitaji kwenda kupitia orodha angalau 1 zaidi wakati kwa sababu hali ambayo sisi kusimamishwa ni wakati orodha nzima tayari Iliyopangwa, maana sisi si alifanya swaps yoyote. Hivyo ndiyo sababu hali yetu chini hapa ni 'wakati baadhi ya vipengele wamekuwa swapped.' Hivyo sasa hebu tu kuangalia hii mbio juu ya orodha. Nina orodha 5,0,1,6,4. Bubble aina ni kwenda kuanza njia yote katika kushoto, na ni kwenda kulinganisha vipengele i, hivyo 0 kwa i + 1, ambayo ni kipengele 1. Ni kwenda kusema, vizuri 5> 0, lakini hivi sasa ni 5 wa kushoto, hivyo nahitaji wabadilishane 5 na 0. Wakati mimi byta yao, ghafla mimi kupata hii orodha tofauti. Sasa 5> 1, hivyo tunakwenda byta yao. 5 si> 6, hivyo hatuna haja ya kufanya kitu chochote hapa. Lakini 6> 4, hivyo tunahitaji wabadilishane. Tena, sisi haja ya kuendesha kupitia orodha nzima ili hatimaye kugundua kwamba hizi ni nje ya utaratibu; sisi byta yao, na katika hatua hii tunahitaji kukimbia kupitia orodha 1 zaidi wakati kuhakikisha kwamba kila kitu katika utaratibu wake, na katika aina hii kumweka Bubble ina kumaliza. algorithm mbalimbali kwa ajili ya kuchukua baadhi ya vipengele na kuchagua yao ni uteuzi aina. Dhana ya aina uteuzi ni kwamba sisi ni kwenda kujenga sehemu ya orodha Iliyopangwa 1 kipengele kwa wakati. Na njia tunakwenda kufanya hivyo ni kwa kujenga sehemu ya kushoto ya orodha. Na kimsingi, kila - juu ya kila hatua, sisi ni kwenda kuchukua kipengele ndogo sisi wameondoka kwamba haijawahi sorted bado, na tunakwenda hoja hiyo ndani ya sehemu ya kwamba Iliyopangwa. Hiyo ina maana tunahitaji kuendelea kupata chini ya kipengele zisizochambuliwa na kisha kuchukua kipengele cha chini na wabadilishane kwa chochote kushoto-wengi kipengele kwamba si Iliyopangwa. wakati kukimbia ya hii ni kwenda kuwa O (n ²) kwa sababu katika hali mbaya tunahitaji kulinganisha kila kipengele moja kwa kila kipengele nyingine. Kwa sababu sisi ni kusema kwamba kama sisi kuanza saa nusu kushoto wa orodha, tunahitaji kupitia sehemu nzima haki ya kupata kipengele ndogo. Na kisha, tena, tunahitaji kwenda zaidi nzima haki ya sehemu na kuendelea juu ya kwamba zaidi na tena na tena. Hiyo itakuwa n ². Sisi ni kwenda haja kwa kitanzi ndani ya mwingine kwa kitanzi ambayo anapendekeza n ². Katika mawazo bora kesi, hebu sema sisi kuwapa orodha tayari sorted; sisi kweli si kufanya lolote bora kuliko ² n. Kwa sababu ya uteuzi aina hana njia ya kujua kwamba kipengele cha chini ni moja tu mimi kutokea kwa kuwa na kuangalia. Ni bado mahitaji ya kuhakikisha kwamba hii ni kweli kima cha chini. Na njia pekee ya kuhakikisha kuwa ni kima cha chini, kwa kutumia hii algorithm, ni kuangalia kipengele kila moja tena. Hivyo kweli, kama wewe kuwapa - kama wewe kutoa uteuzi aina orodha tayari Iliyopangwa, si kwenda kufanya lolote bora kuliko kuwapa orodha ambayo si sorted bado. Kwa njia, kama ni hutokea kwa kuwa kesi kwamba kitu fulani ni O (kitu) na omega ya kitu fulani, tunaweza kusema tu zaidi succinctly kwamba ni θ ya kitu fulani. Hivyo kama unaweza kuona kwamba kuja mahali popote, kwamba ni nini maana ya kwamba tu. Kama kitu ni theta ya n ², ni wote O kubwa (n ²) na Ω (n ²). Hivyo kesi bora na hali mbaya, haina kufanya tofauti, algorithm ni kwenda kufanya kitu kimoja kila wakati. Hivyo hii ni nini pseudocode kwa aina uteuzi inaweza kuangalia kama. Sisi ni kimsingi kwenda kusema kuwa nataka iterate juu ya orodha kutoka kushoto kwenda kulia, na katika kila iteration ya kitanzi, mimi naenda kwa hoja kipengele cha chini katika sehemu hii Iliyopangwa ya orodha. Na mara moja mimi hoja kitu pale, mimi kamwe haja ya kuangalia kipengele kwamba tena. Kwa sababu kwa haraka kama mimi wabadilishane kipengele katika sehemu ya kushoto ya orodha, ni vyema kwa sababu sisi ni kufanya kila kitu katika wakipanda ili kwa kutumia minimums. Hivyo tulisema, sawa, sisi ni katika nafasi ya i, na sisi haja ya kuangalia yote ya mambo ya na haki ya i ili kupata kiwango cha chini. Hivyo kwamba maana tunataka kuangalia kutoka i + 1 hadi mwisho wa orodha. Na sasa, kama kipengele kwamba sasa tuko kuangalia ni chini ya kiwango cha chini yetu hadi sasa, ambayo, kumbuka, sisi ni mapya mbali kiwango cha chini tu kuwa chochote kipengele tuko sasa ni saa; mimi itabidi kudhani kwamba kiwango cha chini. Kama mimi kupata kipengele kwamba ndogo kuliko kwamba, basi mimi nina kwenda kusema, sawa, vizuri, nimepata cha chini mpya. Mimi nina kwenda kukumbuka ambapo kima cha chini kwamba alikuwa. Hivyo sasa, mara moja mimi tumeenda kupitia sehemu kwamba haki zisizochambuliwa, Naweza kusema mimi nina kwenda wabadilishane kipengele cha chini na kipengele kwamba ni katika nafasi ya i. Hiyo inaenda kujenga orodha yangu, sehemu yangu sorted ya orodha kutoka kushoto kwenda kulia, na sisi si milele haja ya kuangalia kipengele tena mara moja ni katika sehemu hiyo. Mara tumekuwa swapped yake. Basi hebu kukimbia uteuzi aina katika orodha hii. kipengele bluu hapa ni kwenda kuwa i, na kipengele nyekundu ni kwenda kuwa kipengele cha chini. Hivyo i kuanza njia yote katika upande wa kushoto wa orodha, hivyo saa 5. Sasa tunahitaji kupata chini zisizochambuliwa kipengele. Hivyo tunasema 0 <5, hivyo ni kiwango cha chini 0 yangu mpya. Lakini siwezi kuacha hapo, kwa sababu hata kama tunaweza kutambua kwamba 0 ni ndogo, tunahitaji kukimbia kwa njia ya kipengele kila nyingine ya orodha ili kuhakikisha. Hivyo 1 ni kubwa, 6 ni kubwa, 4 ni kubwa. Hiyo ina maana kwamba baada ya kuangalia mambo haya yote ya, nimekuwa amedhamiria 0 ni ndogo. Hivyo nina kwenda wabadilishane 5 na 0. Mara baada ya mimi wabadilishane kwamba, mimi naenda kupata orodha mpya, na mimi kujua kwamba mimi kamwe haja ya kuangalia kwamba 0 tena sababu mara nimekuwa swapped ni, nimekuwa sorted yake na sisi ni kosa. Sasa tu hivyo hutokea kwamba kipengele bluu ni tena 5, na sisi haja ya kuangalia 1, 6 na 4 kuamua kwamba 1 ni ndogo kuliko kima cha chini ya kipengele, hivyo tutaweza wabadilishane 1 na 5. Tena, sisi haja ya kuangalia - kulinganisha 5-6 na 4, na sisi ni kwenda wabadilishane 4 na 5, na hatimaye, kulinganisha wale namba 2 na kubadilishana nao mpaka sisi kupata orodha yetu Iliyopangwa. Maswali yoyote juu ya aina uteuzi? Sawa. Hebu hoja na mada ya mwisho hapa, na kwamba ni recursion. Recursion, kumbuka, ni kweli hii meta kitu ambapo kazi kurudia wito yenyewe. Hivyo katika baadhi ya uhakika, wakati fuction yetu ni kurudia wito yenyewe, kuna haja ya kuwa baadhi uhakika ambayo sisi kuacha wito wenyewe. Kwa sababu kama hatuwezi kufanya hivyo, basi tuko tu kwenda kuendelea kufanya hivyo milele, na mpango wetu ni tu si kwenda kusitisha. Sisi kuita hali hii kesi ya msingi. Na kesi ya msingi anasema, badala ya kuita kazi tena, Mimi tu kwenda na kurudi baadhi ya thamani. Hivyo mara tumekuwa akarudi thamani, tumekuwa kusimamishwa wito wenyewe, na wengine wa wito tumekuwa alifanya hivyo mbali unaweza pia kurudi. kinyume ya kesi ya msingi ni kesi ya kujirudia. Na hii ni wakati tunataka kufanya mwingine wito kwa kazi ambayo sisi ni sasa in Na sisi pengine, ingawa si mara zote, wanataka kutumia hoja mbalimbali. Hivyo kama sisi kuwa na kazi kuitwa f, na f tu kuitwa kuchukua 1 hoja, na sisi tu kuweka wito f (1), f (1), f (1), na ni haki hivyo hutokea kwamba hoja 1 unaingia kesi ya kujirudia, bado tuko kamwe kwenda kuacha. Hata kama tuna kesi ya msingi, tunahitaji kuhakikisha kuwa hatimaye tunakwenda hit kwamba kesi ya msingi. Sisi si tu kuendelea kukaa katika kesi hii ya kujirudia. Kwa ujumla, wakati sisi wenyewe piga, sisi ni pengine anaenda kuwa na hoja tofauti kila wakati. Hapa ni kweli rahisi kazi ya kujirudia. Hivyo hii itakuwa compute factorial wa idadi. Hadi juu hapa tuna msingi wetu kesi. Katika kesi hiyo n ≤ 1, sisi siyo kwenda kuwaita factorial tena. Sisi ni kwenda kuacha; tuko tu kwenda na kurudi baadhi ya thamani. Kama hii si kweli, basi tunakwenda hit kesi yetu ya kujirudia. Ona hapa kwamba sisi siyo tu wito factorial (n), kwa sababu kwamba bila kuwa na manufaa sana. Sisi ni kwenda kuwaita factorial ya kitu kingine. Na hivyo unaweza kuona, hatimaye kama sisi kupita kitu factorial (5) au, sisi ni kwenda kuwaita factorial (4) na kadhalika, na hatimaye tunakwenda hit hii kesi ya msingi. Hivyo hii inaonekana nzuri. Hebu kuona nini kinatokea wakati sisi kwa kweli kukimbia hii. Hii ni stack, na hebu kusema kwamba kuu ni kwenda kuwaita kazi hii kwa hoja (4). Hivyo mara factorial anaona na = 4, factorial nitakuita yenyewe. Sasa, ghafla, tuna factorial (3). Hivyo kazi hizi ni kwenda kuendelea kukua mpaka hatimaye sisi hit msingi wetu kesi. Katika hatua hii, thamani ya kurudi kwa hii ni kurudi (NX thamani ya kurudi kwa hii), thamani ya kurudi kwa hii ni NX thamani ya kurudi kwa hii. Hatimaye tunahitaji hit baadhi idadi. Saa ya juu hapa, tunasema kurudi 1. Hiyo ina maana kwamba mara sisi kurudi kwamba idadi, tunaweza pop hii mbali stack. Hivyo hii factorial (1) ni kosa. Wakati 1 anarudi, hii factorial (1) anarudi, hii kurudi 1. thamani ya kurudi kwa hii, kumbuka, alikuwa NX thamani ya kurudi kwa hii. Hivyo ghafla, guy hii anajua kwamba mimi nataka kurudi 2. Hivyo kumbuka, kurudi thamani ya hii ni NX thamani kurudi hapa. Hivyo sasa tunaweza kusema 3 x 2, na hatimaye, hapa tunaweza kusema hii ni kwenda tu kuwa 4 x 3 x 2. Na mara moja anarudi hii, sisi kupata chini ya ndani ya moja ya integer kuu. Maswali yoyote juu ya recursion? Wote haki. Hivyo kuna muda zaidi kwa maswali mwishoni, lakini sasa Joseph itafikia mada iliyobaki. [Joseph Ong] wote wa kulia. Hivyo sasa kwamba tumekuwa aliyesema kuhusu recursions, hebu majadiliano kidogo kuhusu nini kuchanganya aina ni. Changanya aina kimsingi ni njia nyingine ya kuchagua orodha ya namba. Na jinsi kazi ni pamoja na aina kuunganisha una orodha, na nini cha kufanya ni sisi kusema, hebu kupasuliwa hii katika halves 2. Tutaweza kwanza kukimbia kuchanganya aina tena juu ya nusu ya kushoto, kisha tutaweza kukimbia kuunganisha aina ya nusu haki, na kwamba inatupa sasa halves 2 kwamba wanatenganishwa, na sasa tunakwenda kuchanganya halves wale pamoja. Ni ngumu kidogo kuona bila mfano, hivyo tutaweza kwenda kupitia hisia na kuona nini kinatokea. Hivyo kuanza na orodha hii, sisi kupasuliwa ndani halves 2. Sisi kuendesha kuunganisha aina ya nusu ya kushoto ya kwanza. Basi hiyo ni nusu ya kushoto, na sasa sisi kukimbia nao kwa njia ya orodha hii tena ambayo anapata kupita katika aina kuunganisha, na kisha sisi kuangalia, tena, katika upande wa kushoto wa orodha hii na sisi kukimbia kuchanganya aina juu yake. Sasa, sisi kupata chini ya orodha ya namba 2, na sasa nusu kushoto ni 1 tu kipengele muda mrefu, na hatuwezi kupasuliwa orodha hiyo ni 1 tu ya kipengele ndani ya nusu, hivyo sisi tu kusema, mara tuna 50, ambayo ni 1 tu kipengele, ni tayari Iliyopangwa. Mara sisi ni kosa na kwamba, tunaweza kuona kwamba tunaweza kuhamia kwenye nusu wa kulia wa orodha hii, na 3 pia Iliyopangwa, na hivyo kwa sasa kwamba halves wote wa orodha hii ni sorted tunaweza kujiunga namba hizi nyuma pamoja. Hivyo sisi kuangalia 50 na 3, 3 ni ndogo kuliko 50, hivyo huenda katika kwanza na kisha huja in 50 Sasa, kwamba ni kosa; sisi kurudi nyuma hadi kuwa orodha na aina ni haki nusu. 42 ni ya mwenyewe idadi, hivyo ni tayari Iliyopangwa. Hivyo sasa sisi kulinganisha haya 2 na 3 ni ndogo kuliko 42, hivyo kwamba anapata kuweka kwanza, sasa 42 anapata kuweka katika, na 50 anapata kuweka in Sasa, kwamba ni vyema, sisi kwenda njia yote nyuma juu, 1337 na 15. Naam, sisi sasa kuangalia nusu ya kushoto ya orodha hii; 1337 ni kwa yenyewe hivyo ni sorted na sawa na 15. Hivyo sasa sisi kuchanganya namba hizi 2 kutatua kwamba orodha ya awali, 15 <1337, hivyo huenda katika kwanza, kisha huenda in 1337 Na sasa sisi sorted halves wote wa orodha ya awali ya juu juu. Na wote sisi kufanya ni kuchanganya haya. Sisi kuangalia idadi ya kwanza 2 ya orodha hii, 3 <15, hivyo huenda katika safu ya aina ya kwanza. 15 <42, hivyo huenda in Sasa, 42 <1337, kwamba huenda in 50 <1337, hivyo huenda in Na taarifa kwamba sisi tu alichukua namba 2 mbali ya orodha hii. Hivyo sisi siyo tu alternating kati ya orodha 2. Sisi ni kuangalia tu mwanzo, na sisi ni kuchukua kipengele hiyo ni ndogo na kisha kuweka katika safu yetu. Sasa tumekuwa ilijiunga halves wote na sisi ni kosa. Maswali yoyote kuhusu kuchanganya aina? Ndiyo? [Mwanafunzi] Kama ni kugawanyika katika makundi mbalimbali, kwa nini sio wao tu umegawanyika mara moja na una 3 na 2 katika kundi? [Mapumziko ya unintelligible swali] Sababu - hivyo swali ni, kwa nini hawawezi sisi tu kuunganisha yao katika hatua ya kwanza baada ya sisi kuwa nao? sababu tunaweza kufanya hivyo, kuanza saa vipengele kushoto-wengi wa pande zote mbili, na kisha kuchukua moja ndogo na kuiweka katika, ni kwamba sisi kujua kwamba hawa orodha ya mtu binafsi ni katika amri Iliyopangwa. Basi, ikiwa mimi nina kuangalia vipengele kushoto-wengi wa halves wote, Mimi najua kuwa wao ni kwenda kuwa mambo madogo ya orodha ya wagombea hao. Hivyo siwezi kuziweka katika maeneo madogo ya kipengele cha orodha hii kubwa. Kwa upande mwingine, kama mimi kuangalia orodha wale 2 katika ngazi ya pili zaidi ya hapo, 50, 3, 42 1337, na 15, wale si Iliyopangwa. Hivyo kama mimi kuangalia 50 na 1337, Mimi naenda kuweka 50 katika orodha yangu ya kwanza. Lakini hiyo si kweli mantiki, kwa sababu ni kipengele 3 ndogo nje ya wale wote. Hivyo sababu moja tu tunaweza kufanya hatua hii ni kwa sababu ya kuchanganya orodha yetu ni tayari Iliyopangwa. Ambayo ni kwa nini sisi kupata chini njia yote hadi chini kwa sababu wakati tuna tu namba moja, unajua kwamba namba moja katika yenyewe ni tayari orodha Iliyopangwa. Maswali yoyote? Hakuna? Ugumu? Naam, unaweza kuona kwamba katika kila hatua kuna mwisho idadi, na tunaweza kugawanya katika orodha nusu logi n nyakati, ambayo ni ambapo sisi kupata hii n x logi n utata. Na utaona kesi bora kwa ajili ya aina kuunganisha ni n logi n, na ni haki hivyo hutokea kwamba hali mbaya, au Ω zaidi ya hapo, ni pia n logi n. Kitu kukumbuka. Kusonga, hebu kwenda kwenye faili baadhi super msingi I / O. Kama inaonekana katika kinyang'anyiro, utasikia taarifa tulikuwa na aina fulani ya mfumo wa ambapo unaweza kuandika kwenye faili logi kama kusoma kwa njia ya kificho. Hebu angalia jinsi wewe anaweza kufanya hivyo. Naam, tuna fprintf, ambayo unaweza kufikiria kama tu printf, lakini tu uchapishaji na faili badala yake, na hivyo f mwanzoni. Hii aina ya code hapa juu, kile yake ni, kama unaweza kuwa na kuonekana katika kinyang'anyiro, unaendelea kwa njia ya uchapishaji yako 2-dimensional safu nje mstari na mstari ni namba ni. Katika kesi hiyo, printf Prints nje terminal yako au kile tunachoita pato kiwango ya sehemu. Na sasa, katika kesi hii, wote sisi kufanya ni kuchukua nafasi printf na fprintf, kuwaambia ni nini faili unataka magazeti kwa, na katika kesi hii ni tu Prints hivyo nje faili kwamba badala ya kuchapa hivyo nje terminal yako. Naam, basi, kwamba begs swali: wapi sisi kupata aina hii ya faili kutoka, sawa? Sisi kupita kuingia kwenye hii fuction fprintf lakini sisi hakuwa na wazo ilikotoka. Naam, mapema katika kanuni, kile tulikuwa ilikuwa hii chunk ya maadili ya zaidi ya hapa, ambayo kimsingi anasema kuwa wazi faili wito log.txt. Tunachofanya baada ya kuwa ni sisi kuwa na kuhakikisha kwamba faili ni kweli kufunguliwa kwa mafanikio. Hivyo wanaweza kushindwa kwa sababu mbalimbali; huna nafasi ya kutosha kwenye kompyuta yako, kwa mfano. Hivyo ni muhimu daima kabla ya kufanya shughuli yoyote na faili kwamba sisi kuangalia kama faili kwamba kikafunguliwa mafanikio. Hivyo kile kwamba, hiyo ni hoja fopen, vizuri, tunaweza kufungua faili kwa njia nyingi. Nini tunaweza kufanya ni, tunaweza kupita w, ambayo ina maana override faili kama exits tayari, Tunaweza kupita a, ambayo wao append hadi mwisho wa faili kuu badala ya hayo, au tunaweza kutaja r, ambayo ina maana, hebu kufungua faili kama kusoma tu. Hivyo kama mpango inajaribu kufanya mabadiliko yoyote ya faili, yell kwao na si lazima wao kufanya hivyo. Hatimaye, mara sisi ni kosa na faili, kufanyika kufanya shughuli juu yake, tunahitaji kuhakikisha sisi karibu faili. Na hivyo, mwisho wa programu yako, wewe ni kwenda kupita yao tena faili hili kwamba kufunguliwa, na tu kulifunga. Hivyo hii ni kitu muhimu kwamba una hakikisha kufanya. Hivyo kumbuka unaweza kufungua faili, basi unaweza kuandika kwenye faili, kufanya shughuli katika faili, lakini basi una kuifunga faili mwishoni. Maswali yoyote juu ya faili msingi I / O? Ndiyo? [Mwanafunzi swali, unintelligible] Haki hapa. Swali ni, ambapo haina faili hii log.txt itaonekana? Naam, kama wewe tu kuwapa log.txt, ni inajenga katika saraka ya sawa kama kutekelezwa. Hivyo kama you're - >> [Mwanafunzi swali, unintelligible] Ndiyo. Katika folder sawa, au katika saraka ya sawa, kama wewe simu yake. Sasa kumbukumbu, stack, na chungu. Hivyo jinsi ni kumbukumbu zilizowekwa katika kompyuta? Naam, unaweza kufikiria kama aina ya kumbukumbu hii block hapa. Na katika kumbukumbu tuna nini wito lundo kukwama juu huko, na stack kwamba chini huko. Na lundo hukua kushuka na stack kukua zaidi. Hivyo kama Tommy zilizotajwa - oh, vizuri, na tuna hizi nyingine segment 4 ambayo mimi itabidi kupata katika pili - Kama Tommy alisema mapema, unajua jinsi utendaji wake wanajiita na itana? Wao kujenga aina hii ya sura ya stack. Naam, kama kuu wito foo, foo anapata kuweka kwenye stack. Foo wito bar, bar kupata uliowekwa juu stack, na kwamba anapata kuweka kwenye stack baada. Na kama wao kurudi, kila mmoja kupata kuchukuliwa mbali stack. Nini kila moja ya maeneo haya na kumbukumbu kushikilia? Naam, juu, ambayo ni sehemu ya maandishi, ina programu yenyewe. Hivyo code mashine, kwamba ni huko, mara moja wewe kukusanya programu yako. Next, yoyote initialized vigezo kimataifa. Hivyo kuwa na vigezo kimataifa katika mpango wako, na wewe kusema kama, 5 =, kwamba anapata kuweka katika sehemu hiyo, na kulia chini ya kwamba, una uninitialized data kimataifa, ambayo ni haki int, lakini huna kusema ni sawa na kitu chochote. Kutambua haya ni ya kimataifa vigezo, hivyo ni nje ya kuu. Hivyo hii ina maana ya vigezo yoyote ya kimataifa ambayo ni alitangaza lakini si initialized. Basi nini katika chungu? Kumbukumbu zilizotengwa kwa kutumia malloc, ambayo tutaweza kupata katika kidogo. Na hatimaye, kwa stack una vigezo yoyote mitaa na yoyote kazi unaweza kuwaita yoyote ya vigezo yao. Jambo la mwisho, wewe si kweli kuwa kujua vigezo mazingira kufanya, lakini wakati wewe kuendesha programu, kuna kitu haihusiani, kama hii ni username ya mtu ambaye alikimbia mpango. Na kwamba ni kwenda kuwa aina ya chini. Katika suala la anwani kumbukumbu, ambayo ni hexadesimoli maadili, maadili katika kuanza juu saa 0, na wao kwenda njia yote chini kwa chini. Katika kesi hii, kama wewe ni juu ya mfumo wa 32-bit, anuani hapo chini ni kwenda kuwa 0x, ikifuatiwa na af, kwa sababu hiyo 32 bits, ambayo ni 8 ka, na katika kesi hii 8 ka sambamba na tarakimu hexadesimoli 8. Hivyo hapa chini wewe utaenda kuwa, kama, 0xffffff, na huko utaenda kuwa na 0. Hivyo kile ni kuyatumia? Baadhi ya unaweza kuwa kufunikwa hii katika kifungu kabla. lakini hatukuwa kwenda juu yake katika hotuba, hivyo pointer ni aina tu data ambayo maduka, badala ya aina fulani ya thamani kama 50, ni maduka ya anuani ya baadhi ya maeneo katika kumbukumbu. Kama kumbukumbu kwamba [unintelligible]. Hivyo katika kesi hii, kile sisi ni, tuna pointer integer au * int, na ina anwani hii hexadesimoli ya 0xDEADBEEF. Hivyo kile sisi ni, sasa, pointi pointer hii katika baadhi ya maeneo katika kumbukumbu, na kwamba tu, thamani 50 ni katika eneo hili kumbukumbu. Juu ya mifumo ya baadhi ya 32-bit, juu ya mifumo yote ya 32-bit, kuyatumia kuchukua bits 32 au ka 4. Lakini, kwa mfano, juu ya mfumo wa 64-bit, kuyatumia ni 64 bits. Basi hiyo ni kitu utasikia wanataka kukumbuka. Kadhalika mfumo mwisho-bit, pointer ni mwisho bits mrefu. Kuyatumia ni aina ya vigumu Digest bila mambo ya ziada, hivyo hebu kupitia mfano wa mgao wa nguvu kumbukumbu. Nini nguvu kumbukumbu mgao gani kwa ajili yenu, au kile tunachoita malloc, inakuwezesha kutenga baadhi ya aina ya data nje ya kuweka. Hivyo data hii ni aina ya kudumu zaidi kwa muda wa mpango. Kwa sababu kama wewe kujua, kama wewe kutangaza x ndani ya kazi, na anarudi kwamba kazi, hakuna tena wa upatikanaji wa takwimu kwamba alikuwa kuhifadhiwa katika x. Nini kuyatumia hebu kufanya ni wao hebu kuhifadhi kumbukumbu maadili au kuhifadhi katika sehemu mbalimbali za kumbukumbu, yaani lundo. Sasa mara sisi kurudi nje ya kazi, muda mrefu kama tuna pointer kwa kuwa mahali katika kumbukumbu, kisha nini tunaweza kufanya ni tunaweza tu kuangalia maadili huko. Hebu tuangalie mfano: Hii ni kumbukumbu zetu layout tena. Na tuna kazi hii, kuu. Kile yake ni - sawa, hivyo ni rahisi, haki -? Int x = 5, kwamba tu kutofautiana juu ya stack katika kuu. Kwa upande mwingine, sasa sisi kutangaza pointer ambayo inatoa wito giveMeThreeInts kazi. Na hivyo sasa sisi kwenda katika kazi hii na sisi kujenga mpya stack frame kwa ajili yake. Hata hivyo, katika sura hii stack, sisi kutangaza int * temp, ambayo katika mallocs 3 integers kwa ajili yetu. Hivyo ukubwa wa int atatupa ngapi ka int hii ni, na malloc inatupa kwamba wengi bytes ya nafasi katika lundo. Hivyo katika kesi hii, tuna umba nafasi ya kutosha kwa ajili ya integers 3, na lundo ni njia ya juu huko, ambayo ni kwa nini nimekuwa inayotolewa ni ya juu juu. Mara sisi ni kosa, sisi kurudi hapa juu, una haja tu 3 ints wakarudi, na kuirudisha anuani, katika kesi hii juu ambapo kumbukumbu kwamba ni. Na sisi kuweka pointer = kubadili, na hadi pale tuna mwingine tu pointer. Lakini nini kwamba anarudi kazi ni sifa hapa na kutoweka. Hivyo temp kutoweka, lakini sisi bado kudumisha anuani ya ambapo wale integers 3 ni ndani ya mains. Hivyo katika kuweka hii, kuyatumia ni scoped ndani ya nchi kwa sura sifa, lakini kumbukumbu ambayo wao ni katika rejea lundo. Je, hiyo mantiki? [Mwanafunzi] Unaweza kurudia kwamba? >> [Joseph] Ndiyo. Hivyo kama mimi kurejea tu kidogo, unaweza kuona kwamba temp zilizotengwa baadhi ya kumbukumbu juu ya kujikusanyia huko. Hivyo wakati kazi hii, giveMeThreeInts anarudi, hii stack hapa ni kwenda na kutoweka. Na kwa hayo yoyote ya vigezo, katika kesi hii, hii pointer zilizotengwa katika sura sifa. Hiyo ni kwenda kutoweka, lakini tangu tukirudi temp na sisi kuweka pointer = temp, pointer sasa ni yatakuelekeza kumbukumbu hiyo ya mahali kama temp ilikuwa. Hivyo sasa, hata kama sisi kupoteza temp, kwamba pointer mitaa, sisi bado kurejesha anuani ya kumbukumbu ya nini ilikuwa akizungumzia ndani ya pointer kwamba kutofautiana. Maswali? Hiyo inaweza kuwa aina ya mada utata kama wewe hawajaenda juu yake katika sehemu. Tunaweza, TF yako dhahiri kwenda juu yake na bila shaka tunaweza kujibu maswali mwishoni mwa kikao mapitio kwa hili. Lakini hii ni aina ya mada ngumu, na mimi kuwa na mifano zaidi kwamba ni kwenda show up kwamba itasaidia kufafanua kile kuyatumia kwa kweli ni. Katika kesi hiyo, kuyatumia ni sawa na arrays, hivyo naweza tu kutumia hii pointer kama kitu kimoja kama safu int. Hivyo nina Indexing katika 0, na kubadilisha integer kwanza kwa 1, kubadilisha integer pili 2, na 3 kwa 3 integer. Hivyo zaidi juu ya kuyatumia. Naam, wanakumbuka Binky. Katika kesi hii tumekuwa zilizotengwa pointer, au sisi alitangaza pointer, lakini awali, wakati mimi tu alitangaza pointer, siyo akizungumzia popote katika kumbukumbu. Ni tu takataka maadili ndani yake. Kwa hiyo mimi sina wazo ambapo pointer hii ni akizungumzia. Ina anuani ambayo ni haki ya kujazwa 0 na 1 ya awali ambapo ilikuwa alitangaza. Mimi siwezi kufanya kitu kwa hii mpaka mimi wito malloc juu yake na kisha mimi inanipa nafasi kidogo juu ya lundo ambapo naweza kuweka maadili ndani. Kisha tena, sijui nini ndani ya kumbukumbu hii. Hivyo kitu ya kwanza mimi kufanya ni kuangalia kama mfumo alikuwa kumbukumbu ya kutosha kunipa nyuma 1 integer katika nafasi ya kwanza, ambayo ni kwa nini mimi kufanya hili kuangalia. Kama pointer ni null, hiyo ina maana kwamba hakuwa na nafasi ya kutosha au baadhi makosa mengine yalitokea, hivyo mimi zinapaswa kuachana na nje ya mpango wangu.  Lakini kama ilivyokuwa kufanikiwa, sasa naweza kutumia kwamba pointer na yale ambayo * pointer gani ni kinachofuata ambapo anuani ni kwa thamani ambapo ni kwamba, na unaweka ni sawa na 1. Hivyo zaidi ya hapa, sisi ni kuangalia kama kumbukumbu kwamba kuwepo. Mara tu kujua ipo, unaweza kuweka ndani yake thamani gani unataka kuweka ndani yake; katika kesi hii 1. Mara sisi ni kosa na hilo, unahitaji huru kwamba pointer sababu tunahitaji kupata nyuma mfumo kwamba kumbukumbu kwamba wewe aliuliza kwa katika nafasi ya kwanza. Kwa sababu kompyuta hajui wakati sisi ni kosa kwa hayo. Katika kesi hii sisi ni wazi kuwaambia hayo, sawa, sisi ni kosa na kumbukumbu hiyo. Kama baadhi ya mchakato mahitaji mengine ni, baadhi ya programu nyingine mahitaji yake, kujisikia huru na kwenda mbele na kuchukua hiyo. Nini tunaweza pia kufanya ni tunaweza kupata tu anuani ya vigezo mitaa juu ya kuweka. Hivyo int x ni ndani ya sura bainifu wa kuu. Na wakati sisi kutumia hii ampersand, hii na operator, kile yake ni inachukua x, na x ni baadhi tu ya data katika kumbukumbu, lakini ina anuani. Ni ziko mahali fulani. Hivyo kwa wito & x, nini hii haina ni inatupa anuani ya x. Kwa kufanya hivyo, sisi ni kufanya pointer uhakika ambapo x ni katika kumbukumbu. Sasa sisi tu kufanya kitu kama * x, sisi ni kwenda kupata 5 nyuma. Nyota hiyo inaitwa dereferencing yake. Wewe kufuata anuani na kupata thamani yake kuhifadhiwa huko. Maswali yoyote? Ndiyo? [Mwanafunzi] Kama huwezi kufanya kitu 3-chongoka, gani bado kukusanya? Ndiyo. Kama huwezi kufanya kitu 3-pointer, ni bado kwenda kukusanya, lakini Mimi nitawaonyesheani nini kinatokea katika pili, na bila kufanya hivyo, kwamba ni nini sisi kuwaita leak kumbukumbu. Wewe si kutoa mfumo nyuma kumbukumbu yake, hivyo baada ya muda mpango ni kwenda kujilimbikiza kumbukumbu kwamba ni si kutumia, na kitu kingine unaweza kutumia. Kama ve milele kuonekana Firefox na kilobytes milioni 1.5 kwenye kompyuta yako, katika meneja kazi, kwamba ni nini kinaendelea. Una leak kumbukumbu katika mpango kwamba wao siyo kuchukua. Hivyo ni jinsi gani pointer arithmetic kazi? Naam, pointer arithmetic ni aina ya Indexing kama ndani ya safu. Katika kesi hiyo, nina pointer, na nini mimi ni mimi kufanya pointer uhakika kwa kipengele kwanza wa hii safu ya 3 integers kwamba nimepata zilizotengwa. Hivyo sasa ninafanya nini, nyota pointer tu mabadiliko ya kipengele kwanza katika orodha. Star pointer 1 pointi zaidi ya hapa. Hivyo pointer ni zaidi ya hapa, pointer 1 ni zaidi ya hapa, pointer 2 ni zaidi ya hapa. Hivyo kuongeza tu 1 ni kitu kimoja kama kusonga pamoja safu hii. Tunachofanya ni kwamba, wakati sisi kufanya pointer 1 kupata anuani zaidi ya hapa, na ili kupata thamani katika hapa, wewe kuweka nyota katika kutoka kujieleza nzima kwa dereference yake. Hivyo, katika kesi hii, mimi nina kuweka mahali kwanza katika safu hii kwa 1, pili mahali kwa 2, na mahali ya tatu kwa 3. Kisha nini mimi kufanya zaidi ya hapa ni mimi nina uchapishaji pointer yetu 1, ambayo tu anitiaye 2. Sasa mimi nina incrementing pointer, hivyo pointer sawa pointer 1, ambayo moves ni mbele. Na hivyo sasa kama mimi magazeti nje pointer 1, 1 pointer sasa ni 3, ambayo katika kesi hii Prints nje 3. Na ili kitu bure, pointer kwamba mimi kutoa lazima akizungumzia katika mwanzo wa safu ambayo mimi got nyuma kutoka malloc. Hivyo, katika kesi hii, kama ningekuwa kuwaita 3 haki hapa, hii bila kuwa na haki, kwa sababu ni katikati ya safu. Nina Ondoa kupata mahali awali awali kwanza kabla doa naweza huru yake. Kwa hiyo, hapa ni mfano kushiriki zaidi. Katika kesi hii, sisi ni kugawa wahusika 7 katika safu tabia. Na katika kesi hii ni nini sisi ni kufanya ni tuko looping juu ya 6 ya kwanza ya yao, na sisi ni kuweka yao kwa Z. Hivyo, kwa int i = 0, i> 6, i + +, Hivyo, pointer + i tu kutupa, katika kesi hii, pointer, pointer 1, 2 pointer, pointer 3, na kadhalika na kadhalika katika kitanzi. Nini ni kwenda kufanya ni anapata kwamba anuani, dereferences ni kupata thamani, na mabadiliko ambayo thamani kwa Z. Kisha mwishoni kumbuka hii ni kamba, sawa? Zote masharti kuwa na kumalizika na herufi null kuahirisha. Hivyo, nini mimi kufanya ni katika pointer 6 mimi kuweka null Terminator tabia in Na sasa nini mimi kimsingi kufanya zaidi ya hapa ni utekelezaji wa printf kwa kamba, sawa? Hivyo, wakati gani printf sasa wakati ni kufikiwa mwisho ya kamba? Wakati ni hits null kuahirisha tabia. Hivyo, katika kesi hii, pointer yangu ya awali pointi ya mwanzo wa safu hii. Mimi magazeti tabia ya kwanza nje. Mimi hoja yake juu ya moja. Mimi magazeti kwamba tabia nje. Mimi hoja hiyo juu. Na mimi kuendelea kufanya hili mpaka mimi kufikia mwisho. Na sasa * mwisho pointer mapenzi dereference hii na kupata null kuahirisha tabia ya nyuma. Na hivyo wakati wangu kitanzi anaendesha tu wakati thamani ambayo si null kuahirisha tabia. Hivyo, sasa mimi exit nje ya kitanzi hii. Na hivyo kama mimi Ondoa 6 kutoka pointer hii, Mimi kurejea njia yote ya mwanzo. Kumbuka, mimi nina kufanya hivi kwa sababu nina kwenda mwanzo ili kumwondolea yake. Hivyo, najua kwamba ilikuwa mengi. Je, kuna maswali? Tafadhali, ndiyo? [Mwanafunzi swali unintelligible] Je, unaweza kusema kwamba sauti? Sorry. [Mwanafunzi] On slide mwisho kulia kabla ya waliokimbia pointer, ambapo walikuwa wewe hasa kubadilisha thamani ya pointer? [Joseph] Hivyo, haki hapa. >> [Mwanafunzi] Oh, okay. [Joseph] Hivyo, nina pointer bala bala, haki, ambayo moves jambo moja nyuma, na kisha mimi ni huru, kwa sababu pointer hii ina kuelekezwa kwa mwanzo wa safu. [Mwanafunzi] Lakini kwamba isingekuwa zinazohitajika alikuwa kusimamishwa baada ya mstari huo. [Joseph] Hivyo, kama mimi alikuwa kusimamishwa baada ya hii, hii itakuwa kuchukuliwa leak kumbukumbu, kwa sababu mimi si kukimbia bure. [Mwanafunzi] Mimi [unintelligible] baada ya kwanza mistari mitatu ambapo alikuwa pointer 1 [unintelligible]. [Joseph] Uh-huh. Hivyo, nini ni swali huko? Sorry. Hapana, hakuna. Nenda, kwenda, tafadhali. [Mwanafunzi] Basi, wewe si kubadilisha thamani ya kuyatumia. Wewe wasingalikuwa kufanya pointer bala bala. [Joseph] Ndiyo, hasa. Hivyo, wakati mimi kufanya pointer 1 na 2 pointer, Mimi si kufanya pointer sawa pointer 1. Hivyo, pointer tu anakaa akizungumzia katika mwanzo wa safu. Ni wakati tu mimi kufanya plus plus kwamba unaweka thamani nyuma ndani pointer, kwamba ni kweli hatua hii pamoja. Wote haki. Zaidi maswali? Tena, kama hii ni aina ya balaa, hii itakuwa kufunikwa katika kikao. Uliza mafundisho wenzako kuhusu hilo, na tunaweza kujibu maswali mwishoni. Na kwa kawaida sisi si kama jambo hili bala. Hii ina kuhitaji me kuweka wimbo wa kiasi gani nimepata kukabiliana katika safu. Hivyo, kwa ujumla, hii ni kueleza jinsi matendo arithmetic pointer. Lakini nini sisi kwa kawaida kama kwa kufanya ni sisi kama kujenga nakala ya pointer, na kisha tutaweza kutumia nakala wakati sisi ni kuhamia karibu katika kamba. Hivyo, katika kesi hizi unaweza kutumia nakala ya magazeti ya string nzima, lakini hatuna la kufanya kama pointer minus 6 au kuweka wimbo wa kiasi gani sisi wakiongozwa katika hili, tu kwa sababu tunajua kwamba hatua yetu ya awali bado alisema kwa mwanzo wa orodha na wote kwamba sisi ilibadilika ilikuwa hii nakala. Hivyo, kwa ujumla, kubadilisha nakala za pointer yako ya awali. Je, si kujaribu kutatua ya kama - don't kubadilisha nakala ya awali. Kujaribu kubadilisha nakala tu ya awali yako. Hivyo, taarifa wakati sisi kupitisha kamba ndani ya printf huna kuweka nyota mbele yake kama tulivyofanya kwa dereferences mengine yote, sawa? Hivyo, kama wewe magazeti nje mzima string% s anatarajia ni anwani, na katika kesi hii pointer au katika kesi hii kama safu ya wahusika. Nyingine, char * s, na arrays ni kitu kimoja. Pointer ni kwa wahusika, na tabia arrays ni kitu kimoja. Na hivyo, wote sisi kufanya ni kupita katika pointer. Hatuna kupita katika kama * pointer au kitu kama hicho. Hivyo, arrays na kuyatumia ni kitu kimoja. Wakati wewe kufanya kitu kama x [y] zaidi ya hapa kwa safu, kile ni kufanya chini ya Hood ni ni kusema, sawa, ni safu ya tabia, hivyo ni pointer. Na hivyo x ni kitu kimoja, na hivyo kile yake ni inaongeza y x, ambayo ni kitu kimoja kama kusonga mbele katika kumbukumbu kwamba mengi. Na sasa x + y inatupa baadhi ya aina ya anwani, na sisi dereference anuani au kufuata mshale kwa kuwa mahali ambapo katika kumbukumbu ni sisi na kupata thamani nje ya kwamba mahali katika kumbukumbu. Hivyo, hivyo hizi mbili ni hasa kitu kimoja. Ni tu sukari kisintaksia. Wao kufanya kitu kimoja. Wao ni tu syntactics tofauti kwa kila mmoja. Hivyo, nini unaweza kwenda vibaya na kuyatumia? Kama, mengi. Sawa. Hivyo, mambo mabaya. Baadhi ya mambo mabaya unaweza kufanya ni kuangalia kama si malloc wako wa simu ya anarudi null, haki? Katika kesi hiyo, mimi nina kuuliza mfumo kunipa - kile ni kwamba idadi hiyo? Bilioni 2 kama mara 4, kwa sababu ya ukubwa wa integer ni 4 ka. Mimi nauliza hivyo kwa ajili kama ka bilioni 8. Bila shaka kompyuta yangu si kwenda kuwa na uwezo wa nipe kumbukumbu kubwa zaidi nyuma. Na sisi hawakuwa kuangalia kama hii ni null, hivyo wakati sisi kujaribu dereference ni zaidi ya hapo - kufuata mshale ambapo itakavyo - hatuna kwamba kumbukumbu. Hii ni nini tunaita dereferencing pointer null. Na hii kimsingi sababu wewe segfault. Hii ni moja ya njia unaweza segfault. Nyingine mbaya ya mambo unaweza kufanya - oh vizuri. Hiyo ilikuwa dereferencing pointer null. Sawa. Mambo mengine mabaya - vizuri, kurekebisha kwamba wewe tu kuweka hundi katika huko kwamba hundi kama pointer ni null na exit nje ya mpango kama ni hutokea malloc kwamba anarudi pointer null. Hiyo Comic XKCD. Watu kuelewa sasa. Aina ya. Hivyo, kumbukumbu. Nikatoka juu ya hili. Sisi ni wito malloc katika kitanzi, lakini kila wakati sisi kuwaita malloc sisi ni kupoteza track ya pointer ambapo hii ni akizungumzia, kwa sababu sisi ni clobbering yake. Hivyo, wito wa awali kwa malloc anitiaye kumbukumbu zaidi ya hapa. Pointer yangu kuyatumia na hii. Sasa, sijui huru, hivyo sasa mimi wito malloc tena. Sasa pointi zaidi ya hapa. Sasa kumbukumbu yangu ni kuonyesha zaidi ya hapa. Akizungumzia zaidi ya hapa. Akizungumzia zaidi ya hapa. Lakini nimekuwa waliopotea track ya anwani ya kumbukumbu ya juu hapa kwamba mimi zilizotengwa wote. Na hivyo sasa sina ushahidi wowote nao tena. Hivyo, naweza kuwa huru na wao nje ya kitanzi hii. Na hivyo ili kurekebisha kitu kama hii, kama wewe kusahau kumbukumbu bure na wewe kupata hii leak kumbukumbu, Una huru kumbukumbu ndani ya kitanzi hii mara moja wewe ni kosa kwa hayo. Naam, hii ni nini kinatokea. Najua kura ya chuki hii. Lakini sasa - Yay! Unaweza kupata kama kilobytes 44,000. Hivyo, wewe ni huru mwishoni mwa kitanzi, na kwamba itakuja tu huru kumbukumbu kila wakati. Kimsingi, programu yako haina leak kumbukumbu tena. Na sasa kitu kingine unaweza kufanya ni huru baadhi ya kumbukumbu kwamba ve aliuliza kwa mara mbili. Katika kesi hiyo, wewe malloc kitu, wewe kubadilisha thamani yake. Wewe ni huru mara moja kutokana na wewe alisema yalifanyika kwa hayo. Lakini basi sisi huru tena. Hii ni kitu ambacho ni pretty mbaya. Ni si kwenda awali segfault, lakini baada ya muda gani hii haina ni mara mbili ya kumkomboa hii huharibu lundo yako muundo, na wewe utakuwa kujifunza kidogo zaidi kuhusu hili kama wewe kuchagua kuchukua darasa kama CS61. Lakini kimsingi baada ya wakati kompyuta yako ni kwenda kupata kuchanganyikiwa kuhusu nini kumbukumbu maeneo ni wapi na ambapo ni kuhifadhiwa - ambapo data ni kuhifadhiwa katika kumbukumbu. Na hivyo kumkomboa pointer mara mbili ni jambo mbaya kwamba hutaki kufanya. Mambo mengine ambayo yanaweza kwenda vibaya si kutumia sizeof. Hivyo, katika kesi hii wewe malloc ka 8, na kwamba ni kitu kimoja kama integers mbili, sawa? Hivyo, hiyo ni kikamilifu salama, lakini ni nini? Naam, kama Lucas walizungumzia juu ya usanifu tofauti, integers ni ya urefu tofauti. Hivyo, juu ya appliance kwamba wewe ni kutumia, integers ni kuhusu 4 ka, lakini juu ya mfumo wa baadhi ya wengine wapate kuwa 8 ka au wanaweza kuwa 16 bytes. Hivyo, kama mimi tu kutumia namba hii zaidi ya hapa, mpango huu ili kazi juu ya appliance, lakini si kwenda kutenga kumbukumbu ya kutosha juu ya mfumo wa baadhi nyingine. Katika kesi hiyo, hii ni nini operator sizeof ni kutumika kwa. Wakati sisi kuwaita sizeof (int), nini hii haina ni  ni inatupa ukubwa wa integer juu ya mfumo wa kwamba mpango ni mbio. Hivyo, katika kesi hii, sizeof (int) atarudi 4 juu ya kitu kama appliance, na sasa hii mapenzi 4 * 2, ambayo ni 8, ambayo ni ya haki kiasi cha nafasi muhimu kwa integers mbili. Juu ya mfumo tofauti, ikiwa ni int kama ka 16 au ka 8, ni tu kwenda na kurudi ka kutosha kuhifadhi kwamba kiasi. Na hatimaye, structs. Hivyo, kama alitaka kuhifadhi bodi Sudoku katika kumbukumbu, jinsi tunavyoweza kufanya hili? Unaweza kufikiri ya kama variable kwa jambo la kwanza, kutofautiana kwa Jambo la pili, kutofautiana kwa jambo la tatu, kutofautiana kwa jambo la nne - mbaya, haki? Hivyo, moja uboreshaji unaweza kufanya juu ya hii ni kufanya 9 x 9 safu. Hiyo ni sawa, lakini kile kama alitaka kujiunga na mambo mengine na bodi Sudoku kama nini ugumu wa bodi ni, au, kwa mfano, kile alama yako ni, au jinsi gani wakati ni kuchukuliwa wewe kutatua hii bodi? Naam, nini unaweza kufanya ni unaweza kuunda struct. Nini mimi kimsingi akisema ni mimi nina kufafanua muundo huu zaidi ya hapa, na mimi nina kufafanua bodi Sudoku ambalo lina bodi kwamba ni 9 x 9. Na nini ina ina kuyatumia kwa jina la ngazi. Pia ina x na y, ambayo ni kuratibu ya ambapo mimi hivi sasa. Pia ina wakati alitumia [unintelligible], na ina jumla ya idadi ya hatua nimekuwa inputted hivyo mbali. Na hivyo katika kesi hii, naweza kikundi rundo zima la data katika muundo moja tu badala ya kuwa ni kama kuruka karibu katika kama vigezo mbalimbali kwamba siwezi kuweka wimbo wa. Na hii inatusaidia kuwa nzuri tu syntax kwa aina ya referencing mambo mbalimbali ndani ya struct hii. Naweza tu kufanya board.board, na mimi kupata bodi Sudoku nyuma. Board.level, mimi kupata jinsi ngumu ni. Board.x na board.y nipe viwianishi vya ambapo nipate kuwa katika bodi. Na hivyo mimi nina kupata kile tunachokiita mashamba katika struct. Hii amefafanua sudokuBoard, ambayo ni aina ya kwamba nina. Na sasa tuko hapa. Nina variable inayoitwa "bodi" ya sudokuBoard aina. Na hivyo mimi sasa wanaweza kupata mashamba yote ambayo yanafanya muundo huu zaidi ya hapa. Maswali yoyote kuhusu structs? Ndiyo? [Mwanafunzi] Kwa int x, y, wewe alitangaza wote kwenye mstari mmoja? >> [Joseph] Uh-huh. [Mwanafunzi] Hivyo, unaweza tu kufanya hivyo kwa wote? Kama ilivyo katika x, y comma mara kwamba jumla? [Joseph] Ndiyo, unaweza dhahiri kufanya hivyo, lakini sababu mimi kuweka x na y juu ya mstari huo - na swali ni kwa nini tunaweza tu kufanya hivyo kwenye mstari huo? Mbona sisi tu ya kuweka yote haya juu ya mstari huo ni x na y ni kuhusiana na kila mmoja, na hii ni stylistically sahihi zaidi, katika hisia, kwa sababu ni kuweka viumbe mbili juu ya mstari huo kwamba aina kama ya yanahusiana na kitu kimoja. Na mimi tu pasua hizi mbali. Ni tu kitu style. Ni functionally hufanya hakuna tofauti yo yote. Maswali yoyote juu ya nyingine structs? Unaweza kufafanua Pokédex na struct. Pokemon ina idadi na ina barua, mmiliki, aina. Na kisha kama una safu ya pokemon, unaweza kufanya juu Pokédex, haki? Okay, cool. Hivyo, maswali juu ya structs. Wale ni kuhusiana na structs. Hatimaye, GDB. Je GDB basi wewe kufanya? Ni inakuwezesha Debug programu yako. Na kama hujatumia GDB, napenda ilipendekeza kuangalia mfupi na kwenda tu juu ya kile GDB ni, jinsi kazi pamoja na hayo, jinsi unavyoweza kutumia hiyo, na mtihani juu ya mpango. Na hivyo kile GDB inakuwezesha kufanya ni inakuwezesha pause [unintelligible] juu ya mpango wako na mstari wa vitendo. Kwa mfano, nataka utekelezaji pause katika mstari kama 3 ya mpango wangu, na wakati mimi nina katika mstari wa 3 Naweza magazeti nje maadili yote yaliyoko. Na hivyo kile tunachokiita kama pausing katika mstari ni sisi wito kuweka breakpoint katika mstari kwamba na kisha tunaweza magazeti nje vigezo katika hali ya programu wakati huo. Tunaweza halafu kutoka hapo hatua kupitia mpango line-na-line. Na kisha tunaweza kuangalia hali ya stack kwa wakati. Na hivyo ili kutumia GDB, nini cha kufanya ni sisi wito Clang kwenye faili C, lakini tuna kupita ggdb-bendera. Na mara moja sisi ni kosa na kwamba sisi kukimbia tu gdb kwenye faili kusababisha pato. Na ili kupata baadhi ya molekuli kama ya maandishi kama hii, lakini kwa kweli yote wewe kufanya ni aina katika amri mwanzoni. Kuvunja kuu unaweka breakpoint katika kuu. Orodha ya 400 unaorodhesha mstari wa kanuni kuzunguka mstari 400. Na hivyo katika kesi hii unaweza kuangalia tu karibu na kusema, oh, Nataka kuweka breakpoint katika mstari wa 397, ambayo ni mstari huu, na kisha programu yako anaendesha katika hatua hiyo na ni kwenda kuvunja. Ni kwenda pause huko, na unaweza magazeti nje, kwa mfano, thamani ya chini au ya juu. Na hivyo kuna rundo la amri unahitaji kujua, na slideshow hii kwenda juu kwenye tovuti, hivyo kama unataka tu kwa rejea hizi au kama kuweka yao kwenye karatasi yako ya kudanganya, jisikie huru. Cool. Hiyo ilikuwa Quiz Review 0, na tutaweza fimbo karibu kama una maswali yoyote. Wote haki.  [Applause] [CS50.TV]