[Powered by Google Translate] David J. MALAN: Bine, acest lucru este CS50, iar acest lucru este
începe de doua saptamani.
Thank tine.
Să ne începem aici cu un telefon.
Sunt pe cale să formați 617-BUG-CS50.
CS50: Acesta este CS50.
Pentru Boy Transfer, apăsați 1.
Pentru a porni din nou, apăsați 9.
David J. MALAN: Deci, a spus el pentru Boy Transfer, apăsați 1.
Deci, vom apăsați 1.
CS50: Care este originea ta?
Pentru quad, apăsați 1.
Mather, apăsați 2.
Boylston, apăsați 3.
Lamont, apăsați 4.
Mem Hall, apăsați 5.
Pentru a porni din nou, apăsați 0.
David J. MALAN: Vom apăsați 1 pentru quad.
CS50: de transfer următoare lasa in acest moment la ora 1:10, și
apoi la 1:20, 1:30 pm, 1:40 PM.
Acest lucru este CS50.
>> David J. MALAN: Deci asta e vocea lui CS50.
Și e un exemplu de felul de proiecte finale, pentru
exemplu, puteți mușca spre
sfârșitul semestrului.
De exemplu, faptul că există shuttleboy.cs50.net -
de fapt, un proiect pe care am scris prima după luarea CS51
înapoi, atunci când am fost un student.
Și aici a fost sursă de inspirație atunci, tot ce aveam era
listele tiparite de autobuz de transfer, și nu a existat nici
Noțiunea de a privi lucrurile on-line.
Și așa am un fel de porumbel într-un singur week-end, turnat prin
tipărite program, și portat la un program de calculator.
În timp, program de calculator sa întâmplat să fie scrise
în C. Și tu, de fapt ea a fugit de transfer Boy tastarea la o
clipește solicita ca ne-am făcut până acum.
Dar, peste ani, a evoluat într-o clipă
mesaje bot.
Este evoluat, mai recent, în acest site, într-o
SMS-pe bază de instrument, precum și în acest instrument de voce bazate pe.
Și acest lucru este de a face aluzie la felul de lucruri pe care le puteți
face pentru tine până la sfârșitul semestrului lui.
>> De exemplu, acolo, versiunea de SMS-uri de transfer se intampla Boy
să funcționeze, după cum urmează.
În cazul în care, pe telefonul mobil, trimite un mesaj text la 41411 și
trimite apoi sboy simbolul special, pentru Boy de transfer,
urmat de A și B, unde A este o origine și B este o
destinație -
de exemplu, Boylston Space Quad -
ceea ce ar trebui să mă întorc în câteva secunde este un text
mesaj de la Boy Transfer vă spun exact când
navete pentru următoarele câteva sunt, din acest punct A merge la faptul că
punctul B.
Și acesta este un exemplu mai general a ceea ce este cunoscut drept
folosind un API.
>> Deci, de exemplu, acest lucru aici este doar shuttleboy.cs50.net,
real web-based încarnare de acest lucru.
Dar datele care subliniază acest lucru și aplicații de altă natură care CS50
a dezvoltat sunt toate expuse pentru toată lumea aici, în forma
de API-uri, interfețe de programare a aplicațiilor.
Si asta e doar un mod fantezist de a spune că oamenii ne place pe
Internet și altele au petrecut ceva timp pentru a crea
software-ul pe care le puteți folosi pentru a apuca de date de la noi și
apoi construi aplicații proprii pe partea de sus
de acel set de date.
Deci, de exemplu, acest băiat de transfer API pagina aici, care
se întâmplă să fie în manualul de CS50, în esență, documente
cum poti sa te duci despre a cere CS50 serverele de date.
De exemplu, dacă sunteți familiarizat cu CSV fișiere, virgula
de valori separate, acestea sunt doar un fel de rapid și murdar
Excel-cum ar fi fișiere.
Astfel, puteți solicita Boy transfer pentru toate datele de pe toate
case si coordonatele GPS ale acestora, și veți obține
înapoi, în esență, o foaie de calcul ca și că această
puteți citi apoi într-un program de propria dvs. și apoi
genera rezultate, la fel ca Boy transfer în sine
se întâmplă să facem.
Pentru cei mai familiare, reprezentări mai moderne de date
includ JSON, JavaScript Object Notation.
Ceva se va întoarce la tine spre
sfârșitul semestrului.
>> Dar, din nou, aceasta este doar una din mai multe de API-uri proprii CS50 lui.
Și lucrul interesant este acum, în aceste zile, Facebook și
Twitter si Google și destul de mult fiecare site-ul web populare din
acolo are un fel de API, ceea ce înseamnă că dacă ai citit
documentația pe site-ul lor, vă înscrieți pentru un
cont, puteți începe apoi scrierea software-ul pe partea de sus a
indiferent de instrumente sau de date care compania nu oferă.
Și astfel unul dintre semenii noștri de predare proprii câțiva ani înapoi
a scris o versiune pentru Mac a acestui.
Deci, la link-ul cu denumirea Mac aici, la stânga sus, puteți de fapt,
descărca un Mac OS widget care ruleaza pe Mac ta de a face
aceleași tipuri de lucruri.
Deci e vorba de bazându-se pe partea de sus a seturilor de date cum ar fi acestea.
Dar mai mult pe faptul că spre sfârșitul semestrului.
>> Deci, haideți să se arunca cu capul în foarte repede la un bug, doar pentru a obține un fel de
lucrurile încălzit astăzi, și cred că din nou pe unele dintre
lucruri ne-am uitat în săptămâna trecută.
În special, lasă-mă să mergeți mai departe și trageți în sus, să zicem,
acest exemplu aici.
Buggy1.c, aceasta este disponibilă pe site-ul cursului, dacă doriți
Vrei să-l descărcați și scormoni în jurul valorii de tine.
Dar haideți să zoom in, aici, la acest program destul de scurt, și doar
o recapitulare super-rapid al unora dintre pietrele de temelie de bază care
suntem cu adevărat de gând să înceapă doar luați de la sine.
>> Deci, chestii albastru, în linii la 1 la 9, sunt doar
softball întrebări.
Deci, acestea sunt doar comentarii.
Ei nu au nici o semnificație funcțională.
Dar sunt comentarii în sensul că acestea sunt observă că
Eu, om, a făcut să mă astfel încât în ​​curs și, după
prelegere, îmi amintesc de fapt, ceea ce acest program
face fără a fi nevoie de a citi prin ea linie cu linie și
recrearea istorie în mintea mea.
Mai mult decât atât, în cazul în care am înmâna acest program la altcineva ca
te, e mult mai clar pentru tine, din cauza comentariilor de acest gen,
ceea ce de fapt face programul, sau cel puțin ceea ce
Programul presupune să faci.
Indiferent dacă este sau nu este corectă este o altă problemă cu totul.
Acum, în C, cu multi-linie comentarii, amintim că pe linia
de aici nu e simbolul magie, / *.
Aceasta înseamnă aici vine începutul unui comentariu.
Și nimic altceva contează până când ajungeți la sfârșitul terminator,
care este * /, opusul.
Deci, faptul că am 80-unele stele ciudate aici la
la stânga la dreapta este de fapt doar un detaliu estetic.
Ea nu are nici un sens funcțional.
>> Acum, ce zici line 11?
Ce înseamnă acest face în termeni de nespecialist?
Ce-i asta?
PUBLICUL: Include standard.
David J. MALAN: Bine, bine.
Deci, aceasta include biblioteca stdio.h.
Deci, ce înseamnă asta?
Ei bine, în interiorul acelui dosar, stdio.h, sunt o grămadă de
funcției declarații -
că este, cod care altcineva a scris.
Și un exemplu perfect de o funcție care este declarată în
stdio.h este -
care favorit pana acum?
Deci printf, una dintre cele mai comune de a utiliza, cu siguranță,
de timpuriu, de la faptul că biblioteca este acolo.
Dacă aș exclude această linie de cod, zăngănit este de gând să țipi
la mine ceva despre utilizarea unui simbol nedeclarată.
Ceva nedeclarată este, probabil, cuvinte cheie, deoarece
nu am informat compilatorul ce arată printf
Vrei excepția cazului în care vom include acea linie.
Și mai mult în jos pe Pământ, într-adevăr, ce linia se spune este
deschide acel fișier, stdio.h, ori de câte ori este pe serverul de
hard disk sau pe o unitate hard aparatului, și copy-paste-l
chiar acolo în dosarul meu, fără să-mi
având în a face acest lucru manual.
>> Acum, odată ce vom ajunge aici la principal, nu după mult timp vom începe
pune deoparte ceea ce int și ceea ce este nul.
Dar pentru moment, să ne uităm la cele trei linii
în termen de 15 până la 17.
Aceasta aici am pretinde ca buggy.
Linia 7 in comentariile mele spune: "Ar trebui să imprimați 10
asteriscuri, dar nu "de ce. acest lucru nu se imprimă, de fapt,
10 stele de acest fel?
PUBLICUL: [neauzit].
David J. MALAN: Exact.
Deci, observăm că suntem începe să numere de la 0.
Și aceasta este de fapt o convenție în programare și
informatică, în general, mai mult, începe să numeri
de la 0 în loc de 1.
Și acest fapt doar derivă din faptul că, pentru
exemplu, atunci când am avut opt ​​oameni pe scenă, atunci când
nimeni nu a fost ridicarea mâinii lor, au fost
toate în mod eficient zerouri.
Și așa e doar un fel de convenție computer, astfel,
Prin urmare, pentru a începe numărarea de la 0.
În cazul în care este cel mai mic număr vă poate reprezenta în binar.
>> Deci, aici am început initializarea i la 0.
Ne-am stabilit eu egal cu 0.
Dar apoi m-am făcut această greșeală aici, spunând i este mai mică sau
egal cu 10.
Dar, dacă credeți că prin, dacă am începe de la 0 și apoi plec
până la 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, eu de fapt de gând să
imprima 11 stele pentru ecran, pentru că m-am dus sus
la și egal cu 10.
Deci Easy Fix aici, atunci este ceea ce?
PUBLICUL: [neauzit].
David J. MALAN: Doar schimba-l la mai puțin de.
Dacă chiar vrei, ai putea face acest lucru.
Dar, în general, care a dezaprobat.
Și astfel începe să numere de la 0 este doar ceva ce ar trebui să
de obicei, te obișnuiești.
Acum, ce zici de această construcție întreagă în sine?
Această linie de 15 demarks o buclă pentru.
Deci, pentru a nu este o funcție.
E doar o declarație.
E o construcție looping, cum am văzut în Scratch.
Și are trei părți.
Observați că există o prima parte a
stânga punct și virgulă.
E partea de mijloc între cele două semne punct și virgulă.
Și apoi e partea dreapta spre dreapta
din punct și virgulă două.
Acum, prima dintre acestea nu ce?
PUBLICUL: [neauzit].
David J. MALAN: Inapoi acolo?
Da?
PUBLICUL: inițializare.
>> David J. MALAN: inițializare.
Deci, ce înseamnă?
Noi am declarat-o variabilă numită i.
Acesta este de tip int, pentru că am specificat int i.
Iar eu am initializarea la valoarea de 0.
Deci, ce e asta spune de fapt?
Este eficient pentru a spune calculatorului hei, da-mi destul de
de memorie, RAM suficientă, pentru a se potrivi un număr, iar apoi a pus
Numărul 0 în acea bucată de RAM.
Și, ca o paranteză, cât de mare este un int de obicei, cel puțin în interiorul
a aparatului?
PUBLICUL: 32 de biți.
David J. MALAN: 32 biti.
Deci asta înseamnă să-mi dai 32 de biți, altfel cunoscut sub numele de 4 octeți,
și a pus în ea valoarea 0, ceea ce este destul de ușor, deoarece
Aceasta înseamnă doar selecteaza toate biții la 0.
>> Deci, acum, a doua parte aici este condiție.
Și condiție, așa cum sugerează și numele, este ceea ce se verifică
din nou și din nou și din nou pentru a stabili dacă e adevărat sau fals.
Deci, aceasta este doar că fac următoarele linii de cod -
și anume linia 16, pentru că e singurul indentate
dedesubt -
atât timp cât i este mai mic de 10.
Și după fiecare iterație prin aceasta bucla, nu
incrementare, care în acest caz este i + +.
Acum, nu trebuie să fie i + +.
Ar putea fi i -.
Dar dacă am făcut acest lucru, ceea ce se întâmplă comportamentul
a fi de acest program?
PUBLICUL: Va fi o buclă infinită.
David J. MALAN: O să fie un fel de buclă infinită,
dacă nu vom avea noroc după negativ 2 miliarde sau cam asa ceva.
Poate lucrurile se vor încadra în jurul valorii de, doar prin natura finit
numărul de biți pe care le-am alocat pentru un int.
Dar e cu siguranță o să itera mult mai puțin de 10 și
cu siguranță mai mult de 11 de ori aici.
>> Și acum, la fel ca o parte, realizăm că i + + și i -
sunt de fapt doar zahar sintactic.
E doar notația prescurtată pentru ceea ce e un pic mai mult
în mod explicit în scris, după cum urmează:
i = i + 1.
Care este identic cu i + +.
Este doar un fel de a spune pare mai frumoasa i + +.
E mai succint, mai ușor de citit.
Și astfel, cei mai mulți oameni fac asta în loc.
Dar acest lucru este identic funcțional la
ceea ce am văzut.
Deci, pe scurt, fix rapid aici este doar să spun itera i
de la 0 tot drumul până la mai puțin de 10.
Și apoi vom avea într-adevăr, 10 stele.
>> Deci, haideți să încercăm asta.
Lasă-mă să deschid terminalul de la partea de jos.
Lasă-mă să merg în directorul care aceasta este inch
Și am de gând să-l compilați manual cu zăngănit de acum.
Și am de gând să compilați ca buggy1.c, Enter.
Și acum buggy1, de ce nu există un astfel de fișier sau director
buggy1 sunat?
PUBLICUL: [neauzit].
David J. MALAN: Da.
Deci, de fapt numit a.out.
Deci, dacă aveți o amintesc doar zăngănit, în cazul în care este zăngănit
compilator, si nu specificați numele pe care doriți să
da programul, se va implicit a.out.
Deci, într-adevăr, dacă fac ls -
Hopa.
Și am didn't - problema negru-și-alb unele dintre
te-ai confruntat a fost stabilit.
Dar lasă-mă să fac asta.
Momentan nu avem a.out pe partea stângă acolo.
Deci avem de a rula a.out loc de buggy1.
>> Așa că lasă-mă să mergeți mai departe și de a face acest lucru.
/ A.out., Enter.
Și eu se pare că nu am făcut ce?
PUBLICUL: Salvare.
David J. MALAN: Salvați fișierul meu.
Astfel încât este ușor de rezolvat prin lovirea S de control, sau de gând să
File, Save, la fel ca în cele mai multe programe.
Lasă-mă să merg în jos aici, a goli ecranul, rulați-l din nou.
Si inca exista un bug.
Deci, ceea ce se întâmplă -
PUBLICUL: Nu ai compila.
David J. MALAN: Ah, bine.
Nu l-am compila.
Ca un idiot, mă uit la codul pentru a vedea ce sa întâmplat.
Deci buggy1.c zăngănit, acum a.out.
Și Pfiu, salvat.
>> Deci, se pare un pic urât, deoarece nu exista nici o linie nouă
oriunde în program.
Dar, din nou, asta e doar un detaliu estetic.
Și, cel puțin dacă socotim pe cei afară, ar trebui să ne
vedea acum 10 stele respective.
Ei bine, ce zici de această a doua de warm-up de exemplu?
Deci, în buggy2, eu pretind că această versiune, de asemenea, se va imprima
10 stele, una pe fiecare rând.
Deci de data asta, am un caracter linie noua, doar pentru a face
lucrurile un pic mai frumoasa.
Dar, în loc ceea ce am obține este acest lucru.
Așa că lasă-mă să fac buggy2.c zăngănit, Enter.
Acum este din nou numit a.out.
Enter.
Eu văd doar o singură linie nouă, doar ultima linie foarte nou, care
se mută promptă mea la linia următoare.
Și totuși, în mod clar am fost imprimare *, apoi o linie nouă,
*, Apoi o linie nouă.
Dar ceea ce este bug aici?
Da?
PUBLICUL: [neauzit].
>> David J. MALAN: Exact.
Deci, spre deosebire de unele limbi, cum ar fi Python, în cazul în care indentare
de fapt, are sens funcțional, într-o
Limba precum C -
cum vom vedea, PHP, JavaScript -
indentare este într-adevăr doar pentru beneficiul oamenilor ".
Deci, faptul că am alin 16 și 17 arată foarte bine,
dar nu are nici un sens funcțional aici.
Dacă vreau să execute ambele linii, ca parte a de
buclă, atunci eu trebuie să le includeți în acolade de a face acest lucru.
Puteți tăia doar că colț și să omită acolade, dacă
ceea ce e cazul?
PUBLICUL: Doar o linie.
David J. MALAN: Doar o linie.
Deci, asta e doar un fel de fel de frumos detalii sintaxă, astfel încât
să nu pierdeți timp cu scrierea trei linii, dintre care două sunt
acolade, doar pentru a scrie o singură linie de cod.
Dar, dacă aveți două sau mai multe linii, am
într-adevăr, nevoie de a face acest lucru.
>> Asa ca lasa-ma acum salveze asta.
Lasă-mă să merg mai departe și re-rula zăngănit.
Atunci lasă-mă să rulați din nou a.out, iar acum primesc câte unul pe linie.
Acum, din nou, a.out este un fel de nume de prost pentru un program.
Cum îmi pot da seama zăngănit de a da de fapt mi ​​un nume de fișier
asta e mult mai user-friendly, cum ar fi buggy2 sine?
Un pic mai clar?
PUBLICUL: [neauzit].
David J. MALAN: Bine, așa că am putea lua de fapt, foarte
user-friendly de comenzi rapide și doar scrie fac buggy2.
Eu nu precizează c în acest caz., Și apăsați Enter.
Și ceea ce fac nu este compilează buggy2.c pentru mine de către
cere zăngănit de a face acest lucru.
Mai precis, se solicită zăngănit, zăngănit ruleaza folosind mod mai
linia de comandă argumente sau comutatoare de fapt am nevoie.
În timp, ne vom întoarce la ceea ce toate aceste diferite
expresii criptice despărțite în silabe înseamnă.
Dar pentru acum, că e tocmai m-ai salvat de probleme
să vă amintiți și de a trebui să introduceți din toate cele
diverse expresii despărțite în silabe.
Și capul de ea în cele din urmă este
ca acum am buggy2.
Dacă vreau să fac asta manual, deși, am
poate face acest lucru în schimb -
zăngănit-o buggy2 și apoi buggy2.c.
Și că va da în mod similar mi un fișier numit buggy2.
>> Deci, pe scurt, zăngănit e compilator.
Asigurați-este doar un instrument user-friendly care vom folosi mai mult
și mai mult, pentru că pur și simplu începe să
simplifica lucrurile pentru noi.
Și ne vom întoarce 0, în cele din urmă.
Pentru moment, doar pentru că, dar vom începe tachinare că o parte
azi si miercuri.
Orice întrebări cu privire la oricare din astea?
Da?
PUBLICUL: [inaudibil]
E în citate acolo?
David J. MALAN: OK.
Când am scris în ls citate, care mi-a fost faci unele magie
în spatele scenei pentru a repara o eroare.
Mi-am uitat, ca ne-am spus multora dintre voi pe
forumuri de discuții, de a face -
vom face acest lucru acum - sudo yum-y update appliance50.
Hopa, că e scris corect.
Deci, aparatul este ca un sistem de operare.
Se rulează acest sistem de operare numit Fedora.
Și acum, din cauza conexiunii mele la internet lent, Am
într-adevăr hosed.
Rulează atât de actualizare yum sudo, așa cum am să vă spun să faceți în
set de probleme, este ca essentially rulează actualizări automate
în Mac OS sau Windows.
Și motivul pentru care rulează acest lucru la început de
Setul Problema este că atunci când am creat aparatul, am
încurcat, și am făcut accidental toate programele arata
negru pe un ecran negru, care este motivul pentru care nu te-i vadă
în mod implicit.
Dar cea mai recentă versiune a aparatului stabilește acest lucru.
Și eu voi repara asta în timpul pauzei de o dată am internet
conectivitate.
>> Deci, citate ascunde doar greșeala mea, foarte discret,
aparent.
Alte întrebări?
Da?
PUBLICUL: În cazul în care se face venit?
[Neauzit]
David J. MALAN: Bună întrebare.
În cazul în care se face venit?
Acesta este un program de Linux care a existat timp de mulți ani, timp
înainte de CS50.
Și el vine cu un sistem de operare cum ar fi Fedora.
Ea nu vine de la biblioteca CS50.
De fapt, singurele lucruri care vin de la biblioteca CS50
până acum, pe care le-am văzut, sunt getString, GetInt, toate
Ia cei funcții, precum și șirul de cuvânt, iar pentru unii
măsură, cuvântul bool.
Dar vom tachineze că, în afară atunci când ne scufunda in CS50
aparatul în sine.
>> Deci da, o întrebare mai mult aici.
PUBLICUL: Când ai spus si apoi faceti buggy, cum se
calculator stiu [neauzit]?
David J. MALAN: Bună întrebare.
Deci, atunci când trebuie doar să rulați face buggy1 sau de a face buggy2, cum
nu face știe?
Deci în mod implicit, dacă tastați face buggy1, face look pentru o
fișier numit buggy1.c.
Și apoi execută comenzile corespunzătoare zăngănit,
imperative astfel fișierul de ieșire implicit numit a.out.
De fapt, dacă ne uităm la ceea ce fac, ceea ce -
să renunțe la acest lucru.
Dacă ne uităm la ceea ce face a fost de fapt a face, a face buggy2,
e deja până la data de.
Așa că lasă-mă să scoateți comanda rm,
Programul-am scris înainte.
Tastarea Y-E-S pentru a confirma că vreau să-l eliminați.
Dacă aș face acum fac, observăm că în această linie foarte lungă,
e chestia asta ultimul aici, o-buggy2.
Toate acestea fac este de a face trece acest argument, ca să spunem așa, să
Zăngănit, așa că nu trebuie să tastați-o eu.
>> În regulă, deci un cuplu rapidă administrative
anunțuri.
Deci, pentru secțiuni, care a început în mod oficial această venire
Duminica, veți dori întotdeauna să aducă, în cazul în care
aveți unul, un laptop.
Dacă nu aveți un laptop, nu ajunge la mine prin
cădere-mi un e-mail.
Și ne vom da seama unui flux de lucru.
Ce, în general, veți găsi în secțiunea este că acestea sunt o parte
partea conceptuală, hands-on.
Vom folosi în mod special secțiunea de întrebări, o parte din
set de săptămână problema, sa se plimbe prin intermediul unora dintre
Materialul conceptuală de la curs.
Și asta e tot în set de probleme actuale.
Și vom arunca cu capul, de asemenea, în unele activități hands-on, uneori
din care vor fi necesare pentru a fi prezentate, uneori de
care nu o va face.
De exemplu, aceasta prima saptamana, acestea sunt menite doar ca un
warm-up exercitii.
Și veți găsi că aceste probleme sunt de fapt doar asta.
Ei trebuia să fie destul de mici, dar nu neapărat
programe banale pentru a scrie, care nu sunt în mod neapărat
incitante în sine și oportunități, dar sunt bune la
practica cu sintaxa, cu noi funcții, în confortul unui
secțiune în cazul în care aveți câteva dintre colegii dvs. prezinte, cât mai
precum și TF ta.
>> Și ce vom face în timp este utilizat un instrument numit CS50 Spatii,
prin care în loc de a folosi doar Aparatura CS50, veți
in loc sa mearga la o pagină Web într-un browser, în cazul în care veți putea
pentru a scrie cod într-o fereastră de browser în timpul secțiune.
Și apoi, dacă vă înscrieți, colegul tău de predare poate afișa apoi
orice ar fi te tastarea pe ecran în browser-ul tău
fereastră în sus la fața clasei, dacă anonim sau
public, astfel încât el sau ea poate merge apoi prin intermediul cu
colegii tai ce ai facut bine, ceea ce nu a făcut bine.
Și din nou, fiți siguri toate acestea pot fi anonimizate frumos.
Dar va fi o ocazie frumos pentru mult mai mult
interactivitate decat ceva de genul prelegere permite.
>> Între timp, vom avea aceste lucruri numite super-
secțiuni, care sunt opționale, dar sunt deschise pentru toată lumea, în
clasă, astfel încât să puteți face acest lucru mai mult colectiv pentru
Problema setezi una.
Iată programul.
Acest lucru este, de asemenea, postat pe pagina de pornire de la cs50.net.
Observați că acolo va fi un hacker specifică
un mâine după-amiază.
Și vom filma una azi și una mâine și posta acele
on-line în termen de 24 de ore.
Deci, nu, dacă nu puteți face oricare din aceste vremuri, să vă faceți griji.
Și din nou, programul este online acum la cs50.net.
>> În ceea ce privește secționare în sine, ar trebui să fi ajuns o
trimite instrucție să te duci la pagina cursului pentru a găsi
sectiunea ta.
Dacă viața sa schimbat și aveți nevoie pentru a schimba punctul dumneavoastră,
nu este o problemă.
Du-te înapoi la același URL, cs50.net/section, singular,
și vei completați formularul de asemănătoare, astfel încât să puteți
apoi da-ne preferintele tale.
Și vom urmări până la sfârșitul săptămânii ca la ceea ce putem
găzdui.
Săptămâna trecută, amintesc că ne-am propus utilizarea CS50 Discuss,
instrument cursului discuției, în curs.
Deci, am avut 40 de întrebări care au fost puse și
un răspuns în cursul curs.
Deci, părea să funcționeze bine, așa că vom continua
încercarea de a face acest lucru.
În cazul în care, în timpul prelegerii, nu te simți confortabil doar educație
mâna, nu este o problemă.
Du-te la cs50.net/discuss, posta acolo, și unul dintre predare noastre
semenii va răspunde, fie ea electronică sau le ridica
mână, pe numele dvs. anonim să întreb, în ​​funcție de
privind natura întrebare.
Și în ceea ce privește feedback-ul, în general, va fi psets
returnat în termen de o săptămână.
Deoarece este nevoie de ceva timp pentru a realiza secțiuni
echilibru, PSET în primul rând, 0 și 1, va fi un pic
întârziată ca lucrurile se stabilească.
Dar stați tuned pentru că în următoarele săptămâni să vină.
>> În regulă, asa ca lasa-ma pus pe serios meu
voce doar pentru un moment.
Deci, aceasta este de fapt un climat interesant pentru a fi
având în această discuție, ceea ce cu toate celelalte lucruri
întâmplă pe acesta campus conexe.
Dar cu siguranță a avut CS50 istoria sa de această special
subiect, în la fel de mult ca în fiecare an, acest curs, pentru mulți
ani, Ad-Boards aproximativ 3% din clasa.
În acest an cea mai recentă, 2011, CS50 Ad-au urcat 35 de studenți.
Acest lucru nu este, cred eu, din cauza lipsei de claritate.
Realizati ca în programa cursului, există o pagină de
declarație care să explice în cazul în care liniile sunt.
Această declarație se repetă aceeași pe fiecare dintre
Problema stabilește pe o singură pagină.
>> Așa că am menționez acest lucru astăzi într-adevăr doar pentru a face
oameni buni Conștientă de acest.
Și am încercat lucruri diferite.
Și ceea ce am crezut că ne-ar face astăzi este să ia doar un moment pentru a
de fapt, uita-te la unele dintre cazuri anterioare care au venit.
, Mai degrabă decât să mențină aceste secrete murdare ca, de fapt,
subliniez ceea ce elevii au făcut și cum ne-am detectat
l și într-adevăr ceea ce este motivația general pentru
având în chiar această conversație.
Deci, cu care a spus, în esență, linia este aceasta -
pe programa, esti binevenit, vă sunt încurajate, pentru a
vorbesc cu colegii de clasă.
Asta e tot scopul de a avea aceste colaborare
orelor de serviciu în Annenberg și încurajarea oamenilor pentru
proiect final de a lucra împreună.
Dar linia este întocmit atunci când vine vorba de timp pentru a scrie, de fapt
Soluția finală.
Vorbind în limba engleză, total bine, vorbind în cod pseudo,
total bine.
Emailing un coleg PSET dvs., permițându-le uite peste
ecran ca mâinile continua tastarea,
peste linia de asemenea.
Nu te uiți la programa școlară pentru liniile particulare.
>> Dar doar pentru a picta o imagine a modului în care acest lucru este, din păcate, un
realitate, dau seama că există site-uri web acolo, care
au soluții din această clasă și multe alte clase.
Faptul că tu sau aproximativ 3% dintre voi știu că există acest
înseamnă că știm că aceasta există.
Faptul că există site-uri web ca asta în cazul în care
pot plăti pe cineva să facă de fapt, seturi de problema ta - acest lucru a fost
un caz real care a venit anul trecut.
Acesta este un site web numit odesk.com.
Si Tim a fost numele persoanei care a fost aici, postarea pe
acest site și a rugat pe cineva să facă PSET lui 7 în
acest caz particular.
Ei bine, este foarte odesk.com Google măsură, și noi suntem
foarte bun la cu Google.
Aici, de asemenea, există site-uri - si asta e destul de
atroce, sincer.
[Râsete]
David J. MALAN: amuzant lucru despre acest site este în cazul în care
ai citit pagina Despre, ei vorbesc despre corporativă lor
Serviciul cultura și modul lor de client este numarul unu
prioritate, pentru a vă asigura că sarcinile dvs. să obțineți
pornit la timp.
>> Dar în toată seriozitatea, din nou, faptul că aceste site-uri
există, ne dăm seama, de asemenea, sunt conștienți de
aceste tipuri de site-uri.
Și pentru a vă oferi un sentiment de ceea ce face, în general, această
ia, în general, noi nu avem mari scandaluri în care oamenii
colaborează pe orice tip de scară largă, ci mai degrabă
E aceste momente de noapte de slabiciune, în cazul în care aveți atât de
multe de făcut, e 4:00 AM, ești epuizat, și tu
cred că la tine, ei bine, lasa-ma sa ia doar o privire la meu
coleg de cameră sau codul prietenul meu sau similar.
Și manifestările de acest implică, din păcate, Student
Un ceva de genul depunerea și transmiterea Student B
ceva de genul asta, care cu siguranță, într-un calculator
Clasa de știință, este extrem de ușor pentru oamenii de stiinta de calculator
pentru a detecta cu software-ul.
Aceasta este o altă paradigmă comună, în cazul în care ați un fel de
a fost de lucru alaturi de cineva, poate vorbi în
Engleză, bine, pseudocod.
Dar apoi vine vorba de timp pentru a prezenta efectiv, precum și psets
Tocmai te schimbate prin e-mail sau Dropbox sau similar.
Dar, într-o încercare de a face mai puțin evident că acest lucru este
ceea ce sa întâmplat, atunci acest lucru este ceea ce se prezentate.
Acest lucru, de asemenea, nu excursie la bine-scrise bucăți de
software-ul ca și cum am avea de a detecta efectiv
aceste tipuri de lucruri.
Și într-adevăr, ceea ce facem noi este programul administrat de care compară toate
din acest an declarațiile împotriva tuturor a lui anul trecut
observațiile, împotriva a tot ce-am găsit pe
Internet, față de fiecare site-ul de locuri de muncă acolo.
E foarte automatizat.
Și așa facem acest lucru într-adevăr, în corectitudinea mare de 97%, care
sunt într-adevăr de lucru de pe fundurile lor în acest sens și în alte
clase și punerea în tot acest efort de muncă, astfel încât
acestea prezintă în cele din urmă este a lor.
Și eu pot merge pe pentru vârstele.
>> Acestea sunt doar câteva cazuri de anul trecut.
Cativa studenti transmise aceste fișiere în mod identic pentru PSET 2,
PSET 3, 4 PSET, PSET 5, 6 PSET, PSET 9.
În acest caz, aceasta a fost Quiz 0 și în anul trecut, în care două
elevii transmise identic acestei propoziții printre multe altele
alții, "cererea de tip -" dot, dot, dot.
Deci, chiar intr-o clasa de 600 am detecta acest
pe a prezentat teste.
Deci, pe scurt, acest lucru - sincer, urăsc cu acest tip de
conversație - dar acest lucru este într-adevăr un efort deliberat
în acest an pentru a încerca de a conduce în jos acel număr.
Pentru că, chiar dacă am spune aceste tipuri de lucruri la fiecare
ani, cred că realitatea de a fi locuit pe ea pentru câteva
mai multe secunde decât de obicei și de fapt doar subliniind
că ceea ce s-ar putea părea, nu-i așa, nu o astfel de afacere de mare, cel puțin
gândesc la acest moment, atât în ​​echitate a
tine și colegii dumneavoastră pentru a aici.
Deci, dacă aveți vreodată orice întrebări cu privire la cazul în care linia de
este, te rog ajunge la mine personal.
Dar răspunsul este mereu, complet subliniat la
last minute, bani într-o zi de întârziere.
Sau dacă este o chestiune de a nu avea nici o zi întârziere,
sincer, mi e-mail personal.
Ne vom da seama ceva.
Vă rugăm să nu puneți timp aici la Harvard, la risc.
>> Acum, m-am gândit că ar trebui să lumineze starea de spirit, așa că am
inclus aceasta ca slide-ul urmator.
[Râsete]
David J. MALAN: Acest site a fost grozav.
Am de fapt, un pic distras.
Nu e asta.
Și apoi asta a fost uimitor.
Bine, cred că de pisoi noaptea târziu atunci când se face
aceste decizii.
Toate lucrurile dreapta, astfel încât înapoi la mai multă distracție și mai puțin grave, cum ar fi
condiții.
>> În regulă, așa că am vorbit pe scurt despre acestea.
Acest lucru este ceva care este, probabil, destul de familiarizat de la
lumea Scratch.
Iar în lumea Scratch, avem această nevoie, uneori, de a
du-te face furcile în drum.
Face fie prezenta sau că acest lucru sau alte aici.
Și atunci când vrem să facem acest lucru, putem folosi, în C acum, în cazul în care acest
altceva construi.
Și apoi aici, avem expresii booleene.
De exemplu, expresii booleene aici, putem SAU
le împreună, în sensul că avem această condiție SAU
această condiție.
Putem și le împreună, în sensul că dorim să
verifica această condiție și că această condiție.
Și aici avem o declarație comutator acum, ceea ce nu este atât de
similară sintactică a acestor tipuri de condiții, dar
ne permite să facem în cazul în care echivalentul a, în cazul în care altcineva, altceva în cazul în care, altfel
în cazul în care, la fel ca și prin simpla enumerarea acestora de la caz la caz,
de la caz la caz.
Deci, am văzut pe cei ultima dată.
Și apoi am început atingând la lucruri cum ar fi buclele.
Am văzut unul dintre acestea doar o clipă în urmă.
Dar există aceste constructe alte buclă.
>> De exemplu, cel de aici.
Deci, în timp ce (conditie), face acest lucru din nou și din nou.
Deci fundamental, ceea ce pare a fi diferit între acest
pentru bucla și această buclă în timp ce aici?
Această buclă și pentru această buclă în timp ce.
Da?
Ce-i asta?
PUBLICUL: [neauzit].
David J. MALAN: Bine.
Deci, în timp ce în stare de buclă pentru, există în mod clar
mai mult sintaxa.
Nu e asta initializare, e această actualizare.
Într-o buclă în timp ce, e doar această condiție.
Deci se pare că e un pic în jos față de comparație pentru
buclă, ceea ce înseamnă, dacă vrem să avem variabile și vrem
pentru a avea incrementare, avem de fapt să
face acest lucru noi înșine.
>> Așa că lasă-mă să mergeți mai departe și să se deschidă gedit.
Lasă-mă să comuta la aparatul.
Și hai să facem doar un exemplu rapid mic care
distinge una dintre acestea de la celălalt.
Și în partea din spate a mintea mea aici, ar trebui să spun un singur lucru.
Am menționat în mod special numele Tim.
Tim a fost de fapt pe cineva care un student a încercat să găsească pentru a face
temele pentru ei.
Nu am avut Tim în secțiunea special.
Deci dau seama, ca nu cumva am dezvăluit un student, nu a fost un student.
A fost o persoană aleatoare pe Internet face lucruri
de anul trecut proxy.
Așa că am găsit că este, de asemenea.
Deci, în acest caz aici, lasă-mă să merg mai departe și
deschide un fișier nou.
Fișier, Noua.
Acest lucru îmi dă o filă aici.
Lasă-mă să mergeți mai departe și salvați-l ca loop.c.
Lasă-mă să merg și faceți clic pe Salvare.
Și apoi aici, hai să mergem mai departe și începeți să scrieți
# Include .
Lasă-mă să zoom inch
Acum, vom face int main (void).
Acum, lasă-mă să merg mai departe și de a face pentru (int i = 0; i <
oh, 10; i + +).
Și acum am de gând să merg mai departe și nu imprimați steaua pe care am
făcut-o mai devreme.
Și apoi, la sfârșitul acestui program, suntem doar de gând să
imprima o linie nouă, doar pentru ca mi prompte
nu arata tot murdar.
întoarce 0.
Se pare corect sintactic?
Până în prezent.
Deci, haideți să vedem.
>> Așa că lasă-mă să zoom out, du-te în fereastra terminalul meu.
Și lasă-mă să merg mai departe și a alerga bucla, pentru că am numit acest
lucru loop.c.
Deci, a face bucla.
Pare să compileze OK.
Lasă-mă să fugi buclă, și acum Enter.
Și se pare că au fost tipărite 10 stele.
Așa că hai să converti asta într-o buclă de timp și a vedea ce
tipuri de probleme noi de călătorie de peste.
Deci, în loc de aceasta, permiteți-mi să merg aici și să spun în timp ce i este
mai puțin de 10 -
lasă-mă să scap de bucla for.
OK, deci avem o serie de probleme deja.
Deci, condiția este aceeași, dar eu sunt lipsesc în mod evident
inițializare.
Sunt lipsesc incrementare.
Deci, ce ar trebui să spună probabil compilatorul mine când încerc să
compila acest program?
Da?
PUBLICUL: [neauzit].
>> David J. MALAN: Bine.
Deci, o să spună ceva de genul nedeclarate - în acest
caz, i variabilă.
Și într-adevăr, utilizarea de identificator nedeclarate i.
Și astfel acest lucru este în contrast cu limbi, cum ar fi PHP si
Python și Ruby, cu care unii dintre voi s-ar putea să fie familiarizați,
în cazul în care puteți doar un fel de a începe să utilizați variabile
vrând-nevrând, și nu trebuie să vă faceți griji cu privire la declararea lor
în mod explicit întotdeauna.
În C și în limbile de, cum ar fi Java și C + +, trebuie să fie
super-explicite.
Și dacă vrei o variabilă numită i, trebuie să-mi spui
ce fel de variabile este.
Deci, vom avea pentru a rezolva această, după cum urmează.
Am de gând să aibă de a merge în sus și tastați aici int i, prin urmare,
Am declarat o variabila numita i.
Acum, am sărit un pas.
Am, evident, nu-l inițializată, dar să vedem dacă la
cel oprire mărci zăngănit plâng.
Așa că lasă-mă să refacă acest program.
>> În regulă, acum e doar plange
pentru un alt motiv.
"Variabila" i "este neinitializata atunci când este utilizat aici." În regulă, așa
e destul de explicit.
Inițializate înseamnă doar setarea este egală cu o valoare.
Și nu ne-am facut asta, asa ca lasa-ma sa incerc este egal cu 0.
Acum, haideți să încercăm din nou și re-rula zăngănit.
Compilate de data asta.
Și eu sunt pe cale să-l rulați.
Dar mare buclă infinită vechi, pentru că am făcut
initializare, am făcut condiție, dar eu n-am făcut
orice fel de incrementare.
Deci, cum pot face incrementarea?
Ei bine, într-o buclă în timp ce, se simte ca și cum am de gând să aibă
pentru a face acest lucru in interiorul buclei, pentru că la fel ca primul
săptămânii exemple de constructe face în buclă, cum ar fi cu
șosete și cu auto-numărare, am avut de a face
ceva de la sfârșitul foarte, ca du-te înapoi la linia următoare.
Ce se întâmplă dacă am merge mai departe și de a face acest lucru am + + aici?
Să nu compila chiar și această.
Prinde-mă deja.
Ce sa întâmplat aici?
PUBLICUL: [neauzit].
>> David J. MALAN: Deci nu e sigur int.
E i..
Și acolade, ca înainte,
indentarea nu este de ajuns.
Așa că acum am această construcție.
Deci, în timp ce i este mai mic de 10, imprimați o stea,
apoi i incrementa.
Și modul în care o în timp ce lucrările la bucla este că de îndată ce te-a lovit
partea de jos a buclei, care, în acest caz, arata ca linia 10,
se va întoarce la linia 6, moment în care
condiție va fi verificată din nou.
Și dacă i este în continuare mai mic de 10, vom face liniile 8 și
apoi 9, apoi ne vom lovi 10, și du-te înapoi la 6, din nou și
din nou și din nou și din nou, atât timp cât i este mai mic de 10.
Deci, haideți să re-rula face aici.
>> Bine, am compilat bine.
Lasă-mă să re-rula bucla.
Și acum, de fapt pare să funcționeze.
Deci, plusuri și minusuri aici?
Ei bine, până acum nu există de fapt, nu un ansamblu de PLO -
atât de drăguț.
În regulă, asta a fost o - ah, asta a fost un accident.
În regulă, așa că hai să ne întoarcem la bucla for.
Deci, pentru bucle sunt frumoase, deoarece acestea sunt foarte explicite.
Și chiar dacă ele sunt un pic mai greoaie pentru a scrie, e
foarte puternic si iti permite sa faci
mai multe lucruri deodată.
În timp ce buclele nu par a avea o mare cantitate de valoare doar
totuși, pentru că se simte ca și cum am doar trebuie să facem mai mult de lucru.
Trebuie să punem initializare aici,
actualiza aici, iar noi trebuie să ne amintim să facă toate astea.
Deci, vom vedea în momentul în care buclele în timp ce împrumuta de fapt,
se la doar contexte diferite, date diferite
structuri, cum ar fi liste și tabele de dispersie, lucrurile vom ajunge la
la mijlocul-semestru.
Dar pentru acum, știu că există acest al treilea tip cunoscut ca un do-
în timp ce bucla.
Și am văzut asta pe scurt.
Și acest lucru ar putea fi de ajutor super cu PSET 1.
De fiecare dată când vrei să faci ceva și apoi verificați dacă
utilizatorul a cooperat, iar dacă acestea nu au, o fac din nou, un do-
în timp ce bucla se pretează la acest tip de logică.
Deoarece ca comanda de sus în jos sugerează aici,
nu înseamnă, literal, face acest lucru.
Și de a face acest lucru din nou și din nou, ceea ce ar putea fi?
Poate că înseamnă GetInt de asteptare sau getString și apoi
verificarea valoarea GetInt sau getString și apoi striga
la utilizatorul în cazul în care nu au cooperat, cerându-le
din nou și din nou și din nou.
În cazul în care vrei să faci ceva o dată,
apoi a verifica anumite conditii.
>> Deci, haideți să încercăm asta.
Lasă-mă să schimbați, de fapt asta acum într-o buclă do-timp.
Și am de gând să merg mai departe și procedați în felul următor.
La fel și următorul.
Hai sa facem int i = GetInt (), dar hai sa spun in primul rind de utilizare
ce să fac.
Deci, un pic diferit de data asta.
"Dă-mi un int".
Așa că voi folosi printf pentru asta.
Și acum am de gând să merg aici, și am de gând să fac asta
în timp ce i este, să zicem, mai mare decât -
Să vedem, i este, să zicem, mai puțin decât 0, sau i se
mai mare de 10.
Cu alte cuvinte, vreau un număr de la 1 la 9, doar
arbitrar.
Deci, eu am folosit o expresie booleană aici pentru a combinat
asigurați-vă că i este mai mic decât 0 sau mai mare de 10, în care
caz că va face acest lucru bucla din nou aici.
Deci, din nou, face acest lucru -
în timp ce i este mai mic decât 0 sau i este mai mare de 10.
>> Deci, acum să mergem mai departe și face acest lucru după ce am făcut asta.
Hai să facem doar o verificare rapidă bun-simț.
printf ("Mulțumesc, i este% d", i).
Deci, acest program simplu solicită de utilizator pentru un int,
face sigur că e ceva în intervalul de la 1 la 9 inclusiv,
și apoi mulțumește utilizatorului, amintindu-le ceea ce ei tocmai
tastat în, la fel ca și un cec bun-simț pic.
Dar hai să vedem dacă asta funcționează astfel cum sa prevăzut.
Lasă-mă să merg cu capul în jos aici și re-rulați make buclă.
Hmm.
"Utilizarea identificator nedeclarate" i "". Asta e ciudat.
Am crezut că am rezolvat asta.
Același simptom, dar alt cod.
Da?
PUBLICUL: [inaudibil] în interiorul doi, trebuie să ne
[Neauzit].
>> David J. MALAN: Exact.
Deci, acest fapt ne conduce la un subiect cunoscut sub numele de domeniul de aplicare.
Se pare că C, din nou, într-adevăr te duce literalmente.
Și dacă faci ceva de genul asta în cazul în care declara o int
și atribuiți apoi o valoare, dar să faci asta în interiorul unui
pereche de acolade, ceea ce face C este se presupune că
vreau doar acele biti 32 cunoscuți ca i să existe în cadrul
cadrul acestor acolade, în contextul liniilor
6 până la 9. Deci, i este declarată, și se atribuie un
valoarea din linia 8, dar de îndată ce ajungi în afara
Linia 9 de mai jos bretele cret, i nu mai este în
domeniul de aplicare, ca să spunem așa.
S-C-O-P-E. E nu mai este în contextul potrivit.
Deci, acum nu există nici un i, așa că e ca și cum nu am avut chiar
a declarat că, la toate.
>> Deci, ce e un fix atunci pentru așa ceva, în cazul în care
Motivul este că i este declarat în cadrul acolade, care
este aparent rău?
Aici?
PUBLICUL: [neauzit].
David J. MALAN: Da.
Astfel încât să putem inițializa afara.
Așa că lasă-mă să merg mai departe și ștergeți părțile declarație prin care
Am specifica tipul, și lasă-mă să-l fac aici.
Deci, în linia 5, acum spune: "Dă-mi un int." Spune-i.
Observați în linia 9, nu vreau să fac asta, pentru că am
au deja biti 32.
Nu vreau să solicite un calculator pentru
biți diferite 32.
Vreau să folosesc aceste aceleași 32 de biți.
Și acum, pentru că i se declară în linia 5, este încă legit
să-l folosească în linia 11 și linia 12.
>> Așa că lasă-mă să încerc să recompilați acest lucru și a vedea
în cazul în care se oprește zăngănit țipa.
face bucla.
Deci, acum este "declarația implicită a funcției
"GetInt" este nul în C99 "Ce este asta.?
Da?
PUBLICUL: [neauzit].
David J. MALAN: Da.
Deci, acum că eu sunt, folosind de fapt GetInt, acest lucru nu este ceva
ca doar vine cu C. Acest lucru vine de la CS50.
Deci, avem nevoie de asta aici.
Și lasă-mă să mă întorc la promptul jos
aici și re-rulați make.
Bine, în cele din urmă.
Acum am rezolvat și că altă eroare.
Lasă-mă să ruleze, acum, bucla și a vedea ce se întâmplă.
"Dă-mi un int." Eu voi da 11.
Eu voi da -1.
Eu voi da foo.
Eu voi da 5.
Și, într-adevăr funcționează acum.
Dar promptul schimbat pentru un motiv aici.
De ce l-am spus încercați din nou una dintre aceste ori, dar da-mi un
int celelalte trei ori?
De ce este faptul că un comportament diferit?
PUBLICUL: dat un șir.
David J. MALAN: Imi pare rau?
PUBLICUL: Ai dat un șir.
David J. MALAN: Da.
Așa că am dat un șir în această a treia încercare,
când am tastat foo.
Foo este un șir de caractere.
E evident ca nu o int.
Și modul în care a pus în aplicare CS50 GetInt este că noi
Nu verifica dacă ceva e mai mică de 0 sau mai mare de 10
pentru tine, pentru că de unde știm dinainte ce fel de
int vrei?
Dar putem verifica minim pentru tine, ai ghidul de cel puțin
tastați un număr întreg?
Și dacă nu au făcut-, am țipa la utilizator prin tastarea "retry" pe
ecranului.
>> Deci, acum avem un program care este looping. Bine.
Acum, care dintre acestea este un fel de construct mai bine?
Deci, acest lucru este în cazul în care lucrurile încep să obțineți un pic dezordonat,
Faptul că trebuie să vă amintiți de a declara o variabila aici
dacă doriți să-l utilizați în interiorul unor
acolade și în afara.
Dar, chiar dacă acest lucru pare un pic criptic la prima
ochire, doar din nou, amintiți-vă logica simpla.
În scopul de a utiliza ceva în C, indiferent dacă este o funcție sau
este o variabilă, trebuie să-l includă în cazul în care este o funcție
în unele bibliotecă, sau trebuie să-l declare.
Dar acum trebuie să fim atenți în plus de faptul că
tu îl declară în domeniul de aplicare dreapta.
Tu nu-l pune prea tare în interiorul parantezelor.
>> Așa că lasă-mă să se rostogolească de fapt, înapoi.
Dacă ne întoarcem la noi, de exemplu, de la mai devreme, și mă duc
inapoi la pentru int, int i = 0; i <10; i + +, și am
face Stele printf, cum ar fi aceasta, și apoi paren aproape, și acum
printf i este acum -
conform aceleiași logici, ce se va întâmpla atunci când am încerca să
compila acest program?
PUBLICUL: identificator invalid.
David J. MALAN: Deci e un alt identificator invalid,
nedeclarate identificator.
Acum, motivul e un pic diferit.
Nu e evident, nu acolade aici, dar același
Ideea, aceeași poveste a domeniului de aplicare.
Dacă ați declarat o variabilă ca și cum aș interiorul unui
pentru bucla, chiar dacă nu ați scris în mod explicit cret
bretele, cred că de ei mental ca fiind încă acolo, în care
caz i este valabil doar în interiorul a buclei pentru.
Acesta nu este valabilă odată ce ajunge la linia următoare, care, în
acest caz, este acum 10.
Deci, doar la câteva aspecte ale domeniului de aplicare și similar.
În regulă, întrebări?
>> În regulă, deci asta este un fel de un mic program banal,
imprimarea doar stele mici.
Dar hai să vedem dacă vă amintiți acest cântec aici.
Acesta este un cantec incredibil de enervant copiii vor cânta pe
autobuz școlar și similar.
Dar ce e frumos despre ea este că are această ciclicitate,
care e "99 de sticle de bere pe perete,
99 de sticle de bere.
Luați o în jos, trece-l în jurul valorii de, 98 de sticle de bere pe
de perete. "Și apoi cântecul repetă 97, apoi 96, apoi
95, apoi 94, tot drumul până la 0 daca tu de fapt ai ca
departe pe autobuz.
Deci, acesta este un program de frumos pentru a sorta de utilaj, deoarece mea
Dumnezeu, dacă ai putea să pună în aplicare acest lucru cu doar câteva
de linii de cod, ai putea scuipat versurile întregi la prezentul
cântec destul de repede.
Dar de-a lungul drum, putem începe să tachineze acum Apart unele
acestor constructe de bază buclă și acum, de asemenea,
introducă funcții care ne scrie, returna valori
pe care le trece în jurul valorii de.
Dar, mai întâi, de ce nu mergem mai departe și să ia noastră de cinci minute
rupe aici?
Și când ne vom întoarce, vom cânta acest cântec.
>> În regulă, deci ne-am întors.
Și când spun că voi cânta acest cântec acum, vreau să spun
programatic, nu verbal.
Deci, aici avem beer1.c, care este unul punerea în aplicare a prezentei
cântec special.
Și doar pentru a fi clar, pentru cei nefamiliarizați cu ceea ce
acest lucru arata ca, lasă-mă să merg mai departe
și să facă beer1, Enter.
Acum, permiteți-mi să ruleze beer1, și ceea ce vom vedea - cât de multe sticle
de bere va fi acolo?
Voi tip în 99, cum ar fi cântecul spune.
Enter.
Și acum, dacă vom parcurge -
Hopa - dacă am parcurge toate acestea, vom vedea că
această a cantat intr-adevar cântec întreg.
Stai un minut.
Barul meu defilare E un pic dat peste cap.
Să folosim fereastra mai mare.
Deci beer1, 99, acolo mergem.
Deci, aici avem cântec întreg, cântat mult mai rapid de
calculator decât ar fi putut fi de noi.
Deci observați, însă, natura ciclică aici.
Se spune 99, apoi 99, apoi "ia una în jos, să-l dați
în jurul valorii de, ", apoi 98.
Și acum se repetă din nou și din nou.
>> Deci, aceasta este de fapt o oportunitate perfecta pentru un fel de
looping construi.
Observați că eu sunt un fel de tăiere a unui colț aici.
Observați că am spus "98 de sticle de bere pe perete,
97 de sticle de bere pe perete, "și că a fost doar atât de
că, atunci când vom ajunge la unul de sticle de bere, nu am
să vă faceți griji despre gramatica limbii engleze.
Dar putem stabili, de asemenea, acest lucru cu un pic de o în cazul în care
condiție, probabil.
Dacă acest număr este singular, mergeți mai departe și spune "sticla",
în caz contrar, dacă e plural, spune "sticle".
Dar pentru acum, am tăiat complet acel colț.
Deci, haideți să vedem ce avem aici.
Deci, ne-am luat unele comentarii de la partea de sus.
Mă inclusiv aceste două biblioteci, după cum
am fost de obicei.
Și acum să-mi defilați în jos la prima
de linii efective de cod.
Linia 17 va începe principal.
Linia 21 și 20 are câte sticle de bere va fi acolo?
Și apoi m-am sun GetInt.
Și acum am un pic de un cec bun-simț.
>> Deci, aceasta este o convenție pe care o vom începe acum de adoptare a
mai riguros verificați de intrare utilizatorului.
Uneori, tu chiar nu vrei să-i determine din nou
și din nou și din nou.
Dacă utilizatorul șuruburi și nu cooperează, bine.
Închideți și doar nu face cu ei.
Si pentru ca e ceea ce fac eu aici.
Dacă n este mai mică de 1, eu doar de gând să țipi la utilizator,
"Îmi pare rău, că nu are sens." Și apoi am de gând să
a reveni arbitrar 1.
Deci, din nou, aceasta este doar o convenție să te obișnuiești cu.
Pentru moment, aceasta ia în credință.
Dar pana acum, am fost întotdeauna se întoarce 0, deoarece
am spus revin 0 denotă ce?
PUBLICUL: Succes.
David J. MALAN: Succes, asta-i tot.
Deci, acum că suntem în cele din urmă începe să se gândească la
non-succese -
cu alte cuvinte, cazuri de colt, stările de eroare -
acum am o aprovizionare infinit, sau cel puțin patru miliarde
lucruri posibile care pot merge greșit în programele mele.
Și eu pot începe atribuirea de numere individuale.
Acum, în general, este suficient doar să se întoarcă
altele decât 0 ceva.
Deci, vom reveni pur și simplu 1 pentru acum.
Dar motivul pentru returnarea 1 este faptul că de îndată ce vă veți întoarce
1, ghici ce se întâmplă cu restul programului?
Se oprește.
Asta e tot.
Deci, faptul că mă întorc 1 este eficient
scurt-circuitul execuția acestui program, astfel încât
nimic mai jos linia 27 va continua de executare.
De îndată ce se întoarce principale, care este.
>> În regulă, așa că, dacă utilizatorul nu cooperează și vom ajunge la linia 30
deoarece acestea tastat într-un număr de legitim, aici este meu
punerea în aplicare a acestui cântec.
Asa ca am imprimați mai întâi o linie noua de caractere, doar pentru
estetica.
Am acum o buclă pentru.
Și observați că fac lucrurile într-un pic
de-o direcție diferită.
Eu nu trebuie să fac mai puțin, eu nu trebuie să fac + +.
Pot spune în schimb inițializa o variabilă i, setați-l egal cu
n, numărul de utilizatorul tastat în, apoi procedați astfel, așa
timp cât i este mai mare decât 0, atunci I -
După ce ați terminat de o iterație din această buclă.
Deci, putem conta în jos folosind o buclă de asemenea.
Acum, acest lucru este destul de mult o săptămâna lucruri acum, cu printf.
Deci de imprimare "% d de sticle de bere pe perete." Print "% d
sticle de bere. "" Luați o în jos, trece-l în jurul valorii de. "Print
"% D sticle de bere pe perete." Deci, e încă% d, dar
observăm că argumentul cu printf se schimbă.
După virgulă, am am, pentru că vreau să spun 99.
După această virgulă, am am, pentru că vreau să spun 99.
După această virgulă, am am - 1, pentru că vreau să spun 98, în
această repetare în primul rând, și așa mai departe.
Și acum aici, am doar o remarcă stupid.
Și apoi linia 42, ma voi intoarce 0, prin convenție, semnificând faptul că
totul este în regulă.
>> Și ce dacă am goofed?
Ce s-ar putea o greșeală comună să fie aici?
Ei bine, ce dacă am spus accidental bine, eu nu vreau să conteze
la 0, vreau 0 sticle de bere pe perete?
Așa că am spus, i este mai mare sau egal cu 0.
Ce se va fi simptom pe care o văd acum, dacă am recompilați
beer1 și rulați-l?
PUBLICUL: Negativ.
David J. MALAN: Da, o să merg negativ.
Aceasta este o eroare off-cu-o, o incredibil de
greșeală comună pentru a face.
Să mergem de fapt, înapoi la fereastră terminal și fă-o
aici, astfel încât să putem vedea mai multe la un moment dat.
Introduceți, 99 de sticle de bere.
Aproape, dar ne-am dus vreodată atât de ușor prea departe.
Am cântat piesa prea departe în jos, astfel că am lovit acum
negativă număr.
Deci nu merge prea bine.
>> În regulă, astfel încât să putem rezolva cu ușurință că prin a merge înapoi la
modul în care aceasta a fost odata.
Dar ce sunt unele oportunități acum
îmbunătățire?
Ei bine, lasă-mă să deschid beer2.c și defilează în jos aici și să ia o
uita-te la aceasta versiune.
Care e primul lucru pe care sare la tine ca diferite
în această versiune aici?
PUBLICUL: [neauzit].
David J. MALAN: Da, deci nu mai sunt eu, pentru că aceasta a avut loc la
mi știi ce, eu cer de utilizator pentru N, si atunci eu sunt
stabilirea i egale cu n, iar apoi eu am schimba, dar eu nu sunt
atingând n din nou.
Deci, ce naiba a fost punctul de ai aloca alte 32
biți numit i doar pentru ca pot avea o altă variabilă?
Deci, în acest caz, am un fel de inutile recunoscut că
Design caracteristică.
Și am de gând să spun acum în timp ce n este mai mare decât 0, du-te
înainte și imprima același cântec, trecerea unui n pentru ca printf
al doilea argument, și n - 1 ca al doilea argument aici.
Și apoi pe fiecare iterație a buclei acest, mergeți mai departe și doar
decrement n sine.
Acum, funcțional, acest program
va fi identice.
Dacă aș scrie în 99, N începe la 99.
Am decrement, decrement, scădere, scădere.
Mă duc pentru a obține toate drumul până la "O sticlă de bere pe
perete, o sticlă de bere.
Luați o în jos, trece-l în jurul valorii de.
0 de sticle de bere pe perete ". Finali, pentru că am făcut-o
obține starea corectă.
E mai mare decât 0.
Nu am face această greșeală.
>> Deci, care este mai bună, versiunea unul sau versiunea doi?
Așa că am auzit o grămadă de cârtirile pentru doi.
De ce două?
Ce-i asta?
PUBLICUL: [neauzit].
David J. MALAN: Oh, bine.
Deci nu va merge sub 0, dar amintiți-vă, în versiunea unul,
Versiunea originală corectă nu merge sub 0, fie.
Deci, amintiți-vă că aceasta este versiunea corectă.
Așa că haideți să-i cel puțin a compara cele două versiuni corecte.
Ce este un argument în favoarea versiunii
două fiind, mmm, mai bine?
Da?
PUBLICUL: Se utilizează mai puțin spațiu.
David J. MALAN: Ok, deci foloseste mai putin spatiu, nu?
Întrucât o versiune pe 32 de biți utilizat pentru n, și apoi un alt
32 de biți pentru i.
Versiunea doi foloseste numai 32 de biți pentru n, astfel încât
pare a fi un plus.
Alte gânduri?
Vrea cineva să argumenteze în favoarea unuia?
Da?
PUBLICUL: Trebuie să utilizați linia de cod suplimentar pentru n -.
>> David J. MALAN: Bine, sigur.
Deci asta e corect.
Deci asta doar, cel puțin pentru mine -
Adică, asta se simte de fapt, un pic de Messier, faptul că
Eu nu pot sorta de chintesența tuturor logicii mele într-un singur
Linia frumos, pentru bucla, ca pentru bucla poate.
Aici, am cam trebui să tac în acest n -
la finalul buclei, deoarece
e logic necesar.
Dar este un fel de freacă-mi mod greșit, doar pentru că
pare separat de logica de până aici, chiar dacă,
din nou, e necesar.
Alte gânduri?
Da?
PUBLICUL: [neauzit].
>> David J. MALAN: Da.
Deci, ce se întâmplă dacă în schimb, la sfârșitul melodiei, a vrut să
imprimați din nou numele melodiei?
Ca "Multumesc pentru a juca 99 de sticle de bere", sau ceva de genul
o prostie ca asta?
Dar punctul este, ai vrut acces la valoarea inițială.
Faptul că ați suferit mutatii sau schimbat n pe fiecare
repetare și, prin urmare, s-au distrus valoarea sa inițială
înseamnă pur și simplu nu se poate face că, la sfârșitul.
Acum, fără îndoială, noi în mod evident, nu vreau să fac
că, în acest program.
Deci, cui îi pasă?
Dar asta e un punct foarte valabil.
Și ca să fiu sincer, nu e într-adevăr nimeni
chiar răspunde aici.
Sunt amândoi la fel de corect.
Aș putea fi convins nici un fel.
Eu va spun ca, in general, este un principiu bun, dacă
a solicitat de utilizator pentru o anumită valoare și ați stocat într-o variabilă
ca n, doar un fel de principiu privind, e probabil bine
pentru a menține în jurul valorii de faptul că.
Precum și orice date pe care doriți să transforme din nou și din nou, doar
da-te o copie a acestei variabile, doar astfel încât să
au acces la versiunea originală.
Va petreceti mai mult de 32 de biți, dar realitatea este aceasta
calculatorul a, ca, doi gigaocteți de RAM in aceste zile,
și suntem quibbling peste 32 de biți?
Chiar nu o astfel de afacere mare.
Și chiar pe acest dispozitiv aici, cu o jumătate de concert sau o
gigaoctet de RAM, 32 biți versus pe 64 de biți,
Nu o astfel de afacere mare.
Desigur astăzi, o să fie drumul copleșiți de mărimea
a programului în sine, care va fi câteva sute de
kiloocteți, dacă nu de cativa megabiti, in aceste zile.
>> Preocupări atât de rezonabile, nu un singur raspuns corect.
Dar, cel puțin acestea sunt gândurile pe care ar trebui să înceapă să
trece prin mintea ta?
Pentru că în PSET 0, chiar dacă suntem cu adevarat doar de așteptat
corectitudinea, sau cel puțin renuntarii bug-uri diferite care
s-ar putea s-au confruntat, așa cum am merge mai departe, design-ul este
O să fie un alt aspect-cheie, atât de scrierea de cod
și, de asemenea, evaluarea noastră cod.
Și astfel, cel puțin da gândit la lucruri de acest gen.
Și doar pentru că lucrările ceva nu inseamna ca e bine,
nu înseamnă că e bine concepute.
Și asta e unul din lucrurile pe care semenii didactice și
seturi de probleme ne va ajuta să tachineze parte a lungul timpului.
>> Ei bine, ce zici de, să spunem, această versiune aici?
Lasă-mă să fac ceva un pic mai sexy aici, într-un moment.
În primul rând permiteți-mi să scap de asta.
Și acum să rezolva această problemă gramaticală.
Deci, în această versiune, vreau să stabilească gramatica, astfel încât,
mai degrabă decât să spun e paranteză, cum ar fi "sticla"
sau "sticle" -
Nu vreau să taie acel colț -
De asemenea, doresc să imprimați dinamic out sugerate de "sticle"
sau "sticla", folosind astfel substituenți acestea% s azi.
Așa că am nevoie pentru a verifica ceea ce este condiționat valoarea lui i.
Și dacă e 1, vreau să spun "sticla", iar dacă ceva e
altceva, vreau să spun "sticle". Deci, haideți să încercăm să facem acest lucru.
Deci, dacă i == 1, atunci să-mi duc mai departe și să declare -
Am nevoie de un șir de caractere, asa ca lasa-mă să fac s1 șir, pentru că este
primul șir Îmi pasă acum.
Am de gând să spun "sticla". Și apoi, să vedem, string
s2 - și voi explica de unde mă duc într-un moment -
"Sticle". Deci reamintesc faptul că, în acest cântec, trebuie să fim capabili
pentru a imprima lucruri, două cuvinte diferite cu potențial.
Deci, dacă ne uităm înapoi aici, observați că atunci când vom ajunge la
acest exemplu aici, "două sticle de bere pe perete,
doua sticle de bere, ia una jos, treci în jurul valorii de ", vreau
această a patra linie de spus acum "o sticla de bere pe
perete "Așa că am nevoie pentru a decide,. vreau să spun" sticle "sau
"Sticla"? Așa că am de gând să spun arbitrar, în regulă,
Am de gând să declare acum o variabilă numită s1, string
unul, care este mergi la a lua conectat aici și, de asemenea, aici,
deoarece aceste cuvinte sunt întotdeauna identice, doar din cauza
natura cântec.
Și am de gând să sun s2 orice cuvânt vreau să
în cele din urmă să apară aici.
Acum, literalmente, de 99 de ori din 100, aceasta va fi
aceeași în ambele cazuri, pentru că 3 este la plural, 2 este
plural, 4 este la plural.
Dar în acest caz colț, în cazul în care se ajunge la 2 și apoi 1, sau
chiar 1 si apoi 0, am nevoie de această logică.
Deci, am să-și petreacă ceva timp în codul meu obținerea acestui drept.
Deci, dacă am face acest lucru, dacă i == 1, atunci s1 stabilite egale cu "sticla"
și S2 egal cu "sticle", deoarece acest lucru va fi de 1
sticla, iar acest lucru va fi pentru 0 sticle.
Și asta aici, ce înseamnă asta reprezinta?
Doar ca să fie clar.
Acesta este doar un comentariu.
Deci, faptul că puteți avea o singură linie comentariile pe care le reprezintă
poate comenta codul dvs. cum ar fi acest lucru, dar un alt comună
paradigmă, de asemenea, este că, dacă aveți o expresie super-scurt, care
vrei sa te pui si e doar mai ușor de citit pentru a pune
se chiar la capătul liniei de cod, puteți
face absolut ceva de genul asta.
>> Deci, acum, ce se întâmplă dacă am face acest lucru? Altceva dacă i nu este egal cu 1.
Deci, bang egal -
semn de exclamare este cunoscut sub numele de "bang".
Deci, bang = 1.
Deci, dacă i nu este egal cu 1, ceea ce nu am loc doriți să faceți?
Ei bine, primul cuvânt Vreau sa fiu ce?
Deci, ar trebui să fie un șir de "sticle" pentru sticle plural,
și apoi aceasta va fi la plural "sticle", precum și, pentru moment.
Și vom vedea dacă acest lucru devine de fapt ne-a
în cazul în care vrem să mergem.
Deci, acum, dacă aș defila în jos aici, observați că eu sunt de a conecta
nu numai eu, ci s1.
Sunt conectarea i și s1.
Și apoi aici, eu sunt minus 1, care este aceeași ca și
înainte, dar s2.
Cu alte cuvinte, vreau cuvânt în limba engleză pentru a schimba pe baza
pe această logică.
Acum, există deja unele probleme în acest cod.
Ceea ce este rupt deja de poarta aici?
Da?
PUBLICUL: [neauzit].
>> David J. MALAN: Exact.
Așa că am încălcat deja lecția de aplicare.
Așa că m-am declarat S1 și S2, dar am făcut-o în interiorul
acolade, ceea ce înseamnă Da, acest cod va funcționa până
până la linia 42, dar de indata ce l-am lovit linia 43, ghici ce nu
mai există?
Ei bine, ghici ce e nu mai este în sfera de aplicare - nici S1 sau S2.
Așa că trebuie să repar asta.
Așa că lasă-mă să ștergeți declarațiile.
Și voi lăsa nume de variabile și ștergeți această evaluare aici
și ștergeți această aici.
Și în ce ar trebui să mă declar foarte mult de aceste lucruri?
PUBLICUL: [neauzit].
David J. MALAN: Da, așa, probabil,
chiar aici, 33-ISH.
Deci, s1 șir și apoi șirul s2.
Și se pare, eu pot face asta.
Daca te declararea două variabile de același tip,
de fapt, puteți folosi doar o virgulă și de a face că, în C. Toate
Bine, așa că acum am două variabile -
S1 și S2.
Sunt atribuindu-le valori în aceste
condiții de aici, sau aici.
Și apoi eu le folosesc de mai jos.
Cât de bine este acest lucru acum va merge?
>> Ei bine, e încă un pic buggy, dar hai sa vedem cel puțin
cat de departe am ajuns.
Așa că lasă-mă să mergeți mai departe și să facă beer3.
Este aceasta beer3?
Da, acest lucru este beer3.
Și acum să-mi merge mai departe și a alerga beer3.
399 99.
Ne putem sări peste, probabil, cele mai multe dintre ele.
Și aici, uita-te la asta.
"O sticlă de bere pe perete, o sticla de bere, ia
unul în jos, să-l dați în jurul valorii de, 0 sticle de bere pe perete. "
Dar am atrage atenția asupra numai jumătate din soluție.
Un fel de greșit aici.
Deci se pare că în cazurile de colt apar atunci când i este egal cu ceea ce
două valori?
PUBLICUL: 2, 1.
David J. MALAN: 2 și 1.
Nu e 1 si nu 1.
E într-adevăr doar aceste ultimele două strofe ale acestui cântec.
Deci, ce am în loc doriți să faceți?
Asa ca am par să fi prins cazul în care, dacă i este == la 1,
apoi primul cuvânt este "sticla", dar al doilea cuvânt
este "sticle". Dar aici, vreau să schimbe acest lucru să fie == 2.
Și dacă acesta este cazul, ce vreau eu
primul cuvânt să fie?
PUBLICUL: "Sticle".
David J. MALAN: "Sticle", astfel încât pentru două sticle.
Și apoi aici, acest cuvânt ar trebui să fie -
PUBLICUL: "Sticlă".
David J. MALAN: "Bottle", singular.
>> În regulă, hai să zoom out, du-te înapoi aici, re-rulați make,
Re-run beer3, de tip 99 din nou.
Bine, "Segmentation fault (core fac obiectul unui dumping)."
Ce am făcut greșit?
PUBLICUL: Nu aveți o valoare de [neauzit].
David J. MALAN: Ah, excelent punct de.
În regulă, deci ce sa întâmplat aici?
Deci eroare de segmentare, de fapt, și ne vom vedea
acest lucru destul de câteva ori în viitor, în mod deliberat.
Dar pentru acum, ceea ce înseamnă de fapt?
O eroare de segmentare aproape întotdeauna înseamnă că aveți
cumva a încercat să acceseze memoria, RAM în calculator,
care nu este în proprietatea, că nu ați cerut de fapt,
sistemul de operare pentru.
Deci, în acest caz, observa ceea ce am făcut, ceea ce este
viciate în logica mea.
Am alocat S1 și S2 o valoare dacă i este egal cu 1.
Am făcut, de asemenea, că, dacă i este egal cu 2.
Dar nu am făcut-o în număr infinit de alte
Posibilitățile -
în special, 3 sau 4 sau dot, dot, dot, 99.
Deci, un remediu pentru acest lucru ar putea fi doar hai să
avea o condiție de altcineva.
Și lasă-mă să merg aici și să spunem s1 este egal cu -
ceea ce ar trebui să fie aici?
PUBLICUL: [neauzit].
>> David J. MALAN: "Sticle", deoarece, în caz comun,
e doar același lucru.
Deci, este egală cu oferta, citatul, "sticle". Deci, pentru plural
sticle, iar apoi aici, pentru sticle plural.
Bine, deci acum să mă întorc la fereastră terminalul meu,
recompilați, se re-rula.
99.
Uau.
Și hai să facem o verificare rapidă bun-simț.
Punct de vedere tehnic, am dori să citească toate acestea pentru a se asigura
sunt corecte, dar să ne uităm la
cel puțin vinovați cunoscute.
3 sticle, 2 sticle, 2 sticle, 1
flacon, 1 flacon, 0 sticle.
Se pare că am cel puțin, fixată pentru acum.
Dar captura aici este că ceea ce o mizerie îngrozitoare Dumnezeu, asta este
doar pentru a rezolva o prostie
de un caracter gramaticale detalii.
Deci, există un fel de motiv pentru care m-am tăiat acest colț
mai devreme, pentru că e doar enervant complet pentru a avea la
scrie acest cod de mult.
Dar se pare că există metode ușor mai elegante ale
exprima exact același lucru.
Și putem face acest lucru, după cum urmează.
>> Lasă-mă lăsa asta pe ecran pentru un moment și
introducă ceva cunoscut ca un operator de ternar.
Aceasta este un fel de una-liner care a vrut doar să ne facem
trăiește un pic mai sexy, așa cum a promis.
Și am de gând să fac asta, după cum urmează.
Dă-mi un șir numit s1, și lasă-mă să
atribui, după cum urmează.
(I == 1)?
"Bottle", în caz contrar "sticle". String s2 devine (i == 2)?
"Bottle", în caz contrar "sticle".
Deci, ce este atunci diferența aici?
Aceste două linii de cod, eu susțin, pot
înlocuiască toată mizeria asta.
Așa că îl numesc o mizerie, doar pentru că un fel de freacă mine
mod greșit că e atât de multe linii de cod.
Nu este greșit.
Nu e rău de proiectare.
Place, acest lucru este perfect corectă și foarte bine.
Dar devine plictisitor de codificare, dacă aveți de a vă exprima astfel
la naiba specific din nou și din nou și din nou, cu un simplu
scenariu de genul asta.
Deci, C are unele comenzi rapide, cum ar fi acest lucru.
Deci, în esență, spune aceasta declară un șir s1 numit și
atribui fie această valoare sau în cazul în care această valoare i este == -
Îmi pare rău, ar trebui să spun asta mai clar.
Declare o variabilă s1, aloca această valoare în cazul în care acest lucru este adevărat.
În caz contrar, se atribuie această valoare.
Deci, cu alte cuvinte, aceasta este un fel de cale de o linie de
spun altceva, dar dacă faci o misiune de-a lungul drum.
Deci, în cazul în care i este 1, atunci du-te mai departe și numesc acest "sticla". Și
atunci acest altceva, îl numesc "sticle". Între timp, s2,
al doilea cuvânt de care avem nevoie pentru a defini, dacă i este egal cu 2, vă vom
setat s2 la "sticla". În caz contrar, setați-l la "sticle". Și ce
aceasta înseamnă acum este ca eu pot trece prin acest lucru și a șterge toate
aceste linii de cod.
Și când spun, oarecum ridicol, faptul că acest lucru este acum
sexy, e mai sexy în fel de sens stilistic.
Faptul că funcțional, acest cod este, de fapt de gând să
face exact același lucru.
Și chiar dacă s-ar putea părea un pic criptic la prima
ochire, pentru că nu ne-am mai văzut această construcție înainte, aș
susțin că este în cele din urmă va fi atât de mult mai mult
ușor de citit și atât de mult mai ușor pentru noi, oamenii, pentru a sorta de
înțeles, pentru că acum puteți citi doar
Codul de toate pe o singură linie.
E încă similară în spirit cu o în cazul în care, în cazul în care acest lucru este
Stare și apoi aceasta este ceea ce este în interiorul și în cazul în care acest
este ceea ce este în interiorul altceva.
Dar putem face acest lucru doar mult mai elegant.
>> Și dacă mă duc acum la terminalul meu, care a eliminat toate
a acestor linii și le-a înlocuit cu doar cei doi,
recompilare, re-conduse de sticle de bere cu 99, observați că mi
gramatica este, de fapt, încă mai corect.
Deci, din nou, pentru a începe ceva.
2 sticle de bere, 1 sticlă de bere.
Arata bine.
Da.
Deci nu avem o soluție mult mai succint.
Deci aceasta, de asemenea, cum să obțineți mai mult confortabil cu C nu,
neapărat cu PSET prima sau chiar două, dar
dau seama că aceste concepte ne poate permite să facă lucruri vreodată
mai elegant.
Acum, hai sa facem un lucru aici.
Lasă-mă să mergeți mai departe și să se deschidă return1.c.
Acum, hai să începem să rezolve o altă problemă într-un mod care
ne permite să scrie cod mai sofisticate.
>> Deci, aici e un program simplu pic, al cărei scop în viață
este de a incrementa valori.
Și, de fapt, să ia un pas înapoi.
Lasă-mă să fac asta manual.
Lasă-mă să fac și includ int main (void).
Și lasă-mă să numim această increment.c.
Și ce vreau să fac?
Am de gând să merg mai departe și spune ceva de genul -
vom apela numerele de aceeași -
x int.
Deci x int primește 2; x printf este% d, noua linie, x.
Deci, eu sunt tastarea rapidă, dar un fel de lucruri familiare acum.
Apoi, am de gând să fac x + +.
Apoi, am de gând să imprima că aceeași propoziție din nou.
Și apoi am de gând să se întoarcă 0 doar pentru a iesi din program.
În regulă, astfel încât acesta este un program care
un număr de pași.
E primul gând să inițializeze ceva la 2, iar apoi e
O să-l incrementa și imprimați-l din nou.
>> Deci haideți să rulați creștere, programul incredibil de simplu.
Dar să presupunem acum că vreau să cub valoarea, deci nu
oarecum arbitrară ceva.
Și eu de fapt vreau să fac x devine cub de ea.
Asa ca am putea folosi ceea ce se numește funcția pow, dar eu nu fac
într-adevăr știu în cazul în care este încă.
Așa că am de gând să fac asta felul de modă veche.
x ori x ori aceasta este egală de x ori x.
Deci, eu sunt cubaj valoarea, înmulțind-o din nou de la sine
și din nou și din nou, astfel încât să putem obține puterea
din 3 în acest caz.
Așa că acum am numerele trebuie să tipărească ar trebui să fie, după cum vom vedea
aici - face creștere, așa că e de fapt, nu incrementa cu adevărat
mai, dar vom lăsa în pace numele -
2 și apoi 8.
Acum, avem începuturile o oportunitate pentru rafinament
aici, prin care acest lucru cubaj de multiplicare a unui număr de
de la sine, în sine, de la sine se simte ca acest lucru ar putea fi doar
util pentru a avea ca funcție, la fel ca cineva a decis
de ani în urmă - știți, un fel de util în cazul în care unul dintre noi se aseaza
și scrie printf, astfel încât restul lumii poate folosi,
de ce nu stai jos și scrie o funcție numită cub
care face acest lucru cubaj pentru noi, asa ca nu trebuie sa manual
pună în aplicare noțiunea de cubaj valori aici?
>> Deci, un exemplu simplu, dar hai să mergem mai departe și de a folosi aceasta este ca o
posibilitatea de a scrie funcția noastră.
Deci pana acum, am folosit doar principală, și am folosit alte
Funcțiile oamenilor, dar nu ne-am scris propria noastră.
Deci, aici vom merge.
Am de gând să merg mai departe și scrie o funcție numită cub.
Și am de gând să îl ia o intrare.
Deci, intrarea sa este de gând să fie un număr întreg.
Și ce-i așa de gând să faci?
O să declare iesire int = de intrare ori de intrare
ori de intrare.
Și apoi o să se întoarcă că producția.
Și apoi trebuie să fie specific acum.
Această funcție este de gând să se întoarcă un int.
Deci, aici, atunci este modul în care te-ai scrie propriile funcții.
Tu decizi ce e numele dvs. de
Funcția va fi.
Și, în general, ceva explicativ este bun, așa că voi
numesc cub.
Apoi, va trebui să specificați ce se va întoarce, ceea ce este
producția sa va fi.
Și nu avem opțiunile multe încă.
Int, char, float, bool, string.
Pentru moment, am de gând să stai cu un int, pentru că eu o vreau
pentru a returna un număr întreg.
Apoi, va trebui să specificați ce intrările sale, dacă există, sunt.
Și dacă cub are un argument, ia ceva între
paranteze, trebuie să dai ca argument un nume, astfel încât
puteți apela acest ceva ca esti de punere în aplicare sau de scris
această funcție, iar tu trebuie să-i dea un tip, care în acest
cazul va fi int.
Deci, pe scurt, cub este o funcție care are un număr întreg
ca intrare și returnează un întreg ca ieșire.
>> Deci, ce face cu asta de intrare?
Ei bine, în linia 14, am declara o ieșire variabilă numită, și am
atribuie valoarea, de intrare de intrare ori de ori de intrare.
Și apoi mă voi întoarce de ieșire.
Deci, cum mă folosesc acest lucru, atunci?
Ce pot modifica aceste caractere subliniate pe linia
7 să fie, nu crezi?
PUBLICUL: [neauzit].
David J. MALAN: Da, așa cub de x.
Deci x este o variabilă, ceea ce înseamnă că are o anumită valoare.
Din fericire, e de tip întreg.
Si pentru ca x este un int, înseamnă că pot să-l trece în cub.
Și chiar dacă am imperative valoarea lui x cu valoarea
de x cub, așa cum a fost cazul până acum, de fiecare dată când
au semnul egal și de o linie de cod, chestii pe dreapta
este executat și apoi se atribuie
Valoarea pe stânga.
Deci, ordinea operațiunilor este ca ne-ar spera.
Deci, face acest lucru?
Ei bine, lasă-mă să merg în jos aici.
Lasă-mă să deschid fereastra mea terminalului.
Lasă-mă să fac creștere, Enter.
"Declarație implicită de" cub ", funcția este nul în
C99 "Ca o paranteza., C99 se referă la limbajul C așa cum a fost
definite în 1999, care a fost o actualizare de peste versiunea de la
1989, care este o actualizare de peste original.
Deci, asta e tot ceea ce înseamnă.
>> Deci, ce înseamnă că "declarația implicită
"cub" funcția este invalid "E chiar aici?.
E chiar acolo, în linia 12.
PUBLICUL: [neauzit].
David J. MALAN: Ce e asta?
PUBLICUL: Nu e înainte.
David J. MALAN: Nu e înainte.
Deci, asta e chestia.
C este un fel de prost, sau compilatoare C sunt un fel de prost.
Ei într-adevăr face doar ceea ce-ți spun ei să facă.
Și ei, în special, citit numai de sus în jos codul,
la stânga la dreapta.
Deci, dacă compilator, zăngănit, este citit codul, linia 1, acesta
seama cum să facă acest lucru.
Oh, aici vine principal.
Bine, lasă-mă să merg mai departe și să declare o variabila x.
Lasă-mă să imprimați ceva.
Linia 7, ceea ce naiba e cubul?
Nu e declarate în stdio.h.
Ea nu vine cu C. Nu am nici o idee ce să fac.
Și așa zăngănit doar bails și se închide cu acest mesaj de eroare.
Astfel încât să putem rezolva acest lucru în câteva moduri.
Putem învăța ceea ce face să răsune cub este de doar în cazul în care mutarea
declarație este.
Asa ca am taiat si lipit-l deasupra principal.
Acum dau seama că doar pentru că nu mai este principalul în primul rând, e
încă executate în mod implicit.
Principal este principal.
E numele implicit funcția.
Nu contează în cazul în care aceasta este într-un fișier.
Dar cel puțin acum zăngănit a văzut cub înainte de a-l folosesc.
Deci, să vedem dacă zăngănit este mai fericit acum.
Asigurați-creștere, aceasta a compila acest moment.
>> Lasă-mă să fugi creștere.
Și într-adevăr, se pare a fi de lucru.
Acum, puteți veni cu scenarii în cele din urmă în cazul în care
nu este posibil să se pună fiecare funcție
mai presus de orice altă funcție.
Te vei blocat în această buclă infinită în realitate,
în cazul în care acest tip vrea sa fie aici, dar acest lucru
Tipul trebuie să fie acolo.
Așa că nu funcționează întotdeauna.
Deci din fericire, C are o soluție mai elegantă.
Am de gând să pun asta înapoi în cazul în care acesta a fost, pur și simplu pentru că am
preferă, ca o chestiune de principiu, că principalul fi mereu
în partea de sus, pentru că e doar frumos pentru a vedea ce acest program
face în mod implicit.
Și ce am de gând să fac aici este să declare ceea ce se numește
un prototip.
Am de gând să re-declare funcția mea cub de literalmente
copierea și lipirea.
De fapt, asta nu e literalmente.
Deci, literalmente copierea și lipirea linia 15
deasupra liniei 6.
Nu contează ce se termină această linie de pe.
Se întâmplă să fie pe linia 4.
Dar aceasta nu trebuie să fie înainte de principal.
Dar observați diferența.
Linia 4 se termină cu punct și virgulă, ceea ce înseamnă hei,
Zăngănit, luați cuvântul meu pentru asta că există o funcție
numit cub care ia un int și returnează un int.
Dar eu nu sunt o să-ți spun ce este încă.
Doar știi că îți promit să-ți spun în cele din urmă.
Și într-adevăr, acum e în regulă că acest lucru este mai jos.
>> Deci, aceasta este, în general, mai bine, pentru că atunci, la partea de sus a
fișierul, aveți posibilitatea să zornăie doar off, rapidă foc, o linie
fiecare, ceea ce numele funcțiilor sunt, ceea ce lor
intrări sunt, ce ieșirile lor sunt.
Și pentru a fi mai clar, înseamnă, în general, de intrare sau de argument
parametru, sinonime.
De ieșire înseamnă valoarea returnata, ceea ce face
mâna înapoi la mine.
Deci, în acest caz aici, cubul a fost declarată în partea de sus, dar
definite, altfel cunoscut sub numele de pus în aplicare, în partea de jos.
Deci, acum să ne întoarcem aici și re-rula acest lucru.
Asa ca lasa-ma acum mergeți mai departe și re-rulați make, re-rula increment.
Și acum se pare a fi de lucru bine.
Deci, acum putem merge mai departe și a factorului de afară ceva de genul
bere exemplu în această versiune a patra.
Așa că lasă-mă să defilați în jos aici.
Și observați că am luat un fel de această lecție la inimă chiar acum.
Faptul că am fost cântat aceeași strofă din nou și
din nou și din nou, linie de corul același cântec, pâslă
place de ce nu am factor de asta într-o funcție?
Și într-adevăr, aceasta ar trebui să fie unul dintre motivațiile.
Pe lângă faptul că altcineva în lume ar putea dori
să utilizați o funcție cub -
asta e un motiv bun să țină ceva afară și scrie mesajul Dvs.
personalizat funcție -
în cazul în care există o bucată de cod in programul tau, care te face
sens conceptual, pe care le cam vrea să dea un
Nume - ca și în acest caz, cor -
atunci se poate scrie în mod similar că, o funcție separată.
Nu trebuie să scrie totul în principal în cazul în care doar
se simte curat să-l separa si dau un nume.
>> Deci, în acest caz aici, observați că am un comentariu deasupra
această funcție că doar cântă despre
Numerele specificate de sticle.
Observați aici că nu am nevoie să numesc aceste
lucruri de intrare și ieșire.
De fapt, de data asta i-am sunat doar b meu de intrare pentru sticla.
Și observați aici, anulate sugerează ce?
Această cor -
PUBLICUL: Nu se întoarcă.
David J. MALAN: nu returnează o valoare.
Și într-adevăr, funcțiile nu trebuie să se întoarcă valori.
Ei doar se poate face ceva.
Ei pot avea ceea ce se numeste efecte adverse, care, în acest
caz este doar o grămadă de imprimare pe ecran.
Deci, observăm că acest cod aici, am literalmente doar la furat
exemplul anterior.
Singura diferență este în loc de a folosi i ca-mi
variabilă, eu sunt, folosind acum B ca variabilă meu.
Deci, am b aici, am b aici, am b
minus 1 aici.
Dar codul este exact la fel.
Dar, doar pentru a vă arăta acum cum putem folosi acest lucru, permiteți-mi să merg
mai departe și de fapt schimba acest lucru să fie un pentru buclă.
pentru (int i = n; i> n; i -).
>> Asa ca am furat asta de la exemplul nostru anterior.
Anterior, e în linia 37, care mi-ar fi început
cântând acest cântec enervant.
Dar, în loc, Mă duc să sun acum cor de i..
Adoptată.
Deci, acum, în fiecare iterație a buclei acest, eu numesc acest alt
funcției, cor, care sa întâmplat să scriu.
Ea nu a fost scrisă de altcineva de ani în urmă.
Dar cor, între timp, foloseste printf pentru a imprima
aceste patru linii.
Dar faptul că te-am sunat din nou și din nou cor într-o
buclă înseamnă că am de gând pentru a obține, la sfârșitul foarte,
cântec exact același ca și până acum am.
Deci, pe scurt, acum, dacă mă uit înapoi la codul meu, chiar dacă
aceasta este echivalent funcțional, observăm că e
incepand pentru a obține chiar mai ușor de citit.
Nu știu exact cum GetInt
este pusă în aplicare.
Sincer, nu știu cum refrenul este pus în aplicare.
Dar nu contează pentru mine.
Nu-mi pasă, pentru că acum pot sorta a, ca om, citește
aceasta de jos, de sus în.
Și pentru că funcțiile sunt denumite în funcție de ceea ce au
fac, codul meu este din ce în ce poate fi citit.
Și, după cum programele noastre obține mult mai complex -
până la sfârșitul semestrului, veți fi scris sute de linii
de cod în limbaje cum ar fi PHP si JavaScript și cum ar fi -
veți găsi că este mult mai ușor decât de a ține evidența
ce ai făcut.
Și atunci când veți începe colaborarea cu prietenii sau
parteneri sau colegi, vei fi capabil să scrie mult mai mult
programe masive de plecare pentru a exercita aceste bază
constructii blocuri.
>> Deci, cu care a spus, de ce nu o numim o zi?
Si te vom vedea miercuri.
[Aplauze]