[Powered by Google Translate] [Wythnos 4] [David J. Malan] [Harvard University] [Mae hyn yn CS50.] [CS50.TV] Mae pob hawl, mae hyn yn CS50, ac mae hyn yn dechrau o wythnos 4, a dyma un o'r algorithmau didoli arafaf posibl. Pa un sydd yn wir ein bod dim ond gwylio yno? Dyna oedd fath swigod, er mawr O (n ^ 2) + swm, ac yn wir nid ni yw'r unig rai yn y byd hwn i bob golwg yn gwybod pa fath swigod yn neu ei amser yn rhedeg. Yn wir, roedd hyn yn cyfweliad gyda Eric Schmidt o Google a chyn Seneddwr Barack Obama dim ond ychydig flynyddoedd yn ôl. Yn awr, Seneddwr, rydych yma yn Google, ac rwy'n hoffi meddwl am y llywyddiaeth fel cyfweliad am swydd. Yn awr, mae'n anodd i gael swydd fel llywydd, a ydych yn mynd trwy'r llymder yn awr. Mae hefyd yn anodd i gael swydd yn Google. Mae gennym gwestiynau, ac rydym yn gofyn i'n cwestiynau i ymgeiswyr, ac mae hyn yn un yn dod o Larry Schwimmer. Rydych guys meddwl fy mod i'n kidding? Mae'n iawn yma. Beth yw'r ffordd fwyaf effeithlon i ddatrys miliwn o 32-bit gyfanrifau? [Chwerthin] Wel- Mae'n ddrwg gen i. >> Na, na, na, na. Dwi'n meddwl y byddai'r fath swigen yn y ffordd anghywir i fynd. Dewch ymlaen, a ddywedodd wrtho hyn? Yr wythnos diwethaf yn cofio rydym yn cymryd seibiant o god, o leiaf am y dydd, a dechrau canolbwyntio ar rai syniadau ar lefel uwch a datrys problemau yn fwy cyffredinol yng nghyd-destun chwilio a didoli, ac rydym yn cyflwyno rhywbeth nad ydym yn slap yr enw hwn yr wythnos diwethaf, ond nodiant asymptotic, O Fawr, mae Omega Fawr, ac weithiau y nodiant Theta Fawr, ac roedd y rhain yn syml ffyrdd o ddisgrifio amser yn rhedeg o algorithmau, faint o amser mae'n ei gymryd i algorithm i redeg. Ac efallai y byddwch yn cofio eich bod yn siarad am yr amser yn rhedeg o ran maint y cyfraniad, yr ydym yn gyffredinol yn galw n, beth bynnag y gall y broblem fod, lle mae n yw nifer y bobl yn yr ystafell, nifer y tudalennau mewn llyfr ffôn, ac rydym yn dechrau ysgrifennu pethau allan fel O (n ^ 2) neu O (n) neu O (n log n), a hyd yn oed pan nad yw'r math oedd yn eithaf gweithio allan mor berffaith ac roedd n ² - n / 2 neu rywbeth fel 'na fe fyddwn yn hytrach dim ond taflu rhai o'r termau a gorchymyn llai, ac mae'r chymhelliant, nid yw ein bod wir eisiau math o ffordd wrthrychol o werthuso perfformiad rhaglenni neu berfformiad o algorithmau ar ddiwedd y dydd wedi ddim i'w wneud, er enghraifft, gyda cyflymder eich cyfrifiadur heddiw. Er enghraifft, os ydych yn gweithredu fath swigod, neu os ydych yn gweithredu gyfuno fath neu ddewis didoli ar gyfrifiadur heddiw, cyfrifiadur GHz 2, a ydych yn rhedeg, ac mae'n cymryd rhywfaint o nifer o eiliadau, y flwyddyn nesaf, mae 'na GHz 3 neu efallai y cyfrifiadur GHz 4, ac yna yn honni bod "Wow, fy algorithm yn awr ddwywaith mor gyflym, "pan mewn gwirionedd nad amlwg yn yr achos. Dim ond y caledwedd wedi gotten yn gyflymach, ond mae eich cyfrifiadur nad yw wedi, ac felly rydym yn awyddus iawn i daflu i ffwrdd pethau fel lluosrifau o 2 neu luosrifau o 3 pan ddaw i ddisgrifio pa mor gyflym neu mor araf algorithm yw hi a dim ond yn canolbwyntio ar n neu ryw ffactor ohono, rhai grym hi fel yn achos y math o wythnos diwethaf. A dwyn i gof bod gyda chymorth uno fath oeddem yn gallu gwneud hynny yn llawer gwell na math swigod a didoli dewis a didoli gosod hyd yn oed. Rydym yn mynd i lawr i log n n, ac unwaith eto, dwyn i gof bod n log yn gyffredinol yn cyfeirio at rywbeth sy'n tyfu arafach, yna n, felly n log n hyd yn hyn yn dda oherwydd ei fod yn llai na n ². Ond er mwyn cyflawni n mewngofnodi n ag uno fath beth oedd y germ sylfaenol o syniad bod rhaid i ni trosoledd ein bod leveraged hefyd yn ôl yn yr wythnos 0? Sut wnaethom ni fynd i'r afael â'r broblem didoli gelfydd gyda uno fath? Beth oedd y mewnwelediad allweddol, efallai? Unrhyw un o gwbl. Iawn, gadewch i ni gymryd cam yn ôl. Disgrifiwch uno fath yn eich geiriau eich hun. Sut wnaeth hyn weithio? Iawn, byddwn yn rwyfo yn ôl i 0 wythnos. Iawn, yeah. [Anghlywadwy-myfyrwyr] Iawn, da, felly rydym yn rhannu yr amrywiaeth o rifau i mewn i 2 ddarn. Rydym yn datrys pob un o'r darnau, ac yna rydym yn uno nhw, ac rydym wedi gweld y syniad hwn o'r blaen o gymryd problem sy'n ydyn nhw fawr ac yn torri i fyny i mewn i broblem sy'n ydyn mawr neu fawr hon. Dwyn i gof y ffôn enghraifft llyfr. Dwyn i gof y algorithm hunan-gyfrif o wythnosau yn ôl, fath felly uno ei grynhoi gan y pseudocode yma. Pan fyddwch chi'n rhoi elfennau n, yn gyntaf roedd yn pwyll gwirio. Os n <2 peidiwch â'i wneud unrhyw beth o gwbl oherwydd os n <2 yna n yn amlwg yn 0 neu 1, ac felly os yw naill ai 0 neu 1 does dim byd i ddatrys. Rydych yn ei wneud. Mae eich rhestr eisoes yn didoli trivially. Ond fel arall, os oes gennych 2 neu fwy o elfennau mynd yn ei flaen ac yn eu rhannu yn 2 hanner, chwith ac i'r dde. Trefnu pob un o'r hanner, ac yna cyfuno'r hanner didoli. Ond y broblem yma yw bod ar yr olwg gyntaf mae hyn yn teimlo fel ein bod yn punting. Mae hwn yn ddiffiniad cylchol yn, os wyf wedi gofyn i chi i roi trefn ar yr elfennau n ac rydych yn dweud wrthyf "Mae pob hawl, iawn, byddwn yn didoli elfennau hynny n / 2 a'r rhai n / 2," yna fy nghwestiwn nesaf yn mynd i fod yn "Iawn, sut ydych chi'n datrys y n / 2 elfen?" Ond oherwydd strwythur y rhaglen, oherwydd bod yr achos sylfaenol, fel petai, yr achos hwn arbennig sy'n dweud os yw > Sara, popeth yn iawn. Kelly. >> Kelly a? Willy. >> Willy, Sara, Kelly, a Willy. Ar hyn o bryd rwyf wedi bod yn gofyn y cwestiwn gan rywun faint o bobl sydd i fyny ar hyn o bryd, ac nid oes gennyf syniad. Mae hon yn rhestr hir iawn, ac felly yn lle rwyf i'n mynd i wneud y gamp. Rydw i'n mynd i ofyn i'r person nesaf i mi i wneud y rhan fwyaf o'r gwaith, ac unwaith mae hi'n ei wneud gwneud y rhan fwyaf o'r gwaith Rydw i'n mynd i wneud y maint lleiaf o waith posibl a dim ond ychwanegu 1 i beth bynnag ei ​​hateb yw, felly dyma ni. Rwyf wedi bod yn gofyn faint o bobl sydd ar y llwyfan. Faint o bobl sydd ar y llwyfan ar y chwith i chi? Rhaid i'r chwith i mi? >> Iawn, ond nid ydynt yn twyllo. Mae hynny'n dda, mae hynny'n gywir, ond os ydym am barhau â'r rhesymeg gadewch i ni dybio eich bod yn yr un modd am punt y broblem hon ar y chwith i chi, felly, yn hytrach nag ateb yn uniongyrchol mynd yn ei flaen a dim ond taflu'r baich. O, faint o bobl sydd ar y chwith i mi? Faint o bobl sydd ar y chwith? 1. [Chwerthin] Iawn, felly 0, felly beth nawr Willy wedi gwneud yn ydych wedi dychwelyd eich ateb i'r cyfeiriad hwn yn dweud 0. Nawr, beth ddylech chi ei wneud? >> 1. Iawn, felly rydych chi'n 1, er mwyn i chi ddweud, "Mae pob hawl, yr wyf i'n mynd i ychwanegu 1 i ba bynnag Willy yn cyfrif oedd, "felly 1 + 0. Rydych yn awr yn 1 fel eich ateb i'r dde yn awr- 1. Byddai >> Ac mi fod yn 2. Da, felly rydych yn cymryd yr ateb blaenorol o 1, ychwanegu cyn lleied o waith rydych am ei wneud, sef +1. Rydych yn awr wedi 2, ac yna yn llaw wrthyf pa werth? 3, yr wyf yn golygu, mae'n ddrwg gennyf, 2. Da. Wel, oedd gennym 0 i'r chwith. Yna cawsom 1, ac yna rydym yn ychwanegu 2, ac yn awr ydych chi'n trosglwyddo i mi y rhif 2, ac felly i ddim yn dweud, iawn, +1, 3. Mae 3 o bobl wir yn sefyll nesaf i mi ar hyn o bryd, felly gallem fod wedi gwneud yn amlwg mae hyn yn llinol, fawr iawn yn y ffasiwn amlwg, ond yr hyn wnaethon ni mewn gwirionedd yn ei wneud? Rydym yn cymryd problem o maint 3 i ddechrau. Yna byddwn yn torri i lawr i mewn i problem o faint 2, yna problem o ran maint 1, ac yna yn olaf yr achos sylfaenol oedd mewn gwirionedd, oh, does neb yno, lle dychwelodd bwynt Willy yn effeithiol ateb hard-coded cwpl o weithiau, ac mae'r ail un yn bubbled Yna, swigod i fyny, swigod i fyny, ac yna drwy ychwanegu hyn 1 un ychwanegol rydym wedi rhoi ar waith y syniad sylfaenol o dychweliad. Yn awr, yn yr achos hwn nad oedd yn datrys problem unrhyw yn fwy effeithiol, yna rydym wedi gweld hyd yn hyn. Ond meddyliwch am y algorithmau rydym wedi ei wneud ar y llwyfan hyd yn hyn. Cawsom 8 darn o bapur ar y bwrdd sialc, ar fideo pan Sean yn chwilio am y rhif 7, a beth oedd ei fod mewn gwirionedd yn ei wneud? Wel, nid oedd yn gwneud unrhyw fath o raniad a gorchfygu. Nid oedd yn gwneud unrhyw fath o dychweliad. Yn hytrach e jyst yn gwneud hyn algorithm llinol. Ond pan gyflwynwyd y syniad o rifau didoli ar y llwyfan yn byw yr wythnos diwethaf yna rydym yn cael y greddf o fynd i'r canol, a phryd hynny roedd gennym restr llai o faint 4 neu restr arall o faint 4, ac yna rydym yn cael yr un broblem yn union, felly rydym yn ailadrodd, dro ar ôl tro, dro ar ôl tro. Mewn geiriau eraill, rydym yn recursed. Diolch yn fawr iawn at ein 3 o wirfoddolwyr yma i ddangos dychweliad gyda ni. Gawn ni weld os na allwn wneud hyn yn awr concrid ychydig yn fwy, ddatrys problem hynny eto gallem ei wneud yn eithaf hawdd, ond byddwn yn ei ddefnyddio fel cam tuag at weithredu'r syniad sylfaenol. Os ydw i eisiau i gyfrifo y Crynodeb o'r criw o rifau, er enghraifft, os byddwch yn llwyddo yn y rhif 3, Rwyf am i roi'r gwerth sigma 3, felly mae'r swm o 3 + 2 + 1 + 0. Rwyf eisiau mynd yn ôl yr ateb 6, felly byddwn yn gweithredu'r swyddogaeth hon sigma, y ​​swyddogaeth hon symiant hynny, unwaith eto, yn cymryd yn fewnbwn, ac yna dychwelyd y Crynodeb o'r nifer yr holl ffordd i lawr i 0. Gallem wneud hyn yn eithaf syml, dde? Gallem wneud hyn gyda rhyw fath o strwythur dolennu, felly gadewch i mi fynd yn ei flaen a chael y cychwyn. Cynnwys stdio.h. Gadewch i mi gael fy hun i mewn i brif i weithio â hwy yma. Gadewch i ni arbed hyn fel sigma.c. Wedyn dw i'n mynd i fynd i mewn yma, a dw i'n mynd i ddatgan n int, ac yr wyf i'n mynd i wneud y canlynol er nad yw'r defnyddiwr yn cydweithredu. Er nad yw'r defnyddiwr wedi rhoi i mi rhif positif gadewch i mi fynd yn ei flaen a'u hannog i GetInt n =, a gadewch i mi rhoi rhai cyfarwyddiadau ynghylch beth i'w wneud, felly printf ("cyfanrif positif os gwelwch yn dda"). Dim ond rhywbeth cymharol syml fel hyn fel bod erbyn i ni gyrraedd llinell 14 mae gennym bellach gyfanrif positif yn ôl pob tebyg yn n. Nawr gadewch i ni wneud rhywbeth yn ei gylch. Gadewch i mi fynd yn ei flaen ac yn y Crynodeb gyfrifo, felly int swm = sigma (n). Sigma yn unig symiant, felly rwy'n dim ond ysgrifennu yn y modd ffansi. Byddwn yn ei alw'n ddim sigma yno. Dyna y swm, a nawr rwy'n mynd i argraffu'r canlyniad, printf ("Y swm yw% d, \ n", swm). Ac yna byddaf yn dychwelyd 0 ar gyfer mesur da. Rydym wedi gwneud popeth bod y rhaglen yn gofyn ac eithrio y rhan ddiddorol, sydd mewn gwirionedd yn gweithredu'r swyddogaeth sigma. Gadewch i mi fynd i lawr yma i'r gwaelod, a gadewch i mi ddatgan swyddogaeth sigma. Mae'n rhaid i gymryd newidyn sy'n sydd o cyfanrif fath, a pha fath o ddata ydw i am ddychwelyd yn ôl pob tebyg o sigma? Int, oherwydd yr wyf am i gyd-fynd fy nisgwyliadau ar-lein 15. Yn fan hyn gadewch i mi fynd yn ei flaen a'i rhoi ar waith mewn ffordd eithaf syml. Gadewch i ni fynd yn ei flaen ac yn dweud swm int = 0, ac yn awr yr wyf i'n mynd i fynd yn cael ychydig i ddolen yma mae hynny'n mynd i ddweud rhywbeth fel hyn, ar gyfer (i int = 0; I <= rhif; i + +) swm + = i. Ac yna dwi'n mynd i ddychwelyd swm. Gallwn fod wedi gweithredu hyn mewn unrhyw nifer o ffyrdd. Gallwn fod wedi defnyddio dolen gyfnod. Gallwn fod wedi hepgor defnyddio'r newidyn swm os Fi 'n sylweddol eisiau, ond yn fyr, rydym yn unig yn cael swyddogaeth, os nad oeddwn yn goof datgan swm yw 0. Yna mae'n ailadrodd o 0 i fyny drwy nifer, ac ar bob fersiwn yn ychwanegu, gwerth cyfredol i swm ac yna yn dychwelyd swm. Nawr, mae 'na optimization bach yma. Mae hwn yn debyg yn gam wastraffu, ond dyna ni. Mae hynny'n iawn ar hyn o bryd. Rydym yn o leiaf eu bod yn drylwyr ac yn mynd 0 yr holl ffordd ar i fyny. Ddim yn galed iawn a 'n bert syml, ond mae'n troi allan fod y swyddogaeth sigma mae gennym yr un cyfle fel y gwnaethom yma ar y llwyfan. Ar y llwyfan rydym yn unig cyfrif faint o bobl oedd yn nesaf i mi, ond yn hytrach, os oeddem am i gyfrif y rhif 3 + 2 + 1 ar i lawr i 0 gallem yn yr un modd punt i swyddogaeth y byddaf yn hytrach na disgrifio fel bod yn ailadroddus. Yma Gadewch i ni wneud bwyll cyflym gwirio a gwneud yn siwr nad wnes i goof. Rwy'n gwybod bod o leiaf un peth yn y rhaglen y gwneuthum ei wneud o'i le. Pan fyddaf daro chofnoda ydw i'n mynd i gael unrhyw fath o gweiddi arna i? Beth ydw i'n mynd i gael ei yelled am? Yeah, yr wyf yn anghofio y prototeip, felly rwy'n defnyddio swyddogaeth o'r enw sigma ar llinell 15, ond nid yw'n datgan tan llinell 22, felly yr wyf orau rhagweithiol yn mynd i fyny yma ac yn datgan prototeip, a byddaf yn dweud int sigma (int rhif), a dyna ni. Mae gweithredu ar y gwaelod. Neu ffordd arall y gallwn ddatrys hyn, Gallwn symud y swyddogaeth i fyny yno, ac nid yn ddrwg, ond o leiaf pan fydd eich rhaglen yn dechrau i gael hir, a dweud y gwir, Rwy'n credu bod yna rhywfaint o werth mewn bob amser yn cael y prif ar y brig fel y gallwch yn y darllenydd agor y ffeil ac yna yn syth yn gweld hyn y mae'r rhaglen yn ei wneud heb orfod chwilio drwyddo chwilio am y prif swyddogaeth. Gadewch i ni fynd i lawr at fy ffenestr terfynell yma, ceisiwch wneud sigma gwneud sigma, ac yr wyf gwyneb i fyny yma hefyd. Datganiad Ymhlyg o GetInt swyddogaeth yn golygu fy mod i wedi anghofio gwneud beth arall? [Anghlywadwy-myfyrwyr] Da, felly mae'n debyg mai camgymeriad cyffredin, felly gadewch i ni roi hyn i fyny yma, cs50.h, ac yn awr gad i ni fynd yn ôl at fy ffenestr terfynell. 'N annhymerus' yn glir y sgrîn, a byddaf yn gwneud ailgynnal sigma. Mae'n ymddangos i wedi ei lunio. Gadewch i mi redeg yn awr sigma. 'N annhymerus' deipio'r rhif 3, ac i ddim yn cael 6, felly nid yw gwiriad trylwyr, ond o leiaf mae'n ymddangos ei fod yn gweithio ar yr olwg gyntaf, ond nawr gadewch i RIP ar wahân, a gadewch i ni mewn gwirionedd yn trosoledd y syniad o dychweliad, unwaith eto, mewn cyd-destun syml iawn fel bod ymhen ychydig wythnosau ' pan fyddwn yn dechrau archwilio strwythurau data ffansi na araeau mae gennym offeryn arall yn y pecyn cymorth i'w ddefnyddio i trin strwythurau hynny data gan y byddwn yn gweld. Dyma'r dull ailadroddol, y dull sy'n seiliedig ar ddolen. Gadewch i mi yn lle nawr wneud hyn. Gadewch i mi yn hytrach na dweud bod y Crynodeb o'r nifer ar i lawr i 0 yn wir yr un peth â Rhif + sigma (rhif - 1). Mewn geiriau eraill, yn union fel ar y llwyfan I punted i bob un o'r bobl nesaf i mi, ac maent yn eu tro cadw punting nes ein bod o'r diwedd gwaelod y tu allan yn Willy, a oedd yn gorfod dychwelyd ateb hard-coded fel 0. Yma yn awr rydym yn yn yr un modd punting i sigma un swyddogaeth fel y gelwid yn wreiddiol, ond y mewnwelediad allweddol yma yw nad ydym yn galw sigma yn union. Nid ydym yn pasio yn n. Rydym yn amlwg yn pasio o ran nifer - 1, felly mae problem ychydig yn llai, problem ychydig yn llai. Yn anffodus, nid yw hyn yn dipyn o ateb eto, a chyn i ni atgyweiria hyn y gellid ei neidio allan mor amlwg mewn rhai ohonoch gadewch i mi fynd yn ei flaen ac ailgynnal wneud. Mae'n ymddangos i lunio iawn. Gadewch i mi ailgynnal gyda 6 sigma. Wps, gadewch i mi ailgynnal gyda 6 sigma. Rydym wedi gweld hyn o'r blaen, er amser yn ddamweiniol diwethaf yn ogystal. Pam wnes i gael y wall cryptig? Yeah. [Anghlywadwy-myfyrwyr] Does dim achos sylfaenol, ac yn fwy penodol, beth yn ôl pob tebyg yn digwydd? Mae hyn yn symptom o'r hyn ymddygiad? Dweud ei fod ychydig yn uwch. [Anghlywadwy-myfyrwyr] Mae'n dolen ddiddiwedd yn effeithiol, ac mae'r broblem gyda dolenni ddiddiwedd pan fyddant yn golygu dychweliad yn yr achos hwn, mae swyddogaeth galw ei hun, beth sy'n digwydd bob tro y byddwch yn galw swyddogaeth? Wel, meddwl yn ôl i sut rydym yn gosod allan y cof mewn cyfrifiadur. Rydym yn dweud fod yna darn hwn o gof a elwir yn y simnai sy'n ar y gwaelod, a phob tro y byddwch yn galw swyddogaeth cof ychydig yn fwy yn cael ei rhoi ar y pentwr hyn a elwir yn cynnwys newidynnau y swyddogaeth yn lleol neu baramedrau, felly os sigma yn galw galwadau sigma sigma yn galw sigma  yn galw sigma lle mae hyn yn stori'n gorffen? Wel, yn y pen draw overruns y cyfanswm o gof sydd gennych ar gael ar eich cyfrifiadur. Byddwch fynd oddi ar y segment eich bod yn fod i aros o fewn, a byddwch yn cael y wall, craidd gadael, a pha craidd adael ei olygu yw fy mod bellach ffeil o'r enw craidd sy'n ffeil yn cynnwys sero a rhai y bydd mewn gwirionedd yn y dyfodol yn ddiagnostig ddefnyddiol. Os nad yw'n amlwg i chi lle mae eich nam yn alli 'n weithredol wneud ychydig o ddadansoddiad fforensig, fel petai, ar y domen graidd ffeil, sydd, unwaith eto, yn unig yw criw cyfan o zeros a rhai sydd i bob pwrpas yn cynrychioli cyflwr eich rhaglen er cof hyn o bryd mae'n ddamwain yn y modd hwn. Mae'r atgyweiria yma yw na allwn yn unig blindly dychwelyd sigma, y nifer + sigma o broblem ychydig yn llai. Mae angen i ni gael rhyw fath o achos sylfaenol yma, a beth ddylai'r achos sylfaenol yn debygol o fod? [Anghlywadwy-myfyrwyr] Iawn, felly cyhyd â bod y rhif yn gadarnhaol dylem mewn gwirionedd ddychwelyd y ffurflen hon, neu mewn geiriau eraill, os yw rhif, dweud, <= i 0 eich bod yn gwybod beth, byddaf yn mynd yn ei flaen ac yn dychwelyd 0, yn debyg iawn i Willy gwnaeth, ac arall, yr wyf i'n mynd i fynd yn ei flaen hon a'i dychwelyd, felly nid yw'n bod llawer byrrach na'r fersiwn iterus ein bod yn chwipio i fyny gyntaf, gan ddefnyddio gyfer dolen, ond sylwi fod yna y math hwn o geinder iddo. Yn hytrach na dychwelyd ryw nifer a pherfformio hyn i gyd math ac ychwanegu pethau i fyny gyda newidynnau lleol eich bod yn hytrach yn dweud "Iawn, os yw hyn yn broblem hawdd super, fel y rhif yw <0, gadewch i mi ar unwaith yn dychwelyd 0. " Nid ydym yn mynd i drafferthu rhifau negyddol cefnogi, felly dwi'n mynd i cod caled gwerth o 0. Ond fel arall, i weithredu'r syniad o grynhoi pob un o'r rhifau hyn gyda'ch gilydd, gallwch bob pwrpas byddai'n cymryd brathiad bach allan o'r broblem, yn debyg iawn ni wneud hynny yma ar y llwyfan, yna punt gweddill y broblem i'r person nesaf, ond yn yr achos y person nesaf yw eich hun. Mae'n swyddogaeth a enwir yn union. Dim ond yn ei throsglwyddo yn broblem llai a llai ac yn llai bob tro, ac er bod gennym nad yw pethau'n eithaf ffurfioli mewn cod yma mae hyn yn union beth oedd yn digwydd yn wythnos 0 y llyfr ffôn. Mae hyn yn union beth oedd yn digwydd yn ystod yr wythnosau diwethaf gyda Sean a gyda'n arddangosiadau o chwilio am rifau. Mae'n cymryd ychydig o broblem a rhannu dro ar ôl tro. Mewn geiriau eraill, mae yna ffordd yn awr o gyfieithu y lluniad byd go iawn, mae hyn yn adeiledd lefel uwch o rannu a gorchfygu a gwneud rhywbeth eto ac eto mewn cod, felly mae hyn yn rhywbeth y byddwn yn gweld eto dros gyfnod o amser. Yn awr, wrth fynd heibio, os ydych yn newydd i dychweliad dylech o leiaf yn deall yn awr pam fod hyn yn ddoniol. Rydw i'n mynd i fynd i google.com, ac rydw i'n mynd i chwilio am rai awgrymiadau a driciau ar dychweliad, rhowch. Dywedwch wrth y person nesaf i chi os nad oeddent yn chwerthin yn unig nawr. A oeddech yn meddwl dychweliad? A oeddech yn meddwl-AH, dyna ni. Iawn, yn awr dyna gweddill pawb. Mae wy Pasg bach hymgorffori yn rhywle yno yn Google. Fel o'r neilltu, un o'r dolenni rydym yn rhoi ar wefan y cwrs ar gyfer heddiw yn unig yw hwn grid o algorithmau didoli amrywiol, rhai yr ydym yn edrych ar yr wythnos diwethaf, ond yr hyn sy'n braf am hyn delweddu wrth i chi geisio i lapio eich meddwl o amgylch bethau amrywiol yn ymwneud ag algorithmau yn gwybod y gallwch yn hawdd iawn yn awr yn dechrau gyda mathau gwahanol o fewnbynnau. Mae'r mewnbwn gwrthdroi i gyd, y mewnbynnau didoli yn bennaf, y mewnbynnau ar hap ac yn y blaen. Wrth i chi geisio, eto, gwahaniaethu rhwng y rhain pethau yn eich meddwl sylweddoli bod y URL ar wefan y cwrs ar y dudalen Darlithoedd allai eich helpu chi reswm drwy rai o'r rheini. Heddiw, rydym o'r diwedd yn cael i ddatrys y broblem o amser yn ôl, a oedd yn bod y swyddogaeth hon gyfnewid nid yn unig oedd yn gweithio, a beth oedd y broblem sylfaenol gyda hyn cyfnewid swyddogaeth, oedd y nod o sydd, unwaith eto, i gyfnewid gwerth yma ac yma fel bod hyn yn digwydd? Nid oedd hyn yn gweithio mewn gwirionedd. Pam? Yeah. [Anghlywadwy-myfyrwyr] Yn union, yr esboniad ar gyfer y bugginess yn syml oedd oherwydd pan fyddwch yn ffonio swyddogaethau mewn C a'r rhai swyddogaethau yn cymryd dadleuon, fel a b yma, fyddwch yn gyrru heibio mewn copïau o ba bynnag werth rydych yn ei roi i swyddogaeth honno. Nid ydych yn darparu'r gwerthoedd gwreiddiol eu hunain, felly rydym yn gweld hyn yng nghyd-destun buggyc, buggy3.c, a oedd yn edrych rhywbeth bach fel hyn. Dwyn i gof bod gennym x ac y ymgychwyn i 1 a 2, yn y drefn honno. Rydym yn argraffu ac yna beth oeddent. Yna honni fy mod yn cyfnewid â hwy drwy ffonio cyfnewid o x, y. Ond y broblem oedd bod y cyfnewid yn gweithio, ond dim ond yn y cwmpas y cyfnewid gweithredu ei hun. Cyn gynted ag y byddwn yn cyrraedd llinell 40 gwerthoedd hynny cyfnewid eu taflu i ffwrdd, ac felly nid oes dim yn y swyddogaeth wreiddiol brif newid mewn gwirionedd o gwbl, felly os ydych yn credu bryd hynny ynghylch beth mae hyn yn edrych fel yn nhermau ein cof os yw hyn ochr chwith y bwrdd yn cynrychioli- a byddaf yn gwneud fy ngorau i bawb i weld y-os yw hyn ochr chwith y bwrdd cynrychioli, dyweder, eich RAM, ac mae'r pentwr yn mynd i dyfu ar hyd y ffordd hon, ac rydym yn galw swyddogaeth fel prif, a phrif Mae 2 newidynnau lleol, x ac y, gadewch i ni disgrifio rhai fel x yma, a gadewch i ni disgrifio y rhain fel y fan hyn, a gadewch i ni ei roi yn y gwerthoedd 1 a 2, felly mae hyn yma yn bennaf, a phan fydd yn galw phrif swyddogaeth cyfnewid y system weithredu yn rhoi swyddogaeth cyfnewid ei swath ei hun o gof ar y simnai, ei ffrâm ei hun ar y simnai, fel petai. Mae hefyd yn dyrannu 32 catiau ar gyfer y ints. Mae'n digwydd eu galw a a b, ond mae hynny'n hollol fympwyol. Gallai fod wedi galw nhw beth bynnag y mae am, ond beth sy'n digwydd pan fydd y prif galwadau cyfnewid yn y mae'n ei gymryd hyn 1, yn rhoi copi yno, yn rhoi copi yno. Mae yna 1 newidyn arall mewn cyfnewid lleol, fodd bynnag, galw yr hyn? >> Tmp. Tmp, felly gadewch i mi roi fy hun 32 o ddarnau yma, a beth wnes i ei wneud yn y swyddogaeth hon? Dywedais tmp int yn cael, felly mae wedi 1, felly yr wyf yn gwneud hyn pan fyddwn yn chwarae ddiwethaf â'r enghraifft hon. Yna yn cael b, felly b yw 2, felly, yn awr mae hyn yn 2, ac yn awr yn cael b dros dro, felly dros dro yw 1, felly, yn awr yn dod b hyn. Mae hynny'n wych. Mae'n gweithio. Ond wedyn cyn gynted ag y ffurflenni swyddogaeth cof cyfnewid yn effeithiol yn diflannu fel y gellir ei ailddefnyddio gan ryw swyddogaeth arall yn y dyfodol, a phrif yn amlwg yn hollol yr un fath. Mae angen ffordd o sylfaenol ddatrys y broblem, a heddiw byddwn o'r diwedd ffordd o wneud hyn lle gallwn gyflwyno rhywbeth a elwir yn pwyntydd. Mae'n troi allan y gallwn ddatrys y broblem nid trwy basio mewn copïau o x a y ond yn hytrach drwy basio yn yr hyn, yn eich barn chi, i'r swyddogaeth cyfnewid? Yeah, beth am y cyfeiriad? Nid ydym wedi siarad iawn am gyfeiriadau yn fanwl iawn, ond os yw hyn yn cynrychioli cof bwrdd du fy cyfrifiadur gallem ddechrau rhifo'r bytes yn fy RAM ac yn dweud hyn yn beit # 1, mae hyn yn beit # 2, beit # 3, beit # 4, beit # ... 2 biliwn os gen i 2 gigabeit o RAM, er mwyn i ni yn sicr yn dod i fyny gyda rhai chynllun rhifo mympwyol ar gyfer yr holl bytes unigol er cof am fy cyfrifiadur. Beth os hytrach pan fyddaf yn galw cyfnewid yn hytrach na pasio mewn copïau o x a y pam nad ydw i'n hytrach pasio yn y cyfeiriad x yma, y cyfeiriad y yma, yn ei hanfod y cyfeiriad post x ac y gan fod yna cyfnewid, os yw ef ei hysbysu o gyfeiriad er cof am x ac y, Yna, cyfnewid, os byddwn yn hyfforddi iddo ychydig bach, gallai o bosibl gyrru i'r cyfeiriad hwnnw, fel petai, x, a newid y rhif yno, yna gyrru i gyfeiriad y, newid y rhif yno, hyd yn oed er nad mewn gwirionedd yn cael copïau o'r gwerthoedd hynny ei hun, felly hyd yn oed er ein bod yn siarad am hyn fel prif cof a chof y cyfnewid fel yn y pwerus a'r rhan peryglus o C yw y gall unrhyw swyddogaeth gyffwrdd cof unrhyw le yn y cyfrifiadur, ac mae hyn yn pwerus yn y gallwch wneud pethau ffansi iawn gyda rhaglenni cyfrifiadurol yn C. Mae hyn yn beryglus oherwydd gallwch hefyd sgriw i fyny yn hawdd iawn. Yn wir, un o'r ffyrdd mwyaf cyffredin ar gyfer rhaglenni y dyddiau hyn i gael eu defnyddio'n dal i fod nid ar gyfer rhaglennydd i wireddu ei fod ef neu hi yn caniatáu i ddata i gael ei ysgrifennu mewn lleoliad yn y cof nad oedd yn fwriad. Er enghraifft, mae ef neu hi yn datgan amrywiaeth o maint 10 ond yna ddamweiniol ceisio rhoi 11 bytes i mewn i'r amrywiaeth o gof, a byddwch yn dechrau cyffwrdd rhannau o gof nad ydynt bellach yn ddilys. Dim ond er mwyn cyd-destunol hyn, efallai y bydd rhai ohonoch yn gwybod y meddalwedd yn aml yn annog i chi am rifau cyfresol neu allweddi cofrestru, Photoshop a Word a rhaglenni fel hyn. Mae craciau yn bodoli, gan fod rhai ohonoch yn gwybod, ar-lein lle gallwch chi redeg rhaglen bach, a voila, nid oes cais yn fwy am rif cyfresol. Sut y mae hynny'n gweithio? Mewn llawer o achosion y pethau hyn yn syml dod o hyd yn y cyfrifiaduron segmentau testun yn sero y cyfrifiadur gwirioneddol a rhai ble mae'r swyddogaeth honno lle mae'r rhif cyfresol gwneir cais amdano, ac rydych yn trosysgrifo y lle hwnnw, neu tra bod y rhaglen yn rhedeg gallwch chyfrif i maes ble mae'r allwedd yn cael ei storio mewn gwirionedd defnyddio rhywbeth a elwir yn debugger, a gallwch crac meddalwedd y ffordd honno. Nid yw hyn yn dweud bod hyn yn ein hamcan ar gyfer yr ychydig ddyddiau nesaf, ond mae ganddo iawn y byd go iawn oblygiadau. Bod un yn digwydd i olygu lladrad meddalwedd, ond mae hefyd yn cyfaddawdu o beiriannau cyfan. Yn wir, pan wefannau y dyddiau hyn yn cael eu hecsbloetio ac wedi gwanhau a data yn cael ei gollwng a chyfrineiriau yn cael eu dwyn hyn yn aml iawn yn ymwneud â rheolaeth wael o un cof, neu, yn achos cronfeydd data, methiant i ragweld mewnbwn gwrthwynebus, fel mwy am hynny yn ystod yr wythnosau i ddod, ond ar hyn o bryd dim ond cipolwg o'r math o ddifrod y gallwch ei wneud ychydig llai na deall sut mae pethau'n gweithio o dan y cwfl. Gadewch i ni fynd ati i ddeall pam fod hyn yn torri gyda offeryn a fydd yn dod yn fwy ac yn fwy defnyddiol fel ein rhaglenni yn cael mwy cymhleth. Hyd yn hyn pan fyddwch wedi cael nam yn eich rhaglen sut yr ydych wedi mynd ati i debugging hyn? Beth yw eich technegau wedi bod hyd yn hyn, p'un a ddysgir gan eich TF neu dim ond hunan-ddysgu? [Myfyrwyr] printf. Printf, felly printf wedi bod yn debyg eich ffrind yn, os ydych am weld beth sy'n digwydd y tu fewn eich rhaglen 'ch jyst yn rhoi printf yma, printf yma, printf yma. Yna byddwch yn rhedeg, a byddwch yn cael criw cyfan o stwff ar y sgrîn y gallwch eu defnyddio i ddiddwytho yna beth yn union sy'n mynd o'i le yn eich rhaglen. Printf yn tueddu i fod yn beth pwerus iawn, ond mae'n broses iawn llaw. Mae'n rhaid i chi roi printf yma, a printf yma, ac os ydych yn ei roi tu mewn i ddolen y gallech ei gael 100 o linellau o allbwn y byddwch wedyn yn gorfod didoli drwy. Nid yw'n fecanwaith iawn hawdd ei ddefnyddio neu rhyngweithiol ar gyfer rhaglenni debugging, ond diolch byth mae yn bodoli dewisiadau eraill. Mae yna raglen, er enghraifft, a elwir yn GDB, y Bar GNU, sydd yn ddirgel ychydig yn y ffordd rydych yn ei ddefnyddio. Mae'n braidd yn gymhleth, ond dweud y gwir, mae hwn yn un o'r pethau hynny lle os byddwch yn rhoi yn yr wythnos hon a'r nesaf yr awr ychwanegol i ddeall rhywbeth fel GDB bydd yn arbed mae'n debyg y byddwch degau o oriau yn y tymor hir, felly gyda hynny, gadewch i mi roi teaser o sut mae hyn yn peth yn gweithio. Rwyf yn fy ffenestr terfynell. Gadewch i mi fynd yn ei flaen ac yn llunio rhaglen hon, buggy3. Mae eisoes yn gyfoes. Gadewch i mi redeg yn union fel y gwnaethom cefn tra, ac yn wir, mae'n torri. Ond pam yw hyn? Efallai fy sgriwio i fyny 'r swyddogaeth cyfnewid. Efallai ei fod yn a b. Dydw i ddim yn hollol eu symud o gwmpas yn gywir. Gadewch i mi fynd yn ei flaen ac yn gwneud hyn. Yn hytrach na jyst hidla buggy3 gadewch i mi yn hytrach na rhedeg y GDB rhaglen, ac rydw i'n mynd i ddweud ei fod i redeg buggy3, ac rydw i'n mynd i gynnwys gorchymyn,-tui ymresymiad llinell, a byddwn yn rhoi hyn mewn problemau yn y dyfodol yn spec i atgoffa. Ac yn awr y rhyngwyneb du a gwyn popped i fyny hynny, unwaith eto, ychydig yn llethol ar y dechrau oherwydd mae hyn i gyd gwybodaeth warant i lawr yma, ond o leiaf mae yna rywbeth cyfarwydd. Yn frig y ffenestr yn fy cod gwirioneddol, ac os byddaf yn sgrolio i fyny yma gadewch i mi sgrolio i frig fy ffeil, ac yn wir, mae buggy3.c, a rhybudd ar waelod y ffenestr hon Yr wyf wedi hyn brydlon GDB. Nid yw hyn yr un fath â fy normal John Harvard brydlon. Mae hwn yn brydlon sy'n mynd i fy ngalluogi i reoli GDB. GDB yn debugger. Mae debugger yn rhaglen sy'n gadael i chi gerdded drwy gyflawni eich llinell rhaglen drwy linell wrth linell, ar hyd y ffordd yn gwneud unrhyw beth yr hoffech i'r rhaglen, hyd yn oed yn galw swyddogaethau, neu edrych, yn bwysicach, ar werthoedd newidyn amrywiol yn. Gadewch i ni fynd ymlaen a gwneud hyn. Rydw i'n mynd i fynd yn ei flaen ac yn deipio i mewn rhedeg yn GDB yn brydlon, felly sylwi ar waelod chwith y sgrin Rydw i wedi teipio rhedeg, ac rydw i wedi daro chofnoda, a beth oedd y ei wneud? Mae'n llythrennol yn rhedeg fy rhaglen, ond doeddwn i ddim mewn gwirionedd yn gweld llawer yn mynd ymlaen yma oherwydd nid wyf wedi dweud wrth y gwirionedd debugger i oedi ar adeg benodol mewn amser. Dim ond teipio rhedeg yn rhedeg y rhaglen. Nid wyf yn gweld unrhyw beth. Nid wyf yn gallu camddefnyddio'r dewis hwnnw. Yn lle hynny gadewch i mi wneud hyn. Ar hyn o prydlon GDB gadewch i mi yn hytrach na deipio egwyl, mynd i mewn. Nid yw hynny'n beth oeddwn yn ei olygu i deipio. Gadewch i ni yn hytrach na teipio egwyl mhrif. Mewn geiriau eraill, yr wyf am osod rhywbeth a elwir yn torbwynt, sy'n cael ei enw addas, gan y bydd yn torri neu oedi gweithredu ar eich rhaglen yn y lle hwnnw penodol. Main yw enw fy swyddogaeth. Sylwch fod GDB yn eithaf smart. Mae'n cyfrifedig allan y prif digwydd i ddechrau fwy neu lai yn llinell 18 o buggy3.c, ac yna sylwi yma ar y chwith uchaf b + yn iawn nesaf i linell 18. Dyna fy atgoffa fy mod wedi gosod torbwynt yn llinell 18. Y tro hwn pan fyddaf yn teipio rhedeg, yr wyf i'n mynd i redeg fy rhaglen hyd nes iddo daro'r y torbwynt, felly mae'r rhaglen yn oedi i mi yn llinell 18. Yma rydym yn mynd, rhedeg. Nid oes dim yn ymddangos i fod wedi digwydd, ond bod rhybudd yn y gwaelod ar y chwith rhaglen yn dechrau, buggy3, torbwynt 1 mewn prif buggy3.c llinell 18. Beth allaf ei wneud nawr? Hysbysiad gallaf ddechrau teipio pethau fel print, Nid printf, x print, ac yn awr mae hynny'n rhyfedd. Y $ 1 yn unig yw chwilfrydedd, gan y byddwn yn gweld bob tro y byddwch yn argraffu rhywbeth yr ydych yn cael gwerth $ newydd. Dyna fel y gallwch gyfeirio yn ôl at werthoedd blaenorol rhag ofn, ond am nawr beth print yn ei ddweud wrthyf yw bod gwerth x yn y fan hon yn y stori yn ôl pob golwg 134,514,032. Beth? Ble oedd yn dod hyd yn oed o? [Anghlywadwy-myfyrwyr] Yn wir, dyma beth byddwn yn galw gwerth garbage, ac nid ydym wedi siarad am hyn eto, ond y rheswm eich bod yn ymgychwyn newidynnau Yn amlwg, fel eu bod yn cael rhywfaint o werth eich bod am iddynt gael. Ond mae'r dal yn cofio y gallwch ddatgan newidynnau fel y gwnes i funud yn ôl yn fy enghraifft sigma heb holi i roi iddynt werth. Dwyn i gof yr hyn a wnes dros yma yn sigma. I ddatgan n, ond pa werth wnes i ei roi? Dim, oherwydd fy mod yn gwybod bod yn y llinellau nesaf Byddai GetInt yn gofalu am y broblem o roi gwerth y tu mewn o n. Ond ar y pwynt hwn yn hanes llinell 11 12 llinell a llinell a 13 a llinell 14 drwy gydol y sawl llinell beth yw gwerth n? Yn C dim ond nad ydych yn gwybod. Yn gyffredinol mae rhai, gwerth garbage ryw nifer hollol ar hap sydd ar ôl dros y bôn o'r rhyw swyddogaeth flaenorol wedi cael ei rhedeg, felly fel eich rhaglen yn rhedeg dwyn i gof swyddogaeth honno yn cael swyddogaeth, swyddogaeth, swyddogaeth. Mae pob un o'r fframiau yn cael eu rhoi ar y cof, ac yna dychwelyd y rhai swyddogaethau, ac yn union fel yr awgrymais gyda rhwbiwr eu cof yn cael ei ailddefnyddio yn y pen draw. Wel, dim ond fel y digwydd bod y newidyn x yn y rhaglen hon ymddangos i wedi cynnwys rhywfaint o werth garbage fel 134514032 o rai swyddogaeth flaenorol, nid un yr wyf yn ysgrifennu. Gallai fod yn rhywbeth sy'n dod yn effeithiol gyda'r system weithredu, rhyw swyddogaeth o dan y cwfl. Iawn, mae hynny'n iawn, ond gadewch i ni nawr symud ymlaen i'r llinell nesaf. Os byddaf yn deipio "nesaf" ar GDB fy brydlon ac yr wyf daro chofnoda, sylwi bod y amlygu yn symud i lawr i llinell 19, ond yr ymhlygiad rhesymegol yw y llinell 18 bellach wedi gorffen gweithredu, felly os wyf eto deipio "print x" Dylai wyf yn awr gweler 1, ac yn wir, yr wyf yn ei wneud. Unwaith eto, y pethau $ yn ffordd o GDB eich atgoffa hyn y mae'r hanes o brintiau yn eich bod wedi gwneud. Nawr, gadewch i mi fynd yn ei flaen ac argraffu y, ac yn wir, y mae rhywfaint o werth crazy yn ogystal, ond nid oes llawer mawr oherwydd yn llinell 19 rydym chi ar fin i aseinio ei y gwerth 2, felly gadewch i mi deipio "nesaf" eto. Ac yn awr ein bod ar y llinell printf. Gadewch i mi wneud x print. Gadewch i mi wneud y print. A dweud y gwir, Im 'yn cael ychydig yn flinedig o argraffu hyn. Gadewch i mi yn hytrach na deipio "x arddangos" a "arddangos y," ac yn awr bob tro rwy'n deipio gorchymyn yn y dyfodol Byddaf yn cael eu hatgoffa o'r hyn sydd x ac y, beth x ac y, beth x ac y. Gallaf hefyd, wrth fynd heibio, deipio i mewn "bobl leol wybodaeth." Gwybodaeth yn gorchymyn arbennig. Pobl leol yn golygu ei fod yn dangos i mi y newidynnau lleol. Dim ond rhag ofn i mi anghofio, neu hyn yn crazy, swyddogaeth cymhleth fy mod i neu rywun arall ysgrifennodd y bydd pobl leol yn dweud wrthych info beth yw'r holl newidynnau lleol tu mewn i'r swyddogaeth lleol y gallai ydych yn gofalu am os ydych am i brocio o gwmpas. Yn awr, printf ar fin gweithredu, felly gadewch i mi fynd yn ei flaen ac yn jyst deipio "nesaf." Oherwydd ein bod yn yr amgylchedd hwn nid ydym yn mewn gwirionedd yn gweld ei gweithredu i lawr yma, ond sylwi ei fod yn cael ychydig yn mangled yma. Ond sylwi ei fod yn bwysicach y sgrin yno, felly nid yw'n rhaglen berffaith yma, ond mae hynny'n iawn oherwydd gallaf bob amser yn chwilota o amgylch defnyddio print os ydw i eisiau. Gadewch i mi deipio nesaf eto, ac yn awr dyma y rhan ddiddorol. Ar y pwynt hwn yn y stori y yw 2, ac x yw 1, fel yr awgrymir yma, ac eto, y rheswm hwn yn awtomatig arddangos yn awr yw oherwydd fy mod yn defnyddio'r gorchymyn arddangos x ac arddangos y, felly mae'r hyn o bryd rwy'n deipio nesaf Dylid mewn egwyddor, x ac y yn cyfnewid. Nawr, rydym eisoes yn gwybod nad yw mynd i fod yn wir, ond byddwn yn gweld yn y man sut y gallwn plymio ddyfnach i chyfrif i maes pam mae hynny'n wir. Nesaf, ac yn anffodus, yn dal y 2 ac x yn dal i 1, a gallaf gadarnhau cymaint. Print x, print y. Yn wir, nid oes unrhyw cyfnewid wedi digwydd mewn gwirionedd, felly gadewch i ni ddechrau hyn drosodd. Yn amlwg cyfnewid yn cael ei dorri. Gadewch i ni yn hytrach na deipio "rhedeg" eto. Gadewch i mi ddweud ie, yr wyf am ei ailgychwyn o'r dechrau, rhowch. Nawr rwy'n yn ôl i fyny ar llinell 18. Nawr sylwi x ac y yn werthoedd garbage eto. Nesaf, nesaf, nesaf, nesaf. Os byddaf yn cael diflasu Gallaf hefyd jyst deipio n gyfer y flwyddyn nesaf. Gallwch crynhowch i'r dilyniant byrraf posibl o gymeriadau. Swap yn cael ei dorri yn awr. Gadewch i ni plymio i mewn, felly yn hytrach na teipio nesaf, yn awr yr wyf i'n mynd i deipio gam fel fy mod yn camu tu mewn swyddogaeth hon er mwyn i mi gerdded drwyddo, felly rwy'n taro cam ac yna mynd i mewn. Sylwch fod y neidiau yn tynnu sylw at i lawr yn is yn fy rhaglen i linell 36. Nawr beth yw'r newidynnau lleol? Pobl leol Info. Dim byd ond eto oherwydd nad ydym wedi gotten at y llinell, felly gadewch i ni fynd yn ei flaen a dweud "nesaf." Nawr rydym yn ymddangos i gael tmp tmp print,. Gwerth Garbage, dde? Rwy'n credu hynny. Beth am argraffu, print b, 1 a 2? Mewn eiliad, cyn gynted ag yr wyf deipio nesaf eto tmp yn mynd i gymryd ar werth o 1, gobeithio, oherwydd tmp yn mynd i gael ei neilltuo i'r gwerth a. Nawr gadewch i ni yn argraffu'r a, b print, ond erbyn hyn argraffu tmp, ac mae'n wir 1. Gadewch i mi ei wneud nesaf. Gadewch i mi ei wneud nesaf. Rydw i wedi gorffen y swyddogaeth cyfnewid. Rwy'n dal y tu mewn ohono yn llinell 40, felly gadewch i mi argraffu, Nid yw print b, ac yr wyf yn poeni beth yw tmp. Mae'n edrych fel cyfnewid yn gywir pan ddaw i gyfnewid a b a. Ond os wyf yn awr yn teipio nesaf, yr wyf yn neidio yn ôl i linell 25, ac wrth gwrs, os wyf yn fath yn x ac y print eu bod yn dal yr un fath, felly nid ydym wedi gosod y broblem. Ond ddiagnostig bellach efallai gyda'r rhaglen hon GDB rydym wedi gotten o leiaf un cam yn nes at ddealltwriaeth beth sy'n mynd o'i le heb orfod sbwriel ein cod drwy roi printf yma, printf yma, printf yma ac yna yn rhedeg eto ac eto yn ceisio at chyfrif i maes beth sy'n mynd o'i le. Rydw i'n mynd i fynd yn ei flaen a rhoi'r gorau iddi allan o hyn yn gyfan gwbl â rhoi'r gorau iddi. Mae'n mynd i ddweud wedyn, "Gadael beth bynnag?" Ydw. Nawr rwy'n yn ôl ar fy brydlon arferol, ac rwy'n ei wneud gan ddefnyddio GDB. Fel o'r neilltu, nid oes angen i chi ddefnyddio hwn-tui faner. Yn wir, os byddwch yn hepgor ei byddwch yn cael hanfod yr hanner gwaelod y sgrîn. Os byddaf yna teipiwch egwyl mhrif ac yna rhedeg Rwy'n dal i redeg fy rhaglen, ond beth fydd yn ei wneud yn fwy nhestun dim ond dangos i mi yr un llinell presennol ar y tro. Mae'r tui-, rhyngwyneb defnyddiwr testunol, yn unig yn dangos i chi fwy o'r rhaglen ar unwaith, ac mae'n debyg mai ychydig gysyniadol yn haws. Ond yn wir, a gaf fi ei wneud nesaf, nesaf, nesaf, ac rydw i'n mynd i weld un llinell ar y tro, ac os Rwy'n awyddus iawn i weld beth sy'n mynd ymlaen Gallaf deipio rhestr a gweld criw cyfan o linellau cyfagos. Mae yna fideo ein bod ni wedi gofyn i chi wylio am broblem yn gosod 3 lle mae Nate ymdrin â rhai o'r cymhlethdodau o GDB, a dyma un o'r pethau hynny, yn onest, lle mae rhai ganran heb fod yn ddibwys i chi byth yn cyffwrdd GDB, a bydd hynny fod yn beth drwg oherwydd llythrennol byddwch yn gorffen treulio mwy o amser yn ddiweddarach yn y semester mynd ar drywydd lawr bugs yna byddai chi os ydych yn rhoi yn yr awr honno hanner awr / yr wythnos hon a dysgu nesaf i gael gyfforddus gyda GDB. Printf oedd eich ffrind. Dylai GDB yn awr yn eich ffrind. Unrhyw gwestiynau ar GDB? A dyma restr gyflym o rai o'r gorchmynion mwyaf pwerus a defnyddiol. Yeah Allwch. >> Byddwch yn argraffu, llinyn? Allwch chi argraffu llinyn? Yn hollol. Nid oes rhaid i ddim ond fod yn gyfanrifau. Os yw s amrywiol yn llinyn jyst deipio i mewn s print. Bydd yn dangos i chi beth y newidyn llinyn yn. [Anghlywadwy-myfyrwyr] Bydd yn rhoi i chi y cyfeiriad a llinyn ei hun. Bydd yn dangos i chi ddau. Ac un peth olaf, dim ond oherwydd bod y rhain yn dda i wybod hefyd. Olrheiniad a ffrâm, gadewch i mi plymio i mewn i'r un adeg y llynedd, un rhaglen union gyda GDB. Gadewch i mi fynd yn ei flaen ac yn rhedeg y fersiwn rhyngwyneb defnyddiwr testunol, torri prif. Gadewch i mi fynd yn ei flaen ac yn rhedeg unwaith eto. Dyma fi. Nawr, gadewch i mi fynd nesaf, nesaf, nesaf, nesaf, nesaf, cam, rhowch. Ac yn awr mae'n debyg rwyf bellach yn cyfnewid yn fwriadol, ond rwy'n hoffi "Damn, beth oedd y gwerth x?" Ni allaf wneud x anymore. Ni allaf wneud y oherwydd nad ydynt yn eu cwmpas. Dydyn nhw ddim yn cyd-destun, ond dim problem. Gallaf deipio olrheiniad. Mae hynny'n dangos i mi yr holl swyddogaethau sydd wedi cyflawni hyd at y pwynt hwn mewn amser. Sylwch fod yr un ar y gwaelod, prif, llinellau i fyny gyda phrif bod ar waelod ein llun yma. Mae'r ffaith bod cyfnewid yn uwch ei ben i fyny gyda llinellau cyfnewid yn uwch mewn cof yma, ac os wyf eisiau mynd yn ôl i'r brif dros dro y gallaf ei ddweud "ffrâm." Pa rif? Main yn ffrâm # 1. Rydw i'n mynd i fynd yn ei flaen a dweud "ffrâm 1." Nawr rwy'n yn ôl yn y brif, a gallaf argraffu x, a gallaf argraffu y, ond ni allaf argraffu b neu. Ond gallaf os ydw i'n dweud, "Iawn, arhoswch funud. Ble roedd y cyfnewid?" Gadewch i mi fynd yn ei flaen ac yn dweud "ffrâm 0." Nawr rwy'n yn ôl i ble yr hoffwn fod, ac fel o'r neilltu, mae gorchmynion eraill hefyd, fel os ydych yn wir yn mynd teipio diflasu nesaf, nesaf, nesaf, nesaf, yn gyffredinol, gallwch ddweud pethau fel "10 nesaf," a fydd yn camu drwy'r y 10 nesaf llinellau. Gallwch hefyd ysgrifennu "parhau" pan fyddwch mewn gwirionedd yn cael llond bol gyda chamu drwyddo. Bydd Parhau i redeg eich rhaglen heb ymyrraeth nes ei fod yn taro arall torbwynt, boed mewn dolen neu yn is i lawr yn eich rhaglen. Yn yr achos hwn rydym yn parhau hyd y diwedd, a'r rhaglen exited fel arfer. Mae hon yn ffordd ffansi, proses israddol. Dim ond eich rhaglen exited fel arfer. Mwy o wybodaeth am hynny yn y fideo ac â dadfygio sesiynau sydd i ddod. Dyna oedd llawer. Gadewch i ni gymryd ein 5-munud egwyl yma, a byddwn yn dychwelyd gyda structs a ffeiliau. Os ydych wedi syrthio i mewn i pset yr wythnos hon eisoes yn byddwch yn gwybod ein bod yn defnyddio yn y cod dosbarthu, y cod ffynhonnell yr ydym yn ei ddarparu i chi fel man cychwyn, mae rhai technegau newydd. Yn benodol, rydym yn cyflwyno y gair allweddol newydd o'r enw strwythur, ar gyfer strwythur, fel y gallwn greu newidynnau customized o ryw fath. Rydym hefyd yn cyflwyno y syniad o fewnbwn ffeil file I / O, ac allbwn, ac mae hyn yn fel y gallwn achub y wladwriaeth eich bwrdd Scramble i ffeil ar ddisg fel y gall y cymrodyr addysgu ac yr wyf yn deall beth sy'n mynd ymlaen tu mewn i'ch rhaglen heb orfod manually chwarae dwsinau o gemau o Scramble. Gallwn wneud hyn yn fwy automatedly. Mae'r syniad o strwythur datrys problem eithaf cryf. Tybiwch ein bod yn dymuno gweithredu rhai rhaglen hynny rywsut yn cadw golwg ar wybodaeth ar fyfyrwyr, ac efallai y bydd myfyrwyr, er enghraifft, ID, enw a thy mewn lle fel Harvard, felly mae'r rhain yn 3 darn o wybodaeth rydym am eu cadw o gwmpas, felly gadewch i mi fynd yn ei flaen ac yn dechrau ysgrifennu rhaglen bach yma, cynnwys stdio.h. Gadewch i mi yn cynnwys cs50.h. Ac yna dechrau fy prif swyddogaeth. Ni fyddaf yn trafferthu gyda unrhyw ddadleuon llinell orchymyn, ac yma rwyf am gael myfyrwyr, felly dw i'n mynd i ddweud gan fyfyriwr enw, felly dwi'n mynd i ddweud "enw llinyn." Wedyn dw i'n mynd i ddweud myfyriwr hefyd yn cael ID, id felly int, a myfyriwr tŷ, felly rwyf hefyd yn mynd i ddweud "ty llinyn." Yna byddaf yn archebu'r rhain ychydig yn fwy lân fel hyn. Iawn, yn awr yr wyf wedi 3 newidynnau i'w defnyddio i gynrychioli myfyrwyr, felly "myfyriwr." Ac yn awr yr wyf yn awyddus i boblogi y gwerthoedd hyn, felly gadewch i mi fynd yn ei flaen ac yn dweud rhywbeth fel "Id = 123." Enw yn mynd i gael David. Lets 'ddeud tŷ yn mynd i gael Mather, ac yna dw i'n mynd i wneud rhywbeth fympwyol fel printf ("% s, y mae eu ID yn d%, yn byw yn% s. Ac yn awr, beth ddylwn i ei awyddus i gau'r yma, un ar ôl y llall? Enw, id, tŷ; dychwelyd 0. Iawn, oni bai fy mod sgriwio i fyny yma yn rhywle Rwy'n credu bod gennym raglen 'n bert da sy'n storio un myfyriwr. Wrth gwrs, nid yw hyn yw'r cyfan sydd ddiddorol. Beth os ydw i eisiau cael 2 myfyrwyr? Dyna dim llawer mawr. Allaf gefnogi'r 2 o bobl. Gadewch i mi fynd yn ei flaen ac yn tynnu sylw at hyn ac yn mynd i lawr yma, a gallaf ddweud "id = 456" i rywun fel Rob sy'n byw yn Kirkland. Iawn, aros, ond ni allaf yn galw'r rhain yr un peth, ac mae'n edrych fel fy mod i'n mynd i gael i gopïo hyn, felly gadewch i mi ddweud y bydd y rhain yn Dewi Sant newidynnau, a gadewch i mi gael rhai copïau o'r rhain ar gyfer Rob. Byddwn yn galw'r rhain yn y Rob, ond nid yw hyn yn mynd i weithio nawr gan fy mod wedi aros-, gadewch i ni newid i mi ID1, name1 a house1. Bydd Rob yn 2, 2. Mae gen i newid hyn yma, yma, yma, yma, yma, yma. Arhoswch, beth am Tommy? Gadewch i ni wneud hyn eto. Yn amlwg, os ydych yn dal i feddwl bod hyn yn ffordd dda o wneud hyn, nid yw'n, felly copïo / gludo drwg. Ond rydym yn datrys y wythnos yn ôl. Beth oedd ein ateb pan oeddem am gael achosion lluosog o'r fath un data? [Mae myfyrwyr yn] Mae amrywiaeth. Mae amrywiaeth, felly gadewch i mi geisio i lanhau hyn i fyny. Gadewch i mi wneud rhywfaint o le i mi fy hun ar y brig, a gadewch i mi yn hytrach na gwneud hynny yma. Byddwn yn galw'r bobl hyn, ac yn lle dw i'n mynd i ddweud "bidiau int," ac rydw i'n mynd i gefnogi 3 ohonom ar hyn o bryd. Rydw i'n mynd i ddweud "enwau llinyn," a byddaf yn cefnogi 3 ohonom, ac yna dw i'n mynd i ddweud "tai llinyn," a dw i'n mynd i gefnogi 3 ohonom. Nawr yma yn hytrach na chael ei David newidynnau lleol eu hunain gallwn gael gwared o'r rheiny. Sy'n teimlo'n dda ein bod yn glanhau hyn i fyny. Yna gallaf ddweud David yn mynd i fod [0] ac enwau [0] a thai [0]. Ac yna Rob gallwn arbed yr un modd ar hyn. Gadewch i ni roi hyn i lawr yma, felly mae'n mynd i fod yn fympwyol bidiau [1]. Mae'n mynd i fod yn enwau [1], ac yna yn olaf, tai [1]. Dal i fod ychydig yn ddiflas, ac yn awr yr wyf wedi at chyfrif hyn, felly gadewch i ni ddweud "enwau [0], id [0], tai [0], a gadewch i ni pluralize hyn. ID, IDS, IDS. Ac eto, yr wyf i'n ei wneud, felly unwaith eto, rwyf eisoes yn troi i gopïo / gludo eto, felly groes yn mae ateb arall yma. Mae'n debyg y gallaf lanhau hyn i fyny ymhellach gyda dolen neu rywbeth fel 'na, hynny yn fyr, mae'n ychydig yn well ond yn dal yn teimlo fel Rwy'n troi at gopïo / gludo, ond hyd yn oed hyn i hawlio iawndal, Nid yw wir yn y bôn yr ateb cywir oherwydd beth os rywbryd byddwn yn penderfynu eich bod yn gwybod beth? Rydym yn dylai gwirionedd wedi bod yn storio cyfeiriadau e-bost i David a Rob a phawb arall yn y rhaglen hon. Dylem hefyd yn storio rhifau ffôn. Dylem hefyd yn storio rhifau cyswllt mewn argyfwng. Mae gennym yr holl ddarnau hyn o ddata yr ydym am i storio, felly sut ydych chi'n mynd ati i wneud hynny? Rydych yn datgan arall amrywiaeth ar y brig, ac yna llaw yn ychwanegu cyfeiriad e-bost [0], cyfeiriad e-bost [1] am David a Rob ac yn y blaen. Ond mae mewn gwirionedd dim ond rhagdybiaeth sy'n sail i'r cynllun fy mod yn defnyddio'r system anrhydedd i wybod bod [I] ym mhob un o'r nifer o araeau ond fel y digwydd i gyfeirio at y person un, felly [0] yn ids yw rhif 123, ac rydw i'n mynd i gymryd yn ganiataol bod enwau [0] yw enw'r un person a thai [0] yn dŷ yr un person ac yn y blaen ar gyfer yr holl arae amrywiol y creu. Ond sylwch nad oes unrhyw gysylltiad sylfaenol ymysg y rhai 3 darn o id gwybodaeth,, enw a thy, er nad yw'r endid ydym yn ceisio model yn y rhaglen hon yn araeau. Araeau yn unig y ffordd hon rhaglennol o wneud hyn. Yr hyn yr ydym wir eisiau i fodelu yn ein rhaglen yn berson fel David, mae person fel Rob tu mewn iddo neu amgáu yn enw ac Adnabod a thy. Allwn ni rywsut yn mynegi syniad hwn o amgįu lle mae person yn cael ID, enw a thŷ ac nid troi at 'n sylweddol hon darnia lle rydym yn unig ymddiried bod rhywbeth braced yn cyfeirio at yr endid ddynol un ym mhob un o'r araeau gwahanol? Gallwn ei wneud mewn gwirionedd hyn. Gadewch i mi fynd yn uwch na'r prif ar hyn o bryd, a gadewch i mi greu fy math data ei hun am wir y tro cyntaf. Rydym yn defnyddio y dechneg hon Scramble, ond yma yr wyf i'n mynd i fynd yn ei flaen a chreu math data, a ydych yn gwybod beth, yr wyf i'n mynd i alw yn fyfyriwr neu berson, ac yr wyf i'n mynd i ddefnyddio typedef gyfer diffinio fath. Rydw i'n mynd i ddweud bod hwn yn strwythur, ac yna y strwythur hwn yn mynd i fod o fyfyrwyr fath, byddwn yn dweud, hyd yn oed er 'i' ychydig yn bellach wedi dyddio i mi. Byddwn yn dweud "int id." Byddwn yn dweud "enw llinyn." Yna byddwn yn dweud "llinyn tŷ," felly, yn awr erbyn diwedd y llinellau hyn ychydig o god Rwyf wedi dysgu dim ond clang bod yn bodoli math data ar wahân ints, ar wahân llinynnau, ar wahân dyblau, ar wahân fflotiau. O hyn o bryd mewn 11 llinell amser, mae yna bellach math data newydd o'r enw myfyrwyr, ac yn awr y gallaf ddatgan newidyn myfyrwyr yn unrhyw le rwyf eisiau, felly gadewch i mi sgroliwch i lawr yma i bobl. Nawr gallaf gael gwared o hyn, a gallaf fynd yn ôl i lawr i David yma, ac ar gyfer David gallaf ddweud mewn gwirionedd bod David, gallwn enwi llythrennol y newidyn ar ôl fy hun, yn mynd i fod o fyfyrwyr fath. Gallai hyn yn edrych ychydig yn od, ond nid hyn yw'r cwbl y gwahanol rhag datgan rhywbeth fel int neu linyn neu arnofio. Fel mae'n digwydd cael ei alw myfyrwyr yn awr, ac os wyf i am roi rhywbeth tu mewn i'r strwythur hwn Erbyn hyn mae gen i ddefnyddio darn newydd o gystrawen, ond mae'n eithaf syml, david.id = 123, david.name = "David" mewn cyfalaf D, a david.house = "Mather," ac yn awr y gallaf gael gwared ar y pethau yma. Rhybudd rydym wedi ail-ddylunio yn awr ein rhaglen mewn gwirionedd yn ffordd llawer gwell yn yr awr ein rhaglen yn adlewyrchu'r byd go iawn. Mae yna syniad y byd go iawn o berson neu fyfyriwr. Yma, mae gennym bellach yn fersiwn C o berson neu yn fwy penodol yn fyfyriwr. Y tu mewn y person a yw'r rhain yn nodweddion perthnasol, ID, enw a thŷ, felly Rob yn ei hanfod yn dod yr un peth i lawr yma, felly myfyrwyr rob, ac erbyn hyn rob.id = 456, rob.name = "Rob." Mae'r ffaith bod y newidyn cael ei alw'n Rob yn fath o ddiystyr. Gallem fod wedi ei alw x neu y neu z. Rydym yn unig a enwir fod Rob i fod yn semantig yn gyson, ond mewn gwirionedd yr enw yn y tu mewn yn y maes hwnnw ei hun, felly rwyf bellach wedi hyn. Mae hyn nid yn rhy yn teimlo fel y dyluniad gorau yn fy mod i wedi codio galed David. Rydw i wedi codio galed Rob. Ac yr wyf yn dal i orfod troi at rai copi a phastio bob tro rwyf am newidynnau newydd. At hynny, rhaid i mi roi i bob golwg o'r newidynnau hyn, enw, hyd yn oed er y byddwn i'n llawer gwell disgrifiwch y newidynnau  mwy o fyfyrwyr generig fel. Nawr gallwn gyfuno'r syniadau sydd wedi bod yn gweithio'n dda i ni ac yn hytrach yn dweud, "Rydych yn gwybod beth, yn rhoi i mi fyfyrwyr amrywiol o'r enw, a gadewch i ni wedi iddo fod o faint 3, "felly nawr gallaf fireinio hyn ymhellach, cael gwared ar y David datgan llaw, a gallaf yn hytrach na dweud rhywbeth fel myfyrwyr [0] yma. Yna gallaf ddweud myfyrwyr [0] yma, Gall myfyrwyr [0] yma, ac yn y blaen, ac yr wyf yn mynd o amgylch a glanhau fod ar gyfer Rob. Gallwn hefyd fynd am nawr efallai ychwanegu dolen a defnyddio GetString a GetInt i mewn gwirionedd yn cael y gwerthoedd hyn gan y defnyddiwr. Gallwn fynd ati i ychwanegu cyson oherwydd mae hyn yn arfer gwael yn gyffredinol i cod caled ryw nifer mympwyol fel 3 dde yma ac yna dim ond cofiwch y dylech roi dim mwy na 3 myfyriwr yn yr ystafell. Mae'n debyg y byddai'n well defnyddio # ddiffinio ar frig fy ffeil a ffactor hwnnw allan, felly yn wir, gadewch i mi fynd yn ei flaen a chyffredinoli hyn. Gadewch i mi agor yn enghraifft sy'n ymysg heddiw enghreifftiau o flaen llaw, structs1. Mae hon yn rhaglen fwy cyflawn sy'n defnyddio # ddiffinio hyd yma ac yn dweud ein bod yn mynd i gael 3 myfyrwyr yn ddiofyn. Yma Rwy'n datgan gwerth dosbarth o fyfyrwyr, felly ystafell ddosbarth o fyfyrwyr, ac erbyn hyn rwy'n defnyddio dolen dim ond er mwyn gwneud y cod ychydig yn fwy cain, poblogi'r y dosbarth gyda mewnbwn y defnyddiwr, felly ailadrodd o i = 0 ar hyd i fyfyrwyr, sy'n 3. Ac yna yr wyf yn annog y defnyddiwr yn y fersiwn hwn  beth ID y myfyriwr, ac yr wyf yn ei gael gyda GetInt. Beth yw enw'r myfyriwr, ac yna yr wyf yn ei gael gyda GetString. Beth yw tŷ y myfyriwr? Wyf yn ei gael gyda GetString. Ac yna ar y gwaelod yma rwyf wedi penderfynu gwneud dim newid sut yr wyf i'n argraffu hyn allan ac i mewn gwirionedd yn defnyddio dolen, ac sy'n ydw i'n argraffu? Yn ôl at y sylw rwy'n argraffu unrhyw un yn Mather, a dyna ni felly Rob a Tommy ac yn y blaen-mewn gwirionedd Tommy yn Mather. Byddai Tommy a David yn cael ei argraffu yn yr achos hwn, ond sut mae hyn yn gweithio? Nid ydym wedi gweld y swyddogaeth hon o'r blaen, ond gan gymryd dyfalu ynghylch beth mae hyn yn ei wneud. Cymharu llinynnau. Mae'n ychydig nad ydynt yn amlwg sut mae'n cymharu llinynnau gan ei fod yn troi allan os yw'n dychwelyd 0 sy'n golygu bod y llinynnau yn gyfartal. Os yw'n dychwelyd -1 hynny'n golygu un yn dod yn nhrefn yr wyddor cyn y llall, ac os bydd yn dychwelyd 1 sy'n golygu y gair arall yn dod yn nhrefn yr wyddor cyn y llall, a gallwch edrych ar-lein neu ar y dudalen dyn i weld yn union pa ffordd yw pa un, ond mae hyn i gyd ei wneud yn awr yw ei fod yn dweud os yw'r [i]. tŷ yn hafal i "Mather" yna mynd yn ei flaen ac argraffu felly ac felly yn Mather. Ond dyma rywbeth nad ydym wedi gweld o'r blaen, a byddwn yn dod yn ôl i hyn. Nid wyf yn cofio erioed gael i wneud hyn yn unrhyw un o fy rhaglenni. Rhad ac am ddim yn ymddangos yn cyfeirio at cof, gan ryddhau cof, ond yr hyn y cof ydw i'n debyg rhyddhau yn y ddolen ar waelod y rhaglen hon? Mae'n edrych fel fy mod yn rhyddhau enw'r person a thŷ person, ond pam hynny? Mae'n troi allan yr holl wythnosau yr ydych wedi bod yn defnyddio GetString rydym wedi bod yn fath o gyflwyno a bug i mewn i bob un o'ch rhaglenni. GetString ar gof dylunio yn dyrannu fel y gall ddychwelyd i chi llinyn, Gall fel David, neu Rob, ac yna yn ei wneud beth bynnag yr ydych ei eisiau gyda'r llinyn yn eich rhaglen oherwydd ein bod wedi cadw'r cof i chi. Y broblem yw yr holl amser hwn bob tro y byddwch yn ffonio GetString ydym ni, yr awduron o GetString, wedi bod yn gofyn y system weithredu i roi ychydig o RAM ar gyfer y llinyn. Dyro i ni ychydig o RAM ar gyfer y llinyn nesaf. Dyro i ni RAM rhai yn fwy ar gyfer y llinyn nesaf. Beth allwch chi, y rhaglennydd, erioed wedi bod yn ei wneud yn rhoi i ni hynny yn ôl y cof, felly ar gyfer y nifer o wythnosau yr holl raglenni rydych wedi ysgrifennu wedi hyn a elwir yn naid cof lle maent yn parhau i ddefnyddio'r cof mwy a mwy bob tro y byddwch yn ffonio GetString, ac mae hynny'n iawn. Rydym yn fwriadol yn gwneud hynny yn ystod yr wythnosau cyntaf oherwydd nid yw bod yn ddiddorol i rhaid i chi boeni am ble y llinyn yn dod. Y cyfan sydd eisiau yw y gair Rob i ddod yn ôl pan fydd y defnyddiwr mathau ei ynddo Ond symud ymlaen gennym yn awr i ddechrau mynd yn fwy soffistigedig am hyn. Unrhyw amser yr ydym yn dyrannu cof yn well yn y pen draw roi yn ôl. Fel arall yn y byd go iawn ar eich Mac neu PC a allai fod gennych o bryd i'w gilydd profiadol symptomau lle mae eich cyfrifiadur wedi ei falu i ben yn y pen draw neu y bêl traeth nyddu dwp yn unig yw meddiannu'r cyfrifiadurol Ni all sylw cyfan ac rydych yn gwneud pethau. Gall hynny gael ei esbonio gan unrhyw nifer o chwilod, ond ymhlith y rhai bygiau posibl yn cael eu pethau o'r enw gollwng cof lle mae rhywun a ysgrifennodd y darn hwnnw o feddalwedd ydych yn ei ddefnyddio yn methu cofio i gof rhad ac am ddim ei fod ef neu hi ofyn i'r system gweithredu ar gyfer, peidio â defnyddio GetString, oherwydd dyna beth CS50, ond gan ddefnyddio swyddogaethau tebyg sy'n gofyn y system weithredu ar gyfer cof. Os ydych chi neu nhw sgriw i fyny ac i byth yn dychwelyd y cof yn symptom o all fod yn bod rhaglen yn arafu ac yn arafu ac yn arafu i lawr oni bai eich bod yn cofio ffonio am ddim. Byddwn yn dod yn ôl pryd a pham y byddech chi'n ffonio am ddim, ond gadewch i ni fynd yn ei flaen yn unig ar gyfer mesur da ac yn ceisio rhedeg y rhaglen benodol hon. Cafodd hyn ei enw structs1, rhowch. Gadewch i mi fynd yn ei flaen ac yn rhedeg structs1, 123, David Mather, 456, Rob Kirkland, 789, Tommy Mather, a gwelwn David yn Mather, Tommy yn Mather. Mae hyn yn unig yw gwiriad pwyll fawr fod y rhaglen yn gweithio. Yn awr, yn anffodus, mae'r rhaglen hon ychydig yn rhwystredig yn y I ddim yn y gwaith hwnnw, yr wyf deipio mewn 9 llinynnau gwahanol, daro chofnoda, Dywedwyd wrthyf a oedd yn Mather, ond yn amlwg yr wyf yn gwybod a oedd yn Mather eisoes oherwydd fy mod yn ei deipio. Byddai'n braf o leiaf os yw'r rhaglen hon yn fwy fel cronfa ddata ac mewn gwirionedd yn cofio hyn yr wyf wedi teipio mewn erioed felly yr wyf unwaith eto rhaid i fewnbwn y cofnodion myfyrwyr. Efallai ei fod yn debyg i system registrarial. Gallwn wneud hyn drwy ddefnyddio y dechneg hon a elwir fel mewnbwn ffeil file I / O, ac allbwn, ffordd gyffredinol iawn o ddweud unrhyw tro y byddwch eisiau darllen ffeiliau neu ysgrifennu ffeiliau gallwch wneud hyn gyda set benodol o swyddogaethau. Gadewch i mi fynd yn ei flaen ac yn agor y structs2.c enghraifft, sydd bron yn union yr un fath, ond gadewch i ni weld hyn y mae'n ei wneud. Ar ben y ffeil Yr wyf yn datgan dosbarth o fyfyrwyr. Yna boblogi y dosbarth gyda mewnbwn y defnyddiwr, felly mae'r llinellau o god yn union fel o'r blaen. Yna, os wyf am symud i lawr yma i'n argraffu pawb sydd yn Mather fympwyol fel o'r blaen, ond mae hyn yn nodwedd newydd diddorol. Mae'r llinellau o god yn newydd, ac maent yn cyflwyno rhywbeth yma, FFEIL, yr holl gapiau, ac mae wedi * i mewn yma hefyd. Gadewch imi fwrw hyn dros yma, mae * dros yma yn ogystal. Mae'r swyddogaeth nid ydym wedi gweld o'r blaen, fopen, ond mae'n golygu ffeil agored, felly gadewch i ni sgimio trwy'r rhain, ac mae hyn yn rhywbeth y byddwn yn dod yn ôl atynt yn psets yn y dyfodol, ond mae hyn lein yma yn ei hanfod yn agor ffeil o'r enw cronfa ddata, ac yn benodol yn agor yn y fath fodd fel y gellir gwneud yr hyn iddo? [Anghlywadwy-myfyrwyr] Iawn, felly "w" dim ond yn golygu ei fod yn dweud wrth y system weithredu agor y ffeil yn y fath fodd y gallaf ysgrifennu ato. Nid wyf am ei ddarllen. Nid wyf am i edrych ar y mater. Rydw i eisiau newid ac ychwanegu pethau a allai fod iddo, ac y ffeil yn mynd i gael ei alw gronfa ddata. Gallai hyn gael ei alw yn ddim. Gallai hyn fod yn database.txt. Gallai hyn fod. Db. Gallai hyn fod yn air fel foo, ond yr wyf fympwyol dewis i enwi'r ffeil gronfa ddata. Mae hwn yn wiriad bwyll bach y byddwn yn dod yn ôl ato yn fanwl iawn dros gyfnod o amser, os fp, ar gyfer pwyntydd ffeil, nid yw'n NULL cyfartal sy'n golygu popeth yn iawn. Stori hir yn fyr, swyddogaethau fel fopen weithiau yn methu. Efallai nad yw'r ffeil yn bodoli. Efallai eich bod allan o le disg. Efallai nad oes gennych ganiatâd i fod folder, felly os fopen yn dychwelyd rhywbeth null ddigwyddodd drwg. I'r gwrthwyneb, os nad fopen yn dychwelyd null popeth yn iawn a gallaf ddechrau ysgrifennu at y ffeil hon. Dyma dric newydd. Mae hwn yn ddolen ar gyfer sydd wedi ailadrodd dros bob un o fy myfyrwyr, ac mae hyn yn edrych mor debyg i'r hyn yr ydym wedi'i wneud o'r blaen, ond mae swyddogaeth hon yn gefnder o'r hyn a elwir printf fprintf gyfer ffeil printf, ac yn sylwi ei fod yn wahanol mewn dim ond 2 ffordd. Un, mae'n dechrau gyda f hytrach na p, ond yna ei ddadl gyntaf yn ymddangos yn beth? [Mae myfyrwyr yn] Ffeil. >> Mae'n ffeil. Mae hyn yn beth a elwir yn fp, y byddwn yn y pen draw canfod ar wahân yr hyn y pwyntydd ffeil yw, ond am nawr fp yn syml yn cynrychioli'r ffeil fy mod wedi agor, felly dyma fprintf yn ei ddweud argraffu ID y defnyddiwr at y ffeil, ac nid i'r sgrin. Printiwch enw'r defnyddiwr at y ffeil, nid at y sgrîn, y tŷ at y ffeil, nid at y sgrin, ac yna i lawr yma, yn amlwg, cau'r ffeil, ac yna i lawr yma heb y cof. Yr unig wahaniaeth rhwng y fersiwn 2 a fersiwn 1 yw cyflwyno fopen ac mae hyn yn FFEIL gyda * ac mae hyn yn syniad o fprintf, felly gadewch i ni weld beth oedd y canlyniad terfynol yn. Gadewch i mi fynd i mewn i fy ffenestr terfynell. Gadewch i mi redeg structs2, rhowch. Edrych fel popeth yn iawn. Gadewch i ailgynnal structs2. 123, David Mather, 456, Rob Kirkland, 789, Tommy Mather, rhowch. Edrych fel ei fod yn ymddwyn yr un fath, ond os wyf yn awr yn gwneud ls sylwi ar yr hyn ffeil mewn yma ymysg fy holl cod, cronfa ddata, felly gadewch i ni agor y, gedit o gronfa ddata, ac yn edrych ar hynny. Nid yw'r sexiest o fformatau ffeil. Mae wir yn un darn o linell data fesul llinell fesul llinell, ond y rhai ohonoch sy'n defnyddio ffeiliau Excel neu CSV, coma gwahanu gwerthoedd, Gallwn yn sicr wedi defnyddio fprintf i yn lle hynny efallai yn gwneud rhywbeth fel hyn er mwyn i mi mewn gwirionedd yn creu yr hyn sy'n cyfateb o ffeil Excel trwy wahanu pethau gyda nid coma, dim ond llinellau newydd. Yn yr achos hwn os ydw i wedi eu defnyddio yn lle coma yn hytrach na llinellau newydd Gallai wyf yn llythrennol agor y ffeil gronfa ddata yn Excel os byddaf yn hytrach yn ei gwneud yn edrych fel hyn. Yn fyr, gan fod gennym y pŵer i ysgrifennu at ffeiliau gallwn yn awr ddechrau data parhaus, gan ei gadw o gwmpas ar y ddisg fel y gallwn gadw gwybodaeth o gwmpas eto ac eto. Hysbysiad un neu ddau o bethau eraill sydd bellach ychydig yn fwy cyfarwydd. Ar frig y ffeil C gennym typedef oherwydd ein bod yn awyddus i greu math data sy'n cynrychioli gair, felly y math hwn yw'r enw ar air, ac y tu mewn y strwythur hwn mae ychydig yn fwy ffansi yn awr. Pam mae gair cynnwys pob golwg arae? Beth yw gair yn unig reddfol? Mae'n amrywiaeth o gymeriadau. Mae'n cyfres o gymeriadau cefn wrth gefn wrth gefn. LLYTHRENNAU ym mhob gapiau yn digwydd i fod yn fympwyol rydym yn dweud uchafswm hyd o unrhyw air yn y geiriadur ein bod yn ei ddefnyddio ar gyfer Scramble. Pam ydw i'n cael 1? Mae cymeriad nwl. Dwyn i gof pan wnaethom yr enghraifft Bananagrams rydym angen werth arbennig ar ddiwedd y gair er mwyn cadw golwg ar o ble geiriau a ddaeth i ben mewn gwirionedd, ac fel y broblem manyleb set yn dweud yma rydym ni'n cysylltu â gair rhoi gwerth boolean, baner, fel petai, yn wir neu'n anwir. Ydych chi wedi dod o hyd y gair hwn yn barod, oherwydd rydym yn sylweddoli mae gwir angen ffordd o gofio nid yn unig beth yw gair yn Scramble ond pa un a fyddwch chi, y dynol, wedi ei chael yn felly os ydych yn dod o hyd i'r gair "y" nad ydych yn gallu jyst deipio y, fynd i mewn, y, rhowch, y, rhowch ac yn cael 3 pwynt, 3 pwynt, 3 pwynt, 3 phwynt. Rydym am fod yn gallu rhestr ddu y gair hwnnw drwy osod bool yn wir os ydych chi wedi dod o hyd eisoes, ac felly dyna pam ein bod crynhoi yn y strwythur hwn. Yn awr, i lawr yma yn Scramble mae hwn yn strwythur eraill o'r enw geiriadur. Absennol yma yw'r gair typedef oherwydd yn yr achos hwn angen i ni grynhoi y syniad o eiriadur, a geiriadur yn cynnwys criw cyfan o eiriau, awgrymir gan y array, a faint o'r geiriau hynny sydd ar gael? Wel, beth bynnag maint hwn a elwir yn amrywiol yn ei ddweud. Ond rydym yn unig angen un geiriadur. Nid oes angen math ddata o'r enw geiriadur. Rydym yn unig angen un ohonynt, felly mae'n troi allan yn C os nad ydych yn ei ddweud typedef, 'ch jyst yn dweud strwythur, yna y tu mewn i'r braces cyrliog byddwch yn rhoi eich newidynnau, yna rydych yn rhoi'r enw. Mae hyn yn datgan 1 geiriadur a elwir yn amrywiol sy'n edrych fel hyn. Ar y llaw arall, y llinellau hyn yn creu strwythur data y gellir eu hailddefnyddio a elwir yn air y gallwch greu copïau lluosog o, yn union fel rydym yn creu copïau lluosog o fyfyrwyr. Beth mae hyn yn y pen draw yn caniatáu i ni ei wneud? Gadewch i mi fynd yn ôl i mewn i, gadewch i ni ddweud, yn enghraifft symlach o amseroedd symlach, a gadewch i mi agor i fyny, gadewch i ni ddweud, compare1.c. Y broblem yma wrth law yw mewn gwirionedd croen yn ôl yr haen o linyn a dechrau cymryd oddi ar y olwynion hyfforddiant oherwydd ei fod yn troi allan y llinyn yr holl amser hwn yn ôl ein haddewid yn wythnos 1 gwirionedd dim ond llysenw, gyfystyr o'r llyfrgell CS50 am rywbeth sy'n edrych ychydig yn fwy cryptig, * torgoch, ac rydym wedi gweld y seren o'r blaen. Rydym yn ei weld yng nghyd-destun ffeiliau. Gadewch i ni yn awr yn gweld pam yr ydym wedi bod yn cuddio manylion hyn ers peth amser bellach. Dyma ffeil o'r enw compare1.c, ac mae'n debyg yn gofyn i'r defnyddiwr ar gyfer 2 llinynnau, sa t, ac yna mae'n ceisio cymharu rhai llinynnau ar gyfer cydraddoldeb yn llinell 26, ac os ydynt yn gyfartal mae'n ei ddweud, "Rydych deipio yr un peth," ac os nad ydynt yn gyfartal ei fod yn dweud, "Rydych deipio pethau gwahanol." Gadewch i mi fynd yn ei flaen ac yn rhedeg y rhaglen hon. Gadewch i mi fynd i mewn i fy cyfeiriadur ffynhonnell, yn gwneud compare1. Mae'n llunio iawn. Gadewch i mi redeg compare1. 'N annhymerus' chwyddo i mewn, mynd i mewn. Dweud rhywbeth. HELO. Byddaf yn dweud rhywbeth eto. HELO. Nid wyf yn sicr ddim yn teipio pethau gwahanol. Gadewch i mi roi cynnig ar hyn eto. IS-DDEDDFAU. Yn bendant nid wahanol, felly beth sy'n mynd ymlaen yma? Wel, hyn sydd mewn gwirionedd yn cael ei gymharu yn llinell 26? [Anghlywadwy-myfyrwyr] Ie, felly mae'n troi allan y llinyn, data math, yn fath o gelwydd gwyn. Mae llinyn yw * torgoch, ond beth yw * torgoch? A * torgoch, fel maen nhw'n dweud, yn pwyntydd, ac mae pwyntydd yn effeithiol gyfeiriad, lleoliad swm yn y cof, ac os ydych yn digwydd i fod wedi ei deipio mewn gair fel HELO, cofio o drafodaethau yn y gorffennol o dannau mae hyn yn debyg i'r gair HELO. Cofiwch y gall gair fel HELO yn cael eu cynrychioli fel amrywiaeth o gymeriadau fel hyn ac yna gyda chymeriad arbennig ar ddiwedd enw cymeriad null, fel y dynodi \. Beth yw mewn gwirionedd yn llinyn? Sylwch fod hyn yn darnau lluosog o gof, ac yn wir, y diwedd ei bod yn hysbys yn unig ar ôl i chi edrych drwy'r llinyn cyfan chwilio am y cymeriad null arbennig. Ond os yw hyn yn dalp o gof ar y cof fy cyfrifiadur, gadewch i ni fympwyol dweud bod y llinyn yn unig got 'n ffodus, ac iddo gael ei osod ar y dechrau o RAM fy cyfrifiadur. Mae hyn yn beit 0, 1, 2, 3, 4, 5, 6 ... Pan fyddaf yn dweud rhywbeth fel GetString ac yr wyf yn ei wneud llinyn s = GetString hyn mewn gwirionedd yn cael eu dychwelyd? Am yr wythnosau diwethaf, yr hyn mewn gwirionedd yn cael ei storio mewn s yw nad yw hyn llinyn per se, ond yn yr achos hwn yr hyn sy'n cael ei storio yn rhwng 0 a nifer oherwydd bod yr hyn GetString yn ei wneud yn nad yw'n gorfforol dychwelyd llinyn. Nid yw hynny'n hyd yn oed yn gwneud synnwyr mewn gwirionedd cysyniadol. Beth mae'n ei wneud elw yn rhif. Mae'r nifer yn y cyfeiriad HELO er cof, a llinyn s yna, os ydym croen hwn yn ôl haen, nid llinyn yn bodoli mewn gwirionedd. Dim ond yn symleiddio yn y llyfrgell CS50. Hyn yn wir yn rhywbeth o'r enw * torgoch. Char yn gwneud synnwyr oherwydd beth gair, fel HELO? Wel, mae'n gyfres o chars, cyfres o gymeriadau. * Char yw'r cyfeiriad o gymeriad, felly beth mae'n ei olygu i ddychwelyd llinyn? Mae 'n glws, ffordd syml o ddychwelyd llinyn yn hytrach na cheisio at chyfrif i maes sut yr wyf yn dychwelyd i 5 neu 6 bytes gwahanol gadewch i mi ddychwelyd i'r cyfeiriad y mae beit? Mae'r un cyntaf. Mewn geiriau eraill, gadewch i mi roi cyfeiriad cymeriad mewn cof. Dyna beth * torgoch yn cynrychioli, y cyfeiriad o un cymeriad unigol mewn cof. Ffoniwch y s amrywiol. Storiwch mewn s yn y cyfeiriad hwnnw, yr wyf yn fympwyol ddweud yw 0, dim ond er mwyn cadw pethau'n syml, ond mewn gwirionedd mae'n gyffredinol mae nifer mwy. Arhoswch funud. Os ydych yn unig yn rhoi i mi y cyfeiriad y nod cyntaf, sut ydw i'n gwybod beth yw'r cyfeiriad yw o gymeriad ail, y trydydd, y pedwerydd a'r pumed? [Anghlywadwy-myfyrwyr] Dim ond yn gwybod lle mae'r ddiwedd y llinyn yw drwy wneud y gamp 'n hylaw, felly pan fyddwch yn defnyddio rhywbeth fel printf, beth printf llythrennol yn cymryd fel ei ddadl, cofio ein bod yn defnyddio dalfan y% s, ac yna byddwch yn mynd heibio yn y newidyn sydd ei storio llinyn. Beth ydych chi'n wirioneddol basio yw cyfeiriad y nod cyntaf y llinyn. Printf wedyn yn defnyddio dolen i neu ddolen tra ar dderbyn y cyfeiriad, er enghraifft, 0, felly gadewch i mi wneud hyn yn awr, printf ("% s \ n," s); Pan fyddaf yn galw printf ("% s \ n," s); hyn yr wyf i'n rhoi printf gyda yw cyfeiriad y cymeriad cyntaf yn s, sef yn yr achos mympwyol yw H. Sut mae printf yn gwybod beth yn union i'w arddangos ar y sgrin? Y person sy'n gweithredu ar waith printf dolen gyfnod, neu a ar gyfer dolen sy'n dweud y mae hyn yn cyfateb i'r cymeriad cymeriad null arbennig? Os nad yw, ei hargraffu. Beth am yr un yma? Os nad yw ei hargraffu, ei hargraffu, ei hargraffu, ei hargraffu. O, mae hyn mae un yn arbennig. Stop argraffu a dychwelyd i'r defnyddiwr. A dyna llythrennol cyfan sydd wedi bod yn digwydd o dan y cwfl, ac mae hynny'n llawer i'w dreulio yn y diwrnod cyntaf o ddosbarth, ond am nawr mae'n wir y bloc adeiladu popeth dealltwriaeth sydd wedi bod yn digwydd y tu mewn o gof ein cyfrifiadur, ac yn y diwedd byddwn yn ymhelaethu ar wahân gydag ychydig o help gan un o'n ffrindiau yn Stanford. Yr Athro Nick Parlante yn Stanford wedi gwneud hyn dilyniant fideo gwych o bob math o ieithoedd gwahanol sydd wedi cyflwyno y Binky animeiddio clai cymeriad bach. Mae llais ydych chi ar fin i glywed mewn dim ond cipolwg ail ychydig yw bod yn athro Stanford, a ydych yn cael dim ond 5 neu 6 eiliad yr hawl hon yn awr, ond mae hyn yn y nodyn ar y byddwn yn dod i'r casgliad heddiw a dechrau ddydd Mercher. Yr wyf yn rhoi i chi Hwyl Pointer gyda Binky, y rhagolwg. [♪ Cerddoriaeth ♪] [Athro Parlante] Hey, Binky. Wake i fyny. Mae'n amser ar gyfer hwyl pwyntydd. [Binky] Beth sy'n bod? Dysgu am awgrymiadau? O, anrhegion! Byddwn yn eich gweld ar ddydd Mercher. [CS50.TV]