[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 <baadhi thamani ya kudumu kama kurudi 2 mara moja.
Je, si kujibu kwa jibu huo mviringo.
Utaratibu huu, cyclicity hii hatimaye mwisho.
Kama mimi kuuliza wewe "Panga elementi hizi n," na kusema, "Sawa, wachambue n / 2,"
kisha wewe sema, "Sawa, aina hizi n / 4, n / 8, n/16,"
hatimaye itabidi kugawanya na idadi kubwa ya kutosha
kwamba itabidi tu 1 kipengele kushoto, ambapo kiwango unaweza kusema,
"Hapa, hapa ni sorted moja ya kipengele."
Ndipo uzuri wa algorithm hii hapa ni kwa hupata kutokana na ukweli
kwamba mara una yote ya orodha hizi kibinafsi Iliyopangwa,
yote ambayo ni ya kawaida ya 1, ambayo inaonekana kuwa haina maana,
mara moja kuanza kuunganisha yao na kuunganisha yao
wewe kujenga hatimaye kama Rob alifanya katika video orodha hatimaye Iliyopangwa.
>> Lakini wazo hili hadi mbali mbali upangaji.
Kuna wazo hili iliyoingia katika mpango huu unaojulikana kama recursion,
wazo ambapo wewe ni mpango,
na kutatua baadhi ya matatizo hatajali
au kuweka katika muktadha wa lugha ya programu wewe ni kazi,
na ili kutatua tatizo, wewe kazi hatajali
tena na tena na tena, lakini ninyi kazi
hawawezi kuwaita mwenyewe mara nyingi kubwa.
Hatimaye una chini nje, ili kuzungumza,
na kuwa na baadhi ngumu-coded msingi hali ya kuwa anasema
katika hatua hii kuacha wito mwenyewe ili mchakato mzima
hatimaye haina ukweli katika kuacha.
Je, hii kweli maana, kwa recurse?
>> Hebu angalia, kama tunaweza kufanya rahisi, trivial mfano na, kusema,
3 watu na mimi hapa juu ya hatua, kama mtu ni starehe.
1, kuja juu juu, 2 na 3.
Kama 3 wanataka kuja hapa.
Kama unataka kusimama haki ya karibu na mimi hapa katika mstari, kudhani kwamba tatizo katika mkono
ni sana trivially kuhesabu idadi ya watu ambao ni hapa.
Lakini kusema ukweli, mimi nimechoka ya mifano yote kuhesabu kura.
Hii ni kwenda kuchukua muda, 1, 2, na dot, dot, dot.
Ni kwenda kuchukua milele.
Nisingependa tu punt tatizo hili kabisa na msaada wa-nini jina lako?
Sara. >> 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]