[Powered by Google Translate] [3 savaitė]
[David J. Malan - Harvardo universiteto]
[Tai CS50. - CS50.TV]
Leiskite man nukreipti mums, kur mes baigėte paskutinį kartą kryptimi,
, kurie buvo pradėti galvoti šiek tiek daugiau nei apie sintaksę
ir bando galvoti, šiek tiek mažiau, apie visus Individualiųjų požymių
, kuris trunka šiek tiek laiko požiūriu kabliataškiais Aklimatizēt iki šiol
ir skliausteliuose ir garbanotas petnešos,
pradėti vartoti dalykus šiek tiek į aukštesnį konceptualiu požiūriu
taip, kad problemos, mes dabar pradėti spręsti per ateinančias kelias savaites
ketina įtraukti daug daugiau į aukštesnio lygio konceptualių problemų
ir šiek tiek mažiau sintaksės, kaip jums gauti jūsų kojų šlapias
ir savo rankas purvinas su kai kuriais iš šių pastaruosius keletą savaičių sintaksė.
>> Taigi, primena, kad praėjusią savaitę įvedė šią sąvoką masyvo.
Ir anglų kalba masyvas gali būti apibūdinta kaip tai, ką? >> [Nesigirdi studentas atsakas]
Sorry?
Kolekcija? >> [Nesigirdi studentas atsakas] >> Gerai, gerai.
Daiktų kolekcija. Taigi mes matėme masyvo į nulio.
Jei atsitiko naudoti pset Nutrinkite "sąrašus 0, kad galite vilkti dalykus
rūšių aprašą, pavyzdžiui, apelsinų ir bananų,
tai tipo kaip kas masyvas.
Ir tada daugiau techniškai, faktinį kompiuterio,
masyvas tiesiog ribotis riekė atminties.
Kitaip tariant, jūs turite baitas, tada kitą baitų, tada dar vienas baitas, tada kitą baitų,
ir, jei buvo padaryti tuos baitus į nuotrauką,
jie būtų atgal atgal atgal atgal. Kad tai, ką mes vadiname ribotis.
>> Todėl baitų skaičius 1, po to 2, po to 3.
Tai nereiškia, čia, čia, čia, čia.
Masyvas yra gretutinė riekė 0 arba daugiau baitų.
Taigi, kas yra naudinga?
Prisimenu, mes turėjome šį puoselėja pavyzdžiui, saugoti žmonių viktorinų klasių rūšiuoti programos
apskaičiuoti savo viktorina vidurkį kai žinoma,
ir priminti, kad mes galėtume pradėti rašyti šią programą skelbiantis kintamųjų quiz1.
Tada mes galime turėti kitą kintamasis vadinamas quiz2.
Bet tada, jei buvo 3 viktorinos šiai klasei, quiz4.
Arba, jei ten buvo per savaitę viktorina, tai būtų quiz5, quiz6, quiz7.
Todėl jūs turite iš šių kintamųjų paskelbė viduje pagrindinis
ar kažkur kitur, į savo programą,
ir problema su tokiu požiūriu, lengva, nors tai yra tiesiog nukopijuokite ir įklijuokite,
tai tiesiog labai greitai tampa sudėtingas.
Neduok Dieve, jūs iš tikrųjų yra 30 viktorinos arba 50 viktorinos.
Jei tai kaip aukštosios mokyklos stiliaus kasdien pop viktorina,
tada jums tiesiog juokingai ilgą sąrašą kintamieji bus galima paskelbti,
ir tai tik labai greitai tampa nekontroliuojamas.
Tai negraži, sunku išlaikyti, tai taip daug lengviau klaidos
jei jūs gaunate 1 numerį padarėte klaidą kažkur į savo programą.
>> Taigi, mes pristatė masyvo sąvoka vietoj.
Bei primena, kad įgyvendinus šią programą padaryti šiek tiek kažką panašaus į tai.
Leiskite man eiti į šiandienos Šaltinis 3 pirmadienis kataloge
ir atverti, masyvas, kurį mes matėme paskutinį kartą.
Ir nors buvo C naujų triukų pora čia,
tarp jų pastovi sąvoka,
priminti, kad mes deklaruotų kelis plūdes iš esmės naudojant šią sintaksę:
plūdės, tada kintamojo pavadinimas, tada mes kvadratinių petnešos tikrai pirmą kartą,
ir ką mes padarėme tų kvadratinių petnešos viduje buvo veiksmingai įgyvendinti numerį.
Bet vietoj to išleisti numerį, aš įdėti šį kapitalizuojamos žodį, viktorinos.
Ir kas buvo išleisti kapitalizuojamos kaip viktorinos žodį motyvacija
ir tada naudojant eilutę 17 pamainą čia iš tikrųjų duoti, kad numerį?
Tai, kas buvo ten motyvacija? Taip.
>> [Nesigirdi studentas atsakas] >> Taip.
Jei mes norime pakeisti, kad vertė Vertė 2, tik reikia jį pakeisti į 1 vietą
nes apsvarstyti - Aš net prisiminti, ką ši programa padarė tiksliai,
bet jei jūs tiesiog nugriebti matote viktorinos, viktorinos.
Jūs matote, viktorinos, žemyn čia daugiau viktorinos.
Taigi, jei mes neturėjome ši konstanta, tai aštrus naudojimas apibrėžti,
mes norėtume įvedėte 2, po to 2, po to 2, po to 2, kuris yra gerai. Būtų lygiai taip pat teisinga.
Tačiau tarkime, kad kitais metais, mes turime 3 viktorinos CS50.
Taigi, aš turiu eiti ir atnaujinti kodą, turiu perkompiliuoti jį,
bet problema yra, jei aš ką nors kvailas, kaip aš pamiršti 1 paminėti 2
ir pamiršti prijungti 3, visa programa galėtų labai gerai lūžti.
Taigi mes tiesiog prašo problemų.
>> Taigi sąvoka "nuolatinis" yra visa informacija apie faktoringo iš kai kurių duomenų gabalas,
ar tai eilutė arba char arba lėšos ar kokia,
ir deklaruojant 1 vieta, kad jūs galite lengvai pakeisti ateityje.
Ir tai taip pat atvirai, šiek tiek lengviau skaityti, nes, jei jūs tiesiog galvoti apie tai dabar,
tai viktorinos, ar mes netgi gali pervadinti kažką panašaus NUMBER_OF_QUIZZES
ar kažkas dar aiškiau.
Kodas tiesiog tampa šiek tiek daugiau akivaizdus, ​​kad tai, ką jis daro,
ir jums įdomu, šiek tiek mažiau ką skaičius 2 gali atsitikti reiškia.
Taigi nuolatinis, nieko iš esmės su matricomis.
Masyvas buvo pristatytas šių kvadratinių petnešos.
>> Taigi, pastebėsite, kad 23 eilute mes paprašyti, kad naudotojas, "Kas buvo viktorina balai?"
Tada mes tiesiog turėti šio ciklo, kuris, matyt, prašo už savo klasėse vartotoją. Kaip tai padaryti?
Jis kartojasi 0-2. Ir aš sakau, 2 nes Viktorinos didžiosiomis šiuo metu 2.
Taigi tai kartojasi nuo 0 iki 2, ir tada jis spausdina iš Viktorina # kažką kažką,
ir tada ji naudoja GetFloat gauti vertę nuo vartotojo.
Taigi pastebėti, tai Vienintelis kitas naujas gabalas sintaksė paskutinį mėnesio trečiadienį.
Jei norite išsaugoti kažką, tam tikroje vietoje masyvo,
jūs vėl naudoti skliaustus.
>> Todėl nėra prieštaros, tiek čia.
Pirmą kartą naudodami skliaustus
jūs naudojate tai, kaip didelis norite masyvas.
Bet tai kitas kontekstas čia, kur mes vėl įdarbinti šiuos skliaustus
tai, kur masyvo, jūs norite įdėti tam tikrą vertę?
Ir skirtumas čia gali būti numanomas iš konteksto.
Pastebėsite čia, mes turime duomenų tipą, tada mes turime kintamojo pavadinimą,
tada mes turime kvadratinių petnešos su viduje, kabliataškiu. Štai ir viskas.
Taigi, kad deklaracija.
Tai lygiai taip pat, nors mes turėjome padaryti kažką kaip plūdės Grade1, float Grade2;
bet vėlgi, tai labai greitai pereina į taip per daug kopijuoti, įklijuoti,
todėl vietoj mes tiesiog supaprastinta kaip, pavyzdžiui,
kuris reiškia, kad nuo šiol mes turime klasę, kurios gali būti laikomos laikiklio 0,
mes turime kitą klasę, kurios gali būti laikomos bracket 1,
bet ką, jei aš goof ir, pavyzdžiui, mano kilpa eina taip toli -
Pavyzdžiui, aš tai mažiau nei arba lygus,
išėmimas iš apyvartos dėl ankstesnio klaidą šaltinis -
, kuri iš esmės reiškia, kad kai kurių trečiųjų atsitiktinio pakartojimo šio ciklo
Aš naudoju kronšteiną 2. Efektyviai, kas gali atsitikti? Sorry?
[Studentas] Ji ketina būti pakeista. >> Ar tai pakeisti?
Ką turėtų būti pakeistas?
Tai tiesiog sako, pakeisti, kas yra grąžinimo vertės GetFloat 2 vietoje.
Bet problema yra tai, kaip didelis yra Šiuo istorija masyvas?
[Nesigirdi studentas atsakas] >> masyvas yra dar tik 2 dydžio
nes masyvą, kaip ir bet kuris kintamasis, buvo paskelbta pirma, kol mes jį naudojo,
ir mes nurodytas čia, nes ši konstanta, kad aš turiu 2 klases, kad aš ruošiuosi įdėti.
>> Tačiau atminkite, kad kompiuterių mokslininkai pradėti skaičiuoti nuo 0.
Taigi, pirmoji vieta masyvo, 0 laikiklis.
Kitą vietą 1. Šis dalykas yra vis tiek šiek tiek per toli šalikelėje.
Taigi, kitaip tariant, jei aš iš tikrųjų turėjo šį masyvo
ir leiskite man pamatyti, kaip gerai bendradarbiauja čia mus -
jei turiu masyvą, kad aš tiesiog padaryti taip
ir aš skirta vietos 2 elementai, aš gali atkreipti tai, kaip atminties
kai tai didelė balta drobė.
Tai tiesiog turiu mano kompiuteryje RAM, RAM žeberklas, 2 koncertai RAM, nesvarbu,
tačiau šie 2 dėžės dabar atskirai sudaro plūdė, 32 bitų.
Taigi, jei aš įdėti numeris 1, čia kaip 1,0, tada aš įdėti kitą numerį kaip 3,2
bet tada aš 2 laikiklį, tai kaip pradėti kažką čia.
Ir kaip vaizdas rodo, kad nėra nieko ten.
Tai tarsi niekieno žemėje, nes aš ne paprašė operacinę sistemą
suteikti man šį trečiąjį viktorinoje.
Jei aš noriu, kad trečiąjį viktorinoje, aš turėjo turėti numatymas
paprašyti, kad operacinę sistemą už jį paskelbiant viktorinos būti ne 2
bet vietoj lygus 3.
>> Taigi, kitaip tariant, vaizdas, kad mes efektyviai turėti po ranka atrodo taip.
Tai irgi yra niekieno žemė. Mes geriau pabandykite rašyti vertybes čia.
Bet vėl, nes kompiuterių mokslininkai skaičius nuo 0,
kai mes kalbame apie šią vietą masyve, tai turėtų būti Location 0
tai turėtų būti 1 vieta, ir tai nėra net egzistuoti
nes mes tik paprašė operacinę sistemą 2 tokių vietų.
Taigi, tiems iš jūsų, ankstesnio programavimo patirtis iš kitų kalbų
Galbūt žinote, kad tai ne visada su matricomis ar ko vadinamas vektorių atvejis.
Priešingai, jūs galite tiesiog nuolat pridedant ir pridedant ir pridedant dalykų, masyvai,
kuris, tiesą sakant, mes turėjome, kad nulio galimybę ir dar mes, atrodo, davė jį čia
esate programavimo C, nes su daug aiškiau.
Tai tik jūs ir kompiuteris dabar, ir kompiuteris yra tik ketina padaryti
ką pasakyti tai daryti.
Taigi, jei jūs tik pasakyti, kad suteiks jums 2 plūdės linijos 22,
kad viskas, jūs ketinate grįžti iš operacinės sistemos: Space 2.
>> Taigi, vis dažniau savo programas, retkarčiais būti klaidų atsižvelgiant į masyvų.
Tai tiesiog tarsi iš žvėries pobūdį, pagal kurią visi mes esame klystantys,
ir tam tikru momentu jums bus labai tikėtina, indeksas už jūsų masyvo ribos.
Ir tai tik išgalvotas būdas pasakyti, Jūs patekote į kronšteino kažką
ir kažkas buvo tiesiog per didelis skaičiaus. Jūs patekote už jūsų masyvo ribų.
Bet aukštyn dabar tai.
Likusi šios programos tikrai neturi nieko iš esmės daryti su matricomis.
Visa tai tik apie kai paprasto aritmetinio skaičiavimo vidurkiai.
Taigi, mes turime čia tai už linijos čia pirmas kintamasis vadinamas suma, kad mes inicijuoti iki 0.
Tada mes vėl kartoti nuo 0 iki 2, ir mes įtraukiame į tos sumavimo kintamojo
osios klasės, todėl laikiklis 0 tada bracket 1.
Ir tada, kaip jūs darytumėte pradinėje mokykloje apskaičiuoti vidurkį,
mes tiesiog tą sumą, padalinsime jį į bendro skaičiaus viktorinos,
ir tada, gera priemonė mes vadiname funkciją čia vadinama turas.
>> Dabar, kaip ir žemę, kas yra spręsti su šio skliausteliuose int on line 34?
Jis galėjo sugalvoti jau skyriuje, tikrai ne apie tai kalbėjome oficialiai čia,
bet kas tai yra int parens tikriausiai daro? >> [Nesigirdi studentas atsakas]
Taip, tai reiškia liejimo arba typecasting,
o tai reiškia, 1 duomenų tipą ir konvertuoti jį į kitą.
Jūs negalite padaryti su visų duomenų tipų, nes kartais tai būtų šiek tiek keista.
Tačiau šiuo atveju, jei gražinama reikšmė turo flotacinio
, nes, galų gale, aš atsižvelgiant plūdę ir dalijant jį numerį kaip ir 2,
Aš ruošiuosi grįžti srautas.
Tačiau pradinėje mokykloje žmonių neturi tikrai norėčiau žinoti, kad jų vidurkis buvo 93,4
nes jie supranta, kad jie buvo kada nors taip arti, kad 95 apvalinimo punktu.
>> Taigi, mes norime, o vietoj jų int aplink visiems į artimiausią int,
, kuris šiuo atveju bus 94 be po jo taško.
Taip, kad tik šiek tiek matematinis triukas.
Ir mes grįžti prie šio liejimo sąvoka, nes ji turės įtakos,
jei turite ne atrado jau nustatyti problemos 2.
Taigi masyvas tada, jūs galite galvoti - jis ketina padaryti mane šypsena visą dieną.
Jis atrodo taip, jei jums padaryti jo nuotrauką,
bet svarbiausia yra tai, kad dydis yra pasirinktas pagal jus
kai jūs prašote iš operacinės sistemos.
Kokių nors klausimų, tada masyvų? Taip.
[Nesigirdi studentas klausimas]
Ak, geras klausimas.
Klausimas yra tai, kas atsitinka su nulinės 0 masyve? Šiame kontekste ji neegzistuoja.
Kad egzistuoja tik eilutės, kurią mes apie ateiti tik akimirką.
Bet masyvo, kaip yra šioje byloje, visi jums yra tai, ką jūs paprašykite operacinę sistemą.
>> Ir kaip žemę, kitaip tai bus neaišku,
Aš nuolat sako, jūs paprašote, kad operacinę sistemą, kreipkitės į operacinę sistemą.
Operacinė sistema, kaip jūs turbūt žinote, yra "Mac OS, Windows, Linux.
Kai jūs skambinate funkcijų, pavyzdžiui, GetFloat
ar jūs deklaruojate klasės kintamuosius kaip,
dienos pabaigoje jūs efektyviai klausia kažkas duoti jums, kad atminties
, nes mes, kaip trokštantis programuotojai
neįsivaizduoju, kaip iš tikrųjų gauti fizinį priėjimą prie atminties.
Bet kas nors operacinę sistemą.
Taigi, be to, su mumis gana piktogramos ir meniu ir aplankus ir panašūs
kad jūs matote ant jūsų darbalaukyje, ar Mac arba PC,
operacinių sistemų, taip pat daryti žemo lygio žemiškas dalykų,
labai techninę stuff Gigabyte valdymo
arba 2 GB atminties, kad jūs turite, kad jūs turite valdyti CPU ir kt.
Taigi, kai jūs rašote kodą,
jūs tikrai nedėkite jūsų operacinės sistemos šia prasme.
Aš ruošiuosi turi sumažinti. Gerai.
>> Kiti klausimai apie masyvų?
Ar ne? Gerai.
Taigi perėjimas natūraliai iš masyvų iš tiesų yra į temą, tai šiek tiek susipažinę.
Ir mes pažvelgė vis tiek trumpai šiuo paskutinį kartą taip pat.
Tai buvo eilutė nuo trečiadienio pavyzdys.
Ši eilutė pavyzdys buvo gana paprasta programa,
ir aš iš tikrųjų supaprastintas jį šiandienos reikmėms linijų poros.
Visa tai daro line 19 yra gauti nuo vartotojo eilutę, išsaugo kintamasis vadinamas ai.
Tada 22 eilutė tolyn, tai, matyt, spausdinti, kad eilutės 1 charakterį vieną eilutę.
Bet kaip jis tai daro?
Mes skelbiantis kintamąjį i, lygi 0,
ir tai tampa senas įprotis dabar.
Nebūtume dar nematė šio iki trečiadienio, bet jūs galite rūšies kildina iš jo pavadinimo
strlen sugrįžtų, ką kai suteikta s? Eilutės ilgis.
Taigi, jei aš perduoti jį eilutę, citata-citatos DAVID,
tai tikiuosi ketina grįžti į mane skaičius 5, nes Dovydo.
Taip, kad jo gyvenimo tikslas yra imtis eilutę, ar jums sunkiai koduojami
ar šiuo atveju prijungtas kaip kintamasis, kaip argumentą,
ir skaičiai, ką tos eilutės ilgis.
>> Taigi čia dabar mes skolinimosi tam tikrą žymėjimą iš ankstesnių viktorinos pavyzdžiui.
Tai neturi nieko daryti su plūdžių, neturi nieko bendra su viktorinos,
tačiau paaiškėja, kad šiek tiek balta melas mes jau sakau jums, nes 1 savaitę
yra tai, kad eilutė nėra tikrai egzistuoja C.
Dienos pabaigoje eilutė yra tikrai tik matrica.
Tai baitų masyvas, todėl baitų, baitų, baitų, baitų, išėmimas iš apyvartos yra tik 8 bitai,
todėl atminties gabalas, riekė atminties, atminties gabalas, riekė atminties.
Ir priemonės, kuriomis yra įgyvendinamas eilutę
įgyvendinant pirmąją raidę,
tada čia, tai čia, tai čia, atgal atgal atgal kompiuterio atmintyje.
Taigi, jei jūs norėjo išdėstyti, kaip HELLO žodį, galite įdėti 1 simbolis H,
E, tada L tada L, tada O - 5 simbolių iš viso - kažkur į kompiuterio RAM.
Tačiau čia pagrindinė detalė yra tai, kad jie bus atgal atgal atgal atgal,
vienas šalia kito.
Kai kai aš sakau, [i], anglų kalba yra tai, kad suteikėte man?
Ką s [i] atstovauti tokiu atveju? Taip.
>> [Studentas] osios personažas į eilutę. >> Būtent. Osios personažas į eilutę.
Dabar, aš ketina prasideda nuo 0, kaip per mano čia kilpa,
bet tai gerai, nes viskas pradeda skaičiuoti nuo 0.
Taigi s [0] ketina atstovauti Raidė H vienu žodžiu kaip HELLO
s [1] ketina atstovauti, pavyzdžiui, elektroninio žodžio raidę kaip HELLO, ir kt.
Ir ką mes, atrodo, daro ant kiekvieno šio ciklo iteracijos
laikinai saugoti ith kintamojo požymio vadinamas C, kuris yra tiesiog char,
ir tada mes spausdinti C
kad dieną, ką ši programa daro pabaigoje yra toks.
Jei aš einu į šaltinio katalogą, ir aš String1 ir aš einu į priekį ir paleisti String1
ir tada aš tipo kaip HELLO, įveskite žodį, jis yra spausdinti šį 1 simbolį vienu metu.
>> Taigi, čia yra galimybė patobulinimui.
Aš tipo dėtų daugiau pastangų, nors tai labiau aišku gal tokiu būdu, nei būtina.
Kuris linija kodą čia aš tikriausiai išmesti iš viso? Taip.
24 eilutėje. Atitinka 24 Aš skelbiantis kintamųjų c.
Aš saugoti ith s pobūdį į jį, bet tada aš naudoju C čia.
Taigi, aš naudojant C, todėl jaučiu, kaip aš negali tiesiog mesti 24 eilutėje toli.
[Nesigirdi studentas komentaras] >> Taip.
Taigi, kai kalbama kalbėti apie programų rengimą,
pastebėti tai šiek tiek supaprastinti kodą, kuris yra lygiai taip pat įskaitomas,
bet suprantame, kad s yra tik kintamasis, duomenų tipas yra masyvas,
taip s [i] yra tik ketina iš karto grįžti į jums osios simbolių toje eilutėje.
Ir, jei norite jį išspausdinti, kad gerai.
Jums tereikia naudoti% c, nes nesate spausdinimo eilutę,
jūs spausdinate simbolį į eilutę, ir tai taip pat turi spausdinimo ith pobūdžio.
Ir atšaukia vienintelis skirtumas tikrai iš praeitą savaitę, naudojant printf
yra tai, kad kadangi per kelias savaites praeityje darytume kažką super paprasta
kaip% s vietos rezervavimo ženklą, tada eilutę čia pavadinimas,
dabar mes nardymo šiek tiek giliau po gaubtu ir sakydami:
nereikia spausdinti eilutę, jame spausdinti vieną simbolį.
>> Taigi, mes galime padaryti kažką šiek tiek skiriasi, nes ten 1 kita - ne klaida
, nes ši programa yra teisinga, bet aš darau kažką kvailas
kad jau minėjau trumpai trečiadienį.
Bet galvoju, kaip būtų ši programa dizainas dar labiau patobulinta? Taip.
[Nesigirdi studentas atsakas] >> O, geras.
Taigi priminti, kad mes pristatė antrą kintamasis vadinamas n paskutinį kartą,
kuris, atrodo, prieštarauja patys, nes mano tikslas prieš antrą
buvo tiesiog išmesti kintamąjį kaip nereikalinga,
tačiau primena, kad trečiadienį, mes iš tikrųjų tai padarė.
Aš pakeičiau už linijos iš tikrųjų turi kablelį, tada n = strlen
ir tada per čia aš, i <n, tada aš savo žingsniais.
Kas yra pagrindinis pelnas, kad aš pasiekti keisti savo iniciacijos į šį
ir mano būklė tai dabar? >> [Nesigirdi studentas atsakas] >> Taip.
Aš ne primindamas strlen vėl ir vėl ir vėl, nes prisiminti kaip kilpos darbų.
Net jei jie pradeda gauti daugiau atrodo sudėtinga,
priminti, kad prieš pirmąjį kabliataškiu dalykas yra iniciacijos, kuris atsitinka, kai.
Sąlyga, nors, yra per vidurį,
ir tai bus tikrinamas kiekvieną kartą, kai jūs einate per kilpą.
>> Todėl kind of stupid būti prašoma, kad kompiuteris vėl ir vėl tą patį klausimą -
Koks HELLO ilgis? Koks HELLO ilgis? Kas yra HELLO ilgis?
, nes, kaip mes matome šiandien, ir trečiadienį, tai tikrai truks laiko,
ir tai nėra labai gerai panaudoti, nes išsiaiškinti eilutės ilgis
iš tiesų jis šiek tiek pastangų.
Tai ne iš karto, nes tai kai kuriose kalbose.
Taigi pakeisdami n, kaina, aš mokėti yra kas?
Mes matome kompromisą čia.
Galiu sutaupyti laiko vėl ir vėl klausia to paties velniškai klausimą,
bet tai kainuos man ką nors, o tai, ką?
>> [Studentas] Jūs prarasti tam tikrą atminties. >> Būtent. Tai kainuos man šiek tiek atminties.
Taigi šiuo atveju tai kainuos man, ką?
Dar 32 bitų, nes n yra tik, kaip teigiama čia žodžio int int.
Bet ar tai gerai?
Atvirai kalbant, tai tikriausiai gerai, nes jei jūs manote apie tai,
eilutė yra daugiau laiko, aš ruošiuosi būti išsekimo
nes strlen ketina gauti vadinamas vėl ir vėl ir vėl
už kiekvieną kilpa iteracijos.
Ir šių dienų, mano Mac turi 2 koncertai RAM, šių dienų, 4 koncertai RAM kartais.
Manau, kad gali sau leisti 4 šių baitų faktiškai pagreitinti.
Bet tai bus kompromisą ir tema tikrai programavimo ir kompiuterių mokslo
niekada gauti ką nors nemokamai.
Jei norite pagerinti kažką čia, jūs turite mokėti už jį Kita vertus kažkaip.
Erdvė priklausomai nuo laiko, ir šiuo atveju.
>> Taigi tai buvo viskas veda link kažkas paslaptingas, kaip tai,
kuris, kaip jūs tikriausiai supratote, dabar, iš tikrųjų sako?
[Nesigirdi studentas atsakas] >> Taip, taip, tai yra, Būtinai gerti savo Ovaltine
iš tikrųjų, naudojant algoritmą, vadinamą ROT13 ROT 1-3,
, kuris tiesiog reiškia, pasukti visas raides 13 vietų,
, o tai reiškia, imtis ir tada jai 13 ir eiti tašką, taškas, taškas
visą kelią iki 13 laiške toli, padaryti tą patį, B ir C ir D, ir taip toliau.
Ir todėl, jei mes iš tikrųjų konvertuoti tai čia naudojant 13 vietų pasikeitimą,
mes susisieksime ką mažai Ralphie, kuri buvo Būtinai gerti savo Ovaltine.
Bet dabar problema nustatyti 2, standartinis leidimas bent
turite rūšies tai padaryti šifravimo sau,
ir mes turime kažkaip imtis panašaus į tai įvesties ir užšifruoti ar iššifruoti ją.
>> Taip, tai kurioms šie pagrindai rūšies veda mus į šia galimybe?
Paimkime šiuo Trečiasis pavyzdys čia atrodo.
Visų pirma, ji vadinama ASCII. Ką ASCII grąžinti?
Amerikos standartinis informacinių mainų kodas,
kuris yra tikrai ilgas kelias pasakyti, ką? Kas yra ASCII?
[Nesigirdi studentas atsakas] >> Kas tai? >> [Studentas] pobūdžio struktūra. >> Pobūdžio struktūra.
Jis tiesiog žemėlapiai numerius į laiškus, nes pasaulis yra standartizuotas
kokie numeriai atspindi tai, ką raidės, kad mes visi galime naudotis kompiuteriais
ir mūsų programos yra tik suderinama, kai jis ateina į spausdinti ekrane dalykų.
Taigi priminti, kad 65 atsitinka atstovauti, 97 atsitinka atstovauti mažosiomis.
Ir todėl tai paprasta programa ASCII yra pasinaudoti šio fakto
kad pasaulis žino, kad kapitalas yra 65 - ir tai tik spausdinimo priskyrimą.
>> Taigi, kol mes pasinerti į šio kodekso, leiskite man, o ne atverti terminalo langą.
Leiskite man eiti į priekį ir padaryti ASCII, ir tada tegul tiesiog paleisti tai, ką tiesiog sugadinti produkciją.
Ir tai tiesiog daro: tikrai didelis schema, kad tik man sako, įvairius kodus
įvairiuose laiškuose.
Taip super paprasta programa, bet aš neturiu į kietąjį kodą šias 52 eilutes produkcijos:
26 didžiosiomis raidėmis, 26 mažosiomis raidėmis.
Vietoj to, aš padariau tai programiškai su porą vyrių.
Pastebėsite, ką aš čia.
Aš pakartota iš i 65 iki 65 + 26, nes norėjau atspausdinti 26 raides
anglų abėcėlės rašmenimis, i + + kiekvienos iteracijos, o dabar pastebėsite tai dar kartą.
Tai mūsų draugui typecasting pasikartojimo
, pagal kurią jums konvertuoti 1 duomenų tipą į kitą
nes tai, ką aš noriu daryti šioje konkrečioje programoje?
Noriu skaičiuoti skaitmeniniu būdu, nes tai, kaip aš užaugau skaičiavimo - 65, 66, 67, ir tt -
bet aš nenoriu spausdinti tik skaičius.
Noriu atsispausdinti laišką, po kurių yra skaičius.
Norėčiau atspausdinti A: skaičius, B:, bet aš galiu tai padaryti su tuo pačiu miesto kintamojo.
Taigi, aš atsispausdinti% c, kaip vietos rezervavimo ženklo simbolį,
Skaitmuo arba skaičius vietos rezervavimo ženklas:% d.
Tada, ką aš prijunkite už šių 2 vietos rezervavimo ženklai?
Aš pirmą kartą prijungti simbolių ekvivalentas i, ir tada aš spausdinti i save.
>> Taigi pastebėsite tai tiesiog veikia.
Lygiai taip pat galiu mesti iš float int
, kad eiti nuo realaus skaičiaus iki sveikojo skaičiaus,
čia aš galiu eiti iš int char, kuris yra šiek tiek keista -
ne visai žemėlapį į realiame pasaulyje - bet kompiuteriuose
char yra tik po gaubtu,
todėl mes vis tiek aiškiai čia prie kompiuterio, sakydamas:
printf, spausdinti ne aš kaip 65, atspausdinti jį kaip savo skaičių ekvivalento.
Ir paaiškėja, kad aš techniškai nėra net to reikia.
Ką aš darau prieš akimirką aiškiai liejimo
nurodant, koks duomenų tipas, aš noriu eiti ir iš.
, Bet pastebėsite, kad aš jau turiu šį rezervavimo ženklo% C
ir tas kitas% c vietos rezervavimo ženklas.
Nors tai ne int, kompiuteris supranta, kad char,
tai tik po gaubtu int.
>> Taigi, jei aš iš tikrųjų perkompiliuoti ir iš naujo paleisti programą ASCII,
pastebėsite, kad jis vis tik veikia, nes kompiuteris supranta, kad yra tokia korespondencija.
Dabar svarbu padaryti aiškų liejimo plaustų pasaulyje Ints
dėl to, kad jūs iš tikrųjų apskaičiuotą sprendimą:
išmesti viską po kablelio.
Čia tikrai nieko išmesti, nes charakteris yra tiesiog skaičius,
ir eilutė yra tik simbolių masyvas.
Taigi, kai ateina laikas įgyvendinti tam tikrą užšifravimas arba iššifravimas,
kaip tai, kad iš tiesų galime versti kažką panašaus į tai nesąmonė,
Būtinai gerti savo Ovaltine?
Ką daryti, jei mes žinome dabar - Paimkime kaip prielaida, kad pagrindinis
skaičius, kad mes sukasi visus šiuos laiškus, numeris 13?
Pasakyta iš B raide visą kelią iki Õ sakinio pradžioje,
Būtinai gerti savo Ovaltine, nes jei aš B
ir tada aš einu, C, D, E, F, G, H, I, J, K, L, M, N, O,
tai, kodėl B raide šifravimo tampa O
nes Aš ką tik pridėjo 13 į jį.
>> Taigi, jei aš noriu iššifruoti tai, aš iš esmės turi imtis O ir tada 13 iš jo atimti.
Arba, tiesą sakant, nes ten yra 26 raidės abėcėlės, tai yra nuostabiai simetriškai,
Taip pat mes galime tiesiog pridėkite 13 ir mes susisieksime raidė B.
Bet kaip tu apie kažką panašaus į tai Cezaris
ar tikrai manipuliuoti stygas apskritai?
Jei laiškas B numeris?
Kas yra raide B? Todėl 66, tiesa?
Taigi, jei laiškas yra 65 ir raidė B - 66,
taip 66, viskas, ką turite padaryti, jai 13, ir tai suteikia man 79.
Ir jei mes einame į mūsų mažai Cheat sheet, 79 tiesų žemėlapiai ant O.
>> Bet čia yra šiek tiek kampe bylos.
Kas yra, tarkim, raidė Z?
Jei mes darome 66 + 25 gauti visą kelią iki abėcėlės pabaigos, mes 91.
91 + 13 suteikia man 104, ir atspėti, ką?
104 nėra lygi didžiąsias raides.
Leiskite grįžti prie šiek tiek apgauti lape.
Jei aš iš naujo paleisti šią programą prietaiso, pranešimas, kad 104, jei aš einu atgal į terminalo langą,
104, matyt mažosiomis val.
Taigi, mes turime kai kuriuos pagrindinius apgauti čia tam, kad įsitikinti, kad, kai mes pradedame Z
ir mes pridėsime 13 nenorime tiesiog laikyti uoliai didesni ir didesni.
Ką mes tikrai norime daryti?
Norite vyniojami aplink.
>> Taigi, it turns out, kaip jūs mačiau tikriausiai skyriuje dabar ir pati problemą, spec
suprato, kad tai yra kitas operatorius C, kad taip pat yra procento ženklas,
bet kadangi mes naudojame% čia nurodyti vietos rezervavimo ženklą,
žinoti, kad, ypač problemą, 2, yra taip pat kažkas panašaus į tai:
int x = y% z.
Leiskite man tiesiog pateikti tai, kaip labai bendro pobūdžio forma.
Procentų tai, ką programavimo kalba? >> [Studentas] Modulo.
Modulį, kuris yra išgalvotas būdas pasakyti, likusią dalį.
Nors yra nežymus skirtumas su apibrėžimu ten,
tai reiškia, padalinti y z, bet negrįžta padalijimo rezultatas;
vietoj to, grąžinti likusią dalį.
>> Taigi, jei y iš tikrųjų yra 3 ir z yra faktiškai 2, 3 padalinti iš 2 - 1 nuo 1 likusiam
Taigi, ką x faktiškai lygus šiame scenarijuje? 1.
Tai toks paprastas, žemo lygio idėja.
Tai užtrunka šiek tiek laiko gauti jūsų protas, apvyniotas aplink jį
todėl, kad tai tikriausiai buvo kartu, nes jūs net turėjo rūpintis likučiuose
ir iš tikrųjų juos naudoti kažko kryptingą,
tačiau šiuo atveju paprastas faktas, kad galite pereiti nuo didelis skaičius kaip 3
santykinai nedaug, pavyzdžiui, "2" ir vyniojami aplink efektyviai
naudojant mažesnės vertės, kaip 1, likusią dalį bus neįkainojama triukas
kad mes galime naudoti tiek kažką panašaus į Cezario ir šio Kitas dalykas Vigenere
problema nustatyti 2, tačiau tai bus pasikartojanti triukas visą semestrą.
Tai paprasta, paprasta idėja tik atsižvelgiant likusią apskritai
ketina leisti mums į kuriuos vyniojami aplink.
Ir kaip mes pradėti žaisti su matricomis, kaip mes pradėti žaisti daugiau pati su atmintim,
taps vis daugiau ir daugiau galingas apgauti.
>> Taigi kokių nors klausimų, tada ASCII arba eilučių atstovavimo kaip masyvai?
Ir mes priimsime jį 1 įpjova toliau. Taip.
[Nesigirdi studentas klausimas] >> Geras klausimas.
Ką tai reiškia, kai kintamasis turi žvaigždutę priešais jį?
Leiskite man atidėti, kad atsakyti į bet išsamiai,
bet kuris reiškia su tema, žinomas kaip rodykle.
Patarimų turite padaryti su atmintim, ir mes iš tikrųjų šiandien
žengia pirmąjį žingsnį link to diskusijos,
bet dabar, leiskite man apsimesti, kad žvaigždė neegzistuoja
ir mes toliau ragina eilutes eilutes, o ne naudojant char *
jūs tikriausiai matė prieš ir aš įdėti ekrane, vos akimirką kaip erzina.
Taigi, mes grįžti į, kad būdas išsamiau, nei daugelis iš jūsų tikriausiai patinka.
Galų gale, ne šiandien. Taip.
>> [Nesigirdi studentas klausimas]
Kokiame kontekste jūs turite suteikti kurio nors požymio ženklas? >> [Studentas] Yeah.
Taigi pagal numatytuosius nustatymus, kai jums nereikia įdėti A +, tik teigiami skaičiai prielaida.
Taigi, jei tiesiog parašyti skaičių 1, tai teigiamas 1.
Jei jūs iš tikrųjų norite nurodyti, kurių vertė neigimą,
jūs tiesiog turite padaryti -1 savo klaviatūroje.
Bet tai tikriausiai nėra jūsų klausimas. >> [Nesigirdi studentas atsakas]
>> Geras klausimas. Gerai.
Taigi tai turi daryti, aš surinkti, su tam tikrą klaidą, jūs paleidote į
nes jums konvertuoti sveikasis skaičius į simbolį,
bet kažkaip negatyvumo įsitraukė
ir taip charakteris tiesiog išėjo munged kažkaip.
Taigi dabar, leiskite man per daug supaprastinti šiek tiek, kol mes grįžtame prie šio temą natūra.
Dabar, galvoti apie visus tokiu būdu - ir tai yra supaprastinimas.
Bet sveikasis skaičius pasaulyje, jūs turite, kiek bitų savo žinioje?
Jūs turite 32 bitų.
Ir iki šiol, mes kalbėjome apie visų sveikųjų skaičių, todėl jis gali atstovauti
yra maždaug 4 mlrd. iš viso, nes jūs turite 32 bitų,
kad 2 iki 32, kad maždaug 4 mlrd.
Bet mes matėme prieš savaitę arba 2, kad jūs ne iš tikrųjų turėti skirtas numerių intervalas
nuo 0 iki 4 mlrd.
Diapazonas, o ne eina iš maždaug neigiamą 2 mlrd teigiamas 2 mlrd.
Bet tai tada kyla klausimas, kaip jūs atstovaujate neigiamą 2 mlrd. Sąvoka
jau nekalbant apie neigiamas 1?
Nes dabar, mes galime daug supaprastinti ir tiesiog pasakyti, kad mes ketiname naudoti kairiausias tiek
iš tų 32 bitų, ir, jei tai yra 1, tai neigiamas skaičius,
ir jei jis 0 tai teigiamas skaičius.
Problema su tuo Supaprastintas neigiamais skaičiais
yra tai, kad, jei jūs sąmoningai protingas ir bando konvertuoti simbolį, skaičių,
arba atvirkščiai, nėra tokio dalyko, kaip neigiamo pobūdžio.
Į ASCII, kuris naudoja tik 8 bitus, visi 8 iš tų bitų klausimu pasaulyje,
ir kairiausias tiek neturi nieko daryti su negatyvumo.
Ir tik būtų aišku, kai aš sakau, kairiausias bitai,
pamiršti, kad mes padarėme mūsų bit susijusių pavyzdžių per pirmą savaitę
priminti, kad mes padarė dalykų, pavyzdžiui, 1001101, kažką panašaus į tai.
Kai aš sakau, kairiausias tiek, aš tiesiog pažodžiui reiškia 1, kad rašote visą kelią per į kairę.
Taigi simbolių pasaulyje nėra negatyvumo sąvoka,
, kad labiausiai į kairę nutolusį šiek tiek iš tikrųjų turi kažką daryti su ASCII, nieko daryti su negatyvumo.
>> Taigi jis skamba kaip - ir iš kontekste sunku atsakyti tiksliai -
bet kažkaip, kad jūsų kodas buvo klaidinami, kad kairiausias tiek, kiek ty neigiama reikšmė
, kai ji tikrai buvo nagrinėjamo pobūdžio.
Ir vėl, aš oversimplifying, nes kompiuteriai iš tikrųjų kažką šiek tiek mėgėjas
nei tiesiog pakeisti, kad kairiausias šiek tiek į 1, lyginant su 0 minuso ženklu.
Jie, o ne, jei esate įdomu "Google", naudokite kažką, paprastai vadinamas 2 įgula,
kuris yra labiau išprusę požiūrio
tačiau idėja yra galų gale tas pats.
>> Taigi trumpai tariant, ji turėjo daryti su tuo, kad jūs masažo skaičių į simbolį
arba atvirkščiai, bet Jūsų kodas nebuvo informuota apie tai,
kad 1 iš tų bitų reikšmę skaičių pasaulyje.
Kad tai ne tas atvejis simbolių pasaulyje.
Bet tai skamba kaip jums nustatė, tokiu atveju proceso inscenizacijos dabar. Kiti klausimai.
Gerai.
Taigi, iki šiol, visi mes aprašiusi programų ėmėsi įvesties gal nuo naudotojo
funkcijų kaip GetInt, GetString,
arba jei jūs skaityti į priekį įvairiose knygose ar interneto nuorodos,
jūs patys galėjo naudoti funkcijas, pavyzdžiui, scanf, kuris, tiesą sakant, mes naudojame CS50 bibliotekoje.
Bet per savaitę arba 2, mes iš tikrųjų parodyti jums, kaip CS50 biblioteka įgyvendino
, kad galėtume imtis šių mokymo ratus apskritai.
>> Tačiau paaiškėja, yra ir kitas būdas gauti informacijos iš vartotojo.
Tiesą sakant, mes patys buvo naudojant komandinės eilutės argumentai
porą savaičių dabar.
Kiekvieną kartą, kai mes paleisti Apsukite metalinis garsas arba mes paleisti, kad,
mes ne tiesiog atspausdinti Apsukite metalinis garsas, Enter, mes ne įvedėte padaryti, įveskite.
Ką mes paprastai parašyta po žodžio Apsukite metalinis garsas ne mūsų terminalo Windows "raginimo lange?
[Studentas] failo pavadinimas. >> Failo pavadinimas, tiesa?
Hello.c arba mario.c arba nepriklausomai nuo failo vardas yra.
Ir šia prasme, tai, ką jūs tikrai padaryti jūs įtakos Apsukite metalinis garsas elgesį
nes tikrai turėjau ne idėja, kad mažai tau metų žmonės, kurie rašė Apsukite metalinis garsas
buvau ketinate programą, pavadintą rašyti mario.c metų.
Taigi, jūs turėjo kažkaip paveikti tos programos elgesį,
ir kad programa Apsukite metalinis garsas turėjo būti parašyta taip, kad jis gali priimti indėlį iš jūsų
žodžių apie greitą to, kol naudotojas paspaus Enter.
>> Taigi paaiškėja, kad tam tikrą laiką mes buvome skelbiantis beveik visi mūsų programos
pradėti kaip int main (void) - ir tada mes nuėjo į priekį
ir pradėjo rašyti savo kodą.
Ir mes galime turėti tam tikrą aštrus yra failo viršuje
bet beveik visi mūsų programos šiol pradėjo
nors galite mačiau skyriuje, knygose, interneto nuorodos
kad tai nėra iš tikrųjų turi negaliojančiu.
Kitas teisėta forma tai užtruks yra int argc ir tada styginių argv [].
Taigi, dabar, kas tai yra tai reiškia?
Paaiškėja, kad argc, kuris yra žmogaus konvencija būtų galima pavadinti šį foo
bet tai būtų tiesiog daug mažiau aiškus skaitytojams -
argc tiesiog argumentas, funkcija vadinama kad iš esmės atitinka tai, ką?
Ką argc stovėti tiems, kurie susipažinę?
>> [Nesigirdi studentas atsakas] >> Taip, argumentų ar argumentas Count.
Tai taip paprasta, kaip kad.
Kiek argumentai buvo perduotas į programą?
Ką tai reiškia?
Jei aš paleisti į komandų eilutę kažką panašaus į tai - Apsukite metalinis garsas mario.c -
argc, kai aš paspauskite "Enter" ketina imtis vertės 2 dalies painiai.
Taigi paaiškėja, kad argc yra argumentas skaičius,
tačiau dėl istorinių priežasčių, iš pačios programos pavadinimas yra įtrauktas į tą skaičių.
Taigi argc yra 2, kai aš parašė Apsukite metalinis garsas mario.c.
Ką argv yra?
Visų pirma, argv atrodo eilutę, bet ne visai
, nes paskutinį mėnesio trečiadienį ir juo labiau šiandien,
šiuos skliaustus pažymėti, ką? Štai masyvas.
Nėra jokios masyve skaičių, ir kad turėtų prasmės intuityviai
, nes žmonės, kurie rašė Apsukite metalinis garsas metų tikrai turėjau ne idėja,
Kiek žodžių žmonės kaip mes įvesti komandinėje eilutėje prieš paspausite klavišą Enter.
>> Taigi, šiuo atveju čia jie pareiškė, pagrindinė funkcija, kaip atsižvelgiant argumentų masyvo,
0 arba daugiau argumentų.
Jie nežino iš anksto, kiek yra,
todėl yra sąmoningai nepateikiama viduje šių laužtiniuose skliaustuose.
Bet faktas, kad yra laužtiniuose skliaustuose pasako kompiuteriui,
tikėtis masyvą.
Argv yra tik argumentas, vektoriaus sutrumpinimas notacijos.
Vektorius išgalvotas būdas pasakyti, masyvas,
ir masyvas yra išgalvotas būdas pasakyti, sąrašą arba surinkimas.
Taigi tai tiesiog reiškia, kad jei jums reikia parašyti pagrindinis, kaip tai
, o ne, pavyzdžiui, kaip mes jau tai daro pastaruosius porą savaičių,
jūsų programa dabar turi teisę priimti komandinės eilutės argumentai
kad nebegali padaryti turite rašyti Mario ir tada paspauskite Enter,
tada įveskite numerį, kaip daugelis blokai aukštos norite piramidės,
tada paspauskite "Enter" dar kartą.
Mes net nereikia naudoti GetString nebėra arba šiuo klausimu GetInt arba GetFloat.
Mes galime tik tikėtis, kad vartotojas galėtų tuos žodžius komandinėje eilutėje save
Apsukite metalinis garsas autoriai kaip ir nusprendžiau, kad būtų tikrai erzina programa
jei sudaryti savo kodą, kurį pirmą kartą įvedėte Apsukite metalinis garsas, paspauskite Enter,
tada mes sakėme, kad vartotojas, prašome įveskite failo, kurį norite rinkti vardą,
tada mes įvesti mario.c ir paspauskite Enter.
Bet tai, ką mes jau daro mūsų vartotojams pastaruosius porą savaičių.
Mes naudojame GetString ir palaukti, kol programa veikia greitai įvesties.
Kad nebereikia būti.
>> Taigi šiame pavyzdyje čia, dabar mes turime string argv,
ir tai taip pat yra supaprastinimas,
mokymo ratai, labai greitai nukristi.
Tai tinkamas būdas rašyti šią alternatyvią deklaraciją pagrindinis
nes paaiškėja, kad tai, ką mes nuolat ragina eilutę iš tikrųjų turi žvaigždę,
žvaigždutė, jo faktinis apibrėžimą, bet tai tik atrodo sudėtingas,
tai painu iš pradžių, todėl mes supaprastinti tiesiog sukurti dvasia sinonimas
CS50 bibliotekoje, kad žemėlapiai char * šiuo atveju daugiau patogią žodžio eilutę.
>> Todėl galime iš tikrųjų bando tai tada. Leiskite man eiti į priekį ir atverti gedit čia.
Leiskite man eiti į priekį ir atidaryti argv iš 1.
Matyt Ši programa spausdina argumentus, bet ir anglų kalba,
žiūri šį kodą, ką tai daryti konkrečiau?
Jei aš tipo į komandų a.out foo bar, kas bus atspausdintas mano juoda ir balta lange?
A.out foo bar, "Enter".
Eiti į priekį. Taip. >> [Nesigirdi studentas atsakas]
Geras. Taigi a.out, nauja linija, foo naują eilutę, baras, nauja linija.
Kodėl taip yra? Mes tikrai gali patvirtinti tik akimirką.
Tai yra rūšies purus eilutę kodo.
Jis tiesiog spausdina naują eilutę tik, kad viskas gražiau ekrane.
Tai yra kilpa, kad manimi iteravimu nuo 0 iki argc,
ir tai yra pokyčio kiekvienos iteracijos + +.
Todėl tai dabar sako, spausdinti eilutę, kaip teigiama šio% s.
Argv [i] yra gana daug pati idėja iš ankstesniame pavyzdyje.
Mes naudojamas paskambinti kintamojo s, dabar jis vadinamas, savavališkai, argv.
Tai reiškia, spausdinti ith argumentą, kad įvedėte į komandų eilutę,
ir po tai visa tai daroma, tiesiog gera priemonė spausdinti kitą naują eilutę.
>> Taigi pažiūrėkime tai. Leiskite man atverti terminalo langą.
Leiskite man sudaryti argv 1, o dabar leiskite man paleisti argv iš 1, Enter. Hmm. Gerai.
Leiskite paleisti foo juostą. Įdomu. Baz.
Ir jei jūs kada nors susimąstėte, kodėl aš tipo tai,
tai tik taip pat kvailas kompiuterių mokslas konvencija.
Pasaulis dažnai turi tik žodines rezervuotų žodžių.
Taigi, jei norite kalbėti apie kai generinių vaistų eilutę,
kompiuterių mokslininkai tiesiog linkę pasakyti, foo, kada jie turi atsitiktinį žodį,
tada jie sako juostą, jei jie turi antrą atsitiktinį žodį,
tada jie sako baz, jei jie turi 1/3 žodį, tada jie sako qux jei jie reikia ketvirtą žodį,
ir ten didžiulis religinis diskusijos internete, kas ateina po qux
todėl jūs galite "Google", kad išsiaiškinti, kas kitas savavališkai žodis turėtų būti.
Bet visa tai neturi reikšmės kokia,
nors foo bar, jei jums "Google", kad tai turi prasmę,
etimologija ia dalis.
>> Taigi, visi tai daro tada spausdina 1 šių kiekvienoje eilutėje stygos.
Taigi, jei aš vietoj, nors norėjo gauti šiek tiek mėgėjas,
tarkime, kad aš nenorėjau spausdinti kiekvieną eilutę vieną eilutę;
Aš norėjau spausdinti visus simbolius iš kiekvieno kiekvienoje eilutėje eilutę.
Kaip aš galėjau vietoj tai padaryti?
Ką reikia pakeisti apie šią programą, jei aš noriu spausdinti ne kiekvieną žodį
bet aš noriu spausdinti kiekvieno žodžio raidę laišku,
tada kitas žodis raštas laišku?
Kaip mes sujungti šias idėjas iki šiol? Taip.
[Studentas]% c. >> Gerai. Taigi, mes kažkur reikia% c.
Gerai, nes aš nenoriu spausdinti visus eilutes, noriu spausdinti simbolių. Ką dar?
>> [Nesigirdi studentas atsakas] >> Įdomios
Taigi mums reikia rūšiuoti antrojo aspekto čia dabar
argv kaip masyvo, nes manote, bet tai eilučių masyvas.
Tačiau, kaip, pavyzdžiui, prieš 15 minučių, kas eilutė? Tai simbolių masyvas.
Taigi tikrai, argv simbolių masyvo masyvas
matricos simbolių masyvas.
Taigi paaiškėja, kad mes galime naudoti tik daugiau kvadratinių laikiklis žymėjimai. Todėl galime tai padaryti.
Šio on line 19 linijos viršuje, aš ruošiuosi kartoti nuo I iki argc,
bet tada aš ruošiuosi tai padaryti:
už - aš negaliu naudoti, aš dabar.
Aš dar vieną kintamąjį, nes noriu pakartoti tuos žodžius,
, bet tada taip pat per žodžių raidėmis
kad aš tarsi turi vertikalią ašį ir horizontalią ašį, Rūšiuoti konceptualiai.
Taigi int j gauna 0, tada aš noriu padaryti, taip ilgai, kaip j mažiau nei j - ir aš valyti tai šiek tiek vėliau.
Kaip aš galiu pakartoti per raidėmis eilutę? Mes padarėme tai metu senumo.
Strlen argv [i]. Geras.
Ir vėl, aš šiek tiek neefektyvumą čia ne kurti n ar kas,
bet mes grįžti prie to.
>> Taigi dabar, j + +. Dabar turiu įtrauka dar čia.
Ką man dabar norite spausdinti ant kiekvienos iteracijos?
[Nesigirdi studentas atsakas] >> Taigi [i] duos man žodį.
[I] [j], tarsi matricą.
Tie iš jūsų, su matematikos y sluoksnių,
mes tarsi indeksavimo dar giliau į šią matricą ar šis masyvas masyvai,
Tai 2-jų dimensijų struktūrą.
Taigi, dabar galime pamatyti, kas vyksta čia. Leiskite man atverti savo didesnę terminalo langą.
Leiskite man pakartotas kad argv iš 1.
Ir aš įsukus čia, o tai yra gera pamoka, nes aš taip pat pamiršo tai padaryti.
Netiesiogiai skelbiantis C bibliotekos funkcija "strlen 'tipo" unsigned
Aš net žinoti, ką Šiomis priemonėmis poilsio, bet aš mačiau tai anksčiau,
netiesiogiai skelbiantis.
, Kai mes matome šią klaidą, ką tai paprastai reiškia?
>> [Nesigirdi studentas atsakas] >> Aš pamiršau biblioteką iki viršaus. Bet palaukit minutėlę.
Paprastai aš prisukamas, nes aš pamiršau CS50 biblioteką, tačiau tai yra.
Paprastai aš įsukus nes Aš pamiršau standartinį I / O.
Ir, tiesą sakant, aš net ne to reikia. Mes ne naudojant GetString šiandien.
Taigi, ką aš nematomas?
Yra ir kita biblioteka, kad dabar mes turime naudoti retkarčiais, pavadintą string.h,
ir tai tik dar vienas biblioteka, kuri turi daugiau funkcijų, kurių nėra standartinio I / O.
>> Taigi, grįžkime mano didelis terminalo lange.
Gerai. Dabar, po velnių, aš manau, aš klydau. Aš naudoju CS50 biblioteką.
Taigi, mes galime išspręsti šią problemą vienu iš 2 būdų.
Mes galime imtis mokymo ratus dabar ir tiesiog daryti tai,
arba tegul rūšies supaprastinti laikyti, kad tik dabar, nukopijuokite šį atgal į,
išspręsti šią problemą, ir dabar grįžti į terminalo langą.
Taigi, viskas būtų aišku, į CS50 bibliotekoje yra ne tik funkcijas,
jis taip pat raktažodį eilutę, kuris yra, kodėl ta klaida tiesiog atsitiko.
>> Taigi čia mes einame. I fixed bibliotekų klausimais. Įveskite. Geras.
Argv 1, foo bar, "Enter". Puikus.
Taigi dabar mes turime kiekvieną 1 už linijos spausdinta kiekvieno žodžio raidę
nereiškia, kad labai įdomi programa,
bet pranešimas dabar mes turime ne tik iteravimu ant žodžio galimybes
bet ir per atskirų žodžių raidžių, kuris skamba siaubingai susipažinę
net paprasčiausių programų, tokių kaip stengiamasi raidėmis, kaip šiuo eilutę.
Eikime į priekį ir imtis mūsų 5-minučių pertrauką.
Ir kai mes einame atgal, mes pradėsime kalbėti apie efektyvumą
su kuria mes galime padaryti šiuos dalykus geriau.
>> Gerai. Mes atgal.
Dėka vieno iš mūsų TFS, kurie vaidina daug bananagrams
mes iš tikrųjų turime visa krūva simbolių pas mus čia šiandien
fiziškai įsikūnijo su šių mažai plastikinių detalių,
ir leiskite man pasiūlyti, kad šis tuščią baltą šiferis čia atstovauja mano kompiuteryje RAM -
nešiojamas, darbastalio, nesvarbu - ir išvaizda jo daug
nes jei mes pradėsime Siekanina šį RAM į mažus baitų dydžio gabalėliais,
tegul savavališkai sako, kad kažkas, kad dydis ir kad neryškus atstovauja -
čia mes einame, ir tegul nutolinti šiek tiek čia -
tarkime, kažką, kad dydis sudaro vieną baitą.
Taigi, mes galime iš tikrųjų tilptų visa krūva baitais arba simbolių viduje šio atminties,
kaip siūloma čia santykinio dydžio.
>> Taigi, tarkime, dabar, kad tikslas yra paskirstyti atmintį eilutę.
Kaip tai faktiškai dirba?
Programas, mes buvo raštu, mes paprastai naudoju GetString
bet dabar, aiškiai, tai kitas kanalas, per kurią mes galime gauti vartotojo įvesties argv
per komandinės eilutės argumentai.
Bet tai, kas iš tikrųjų vyksta po kapotu?
Pasirodo, jei mes vadiname - tegul pereikite atgal į GetString - funkcija GetString
į CS50 bibliotekos, vartotojas paskatino eilutę,
vartotojas įveda kai kuriose žodžio - tegul bus HELLO.
Ir mes per pastaruosius keletą savaičių buvo sakydamas, kad grįžti vertė GetString
iš tiesų yra eilutė, kaip žodžio HELLO.
>> Bet kas yra GetString tikrai daro?
Kaip vartotojas Sveiki, Įveskite tipų, GetString yra suprasti,
gerai, kiek simbolių yra? Tai H E L-L-O.
Todėl ji turi skirti, ji turi paprašyti Operacinė sistema - Linux šiuo atveju -
laikyti ne mažiau kaip 5 baitų HELLO.
Ir ką ji tada pajamos daryti, kai jis gauna atgal tuos 5 baitų iš operacinės sistemos
yra išdėstyti HELLO atgal atgal atgal atgal.
Ir taip, kas iš tikrųjų grįžo iš GetString duomenų riekė, kad atrodo taip.
Bet tai yra šiek tiek netikslios, nes paaiškėja, kad tai nėra taip paprasta,
kaip tik saugoti,, labas "kompiuterio atminties
nes tarkime, kad mano programa, kad aš rašau, C, tada ragina GetString vėl,
ir kitas žodis vartotojas įveda į Bye, bye.
Na, man reikia, kad tilptų kad žodis bye kažkur atmintyje.
Aš negaliu Clobber HELLO.
Pavyzdžiui, aš nenoriu, kad kompiuteris tiesiog pradėkite perrašyti, kaip tai
originalus žodis, nes aš vis dar gali būti naudojant žodį HELLO kintamasis
kažkur mano programa.
>> Taigi B-Y-E, kad galų gale kažkur kitur atmintyje.
Tačiau konvencija paprastai yra tai, kad kitą eilutę, jums skirti
tikriausiai, bet ne visada, yra ketina baigti kitą atminties vietą.
Ir jei aš ne prašė operacinę sistemą už bet kokią atminties
, nes paskutinį kartą aš vadinamas GetString, šansai yra žodis BYE
ketina baigti iš karto po žodžio Hello in atminties.
Bet šiuo metu galite galbūt kai potenciali problema.
Nes kitą gabaliukus kitą baitų atminties, kad buvo tik nemokamai -
švaraus balto šiferis - kompiuterio atmintyje buvo šalia HELLO,
jis jaučiasi pirmą eilutę, aš paprašiau gali staiga pakeisti
nes aš iš esmės pasikeitė, kad ji HELLOBYE
vietoj kažkaip demarcing Bye pradžią ir pabaigą "Hello.
>> Taigi paaiškėja, kad tai, kas iš tiesų vyksta po gaubtu,
, kurį galėjo prabėgomis interneto nuorodas arba skyrių arba knygų
ar ne tik dar yra tai, kad iš tikrųjų sąmoningai demarkavimas
tarp žodžių kompiuterio atmintyje.
Ir iš tikrųjų, šiuo atveju čia, o ne tiesiog įdėti bye šalia HELLO,
vietoj to, kad kompiuteris kelia ypatingą pobūdį, ypatingą null simbolių, taip sakant,
, kuriai atstovauja įžambiu kairiniu brūkšniu 0 rodiklis.
Taigi, ilga istorija trumpa, priminti, kad ženklai yra atstovaujama ASCII.
ASCII yra tik kartografavimo tarp skaičių ir raidžių,
ir dauguma iš šių laiškų pradėti maždaug 65 sostinę,
tačiau paaiškėja, tu tikrai gali atstovauti sveikasis skaičius 0 arba dvejetainiu,
ir paaiškėja, pasaulis nusprendė seniai, seniai: "Jūs žinote, ką?"
"Leiskite atsargų skaičius 0 neatstovauja jokių simbolius klaviatūroje -
"Ne raidės, ne skaičiai, ne skyrybos. 0 yra ypatingas."
"Tai bus ypatingas null charakteris, ir mes ketiname rašyti jį kaip \ 0".
Skirtumas yra, jei mes tiesiog parašė 0, 0 yra simbolis.
Prisiminkite, kad yra ASCII kodai 0, 1, 2, 3
nes simbolis 0 skiriasi nuo skaičių 0.
Ir jūs galite pamatyti, kad jei pažvelgti atgal 1 savaitę, kai mes pirmą kartą kalbėjo apie ASCII,
0 ir 1 ir 2 ir 3 visą kelią iki 9 turėjo savo ASCII kodus.
Jie ne atsitiktinai, nuo 0 iki 9. Jie yra labai skirtingi.
Taigi 0 tiesiog reiškia "Aš esu ypatinga" ir \ 0 reiškia, pažodžiui, "Aš nesu 0 charakteris".
"Aš tai ypatingą vertę, null simbolis".
Todėl aš iš tikrųjų reikia dar vienas iš jų, nes aš negaliu padaryti tą pačią klaidą du kartus.
>> Taigi po žodžio bye, mes taip pat ketiname reikia dar vieną šių null simbolių.
Leiskite man paimti mano rašiklį čia ir leiskite man greitai atkreipti kitą \ 0
taip, kad po to, kai aš paprašiau operacinę sistemą 2 stygos
per GetString kitą skambutį GetString,
tai, kas iš tikrųjų atmintyje.
Taigi, kai aš grįšiu eilutę, aš tikrai gauti atgal, kad,
ir kada aš gausiu kitą eilutę, aš tikrai gauti atgal, kad.
Taigi tai kyla klausimas, strlen, visų pirma, koks jis turėtų grįžti?
Kai aš vadinu strlen eilutė ir žodis HELLO, kad vartotojas turi įvesti,
ką mes akivaizdžiai sako, "Hello ilgis buvo prieš kelias minutes?
Tai buvo 5, tiesa? H E L-L-O. Ir tai tikrai kaip strlen darbai.
Ji grąžina, ką normalus žmogus būtų galima tikėtis, eilutės ilgis.
Bet iš tikrųjų, kaip didelis ženklų, kad saugoti Apie masyvas?
Tai tikrai 6.
Taigi strlen nemini, kad tai jums.
Bet po gaubtu kompiuteris iš tiesų yra 6 baitų saugoti 5-raidžių žodį,
ir tai yra tiesa, nesvarbu, kiek laiko žodis.
Ten visada bus ypatingas null pabaigos simbolis eilutės pabaigos
savo bendras ilgis demarc.
>> Taip, tada, jei esate asmuo įgyvendinimo strlen 20, prieš 30 metų,
kaip tu apie įgyvendinimo strlen save?
Mes priimame kaip savaime, kad jis egzistuoja, kaip mes priimame kaip savaime suprantamu dalyku, kad printf egzistuoja,
bet jei HELLO ar toks žodis
ir ką aš turiu atmintyje yra kažkas, kad atrodo taip,
jei Jums teko reimplement strlen, nes jums buvo paprašyta
arba todėl, kad, tiesą sakant, tu nežino, strlen egzistavo -
jums teko roll šį vieną į savo - kaip tai galima įgyvendinti strlen
kai kažką, kad atrodo taip?
Dabar, mes žinome, eilutė yra masyvas, mes galime kartoti per kiekvieną iš atskirų simbolių
naudojant kažką panašaus į - tegul manimi pabandyti tai padaryti skristi.
>> Leiskite man eiti į skalbyklę. Leiskite man sukurti naują failą, strlen.c.
Leiskite man eiti į priekį dabar, o apima stdio.h kad mes turime prieigą prie printf.
Leiskite man padaryti int main (void). Oh. Aš tiesiog tai padaryti savo dabar. [Chuckles]
Ačiū.
Tai, ką aš darau. Gerai.
Taigi, kol aš pasuko ekrane, aš įvedėte visa tai.
Ir dabar, ką aš ruošiuosi daryti yra tokia:
printf ("Duok man eilutę:")
Tai tiesiog pūkuotas instrukcijos.
Dabar leiskite man padaryti Styginių s = GetString.
Aš jau reikia dabar padaryti pakeitimą.
Aš naudoju CS50 biblioteką staiga, todėl leiskite man eiti į priekį ir įvesti cs50.h.
Ir dabar galime tai padaryti: printf ("ilgis:% d, strlen [S] -
ir aš dar ne viskas. Ką dar turiu įtraukti į šią programą?
>> [Studentas] string.h. >> String.h.
Taigi dabar mes naudojame strlen, tad įsitikinkite, kad kompiliatorius žino, jei tai,
todėl šiek tiek normalumas patikrinti.
Gaunu linija 8 eilutę, ir atsižvelgiant į 9, aš spausdinti savo ilgio su% d.
Taigi eikime į priekį ir atidaryti tai padaryti.
Mes strlen - kaupia gerai -
strlen - leiskite man padidinti - Enter, H-E-L-L-O, "Enter". Ilgis yra 5.
>> Gerai, kad strlen atrodo, kad darbas, bet žinojo, kad pasaulis.
Taigi tegul dabar įgyvendinti strlen save taip.
Leiskite man pasinaudoti šia biblioteka toli.
Mes jau nebeturi prieigą prie string.h, nes aš net nežinau, ji egzistavo.
Bet tai gerai, nes aš galiu įgyvendinti strlen save
ir jį įvesties eilutę, vadinamą
ir dabar man reikia išsiaiškinti šios eilutės ilgį.
Taigi, kaip aš galiu tai padaryti?
Ką daryti, jei aš - pažiūrėkime, kaip tai padaryti - Ką jūs norite daryti?
>> [Nesigirdi studentas atsakas] >> Gerai.
Taigi, mes galime tai padaryti įvairiais būdais krūva. Leiskite man pabandyti šio požiūrio.
Leiskite man duoti sau yra int kintamasis i, kad aš prasideda 0.
Ir leiskite man pasakyti štai ką: o įvesties [i] nėra lygus į tai, ką? \ 0
Taigi, it turns out, kaip ir su visais simboliais Rengdama juos tiesiog programoje,
turite naudoti kabutes, o ne dvigubų kabučių.
Taigi, jei aš buvo raštu raidė a, aš norėčiau padaryti, kad B raide, aš norėčiau tai padaryti.
Ši, priešingai, būtų eilutę, o ne individualių savybių.
>> Taigi aš noriu \ 0 pažodžiui. Ką aš noriu daryti šio ciklo?
Tiesą sakant, man reikia kitą kintamąjį, todėl int ilgis gauna 0.
Net jei jūs nežinote, kodėl mes pradėjome taip, kaip mes padarėme,
dabar, kad mes ketiname žengti šiuo keliu, ką aš noriu padaryti, 9 on-line?
ilgis + + ir tada žemyn čia on line 10 ", grįžti ilgio.
Taigi, kaip strlen įgyvendintas?
Tai tikriausiai, kaip tai iš tikrųjų įgyvendinti.
Gal asmens naudojamas už linijos, o gal ir do while cikle - kas žino?
Mes norime iš tikrųjų turi atrodyti po gaubtu šaltinio kodą
kai kurie failų vadinamas string.c tikriausiai.
>> Bet čia galime galvoti apie tai, ką aš darau.
Aš skelbiantis kintamasis vadinamas i, nustato, per kiek laiko ji lygi 0.
Tada aš skelbiantis Kitas kintamasis vadinamas ilgis, nustato, per kiek laiko ji lygi 0.
Tada aš sakau, o-osios veikėjas įvesties į ypatingą null pobūdžio, \ 0 nėra lygus,
prieaugio ilgį.
Bet kuo greičiau osios charakteris yra tai specialus simbolis, kas atsitiks su kilpa?
Jis trumpųjų jungimų. Sustos, kuris reiškia, kad mes tada iš karto grįžti ilgis.
>> Taigi, jei aš ne bałagan, eikime į priekį ir grįžti į mano terminalo lange.
Leiskite man perkompiliuoti. Ir aš susukti.
Nesuderinama pakartotinis aprašas bibliotekų funkcija strlen.
Taigi aš bandžiau gauti per protingas čia mano paties labui.
Kompiliatorius iš tikrųjų žino, kad yra funkcija, vadinama strlen
nors mes ne biblioteką. Tai gerai. Koks skirtumas.
Mes tiesiog ketina bendradarbiauti tada. Leiskite pervadinti šį ilgį.
Leiskite man pakeisti jo naudojimą tam tikro ilgio atkarpomis, čia, ir tai leis Apsukite metalinis garsas laimingesni.
Kaip panaikinti, nes kai kurios iš šių funkcijų yra taip darn bendras
strlen, prinf - jie iš tikrųjų turi rūšiuoti specialų statusą.
Ir taip Apsukite metalinis garsas tiesiog žino apie juos šiek tiek kažką ypatingo.
Tai ne visada su daugeliu funkcijų, todėl tai, kodėl mes turime rėkė.
>> Leiskite man pabandyti dar kartą. Laimei, jis dirbo tą laiką.
Taigi dabar leiskite man paleisti savo strlen programą.
Give me a eilutė: H E L-L-O Įveskite. Ir aš įsukus.
Kodėl? >> [Nesigirdi studentas atsakas] >> Taip.
Taigi, aš turiu save čia labai gražus begalinis ciklas
nes nors aš incrementing ilgį kiekvienos iteracijos,
ką aš aiškiai nedarote? Aš ne i pokyčio. Gerai. Lengva nustatyti. Taip?
Gerai. Nr Dabar mes paleisti susipykus kai kurių kitų dažnai pasitaikanti klaida, kai man reikia skliausteliuose.
Ir, tiesą sakant, šis kodas pradeda atrodyti negraži,
todėl mes imtis Pabandyti išvalius šią akimirką.
Bet dabar aš incrementing tiek ilgio ir aš.
Atvirai kalbant, aš jau matau, galimybė tobulėti, bet mes grįžti į kad.
>> Taigi dabar galime tiesiog įsitikinkite, kad mes bent jau daro pažangą.
Tai nutiko iš jūsų kelias, ir aš nesirūpino paminėti tai iš anksto.
Kai jūs turite kaip šis scenarijus nelaime, kaip jums išspręsti šią problemą
trumpas paleisti įrenginį arba kompiuterį arba uždaryti langą?
Tai tikrai paprasta.
Reguliatorius C atsiųs tai mažai morkų C simbolį, ir kad tik nutraukia dauguma programų.
Jei turite tikrai bloga begalinį ciklą, kad spausdinimo stuff be galo daug kartų,
kartais jums gali tekti paspausti valdymo C tūkstantį kartų, kad ji iš tikrųjų išgirsti.
Taigi, tiesiog suprasti, dabar, nes aš nieko nespausdina, tai buvo gana lengva.
Ir techniškai, jeigu pakanka, bet aš gauti nekantrus ir aš paprastai paspauskite jį, kad daug kartų.
>> Taigi strlen. Duok man eilutę: Hello. Jis ketina dirbti šį kartą?
Gerai. Kita dažnai pasitaikanti klaida. Ar perkompiliuoti.
Tai buvo apgalvotas, kad vienas. Gerai.
Taigi strlen, H-E-L-L-O Enter. Puikus.
Taigi dabar mes turime strlen iki 5.
Taigi mes tiesiog reimplemented tuo ratu.
Taigi dabar galime valyti tai padaryti, nes tai nereiškia, kad man įspūdį
su mano kodas dizainą.
Ką mes galime aiškiai pašalinti šioje programoje valyti tai padaryti?
[Nesigirdi studentas atsakas] >> Taip. Pažodžiui, mes gydant I ir ilgis vienodai.
Tad kodėl gi ne, mes tiesiog gauti protingas ir pasakyti, o ilgis?
Atvirkščiai, tegul tik jį vadiname ilgis pradėti, inicijuoti iki 0
nes pagal nutylėjimą eilutė neturi ilgio, kol mes išsiaiškinti, kas tai yra.
>> Dabar mes tai padaryti, ir dabar tai yra gana elegantiškas programa.
Vienas kintamasis. Aš išvalyti jį, sugriežtino jį.
Taigi dabar grįžkime mano terminalo lange. Eikime į priekį ir paleisti.
Padaryti strlen. Gerai atrodo. Dar kartą paleisti strlen Enter.
Give me a eilutė: Sveiki, Įveskite. Ir atrodo, kad reikia dirbti kaip 5.
Dabar aišku, jeigu aš nebuvo parašyta, pavyzdžiui, HELLO 1 eilutę
BYE kitoje, mes galime tikrai turi kelis žodžius.
Jei išraiška, aš iš tikrųjų norėjo įvesti HELLO, bet, pavyzdžiui,
HELLO PASAULIS, pastaboje (įspėjime), kad tai, ką mes nebūtume čia tokia situacija, tiesa?
, Kad būtų galima teigti, kad 2 stygos.
Jūs tikrai gali turėti Space bar simbolių, todėl, jei mes iš tikrųjų įvestas ilgesnį frazė
kaip Hello World, ką mes tikrai atmintyje
atrodo šiek tiek kažką panašaus, kad.
>> Gerai. Kokių nors klausimų apie atstovavimo čia stygų?
Ar ne? Gerai.
Taigi, aš anksčiau sakė, kad paskambinus strlen vėl ir vėl sąmoningai, kaip kad
tikriausiai nėra geriausia idėja, nes jūs ketinate daryti visai daug darbo
vėl ir vėl ir vėl.
Iš tiesų, kokį darbą yra būtina suprasti, eilutės ilgis, matyt?
Jūs turite pradėti iš pradžių, ir tada ieškoti, ieškoti, ieškoti, ieškoti, ieškoti
kol galiausiai matyti, kad specialų simbolį, o tada, ah, dabar aš žinau, ilgį.
Taigi, anksčiau, kai jau strlen vadinamas vėl ir vėl ir vėl,
priežastis, kodėl aš pasiūlė, kad buvo kind of stupid, nes vėl, kad eilutė atrodo taip.
Jis nesiruošia keisti kaskart pakartoti per kai kilpa,
taip darote nereikalingo darbo.
Tuo pačiu metu, jūs turėtumėte žinoti, kaip panaikinti, kad kaip Apsukite metalinis garsas kompiliatoriai šių dienų
buvo sukurta per daugelį metų,
ir kompiliatorių, rašytojai, programuotojai, yra gana protingas.
Ir taip paaiškėja, kad Apsukite metalinis garsas ir kitos kompiliatorius iš tikrųjų gali išsiaiškinti, kad
gerai, taip, jūs rašė strlen į Jūsų būklę,
, kurie yra techniškai reiškia, kad mes vadiname jį vėl ir vėl ir vėl.
Bet protingas kompiliatorius iš tikrųjų galite optimizuoti šių neturtingų vartotojų sprendimų rūšių
iš savo kodą į žalos atlyginimą dalykų.
>> Taigi, tai tik suvokti, kad kartais kompiliatorius yra protingesni už mus
rūšies slėpti mūsų pačių klaidas.
, Bet tikrai, kai jis ateina į probleminių rinkinių ir, pavyzdžiui,
nereikia galvoti apie tuos esmės klaidingų projektinių sprendimų
galbūt dėl ​​tos paprastos priežasties, kad mes norime daryti būdas daugiau darbo
nei mes iš tikrųjų turi daryti. Bet kiek daugiau darbo?
Hello world, pradėkime apibendrinti šios problemos dydį.
Kas problemos ar problemos dydis, ilgis
kai žodis vartotojas turi įvesti "Hello"?
Tai matyt 5, gal 6. Plius arba minus 1. Koks skirtumas.
Tai taip arti, mes tiesiog vadina jį 5.
>> Taigi, kas yra problemos dydis, bandant išsiaiškinti Hello ilgis?
Tai 1, 2, 3, 4, 5, o gal ir 6 paskutinę pobūdžio, bet galime apibendrinti, kad n.
Taigi, n, tik kintamasis n, tai, ką kompiuterių mokslininkai paprastai naudoja
apibūdinti problemos dydį, ir ši problema po ranka, kiek laiko yra Hello?
Kiek laiko strlen imtis?
Jis tampa n žingsnių siekiant, kur kiekvienas žingsnis reiškia pažvelgti simbolį,
pažvelgti į simbolį, pažvelgti į simbolį.
Ir mes turėjome šią diskusiją, o atgal, kažkas operacijų skaičius užtrunka.
Mes jau pačią pirmą dieną klasėje visi nerangiai atsistoti,
ir tada visi pradėjo Kergimas tarpusavyje
siekiant iš tikrųjų skaičiuoti, idealiai, kiek žmonių į kambarį.
Ir mes taip pat padarė vienas dalykas, pagal kurį, jei aš vietoj senosios mokyklos būdas
tik pradeda 1, 2, 3, 4, 5, 6 ir tt,
kad per daug, šią problemą dydis dydžio n. Nebuvo n žmonių kambaryje.
Bet aš negalėjau greičiu, kad, tiesa? Pradinėje mokykloje stilius gali pradėti skaičiuoti, 2s.
2, 4, 6, 8, 10, 12. Ir, kad jaučiasi taip daug greičiau, ir iš tikrųjų yra.
Tai tiesiog du kartus taip greitai, bet dar kartą, jei dar 400 žmonių vaikščiojo į šį kambarį
visi vienu metu, šie algoritmai imsis dar 400, o gal 200 veiksmus.
>> Tačiau priešingai, jei mes tikrai gauti protingas ir mes vietoj turėti visi iš jūsų tikėtis save,
Prisiminkite, kaip dirbo, kad algoritmas.
Jūs visi atsistojo. Leiskite man pirmyn į tai.
Jūs visi atsistojo, jūs suporuotas išjungtas, tada pusė iš jūsų atsisėdo,
pusė iš jūsų atsisėdo, pusė iš jūsų atsisėdo,
ir kiekvieno šią savaitę 0 kilpa iteracijos, mes perpus problemą po ranka
ir išvyko į N / 2, tada N / 4, tada n / 8.
Ir kad implikacija yra ta, kad jei dar 400 žmonės vaikščioti į kambarį, ne big deal,
tai užtruks 1 Daugiau ritinių, o ne 400 daugiau šoviniai, o ne 200 daugiau raundų.
Ir taip turėjo padaryti šiek tiek kažką su istorija, mes papasakojo, o atgal.
Šis raudona linija čia yra tiesinė, tai tiesiai, ir ji apibūdinama kaip n
nes kaip problema dydis auga,
jei jūsų algoritmas ar programa, su kuria jūs spręsti trunka n veiksmus,
mes galime nubraižyti kaip tiesią liniją, kur reikia daugiau laiko didesnis problemos mastą.
Ir twosies požiūris, skaičiuojant 2, 4, 6, 8, dar yra tiesi linija, tik šiek tiek geriau.
Tai užtrunka šiek tiek mažiau laiko, todėl, geltona linija yra žemiau raudona linija taškas taško.
>> Bet dar geriau tai šventasis Gralis ką mes vadinami logaritminis laikas
net jei mes dar kartą padvigubinti skaičių žmonių į kambarį,
mes du kartus, kad telefono knygos dydžio klasės nuo pirmos dienos,
ne big deal, ji užima daugiau 1 puslapio ašarą, trunka 1 daugiau sėdi
siekiant išspręsti problemą, kad du kartus didesnis.
Ir taip pokalbis mes dabar gauti pradėti yra
kaip mes iš tikrųjų spręsti problemas efektyviau
jei mes manome, problemų, pavyzdžiui, paprasčiausias?
Tarkime, turime 8 duris, už kurio yra kai kurie numeriai,
ir kiekvienas iš šių numerių nėra rūšiuojamos, bet kokiu būdu,
jie tiesiog atsitiktiniai sveikieji skaičiai už šių durų,
ir mes užduoti klausimą, kaip jums eiti apie tai, kaip rasti skaičių - kas žino -
7 už šių durų?
Ką jūs, žmogus, atlikite produktais tam kad rasti man su skaičiumi 7
jei vėl kiekvienas iš jų yra durys ir pamatyti reikšmę, jūs turite atidaryti duris?
Koks būtų jūsų algoritmas gal?
>> [Nesigirdi studentas atsakas] >> Taigi pradėkite su kairės ir atidaryti duris, atidaryti duris, atidaryti duris.
Ir blogiausiu atveju, kaip ilgai ji ketina imtis su mumis ir sužinokite, kurios numeris 7?
Ir vėl, jie nėra rūšiuojamos, todėl tai nėra taip paprasta, kaip, gerai, aš ruošiuosi atidaryti 7-ąją duris.
Tai gali užtrukti, maksimaliai, 8 žingsnių.
Blogiausiu atveju, 7 atsitiktinai durų linijos galo,
todėl mes galime turėti išbandyti visus n duris.
Taigi dar kartą čia, mes, atrodo, linijinis algoritmas.
Tiesą sakant, mes tai padarė tik prieš porą metų.
Vienas savo pirmtakų ginčijo būtent ši
kur mes neturėjome skaitmeninę versiją, mes vietoj lentos
su kai kuriais iš popieriaus gabalų.
Ir ką aš maniau aš norėčiau tai padaryti yra priimti greitai pažvelgti atgal, kaip tai buvo nustatyta,
vienas iš geriausių ir galbūt labiausiai nepatogu galimybių scenoje
demonstravimo čia Sanders.
Mes turėjome 2 eilučių skaičių.
Mes tik ketiname pažvelgti į tai, kas vyksta čia su Sean pačiame viršuje iš šių eilučių.
Jeigu niekas kada nors vėl savanoriai CS50
mes turėjome Sean palaiminimą, kad taip kamerą,
, kad jis žino, kad šimtai žmonių buvo žiūrėti šį dabar metus.
Bet Sean padarė nuostabų darbą - O gal jis - iš tikrųjų Kaip mus rasti tam tikrą skaičių.
>> Taigi pažiūrėkime, kaip jis išsprendė šią algoritmą taip, kad mes atnaujinti šį pokalbį prieš ilgas
kaip mes rasti dalykų efektyviai.
[Malan video] Aš paslėpta už šių durų skaičių 7,
bet Paslėpti kai kurie iš šių durų, taip pat yra ir kitų ne neigiami skaičiai,
ir jūsų tikslas yra galvoti apie šį viršutinėje eilutėje skaičių, kaip tik masyvo
ar tik popieriaus lapų su numeriais, už jų seka,
ir jūsų tikslas yra naudoti tik viršutinį masyvą čia, man su skaičiumi 7.
Ir mes tada ketiname aptarti, kaip jums eiti apie tai daro. >> Gerai.
[Malan] Kaip mus rasti skaičių 7, prašau.
[Juokas]
[Malan] Ne [juokas]
5, 19, 13, [juokas]. Tai nėra triukas klausimas.
1.
[Juokas]
Šiuo metu jūsų rezultatas yra ne labai gerai, todėl jūs galite taip pat nuolat vyksta. [Juokas]
3.
Eiti. Atvirai kalbant, aš negaliu padėti, bet įdomu, ką jūs net galvoti apie. [Juokas]
Tik viršutinėje eilutėje, todėl jūs turite 3 į kairę. Taigi rasti man 7.
[Studentai murmantys]
[Malan] 17.
[Studentai murmantys]
[Malan] 7! [Plojimai]
>> Taigi, trečiadienį, mes pasinerti į tai ir dar daugiau sudėtingus algoritmus, rasti dalykų.
Dabar mes palikti jus su Sean ir trečiadienį.
[CS50.TV]