[Powered by Google Translate] [Semajno 2, daŭrigis]
[Davido J. Malan, Harvard University]
[Jen CS50. - CS50.TV]
Bone. Ĉi tiu estas CS50, kaj ĉi tiu estas la fino de semajno 2.
Se vi atendis esti malsata por ĉi tiu epoko morgaŭ,
scias, ke ni tuj kunvoki kiel malgranda grupo morgaŭ, ĵaŭdo, 1:15 ptm.
Estas ĉi tiu URL tie se vi ŝatus RSVP.
Spaco estas limigita, do bonvolu pardoni se la formo plenigis per la tempo vi plenigu tiun eksteren.
Alia URL, tamen, ke povus esti de intereso estas ĉi.
En preskaŭ tutan monaton, la kurso tuj estos disponebla
des pli vaste tra edX, vojo kiu onin sur la Interreto povos sekvi kune,
partopreni en la kurso sufiĉe aktive, fakte.
Ili estos uzi la CS50 Appliance kaj CS50 Discuss
kaj la plimulto de la diversaj softvaro iloj kiujn ni jam estis uzante ĉi semestro.
Kaj unu el la iniciatoj ni ŝatus alpreni kiel eksperimento ĉi tiu jaro
estas vidi, kiom multe enhavo ni povas traduki
en aliajn parolata kaj skribata lingvoj.
Do, se vi povus havi intereson en partopreni en ĉi tiu projekto
per kiu ni havigos Esperanto transskriboj kaj subtitoloj por la kurso de prelegoj
kaj pantalono kaj seminarioj kaj sekcioj kaj similaj,
se vi parolas flue aŭ skribi flue iu alia lingvo,
ni amus engaĝiĝi vin en ĉi tiun projekton per kiu vi prenas sur unu aŭ pli el la filmetoj,
traduki ilin en lingvon vi scias sufiĉe bone.
>> Doni al vi la senton de la interfaco, ne estas tio ttt-bazita uzulinterfaco
ke ni estos uzi tiun kreos esence UI ŝatas tion.
Ĉi tio estis mi instruis kelkajn Halloween antaŭe,
kaj sur la dekstra flanko en nigra apud tiuj tempo poŝtmarkojn,
vi vidos la diversajn aĵojn kiuj eliris el mia buŝo, ke tago,
kaj poste sube vi povos traduki en iu alia lingvo
precize kion la surĵeto estas inter, en ĉi tiu kazo, la angla kaj, ekzemple, la hispana.
Do ĝi estas vere tre uzantamika ilo.
Vi povas rebobinar kaj rapida antaŭen tre facile kun klavarkurtvojoj.
Do se vi ŝatus partopreni en ĉi tiu eksperimento kaj havi viajn vortojn vidis kaj legis
per potenciale miloj da homoj tie, bonvolu bonvolu partopreni.
Unu vorto pri la katido de lundo.
Ke ni sendis tro timigas mesaĝo, do kompreni ke, kiel oficejo horoj sugestas
kaj kiel sekcioj sugestas, la dezajno de la kurso estas tre
esti studentoj kunlaboras kaj parolante labori tra problemo aroj
kaj problemoj kune, kaj vere la linio simple venas malsupren al,
denove, la laboro vi finfine submeti devus esti via propra.
Kaj tiel tute honeste, en oficejo horoj estas tute normala,
ĝi estas plene atendi eĉ, por esti babili kun iu amiko apud vi.
>> Se li aŭ ŝi luktas kun iu temo kaj vi estas kiel,
"Ho, bone, mi donos al vi duonvidi de iu linio de kodo, kiun mi skribis," ke estas bone,
kio okazas, kaj tio estas tre favoraj, mi pensas, kun la procezo de lernado.
Kie la linio gets transiris estas kiam la kapo estas speco de klinita super ĉi tie tro da sekundoj
aŭ minutoj por ke vere al ĵus estis desbloquear ŝancon por via amiko,
kaj certe kiam aĵoj get interŝanĝis per retpoŝto kaj Dropbox kaj similaj,
tie ankaŭ estas la linio.
Do por supozita sentas komfortaj kaj sentas kuraĝigis babili kun geamikoj
kaj kompanoj sur psets pli kaj ĝuste rimarki ke kion vi finfine submetiĝi
devus vere esti la produkto de Via kreo kaj ne iu alia.
Kaj tiel unu el la domajno-specifa problemojn por pset2,
kiu eliros malfrue morgaŭ nokte, estas plonĝi en la mondon de ĉifriko,
kiu estas la arto de encrypting aŭ grimpadi informo,
kaj ĉi finfine rilatas al la mondo de sekureco.
Nun, sekureco por la plimulto de ni venas en la formo de sufiĉe sekulara mekanismoj.
Ĉiuj el ni havas uzanto kaj pasvortoj,
kaj cxiuj el ni havas tre malbona usernames kaj pasvortoj, plej verŝajne.
>> Se via pasvorto estas la sama sur multnombraj retejoj, jen probable ne la plej bona ideo,
kiel ni diskutos al semestro la fino.
Se vian pasvorton estas skribita sur glueca noto - neniu ŝerco - en via monitoro,
ankaŭ tio ne nepre la plej bona dezajno sed sufiĉe komuna fenomeno.
Kaj se vi ne uzas ĉifriko por ĉifri pasvortojn vian,
ili estas aparte vundebla.
Do, se vi pensas ke vi estas super saĝa por havi kaŝitan Vorto dokumenton
ie en vian malmolan diskon kiu havas ĉiujn viajn pasvortojn
sed estas en dosierujo, ke neniu tuj rigardi, ke ankaŭ tio ne estas tre sekura mekanismo.
Kaj tiel kion pset2 enkondukos estas ĉi arton de ĉifriko
kaj grimpadi informon por ke aferoj kiel pasvortojn estas des pli sekura.
La kunteksto estas, ke kun necerta datumoj
venas ŝancon por ĉifri ĝin kaj levi ĝin.
Kaj tiel tio, ekzemple, estas ekzemplo de ĉifrita mesaĝo.
Tiu fakte diras ion en la angla, sed estas klare ne tute evidenta.
Kaj ni venos plena cirklo hodiaŭ al tease krom kio estas tiu sekreta mesaĝo ĉi tie estas.
Sed en la reala mondo de komputiloj, aĵoj eĉ ne aspektas kiel ili povus esti angla frazoj.
Ekzemple, ĉi tio estas kion vi povus trovi en norma Linukso aŭ Mac aŭ Uniksa komputilo
en dosiero, kiu estis iam nomata la pasvorton dosiero.
>> Nuntempe ĝi estas movita en aliaj lokoj.
Sed se vi rigardas en la ĝusta loko en sistemo, vi vidos ne nur vian uzantnomon
aŭ tiu de aliaj homoj en la sistemo, sed vi vidos ĉifrita versio de ilia pasvorton.
Efektive, la vorto kripto tie sugestas ke la sekvaj aferoj estas ĉifrita,
kaj ĉi tiu serio de kvazaŭe hazarda literojn kaj signojn kaj nombrojn kaj tiel plu
povas deĉifrita nur ĝenerale sciante iu sekreta -
sekretan vorton, sekreta nombro -
kaj tiel ja, la arto de ĉifriko finfine abscesoj malsupren fidi de ia
kaj sciante ion ke iu alia ne.
Do ni esplori tion en iom pli detale hodiaŭ kaj en la pset veni.
Kaj nun unu vorton sur pass / malsukcesas.
Speciale kiel kelkaj el vi plonĝis en pset1, la Appliance,
kaj tre nova mondo por vi mem, rimarkas ke frustroj kaj konfuzo
kaj simple teknikaj malfacilaĵoj estas sufiĉe por atendi,
speciale kun la unua pset, kie estas nur tiom da novaj,
nur nun konas ls kaj cd kaj ĉiuj tiuj arcano komandojn
kaj nova medio, kaj tio estas apartigita for la efektiva materialo kaj programado mem.
Do realigi ankaŭ, ke ekzistas certe oficejo horoj kiuj ekzistas kiel apogo strukturo.
>> Sekcioj komenci ĉi venas dimanĉon.
Sed plej grave, se vi sentas ĝuste tio ĉi ne estas la mondo por vi,
rimarkas ke vere ne nur preni tempon.
Kaj se ne por tiu ĉi ŝanco jarojn por mi de preni kurson pass / malsukcesos,
honeste, mi neniam estus eĉ tretis la klasĉambro.
Kaj vi povas ŝanĝi ĉi ĝis, ni diru, la kvina lundo de la kurso,
do se vi estas sur la rando nun rimarkas ke anstataŭ kapon en iu alia akvoj aro,
do certe konsideras nur ŝanĝas pasi / maltrafi.
Denove, ne estas vere tiu kulturo tie en Harvard de preni aĵojn pasi / malsukcesos
ekde ĉiuj vere volas atingi aŭ overachieve,
sed sincere, ĉi tiu estas bonega maniero de provi ion
kiuj povus ne esti konata al vi, kaj vi finos faras, plej ofte, tute bone,
eble multe al via surprizo.
Kaj en pli konkretaj terminoj, kion mi kredas pasi / malsukcesos ĝenerale faras,
speciale kiel vi eble spertis kun pset0,
se vi metas en 10 horoj, 15 horoj, 25 horojn en iu pset
kaj vi nur banging vian kapon kontraŭ la muron kaj Fariĝas super malfrua nokto
sed vi prenis la pset 90% de la vojo kaj vi simple ne povas diveni unu aferon,
pasi / malsukcesos vere prenas la rando ekstere de klaso kiel ĉi tiu,
kie vi povas ordigi de feliĉe diras, "Bone, mi scias ke ne perfekta,
sed mi laboris mia azeno sur ĉi tiun, mi estas bela feliĉa kun kie finis, "
kaj tio estos renkonti la atendojn por pass / maltrafi.
Do observu, ke en la menso. Bone.
>> Do tiuj el vi, kiuj luktis por uzi la Universitato Harvard Wi-Fi,
scias, ke tie estas CS50 SSID, a Wi-Fi, ŝvebantan
ke vi havu pli bonan sorton por.
Ĝi estas iom ironia ke la pasvorton por ĉi tio, se vi ŝatus provi konekti al ĉi
por pli bona rapidoj - kaj ni scias se ĝi estas pli bona - estas 12345, la tuta vojo ĝis 8
ĉar 8 estas pli sekura ol 5.
Do, se vi bezonas la Wi-Fi pasvorton, konekti al CS50 sendrata tie, 12345678,
kaj post en CS50 Diskutu se vi ankoraŭ havas intermitaj conectividad temoj,
kaj ni lasu la povoj kiujn oni scias ĉi tiu spaco. Bone.
Tial rapidaj teaser, precipe por tiuj el vi, kiuj estas fano knaboj aŭ knabinoj de ĉiuj aĵoj Apple.
Kion mi elfosis de kelkaj jaroj malantaŭen, estis jena dosiero tie, iUnlock.c,
nur por ia fari pli konkretaj kaj pli kompleksa
kelkaj el la pli bazaj C programoj ni estis skribante.
Do mi malfermis ĉi-dosiero, iUnlock.c. Estas disponebla en la Prelegoj paĝo hodiaŭ.
Sur la maldekstra flanko oni vidas longan liston de funkcioj.
Do la ulo kiu skribis ĉi redaktis multajn funkciojn, pli ol nur ĉefaj.
Li uzis tutan faskon da bibliotekoj ĉi tie, kaj se ni komencos movo tra,
kio estas tiu fakte estas estas la unua, mi kredas, fendo por la originala iPhone.
>> Kiam vi volis jailbreak la originala iPhone, kiu signifas untether ĝin de AT & T
kaj fakte instali specialan programaron sur ĝi kaj fari aferojn kiuj Apple ne volis personoj faru,
iu prenis la tempon por eltrovi ĝuste kiel ili povus ekspluati programaron difektojn,
erarojn, erarojn, en Apple programaro, kaj tiel naskiĝis iUnlock.c--
ke se vi kompilis ĝin en via komputilo kaj instalis ĝin sur iPhone
kiu estis konektita al via komputilo per, ekzemple, USB kablon,
ĉi tio donas al vi administra aŭ radiko privilegias via iPhone
kaj lasos vin fari preskaux cxion, kion vi volas.
Kaj do ili pasis tiu fascina kato kaj muso ludo
inter Apple kaj la resto de la mondo en aparta kiel ili, kiel multaj entreprenoj,
provi bloki lian stuff malsupren tiel ke vi povas nur fari kun ĝi, kion ili intencas.
Sed danke al homoj ŝatas ĉi tiu kaj la kompreno de malalta nivelo detaloj -
kaj en tiu kazo programado C - kaj multon de la familiara konstruoj
ke ni komencis ludi kun vi kapablas vere influon la aparataro
en maniero ke vi decidos, kaj ne nepre iu kompania ento.
Do ekzemple, mi ne havas ideon kion ĉiuj ĉi faras,
sed GetVersion sonas sufiĉe simpla,
kaj gxi aspektas ĉi estas funkcio kiu tiu persono skribis.
Ĝi prenas ian entjero kiel argumento, ne revenas nenion,
sed ŝajnas buklo kun por buklo tie kaj se kondiĉo, se kondiĉo ripozon,
kaj iel rilatas al versio numerojn se ni rulumu malsupren,
kvankam multe da tiuj ŝlosilvortoj tuj estos nova.
Kaj estas tuta kvanto de funkcioj en ĉi tie ni neniam vidis kaj eble ne cxiam vidos
Super la apartajxo de la semestro.
>> Je la fino de la tago, sekvas la samajn regulojn kaj logiko, ke ni estis ludante kun tiel for.
Do ĉi tiu estas tro maljuna por fendi via iPhone 3s aŭ 4s aŭ baldaŭ 5s tiuj tagoj,
sed sciu, ke ĝi estas ĉiuj tre derivita de ĉi tiu mondo kiu ni plonĝis en.
Ni rigardu iom pli simpla ekzemplo:
ĉi tiu, nur por preni hejtita kun iuj sintakso kaj ankaŭ iuj aliaj datumtipo
ke ni jam parolis pri sed ne vere vidas en C.
Tiu dosiero elĉerpiĝas nomis positive1.c, kaj po la komentojn ĉe la supro,
ĉi nur postulas ke la uzanto ofertas pozitiva nombro.
Do ĝi estas ekzemplo de do-dum ciklo, kiu estas agrabla por uzanto interaga programoj
kie vi bezonas diri al la uzanto por fari ion,
kaj se ili ne kunlaboru vi krias al ili aŭ malakcepti ilia enigo.
Kazo en punkto: mi iras fari linioj 19 tra 24
tiel longe kiel la uzanto ne donis al mi pozitiva nombro.
Tiu detalo tie sur linio 18, kial mi deklaras n super ĉi tiu tuta looping konstrui
kontraste al dekstra flanko linio 22, kie mi vere deziras akiri n? Yeah.
[Studento] Medio. >> Jes, do ĉi tiu temo de medio.
Kaj en lego de terminoj, kion signifas medion referi al?
Yeah. >> [Inaudible studento respondon] >> Cxu vi parolas iom pli laŭta?
[Studento] Kie vi povas aliri tiu variablo. >> Perfekta.
Kie vi povas aliri al aparta variablo.
Kaj ĝenerale, la regulo de thumb ĝis nun estis ke la medio de iu variablo
estas difinita de la plej freŝa krispa krampoj, ke vi vidis.
>> Kaj tiel en tiu kazo, se mi faris la eraron de deklarante n sur linio 22, tiu linio laborus.
Mi ricevas int, kaj mi metis ĝin en tiun variablon n en linio 22,
sed kiu linio de kodo nun ne havas ideon kion mi parolas? >> [Studento] 25.
[Malan] 25, kaj ĝi rezultas 24 tiel ĉar en tiu kazo ĝi falas ekster la frizita krampoj.
Do nur iom da ĝeno sed tre facile solvita per simple deklarante la variablo
eksteren de la funkcio mem.
Ni vidos poste hodiaŭ oni povas iri unu paŝon
kaj vi povis saltigi iom mallaborema.
Kaj ĉi tiu estas ne al esti rekomendita en ĝenerala, sed vi povis saltigi mallaborema
kaj metis variablo sume, por tiel diri, ne ene de funkcio, ne interne de ciklo,
sed en la dosieron mem, ekster ĉiuj funkcioj vi skribis, kiel mi faris tie sur linio 15.
Ĉi tiu estas ĝenerale malaprobita, sed realigi ĉi estas solvaĵo foje al aliaj problemoj,
kiel ni eventuale vidi.
Do cxar nun ni lasos ĝin kiel ĉi tiu, sed ni vidu se ni povas reverki ĉi
nur komenci esprimi nin iom malsame.
Ĉi tiu programo, nur por esti klara, estas positive1.
Lasu min ĉi tie kaj en mia fina fenestro fari positive1, Enter.
Kompilas okay. Mi tuj kuros positive1, batis Eniru.
Mi postulas ke vi donu al mi pozitiva entjero. Mi diros -1. Tio ne funkcios.
0, 99. Tio ŝajnas funkcii.
Eble ne la plej rigora provo, sed almenaŭ ĝi estas bela prudento ĉeko
ke ni estas sur la ĝusta vojo.
>> Do nun mi antaŭeniri kaj malfermi la versio 2 de tiu,
kaj kio estas malsama jam?
Ĝi altrudas la sama afero, sed kion saltante kiel klare malsamaj tiu tempo?
Ĉi bool en verdo. Ĝi estas emfazita en verdo, ĉi ŝlosilvorto konata kiel bool, kiu estas datumtipo.
Ĝi ne venos konstruita por ĉiuj versioj de C.
Vi devas inkluzivi specifa biblioteko.
En nia kazo, mi inkludis la CS50 biblioteko por ke ni havas aliron al bool.
Sed en linio 18, ni ŝajnas havi Bulea valoro ĉi tie nomas dankemaj.
Mi povus esti nomata ĉi ion, sed mi nomas ĝin dankema
nur por ia transdoni iun semantikan signifon.
Do komence en linio 18, mi ŝajne ne dankema
ĉar la Bulea valoro dankema estas inicializado al falsa en linio 18.
Kaj tiam ĝi ŝajnas kion mi faris tie en linioj 21 tra 23
estas mi ĵus ia reskribita mia logiko.
Do ne funkcie malsama, sed en linio 22 nun mi kontrolu se la int la uzanto havigis
estas pli granda ol 0, tiam mi simple ŝanĝi la valoron de dankema al vera.
Kaj kial mi faru tion? Ĉar en linio 25, ŝajne mi iros por kontroli kondiĉo.
Ĉu ĉi tiu buklo dum dankema estas falsaj.
Do mi proponis tion kiel alternativo al la versio 1
ĉar ĝi estas almenaŭ iom pli intuicia eble, estas iom pli bazite en la angla.
Do faru la sekvajn dum vi estas ne dankema aŭ dum dankema estas falsaj.
Kaj ĉi-foje tro Mi ŝajne ne gravas memori kion la uzanto tajpas en
ĉar avizo ne estas variablo n, tiel fakte, iom blanka kuŝas tie.
>> Funkcie, la programo estas iom malsamaj iam ni atingos la fundon de tio
ĉar mi ne memoras kio n estas.
Sed mi volis pruvi ĉi tie ankaŭ, ke eĉ se ni vidis GetInt
kaj GetString uzitaj sur la dekstra flanko de egala signo ĝis nun
por ke ni memoru la valoro, teknike, tio ne estas strikte necesaj.
Se ial ajn vi simple ne deziras savi la valoro,
vi nur volas kontroli la valoron, rimarki ke ni povas simple skribi ĉi tiu kiel GetInt,
malfermita paren, proksime paren.
Tiu funkcio tuj resendas valoron, kiel ni estis dirante.
Ĝi tuj donu vin al int.
Kaj do se vi mense pensas pri ĉi tiu pasante,
kiam mi tajpas en 99, GetInt redonas la numeron 99,
kaj tiel koncepte ĝi estas kvazaŭ mia kodo estis fakte ĉi.
Do, se 99 estas ja granda ol 0, tiam dankema iĝas vera,
tiam linio 25 rimarkas ooh, ni faris ĉar mi estas nun dankema,
kaj en linio 26, ni simple diri, "Dankon pro la pozitiva entjero!"
ĉion, kio okazis al esti.
Nun ni faru malgravaj sintaksa sukero tie, por tiel diri.
Ni vidu se ni povas purigi ĉi tiun linion 25 kun ĉi tiu tria kaj lasta varianto en positive3.
>> Rimarki la sola diferenco nun estas kion linio de kodo? >> [Studento] 25. >> [Malan] Yeah, 25.
Kaj ni ne vere vidis tiun atuton nur ankoraŭ, sed ni ne vidas la ekkrio punkto lundon,
kion signifas kio? >> [Studento] Ne. >> Ne aŭ nego.
Do prenu Bulea valoro kaj klaki ĝian valoron.
Vera igas falsa, malvera iĝas vera.
Do ĉi, mi proponas, estas eĉ iom pli intuicia maniero de skribo de la kodo
ĉar mi ankoraŭ pravalorizi dankis falsa, mi ankoraŭ faros la sekvajn,
Mi fiksis dankis vera kiam la tempo venos,
sed nun vi povas vere nur traduki tiun kodon parole maldekstre dekstren,
dum (! dankema); ĉar bang aŭ ekkrion punkto signifas la nocio de ne,
tiel dum ne dankemaj.
Do denove, ni ne enkondukis novajn konceptojn per si mem.
Ni parolis pri Booleans reen kiam ni ludis kun Scratch,
sed rimarkas nun ni povas simple komenci skribi nian kodo en diversaj manieroj.
Do precipe en pset1 se vi estas ia luktas por kalkuli la vojon por skribi iun programon,
malakordo vi estas en sorto ĉar tie povas esti ia nombro de solvaĵoj
ke vi povas okazi sur.
Ekzemple, ĉi tiu estas nur 3 por eĉ la plej simpla de programoj. Bone.
Kaj nun memori lundon ni lasis en tiu ĉi noto kun reveno valoroj.
Do por la unua fojo ni skribis programon kiu ne simple devas ĉefa;
ĝi ankaŭ havas sian propran funkcion kiu mi skribis ĉi tie.
Do en linio 31 tra 34 Mi implementado kubo funkcio.
Ne kompleksa. Estas nur * al * a en ĉi tiu kazo.
Sed kio estas grava pri tio estas ke mi ferios enigo en la formo de
kaj mi reveni eligo en la formo de * al * a.
Do nun mi havas la kapablon, multe kiel mi kutimis kun prinf sola,
nomi ĉi funkcio per nomante la kubo funkcio.
>> Kaj la kubo funkcio prenas iujn enigo, kaj la kubo funkcio redonas iuj eligo.
Kontraste, printf ĵus faris ion.
Ĝi ne revenis ion ke ni zorgis pri, kvankam kiel flanken ĝi resendas valoro;
vi simple ĝenerale ignoras ĝin.
Printf ĵus faris ion. Ĝi havis kromefikon videbligi al la ekrano.
Kontraŭe tie, ni havas la kubo funkcio, kiu vere redonas ion.
Do por tiuj, kiuj konas tiun, estas sufiĉe simpla ideo.
Sed por tiuj malpli familiara kun tiu ideo de pasi en eniroj kaj contrarestar eligoj,
ni provu simple io super simpla.
Estas iu komforta leviĝas sur la scenejo mallonge?
Vi devas esti komforta kun ĉambro sur vi tiel. Yeah? Okay.
Kio estas via nomo? >> [Studento] Ken. >> Ken. Bone. Ken, venu supren.
Ken tuj esti funkcio de varoj tie.
Ni faru tion. Ni lasu iom kaprico.
Nice to meet you. Bonvenon centro scenejo. Bone.
Ni batis tiun butonon tie. Bone.
Do jen vi havas modernan chalkboard,
kaj kion mi estas la ĉefa funkcio, ekzemple,
kaj mi ne havas iPad en mia mano.
>> Mi ne vere memoras kiel - Nu, mi ne povas diri tion.
Mi ne vere havas bonajn manskribo,
kaj tiel do mi volas ke vi presi iun sur la ekrano por mi.
Mi estante la ĉefa programo, kaj mi iros al vi tion diras
skribante en mia kokido nulo kaj poste pasi vi enigo.
Do stulta kvankam tiu ekzerco estas, la nocio de funkcioj kaj nomante funkcio
kaj revenante funkcio vere bolas al tiu.
Mi estas ĉefa, mi ĵus skribitaj printf, citaĵo-unquote iun sur la ekrano,
Mi kuras koncerna programo, kaj tuj kiam printf gets vokis,
ĝi prenas unu argumento aŭ unu parametro kelkfoje inter duoblaj citiloj.
Jen estas tiu argumento. Mi pasante ĝin al Ken.
Li estas nigra skatolo skribita iu nombro da jaroj
kiu ŝajne nur scipovas presi aĵoj en la ekrano.
Do ekzekuti.
Tio ne estas malbona. Tre bona.
Do nun Ken realigas ekzekuti. Ĉu li bezonas transdoni al mi ion reen?
Ne ke ni vidis ĝis nun.
Denove, printf ne vere redonas nombron, sed ni tuj ignori ke por nun
ĉar ni neniam uzis. Do jen ĝi por Ken.
Kaj tial nun ĉefa transprenas la kontrolon de la programo denove
ĉar tiu linio de kodo, printf, estas farita ekzekuti.
Kaj ni iru sur la vojon, ekzekutante ajn aliaj linioj estas tie.
Do nun ni provas iomete malsaman ekzemplon.
Ĉi-foje tie ni unue liberigi la ekrano, kaj ĉi-foje ni faros la cubing funkcio,
sed ĉi tiu tempo, mi atendas eliro valoro.
>> Do ni faru ĉi.
Nun mi havas linion de kodo kiu diras x prenas kubo de x.
La linio de kodo, revokon, aspektas jene: x = kubo (x);
Do kiel estas ĉi irante labori? Ni iru antaŭen kaj doni al vi blankan ekranon denove.
Mi iras al noti nun la valoro de x,
kiu en ĉi tiu momento en tempo hazarde estas, ni diru, 2 teni ĝin simpla.
Mi skribis sur peco da papero la valoro de 2, kiu estas mia valoro x.
Mi transdonos ĝin al Ken. >> Kaj mi nur skribi la respondon? >> Jes, ni nur skribos la respondon.
Okay. Kaj nun li devas reveni al mi ion. Perfekta. Nice segue.
Do nun li manoj min redoni la valoron de 8 en ĉi tiu kazo, kaj kion mi faras per ĝi?
Fakte - ni vidu, get this right. Kion mi faros per gxi?
Nun mi iros por preni tiun valoron kaj reale stoki ĝin en tiuj samaj bitoj en memoro.
Sed rimarki min speco de luktas ĉi tie.
Mi estas iom konfuzita pro kie mi fakte skribas la valoron de x,
ĉar kion mi ĵus faris estas fizike mano Ken pecon da papero, ke ili havis la valoron 2,
kiu estis x, kaj ja, jen precize kio okazis.
Do rezultas ke kiam vi nomas la funkcio kaj sekvinberoj en argumento
kiel saluton, mondo aŭ sekvinberoj en argumenton kiel 2,
ĝenerale, vi pasante en kopio de tiu argumento.
Kaj tiel same kiel mi notis la numeron 2 tie kaj transdonis ĝin al Ken,
kiu devas signifi, ke mi ankoraŭ havas kopion de la valoro 2 ie
ĉar ja, nun ke mi alvenas reen la valoro 8, mi devas iri reen en RAM
kaj fakte noti 8 kie mi iam havis la numero 2.
Do vide, memoru ĉi nocio de pasi en, laŭvorte, kopio de la valoro.
>> Ken faras lian aferon, manoj min io - en tiu kazo valoron kiel la 8 -
kaj poste mi devas fari ion kun tiu valoro, se mi volas teni ĝin ĉirkaŭe.
Do ĉio ĉi revenos esti tro familiara antaux longe.
Dankon tiom por ĉi tiu demo tie, Ken. [Aplaŭdo]
Tre bone farita.
Ni vidu kiel tiu fine rilatas al kelkaj el la funkcio vokas ke ni estis ĉi tie.
Lasu min kaj alporti nin al la cubing ekzemple ĉi tie.
Rimarku ke se ni volas vere komenci porti ĉi tiun for,
ni iras al esti memoru la fakto ke la nombro x ke tio esti pasis ĉi tien
estas malsama de tio, kio efektive aprobotaj en la funkcio.
Do denove, ĉi preterirantan kopion tuj fariĝis sufiĉe germane en nur momento.
Ni rigardu aĵo kiu ne sufiĉe laboras dekstra ankoraŭ.
Mi tuj iros antaŭen kaj malfermi tria kalesxo ekzemplo, kiu estas misa por naturo,
kaj ĝi estas nomata buggy3 kaj implementa interŝanĝi funkcio.
Ĉi tie ni havas ĉefan funkcion kiu x kaj y arbitre inicializado al 1 kaj 2 respektive.
Ni povus uzi GetInt, sed ni nur bezonas simplan ekzercon,
tial estas malfacile-kodita kiel 1 kaj 2.
En linioj 21 kaj 22, oni ŝajne presi x kaj y, 1 por linio.
Tiam sur linio 23, mi asertas mi interŝanĝi tiujn valorojn, pentras, pentras, punkto.
Mi ŝajne nomas funkcio en linio 24 nomita interŝanĝa kiu prenas 2 argumentojn.
Ĝi estas tute legit por funkcioj preni 2 argumentojn. Ni vidis printf fari ĝin jam.
>> Do interŝanĝa ŝajne prenas x kaj y, kaj kiel ĝia nomo sugestas,
Mi esperas ke ĝi tuj interŝanĝi tiuj 2 valorojn.
Tial mi diras on line 25 "interŝanĝis!" kaj mi represi x kaj y
sub la supozo, ke ili jam vere estis svopitaj.
Sed se mi vere kuras ĉi programo - lasu min malfermi fina fenestro,
lasu min fari buggy3 - kiel la nomo sugestas, ĉi tio ne tuj finos bone
ĉar kiam mi batis Enter, rimarki ke x estas 1, y estas 2,
kaj tamen en la fino de la programo, ili estas ankoraŭ, fakte, la sama.
Do surbaze de la manifestacio gxuste nun kun Ken, kio efektive okazas?
Ni pikita en tiun interŝanĝa funkcio. Estas super mallonga. Estas nur malmultaj linioj de kodo longa.
Sed kio estas la fundamenta problemo bazita sur la simpla historio rakontita ĝis ĉi tie kun Ken?
Kial interŝanĝa rompita?
[Studento] Vi provizon al kopio, ne la variablo.
Ekzakte. Ni provizon al kopio, ne la variablo mem.
En aliaj vortoj, interŝanĝa ŝajne prenas 2 argumentojn, oni int,
kaj ĝi estas arbitre nomas a kaj b,
kaj ĝis tie mi pasis en x kaj y, kiuj estas respektive 1 kaj 2,
sed mi ne laŭvorte pasante en x, mi ne laŭvorte pasante en y,
Mi pasante kopion de x kaj kopion de y.
Ĝi estas preskaŭ kvazaŭ vi kopiis kaj pasted en interŝanĝa
la valoroj kiujn vi volas ke ĝi reale manipuli.
Do se tiu estas la kazo, kiam mi la programon komenco ekzekuti linion 35 tiam 36,
kiam mi reiros al la linio 37, je ĉi tiu punkto en la historio, kio estas la valoro de?
Je ĉi tiu punkto en la historio, linio 37, kio estas la valoro de ĉe ĉi tiu punkto? >> [Studento] 1.
[Malan] Ĝi devus nur esti 1, rajto, ĉar x estis aprobita en la unua argumento,
kaj ĉi tiu funkcio nur arbitre alvokas lia unua argumento al.
Simile estas Y la dua argumento, kaj ĝi estas nur arbitre nomi la dua argumento b.
>> Ĉi dicotomía fakte sufiĉe simple klarigita. Pensu pri tio.
Neniu el ni renkontis la persono kiu skribis printf,
tiel certe, li aŭ ŝi havas neniun ideon pri kio nia variabloj 30 jaroj poste tuj nomos.
Do devas esti distingo inter tio, kion vi nomas variabloj en funkcioj vi skribi
kaj kion vi nomas variabloj en funkcioj vi vokas aŭ uzante.
Do alivorte, mi skribis mian variabloj kiel x kaj y,
sed se iu alia estis skribinta la interŝanĝa funkcio, li aŭ ŝi certe ne scias
kion mia variabloj tuj nomos,
tiel rimarkas ke ĉi tiu estas kial vi havas ĉi duvarianteco de nomoj.
Teknike, mi povus fari tion per hazardo,
sed ili ankoraŭ pasis en kiel kopioj.
Estus nur esti pura koincido estetike se tiu persono kiu skribis interŝanĝa
estis uzintaj la samajn nomojn.
Do je ĉi tiu punkto en la historio, linio 37, a estas 1, b estas 2, kaj nun mi procedi por interŝanĝi ilin.
Unue, mi vere fari tion multe pli simple.
Mi ne scias, kion tiuj 3 linioj de kodo estis farante.
Lasu min nur tion: b = a; a = b; farita.
Kial estas ĉi rompita, logike?
Estas speco de la intuicia afero, ĉu ne?
Do oni igas b kaj b igas,
sed la problemo estas ke tuj kiam linio 37 ekzekutas, kio estas la valoro de a kaj b?
La sama, 1, ĉar vi clobbered, por tiel diri, vi jam ŝanĝis b egali al.
Do iam linio 37 estis ekzekutitaj, jen granda, vi nun havas 2 kopiojn de la nombro 1
ene de ĉi tiu funkcio, do tiam, kiam vi diras en linio 38 a = b,
vi ia ŝraŭbita ĉar vi ĵus atribui 1 al 1.
Vi ia perdis la valoron vi zorgis pri.
Do, en la originala versio de ĉi tiu, rimarkos, kion mi faris.
Mi anstataŭ havis trian linion de kodo kiu aspektis kiel ĉi tio.
Mi deklaras portempa variablo.
>> Tmp estas tre komuna nomo por portempa variablo, kaj temas pri int
ĉar ĝi havas por kongrui kion mi volas fari kopion de.
Mi stoki kopion de interne tmp, do unufoje linio 37 estis ekzekutitaj,
la valoro de a estas - rapida prudento ĉeko - 1, la valoro de b estas 2,
kaj la valoro de tmp estas ankaŭ 1.
Do nun mi ekzekuti linion 38.
Iam linio 38 ekzekutas, oni prenas la valoro de b. Kaj b estis 2, do a estas nun 2.
Do je ĉi tiu punkto en la rakonto, estas 2, b estas 2, kaj tmp estas 1,
tial nun logike, oni povas simple plop tmp valoro al b kaj ni faris.
Do ni solvis tiun problemon.
Bedaŭrinde, kiam mi kuros ĉi programo en ĉi tiu formo, ĝi ne vere interŝanĝi ajna valoroj.
Sed esti klaraj, kial?
Mi riparis la logika problemo de nur antaŭ momento,
sed denove, se mi kuros ĉi programo, x kaj y restas neŝanĝita
la fino de la programo ekzekuto.
[Inaudible studento komenton] >> Ni ne revenis ion, do tio estas vera.
Sed ĝi rezultas ekzistas iom da problemo ĉi tie, ĉar ĝis nun,
la sola afero ni povas reveni estas unu afero, kaj ĉi tiu estas limigo de C.
Vi povas nur reveni vere unu valoro, en kies kazo mi estas ia kaptita ĉi tie
ĉar mi povis reveni al la nova valoro de x aŭ mi povus reveni al la nova valoro de y,
sed mi volas ambaŭ dorso.
Do reveni ne la simpla solvo ĉi tie.
Sed la problemo estas fundamente kial? Kion ni vere interŝanĝis?
[Studento] a kaj b. >> A kaj b.
Sed a kaj b estas kopioj de x kaj y, kio signifas ke ni ĵus faris ĉion ĉi verko,
ni ĵus pasis 3 minutoj parolas la interŝanĝa funkcio kaj ĉiuj 3 de tiuj variabloj,
kaj tio estas granda, perfekte ĝentila en izolado,
sed a kaj b estas medion nur estas en tiuj linioj tie.
>> Do ĝuste kiel por ciklo, se vi rakontos entjero i interne de la por ciklo,
simile, se vi deklarante a kaj b ene de funkcio, kiun vi jam skribis,
ili estas nur valida interne de tiu funkcio, kiu signifas tiel frue kiel interŝanĝa estas farita ekzekuti
kaj ni iros de linio 24 al linio 25, x kaj y ne estis ŝanĝita tute ne.
Vi nur malŝparis tuta multan tempon interŝanĝi kopiojn de variabloj.
Do rezultas ke la solvo al ĉi estas fakte ne-evidenta.
Ne tute sufiĉa por reveni valoroj ĉar ni povas nur reveni 1 valoro,
kaj mi vere volas interŝanĝi ambaŭ x kaj y samtempe,
do ni tuj devas reveni al ĉi tio.
Sed nuntempe, rimarkas ke la afero funde derivita de la fakto ke a kaj b estas kopioj
kaj ili estas en lia propra medio.
Ni provu solvi ĉi iel.
Lasu min reale rulumu reveni ĉi tien kaj malfermu, diru, kvara varianto de ĉi tio, buggy4.
Kio pri tio?
Ĉi tiu estas simila sed pli simpla problemo por rigardi antaux ni preni ponardopiko ĉe solvi ĝin.
Ĉi tiu programo estas nomita pliigo, kaj ĝi ŝajne inicializa x entjero al 1 en linio 18.
Mi tiam postuli x estas 1, do mi diras "pliigante ..."
Mi tiam nomita pliigo, sed tiam en linioj 22 kaj 23 Mi asertas ĝi estas estinta incremented,
Mi asertas x estas nun kion ajn ĝi estas - 2, supozeble - sed ĉi tiu programo estas kalesxo.
Kio estas la problemo?
Yeah. >> [Inaudible studento respondon] >> Ekzakte.
Do x estas deklarita, evidente, sur linio 18.
Tio estas ene ĉefa La frizita krampoj.
Do la simpla respondo estas, ke dum x ekzistas tie,
ĝi ne ekzistas en linio 32, do ĉi tiu programo fakte eĉ ne kompili.
La tradukilo kiam mi provas kompili tiun kodon tuj krias al mi
pri kelkaj nedeklarita ensalutilo aŭ ion pri tio. Fakte, ni provu.
Ĉi tiu estas fari buggy4. Tie ĝi estas.
Uzo de nedeklarita ensalutilo 'x' en linio 32.
Kaj efektive, ni estu pli eksplicita tie hodiaŭ, por ke ĉi tiu estas utila
en oficejo horoj kaj hejme.
>> Rimarku, ke ĝi estas iom cryptically skribita.
Sed la fakto, ke Clang havas kriis al ni, dirante buggy4.c: 32:5, estas fakte utila.
Ĝi signifas ke la eraro estas ĉe linio 32 en karaktero pozicio 5.
Do 1, 2, 3, 4, 5. Tio estas, fakte, kie la problemo estas.
Kaj ankaŭ, tro, memoru ĉe oficejo horoj kaj hejme, mi estas bonŝanca tie.
Mi havas unu eraro. Ĝi tuj estos relative facile ripari.
Sed se vi ricevas tutan ekranon plenan de blindiga erarmesaĝojn,
denove rimarkas ke la ĉefundan unu povus simple esti sintomática de la plejsupra unu.
Do ĉiam persekuti viajn erarojn de supre malsupren
ĉar ne povus simple esti lekanto ĉeno efekto
kiu sugestante vi havas vojon pli problemoj ol vi vere faras.
Do kiel ni povus ripari tion ĉi se mia celo estas pliigo x? >> [Studento] Faru x tutmonda.
Konsentite, do ni povas fari x tutmonda.
Ni prenu la fulmoklavo, ke Mi avertis pri pli frua, sed heck, ni nur bezonas rapidan solvon,
do ni nur diros int x tien. Tio faras x tutmonda.
Do nun ĉefa havas aliron al ĝi kaj pliigo havas aliron al ĝi,
kaj tiel lasu min antaŭeniri kaj kompili tiun nun.
Faru buggy4, Enter. Ŝajnas kompili nun.
Ni kuras buggy4. Kaj ŝajnas al vere funkcias.
Tiu estas unu el tiuj aĵoj ke tio faru kiel mi diras, ne kiel mi,
kiel mi ĵus faris ĉi tie, ĉar ĝenerale,
niaj programoj tuj akiri multe pli interesa kaj multe pli longa ol tio,
kaj se via solvo al la vivo la problemoj estas nur meti ĉiuj variabloj ĉe la supro de via dosiero,
tre rapide do programoj get horrifically malfacile sukcesas.
Ĝi alvenas pli malfacile pensi novajn variablo nomoj,
alvenas pli malfacile kompreni kion variablo faras kion,
kaj tiel ĝenerale, ĉi tio ne estas bona solvo.
Do ni faru ĉi pli bone.
Ni ne volas uzi malloka variablo tie.
>> Mi volas pliigo x, do mi povis evidente -
ĉe la fino de la tago, jen speco de stulta historio ĉar ni nur faru tion -
sed se mi ne sciis pri tiu operatoro aŭ mi ne rajtas ŝanĝi ĝin en ĉefa mem,
kiom ajn mi povus apliki Ken super tie ĉi tempo ne kubo sed al pliigo?
Kiel mi ŝanĝu tiun aferon ĉi tie? Yeah.
[Studento] Pass en x kaj tiam revenu [inaudible] >> Konsentite, bona.
Do kial mi ne pasas en x kaj tiam anstataŭ redoni ĝin,
kial ne mi simple reveni x + 1.
Paro pli aĵoj devas ŝanĝi ĉi tie. Mi estas sur la ĝusta vojo.
Kion alian mi bezonas Tweak? Iu alia. Yeah.
[Inaudible studento respondon]
Mi bezonas ŝanĝi la reveno tipo de pliigo ĉar ĝi ne neniigas.
Void per nenio estas revenis, sed klare nun estas,
tiel ĉi devas ŝanĝi - >> [studento] int.
int por esti konsekvenca kun kion ajn Mi vere reveni.
Nun io alia estas ankoraŭ kalesxo tie. Yeah.
[Inaudible studento respondon] >> [Malan] Do mi bezonas pliigo x?
[Inaudible studento respondon] >> [Malan] Ah, do mi bezonas por pasi x.
Do mi bezonas fari ĉi tie. >> [Inaudible studento komenton]
[Malan] Do la prototipo, mi devas ŝanĝi ĉi tien.
Do tiu havas igi int, tiu devas esti -
hmm, mi efektive havas cimon cxi tie. Ni fiksas ĉi tiu unua.
Kion tio efektive estus? Oni alvenis al esti int ion.
Ĝi povus esti x, sed sincere, se oni komencas nomi cxiujn el viaj variabloj x,
ĝi tuj akiri malpli kaj malpli klara kiu estas kiu.
>> Do ni nur arbitre elekti alian nom-normo por mia helpanto funkcioj,
la funkcioj mi skribas. Ni nomas ĝin, aŭ ni povus nomi ĝin -
Ni nomas ĝin nombro esti eĉ pli eksplicitaj.
Tial mi devas reveni ajn la nombro estas plus 1,
kaj nun mi devas ŝanĝi 1 alia aĵo ĝis tie kaj unu alia afero ĝis ĉi tie.
Kion mi devas ŝanĝi la linion 21 unuan? >> [Inaudible studento respondon]
[Malan] mi devas atribui ĝin al x. Mi ne povas simple nomi pliigo (x).
Mi bezonas memori la respondon per ŝanĝanta la valoro de x sur la maldekstra flanko.
Kaj eĉ se x estas nun en la maldekstra kaj dekstra, jen tute bone
ĉar la dekstra flanko gets ekzekutita unua tiam gets plopped en la maldekstra afero -
x en ĉi tiu kazo.
Kaj poste laste, ĉi tiu estas facila riparas nun.
Tiu devus ĝuste kongruas kio estas malsupre, int nombro.
Do tuta amaso de ŝanĝoj por vere stulta funkcio
sed reprezentanto de aĵoj kiujn ni pli kaj pli volas fari.
Do fari buggy4. Mi ŝraŭbita supren ie.
Ho, mia Dio. Kvin erarojn en 6-linio programo.
Do kio estas malĝusta en linio 18, karaktero 5?
Do mi devas deklari tion, int.
Ni vidu. Ekzistas tuta aro da aliaj eraroj.
Ho, mia Dio - 19, 18, 21 - sed denove, ni nur liberigi la ekrano, Kontrolo L tie,
kaj rerun Clang.
Do 5 problemoj estas fakte nur ke 1.
Do nun ni kuras buggy4, Enter. Whew, x estas incremented ĝuste.
Bone. Demandojn pri kiel pliigo nombroj? Yeah.
[Inaudible studento demando] >> Bona demando.
Kial mi povas simple ŝanĝi x al nombro kaj la programo scios tuj?
>> Denove, pensi pri tio kiel ĉi abstraktado.
Do, se mi estas ĉefa kaj Ken estas pliigo, sincere, mi ne zorgas kion Ken nomas lia iPad.
Mi ne zorgas kion li nomas ion, kio devas vidi per sia efektivigo de ĉi funkciojn.
Ĉi tiu estas efektivigo detalo kiun mi, ĉefa, ne devas maltrankviligi.
Kaj tiel simple ŝanĝi ĝin konsekvence ene de la funkcio - kvanto ĉi tie kaj nombro tie -
estas ĉiuj prenas tiom longe kiom mi recompilar.
Estas iel kiel se vi pensas pri multaj el ni, tiuj de vi kun ŝoforo permesiloj
kiuj forpelis aŭ se vi eĉ pelita en aŭto,
la plimulto de ni ne havas ideon kiom aŭto laboras sub la kapuĉo.
Kaj laŭvorte, se vi malfermas la kapuĉo, la plimulto de ni - mi mem komprenis -
ne tuj vere scias kion ni rigardis,
ia kiel vi eble sentas kun stuff kiel tiu nun.
Sed ni ne devas vere gravas kiom la aŭto funkcias,
ni ne devas prizorgi kion ĉiuj la bastonojn kaj piŝtoj kaj kabloj ene de la aŭto
fakte faras.
Do iu kiel vi nomas la piŝto ne gravas ĉi tie en ĉi tiu kazo. Sama ideo.
Yeah. >> [Inaudible studento demando]
Se estas pli uzoj de la variablo XA antaŭ momento,
vi, la programisto, devus ŝanĝi ilin ĉie.
Aŭ vi povus laŭvorte do Dosieraj, Menuo, kaj tiam Trovu, Replace - io simila -
sed vi tuj devas fari tiujn ŝanĝojn mem.
Vi devas esti konsekvenca. >> [Studento] Se estas multaj variabloj [inaudible]
Aparta ordon kiel ĉi tie, se tio estis int alia numero? >> [Studento] Correct.
[Malan] Yeah. Ordo gravas kiam vi vokas la funkcio.
>> Do se mi nomis pliigo tie kun iu komo ion,
ekzistas rekta surĵeto.
La unua variablo, kia ajn ĝi estas nomata, estas farita kopio de la unua argumento super tie.
Pardonu. Tiu ne devus esti parentezo.
La dua argumento regiono kun la dua. Do ordo, jes, aferoj. Bone.
Pardonu. Mi prenis la longan vojon por atingi tien. Aliaj demandoj? Bone.
Do ni vidu, se ni ne povas pentri bildon de kio vere okazas tie
sub la kapuĉo, por tiel diri.
Tio ĉi estas ortangulo, kiuj povus reprezenti via komputilo la memoro.
Eĉ se vi ne havas ideon kiom memoro funkcias aŭ kiel RAM verkoj,
almenaŭ supozas, ke vi havas aroj da ĝi ĉi tiuj tagoj.
Vi havas megabajtoj ĝi, kiam vi mem havigis gigabajtoj de ĝi,
kaj ni scias el semajno 0 kiu bajto estas precize kion? >> [Studento] 8 bitoj.
8 bitoj, ĉu ne? Do 8 nuloj kaj 1.
Do se via komputilo havas koncerton de RAM, 2 koncertoj de RAM tiuj tagoj,
vi havas miliardoj aŭ 2 miliardoj bajtoj de memoro aŭ proksimume 8 milionoj aŭ 16 miliardoj bitoj
ene de via komputilo.
Kontraste kun la iom Wooly Willy Ekzemple, ne estas magneta eroj tipe plu.
Ĉiufoje - en tekkomputiloj almenaŭ - estas solida stato diskoj, SSDs,
ke nur oni ne movas partoj. Estas ĉio elektronika. Estas ĉio elektro-bazita.
Do pensu pri ĉi rektangulo kiel ĝuste reprezentas la 1 aŭ 2 gigabajtoj de memoro kiun vi havas.
>> Do ĝi eron de memoro.
La mondo de komputilaj scienco ia dispartigita ekstere
pecoj de memoro fari malsamajn aferojn.
Ekzemple, se cxi tiu estas via komputilo RAM, kiel sugestita de la rektangulo tie,
ĝi rezultas ke per konvencio, sur la supro de via memoro RAM, por tiel diri,
Estas ĝenerale kion nomas tekston segmento.
Tiuj estas la _0s_ kaj _1s_ ke vi kompilis.
Do kiam ni rigardis sub la kapuĉo je kioma a.out estas,
cxiuj tiuj _0s_ kaj _1s_, kiam vi kuris de programo,
tiuj _0s_ kaj _1s_ ŝarĝas el via malmola disko en ion nomita RAM,
kaj en la RAM ili estas metitaj en la pinto.
Dume, vi havas aliajn aferojn: pravalorizi datumoj, uninitialize datumoj.
Tiuj 2 swaths de memoro referi al tutmonda variabloj, kiuj ne ofte uzas
sed foje se vi faras, ili finas tie ankaŭ.
Tiam ekzistas iu alia materialo: medio variabloj, kiuj ni ne pasigas multe da tempo plu,
sed tiam 2 gravaj aĵoj kiuj revenos tra la semestro,
pilo kaj amaso.
Do plej de via komputilo la memoro estas rezervita al la kuri programon
por iu nomita la pilo kaj iu nomis la amaso.
Ni ne intencas paroli pri la amaso hodiaŭ, sed ni parolos pri la stako.
La pilo celas sorĉvenigi la vida de la manĝejo manĝo pletoj en Mather Domo
aŭ kien ajn vi hazarde estos en la manĝejo bastonon purigi ilin ĉiutage,
ili pilo ilin el planko plu supren,
kaj simile, en memoro, estas ĉi ideon de meti ion sur pilo,
metante ion sur pilo, metante ion sur pilo.
Kaj kion ni celas diri per tio?
>> Ni zoom en sur nur la suba duono de ĉi tiu pentraĵo, via komputilo RAM,
proponi la sekvan.
Rezultas, ke kiam vi kuros programon kiel a.out aŭ saluton -
kion ajn la programo estas ke vi skribis -
denove, tiuj _0s_ kaj _1s_ ŝarĝas el via malmola disko, kiu estas longtempa memoro,
restas tie ĝis kiam vi tiras la kuseneto, ŝarĝita en RAM.
RAM estas pli rapida ol malmolaj diskoj - estas pli malgranda ol malmolaj diskoj -
sed estas kie programoj vivi dum vi kuras ilin.
Do vi duoblan klaku programon sur Mac aŭ PC, ĝi estas ŝarĝita de malmola disko en RAM.
Tuj kiam ĝi estas ŝarĝita en RAM, la _0s_ kaj _1s_ iras ĉe la vojo supro,
la tn teksto segmento, sed tiam tuj kiam via programo fakte komenciĝas kurante,
la ĉefa funkcio estas nomata, kaj ĉefa, kiel ni vidis, ofte havas lokajn variablojn,
kaj ĝi havas ints kaj kordoj kaj signoj kaj similaj.
Do, se via programo, kiun vi skribis aŭ la programo kiu vi duoblan klakis
uzita iuj variabloj ene de ĉefaj,
ili finas je la fundo de via pilo de memoro, por tiel diri.
Pli konkrete, kion signifas ĉi reale signifas?
Tiu simple volas diri ke se ni iris al la numero la bajtoj de RAM en via komputilo,
rimarki, ke eble tio estos bajto nombro 0, ĉi tio povas esti byte numero 1, 2, 3, 4, 5, 6,
tuta vojo ĝis 2 miliardoj estus tuta vojo ĝis tie supre.
Do alivorte, kiam ni parolas pri RAM aŭ memoro en terminoj de bajtoj,
ĝi simple signifas, ke iu decidis kion prikalkulu ĉiu de tiuj pecoj de memoro.
Do, kiam vi bezonas 32 bitojn por int aŭ vi bezonas 8 bitoj por char,
kie do ili finas en memoro?
>> Koncepte, oni nur finos je la fundo de tiu afero nomata la stako.
Sed kio estas interesa nun estas kiam ĉefa nomas funkcio -
supozi funkcio nomita foo, ĝuste arbitran nomon -
kio okazas estas ĉefa estas ĉe la malsupro de tiu pilo de memoro;
foo nun estas metita sur ĉefa en memoro.
Do iu loka variabloj kiuj foo jam fini ia koncepte supre tiuj en ĉefa.
Se foo nomas alian funkcion nomita trinkejo, tiuj variabloj fini ĉi tie.
Se trinkejo nomas ion alian, jen, jen, tie ĉi.
Do kio estas interesa pri kurante programo estas ke kiel vi nomas funkcioj
kaj kiel tiuj funkcioj vokas funkciojn kaj kiel tiuj funkcioj vokas funkciojn,
vi konstruos ĉi pilo de funkcioj en memoro.
Kaj nur unu fojon funkcio redonas vi komencu akiri tiu memoro dorso.
Do unu el la plej facilaj manieroj por kuri el memoro en komputila programo
estas skribi funkciojn kiuj neniam revenus.
Do ekzemple, ni pruvi tiel kun intence kalesxo programo.
Lasu min antaŭeniri kaj ne # include ,
int main (void),
kaj mi tuj faros dum (2> 1), kio verŝajne ne iam ŝanĝos nin,
kaj lasu min iri antaŭen nun kaj faros printf.
Efektive, tiu tuj estos malpli vide interesa. Ni faras tion.
Por int i = 0; i> 0 - ni faros tiun eraron - mi + +.
Kaj ni ne printf tie. Ni praktiki kion mi predikis.
Ni havas metodon tie, void ĥoro, kaj ni diru int i,
kaj tiam mi iros diri printf - ne, ni faros tiun pli interesa.
Ni fakte ne presi ion ajn. Ni nur faru jene: ĥoro (i).
Bone. Do ĉi tiu estas kalesxo ĉar kial?
Mi faras ĉi tion dum mi iros, ĉar la programo ne vere faras nenion de intereso.
>> Sed tio ne estas la celo.
La celo estas skribi programon kies ĉefa funkcio faras kio, ŝajne?
Voku mem. Kaj efektive, ni ne bezonas la ciklo.
Ni eĉ simpligi ĉi nur por ne perdi antaux vere la fundamenta eraro.
Ĉefa alvokoj ĥoro kanti iujn ĥoro,
tiam mi faris iun stultan kaj mi devis ĥore alvoko ĥoro
ĉar mi supozis ke iu alia tuj apliki ĝin eble,
kaj nun ĉi tio ne tuj kompili ankoraŭ. Mi bezonas fari kion?
Mi bezonas la prototipo, memoru.
Do mi bezonas havi ĝis tie dezerta ĥoro (int i);
Do nun, se mi iros tien - efektive, ni uzos la pli granda fenestro.
Ni iru antaŭen kaj fari ĥoro.
Uzo de nedeklarita ensalutilo i.
Ho, tio estis stulta. Ni ne bezonas la argumento. Ni nur faru tion.
Mi deziras ke ni komencis ĉi tiun vojon. Estus multe pli facile programo por skribi.
Tie. Nun ni transiros al mia fina fenestro, rerun Clang, kaj tie ni iru.
Tio estis vere rapida.
Kio fakte ĝuste tio okazis, kvankam?
Nu, nun mi aldonos la impreso linio do ni povas vidi.
Lasu min diri printf ("mi estas ĉi tie") - sen variabloj. Ni lasos ĝin tiel.
Lasu min rerun fari. Lasu min rerun ĥoro.
Kaj ... venu. Konservu tuj.
Kiel flanken, kial ĝi ne frakasis yet?
La segmentación kulpo okazis super rapida antaŭe.
[Inaudible studento respondon] >> Ekzakte. Do ĝi prenas tempon por presi, ĉu ne?
Ĝi simple prenas pli da laboro sur la komputilo parto.
Kaj tie estas: Segmentación kulpo.
>> Do rimarki kiom rapida programoj kuri.
Se vi ne presi ion, super rapida.
Sed ni ankoraŭ havas ĉi segmentación kulpo ĉar tio, kio okazas?
Se vi pensas pri kiel via komputilo la memoro estas jalonada,
ĉi tio okazas al esti ĉefa, sed tie ni simple nomas tion ĥoro, kaj ni nomas tiun refrenon.
Kaj nun se mi faras mian estetiko pravas, tio estas nur intencas diri ĥoro, koruso, ĥoro,
koruso, hxoro, koruso, ĥoro, ad nauseum, kaj eventuale, kio okazos?
Se la granda bildo, laŭvorte, estas tio, kio ĵus okazas koncepte?
La pilo overruns la amaso.
Aŭ, pli malbone, vi simple invadita ĉio, inkluzive de la teksto segmento,
kiu estas la _0s_ kaj _1s_ kiuj reprezentas vian programon.
Unuvorte, tiu estas nur super, super malbona.
Via programo spiraled el kontrolon.
Vi uzas vojon pli memoro ol vi intencis
ĉiuj pro stulta eraro en ĉi tiu kazo,
aŭ en tiu kazo tre intence faris funkcio kiu nomas sin.
Nun, ĉi tio ne estas ĉio malbona.
Funkcioj nomante sin reale havas grandan potencon kiam oni uzas ĝin ĝuste.
Mi ne uzis ĝin ĝuste ĉi tie.
Do tiu estas ne ĉiuj malbonaj, sed la fakto, ke mi neniam vere halti nomante min
estas fundamenta malforteco tie de tiu programo.
Do kie ni iras kun ĉio ĉi? Kio vere okazas?
Kiam mi vokas la pliigo funkcio kiel ni faris en tiuj ekzemploj,
Mi havas valoro kiel 1, ke mi pasas in
Mi pasas en kopio de la numero 1, do la sekvan okazas.
Ni iru en la pliigo Ekzemple, ĉi ulo rajton super tie.
Jen kio vere okazas.
Kiam mi vokas pliigo kaj mi pasas en x, pictóricamente, kio okazas ĉi tie estas tio.
>> Se mi havas la valoron de 1 stokitaj tie kaj mi vere nomas pliigo,
kion oni nun nomas ĥoro - la iPad estas ĵeti min for tie.
Ni nomas tion pliigo, kaj ni ne scias kio estas tiu sekva funkcio tuj estos.
Do kio vere okazas estas ĉi tie ie en ĉefa mi havas eron de memoro
kiu stoki la nombro 1.
Kiam mi vokas pliigo, Mi uzas alian eron de memoro,
sed nun mi havas la kopio de 1.
Kiam mi pliigo tiu valoro, ĉi iĝas 2,
sed tiam kio okazas tuj kiam pliigo revenas?
Tiu memoro nur gets enmanigis al la mastruma sistemo,
kion signifas ĉio vi faris estas nenio utila.
La 1 kiu estis origine enhavis en ĉefa estas ankoraŭ efektive tie.
Do kie ni iras kun tio?
Ĝi rezultas ke en memoro vi havas ĉi back-to-back vico da bajtoj
ke vi povas meti aĵojn en, kaj ĝi rezultas ke ni jam vidis ion
kiu implikas metante aĵoj malantaŭo al malantaŭo al malantaŭo al malantaŭo.
Kio estas ĉeno bazita sur semajno 1 kaj nun semajno 2?
Estas nur kolekto de karakteroj.
Do rezultas same kiel vi povas meti numerojn en memoro,
simile oni povas ion karakteroj en memoro.
Kaj unufoje ni komencu meti signojn en memoro malantaŭo al malantaŭo al malantaŭo al malantaŭo,
ĝi rezultas ke uzante la plej simplaj aferoj kiel por buklo aŭ dum ciklo,
ni povas persisti de maldekstre al dekstre super la gravuloj ĉeno
kaj komenci massaging ilin en malsamaj karakteroj tute -
oni povus igi b, b povus igi c -
por ke finfine, ni povas preni anglan frazon, kiu efektive havas sencon
kaj konverti ĉiu de tiuj leteroj oni samtempe
marŝante tra nia komputilo memoro maldekstre dekstren al reale ĉifri.
Do ni prenu nian kvin minutoj ripozon ĉi tie,
kaj kiam ni revenos, ni komencu ĉi tiu procezo de grimpadi informo.
>> Bone.
Antaŭ ol ni plonĝi en iuj kripto kaj tion nomis arrays,
lasu min paŭzo por ajna demandoj ĉar mi sentas min vere ia malklara
kelkaj el tiuj temoj. Do ni ripari nun se ni povas.
Ni nur parolis pri reveno valoroj, ni parolis pri argumentoj,
kaj ni parolis pri tiu nocio, kiun ni revenos al la semajnoj por veni,
de viewing memoro entute amaso de tiuj plata pletoj, por tiel diri,
de malsupre supren, tia ke ĉiu pleto ke gets surmetis la stako
reprezentas funkcion ke tio aktuale estas vokita.
Demandojn?
Lasu min demandi demandon ĉi tie.
Lasu min simpligi ĉi reen al kio estis antaŭ kelkaj niaj antaŭaj Q & A.
La fakto ke pliigo havas malferma parentezo, int nombro, fermis parentezo -
kion signifas int nombro reprezenti?
[Studento] Argumento. >> An argumento. Okay. Sed kio estas argumento?
[Inaudible studento respondon] >> Kio estas tio? >> [Studento] Iu kiu pasas in
Okay, do iu kiu pasas in Kaj pli ĝenerale, estas nur la enigo.
Se vi skribas funkcio kaj ke funkcia celo en la vivo
estas fari iu iom malsama ĉiufoje kiam vi uzas ĝin,
tiam la sola maniero por ke tio okazas vere ŝajnus esti provizi ĝin per enigo
tiel ke ĝi povas fari iun malsama kun tiu enigo ĉiufoje.
>> Do vi bezonas specifi du aferoj kiam funkcio prenas enigo.
Vi devas specifi la nomo kiun vi volas doni al tiu enigo
pure por via propra komforto por ke vi povas referi al ĝi
en la funkcio kiun vi mem skribas, kiel mi faris tie en linio 32.
Sed vi ankaŭ bezonos specifi lia tipo ĉar C estas komputila programlingvo
ke nur postulas ke se vi volas variablo, vi devas diri al la komputilo kio datumtipo estas,
en granda parto por ke ĝi sciu kiom da bitoj destini por tiu variablo
ĉar ĝi povus esti 6 - sorry, ne estos 6.
Ĝi povas esti 16, ĝi povas esti 8, ĝi povas esti 32, eĉ 64,
sed la komputilo bezonas scii.
Nun, la int sur la maldekstra flanko reprezentas kio, per kontrasto?
[Inaudible studento respondon] >> Kio estas tio? >> [Studento] Tipo de funkcio.
La tipo de funkcio kaj, pli specife, la tipo de lia eliro. Ĝuste.
Do dum la aferon en krampoj reprezentas lian enigo, se iu,
la afero al la maldekstra reprezentas sian produktadon.
Kaj en ĉi tiu kazo, pliigo ŝajne redonas int,
kaj tiel int estas la reveno tipo de ĉi tiu funkcio.
Kion ĝi signifas por reveno?
Laŭvorte, vi uzas la ŝlosilvorto reveno kaj tiam se kion vi reveni
dekstre de la ŝlosilvorto estas entjero,
tiam tio estas ja kohera kun kion ni promesis.
Vi ne povis fari ion kiel tiu - saluton, mondo - ĉar tio estas ĉeno.
>> Evidente, ne estas entjero.
Do mallonge, la ŝarĝo estas vere kontraŭ ni, la programisto, esti specifa
pri tio, kion ni reveni kaj tiam efektive irad reveni.
La kunteksto tie nun estas, ke via komputilo memoro estas gigabajto, 2 gigabajtoj -
kion ajn - eble ĝi estas pli, eble ĝi estas malpli,
sed la komputilo vidas ĝin kiel havanta malsamajn sekcioj.
Iu iras tien, ion alian iras tien,
malsamaj aferoj iras en la mezo, kaj hodiaŭ ni ĵus komencas diri la rakonto,
sed ni revenos al ĉi tempo.
Ĉar nun, la sola peco de memoro ni vere zorgas pri la teksto segmento
ĉar tio ĝuste reprezentas la _0s_ kaj _1s_ ke Clang havas outputted.
Do, kiam vi kuris de komando en la klavaro kiel a.out
aŭ vi duoblan klaku ikono en Mac OS aŭ Vindozo,
via programo estas ŝarĝita de via malmola disko en RAM
kaj ĝi estas plopped supre de via komputilo RAM, por tiel diri.
Dume, kiel via programo komencas kuri kaj ĉefa gets nomata
en la programo vi skribis aŭ la programo Microsoft aŭ Apple skribis,
iu el liaj lokaj variabloj fini tie malsupre sur la fundo de via komputilo memoro.
Sed se ĉefa alvokoj alia funkcio kiu mem ne havas variabloj aŭ argumentoj, ili finas super ĝi.
Kaj se tiu funkcio vokas ion, ili finas super ĝi, super ĝi, super ĝi.
>> Kaj nur unu fojon funkcio estas farita ekzekuti faras la pilo de pletoj, por tiel diri,
komenci akiri pli kaj pli malalte.
Kaj tio estas tiam, en vortoj, klarigas kial kiam vi nomas kubo
aŭ vi nomas pliigo, vi pasante en kopio de la valoro.
Kaj kion tio signifas pictóricamente estas ke vi laŭvorte skribi la numero 1
en alia parto de memoro, ŝanĝante ke 1 al 2 en la kazo de pliigo
aŭ al 8 en la kazo de kubo kaj poste ĵeti ke memoro for
tuj kiam la pliigo aŭ la kubo funkcio redonas. Demando.
[Studento] Kien tutmonda variabloj stokita?
Suma variabloj estas stokitaj en kio nune nomata inicializado datumoj aŭ uninitialized datumoj,
la diferenco se vi havas malloka variablo kaj vi atribuas ĝin tuj valoro
kun la egala signo, ĝi finas ĉe la pinto,
kaj se vi simple diru int x; sen valoro, ĝi finas iomete pli malalta en RAM
simple konvencio.
Aliaj demandoj? Bone.
Do ĉi tiu bildo revenos kiam ni atingos pli potenca
per kio ni povas fari kun la komputilo,
sed por nun, ni havas mallongan intro al ĉifriko,
specifa tipo de ĉifriko kiu ne solvas ĉiujn mondproblemojn
sed ne solvi kelkajn el ili.
En ĉi tiu kazo tie, ni havas ion nomita sekretaj-ŝlosila ĉifriko.
Sekretan-ŝlosila ĉifriko, kiel la nomo sugestas, ĝi derivas ĝia sekureco de sekreta.
>> Ekzemple, se vi estus denove en grado lernejo kaj vi pasante iom sekreta amleteron
al la knabo aŭ knabino vi premante sur, se vi volas pasi tiun noton per la publiko,
vi probable ne skribi tian noton en la angla aŭ kion ajn via denaska lingvo estas.
Pli ĝuste, vi povus kodi ĝin aŭ vi eble simple sendi ilin tekston mesaĝon tiuj tagoj.
Sed vi eble vere pasi ilin noto tra la klasĉambro.
Kaj fari tion sendanĝere en tia maniero, ke viaj amikoj kaj la majstro
ne scias kion vi skribas, vi eble supreniru kun sufiĉe simpla algoritmo,
juna kvankam vi povus esti, nur levi la vortoj.
Do anstataŭ skribas vi povus skribi b,
anstataŭ b vi povus skribi c,
anstataŭ c vi povus skribi d, kaj tiel plu.
Aŭ vi povus veni supren kun pli kompleksa tradukado
de literoj en malsamaj literoj.
Sed la ruzo estas la knabo aŭ knabino, al kiu vi sendas ĉi noto
bezonoj scii ion, kio estas kio, evidente? >> [Studento] Kion vi sendas.
Kion via sekreto estas, kiel tio estas ke surĵeto inter la kaj b-aj kaj c aj kaj d's.
Ĉu ĝuste aldonante 1 al ĉiu de la literoj iri de a al b, b al c?
Ĉu pli kompleksa ol tio?
>> Do vi kaj via crush bezonas havi tiun sekretan informon,
sed estas speco de catch-22 ĉi tie.
Se ĉi estas la unua fojo vi sendas tiun amleteron tra la klaso,
kiel estas tiu knabo aŭ knabino tuj scias, kion la sekreta eĉ estas?
Do sekretaj-ŝlosila kripto ne solvas ĉiujn mondproblemojn,
kaj tie estas reale rilato tie ke ni revenos al al semestro la fino.
Simile do plimulto de ni ne konas iun kiu funkcias, ekzemple, en Amazon.com,
kaj tamen multaj el ni probable aĉetis frandajxojn cxe Amazon.com,
kaj ni estis instruitaj por supozi, ke tiuj TTT-komerco transakcioj estas sekura.
La URL probable diras https, ekzistas eble stulta iom pendseruro ikono ie,
ekzistas ia ĉifriko certigi viajn kreditkartajn detalojn
inter vi kaj Amazon.com.
Kaj tamen se ĉifriko engaĝas sciante iu sekreta
kaj tamen mi ne scias iun ĉe Amazon kaj mi certe ne aranĝis ia sekreta
kun iu en Amazonio, kiom estas mia komputilo aŭ mia retumilo faras tion?
Ĝi rezultas ekzistas aliaj specoj de ĉifriko aro kiu solvas tiun problemon.
Sed por hodiaŭ, ni enfokusigas la simpla
kie vi povas aranĝi anticipe scii iu sekreta
kiel +1 aŭ iu surĵeto inter la kaj b-aj jaroj.
Kaj la procezo de ĉifriko ĝenerale engaĝas ĉi.
Vi havas iujn simpla teksto, reprezentita tie en maldekstra,
vi kuros ĝi tra ia algoritmo aŭ proceduro por encrypting ĝi -
eble tio estas nur igas b, b igas c -
kaj tiam vi finos kun ĉifrita teksto.
Dume, unufoje vian crush ricevas tiun sekretan noton,
li aŭ ŝi devas tiam deĉifri ĝin ĝenerale dorsflankanta ke algoritmo
tiel kiel reiri al la simpla teksto.
Ekzistas fizikajn personigoj de ĉi.
>> Ekzemple, jen estas iom sekreta deĉifrilo ringo,
kaj ĉi tiu estas ringo en la senco ke ekzistas du diales tie.
Sur la ekstera periferio de tiu afero, estas literoj A tra Z,
kvankam ili estas en hazarda ordo,
kaj en la interno, estas fakte iuj nombroj
tia, ke kun tiu ĉi ringo povas ia turni la ekstera sed ne interne
por laŭliniigi nombroj kun literoj.
El filmo nomita A Christmas Story, vi vidos ke iom Ralphie
estis tiel avida por elkompreni kiel Little Orphan Annie la sekreta mesaĝo estis al li
kiu estis komunikita, mi kredas, en la formo de nombraj mesaĝojn sur cerealoj skatolo
kaj vi devis amasigi ĉiuj malgrandaj kartoj kiuj venis en la cerealo skatolo,
vi devis sendi ilin, vi devis reiri la sekreta deĉifrilo ringo
por ke vi povas finfine elkompreni kiel la surĵeto estas inter literoj kaj numeroj
aŭ literoj kaj literoj.
Kiel en komputilo ni povas iri apliki aŭ reprezentas aferojn tiel?
Ni bezonas maniero de esprimi nin iom pli flekse
ol nia variabloj tiel malproksime permesis.
Ni havis ints, ni havis signoj, ni havis flosas kaj duoblaj kaj kelkaj aliaj,
sed tiuj estas individuaj pecoj de memoro kiu ne vere nin permesas esprimi aferojn
kiel vortoj kaj frazoj kaj frazoj.
Ja, ni nomas tion kordoj,
sed ni promesas ke ĉi tio estas vere nur simpligo en la CS50 biblioteko
ke ni intencante senŝeligi dorso.
Kaj tial ni komencu fari tion tie ĉi.
Lasu min kaj malfermu dosieron -
ĉiuj el tiuj dosieroj estas disponeblaj, kiel kutime, en linio - nomita array.c
al solvi problemo nerilataj al kordoj sed tio pentras portreton tie
pri kiel ni povus uzi iun nomita tabelo.
>> Tabelo estas datumtipo.
Ĝi estas tipo de variablo de varoj kiuj havas multnombraj pli malgrandaj datumtipoj ene de ĝi
malantaŭo al malantaŭo al malantaŭo al malantaŭo.
Do ekzemple, se ni volis skribi iom programo kiu donas al vi viajn kvizo averaĝa
por kurso kiel 50 kiu havas 2 kvizoj,
vi povus tre facile skribi ĉi programo bazita eĉ en iuj de la pasinta semajno materialo
uzante GetInt kaj paro de variabloj: int quiz1, int quiz2.
Kaj estas bela simpla.
Estas eble 10, 20 linioj de kodo max apliki programon
kiu petas la uzanton dum 2 kvizo partituroj kaj tiam komputas ilia averaĝa
per aldono ilin kune, dividanta per 2, kaj tiam presi la rezultojn.
Ni povus probable faras tion sufiĉe facile nun post iu kvanto de minutoj.
Sed la problemo estas ke supozu ke la 50 havis 3 kvizojn aŭ 4.
Supozu ke vi volis uzi la saman programon por klaso kiu havis semajna Quizzes.
Pensu pri klaso kiu ĉiusemajne kvizojn.
Se estas 16 aŭ pli semajnoj en semestro, nun vi havas 16 variabloj:
int quiz1, int quiz2, int quiz3, int quiz4.
Tuj kiam oni komencas vidi ĉi redundo, ĉi kopii kaj bati de kodo,
ĝi devus komenci fari vi deziras, ke estis iam pli bona vojo.
Kaj dankeme, pro tabeloj ekzistas. Do ni faru ĉi.
Unue, lasu min enkonduki tre simpla afero, ke ni ne uzas tiel malproksime,
sed vi vidos ĝin foje en kodo.
>> Tio estas kio ĝenerale nomis konstanto.
Do ĝi estas konstanto en la senco ke ĉi tiu valoro neniam ŝanĝas.
La homa konvencio kiam kreante konstantan
estas uzi cxiujn majusklojn nur por ke ĝi vere elstaras en via kodo,
kaj la speciala ŝlosilvorto ke vi uzas en C estas # difini.
Do ni diru # difini, tiam spaco, tiam la vorto, kiun vi volas uzi por la konstanta nomo
kaj tiam la valoro de la konstanta.
Rimarku ĉi estas malsama de asignanta ion al variablo.
Ne egalas subskribi, ne estas punktokomo.
Tio estas kio ĝenerale konata kiel antaŭtraktilo direktivo,
sed pli por ke alia tempo.
Por la momento, ĉi kreas _unchanging_ valoro nomis Testi
kies reala nombra valoro estas 2.
Do ajn vi vidas kvizojn, kvizojn, kvizojn laŭlonge de ĉi tiu dosiero,
tio estas nur la numero 2.
Se mi rigardas ĉefa nun, ni vidos kiel tio funkcias.
Unue ĝi aspektas iom enigmaj, sed estas ĉiuj aĵoj de semajno 1.
Demandu la uzanto por notoj. Kiel ni faru tion?
En linio 22 - tiu ĉi estas vere la suka parto - mi deklaras kaleŝego
sed ne nur sola kaleŝego. Mi deklaras, pli ĝuste, tabelo de glitpunkta, glitkoma valoroj.
Ke variablo tuj nomos gradoj, kiel implicita tie,
sed la sola peco de nova sintakso tiam estas tiuj rektaj krampoj.
La fakto ke mi diris kaleŝego gradoj kaj poste malfermita krampo kaj poste numeron -
rimarki se ĉi estas konstanto ĉi estas kiel ni faris ĉi -
ĉi signifas, "Hej komputilo, donu al mi 2 flosas kaj ni kolektive nomas ilin notoj."
>> Ĉi tiu estas en kontrasto al multe pli teda proceso tiamaniere: float grade1;
flosi grade2; ks.
Do tabelo nin permesas apliki tiun ideon sed multe malpli messily,
en tia maniero, ke ni povas skribi 1 linio de kodo anstataŭ, ekzemple, 16 di 16-semajno semestro.
Mi ne volis malmola kodo 2 ĉar se vi pensas pri tiu nun logike,
supozi venontjare CS50 ŝanĝojn al 3 kvizojn anstataŭ
kaj mi havis la numero 2 tien, mi havis la numero 2 ĉi tie,
Mi havis la numero 2 tie, la numero 2 tie.
Ĝi iĝas tre teda kaj tre facile ŝraŭbo supren
kaj hazarde ŝanĝi 1 valoro al 3 kaj perdi iu alia valoro de 2.
Do mi tuj anstataŭ abstrakta ĉi for kaj uzi tiun konstantan ke,
kiel ĝia nomo sugestas, neniam ŝanĝas.
Kaj nun ne gravas ĉu ni havas malsamajn kvizojn ĉi tiu jaro aŭ apud,
Mi nur devas ŝanĝi ĝin en unu loko ĝis tie en supro.
Do jen ĉio konstanta estas.
Dume, la nova koncepta trajto estas tiu de tabelo.
Do la rektaj krampoj donu al mi ĉi tio multaj flosas kaj lasas min kolektive nomas ilin gradoj tie.
Do nun ni vidu kion mi faros.
Tie en linio 24 estas la komenco de a por buklo.
>> Tiu estas vere nenio kaprico. Ĝi simple uzante kvizojn anstataŭ malmola-kodita nombro.
Sed estas nenio intelekte malsamaj tie pasintsemajne.
Tiu estas nur printf, do printf ("Kvizo #% d de% d:")
ĉar mi nur volas presi donu al mi kvizon numero 1 de 2 kaj tiam 2 de 2.
Do ĉi tiu estas pure estetika afero.
Sed la interesa parto nun estas en linio 27.
Por plenigi unu el la du anstataŭiloj kun flosanta punkto valoro,
vi denove uzos kvadrataj krampoj.
En ĉi tiu kazo, Mi uzas i ĉar ĉi por buklo komencis kun i egalante kio valoro, ŝajne?
[Studento] 0. >> [Malan] 0.
Do en la unua ripeto de ĉi maŝo, estas kvazaŭ mi skribis tion en kodo,
sed en la dua iteracio de ĉi maŝo, estas kvazaŭ mi skribis tion en mia kodo.
Sed la fakto, ke Mi uzas variablo estas perfekta ĉar, kiel la nomo sugestas,
ĝi estas varianta ĝia valoro en ĉiu ripeto,
tial Mi plenigi tiun tabelo unu loko samtempe.
Kion tio tabelo aspektas?
La kialo mi tiris la super simpla rektangulo sur la ekrano tie antaŭe estis por tiu kialo.
Tabelo estas nur eron de memoro sekvita de alia bloko de memoro
sekvata de alia bloko de memoro kaj tiel plu.
Do, se miaj tabelo estas de amplekso 2 en ĉi tiu kazo tie, ĉiuj mi farus
tajpante en mia kvizo partituroj like tie - mi atingis 100 sur ĉi tiu kaj tiam mi ricevis 99 en ĉi tiu -
tiam ĉi memoro povus eĉ esti uzata ĉar mi nur demandis la komputilo
por tabelo de amplekso 2.
Tiuj kvadratoj estas ankoraŭ tie, ĉu ne?
Vi ankoraŭ havas 2 gigabajtoj de RAM eĉ se vi nur petante 2 flosas.
Do la ideo malantaŭ tabeloj estas ke la komputilo nur prenas eron de memoro
kaj tiam apportions malgrandaj pecoj malantaŭo al malantaŭo al malantaŭo al malantaŭo.
Kaj por ke ĉio tabelo estas.
>> Ĝi estas bela eron de memoro ene de kiuj vi povas meti tion.
Ĉi tio okazas al tiam faru nur iuj enuigaj aritmetiko.
Se mi rulumu malsupren tie, ĉi tiu estas kie mi tiam ankaŭ persisti super la tabelo.
Mi venis kun la sumado de ĉiuj el la valoroj en la tabelo,
kaj tiam mi uzas la ronda funkcio ĉi tie por reale fari la sumo dividita per kvizoj.
Sed lasu min skuos mian manon en tiu kiel speco de sufiĉe aritmetiko por nun.
Sed ĉiuj ke tio faras por mi finfine estas komputanta kun mezala.
Do unue kvizo plus dua kvizo dividita per 2 kaj poste presi ĝin kiel int.
Sed estu la nun transiro al malsama ekzemple nomita string1,
kiu pentras similan bildon sed uzante ŝnurojn.
Lasu min kaj simpligi ĉi por nur momento.
Pardonu la deŝovon por nun.
Avizo en linio 19 de ĉi tiu ekzemplo, mi alvenas ĉenon de la uzanto.
Sed rimarki kion mi sekva faras en linioj 22 antaŭen.
Mi vere ripetanta el i supren al - kaj ĉi estas nova lertaĵo - strlen, kordoj longa.
Tiu estas funkcio kiu venas kun C ke se vi pasas ĝin ĉenon,
rakontas al vi kiom da karakteroj estas en tiu linio. Tio estas ĉio.
Kaj la fakto ke ĝi estas strlen anstataŭ ĉenon longo estas nur ĉar ĝi estas pli konciza.
Tridek jarojn, homo ŝatis skribi aĵojn kiel koncize kiom eblas,
do ni tenis ke konvencion tie.
i + + nur signifas pliigo i en ĉiu ripeto.
Kaj nun rimarkis tion, kio estas vere interesa.
En linio 24, mi diras, "Komputilo, donu al mi karaktero, 8 bitoj, kaj nomas ĝin c".
Sed kio estas tio sur la dekstra flanko dirante?
En la angla, kio faras ke reprezenti?
[Studento] La unua signo en la tabelo.
Ekzakte. Donu al mi la unua gravulo en la tabelo.
Aŭ, pli ĝenerale, donu al mi la th,-a signo en la tabelo.
Kaj realigi gravas nun ke kiel komputilo sciencistoj,
ni vere rakontante de 0.
>> Vi ne havas la bontrovo nun komenci fari ĉi tion.
Vi nun devas konduti konforme al la komputilo atendoj kaj kalkulu de 0
ĉar [0] tuj estos la unua gravulo en ĉeno,
[1] tuj estos la dua, [2] tuj estos la tria, kaj tiel plu.
Do ĉi tiu programo, se mi kompili ĝin, tiu estas denove string1, do fari string1,
kaj nun mi kuros string1 en mia fina fenestro.
Oni atendas enigo, do mi tuj tajpi en David, Enter,
kaj nun presas Davido ĉiuj en malsamaj linioj ĉar avizo kion mi faras.
Mi presi unu signo samtempe.
Ni ne eniros en detalo hodiaŭ en ĉi tio, sed mi forviŝita antaŭ momento ĉi ĉeko tie.
Rezultas, ke se la uzanto estas misbehaving, adversarial, aŭ nur konfuzita,
vi povas reale malsukcesas doni ĉenon de iu longa.
Se vi batis la malĝustan klavon sur la klavaro, vi eble ne donu ŝnuro tute ne,
aŭ se vi estas malica, eble vi provu almeti en gigabajto la valoron de eseo
plenigi ĉi ŝnuro, kaj se la komputilo funkcias el memoro,
ĝi rezultas ke ni tuj reiri tiu speciala valoro nomis NULL.
Do nuntempe, nur scias, ke tie estas tio specialan valoron nomis NULL
ke ni permesos kontroli kiam ni estas el memoro, inter aliaj aferoj.
Sed se mi malfermas nun string2, rimarkos unu diferenco ĉi tie.
Rimarku unu diferenco tie kun string2.
Kun string2, ĉi por buklo estas iom malsama.
>> Lasu min forigi la NULLs tiel ke ni povas paroli pri tiuj alia tempo.
Kio estas malsama pri la por buklo tiu tempo?
Mi povas reiri al la antaŭa ekzemplo.
Do jen la versio 2, ĉi tiu estas versio 1. 1, 2.
1, 2.
La strlen alvoko estas kie?
Ĝi estas en la unua parto de la por buklo.
Ajna pensojn sur kial mi faras tion? Yeah.
[Studento] Do vi ne nomas la funkcion ĉiu unuopa tempo.
[Malan] Do ni ne nomas la funkcion ĉiu unuopa tempo. Ekzakte.
Memori el por maŝojn kiuj ili estas super simpla
iam vi ia kompreni ke tiu estas la inicialización, la kondiĉo, kaj la ĝisdatigon.
La problemo estas, ke la kondiĉo okazas en ĉiu ripeto de la ciklo.
Kaj tial en ĉi tiu ekzemplo tie, kio estas malbona pri la fakto ke ĉi tiu estas mia kondiĉo?
[Studento] Vi nomas strlen.
[Malan] Vi nomas strlen denove kaj denove kaj denove.
Sed iam mi tajpis en David, la longo de tiu linio estas 5,
kaj tio ne iras por ŝanĝi en ĉiu ripeto de la ciklo
ĉar la ŝnuro estas ankoraŭ D-a-v-i-d.
Do ĉi tiu estas aludo al kio okazos al ĉiufoje grava ideo
konata kiel dezajno decido kie nur ne faras la komputilo faras nenecesa laboro.
>> Ĝuste kiel sneak preview de pset2, pset2 en la normo eldono
tuj defias vin al reale efektivigi iujn numero de ĉifroj,
iu nombro de ĉifrado algoritmoj, tiel ke vi povas ambaŭ ĉifri
kaj deĉifri sekretajn mesaĝojn multe kiel la Ralphie tie malkoditaj.
En la hacker eldono de pset2, ni tuj iru iom pli.
Ni tuj transdonos vin dosiero de reala komputilo sistemo
kiu enhavas tutan faskon da usernames kaj realaj ĉifrita pasvortoj,
kaj la defio por la hacker eldono tuj estos al fendi tiuj pasvortoj
kaj elkompreni kiel ĉifriko aŭ kio sekreta estis uzita por reale generi tiuj pasvortoj.
Kaj ni tuj faros ĉi uzante nova funkcio ĉi tie de C
ke mi donos al vi nur la demo de konata kiel komando-linia argumentoj.
Rezultas, kiel kelkaj el vi eble vidis en sekcio aŭ en lernolibroj,
ĉefa ne ĉiam devas esti malplena en krampoj.
Ĝi rezultas ke ĉefa povas ankaŭ esti skribita kiel ĉi tiu, kun du argumentoj,
argc kaj argv, kie argc estas la nombro de vortoj
ke vi entajpas post la programo la nomon en via komanda linio
kaj argv estas la reala vortoj.
Kaj kiel la rektaj krampoj tie sugestas, argv estas ŝajne tabelo.
Ĝi tuj estos ĉeno post ĉeno post ĉenon en memoro.
>> Do kion ni tuj povos fari ekde pset 2 estas io tiamaniere.
Se mi faras argv1, kiu estas ekzemplo ni revenos al lundon, kaj ruli ĝin,
rimarkas, ke ĝi ne similas al fari ion ankoraŭ.
Ĝi simple presas el lia propra nomo.
Sed se mi diras adiaŭ klaso, avertas ke ĉi tiu programo ŝajne iterates
super cxiu el la vortoj kiuj tajpis ĉe la prompto.
Kaj la rimedoj, per kiuj ni gajnos aliro al vortoj, ke la uzanto tajpas ĉe la prompto
estas ŝanĝante ĉefa ekde ĉi semajnfino de int main (void) al Mez ĉefa (argc, argv)
kaj tiel estos naskita komand-linio argumentoj.
Kaj iam vi ricevas vere kompleksa pro tio, vi povos skribi vere trippy programoj
kiel ĉi tiu tie, kiuj iras super kaj trans
kelkaj el la funkcioj ni faris ĝis nun sed ĉiuj sufiĉe potencaj.
>> Do ni lasos tion kun tiu en la ekrano, kaj ni vidos vin lunde.
>> [CS50.TV]