[Powered by Google Translate] [Semajno 3]
[Davido J. Malan - Universitato Harvard]
[Jen CS50. - CS50.TV]
Lasu min stir ni en la direkto de kie ni cxesis lasta fojo,
kiu komencas pensi iom pli pri sintakso
kaj provi pensi iom malpli pri ĉiuj minutiae
kiu prenas iom da tempo por alklimatigi al tiel multe en terminoj de punktokomojn
kaj parentezoj kaj frizita krampoj,
komenci prenante aferojn iomete al pli alta nivelo koncepta
por ke la problemoj ni nun komencas solvi dum la sekvaj semajnoj
tuj engaĝi multe pli en pli alta nivelo koncepta problemoj
kaj iom malpli en la sintaksa kiel vi ricevis viajn piedojn trempi
kaj viaj manoj malpuraj kun iuj de la sintakso de tiuj lastaj semajnoj.
>> Do rememori ke pasintsemajne ni prezentis ĉi nocio de tabelo.
Kaj tabelo en la angla povas esti priskribita kiel kio? >> [Inaudible studento respondon]
Pardonu?
Kolekto de? >> [Inaudible studento respondon] >> Konsentite, bona.
Kolekto de artikoloj. Do ni vidis arrays en Scratch.
Se vi okazis uzi por pset 0 unu el Scratch la listoj kiujn vi povas treni aĵoj
kiel oranĝoj kaj bananoj sur, inventaro de varoj,
jen speco de kiel tio tabelo estas.
Kaj tiam pli teknike, en la kunteksto de reala komputilo,
tabelo estas simple bela eron de memoro.
En aliaj vortoj, vi havas bajto, tiam alia bajto, tiam alia bajto, tiam alia bajto,
kaj se vi estus desegni tiujn bitokoj en portreto,
estus malantaŭo al malantaŭo al malantaŭo al malantaŭo. Tio estas kion ni celas diri per apudaj.
>> Do ĝi bajto numero 1, tiam 2, tiam 3.
Ĝi ne signifas ĉi tien, ĝis tie, ĉi tien, ĝis ĉi tie.
Tabelo estas apudaj eron de 0 aŭ pli bajtoj.
Do kio estas ili utilaj por?
Memori ni havis ĉi tia elpensita ekzemplo de provizon popola kvizo gradoj en programo
komputi vian kvizo averaĝa por iuj kompreneble,
kaj memorigi, ke ni povus komenci skribi tiun programon per deklaro de variablo quiz1.
Tiam ni povus havi alian variablo nomis quiz2.
Sed tiam, se estis 3 Quizzes en ĉi klaso, quiz4.
Aŭ se estis semajna kvizo, estus quiz5, quiz6, quiz7.
Do vi havas ĉiujn tiujn variablojn deklaris ene de ĉefaj
aŭ alie en via programo,
kaj la problemo kun tiu alproksimiĝo, facila kvankam ĝi estas nur kopii kaj alglui,
ĉu nur tre rapide iĝas _unwieldy_.
Dio gardu vin reale havas 30 kvizojn aŭ 50 Quizzes.
Se estas kiel alta lernejo stilo ĉiutaga popo kvizo
tiam vi simple havas ridinde longa listo de variabloj esti deklarita,
kaj ĉi nur tre rapide eliras de kontrolo.
Estas malbela, estas malfacile subteni, estas tiel facile fari typo
se vi ricevas 1 numeron mistyped ie en vian programon.
>> Do ni enkondukis la nocion de tabelo anstataŭe.
Kaj memoru ke ni implementado tiu programo per farante iom io tiamaniere.
Lasu min iri en la hodiaŭa Fonto 3 lundo katalogo
kaj malfermu tabelo, kiun ni vidis lastfoje.
Kaj kvankam estis kelkaj novaj C lertaĵoj tie,
inter ili la nocio de konstanta,
memori, ke ni deklaris multnombraj kaleŝegoj esence por uzi tiun sintakson:
kaleŝego, tiam la nomo de la variablo, tiam ni uzas kvadrataj krampoj vere por la unua fojo,
kaj kion ni faris interne de tiuj rektaj krampoj estis efektive metis nombro.
Sed anstataŭ meti ciferon, mi metis ĉi majusklon vorto, kvizojn.
Kaj kio estis la motivado por meti majusklon vorton kiel Testi
kaj tiam uzanta linio 17 de lertaĵo tie efektive doni tiun numeron?
Kio estis la motivado tie? Yeah.
>> [Inaudible studento respondon] >> Ekzakte.
Se ni volas ŝanĝi tiun valoron 2, ni nur devas ŝanĝi ĝin en 1 loko
ĉar konsideri - mi eĉ ne memoras, kion tiu programo faris ĝuste,
sed se vi simple skim ĝin vi vidas kvizojn, kvizojn.
Komprenu kvizojn, cxi tie pli kvizojn.
Do, se ni ne havas tiun konstanto, tiu uzo de akraj difini,
ni estus tajpis 2, tiam 2, tiam 2, tiam 2, kiu estas fajna. Estus same ĝentila.
Sed supozu ke venontjare ni havas 3 Quizzes en CS50.
Do mi devas iri kaj ĝisdatigi la kodon, mi devas recompilar ĝin,
sed la problemo estas se mi faras ion stultan, kiel mi forgesu 1 mencio de 2
kaj forgesu plug en 3, la tuta programo povus tre bone rompi.
Do ni simple petante mizero.
>> Do la nocio de konstanta estas ĉio pri faktoranta iun pecon de datumoj,
ĉu ĝi estas ĉeno aŭ char aŭ kaleŝego aŭ kion ajn,
kaj deklarante ĝin 1 lokon por ke vi povu pli facile ŝanĝi ĝin en la estonteco.
Kaj estas ankaŭ, sincere, iom pli facile legi ĉar se vi simple pensas pri ĉi tiu nun,
ĝi estas kvizojn, aŭ ni povus eĉ renomi ĝin iu kiel NUMBER_OF_QUIZZES
aŭ io pli eksplicitaj.
La kodo simple iĝas iom pli evidentaj pri kio ĝi estas faranta,
kaj vi demandas iom malpli kion numero 2 povus okazi al volas diri.
Do la konstanta havis nenion komunan fundamente kun tabeloj.
La tabelo estis enkondukita de vojo de tiuj rektaj krampoj.
>> Do rimarki ke en linio 23 ni petas al la uzanto, "Kio estus via kvizo partituroj?"
Tiam ni nur devas ĉi buklo kiun ŝajne demandas al la uzanto por lia notoj. Kiom?
Ĝi iterates de 0 al 2. Kaj mi diras 2 ĉar kvizojn en ĉiuj kaskedoj estas nuntempe 2.
Do iterates de 0 ĝis 2 kaj poste presas el Kvizo # ion de iu,
kaj tiam uzas GetFloat akiri valoro de la uzanto.
Do rimarki ĉi tiu estas la sola alia nova peco de sintakso de lasta merkredo.
Se vi volas konservi ion en apartan lokon en tiu tabelo,
vi denove uzos la rektaj krampoj.
>> Do tie estas iom de dicotomía tie.
La unua fojo vi uzas la rektaj krampoj
vi uzas ĝin por indiki kiom granda vi volas la tabelo esti.
Sed ĉi sekva kunteksto tie kie ni denove uzas tiujn rektaj krampoj
signifas kie en tiu tabelo vi volas meti iun valoron?
Kaj la distingo tie povas esti konkludita de ĉirkaŭteksto.
Rimarku tie ni havas datumtipo, tiam ni havas la nomon de variablo,
tiam ni havas niajn kvadrataj krampoj kun nombro enen, punktokomo. Estas tio.
Do tio estas deklaro.
Estas nur tiel, kvazaŭ ni estus farinta ion kiel kaleŝego grade1; kaleŝego grade2;
sed denove, ĉi tre rapide devolves en maniero tro multe kopion, alglui,
tial anstataŭ ni simple simplificado ĝin kiel tia,
kio signifas nun ni havas grado kiu povas esti stokita en krampo 0,
ni havos alian gradon kiu povas esti stokita en krampo 1,
sed kio se mi goof kaj, ekzemple, mia buklo alvenas -
ekzemple, mi faros ĉi malpli ol aŭ egala al,
kiu revokon estis la fonto de antaŭa bug -
kio efektive signifas ke sur iu tria hazarda ripeto de ĉi maŝo
Mi uzas krampo 2. Efektive, kio povus okazi tie? Pardonu?
[Studento] Oni tuj estos anstataŭitaj. >> Ĉu estas tuj estos anstataŭita?
Kio estus anstataŭita?
Ĉi laŭvorte diras anstataŭi kio estas je situo 2 kun la reveno valoro de GetFloat.
Sed la problemo estas kiel granda estas la tabelo je ĉi tiu punkto en la historio?
[Inaudible studento respondon] >> La tabelo estas ankoraŭ nur de amplekso 2
ĉar la tabelo, kiel ĉiu variablo, estis deklarita unue, antaŭ ol ni uzas ĝin,
kaj ni specifita ĉi tie pro tiu konstanta, ke mi havas 2 gradoj, ke mi tuj metis.
>> Sed memoru, la komputilo sciencistoj komencos rakonti de 0.
Do la unua loko en tiu tabelo estas krampo 0.
La venonta loko estas 1. Tiu afero estas nur milde tro malproksime sur la flanko.
Do alivorte, se mi efektive havis tiun tabelo -
kaj lasu min vidi kiel bone ĉi coopera tie por ni -
se mi havas aron ke mi simple desegnita kiel sekvas
kaj mi destinis spaco por 2 eroj, mi povus desegni tiun kiel tiu en memoro
kie cxi tiu granda blanka tolo estas.
Estas nur la RAM mi havas en mia komputilo, koncerto de RAM, 2 koncertoj de RAM, kion ajn,
sed tiuj 2 skatolojn nun individue reprezentas kaleŝego, 32 bitoj.
Do, se mi metis 1 numeron tie kiel 1,0, do mi metis alian numeron tie kiel 3,2
sed tiam mi faras krampo 2, tio estas kiel meti ion tie.
Kaj kiel la bildo sugestas, estas nenio tie.
Estas iel kiel tero de neniu ĉar mi ne petis la mastruma sistemo
doni al mi ĉi tiu tria kvizon.
Se mi faris volas ke tria kvizo, mi havis la forethought
demandi la mastruma sistemo por ĝi per deklaro kvizojn esti ne 2
sed anstataŭ egalas 3.
>> Do alivorte, la bildo kiun ni efektive havas en mano similas ĉi tie.
Ĉi denove estas tero de neniu. Ni pli bone ne provu skribi valoroj tie.
Sed denove, ĉar komputilaj sciencistoj kalkuli de 0,
kiam ni parolas pri ĉi tiu loko en la tabelo, ke tio devus esti loko 0,
ĉi tiu estas supozataj esti situo 1, kaj tiu ne eĉ ekzistas
ĉar ni nur demandis la mastruma sistemo por 2 tiaj lokoj.
Do tiuj el vi kun antaŭa programado sperton el aliaj lingvoj
sciu, ke ĉi tio ne estas ĉiam la kazo kun tabeloj aŭ aĵoj nomata vektoroj.
Pli ĝuste, vi povas simple observu aldono kaj aldonante kaj aldonante aferojn arrays,
kiu, sincere, ni havis tiun kapablecon en Scratch kaj tamen ni ŝajnas esti doninta ĝin ĉi tie
ĉar kun C vi programado multe pli eksplicite.
Estas nur vi kaj la komputilo nun, kaj la komputilo nur faros
kion vi diros ĝin fari.
Do, se vi nur diru ĝin doni al vi 2 flosoj sur la vojo de linio 22 ĉi tie,
jen ĉio vi tuj reiros de la mastruma sistemo: spaco por 2.
>> Do ĉiufoje estas viaj programoj tuj foje esti kalesxo rilate tabeloj.
Tiu estas nur speco de la naturo de la besto per ĉiuj el ni estas falible,
kaj en iu momento vi volos tre verŝajna indekso preter la limo de via tabelo.
Kaj tio estas nur fantazio maniero diri al vi iris en krampo ion
kaj io estis nur tro granda de nombro. Vi iris transe de la limoj de viaj tabelo.
Sed la supra parto nun estas ĉi.
La resto de ĉi tiu programo vere havas nenion fundamente rilatas al arrays.
Estas ĉio nur pri kelkaj simplaj aritmetikaj por komputado mezumoj.
Do ni havas ĉi tie en ĉi por buklo tie unuan variablon nomata sumo ke ni pravalorizi al 0.
Tiam ni persisti de 0 ĝis 2 denove kaj ni aldonas al tiu sumado variablo
la th,-a lernojaro, do krampo 0 tiam krampo 1.
Kaj tiam kiel vi farus en grado lernejon por komputi la averaĝa,
ni simple preni tiun sumon, dividi ĝin por la tuta numero de kvizoj,
kaj tiam por bona mezuro ni nomas funkcio ĉi tie nomata ronda.
>> Nun, kiel flanken, kio estas la interkonsento kun ĉi parenthetical int on line 34?
Eble venis supren jam en sekcio, ne vere parolis pri tio formale tie,
sed kio estas tio int en parens probable faras? >> [Inaudible studento respondon]
Yeah, ĉi referencas al casting aŭ typecasting,
kiu signifas preni 1 datumtipo kaj konvertado al alia.
Vi ne povas fari ĉi tion kun ĉiuj datumtipoj ĉar kelkfoje ĝi estus iom stranga.
Sed en ĉi tiu kazo, se la reveno valoro de ronda estas kaleŝego
ĉar, finfine, mi ferios dum kaleŝego kaj dividante ĝin per nombro kiel 2,
Mi tuj reiros kaleŝego.
Sed grade lernejo homoj ne vere ŝatas scii ke ilia averaĝa estis 93.4
ĉar ili devos realigi ili iam tiel proksima al la 95 rondas punkto.
>> Do ni volas anstataŭe uzi int al ĉirkaŭ ĉiuj al la plej proksima int,
kiu en ĉi tiu kazo tuj estos 94-maestro sen punkto post tio.
Do tio estas nur iom matematika lertaĵo.
Kaj ni revenos al tiu nocio de casting ĉar ĝi havos konsekvencojn,
se vi ne malkovris jam, por problemo starigis 2.
Do tabelo tiam, vi povas pensi pri - ĝi tuj min rideti tuta tago.
Ĝi aspektas kiel ĉi tio se vi desegnas bildon de ĝi,
sed la ŝlosilo estas ke la grandeco ankaŭ elektita de vi
kiam vi petas ĝin de la mastruma sistemo.
Demandojn tiam tabeloj? Yeah.
[Inaudible studento demando]
Ha, bona demando.
La demando estas kio okazas al la nula 0 en la tabelo? Ne ekzistas en tiu ĉi kunteksto.
Ke nur ekzistas en la kunteksto de signoĉenoj, kiujn ni baldaŭ venos al en nur momento.
Sed por tabelo, kiel en ĉi tiu kazo, ĉiuj vi ricevas estas kion vi petas la mastruma sistemo por.
>> Kaj kiel flanken, por ke tiu estu certe,
Mi parolas tiele vi petas la mastruma sistemo, demandu la mastruma sistemo.
Mastruma sistemo, kiel vi probable scias, estas Mac OS, Vindozo, Linukso.
Kiam vi vokas funkciojn kiel GetFloat
aŭ vi deklaras variablojn kiel gradoj,
ĉe la fino de la tago vi efektive demandi iun alian por doni al vi, ke memoro
ĉar ni kiel aspirante programistoj
ne havas ideon kiel reale preni fizikan aliron al memoro.
Sed iu faras: la mastruma sistemo.
Do krom prezentante nin per belaj ikonoj kaj menuoj kaj dosierujojn kaj similaj
kiun vi vidas sur via labortablo, ĉu Mac aŭ PC,
mastrumaj sistemoj ankaŭ fari la malalta nivelo sekulara stuff,
la alte teknika stuff de administri la gigabajto
aŭ 2 gigabajtoj da memoro kiun vi havas, administri la CPU kiun vi havas, kaj tiel plu.
Do kiam vi skribas kodo,
vi vere hooking al via mastruma sistemo en tiu senco.
Mi tuj devos minimumigi tio. Bone.
>> Aliaj demandoj pri tabeloj?
Ne? Okay.
Do la transiro nature de tabeloj estas fakte al temo kiun Estas iom konata.
Kaj ni rigardis iam tiom mallonge en ĉi lasta fojo ankaŭ.
Ĉi tiu estis ŝnuro ekzemplo de merkredo.
Tiu ĉeno ekzemplo estis bela simpla programo,
kaj mi vere simplificado lin por paro de linioj por la hodiaŭa celoj.
Ĉiuj ĝi faras en linio 19 estas akiri kordoj de la uzanto, stokas ĝin en variablo nomita s.
Tiam en linio 22 antaŭen ĝi estas ŝajne presi ke kordoj 1 karaktero por linio.
Sed kiel estas fari ĉi tion?
Ni deklaras variablon i, metante ĝin egala al 0,
kaj ĉi fariĝas maljuna kutimo nun.
Ni ne vidis ĉi tion ĝis merkredo, sed vi povas ia inferir de lia nomo
strlen ĵus revenas kion kiam donita s? La longo de la kordo.
Do se mi pasi ĝin ĉenon, citaĵo-unquote DAVID,
ĝi estas espereble tuj revenos al mi la numero 5 pro DAVID.
Do jen lia celo en la vivo estas preni ĉenon, ĉu malmolan kodita per vi
aŭ en tiu kazo ŝtopis en kiel variablon, kiel argumento,
kaj ĝi figuras kio la longo de tiu linio estas.
>> Do jen nun ni pruntepreni kelkajn skribmaniero de la antaŭa kvizo ekzemplo.
Ĉi tio havas nenion komunan kun flosas, havas nenion komunan kun kvizoj,
sed ĝi rezultas ke la eta blanka mensogo ni estis diranta al vi ekde semajno 1
estas, ke kordoj ne vere ekzistas en C.
Kordo en la fino de la tago estas vere nur tabelo.
Ĝi estas aro de bajtoj, do bajto, bitoko, bajto, bitoko, kiu memoros estas nur 8 bitoj,
tiel bloko de memoro, eron de memoro, eron de memoro, eron de memoro.
Kaj la rimedoj, per kiuj cxeno estas implementado
estas metante la unuan karakteron tie,
tiam ĉi tie, tiam tie, tiam tie, malantaŭo al malantaŭo al malantaŭo en la komputilo la memoro.
Do se vi volas literumi el vorton kiel SALUTON, vi metus 1 karaktero H,
tiam E, tiam L tiam L, tiam ho - 5 signoj en tuta - ie en via komputilo RAM.
Sed la ŝlosilo detalo estas, ke ili tuj revenos al malantaŭo al malantaŭo al malantaŭo,
tuj apud unu la alian.
Kiam mi diros s [i], kio en la angla estas ĉi donas al mi?
Kion s [i] reprezenti en tiu kazo? Yeah.
>> [Studento] La th,-a signo en la linio. >> Ekzakte. La th,-a signo en la linio.
Nun, i tuj komencas je 0 laŭ mia por buklo tie,
sed tio estas bona ĉar ĉiu komencas rakonti de 0.
Do s [0] tuj prezenti la literon H en vorto kiel SALUTON,
s [1] tuj reprezenti leteron kiel E en vorto kiel SALUTON, ks.
Kaj kion ni ŝajnas esti farante sur ĉiu ripeto de ĉi maŝo
estas provizore stoki la th,-a karaktero en variablo nomata c, kiu estas nur char,
kaj poste ni presi el c
por ke je la fino de la tago kion tiu programo faras estas jeno.
Se mi iros en la fonto dosierujo kaj Mi faros string1 kaj mi iras antaŭen kaj kuri string1,
kaj tiam mi tajpas vorton kiel SALUTON, Enter, ĉiuj faras estas presi ĉi 1 karaktero samtempe.
>> Do ekzistas ŝanco por bonmaniereco tie.
Mi estas speco de fari pli da laboro, kvankam ĝi estas pli klara eble tiu maniero, ol necesa.
Kiu linio de kodo tie mi povas probable forĵeti tute? Yeah.
Linio 24. En linio 24 Mi deklari variablon c.
Mi stoki la th,-a karaktero de s en ĝi, sed tiam Mi uzas c tie.
Do mi uzas c, do mi sentas ke mi ne povas simple ĵeti linion 24 for.
[Inaudible studento komenton] >> Ekzakte.
Do kiam temas parolante pri la dezajno de programoj,
rimarki tiun malpezan simpligo de la kodo, kiu estas same legeblaj,
sed rimarkas ke s estas nur variablo, ĝia datumtipo estas tabelo,
tial s [i] estas ĝuste tuj tuj revenos al vi la th,-a karakteron en tiu linio.
Kaj se vi volas presi ĝin, ke estas bone.
Vi nur devas uzi% c ĉar vi ne videbligi ĉenon,
vi presi karaktero en cxeno, kaj ankaux havas la efekton de presi la th,-a signo.
Kaj memoru la sola diferenco vere de lasta semajno kun uzante printf
estas ke dum en la semajnoj pasinteco ni farus ion super simpla
kiel la% s lokokupilo tiam la nomo de kordo tie,
nun ni estas subnaĝado en iom profunda sub la kapuĉo kaj dirante,
ne presi la ĉeno; presi la sola karaktero gxi.
>> Do ni povas fari iun iom malsama tie ĉar tie estas 1 aliaj - ne cimo
ĉar tiu programo estas prava, sed mi faras ion stultan
ke mi menciis mallonge merkredon.
Sed pensante reen, kiel povus tiu programo la dezajno esti plibonigita eĉ pli? Yeah.
[Inaudible studento respondon] >> Ho, bona.
Do rememori ke ni enkondukis dua variablo nomis n lasta fojo,
kiu ŝajnas esti kontraŭdirante mem ĉar mia celo dua monato
Estis nur por forĵeti variablo kiel nenecesa,
sed memoru, ke merkrede ni efektive faris tion.
Mi ŝanĝis la por buklo al reale havas komon ĉi tie, tiam n = strlen,
kaj tiam super cxi tie mi faris i <n, do mi faris mian pliigoj.
Kio estas la fundamenta gajno kiun mi atingi per ŝanĝanta mia inicialización al ĉi
kaj mia kondiĉo por tiu nun? >> [Inaudible studento respondon] >> Ekzakte.
Mi ne memorante strlen denove kaj denove kaj denove ĉar memori kiel la por buklo verkoj.
Eĉ se ili komencas akiri pli komplika aspekto,
memori, ke la afero antaŭ la unua punktokomo estas la inicialización, kio okazas unufoje.
La kondiĉo, tamen, estas en la mezo,
kaj ĉi gets kontrolis ĉiufoje ke vi iru tra la ciklo.
>> Do ĝi estas speco de stulta por esti petante la komputilo la sama demando multfoje -
Kio estas la longo de SALUTON? Kio estas la longo de SALUTON? Kio estas la longo de SALUTON? -
ĉar kiel ni vidos hodiaŭ kaj merkrede, ĉi tiu estas definitive tuj prenos tempon,
kaj ĝi ne estas tre bona uzo de tempo ĉar elŝeligi la longo de kordoj
fakte prenas iom da penoj.
Ne _instantaneous_, kiel estas en iuj lingvoj.
Do ŝanĝante tiun al n, la prezo Mi pagas estas kio?
Ni vidas komerca-off here.
Mi povas ŝpari tempon por ne demandante la sama malbenita demando denove kaj denove,
sed tuj kostis al mi ion, kiu estas kiu?
>> [Studento] Vi perdos iom da memoro. >> Ekzakte. Ĝi tuj kostis al mi iom memoro.
Do en tiu kazo kostas al mi kio?
Alia 32 bitoj ĉar n estas nur int, kiel implicita de la vorto int tie.
Sed estas kiu bonfartas?
Sincere, jen probable bone ĉar se vi opinias pri tio,
la pli longaj la kordo estas, des pli kiam mi iros al malŝparas
ĉar strlen tuj get nomata denove kaj denove kaj denove
por ĉiu ripeto de la ciklo.
Kaj tiuj tagoj, mia Mac havas 2 koncertoj de RAM, tiuj tagoj 4 koncertoj de RAM kelkfoje.
Mi kredas ke mi povas pagi 4 de tiuj bitokoj por fakte akceli aĵojn.
Sed ĉi tiu tuj estos komerco ekflugo kaj temo vere en programado kaj en komputiko
de neniam vere atingi ion senpage.
Se vi volas plibonigi ion ĉi tie, vi devas pagi por tio en la alia mano iel.
Spaco kontre tempo en ĉi tiu kazo.
>> Do tiu estis ĉiuj antaŭaj al io kripta kiel ĉi tiu,
kiu, kiel vi probable deduktis el tiu alteco, fakte diras?
[Inaudible studento respondon] >> Jes, do ĉi tio estas, Nepre trinku vian Ovaltine,
efektive uzante algoritmon nomis ROT13, ROT 1-3,
kiu nur signifas turni ĉiujn literojn 13 lokoj,
kiu signifas preni A kaj tiam aldoni 13 al ĝi kaj iras dot, punkto, punkto
tuta vojo al la 13a letero for, faru la samon por B kaj por C kaj por D'ks.
Kaj do se ni efektive konverti ĉi tie uzante movo de 13 lokoj,
ni reiros al la malmultan Ralphie havis, kiu estis, Nepre trinku vian Ovaltine.
Sed nun por problemo starigis 2, en la norma eldono almenaŭ,
vi devas ia ĉu ĉi enciphering mem,
kaj ni devas iel preni en enigo kiel ĉi tiu kaj ĉifri ĝin aŭ malĉifri ĝin.
>> Do kiu el tiuj fundamentoj ia kondukas nin al tiu ŝanco?
Ni rigardu ĉi tria ekzemplo tie.
Unue, ĝi estas nomata ASCII. Kion ASCII referi al?
American Standard Code for Information Interchange,
kiu estas vere longa maniero diri kion? Kio estas Askio?
[Inaudible studento respondon] >> Kio estas tio? >> [Studento] A karaktero mapo. >> Gravulo mapo.
Simple mapas nombroj al leteroj ĉar la mondo havas normigita
kio nombroj reprezentos kion literoj tiel ke ni ĉiuj povas uzi komputilojn
kaj niajn programojn ĉiuj estas nur kongrua kiam temas pri presado ekster aĵoj en la ekrano.
Do rememori ke 65 okazas por reprezenti A, 97 okazas reprezenti minuskla a.
Kaj tiel ĉi tiu simpla programo tie ASCII estas utiligante tiun fakton -
ke la mondo sciu, ke ĉefurbo A estas 65 - kaj ĝi estas nur presi la surĵeto.
>> Do antaŭ ol ni mergi en ĉi tiun kodon, mi anstataŭ malfermi fina fenestro.
Lasu min kaj fari ASCII, kaj tiam ni ĵus kuras tiun aferon nur por difekti la eligo.
Kaj ĝuste tion faras: vere granda tabulo kiu ĝuste diras al mi ĉiuj el la diversaj kodoj
por ĉiuj el la diversaj literoj.
Do la super simpla programo, sed mi ne devis forte kodo tiuj 52 linioj de eliro:
26 majuskla, 26 minuskla.
Kontraŭe, mi faris tion programmatically kun paro de cikloj.
Rimarku kion mi faris tie.
Mi ripetis de i estas 65 sur ĝis 65 + 26 ĉar mi volis printi 26 literoj
en la angla alfabeto, i + + en ĉiu ripeto, kaj nun rimarkis tiun denove.
Ĝi estas la rekursieca de nia amiko typecasting
per vi konverti 1 datumtipo al alia
ĉar kion mi volas fari en ĉi tiu aparta programo?
Mi volas rakonti ciferece ĉar tiel estas kiel mi kreskis kalkula - 65, 66, 67, kaj tiel plu -
sed mi ne volas presi nur la numeroj.
Mi volas presi la literon sekvata de la numero.
Mi volas presi Al: nombro, B: numero, sed mi povas fari ĉi tion kun la sama ekzakta variablo.
Do mi presi% c kiel lokokupilo di karaktero,
% D kiel lokokupilo por cifero aŭ nombro.
Tiam kion mi ŝtopi en por tiuj 2 anstataŭiloj?
Mi unue plug en la karaktero ekvivalento de i, kaj tiam mi presi i mem.
>> Do rimarki ankaux nur funkcias.
Ĝuste kiel mi povas jxetu de kaleŝego al int
por iri de reela nombro por entjero,
ĉi tie mi povas iri de unu int al char, kiu estas iom stranga -
ne sufiĉe mapaj sur la reala mondo - sed en komputiloj
a char estas nur nombro sub la kapuĉo,
do ni esti eterne tiel eksplicita tie por la komputilo, dirante:
printf, presi ne mi kiel 65, presi gxin kiel ĝia nombra ekvivalento.
Kaj ĝi rezultas mi teknike eĉ ne bezonas tion.
Kion mi faris antaŭ momento estas eksplicite jxetantajn
specifante kio datumtipo Mi volas iri de kaj al.
Sed rimarki ke mi jam havas tiun lokokupilo% c
kaj tiu alia% c lokokupilo tie.
Kvankam ĉi tio ne estas int, la komputilo rimarkas ke char,
ĝi estas nur int sub la kapuĉo.
>> Do, se mi efektive recompilar ĉi kaj rerun la ASCII programo,
rimarki ankoraŭ nur funkcias ĉar la komputilo rimarkas, ke ekzistas tiu korespondado.
Nun, estas pli grava por fari la eksplicita casting en la mondo de flosas al ints
ĉar vi fakte farante kalkulita decidon:
forĵetu ĉio post la dekuma punkto.
Tie estas vere nenio forĵeti ĉar karaktero estas nur numeron,
kaj linio estas nur tabelo de signoj.
Do kiam temas tempon por efektivigi iun kodita aŭ malĉifro,
kio okazis, ke ni povas efektive traduki ion kiel ĉi sensencaĵon al,
Nepre trinku vian Ovaltine?
Kio se ni scias nun - ni prenu al supozo - ke la ŝlosilo,
la nombro ke ni turnanta ĉiuj el tiuj literoj por, estas la numero 13?
Do ni iris de la litero B tuta vojo al ho je la komenco de la frazo,
Nepre trinku vian Ovaltine, ĉar se mi faras B
kaj tiam mi iros C, D, E, F, G, H, I, J, K, L, M, N, O,
jen kial la ĉifrado de la litero B igas Aŭ
ĉar mi ĵus aldonis 13 al ĝi.
>> Do se mi volas deĉifri tiun, mi esence devas preni O kaj tiam subtrahi 13 de ĝi.
Aŭ, sincere, ĉar tie estas 26 literoj en la alfabeto, estas mirinde simetria,
ni povas ankaŭ simple aldoni 13 kaj ni reiros al la letero B.
Sed kiel vi irados tra apliki io ​​tiamaniere en Cezaro
aŭ vere manipulanta kordoj ĝenerale?
Se la litero B estas kion numeron?
Kio estas la litero B? Do ĝi estas 66, right?
Do se la litero A estas 65 kaj la litero B estas 66,
do 66, ĉiuj mi devas fari estas aldoni 13 al ĝi, kaj tio donas al mi 79.
Kaj se ni iros al nia eta cheat folio, 79 ja mapoj sur O.
>> Sed estas iom de angulo kazo tie.
Kio estas, ekzemple, la letero Z?
Se ni faras 66 + 25 por ricevi la tuta vojo al la fino de la alfabeto, ni estas en 91.
91 + 13 donas al mi 104, kaj divenu kion?
104 ne egalas al majuskla litero.
Ni reiru al iom cheat folio ĉi tie.
Se mi rerun ĉi programo en la aparaton, avertas ke 104, se mi reiros al la stacio fenestro,
104 estas ŝajne la minuskla h.
Do ni bezonas iujn ŝlosilo lertaĵo tie por certigi, ke kiam ni starti je Z
kaj ni aldonos 13 al ĝi ni ne volas nur teni forĝi antaŭeniris daŭre pli grandaj nombroj.
Kion ni vere volas fari?
Vi volas kovri ĉirkaŭe.
>> Do rezultas, kiel vi vidis probable en sekcio nun aŭ en la problemo aro spec mem
rimarkis, ke ekzistas tiu alia operatoro en C kiu ankaŭ estas procentsigno,
sed dum ni uzas% tien por specifi lokokupilo,
scias ke, speciale por problemo aro 2, estas ankaŭ iu kiel jene:
int x = y% z.
Lasu min nur prezenti tion kiel tre ĝenerala formo de ĉi tiu.
Procentoj signifas kio en programlingvo? >> [Studento] Modulo.
Module, kiu estas imago maniero diri la resto.
Kvankam ekzistas eta distingo kun la difino tie,
tio signifas dividi y per z sed ne revenas la rezulto de tiu divido;
anstataŭe, redoni la resto.
>> Do se y estas fakte 3 kaj z estas vere 2, 3 dividita per 2 estas 1 kun resto de 1,
do kion faras x vere egala en ĉi tiu scenejo? 1.
Tiu estas tia simpla, malalta nivelo ideo.
Ĝi prenas iom da tempo por akiri vian menson envolvis ĉirkaŭ ĝi
ĉar ĝi estas probable estis dum kiam vi eĉ devis prizorgi pri forĵetaĵojn
kaj reale uzi ilin por io celkonscia,
sed en ĉi tiu kazo la simpla fakto ke vi povas iri de granda nombro kiel 3
al relative malgranda nombro kiel 2 kaj poste envolver ĉirkaŭ efektive
per uzanta la resto al plej malgranda valoro kiel 1 tuj estos invalorable lertaĵo
ke ni povas uzi ambaŭ por iu kiel Cezaro kaj tiu alia afero Vigenère
en problemo starigis 2, sed ĉi tiu tuj estos _recurring_ lertaĵo tuta semestro.
Tiu simpla, simpla ideo de nur prenante la reston en ĝenerala
tuj ni permesos kovri ĉirkaŭe.
Kaj kiel ni komenci ludi pli kun tabeloj, kiel ni komenci ludi pli kun memoro mem,
ĉi tiu tuj fariĝis pli kaj pli de potenca atuto.
>> Do demandojn tiam ASCII aŭ la reprezento de kordoj kiel tabeloj?
Kaj ni prenos gxin 1 muesca plu. Yeah.
[Inaudible studento demando] >> Bona demando.
Kion tio signifas kiam variablo havas asteriskon antaŭ ĝi?
Lasu min prokrasti respondi ke en ajna detalo,
sed kiu raportas al temo konata kiel puntero.
Punteros devas fari kun memoro, kaj ni estas fakte hodiaŭ
prenante la unua paŝo al tiu diskuto,
sed por nun, lasu min ŝajnigi ke la stelo ne ekzistas
kaj ni daŭrigos nomi kordoj kordoj anstataŭ uzi char *,
kiu vi verŝajne vidis antaŭe kaj mi metos sur la ekrano, en nur momento teaser.
Do ni revenu al tiu en maniero pli detale ol multaj el vi verŝajne volas.
Fine, ne hodiaŭ. Yeah.
>> [Inaudible studento demando]
En kio kunteksto vi devas provizi la signo por karaktero? >> [Studento] Yeah.
Do implicite, kiam vi ne metas +, nur pozitivaj nombroj estas alprenita.
Do, se nur skribi la numeron 1, ĝi estas pozitiva 1.
Se vi vere volas specifi la nego de valoro,
vi laŭvorte devas fari -1 sur via klavaro.
Sed ĉi tio probable ne estas via demando. >> [Inaudible studento respondon]
>> Bona demando. Okay.
Do tiu havas por fari, Mi kolektos, kun ia cimo vi renkontis
ĉar vi estas konverti entjera al gravulo,
sed iel negatividad enzarzó,
kaj do la karaktero simple eliris munged iel.
Do por la momento, lasu min oversimplify iom gxis ni revenos al ĉi tiu speco de temo.
Por nun, pensu pri aferoj tiamaniere - kaj ĉi tiu estas simplificación.
Sed en la mondo de entjero, vi havas kiom da bitoj je via dispono?
Vi havas 32 bitojn.
Kaj ĝis nun, ni jam parolis pri la suma nombro de entjeroj vi povas pro reprezenti
estas proksimume 4 milionoj en tuta ĉar vi havas 32 bitojn,
tial jen 2 al la 32, do tio estas krude 4 miliardoj.
Sed ni vidis unu semajno aŭ 2 tagoj, ke vi ne vere havas limigo de nombroj
de 0 sur ĝis 4 miliardoj.
La gamo anstataŭ iras de proksimume negativa 2 miliardoj pozitiva 2 miliardoj.
Sed ĉi tiam petas la demandon, kiel vi reprezentas la nocion de negativaj 2 miliardoj
des malpli negativa 1?
Cxar nun, ni povas oversimplify kaj simple diri ke ni iras al uzi la plej maldekstra iom
el tiuj 32 bitoj, kaj se ĝi estas 1 ĝi estas negativa nombro,
kaj se ĝi estas 0 estas pozitiva nombro.
La problemo kun tiu simplificado reprezento de negativaj nombroj
estas ke se vi intence esti saĝa kaj klopodante igi de gravulo al nombro
aŭ inverse, ne estas tia afero kiel negativa signo.
En la mondo de ASCII, kiu uzas nur 8 bitoj, ĉiu 8 el tiuj bitoj aferon,
kaj la plej maldekstra iom havas nenion komunan kun negatividad.
Kaj nur por esti klara, kiam mi diras _leftmost_ bitoj,
memori, ke kiam ni faris nia malmulto-rilataj ekzemploj en la unua semajno
memori, ke ni tiris aĵojn kiel 1001101, io kiel tio.
Kiam mi diras la _leftmost_ iom, mi nur laŭvorte signifas la 1 kiu vi skribas la tutan vojon tra la maldekstra.
Do en la mondo de karakteroj ne ekzistas nocio de negatividad,
por ke _leftmost_ iom reale havas ion por fari kun ASCII, neniel koncernas negatividad.
>> Do ĝi sonas kiel - kaj el kunteksto estas malfacile respondi ĝuste -
sed iel, via kodo estis malklara ke _leftmost_ iom kiel reprezentantoj negativa valoro
kiam vere estis parto de la karaktero en demando.
Kaj denove, mi oversimplifying ĉar komputiloj reale faras ion iom amatoro
ol nur ŝanĝas ke _leftmost_ iom al 1 por negativa signo kontre a 0.
Ili anstataŭe, se vi estas scivola al Google, uzi ion tipe nomitaj 2 La komplemento,
kio estas iom pli kompleksa de proksimigo
sed la ideo estas finfine la sama.
>> Do mallonge, ĝi devis fari kun la fakto, ke vi massaging numeron al gravulo
aŭ inverse sed via kodo ne estis consciente la fakto
ke 1 de tiuj bitoj havis signifon en la nombran mondo.
Tio ne estas la kazo en la karaktero mondo.
Sed sonas kiel vi fiksis, en kies kazo Moot nun. Aliaj demandoj.
Okay.
Do ĝis nun, ĉio de la programoj ni skribas prenis enigo eble de la uzanto
en formo de funkcioj kiel GetInt, GetString,
aŭ se vi jam estis legante antaŭeniras en diversaj libroj aŭ Interreto referencoj,
vi mem povus esti uzataj funkciojn kiel scanf kiu, sincere, ni uzas en la CS50 biblioteko.
Sed en unu semajno aŭ 2, ni reale montri al vi kiel la CS50 biblioteko estas implementado
por ke ni povu preni tiujn trejnado radoj sur aro.
>> Sed ĝi rezultas tie estas alia metodo por enigo de uzanto.
Fakte, ni mem estis uzante komandlinio argumentoj
dum kelkaj semajnoj nun.
Ĉiufoje ni kuros Clang aŭ ni kuros fari,
ni ne nur tajpitaj clang, Enter, ni ne tajpis fari, Enter.
Kion ni tipe skribita post la vorto clang ĉe nia stacio fenestroj prompto?
[Studento] La dosiernomo. >> La dosiernomo, ĉu ne?
Hello.c aŭ mario.c aŭ kion ajn la koncernajn dosiernomo estas.
Kaj en tiu senco, kion vi vere faris estas vi influis la konduto de Clang
ĉar certe la personoj kiuj skribis Clang havis nenian ideon, ke iom malnova vi
tuj skribi programon nomata mario.c jarojn poste.
Do vi devis iel influi la konduton de tiu programo,
kaj tiu programo Clang devis esti skribita en tia maniero, ke ĝi povas akcepti enigon el vi
per la aldono de vortoj en la prompto antaŭ la uzanto sukcesoj Eniru.
>> Do rezultas ke dum iom da tempo ni estis deklarante preskaŭ ĉiuj niaj programoj
komenci kiel tiu - int main (void) - kaj tiam ni antaŭenirinta
kaj komencis skribi nian kodon.
Kaj ni havu iom da akraj inkludas sur la supro de la dosiero,
sed preskaŭ ĉiuj niaj programoj ĝis nun komencis kun tiu
kvankam vi eble vidis en sekcio, en libroj, interreto referencoj
ke tio ne fakte devas esti malplena.
Alia prava formo por ĉi preni estas int argc kaj poste string argv [].
Do nun kio ĉi implico?
Ĝi rezultas ke argc, kiu estas homa konvencio - vi povus voki ĉi foo,
sed ĝi nur estos multe malpli klara al legantoj -
argc nur estas argumento por la funkcio nomita ĉefa kiu reprezentas kio?
Kion argc stari por tiuj familiara?
>> [Inaudible studento respondon] >> Jes, nombro de argumentoj aŭ argumento grafo.
Tio estas tiel simpla kiel tiu.
Kiom da argumentoj estis pasita al tiu programo?
Kion tio signifas?
Se sur la komanda linio mi kuri io tiamaniere - clang mario.c--
argc kiam mi batis Entajpu tuj alpreni valoron de, iom implikante, 2.
Do rezultas ke argc estas argumento grafo,
sed pro historiaj kialoj, la nomo de la programo mem estas inkluzivita en tiu grafo.
Do argc estas 2, kiam mi skribis clang mario.c.
Kion argv enhavi?
Unue, argv aspektas kiel ŝnuro, sed ne tute
ĉar ekde la pasinta merkredo kaj des pli hodiaŭ,
tiuj rektaj krampoj signifi kion? Tio estas tabelo.
Ne nombro en la tabelo, kaj ke devus sencon intuicie
ĉar la homoj kiuj skribis Clang jaroj certe ne havis ideon
kiom da vortoj homo kiel ni devus tajpi ĉe la prompto antaŭ kolizii Eniru.
>> Do en ĉi tiu kazo tie ili deklaris la funkcio ĉefa prenado tabelo de argumentoj,
0 aŭ pli argumentojn.
Ili ne scias anticipe kiom ekzistas,
do estas intence neniu nombro ene de tiuj rektaj krampoj.
Sed la fakto, ke la rektaj krampoj estas tie estas rakontanta al la komputilo,
atendi tabelo.
Argv estas nur stenografio skribmaniero por argumento vektoro.
Vektora estas ornama metodo por diri tabelo,
kaj batalarangxis estas ornama metodo por diri liston aŭ kolekto.
Do ĉi nur signifas ke se vi skribas ĉefa ŝatas ĉi
anstataŭ kiel kiom ni estis farante ĝin dum la lastaj kelkaj semajnoj,
via programo nun havas la povon por akcepti komandlinio argumentoj
tiel ke jam vi devas skribi mario kaj poste batis Enter,
tiam tajpi en nombro por kiom da blokoj alta vi volas la piramido esti,
tiam batis Entajpu denove.
Ni eĉ ne bezonas uzi GetString plu aŭ GetInt aŭ GetFloat por tiu afero.
Ni povas nur atendi la uzanto tajpas tiuj vortoj ĉe la prompto mem
same kiel la aŭtoroj de Clang decidis ke estus vere tedas programo
se kompili via kodo vi unue tajpita clang, batis Enter,
tiam ni diris al la uzanto, bonvolu tajpi la nomon de la dosiero kiun vi volas kompili,
tiam ni entajpi mario.c kaj batis Eniru.
Sed tio estas ĝuste kion ni estis farante al niaj uzantoj la pasintaj kelkaj semajnoj.
Ni uzas GetString kaj ni atendu ĝis la programo kuras al instigas ilin por enigo.
Kiu jam ne bezonas esti la kazo.
>> Do en ĉi tiu ekzemplo tie, ni nun havas ĉenon argv,
kaj ankaux estas simplificación,
trejnado radoj kiuj tre frue elspezas.
Ĉi tiu estas la plej taŭga metodo por skribi ĉi alternativa deklaro de ĉefa
ĉar ĝi rezultas ke kion ni plenumas nomante ŝnuro fakte havas stelon,
asterisko, en lia reala difino, sed ĉi nur aspektas komplika,
ĝi estas malklara al la komenco, do ni simpligi por nur kreante sinonimo de varoj
en la CS50 biblioteko kiu mapoj char * por tiu pli afablan vorton ŝnuro.
>> Do ni vere provas ĉi tiam. Lasu min kaj malfermu gedit tie.
Lasu min kaj malfermi argv de 1.
Ĉi tiu programo ŝajne presas la argumentoj, sed en la angla terminoj,
rigardante tiun kodon, kion signifas ĉi fari pli specife?
Se mi tajpu la komandon a.out foo trinkejo, kio gets presita en mia blanka kaj nigra fenestro?
A.out foo bar, Enter.
Iru antaŭen. Yeah. >> [Inaudible studento respondon]
Bona. Do a.out, nova linio, foo, novan linion, trinkejo, novan linion.
Kial tio estas? Ni povas certe konfirmi en nur momento.
Tio estas speco de fluffy linio de kodo.
Ĝi simple presas nova linio simple fari tion pli belaj en la ekrano.
Tio ĉi estas buklo ke tio ripetanta de 0 sur ĝis argc,
kaj ĉi tiu estas pliigante en ĉiu ripeto + +.
Do tiu estas nun dirante presi ĉenon, kiel implicita de ĉi% s.
Argv [i] estas preskaux la sama ideo de la antaŭa ekzemplo.
Ni kutimis nomi la variablo s; nun nomas, arbitre, argv.
Tio signifas presi la th,-a argumento kiu tajpis en la komandlinio,
kaj post ĉi tiu afero estas farita, nur por bono mezuron presi alia nova linio.
>> Do ni vidu tion. Lasu min malfermi la terminala fenestro.
Lasu min kompili argv de 1, kaj nun mi kuros argv de 1, Enter. Hmm. Okay.
Ni kuras foo trinkejo. Interesa. Baz.
Kaj se vi iam scivolis, kial mi tajpas tion,
ĉi tiu estas nur ankaŭ stulta komputiko konvencio.
La mondo ofte bezonas nur parolaj anstataŭiloj por vortoj.
Do se vi volas paroli pri iu ĝenerala linio,
komputilo sciencistoj simple emas diri foo kiam ili bezonas hazarda vorto,
tiam ili diros trinkejo se ili bezonas duan hazarda vorto,
tiam ili diros baz se ili bezonas trian vorton, tiam oni diras qux se ili bezonas kvara vorto,
kaj tiam tie estas grandega religia debato en linio sur kio venas post qux,
tiel vi povos Google ke elkompreni kiel la aliaj arbitraj vorto devus esti.
Sed tiuj ne havas signifon ajn,
kvankam foo trinkejo, se vi Google kiu, tio havi signifo,
kiu estas parto de la etimologio tie.
>> Do ĉio ĉi faras tiam estas presi 1 el tiuj kordoj por linio.
Do se mi anstataŭe, tamen, volis iom amatoro,
supozu ke mi ne volas presi ĉiun ĉenon por linio;
Mi volis printi ĉiu karaktero de ĉiu linio por linio.
Kiel mi povus anstataŭ fari tion?
Kion mi bezonas por ŝanĝi pri tiu programo, se mi volas presi ne ĉiu vorto
sed mi volas presi ĉiu vorto letero de letero por letero,
tiam la sekva vorto letero de letero de litero?
Kiel ni kombini tiujn ideojn tiel multe? Yeah.
[Studento]% c. >> Bone. Do ni ie bezonas% c.
Bona, ĉar mi ne volas presi tutajn kordoj, mi volas presi gravuloj. Kion alian?
>> [Inaudible studento respondon] >> Interesa.
Do ni bezonas ia dua dimensio tie nun
ĉar pensi argv tiel tablo, sed estas tabelo de kordoj.
Sed kiel de, kiel, 15 minutoj, kio estas kordo? Ĝi estas aro de karakteroj.
Do vere, argv estas tabelo de tabelo de signoj,
tabelo de tabeloj de signoj.
Do rezultas ke ni povas uzi nur pli kvadrata krampo notacioj. Do ni faru ĉi.
En la pinto de tiu ciklo sur linio 19, mi tuj persisti el i ĝis argc,
sed tiam mi faros jene:
cxar - mi ne povas uzi i nun.
Mi bezonas alian variablo ĉar mi volas persisti super la vortojn
sed tiam ankaux sur la literoj en la vortoj
do mi ia havas vertikala akso kaj horizontala akso, ia koncepte.
Do int j ricevas 0, tiam mi volas fari j dum j estas malpli ol - kaj mi purigi ĉi supre en iom.
Kiel mi persisti super la literoj en linio? Ni faris ĉi antaŭ momento.
Strlen de argv [i]. Bona.
Kaj denove, mi faras iom ineficiencia tie por ne krei n aŭ kion ajn,
sed ni revenos al tio.
>> Do nun j + +. Nun mi devas indent plu ĉi tie.
Kion mi nun volas presi en ĉiu ripeto?
[Inaudible studento respondon] >> Do [i] donos al mi la vorto.
[I] [j], ia kiel matrico.
La de vi kun math-y fonoj,
ni estas speco de indeksado eĉ pli profunden en ĉi tiu matrico aŭ tiun tabelo de tabeloj,
ĉi 2-dimensia strukturo.
Do nun ni vidu kio okazas tie. Lasu min malfermi mia granda fina fenestro.
Lasu min rerun fari de argv de 1.
Kaj mi ŝraŭbita ĝis tie, kiu estas bona leciono, ĉar mi tro forgesis fari tion.
Implice deklarante C biblioteko funkcion 'strlen' kun tipo 'sensigna -
Mi ecx ne scias kion la resto de tiu signifas, sed mi vidis ĉi tion antaŭe,
implice deklari.
Kiam ajn ni vidas ĉi eraron, kion signifas ĉi kutime signifas?
>> [Inaudible studento respondon] >> Mi forgesis biblioteko ĉe supro. Sed atendu momenton.
Kutime mi ŝraŭbita supren ĉar mi forgesis la CS50 biblioteko, sed tio estas tie.
Kutime mi ŝraŭbita supren ĉar mi forgesis normo Mi / O.
Kaj sincere, mi eĉ ne bezonas tiun. Ni ne uzas GetString hodiaŭ.
Do kion mi mankas?
Ekzistas alia biblioteko kiu nun ni bezonas uzi foje nomata string.h,
kaj ĉi tiu estas nur alia biblioteko kiu havas pli funkcioj kiuj ne estas en normo Mi / O.
>> Do ni revenu al mia granda fina fenestro.
Okay. Nun, damn it, mi supozas mi estis erara. Mi estis uzanta la CS50 biblioteko.
Do ni povas fiksi tion en iu el 2 manieroj.
Ni povas preni la trejnado radoj ekstere nun kaj nur faru tion,
aŭ estu la speco de observu ke simpligo nur por la momento, alglui ĉi reen en,
solvi tiun problemon, kaj nun reiru al la fina fenestro.
Do esti klara, en la CS50 biblioteko estas ne nur funkciojn,
ĝi estas ankaŭ la ŝlosilvorto kordoj, tial ke eraro ĝuste okazis.
>> Do jen ni iru. Mi riparis ambaŭ de la biblioteko temoj. Eniri. Bona.
Argv de 1, foo bar, Enter. Bonega.
Do nun ni havas ĉiu litero de ĉiu vorto presita 1 por linio,
kiu ne faras por tre interesa programo,
sed avizo nun ni havas la kapablon de ne nur ripetanta super vortoj
sed ankaŭ super individuaj literoj en vortoj, kiuj sonas terure familiara
al inkluzive la plej simpla el aplikoj kiel grimpadi literoj en cxeno ŝatas tion.
Ni iru antaŭen kaj prenu nian 5-minuta paŭzo tie.
Kaj kiam ni revenos, ni komencis paroli pri la efikeco
kun kiu ni povas fari tion pli bone.
>> Bone. Ni estas dorso.
Danke al unu el niaj TFs kiu ludas multajn bananagrams,
ni efektive havas tuta amaso de signoj kun ni ĉi tie hodiaŭ
fizike korpigis kun tiuj malgranduloj plasto pecoj,
kaj lasu min proponas ke ĉi malplenan blanka skribtabulo tie reprezentas la RAM en mia komputilo -
portebla, labortablo, kion ajn - kaj tie aspektas kiel multaj ĝin
ĉar se ni komencas batante tiun RAM en malgrandaj bajto-grandeco pecoj,
ni arbitre diri ke iu kiun grandecon kaj ke neklara reprezentas -
tie ni iru, kaj estu la malzomi iom tie -
diru ion tiu grandeco reprezentas unuopa bajto.
Do ni povas ja persvadis tuta amaso de bajtoj aŭ karakteroj ene de ĉi memoro,
kiel sugestita de la relativa grandeco tie.
>> Do supozu nun, ke la celo estas rezervi memoron por linio.
Kiel tiu ĉi vere funkcias?
En la programoj ni estis skribante, ni kutime uzis GetString,
sed nun, klare, estas ĉi tiu alia kanalo tra kiu ni povos atingi uzanto enigo en argv
tra komandlinio argumentoj.
Sed kio vere okazas sub la kapuĉo?
Ĝi rezultas se ni nomas - ni rulumu reen al GetString - la funkcio GetString
en la CS50 biblioteko, la uzanto instigis por kordoj,
la uzanto tajpas en iu vorto - ni nomas ĝin SALUTON.
Kaj ni estis dirante dum la lastaj kelkaj semajnoj, ke la reveno valoro de GetString
estas fakte kordoj, kiel la vorto SALUTON.
>> Sed kio GetString vere faras?
Kiel la uzanto tajpas en SALUTON, Enter, GetString estas decidi,
bone, kiom da karakteroj estas tio? Tiu estas H-E-L-L-O.
Do ĝi bezonas destini, ĝi bezonas demandi la mastruma sistemo - Linukso en ĉi tiu kazo -
dum almenaŭ 5 bitokoj stoki SALUTON.
Kaj kio tiam procedas fari unufoje alvenas reen tiuj 5 bitokoj de la mastruma sistemo
estas jalonan SALUTON malantaŭo al malantaŭo al malantaŭo al malantaŭo.
Kaj tiel tio, kio vere revenis de GetString estas eron de datumoj kiuj aspektas kiel ĉi tio.
Sed ĉi tiu estas iom malpreciza ĉar ĝi rezultas ke ĝi ne estas tiel simpla
kiel simple stoki SALUTON en la komputilo la memoro
ĉar supozas ke mia programo kiu mi skribas en C tiam nomas GetString denove,
kaj la sekva vorto la uzanto tajpas en estas ADIAŬ, ADIAŬ.
Nu, mi bezonas por ĝustigi tiu vorto ADIAŬ ie en memoro.
Mi ne povas clobber SALUTON.
Ekzemple, mi ne volas la komputilon al komencu overwriting kiel tiu
la originala vorto ĉar mi povus ankoraŭ esti uzanta la vorton SALUTON en variablo
ie ajn en mia programo.
>> Do B-Y-E havas por fini aliloke en memoro.
Sed la konvencio tipe estas ke la sekvanta linio vi destini
probable, sed ne ĉiam, tuj finos je la venonta havebla memoro loko.
Kaj se mi ne petis la mastruma sistemo por ajna memoro
ekde la lasta fojo mi vokis GetString, malakordo estas la vorto ADIAŬ
tuj finos ĝuste post la vorto SALUTON en memoro.
Sed en ĉi tiu punkto povas eble vidi kie potenciala problemo ekestas.
Ĉar la sekvanta pecoj de memoro, la sekvanta bitokoj, kiuj estis nur libera -
purigi blanka skribtabulo - en la komputilo la memoro estis tuj apud SALUTON,
sentas kiel la unua kordo mi petis povus subite nun ŝanĝi
ĉar mi esence ŝanĝis ĝin al HELLOBYE
anstataŭ iel demarcing la komenco de ADIAŬ kaj la fino de SALUTON.
>> Do rezultas ke kio vere okazas sub la kapuĉo,
kion vi eble duonvidis en linio referencoj aŭ sekcio aŭ libroj
aŭ tute ne nur ankoraux estas, ke ekzistas reale intenca demarcación
inter vortoj en komputilo la memoro.
Kaj fakte, en ĉi tiu kazo tie, anstataŭ nur metis ADIAŬ tuj apud SALUTON,
anstataŭe, la komputilo metas specialan karakteron, la speciala nula karaktero, por tiel diri,
kio estas reprezentita per markilo kun backslash 0.
Do longan rakonton, memorigu, ke signoj estas reprezentitaj en ASCII.
ASCII estas nur surĵeto inter nombroj kaj literoj,
kaj la plimulto de tiuj literoj komenci proksimume 65 por ĉefurbo A,
sed ĝi rezultas vi povas certe reprezentas la numeron 0 kiel entjero aŭ en duuma,
kaj tio rezultas la mondo decidis tre longe: "Vi scias, kion?"
"Estu la rezervo nombro 0 kiel ne reprezentas iu ajn signon sur la klavaro -
"Neniu literoj, ne nombroj, neniu interpunkcio. 0 estas speciala."
"Ĝi estas tuj estos la speciala nula karaktero, kaj ni tuj skribos ĝin kiel \ 0."
La diferenco estas, se ni nur skribis 0, 0 estas karaktero.
Memori ke ekzistas ASCII kodoj por 0, dum 1, por 2, dum 3
ĉar la karakteron 0 estas malsama de la nombro 0.
Kaj vi povas vidi, ke se vi retrorigardas de semajno 1 kiam ni unue parolis pri ASCII,
0 kaj 1 kaj 2 kaj 3 tuta vojo ĝis 9 havis siajn proprajn ASCII kodoj.
Ili ne estas, hazarde, 0 tra 9. Ili estas tre malsamaj.
Do 0 simple signifas "Mi estas speciala," kaj la \ 0 rimedoj, laŭvorte, "Mi ne estas la 0 karakteron."
"Mi estas tiu speciala valoro, la nula karakteron."
Do mi vere bezonas alian de tiuj kiam mi ne povas fari la saman eraron du fojoj.
>> Do post la vorto ADIAŬ ni ankaŭ tuj bezonos alian de tiuj nula gravuloj.
Lasu min kapti mian plumon tie kaj lasu min rapide desegni alia \ 0
tiel ke post mi demandis la mastruma sistemo por 2 kordoj
tra GetString sekvita de alia alvoko al GetString,
ĉi tiu estas kio estas reale en memoro.
Do kiam mi reiros ĉenon, mi vere contrarestar ke,
kaj kiam mi atingas la sekvanta linio, mi vere contrarestar tio.
Do ĉi petegas la demando, strlen, unue, kio devus ĝin redoni?
Kiam mi vokas strlen sur la kordo s kaj s estas la vorto SALUTON ke la uzanto tajpas en,
Kion ni evidente diras la longo de SALUTON estis kelkajn minutojn antaŭe?
Estis 5, right? H-Kaj-L-L-O. Kaj tio estas ja kiel strlen verkoj.
Denove kion normala homo devus atendi la longo de kordoj esti.
Sed fakte, kiom granda estas la tabelo de signoj ke tio stokante saluton?
Estas vere 6.
Do strlen ne mencias tiun fakton al vi.
Sed sub la kapuĉo la komputilo ja uzante 6 bajtojn por memori 5-letero vorto,
kaj ĉi tiu estas vera negrave kiom longe la vorto estas.
Tie ĉiam tuj estos speciala nula finanta karakteron al la fino de la ŝnuro
al demarc lia tuta longo.
>> Se do vi estas nun la persono apliki strlen 20, 30 jaroj,
kiel vi irados tra apliki strlen mem?
Ni prenu por koncedis ke ĝi ekzistas, ĝuste kiel ni prenu por koncedis ke printf ekzistas,
sed se SALUTON estas la vorto en demando
kaj kion mi havas en memoro estas iu kiu aspektas kiel ĉi tiu,
se vi devis reimplement strlen ĉar vi demandis al
aŭ ĉar, sincere, vi ne sciis strlen ekzistis -
vi devis ruli ĉi tiun ĉe via propra - kiel vi povis apliki strlen
kiam donita iu kiu aspektas tiel?
Nun ke ni scias cxeno estas tabelo, ni povas persisti super ĉiu el la diversaj gravuloj
uzante ion kiel - Ni provu fari tion en la muŝo.
>> Lasu min iri en la aparaton. Lasu min krei novan dosieron, strlen.c.
Lasu min nun kaj ne inkluzivas stdio.h tiel ke ni havas aliron al printf.
Lasu min fari int main (void). Oh. Mi nur faras tion en mia propra cxar nun tiam. [Chuckles]
Dankon.
Ĉi tio estas kion mi faras. Bone.
Do antaŭ ol mi turnis sur la ekrano, mi tajpis la tuta de tiu.
Kaj nun kion mi faros estas la jenaj:
printf ("Donu al mi string:")
Tio estas nur lanugaj instrukcioj.
Nun lasu min fari ĉenon s = GetString.
Mi jam devas fari ŝanĝon nun.
Mi uzas la CS50 biblioteko subite, tiel ke mi iru antaŭen kaj tajpu en cs50.h.
Kaj nun ni faru jene: printf ("La longo estas:% d, strlen [s] -
kaj mi ne faris ankoraux. Kion alian mi devas aldoni al tiu programo?
>> [Studento] string.h. >> String.h.
Do nuntempe, ni uzas strlen, do ni certigu la tradukilo scias kie tio estas,
do iom prudento kontroli.
Mi ricevas ĉenon en linio 8, kaj en la linio 9 Mi presi siajn longo kun% d.
Do ni iru antaŭen kaj malfermu tiun supren.
Ni faras strlen - kompilas okay -
strlen - lasu min zomi - Entajpu, H-E-L-L-O, Enter. La longo estas 5.
>> Okay, do strlen ŝajnas funkcii, sed la mondo sciis tion.
Do ni nun apliki strlen nin kiel sekvas.
Lasu min prenas ĉi biblioteko for.
Ni ne plu havas aliron al string.h ĉar mi eĉ ne sciis ekzistis.
Sed tio estas bone, ĉar mi povas apliki strlen mem
kaj havi ĝin preni string nomata enigo,
kaj nun mi bezonas por kalkuli la longon de ĉi tiu linio.
Do kiel mi povas fari ĉi tion?
Kio se mi faras - ni vidu kiel fari ĉi - Kion vi volas fari?
>> [Inaudible studento respondon] >> Bone.
Do ni povas fari tion en faskon da manieroj. Lasu min provi preni tiun koncepton.
Lasu min donu al mi la int variablo i, do mi komencas je 0.
Kaj mi diru jene: dum eniro [i] estas ne egala al kio? \ 0.
Do rezultas, kiel kun la kazo kun ĉiuj signoj kiam skribas ilin laŭvorte en programo,
oni devas uzi nur citaĵoj, ne duoblaj citiloj.
Do, se mi skribis la leteron al, mi farus tion, la letero b, mi farus tion.
Ĉi tio, per kontrasto, estus ĉenon, ne individua karaktero.
>> Do mi volas \ 0 laŭvorte. Kion mi volas fari en ĉi tiu buklo?
Vere, mi bezonas alian variablo, do int longeco atingas 0.
Eĉ se vi ne certas kial ni komencis la vojon ni faris,
nun ke ni iras tiun vojon, kion mi volas fari en linio 9?
longeco + + kaj tiam malsupren tie sur linio 10, reveno longa.
Do kiel estas strlen implementado?
Ĝi estas fakte implementado probable kiel ĉi tio.
Eble la persono uzis por ciklo, eble fari dum loop - kiu scias?
Ni ŝatus vere devas serĉi sub la kapuĉo en la reala fontokodo
en iu dosiero nomita string.c probable.
>> Sed ĉi tie ni pensas pri tio, kion mi faras.
Mi deklaras variablon nomis i, metante ĝin egala al 0.
Mi tiam deklaris alia variablo nomas longo, fiksante ĝin egala al 0.
Tiam mi diris dum la th,-a signo en enigo ne estas egala al la speciala nula karaktero, \ 0,
pliigo la longo.
Sed tuj kiam la th,-a signo estas tiu speciala karaktero, kio okazas al la ciklo?
Ĝi mallongaj cirkvitoj. Ĉesas, kiu signifas ke ni tiam tuj revenos longa.
>> Do, se mi ne mess up, ni iru antaŭen kaj iru reen al mia fina fenestro.
Lasu min recompilar. Kaj mi ne ŝraŭbo supren.
Nekongrua redeclaration de biblioteko funkcio strlen.
Do mi provis akiri tro ruza por mia propra bone tie.
La tradukilo fakte scias ke estas funkcio nomita strlen
eĉ kvankam ni ne inkludis la biblioteko. Tio estas bone. Kion ajn.
Ni nur tuj kunlabori tiam. Ni renomi ĉi longa.
Lasu min ŝanĝi la uzon de ĝi al longa tie, kaj ĉi faros Clang feliĉa.
Kiel flanken, ĉar kelkaj el tiuj funkcioj estas tiel Darn komuna -
strlen, prinf - ili efektive havas ia speciala statuso.
Kaj tiel Clang nur scias iom ion specialan pri ili.
Tio ne ĉiam la kazo kun plej funkcioj, por ke tio ni got kriis al.
>> Lasu min provi denove. Feliĉe, ĝi funkciis tiam.
Do nun mi kuros mia propra strlen programo.
Donu al mi kordoj: H-E-L-L-O, Enter. Kaj mi ŝraŭbita supren.
Kial? >> [Inaudible studento respondon] >> Ekzakte.
Do mi mem ĉi tie tre agrabla aspekto senfina ciklo
ĉar kvankam mi pliigante longeco sur ĉiu ripeto,
kion mi klare ne faras? Mi ne pliigante i. Okay. Facila riparas. Jes?
Okay. Ne Nun ni kurus afoul de iu alia komuna eraro kie mi bezonas krampoj.
Kaj sincere, tiu kodo komencas rigardi malbela,
do ni prenos ponardopiko en pureco ĉi supre en momento.
Sed nun mi pliigante tiel longa kaj mi.
Sincere, mi jam vidas ŝancon por plibonigo tie, sed ni revenos al tio.
>> Do nun ni simple certigi ni almenaŭ progresas.
Ĉi tio okazis al kelkaj el vi, kaj mi neglektis mencii tiun anticipe.
Kiam vi havas la malfeliĉo de scenaro kiel ĉi tiu, kiel vi ripari tiun
mallonga de restartigi la aparaton aŭ via komputilo aŭ fermi la fenestron?
Estas vere facila.
Kontrolo C sendos tiu malgranda karoto simbolo C, kaj ke ĝuste finiĝas plej programoj.
Se vi havas vere malbona senfina ciklo ke tio presi stuff malfinie multaj fojoj,
kelkfoje vi havu bati Kontrolo C miloble fari ĝin vere auxskultos.
Do ĝuste realigi nun ĉar mi ne presi ion, kiu estis sufiĉe facila.
Kaj teknike, fojo sufiĉas, sed I get senpacienca kaj mi kutime batis ĝin, ke multaj fojoj.
>> Do strlen. Donu al mi kordoj: SALUTON. Ĉu tuj labori cxi tiun tempon?
Okay. Alia komuna eraro. Devas recompilar.
Tio estis intenca, tiu. Bone.
Do strlen, H-E-L-L-O, Enter. Bonega.
Do ni nun havas strlen al 5.
Do ni laŭvorte reimplemented ke rado.
Do nun ni purigi tion, ĉar tio ne min impresis
kun la dezajno de mia kodo.
Kion ni povas klare forigi en tiu programo por purigi ĉi kolektis?
[Inaudible studento respondon] >> Jes. Laŭvorte, ni traktante i kaj longo idente.
Do kial ni ne nur ricevi inteligenta kaj diru dum longa?
Pli ĝuste, ni simple nomas ĝin longo por komenci, pravalorizi ĝin al 0
ĉar defaŭlte la kordo ne havas longitudon ĝis ni elkompreni kiel ĝi estas.
>> Nun ni faru tion, kaj nun ĉi tiu estas sufiĉe eleganta programo.
Unu variablo. Mi purigis ĝin, premis ĝin.
Do nun ni reiros al mia fina fenestro. Ni iru antaŭen kaj kuri ĉi.
Faru strlen. Aspektas bona. Kuru strlen denove, Enter.
Donu al mi kordoj: SALUTON, Enter. Kaj ŝajnas labori kiel 5.
Nun, por esti klara, se mi ne skribis, ekzemple, SALUTON en 1 linio
kaj tiam ADIAŬ en alia, ni povas certe havas plurajn vortojn.
Se la esprimo mi fakte volis tajpi ne SALUTON sed, ekzemple,
SALUTON MONDO, avizo ke kion ni ne havas estas tiu situacio tie, ĉu ne?
Tio sugestus ke tio estas 2 kordoj.
Vi certe povas havi spacon trinkejo karakteroj, do se ni efektive tajpita en pli longa frazo
kiel SALUTON MONDO, kion ni vere havas en memoro
aspektas iom io simila ekzistas.
>> Bone. Demandojn tiam pri la reprezentado tie de kordoj?
Ne? Bone.
Do mi diris antaŭe, ke nomante strlen denove kaj denove intence tiel
verŝajne ne estas la plej bona ideo ĉar vi tuj faros tuta multan laboron
denove kaj denove kaj denove.
Ja, kia laboro estas necesa por decidi la longo de kordoj, ŝajne?
Vi devas starti je la komenco kaj tiam rigardu, rigardu, rigardu, rigardu, rigardu
ĝis vi finfine vidas ke speciala karaktero, je kiu punkto, ha, nun mi scias la longa.
Do pli frue, kiam ni estis strlen esti nomita denove kaj denove kaj denove,
la kialo mi proponis ke estis ia stulta estas ĉar denove, ke kordoj aspektas tiel.
Oni ne tuj ŝanĝu ĉiufoje kiam vi persisti tra iu ciklo,
tiel vi faras nenecesa laboro.
Samtempe vi devas scii, kiel flanken, kiun tradukiloj kiel Clang tiujn tagojn
ili disvolvis dum multaj jaroj,
kaj tradukilo verkistoj, programistoj, estas sufiĉe inteligenta.
Kaj tiel rezultas ke Clang kaj aliaj tradukiloj povas reale kalkuli ke,
bone, jes, vi skribis strlen en via kondiĉo,
kiuj teknike signifas ke ni nomas ĝin denove kaj denove kaj denove.
Sed inteligenta tradukiloj povas fakte optimizar tiuj specoj de malriĉa uzanto decidoj
el via kodo por riparo aĵoj.
>> Do nur rimarkas ke foje la tradukilo estas pli inteligenta ol ni
kaj estos ia kaŝi niajn proprajn erarojn.
Sed certe kiam temas pri problemo aroj kaj similaj,
do pensi pri tiuj fundamente erara dezajnon decidoj
potenciale por la simpla kialo, ke ni volonte faros vojon pli laboro
ol ni efektive devas fari. Sed kiom pli laboron?
En la kazo de SALUTON MONDO, ni komencu al ĝeneraligi la grandeco de tiu problemo.
Kio estas la longo de la problemo aŭ la grandecon de la problemo
kiam la vorto de la uzanto tajpas en estas SALUTON?
Estas ŝajne 5, eble 6. Plus aŭ minus 1. Kion ajn.
Estas tiel proksimaj ni simple nomas ĝin 5.
>> Do kio estas la grandeco de la problemo ĉi tie kiam provi elkompreni la longo de SALUTON?
Estas 1, 2, 3, 4, 5, kaj eble 6 por la lasta karaktero, sed ni ĝeneraligi ke kiel n.
Do n, nur la variablo n, estas kion komputilo scienculoj estus tipe uzi
por priskribi la grandecon de problemo, kaj la problemo je mano estas kiel longe estas SALUTON?
Kiom da tempo strlen preni?
Ĝi prenas sur la ordo de n paŝoj, kie ĉiu paŝo signifas rigardi al gravulo,
rigardas karaktero, rigardi karaktero.
Kaj ni havis tiun diskuton iom malantaŭen, la nombro de operacioj io portas.
La unua tago de klaso ni ĉiuj mallerte ekstari,
kaj tiam cxiu komencis emparejamiento for inter si
por reale kalkuli ideale kiom da homoj estis en la cxambro.
Kaj ni ankaŭ faris alian aferon per se mi anstataŭ faris la malnova lernejo vojo
de ĵus komencas 1, 2, 3, 4, 5, 6 kaj tiel plu,
ke tro, la grandeco de tiu problemo estis de amplekso n. Esas n homoj en la ĉambro.
Sed mi povus akceli ke ĝis, ĉu ne? Grade lernejo stilo mi povus komenci rakonti en 2s.
2, 4, 6, 8, 10, 12. Kaj kiu sentas tiel rapida, kaj ja estas.
Estas laŭvorte duoble rapida, sed denove, se alia 400 personoj promenis sur tiu ĉambro
subite, tiuj algoritmoj prenus alian 400 aŭ eble 200 ŝtupoj.
>> Sed kontraste, se ni vere akiri inteligenta kaj ni anstataŭ havas ĉiu el vi rakontos vin,
memori, ke algoritmo funkciis.
Vi ĉiuj ekstaris. Lasu min rapida antaŭen al ĉi tio.
Vi ĉiuj staris, vi parita for, tiam duono el vi sidiĝis,
duono el vi sidiĝis, duono el vi sidiĝis,
kaj sur ĉiu ripeto de ĉi buklo de semajno 0, ni halved la problemo je mano
kaj iris al n / 2, tiam n / 4, tiam n / 8.
Kaj la implikaĵo de tio estas ke, se alia 400 personoj promeni en la ĉambron, neniu granda interkonsenton,
portos nin ankoraŭ 1 ronda, ne 400 pli ĉirkaŭvojoj, ne 200 pli ĉirkaŭvojoj.
Kaj tiel la rakonton ni diris momenton reen devis fari iom iun kun tio.
Tiu ruĝa linio tie estas lineara, estas rektaj, kaj ĝi estas etikedita kiel n
ĉar kiel la grandeco de problemo kreskas,
se via algoritmo aŭ programo per kiu vi solvi ĝin prenas n paŝoj,
ni povas grafika ĝin kiel rekta linio kie ĝi prenas pli da tempo la pli granda la grandeco de la problemo.
Kaj la twosies alproksimiĝo, rakontante 2, 4, 6, 8, ankoraŭ rekto, nur iom pli bone.
Ĝi prenas iom malpli da tempo, do la flava linio estas sub la ruĝa linio punkto por punkto.
>> Sed eĉ pli bone, estis jena Holy Grail de kion ni nomas logaritma tempo
kie eĉ se ni denove duobligi la nombron de homoj en la ĉambron,
ni duobligi la grandeco de tiu telefono libro de la unua tago de klaso,
neniu granda interkonsento, ĝi prenas ankoraŭ 1 paĝo larmo, prenas ankoraŭ 1 logxejon malsupren
por solvi problemon kiu estas duoble granda.
Kaj tial la interparolo ni nun ek komenci havi estas
how do ni efektive solvi problemojn kompetente
se ni konsideras la plej simpla de problemoj kiel tiu?
Supozi ni havi 8 pordoj malantaŭ kiuj estas iuj nombroj,
kaj ĉiu el tiuj numeroj ne estas ordo en ajna maniero,
ili estas nur hazardaj entjeroj malantaŭ tiuj pordoj,
kaj ni demandu al la demando kiel vi irados tra trovo la nombro - kiu scias -
7 malantaŭ tiuj pordoj?
Kion vi, homo, faru por trovi al mi la nombro 7
se denove ĉiu de ĉi tiuj estas pordoj kaj vidi valoron vi devas malfermi pordon?
Kion viaj algoritmo esti eble?
>> [Inaudible studento respondon] >> Do komencu per la maldekstra kaj malfermi pordon, malfermi pordon, malfermu pordon.
Kaj en la plej malbona kazo, kiel longe estas ĝi tuj prenos nin trovi la numeron 7?
Kaj ankaux ili ne ordo, do ĝi ne estas tiel facila kiel, bone, mi tuj malfermos la 7a pordo.
Ĝi povis porti nin, maksimume, 8 paŝoj.
En la plej malbona kazo, 7 estas hazarde ke je la fino de la linio de pordoj,
do ni povus havi por provi ĉiuj n pordoj.
Do denove tie, ni ŝajnas havi lineara algoritmo.
Fakte, ni faris ĉi nur kelkajn jarojn.
Unu el viaj antaŭuloj estis defiita kun precize tiu
kie ni ne havis cifereca versio, ni anstataŭ havis pizarrón
kun iuj pecoj de papero sur ĝi.
Kaj kion mi pensis, ke mi faras estas preni rapidajn rigardon malantaŭen en kiel ĉi foriris,
unu el la plej bonaj kaj eble la plej mallerta ŝancojn sur la scenejo
havi pruvon ĝuste sur Sanders.
Ni havis 2 vicoj de ciferoj.
Ni nur tuj rigardi kio okazas ĉi tie kun Estu por la plejsupro de tiuj vicoj.
Se neniu iam ajn denove volontuloj en CS50,
ni havis Estu beno por subteni tion en ĉambro,
do li scias, ke centoj da homoj estis rigardante tiun nun por jaroj.
Sed Sean faris mirigan laboron - aŭ ĉu li? - Je reale trovanta ni apartan numeron.
>> Do ni vidu kiel li solvis ĉi algoritmon por ke ni rekomencu ĉi konversacio post nelonge
de kiel oni trovas tion kompetente.
[Malan en video] Mi kaŝis malantaŭ tiuj pordoj de la numero 7,
sed tucked for en iu el tiuj pordoj tiel estas aliaj nenegativaj nombroj,
kaj via celo estas pensi pri tiu supera vico de nombroj kiel simple tabelo
aŭ nur vico da pecoj de papero kun nombroj malantaŭ ili,
kaj via celo estas, uzante nur la supro tabelo tie, trovi min la nombro 7.
Kaj ni tiam tuj kritikon kiom vi ĉirkaŭiras fari ĝin. >> Bone.
[Malan] Trovu ni la numero 7, mi petas.
[Ridado]
[Malan] No [ridado]
5, 19, 13, [ridado]. Ne estas atuto demando.
1.
[Ridado]
Je ĉi tiu punkto viaj partituro ne estas tre bona, do vi eble tiel plu iri. [Ridado]
3.
Go on. Sincere, mi ne povas helpi sed scivolas kion vi eĉ pensi. [Ridado]
Nur la supera vico, do vi havas 3 maldekstren. Do trovi min 7.
[Studentoj murmurado]
[Malan] 17.
[Studentoj murmurado]
[Malan] 7! [Aplaŭdo]
>> Do merkrede ni plonĝi en cxi tiun kaj pli kompleksaj algoritmoj por trovi tion.
Cxar nun ni lasos vin per Sean kaj vin vidos merkredon.
[CS50.TV]