[Powered by Google Translate] [Secțiunea 3] [mai puțin confortabilă]
>> [Nate Hardison] [Universitatea Harvard]
>> [Acest lucru este CS50.] [CS50.TV]
>> În regulă, să începem.
Bine ati venit la Săptămâna 4 din CS50.
Dacă voi deschide un browser web și deschide PSET 3,
Scramble cu CS50, vom începe să mergi
prin secțiunea de întrebări acolo.
La fel ca săptămâna trecută, vom lucra în CS50 Spatii,
în cazul în care veți trage, de asemenea, că, până la fel de bine,
și dacă te duci mai departe și să vizitați această legătură pe care am aici, la partea de sus.
E timpul pentru a începe.
Avem programul nostru hi mica aici. Nebun nimic.
Unul dintre primele lucruri pe care vreau să le fac cu voi azi e trece peste cateva solutii
Set de la Problema 1, un fel de soluții de exemplu,
doar astfel încât să puteți obține o simt pentru ce tipuri de personal codul este scris,
ce fel de elevi alt cod se scrie,
și au să luați o privire la ea, pentru că știu că e ciudat
Atunci când depune o soluție pentru un set de probleme și de a lua comentarii
pe propria voastră versiune, dar uneori este util pentru a vedea cum alte persoane a făcut-o,
mai ales cele care sunt drăguț.
Pentru cea mai mare parte, am fost foarte impresionat cu soluții care voi produse.
Nu am început încă se uită la 2s dvs. set de probleme, dar dacă ei sunt ceva de genul în primul rând,
înseamnă nimic, dar lucruri bune.
>> Dacă te uiți la revizuirile mele, să începem tot drumul în jos, la Revizia 1,
și am de gând să ia o privire rapidă la o soluție de Mario.
Dacă ați trage asta, aceste programe pe care le vom prezenta sunt corecte.
Nu au fost probleme de corectitudine cu aceste probleme, ci, mai degrabă,
vrem să vorbim un pic despre diferitele probleme de proiectare
care au fost utilizate aici.
Unul dintre lucrurile care a fost interesante despre soluția
este că a utilizat această construcție nouă, numită lire defini,
uneori mentionat ca un hash definesc.
Lasă-mă să zoom in pe ea aici.
Un # define vă permite să dau nume acestor numere în programul tău.
În acest caz, înălțimea maximă a unei piramide în Mario
23 și a fost, mai degrabă decât a pune 23 în codul meu,
ne-ar referi la faptul că la fel de greu de codificare 23 -
în schimb acest lucru dă numele MAX_HEIGHT la acel număr,
astfel că aici, în meu do-while
vă puteți referi de fapt la MAX_HEIGHT
în loc de a pune numărul 23 inch
[Student] Care este avantajul de a face asta?
Asta este o întrebare mare.
Una dintre ele este lizibilitate.
Un avantaj de a folosi acest # define este de lizibilitate.
Când am citit acest cod, eu pot vedea ce se întâmplă.
>> Eu pot vedea în această condiție aici că testăm
pentru înălțimea fiind <0, ceea ce am fi putut, de asemenea, definite
să fie o înălțime minimă sau o înălțime min.
Un alt avantaj este că eu pot citi apoi restul liniei pentru a vedea
că suntem, de asemenea, de verificare pentru a vă asigura că înălțimea nu este mai mare decât înălțimea maximă,
pentru că am de gând să continue în timp ce înălțimea este mai mare decât înălțimea max.
Un alt avantaj este dacă-mi micșora un pic aici,
dacă am rula acest program și l-am alerga, să zicem, cu 23 chiar acum,
se va tipări toate cele 23 de rânduri la fel ca asta.
Dar spun că am vrut să schimbe înălțimea maximă,
si acum vreau să limiteze înălțimea maximă de piramide
să fie doar spune-om, care a fost înfricoșat.
# Include , # define MAX_HEIGHT,
și să spunem că am vrut să-l setați egal cu 10.
Acum, în acest moment, tot ce am avut de făcut a fost să îl modificați în această locație unul.
Pot să recompilați codul, și acum, dacă am încerca și introduceți în 12,
se va cere-mi din nou.
În acest caz, suntem folosind doar MAX_HEIGHT dată.
Nu e atât de mare de un hassle pentru a merge în
și-l schimbați, în timp ce bucla, dacă aveți nevoie să.
Dar, în cazul în care programele de ce te fac referire numarul magic același
de peste si peste, din nou, acest mecanism # define este foarte la îndemână,
pentru că vă schimbați doar o singură dată, la partea de sus a fișierului-este de obicei în cazul în care le-a pus-
și schimbarea pătrunde prin restul fișierului.
>> Alte lucruri am vrut să rețineți că în această misiune m-am gândit uitat foarte frumos,
unul a fost numirea a variabilelor.
Veți vedea aici că avem variabilele intregi numite de rând și zisul înălțime.
Spatii, hashes, aceasta ajută codul un pic mai ușor de citit,
face un pic mai ușor de înțeles ce se întâmplă de fapt pe.
Acest lucru este în contrast cu utilizarea, de exemplu, litere aleatorii
sau doar limbaj pretențios cu totul.
Un ultim lucru pe voi subliniez este faptul că în bucle pentru,
de multe ori aceste variabile iterator, aceste contoare pe care le utilizați în ta pentru bucle,
e standard și convențional să le înceapă fie cu i si j, apoi și apoi k
și merge mai departe de acolo, dacă aveți nevoie de mai multe variabile,
și aceasta este doar o convenție.
Există o mulțime de convenții.
Aceasta depinde de limbajul de programare pe care îl utilizați.
Dar în C, am de obicei, începe cu i.
Ea nu are sens să folosească, să zicem, a sau b
în funcție de situație.
Asta e. pentru asta.
Dacă ați trage acum la Revizia 2, veți vedea un alt Mario,
iar aceasta este similară cu cea de altă natură care tocmai l-am văzut,
dar nu ceva de genul mișto.
Dacă ne uităm la această secțiune chiar aici în interiorul interior pentru bucla,
ei folosesc unele sintaxă nebun cautati aici, chiar în această linie.
Aceasta se numește un operator ternar.
Este o declarație, dacă altcineva condensate într-o singură linie.
Condiția este această parte în paranteze.
E echivalent cu a spune dacă j <înălțimea - i - 1.
Și apoi ce conținutul pe care, dacă ar fi blocul sunt spațiul
și apoi conținutul a ceea ce altceva ar fi aceasta sunt #.
Este atribuirea în esență, un spațiu pentru această variabilă.
A pune un spațiu în conținutul variabilei bloc,
în cazul în care această condiție este îndeplinită, iar în cazul în care condiția nu este îndeplinită,
apoi variabila bloc se prezenta #.
Și apoi, desigur, în loc de a construi un șir întreg
și tipărirea totul de la sfârșitul acestei soluții se imprimă un caracter la un moment dat.
Destul de rece.
>> Un alt tânăr de lucruri să se uite la. Vom trece la lacomi.
Acum, dacă ne uităm la lacomi, această primă soluție
utilizează aceste definește # destul de un pic.
Avem o constantă definită pentru fiecare dintre numerele diferite în acest program.
Ne-am luat unul de centi pe dolar, unul pentru trimestre, parale, monezi, și penny,
și acum, dacă ne defilați în jos și a citit codul,
putem vedea un standard de do-in timp ce totul imprimarea bucla afară.
Un fel de esența acestei probleme a fost și dea seama că
ai nevoie pentru a converti float pe care ai citit de la utilizator la un număr întreg
de a face cu precizie matematica, iar acest lucru se datorează faptului că
cu numere în virgulă mobilă, ca și cum am vorbit despre în curs scurt,
nu este posibil să reprezinte cu acuratețe fiecare valoare unică pe linia de numărul de
pentru că există infinit de multe valori cuprinse între 3 și, să zicem, 3,1 chiar.
Puteți avea 3.01 și 3.001 și 3.0001, și puteți să vă păstrați merge.
Se pare că de fiecare dată când lucrați cu bani, de multe ori doriți să-l convertească
în format întreg, astfel încât să nu pierzi mărunțiș și că astfel de lucruri.
Fac asta și rotunjire a fost cheia.
Această soluție a folosit un perfect simplu, algoritmul mare,
care decrementat numărul de cenți rămase, în primul rând pe trimestre,
apoi de Dimes, apoi de monezi, apoi de bănuți,
și adăugarea la numărul de monede de fiecare dată.
>> O altă soluție pe care o vom vedea, după cum am depărta și du-te la Revizia 4,
a avut un început foarte similare, dar în schimb div utilizate și Mod
dreapta peste aici pentru a calcula numărul de cenți.
Acest lucru, numărul de trimestre este egal cu numărul de centi împărțit la 25,
și motivul pentru care acest lucrări este că noi facem diviziunea întreg,
deci e îndepărtând orice rest.
[Student] Nu avem de a comenta căutare?
Este într-adevăr depinde.
[Student] Te comentând mai mult decât codul aici.
Da, și astfel există o grămadă de diferite filosofii în acest sens.
Filozofia mea personală este că codul dvs. este într-adevăr adevărul,
cum ar fi codul tău este ceea ce de fapt de executare pe calculator,
și așa mai departe codul dumneavoastră ar trebui să fie cât mai lizibil pe cât posibil să nu necesite cât mai multe comentarii.
Asta a spus, atunci când faci lucruri care sunt un fel de complicat matematic
sau algoritmic, e bine să comenteze cele, astfel încât să puteți
adăuga o dimensiune suplimentară, un strat suplimentar pentru oricine citește codul.
În aceste soluții, de multe ori acestea sunt comentate mai mult doar pentru că
dorim să fie în măsură să le distribuie și să aibă oameni le ridice
și citiți-le destul de ușor.
Dar cu siguranta, aș fi de acord că acest lucru este greu.
[Student] Dar atunci când în dubiu, du-te mai greu?
Cand ai dubii, du-te mai greu.
Unii oameni vor spune, uneori, 0 retur sau ceva de genul asta.
Cred că e un comentariu ridicol.
În mod clar că e ceea ce se întâmplă.
Nu am nevoie de limba engleză să-mi spui asta.
Uneori, oamenii vor scrie lucruri de genul "kthxbai!"
Asta e un fel de dragut, dar de asemenea, nu-
care nu face diferenta dintre punctele de comentare sau nu.
Aceste tipuri de comentariile sunt doar ha, ha.
Mișto.
>> În acest moment, să înceapă lucrul la problema Set 3, secțiunea de întrebări.
Dacă voi trage asta din nou,
Ca și în săptămâna trecută, nu am de gând să ma uit la pantaloni scurți din această secțiune.
Vom lăsa voi face asta în timpul tău propriu și vorbesc despre întrebările.
Dar acum, în această secțiune vom petrece un pic de timp mai mult
vorbesc despre mai putin de bază de codificare
așa cum am făcut-o săptămâna trecută, și în loc, ne vom concentra mai mult pe
un pic mai mult de teorie, deci vorbim despre binar de căutare și sortare, apoi.
De la cei dintre voi care au fost în urma impreuna cu prelegerea,
poate cineva da-mi o recapitulare a ceea ce este diferența
între binar de căutare și de căutare liniară?
Ce se întâmplă? Sigur.
Cautari liniare de căutare, prin fiecare element în lista sortată
unul câte unul câte unul câte unul câte unul,
și căutare binară imparte lista în 2 grupe,
verifică dacă valoarea tastele pe care le căutați este mai mare sau mai mică decât valoarea punctul de mijloc
pe care tocmai l-ați găsit, și, dacă e mai mică, se merge cu lista de mai jos
si apoi imparte din nou, nu aceeași funcție
tot drumul în jos până când se găsește punctul de mijloc să fie egală cu valoarea în sine.
Corect.
>> De ce ne pasă?
De ce vorbim despre binar de căutare liniară față de cautare?
Da.
Binar este mult mai rapid, astfel încât, dacă dubla dimensiunea problemei
este nevoie de un pas mai degrabă decât de două ori cât mai multe.
Exact.
Asta e un răspuns minunat.
Căutarea liniară este foarte mult un element de verificare la un moment dat,
și așa cum am văzut în prima zi de curs
atunci când David a trecut prin exemplul său cartea de telefon
și smuls o pagină din cartea de telefon, la un moment dat
și se păstrează face asta de peste si peste si peste, din nou,
o să ia un timp foarte lung pentru a găsi pe nimeni în cartea de telefon,
cu excepția cazului, desigur, el a fost caută pe cineva de la începutul alfabetului.
Cu binar de căutare, puteți merge mult mai repede,
și nu este vorba doar de două ori la fel de repede sau de 3 ori mai repede sau de 4 ori mai repede.
Dar problema devine mai mici și mai mici și mai mici mult mai rapid.
Pentru a ilustra acest lucru, vom începe să vorbim despre ceea ce se întâmplă
atunci când scriem căutare binară.
Problema la îndemână este că dacă am o serie de numere,
spun, 1, 2, 3, 5, 7, 23, 45, 78, 12323,
și apoi 9, cu o tona de 0s după ce,
dorim să fie în măsură să dau seama foarte repede ceea ce este în
această matrice de numere.
Știu că pare o prostie putin si un pic contrived,
deoarece acum este.
Avem o matrice care nu are foarte multe elemente în ea,
și dacă te întreb unul dintre voi să dau seama dacă este sau nu
23 este în matrice, puteți face acest lucru destul de repede
doar prin uite la asta și-mi spune da sau nu.
Analogic să ia în considerare este dacă acest lucru ar imagina, spune,
o foaie de calcul Excel cu 10.000 de rânduri, 20.000 rânduri.
Desigur, puteți face comandă F sau F de control și să caute ceva.
Puteți utiliza, de asemenea, filtrele si alte chestii de căutare,
dar dacă ar trebui să se uite prin faptul că linia de fișiere prin linie cu linie,
ar fi nevoie de o lungă perioadă de timp să-l găsiți.
E un fel de ca în exemplul cartea de telefon, de asemenea, în cazul în care
nimeni nu se uită printr-o pagină un telefon carte la un moment dat.
De obicei, acestea nu se deschid la mijloc,
sau, în cazul unui lot de cărți de telefon și dicționare în cazul în care
tu de fapt l-au tulburat pe prima scrisoare,
vă sări la această scrisoare prima și a deschide și începe să mergi pe acolo.
>> Amintește-mi de numele tău din nou. >> Sam.
Sam.
Ca și Sam a spus, că procesul de căutare liniară va fi foarte lent,
și, în schimb, cu binar de căutare, modul în care aceasta este faptul că lucrările
de fiecare data cand trec printr-o repetare a algoritmului nostru căutare,
am de gând să împartă lista în jumătate, în esență,
în două liste mai mici.
Și apoi pe urmatoarea iteratie a buclei, ne vom împărți din nou
în alte liste mai mici.
După cum puteți vedea, problema ce în ce mai mici și mai mici
fiindcă păzim jumătate aruncarea peste bord a listei de fiecare dată singur.
Cum face acest lucru debarasa?
La fel ca un memento, ceea ce am de gând să fac dacă am fost un computer
și am fost, să zicem, căutând numărul 5 în această listă
este că ne-ar alege un număr în mijloc.
În mijlocul acestei liste, pentru că sunt 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 numere,
am alege numărul fie la locul 4 sau de la locul 5,
și ne-ar numi că mijlocul listei noastre.
Alege număr în mijloc.
Apoi, la fel ca Sam a spus, vom testa pentru a vedea dacă acest număr este egal cu
la numărul de pe care ne-o dorim pentru a obține sau numărul dorit.
Dacă e egal, atunci l-am găsit. Vom câștiga.
În cazul în care nu este egal, atunci există o serie de cazuri.
Cele două cazuri sunt fie numărul trebuie să fie mai mare decât numărul căutăm la,
sau e mai mică.
Dacă e mai mare, vom trece la dreapta.
Și dacă e mai puțin, vom trece la stânga.
Și apoi vom repeta întregul proces din nou
fie pe jumătatea din dreapta sau jumătatea din stânga a listei.
>> Prima problemă în secțiunea de astăzi este să dau seama
cum putem începe de fapt, pentru a exprima acest lucru în cod C.
Avem pseudocod aici.
Ceea ce vom începe să facem este ca eu voi trage un spațiu nou-nouț,
salva această revizuire, astfel încât să avem aceste note pentru mai târziu,
vom șterge toate astea, și apoi copiați și lipiți de la set de probleme
aceste informații în spațiile noastre, și sperăm că acest lucru nu rupe.
Eveniment.
Dacă voi toți fac asta, copiați și inserați acest cod în spațiu nou,
într-unul gol.
Să încercăm Daniel. Dacă doriți să compilați și executați acest program, nu funcționează?
Nu >> Ce spune?
Se spune de control ajunge la sfârșitul non-nule funcție.
Da, asa ca lasa-ma sa incerc rulează-l.
Ați văzut voi asta înainte? Știi ce înseamnă asta?
Bine, hai să disecăm acest bit un pic.
Se spune la file.c pe linia 9, coloana 1 avem o eroare, la fel cum ai spus,
și se spune că este rezultă din avertisment eroare și de avertizare de tip întoarcere.
Se pare ca ceva se intampla cu tipul de retur, ceea ce face sens.
Avem o functie non-nule, ceea ce înseamnă că avem o funcție
faptul că nu se întoarce nule.
O funcție vid este unul care arata ca acest lucru:
void foo (), si este nulă, deoarece tipul de retur este nulă,
ceea ce înseamnă că, dacă am avut ceva aici
cum ar fi întoarcere 1, am obține o eroare de compilator pentru acest lucru.
Cu toate acestea, avem o funcție non-nule.
Nostru non-nule funcție în acest caz este funcția noastră de căutare
deoarece are un tip de întoarcere bool.
Când se spune că de control ajunge la sfârșitul unei funcții non-nule,
e pentru că căutare nu are o declarație de revenire.
Nu e nimic returnarea de tip bool.
>> Putem rezolva asta, si ce voi cred că
căutare ar trebui să se întoarcă în mod implicit?
Care ar trebui să fie returnarea valoarea implicită de căutare?
Pentru că asta e ceea ce putem pune la capăt.
Charlotte, aveți vreo-?
Adevărat sau fals >> Adevărat sau fals?.
Care?
Fals. Nu știu.
Fals? Hai să încercăm.
De ce spui retur fals? Asta e mare intuiție.
[Charlotte] Nu stiu.
Vom reveni fals, în acest caz, deoarece aceasta va fi implicit noastră
în cazul în care pentru un motiv oarecare lista este goală sau acul
pe care-l căutăm nu există.
Apoi, la sfârșitul foarte, dacă nu vom reveni adevărat mai devreme în această funcție,
întotdeauna am știu că această funcție va spune nope, nu e în matrice.
Nu e în carul cu fân.
Acum, dacă am compila și rulați-l lasă-mă să-salveze astfel încât să putem trage în sus.
Acum, dacă am compila și rula programul nostru, el construiește.
Vom ajunge prompt de mica noastră.
Dacă am lovit 4-uh-oh.
Nu a imprima nimic. Se pare ca totul sa terminat bine.
Ne-am luat pentru a umple această inch
Am vorbit despre algoritmul într-pseudocod un pic în urmă.
Lasă-mă să văd, salvați acest lucru,
și voi trage ca algoritmul înapoi din nou.
Să lovit pe tipul ăsta. Nope.
Acolo este.
Cum facem acest lucru?
Ceea ce ar fi o strategie bună pentru a demara acest cod?
Trebuie sa alegi un număr în mijloc.
Cum alegem un număr în mijlocul unei matrice?
Orice sugestii?
[Student] strlen împărțit la 2.
Strlen împărțit la 2. Asta e un mare unul.
Strlen lucrări cu tipuri speciale de matrice.
Ce tipuri de matrice?
Tablouri șir de caractere, matrice.
E ca acelasi tip de concept pe care dorim să se aplice,
dar nu putem folosi strlen pentru că nu avem o serie de caractere.
Avem o serie de Ints.
Dar ceea ce nu strlen obține pentru noi?
Știi ce devine pentru noi?
[Student] strlen ne devine lungime.
Exact, acesta devine ne-lungime.
Strlen devine lungimea de matrice pentru noi.
>> Cum ajungem ca in programul nostru de cautare binara?
Cum ti-ar obține lungimea unui tablou?
[Student] strlen?
Puteți obține lungimea unui tablou corect formatat șir C cu strlen.
Problema, însă, este că nu avem o matrice șir.
Dacă ne uităm înapoi la acest cod, putem avea această matrice întreg.
Cum știm cât timp mai este?
[Student] Există unul echivalent pentru efect, cum ar fi int sau am ceva?
Se pare că de fapt nu este, și așa într-un fel, acest lucru este
unul din acele lucruri pe care e bine să știți doar despre C,
că nu există nici o modalitate de a obține lungimea unui array
daca tot te-am da este matrice.
Motivul pentru care funcționează cu siruri de caractere, motiv strlen lucrări,
se datorează faptului că în cazul în care un șir este corect formatat,
aceasta va avea ca special \ 0 caracterul de la sfârșitul foarte.
>> Vă puteți imagina, de asemenea, în cazul în care aveți un șir formatat necorespunzător
și nu există nici \ 0 caracter acolo, atunci totul nu funcționează.
[Student] Poți adăuga \ 0?
Am putea, în acest caz.
Am putea adăuga un fel de \ 0
sau un fel de semnificare caracter și apoi folosi asta.
Dar asta nu e destul de gând să lucreze
deoarece 0 \ este pentru un tip char,
și aici avem Ints.
Un alt lucru este, dacă ar fi să utilizați o valoare deosebită
ca -1 pentru a marca sfârșitul unei matrice
atunci nu am putea stoca un -1 în matrice noastre intregi.
Ne-ar fi blocat.
Se pare că singura modalitate de a obține lungimea
a unei matrice în C este să ne amintim de fapt
atunci când îl configurați și apoi să-l dați în jurul valorii de cu matrice
astfel încât ori de câte ori am o funcție care este de gând să facă ceva de lucru
privind o serie de numere intregi sau flotoare sau dublu sau ce ai,
Am, de asemenea, nevoie de a da lungimea funcția de matrice, a
și că este exact ceea ce am făcut aici, în funcția de căutare.
Dacă vă uitați, ce am făcut atunci când vom trece în gama noastră aici,
am trece, de asemenea, în lungime, dimensiune.
Se întâmplă că am chemat această variabilă aici,
acest parametru sau argument.
Aceasta se numește listă o funcție de argument sau lista de parametri,
și acestea sunt, de asemenea, numite argumente sau parametri.
Oamenii folosesc termeni diferiți în momente diferite.
Am schimbați uneori chiar eu.
Pur și simplu așa se întâmplă că această variabilă aici este numit în mod similar
în acest # define aici.
Dar ei nu sunt același lucru.
Capitalizarea contează.
>> Dacă te uiți la ceea ce se intampla aici, ne declarăm
noastră matrice int, pe care le-am numit numere.
Am dat dimensiunea noastră, care corespunde nostru # define sus la partea de sus.
O să fie 8.
Și apoi, când ne numim atunci funcția nostru de cautare jos,
vom trece în numărul vrem să caute, pe care le-am determinat,
ajuns de la utilizator.
Trecem în matrice, aceste cifre,
și apoi ne, de asemenea, trebuie să treacă în dimensiunea matrice,
și apoi valoarea de dimensiune 8 este stocat
sau au trecut la această dimensiune variabila integer sunat.
Avem dimensiunea matrice.
Acum, dacă ne întoarcem la ceea ce am discutat mai devreme,
Cred că Missy adus în punctul în care ceea ce avem nevoie să faceți este să obțineți lungimea de matrice
și-l împartă cu 2, și că ne va da mijloc.
Să vedem.
Pot avea pe cineva scrie acest lucru și salvați-l în spațiul lor?
Cum despre Leila?
Pot avea scrii asta în?
Scrieți prima linie în cazul în care vă luați lungimea de matrice și de a lua punctul de mijloc
și se păstrează într-o nouă variabilă.
Îți dau câteva secunde. Ești gata?
[Student fără sunet]
Sigur, aș fi putut să vă calcula punctul de mijloc
din carul cu fân matrice în interiorul funcția de căutare
folosind lungimea matrice carul cu fân, care este variabila dimensiunea?
Nimic complicat aici.
[Leila] Tocmai dimensiunea / 2 și doar-
Și salvați-l, și a lovit pe butonul Salvați până aici, la partea de sus,
iar noi vom trage în sus.
Eveniment.
Acolo mergem. Minunat.
>> Așa cum este, aceasta va compila?
[Leila] Nu, aceasta trebuie să fie mai mare.
[Nate] Da, deci ce avem nevoie să facem?
[Leila] Ca mijloc int sau ceva de genul.
Minunat. Da, hai să facem asta, int mijloc = dimensiune.
Aceasta va compila?
Să ștergeți acest comentariu si sa-l afară din drum.
Ceea ce nu se va compila despre asta?
Nu facem nimic cu întreg,
așa că trebuie să-l imprimați sau ceva de genul asta.
Da, exact.
Vom obține o variabilă neutilizat.
Ce altceva nu este de gând să lucreze cu privire la acest lucru?
Cred că ai spus ceva, Sam. Punct și virgulă.
Da, eu sunt lipsesc aceste semne punct și virgulă.
O să fie un lucru constantă pe tot parcursul cursul termenului.
Ultimul lucru voi face este ca eu voi pune niște spațiu alb pe ambele părți
de acest operator aici, din moment ce e de obicei cum facem
în conformitate cu ghidul nostru stil.
Avem mijlocul gama noastră.
Acum, dacă ne amintim înapoi la algoritmul nostru,
ceea ce a fost al doilea pas pe care am avut de a face, odată ce vom avea punctul de mijloc?
[Student] Dacă e mai mare [neauzit].
Da, așa că trebuie să facem un fel de comparație, și ceea ce ne compararea aici?
Ai spus că dacă acesta este mai mare decât. Ce este în această frază se referă la?
Numărul care apare, în cazul în care este mai mare decât punctul de mijloc, atunci du-te până la matrice?
Exact, deci numărul care apare atunci când ne-
Acul, așa că suntem în comparație cu acul,
și ceea ce ne compararea împotriva acul?
Deoarece acul este ceea ce căutăm.
Noi îl față pentru a ajunge la punctul de mijloc.
>> Dar are sens să verificați pentru a vedea
în cazul în care acul punctul de mijloc =?
Are vreun sens?
Are cineva de acord?
Hai să încercăm, în cazul în care (acul mijlocul ==).
[Student] Nu printf l-ai găsit.
[Nate] printf ("Am gasit \ n");
În caz contrar-Mă duc să începem să facem ceva diferit aici.
Am de gând să înceapă punerea în jurul valorii de bretele, dacă situațiile tot timpul
doar pentru că dacă am adăuga mai multe lucruri, atunci
noi nu obține compilatoare.
Da, Sam. Ai un punct.
Problema este că mijlocul reprezintă o poziție în matrice,
dar puteți să-l reprezinte la valoarea în acea poziție de matrice.
Asta e un punct de mare.
Ai auzit ce toată lumea a spus Sam?
El a spus că punctul de mijloc așa cum este
reprezintă doar o poziție în matrice, dar nu e elementul real în matrice.
Dacă te gândești la codul asa cum este scris chiar acum,
dacă ne uităm la această matrice aici jos, care are 8 elemente în ea,
ceea ce este valoarea punctului de mijloc va fi în această funcție?
[Student] 4.
[Nate] 4.
Dacă ne uităm pentru numărul 4 -
și putem rula doar acest cod si pune o fata cam trist aici
pentru că nu am găsit-l, dacă vom rula acest cod
cum este acum, îl încărcați, cladire, permiteți-mi să defilați în jos,
și dacă ne uităm pentru numarul 4,
l-am găsit, dar nu am primit asta printf da.
Unul dintre motive este faptul că nu ne-am întoarce adevărat,
dar am găsit într-adevăr numărul 4?
Si Sam se spune nu.
Ce am găsit?
Am găsit cu adevărat punctul de mijloc, care, dacă ne uităm la matrice aici,
o să fie element la indicele 4, că ne uitam la,
care este de 23.
>> Cum ajungem de fapt, acest element la punctul de mijloc
și nu doar punctul de mijloc în sine?
[Student] Ne-ar intra char sau ceva?
Ce-ar face asta, doar din curiozitate?
Poți să elaboreze un pic mai mult?
Trebuie să transforme poziția în numărul,
deci ai de a face o legătură-Cred că e char, dar nu s-ar putea să fie.
Da, asta e un punct bun.
Am făcut o mulțime de funcții de conversie a acestor caractere, în aceste caractere,
în primele două seturi problemă.
Se pare că aici, acest lucru este aproape similar cu
accesarea caracterul lea într-un șir, în cazul în care are sens.
Aici dorim să acceseze elementul mijloc.
Cum facem asta?
Kevin, nu aveți sugestii cum putem să facem asta?
Ai putea face carul cu fân, suport deschis, la mijlocul, închis suport.
Poți să scrii asta pentru noi?
Salvați-l aici, și vom trage asta.
Ne uită la acest linia 9,
și suntem realizând că nu vrem să compare acul la mijloc,
dar în schimb, vrem să comparăm acul
la element la punctul de mijloc poziția în termen de matrice carul cu fân nostru.
Mișto.
Acolo mergem.
Da, care arata destul de bine, în cazul în care (acul == carul cu fân [mijloc]).
Am găsit-o.
Acum, dacă vom rula codul de spate, noi vom ridica un pic,
compileaza, ruleaza, iar acum, dacă ne uităm pentru 4,
nu l-am găsit pentru că acum suntem obtinerea de fapt, numărul 23.
Primim valoarea 23, și asta e ceea ce suntem în comparație cu acul nostru.
Dar asta e bine. Acesta este un pas în direcția cea bună.
>> Asta e ceea ce încercăm să facem.
Noi nu încercăm să compare acul împotriva pozițiilor din matrice
ci mai degrabă împotriva elementelor reale din matrice.
Dacă ne uităm înapoi din nou acum la urmatorul pas in algoritmul nostru,
ceea ce este pasul următor?
Leila deja menționat pe scurt.
[Student] Verificați pentru a vedea dacă este mai mare sau mai mică și apoi să decidă ce cale să se mute.
[Nate] Da, asa cum ne-ar face asta?
Vă poate pune în unele Voi salva această revizuire,,
și apoi, dacă ai pus în anumite linii, care va face asta.
Da, Charlotte >> am o întrebare..
Nu ar trebui să fie punctul de mijloc - 1, deoarece primul lucru este
e 0 indexat, deci, dacă am pus 4, care nu e de fapt personajul ne ce cautati?
Da, și altă problemă cu care se-
E o captură mare, pentru că ceea ce se va termina până se intampla, eventual,
dacă ne mișcăm și noi nu reglați niciodată inițial?
Cred că ceea ce am putea ajunge să faci încearcă să acceseze
element la poziția a 8-a matrice,
care în acest caz nu există.
Vom dori să facă un fel de contabilitate pentru faptul
pe care le au unele indexare zero.
[Charlotte] Ne pare rău, am vrut să spun punctul de mijloc - 1 în paranteze pătrate.
Putem face asta.
Vom reveni la această problemă în doar un pic.
Odată ce vom începe să ajungem la looping reale,
atunci vom vedea cu adevărat această intra in joc.
Pentru moment, putem face asta, dar ai dreptate.
Că indexarea zero, va avea un efect de care avem nevoie pentru a explica.
Să vedem.
>> Cum este mai mare decât și mai puțin de-?
[Student] ajung cum se face mai mare decât și mai puțin de o parte.
Eu doar nu era sigur ce să imprimați, dacă veți găsi că aceasta este mai mică decât jumătatea carul cu fân sau mai mare.
Aici pot salva ceea ce I've-
[Nate] Da, dacă salvați ceea ce ai, iar noi vom trage în sus.
Acolo mergem.
[Student] Și mi-am pus semne de întrebare pentru ceea ce nu știam.
[Nate] care arata foarte bine.
Aici avem semne de întrebare pentru că noi încă nu știm
ceea ce am de gând să faci destul de încă.
Ceea ce am vrea să facem-Oops, ne-am luat niște bretele toți ciudate pe noi.
Vom corecta aceste acolade.
Acolo mergem.
Și deci ce vrem să facem, în conformitate cu algoritmul nostru,
dacă nu găsim acul?
Cuvânt de spus în cazul în care acul este mai mică decât ceea ce ne uita la. Kevin.
Doar uita-te la jumătatea stângă.
Corect, așa că vom pune un comentariu aici care spune că "uită-te la jumătatea stângă."
Și dacă acul este mai mare decât carul cu fân de la punctul de mijloc, ceea ce vrem sa facem?
[Student] Apoi te uiti la jumătatea din dreapta.
Uită-te la jumătatea dreaptă, "uită-te la jumătatea din dreapta."
Nu prea ponosit.
Ok, deci, în acest moment, lucrurile sunt în căutarea destul de bine.
Problema cu codul asa cum este scris este ceea ce?
[Student] Tu nu ai obiective pentru jumatati.
Corect, nu avem obiective pentru jumatati.
Suntem, de asemenea, sunt doar de gând să treacă prin această dată.
Suntem doar de gând să se uite la un mijloc.
Fie elementul este acolo, sau nu este.
Pentru a finaliza acest lucru, vom avea nevoie pentru a face un fel de repetiție.
Avem nevoie de a păstra repeta până când vom găsi că
fie element este acolo pentru că ne-am redus în jos și în cele din urmă găsit-o,
sau nu e acolo pentru că ne-am uitat prin toate lucrurile
în jumatati corespunzătoare din matrice și a constatat că nimic nu este acolo.
>> Ori de câte ori ne-am luat acest repetiție se întâmplă, ceea ce vom folosi?
[Student] O bucla.
Un fel de buclă. Da.
[Student] Putem face o bucla do-timp și să-l faci asta și apoi în timp ce
acul nu este egal-Sunt sigur unde am fost de gând cu asta.
Dar, un fel de face acest lucru, atâta timp cât aceasta nu este egal valoare pe care introduse de utilizator.
Da, așa că hai să vedem, cum s-ar putea scrie acest sine?
Ai spus că vom folosi o bucla do-timp.
În cazul în care nu face de start?
[Student] Imediat după mărimea / 2.
[Nate] Ok, și ce-o să facem?
Vom umple în timp ce mai târziu.
Ce am de gând să faci?
[Student] Nu vrem să facem toate lucrurile avem în porțiunea în cazul în care?
[Nate] Fa toate astea, grozav.
Copy si paste.
Oh, omule.
Să vedem dacă funcționează, dacă putem fila peste asta.
Frumos.
Bine, și am salva acest lucru voi avea.
În regulă, și vom face acest lucru în timp ce-
ceea ce a fost starea în timp ce ai fost, după?
[Student] În timp ce acul nu este egal, așa cum ar fi semn de exclamare.
Dar eu nu sunt sigur că exact ceea ce este încă.
[Nate] Da, aceasta este o modalitate de a face acest lucru.
Sam, ai un comentariu?
[Sam] Mi-am amintit atunci când m-am uitat la video,
Mi-am luat o captură de ecran a unuia dintre-ca atunci cand am facut pseudocod pentru ea,
a existat o relație între max și min.
Cred că a fost ceva de genul daca max este niciodată mai mică de min.
Am prins-o.
[Sam] Sau, în cazul în care dorești maxim nu este mai mică de minute sau ceva de genul asta,
pentru că asta ar însemna că ați căutat totul.
>> Da, deci ceea ce nu-l suna ca max și min s-au referit la?
[] Sam valorile pe care-întregi, care vor să se schimbe
relativ la care am pus punctul de mijloc.
Exact.
[Sam] În acel moment, o să [neauzit] calcula max și min.
Punct de mijloc este această idee max și min.
Asta face sens pentru oameni buni?
Dacă ar fi să începi să cauți la modul în care vom face acest lucru iterație,
ai perfecta dreptate pe care ne-o dorim pentru a utiliza un fel de do-while.
Dar cred că dacă ne amintim ceea ce se întâmplă la fața locului a acestei matrice
și ceea ce se intampla de fapt-Mă duc să scrie pe aici-
la prima iterație de căutare binară, avem,
Am de gând să folosească b și e pentru a indica începutul.
Și apoi sfârșitul gama noastră.
Știm că începutul este la 4 chiar aici,
și știm că sfârșitul este la 108.
Spune-ne ce căutați numărul 15.
Prima dată când am face acest lucru, cum am văzut mai devreme,
punctul de mijloc este fie de gând să fie de 16 sau 23
în funcție de modul în care se calculează lucrurile.
Deoarece împărțirea în mod egal în mijlocul ne-ar da acest spațiu
între 16 și 23, nu putem împărți în mod egal l
sau diviza și de a lua de la un punct de mijloc adevărat.
Ne vom uita la 16.
Vom realiza "Hei, 16> 15 că suntem în căutarea pentru."
Să se uite apoi la jumătatea stângă a matrice
ceea ce vom ajunge să faci este aruncând
această porțiune întreg superior
și spunând, "Bine, acum obiectivul nostru va fi aici."
Urmatoarea iteratie a buclei noastre, suntem acum se uită la acest tablou,
efectiv au aruncat această porțiune, deoarece acum
dacă luăm punctul de mijloc pentru a fi diferența dintre începutul și sfârșitul,
vom găsi punctul de mijloc noastră de a fi 8,
pe care le putem testa apoi 8 pentru a vedea unde se află în raport cu numărul căutăm,
15, găsesc că 15 este mai mare,
așa că trebuie să se mute în partea dreaptă a listei,
care știm că suntem oameni, iar noi le putem vedea.
Știm că porțiunea din dreapta va fi în cazul în care vom găsi,
dar calculatorul nu știe că, până ce vom face este de fapt vă vom
au acest du-te în sus, și acum începutul și la sfârșitul
sunt același loc, astfel încât punctul de mijloc devine numărul numai în lista de la acel moment,
care este de 15, și am găsit-o.
Oare faptul că puțină lumină pe care acest ansamblu și notarea max min se întâmplă,
urmărirea de obiective de matrice, în scopul de a da seama
cum pentru a restrânge lucrurile?
>> Ce s-ar întâmpla dacă nu ar fi fost egală cu 15 acum?
Ce se întâmplă dacă am fost în căutarea pentru 15 și, în schimb, acest număr au fost, de asemenea, 16?
Ne-ar spune, "Oh, e mai mare.
Vrem să ne întoarcem la stânga. "
Și ne-am muta la adresa noastra de e dreapta,
moment în care avem un obiectiv care ar fi în conflict.
Aceasta nu ar fi în măsură pentru a căuta orice elemente de mai multe
pentru că acum avem obiectiv noastră și punctul nostru de inceput,
max și min noastră noastră, sunt acum răsturnat.
Am căuta prin întregul tablou. Nu putem găsi nimic.
Asta e punctul în care am vrut să spun, "Bine, vom opri acest algoritm.
Nu am găsit nimic. Noi știm că nu e aici. "
Cum este acest gând?
[Student] Cum anume calculatorul comuta final?
Cum se ajunge la sfârșitul înainte de începutul?
De terminare se termină înainte de începerea
din cauza matematica pe care am de gând să faci de fiecare dată când facem asta.
Modul în care ne schimba este daca te uiti la prima dată facem acest swap
în cazul în care avem început la 4 și la sfârșitul
tot drumul în jos, la 108 și punctul de mijloc noastră, să zicem, la 16 -
Am de gând să resetați asta înapoi la 15-în cazul în care suntem în căutarea de 15,
am știut că ceea ce am făcut atunci când am verificat 16 și a văzut că era mai mare
și a vrut să se debaraseze partea dreaptă a întregii liste,
am văzut că ceea ce am vrut sa faci este sa treci acest e chiar aici.
Efectiv, e sa mutat la unul înainte de punctul de mijloc.
De asemenea, atunci când am făcut această repetare a algoritmului
și punctul de mijloc a fost la 8,
am constatat că 8 <15, asa ca am vrut sa se mute b
un trecut mijloc.
Acum, începutul și sfârșitul sunt atât împreună la acest 15.
>> Dacă am fi fost întâmplă pentru a cauta o alta valoare, nu, 15,
sau în cazul în care aceasta ar fi în locul 15 a fost de 16,
ne-ar fi constatat că e vrem să mutați unul înainte de punctul de mijloc.
Acum e acolo ar fi oglindită mai mică de b.
Să se plimbe prin modul în care vom ajunge de fapt la acest algoritm de codare.
Știm că vrem să avem acest calcul mijlocul.
Știm, de asemenea, că vrem să urmăriți începutul și sfârșitul matrice
din gama noastră curentă astfel încât ne putem da seama
în cazul în care această jumătate din stânga a listei este și în cazul în care jumătatea din dreapta a listei este.
Noi facem asta, fie cu încep și se sfârșesc,
sau putem numi min și max.
Voi folosi încep și se termină de data asta.
Când vom începe, dacă ne uităm înapoi la exemplul nostru aici,
începutul nostru a fost stabilit la începutul matrice, la fel de natural.
Ceea ce indicele a fost asta? Ce ar trebui să înceapă noastră să fie?
Daniel.
[Daniel] Haystack [0].
[Nate] Da, asa ca am putea stabili egală cu carul cu fân [0].
Problema, însă, este faptul că acest lucru dă nu ne poziția primului element.
Ea ne dă indicele primului element sau valoarea reală de la acea prima poziție.
[Student] Asta va converti la 0.20?
[Nate] Ce este acest lucru va face este bine-, acesta nu va face nici o conversie.
Ce va face este că va păstra un 4 în incepe,
și apoi va fi greu pentru a face comparații față de a începe
deoarece Begin va organiza valoarea de 4,
care este începutul gama noastră,
dar vrem să urmăriți indicii în matrice
spre deosebire de valorile.
Vom folosi de fapt un 0, la fel ca asta.
Pentru sfârșitul matrice-Charlotte a adus asta un pic mai devreme.
Acest lucru este în cazul în care vom lua în considerare indexarea zero.
>> Charlotte, care e sfârșitul matrice?
Care este indicele de la sfârșitul?
[Charlotte] Dimensiuni - 1.
Da, și pe care ar trebui să le folosim dimensiunea?
Ar trebui să ne folosim mărimea capitalului sau dimensiunea mici?
Capitalul dimensiune.
În acest caz, am putea folosi dimensiunea de capital.
Dacă am vrut ca aceasta functie sa fie portabil
și de a folosi această funcție în alte programe,
putem folosi de fapt, dimensiunea litere mici.
E prea bine.
Dar Charlotte este total adevărat că ne dorim să avem dimensiunea - 1.
La acest punct de
[Student] Cum se face că puteți utiliza dimensiunea majuscule?
Cum se face că am putea folosi dimensiunea majuscule?
Se pare că acestea sunt într-adevăr # definește,
sub capota, un text ca găsi și înlocui, în cazul în care are sens.
Atunci când compilați codul, preprocesare faza
a compilator trece prin fișierul,
si se pare ca peste tot pe care le-ați scris dimensiunea de capital,
și-l inlocuieste că textul literalmente, cu un 8, la fel ca asta.
În acest sens, acest lucru este foarte diferit de o variabilă.
Ea nu ocupă spațiu în memorie.
E un simplu truc de înlocuire de text.
În acest caz, vom folosi dimensiune.
De aici ne dorim sa facem un fel de repetiție,
si suntem pe drumul cel bun nostru de do-while.
Vrem să facem ceva până când o condiție nu deține mai,
și așa cum am văzut mai devreme, am văzut că această condiție
a fost într-adevăr, că noi nu vrem final
să fie mai mică de a începe.
>> Aceasta este starea noastră oprire.
În cazul în care se întâmplă acest lucru, dorim să oprească și să declare ca, "Hei, nu am găsit nimic."
Pentru a exprima acest lucru, nu doriți să utilizați un fel de buclă.
În acest caz, ar fi o buclă do-timp, o buclă pentru, o buclă în timp ce?
Avem o bucla do-timp aici.
Ai tipi ca această abordare?
Crezi că ar trebui să încercăm o abordare diferită?
Kevin, orice fel de gânduri?
Am putea avea o buclă în timp ce pentru că știm maximă
ar fi mai mare decât min la start oricum.
Da, deci nu e nici o inițializare, care trebuie să se întâmple.
Aceste bucle do-timp sunt mari atunci când aveți pentru a inițializa ceva
înainte, apoi testarea, întrucât aici
știm că nu vom continua să reinitializing atât încep și se termină
fiecare rundă a buclei.
Știm că vrem să le inițializa, apoi verificați starea noastră.
În acest caz, voi merge, de fapt, cu o buclă în timp ce simplu.
Se pare că nu-timp se utilizează bucle destul de rar.
O mulțime de locuri nu învață măcar nu în timp ce buclele.
Sunt bune pentru manipularea introduse de utilizator, astfel că am văzut o mulțime de ei până în prezent.
Dar normală și în timp ce pentru bucle sunt mult mai frecvente.
Se pare că această condiție scris
nu va face într-adevăr ne-mult bine, și de ce este asta?
Îmi pare rău, nu știu numele tău.
Sunt Jerry. >> Ne pare rau?
E B-O-R-U-I.
Oh, bine.
Eu nu te văd pe lista mea.
Oh, e pentru că-oh, care face sens.
Ai o idee de ce această buclă în timp ce ar putea să nu funcționeze așa cum este prevăzut,
ca scris cu condiția?
[Jerry] Vrei sa spui ca vrei toate lucrurile, după o în-?
Da, așa că e unul.
Am putea avea de a pune toate lucrurile astea în timp ce bucla, care este total adevărat.
Un alt lucru care este un pic mai problematic, însă, este faptul că această condiție nu funcționează.
[Student] Trebuie să-l flip.
Corect, deci aceasta conditie nu va fi niciodată adevărat, inițial felul am vorbit despre asta.
Vrem să facem ceva până când apare <sfârșitul începe,
dar vrem să facem ceva în timp ce
începe ≤ sfârșitul anului.
>> Nu e faptul că inversarea logicii acolo.
Sunt vinovat de a face aceste greșeli tot timpul.
[Student] De ce trebuie să fie mai mică sau egală cu?
Pentru că îți amintești cazul în care am ajuns să
în cazul în care exista doar un singur element, și am fost în jos,
si ne uitam la doar 15 în gama noastră?
Și începutul și sfârșitul nostru nostru au fost același element.
Dorim să ne asigurăm că ne ocupam de acest caz.
Dacă am făcut o chintă mai mică,
ne-ar putea să trecem la o matrice 2-element.
Odată ce am ajuns la acel ultim element, în cazul în care au fost elementul nostru, nu ne-ar găsi.
Acum aici, putem face exact ca tine s-au spus.
Putem începe plopping dreptul de lucruri în mijlocul buclei while noastre.
Putem plop, în mijlocul nostru.
Putem lua toate acestea, dacă declarații,
trageți-le afară din această buclă do-timp,
plop-le în,
curăța lucrurile un pic,
și voi merge mai departe și de a salva această revizuire.
Și la acest punct, suntem obtinerea destul de aproape.
Sam.
Cred că, de asemenea, trebuie să aveți mijlocul int = dimensiunea - 1/2.
Am prins-o, dimensiunea - 1/2.
Este ceva ce avem nevoie pentru a schimba acea linie despre?
Asta a fost o captură bună.
>> Ce face mărime face? Suntem în continuă schimbare dimensiune?
În scopul de a păstra linia de acest fel, vom avea pentru a modifica dimensiunea.
Avem de a schimba dimensiunea de fiecare dată când mergem în jurul valorii de bucla for.
Dar amintiți-vă atunci când am fost de gând prin exemplul nostru doar un pic mai devreme,
si am avut început la 4
și final tot drumul la peste 108?
Cum am calculează punctul de mijloc?
Am fost folosind dimensiunea?
Sau am fost folosind încep și se încheie în schimb?
E diferența între sfârșitul și începutul.
Exact, exact cum ar trebui să și scriu asta, Charlotte?
Doar termina - începe.
Tu nu ar trebui să facă - 1
deoarece - 1 a fost inclusă în final și începe deja.
[Nate] Mare, ai dreptate.
Noi nu trebuie să facem - 1 pentru că - 1 a fost inclusă
și contabilizat, atunci când am inițializa variabila final.
>> Este ceva ce trebuie să fac pentru a avea sintactică această linie face sens?
[Student] Plus începe >> Plus. Începe?
[Student] La sfârșitul.
Pentru că acesta este calculat doar jumătate lungime.
Ai nevoie să adăugați începe.
[Nate] Ce s-ar calcula aceasta pentru noi?
Dacă ne gândim la sfârșitul de pe acest repetare prima bucla a,
final este de gând să fie în indexul poziția 7.
Inceput este în poziția 0.
Amintiți-vă, suntem în căutarea pentru nici unul dintre
Poziția 3 sau 4 pozitii.
Dacă ne uităm la această matematica, doar pentru a face un pic mai concret,
pune niste numere de aici, avem 7, 0,
așa 7-0, și apoi / 2
este de 3 în diviziunea întreg, care este.
Apoi, avem nevoie pentru a adăuga apoi spatele nostru începe?
Noi nu facem în acest caz.
La prima iterație, va fi bine pentru că Begin este 0.
Dar, așa cum am progres, facem într-adevăr toate nevoie doar de
final - începe / 2.
Nu e un truc alta aici, și că este unul dintre anume prioritate.
[Student] Nu avem nevoie de paranteze?
[Nate] Exact, și asta pentru că, dacă nu punem aceste paranteze,
atunci această linie va fi interpretată în schimb
ca (sfârșit) - (începe / 2), care cu siguranta nu vrei.
Ferește-te de aceste regulilor de precedență.
[Student] De ce nu se termina + începe?
De ce nu se termina + începe?
[Student] De ce nu-l asta?
De ce ar fi +?
Cred că ai dreptate.
[Student] Pentru că e media?
[Nate] End + începe, ai dreptate.
Wow, am gafat în totalitate. Ai dreptate.
Dacă făceam minus, ne-ar dori să adăugați începe înapoi inch
În acest caz, esti foarte corect că vrem să ia în considerare media de două,
așa că nu vreau să-i adăugați, spre deosebire de a le scădea.
[Student] ar lucra, de asemenea, dacă ai făcut-end - începe / 2 + a începe.
Ar fi dacă am face-Cred ca da.
>> De exemplu, daca ne uitam la început,
si l-am mutat aici
la 15.
Acum începe este la poziția 2.
Sfârșitul este în poziția 7.
Dacă le scade, avem 5.
Împărțiți că de 2, obținem 2.
Și apoi vom adăuga 2 înapoi în,
și care ne ajunge la locul 4,
care este chiar aici, care este mijlocul.
[Student] Nu avem nevoie pentru a avea grijă de ambalaje?
În ce sens avem nevoie pentru a avea grijă de ambalare?
În cazul în care suma sau diferența dintre
în funcție de modul în care o facem nu este un număr par.
Apoi calculatorul devine confuz, dacă, atunci când este 2,5;
te deplasa la stânga sau la dreapta pentru a determina care este mijlocul?
Am prins-o.
Se pare că, odată cu diviziunea întreg,
nu vom primi niciodată aceste numere în virgulă mobilă.
Noi nu te mai zecimal.
E complet eliminate.
Dacă aveți un calculator impartiti doua variabile int,
și unul este de 7, iar celălalt este 2,
nu vei primi 3.5, ca rezultat.
Acesta va primi 3.
Restul va fi aruncată, asa ca este eficient rotunjire-
Nu o rundă, ci mai degrabă o podea, dacă voi sunt familiarizați cu faptul că, în matematică,
în cazul în care vă aruncați complet zecimal,
și așa sunteți în esență, că trunchierea în jos la cel mai apropiat
Total pozitii, la cel mai apropiat număr întreg.
[Student] Dar atunci asta e problematică, deoarece în cazul în care aveți o serie de 7 elemente
apoi faptul că ia în mod automat elementul treia din punctul de mijloc in loc de 4.
Cum avem de a face cu asta?
E problematic, deoarece, dacă am avut o serie de 7,
ar alege treilea loc de 4.
Ați putea explica un pic mai mult?
[Student] Pentru că, dacă aveți 7 elemente, atunci elementul patra
ar fi punctul de mijloc, nu?
Amintiți-vă comentariul tau despre a fi indexate la zero, totuși.
[Student] Da, astfel încât în ​​poziția 3. Asta ar fi punctul de mijloc.
Da.
Oh, bine. Înțeleg ce vrei să spui.
E un fel de ciudat, așa cum ne obișnuim cu această noțiune întregii
a scăpa de zecimale.
Asta e un punct de mare.
Să terminăm asta.
Ne-am calculat mijlocul nostru.
>> Testăm pentru a vedea dacă acul nostru este egal cu valoarea de mijloc.
Suntem de imprimare pe care l-am găsit, dar de fapt, ceea ce vrem să facem în această situație?
Am găsit-o, așa că vrem să apelantului știu că l-am găsit.
Avem o funcție care este o functie booleana tastat.
Modul în care ne semnala apelantului funcției noastre pe care suntem gata să mergem
este spunem, "Hei, acest lucru este adevărat."
Cum ne-am face asta, Kevin?
Te cap la cap. >> [Kevin] Adauga return true.
[Nate] Exact, return true.
Acum, dacă nu e egal, cum ne-am uita la jumătatea stângă?
Orice idei?
Stella, orice idei?
Aveți nevoie pentru a seta o nouă poziție pentru sfârșitul anului.
Da.
Deci, avem de a face poziția punctului de mijloc - final.
Mare.
Avem nevoie pentru a seta o nouă poziție pentru sfârșitul
să se uite la jumătatea stângă.
Aceasta a fost ceea ce am vorbit despre înainte de a în cazul în care
Mă tot întorc la acest exemplu.
Am începe aici, și apoi am sfârșit tot drumul până aici.
>> Din nou, dacă suntem în căutarea de 15, iar punctul de mijloc nostru este la 16,
și ne dăm seama, "Oops, 16 este mai mare.
Dorim să se mute în jumătatea stângă. "
Ne-ar muta apoi la capăt 15,
și vom face acest lucru luând una departe de punctul de mijloc
și că, în stabilirea scop noul nostru.
De asemenea, în cazul în care vrem să se uite la jumătatea dreaptă, cum ne-ar face asta?
Ai o idee?
[Student] Trebuie doar setat începe să mijlocul + 1.
[Nate] Mare.
Și acum, în cazul în care nu vom găsi nimic,
nu ca să grijă de pentru noi?
Daniel, nu se considere că grija de pentru noi?
[Daniel] Nr
[Nate] Dacă vom face prin intermediul întregului set și nu găsim nimic,
în cazul în care ar fi faptul că grija de, sau ar trebui să avem grijă de ea?
[Daniel] în timp ce condiție.
[Nate] Da, în timp ce starea, exact.
Acesta va avea grijă de a merge prin matrice întreg dacă nu găsim nimic.
Această buclă în timp ce se va termina.
Noi niciodată nu va fi întâmpinat această condiție,
și ne putem întoarce false.
Putem pleca, de asemenea, în cazul în care această aici ca acest
pentru că, dacă această afirmație este adevărată în cazul în care,
și funcția noastră va reveni,
și astfel vom abandona în esență, această funcție în acest moment
când ne vom întoarce adevărat.
Dar ce se întâmplă cu această structură aici?
Aceasta va funcționa în întregime, sau este vreun defect logic acolo?
>> Există unele defect logic acolo, cu modul în care aceasta este configurat.
Ce ar putea fi?
[Student] De ce ai nevoie - și + 1s?
Care stabilește gama noastră până să fie noul nostru jumătate la stânga și la jumătatea din dreapta.
[Student] Dar de ce nu ai putut să o faci fără - 1s 1s și +?
[Nate] Am putea egală cu punctul de mijloc?
Care ar putea fi problematic în legătură cu asta?
[Student] Cred ca e ineficient pentru ca esti o valoare de verificare care a fost deja verificată.
[Nate] Exact, deci Sam este total dreptate.
Dacă setați final și începe egală cu punctul de mijloc
în loc de - 1 și + 1 reflexiv,
la un moment dat în viitor, vom sfârși prin a verifica punctul de mijloc din nou.
[Student] am început PSET, iar apoi am avut ceva de genul asta
în cazul în care am uitat 1 +, și a ajuns blocat într-o buclă infinită.
Corect, pentru că la un moment dat nu sunteți niciodată de gând să se înceapă și să se încheie
de fapt, să se suprapună.
Mișto.
Nu e un defect mai logic, și anume faptul că aceasta ar trebui să fie cu siguranta
un altfel daca.
De ce s-ar putea fi asta?
>> Motivul este, dacă nu este un altceva, dacă-l-ai vedea, Kevin?
[Kevin] Da, pentru că vă schimbați punctul final.
[Nate] Exact.
Ne schimbarea final,
și dacă este scris ca acest Vom face-spații între-
se va verifica acest caz.
Acest caz, dacă reușește, va abandona din funcția.
Apoi, acesta va verifica acest caz următoare,
și dacă acest reușește, se va ajusta final,
și apoi va continua pe și să verificați acest caz.
Dar, în acest moment, nu vrem să continue verificarea.
Din fericire, nu am resetat punctul de mijloc aici,
și știm că acest caz nu va reuși.
Dar noi cu siguranta doriți să puneți altceva în cazul în care există în
chiar dacă faptul că ar putea-în acest caz,
deoarece nu suntem de adaptare mijloc, ar face că o diferență?
Nu, pentru că aceste cazuri sunt exclusive.
Din nou, greșeala mea.
Noi nu, cred, nevoie de asta în cazul în care altcineva.
Ne poate da it un try și rulați-l și a vedea ce se întâmplă.
Clădire, a apărut o eroare.
Este, probabil, pentru că am plecat de aceste lui b și e aici.
Nu am nici mai mult de cele de la partea de sus?
Ea nu arata ca ea.
Noi zoom out, construi,
acolo se duce, așa că acum, dacă am căuta pentru 15,
Da.
Lasă-mă să zoom inch
15, da. Ne putem rula din nou.
Încărcarea codul sursă, construirea, care rulează.
Noi putem căuta ceva de genul 13,
și nu primim nimic imprimarea, așa că nu e potrivit căreia pentru noi.
Asta e grozav, pentru că nu este în lista noastră.
>> Suntem acum în afara timpului.
Asta o să fie pentru această săptămână.
Multumesc pentru aderarea, si vezi tu mai tarziu.
>> [CS50.TV]