[MUSIC JOC] DAVID MALAN: Buna ziua, toată lumea. Acest lucru este supersecțiune CS50 lui. Secțiuni atribuite nu va începe pentru încă o săptămână. Și așa astăzi, eu sunt aici aplice: MARIA: Maria. DAVID MALAN: --to de fapt aruncăm o privire la problema stabilit o, cursului Primele săptămâni de material, sa te orientat cu IDE CS50, un pic Linux, sistemul de operare care este rulează pe IDE, precum uita-te la o parte din tranziția la zero pentru a C de conducere până la problema seta o. Deci, fără alte formalități, în probleme stabilească un, ai de gând să fie prezentat CS50 IDE, care este acest programare web-based mediu pe care le folosim pentru pentru a scrie programe. A fost proiectat pentru a arata foarte amintește de un calculator tipic sistem de operare care rulează un sistem numit Linux. Dar e în așa-numitul nor, ceea ce înseamnă toți în clasa poate avea de fapt, lui sau a ei cont propriu și-l utilizați, de asemenea. Deci cele mai multe dintre voi, probabil, nu au folosit niciodată un mediu Linux, înainte de sau poate chiar un mediu de linie de comandă. Și o linie de comandă mediu este diferit. Totul este text. Este toate comenzile de la tastatură. Și nu e mouse-ului, nu icoane, ferestre de dialog, nu meniuri. E pur text. Deci, la început, a fel de se simte ca un pas înapoi în ceea ce privește sofisticare. Dar se termină prin a fi o mulțime mai puternic, cu siguranță, pentru un om de stiinta de calculator, în cele din urmă. Deci, haideți să aruncăm o privire. Iată-mă la CS50.io, prin care vă puteți conecta la IDE CS50. Și la fel ca în Scratch, nu e trei domenii principale în acest ecran. Deci pe partea stângă, avem ceea ce va fi browser-ul de fișiere. Și mai e la acest dosar top, care este acum gol când am scăpat de toate mele fișiere înainte supersecțiune. Și asta e în cazul în care ne vom salva fișiere C pe care le scrie. La partea din dreapta sus, avem un loc unde toate codul nostru va fi scrise. Și într-adevăr, dacă am faceți clic pe acest plus, acest este de gând să permiteți-mi să aleagă New File. Și aici eu pot începe să scrie cod C sau, într-adevăr, orice număr de alte limbi. Și apoi în partea de jos unde spune jharvard @ ide50-- și a ta va spune ceva un pic different-- ceea ce a fost numit acest lucru? Fereastră terminal. Da. Deci fereastra terminalului este așa-numitul prag comandă interfață prin care puteți interacționa cu sistemul de operare de bază. Și de acum, vom face uz de foarte putin astea-- doar pentru a compila, să se uite la mesaje de eroare pe care le vedem, și pentru a rula programele noastre. Dar în cele din urmă, vom pentru a face mult mai mult, de asemenea. Și puteți instala software-ul chiar și de a administra spațiul de lucru în CS50 IDE, de asemenea. Dar mai multe despre asta altă dată. Așa că hai să mergem mai departe și scrie un program foarte simplu doar pentru a merge printr-un warm-up de hello.c, care este, probabil, cel mai simplu program de se poate scrie. Am deschis deja o filă nouă. Am de gând să merg mai departe și spune includ io.h. standard de Apoi int principal (void). Și apoi printf ("Bună ziua, lume" backslash n, citat de aproape, paranteze apropiate, și punct și virgulă. In regula. Deci, acum observa fereastra mea este un titlu. Așa că am de gând foarte repede pentru a merge până la fișier, Salvare. Și este important ca Eu numesc acest lucru nu "salut". Deci, o greșeală foarte frecvente, în special în problema stabilească un, este de a apela accidental doar dvs. Programul "apă" sau "lacom" sau "Mario" sau "credit" sau altele asemenea. Dar de fapt, doriți să faceți vă că aveți extensia de fișier deoarece aceasta este singura cale prin care compilatorul și, de asemenea, editorul de cod știe că ești scris de fapt de cod C. Așa că lasă-mă să merg mai departe și faceți clic pe Salvare. Și acum, de asemenea, ceea ce CS50 IDE a făcut pentru noi este, de asemenea, că este sintaxă evidențiată totul. Așa că a făcut totul foarte colorat. Și întregul scop de care nu este funcțională. E doar pentru a atrage ochii la conceptual diferite piese din acest program. Așa că hai să mergem mai departe și compila acest lucru. Și eu pot compila acest în câteva moduri. Și în săptămâna unu, mod old-school am făcut a fost literalmente la comandă line-- "hello.c zăngănit." Și apoi m-am lovit Enter. Și nimic nu pare să se întâmple în fereastra de terminal. Dar ce a făcut o schimbare în IDE? În cazul în care, din nou, IDE înseamnă doar Mediu de dezvoltare integrat. Este un mod fantezist de a spune această dezvoltare integrată mediu pentru dezvoltarea de software. Deci, ce sa schimbat in UI? Ce ai observat asta e diferit, Maria? MARIA: Am observat ceva sub IDE50 dosarul aici. DAVID MALAN: Da. Deci aici, nu numai avem "hello.c." Avem, de asemenea "a.out", care este un fel de nume prost pentru un program. Dar, într-adevăr, e numele implicit pentru o Programul atunci când compilați doar codul și nu spun compilatorului ce fișier de ieșire. Deci, dacă vreau să ruleze acest lucru, am Trebuie să-i spuneți compiler-- sau, mai degrabă, trebuie să spune spațiul de lucru pe care am doriți să rulați programul numit "a.out." Introduce. Și nu există "Bună ziua, lumea. "Acum" ./ ". este, de fapt important. Chiar dacă în mod normal ne-am numai scrie numele de comenzi, atunci când este un program ai scris, tu vreau să spun "./" pentru că spune în mod explicit Linux pe care doriți să rulați un program numit "a.out", care este în acest sens, în cazul în care punct înseamnă că acest director sunt în prezent în, care se întâmplă să fie numit spațiu de lucru, "a.out. Pentru că dacă am spus "a.out," Enter, Mă duc pentru a obține "a.out comanda nu găsit ", deoarece computer-- pentru că am inventat "a.out;" aceasta nu a venit cu computer-- nu știe unde să-l caute, chiar dacă este corect sub nasul meu, ca să spunem așa. BINE. Deci, am putea schimba acest lucru fi "zăngăni -o salut hello.c." Și dacă am lovit Enter, ce program se întâmplă acest lucru pentru ieșire pentru mine? Care este numele fișierului? Da, în spate. Asta e corect. "Salut." Deci "hello" va fi numele programului pentru că ne-am folosit de așa-zisul argument linie de comandă, care este doar un mod de schimbarea comportamentului compilatorul de fapt, de ieșire un nume de fișier specific. Și într-adevăr, dacă am zoom afară și privi în sus aici, acum am nu numai "a.out" și "hello.c", dar și "salut", precum și. Deci, acum pot face "./hello," Enter. Și nu există "Salut, lume." Dar lastly-- și această va fi acum convenția am utilizate în întreaga semestru, typically-- este, de asemenea, puteți pur și simplu spune "a face salut." Și într-adevăr, se spune că e sus până în prezent, pentru că există deja. Lasă-mă să mergeți mai departe și a elimina, cu comanda rm, atât "a.out" - și spune "elimina a.out fisier obisnuit?" Asta înseamnă doar, ești Sigur doriți să-l ștergeți? Am de gând să spun da. Și apoi am de gând pentru a elimina "salut", dar nu "hello.c." Am de gând să spun "da" în mod explicit, dar "y" este suficient, de asemenea. Și acum observați dacă tip ls-- care, amintesc, înseamnă list-- listeaza toate dintre fișierele din folderul meu. Și într-adevăr, dacă am zoom afară și uita-te la stânga sus, se confirmă faptul că ceea ce este în acest dosar, chiar deși este etichetat ca IDE50 aici și nu spațiu de lucru, e doar "hello.c." Deci, acum aici, dacă am nu "face salut," Enter, acum văd o comandă mult mai mult, dar o comandă mai sofisticate, care va pentru a fi utile în săptămânile ce vor urma. Și acum pot să spun "./hello." Deci, haideți să aruncăm un tur rapid comenzi alt Linux. Atunci de ce nu facem un pas înapoi și de fapt se uite la C mai în general, trecerea de la zero la C, și apoi se încheie cu o privire la prima problemă stabilit în C. În regulă. Deci, am de gând să merg mai departe și doar curat up spațiu de lucru mea cu control-L doar pentru a menține ecranul curat. Dar asta nu are nici o funcțională impact altfel. Reamintim că am văzut câteva comenzi acum. Deci am văzut zăngănit, care, în general, vă nu va trebui să mai execute manual. Vom folosi în loc de make. Dar am văzut, de asemenea, LS, care arată o lista cu fișierele din directorul meu. Și acum, de ce este there-- Sunt două fișiere acum, "Bună ziua" și "hello.c." De ce există o stea sau o asterisc după "salut"? Ce a semnifica faptul că, pe baza pe ceea ce am văzut în săptămâna unul? Tu ce crezi? Ce semnifică steaua? MARIA: For-- programul "Hello"? DAVID MALAN: "Hello *". Da. Oh da? Oh, executabil. Asta e corect. Deci asta înseamnă că "hello" este executabil. Deci, într-adevăr, de aceea Pot face "./hello." In regula. Deci, ce altceva pot face aici? Ei bine, se pare că pot crea, de asemenea directoare. Așa că lasă-mă să merg mai departe și de a crea, de exemplu, un director "pset1". Și caietul de sarcini problema set va avea faci exact acest lucru, astfel încât să nu trebuie să vă amintiți de azi. Dar "pset1 mkdir" pare pentru a avea nici un impact. Dar, din nou, nu un mesaj de eroare este, în general, un lucru bun. Deci, dacă am de tip "ls" now-- ah, acum Am un fișier executabil numit "Bună ziua", un fișier numit C "hello.c." Și apoi slash la sfârșit, astfel încât să vorbesc, înseamnă că acest lucru este un director. Deci, într-adevăr, acum vreau să-l deschid. Și eu nu dublu click pe el ca într-un GUI, un mediu grafic. Eu spun în schimb "CD pset1." Introduce. Nimic interesant pare a avea sa întâmplat cu excepția mica mea promptă here-- acesta este modul lui de a reaminti Linux mi unde sunt, deci ce dosarul este deschis. E doar mi-a spus în mod explicit spre deosebire de grafic. Și dacă tastați "ls," De ce am vedea un alt cere imediat, crezi, când am lista conținutul pset1? MARIA: probabil că nu au nimic acolo. DAVID MALAN: Da. Deci nu avem în mod evident, creat ceva acolo pentru că tocmai am creat directorul. Acum, dacă am vrut să creeze un file-- pentru exemplu, am putea crea un nou fișier. Și apoi am putea merge la Salvați și salvați-l ca, cum ar fi, "mario.c" dacă faci ediția standard a PSET unul. Și apoi, ca orice Mac sau PC, doar alegeți folderul "pset1, Salvare. Și acum fișierul este gol. Dar să zoom din nou pentru un al doilea. Să facem LS aici. Acum vom vedea "mario.c". Deci nu e câteva alte comenzi care sunt în valoare de având în minte pe time-- clar, sau Control-L este ceea ce am fost lovit; mkdir am văzut; rm am văzut, de asemenea, care este pentru îndepărtarea sau ștergerea unui fișier. Feriți-vă puteți also-- și dacă te uiți la tutoriale on-line, veți rm -rf este un mod foarte frecvente de a spune șterge un folder care are lucruri in ea. Doar fi super, super-atent. -rf înseamnă recursiv șterge tot ce este pe care încercați să ștergeți și forțat-l ștergeți. Deci, recursiv mijloace, dacă este un dosar cu un dosar cu un dosar cu un dosar, șterge toate. Și forța înseamnă nici măcar nu Spune-mi da sau nu, nu-i sigur? Deci, este un mod foarte periculos de ștergerea o mulțime de lucruri rapid. Dar de prea multe ori beware-- face o Intrepid elev șterge accidental, să zicem, PSET o, de exemplu. MARIA: Și dacă ei doar face -r, vor pentru a le cere despre fiecare singur fișier. DAVID MALAN: Care este moderat enervant. MARIA: Da. DAVID MALAN: Deci, de aceea atât de mulți dintre noi, de sine inclus, Sunt în obiceiul de a folosi -rf. Dar e periculos. Deci, ai grija cumpărător. Și apoi mv este un fel de interesant numit. Deci aceasta este comanda mișcare, care se simte un pic ciudat pentru că puteți într-adevăr să-l utilizați muta fișiere dintr-un loc în altul. De exemplu, să presupunem că am dat peste cap. Să presupunem că am creat un nou fișier pentru PSET. Și l-am salvat ca "greedy.c." Dar să presupunem că am accidental salvați-l în IDE50-- astfel încât în ​​spațiul de lucru meu sine și nu în pset1. Puteti vedea la fel de mult la stânga sus. Nu e "greedy.c." Și există câteva soluții. Deci unul, pot folosi super-mod user-friendly de doar glisarea și fixarea-l. Și de fapt care ar rezolva această problemă. Dar astăzi, noi încercăm să se uite la modalitățile mai Arcane, dar puternic de a face acest lucru. Deci, lasă-mă să iau "ls", în pset1. Și văd doar "mario.c." Lasă-mă să mergeți mai departe și de a face "cd ..". Deci CD din nou, este director schimbare. ".." Înseamnă ceea ce, totuși? Ultima dată când i-am spus "CD pset1 "pentru a merge în pset1. Așa că atunci când spun "cd ..", ce fac? Înapoi. Da. Deci o să așa-numitele părinte. Du-te un nivel mai sus, cum ar fi ieșirea dintr-un folder. Deci Enter. Și într-adevăr, uite ce a făcut. Mi mutat în spațiu de lucru în loc de în pset1, care este în spațiul de lucru. Și acum, dacă mă tip "ls", există o grămadă de lucruri. Acolo este "greedy.c". Deci, acum lasă-mă să folosesc mv pentru a literalmente muta "greedy.c" în pset1. Și astfel o mulțime de comenzi Linux lucra exact ca aceasta. Ei iau nici un argument sau care le iau unul argument sau le iau două linie de comandă argumente și așa mai departe. Și în acest caz, este literalmente face ceea ce se spune, deși succinctly-- muta greedy.c în pset1. Introduce. Nimic nu pare să se întâmple. Dar dacă am face un ls din nou, lacom este plecat. Și dacă fac "CD pset1", Enter, și apoi ls din nou, acum e în locul potrivit. Ca o paranteza, dacă pentru unele reason-- special dacă aveți intermitent conectivitate în rețea sau te plimbi în jurul valorii de campus cu capac laptop închis și apoi deschideți-l în sus din nou și spațiul de lucru pare oarecum din sincronizare, nu e mare lucru. Doar reîncărcați browser-ul dvs. fereastră, și ar trebui RESYNC astfel încât-stânga browser de fișiere arată exact ca fereastra terminal. Nu vă faceți griji. Dacă aveți dubii, reîncărcați pagina, astfel încât timp cât ați salvat deja fișierele. BINE. Deci mv poate fi de asemenea utilizat pentru a redenumi fișiere. Și haideți să aruncăm o privire la această comandă finală aici. Deci suppose-- și acest lucru este super-comun, de asemenea, de timpuriu. Unii studenți, ocazional, a crea un fișier numit, să say-- ce e altul? Ca și "WATER.C." Așa că voi striga doar, pentru nici un motiv, în toate capacele. Dar acest lucru nu este Numele corect pentru fișierul dacă numai pentru că problema noastră set caietul de sarcini nu ți-a spus pentru a salva fișierul ca toate capacele "WATER.C." În schimb, ne așteptăm "water.c" cu litere mici. Și, în fapt, aceasta este problematică, deoarece check50, un program mergi să se întâlnească în probleme set una care testează în mod automat corectitudinea codului va striga la tine să în cazul în care nu se poate găsi "water.c" în toate litere mici. Așa că am nevoie pentru a remedia acest lucru. Atât de multe moduri diferite de a face acest lucru, dintre care primul ar fi Control-clic sau clic-dreapta numele fișierului și doar schimba Redenumire. Total fin pentru a face acest lucru. Dar, din nou, astăzi, să face un pic crescator. Să folosim mv pentru a modifica "WATER.C" la "water.c." Astfel încât să puteți utiliza, de asemenea, primul argument să-l redenumiți la al doilea argument dacă al doilea argument nu este în De fapt, un folder sau un nume de director. In regula. Și, în fine, un pic trick-- așa că eu sunt în directorul meu spațiu de lucru în acest moment. Dacă vreau să intru în PSET unul, Am posibilitatea să tastați cu siguranță "CD pset1." Dar e atât de plictisitor să tastați "pset1" sau mai nume de fișiere sau nume de directoare încă. Deci, de foarte multe ori în Linux, ceea ce poti sa faci este începeți să tastați "PSE" și doar se plictisesc, lovit Tab, și să cifra de calculator-l pentru tine. Super util pentru a intra în acest obicei. Singura captura este dacă aveți mai multe fișiere sau foldere care încep cu litera "p" sau "PS", s-ar putea avea să tastați câteva mai înainte ca calculator știe ce să facă. MARIA: Ne place comenzi rapide. DAVID MALAN: Aceasta va salva atât de mult timp. Și, de asemenea, așa cum am spus în prelegerea, ai Puteți derula în istorie, sus și în jos, pentru a găsi recent executat comenzi, precum și. In regula. Deci, acum, să ne îndreptăm atenția înapoi la un program simplu, salut lume. Deci ne-am alcătuit această exact. Și acum, de ce nu luăm o privire la tipurile de date și apoi trecerea de la unele blocuri Scratch corespunzătoare C. MARIA: Awesome. Deci, acum că v-ați început scrierea programelor în C, vom începe să vorbesc despre tipurile de date și variabile. Astfel încât unele tipuri de date pe care le ar dori să știe de acum sunt cele care sunt evidențiate în albastru. Deci avem Int în primul rând, care vine de la întreg. Și care deține numere întregi, în timp ce poate avea atât guessed-- 1, 2, 3, și orice alte numere întregi care vă puteți gândi. DAVID MALAN: Și, de asemenea negativ. MARIA: Și, de asemenea cele negative, da. Și 0. Apoi, avem flotoare, care sunt numere în virgulă mobilă. Deci, asta e toate numerele reale care au puncte zecimale. Deci 5.0, 5.2, și chiar mai mult cifre după virgulă, precum și, de asemenea cele negative. Apoi, avem char, care este un personaj. Deci, cred că am vorbit despre acest curs în ziua de azi. Dar avem scrisori, pentru example-- A, B, C- care pot fi stocate ca un char. Dar atunci avem mult mai multe simboluri care pot fi stocate ca un char. Iar cei sunt stocate ca ASCII. Și apoi ne-am bool, care sunt Booleans. Iar cei evalua la True sau False sau 1 și 0, respectiv. DAVID MALAN: Și amintesc că bool vine de la biblioteca CS50. Deci nu este construit în C, dar este foarte util pentru a avea noțiunea de adevărat și fals. Și chiar dacă te s-ar putea think-- fapt distractiv. O bool are nevoie de punct de vedere tehnic cât de multe biți, cu adevărat, pentru a reprezenta Adevărat Fals față? Câți biți crezi ai avea nevoie, maxim? Da, doar unul. Deci, se dovedește că C Nu vă pot da doar un singur bit. Cea mai mică unitate de măsură puteți obține este de opt. Deci, este un pic risipitor ei te folosind un întreg octet, sau opt biți, pentru a reprezenta adevărate sau false. Dar asta e doar modul în care aceasta este implementat în C prin bibliotecă CS50. MARIA: Și apoi cei care suntem Nu vorbi despre cum larg drept now-- dublu, asta e flotoare mari. Lung lung și scurt sunt, de asemenea, pentru numere întregi. DAVID MALAN: Într-adevăr. În hacker ediție a PSET o, de fapt, vom folosi mult timp lung. Dar pentru ediția standard nu ar trebui să fie necesară. MARIA: cool. BINE. Deci ar trebui să fie operators-- probabil, familiarizat cu cele mai multe dintre acestea. Plus, +; scădere, -. Pentru multiplicare, avem *. Deci, nu X pe care le de obicei folosesc. Divizare, avem backslash. Și modulo este ultima noastră operator care vom vorbi despre acum. Este un operator care ne permite să ia restul unei diviziuni. Deci, dacă avem 4% 2, 4 divizat de 2 este 2, cu un rest de 0. Deci 4% 2 este 0. 4% 3 este 1. 4% 5 este de 4, așa cum ați putea fi ghicit. Și amintiți-vă atunci când se utilizează toate acestea operatorilor de a utiliza regulile PEMDAS. DAVID MALAN: Deci să fie clar, dacă face 4% 2, de ce este că 0, mai exact? MARIA: Deoarece 4 împărțit la 2 este 2, cu un rest de 0. Deci, modulo ne dă ca rest ca spre deosebire de rezultatul diviziei. DAVID MALAN: Și într-adevăr, ceea ce vom găsi acest ajutor este faptul că în unele probleme asta nu e neapărat o, dacă doriți să aveți efect restrângerea tine la un interval de numere ca 0 prin ceva, puteți utiliza modulo să-și încheie în jurul valorii de mai devreme decât ca 2 miliarde sau valoarea pe care 4 miliarde pe care am vorbit despre în curs. MARIA: Da. Și chiar și în "lacomi" ne-ar putea. DAVID MALAN: Da, în problemă stabilit o, de asemenea. MARIA: Da, frumos. DAVID MALAN: Bun indiciu. MARIA: Îmi pare rău. Boolean expressions-- așa pentru operatori booleeni, vom vorbi despre toate dintre acestea pe care le vezi aici. Deci, chiar acum, avem două semne egale enumerate pentru egali. Deci, acestea sunt pentru comparație. Până acum, am văzut doar o singură egal semn. Asta e atunci când ne-am atribui o valoare unei variabile. Deci, dacă am văzut int n = 5, atunci am alocat 5 la n variabile. Dar dacă vrem să utilizați pentru == comparație, putem verifica dacă n == 5. Și dacă n == 5, atunci e adevărat. Operatorilor astfel Boolean ne permite, practic, pentru a evalua Boolean expresii de adevărate sau false. Deci, nu avem equals-- semnul exclamării și egali. Deci, am putea verifica, de asemenea, în cazul în care n nu egal cu 5-- astfel n! = 5. Mai puțin, mai mică sau egală cu, mai mare decât, mai mare sau egal cu, și apoi avem logică ȘI și SAU logic. Iar cei ne permit sa evalueze mai multe expresii booleene împreună să vină împreună, ca practic o expresie booleană întreg. Deci, dacă vrem să găsim un număr, să zicem, care este mai mare decât 5, dar mai mică de 15 în același timp, vom folosi logic operatorului pentru a vedea dacă n este mai mare de 5 && n mai puțin de 15. DAVID MALAN: Și aici, de asemenea, este foarte ușor devreme pentru a accidental utilizați doar un singur ampersand sau un singur bară verticală. Și, sperăm, compilatorul va tipa la tine, deoarece acestea de fapt au o semnificație foarte diferite. Pentru cei curioși, sunt folosit pentru operațiuni la nivel de bit, operează pe biți individuali. Dar tu faci vrei o pereche de ei aici. Și super-important este faptul că Primul, semnul egal, care este operatorul egalitate ca spre deosebire de operatorul de atribuire. MARIA: Și bara verticală este situat între șterge și retur. DAVID MALAN: Da. Pe o tastatură tipic american. MARIA: Da. Deci, haideți să sari direct în Declarații condiționată. În Scratch, ai deja văzut, probabil, dacă declarațiile pe care le permit să verifica dacă ceva este adevărat, atunci face altceva. Deci s-ar putea fi vrut pentru a verifica dacă Sprite este atingând un alt Sprite sau frontiera a ecranului. Și apoi s-ar putea fi vrut să termina jocul sau de a face altceva. Deci, sintaxa pentru care este "în cazul în care (condiție)." Deci, dacă Sprite dvs. atinge ceva, atunci nu este în interiorul acolade. Apoi, avem dacă-altceva declarații. Altele ne permite să facem ceva în cazul în care condiția ca noi verifica la început nu este adevărat. Deci, dacă sprite atinge frontieră a face acest lucru, altfel fac altceva. Deci, în caz contrar face altceva. Atunci avem o scurtă exemplu în acest sens. Deci, dacă (military_time <12), ne-am doresc să printf "Bună dimineața!" Altfel vom printf "Bună seara!" Exemplu de bază. DAVID MALAN: Bine. MARIA: cool. Deci, acum avem declarații de comutare. Comuta declarații în general, poate ne permit să facă o mulțime de același lucru care tocmai am vorbit despre cu if. De exemplu, chiar acum avem forma generală a switch care ne permite să ia o variabilă numit n și compara cu o mulțime de valori diferite, care ne aici au numit constant1, constant2. S-ar putea avea o mult mai mult. Și acestea sunt numite cazuri. Deci, dacă avem un comutator statement-- și funcționează această doar pentru integers-- avem o variabilă în acest caz, care este n. Dacă n este variabila egală cu constant1, am va executa unele fragment de cod sau ceva ce vrem să facem. Și apoi ne-ar rupe. Deci pauza înseamnă că declarația comutator se va opri de executare în cazul în care n este egal cu constant1, și apoi programul va continua. Se va ieși afară din comuta declarație și că va continua să facă altceva. Dacă, totuși, n nu este egal constant1, apoi de caz pentru constant2 vor fi verificate. Deci, dacă n este egal cu constant2, celălalt fragment de cod va fi executat. Și apoi voi rupe dacă acest lucru este egal cu acesta. Si atunci putem avea also-- nu în mod necesar, though-- un caz implicit, care se va întâmpla în cazul în care n nu este egal oricare dintre cazurile pe care le-am enumerate. Iar în cazul implicit, avem, de asemenea nu au nevoie de o pauză în mod necesar deoarece declarația comutator va ști care are nevoie pentru a încheia după implicit caz dacă e cazul. DAVID MALAN: Dar stilistic, am mereu pus-o acolo. MARIA: Da. DAVID MALAN: Da. Deci, mai ales atunci când la început, mai ales dacă printre cei mai puțin confortabil, aș personal doar recomanda stick cu IS și FI-elses și dacă-altceva-dacă-elses și așa mai departe, dacă numai pentru că sunt un pic mai simplă. Aceasta este o optimizare frumos, sau uneori chiar estetic aceasta face codul mai ușor de citit. Și, de fapt, probabil la mijlocul-semestru vom vedea o problemă stabilit în cazul în care doar arata mai bine și mai ușor de citit pentru oameni prin utilizarea unui comutator declarație. Dar nu vă faceți griji cu privire la agățându-se de acest lucru prea devreme. MARIA: Da. Dacă aveți o mulțime de if, doar nu s-ar putea să fie foarte ușor de citit. S-ar putea să nu fie foarte rapid pentru tine de a merge prin ea. Deci trece declaratii pot fi foarte util, de asemenea. Și, de asemenea, nu amintește-ți nu uita pentru a pune în pauzele de acolo. DAVID MALAN: Nu-mi amintesc asta. MARIA: Pentru că atunci s-ar putea cădea prin de la un caz la altul. Deci, haideți să spunem acest caz constant1 nu are un motto pauză în ea. Atunci am putea cădea prin constant2 caz interior. Și nu vreau să fac că, dacă am ajuns deja caz constant1 și este egal cu n. Deci, de exemplu, în cazul în care avem o variabilă n care conține un număr de clasă, și vrem să vedem că ceea ce clasa este-- dacă n este egal cu 50, vom pentru a imprima "CS50 este Introducere în Informatică I. " Atunci vom rupe. Si asta e. Dacă, totuși, n este egal la 51, vom pentru a imprima "CS51 este Introducere la Informatică II. " Apoi, din nou, vom rupe. Cu toate acestea, în cazul în care atunci am pus 124, 61, orice alt număr care v-ar gândi, sau program nu este de gând să recunoască faptul că. Deci o să spună, "Îmi pare rău, eu sunt nu sunt familiarizați cu această clasă. " Și se va rupe. DAVID MALAN: Deci, puteți vedea cu adevărat if, else if, idee mai aici. E doar diferit sintaxa pentru exprimând aceeași idee exact. MARIA: Exact. Acum avem operatorii noștri ternare. Operatorilor astfel ternare au trei parts-- o condiție, ceva de a face în cazul în care această condiție este adevărată, și apoi să facă ceva dacă această condiție este falsă. Deci, vedeți, practic, sintaxa ca aici. Avem semnul de întrebare, și apoi the-- ce noi numim acest lucru? DAVID MALAN: colon. MARIA: Colon. Multumesc. Scuze. Deci, să ne uităm la exemplul nostru pentru a vedea dacă putem face sens de astea-- class_num == 50. Deci, aici vedem operatorul nostru Boolean == care compară class_num variabilă la 50. Magazine Deci class_num un număr întreg. Și dacă întreg este egal cu 50, atunci suntem merge pentru a stoca "David Malan" în interiorul profesorul șir. Dacă numărul clasă nu egal 50, "nu David Malan" va fi profesor. DAVID MALAN: Mulțumesc. Și așa mai departe acest lucru pare echivalent cu ceea ce, ai spune, la prima vedere? MARIA: Mie mi se pare ca în cazul în-altceva declarații. DAVID MALAN: Da. Și, de fapt, acest lucru este un fel de o destul de o linie, ca să spunem așa, pentru punerea în aplicare exact logica în cazul în care-altceva dar face totul într-un singur pas. MARIA: Exact. Da. Declarații așa că, dacă-ar mai putea să ia o mulțime de spațiu. Acestea ar putea fi prea mult timp pentru ceva la fel de simplu ca asta. Deci, acest lucru poate fi foarte succint și foarte frumos. Deci, acum vom uita la în executare ceva nou și din nou, astfel de verificare pentru o condiționează de mai multe ori și apoi continuă să facă ceva în timp ce această condiție este adevărată. Deci, acest lucru ne aduce frumos în timp ce buclele. La stânga, avem primul nostru buclă în timp ce. Deci în timp ce ceva este adevărat, face nou și din nou ceva. Deci, asigurați-vă că pentru a observa că ne condiție aici este validată în partea de sus. Întrucât cu doua loop-- noastră noi numim că un do-timp loop-- facem ceva, apoi vom verifica pentru o stare. Și dacă această condiție continuă să fie adevărat, ne întoarcem și de a face din nou un lucru. Deci, diferența principală este în cazul în care condiția este verificat pentru. Și codul nu poate fi niciodată executat în cazul în care condiția nu este adevărat cu bucla în timp ce. Întrucât, cu do-timp bucla, avem codul care este întotdeauna execută cel puțin o dată. Și apoi, în timp ce starea de continuă să fie adevărat, ne putem întoarce și repeta din nou în interior. Deci, de ce crezi că ne-ar folosi un do-timp bucla pe o buclă în timp ce? Dreapta. Deci, dacă vrem să solicita utilizator pentru un fel de intrare, dacă vrem să le cerem pentru a introduce numele lor, vrem cel puțin să le cereți o dată. Și în cazul în care intră acest nume, nu suntem O să-i întreb din nou pentru că o știm deja. Dar în cazul în care nu intră numele lor, sau în cazul în care introduceți ceva care este evident, nu un nume, tot doresc să continue cerându-le pe de numele lor. DAVID MALAN: Și în curs am avut o ca acest lucru cu int pozitiv obține exemplu, în cazul în care nu este nimic de verifica la început, pentru că nu au nici măcar primit un Int. Deci, vrem sa facem asta: obține un întreg de la user-- apoi verifica, probabil, din nou și din nou și din nou. MARIA: Exact. Pentru loops-- OK. Pentru bucle poate permite să facem aproape exact același lucru, de asemenea. Este de fapt exact același lucru. Deci nu e nimic care se poate face cu bucle pentru că nu ar fi capabil a face cu bucle de timp. Dar pentru bucle poate părea un pic pic mai complicat sintactic pentru că au trei părți în interiorul ceea ce a fost înainte Doar condiție cu bucle de timp. Deci prima parte pe care le mare, stânga-cele mai multe, avem "int = 0. pitici" Deci acest lucru este în cazul în care ne-am inițializarea variabilei noastre. Atunci avem un punct și virgulă și "pitici <7." Deci acest lucru este în cazul în care în condiție este de fapt. Deci asta este ceea ce ne-ar trebui pune doar în timp ce loop-- "în timp ce pitici <7." Aici, că îndreaptă în mijloc de pentru noastre bucla. Deci "dwaves <7." Si apoi ultimul nostru este parte "pitici ++," care este în cazul în care ne-am actualizat variabila noastră. Deci cel mai important lucru pentru a realiza acest lucru este faptul că este de gând să treacă prin această buclă de de șapte ori și să execute șapte ori. Deci avem șapte pitici, și toate sunt va spune, "Sunt aici pentru a vă ajuta, Albă ca Zăpada " pentru că ei sunt gata pentru a ajuta la Albă ca Zăpada. Cu timp bucle, ne-ar fi făcut inițializarea și actualizarea nu în interiorul condiției, din nou, dar fie înainte, fie în interiorul buclei în timp ce să vă asigurați că we-- deoarece avem mereu nevoie de acele părți. Deci, pentru a vă asigura că avem ei, ne-am fi încă le-a adăugat pe, doar nu în interiorul paranteze. DAVID MALAN: Și așa se pare like-- în curs, de exemplu, Aproape că am să folosiți întotdeauna, cum ar fi, eu și n și variabile destul de plictisitor. Se pare ca poti folosi mai mult numit inteligent variabile, de asemenea. MARIA: Da, e de fapt foarte frumos de a utiliza variabile un pic mai mult descriptive pentru că mai ales în cazul în care cineva este lectură code-- dumneavoastră poate esti elev de clasa sau dacă sunteți colaborare cu somebody-- doriți să vă asigurați că acestea înțeleg ce faci. BINE. Deci, acest lucru este ceva foarte funky-- pentru bucla în interiorul unui pentru buclă. Nu știu dacă am văzut acest lucru înainte. Probabil ca nu. Dar putem avea, de fapt asta: așa buclele loc de bucle. Deci, nimeni nu vrea să meargă, poate, mi prin ce se întâmplă aici? DAVID MALAN: Voi lua o lovitură de cuțit. MARIA: cool. DAVID MALAN: OK. Deci, spoiler-- vrem să imprimați lucruri care este în colțul din dreapta jos Acolo. MARIA: dreapta. Da da. DAVID MALAN: Deci Tocmai am pune că producția proba acolo. Deci, eu pot deduce din cel mai important bucla că ești iterarea peste rândurile de bucla exterioară, ca să spunem așa. Și tu iterarea peste coloane cu cel mai intim bucla. Și intuitiv, acest ar trebui să sperăm are sens deoarece prin natura fiecare program am vazut înainte, printf, care este Funcția folosim, în cele din urmă, are capacitatea de a imprima lucruri în esență linie cu linie. Ca, odată ce ați scoasă o nouă linie, nu e nici dublarea înapoi și imprimarea ceva mai mare în ecranul, cel puțin Nu utilizați printf așa. Și astfel, în această privință, face sensul că bucla exterior Trebuie referire la rândurile deoarece pentru fiecare rând dat, ai de gând să doriți să imprima XXXXX, și apoi trece la rândul următor, XXXXX. Deci rânduri sunt pe primul loc. Și apoi în fiecare rând, imprimați coloane. Dacă ați încercat să-l do opus, nu ar fi, probabil ieși așa cum intenționați. MARIA: Da. Noi doar nu a putut reveni la rândul anterior cu printf. DAVID MALAN: Și ce e interesant pe chat-ul de astăzi despre domeniul de aplicare, de fapt, este că rând este un int care este declarat în cel mai de sus bucla. Dar observați că este încă interiorul, ca să spunem așa, acolade care imediat urmat, chiar dacă nu este punct de vedere tehnic în aceste acolade. Deci rând este în domeniul de aplicare pentru toate elementele de fragmentul de cod, atât în ​​interiorul de exterior pentru bucla și în interiorul interior pentru bucla. Dar în schimb, în ​​cazul în care este coloana in domeniu? Coloana variabilă? Da, numai în bucla interior. Și asta e în regulă pentru că nu avea acces la se în afara bretele sale buclat. Tot ce facem este imprima o nouă linie la sfârșitul acolo. Așa că, de fapt, este în regulă. Deci acest lucru are ca efect, se pare ca, de a face trei rânduri și patru coloane. MARIA: dreapta. Deci, în primul rând ne-am trece prin primul rând. Și în primul rând nostru, facem patru coloane din interiorul primului rând. Așa că am imprima patru X-. Și apoi vom puteți ieși din bucla pentru, deoarece ne-am imprimat deja patru X-. Și am imprima o nouă linie. Și apoi vom merge prin același procedeu de mai multe două rânduri pentru a face un total de trei. DAVID MALAN: Și este demn de remarcat faptul că este doar un artefact al fontului, faptul că exemplul de ieșire par atât de mult mai înalt, ca și cum nu e mai mult rânduri decât coloane. Dar e doar pentru că X este mai inalt decat este larg. Asta e tot ce se întâmplă acolo, plus spațiul alb dintre linii. MARIA: dreapta. Misto. DAVID MALAN: Bine. Deci, o privire rapidă la problema stabilească un, ia orice întrebări, și apoi amâne? In regula. Deci, în problema stabilit o, nu e trei provocări primare, în cele din urmă. Dar, mai întâi, veți găsi că problema setat caietul de sarcini, ca și în mulți, psets aceasta toamna, este de gând să te plimbi prin câteva exerciții de încălzire, ați subliniat câteva resurse pe care le poate eventual nu s-au văzut deja. De exemplu, CS50 are o suită de pantaloni scurți, care sunt scurte videoclipuri, nu spre deosebire de acest lucru, dar că sunt foarte specific-- subiect Poate cinci minute, 10 minute în lungime pe bucle sau privind condițiile sau pe algoritmi sau mai târziu pe mai subiecte avansate, precum și. Și, în general, ne-am embed cei în problema seturi astfel încât studenții au o resursa cu care să revizuiască materiale care ar putea avea deja veni în curs sau secțiune. Dar în acest fel este mai concentrat și mai la indemana lor. De asemenea, avem tendința de a încorpora în probleme stabilește lucruri numite walkthroughs. Deci, aproape toate exemplele pe care le fac în curs, pe scena aici, avem, de asemenea au împușcat pe aparat de fotografiat în avansa o mai lent, o prezentare mai intim de mine pe laptop-ul meu din același cod, linie cu linie astfel încât, în clasă, vom adesea degresat prin ceva sau cineva va intervin cu o răspunde la o întrebare. Dar nu în mod necesar chiuveta în pentru toată lumea în public. Astfel încât veți găsi codul walkthroughs pentru majoritatea exemplelor ceea ce facem aici, în curs, astfel încât să poate merge prin ea în ritmul propriu și înapoi sau rapid înainte sau sări cu totul, dacă doriți. Există de multe ori câteva întrebări Warm-up care vă întreb pentru a sorta de consolida acest material și asigurați-vă că sunteți confortabil înainte a continua cu restul de PSET. Și apoi, desigur, acolo e PSET sine. Și unul dintre lucrurile am foarte în mod deliberat face în CS50 este aproape în fiecare neinteresant sau neinteresant intelectual pas mecanic care s-ar putea trebuie să faci este aproape întotdeauna foarte bine documentat. Pe parcursul termenului, vom începe să pună întrebări retorice mai ca amintiți-vă cum se face acest lucru sau că? Dar, în general, veți găsi că seturile problemă te prin mecanica de ceva, astfel încât interesante provocări, intelectuale sunt în cele din urmă a plecat să-ți student. Cu care a spus, Zamyla, la care ne-am păstrate de trimitere astăzi în curs, este unul dintre personalul nostru de mult timp membru care deține, de asemenea, walkthroughs pe probleme specifice, cum ar fi PSET mario și lacomi, deși nu uda in acest an. Și este în cele walkthroughs că de multe ori oferă câteva sfaturi și trucuri pentru cum să procedeze, nu vă spun exact ce să fac, dar rather-- ca o condiție, dacă will-- oferindu-vă cel puțin o cateva idei, astfel încât este de până la tine, în cele din urmă, pentru a decide cum să le abordeze. MARIA: ca un fel de nivel înalt înțelegere a logicii a ceea ce noi vă cerem să faci. DAVID MALAN: Exact. Și, de fapt, Zamyla lui walkthroughs sunt destinate Pentru a răspunde la frecvent întrebare pusă de unde nu am inceput, mai ales atunci când aceste specificații sunt lungi un pic descurajatoare dat tot textul și imagini pe care le au în ele. Deci water.c, veți găsi după ce ați terminat, este, de fapt relativ simplu. Absolut sunt o grămadă de gând să-bang-ului vă capetele de perete încercând să dau seama de ce nu este compilarea sau de ce nu execută corect. Dar, odată ce ați terminat cu ea și odată ce ați petrecut ceva timp lupte cu orice de bug-uri pe care le-ar putea avea, veți găsi că este un program foarte scurt. Aceasta se poate face în doar câteva linii de cod, dintre care cele mai multe am vazut aici, în curs deja, în cazul în care va asambla blocurile potrivite. Și, după cum vă sugerăm aici, o să ceară să specificați cât de multe minute cineva este de a lua un duș în campus. Mentionam în problema stabili rata de curgere a apei în, cum ar fi, un duș cu debit scăzut cap, la fel ca clipul Seinfeld am văzut ieri sau opusul acestora. Și apoi doar ai pentru a face un pic de matematica, really-- aritmetică folosind C pentru a spune ne cât de multe, aproximativ, sticle de apă este că, echivalent cu dacă suntem ținând seama de o cabină de duș n-minute. Acum, în mario.c, acest lucru se întâmplă să fie un program de puțin mai lungă. Tot nu va fi atât de mult. Doar câteva linii mai lungi de water.c. Dar va fi oportunitate pentru a recrea vechi scoala Mario piramida de la Super Mario Brothers sau unele follow-on. Nu va arata la fel de frumoasa pentru a sau fel de colorat ca să rețină acolo. Noi doar de gând să utilizeze hashtags mici ca avem aici pe ecran folosind text ASCII. Dar va aproxima aceeași idee. Și se va fi un exercită că la prima vedere pare destul de simple-- doar imprima o piramidă simplu. Dar există câteva caracteristici o aici, care sunt interesante. Observați că marginea din dreapta a piramida are de fapt două lățime. Deci nu e de două egal coloane înălțime, care face aceasta necesită un pic pic de gândire pentru a face vă că aveți că exact drept, așa cum spre deosebire de doar un unghi perfect linia. Așa că e un pic de un caz de colț dar se potrivește cu jocul actual. Și este, de asemenea, non-evident, la prima privire modul de imprimare în spațiul alb. Așa că, atunci când mă uit la ieșire here-- eșantion și este, de asemenea, în spec-- ea un fel de arata ca un dreptunghi, dar un diagonală a dreptunghi a fost tăiat, și este doar spații albe, ca să spunem așa. Și astfel o des cerut Întrebarea aici este întotdeauna, bine, cum pot muta hashtags peste la dreapta? Sau cum imprim spațiile goale? Și este de fapt mai ușor decât majoritatea studenților cred. Dreapta? Puteți să-l aproxima vizual de doar lovind bara de spațiu o dată sau de două ori sau trei ori. Și astfel, chiar dacă cu printf ne aproape imprima întotdeauna un șir sau un int sau un cuvânt ca "Bună ziua, lumea "sau serie de cuvinte, puteți, de asemenea, pur și simplu imprima Citat, spațiu, încheiat citatul. Și care va oferi de fapt ai un spatiu alb acolo. Astfel încât să păstreze în minte și Nu gândi prea asta. Trebuie într-adevăr să decidă rând de rând cu rând, nu spre deosebire de exemplul tău un clipă în urmă, cât de mulți dintre cei coloane ar trebui să fie spații albe și cât de multe dintre ele ar trebui să fie hashtags. Acesta va lua un pic de timp, dar este în cele din urmă un puzzle logică de felul. MARIA: Da. Dar logica de a merge rând cu rând va fi foarte util aici. DAVID MALAN: Da. Cred că acest cod de probă vă gave-- chiar deși nu a fost un program complet. Ai nevoie de încă Int și principal și stdio.h gol și #include, o mulțime de lucruri de la curs. Dar blocurile par a fi acolo. Și apoi în cele din urmă este ceva un pic mai mult algoritmic. Deci, se dovedește că de fiecare dată când du-te în CVS sau orice magazin și cineva te dă la facturile casier sau monede ar fi schimbările, se dovedește că acestea, oamenii, dacă sunt sau nu-l cunosc sau nu, sunt, probabil, folosind ceea ce este numit un algoritm greedy, care dacă sunteți dator, să zicem, $ 21 în schimbare, deoarece pentru un motiv oarecare ai cumparat ceva foarte ieftin cu un proiect de lege foarte mare la CVS, ar fi foarte enervant dacă casier ți-a dat 21 de single sau, mai rău totuși, o mulțime de monede. Mai degrabă, ceea ce o persoană rezonabilă este probabil de gând să faci este au de gand pentru a apuca un 20- $ și apoi un proiect de lege-1 $, și voi preda doar două proiecte de lege în acest caz. MARIA: Așa că te caută să reducă la minimum schimbarea pe care le dau înapoi. DAVID MALAN: Exact. Și aceeași afacere cu monede, de asemenea. Dacă sunteți dator, să zicem, $ 0,50 sperăm că nu vrei 50 mărunțiș. Vrei loc doi trimestre, de exemplu. Acum, acest lucru nu presupune care casierul a destul de fiecare denominațiune care el sau ea ar putea să doriți să vă dau. Dar noi vă permit să-și asume la fel de mult în problema. Și poarta în cele din urmă, este de a pună în aplicare în cod C-un algoritm greedy. Deci utilizatorului i se permite să tastați în cât de mult schimba el sau ea se datorează cu dolari și cenți, un fel de virgulă mobilă Valoarea probabil. Și apoi ce trebuie sa faci matematica și dau seama algoritmic, bine, cât de multe monede pot da vă minim pentru a vă oferi exact acea cantitate de schimbare. Dar nu va fi o câteva piese de complicat aici, nu? Ca nu e întreg problemă imprecizie. MARIA: Exact. Deci punctul plutitoare Valorile au imprecizie. Am vorbit despre acest lucru in curs de astăzi? DAVID MALAN: Am facut ultima dată în curs. Am vorbit despre imprecizie. Și nu vrei să trișeze utilizator de cât de mult schimba el sau ea se datorează. Și astfel de revizuire, în caietul de sarcini problema stabilit, da unele crezut, în cele din urmă, cu privire la cum poti atenua aceste imprecizie erori, potențial. Este evitată, cu siguranță, pentru intrările vorbim despre. Și, de fapt, pennies-- poate vom amâna la Zamyla, Cred că, pentru trucuri de acolo. Deci în cele din urmă, veți găsi o progresie de probleme în această săptămână, dintre care primul este destul de mic, apoi mediu, apoi un pic mai mare. Dar toate le folosesc clădirii blocuri din această săptămână trecut, din acest supersecțiune, set specificație problemă te pune la resurse nenumărate. Dar totuși, dacă la toate lupta, în special în rândul celor mai puțin confortabil cu nici un fundal prealabilă, vin la ore de birou luni și marți și Miercuri și joi. Du-te la CS50 Discuta prin site-ul cursului, prin care puteți chat cu personalul și colegii. Dar în cele din urmă, cred că cel mai bun sfat este doar începe devreme. Nu e genul de clasa pe care le ar trebui să fie începând psets miercuri noapte, sau mai rău joi seara. MARIA: cel mai bun Sfatul meu este să fi început de luni. DAVID MALAN: luni. Deci, dacă nu au început already-- nr. Dar chiar dacă nu luni, apoi marți. Mai devreme cu atât mai bine. Și asta e motivul pentru care Desigur are atât de multe de întârziere zile este pentru a vă oferi un pic de o presiune psihologică pentru a începe mai devreme, dar încă să lucruri alunecare atunci când lucrurile dura mai mult decât vă așteptați. MARIA: Și vrei să facă uz de orelor de serviciu la fel de mult ca tine poate, de asemenea. DAVID MALAN: Orice întrebări? In regula. Ei bine, de ce nu ne suspenda aici?