[Powered by Google Translate] [Viikko 3]
[David J. Malan - Harvardin yliopisto]
[Tämä on CS50. - CS50.TV]
Saanen ohjaavat meitä suuntaan mihin jäimme viime kerralla,
joka alkoi ajatella vähän enemmän kuin noin syntaksi
ja yrittää ajatella hieman vähemmän siitä kaikki pienet yksityiskohdat
joka vie vähän aikaa tottua tähän mennessä kannalta puolipistettä
ja suluissa ja aaltosulkeita,
alkaa ottamaan asioita hieman korkeammalle käsitteellisellä tasolla
niin että ongelmat nyt alkaa ratkaista seuraavan useita viikkoja
tulevat ottamaan enemmän korkeamman tason käsitteellisiä ongelmia
ja vähän vähemmän syntaktisia kuin saat jalat märkä
ja kädet likainen joidenkin syntaksin näiden viimeisten viikkojen aikana.
>> Niin muistaa, että viime viikolla otimme käyttöön tämän käsitteen array.
Ja array Englanti voidaan kuvata mitä? >> [Äänetön opiskelijan vastausta]
Anteeksi?
Kokoelma? >> [Äänetön opiskelijan vastausta] >> Okei, hyvä.
Kokoelma kohteita. Joten näimme taulukot Scratch.
Jos sattui käyttää PSET 0 yksi Scratch n luetteloita, joita voi vetää asioita
kuten appelsiinit ja banaanit, inventaario tapaisena,
se on sellainen kuin mitä array on.
Ja sitten lisää teknisesti yhteydessä todellinen tietokone,
array on yksinkertaisesti yhtenäinen kimpale muistia.
Toisin sanoen, sinun on tavu, sitten toinen tavu, sitten toinen tavu, sitten toinen tavu,
ja jos oli piirtää niitä tavua kuvan,
he olisivat takaisin takaisin takaisin takaisin. Sitähän me tarkoitamme vierekkäin.
>> Joten se on tavu numero 1, sitten 2, sitten 3.
Se ei tarkoita täällä, täällä, täällä, täällä.
Array on yhtenäinen kimpale 0 tai enemmän tavua.
Joten mitä ne ovat hyödyllisiä?
Muistan meillä oli tällainen keinotekoinen esimerkki varastointi ihmisten tietokilpailu arvosanoja ohjelmaan
laskemaan Quiz keskimäärin jonkin kurssin,
ja muistuttaa, että voisimme aloittaa kirjallisesti ohjelma julistamalla muuttuja quiz1.
Silloin voisimme olla toinen muuttuja nimeltä quiz2.
Mutta sitten jos oli 3 tietokilpailuja tässä luokassa, quiz4.
Tai jos oli viikoittain tietokilpailu, olisi quiz5, quiz6, quiz7.
Joten sinulla olisi kaikki nämä muuttujat julisti sisällä main
tai muualla oman ohjelman
ja ongelma tämän lähestymistavan, helppo vaikka se on vain kopioida ja liittää,
on se vain nopeasti muuttuu hankalaksi.
Jumala varjelkoon sinulla oikeasti on 30 tietokilpailuja tai 50 tietokilpailuja.
Jos se on kuin lukion tyyliin päivittäin Pop Quiz,
sitten vain on naurettavan pitkä lista muuttujien julistetaan,
ja tämä vain hyvin nopeasti pääsee käsistä.
Se on ruma, se on vaikea säilyttää, se on niin paljon helpompaa typo
jos saat 1 numero kirjoitettu väärin jossain ohjelman.
>> Joten otimme käyttöön käsite array sijaan.
Ja muistaa, että otimme tämän ohjelman tekemällä vähän jotain tällaista.
Sallikaa minun mennä tänään Source 3. maanantai hakemistossa
ja avata array, jossa näimme viime kerralla.
Ja vaikka siellä oli pari uutta C temppuja täällä,
joukossa käsite vakio,
Muistutan, että me julistettu useita kohoissa pääasiassa käyttämällä seuraavaa syntaksia:
float, sitten muuttujan nimi, sitten käytetään hakasuluilla todella ensimmäistä kertaa,
ja mitä teimme sisällä näiden hakasuluilla tosiasiallisesti laittaa numero.
Mutta sen sijaan, että numero, laitan tämän aktivoidut sanan, tietokilpailuja.
Ja mikä oli motivaatio laskemisesta Aktivoitujen sana kuten tietokilpailuja
ja sitten käyttämällä linja 17: n temppu täällä todella antaa se numero?
Mikä oli motivaatio siellä? Joo.
>> [Äänetön opiskelija vastausta] >> Aivan.
Jos haluamme muuttaa tuota arvoa 2, meillä on vain muuttaa sitä 1 paikka
koska pitävät - En edes muista, mitä tämä ohjelma teki täsmälleen,
mutta jos vain vilkaista sitä näette tietokilpailuja, tietokilpailuja.
Näet tietokilpailuja, tänne lisää tietokilpailuja.
Eli jos meillä ei olisi tätä jatkuvaa, tämä teräviä määritellä,
olisimme kirjoittanut 2, sitten 2, sitten 2, sitten 2, joka on hieno. Olisi aivan yhtä oikeita.
Mutta oletetaan, että ensi vuonna meillä on 3 tietokilpailuja CS50.
Joten minun täytyy mennä ja päivittää koodin, minun täytyy kääntää se,
mutta ongelma on, jos teen jotain typerää, kuten minä unohtaa 1 mainittu 2
ja unohtaa plug 3, koko ohjelma saattaa hyvinkin rikkoa.
Joten me vain pyytää ongelmia.
>> Joten käsite vakio on kyse factoring joitakin pala tietoja,
onko se merkkijono tai char tai float tai mitä tahansa,
ja julistaa 1 paikka niin, että voit helpommin muuttaa sitä tulevaisuudessa.
Ja se on myös suoraan sanoen hieman helpompi lukea, koska jos vain ajatella tätä nyt,
se tietokilpailuja, tai voimme jopa nimetä se jotain NUMBER_OF_QUIZZES
tai jotain nimenomaista.
Koodi tulee vain hieman enemmän selvää siitä, mitä se tekee,
ja mietit hieman vähemmän mitä numero 2 voisi tapahtua tarkoittaa.
Joten jatkuva ollut mitään tekemistä pohjimmiltaan ryhmät.
Array otettiin käyttöön tapa näiden hakasuluilla.
>> Niin huomaat että linjaa 23 pyydämme käyttäjä, "Mitkä olivat tietokilpailun tulokset?"
Sitten meillä on vain tämä silmukka joka ilmeisesti kysyy käyttäjältä niiden arvosanat. Miten?
Se toistetaan 0-2. Ja sanon 2, koska tietokilpailuja kaikki korkit on tällä hetkellä 2.
Joten se toistetaan 0 enintään 2 ja sitten se tulostaa Quiz # jotain jotain,
ja sitten se käyttää GetFloat saada arvon käyttäjältä.
Joten huomaa tämä on ainoa uusi pala syntaksin viime keskiviikkona.
Jos haluat tallentaa jotain tietyssä paikassa että array,
taas käyttää hakasulkeissa.
>> Joten siellä vähän kahtiajako täällä.
Ensimmäisen kerran käytät hakasulkeita
käytät sitä määrittää kuinka iso haluat array olla.
Mutta tämä seuraava yhteydessä täällä missä olemme taas käyttävät näitä hakasuluilla
tarkoittaa jos siinä array haluat laittaa jotain arvoa?
Ja ero tässä voidaan päätellä yhteydessä.
Ilmoitus tästä on tietotyyppi, sitten meillä on nimi muuttujan,
Sitten meillä on hakasuluilla useita sisällä, puolipiste. Siinä kaikki.
Joten se ilmoitus.
Se on aivan kuin olisimme tehneet jotain float Grade1, float Grade2;
mutta jälleen kerran, tämä hyvin nopeasti lankeaa aivan liikaa kopioida, liittää,
joten sen sijaan me vain yksinkertaistettu sitä sellaisena,
mikä tarkoittaa sitä, tästedes meillä on arvosana, joka voidaan varastoida kiinnike 0,
meillä on toinen luokka, joka voidaan varastoida kiinnike 1,
mutta mitä jos minä hölmö ja esimerkiksi minun silmukka menee niin pitkälle -
Esimerkiksi, esitän pienempi tai yhtä suuri kuin,
mikä Recall oli lähde aiemman bug -
mikä käytännössä tarkoittaa sitä, että tiettyjen kolmansien vahingossa iterointia tämän silmukan
Käytän kiinnike 2. Tehokkaasti, mitä voisi tapahtua täällä? Anteeksi?
[Opiskelija] Se aiotaan korvata. >> Onko aiotaan korvata?
Mitä korvataan?
Tämä kirjaimellisesti sanoo korvata mikä on paikka 2 paluun arvo GetFloat.
Mutta ongelma on, kuinka suuri on array tässä vaiheessa tarinan?
[Äänetön opiskelija vastausta] >> array on edelleen vain koko 2
koska array, kuten mikä tahansa muuttuja, julistettiin ensin, ennen käytimme sitä,
ja me tässä määritetty tämän vuoksi jatkuvasti, että minulla on 2 arvosanoja että aion laittaa.
>> Mutta muistakaa, tietojenkäsittelyasiantuntijat alkavat laskien 0.
Niin ensimmäinen sijainnin siitä, että matriisi on kiinnike 0.
Seuraava sijainti on 1. Tämä asia on yhä niin vähän liian pitkälle yli puolelle.
Eli toisin sanoen, jos olen itse ollut tämä array -
ja haluan nähdä kuinka hyvin tämä toimii täällä meitä -
jos minulla on array, että olen yksinkertaisesti tehdä seuraavasti
ja olen varattu tilaa 2 elementtejä, voisin tehdä tätä näin muistiin
jos tämä iso valkoinen kangas on.
Se on vain RAM Minulla on tietokone, keikka RAM, 2 gigan RAM riippumatta,
mutta nämä 2 laatikkoa nyt erikseen edustavat kellua, 32 bittiä.
Joten jos laitan 1 numero täällä kuin 1,0, niin laitan toisen numeron täällä kuin 3,2
mutta sitten minä kannatin 2, se on kuin laittaisi jotain.
Ja kuten kuva osoittaa, siellä ei ole mitään.
Se on tavallaan kuin ei-kenenkään maalla, koska en ole pyytänyt käyttöjärjestelmä
antaa minulle tämän kolmannen tietokilpailu.
Jos halusin että kolmansien tietokilpailu, minun olisi pitänyt ennakoimaan
kysyä käyttöjärjestelmä sen ilmoittamalla tietovisoja saa olla 2
vaan sen sijaan yhtä 3.
>> Eli toisin sanoen, kuva meillä tehokkaasti käsillä näyttää tältä täällä.
Tämä taas ei ole kenenkään maalla. Meidän on parempi olla yrittää kirjoittaa arvoja täällä.
Mutta jälleen kerran, koska tietojenkäsittelyasiantuntijat laskea 0,
kun puhumme tästä sijainnista array, että pitäisi olla paikka 0,
Tämän on tarkoitus olla paikka 1, ja tämä ei ole edes olemassa
sillä me vain pyytänyt käyttöjärjestelmän 2 tällaisissa paikoissa.
Joten ne teistä etukäteen ohjelmointi kokemusta muista kielistä
tietäisivät, että tämä ei aina päde pakkoja tai asioita kutsutaan vektoreiden.
Pikemminkin, voit vain pitää lisäämällä ja lisäämällä ja lisäämällä asioita paneelit,
jotka suoraan sanottuna meillä oli, että kyky Scratch ja silti näytä antaneen sen tänne
koska C-ohjelmoit paljon selkeämmin.
Se on vain sinä ja tietokone juuri nyt, ja tietokone on vain aikoo tehdä
mitä kerrot sen tehdä.
Joten jos vain kertoa se antaa sinulle 2 kellukkeet Poiketen linjan 22 täällä,
siinä kaikki mitä aiot saada takaisin käyttöjärjestelmä: tilaa 2.
>> Joten yhä ovat ohjelmia tulee joskus olemaan buginen osalta paneelit.
Tämä on vain eräänlainen luonne pedon jossa me kaikki olemme erehtyväinen,
ja jossain vaiheessa luultavimmin indeksi ylittää rajan oman array.
Ja se on vain hieno tapa sanoa menit kiinnike jotain
ja jotain oli aivan liian iso numero. Menit armoille oman array.
Mutta ylösalaisin nyt tämä.
Loput Ohjelman oikeastaan ​​ole mitään pohjimmiltaan tekemistä paneelit.
Se kaikki on vain joitakin yksinkertaisia ​​aritmeettisia tietotekniikkaa keskiarvoja.
Joten meillä on täällä tämä silmukka täällä ensin muuttuja nimeltään summa että meidän alustaa 0.
Sitten toistaa 0 enintään 2 uudelleen ja lisäämme siihen summamuuttujan
i luokan, joten kannatin 0 sitten kannatin 1.
Ja sitten kun tekisi alakoulussa laskea keskiarvon,
me yksinkertaisesti ottaa se summa, jakaa sen kokonaismäärä tietokilpailuja,
ja sitten kaiken kukkuraksi kutsumme funktio tässä kutsutaan kierroksella.
>> Nyt, kuten syrjään, mikä on käsitellä tämän sulkeissa int linjalla 34?
Se ehkä keksiä jo kohdassa, ei ole oikeastaan ​​puhuneet siitä virallisesti täällä,
mutta mitä tämä INT parens luultavasti tekee? >> [Äänetön opiskelijan vastausta]
Joo, tämä viittaa valu tai tyypittely,
mikä tarkoittaa, että otetaan 1 tietotyyppi ja muuntaa sen toiseen.
Et voi tehdä tätä kaikkien tietotyyppien koska joskus se olisi vähän outoa.
Mutta tässä tapauksessa, jos paluuarvo pyöreiden on float
koska loppujen lopuksi otan float ja jakamalla se numero kuin 2,
Aion saada takaisin float.
Mutta alakoulussa ihmiset eivät todella tietää, että heidän oli keskimäärin 93,4
koska he ymmärtävät he olivat aina niin lähellä, että 95 pyöristystä kohta.
>> Joten me haluamme sen sijaan käyttää int pyöristää kaikille lähimpään int-
joka tässä tapauksessa tulee olemaan 94, joilla ei ole kohta sen jälkeen.
Joten se on vain pieni matemaattinen temppu.
Ja me palaamme tähän käsitteeseen valu, koska sillä on vaikutusta,
jos et ole löytänyt jo, sillä ongelma asettaa 2.
Joten array sitten voit ajatella - se tulee tehdä minulle hymyillä koko päivän.
Tälle jos piirtää kuvan siitä,
mutta tärkeintä on, että koko on myös valinnut sinut
kun pyydät sitä käyttöjärjestelmästä.
Kaikki kysymykset sitten paneelit? Joo.
[Äänetön opiskelija kysymys]
Ah, hyvä kysymys.
Kysymys on mitä tapahtuu null 0 array? Se ei ole tässä yhteydessä.
Että on olemassa vain osana jouset, jotka aiomme tulla vain hetken.
Mutta array, kuten tässä tapauksessa, kaikki saat mitä pyydät käyttöjärjestelmä.
>> Ja kuten syrjään, ettei tämä olla epäselvä,
Minä pitää sanoa kysyt käyttöjärjestelmä, kysy käyttöjärjestelmä.
Käyttöjärjestelmä, kuten varmasti tiedätte, on Mac OS, Windows, Linux.
Kun soitat toimintoja kuten GetFloat
tai olet julistaa muuttujia, kuten arvosanoja,
lopussa päivä olet kysyy, joku muu antaa teille, että muisti
koska me pyrkivä ohjelmoijia
ei ole aavistustakaan siitä, miten todella saada fyysistä pääsyä muistiin.
Mutta joku tekee: käyttöjärjestelmä.
Siis sen lisäksi esittelee meille melko kuvakkeet ja valikot ja kansiot ja vastaavat
että näet työpöydällä, onko Mac-tai PC-
käyttöjärjestelmien myös tehdä alhainen arkipäiväinen kamaa,
erittäin teknisiä juttuja hallintaa gigatavu
tai 2 gigatavua muistia, että sinulla on, toimitusjohtaja CPU että sinulla on, ja niin edelleen.
Joten kun kirjoitat koodin,
olet todella koukkaaminen sisään käyttöjärjestelmän mielessä.
Aion pitää minimoida tämä. Selvä.
>> Muita kysymyksiä ryhmät?
Ei? Okei.
Joten siirtyminen luonnostaan ​​paneelit on todella aihe, joka on hieman tuttu.
Ja me katsoimme koskaan niin lyhyesti tällä viime kerralla liikaa.
Tämä oli merkkijono esimerkiksi keskiviikkona.
Tämä merkkijono esimerkki oli melko yksinkertainen ohjelma,
ja olen todella yksinkertaistettu sitä pari riviä nykypäivän tarkoituksiin.
Kaikki se vastaa 19 on saada merkkijonon käyttäjän tallentaa sen muuttujaan nimeltä s.
Sitten line 22 lähtien se on ilmeisesti tulostamista merkkijono 1 merkki per rivi.
Mutta miten se tekee tämän?
Olemme julistamisesta muuttuja i, jossa se yhtä suuri kuin 0,
ja tämä on tulossa vanha tapa nyt.
Emme olleet nähneet tätä vasta keskiviikkona, mutta voit eräänlainen päättelevät sen nimi
strlen palaa aivan mitä annettaessa s? Pituus merkkijono.
Joten jos kuljen se merkkijono, lainaus-lainaus päättyy DAVID,
se toivottavasti tulee palata minulle numero 5, koska David.
Niin, että sen tarkoitus elämässä on ottaa nuora, myös kova koodattu sinua
tai tässä tapauksessa kytketty muuttujana, koska argumentti,
ja se keksii mitä pituus, että merkkijono on.
>> Joten tässä nyt olemme lainaa joitakin merkintä edellisestä Quiz esimerkki.
Tällä ei ole mitään tekemistä kellukkeilla, ei ole mitään tekemistä tietokilpailuja,
mutta käy ilmi, että pieni valkoinen valhe olemme kertoneet teille, koska viikko 1
on, että merkkijono ei oikeasti olemassa C.
String lopussa päivä on oikeastaan ​​vain joukko.
Se joukko tavua, joten tavu, tavu, tavu, tavu, joka muistaa on vain 8 bittiä,
joten kimpale muistia, kimpale muistia, kimpale muistia, kimpale muistia.
Ja keinoista, joilla merkkijono toteutetaan
on laittamalla ensimmäinen merkki tästä,
Sitten täällä, niin tässä, niin tässä, takaisin takaisin takaisin tietokoneen muistiin.
Joten jos halusi täsmentää sana kuten Hei, sinulla olisi laittaa 1 merkki H,
sitten E, L niin L, sitten O - 5 merkkiä yhteensä - jossain tietokoneen RAM.
Mutta avain yksityiskohta on, että he aikovat olla takaisin takaisin takaisin takaisin,
vieressä toisiinsa.
Kun kun sanon s [i], mitä Englanti on tämä antaa minulle?
Mitä s [i] edustaa tässä asiassa? Joo.
>> [Opiskelija] i merkin merkkijono. >> Aivan. I merkki merkkijonon.
Nyt olen aikoo alkaa 0 kohti minun ja silmukka täällä,
mutta se on hyvä, koska kaikki alkaa laskien 0.
Joten s [0] on menossa edustaa kirjaimella H sanaa kuten HELLO,
s [1] on menossa edustaa kirjain, kuten E sanaa kuten HELLO, ja niin edelleen.
Ja mitä me näytämme tekevän jokaisen iteraation tämän silmukan
on väliaikaisesti tallennetaan i: nnen merkin muuttuja nimeltä c, joka on vain char,
ja sitten olemme tulostamalla c
niin, että loppujen lopuksi mitä tämä ohjelma tekee, on seuraava.
Jos menen lähde hakemistoon ja teen merkkijono1 ja minä mennä eteenpäin ja ajaa merkkijono1,
ja sitten kirjoita sana kuten HELLO, Anna, kaikki se on tulosta tämä 1 merkki kerrallaan.
>> Joten siellä mahdollisuus tarkentaminen täällä.
Olen sellainen tehdä enemmän työtä, vaikka se on enemmän selvää ehkä näin, kuin tarpeen.
Mitkä koodiriviä täällä voin varmaan heittää pois kokonaan? Joo.
Linjaa 24 pitkin. Linjalla 24 Olen julistamisesta muuttuja c.
Olen tallennetaan i luonnetta s siinä, mutta sitten olen käyttäen C täällä.
Joten olen käyttäen C, joten minusta tuntuu etten voi vain heittää linja 24 pois.
[Äänetön opiskelija kommentti] >> Aivan.
Joten kun se tulee puhumaan suunnittelusta ohjelmien
huomata tämän hieman yksinkertaistaminen koodin, joka on aivan yhtä luettavissa,
mutta ymmärtää, että s on vain muuttuja, sen tietotyyppi on joukko,
niin s [i] vain menossa heti takaisin sinulle i merkin merkkijonon.
Ja jos haluat tulostaa sen, että on hieno.
Sinun täytyy vain käyttää% c koska et ole tulostus merkkijono,
olet tulostaa merkin merkkijono, ja tämäkin on vaikutusta tulostaa nnen merkin.
Ja muistuttaa ainoa ero oikeastaan ​​viime viikolla käyttämällä printf
on, että taas viikon aikaisemmin tekisimme jotain erittäin yksinkertaista
kuten% s paikkamerkki sitten nimen merkkijono täällä,
Nyt olemme sukeltamassa hieman syvemmälle alla huppu ja sanoi,
älä tulosta merkkijono, tulostaa yhden merkin siinä.
>> Joten voimme tehdä jotain hieman erilaista täällä, koska siellä on 1 muu - ei bugi
koska tämä ohjelma on oikea, mutta olen tekemässä jotain typerää
että mainitsin lyhyesti keskiviikkona.
Mutta ajattelen, miten tämä ohjelman suunnittelussa voidaan parantaa entisestään? Joo.
[Äänetön opiskelija vastausta] >> Voi hyvä.
Niin muistaa, että otimme käyttöön toinen muuttuja nimeltään n viimeisen kerran,
joka näyttää ristiriidassa itsemme, koska minun tavoite sekunti sitten
oli vain heittää pois muuttuja tarpeettomana,
mutta muistuttaa, että keskiviikkona me todella teki tämän.
Muutin varten silmukan oikeastaan ​​pilkkua täällä, niin n = strlen,
ja sitten tänne tein i <n, niin tein askelin.
Mikä on perustavanlaatuinen vahvistus, että olen saavuttaa muuttamalla minun alustus tähän
ja tilani tämän nyt? >> [Äänetön opiskelijan vastausta] >> Aivan.
En muistuttaa strlen uudestaan ​​ja uudestaan ​​ja uudestaan, koska muistuttaa kuinka varten silmukka toimii.
Vaikka he alkavat saada monimutkaisempia näköinen,
muistuttaa, että asia ennen ensimmäistä puolipiste on alustus, joka tapahtuu kerran.
Ehto, vaikka on keskellä,
ja tämä saa tarkistetaan aina, kun läpi silmukan.
>> Joten se on tavallaan typerää kysyä tietokoneen saman kysymyksen uudestaan ​​ja uudestaan ​​-
Mikä pituus HELLO? Mikä pituus HELLO? Mikä pituus Haloo? -
sillä kuten näemme tänään ja keskiviikkona, tämä on ehdottomasti vie aikaa,
ja se ei ole kovin hyvä käyttää aikaa, koska selvittää pituus merkkijonon
todella vie hieman vaivaa.
Se ei ole hetkellinen, koska se on joissakin kielissä.
Joten muuttamalla tätä n, hinta olen maksaa mitä?
Näemme kauppa-off täällä.
Voin säästää aikaa ei pyydä samalla pirun kysymykseen uudestaan ​​ja uudestaan,
mutta se tulee maksamaan minulle jotain, joka on mitä?
>> [Opiskelija] menetät jonkin verran muistia. >> Aivan. Se tulee maksamaan minulle muistia.
Joten tässä tapauksessa se maksaa minulle mitä?
Toinen 32 bittiä koska n on vain int, kuten ehdotetun sanan int täällä.
Mutta onko se ok?
Suoraan sanottuna, se on luultavasti okei, koska jos ajattelee sitä,
pidempi merkkijono on, sitä enemmän aikaa aion tuhlata
koska strlen on menossa kutsutaan uudestaan ​​ja uudestaan ​​ja uudestaan
jokaisen iterointia silmukan.
Ja näinä päivinä, Mac on 2 gigan RAM, näinä päivinä 4 gigan RAM joskus.
Luulen varaa 4 niistä tavua todella nopeuttaa asioita.
Mutta tämä tulee olemaan kompromissi ja teema todella ohjelmatyössä ja tietotekniikassa
ja koskaan saada mitään ilmaiseksi.
Jos haluat parantaa jotain, joudut maksamaan sitä vastoin jotenkin.
Space ajan funktiona tässä tapauksessa.
>> Joten tämä kaikki johtaa ylös kohti jotain kryptisiä tällaista,
joka, kuten luultavasti tajunnut jo oikeastaan ​​kertoo?
[Äänetön opiskelija vastausta] >> Joo, joten tämä on, muista juoda Ovaltine,
todellisuudessa käytetään algoritmia kutsutaan ROT13, ROT 1-3,
mikä tarkoittaa vain pyörivät kaikki kirjaimet 13 paikkaa,
mikä tarkoittaa kestää ja sitten lisätä 13 sitä ja mennä piste, piste, piste
aina 13. kirjain pois, tee sama asia B ja C sekä D ja niin edelleen.
Ja niin jos me todella muuntaa tämän tästä käyttäen siirtyminen 13 paikkaa,
Palaamme mitä pikku Ralphie oli, joka oli, muista juoda Ovaltine.
Mutta nyt ongelmaan asetettu 2, Standard Edition ainakin
olet sellainen tehdä tämän salakoodausohjelmia itse,
ja meidän on jotenkin otettava tuotantopanosten kuten tämä ja salata sen tai purkaa sitä.
>> Joten mikä näistä perusteista tavallaan johtaa meidät tätä mahdollisuutta?
Katsotaanpa katsomaan tätä kolmatta esimerkki tästä.
Ensinnäkin sitä kutsutaan ASCII. Mitä ASCII palata?
American Standard Code for Information Interchange,
joka on todella pitkä tapa sanoa mitä? Mikä on ASCII?
[Äänetön opiskelija vastausta] >> Mikä tuo on? >> [Opiskelija] Merkistö. >> Merkistö.
Se vain karttoja numeroita kirjaimia koska maailmassa on standardoitu
mitä numerot ovat mitä kirjeet jotta me kaikki voimme käyttää tietokoneita
ja meidän ohjelmat kaikki ovat vain yhteensopivia, kun se tulee tulostaa asioita ruudulla.
Niin muistaa, että 65 tapahtuu edustamaan, 97 sattuu edustamaan pieniksi.
Ja niin tämä yksinkertainen ohjelma täältä ASCII on hyödyntää tätä seikkaa -
että maailma tietää, että pääoma on 65 - ja se vain tulostaa kartoitus.
>> Joten ennen kuin sukeltaa tähän koodia, anna minun vaan avaa terminaali-ikkuna.
Anna minun mennä eteenpäin ja tehdä ASCII, ja sitten mennään vain ajaa tätä asiaa vain pilata lähdön.
Ja se vain tekee tämän: todella iso kaavion että vain kertoo minulle kaikki eri koodien
Kaikkien eri kirjaimet.
Joten erittäin yksinkertainen ohjelma, mutta en tarvitse kova koodi niitä 52 riviä lähtö:
26 isot, 26 pieniä.
Sen sijaan tein tämän ohjelmallisesti kanssa pari silmukoita.
Huomaa mitä tein täällä.
Olen Iteroidun alkaen i on 65 jopa 65 + 26, koska halusin tulostaa 26 kirjainta
in Englanti aakkoset, i + + jokaisen iteraation, ja nyt huomaa tätä uudestaan.
Se toistumisen ystävämme tyypittely
jolloin voit muuntaa 1 tietotyypin toiseen
sillä mitä haluan tehdä kyseistä ohjelmaa?
Haluan laskea numeerisesti koska niin minä kasvoin laskenta - 65, 66, 67, ja niin edelleen -
mutta en halua tulostaa vain numeroita.
Haluan tulostaa kirjeen seuraa numero.
Haluan tulostaa: numero, B: numero, mutta en voi tehdä tätä täsmälleen sama muuttuja.
Olen siis tulostaa% c paikkamerkkinä merkin,
% D paikkamerkkinä numero tai numero.
Sitten mitä minä kytken niitä 2 paikkamerkit?
Olen ensimmäinen plug in luonteeltaan vastaava i, ja sitten tulostaa i. itse.
>> Joten huomaa tämäkin toimii.
Aivan kuten voin valettu float int
Jotta siirtyä todellisen numeron kokonaisluku,
täällä voin mennä INT char, joka on hieman outo -
ei aivan kuvautuvat todellisen maailman - mutta tietokoneet
char on vain numero alla huppu,
joten olemme on aina niin selkeästi täällä tietokone, sanomalla,
printf, tulostaa en 65, tulostaa sen sen numeerinen vastaava.
Ja en näköjään teknisesti ei edes tarvitse tätä.
Mitä tein hetki sitten nimenomaisesti valu
määrittämällä mitä tietotyyppi haluan mennä ja.
Mutta huomaa, että olen jo tämän Paikkamerkki% C
ja tämä toinen% c paikkamerkki tässä.
Vaikka tämä ei ole int, tietokone ymmärtää, että char,
se on vain int alla huppu.
>> Joten jos olen itse kääntää tämän ja uusintana ASCII-ohjelman
huomaa silti vain toimii, koska tietokone tajuaa että tämä kirjeenvaihto.
Nyt on tärkeämpää tehdä nimenomainen valu maailmassa kelluu ints
koska olet todella tehdä laskettu päätös:
heittää pois kaiken desimaalipilkun jälkeen.
Siellä oikeastaan ​​mitään heittää pois, koska merkki on vain numero,
ja merkkijono on vain joukko merkkiä.
Joten kun se tulee aika täytäntöön joitakin salaus tai salauksen,
miten on mahdollista, että voimme todella kääntää jotain tällaista hölynpölyä,
Muista juoda Ovaltine?
Mitä jos me tiedämme nyt - Otetaan kuin oletus - että avain,
numero että olemme pyörivä kaikki nämä kirjeistä, on numero 13?
Niinpä menimme kirjeestä B aina O alussa virkkeen
Muista juoda Ovaltine, koska jos en B
ja sitten menen C, D, E, F, G, H, I, J, K, L, M, N, O,
Siksi salaus kirjain B tulee O
koska olen vain lisännyt 13 siihen.
>> Joten jos haluan purkaa tätä, olen lähinnä on otettava O ja sitten vähentää 13 siitä.
Tai suoraan sanottuna, koska siellä on 26 kirjaimia, tämä on ihanan symmetrinen,
Voimme myös vain lisätä 13 ja saamme takaisin kirjaimella B.
Mutta miten edetä täytäntöön jotain tämän Caesar
tai oikeastaan ​​manipuloimalla merkkijonoja yleensä?
Jos kirjain B on mitä numero?
Mikä kirjain B? Joten se 66, eikö?
Joten jos kirjain on 65 ja kirjain B 66,
niin 66, kaikki minun täytyy tehdä, on lisätä 13 sitä, ja tämä antaa minulle 79.
Ja jos menemme meidän pikku lunttilappu, 79 jopa karttoja O.
>> Mutta on hieman nurkassa tässä tapauksessa.
Mikä on, sanovat, kirjain Z?
Jos teemme 66 + 25 saada aina aakkosten loppuun, me olemme 91.
91 + 13 antaa minulle 104, ja arvaa mitä?
104 ei yhtä iso kirjain.
Mennään takaisin hieman lunttilappua täällä.
Jos minä uusintana tämän ohjelman laitteeseen, huomaa, että 104, jos menen takaisin pääteikkunaa
104 on ilmeisesti pieni h..
Tarvitsemme siis joitakin keskeisiä temppu tässä varmistamiseksi, että kun aloitamme klo Z
ja lisäämme 13 sitä emme halua vain pitää taonta eteenpäin isompia ja isompia numeroita.
Mitä me todella haluamme tehdä?
Haluat Ulottumamitan.
>> Joten se kääntyy pois, kuten olet nähnyt varmaan jaksossa nyt tai ongelma joukon spec itse
tajusi, että tämä toinen operaattori C, joka myös on prosenttimerkki,
mutta että olemme käyttäneet% tästä määrittää paikkamerkin,
tiedämme, että erityisesti ongelma-sarja 2, siellä on myös jotain tällaista:
int x = y% z.
Haluan vain esittää tämän hyvin yleinen muoto tästä.
Prosenttia tarkoittaa mitä ohjelmointikieli? >> [Opiskelija] Modulo.
Modulo, mikä on hieno tapa sanoa loput.
Vaikka siellä on hieman eroa määritelmää siellä,
Tämä tarkoittaa jakaa y z, mutta älä palauta tähän jakoon;
sijaan, palauta loput.
>> Joten jos y on todella 3 ja z on todella 2, 3 jaettuna 2 on 1, jossa on jäljellä 1,
niin mitä x oikeastaan ​​yhtä tässä skenaariossa? 1.
Tämä on niin yksinkertainen, matalan tason idea.
Se vie vähän aikaa saada mieltäsi kääritty sen ympärille
koska se on todennäköisesti ollut jonkin aikaa kun joutui jopa välitä jakojäännöksiä
ja todella käyttää niitä jotain määrätietoinen,
mutta tässä tapauksessa yksinkertainen tosiasia, että voit mennä iso numero kuin 3
on suhteellisen pieni luku, kuten 2, ja sen jälkeen kietoa tehokkaasti
käyttämällä loput pienempään arvoon kuin 1 tulee olemaan korvaamaton temppu
että voimme käyttää sekä jotain Caesarin ja tämä toinen juttu Vigenere
ongelmatilanteissa asetettu 2, mutta tämä tulee olemaan toistuva temppu koko lukukauden.
Tämä yksinkertainen, yksinkertainen ajatus vain ottaa loput yleensä
on menossa, jotta voimme kietoa.
Ja kun alamme pelaa enemmän paneelit aloitamme pelaa enemmän muistia itse,
tämä on tulossa enemmän ja enemmän voimakas temppu.
>> Joten kysyttävää sitten ASCII tai edustus merkkijonoja taulukot?
Ja otamme sen 1 pykälän eteenpäin. Joo.
[Äänetön opiskelija kysymys] >> Hyvä kysymys.
Mitä se tarkoittaa, kun muuttuja on tähti edessä?
Saanen lykätä vastaamalla että yksityiskohtaisesti,
mutta joka viittaa viestiin tunnetaan osoitin.
Osoittimet on tekemistä muistia, ja olemme oikeastaan ​​tänään
ottaa ensimmäinen askel kohti tätä keskustelua,
mutta nyt haluan teeskennellä, että tähti ei ole olemassa
ja jatkamme soittamalla jouset jouset sijasta char *,
joka olet luultavasti nähnyt ennen ja laitan ruudulla vain hetki teaser.
Joten me palaamme, että siten tarkemmin kuin moni varmasti sinulle.
Lopulta, ei tänään. Joo.
>> [Äänetön opiskelija kysymys]
Missä yhteydessä sinun on annettava merkki merkki? >> [Opiskelija] Joo.
Joten oletusarvoisesti, kun et laita + vain positiivisia lukuja oletetaan.
Joten jos vain kirjoittaa numero 1, se positiivista 1.
Jos todella haluat määrittää kieltämistä arvon,
sinun kirjaimellisesti täytyy tehdä -1 näppäimistöllä.
Mutta tämä luultavasti ei ole kysymys. >> [Äänetön opiskelijan vastausta]
>> Hyvä kysymys. Okei.
Joten tämä on tehtävä, ymmärtääkseni, jonkinlainen bug juoksit
koska olit muuntaa kokonaisluvun merkki,
mutta jotenkin negatiivisuus sai mukana,
ja niin hahmo vain tuli ulos munged jotenkin.
Joten nyt haluan pelkistettyjen hieman kunnes palaamme tällaista aihetta.
Nyt ajatella asioita tällä tavalla - ja tämä on yksinkertaistava.
Mutta maailmassa kokonaisluku, sinulla kuinka monta bittiä käytettävissänne?
Sinulla on 32 bittiä.
Ja tähän mennessä olemme puhuneet kokonaismäärä kokonaislukuja voit siis edustaa
on noin 4 miljardia euroa, koska sinulla on 32 bittiä,
niin se on 2 32, niin se on noin 4 miljardia euroa.
Mutta näimme viikko tai 2 sitten, että et todellakaan ole eri numerot
0 on enintään 4 miljardia euroa.
Alue sen sijaan menee noin negatiivinen 2000000000 positiiviseen 2000000000.
Mutta tämä sitten herää kysymys, miten te edustatte käsite negatiivisen 2000000000
saati negatiivinen 1?
Nyt voimme pelkistettyjen ja sanoa, että aiomme käyttää vasemmanpuoleisinta bit
näistä 32 bittiä, ja jos se on 1 se negatiivinen luku,
ja jos se on 0 se positiivinen numero.
Ongelma, että yksinkertaistettu esitys negatiivisia lukuja
että jos tietoisesti olla fiksu ja yrittää muuntaa merkin numero
tai päinvastoin, ettei ole sellaista asiaa kuin negatiivinen merkki.
Maailmassa ASCII, joka käyttää vain 8 bittiä, kaikki 8 näiden bittien asia,
ja vasemmanpuoleisin bitti ei ole mitään tekemistä negatiivisuus.
Ja vain olla selkeä, kun sanon vasemmanpuoleisin bittiä,
muistuttaa, että kun teimme osamme liittyviä esimerkkejä ensimmäisellä viikolla
Muistutan, että olemme tehneet asioita, kuten 1001101, jotain tällaista.
Kun sanon vasemmanpuoleisin bitti, juuri kirjaimellisesti tarkoita 1 että kirjoitat aina yli vasemmalle.
Niinpä maailman merkkejä ei ole käsite negatiivisuutta,
jotta vasemmanpuoleisinta vähän todella on jotain tekemistä ASCII, mitään tekemistä negatiivisuus.
>> Joten se kuulostaa - ja ulos kontekstista on vaikea vastata tarkasti -
mutta jotenkin, koodi oli hämmentävää, että vasemmanpuoleisin bitti edustavan negatiivinen arvo
kun se todella oli osa merkin osalta.
Ja vielä, olen oversimplifying koska tietokoneet todella tehdä jotain hieman harrastaja
kuin vain muuttamalla se vasemmanpuoleisin bitti on 1, negatiivinen merkki vs. 0.
He sen sijaan, jos olet kiinnostunut Google käyttää jotain tyypillisesti kutsutaan 2 komplementti,
joka on hieman kehittyneempi toimintamalli,
mutta idea on lopulta sama.
>> Eli lyhyesti sanottuna, se oli tekemistä sen kanssa, että olit hierovat numeron merkki
tai päinvastoin, mutta koodi ei tietoinen siitä
että 1 näistä biteistä ollut merkitystä numeerinen maailmassa.
Se ei tapahtunut merkki maailmassa.
Mutta se kuulostaa korjasit, jolloin moot nyt. Muut kysymykset.
Okei.
Niin tähän mennessä kaikki ohjelmat olemme kirjoittaneet ottaneet tulo ehkä käyttäjältä
muodossa toimintoja, kuten GetInt, GetString,
tai jos olet lukenut eteenpäin useita kirjoja tai verkossa viittauksia,
olet itse saattanut käyttää toimintoja kuten scanf jotka suoraan sanottuna käytämme CS50 kirjastossa.
Mutta viikon tai 2, me todellakin näyttää, miten CS50 kirjasto toteutetaan
jotta voimme ottaa ne apupyörät pois kokonaan.
>> Mutta se muuttuu siellä toinenkin tapa saada käyttäjältä syöte.
Itse asiassa olemme itse ovat käyttäneet komentoriviargumentteja
muutaman viikon ajan.
Joka kerta olemme juosta clang tai olemme suorita make,
emme ole juuri kirjoittanut kalahtaa, Anna, emme ole kirjoittanut tehdä, Enter.
Mitä olemme yleensä kirjoitettu sanan clang meidän terminaalin ikkunoita nopeasti?
[Opiskelija] tiedostonimen. >> Tiedoston nimi, eikö?
Hello.c tai mario.c tai mitä asiaa tiedoston nimi on.
Ja siinä mielessä, mitä olet oikeasti tehnyt on olet vaikuttanut käyttäytymiseen clang
koska varmasti ihmiset kirjoittivat clang ei ollut aavistustakaan siitä, että pieni vanha olet
aikoi kirjoittaa ohjelma nimeltä mario.c vuotta myöhemmin.
Joten sinulla oli jotenkin vaikuttaa käyttäytymiseen kyseisen ohjelman,
ja että ohjelma clang oli kirjoitettu siten, että se voi hyväksyä syötettä
lisäämällä sanat kehote ennen käyttäjän osumia Enter.
>> Joten näyttää siltä, ​​että jonkin aikaa olemme julistaa lähes kaikki ohjelmat
aloittaa näin - int main (void) - ja sitten olemme menneet eteenpäin
ja alkoi kirjoittaa meidän koodia.
Ja meillä saattaa olla joitakin teräviä sisältää yläosassa tiedoston,
mutta lähes kaikki ohjelmat tähän mennessä on aloitettu tämän
vaikka olet ehkä nähnyt jaksossa, kirjoja, online-viittaukset
että tämä ei itse asiassa tarvitse olla mitätön.
Toinen laillisena tämä ottaa on int argc ja string argv [].
Mitä nyt on tämä mikä?
On käynyt ilmi, että argc, mikä on ihmisen yleissopimus - tätä voidaan kutsua foo-
mutta se olisi vain paljon epäselvempi lukijoille -
argc juuri on argumentti toimintoa kutsutaan pää, joka edustaa mitä?
Mitä argc seisomaan niille tuttuja?
>> [Äänetön opiskelija vastausta] >> Joo, useita väitteitä tai väitteitä count.
Se on niin yksinkertaista.
Kuinka monta argumenttia siirretty tähän ohjelmaan?
Mitä se tarkoittaa?
Jos komentorivillä olen juossut jotain tällaista - clang mario.c--
argc kun Enter aikoo ottaa arvosta, hieman erehdyttävästi, 2.
Joten näyttää siltä, ​​että argc on argumentti määrä,
mutta historiallisista syistä, ohjelman nimi itse kuuluu, että count.
Joten argc on 2, kun kirjoitin clang mario.c.
Mitä argv sisältää?
Ensinnäkin, argv näyttää merkkijonon, mutta ei aivan
koska kuten viime keskiviikkona ja sitäkin tänään,
Näiden hakasuluissa tarkoittavat mitä? Tuo array.
Ei ole numero array, ja että olisi järkevää intuitiivisesti
koska ihmiset, jotka kirjoittivat clang vuotta sitten todellakaan ollut aavistustakaan
kuinka monta sanaa meidän kaltaisemme olisivat kirjoita kehoitteeseen ennen Enteriä.
>> Eli tässä tapauksessa täällä he ovat julistaneet toiminnon tärkeimmät kuin ottaa erilaisia ​​argumentteja,
0 tai enemmän argumentteja.
He eivät tiedä etukäteen, kuinka monta niitä on,
joten ei tarkoituksellisesti määrä sisällä näitä hakasulkeissa.
Mutta se, että hakasuluissa ovat siellä kertovat tietokoneen,
odottavat array.
Argv on vain lyhennetty merkintätapa argumentti vektori.
Vektori on hieno tapa sanoa array,
ja joukko on hieno tapa sanoa luetteloon tai kokoelmaan.
Joten tämä tarkoittaa vain, että jos kirjoitat tärkein näin
sijaan, kuten kuinka olemme tehneet sitä jo viimeiset pari viikkoa,
ohjelma on nyt valta hyväksyä komentoriviargumentteja
niin että ei enää sinun tarvitse kirjoittaa Mario ja paina sitten Enter-
kirjoita numero kuinka monta lohkojen korkealle haluat pyramidin olla,
sitten Enter uudelleen.
Emme edes tarvitse käyttää GetString enää tai GetInt tai GetFloat että asiassa.
Voimme vain odottaa käyttäjän koneella kirjoitettuna kehoitteeseen itse
kuten kirjoittajat clang päättänyt, että olisi todella ärsyttävää ohjelma
jos kääntää koodi ensin kirjoitetaan clang Enter,
Sitten sanoimme käyttäjälle, kirjoita tiedoston nimi, jonka haluat kääntää,
Sitten me kirjoita mario.c ja paina Enter.
Mutta se mitä olemme tehneet meidän käyttäjien viimeisen parin viikon aikana.
Käytämme GetString ja odotamme, kunnes ohjelma on käynnissä pyytämään niitä syöttää.
Että ei enää tarvitse olla.
>> Joten tässä esimerkki tästä, meillä on nyt merkkijono argv,
ja tämäkin on yksinkertaistus,
apupyörät, että tulee hyvin pian pois.
Tämä on enemmän oikea tapa kirjoittaa tämän vaihtoehtoisen ilmoitus tärkeimmistä
koska näyttää siltä, ​​että mitä pidämme kutsuvan merkkijono todella on tähti,
tähti, sen todellinen määritelmä, mutta tämä vain näyttää monimutkaiselta,
Se on hämmentävää aluksi, joten me yksinkertaistaa jota vain luoda synonyymi tapaisena
vuonna CS50 kirjastossa kartat char * Tämän käyttäjäystävällisemmäksi sana merkkijono.
>> Joten itse kokeilla tätä sitten. Anna minun mennä eteenpäin ja avata gedit täällä.
Anna minun mennä eteenpäin ja avata argv 1.
Tämä ohjelma ilmeisesti tulostaa argumentteja, mutta Englanti kannalta,
katsomalla tämän koodin, mitä tämä tehdä tarkemmin?
Jos minä kirjoita komento a.out foo bar, mitä saa painettu mustat ja valkoiset ikkuna?
A.out foo bar, Enter.
Menkää. Joo. >> [Äänetön opiskelijan vastausta]
Hyvä. Joten a.out, uusi linja, foo, uusi rivi, baari, uusi rivi.
Miksi on näin? Voimme varmasti vahvistaa vain hetken.
Tämä on eräänlainen pörröinen koodirivin.
Se vain tulostaa uuden rivin vain tehdä asioita kauniimpi ruudulla.
Tämä on silmukka, joka on iteroimalla 0 on jopa argc,
ja tämä on kasvattamalla jokaisen iteraation + +.
Joten tämä sanoo nyt tulostaa merkkijonon, koska ymmärtää tämän% s.
Argv [i] on melko sama idea kuin edellisessä esimerkissä.
Kutsuimme muuttuja s, nyt sitä kutsutaan, mielivaltaisesti, argv.
Tämä tarkoittaa tulosta nnen väitteen, joka oli kirjoitettu komentoriville,
ja sitten kun tämä koko juttu on tehty, vain hyvä toimenpide tulosta toinen uusi rivi.
>> Joten katsotaanpas tätä. Saanen avata terminaali-ikkunan.
Saanen koota argv 1, ja nyt haluan ajaa argv 1, Anna. Hmm. Okei.
Katsotaanpa juosta foo bar. Mielenkiintoista. Baz.
Ja jos olet joskus miettinyt, miksi kirjoitan tätä,
tämä on vain myös tyhmä tietojenkäsittelytieteen sopimusta.
Maailma tarvitsee usein vain sanallista paikkamerkkejä sanoja.
Joten jos haluat puhua joitakin yleisiä merkkijono,
tietojenkäsittelyasiantuntijat vain tapana sanoa foo kun he tarvitsevat satunnainen sana,
Sitten he sanovat bar, jos he tarvitsevat toinen satunnainen sana,
Sitten he sanovat Baz jos he tarvitsevat kolmas sana, niin he sanovat qux jos he tarvitsevat neljäsosaa sana,
ja sitten on valtava uskonnollinen keskustelu verkossa, mitä tulee sen jälkeen qux,
joten voit Googlelle, että selvittää, mitä muut mielivaltaista sanan pitäisi olla.
Mutta nämä ole merkitystä lainkaan,
Vaikka foo bar, jos Google että tämä ei ole merkitystä,
joka on osa etymologia tässä.
>> Joten kaikki tämä tekee sitten tulostaa 1 näistä jouset riville.
Joten jos olen sen sijaan kuitenkin halusi saada vähän harrastaja,
Oletetaan että en halua tulostaa jokaisen merkkijonon kohti;
Halusin tulostaa jokaisen hahmon jokaisen kielen lauseita.
Miten voisin sen sijaan tehdä?
Mitä minun pitää muuttaa tästä ohjelmasta, jos haluan tulostaa ei jokaista sanaa
mutta haluan tulostaa jokaisen sanan kirjain kirjeellä,
Sitten seuraava sana kirjain kirjeellä?
Miten yhdistää nämä ideat tähän mennessä? Joo.
[Opiskelija]% c. >> Selvä. Joten me jossain tarvitsemme% c.
Hyvä, koska en halua tulostaa koko merkkijonoja, haluan tulostaa merkkiä. Mitä muuta?
>> [Äänetön opiskelija vastausta] >> Mielenkiintoinen.
Tarvitsemme siis tavallaan toisen ulottuvuuden täällä nyt
koska ajattelevat argv kuin array, mutta se joukko merkkijonoja.
Mutta kuten, kuten, 15 minuuttia sitten, mitä merkkijono? Se on erilaisia ​​merkkejä.
Siis todella, argv on joukko erilaisia ​​merkkejä,
joukko ryhmät merkkiä.
Joten näyttää siltä, ​​että voimme käyttää vain lisää hakasulje muistiinpanoja. Joten tehdään tämä.
Kun alkuun Tämän silmukan rivillä 19, aion toistaa mistä olen aina argc,
mutta sitten aion tehdä tämän seuraavasti:
sillä - En voi käyttää nyt.
Tarvitsen toisen muuttujan koska haluan toistaa yli sanat
mutta myös yli kirjaimet sanoja
joten tavallaan on pystyakselin ja vaaka-akseli, tavallaan käsitteellisesti.
Joten int j saa 0, niin haluan tehdä j kunhan j on pienempi kuin - ja Siivoan tätä ylös hieman.
Miten iteroida yli kirjaimet merkkijono? Teimme tämän hetki sitten.
Strlen of argv [i]. Hyvä.
Ja vielä, olen tekemässä hieman tehottomuus täällä ei luomalla n tai mitä tahansa,
mutta Palaamme tähän.
>> Joten nyt j + +. Nyt minun täytyy luetelmakohdan edelleen täällä.
Mitä nyt haluat tulostaa jokaisen iteraation?
[Äänetön opiskelija vastausta] >> So [i] antaa minulle sana.
[I] [j], tavallaan kuin matriisin.
Ne teistä math-y taustat,
Olemme tavallaan indeksointi jopa syvemmälle tähän matriisiin tai tämä joukko matriiseja,
Tämän 2-ulotteinen rakenne.
Joten nyt katsotaanpas mitä täällä tapahtuu. Saanen avata minun isompi pääteikkuna.
Saanen uusinta soveltavat argv 1.
Ja olen mokasin täällä, mikä on hyvä oppitunti koska minäkin unohdin tehdä tämän.
Implisiittisesti julistaa C kirjaston funktion "strlen" tyypin "unsigned -
En edes tiedä, mitä muuta se tarkoittaa, mutta olen nähnyt tämän ennenkin,
implisiittisesti julistaa.
Aina kun näet tämän virheen, mitä tämä yleensä merkitsee?
>> [Äänetön opiskelija vastausta] >> unohdin kirjasto ylös. Mutta hetkinen.
Yleensä olen mokannut koska unohdin CS50 kirjasto, mutta se on siellä.
Yleensä olen mokannut, koska olen unohtanut vakio I / O.
Ja suoraan sanottuna, en edes tarvitse tätä. Emme käytössä GetString tänään.
Mitä minä puuttuu?
On toinenkin kirjasto että nyt meidän täytyy käyttää joskus kutsutaan string.h,
ja tämä on vain jälleen yksi kirjasto, joka on enemmän toimintoja, jotka eivät ole vakio I / O.
>> Mennään takaisin minun iso pääteikkuna.
Okei. Nyt, hitto soikoon, kai olin väärässä. Käytin CS50 kirjastoa.
Jotta voimme korjata tämän jollakin 2 tapoja.
Voimme ottaa apupyörät pois juuri nyt ja juuri tähän,
tai Katsotaan sellaista pitää, että yksinkertaistamisen juuri nyt, liitä tämä takaisin,
ratkaisemaan tämän ongelman, ja nyt palaa pääteikkuna.
Joten on selvää, että CS50 kirjasto ei ole vain tehtäviä,
se on myös avainsanan merkkijono, minkä vuoksi se virhe juuri tapahtui.
>> Joten tässä sitä mennään. Korjasin molemmat kirjaston asioista. Enter. Hyvä.
Argv 1, foo bar, Enter. Erinomainen.
Meillä on nyt siis jokaisen kirjaimen jokaisen sanan painettu 1 per rivi,
joka ei tee hyvin mielenkiintoinen ohjelma,
mutta ilmoitusta nyt meillä on kyky paitsi iteroimalla yli sanat
mutta myös yli yksittäisiä kirjaimia sanoissa, mikä kuulostaa hirveän tutulta
edes yksinkertaisimpia sovelluksia, kuten salaus kirjaimia merkkijono näin.
Mennään eteenpäin ja otamme 5 minuutin tauon.
Ja kun tulemme takaisin, aloitamme puhua tehokkuudesta
jolla voimme tehdä näitä asioita paremmin.
>> Selvä. Olemme takaisin.
Kiitos yksi TF joka pelaa paljon bananagrams,
meillä on todellakin koko joukko merkkiä kanssamme täällä tänään
fyysisesti ruumiillistunut näitä pieniä muovisia paloja,
ja haluaisin ehdottaa, että tämä tyhjä valkoinen pöydältä täällä edustaa RAM minun tietokone -
kannettava tietokone, desktop, mitä - ja siellä näyttää paljon se
koska jos aloitamme hakkaamalla tätä RAM pieniksi tavu kokoisen palan,
Oletetaan mielivaltaisesti sanoa jotain, koko ja että epäselvä edustaa -
siellä mennään, ja katsotaanpa loitontaa vähän täällä -
sanotaanko jotain kokonsa yhden tavun.
Joten voimme todellakin mahtuu koko joukko tavua tai merkkiä sisällä tämän muistin,
ehdottivat suhteellinen koko täällä.
>> Joten Oletetaan nyt, että tavoitteena on varata muistia merkkijono.
Miten tämä oikein toimii?
Vuonna ohjelmissa olemme kirjallisesti, olemme yleensä käyttänyt GetString,
mutta nyt selkeästi, on tämä toinen kanava, jonka kautta voimme saada käyttäjä syöttää sisään argv
kautta komentorivin argumentteja.
Mutta mitä todella tapahtuu alla huppu?
On käynyt ilmi, jos me kutsumme - mennään siirry takaisin GetString - toiminto GetString
vuonna CS50 kirjastossa, käyttäjältä pyydetään merkkijono,
käyttäjä tyypit joissakin sana - kutsukaamme sitä HELLO.
Ja olemme sanoneet viimeiset pari viikkoa, että paluu arvo GetString
on itse asiassa merkkijono, kuten sana HELLO.
>> Mutta mitä GetString oikeasti tekee?
Kun käyttäjä on HELLO, Anna, GetString on miettiminen,
Okei, kuinka monta merkkiä on tämä? Tämä on H-E-L-L-O.
Joten se on myöntää, se tarvitsee kysyä käyttöjärjestelmä - Linux tässä tapauksessa -
vähintään 5 tavua tallentaa HELLO.
Ja mitä se sitten etenee tehdä, kun se saa takaisin niitä 5 tavua käyttöjärjestelmästä
on hahmottaa HELLO takaisin takaisin takaisin takaisin.
Ja niin, mitä todella palannut GetString on kimpale tietojen näyttää tältä.
Mutta tämä on vähän epätarkka, koska näyttää siltä, ​​että se ei ole niin yksinkertaista
kuten juuri tallennetaan HELLO on tietokoneen muistiin
koska oletetaan, että minun ohjelma, olen kirjallisesti C kutsuu sitten GetString uudelleen,
ja seuraavan sanan käyttäjä tyyppejä on Bye, bye.
No, minun täytyy sovittaa että sana BYE jossain muistissa.
En voi hakata HELLO.
Esimerkiksi, en halua tietokonetta vain aloittaa korvaa näin
alkuperäinen sana, koska en voi vielä käyttää sanaa HELLO muuttujaan
jossain muualla minun ohjelma.
>> Niin B-Y-E on päätyä jonnekin muualle muistiin.
Mutta yleissopimus tyypillisesti, että seuraava merkkijono jakaa
todennäköisesti, mutta ei aina, on menossa päätyvät seuraavan käytettävissä muistipaikka.
Ja jos en ole pyytänyt käyttöjärjestelmän mitään muistia
koska viimeksi pyysin GetString, kertoimet ovat sanan BYE
tulee päätyä heti sanan HELLO muistiin.
Mutta tässä vaiheessa voit ehkä nähdä, missä mahdollinen ongelma.
Koska seuraava paloina muistin, seuraava tavua, jotka olivat vain free -
Puhdista valkoinen liuskekivi - in tietokoneen muistiin oli aivan HELLO,
tuntuu ensimmäinen merkkijono pyysin voi yhtäkkiä nyt muuttua
koska olen muuttunut olennaisesti sen HELLOBYE
sen sijaan, että jotenkin demarcing alusta BYE ja lopussa HELLO.
>> Joten näyttää siltä, ​​että mitä todella tapahtuu alla huppu,
jotka olet ehkä vilahti verkossa viittauksia tai osan tai kirjoja
tai ei ollenkaan aivan vielä on, että on todella tahallinen rajaamista
välillä sanojen tietokoneen muistiin.
Ja itse asiassa tässä tapauksessa tänne, eikä vain laittaa BYE vieressä HELLO,
sijaan, tietokone tuo erikoismerkin, erityinen nollamerkki, niin sanotusti,
joka edustaa tunnistettavasti kanssa kenoviiva 0.
Niin pitkä tarina lyhyt, muistuttaa, että merkit ovat edustettuina ASCII.
ASCII on vain kartoitus numeroita ja kirjaimia,
ja useimmat näistä kirjeistä alkaa noin 65 pääoman,
mutta se osoittautuu voit varmasti edustaa numero 0 kokonaislukuna tai binääri,
ja se osoittautuu maailmalle päätti kauan, kauan sitten, "Tiedätkö mitä?"
"Mennään varanto numero 0, koska ei edusta mitään merkkejä näppäimistöltä -
"No kirjaimia, numeroita, ei välimerkkejä. 0 on erityinen."
"Se tulee olemaan erityinen nollamerkki, ja aiomme kirjoittaa se \ 0".
Ero on, jos me vain kirjoitti 0, 0 on merkki.
Muistuttaa, että on olemassa ASCII-koodeja 0, 1, 2, 3
koska merkki 0 on eri kuin numero 0.
Ja voit nähdä, että jos katsotte taaksepäin Viikko 1 kun ensin puhuttiin ASCII-
0 ja 1, 2 ja 3 kaikki tavalla jopa 9 oli oma ASCII-koodit.
Ne eivät ole sattumalta, 0 kautta 9. Ne ovat hyvin erilaisia.
Eli 0 tarkoittaa vain "minä olen erikoinen" ja \ 0 tarkoittaa, kirjaimellisesti, "En ole 0 luonnetta."
"Olen tätä erityistä arvoa, null merkki."
Joten en oikeastaan ​​tarvitse toista näistä, koska en voi tehdä samaa virhettä kahdesti.
>> Joten kun sanan BYE olemme myös menossa tarvitse toista näistä null merkkiä.
Saanen napata minun kynä täällä ja haluan piirtää nopeasti toiseen \ 0
niin että kun olen pyytänyt käyttöjärjestelmä 2 jousille
kautta GetString seurasi toinen puhelu GetString,
Tämä on mitä todellisuudessa muistiin.
Joten kun tulen takaisin merkkijonon, olen todella saada takaisin, että
ja kun saan seuraavan merkkijonon, olen todella saada takaisin se.
Joten tämä herättää kysymyksen, strlen ensinnäkin, mitä sen pitäisi palauttaa?
Kun Kehotan strlen merkkijono s ja s oli sana HELLO että käyttäjä kirjoitettu,
mitäs me tietysti sanoa pituus HELLO oli muutama minuutti sitten?
Se oli 5, eikö? H-E-L-L-O. Ja se tosiaan miten strlen toimii.
Se palauttaa mitä normaali ihminen odottaa pituus merkkijonon olla.
Mutta todellisuudessa, kuinka suuri on joukko merkkejä on varastointi Haloo?
Se on oikeastaan ​​6.
Joten strlen ei mainita tästä sinulle.
Mutta alla huppu tietokone todellakin käyttää 6 tavua tallentaa 5-kirjain sanan,
ja tämä on totta riippumatta siitä, kuinka kauan sana on.
Siellä on aina olemaan erityinen null päättyy merkin lopussa merkkijonon
on demarc kokonaispituudesta.
>> Joten sitten jos olet nyt henkilö täytäntöönpanoa strlen 20, 30 vuotta sitten,
miten edetä toteuttamisessa strlen itsestään?
Otamme itsestäänselvyytenä, että se on olemassa, aivan kuten pidämme itsestään selvänä, että printf olemassa,
mutta jos HELLO on sana kyseessä
ja mitä olen muistissa on jotain, joka näyttää tältä,
jos sinulla on ollut reimplement strlen koska pyydettiin
tai siksi, suoraan sanottuna, et tiennyt strlen olemassa -
piti kääriä tämä omalla - miten voisit toteuttaa strlen
kun sitä jotain, joka näyttää tältä?
Nyt kun tiedämme merkkijono on taulukko, voimme toistaa yli jokaisen yksittäisiä merkkejä
käyttäen jotain - Yritetään tehdä tämän lennossa.
>> Sallikaa minun mennä laitteeseen. Saanen luoda uuden tiedoston, strlen.c.
Anna minun mennä eteenpäin nyt ja eivät kuuluu stdio.h jotta meillä on pääsy printf.
Anna minun tehdä int main (void). Oh. Otan vain tehdä tämän omasta nyt sitten. [Naurahtaa]
Kiitos.
Tämä on mitä olen tekemässä. Selvä.
Joten ennen käänsin ruudulla, olen kirjoittanut kaiken tuon.
Ja nyt, mitä aion tehdä, on seuraava:
printf ("Anna minulle merkkijono:")
Se on vain pörröinen ohjeita.
Nyt haluan tehdä string s = GetString.
Olen jo täytyy tehdä muutoksia nyt.
Käytän CS50 kirjaston yhtäkkiä, joten anna minun mennä eteenpäin ja kirjoita cs50.h.
Ja nyt tehdään tämä: printf ("pituus on:% d, strlen [s] -
ja en ole tehnyt vielä. Mitä muuta minun täytyy lisätä tähän ohjelmaan?
>> [Opiskelija] string.h. >> String.h.
Joten nyt, käytämme strlen, joten katsotaanpa varmista kääntäjä tietää missä se on,
niin vähän järki tarkistaa.
Saan merkkijonon linja 8 ja linja 9 Minä tulostamalla sen pituus% d.
Joten mene eteenpäin ja avaa ylöspäin.
Olemme tehdä strlen - kokoaa okay -
strlen - haluan zoomata - Anna, H-E-L-L-O, Enter. Pituus on 5.
>> Okei, joten strlen tuntuu toimivan, mutta maailma tiesi.
Joten nyt toteuttaa strlen itsemme seuraavasti.
Otan tämän kirjaston pois.
Meillä ei ole enää pääsyä string.h koska en edes tiedä sitä olemassa.
Mutta se on okei, koska en voi toteuttaa strlen itseäni
ja on se otettava merkkijono nimeltä tulo,
ja nyt minun täytyy selvittää pituus tämän merkkijonon.
Joten miten voin tehdä tämän?
Mitä jos teen - Katsotaan, miten tämä - Mitä haluat tehdä?
>> [Äänetön opiskelija vastausta] >> Okei.
Joten voimme tehdä tämän nippu tavoilla. Yritän ottaa tämän lähestymistavan.
Annan itselleni int muuttuja i, niin i alkaa 0.
Ja saanen sanoa tämän: vaikka input [i] ei ole yhtä suuri, mitä? \ 0.
Joten se kääntyy pois, kuten tapauksessa kaikkien merkkiä kirjoittaessasi niitä kirjaimellisesti ohjelmaan
joudut käyttämään lainausmerkkejä, ei lainausmerkkeihin.
Joten jos olisin kirjallisesti kirjeen, tekisin, että kirje b, tekisin sen.
Tässä, sen sijaan olisi merkkijono, ei yksittäinen merkki.
>> Haluan siis \ 0 kirjaimellisesti. Mitä haluan tehdä tämän silmukan?
Oikeastaan, tarvitsen toisen muuttujan, joten int pituus saa 0.
Vaikka et olisi varma miksi aloitimme niin teimme,
Nyt aiomme tällä tiellä, mitä haluan tehdä on line 9?
pituus + + ja sitten tänne rivillä 10, paluu pituus.
Joten miten on strlen toteutetaan?
Se on tosiasiallisesti toteutettu luultavasti näin.
Ehkä henkilö käyttää varten silmukka, ehkä tehdä, kun silmukka - kuka tietää?
Olisimme todella katsoa alla huppu on todellinen lähdekoodin
Joissakin tiedostoon nimeltä string.c luultavasti.
>> Mutta tässä Ajatellaanpa mitä olen tekemässä.
Olen julistamisesta muuttuja nimeltä I, jossa se vastaa 0.
Olen sitten julistaa toisen muuttujan nimeltään pituus, jossa se vastaa 0.
Sitten sanon taas i. merkki tulo ei ole yhtä erityistä nollamerkki, \ 0,
increment pituus.
Mutta heti kun i hahmo on tässä erityinen luonne, mitä tapahtuu silmukan?
Se oikosulkuja. Se pysähtyy, mikä tarkoittaa, että sitten voisit palata pituus.
>> Joten jos en sotke, mennään eteenpäin ja palata minun pääteikkuna.
Saanen kääntää. Ja en tyriä.
Yhteensopimaton uudelleenesittely kirjaston funktion strlen.
Joten yritin saada liian fiksuja oman hyvän täällä.
Kääntäjä itse tietää, että on olemassa funktio kutsutaan strlen
vaikka emme ole mukana kirjastoon. Se on hienoa. Whatever.
Olemme juuri menossa tekemään niin. Katsotaanpa nimetä tämä pituus.
Saanen muuttaa käytöstä sen pituuden täällä, ja tämä tekee clang onnellisempia.
Kuten syrjään, koska jotkut näistä toiminnoista ovat niin hiton yhteisiä -
strlen, prinf - heillä todella on eräänlainen erityisasema.
Ja niin clang vain tietää vähän jotain erityistä niistä.
Se ei aina ole eniten toimintoja, joten siksi jouduimme huusi.
>> Yritän uudelleen. Onneksi se toimi tuolloin.
Joten nyt haluan ajaa oman strlen ohjelman.
Anna merkkijono: H-E-L-L-O, Enter. Ja olen mokasin.
Miksi? >> [Äänetön opiskelijan vastausta] >> Aivan.
Joten olen itse täällä erittäin hauskannäköinen loputon silmukka
koska vaikka olen mukaa pituus kunkin iteraation,
mitä olen selvästikään tee? En lisäävä i. Okei. Helppo korjata. Kyllä?
Okei. No nyt me ajaa riitautui muu yleinen virhe, jos minä tarvitsen suluissa.
Ja suoraan sanottuna, tämä koodi alkaa ruma,
niin otamme puukottaa puhdistamista ylös hetki.
Mutta nyt olen kasvaville sekä pituus ja i.
Suoraan sanottuna olen jo nähdä mahdollisuutena parantaa täällä, mutta me palaamme siihen.
>> Joten nyt mennään vain varmista, että olemme ainakin edistystä.
Tämä on tapahtunut muutaman teistä, ja olen laiminlyönyt mainita tämän etukäteen.
Kun sinulla on epäonnea skenaarion näin, miten korjata tämä
lyhyt uudelleenkäynnistys laitteen tai tietokoneen tai sulkemalla ikkunan?
Se on todella helppo.
Ohjaus C lähettää tämä pieni porkkana symboli C, ja se vain päättyy useimmissa ohjelmissa.
Jos sinulla on todella paha loputon silmukka, joka tulostetaan tavaraa äärettömän monta kertaa,
Joskus saatat joutua lyödä Ohjaus C tuhat kertaa, jotta se todella kuulla sen.
Joten ymmärtää nyt, koska en tulostamista mitään, se oli melko helppoa.
Ja teknisesti, kerran riittää, mutta tulen kärsimättömäksi ja olen yleensä lyödä sitä, että monta kertaa.
>> Niin strlen. Anna merkkijono: HELLO. Onko menossa töihin tällä kertaa?
Okei. Toinen yleinen virhe. On kääntää.
Se oli tahallinen, että yksi. Selvä.
Niin strlen, H-E-L-L-O, Enter. Erinomainen.
Joten meillä on nyt strlen 5.
Joten olemme kirjaimellisesti reimplemented että pyörä.
Joten nyt mennään puhdistamaan tämä ylös, koska se ei tee minusta vaikuttunut
kanssa suunnittelu minun koodi.
Mitä voimme selvästi poistaa tämän ohjelman puhdistaa tämän?
[Äänetön opiskelija vastausta] >> Joo. Kirjaimellisesti, me hoidetaan i ja pituus identtisesti.
Joten miksi emme vain fiksuja ja sano samalla pituus?
Pikemminkin, mennään vain kutsua sitä pituus aluksi, alustaa sen 0
koska oletuksena merkkijonon ole pituutta, kunnes saamme selville, mitä se on.
>> Nyt teemme tämän, ja nyt tämä on melko tyylikäs ohjelma.
Yksi muuttuja. Siivosin sen, tiukennettiin sen.
Joten nyt mennään takaisin minun pääteikkuna. Mennään eteenpäin ja ajaa tätä.
Tee strlen. Näyttää hyvältä. Suorita strlen uudelleen Enter.
Anna merkkijono: HELLO, Anna. Ja se näyttää toimivan kuin 5.
Nyt on selvää, jos en olisi kirjoittanut, esimerkiksi HELLO 1 merkkijono
ja sitten BYE toiseen, voimme varmasti useita sanoja.
Jos lauseke halusin kirjoittaa ollut HELLO vaan esimerkiksi
Hello World, huomaa, että meidän ei olisi tämä tilanne täällä, eikö?
Tämä viittaa siihen, että se on 2 jouset.
Et varmasti voi olla välilyöntiä merkkejä, joten jos todella kirjoitetaan pidempi lause
kuten Hello World, mitä me todella olla muistissa
näyttää vähän jotain siellä.
>> Selvä. Kysyttävää sitten noin edustus täällä merkkijonojen?
Ei? Selvä.
Joten minä sanoin, että kutsuvan strlen uudestaan ​​ja uudestaan ​​tarkoituksella sellaista
luultavasti ei ole paras idea, koska aiot tehdä paljon työtä
uudestaan ​​ja uudestaan ​​ja uudestaan.
Todellakin, mitä työtä on tarpeen miettiminen pituus merkkijonon, ilmeisesti?
Sinun täytyy aloittaa alusta ja sitten katsoa, ​​katso, katso, katso, katso
kunnes lopulta nähdä, että erikoismerkin, jolloin, ah, nyt tiedän pituus.
Joten aikaisemmin kun olimme strlen kutsutaan uudestaan ​​ja uudestaan ​​ja uudestaan,
syystä olen ehdottanut, että oli typerää siksi jälleen, että merkkijono näyttää että.
Se ei aio muuttaa joka kerta iteroida läpi silmukan,
joten teet turhaa työtä.
Samalla sinun pitäisi tietää, koska syrjään, että kääntäjät kuten clang näinä päivinä
on kehitetty monien vuosien ajan,
ja kääntäjä kirjailijat, ohjelmoijat, ovat melko fiksu.
Ja niin näyttää siltä, ​​että clang ja muut kääntäjät voivat todella selvittää, että
okei, kyllä, kirjoitit strlen teidän kunnossa,
mikä teknisesti tarkoittaa sitä, että me kutsuisimme sitä uudestaan ​​ja uudestaan ​​ja uudestaan.
Mutta fiksu kääntäjät voivat itse optimoida tuollaiset köyhät käyttäjän päätösten
ulos koodi korjata asioita.
>> Joten älä vain ymmärrä, että joskus kääntäjä on älykkäämpi kuin meitä
ja millaisia ​​piilottaa omat virheemme.
Mutta varmasti kun se tulee ongelmaa yms,
älä ajatella niitä perustavanlaatuisesti virheellisen suunnittelun päätöksiä
mahdollisesti siitä yksinkertaisesta syystä, että olisimme tekemässä paljon enemmän työtä
kuin meillä on todellakin tehtävä. Mutta kuinka paljon enemmän työtä?
Kun kyseessä Hello World, aloitamme yleistää koko ongelman.
Mikä on pituus ongelma tai koko ongelma
kun sana käyttäjä kirjoitettu on HELLO?
Se on ilmeisesti 5, ehkä 6. Plus tai miinus 1. Whatever.
Se on niin lähellä me vain kutsumme sitä 5.
>> Joten mitä koko ongelma, kun yrittää selvittää pituus HELLO?
Se on 1, 2, 3, 4, 5, ja ehkä 6 viimeisen merkin, mutta katsotaanpa yleistää, että n.
Joten n, vain muuttuja n, mitä tietotekniikan tutkijoita olisi tyypillisesti käyttävät
kuvaamaan koko ongelma, ja ongelma käsillä on kuinka kauan on HELLO?
Kuinka kauan strlen kestää?
Se vie suuruusluokkaa n askelta, jolloin jokaisen vaiheen tarkoitetaan katsoa merkin,
tarkastellaan merkki, katso merkki.
Ja meillä oli tämän keskustelun taas takaisin, toimenpiteiden määrä jotakin vie.
Aivan ensimmäinen päivä luokan olimme kaikki kömpelösti seisomaan,
ja sitten kaikki alkoivat pariksi pois toistensa kanssa
jotta todella laskea ihanteellisesti kuinka monta ihmistä oli huoneessa.
Ja teimme myös toinen asia, jossa jos vaan tein sen vanhan koulun tapa
vain alkaen 1, 2, 3, 4, 5, 6 ja niin edelleen,
että myös koko, että ongelma oli koko n. Oli n ihmisiä huoneeseen.
Mutta voisin nopeuttaa että, eikö? Peruskoulun tyyli voisin aloittaa laskemisen 2s.
2, 4, 6, 8, 10, 12. Ja se tuntuu niin paljon nopeammin, ja se todellakin on.
Se on kirjaimellisesti kaksi kertaa niin nopeasti, mutta jälleen, jos toinen 400 ihmistä käveli tämän huoneen
kaikki kerralla, ne algoritmit veisi toiset 400 tai ehkä 200 vaiheita.
>> Mutta sitä vastoin, jos todella fiksuja ja olemme lisänneet kaikkia teitä itseänne,
muistamme, miten se algoritmi toimi.
Te kaikki nousi seisomaan. Saanen nopeasti eteenpäin tätä.
Te kaikki nousivat seisomaan, sinun pariksi pois, niin puolet istuit alas,
puolet istuit alas, puolet istuit alas,
ja jokaisen iteraation tämän kaareen viikolla 0, me puolittui ongelma käsillä
ja meni n / 2, niin n / 4, ja sitten n / 8.
Ja seuraus tästä on, että jos toinen 400 ihmistä kävelevät huoneeseen, no big deal,
se vie meidät vielä 1 krs, ei 400 lisää kierroksia, ei 200 lisää kierroksia.
Ja niin tarina kerroimme taas takaisin oli tehdä vähän jotain tähän.
Tämä punainen viiva tässä on lineaarinen, se on suora, ja se on merkitty n
koska sillä koko ongelma kasvaa,
jos algoritmi tai ohjelma, jolla olet ratkaiseminen kestää n askelta,
voimme piirtää sitä suoraa linjaa, jossa se vie enemmän aikaa mitä suurempi koko ongelmaa.
Ja twosies lähestymistapaa, laskenta 2, 4, 6, 8, vielä suora viiva, vain hieman paremmin.
Se vie vähemmän aikaa, joten keltainen viiva on punaisen viivan alapuolella pisteen pisteen.
>> Mutta vielä parempi oli tämä pyhä Graal mitä me kutsutaan logaritminen aika
jos vaikka taas tuplaamme ihmisten määrä huoneessa,
me kaksinkertaistaa tuon puhelinluettelon ensimmäinen päivä luokan,
no big deal, se kestää vielä 1 sivu kyynel, kestää 1 enemmän istuen
jotta voidaan ratkaista ongelma, joka on kaksi kertaa niin iso.
Ja niin keskustelu saamme nyt alkaa ottaa on
Miten voimme todella ratkaista ongelmia tehokkaasti
jos ajatellaan yksinkertaisin tämänkaltaisia ​​ongelmia?
Oletetaan, että meillä on 8 ovea jonka takana on joitakin numeroita,
ja kukin näistä numeroista ei ole lajiteltu millään tavalla,
he vain satunnaisia ​​kokonaislukuja takana ovien
ja me kysyä miten edetä löytää numero - kuka tietää -
7 takana nämä ovet?
Mitä sinä, ihminen, tehdä jotta löydettäisiin minulle numero 7
Jos taas kukin näistä ovat ovet ja nähdä arvoa joudut avaamaan oven?
Mikä olisi sinun algoritmi olisi kenties?
>> [Äänetön opiskelija vastausta] >> Joten aloita vasemmalla ja avaa oven, avaa ovi, avaa ovi.
Ja pahimmassa tapauksessa, kuinka kauan se vie meidät löytää numero 7?
Ja vielä, he eivät lajitella, joten se ei ole niin helppoa kuin, no, aion avata 7. luukku.
Se voisi viedä meidät, maksimaalisesti, 8 askelmaa.
Pahimmassa tapauksessa, 7 on satunnaisesti aivan lopussa linjan ovien,
joten ehkä kokeilla N ovet.
Joten jälleen täällä, meillä näyttää olevan lineaarinen algoritmi.
Itse teimme tämän vain pari vuotta sitten.
Yksi edeltäjistänne kyseenalaistettiin juuri tätä
jos meillä ei ole digitaalista versiota, meillä sen sijaan oli liitutaulu
joitakin papereita sitä.
Ja mitä ajattelin tehdä, on ottaa vilkaista taaksepäin miten tämä meni,
yksi parhaista ja ehkä hankalimmat mahdollisuuksia lavalla
on esittelyä oikeus täällä Sanders.
Meillä oli 2 riviä numeroita.
Olemme vain menossa katsomaan mitä tapahtuu täällä Sean varten hyvin alkuun näiden rivien.
Ellei kukaan ikinä vapaaehtoisten CS50,
meillä oli Sean siunaus pitää tämän kameran,
joten hän tietää, että sadat ihmiset ovat katsomassa tätä nyt vuosia.
Mutta Sean teki loistavaa työtä - vai oliko hän? - Klo oikeastaan ​​löytää meidät tietty numero.
>> Joten katsotaanpas miten hän ratkaisi algoritmi jotta me jatkaa tätä keskustelua ennen pitkää
miten löydämme asioita tehokkaasti.
[Malan video] Olen piilossa näitä ovia numero 7,
mutta makaavat joissakin näistä ovet sekä ovat muita negatiivisia lukuja,
ja sinun tehtäväsi on ajatella tätä ylärivin numeroita vain array
tai vain sarja paperilappuja numeroilla takana,
ja sinun tehtäväsi on vain käyttämällä ylä array täällä, löytää minut numero 7.
Ja olemme sitten menossa kritiikki miten edetä tee sitä. >> Selvä.
[Malan] Etsi meille numero 7, kiitos.
[Naurua]
[Malan] No [naurua]
5, 19, 13, [naurua]. Se ei ole temppu kysymys.
1.
[Naurua]
Tässä vaiheessa sinun pisteet ei ole kovin hyvä, joten voit yhtä hyvin pitää käynnissä. [Naurua]
3.
Mene. Rehellisesti, en voi olla ihmettelemättä, mitä olet edes ajatellut. [Naurua]
Vain ylärivillä, joten sinulla 3 vasemmalle. Joten löytää minut 7.
[Opiskelijat sorinaa]
[Malan] 17.
[Opiskelijat sorinaa]
[Malan] 7! [Aplodit]
>> Joten keskiviikkona me sukeltaa tähän ja kehittyneempiä algoritmeja löytää asioita.
Nyt jätämme sinulle Sean ja nähdään keskiviikkona.
[CS50.TV]