[Powered by Google Translate] DAVID J. Malan: Molt bé.
Això és CS50, i aquest és el final de la segona setmana.
Si vostè espera a tenir gana voltant d'aquesta hora matí, sé que
que convoqui un petit grup de matí, dijous, 1:15 PM.
Hi ha un URL aquí si voleu confirmar la seva assistència.
L'espai és limitat, així que si us plau, perdoneu si el formulari s'ha omplert fins al moment en què
omplir això.
Una altra URL però, que pot ser d'interès és la següent.
>> Així que en gairebé un mes, el curs es posarà a disposició
tant més àmpliament a través de EDX, a través del qual la gent a l'Internet serà
capaç de seguir endavant, participar en el curs molt activament, de fet.
Es va a utilitzar l'aparell CS50 CS50 i discutir i la major part del
diverses eines de programari que ja han estat usant aquest semestre.
I una de les iniciatives que ens agradaria prendre com un experiment d'aquest any
és veure fins a quin punt el contingut que es pot traduir en un altre parlada i
llengües escrites.
Així que si vostè podria tenir interès a participar en aquest projecte, en el qual
oferirem transcripcions en anglès i subtítols en el curs de
conferències i pantalons curts i seminaris i seccions i similars -
si vostè parla amb fluïdesa i escriure amb fluïdesa un altre idioma, ho faríem
encantaria participar en aquest projecte, el qual et portarà a una o més de les
vídeos, traduint-los en una llengua que conec bastant bé.
Perquè us feu una idea de la interfície, hi ha una interfície d'usuari basada en web
que utilitzarem, que crearà essencialment una interfície d'usuari d'aquesta manera.
Això m'estava ensenyant alguns Halloween enrere.
I al costat dret hi ha en negre al costat d'aquestes marques de temps,
podràs veure les diverses coses que van sortir de la meva boca aquest dia.
I després, per sota d'ell, vostè serà capaç de traduir a un altre idioma.
Exactament el que el mapeig és entre, en aquest cas, Anglès
i, per exemple, l'espanyol.
Així que en realitat és un molt fàcil d'utilitzar eina.
Pot rebobinar i avanç ràpid molt fàcilment amb el teclat.
Així que si vol participar en aquest experiment i que les seves paraules
vist i llegit per milers de potencials persones per aquí, si us plau, em sento
llibertat de participar.
>> Ara una paraula sobre el gatet de dilluns, perquè no ens han enviat un excés
missatge de por.
S'adonen que a mesura que les hores d'oficina i com suggereixen les seccions suggereixen, la
disseny del curs és molt perquè els estudiants i col · laborar
parlant de treballar a través dels butlletins de problemes i problemes junts.
I realment la línia només es redueix a, una vegada més, el treball que en última instància
han de presentar ha de ser la seva.
I el que és, amb tota honestedat - en horari d'oficina, és totalment normal -
que està totalment d'esperar, fins i tot - a estar xatejant amb alguns
amics al teu costat.
Si ell o ella està lluitant amb algun tema, i vostè és com, oh, bé anem
vaig a donar una idea d'alguna línia de codi que he escrit.
Això està bé.
Això succeeix.
I això és molt favorable, crec que, amb el procés d'aprenentatge.
Quan la línia, de nou, es creua és quan el cap és de tipus inclinat sobre
aquí durant uns segons massa o minuts perquè realment tingui només
estat una oportunitat de desbloqueig per al seu amic.
I certament, quan les coses s'intercanvien a través de correu electrònic i Dropbox i
similars, allà també hi ha la línia.
Així que per tots els mitjans, se sentin còmodes i se senten animats a xerrar amb els amics
i companys sobre conjunts de processadors i més.
I només s'adonen que el que en última instància, sotmetre hauria de ser el
producte de la seva creació i no una altra persona.
>> Així doncs, en la mateixa línia de adorables criatures, és possible que
saben d'aquest tipus aquí.
Així que aquesta és una pel · lícula terriblement cursi d'anys enrere.
Hi ha algú aquí Spaceballs vist?
Està bé.
Així que un bon nombre aquí.
Així que aquesta és la nostra manera meravellosament acadèmic d'introduir avui en última instància,
el concepte de criptografia.
I així un dels problemes específics de domini per a conjunt de processadors 2, que entrarà
demà a la nit tarda, és submergir-se en el món de la criptografia, que
és l'art de xifrar o codificar informació.
I en última instància, es relaciona amb el món de la seguretat.
>> Ara la seguretat per a la majoria de nosaltres es presenta en forma de mecanismes bastant mundanes.
Tots nosaltres tenim noms d'usuari i contrasenyes.
I tots tenim noms d'usuari i contrasenyes molt dolents, molt probablement.
Si la contrasenya és la mateixa en diversos llocs web, que probablement no és
la millor idea, com veurem cap al final del semestre.
Si la contrasenya s'escriu en una nota adhesiva - no és broma - en el seu
monitor, que tampoc és necessàriament el millor disseny, però bastant comú una
fenomen.
I si vostè no està utilitzant la criptografia per xifrar les contrasenyes, que són
especialment vulnerables.
Així que si vostè pensa que està sent súper intel · ligent per tenir una paraula oculta
documentar en algun lloc del seu disc dur que té totes les seves contrasenyes però
que està en una carpeta que ningú mirarà endins, això també no és molt
mecanisme d'assegurança.
I així ho pset 2 presentaré és aquest art de la criptografia i
lluitant informació perquè coses com les contrasenyes
tant més segura.
Per tal de motivar aquest problema molt real amb un molt no-real-world
escenari, permetin-me presentar a un dels nostres clips favorits aquí en aquest
pel · lícula Spaceballs.
>> [REPRODUCCIÓ DE VÍDEO]
-Casc, vostè dimoni, què està passant?
Què estàs fent amb la meva filla?
-Permeteu-me introduir el cirurgià plàstic brillant jove, el Dr Philip
Schlotkin, el més gran home nas d'ocupació en tota la
univers i Beverly Hills.
-Sa Altesa.
-Nas treball?
No entenc.
Ella ja ha tingut una cirurgia de nas.
Era un dolç 16 presents.
-No, no és el que vostè pensa.
És molt, molt pitjor.
Si no em donen la combinació de la protecció de l'aire, el Dr Schlotkin voluntat
donar a la seva filla de tornada a la seva antiga nas.
-No!
D'on vas treure això?
-Molt bé.
L'hi diré.
-No, pare, no.
No has de fer-ho.
-Tens raó, estimada.
Vaig a estranyar la seva nova nas.
Però no vaig a dir-los la combinació no importa què.
-Molt bé.
Dr Schlotkin, fes el que vulguis.
-És un plaer.
-No!
Espera, espera.
L'hi diré.
-Jo sabia que anava a funcionar.
D'acord, m'ho dóna.
-La combinació és un.
-One.
-Dos.
-Tres
-Tres.
-Quatre.
-Five
-Cinc.
-Així que la combinació és un, dos, tres, quatre, cinc.
Això és el més estúpid combinació que he sentit en la meva vida.
Aquesta és la classe de cosa que un idiota podria tenir en el seu equipatge.
-Gràcies, Sa Altesa.
-El vas fer?
-Vaig apagar la paret.
-No, no ho vas fer.
Es va apagar la pel · lícula sencera.
-Dec haver premut el botó equivocat.
-Bé, el va posar de nou.
Col loqueu la pel · lícula de nou.
-Sí, senyor.
Sí, senyor.
-Anem, Erna.
Vine, Gretchen.
Per descomptat que sé que encara haurem de cobrar per això.
-Bé, ¿funciona?
On és la porta?
-Va funcionar, senyor.
Tenim la combinació.
-Gran.
Ara podem prendre cada últim alè d'aire fresc del planeta Druidia.
Quina és la combinació?
-Un, dos, tres, quatre, cinc.
-Un, dos, tres, quatre, cinc?
-Sí.
-Això és increïble.
Tinc la mateixa combinació en el meu equipatge.
Preparar SpaceBall 1 per sortida immediata.
-Sí, senyor.
-I canviar la combinació en el meu equipatge.
-Ai!
[FI DE REPRODUCCIÓ DE VÍDEO]
>> DAVID J. Malan: Una pel · lícula increïble que ara tots han de veure.
Així el context aquí és que amb les dades insegurs ve una oportunitat per
xifrar i per enfilar.
I pel que aquest, per exemple, és un exemple d'un missatge xifrat.
En realitat, això diu alguna cosa en anglès.
Però és evident que no és totalment obvi.
I anem a arribar al punt de partida avui a esmicolar el que aquest secret
missatge aquí és.
Però en el món real de les computadores, les coses no semblen que fins i tot podria
ser frases en anglès.
Per exemple, això és el que pots trobar en un sistema Linux o Mac estàndard o
Unix ordinador en un arxiu que va ser en un altre temps anomenat l'arxiu de contrasenyes.
Avui en dia, s'ha traslladat a altres llocs.
Però si ens fixem en el lloc correcte en un sistema, podràs veure no només la seva
nom d'usuari o la d'altres persones en el sistema, però veuràs un
versió encriptada de la seva contrasenya.
En efecte, la cripta hi ha paraula suggereix que les coses estan xifrats.
I aquesta sèrie de lletres aparentment a l'atzar i caràcters i nombres i
etc pot ser desxifrat en general només saber un secret -
una paraula secreta, un número secret.
I així, en efecte, l'art de la criptografia en última instància es redueix a la confiança d'alguns
classe i saber alguna cosa que ningú més ho fa.
Anem a estudiar això amb més detall una mica més avui i en el conjunt de processadors per venir.
>> I ara una paraula sobrepassa / falla.
Per tant, i com alguns de vosaltres heu bussejat en conjunt de processadors 1, l'aparell, i
un món molt nou per a vostè, es va adonar que les frustracions i
confusió i dificultats tècniques només són d'esperar.
Especialment amb el conjunt de processadors en primer lloc, on hi ha tantes coses noves, només aconseguir
familiaritzats amb ls i cd i tots aquests comandaments arcans en un nou entorn.
I que és separat del material real i programació en si.
Així donen compte, també, que sens dubte hi ha horari d'oficina que hi ha com
l'estructura de suport.
Seccions començarà diumenge que ve.
Però el més important, si et sents sol que aquest no és el
món per a tu, tingueu en compte que en realitat es limita a prendre temps.
I si no fos per aquesta oportunitat fa anys per a mi de prendre una classe
passa / no passa, la veritat, mai m'hauria posat un peu a l'aula.
I vostè pot canviar això per amunt fins, diguem, el cinquè dilluns del curs.
Així que si vostè està a la vora ara, adonar-se que en lloc de cap a algun altre
aigües en conjunt, no certament en compte només canviar per passar / fallar.
Un cop més, no hi ha realment aquesta cultura aquí a Harvard de prendre les coses
passa / no passa ja que tothom vol aconseguir o escreix.
Però, francament, aquesta és una meravellosa manera de provar una cosa que potser no
ser familiar per a vostè.
I vostè va a acabar fent en la majoria dels casos molt fines, potser
molt a la seva sorpresa.
I en termes més concrets, el que crec que passa / no passa generalment ho fa,
especialment en el que podria haver experimentat amb conjunt de processadors 0, si vostè ha posat
en 10 hores, 15 hores, 25 hores en algun conjunt de processadors - i no ets més que colpejar
el cap contra la paret,
i s'està fent super tard a la nit,
però que ha pres el conjunt de processadors com el 90% del camí,
vostè sap que vostè no pot entendre una cosa -
passa / no passa realment pren la vora d'una classe com aquesta, on es pot ordenar
feliç de dir molt bé, ja sé que no és perfecte.
Però vaig treballar el meu cul en això.
Estic bastant content amb el lloc on va acabar.
I que compleixi amb les expectatives de passa / no passa.
Així que tingues-ho en compte.
>> Està bé.
Així que aquells de vostès que han tingut dificultats per utilitzar la Universitat de Harvard Wi-Fi saber
que hi ha un SSID CS50, una connexió Wi-Fi flotant voltant que
podria tenir millor sort per.
És una mica irònic que la clau per això - si vol provar
connecti a aquest per obtenir millors velocitats i faci'ns saber si no és millor -
és un, dos, tres, quatre, cinc, tot el camí fins a vuit perquè vuit és
més segur que cinc.
Així que si vostè necessita la contrasenya de Wi-Fi, Wi-CS50 aquí.
Un, dos, tres, quatre, cinc, sis, set, vuit.
I missatge el CS50 Parli si vostè encara té problemes de connectivitat intermitent,
i deixarem que els poders que es coneixen per aquest espai.
>> Està bé.
Així que un reclam ràpid, especialment per a aquells de vostès que són nois o noies fans
de totes les coses d'Apple.
El que desenterrat de fa uns anys era aquest arxiu aquí, ilock.c, només per
tipus de fer més concret i més complexes alguns dels més bàsic C
programes que hem estat escrivint.
Així que vaig obrir aquest arxiu, ilock.c.
Està disponible a la pàgina de conferències per avui.
Pel costat de l'esquerra, es veu una llarga llista de funcions.
Així que el tipus que va escriure això va escriure una gran quantitat de funcions,
més que simplement principal.
Ell va utilitzar una gran quantitat de biblioteques aquí.
I si comencem a desplaçar-se a través de, el que això realment és, és el mateix
En primer lloc, crec jo, per trencar l'iPhone original.
Quan es volia fer jailbreak a l'iPhone original, el que significa desnuar
el d'AT & T i en realitat instal · lar programari especial en ell i fer coses
que Apple no vol que la gent a fer -
Bé, algú es va prendre el temps per esbrinar exactament com podrien explotar
defectes de programari, errors, errors, en el programari d'Apple.
I així va néixer ilock.c.
Que si ho recopilar en un ordinador i instal · lat en un iPhone
Es connecta al seu ordinador a través de, per exemple, un cable USB, això li donaria
privilegis d'administrador o root al teu iPhone i et fan més o menys
el que vulguis.
>> I així ha estat aquest fascinant gat i la rata entre Apple i
la resta del món, en particular pel que, igual que moltes empreses, tracten de bloquejar
les seves coses a baix de manera que només es pot fer amb ella el que tenia planejat.
Però gràcies a gent com aquesta i la seva comprensió de baix nivell
informació i, en aquest cas, de programació C i un munt de les construccions familiars
que hem començat a jugar, vostè pot realment aprofitar el
maquinari d'una manera millor li sembli i no necessàriament una entitat corporativa.
Així, per exemple, no tinc ni idea del que tot això està fent.
Però GetVersion sona bastant senzill.
I sembla que aquesta és una funció que aquesta persona va escriure.
Prengui algun tipus de nombre enter com a argument, no torna res, però
sembla bucle amb un bucle aquí i si una condició, si la condició,
trencar, i d'alguna manera es relaciona amb el nombre de versió.
Si ens desplacem cap avall -
tot i que moltes d'aquestes paraules clau es serà nou, i hi ha un
gran quantitat de funcions en aquí mai hem vist i no podrien mai veure més
el transcurs del semestre -
al final de la dia, segueix les mateixes regles i la lògica que hem estat
jugant amb fins ara.
Així que això és massa vell per trencar les seves 3s 4s iPhone o 5 anys o abans, en aquests dies,
però sàpiguen que tot es deriva en gran mesura d'aquest món que hem
es va capbussar en.
>> Així que donem una ullada a un petit exemple més simple.
Aquest, només per escalfar amb una mica de sintaxi i també algunes altres dades
tipus que hem parlat, però no han vist realment en C. Per tant aquesta és una
arxiu anomenat positive1.c.
I pels comentaris a la part superior, això només exigeix ​​que un usuari proporcioni una
nombre positiu.
Així que és un exemple d'un bucle do-while, que és agradable per a l'usuari interactiu
programes en què vostè necessita per avisar a l'usuari que faci alguna cosa.
I si ells no cooperen, els crides o rebutjar la seva entrada.
El cas en qüestió, faré les línies 19 a 24, sempre que l'usuari té
No m'ha donat un nombre positiu.
Ara bé, aquest detall aquí a la línia 18, per què jo declare n per sobre d'aquest conjunt
construcció de bucle en lloc de al costat de la línia 22 en què
realment importa per obtenir n?
Sí?
[Inaudible]
>> DAVID J. Malan: Sí, pel que aquest problema d'abast.
I, en termes senzills, quin abast es refereix?
Sí?
[Inaudible]
DAVID J. Malan: Pots parlar una mica més alt?
Ponència 1: On es pot accedir a una variable en particular.
DAVID J. Malan: Perfect.
On es pot accedir a una variable en particular.
I, en general, la regla general fins ara ha estat que l'abast d'algunes
variable es defineix per les claus més recents que he vist.
I així, en aquest cas, si he comès l'error de declarar n en la línia 22,
que la línia havia de funcionar.
M'agradaria aconseguir un int, de manera que el posa en aquesta variable n en la línia 22.
Però quina línia de codi ara no tindria ni idea del que estic parlant?
Així que 25, i resulta que 24, així, perquè en aquest cas, queda fora
de les claus.
Així que una mica d'una molèstia, però molt fàcil de resoldre simplement declarant
la variable fora de la funció.
>> Ara veurem el dia d'avui, es pot anar un pas més enllà.
I fins i tot pot resultar una mica mandrós -
i això no és el recomanat, en general -
sinó que fins i tot podria donar-te mandra i posar una variable a nivell mundial, per dir-ho, no
interior d'una funció, no a l'interior d'un bucle, però al mateix arxiu, fora
de totes les funcions que vostè ha escrit, com ho vaig fer aquí a la línia 15.
Però això és generalment mal vist.
També has de saber això de vegades és una solució a altres problemes, com veurem
finalment veure.
Així que per ara, anem a deixar-ho així.
Però anem a veure si podem tornar a escriure això per iniciar una expressar
poc diferent.
>> Així que aquest programa, només perquè quedi clar, és positive1.
Deixa anar per davant aquí i al meu finestra de terminal fer positive1, Enter.
Compila, està bé.
Vaig a córrer positive1, premeu Enter.
Exigeixo que em donis un enter positiu.
Diré -1.
Això no va funcionar.
0, 99, que sembla funcionar.
Potser no és la prova més rigorosa.
Però almenys és una prova de seny agradable que estem en el camí correcte.
Així que ara seguirem endavant i obrir la segona versió d'aquest.
I el que és diferent ja?
S'implementa la mateixa cosa.
Però el que està saltant com clarament diferent aquesta vegada?
Sí, per la qual cosa aquest bool en verd.
Gedit ha ressaltat en verd aquesta paraula clau denominada bool,
que és un tipus de dades.
No ve integrat en totes les versions de C. Cal incloure una
biblioteca específica.
En el nostre cas, que inclou la biblioteca CS50 perquè ens
tenen accés a bool.
No obstant això, en la línia 18, sembla que tenim un valor booleà anomenat aquí agraïts.
Així que podria haver cridat a aquesta cosa.
Però em va trucar agraït només per transmetre algun tipus de significat semàntic.
Així que al principi de la línia 18, no estic agraït pel que sembla pel fet que el
Valor agraït Boolean s'inicialitza a false a la línia 18.
I llavors sembla que el que he fet aquí a les línies 21-23 s'acabo
tipus de reescriure la meva lògica.
Així que no funcionalment diferents.
No obstant això, en la línia 22 ara, puc comprovar si el int l'usuari ha proporcionat és més gran que
0, llavors simplement canviar el valor d'agrair a true.
I per què ho faig?
Com que en la línia 25, pel que sembla, vaig a comprovar una condició.
És aquest bucle while agraït és fals.
>> Així que proposo això com una alternativa a la versió un, perquè és almenys un
poc més intuïtiu, potser.
És una mica més a terra en anglès.
Així que faci el següent mentre no estàs agraït o agraïda mentre que és fals.
I aquest cop, també, pel que sembla, no m'importa recordar el que l'usuari va escriure
perquè en l'avís no hi ha n variables.
Així que en realitat, jo -
una petita mentida blanca allà.
Funcionalment, el programa és una mica diferent una vegada que arribem al fons de
perquè jo no estic acordant del que n és.
Però jo volia demostrar que també en aquest cas tot i que hem vist i getInt
GetString s'utilitza en el costat dret d'un signe d'igual manera que fins ara
recordem el valor, tècnicament, no és estrictament necessari.
Si per qualsevol raó vostè no els importa per guardar el valor, el que desitja
per comprovar el valor, observi que simplement podem escriure això com getInt obert
Parin, parin prop.
Aquesta funció tornarà un valor, com ho hem estat dient.
Se't va a tornar un int.
I així, si mentalment pensar que això passi, quan escric en 99, getInt
torna el número 99.
I així, conceptualment, és com si el meu codi eren en realitat això.
Així que si 99 és en realitat major que 0, llavors es converteix en veritat agraït.
Llavors es dóna compte de la línia 25 ooh, hem acabat perquè ara estic agraït.
I en la línia 26, simplement dir gràcies pel enter positiu, el que
va passar a ser.
>> Ara farem el sucre sintàctic lleu aquí, per dir-ho.
A veure si podem netejar aquesta línia 25 amb aquesta variació tercera i última
en positive3.
Així que notar que l'única diferència ara és quina línia de codi?
Sí, i 25.
I no hem vist realment aquest truc encara.
Però ens van fer veure el signe d'exclamació dilluns, el que denota què?
Així que no, o negació.
Així que pren un valor booleà i voltejar el seu valor.
Cert converteix en falsa.
Fals es fa realitat.
Així que això, proposo, és encara una mica més intuïtiu d'una manera de
poder programar perquè encara agraït inicialitzar en false.
Encara faig el següent.
Vaig posar agraït a true quan arribi el moment.
Però ara vostè pot realment traduir aquest codi només verbalment esquerra a dreta,
mentre no agraït.
A causa de bang, o signe d'exclamació, denota la noció de no, així que mentre
no gràcies.
>> Així que de nou, no hem introduït nous conceptes en si.
Hem parlat de booleans enrere quan juguem amb Scratch.
Però n'adono ara que acabem de començar a escriure el nostre codi en
moltes maneres diferents.
Per tant, i en pset1, si vostè és una espècie de lluita per descobrir la manera de
escriure algun programa, la Casa estàs de sort perquè no hi haurà cap
nombre de solucions que li poden succeir a.
Per exemple, això és només tres per fins i tot el més simple dels programes.
Està bé.
I ara recordo el dilluns, deixem en aquesta nota amb valors de retorn.
Així, per primera vegada, escrivim un programa que no només té principal,
també té la seva pròpia funció personalitzada que vaig escriure aquí.
Així, en la línia 31 a la 34, he implementat una funció de cub.
No és complex.
És que algunes vegades vegades i una, en aquest cas.
Però l'important d'això és que estic prenent d'entrada en forma d'una i
Vaig a tornar la sortida en forma de vegades i diverses vegades a.
>> Així que ara tinc la capacitat, tant com solia fer-ho amb printf sol, per cridar
aquesta funció cridant a la funció de cub.
I la funció de cub té alguna entrada.
I la funció retorna un cub de sortida.
I així, per contra, printf acabo de fer alguna cosa.
No va tornar tot el que ens importava - tot i que, com
A part d'això, no torna cap valor.
Només generalment ho ignoren.
Printf acabo de fer alguna cosa.
Tenia un efecte secundari de la impressió a la pantalla.
Per contra aquí, tenim la funció de cub, que
en realitat torna alguna cosa.
>> Així que aquest és generalment -
per a aquells que estan familiaritzats amb això, és una idea bastant senzilla.
Però per a aquells menys familiaritzats amb la idea de passar en les entrades i obtenir
sortides posteriors, tractarem només una cosa simple super.
Hi ha algú que ve còmode a l'escenari breument?
Vostè ha d'estar còmode amb una càmera a vostè, també.
Si.
Bé, quin és el teu nom?
KEN: Ken.
DAVID J. Malan: Ken.
Molt bé, Ken.
Anem amunt.
Així Ken serà una funció de la classe aquí.
I seguirem endavant i fer això.
Anem una mica sofisticat.
Gust a conèixer-lo.
Benvingut al centre de l'escenari.
Està bé.
Anem a colpejar el botó aquí.
Està bé.
Així que aquí tens una pissarra moderna.
I el que jo sóc és la funció principal, per exemple.
I no tinc un iPad a la mà.
Jo no me'n recordo com - bé, en realitat, no puc dir això.
Jo realment no tinc bona lletra.
I per tant, vull imprimir alguna cosa a la pantalla per a mi.
>> Així que estic sent el programa principal.
I li diré que tens això escrivint en el meu gargots i
llavors el pas d'una entrada.
Així com ximple encara que aquest exercici és, la noció de funcions i trucar a un
funció i retorna una funció realment es redueix a això.
Estic principal.
Acabo d'escriure printf ("alguna cosa") a la pantalla.
Estic executant aquest programa.
I tan bon punt es diu a printf, pren un argument - o un paràmetre,
de vegades -
entre cometes dobles.
Aquí està l'argument.
Ho estic passant a Ken.
Ara ell és un quadre negre escrit un nombre d'anys que pel que sembla
només sap imprimir coses a la pantalla.
>> Per tant, executar.
Això no és dolent.
Així, molt bé.
Així que ara es porta a terme l'execució de Ken.
Ha de donar-me res a canvi?
Així que el que hem vist fins ara.
Un cop més, és en realitat printf torna un nombre.
Però anem a ignorar que, per ara, perquè mai he fet servir.
Així que això és tot per Ken.
I ara principal torna a executar -
principal pren el control de nou el programa perquè aquesta línia de codi,
printf, es porta a terme l'execució.
I que avancem en el nostre camí execució de qualsevol altres línies hi són.
>> Està bé.
Així que ara anem a provar un exemple una mica diferent.
I aquest cop aquí, es va a esborrar la pantalla aquí.
I aquesta vegada, anem a fer la funció de mesurament de volum.
Però aquesta vegada, espero que un valor de sortida.
Així que seguirem endavant i fer-ho.
Així que ara tinc una línia de codi que diu que x = cub (x).
Així que en realitat let 's -
la línia de codi, el record, es veu així.
x = cub (x).
Llavors, com es va a treballar?
Així que seguirem endavant i donar-li una pantalla en blanc de nou.
I jo vaig a escriure ara pel valor de x, que en aquest moment de
temps passa a ser, diguem, 2, perquè sigui senzill.
Així que he escrit en un tros de paper el valor de 2,
com és el meu valor x.
L'hi dono a Ken.
KEN: I acabo d'escriure la resposta?
DAVID J. Malan: Sí, anem a escriure la resposta.
Bé.
I ara m'ha de retornar alguna cosa.
Per tant -
perfecte.
Niça segue.
>> Així que ara em passa de nou el valor de 8, en aquest cas.
I què faig amb ell?
Bé, en realitat, veurem.
Obtenir aquest dret.
Què faré amb ell?
Ara em vaig a prendre aquest valor i en realitat el guardi en els
mateixos bits en la memòria.
Però noti, jo sóc una mena de lluita aquí.
Estic una mica confós perquè on puc realment escriure el valor de x?
Perquè el que acabes de fer és físicament Ken mà un full de paper
que tenia el valor 2, que era x.
I de fet, això és precisament el que succeeix.
Així que resulta que quan es crida a una funció, i se li passa un argument
com "hola món" o se li passa un argument com el 2, en general, està
passant una còpia d'aquest argument.
I així com jo vaig anotar el número 2 aquí i l'hi va donar a Ken, que ha
vol dir que encara tinc una còpia del valor 2 en algun lloc.
Perquè en realitat, ara que ho he aconseguit tornar el valor 8, he de tornar enrere en el
RAM i realment anotar 8, on una vegada vaig tenir el número 2.
>> Així que recorda visualment aquesta idea de passar literalment a
una còpia del valor.
Ken fa les seves coses, em fa una mica de volta - en aquest cas,
un valor com 8.
I llavors he de fer alguna cosa amb aquest valor si
volen mantenir aquí.
Així que tot això serà molt familiar d'aquí a poc.
Moltes gràcies per aquesta demostració aquí, Ken.
Està bé.
Molt ben fet.
Així que anem a veure la forma en què en última instància es refereix a algunes de les funcions
demanant que hem estat fent aquí.
Així que permetin-me anar per davant i ens porti de nou a l'exemple cubicació aquí.
I noti que si volem realment començar a prendre aquest més futur, anem
a haver de tenir en compte el fet que el nombre x que està sent aprovada en
aquí és diferent del que realment està passant en la funció.
Així que de nou, això passa per la còpia serà molt
germànic en un moment.
>> Així que anem a fer una ullada a alguna cosa que no acaba de funcionar bé encara.
Vaig a seguir endavant i obrir un exemple calessa tercer, que
pateix de la naturalesa.
I es diu buggy3, i implementa una funció d'intercanvi.
Així que aquí tenim una funció principal que ha xiy arbitràriament inicialitza
1 i 2, respectivament.
Podríem utilitzar getInt, però només necessitem un exercici simple.
Així que és codificada com 1 i 2.
En les línies 21 i 22, que pel que sembla imprimir x i i, un per línia.
Després, en la línia 23, sostinc que estic canviant aquests valors, punt, punt, punt.
Em aparentment cridar a una funció en la línia 24 diu intercanvi
que pren dos arguments.
És totalment legítim per les funcions de prendre dos arguments.
Hem vist printf fer-ho ja.
Així intercanvi aparentment presa x i i.
I com el seu nom ho indica, és d'esperar que serà
intercanviar aquests dos valors.
Així que em diuen en la línia 25, intercanvien.
I reimprimir x i i sota el supòsit que
que han estat efectivament intercanviats.
Però si realment executar aquest programa -
m'ho dius a mi obrir una finestra de terminal.
Permetin-me fer buggy3.
Com el seu nom ho indica, això no acabarà bé.
Perquè quan premeu la tecla Enter, cal notar que x és 1.
i és 2.
I no obstant això, al final del programa, que encara hi són, de fet, el mateix.
>> Així que basat en la demostració acaba amb Ken, el que realment està passant?
Bé, anem a aprofundir en aquesta funció swap.
És súper curt.
No és més que unes poques línies de codi de temps.
Però quin és el problema fonamental que s'ha de basar en la simple història li va dir a
aquí amb Ken?
Per què el canvi d'trenca?
[Inaudible]
Exactament.
Així que estem a guardar una còpia, no la variable en si.
En altres paraules, d'intercanvi aparentment pren dos arguments, un int.
I està cridat arbitràriament a i b.
I fins aquí, he passat a x i i, que són, respectivament, 1 i 2.
Però no estic literalment passant x.
No estic literalment passant a i.
Estic passant una còpia de x i una còpia de i.
És com gairebé com si ha copiat i enganxat en intercanviar els valors que
desitja que es manipulen en realitat.
Així que si aquest és el cas, quan jo, el programa començarà a executar
la línia 35, després 36 -
quan arribi a la línia 37, en aquest moment de la història, quin és el valor de a?
En aquest punt de la història, línia 37, quin és el valor d'una en aquest moment?
Per tant, només ha de ser 1.
¿És cert?
Com x es passa com a primer argument.
I aquesta funció només arbitràriament es diu el seu primer argument, a.
De la mateixa manera és i, el segon argument.
I és just cridar a la b arbitràriament segon argument.
>> Ara bé, aquesta dicotomia és en realitat bastant simple explicació.
Pensa en això.
Cap de nosaltres ha conegut la persona que va escriure printf.
Així que segurament, ell o ella no té idea del que les nostres variables de 30 anys més tard es van
per ser anomenat.
Així que ha d'haver una distinció entre el que diuen variables en
funcions que està escrivint i el que anomenem variables en funcions que està
trucant o utilitzant.
En altres paraules, he escrit els meus variables com x i i.
Però si algú havia escrit la funció d'intercanvi, ell o ella certament
No sabria què meus variables seran anomenat.
Així que adonar-se que això és per què té aquesta dualitat de noms.
Tècnicament, jo podria fer això per casualitat.
Però encara s'usa per a còpies.
Només seria una pura coincidència estèticament si aquesta persona que va escriure
intercanvi havia utilitzat els mateixos noms.
>> Està bé.
Així que en aquest punt de la història, línia 37, a és 1.
b és 2.
I ara em dedico a intercanviar-les.
Bé, primer de tot, m'ho fan realment molt més simple.
No sé quines són aquestes tres línies de codi feien.
Permetin-me fer això.
b obté una.
obté un b.
Fet.
Per què aquesta trencat, lògicament?
És una cosa de la intuïtiu, oi?
Per tant es converteix en una b.
I b es converteix en una.
Però el problema és que tan aviat com s'executa la línia 37, quina és la
valor de a i b?
El mateix, 1.
Perquè has pallissa, per dir-ho, has canviat b sigui igual a.
Així que una vegada que la línia 37 s'executa, això és genial.
Ara té dues còpies del número 1 dins d'aquesta funció.
Així que quan vostè diu en la línia 38, es posa un b, bé, ets una mica fotut.
Perquè estàs assignant 1 a 1.
Vostè ha perdut el tipus de valor que li importava.
>> Així que en la versió original d'aquest, observi el que vaig fer.
Jo en canvi va tenir una tercera línia de codi que es veia així.
Jo declaro una variable temporal - tmp és un nom molt comú
per a una variable temporal.
És un int perquè ha de coincidir amb el que jo vull fer una còpia de.
Puc guardar una còpia d'un interior d'tmp. Així que una vegada que la línia 37 s'ha executat,
el valor de a és -
seny registre ràpid -
1.
El valor de b és 2.
I el valor de tmp és també 1.
Així que ara executar la línia 38.
Així que una vegada que la línia 38 s'executa, una presa el valor de b.
I b va ser de 2.
Així és ara un 2.
Així que en aquest punt de la història, a és 2, b és 2,
i tmp és 1.
Així que ara, lògicament, podem valorar només tmp plop a la b.
I hem acabat.
>> Per això hem resolt aquest problema.
Malauradament, quan executo aquest programa en aquesta forma, en realitat no intercanviar
qualsevol valor.
Però perquè quedi clar, per què?
He arreglat el problema lògic de fa un moment.
Però de nou, si executa aquest programa, x i i no canvien a la fi de
l'execució del programa.
[Inaudible]
DAVID J. Malan: Així que no han tornat res.
Així que això és cert.
Però resulta que hi ha un petit problema aquí, perquè fins ara, el
L'únic que hem pogut tornar és una cosa.
I aquesta és una restricció de C. Només pot tornar realment un valor,
en aquest cas, estic una mica encallat aquí
perquè vaig poder retornar el nou valor de x o podia tornar el
nou valor de i.
Però vull tant enrere.
Així que torna no és la solució simple aquí.
Però el problema fonamental és per què?
Què hem canviat en realitat?
a i b.
Però a i b són còpies de x i i, el que significa que acabem de fer tot això
treball - només passem com tres minuts parlant sobre el canvi
funció i els tres d'aquestes variables.
I això està molt bé, perfectament correcte en l'aïllament.
No obstant això, un abast i b és l'única en aquestes línies aquí.
Així com un bucle, si es declara un enter i per l'interior de la
loop - De la mateixa manera, si vostè està dins de declarar a i b d'una funció que
que has escrit, són vàlids només dins d'aquesta funció.
El que vol dir que tan aviat com swap es realitza l'execució i es passa de la línia 24 a
línia 25, X i Y no han canviat en absolut.
Vostè acaba de perdre un munt de temps que es triga còpies de variables.
>> Així resulta que la solució a això és en realitat no evident.
No és més que suficient per retornar valors perquè podem
només retornen un valor.
I realment vull canviar tant x com i, a la vegada.
Així que anem a tornar a això.
Però, per ara, s'adonen que el problema fonamental es deriva del fet
que a i b són còpies.
I ells estan en el seu propi àmbit.
Bé, anem a tractar de resoldre això d'alguna manera.
Permetin-me retrocedir en realitat aquí i obren, diguem, una quarta variant
d'aquest, buggy4.
I què passa amb això?
Aquest és un problema similar però més senzill que mirar abans de prendre una punyalada en
resoldre'l.
Aquest programa es diu increment.
I, pel que sembla, s'inicialitza un enter x a 1 a la línia 18.
Llavors em diuen x 1.
Llavors reclamació incrementant, punt, punt, punt.
Llavors truqui increment.
Però llavors, en les línies 22 i 23, que diuen que ha estat incrementat.
Jo reclam x ara és el que és, presumiblement, 2.
>> Però aquest programa està lliure d'errors.
Quin és el problema?
Sí?
[Inaudible]
DAVID J. Malan: Exactament.
Així que x ha estat declarada, òbviament, en la línia 18.
És dins de claus principal.
Així que la resposta simple és que, bé, x existeix aquí.
No existeix en la línia 32.
Així que aquest programa realment ni tan sols es compilarà.
El compilador, quan intento compilar aquest codi, es va a cridar
sobre algun identificador no declarat o alguna cosa per l'estil.
De fet, ho intentarem.
Es tracta de fer buggy4.
Aquí està.
L'ús de x identificador no declarat en la línia 32.
I, de fet, serem més explícit aquí avui perquè això sigui útil en
les hores d'oficina ia casa.
Tingueu en compte que és una mica críptic escrit.
Però el fet que té Clang ens va cridar, dient:
buggy4.c: 32:5, és realment útil.
Això significa que l'error està en la línia 32 a la posició de cinc caràcters.
Així que un, dos, tres, quatre, cinc.
Això és, en efecte, on el problema és.
I també a tenir en compte en les hores d'oficina ia casa, tinc sort aquí.
Tinc un error.
Serà relativament fàcil de solucionar.
Però si tens una pàgina amb la missatges d'error aclaparadores, de nou,
adonar-se que el situat més avall podria ser un símptoma de
les més altes.
Així que sempre persegueix els errors de dalt a baix.
Com que només hi pot haver un efecte en cadena que li està suggerint
té problemes molt més del que realment fan.
>> Llavors, com podem solucionar aquest problema si el meu objectiu és incrementar x?
Què és això?
Bé.
Així que podem fer x global.
Anem a tirar pel dret que em va advertir sobre abans.
Però diables, només necessitem una solució ràpida.
Així que diguem que x int aquí.
Això fa que x global.
Així que ara principal té accés.
I increment té accés.
I així que permetin-me anar endavant i compilar aquest moment.
Fer buggy4, Enter.
Sembla compilar ara.
Anem a córrer buggy4, i sembla que funciona realment.
Ara bé, aquesta és una d'aquestes coses -
fes el que jo dic, no el que faig, com acabo de fer aquí.
Com que en general, els nostres programes es posaran molt més interessant i
molt més que això.
I si la solució a problemes de la vida és ah, posar tota la
variables en la capçalera de l'arxiu, molt ràpidament fer arribar els programes
terriblement difícil de manejar.
Es fa més difícil d'idear nous noms de variables.
Es fa més difícil entendre què variable està fent què.
>> I així, en general, això no és una bona solució.
Així que farem això millor.
No volem utilitzar una variable global aquí.
Jo vull incrementar x.
Així que, òbviament, podria -
al cap ia la fi, és una mica d'una història ximple, perquè acabem de fer això.
Però si jo no sabia res d'aquest operador, en cas contrari no se li va permetre
canviar a principal en si, com podria jo posar en pràctica Ken aquí, aquesta
temps per no incrementar cub però?
Com puc canviar això d'aquí?
Si.
[Inaudible]
DAVID J. Malan: Està bé, està bé.
Així que per què no passar x?
I llavors en lloc de tornar-lo, per què no m'acaba de prémer retorn x + 1?
Ara, un parell de coses més que canviar aquí.
Estic en el camí correcte.
Què més necessita per modificar?
Algú més.
Sí?
[Inaudible]
DAVID J. Malan: He de canviar el tipus de retorn d'increment
perquè no s'anul · larà.
Buit significa que no ha de ser retornat.
Però està clar que ara és.
Així que això ha de canviar a int per ser coherent amb el que
En realitat estic tornant.
>> Ara, una altra cosa és encara amb errors aquí.
Sí?
[Inaudible]
DAVID J. Malan: Així que he de augmentar x?
[Inaudible]
DAVID J. Malan: Ah, així que he de passar x.
Així que he de fer això aquí.
Així que el prototip, he de canviar això aquí.
Així que això ha de ser un int.
Això ha de ser -
hmm.
De fet, tinc un error aquí.
Anem a arreglar això primer.
Quin ha de ser aquesta realitat?
Per tant, hi ha d'haver alguna cosa int.
Podria ser x.
Però, francament, si vostè comença a trucar a tots els de la seva x variables, que obtindrà
menys i menys clara quin és quin.
Així que anem a triar arbitràriament una nomenclatura diferent per a mi
funcions d'ajuda, les funcions que estic escrivint.
L'anomenarem a.
O podríem anomenar - anem a anomenar even_number a ser encara més explícit.
Així que he de tornar tot el que el nombre és més 1.
I ara he de canviar una cosa aquí i una altra
una altra cosa aquí.
Què he de canviar en la línia 21 en primer lloc?
He de assignar a x.
Així que no puc dir x increment.
Necessito recordar la resposta en canviar el valor de x en
el costat de la mà esquerra.
I tot i que x es troba ara a l'esquerra i la dreta, que és totalment correcte, perquè
a mà dreta s'executa primer i després es va deixar caure a l'esquerra
cosa mà, x en aquest cas.
I finalment, aquesta és una solució fàcil ara.
Això només ha de coincidir amb el que està a baix.
Nombre Int
>> Està bé.
Així que un munt de canvis per a una funció realment estúpid.
Però representant de coses que cada vegada voldrà fer.
Així que buggy4.
M'he cagat en algun lloc.
Oh meu Déu.
Cinc errors, com, un programa de sis línies.
Llavors, què hi ha de dolent en la línia 18, el caràcter 5?
Està bé.
Així que he de declarar aquest int.
Està bé.
Així que anem a veure, un munt d'altres errors.
Oh meu déu.
19, 18, 21.
Però, de nou, anem a esborrar la pantalla -
L Control d'aquí - i Clang repetició.
Així que cinc problemes que en realitat és només una.
Així que ara anem a executar buggy4, Enter.
Sort.
x s'ha incrementat correctament.
>> Està bé.
Qualsevol pregunta sobre la forma d'incrementar els nombres?
Sí?
Ponència 2: Per què és que vostè pot canviar el nombre x en la variable
nomenar i sabrà el que vols dir?
DAVID J. Malan: Bona pregunta.
Com és que només puc canviar x a nombre i el programa sabrà
immediatament?
Així que de nou, pensa en ell com aquesta abstracció.
Així que si jo sóc principal i Ken és incremental, francament, no m'importa
Ken el crida al seu iPad.
No m'importa el que ell anomena qualsevol cosa que tingui a veure amb la seva aplicació
d'aquesta funcionalitat.
Així que aquest és un detall d'implementació que jo, principal, no
que importa.
I així, simplement canviant constantment dins de la funció, el nombre aquí
i el nombre d'aquí, és tot el que pren tant de temps com jo recompilar.
És com si vostè pensa - molts de nosaltres, aquells de vostès amb conductor
llicències que han impulsat, o fins i tot si vostè ha conduït a un cotxe -
la majoria de nosaltres no tenim idea de com funciona un cotxe sota la campana.
I, literalment, si s'obre el capó, la majoria de nosaltres - jo inclòs -
no sabrem realment el que estem veient.
Una cosa que es pot sentir amb coses com aquesta ara mateix.
Però en realitat no han de tenir cura com el cotxe funciona.
Nosaltres no hem de cuidar el que totes les varetes i pistons i els cables a l'interior de
el cotxe està fent en realitat.
>> Així que alguna cosa com el que vostès anomenen el pistó no té importància
aquí en aquest cas.
La mateixa idea.
Sí?
[Inaudible]
DAVID J. Malan: Si hi ha més usos de la variable xa moment enrere,
vostè, el programador, hauria de canviar tot arreu.
O vostè podria literalment fer Arxiu, Menú, i després Cercar / Reemplaçar,
alguna cosa per l'estil.
Però hauràs de fer aquests canvis pel seu compte.
Cal ser coherent.
[Inaudible]
DAVID J. Malan: un ordre particular com aquí?
Si això era int altre nombre?
Si.
Així ordre importa quan es crida a la funció.
Així que si m'estaven trucant increment aquí amb una mica alguna cosa coma,
hi ha una correlació directa.
La primera variable, com es digui, es fa una còpia de la primera
argument aquí.
Lamentablement, això no hauria de ser un parèntesi.
Les línies del segon argument per dalt amb el segon.
>> Així ordre, sí, importa.
Està bé.
No em vaig prendre un llarg camí per arribar-hi.
Altres preguntes?
Està bé.
Així que anem a veure si podem pintar un quadre del que realment passa
aquí sota la caputxa, per dir-ho.
Així que aquest és un rectangle que podria representar la memòria del seu ordinador.
Així que encara que no té idea de com funciona la memòria RAM o com funciona, si més no
se suposa que té raïms d'ell en aquests dies.
Tens megabytes d'ella.
Tens gigabytes d'ella.
I sabem des de zero setmana que un byte és què?
8 bits.
Bé, aleshores 8 zeros i uns.
Així que si el seu equip té un giga de RAM, dues gigues de RAM en aquests dies, té un
mil milions o 2 milions de bytes de memòria, o milers de milions a uns 8 milions de dòlars o 16
bits, en l'interior del seu ordinador.
Ara, a diferència de l'exemple poc llanós Willy, no és partícules magnètiques
típicament més.
Cada vegada més, en els ordinadors portàtils com a mínim, és les unitats d'estat sòlid, SSD, que
simplement no tenen parts mòbils.
Tot és electrònic.
Tot està basat electricitat.
Així que pensar, però, d'aquest rectangle com només representa el un o dos
gigabytes de memòria que té.
>> Així que és un tros de memòria.
Ara el món de la informàtica té una mena de trossos de particions de
memòria per fer coses diferents.
Així, per exemple, si aquesta és la memòria RAM del seu ordinador - com suggereix el
rectangle allà - Resulta que, per convenció, a la part superior de la RAM, així que
dir-ho, és generalment el que es diu un segment de text.
Aquests són els zeros i uns que s'han recopilat.
Per això, quan hem mirat sota de la caputxa del a.out és a dir, tots
els zeros i uns -
quan s'executa un programa, els zeros i uns es carreguen des del seu disc
unitat en alguna cosa que es diu memòria RAM.
I a la RAM, se les col · loca en la part superior.
Ara, mentrestant, té altres coses.
Dades inicialitzats, dades sense inicialitzar.
Aquestes dues franges de memòria es refereixen a les variables globals, que
no s'utilitzen sovint.
Però de vegades, si ho fan, acaben allà també.
Llavors hi ha altres coses.
Les variables d'entorn, que no anem a passar molt temps en.
Però dues coses importants que tornarà al llarg d'aquest
semestre, pila i pila.
>> Així que la majoria de la memòria de l'equip està reservat en executar un programa per
una cosa que es diu la pila i una cosa que es diu la pila.
I no anem a parlar sobre el munt d'avui, però ho farem
parlar de la pila.
I la pila està destinat a evocar la visual de com el menjador
safates de menjar en Mather House, o on sigui que sigui, on el
menjador personal netejar cada dia.
Els apilar amunt de la planta de dalt.
I de la mateixa manera en la memòria, hi ha aquesta idea de posar alguna cosa en un
apilar, posar alguna cosa en una pila, posar alguna cosa en una pila.
I què és el que volem dir amb això?
Bé, anem a fer un zoom en només la meitat inferior d'aquest quadre, seu ordinador
RAM, proposar la següent.
Resulta que quan s'executa un programa com a.out o hola, sigui quina sigui
del programa és que vostè ha escrit,
de nou, aquests zeros i uns es carreguen des del disc dur - que és
emmagatzematge a llarg termini, es queda allà, fins i tot quan es tiri de la clavilla -
carregat a la RAM.
RAM és més ràpid que els discos durs.
És més petit que els discs durs.
Però és que els programes en viu mentre està en funcionament.
>> Així es fa doble clic en un programa en un Mac o un PC - està carregat de
disc dur a la RAM.
Així que es carrega a la memòria RAM, els zeros i uns anar a la part superior forma, la
així anomenat segment de text.
Però tan bon punt el programa arrenca en realitat, el principal
funció es diu.
I principal, com hem vist, sovint té variables locals.
I té sencers i cadenes i caràcters i similars.
Així que si el teu programa que vostè ha escrit o del programa que s'ha
doble clic utilitzen algunes variables dins de la principal, que acaben en la
part inferior de la pila de la memòria, per dir-ho.
Ara, més concretament, què significa això realment?
Això només vol dir que si anàvem a explicar les coses -
si anàvem a numerar els bytes de memòria RAM en el seu ordinador, observi que
Aquest nombre pot ser zero bytes.
Aquest podria ser el nombre de bytes d'una, dues, tres, quatre, cinc, sis, tots
fins arribar a agradar -
2000000000 seria tot el camí fins allà dalt.
En altres paraules, quan parlem de RAM o memòria en termes de bytes, es
només significa que algú ha decidit que a comptar cadascun
aquests trossos de memòria.
>> Així que quan vostè necessita 32 bits per a un int, o si necessita 8 bits per a un char, si
què acaben en la memòria?
Bé, conceptualment, que acaba d'acabar en el fons d'aquest
cosa que es diu la pila.
Però l'interessant ara és quan crida a una funció principal.
Suposem que una funció anomenada foo, només un nom arbitrari.
El que passa és principal està a la part inferior d'aquesta pila de memòria.
Foo ara es col · loca en la part superior de la memòria principal.
Així que qualsevol variable local que ha foo acabar espècie de vista conceptual dalt
els de principal.
Si foo crida a una altra funció anomenada bar, aquelles variables acaben aquí.
Si la barra demana una mica més, aquí, aquí, aquí.
Així que el que és interessant sobre l'execució d'un programa és que en cridar a funcions,
i com les funcions que criden a funcions, i aquestes funcions trucar a funcions,
construir l'edifici aquesta pila de funcions en la memòria.
I només una vegada retorna una funció no comença a rebre aquesta memòria esquena.
Així que una de les maneres més fàcils d'executar fora de la memòria en un programa d'ordinador és
escriure funcions que mai tornen.
>> Així, per exemple, demostrarem com molt amb un
programa intencionalment buggy.
Deixin-me seguir endavant i fer # include, int main (void).
I ho faré, mentre que (2> 1), que probablement mai
canviar a nosaltres.
I m'ho dius a mi seguir endavant ara i fer printf.
En realitat, això serà menys interessant visualment.
Anem a fer això.
Per int (i = 0; i> 0).
Fem d'aquest error, i + +.
I no printf aquí.
Anem a practicar el que predicava.
Anem a fer una mètode aquí.
Cor Buit, i direm int i.
I després vaig a dir, printf -
oh, anem a fer-ho més interessant.
Que en realitat no imprimeix res en absolut.
Anem a fer això.
Cor (i).
>> Està bé.
Així que això té errors perquè per què?
Estic fent això com vaig perquè el programa no fa res
d'interès.
Però aquest no és l'objectiu.
L'objectiu és escriure un programa que té com a principal funció fa el que, pel que sembla?
Truqui a si mateix.
I en realitat, no necessitem el bucle.
Anem a simplificar encara això només per no perdre de vista la realitat
error fonamental.
Principals trucades cor per cantar alguns cors.
Llavors vaig fer alguna cosa estúpid, i jo tenia cor cor anomenada perquè vaig suposar
algú més ho havia de posar en pràctica potser.
I ara això no es va a compilar encara.
He de fer què?
Necessito el prototip, recorda.
Així que he de tenir aquí cor void (int i).
>> Així que ara, si em vaig per aquí -
en realitat, utilitzarem la finestra més gran.
Seguirem endavant i fer cors.
L'ús d'declarant no identificat i.
Oh, això va ser estúpid.
No necessitem l'argument.
Anem a fer això.
Ens hauria agradat haver començat d'aquesta manera.
Hauria estat un programa molt més fàcil d'escriure.
Així que hi ha.
Ara anirem a la meva finestra de terminal, torneu a executar Clang.
I aquí anem.
Això va ser molt ràpid.
El que en realitat acaba de passar, però?
Bé, ara vaig a afegir la línia d'impressió, pel que podem veure.
Així que permetin-me dir printf, direm, sóc aquí.
Està bé, no hi ha variables, el deixarem així.
Permetin-me tornar a executar make.
Permetin-me tornar a executar el cor.
I anem.
Segueix endavant.
Com acotació al marge, per què no ho ha ensorrat encara?
La decisió de segmentació passar súper ràpid abans.
[Inaudible]
DAVID J. Malan: Exactament.
Així que es necessita temps per imprimir.
Només es necessita més treball per part de l'equip.
I aquí està.
Segmentació culpa.
>> Així notar com de ràpid executar programes.
Si no està imprimint alguna cosa, super ràpid.
Però encara tinc aquest error de segmentació perquè el que estava passant?
Bé, si vostè pensa sobre com la memòria de l'equip es presenta, aquesta
passa a ser principal.
Però aquí -
Anem a trucar a aquest cor, i anomenarem a aquest cor.
I ara si faig la meva estètica bé, això és només dirà cor,
cor, cor, cor, cor, cor, cor, fins a la sacietat.
I, finalment, ¿què passarà?
Si el panorama és literalment això, què li passa conceptual?
Els excessos de la pila la pila.
O pitjor encara, que acaba d'envair tot, incloent el segment de text, que és
els zeros i uns que representen el seu programa.
En resum, això és només super, super malament.
¿És cert?
El seu programa s'ha disparat fora de control.
Vostè està utilitzant la memòria molt més del que volia tot per un estúpid
error, en aquest cas.
O, en aquest cas, una funció molt deliberadament fet en si de trucada.
Ara bé, això no és del tot dolent.
Les funcions que es diuen en realitat té un gran poder
quan l'hi usa correctament.
Jo no ho he fet servir correctament aquí.
>> Així que això no és del tot dolent.
Però el fet que en realitat mai deixa de cridar-me a mi mateix és un dret fonamental
aquí debilitat d'aquest programa.
Llavors, on anem amb tot això?
Bé, què està passant realment?
Quan dic a la funció d'increment, igual que fèiem en aquests exemples,
Tinc un valor com una que jo pas polz
Em passa una còpia del número u.
Així passa el següent.
Així que entrarem en l'exemple d'increment.
I aquest tipus per aquí.
Així que aquí és el que està succeint realment.
Quan vaig trucar a l'increment, i pas a x, pictòricament el que és
passant aquí és aquesta -
si tinc el valor d'1 emmagatzemen aquí, i jo en realitat cridar increment, que
ara es diu cor -
sí, això m'està llançant aquí.
Així que anomenarem a aquest increment.
I no sabem el que aquesta funció següent serà.
Llavors, què està passant realment aquí en algun lloc principal, tinc un tros de
memòria que emmagatzema el número 1.
Quan dic increment, estic fent servir un altre tros de memòria, però ara
té la còpia de 1.
Quan incrementar aquest valor, això es converteix en 2 - horriblement escrit en la
pantalla aquí.
Però llavors, què passa tan bon punt torna d'increment?
Aquesta memòria només es va lliurar de nou al sistema operatiu, el que significa que tot
que has fet és gens útil.
El que estava continguda originalment en el principal segueix sent realment allà.
>> Llavors, ¿a on anem amb això?
Bé, resulta que a la memòria que té aquesta d'esquena seqüència de
bytes que es poden posar les coses polz
I resulta que ja hem vist alguna cosa que consisteix a col · locar
coses tornin a l'esquena amb esquena amb esquena.
Què és una cadena, sobre la base d'una setmana i dues setmanes ara?
Així que és només una col · lecció de personatges.
Així resulta que, de la mateixa manera que vostè pot posar números a la memòria, de manera similar que pugui
posar els caràcters en la memòria.
I un cop que comencem a posar en la memòria de personatges d'esquena cap enrere per
de nou, és que l'ús de les coses més simples com un bucle o
un bucle while, podem iterar -
d'esquerra a dreta sobre els caràcters d'una cadena -
i començar a fer massatges en personatges completament diferents.
A podria convertir-se en B. B es pot convertir en C. Per tant, en definitiva, podem prendre una
Frase anglès que realment té sentit i convertir cada un dels
cartes d'una en una mitjançant un recorregut per la memòria del nostre ordinador d'esquerra a
dret a xifrar en realitat.
>> Així que tindrem nostres cinc minuts de descans aquí, i quan tornem, anem a
iniciar aquest procés de codificació de la informació.
>> Està bé.
Així que abans de bussejar en alguns criptografia i aquestes coses anomenades matrius, permetin-me
pausa per a qualsevol pregunta, perquè em sento com si realment alguna cosa confusa alguns
aquests temes.
Així que anem a arreglar ara si podem.
Així que només parlava dels valors de retorn.
Parlem d'arguments.
I parlem d'aquest concepte, que tornarem a les pròximes setmanes
venir, de veure la memòria com un munt d'ells apilats
safates, per dir-ho.
De baix a dalt, de manera que cada safata que es posen a la pila representa
una funció que està sent anomenat.
Alguna pregunta?
Llavors, què - vaig a tractar de fer una pregunta.
Segueixo fent malbé, però ara és. - vostè tot vist la cara del noi.
Així que anem a tornar a això.
>> Així que permetin-me fer una pregunta aquí.
Permetin-me simplificar això al que era abans que alguns de la nostra anterior Q & A.
I el fet que l'increment té parèntesi d'obertura, nombre int, tancat
parèntesi.
Quin nombre representen int?
[Inaudible]
DAVID J. Malan: un argument.
D'acord, però què és un argument?
[Inaudible]
DAVID J. Malan: Em sap greu, què és això?
Ponent 3: Una cosa passa polz
DAVID J. Malan: Molt bé.
Així que una cosa que es passa polz
I més en general, és només l'entrada.
Si vostè està escrivint una funció i el propòsit d'aquesta funció en la vida és fer
una cosa una mica diferent cada vegada que l'usa, llavors l'única forma de
que passi realment sembla que li faciliti l'entrada de manera que
pot fer alguna cosa diferent amb l'entrada cada vegada.
>> Així que cal especificar dues coses quan una funció té entrades.
Cal especificar el nom que voleu donar a aquesta entrada, simplement per
seva pròpia conveniència, de manera que vostè pugui referir-s'hi en la funció que
vostè està escrivint, com ho vaig fer aquí a la línia 32.
Però també cal especificar el seu tipus, ja que C és un llenguatge de programació
que només requereix
que si vols una variable, vostè ha de dir-li a l'ordinador què
el tipus de dades que és,
en gran part, perquè sàpiga quants bits a
assignar a aquesta variable.
Com que podria ser de sis -
ho sento, no serà sis.
Pot ser 16.
Pot ser 8.
Pot ser 32, fins i tot 64.
Però l'equip ha de saber.
Ara el int a la banda esquerra representa el que, per contra?
[Inaudible]
DAVID J. Malan: Què és això?
[Inaudible]
DAVID J. Malan: El tipus de la funció i, més específicament, la
tipus de la seva producció.
Dreta.
Així, mentre que la cosa en parèntesi representa la seva entrada, si s'escau, la
cosa a l'esquerra representa la sortida.
I en aquest cas, l'increment aparentment torna un int.
I així int és el tipus de retorn d'aquesta funció.
>> Què significa tornar?
Literalment, s'utilitza la paraula clau return.
I si el que estan tornant a la dreta de la paraula clau és una
sencer, que és consistent amb el que hem promès.
No es podria fer alguna cosa com això -
hola, món -
perquè això és una cadena.
Òbviament, no és un nombre enter.
Així que en resum, la càrrega està realment en nosaltres, el programador, per ser més específic
al que estem tornant i per llavors de seguir per tornar.
I després de fer una mica més clar el context -
aquí està una altra vegada.
El context -
gran sorpresa en un moment.
El context aquí és que la memòria del seu ordinador és, de nou, un
gigabytes, dos gigabytes, el que sigui.
Potser és més.
Potser és menys.
Però l'equip que considera que té diferents seccions.
Una cosa passa allà baix.
Una altra cosa que passa per allà.
Coses diferents va en el medi.
I avui, tot just començar a explicar aquesta història.
>> Però tornarem a això amb el temps.
Per ara, l'única memòria que realment importa és el segment de text
ja que només representa els zeros i uns
Clang que s'emeten.
Així que quan s'executa una ordre en el teclat com a.out, o doble
feu clic a una icona en Mac OS o Windows, el programa està carregat del seu disc
conduir a la RAM.
I es va deixar caure al cim de la memòria RAM de l'ordinador, per dir-ho.
Ara, mentrestant, ja que el seu programa es posa en marxa i el principal es diu a la
programa que va escriure o escriu el programa de Microsoft o Apple, que cap dels seus
variables locals acaben aquí baix a la part inferior de la memòria del seu ordinador.
Però si truca a una altra funció principal que té variables o
arguments, acaben sobre.
I si aquesta funció crida a alguna cosa, acaben sobre d'ella,
per sobre d'ella, per sobre d'ella.
I només una vegada una funció es fa executant fa la pila de safates, de manera
a parlar, començar a baixar cada vegada més.
I això és el que llavors, en poques paraules, explica per què, quan es diu cubeta -
o pot trucar al increment -
que està passant en una còpia del valor.
I el que això significa és que pictòricament està literalment escrit la
número 1 en una altra part de la memòria, el canvi que 1 a 2, en el cas dels
increment -
oa un 8, en el cas de cub -
i després estirar memòria que desapareix tan bon punt l'increment o la galleda
retorna la funció.
>> Pregunta.
[Inaudible]
DAVID J. Malan: On - Les variables globals s'emmagatzemen en el que és
Actualment, va cridar a les dades inicialitzats o dades sense inicialitzar.
La diferència és que si vostè té una variable global, i se li assigna
immediatament un valor amb el signe igual, que acaba a la part superior hi ha.
I si el que diuen int x punt i coma sense cap valor, acaba lleugerament
inferior en RAM simplement per convenció.
Altres qüestions.
Està bé.
>> Així que aquesta imatge tornarà a mesura que més poderós del que podem fer
amb l'equip.
Però per ara, tindrem una breu introducció a la criptografia, un tipus específic de
criptografia que no resol tots els problemes del món, però no resoldre
alguns d'ells.
En aquest cas aquí, tenim una cosa que es diu la criptografia de clau secreta.
I criptografia de clau secreta, com el seu nom indica, deriva la seva seguretat
a partir d'un secret.
Així, per exemple, si vostè és nou a l'escola primària i que estiguis passant un
carteta amor secret per al noi o la noia que t'estan aixafant - si vostè
Volia passar que a través de l'audiència, probablement no escriuria
una nota en Anglès o el que la seva llengua materna és, més aviat,
podria xifrar.
O vostè pot enviar-los un missatge de text en aquests dies.
Però que en realitat podria passar una nota a través de la sala de classe.
I per fer-ho de forma segura, de tal manera que els seus amics i el professor
no saps el que estàs escrivint, és possible arribar a una força simple
algorisme -
jove, encara que és possible que -
a només codificar les paraules.
Així que en lloc d'escriure una, podria escriure B. En lloc de B, pot escriure
C. En lloc de C, pot escriure D, i així successivament.
O bé, podria arribar a una traducció més sofisticat de les lletres
per diferents lletres.
Però el problema és el noi o la noia a la qual li està enviant aquesta nota ha de
saber alguna cosa.
Què és el que, òbviament?
Igual que, quin és el seu secret.
Igual que, què és això mapatge entre A i B i Cs i Ds?
És només l'addició d'un, per dir-ho, a cadascuna de les lletres per anar de
A a B, B a C?
És més complex que això?
Així que tu i el teu enamorat és necessari tenir aquesta informació secreta.
Però hi ha una espècie de catch-22 aquí.
Si aquesta és la primera vegada que enviarà aquesta carta d'amor a través de la
classe, com és aquest nen o nena sabrà quin és el secret fins i tot és?
Així que la clau secreta de xifrat no resol tots els problemes del món.
I de fet hi ha una relació que tornarem a cap
semestre final.
>> De la mateixa manera, no tenen cap de nosaltres probablement mai enviada a -
de la mateixa manera, no la majoria de nosaltres coneix a algú que treballa, per exemple, en
Amazon.com.
I, no obstant això, molts de nosaltres hem comprat coses a Amazon.com.
I hem estat ensenyats a assumir que aquests comerç electrònic
transaccions són segures.
¿És cert?
La direcció URL https probablement diu.
Hi ha potser una icona de cadenat poc ximple en algun lloc.
Hi ha una espècie de criptografia de la seguretat de la seva informació de targeta de crèdit
entre vostè i Amazon.com.
I, no obstant això, si la criptografia implica conèixer algun secret, i no obstant això no ho fan
conec a ningú en Amazon, i he arreglat certament no qualsevol tipus d'
secret amb algú a l'Amazones, com és el meu ordinador o navegador fent això?
Bé, resulta que hi ha altres tipus de criptografia en total que resolen
aquest problema.
Però per ara, ens centrarem en el senzill, on es poden organitzar en
avançar a conèixer algun secret, com un plus o alguna correlació entre A i B.
>> I el procés de criptografia generalment implica això.
Vostè té una mica de text sense format, representat aquí a l'esquerra.
Pot executar a través d'algun tipus d'algorisme o procediment
per xifrar.
Potser això és només A es converteix en B, B es converteix en C i després s'acaba amb
text xifrat.
Mentrestant, un cop que el seu enamorat rep la nota secreta, ell o ella ha de llavors
desxifrar en general que l'algorisme d'inversió per tal d'aconseguir
copia el text sense format.
Ara hi ha encarnacions físiques d'aquest.
Per exemple, aquest és un petit anell descodificador secret.
I aquest és un anell en el sentit que hi ha dos dials aquí.
A la perifèria exterior d'aquesta cosa, no hi ha lletres de l'A a la Z,
encara estan en ordre aleatori.
I a l'interior, de fet hi ha alguns números, de manera que amb aquest
anell, es pot convertir tipus de fora però no per dins per tal d'alinear
nombres amb lletres.
I en el clip que està a punt de veure - alguns dels quals vostè va poder haver vist 24/7
durant la temporada de Nadal d'una pel · lícula que es diu Un conte de Nadal.
Veuràs que poc Ralphie estava tan ansiós per descobrir què orfenet
Annie missatge secret era el que havia estat comunicada, crec, en la
forma de missatges numèrics en una sèrie de la caixa.
I calia acumular totes les petites targetes que vénen
a la caixa de cereals.
Calia enviar per correu polz
Calia recuperar l'anell descodificador secret, de manera que vostè pot finalment entendre
el que la cartografia és entre lletres i nombres,
o lletres i lletres.
Així que et dono aquest clip curt d'una història de Nadal per motivar conjunt de processadors 2 i
nostra discussió, en un moment, de les matrius.
Així que aquí tenim Ralphie.
>> [REPRODUCCIÓ DE VÍDEO]
-Sigui notori a tots que Ralph Parker es nomena
membre de la Little Orphan Annie Secret Circle i té dret a tot
els honors i beneficis que ocorren al mateix.
-Signat, Little Orphan Annie.
Ratificat, Pierre Andre!
En tinta!
Honors i beneficis, ja a l'edat de nou.
Anem, anem a seguir endavant amb ella.
Jo no necessito tot aquest jazz sobre contrabandistes i pirates.
-Escolti demà a la nit per l'aventura final del Negre
Pirate Ship.
Ara és el moment per al missatge secret d'Annie com vostès, membres
del Cercle Secret.
Recordeu, els nens, només els membres del Cercle Secret d'Annie pot descodificar
Missatge secret d'Annie.
Recordeu, Annie depèn de tu.
Estableixi les seves agulles per B2.
Aquí està el missatge.
12, 11 -
-Estic en la meva primera reunió secreta.
-14, 11, 18, 16 -
-Pierre estava en aquesta nit gran veu.
Em vaig adonar que el missatge d'aquesta nit va ser molt important.
-3, 25.
Aquest és un missatge d'Annie ella.
Recordeu, no l'hi diguis a ningú.
-90 Segons més tard, estic en l'única habitació de la casa on un nen de nou anys
podia seure a la intimitat i descodificació.
Aha, B. Vaig anar a la següent.
E. La primera paraula és ser.
S. Venia més fàcil ara.
U.
-Oh, anem, Ralphie.
Em he d'anar.
-Vaig a estar just a sota, ma.
-Gee whiz.
-T, O. Comproveu.
Assegureu-vos que?
Quin era Little Orphan Annie tractant de dir?
Assegureu-vos que?
-Ralphie!
Randy ha d'anar.
Faci el favor de sortir?
-Està bé, mare.
Vaig a estar fora.
-Jo estava cada vegada més a prop ara.
La tensió era terrible.
Què va ser?
El destí del planeta pot penjar d'un fil.
-Ralphie!
Randy ha d'anar.
-Vaig a tenir raó a terme, per l'amor de Déu.
-Vaja, gairebé arribem.
Els meus dits volaven.
La meva ment era un parany d'acer.
Cada porus va vibrar.
Era gairebé transparent.
Sí, sí, sí, sí.
-Assegureu-vos de prendre la seva Ovaltine.
Ovaltine?
Un comercial de mala mort?
Fill de puta.
[FI DE REPRODUCCIÓ DE VÍDEO]
>> DAVID J. Malan: Així que aquí tenim la criptografia.
Llavors, com en un ordinador podem anar sobre l'aplicació o
que representa aquest tipus de coses?
Bé, necessitem una manera d'expressar una mica més flexible que
les nostres variables fins al moment han permès.
Hem tingut sencers.
Hem tingut caràcters.
Hem tingut flotadors i dobles i alguns altres.
Però aquestes són les peces individuals de la memòria que realment no ens permeten
expressar coses com les paraules i oracions i frases.
De fet, hem anomenat cordes aquestes coses.
Però va prometre que això és només una simplificació en el CS50
biblioteca que estem intentant pelar.
>> Així que anem a començar a fer això aquí.
Deixin-me seguir endavant i obrir un arxiu -
tots aquests arxius estan disponibles en línia com de costum -
array.c anomenat per resoldre un problema relacionat amb cadenes però que pinta una
imatge aquí de com podríem utilitzar una cosa anomenada una matriu.
Una matriu és un tipus de dades.
És un tipus de variable, de classes, que té diversos tipus de dades més petites
dins d'ella d'esquena a l'esquena amb esquena.
Així, per exemple, si volem escriure un petit programa que li dóna el seu
concurs mitjà d'un curs com 50 que té dos exàmens, podeu molt fàcilment
escriure aquest programa - basat fins i tot en alguns dels materials de la setmana passada -
mitjançant l'ús d'getInt i un parell de variables.
Int quiz1, int quiz2, i és bastant senzill.
És potser 10, 20 línies de codi, màx, per implementar un programa que demani la
usuari per a dues anotacions prova i després calcula la mitjana agregándolos
junts, dividint per dos, i després imprimir els resultats.
Probablement podríem fer això molt fàcilment ara, després de
un cert nombre de minuts.
>> Però el problema és que suposo que el 50 tenia tres o quatre proves.
Suposem que li agradaria utilitzar el mateix programa per a una classe que tenia
proves setmanals.
Penseu en una classe que ha exàmens setmanals.
Si hi ha com 16 o menys setmanes en un semestre, ara té 16 variables -
quiz1 int, int quiz2, int quiz3, int quiz4.
Així que vostè comença a veure aquesta redundància, aquesta copiant i enganxant
de codi, ha de començar a fer que t'agradaria que hi hagués una manera millor.
I gràcies a Déu, a causa de les matrius, n'hi ha.
Així que anem a fer això.
En primer lloc, permetin-me presentar a una cosa molt simple que no hem fet servir fins ara,
però ho vas a veure de tant en tant en el codi.
Això és el que normalment es coneix com constant.
Així que és una constant en el sentit que aquest valor mai canvia.
La convenció humana en crear una constant és utilitzar tot el capital
cartes, només perquè realment es destaca en el codi.
I la paraula clau especial que s'utilitza en C # defineix.
Així que si vostè diu # defineix, després un espai, llavors la paraula que voleu utilitzar per
la constant de nom, i després el valor de la constant.
Així que nota, això és diferent de assigna alguna cosa a una variable.
No hi ha cap signe igual.
No hi ha punt i coma.
Això és el que es coneix generalment com una directiva de preprocessador, però més en
que una altra vegada.
>> Per ara, això crea un valor immutable anomenat TESTS l'efectiva
valor numèric és 2.
Així que on Quan vegeu proves, exàmens, proves curtes al llarg d'aquest arxiu, que és
només el número 2.
Ara, si miro principal ara, anem a veure com funciona això.
Al principi, sembla una mica críptic.
Però tot és cosa d'una setmana.
Demani a l'usuari per als graus.
Com podem fer això?
Doncs bé, en la línia 22 -
aquesta és realment la part sucosa -
Jo declaro un flotador, però no és només un sol flotador.
Estic declarant, més aviat, un conjunt de valors de punt flotant.
Aquesta variable es dirà graus, com s'implica aquí.
Però l'única nova sintaxi llavors són aquests claudàtors, el fet de
que he dit graus flotador i després obrir el parèntesi i després un nombre.
Avís, si això és una constant, això és com ho vam fer.
Això significa ordinador hey, dóna'm dos flotadors, i anomenarem col · lectivament
els graus.
Això està en contrast amb un procés molt més tediós com aquest.
Grau 1 surar, surar grade2, i així successivament.
Així que una matriu que ens permet posar en pràctica aquesta idea, però molt menys desordenadament, en
de manera que podem escriure una línia de codi en lloc de, per exemple, 16 per a una 16
setmana del semestre.
Així que jo no volia que codificar 2 perquè si penses en aquest moment
lògicament - Suposo que l'any que ve CS50 canvis a 3 qüestionaris en el seu lloc.
I jo tenia el número 2 aquí.
Jo tenia el número 2 aquí.
Es torna molt tediós i molt fàcil ficar la pota i canviar accidentalment
un valor a 3 i es perdi algun altre valor de 2.
Així que vaig a aquest lloc abstracte de distància i utilitzar aquesta constant que, com el seu
nom indica, mai canvia.
I ara, no importa si tenim diferents concursos d'aquest any o el següent,
només cal canviar en un sol lloc, aquí dalt a la part superior.
>> Així que això és tot el constant és.
Mentrestant, la característica nova és que conceptual d'una matriu.
Així que els claudàtors donar-me aquesta flota i em deixa moltes col · lectivament
en diuen els graus aquí.
Així que ara anem a veure el que faré.
Aquí, a la línia 24 és l'inici d'un bucle.
Això és realment res especial.
És només mitjançant proves en lloc d'un nombre codificat.
Però no hi ha res intel · lectualment diferent allà la setmana passada.
Això és només printf.
Així printf ("nombre qüestionari% d de% d") perquè només vull imprimir dóna'm concurs
número u dels dos i després dos de dos.
Així que això és purament una cosa estètica.
Però la part més interessant ara està en la línia 27.
Per tal d'omplir en un dels dos marcadors de posició amb un punt flotant
valor, de nou utilitzar claudàtors.
En aquest cas, estic fent servir i perquè aquest bucle for s'ha iniciat amb i igual a
Quin valor, pel que sembla?
0.
>> Així que en la primera iteració d'aquest bucle, és com si
escriure això en el codi.
Però en la segona iteració d'aquest bucle, és com si
escriure això en el meu codi.
Però el fet que jo estic fent servir una variable és perfecte perquè, com el seu nom
suggereix, està variant el seu valor en cada iteració.
Així que m'estic omplint aquest conjunt un lloc al mateix temps.
Què fa aquest acord sembla?
Bé, la raó per la qual va arribar a aquesta super simple rectangle a la pantalla aquí
abans era per això.
Una matriu és simplement un tros de memòria seguit d'un altre tros de la memòria,
seguit per un altre bloc de memòria, i així successivament.
Així que si el meu matriu és de mida 2, en aquest cas aquí, l'únic que estaria fent per
escrivint en les puntuacions de les meves preguntes i respostes, com aquí.
Tinc 100 en aquest cas.
I llavors em vaig posar un 99 en aquest cas.
Llavors, aquesta memòria no podria fins i tot ser utilitzat perquè només he demanat al
equip per a una matriu de mida 2.
Les places estan encara allà.
¿És cert?
Encara disposa de dues gigabytes de RAM, encara que només
demanar dos flotadors.
Així que la idea darrere de les matrius és que l'ordinador només pren un tros de memòria
i després reparteix trossos més petits d'esquena a l'esquena amb esquena.
I això és tot un arranjament és.
És un tros continu de memòria, dins dels quals vostè pot posar les coses.
>> Ara bé, això passa a continuació, només fer una mica d'aritmètica avorrit.
Si em desplaço fins aquí, aquí és on em iterar sobre la matriu.
Vinc amb la suma de tots els valors de la matriu.
I aleshores utilitzar la funció round aquí per fer realitat el
suma dividida per concursos.
Però permetin-me saludar la meva mà que com una mena d'aritmètica suficient per ara.
Però tot el que està fent per mi en última instància està calculant una mitjana.
Així que prova primer més segon qüestionari, dividit per 2 i després imprimir
cap a fora com un int.
>> Però ara anem a la transició a un exemple diferent anomenat cadena1,
que pinta un quadre similar però utilitzant cordes.
Deixin-me seguir endavant i simplificar això per un moment.
I perdona la sagnia per ara.
Observeu en la línia 19 d'aquest exemple, tinc una cadena de l'usuari.
Però noti el que estic fent en la línies 22 en endavant.
En realitat estic iterar des i fins - i aquest és un nou truc -
strlen, cadena de longitud.
Aquesta és una funció que ve amb C que si se li passa una cadena, que compta
que el nombre de caràcters que hi ha en aquesta cadena.
Això és tot.
El fet que sigui en lloc de strlen longitud de la cadena és només perquè és
més succinta.
Fa 30 anys, la gent li agrada escriure coses tan succintament possible.
Per això hem mantingut aquesta convenció aquí.
i + + només significa incrementar ia cada iteració.
I ara notin això, que és molt interessant.
Així, en la línia 24, dic ordinador, deme un personatge, vuit
bits, i en diuen c.
Però què és aquesta en el costat dret dient?
En Anglès, què representa?
[Inaudible]
DAVID J. Malan: Exactament.
Dóna'm el primer caràcter de la matriu.
O més en general, em donen el caràcter i-èsim de la matriu.
I adonar-se que és important ara que com els informàtics, en realitat estem
comptant des de 0.
No té discreció per començar a fer-ho.
Ara vostè ha de comportar-se d'acord amb les expectatives de l'equip i
comptar a partir de zero, perquè [0] serà el primer
caràcter en una cadena.
[1] serà la segona.
[2] serà el tercer, i així successivament.
Així que aquest programa, si ho compili - és a dir, de nou, cadena1.
>> Així que cadena1.
I ara em trobo cadena1 al meu finestra de terminal.
S'espera per a l'entrada, així que vaig a escriure, per exemple, David.
Retorn.
I ara s'imprimeix DAVID tot en línies diferents, perquè
adonar-se del que estic fent.
Estic imprimint un caràcter alhora.
Ara no entrarem en detalls avui sobre aquest tema.
Però he eliminat fa un moment aquest xec aquí.
Resulta que si l'usuari s'està portant malament, contradictori, o simplement
confús, en realitat es pot deixar de donar una sèrie de certa extensió.
Si es prem la tecla equivocada al teclat, pot donar
cap cadena en absolut.
O si vostè és maliciós, pot intentar per enganxar al patrimoni d'un gigabyte d'un
assaig per omplir aquesta cadena.
I si l'equip es queda sense memòria, resulta que anem
per tornar aquest valor especial anomenat null.
Així que per ara, només sé que hi ha aquest valor especial anomenat nul · la que
ens permetrà comprovar quan estem fora de la memòria, entre altres coses.
>> Però si obro ara cadena2, noti una diferència aquí.
Tingueu en compte una diferència aquí amb cadena2.
Amb cadena2, aquest bucle for és una mica diferent.
Deixa esborrar els nuls perquè puguem parlar d'aquells en un altre moment.
Però, què hi ha de diferent en el bucle for aquesta vegada?
I puc tornar a l'exemple anterior.
Així que aquesta és la versió dos.
Aquesta és la versió un.
Un, dos, un dos.
Així que l'anomenada strlen és on?
És a la primera part del bucle for.
Alguna idea de per què estic fent això?
Si.
[Inaudible]
DAVID J. Malan: Així que no cridi a la funció cada vegada.
Exactament.
Recordeu que en els bucles for que són súper senzill una vegada que una espècie de
entendre que aquesta és la inicialització, la
condició, i l'actualització.
El problema és que la condició ocorre en cada
iteració del bucle.
I així, en aquest exemple aquí, què té de dolent el fet de
que aquesta és la meva condició?
Estàs cridant strlen una i altra vegada i una altra.
Però una vegada que has escrit en David, la longitud de la cadena és de cinc.
I no canviarà en cada iteració del bucle perquè el
cadena és encara D-A-V-I-D. Així que aquesta és una pista del que es convertirà en un
idea cada vegada més important que es coneix com una decisió de disseny, on - simplement no
fer que l'ordinador faci la feina innecessari.
>> Però així com una vista prèvia de pset 2, conjunt de processadors 2 a l'edició estàndard és
et desafiar aplicar en la pràctica un cert nombre de xifres, alguns
nombre d'algorismes de xifrat, perquè pugui xifrar i desxifrar
missatges secrets, molt semblant al Ralphie hi ha un descodificat.
En l'edició pirata de pset 2, anirem una mica més lluny.
Ens anem a lliurar un arxiu d'un sistema informàtic actual que conté un
gran quantitat de noms d'usuari i contrasenyes xifrades reals, i el desafiament
per a l'edició pirata serà de desxifrar les contrasenyes i la figura
el criptografia o què secret es va utilitzar per realment
generar les contrasenyes.
I farem això utilitzant una nova característica de C que vaig a donar
només una demo de, conegut com arguments de línia de comandes.
>> Així resulta que, com alguns de vostès poden haver vist en la secció o en llibres de text,
principal no ha de sempre ser nul entre parèntesi.
Resulta que la principal també es pot escriure així, amb dos arguments,
argc i argv, on argc és el nombre de paraules que s'escriu després
el nom del programa en la línia d'ordres.
I argv són les paraules reals.
I com els claudàtors indiquen allà, argv és aparentment una matriu.
Serà una cadena després d'una sèrie després d'una cadena en la memòria.
Llavors, què serem capaços de fer, a partir de conjunt de processadors 2, es
alguna cosa com això.
Si faig argv1, que és un exemple tornarem a dilluns, i executar
ella, notar que no sembla fer res.
Simplement imprimeix el seu propi nom.
Però si dic adéu classe, observi que aquest programa aparentment es repeteix
sobre cadascuna de les paraules que s'escriuen en l'indicador.
I els mitjans pels quals puguin accedir a les paraules que l'usuari té
escriu en l'indicador és canviant principal, a partir d'aquest cap de setmana, a partir de int
main (void) per int main (argc, argv).
I així naixerà arguments de línia de comandes.
I un cop que estiguis molt sofisticat en això, vostè serà capaç d'escriure
programes realment al · lucinants, com aquest d'aquí, que va per sobre i més enllà
algunes de les funcions que hem fet fins ara, però tot molt potent.
>> Així que sortirem d'això amb això a la pantalla.
I ens veiem el dilluns.