[Powered by Google Translate] [Wythnos 3] [David J. Malan - Harvard University] [Mae hyn yn CS50. - CS50.TV] Gadewch i mi llywio i ni yn y cyfeiriad o ble rydym yn gadael i ffwrdd tro diwethaf, a oedd yn dechrau meddwl ychydig yn fwy na thua cystrawen ac yn ceisio meddwl ychydig yn llai am bob un y manylion pitw sy'n cymryd ychydig o amser i acclimate i hyd yn hyn o ran hanner colon a cromfachau a braces cyrliog, i ddechrau cymryd pethau ychydig i lefel uwch cysyniadol fel bod y problemau yr ydym yn awr yn dechrau datrys dros yr wythnosau nesaf nifer yn mynd i gynnwys llawer mwy o broblemau lefel uwch cysyniadol ac ychydig yn llai yn y cystrawennol wrth i chi gael eich traed gwlyb a rhowch eich dwylo budr gyda rhai o'r gystrawen o'r ychydig wythnosau diwethaf. Felly, yn cofio bod yr wythnos diwethaf, cyflwynwyd y syniad o amrywiaeth. A gall amrywiaeth yn Saesneg yn cael ei ddisgrifio fel beth? >> [Anghlywadwy ymateb y myfyrwyr] Mae'n ddrwg gennym? Casgliad o? >> [Anghlywadwy ymateb y myfyrwyr] >> Iawn, da. Casgliad o eitemau. Felly, rydym yn gweld araeau yn Scratch. Os ydych yn digwydd i'w ddefnyddio ar gyfer pset 0 un o Scratch rhestrau y gallwch llusgo pethau fel orennau a bananas i mewn, rhestr o ryw fath, sy'n fath o fel hyn y mae amrywiaeth yn. Ac yna yn fwy technegol, yng nghyd-destun cyfrifiadur go iawn, arae yn syml, yn dalp cyffiniol o gof. Mewn geiriau eraill, mae gennych beit, yna arall beit, yna arall beit, yna arall beit, ac os ydych yn tynnu y rhai bytes mewn llun, byddent yn gefn wrth gefn wrth gefn wrth gefn. Dyna beth a olygwn wrth cyffiniol. Felly mae'n rhif beit 1, yna 2, yna 3. Nid yw'n golygu yma, hyd yma, i fyny yma, i fyny yma. Mae amrywiaeth yn dalp cyffiniol o 0 neu fwy o bytes. Felly, beth ydynt ddefnyddiol ar gyfer? Cofio inni gael y math hwnnw o esiampl contrived o raddau cwis pobl storio mewn rhaglen i gyfrifo eich cyfartaledd cwis ar gyfer rhai cyrsiau, a dwyn i gof y gallem ddechrau ysgrifennu y rhaglen honno drwy ddatgan quiz1 amrywiol. Yna, gallem gael newidyn arall o'r enw quiz2. Ond yna os roedd 3 cwisiau yn y dosbarth hwn, quiz4. Neu os oedd cwis wythnosol, byddai'n quiz5, quiz6, quiz7. Felly, byddech yn cael yr holl newidynnau hyn datgan y tu mewn o brif neu rywle arall yn eich rhaglen, ac mae'r broblem gyda'r dull hwnnw, yn hawdd er ei bod ydy at jyst adysgrifia a bastio, a yw'n dim ond yn gyflym yn dod yn anhylaw. Duw a'n gwaredo rhag i chi mewn gwirionedd gennych 30 cwisiau neu 50 cwisiau. Os mae fel cwis pop yr ysgol bob dydd arddull yn uchel, Yna, os oes gen ti restr chwerthinllyd hir o newidynnau yn cael eu datgan, ac mae hyn yn unig yn gyflym iawn mynd allan o reolaeth. Mae'n hyll, mae'n anodd i'w cynnal, mae'n llawer haws i wneud typo os ydych yn cael rhif 1 gamdeipio'r enw rhywle yn eich rhaglen. Felly, rydym yn cyflwyno'r syniad o amrywiaeth yn lle hynny. Ac yn cofio i ni weithredu rhaglen hon drwy wneud rhywbeth bach fel hyn. Gadewch i mi fynd i mewn i cyfeiriadur heddiw Ffynhonnell Dydd Llun 3 ac yn agor i fyny amrywiaeth, a gwelsom y tro diwethaf. A hyd yn oed er nad oedd ychydig o driciau newydd C yma, yn eu plith y syniad o gyson, cofio ein bod yn datgan fflotiau lluosog yn y bôn trwy ddefnyddio'r chystrawen: arnofio, yna enw'r newidyn, yna rydym yn defnyddio braces sgwâr mewn gwirionedd am y tro cyntaf, a'r hyn a wnaethom y tu mewn o'r rhai braces sgwâr i bob pwrpas yn rhoi rhif. Ond yn hytrach na rhoi nifer, yr wyf yn rhoi y gair hwn gyfalafu, cwisiau. A beth oedd y cymhelliant ar gyfer rhoi gair gyfalafu fel cwisiau ac yna gan ddefnyddio tric 17 llinell yma i mewn gwirionedd yn rhoi bod nifer? Beth oedd y cymhelliant yno? Yeah. [Ymateb y myfyrwyr Anghlywadwy] >> Yn union. Os ydym am newid y gwerth 2, rydym dim ond ei newid mewn 1 lle oherwydd ystyried - nid wyf ddim hyd yn oed gofio beth wnaeth y rhaglen hon yn union, ond os ydych yn unig sgimio fyddwch yn gweld Cwisiau, posau. Byddwch yn gweld Cwisiau, i lawr yma yn fwy cwisiau. Felly, os nad oedd gennym y cyson, mae'r defnydd o finiog diffinio, byddem wedi teipio 2, yna 2, yna 2, yna 2, sy'n iawn. Byddai'n yr un mor gywir. Ond mae'n debyg y flwyddyn nesaf mae gennym 3 cwisiau yn CS50. Felly, rhaid i mi fynd a diweddaru'r cod, rhaid i mi ail-grynhoi hynny, ond y broblem yw os wyf yn gwneud rhywbeth twp, fel yr wyf yn edrych dros 1 sôn o 2 ac anghofio i blygio mewn 3, gallai'r rhaglen gyfan yn dda iawn torri. Felly, rydym yn unig yn gofyn am drwbl. Felly, y syniad o gyson yn ymwneud â ffactoreiddio nodi rhai darn o ddata, boed yn llinyn neu golosg neu arnofio neu beth bynnag, ac yn datgan ei fod 1 lle fel y gallwch yn haws ei newid yn y dyfodol. Ac mae hefyd yn dweud y gwir, ychydig yn haws i'w ddarllen oherwydd os ydych yn unig yn meddwl am hyn yn awr, mae'n Cwisiau, neu gallem hyd yn oed ailenwi rhywbeth fel NUMBER_OF_QUIZZES neu rywbeth mwy penodol. Mae'r cod yn unig yn dod yn ychydig yn fwy amlwg o ran yr hyn y mae'n ei wneud, ac rydych yn meddwl ychydig yn llai beth allai ddigwydd rhif 2 i olygu. Felly, yr cyson oedd unrhyw beth i'w wneud sylfaenol gyda arrays. Mae amrywiaeth ei gyflwyno gan ffordd y braces sgwâr. Felly, yn sylwi bod yn llinell 23 byddwn yn gofyn i'r defnyddiwr, "Beth oedd eich sgôr cwis?" Yna, rydym yn unig yn cael y ddolen yn ôl pob golwg yn gofyn i'r defnyddiwr ar gyfer eu graddau. Sut? Mae'n ailadrodd 0-2. Ac yr wyf yn dweud 2 oherwydd cwisiau yn yr holl gapiau ar hyn o bryd 2. Felly, mae'n ailadrodd o 0 hyd at 2 ac yna bydd yn argraffu allan Cwis # rywbeth o rywbeth, ac yna y mae'n eu defnyddio GetFloat i gael gwerth o'r defnyddiwr. Felly sylwi ar hyn yw'r unig ddarn arall newydd o gystrawen o ddydd Mercher diwethaf. Os ydych am storio rhywbeth mewn lleoliad penodol yn y array, chi eto defnyddiwch y cromfachau sgwâr. Felly mae 'na dipyn o ddeuoliaeth yma. Y tro cyntaf y byddwch yn defnyddio'r cromfachau sgwâr ydych yn ei ddefnyddio i nodi pa mor fawr ydych am i'r amrywiaeth fod. Ond y cyd-destun nesaf yma lle rydym unwaith eto yn cyflogi hyn cromfachau sgwâr golygu lle yn y casgliad ydych chi am roi rhywfaint o werth? A gall y gwahaniaeth yma yn cael ei gasglu o gyd-destun. Hysbysiad yma mae gennym fath data, yna mae gennym enw newidyn, Yna, rydym wedi ein braces sgwâr gyda nifer y tu mewn, hanner colon. Dyna ni. Felly dyna datganiad. Mae'n union fel petaem wedi gwneud rhywbeth fel arnofio Gradd 1, arnofio Gradd 2; ond eto, mae hyn yn gyflym iawn yn datganoli i gopi ffordd gormod, past, felly yn lle rydym yn unig yn syml gan fel y cyfryw, sy'n golygu o hyn ymlaen mae gennym gradd y gellir ei storio yn braced 0, mae gennym arall gradd y gellir eu storio yn braced 1, ond beth os wyf goof ac, er enghraifft, fy ddolen yn mynd hyd yn hyn - er enghraifft, yr wyf yn gwneud hyn yn llai na neu'n hafal i, sy'n galw i gof oedd y ffynhonnell nam blaenorol - sydd i bob pwrpas yn golygu bod ar rai fersiwn damweiniol traean o'r hyn dolen Rwy'n defnyddio braced 2. I bob pwrpas, yr hyn a allai ddigwydd yma? Mae'n ddrwg gennym? [Myfyrwyr] Mae'n mynd i gael eu disodli. >> A yw'n mynd i gael ei ddisodli? Beth fyddai'n cael ei ddisodli? Mae hyn yn llythrennol yn ei ddweud lle'r hyn sydd yn y lleoliad 2 gyda'r gwerth dychwelyd GetFloat. Ond y broblem yw pa mor fawr yw'r amrywiaeth yn y fan hon yn y stori? [Ymateb y myfyrwyr Anghlywadwy] >> Mae'r amrywiaeth yn dal i fod yn unig o maint 2 oherwydd yr amrywiaeth, fel unrhyw newidyn, ei ddatgan yn gyntaf, cyn i ni ei ddefnyddio, ac rydym yn nodi yma oherwydd hyn cyson bod gen i 2 radd fy mod i'n mynd i roi. Ond cofiwch, mae'r gwyddonwyr cyfrifiadurol yn dechrau cyfrif o 0. Felly, y lleoliad cyntaf yn y casgliad yn braced 0. Y lleoliad nesaf yw 1. Mae hyn yn peth yn erioed mor ychydig yn rhy bell drosodd i'r ochr. Felly, mewn geiriau eraill, os wyf mewn gwirionedd yn cael y casgliad - a gadewch i mi weld pa mor dda y cydweithio yma i ni - os oes gennyf amrywiaeth yr wyf wedi tynnu yn syml fel a ganlyn ac rwyf wedi neilltuo lle ar gyfer 2 elfen, efallai y byddwn yn tynnu hyn fel hyn mewn cof lle mae hyn cynfas gwyn mawr yw. Dim ond y RAM sydd gennyf yn fy nghyfrifiadur, a gig o RAM, 2 gigs o RAM, beth bynnag, ond y 2 flwch bellach yn unigol yn cynrychioli fflôt, 32 did. Felly, os wyf yn rhoi rhif 1 yma fel 1.0, yna yr wyf yn rhoi rhif arall yma, fel 3.2 ond yna yr wyf yn ei wneud braced 2, dyna fel rhoi rhywbeth yma. Ac fel y llun yn awgrymu, nid oes dim byd yno. Mae'n fath o fel dir neb oherwydd nid wyf wedi gofyn i'r system weithredu i roi i mi y cwis drydydd. Os ydw i ddim eisiau bod cwis parti, dylai'r wyf wedi cael y feddwl ymlaen llaw i ofyn i'r system weithredu ar ei gyfer gan ddatgan cwisiau i fod yn 2 Nid ond i yn hytrach cyfartal 3. Felly, mewn geiriau eraill, mae'r darlun sydd gennym yn effeithiol gael o law yn edrych fel hyn yma. Mae hyn eto yn dir neb. Nid ydym yn well ceisio ysgrifennu gwerthoedd yma. Ond unwaith eto, gwyddonwyr cyfrifiadurol oherwydd cyfrif o 0, pan fyddwn yn sôn am y lleoliad hwn yn yr amrywiaeth, sy'n fod i fod yn lleoliad 0, mae hyn yn dybiedig i fod yn lleoliad 1, ac nid yw hyn yn bodoli hyd yn oed gan mai dim ond gofyn i'r system weithredu ar gyfer 2 le o'r fath. Felly, y rhai ohonoch sydd â phrofiad blaenorol rhaglennu o ieithoedd eraill efallai yn gwybod nad yw hyn yn wir bob amser gyda arae neu bethau o'r enw fectorau. Yn hytrach, gallwch barhau i ychwanegu ac yn ychwanegu ac ychwanegu pethau i arrays, sydd, a dweud y gwir, cawsom y gallu yn Scratch ac eto rydym yn ymddangos i wedi rhoi i fyny yma oherwydd gyda C ydych yn rhaglennu yn llawer mwy penodol. Dim ond chi a'r cyfrifiadur ar hyn o bryd, ac mae'r cyfrifiadur yn unig yn mynd i wneud hyn a ddywedwch iddo ei wneud. Felly, os ydych ond yn dweud i roi chi 2 fflotiau drwy gyfrwng llinell 22 yma, dyna'r cyfan ydych yn mynd i fynd yn ôl oddi wrth y system weithredu: lle i 2. Felly, yn gynyddol yn cael eu eich rhaglenni yn mynd i weithiau fod yn buggy o ran araeau. Mae hyn yn unig fath o natur y bwystfil lle mae pob un ohonom yn ffaeledig, ac ar ryw adeg byddwch mynegai debygol iawn y tu hwnt i ffin eich casgliad. A dim ond ffordd ffansi o ddweud i chi fynd i mewn i rywbeth braced a rhywbeth oedd yn rhy fawr o nifer. Rydych yn mynd y tu hwnt i ffiniau eich casgliad. Ond y upside yn awr yw hyn. Mae gweddill y rhaglen hon yn wir wedi dim sylfaenol i'w wneud gyda arrays. Mae'n i gyd yn unig am rai rhifyddeg syml ar gyfer cyfartaleddau cyfrifiadurol. Felly mae gennym yma yn hyn ar gyfer dolen yma yn gyntaf a swm amrwyiol yn enw ein bod yn ymgychwyn i 0. Yna, rydym yn ailadrodd o 0 hyd at 2 eto ac rydym yn ychwanegu at y newidyn symiant y radd ith, felly braced 0 yna braced 1. Ac yna fel y byddech yn ei wneud yn yr ysgol radd i gyfrifo cyfartaledd, rydym yn syml yn cymryd y swm, ei rannu gan y nifer cyfanswm o gwisiau, ac yna ar gyfer mesur da yr ydym yn galw swyddogaeth yma a elwir yn rownd. Yn awr, wrth fynd heibio, beth yw'r ddelio â hyn int cromfachau ar llinell 34? Efallai ei fod wedi dod i fyny yn barod yn adran, wedi siarad digon amdano yn ffurfiol yma, ond beth yw hyn int mewn parens yn ôl pob tebyg yn ei wneud? >> [Anghlywadwy ymateb y myfyrwyr] Yeah, mae hyn yn cyfeirio at castio neu stereoteipio, sy'n golygu cymryd 1 Data math a drosi i un arall. Ni allwch wneud hyn gyda phob math ddata oherwydd weithiau byddai hi braidd yn rhyfedd. Ond yn yr achos hwn, os yw gwerth dychwelyd rownd yn arnofio oherwydd, wedi'r cyfan, rwy'n cymryd arnofio a'i rannu gan nifer fel 2, Rydw i'n mynd i fynd yn ôl fflôt. Ond nid yw pobl ysgol radd yn wir yn hoffi gwybod bod eu gyfartaledd oedd 93.4 oherwydd fe wna nhw sylweddoli eu bod erioed mor agos at fod 95 pwynt talgrynnu. Felly, rydym am yn hytrach defnyddiwch int i rownd pawb i'r int agosaf, sydd yn yr achos yn mynd i yn 94 heb unrhyw fan ar ei ôl. Felly dyna dim ond tric mathemategol bach. A byddwn yn dod yn ôl at y syniad o fwrw oherwydd bydd yn cael goblygiadau, os nad ydych eisoes wedi darganfod, ar gyfer problem gosod 2. Felly, arae, yna, gallwch chi feddwl - mae'n mynd i wneud i mi wenu drwy'r dydd. Mae'n edrych fel hyn os ydych yn tynnu llun ohono, ond yr allwedd yw bod y maint yn cael ei ddewis hefyd gan eich pan fyddwch yn gofyn oddi wrth y system weithredu. Unrhyw gwestiynau yna ar rhesi? Yeah. [Gwestiwn myfyrwyr Anghlywadwy] Ah, cwestiwn da. Y cwestiwn yw beth sy'n digwydd i'r y 0 null yn yr amrywiaeth? Nid yw'n bodoli yn y cyd-destun. Mai dim ond yn bodoli yng nghyd-destun llinynnau, yr ydym chi ar fin i ddod i mewn dim ond hyn o bryd. Ond ar gyfer amrywiaeth, fel yn yr achos hwn, y cyfan a gewch yn yr hyn yr ydych yn gofyn i'r system gweithredu ar gyfer. Ac fel o'r neilltu, fel na byddo hyn fod yn aneglur, Rwy'n cadw yn dweud i chi ofyn y system weithredu, gofynnwch i'r system weithredu. Mae system weithredu, fel y gwyddoch mae'n debyg, yw Mac OS, Windows, Linux. Pan fyddwch chi'n ffonio swyddogaethau fel GetFloat neu os ydych yn datgan newidynnau fel graddau, ar ddiwedd y dydd yr ydych yn effeithiol gofyn i rywun arall i roi y cof oherwydd ein bod yn dyheu rhaglenwyr oes ganddynt unrhyw syniad sut i mewn gwirionedd yn cael mynediad corfforol i gof. Ond mae rhywun yn ei wneud: y system weithredu. Felly, ar wahân i ni gyflwyno gydag eiconau 'n bert a bwydlenni a ffolderi ac yn y blaen a welwch ar eich bwrdd gwaith, boed yn Mac neu PC, systemau gweithredu hefyd yn gwneud y pethau cyffredin ar lefel isel, y pethau dechnegol iawn o reoli'r gigabyte neu 2 gigabeit o gof sydd gennych, reoli'r CPU sydd gennych, ac yn y blaen. Felly, pan fyddwch yn ysgrifennu cod, ydych wirioneddol yn bacho i mewn i'ch system weithredu yn yr ystyr honno. Rydw i'n mynd i gael i leihau hynny. Mae pob hawl. Gwestiynau eraill am araeau? Na? Iawn. Felly, y newid naturiol o araeau mewn gwirionedd i bwnc sydd ychydig yn gyfarwydd. Ac rydym yn edrych erioed mor fyr ar hyn o bryd diwethaf hefyd. Roedd hon yn enghraifft llinyn o ddydd Mercher. Mae'r enghraifft hon yn llinyn yn rhaglen eithaf syml, ac rydw i wedi symleiddio mewn gwirionedd gan bâr o linellau ar gyfer dibenion heddiw. Mae pob mae'n ei wneud yn unol 19 yn cael llinyn gan y defnyddiwr, ei storio mewn newidyn a elwir s. Yna, yn ymlaen llinell 22 mae'n debyg argraffu 1 a llinyn cymeriad fesul llinell. Ond sut y mae'n gwneud hyn? Rydym yn datgan i amrywiol, gan ei gosod hafal i 0, ac mae hyn yn dod yn hen arferiad yn awr. Nid ydym wedi gweld y tan ddydd Mercher, ond gallwch fath o casglu oddi wrth ei enw strlen dim ond yn dychwelyd yr hyn pan roddir s? Mae hyd y llinyn. Felly, os ydw i'n pasio ei fod yn llinyn, dyfynnwch-unquote DAVID, mae'n gobeithio mynd i ddychwelyd i mi y nifer 5 oherwydd DAVID. Felly dyna ei bwrpas mewn bywyd yw cymryd llinyn, p'un a chodio caled gan eich neu yn yr achos hwn blygio i mewn fel newidyn, fel dadl, ac mae'n ffigurau allan beth yw hyd y llinyn yn. Felly dyma nawr rydym ni'n benthyg rhywfaint o nodiant gan yr enghraifft cwis blaenorol. Mae hyn wedi ddim i'w wneud gyda fflotiau, wedi ddim i'w wneud â cwisiau, ond mae'n troi allan fod y celwydd gwyn bach rydym wedi bod yn dweud wrthych ers wythnos 1 yw nad yw llinyn yn bodoli mewn gwirionedd yn C. Mae llinyn ar ddiwedd y dydd yn wirioneddol yn unig arae. Mae'n amrywiaeth o bytes, felly beit, beit, beit, beit, a oedd yn galw i gof yn unig yw 8 did, felly darn o gof, darn o gof, darn o gof, darn o gof. A'r modd y llinyn yn cael ei weithredu yw drwy roi cymeriad cyntaf yma, yna yma, yna yma, yna yma, gefn wrth gefn wrth gefn er cof y cyfrifiadur. Felly, os ydych eisiau i sillafu allan gair fel HELO, byddech yn rhoi cymeriad 1 H, Yna, E, yna i'r Ch ac yna i'r Ch, yna O - 5 nod i gyd - rhywle yn RAM eich cyfrifiadur. Ond mae'r manylion allweddol yma yw eu bod yn mynd i fod yn gefn wrth gefn wrth gefn i gefn, dde nesaf at ei gilydd. Pan pan fyddaf yn dweud s [i], beth yn Saesneg yw hyn yn rhoi i mi? Beth mae s [i] cynrychioli yn yr achos hwn? Yeah. [Myfyrwyr] Y cymeriad ith yn y llinyn. >> Yn union. Mae cymeriad ith yn y llinyn. Yn awr, i yn mynd i ddechrau ar 0 yn unol fy gyfer ddolen yma, ond mae hynny'n dda oherwydd mae popeth yn dechrau cyfrif o 0. Felly s [0] yn mynd i gynrychioli'r H llythyr mewn gair fel HELO, s [1] yn mynd i gynrychioli llythyr fel E mewn gair fel HELO, ac yn y blaen. A beth rydym yn ymddangos i fod yn ei wneud ar bob fersiwn o hwn yn ddolen yn cael ei storio dros dro cymeriad ith mewn newidyn a elwir yn c, sydd ychydig golosg, ac yna rydym yn argraffu c felly ar ddiwedd y dydd beth mae hyn yn rhaglen yn ei wneud yw y canlynol. Os byddaf yn mynd i mewn i'r cyfeiriadur ffynhonnell ac rwy'n gwneud string1 ac rwy'n mynd yn ei flaen ac yn rhedeg string1, ac yna mi deipio gair fel HELO, Mewnbynnu, i gyd mae'n ei wneud yw argraffu'r gymeriad 1 ar y tro. Felly, mae cyfle i fireinio yma. Rwy'n fath o wneud mwy o waith, hyd yn oed er ei fod yn fwy eglur efallai y modd hwn, nag sydd raid. Pa linell o god yma yn ôl pob tebyg daflu i ffwrdd yn gyfan gwbl? Yeah. Llinell 24. Yn llinell 24 Rwy'n datgan c amrywiol. Rwy'n storio cymeriad ith y sydd ynddo, ond yna rwy'n ei ddefnyddio c yma. Felly rwy'n defnyddio c, felly yr wyf yn teimlo fel na all Fi jyst daflu i ffwrdd llinell 24. [Myfyriwr yn Anghlywadwy] >> Yn union. Felly, pan ddaw i siarad am y cynllunio rhaglenni, sylwi ar hyn symleiddio ychydig o'r cod, sydd yr un mor ddarllenadwy, ond yn sylweddoli fod ef yn unig newidyn, y math o ddata yn array, felly s [i] yn unig yn mynd i yn syth i chi ddychwelyd y cymeriad ith yn y llinyn. Ac os ydych chi am ei argraffu, mae hynny'n iawn. Mae'n rhaid i chi ddefnyddio c% oherwydd nad ydych yn argraffu llinyn, eich bod yn argraffu cymeriad mewn llinyn, ac mae hyn hefyd yn cael yr effaith o argraffu cymeriad ith. Ac yn dwyn i gof yr unig wahaniaeth mewn gwirionedd ers yr wythnos diwethaf gyda defnyddio printf yw bod ond yn ystod yr wythnosau diwethaf y byddem yn gwneud rhywbeth super syml fel dalfan y% s yna enw'r llinyn yma, yn awr rydym yn deifio mewn ychydig yn ddyfnach o dan y cwfl a dweud, peidiwch ag argraffu y llinyn; argraffu'r cymeriad unigol ynddo. Felly, gallwn wneud rhywbeth ychydig yn wahanol yma oherwydd mae 1 arall - nid bug oherwydd bod y rhaglen hon yn iawn, ond fy mod yn gwneud rhywbeth twp y soniais amdanynt yn fyr ar ddydd Mercher. Ond wrth edrych yn ôl, gallai sut mae dyluniad y rhaglen hon yn cael ei gwella hyd yn oed ymhellach? Yeah. [Ymateb y myfyrwyr Anghlywadwy] >> O, yn dda. Felly, yn cofio inni gyflwyno newidyn 2 elwir n tro diwethaf, sy'n ymddangos i fod yn gwrth ein hunain oherwydd fy nod eiliad yn ôl yn unig oedd i daflu i ffwrdd newidyn yn ddiangen, ond dwyn i gof bod ar ddydd Mercher yr ydym mewn gwirionedd yn gwneud hyn. I newid y ddolen am i mewn gwirionedd yn cael coma yma, yna n = strlen, ac yna draw fan hyn wnes i > [Anghlywadwy ymateb y myfyrwyr] >> Yn union. Dydw i ddim yn cofio strlen eto ac eto ac eto oherwydd dwyn i gof sut y ddolen ar gyfer gwaith. Hyd yn oed os ydynt yn dechrau cael mwy cymhleth-edrych, dwyn i gof bod y peth cyn y colon cyntaf yw y initialization, sy'n digwydd unwaith. Mae cyflwr, fodd bynnag, yn y canol, ac mae hyn yn cael ei gwirio bob tro y byddwch yn mynd drwy'r ddolen. Felly, mae'n fath o dwp i fod yn gofyn y cyfrifiadur yr un cwestiwn eto ac eto - Beth yw hyd y HELO? Beth yw hyd y HELO? Beth yw hyd y HELO? - oherwydd fel y byddwn yn gweld heddiw ac ar ddydd Mercher, mae hyn yn bendant yn mynd i gymryd amser, ac nid yw'n ddefnydd da iawn o amser oherwydd i chyfrif i maes hyd y llinyn mewn gwirionedd yn cymryd ychydig o ymdrech. Dyw hi ddim y pryd, fel y mae mewn rhai ieithoedd. Felly, drwy newid hyn i n, y pris rwy'n ei dalu yw beth? Rydym yn gweld fasnach-off yma. Gallaf arbed amser drwy beidio â gofyn y cwestiwn damn un fath eto ac eto, ond mae'n mynd i gostio i mi rhywbeth, sef yr hyn? [Myfyrwyr] Byddwch yn colli rhywfaint o gof. >> Yn union. Mae'n mynd i gostio i mi peth cof. Felly, yn yr achos hwn mae'n costio i mi beth? 32 o ddarnau oherwydd n yn unig yw int, fel a awgrymir gan y int gair yma. Ond a yw hynny'n iawn? A dweud y gwir, mae hynny'n debyg iawn oherwydd os ydych yn meddwl am y peth, po hiraf y llinyn yw, y mwy o amser Rydw i'n mynd i fod yn gwastraffu oherwydd strlen yn mynd i cael eu galw unwaith eto ac eto ac eto ar gyfer pob iteriad y ddolen. Ac y dyddiau hyn, fy Mac wedi 2 gigs o RAM, mae'r diwrnod 4 gigs o RAM weithiau. Rwy'n meddwl y gallaf fforddio 4 o'r bytes i mewn gwirionedd gyflymu pethau. Ond mae hyn yn mynd i fod yn fasnach-off ac yn thema gwirioneddol mewn rhaglenni ac mewn gwyddoniaeth gyfrifiadurol o byth yn wir yn mynd unrhyw beth am ddim. Os ydych am wella rhywbeth yma, rhaid i chi dalu ar ei gyfer yn y llaw arall rhywsut. Gofod yn erbyn amser yn yr achos hwn. Felly, mae hyn yn i gyd yn arwain i fyny tuag at rywbeth cryptig fel hyn, sydd, fel chithau mae'n debyg cyfrifedig allan erbyn hyn, mewn gwirionedd yn dweud? [Ymateb y myfyrwyr Anghlywadwy] >> Yeah, felly mae hwn yn, Byddwch yn siwr i yfed eich Ovaltine, mewn gwirionedd gan ddefnyddio algorithm a elwir yn ROT13, ROT 1-3, a dim ond yn golygu cylchdroi pob un o'r llythyrau 13 o leoedd, sy'n golygu cymryd A ac yna ychwanegu 13 i iddo a mynd dot, dot, dot yr holl ffordd i'r llythyr 13eg i ffwrdd, yn gwneud yr un peth i B ac ar gyfer C a D ac yn y blaen. Ac felly os ydym mewn gwirionedd yn trosi hyn yma gan ddefnyddio symudiad o 13 o leoedd, byddwn yn mynd yn ôl yr hyn a oedd Ralphie bach, a oedd, Byddwch yn siwr i yfed eich Ovaltine. Ond yn awr ar gyfer problem gosod 2, yn y rhifyn safonol o leiaf, rhaid i chi math o gwneud hyn enciphering eich hun, a rhaid i ni rywsut gymryd mewnbwn fel hyn ac amgryptio neu ei dadgriptio. Felly, pa un o'r rhain yn fath hanfodion yn ein harwain at y cyfle hwnnw? Gadewch i ni edrych ar y drydedd enghraifft yma. Yn gyntaf oll, fe'i gelwir yn ASCII. Beth mae ASCII gyfeirio'n ôl at? Cod American Standard ar gyfer Cyfnewidfa Gwybodaeth, sy'n ffordd hir iawn o ddweud beth? Beth yw ASCII? [Ymateb y myfyrwyr Anghlywadwy] >> Beth sy'n bod? >> [Myfyrwyr] Mae map cymeriad. >> A map cymeriad. 'I jyst mapio niferoedd i lythyrau oherwydd bod y byd wedi safoni beth fydd rhifau cynrychioli'r hyn llythyrau fel y gall pob un ohonom yn defnyddio cyfrifiaduron ac mae ein rhaglenni i gyd yn unig cyd-fynd pan ddaw i argraffu pethau ar y sgrin. Felly cofio bod 65 yn digwydd cynrychioli A, roedd 97 yn digwydd cynrychioli lythrennau bach a. Ac felly y rhaglen syml yma ASCII yn cymryd mantais o'r ffaith honno - bod y byd yn gwybod bod cyfalaf A yn 65 oed - ac mai dim ond argraffu'r mapio. Felly, cyn i ni plymio i mewn y Cod hwn, gadewch i mi yn lle agor ffenestr terfynell. Gadewch i mi fynd yn ei flaen ac yn gwneud ASCII, ac yna gadewch i ni dim ond yn rhedeg y peth yn unig i ddifetha yr allbwn. A 'i jyst yn gwneud hyn: siart mawr iawn mai dim ond dweud wrthyf yr holl godau amrywiol gyfer pob un o'r llythyrau amrywiol. Felly, mae rhaglen syml super, ond nid oedd rhaid i mi cod caled y rhai 52 llinellau o allbwn: 26 priflythyren, 26 llythrennau bach. Yn lle hynny, yr wyf yn gwneud hyn programmatically gyda chwpl o ddolenni. Hysbysiad beth wnes i yma. I bwysleisiodd o fi yn 65 oed ar hyd at 65 + 26 oherwydd roeddwn i eisiau argraffu 26 o lythyrau yn yr wyddor Saesneg, i + + ar bob iteriad, ac yn awr sylwi ar hyn eto. Mae'n digwydd eto ein stereoteipio ffrind lle rydych yn newid 1 Data fath i un arall oherwydd yr hyn ydw i eisiau ei wneud yn y rhaglen benodol hon? Rwyf am i gyfrif niferoedd oherwydd dyna sut yr wyf yn magu cyfrif - 65, 66, 67, ac yn y blaen - ond nid wyf am i argraffu dim ond y rhifau. Rwyf am i argraffu'r lythyren ac yna gan y nifer. Rwyf eisiau argraffu A: rhif, B: rhif, ond gallaf wneud hyn gyda'r newidyn union yr un. Felly, yr wyf argraffu c% fel dalfan ar gyfer cymeriad, D% fel dalfan ar gyfer digid neu rif. Yna beth ddylwn i ei blygio i mewn ar gyfer y 2 bachau? I plwg cyntaf yn yr hyn sy'n cyfateb i gymeriad, ac yna yr argraffu i ei hun. Felly sylwi ar hyn hefyd dim ond yn gweithio. Yn union fel y gallaf fwrw o'r fflôt i int er mwyn mynd o nifer go iawn i cyfanrif, yma gallaf fynd o int i torgoch, sef ychydig yn rhyfedd - nid yw'n hollol mapio ar y byd go iawn - ond mewn cyfrifiaduron golosg yn unig yw rhif o dan y cwfl, felly rydym ni'n cael erioed mor amlwg yma at y cyfrifiadur, gan ddywedyd, printf, nid argraffu i fel 65, argraffwch hi fel ei cyfatebol rhifol. Ac mae'n troi allan yr wyf yn dechnegol hyd yn oed angen hyn. Beth oeddwn yn ei wneud funud yn ôl yn benodol bwrw drwy nodi pa fath o ddata Dw i eisiau mynd o ac i. Ond sylwi fy mod eisoes yn cael y placeholder c% ac mae hyn yn dalfan c% arall yma. Er nad yw hyn yn int, mae'r cyfrifiadur yn sylweddoli bod golosg, 'i' jyst yn int o dan y cwfl. Felly, os wyf mewn gwirionedd yn ail-grynhoi hyn ac ailgynnal y rhaglen ASCII, sylwi ei fod yn dal i jyst yn gweithio oherwydd bod y cyfrifiadur yn sylweddoli bod yna ohebiaeth hon. Nawr, mae'n fwy pwysig i wneud y castio yn amlwg yn y byd o fflotiau i ints oherwydd bod eich bod mewn gwirionedd yn gwneud penderfyniad cyfrifo: taflu i ffwrdd popeth ar ôl y pwynt degol. Yma mae 'n sylweddol ddim i daflu i ffwrdd oherwydd bod cymeriad yn unig yw rhif, a llinyn yn unig yw amrywiaeth o gymeriadau. Felly pan ddaw amser i weithredu rhai amgryptio neu dadgriptio, sut y caiff ei bod yn gallu mewn gwirionedd yn gyfieithu rhywbeth fel hyn nonsens i, Byddwch yn siwr i yfed eich Ovaltine? Beth os ydym yn gwybod ar hyn o bryd - gadewch i ni gymryd fel rhagdybiaeth - bod y allweddol, y nifer a rydym yn cylchdroi pob un o'r llythyrau gan, yw'r rhif 13? Felly, rydym yn mynd oddi wrth y llythyren B yr holl ffordd i S ar ddechrau'r frawddeg, Byddwch yn siwr i yfed eich Ovaltine, oherwydd os wyf yn gwneud B ac yna yr wyf yn mynd C, D, E, F, G, H, I, J, K, L, M, N, O, dyna pam y amgryptio y llythyren B yn dod O oherwydd Fi jyst ychwanegu 13 i iddo. Felly, os ydw i eisiau dadgryptio hyn, yr wyf yn y bôn yn rhaid i gymryd O ac yna tynnu 13 o ohono. Neu, a dweud y gwir, oherwydd mae 26 o lythyrau yn yr wyddor, mae hyn yn rhyfeddol gymesur, gallwn hefyd dim ond ychwanegu 13 a byddwn yn mynd yn ôl i'r llythyr B. Ond sut mae mynd ati i weithredu rhywbeth fel hyn yn Caesar neu mewn gwirionedd trin llinynnau yn gyffredinol? Os yw'r llythyren B yw pa rif? Beth yw'r B llythyr? Felly mae'n 66, dde? Felly, os y llythyr A yn 65 oed ac mae'r llythyren B yn 66, felly 66, i gyd yn rhaid i mi ei wneud yw ychwanegu 13 i hynny, ac mae hyn yn rhoi i mi 79. Ac os ydym yn mynd at ein taflen twyllo ychydig, 79 yn wir mapiau ar O. Ond mae ychydig o achos cornel yma. Beth yw, dyweder, y llythyr Z? Os ydym yn ei wneud 66 + 25 i gael yr holl ffordd i ddiwedd y wyddor, ein bod chi yn 91. 91 + 13 yn rhoi i mi 104, a dyfalu beth? Nid yw 104 yn hafal llythyr priflythyren. Gadewch i ni fynd yn ôl i daflen twyllo ychydig yma. Os byddaf yn ailgynnal y rhaglen hon yn yr hysbysiad offer bod 104, os byddaf yn mynd yn ôl at y ffenestr derfynell, 104, mae'n debyg, h llythrennau bach. Felly, mae angen rhywfaint o tric allweddol yma er mwyn gwneud yn siŵr bod pan fyddwn yn dechrau ar Z ac rydym yn ychwanegu 13 i nid ydym am i ychydig chadw bwrw ymlaen i niferoedd mwy ac yn fwy. Beth ydym yn wir eisiau ei wneud? Rydych am i lapio o gwmpas. Felly, mae'n troi allan, fel yr ydych wedi gweld yn ôl pob tebyg yn adran awr neu yn y set problem fanyleb ei hun sylweddoli bod y gweithredwr arall yn C sydd hefyd yn arwydd y cant, ond tra rydym wedi defnyddio% yma i bennu dalfan, yn gwybod hynny, yn enwedig ar gyfer 2 set problem, mae hefyd yn rhywbeth fel hyn: int x% y = z. Gadewch i mi gyflwyno hyn fel ffurf generig iawn o hyn. Canran yn golygu beth mewn iaith raglennu? >> [Myfyrwyr] modwlo. Modwlo, sy'n ffordd ffansi o ddweud y gweddill. Hyd yn oed er mae yna wahaniaeth bach gyda'r diffiniad yno, mae hyn yn golygu rhannu gan y z ond nid ydynt yn dychwelyd y canlyniad y rhanbarth hwnnw; yn lle hynny, dychwelyd y gweddill. Felly, os y gwirionedd yn 3 a z mewn gwirionedd yn 2, 3 wedi'i rannu â 2 yn 1 gyda gweddill o 1, felly, beth mae x mewn gwirionedd yn gyfartal yn y sefyllfa hon? 1. Mae hwn yn fath syml, lefel isel syniad. Mae'n cymryd ychydig o amser i gael eich meddwl lapio o amgylch ei oherwydd ei fod wedi bod yn ôl pob tebyg ychydig ers i chi hyd yn oed wedi i ofalu am y gweddill ac mewn gwirionedd yn eu defnyddio ar gyfer rhywbeth pwrpasol, ond yn yr achos hwn y ffaith syml y gallwch fynd o nifer mawr fel 3 i nifer cymharol fach fel 2 ac yna lapio o gwmpas yn effeithiol trwy ddefnyddio'r gweddill at werth llai fel 1 yn mynd i fod yn tric amhrisiadwy y gallwn eu defnyddio ar gyfer rhywbeth fel Caesar, ac mae hyn Vigenere beth arall mewn datrys gosod 2, ond mae hyn yn mynd i fod yn tric dro ar ôl tro drwy gydol y semester. Mae hyn yn syml, syniad syml o ddim ond gymryd y gweddill yn gyffredinol yn mynd i ganiatáu i ni i lapio o gwmpas. Ac wrth i ni ddechrau chwarae mwy gyda arrays, wrth i ni ddechrau chwarae mwy â'r cof ei hun, hyn yn mynd i ddod yn fwy a mwy o tric pwerus. Felly unrhyw gwestiynau yna ar ASCII neu gynrychiolaeth o linynnau fel araeau? A byddwn yn mynd ag ef i fyny 1 radd ymhellach. Yeah. [Gwestiwn myfyrwyr Anghlywadwy] >> Cwestiwn da. Beth mae'n ei olygu pan newidyn yn cael seren o'i flaen? Gadewch i mi ateb y gohirio mewn unrhyw fanylder, ond sy'n cyfeirio at bwnc a elwir yn pwyntydd. Pointers wedi ei wneud gyda cof, ac rydym mewn gwirionedd heddiw cymryd y cam cyntaf tuag at y drafodaeth honno, ond ar hyn o bryd, gadewch i mi esgus nad yw'r seren yn bodoli a byddwn yn parhau galw llinynnau llinynnau yn hytrach na defnyddio * torgoch, yr ydych wedi gweld yn ôl pob tebyg o'r blaen a byddaf yn eu rhoi ar y sgrîn mewn dim ond hyn o bryd fel teaser. Felly, byddwn yn dod yn ôl i hynny'n fanwl ffordd fwy fydd na llawer ohonoch mae'n debyg ei hoffi. Nid Yn y pen draw, heddiw. Yeah. [Gwestiwn myfyrwyr Anghlywadwy] Ym mha gyd-destun oes rhaid i chi ddarparu yr arwydd ar gyfer cymeriad? >> [Myfyrwyr] Yeah. Felly, yn ddiofyn, pan nad ydych yn rhoi +, dim ond rhifau positif yn cael eu cymryd yn ganiataol. Felly, os dim ond ysgrifennwch y rhif 1, mae'n 1 cadarnhaol. Os ydych chi mewn gwirionedd yn awyddus i bennu negyddu gwerth, yn llythrennol yn rhaid i wneud -1 ar eich bysellfwrdd. Ond nid yw hyn yn ôl pob tebyg yw eich cwestiwn. >> [Anghlywadwy ymateb y myfyrwyr] Da cwestiwn. Iawn. Felly, mae hyn wedi ei wneud, yr wyf yn casglu, gyda rhyw fath o nam rydych yn rhedeg i mewn i oherwydd eich bod yn troi cyfanrif i gymeriad, ond rhywsut negyddol cymryd rhan, ac felly mae'r cymeriad yn unig yn dod allan munged rhywsut. Felly, ar hyn o bryd, gadewch i mi gorsymleiddio'r ychydig hyd nes y byddwn yn dychwelyd at y math hwn o pwnc. Am y tro, meddwl am bethau fel hyn - ac mae hyn yn gorsymleiddio. Ond yn y byd o gyfanrif, mae gennych sawl darnau ar gael i chi? Mae gennych 32 catiau. Ac hyd yn hyn, rydym wedi siarad am y nifer cyfanswm o gyfanrifau felly gallwch gynrychioli yn fras 4 biliwn mewn cyfanswm oherwydd eich bod wedi 32 darnau, felly dyna 2 i 32, felly dyna tua 4 biliwn. Ond gwelsom yr wythnos neu 2 yn ôl nad ydych ddim yn cael amrywiaeth o rifau o 0 ar hyd at 4 biliwn. Mae'r amrediad yn hytrach na mynd o tua negyddol 2 biliwn i cadarnhaol 2 biliwn. Ond mae hynny'n codi'r cwestiwn, sut ydych chi'n cynrychioli y syniad o negyddol 2000000000 heb sôn negyddol 1? Am nawr, gallwn gorsymleiddio'r a dim ond dweud ein bod yn mynd i ddefnyddio y rhan leftmost o'r rhai 32 catiau, ac os yw'n 1 ei fod yn rhif negatif, ac os yw'n o 0 mae'n rhif positif. Y broblem gyda hynny chynrychiolaeth symlach o rifau negyddol yw os oeddech yn fwriadol fod yn glyfar ac yn ceisio troi o gymeriad i nifer neu i'r gwrthwyneb, nid oes y fath beth fel cymeriad negyddol. Yn y byd o ASCII, sy'n defnyddio dim ond 8 did, pob un o'r 8 o'r rheiny mater darnau, a'r did leftmost wedi ddim i'w wneud â negyddiaeth. A dim ond i fod yn glir, pan fyddaf yn dweud darnau leftmost, cofio pan wnaethom ein rhan-gysylltiedig enghreifftiau yn yr wythnos gyntaf yn cofio i ni dynnu pethau fel 1001101, rhywbeth fel hyn. Pan fyddaf yn dweud y darn leftmost, Fi jyst yn llythrennol yn golygu 1 eich bod yn ysgrifennu yr holl ffordd drosodd i'r chwith. Felly, yn y byd o gymeriadau nid oes unrhyw syniad o negyddiaeth, fel bod ychydig yn leftmost mewn gwirionedd wedi rywbeth i'w wneud â ASCII, dim i'w wneud â negyddiaeth. Felly, mae'n swnio fel - ac allan o'u cyd-destun mae'n anodd i ateb yn union - ond rywsut, eich cod yn ddryslyd ychydig yn leftmost yn cynrychioli gwerth negyddol pan fo gwir oedd yn rhan o gymeriad dan sylw. Ac eto, yr wyf i'n gorsymleiddio oherwydd bod cyfrifiaduron mewn gwirionedd yn gwneud rhywbeth ychydig yn fwy ffansi na dim ond newid ychydig yn leftmost at 1 am arwydd negyddol yn erbyn o 0. Maent yn lle hynny, os ydych chi'n chwilfrydig i Google, defnyddio rhywbeth a elwir fel arfer 2 ategu, sydd ychydig yn fwy soffistigedig o ymagwedd ond mae'r syniad yn y pen draw yr un fath. Felly, yn fyr, roedd yn rhaid i wneud â'r ffaith eich bod yn massaging rhif i gymeriad neu nid i'r gwrthwyneb, ond eich cod yn ymwybodol o'r ffaith bod 1 o'r rhai darnau oedd arwyddocâd yn y byd rhifol. Nid yw hyn yn wir yn y byd cymeriad. Ond mae'n swnio fel sefydlog i chi, ac yn yr achos dadleuol nawr. Cwestiynau eraill. Iawn. Hyd yn hyd yn hyn, mae pob un o'r rhaglenni rydym wedi ysgrifennu wedi cymryd mewnbwn efallai gan y defnyddiwr ar ffurf swyddogaethau fel GetInt, GetString, neu os ydych wedi bod yn darllen ymlaen mewn llyfrau amrywiol neu gyfeiriadau ar-lein, efallai y byddwch eich hunain wedi defnyddio swyddogaethau fel scanf sydd, a dweud y gwir, rydym yn defnyddio yn y llyfrgell CS50. Ond mewn wythnos neu 2, byddwn mewn gwirionedd yn dangos i chi sut mae'r llyfrgell CS50 yn cael ei weithredu fel y gallwn gymryd y olwynion hyfforddiant i ffwrdd yn gyfan gwbl. Ond mae'n troi allan yna ffordd arall i gael mewnbwn gan ddefnyddiwr. Yn wir, rydym ni ein hunain wedi bod yn defnyddio dadleuon llinell orchymyn am ychydig o wythnosau bellach. Bob tro yr ydym wedi cynnal Clang neu ein bod wedi rhedeg ei wneud, Nid ydym wedi teipio yn unig clang, Mewnbynnu, nid ydym wedi teipio wneud, Enter. Beth ydym ni wedi ysgrifennu fel arfer ar ôl y gair clang yn ein terfynell ffenestri brydlon? [Myfyrwyr] Yr enw ffeil. >> Mae'r enw ffeil, dde? Hello.c neu mario.c neu beth bynnag yr enw ffeil berthnasol yw. Ac yn yr ystyr hwnnw yr hyn yr ydych wedi ei wneud mewn gwirionedd yn eich bod wedi dylanwadu ar ymddygiad Clang oherwydd yn sicr y bobl a ysgrifennodd Clang ganddi ddim syniad bod ychydig yn hen chi yn mynd i ysgrifennu rhaglen o'r enw mlynedd mario.c yn ddiweddarach. Felly, bu'n rhaid i chi rywsut ddylanwadu ar ymddygiad y rhaglen honno, a bod Clang rhaglen wedi cael ei hysgrifennu yn y fath fodd fel y gellir derbyn mewnbwn oddi wrthych drwy ychwanegu geiriau ar y brydlon cyn y hits defnyddiwr Enter. Felly, mae'n troi allan bod ers peth amser rydym wedi bod yn datgan bron pob un o'n rhaglenni i ddechrau fel hyn - prif int (gwag) - ac yna rydym wedi mynd ymlaen a dechreuodd ysgrifennu ein cod. Ac efallai y byddwn yn cael rhywfaint o miniog yn cynnwys ar ben y ffeil, ond mae bron pob un o'n rhaglenni hyd yn hyn wedi dechrau gyda hyn hyd yn oed er efallai y byddwch wedi gweld yn adran, mewn llyfrau, cyfeiriadau ar-lein nad yw hyn yn mewn gwirionedd yn ddi-rym. Ffurf arall dilys i hyn gymryd yn int argc ac yna string argv []. Felly, yn awr beth mae hyn yn awgrymu? Mae'n troi allan y argc, sef confensiwn ddynol - gallech ei alw'n hyn foo, ond byddai'n dim ond yn llawer llai eglur i ddarllenwyr - argc yn unig yw dadl i swyddogaeth a elwir yn brif beth sy'n cynrychioli? Beth mae argc sefyll am ar gyfer y rhai sy'n gyfarwydd? [Ymateb y myfyrwyr Anghlywadwy] >> Yeah, nifer o ddadleuon neu gyfrif ddadl. Mae mor syml â hynny. Faint o ddadleuon gael eu trosglwyddo i'r rhaglen hon? Beth mae hynny'n ei olygu? Os ydynt ar y llinell orchymyn yr wyf wedi rhedeg rhywbeth fel hyn - clang mario.c-- argc pan fyddaf daro Enter yn mynd i gymryd ar werth, braidd yn ddryslyd, 2. Felly, mae'n troi allan bod argc yn cyfrif ddadl, ond am resymau hanesyddol, enw'r rhaglen ei hun yn cael ei gynnwys yn y cyfrif. Felly argc yw 2 pan ysgrifennais clang mario.c. Beth mae argv ei gynnwys? Yn gyntaf oll, argv edrych fel llinyn ond nid yn eithaf oherwydd o ddydd Mercher diwethaf ac yn fwy heddiw, hyn cromfachau sgwâr dynodi beth? Dyna arae. Does dim rhif yn y casgliad, a ddylai fod yn gwneud synnwyr yn reddfol oherwydd bod y bobl a ysgrifennodd mlynedd yn ôl Clang sicr nid oedd syniad faint o bobl geiriau fel ni deipio wrth yr anogwr cyn taro Enter. Felly, yn yr achos hwn dyma nhw wedi datgan prif swyddogaeth fel cymryd amrywiaeth o ddadleuon, 0 neu fwy o ddadleuon. Nid ydynt yn gwybod ymlaen llaw faint ohonynt sydd, felly nid oes dim yn fwriadol y tu mewn nifer o'r cromfachau sgwâr. Ond y ffaith bod y cromfachau sgwâr yno yn dweud wrth y cyfrifiadur, disgwyl arae. Argv yn unig nodiant fector llaw fer ar gyfer dadl. Mae fector yn ffordd ffansi o ddweud array, ac amrywiaeth yn ffordd ffansi o ddweud rhestr neu gasgliad. Felly, mae hyn yn unig yn golygu os byddwch yn ysgrifennu phrif fel hyn yn hytrach na fel sut rydym wedi bod yn gwneud hynny ar gyfer yr ychydig o wythnosau diwethaf, eich rhaglen yn awr y pŵer i dderbyn dadleuon llinell gorchymyn fel nad ydynt bellach yn rhaid i chi ei ysgrifennu Mario ac yna pwyswch Enter, yna teipiwch mewn nifer ar gyfer faint o flociau uchel ydych am i'r pyramid i fod, yna pwyswch Enter eto. Nid ydym yn hyd yn oed angen i ddefnyddio GetString anymore neu GetInt neu GetFloat ar gyfer y mater. Gall Rydym yn unig yn disgwyl i'r defnyddiwr i deipio geiriau hynny wrth yr anogwr ei hun yn union fel y awduron Clang penderfynu y byddai'n fod yn rhaglen wirioneddol yn blino os i lunio eich cod chi yn gyntaf clang teipio, pwyswch Enter, yna rydym yn dweud wrth y defnyddiwr, os gwelwch yn dda teipiwch enw'r ffeil rydych am ei lunio, yna rydym deipio i mewn mario.c a daro Chofnoda. Ond dyna'n union beth rydym wedi bod yn ei wneud i'n defnyddwyr yr ychydig o wythnosau diwethaf. Rydym yn defnyddio GetString ac rydym yn aros nes bod y rhaglen yn rhedeg i'w hannog ar gyfer mewnbwn. Nad oes bellach angen i fod yn wir. Felly, yn yr enghraifft hon yma, mae gennym bellach llinyn argv, ac mae hyn hefyd yn gorsymleiddio, olwynion hyfforddiant a fydd yn fuan iawn yn dod i ffwrdd. Dyma'r ffordd fwy priodol o ysgrifennu datganiad hwn amgen o brif oherwydd ei fod yn troi allan bod yr hyn yr ydym yn cadw galw llinyn mewn gwirionedd wedi seren, seren, yn ei ddiffiniad ei hun, ond mae hyn yn edrych yn gymhleth, mae'n ddryslyd ar y dechrau, felly rydym yn symleiddio trwy dim ond creu gyfystyr o fath yn y llyfrgell CS50 bod mapiau * torgoch i'r llinyn yma gair yn fwy defnyddiwr-gyfeillgar. Felly, gadewch i ni mewn gwirionedd rhowch gynnig ar hyn bryd hynny. Gadewch i mi fynd yn ei flaen ac yn agor i fyny gedit yma. Gadewch i mi fynd yn ei flaen ac yn agor argv o 1. Mae'r rhaglen hon yn ymddangos yn argraffu'r dadleuon, ond o ran Saesneg, drwy edrych ar y cod hwn, beth mae hyn yn ei wneud yn fwy penodol? Os wyf yn fath yn y gorchymyn a.out foo bar, yr hyn sy'n cael ei argraffu yn fy ffenestr ddu a gwyn? A.out foo bar, Enter. Mynd yn ei flaen. Yeah. >> [Anghlywadwy ymateb y myfyrwyr] Da. Felly a.out, llinell newydd, foo, newydd llinell, bar, llinell newydd. Pam fod hyn? Gallwn yn sicr gadarnhau mewn dim ond hyn o bryd. Mae hyn yn fath o linell fluffy o god.  'I jyst yn argraffu llinell newydd dim ond er mwyn gwneud pethau'n prettier ar y sgrin. Mae hwn yn ddolen sydd wedi ailadrodd o 0 ar hyd at argc, ac mae hyn yn incrementing ar bob iteriad + +. Felly, mae hyn yn awr yn dweud argraffu llinyn, fel a awgrymir gan y% s. Argv [i] 'n bert lawer yr un syniad gan yr enghraifft flaenorol. Rydym yn eu defnyddio i alw y au amrywiol; nawr mae'n cael ei alw, fympwyol, argv. Mae hyn yn golygu argraffu'r ddadl ith a teipio ar y llinell orchymyn, ac yna ar ôl y peth i gyd yn cael ei wneud, dim ond ar gyfer mesur da argraffu llinell arall newydd. Felly, gadewch i ni weld hyn. Gadewch i mi agor y ffenestr terfynell. Gadewch i mi lunio argv o 1, ac yn awr gad i mi redeg argv o 1, Enter. Hmm. Iawn. Gadewch i ni redeg foo bar. Diddorol. Baz. Ac os ydych chi erioed wedi meddwl pam yr wyf yn teipio hwn, yn unig yw hwn hefyd yn gonfensiwn gwyddoniaeth gyfrifiadurol dwp. Mae'r byd yn aml yn angen dim ond bachau ar lafar am eiriau. Felly, os ydych am siarad am rai llinyn generig, gwyddonwyr cyfrifiadurol yn unig, yn tueddu i ddweud foo pan fydd angen gair ar hap, wedyn maent yn dweud bar os ydynt angen gair ar hap ail wedyn maent yn dweud Baz os ydynt angen trydydd gair, yna maent yn dweud qux os bydd angen gair pedwerydd, ac yna mae 'na ar-lein dadl grefyddol enfawr o ran yr hyn a ddaw ar ôl qux, fel y gallwch Google bod at chyfrif i maes yr hyn y dylai'r gair fympwyol eraill. Ond mae'r rhain yn cael unrhyw ystyr o gwbl, er foo bar, os ydych yn Google hynny, fod oes gan ystyr, sy'n rhan o'r tarddiad yma. Felly, hyn i gyd yn ei wneud, yna yn argraffu 1 o'r llinynnau fesul llinell. Felly, os wyf yn lle hynny, fodd bynnag, yn awyddus i gael ychydig yn fwy ffansi, Mae'n debyg nad oeddwn eisiau argraffu pob llinyn fesul llinell; Roeddwn i eisiau argraffu pob cymeriad o bob llinyn y llinell. Sut gallwn i yn hytrach na gwneud hynny? Beth sydd angen i mi newid am y rhaglen hon os ydw i eisiau argraffu nad yw pob gair ond yr wyf eisiau argraffu pob llythyren gair trwy lythyr trwy lythyr, yna bydd y llythyr gair nesaf drwy lythyr drwy lythyr? Sut rydym yn cyfuno syniadau hyn hyd yn hyn? Yeah. [Myfyrwyr]% c. >> Mae pob hawl. Felly mae angen rhywle c%. Da, oherwydd nid wyf eisiau argraffu llinynnau cyfan, rwyf eisiau argraffu cymeriadau. Beth arall? [Ymateb y myfyrwyr Anghlywadwy] >> ddiddorol. Felly, mae angen rhyw fath o ail ddimensiwn yma nawr oherwydd feddwl am argv fel array, ond ei fod yn amrywiaeth o linynnau. Ond fel y, fel, 15 munud yn ôl, beth llinyn? Mae'n amrywiaeth o gymeriadau. Felly mewn gwirionedd, argv llu o amrywiaeth o gymeriadau, amrywiaeth o araeau o gymeriadau. Felly, mae'n troi allan y gallwn ddefnyddio nodiannau braced yn unig yn fwy sgwâr. Felly, gadewch i ni wneud hyn. Yn frig y ddolen ar llinell 19, yr wyf i'n mynd i ailadrodd o i fyny i argc, ond yna yr wyf i'n mynd i wneud hyn: gyfer hyn - ni allaf ddefnyddio i nawr. Fi angen newidyn arall oherwydd yr wyf am i ailadrodd dros y geiriau ond yna hefyd dros y llythrennau yn y geiriau felly wyf yn fath o gael echelin fertigol a llorweddol echelin, math o gysyniadol. Felly j int yn cael 0, yna rwyf am wneud j cyhyd ag j yn llai na - a byddaf yn glanhau hyn i fyny mewn ychydig. Sut ydw i'n ailadrodd dros y llythrennau mewn llinyn? Gwnaethom hyn funud yn ôl. Strlen o argv [i]. Da. Ac eto, dwi'n gwneud ychydig o aneffeithlonrwydd yma drwy beidio â chreu n neu beth bynnag, ond byddwn yn dod yn ôl at hynny. Felly nawr j + +. Nawr mae'n rhaid i mi indent pellach yma. Beth ydw i'n eisiau argraffu ar bob iteriad? [Ymateb y myfyrwyr Anghlywadwy] >> Felly, [i] yn rhoi i mi y gair. [I] [j], math o fel matrics. Mae'r rhai ohonoch sydd â mathemateg-y gefndiroedd, rydym yn fath o mynegeio hyd yn oed yn ddyfnach i mewn i'r matrics hwn neu amrywiaeth o araeau, strwythur hwn 2-ddimensiwn. Felly nawr gadewch i ni weld beth sy'n digwydd yma. Gadewch i mi agor fy ffenest terfynell mwy. Gadewch i mi ailadrodd ei wneud o argv o 1. Ac yr wyf wedi sgriwio i fyny yma, sydd yn wers dda oherwydd fy mod yn rhy anghofio i wneud hyn. Ymhlyg yn datgan 'strlen' swyddogaeth llyfrgell C gyda heb eu llofnodi math '- Dydw i ddim hyd yn oed yn gwybod beth yw'r gweddill y mae hynny'n ei olygu, ond yr wyf wedi gweld hyn o'r blaen, ymhlyg datgan. Pryd bynnag y byddwn yn gweld y gwall hwn, beth mae hyn fel arfer yn arwyddo? [Ymateb y myfyrwyr Anghlywadwy] >> Wedi anghofio llyfrgell i fyny top. Ond arhoswch funud. Fel arfer dwi wedi sgriwio i fyny oherwydd fy mod yn anghofio y llyfrgell CS50, ond mae hynny'n yno. Fel arfer dwi wedi sgriwio i fyny am fy mod i wedi anghofio safon I / O. A dweud y gwir, nid wyf yn hyd yn oed angen hyn. Nid ydym yn defnyddio GetString heddiw. Felly, beth ydw i'n methu? Mae lyfrgell arall sydd yn awr mae angen i ddefnyddio string.h a elwir o bryd i'w gilydd, ac mae hyn yn unig yw eto lyfrgell arall sydd â swyddogaethau yn fwy nad ydynt yn safonol I / O. Felly, gadewch i ni fynd yn ôl at fy ffenestr terfynell mawr. Iawn. Yn awr, damn ei, Amcana oeddwn yn anghywir. Roeddwn yn defnyddio'r llyfrgell CS50. Felly gallwn atgyweiria hon yn un o'r 2 ffordd. Gallwn gymryd y olwynion hyfforddiant i ffwrdd ar hyn o bryd a dim ond gwneud hyn, neu gadewch i fath o gadw'r symleiddio yn unig ar hyn o bryd, bastio hwn yn ôl yn, datrys y broblem honno, ac yn awr yn mynd yn ôl at y ffenestr derfynell. Felly i fod yn glir, yn y llyfrgell CS50 yn unig swyddogaethau, mae hefyd y llinyn gair allweddol a dyna pam bod gwall jyst yn digwydd. Felly, yma rydym yn mynd. Yr wyf yn sefydlog ddau o'r materion llyfrgell. Enter. Da. Argv o 1, foo bar, Enter. Ardderchog. Felly, yn awr mae gennym pob llythyren o bob gair printiedig 1 y llinell, nad yw'n gwneud ar gyfer rhaglen diddorol iawn, ond bod rhybudd yn awr mae gennym y gallu nid yn unig ailadrodd dros eiriau ond hefyd dros llythrennau unigol mewn geiriau, sy'n swnio'n ofnadwy cyfarwydd i hyd yn oed y symlaf o geisiadau fel llythyrau sgramblo mewn llinyn fel hyn. Gadewch i ni fynd yn ei flaen ac yn cymryd ein 5-munud egwyl yma. A phan fyddwn yn dod yn ôl, byddwn yn dechrau siarad am effeithlonrwydd gyda y gallwn wneud y pethau hyn yn well. Mae pob hawl. Rydym yn ôl. Diolch i un o'n TFS sy'n chwarae llawer o bananagrams, rydym mewn gwirionedd yn cael criw cyfan o chars gyda ni yma heddiw gorfforol incarnated â'r darnau bach plastig, a gadewch i mi yn cynnig bod y llechi gwyn gwag yma yn cynrychioli y RAM yn fy chyfrifiadur - gliniadur, n ben-desg, beth bynnag - ac mae edrych fel llawer ohono oherwydd os ydym yn dechrau torri i fyny y RAM i mewn i bach beit-maint ddarnau, gadewch i ni fympwyol dweud bod rhywbeth y maint a bod yn cynrychioli blurry - dyna ni, a gadewch i chwyddo allan ychydig bach yma - gadewch i ni ddweud rhywbeth y maint yn cynrychioli beit unigol. Felly, gallwn yn wir ffitio criw cyfan o bytes neu gymeriadau tu mewn y cof, fel yr awgrymwyd gan faint cymharol yma. Felly mae'n debyg yn awr bod y nod yw dyrannu cof ar gyfer llinyn. Sut mae hyn yn gweithio mewn gwirionedd? Yn y rhaglenni rydym wedi bod yn ysgrifennu, rydym wedi arfer bod yn defnyddio GetString, ond erbyn hyn, yn amlwg, mae hwn yn sianel eraill drwy y gallwn gael mewnbwn defnyddwyr yn argv drwy dadleuon llinell orchymyn. Ond beth sy'n wir yn mynd ymlaen o dan y cwfl? Mae'n troi allan os ydym yn galw - gadewch i ni sgrolio yn ôl i GetString - y GetString swyddogaeth yn y llyfrgell CS50, mae'r defnyddiwr yn cael ei annog ar gyfer llinyn, y mathau o ddefnyddwyr mewn rhyw air - gadewch i ni ei alw HELO. Ac rydym wedi bod yn ei ddweud am yr ychydig wythnosau diwethaf fod y gwerth dychwelyd GetString mewn gwirionedd yn llinyn, fel y gair HELO. Ond beth sy'n GetString ei wneud mewn gwirionedd? Gan fod y mathau o ddefnyddwyr yn HELO, Mewnbynnu, GetString yn figuring allan, iawn, faint o gymeriadau yw hwn? Mae hyn yn H-E-L-L-O. Felly mae angen dyrannu, mae angen gofyn y system weithredu - Linux yn yr achos hwn - am o leiaf 5 bytes i storio HELO. A beth wedyn yn mynd yn ei flaen i wneud unwaith y bydd yn mynd yn ôl y 5 bytes o'r system weithredu yw gosod allan HELO gefn wrth gefn wrth gefn wrth gefn. Ac felly beth sy'n dychwelyd fawr o'r GetString yn ddarn o ddata sy'n edrych fel hyn. Ond mae hyn yn ychydig yn anghywir oherwydd ei fod yn troi at y ffaith nad yw mor syml fel dim ond storio HELO yn gof y cyfrifiadur oherwydd mae'n debyg bod fy rhaglen fy mod i'n ysgrifennu yn C, yna galwadau GetString eto, a'r gair nesaf y defnyddiwr mathau mewn yn IS, IS. Wel, mae angen i mi osod y gair-DDEDDFAU rhywle yn y cof. Ni allaf trosysgrifo'r HELO. Er enghraifft, nid wyf am y cyfrifiadur i dim ond dechrau trosysgrifo fel hyn y gair gwreiddiol oherwydd gall y byddaf yn dal yn defnyddio'r gair HELO mewn newidyn rhywle arall yn fy rhaglen. Felly, B-Y-E ddod i ben i fyny yn rhywle arall yn y cof. Ond y confensiwn fel arfer yw bod y llinyn nesaf y byddwch yn dyrannu yn ôl pob tebyg, ond nid bob amser, yn mynd i roi diwedd ar i fyny yn y lleoliad cof nesaf sydd ar gael. Ac os nad wyf wedi gofyn i'r system weithredu ar gyfer unrhyw cof ers y tro diwethaf i mi alw GetString, groes yn y gair-DDEDDFAU yn mynd i roi diwedd ar i fyny dde ar ôl y gair HELO yn y cof. Ond ar y pwynt hwn, efallai y gallwch weld lle mae problem posibl yn codi. Oherwydd bod y darnau nesaf y cof, y bytes nesaf a oedd yn union am ddim - glân llechi gwyn - er cof am y cyfrifiadur yn iawn nesaf i HELO, mae'n teimlo fel y llinyn cyntaf a ofynnais am y gallai newid yn awr yn sydyn oherwydd fy mod wedi newid yn y bôn i HELLOBYE yn hytrach na rhywsut demarcing dechrau'r-DDEDDFAU a diwedd HELO. Felly, mae'n troi allan bod yr hyn sy'n digwydd mewn gwirionedd o dan y cwfl, y gallech wedi cael cipolwg ar mewn cyfeiriadau ar-lein neu adran neu lyfrau neu ddim o gwbl eto yw bod mewn gwirionedd yn llinell derfyn bwriadol rhwng geiriau mewn cof cyfrifiadur. Ac mewn gwirionedd, yn yr achos yma, yn hytrach na dim ond rhoi IS dde nesaf at HELO, yn lle hynny, mae'r cyfrifiadur yn rhoi cymeriad arbennig, cymeriad null arbennig, fel petai, sy'n cael ei gynrychioli gyda marciwr gyda slaes 0. Felly, stori fer hir, dwyn i gof bod cymeriadau yn cael eu cynrychioli yn ASCII. ASCII yn unig yw mapio rhwng rhifau a llythrennau, ac mae'r rhan fwyaf o'r llythyrau hynny yn dechrau tua 65 ar gyfer cyfalaf A, ond mae'n troi allan y gallwch chi yn sicr yn cynrychioli y 0 rhif fel cyfanrif neu mewn deuaidd, ac mae'n troi allan y byd penderfynodd hir, maith yn ôl, "Rydych yn gwybod beth?" "Gadewch i 0 o rif wrth gefn gan nad gynrychioli unrhyw cymeriadau ar y bysellfwrdd - "Unrhyw lythyrau, dim rhifau, dim atalnodi. 0 yn arbennig." "Mae'n mynd i fod yn gymeriad null arbennig, ac rydym yn mynd i'w ysgrifennu fel \ 0." Y gwahaniaeth yw os ydym newydd ei ysgrifennu 0, 0 yn gymeriad. Dwyn i gof bod codau ASCII ar gyfer plant 0, am 1, am 2, am 3 oherwydd bod y 0 cymeriad yn wahanol y 0 rhif. A gallwch weld os ydych yn edrych yn ôl o wythnos 1 pan fyddwn yn gyntaf yn siarad am ASCII, 0 ac 1 a 2 a 3 yr holl ffordd hyd at 9 wedi cael eu codau ASCII eu hunain. Nid ydynt yn, gyd-ddigwyddiad, 0 i 9. Maen nhw'n wahanol iawn. Felly, 0 yn golygu dim ond "Yr wyf yn arbennig," ac y 0 \ modd, yn llythrennol, "Nid fi yw'r cymeriad 0." "Rwy'n hwn werth arbennig, cymeriad null." Felly, Fi 'n weithredol angen un arall o'r rhain gan na allaf wneud yr un camgymeriad ddwywaith. Felly, ar ôl y gair-DDEDDFAU rydym hefyd yn mynd i angen un arall o'r cymeriadau null. Gadewch i mi cydio fy pen yma a gadewch i mi yn gyflym tynnu un arall \ 0 fel bod ar ôl i mi wedi gofyn i'r system weithredu ar gyfer 2 llinynnau trwy GetString ddilyn gan alwad arall i GetString, mae hyn yn beth mewn gwirionedd yn y cof. Felly, pan fyddaf yn mynd yn ôl llinyn, yr wyf i'n mynd yn ôl hynny, a phan fyddaf yn cael y llinyn nesaf, yr wyf i'n mynd yn ôl hynny. Felly, mae hyn yn codi'r cwestiwn, strlen, yn gyntaf oll, dylai hyn y mae'n ei ddychwelyd? Pan fyddaf yn galw strlen ar y au llinyn ac s oedd y gair HELO bod y defnyddiwr deipio i mewn, beth a wnaethom yn amlwg yn dweud hyd HELO oedd ychydig funudau yn ôl? Roedd 5, dde? H-E-L-L-O. A dyna yn wir sut strlen yn gweithio. Mae'n dychwelyd beth fyddai bod dynol arferol disgwyl hyd y llinyn i fod. Ond mewn gwirionedd, pa mor fawr yw'r amrywiaeth o gymeriadau sydd wedi storio hello? Mae'n mewn gwirionedd 6. Felly strlen yn sôn am y ffaith honno i chi. Ond o dan y cwfl y cyfrifiadur yn wir yn defnyddio 6 bytes i storio gair 5-llythyr, ac mae hyn yn wir ni waeth pa mor hir y gair hwnnw. Mae bob amser yn mynd i fod yn gymeriad null arbennig dod i ben ar ddiwedd y llinyn i demarc ei hyd cyfan. Felly, yna os ydych yn awr yn y person gweithredu strlen 20, 30 mlynedd yn ôl, sut ydych chi'n mynd ati i weithredu strlen ei hun? Rydym yn cymryd yn ganiataol ei fod yn bodoli, yn union fel rydym yn cymryd yn ganiataol y printf yn bodoli, ond os HELO yw'r gair dan sylw ac yr hyn sydd gennyf mewn cof yn rhywbeth sy'n edrych fel hyn, os bu'n rhaid i chi reimplement strlen oherwydd gofynnwyd i chi neu oherwydd, a dweud y gwir, nid ydych yn gwybod strlen bodoli - bu'n rhaid i chi gyflwyno hyn un ar eich pen eich hun - gallai sut yr ydych yn gweithredu strlen pan roddir rhywbeth sy'n edrych fel hyn? Nawr ein bod yn gwybod llinyn yn array, gallwn ailadrodd dros bob un o'r cymeriadau unigol defnyddio rhywbeth fel - Gadewch i geisio gwneud hyn ar y hedfan. Gadewch i mi fynd i mewn i'r ddyfais. Gadewch i mi greu ffeil newydd, strlen.c. Gadewch i mi fynd yn ei flaen yn awr ac yn cynnwys stdio.h fel bod gennym fynediad i printf. Gadewch i mi wneud int brif (gwag). Oh. 'N annhymerus' jyst yn gwneud hyn ar fy mhen fy hun am y tro wedyn. [Chuckles] Diolch yn fawr. Mae hyn yn beth rwy'n ei wneud. Mae pob hawl. Felly, cyn i mi droi ar y sgrin, rwy'n deipio hynny i gyd. Ac yn awr yr hyn yr wyf i'n mynd i wneud yw y canlynol: printf ("Rhowch i mi llinyn:") Dyna dim ond cyfarwyddiadau blewog. Nawr, gadewch i mi wneud llinyn s = GetString. Rwyf eisoes angen i wneud newid yn awr. Rwy'n defnyddio'r llyfrgell CS50 yn sydyn, felly gadewch i mi fynd yn ei flaen a deipio i mewn cs50.h. Ac yn awr gadewch i ni wneud hyn: printf ("Hyd yw:% d, strlen [s] - ac nid wyf yn gwneud hynny eto. Beth arall sydd raid i mi ychwanegu at y rhaglen hon? [Myfyrwyr] string.h. >> String.h. Felly, ar hyn o bryd, rydym yn defnyddio strlen, felly gadewch i ni wneud yn siŵr bod y casglwr yn gwybod lle hynny yw, felly bwyll bach gwirio. Im 'yn cael llinyn yn llinell 8, ac yn unol 9 Rwyf i'n argraffu ei hyd gyda d%. Felly, gadewch i ni fynd yn ei flaen ac yn agor hyn i fyny. Rydym wedi gwneud strlen - llunio iawn - strlen - gadewch i mi chwyddo i mewn - Mewnbynnu, H-E-L-L-O, Enter. Mae hyd yn 5. Iawn, felly strlen ymddangos i weithio, ond y byd yn gwybod hynny. Felly, gadewch i ni nawr weithredu strlen ein hunain fel a ganlyn. Gadewch i mi gymryd y llyfrgell i ffwrdd. Nid ydym bellach yn cael mynediad i string.h oherwydd doeddwn i ddim hyd yn oed yn gwybod ei fod yn bodoli. Ond mae hynny'n iawn oherwydd gallaf weithredu strlen fy hun ac wedi ei gymryd o'r enw llinyn mewnbwn, ac yn awr yr wyf angen at chyfrif i maes hyd y llinyn. Felly, sut y gallaf wneud hyn? Beth os wyf yn gwneud - gadewch i ni weld sut i wneud hyn - Beth ydych chi eisiau ei wneud? [Ymateb y myfyrwyr Anghlywadwy] >> Iawn. Fel y gallwn wneud hyn mewn criw o ffyrdd. Gadewch i mi geisio cymryd yr ymagwedd hon. Gadewch i mi roi fy hun yn newidyn int i, felly fi yn dechrau ar 0. A gadewch i mi ddweud hyn: er bod mewnbwn [i] ddim yn hafal i beth? \ 0. Felly, mae'n troi allan, fel yn achos gyda'r holl chars wrth ysgrifennu eu llythrennol mewn rhaglen, rhaid i chi ddefnyddio dyfyniadau nad sengl, dyfynodau dwbl. Felly, os wyf yn ysgrifennu'r llythyr, byddwn yn gwneud hynny, mae'r b llythyr, byddwn yn gwneud hynny. Mae hyn, ar y llaw arall, fyddai llinyn, nid cymeriad unigol. Felly, yr wyf am i \ 0 llythrennol. Beth ydw i am ei wneud yn y cylch? A dweud y gwir, yr wyf angen newidyn arall, felly hyd int yn cael 0. Hyd yn oed os nad ydych yn siwr pam rydym yn dechrau ar y ffordd yr ydym yn gwneud hynny, yn awr ein bod ni'n mynd i lawr y ffordd hon, beth ydw i eisiau ei wneud ar-lein 9? hyd + + ac yna i lawr yma ar llinell 10, hyd dychwelyd. Felly sut mae strlen gweithredu? Mae'n gweithredu mewn gwirionedd yn ôl pob tebyg fel hyn. Efallai y person yn defnyddio ar gyfer dolen, efallai wneud tra dolen - pwy a ŵyr? Byddem yn rhaid i edrych o dan y cwfl ar y cod ffynhonnell wirioneddol mewn rhai ffeil o'r enw string.c yn ôl pob tebyg. Ond yma gadewch i ni feddwl am yr hyn rwy'n ei wneud. Rwy'n datgan newidyn enw i, gan ei gosod gyfartal i 0. Rwy'n yna datgan arall hyd newidiol o'r enw, gan ei gosod gyfartal i 0. Yna i ddim yn dweud tra nad yw'r cymeriad ith yn y mewnbwn yn hafal i gymeriad null arbennig, \ 0, cynyddiad hyd. Ond cyn gynted ag y cymeriad ith yw hyn gymeriad arbennig, beth sy'n digwydd i'r ddolen? Mae'n cylchedau byr. Mae'n atal, sy'n golygu ein bod wedyn yn syth yn dychwelyd hyd. Felly, os nad wyf yn llanast i fyny, gadewch i ni fynd yn ei flaen ac yn mynd yn ôl at fy ffenestr terfynell. Gadewch i mi ail-grynhoi. Ac yr wyf yn sgriw i fyny. Redeclaration anghydnaws llyfrgell swyddogaeth strlen. Felly, yr wyf yn ceisio mynd yn rhy glyfar ar gyfer fy hun yn dda yma. Mae'r compiler mewn gwirionedd yn gwybod bod yn swyddogaeth o'r enw strlen er nad ydym wedi cynnwys y llyfrgell. Mae hynny'n iawn. Beth bynnag. Rydym yn unig yn mynd i gydweithredu hynny. Gadewch i ni ail-enwi hyd hwn. Gadewch i mi newid y defnydd ohono i hyd yma, a bydd hyn yn gwneud Clang hapusach. Fel o'r neilltu, am fod rhai o'r swyddogaethau hyn mor darn cyffredin - strlen, prinf - y maent mewn gwirionedd yn cael rhyw fath o statws arbennig. Ac felly dim ond yn gwybod Clang rhywbeth bach arbennig amdanynt. Dyw hynny ddim yn wir bob amser gyda swyddogaethau y rhan fwyaf o, felly dyna pam rydym yn cael yelled. Gadewch i mi geisio eto. Diolch byth, mae'n gweithio yr adeg honno. Felly nawr gadewch i mi redeg fy mhen fy hun strlen rhaglen. Rhowch i mi llinyn: H-E-L-L-O, Enter. Ac yr wyf wedi sgriwio i fyny. Pam? >> [Anghlywadwy ymateb y myfyrwyr] >> Yn union. Felly mae gen i fy hun yma dolen iawn 'n glws-edrych yn ddiddiwedd oherwydd hyd yn oed er fy mod i'n incrementing hyd ar bob iteriad, beth ydw Nid wyf yn glir yn ei wneud? Dydw i ddim yn incrementing i. Iawn. Atgyweiria hawdd. Ydw? Iawn. Na Nawr byddem yn rhedeg afoul o ryw gamgymeriad cyffredin eraill lle mae angen imi cromfachau. A dweud y gwir, mae'r cod yn dechrau edrych yn hyll, felly byddwn yn cymryd drywanu yn glanhau hyn i fyny mewn munud. Ond nawr rwy'n incrementing ddau hyd a i. A dweud y gwir, yr wyf eisoes yn gweld cyfle i wella yma, ond byddwn yn dod yn ôl at hynny. Felly nawr gadewch i ni dim ond gwneud yn siŵr ein bod o leiaf yn gwneud cynnydd. Mae hyn wedi digwydd i rai ohonoch, ac yr wyf esgeuluso sôn am hyn ymlaen llaw. Pan fyddwch yn cael y anffawd o sefyllfa fel hyn, sut ydych chi'n atgyweiria hon byr o ail gychwyn yr offer neu eich cyfrifiadur neu gau y ffenestr? Mae'n mewn gwirionedd yn hawdd. Bydd Rheoli C anfon y moron bach symbol C, ac mai dim ond yn dod i ben rhaglenni mwyaf. Os oes gennych dolen drwg iawn anfeidraidd sydd wedi argraffu gwaith pethau ganmil lawer, Weithiau efallai y byddwch yn rhaid i daro Rheoli C fil o weithiau i wneud yn mewn gwirionedd yn ei glywed. Felly, dim ond yn sylweddoli nawr oherwydd dydw i ddim yn argraffu unrhyw beth, a oedd yn eithaf hawdd. Ac yn dechnegol, unwaith suffices, ond rwy'n cael ddiamynedd, ac yr wyf fel arfer yn taro ei fod lawer gwaith. Felly strlen. Rhowch i mi llinyn: HELO. A yw'n mynd i weithio y tro hwn? Iawn. Camgymeriad arall cyffredin. Gorfod ail-grynhoi. Dyna oedd fwriadol, bod un. Mae pob hawl. Felly strlen, H-E-L-L-O, Enter. Ardderchog. Felly, mae gennym bellach strlen i 5. Felly, rydym wedi reimplemented llythrennol yr olwyn. Felly nawr gadewch i ni lanhau hyn i fyny oherwydd nid yw hyn yn gwneud i mi argraff â dyluniad fy cod. Beth allwn ni ei ddileu yn glir yn y rhaglen hon i lanhau hyn i fyny? [Ymateb y myfyrwyr Anghlywadwy] >> Yeah. Yn llythrennol, rydym yn trin i a hyd yn union. Felly pam nad ydym yn unig yn cael smart a dweud wrth hyd? Yn hytrach, gadewch i 'jyst alw hyd i ddechrau, ymgychwyn ei i 0 oherwydd yn ddiofyn y llinyn nid oes hyd nes i ni chyfrif i maes beth ydyw. Nawr rydym yn gwneud hyn, ac yn awr mae hon yn rhaglen eithaf cain. Un newidyn. Wyf yn glanhau i fyny, ei dynhau i fyny. Felly nawr gadewch i ni fynd yn ôl at fy ffenestr terfynell. Gadewch i ni fynd yn ei flaen ac yn rhedeg y. Gwnewch strlen. Edrych yn dda. Rhedeg strlen eto, Enter. Rhowch i mi llinyn: HELO, Enter. Ac mae'n ymddangos ei fod yn gweithio fel 5. Nawr, i fod yn glir, os nad wyf wedi ysgrifennu, er enghraifft, HELO mewn 1 llinyn ac yna IS mewn un arall, gallwn yn sicr geiriau lluosog. Os nad yw'r ymadrodd yr wyf mewn gwirionedd yn awyddus i deipio yn HELO, ond, er enghraifft, HELO BYD, hysbysiad bod yr hyn ni fyddai gennym yw hyn yn sefyllfa yma, dde? Byddai hynny'n awgrymu bod hynny'n 2 llinynnau. Gallwch yn sicr wedi cymeriadau bar gofod, felly os ydym yn teipio mewn gwirionedd mewn ymadrodd hirach fel HELO BYD, yr hyn y byddem yn cael yn y cof yn edrych rhywbeth bach fel 'na yno. Mae pob hawl. Unrhyw gwestiynau yna am y gynrychiolaeth yma o linynnau? Na? Mae pob hawl. Felly dywedais yn gynharach fod galw strlen dro ar ôl tro yn fwriadol fel 'na debyg nad yw'r syniad gorau oherwydd eich bod yn mynd i fod yn gwneud llawer iawn o waith eto ac eto ac eto. Yn wir, pa fath o waith yn angenrheidiol ar gyfer figuring allan hyd y llinyn, mae'n debyg? Mae'n rhaid i chi ddechrau ar y dechrau ac yna edrych, edrych, edrych, edrych, edrych hyd nes y byddwch yn olaf yn gweld bod cymeriad arbennig, a phryd hynny, AH, yn awr yr wyf yn gwybod hyd. Felly, yn gynharach pan yr oeddem wedi strlen cael eu galw unwaith eto ac eto ac eto, y rheswm pam yr oedd cynnig y math o dwp oherwydd unwaith eto, y llinyn yn edrych fel 'na. Dyw hi ddim yn mynd i newid bob tro y byddwch yn ailadrodd drwy rai dolen, felly rydych yn gwneud gwaith diangen. Ar yr un pryd, dylech wybod, wrth fynd heibio, y detholwyr fel y Clang y dyddiau hyn wedi cael eu datblygu dros nifer o flynyddoedd, ac awduron compiler, rhaglenwyr, yn eithaf smart. Ac felly mae'n troi allan y gall crynoadyddion Clang ac eraill mewn gwirionedd yn chyfrif i maes bod, iawn, ie, rydych wedi ysgrifennu strlen yn eich cyflwr, sydd yn dechnegol yn golygu y byddwn yn galw eto ac eto ac eto. Ond gall crynoadyddion smart mewn gwirionedd yn gwneud y gorau y mathau hynny o benderfyniadau defnyddiwr gwael allan o'ch cod i wneud iawn am bethau. Felly peidiwch â dim ond yn sylweddoli bod weithiau yn y compiler yn gallach na ni a bydd yn fath o guddio ein camgymeriadau ein hunain. Ond yn sicr pan ddaw i setiau broblem ac yn y blaen, peidiwch fod yn meddwl am y penderfyniadau dylunio sylfaenol wallus o bosibl am y rheswm syml y byddem yn gwneud gwaith ffordd fwy nag yr ydym mewn gwirionedd yn rhaid i ni ei wneud. Ond faint mwy o waith? Yn achos BYD HELO, gadewch i ni ddechrau i gyffredinoli maint y broblem. Beth yw hyd y broblem neu faint y broblem pan fydd y gair y defnyddiwr deipio i mewn yn HELO? Mae'n debyg 5, efallai 6. Plws neu finws 1. Beth bynnag. Mae mor agos byddwn yn ei alw'n ddim 5. Felly beth yw'r maint y broblem yma wrth geisio chyfrif i maes hyd HELO? Mae'n 1, 2, 3, 4, 5, ac efallai 6 ar gyfer y cymeriad diwethaf, ond gadewch i ni cyffredinoli gan fod n. Felly n, dim ond y n amrywiol, yw'r hyn y byddai gwyddonwyr cyfrifiadurol fel arfer yn defnyddio i ddisgrifio faint o broblem, ac mae'r broblem dan sylw yw pa mor hir yw HELO? Faint o amser mae'n cymryd strlen? Mae'n cymryd ar y drefn o gamau n, lle mae pob cam yn golygu edrych ar gymeriad, edrych ar gymeriad, yn edrych ar gymeriad. Ac rydym wedi cael y drafodaeth hon ychydig yn ôl, nifer y llawdriniaethau rhywbeth yn mynd. Y diwrnod cyntaf o ddosbarth rydym wedi bawb lletchwith yn sefyll i fyny, ac yna pawb yn dechrau paru i ffwrdd gyda'i gilydd er mwyn gwirionedd yn ddelfrydol cyfrif faint o bobl oedd yn yr ystafell. Ac rydym hefyd yn gwneud beth arall lle os byddaf yn hytrach yn gwneud yn y ffordd hen ysgol o jyst yn cychwyn 1, 2, 3, 4, 5, 6 ac yn y blaen, hynny hefyd, maint y broblem yn n maint. Roedd pobl n yn yr ystafell. Ond roeddwn yn gallu cyflymu'r bod hyd, dde? Arddull ysgol radd gallwn ddechrau cyfrif mewn 2s. 2, 4, 6, 8, 10, 12. A bod yn teimlo mor llawer cyflymach, ac yn wir mae'n. Mae'n llythrennol ddwywaith mor gyflym, ond eto, os arall 400 o bobl yn cerdded i mewn i'r ystafell i gyd ar unwaith, byddai'r rhai algorithmau yn cymryd 200 o 400 neu efallai camau. Ond ar y llaw arall, os ydym mewn gwirionedd yn cael smart, ac rydym yn hytrach yn cael yr holl ydych yn cyfrif eich hunain, dwyn i gof sut y algorithm yn gweithio. Chi i gyd yn sefyll i fyny. Gadewch i mi yn gyflym-ymlaen at hyn. Rydych chi i gyd yn sefyll i fyny, byddwch yn paru i ffwrdd, yna hanner chi eistedd i lawr, hanner ohonoch eistedd i lawr, hanner chi eistedd i lawr, ac ar bob fersiwn o hwn yn ddolen o wythnos 0, rydym yn haneru problem wrth law ac aeth i n / 2, ac yna n / 4, ac yna n / 8. Ac goblygiad hynny yw, os arall 400 o bobl yn cerdded i mewn i'r ystafell, dim llawer mawr, bydd yn mynd â ni rownd 1 yn fwy, nid 400 rowndiau mwy, nid 200 rowndiau mwy. Ac felly y stori rydym yn dweud beth amser yn ôl roedd yn rhaid i wneud rhywbeth bach gyda hyn. Mae'r llinell goch yma yn llinol, mae'n syth, ac mae'n labelu fel n oherwydd wrth i faint o broblem yn tyfu, os yw eich algorithm neu raglen yr ydych chi'n ei datrys yn cymryd camau n, gallwn blotio fel llinell syth lle mae'n cymryd mwy o amser po fwyaf y maint y broblem. A'r dull twosies cyfrif 2, 4, 6, 8, dal i fod yn llinell syth, dim ond ychydig yn well. Mae'n cymryd amser ychydig yn llai, felly mae'r llinell melyn yn is na'r pwynt llinell goch ar gyfer pwynt. Ond hyd yn oed yn well oedd y greal sanctaidd yr hyn rydym yn galw amser logarithmig lle hyd yn oed os ydym unwaith eto yn dyblu nifer y bobl yn yr ystafell, rydym yn dyblu maint y llyfr ffôn o ddiwrnod cyntaf y dosbarthiadau, dim llawer mawr, mae'n cymryd 1 rhwyg dudalen mwy, yn cymryd 1 eistedd i lawr mwy o er mwyn datrys problem sy'n ddwywaith mor fawr. Ac felly y sgwrs ydym yn awr yn mynd i ddechrau cael ei sut ydym yn mewn gwirionedd yn datrys problemau effeithiol os byddwn yn ystyried y symlaf o broblemau fel hyn? Tybiwch fod gennym 8 ddrysau y tu ôl sef rhai rhifau, ac nid pob un o'r rhifau hyn yn cael ei datrys mewn unrhyw ffordd, eu bod yn gyfanrifau dim ond ar hap y tu ôl i'r drysau, ac rydym yn gofyn y cwestiwn sut ydych chi'n mynd ati i ddod o hyd i'r rhif - pwy a ŵyr - 7 tu ôl i'r drysau? Beth fyddech chi, bod dynol, ei wneud er mwyn dod o hyd i mi rhif 7 os unwaith eto bob un o'r rhain yn ddrysau ac i weld gwerth yn rhaid i chi agor drws? Beth fyddai eich algorithm fod yn efallai? [Ymateb y myfyrwyr Anghlywadwy] >> Felly dechrau gyda'r chwith ac agor drws, agor drws, agor drws. Ac yn yr achos gwaethaf, pa mor hir mae'n mynd i fynd â ni i ddod o hyd i'r rhif 7? Ac eto, nid ydynt yn didoli, felly nid yw mor hawdd â, wel, dw i'n mynd i agor y drws 7fed. Gallai gymryd i ni, maximally, 8 cam. Yn yr achos gwaethaf, 7 yn hap ar ddiwedd y llinell o ddrysau, felly efallai y rhaid i ni geisio yr holl ddrysau n. Felly eto yma, rydym yn ymddangos i gael algorithm llinol. Yn wir, rydym yn gwneud hyn dim ond ychydig o flynyddoedd yn ôl. Mae un o'ch rhagflaenwyr ei herio gyda'r union y lle nad oedd gennym fersiwn digidol, yr ydym yn hytrach roedd bwrdd du gyda rhai darnau o bapur arno. A hyn yr wyf yn meddwl y byddwn i'n ei wneud yw cymryd cipolwg yn ôl ar sut y mae hyn yn mynd, un o'r cyfleoedd gorau ac efallai yn bwysicaf lletchwith ar y llwyfan i gael arddangosfa yma ar Sanders. Cawsom 2 res o rifau. Rydym yn unig yn mynd i edrych ar yr hyn sy'n digwydd yma gyda Sean gyfer frig y rhesi. Oni bai nad oes neb byth eto gwirfoddolwyr yn CS50, cawsom Sean bendith i gadw hyn ar gamera, fel ei fod yn gwybod bod cannoedd o bobl wedi bod yn gwylio hyn yn awr am flynyddoedd. Ond mae Sean wedi gwneud gwaith anhygoel - neu a oedd ef -? Yn mewn gwirionedd yn dod o hyd i ni nifer arbennig. Felly, gadewch i ni weld sut y datrys y algorithm fel y byddwn yn ailgydio yn y sgwrs hon cyn bo hir o sut rydym yn dod o hyd i bethau yn effeithlon. [Malan ar fideo] wyf wedi cuddio y tu ôl i'r drysau y rhif 7, ond cuddio yn rhai o'r drysau yn ogystal yn eraill nad ydynt yn negyddol rhifau, a bod eich nod yw i feddwl am y rhes uchaf o rifau fel dim ond arae neu dim ond dilyniant o ddarnau o bapur gyda rhifau y tu ôl iddynt, a bod eich nod yw, dim ond gan ddefnyddio amrywiaeth top yma, dod o hyd i 'm' r rhif 7. Ac rydym yn wedyn yn mynd i feirniadu sut yr ydych yn mynd ati i wneud hynny. >> Mae pob hawl. [Malan] Dod o hyd i ni y rhif 7, os gwelwch yn dda. [Chwerthin] [Malan] Rhif [chwerthin] 5, 19, 13, [chwerthin]. Nid yw'n gwestiwn castia. 1. [Chwerthin] Ar y pwynt hwn nad yw eich sgôr yn dda iawn, felly efallai y byddwch yn ogystal dal i fynd. [Chwerthin] 3. Ewch ymlaen. A dweud y gwir, ni allaf helpu ond meddwl beth ydych yn hyd yn oed yn meddwl am. [Chwerthin] Dim ond y rhes uchaf, felly mae gennych 3 ar y chwith. Felly dod o hyd i mi 7. [Fyfyrwyr grwgnach] [Malan] 17. [Fyfyrwyr grwgnach] [Malan] 7! [Cymeradwyaeth] Felly, ar ddydd Mercher byddwn yn plymio i mewn i hyn ac algorithmau soffistigedig mwy am ddod o hyd i bethau. Am nawr byddwn yn gadael i chi gyda Sean a gweld chi ar ddydd Mercher. [CS50.TV]