[Powered by Google Translate] [Astea 4]
[David J. Malan] [Harvardeko Unibertsitateko]
[Hau da CS50.] [CS50.TV]
>> Ondo da, hau CS50 da, eta hau da aste 4 Irteeran,
eta honen arabera ordenatzeko algoritmo geldoena posible bat da.
Zein izan zen besterik ez da han ikusi dugu?
Burbuila sort zen, big O (n ^ 2) + batura,
eta, hain zuzen ere, ez gara mundu honetan dauden bakarrak jakin dirudi
zer da burbuila sort edo bere denborak.
Izan ere, Eric Schmidt Google-ekin elkarrizketa bat izan zen
ohia eta senatari Barack Obama Duela urte gutxi batzuk besterik ez.
>> Orain, senatariak, hemen duzu Google
eta lan-elkarrizketa bat lehendakaritza pentsatzea gustatzen zait.
Orain, gogorra da presidente gisa lan bat aurkitzeko, eta rigors bidez joan zaren.
Da zaila, halaber, Google-lan bat lortzeko.
Galdera bat daukagu, eta gure hautagaien galderak ditugu,
eta Larry Schwimmer da.
You guys uste Txantxetan ari naiz? Hemen da.
32-bit milioi bat zenbaki osoen ordenatzeko modurik eraginkorrena Zer da?
[Barreak]
Beno-
Sentitzen dut. >> Ez, ez, ez, ez.
Bubble sort litzateke gaizki joan dela uste dut.
>> Goazen, nork esan zion hau?
Azken aste gogorarazten kodea atseden bat hartu dugu, gutxienez egun bat,
eta batzuk maila altuagoa ideia gehiago, oro har, eta arazoa konpontzeko ardaztuta hasi zen
bilatu eta ordenatzeko testuinguruan,
eta zerbait ez dugu izen hori ez Slap azken astean sartu gara,
notazioa, baina asymptotic Big O, Big Omega
eta, batzuetan, Big Theta notazioa, eta horiek izan ziren, besterik gabe, modu
algoritmoak iraupena deskribatzeko,
zenbat denbora exekutatu algoritmo bat da.
>> Eta gogoratzen denborak buruz hitz egin ahal izango duzu tamaina
sarrera, deitu dugu, oro har, n, edozein arazoa izan daiteke,
non n gelan pertsonen kopurua da,
telefono-liburuaren orrialde kopurua, eta hasi ginen gauzak idazteko
O bezala (n ^ 2) edo O (n) edo O (n log n),
eta math, nahiz eta ez nahiko lan egin, beraz, ezin hobeto
eta n izan zen ² - n / 2 edo horrelako zerbait
ordez genuke bota ordena beheko termino batzuk,
eta motibazioa ez da benetan nahi dugun
ebaluatzeko modu objektiboa sort
programen errendimendua edo algoritmoak errendimendua
egunaren bukaeran, ezer egin du, esate baterako,
zure ordenagailuaren abiadura gaur egun.
>> Esate baterako, ezartzeko burbuila sort izanez gero,
edo batu sort edo hautapena gaur egungo ordenagailuan ordenatu ezartzeko,
2 GHz ordenagailuan, eta exekutatu,
eta segundo batzuk hartzen du, eta datorren urtean 3 GHz
edo 4 GHz ordenagailua, eta agian gero erreklamatzeko, "Wow, nire algoritmoa
birritan azkar gisa, "denean errealitatea hori da, jakina, ez da kasua.
Hardwarea ahaztuak azkarragoa da, baina zure ordenagailuan
ez du, eta, beraz, nahi dugu gauzak bezala urrun bota
multiploak 2 edo 3 multiplo orduan deskribatzen
nola azkarra edo motela algoritmo bat da eta benetan besterik ez fokua
n edo horien faktore batzuk,
botere batzuk kontratuan astetik mota kasuan bezala.
Eta gogoratzen merge sort laguntza
gai burbuila sort eta aukeraketa sort baino askoz hobeto egin ginen
eta are txertatzeko sort.
>> N log n behera lortu dugu, eta, berriro ere,
gogoratzen log n, oro har, zerbait hazten aipatzen
poliki-poliki, gero n, eta, beraz, n log n, beraz, orain arte ona izan zen
izan zen n ² baino gutxiago delako.
Baina n lortzeko saioa n merge sort
zer izan zen ideia bat germen oinarrizko izan dugun leverage
ere egiten dugu aste 0 back leveraged?
Nolatan ordenatzeko arazoari aurre cleverly merge sort?
Zer da gako insight izan, agian?
Edonork guztiak.
Ados, dezagun urrats bat atzera.
Azaldu zure hitzetan sort batu.
Nola egin du lan?
Ados, aste 0 errenkadan itzuliko gara.
Ados, bai.
[Inaudible-ikaslea]
Ongi, ona da, beraz, zenbaki-array 2 zatitan banatu dugu.
Pieza horietako bakoitzean horrela antolatu dugu, eta gero batu ditugu,
eta aurretik ikusi dugu ideia hori arazo bat handi hau hartu
eta Tajadura sortu den arazo bat da hau handia edo handi honetan sartu.
>> Gogoratu telefono book adibidez.
Gogoratu aste ago algoritmoa auto-zenbaketa
beraz batu sort pseudocode hau hemen laburbildu zen.
Duzunean n elementuak eman, eta lehen behatu egiaztatu zen.
N <2 ondoren ez bada ez du ezer guztiak
n <2 ondoren n da, jakina, 0 edo 1 bada delako,
eta, beraz, bai bada 0 edo 1 ez dago ezer ordenatzeko.
Egin duzu.
Zure zerrenda dagoeneko kenduz ordenatuko da.
Baina bestela duzun got elementu 2 edo gehiago aurrera eta horiek zatitzeko
2 halves sartu, ezkerreko eta eskuineko.
Sort halves horietako bakoitzean, eta ondoren ordenatuko halves batu.
Baina hemen arazoa da, hasiera batean hori sentitzen ari gara punting bezala.
Horretan definizio zirkular bat da eskatu Nik baduzu n elementu horiek ordenatzeko
eta ni ari zaren kontatzea "All right, fina, n / 2 eta n duten / 2 elementu horiek ordenatzeko dugu"
ondoren, nire galdera hurrengoa da izango "Ederren, nola n / 2 elementuak ordenatzeko duzu?"
>> Hala ere, programa honen egitura,
oinarri kasu honetan delako, eta, beraz, hitz egiten,
Kasu berezi hau dioen n bueltan 2 bezalako balio finko batzuk <berehala.
Ez erantzun bera zirkular hori erantzuteko.
Prozesu honek, cyclicity honetan joango amaituko da.
Eskatzen dut baduzu "Sort n elementu hauek," eta, esan duzu? "Ederren, n horiek ordenatzeko / 2"
Ondoren, esan duzu "Ondo, horiek sort n / 4, n / 8, n/16,"
azkenean zenbaki bat big nahikoa duzu zatitzea
1 elementu ezker duzula izango da, eta esan dezakezu,
"Hemen, hemen ordenatuko elementu bakar bat da."
Ondoren, algoritmo honen distira hemen da Izan ere, ondorioz
horietako bakoitzak ordenatuko zerrendak behin guztia duzu,
tamaina 1, Ezertarako izango dela dirudi,
hasten zara batuz, eta horiek batuz behin
sortu, azkenik, Rob azkenik ordenatuko bideo zerrenda bat egin zuen.
>> Baina ideia hori urrun Ordenatzeko haratago hedatzen da.
Errekurtsibitate izenez ezagutzen den programa hau kapsulatutako ideia hau da,
ideia horren bidez programa bat dira,
eta zuk zeuk deitu arazo batzuk konpondu ahal izateko,
edo funtzio bat dira programazio-lengoaia testuinguruan jarri
eta ordena arazo bat konpontzeko, funtzioa deitzen zuri
behin eta berriro, eta berriro, baina funtzio
ezin deitu zaitez infinituki hainbat aldiz.
Azkenean beheko izarrekin duzu, eta, beraz, hitz egiten,
eta hard-kodetuak zenbait-base baldintza dioen
Puntu honetan gelditu zeure burua deituz, beraz, prozesu osoa
Izan ere azkenik ez gelditzeko.
Zer esan nahi du benetan esan nahi, recurse?
>> Ikus dezagun, adibide sinple bat, trivial dugu bada, esan,
3 me up Hemen agertokian, norbait eroso bada.
1, sortu, 2 eta 3 dira.
3 nahi baduzu ... etorri hemen.
Ondoan nahi duzun me hemen stand-lerro batean bada, demagun arazo eskuz
Oso kenduz, hemen diren pertsona kopurua zenbatzea.
Baina, Egia, hauek kontatuta adibide guztien nekatuta nago.
Hau da, denbora pixka bat, 1, 2, eta hartu dot, dot, dot joan.
Betiko hartzeko.
Nahiago dut punt arazo hau guztiz laguntza-Zein da zure izena?
Sara. >> Sara, eskubidea.
Kelly. >> Kelly eta?
>> Willy. >> Willy, Sara, Kelly, eta Willy.
Oraintxe bertan jaso dut norbaitek galdera
zenbat pertsona dira fase honetan, eta ez dut ideia.
Hau benetan zerrenda luzea da, eta, beraz, trikimailu hau egin nahi dut ordez.
Pertsona me ondoan lana egiteko eskatu dut,
eta behin zuen egiten da lan gehien egiten
Lan gutxien posible egin dut eta bakarrik 1 gehitu
edozein izanik ere bere erantzuna da, eta, beraz, hemen goaz.
Dut galdetuko zenbat pertsona eszenatokian.
Zenbat pertsona eszenatokian ezkerreko?
Nire ezker? >> Ados, baina ez tranparik.
Hori ona da, zuzena da, baina nahi dugu logika hori jarraitu nahi izanez gero
Demagun, era berean, nahi duzun punt arazo hau ezkerreko
beraz, ez erantzun baino zuzenean joan aurretik eta Buck pasatzeko.
Oh, zenbat pertsona me ezkerreko dira?
Zenbat pertsona ezkerretara daude?
1.
[Barreak]
Ongi da, eta, beraz, 0, eta, beraz, orain Willy egin du
itzuliko da duzun zure erantzuna norabide honetan 0 esanez.
Orain, zer egin behar? >> 1.
Ongi da, beraz, 1 Oraindik duzu, beraz, esan duzu, "eskubidea guztiak, 1. Gehitzeko naiz joan
edozein Willy-en kopuruan izan zen, beraz, 1 + 0.
Zara orain 1 eskubidea erantzuna da, beraz, gaur egun-
1. >> Eta nirea 2 izango litzateke.
Ona, eta, beraz, aurreko 1 erantzun hartzen ari zarela,
egin nahi duzu lan gutxieneko zenbatekoa gehituz, +1 da.
Orain 2, eta gero entregatu me balio?
3, esan nahi dut, barkatu, 2.
Good.
>> Beno, 0 izan dugu ezkerretara.
Ondoren, 1 izan dugu, eta, ondoren, 2 gehitu dugu,
eta, gaur egun, me ari zaren kopurua 2 gozamenerako,
eta, beraz, naiz esaten ados, +1, 3.
Dago, hain zuzen ere 3 pertsona me ondoan zutik etapa honetan,
ondorioz, jakina, genezake egin hau oso linealki
Oso nabarmenak moda asko, baina zer egin dugu benetan?
3 tamaina arazo bat hartu genuen hasieran.
Hautsi dugu tamaina 2 arazo bat sartu,
ondoren, tamaina 1 arazoa, eta, ondoren, behin betiko oinarri kasuan
izan zen benetan, oh, ez inork ez dago,
puntua Willy itzuli eraginkortasunez hard-kodetuak erantzun pare bat aldiz,
eta bigarrena izan zen, ondoren bubbled, bubbled, bubbled sortu
eta, ondoren, hau 1 gehiago gehituz
inplementatu dugu errekurtsio oinarrizko ideia hau.
>> Orain, baina kasu honetan ez da benetan arazo bat konpontzen
gehiago eraginkortasunez ondoren ikusi dugu, beraz, oso urrun.
Baina algoritmo etapa egin dugu horrela, orain arte pentsatzen.
8 paper-pieza Edukien gainean izan genuen,
video Sean zen kopurua 7 bila, eta zer egin ez benetan?
Beno, ez zuen egin arrail edozein motatako eta konkistatzeko.
Ez zuen egin errekurtsio edozein motatako.
Deigarria egin zuen algoritmo lineal hau.
Baina etapa horrela antolatu zenbakiak ideia sartu dugu bizi azken astean
ondoren instinto hau erditik joan behar izan genuen,
eta amaitzen da tamaina tamaina 4 4 edo zerrenda beste zerrenda txikiagoa izan genuen,
zehatza eta, ondoren, arazo bera izan genuen, eta, beraz, behin eta berriz errepikatzen dugu, behin eta berriz, behin eta berriz errepikatzen.
Beste era batera esanda, recursed.
Eskerrik asko gure 3 boluntario hemen gurekin errekurtsio erakutsiz.
>> Ikus dezagun ezin dugu egin orain apur bat gehiago hormigoi,
arazo bat berriro egin genezake nahiko erraz konpontzeko,
baina oinarrizko ideia hori ezarrita harri hurrats gisa erabiliko dugu.
Nahi dut zenbaki-sorta bat summation konputatu nahi izanez gero,
Adibidez, 3 zenbakia pasatzen bada,
Sigma 3 balioa eman nahi dut
beraz, batura 3 + 2 + 1 + 0.
Erantzun 6 itzuli nahi dut,
beraz, hau sigma funtzioa, summation funtzio hau gauzatzeko dugu
eta, berriro ere, sarrera hartzen du, eta, ondoren, summation itzultzen
zenbaki hori modu behera 0.
Horretarako izan dugu nahiko besterik gabe, ezta?
Begizta batean egitura mota batzuk egin izan dugu,
beraz aurrera nau eta hau hasi.
>> Artean, besteak beste stdio.h.
Neure burua me nagusitan hemen lan egiteko.
Dezagun, gorde hau sigma.c gisa.
Orduan hemen joan naiz joan, eta int n bat deklaratzen dut,
eta honako hauek egin ahal izateko, erabiltzaileak ez du kooperatu noa.
Erabiltzaileak ez du zenbaki positibo bat eman dit
utzi aurrera eta gonbita n = GetInt
eta utzi eman dit zer egin argibideak batzuk,
beraz, printf ("zenbaki oso positiboak mesedez").
Just zerbait nahiko simple hau atsegin dute denbora line 14 hit dugu
zenbaki oso positibo bat ustez n.
>> Orain egin dezagun zerbait.
Dezagun aurrera eta summation kalkulatzeko, beraz, int batura = sigma (n).
Sigma besterik ez da summation, beraz, besterik ez dut idatzi modu fancier.
Deitu besterik ez dugu han sigma da.
Batura da, eta gaur egun, emaitza inprimatu dut joan,
printf ("batura% d \ n", batura).
Eta gero, 0-ra itzuliko dut neurri ona.
Programa behar hori guztia egin dugu interesgarria zatian izan ezik,
hau da, benetan ezartzeko sigma funtzioa.
>> Behera joan me hemen beheraino, eta utzi Funtzio sigma deklaratzeko me.
Handia lortu aldagai mota osokoa,
eta zer datu-mota ez sigma from zentzuzkoa itzuli nahi dut?
Int, nire itxaropenak dator line 15 nahi dudalako.
Hemen utzi aurrera, eta hau ezartzeko
modu nahiko sinplea da.
>> Dezagun aurrera eta esan int batura = 0,
eta, gaur egun, begizta txiki bat hemen joan noa
den honen antzeko zerbait esan nahi du,
for (int i = 0; I <= kopurua; i + +) batura + = i.
Eta gero, batura itzuli egingo naiz.
Ezarri nuen modu edozein zenbaki.
Erabili nuen bitartean begizta bat.
Saltatu nuen batura aldagaia erabiltzen dut nahi izanez gero,
baina azken finean, funtzio bat besterik ez dugu egin ez badut goof adierazten batura 0 da.
Ondoren iterates 0-tik gora zenbaki bidez,
eta iterazio bakoitzean uneko balioa hori gehitzen da batura, eta ondoren batura itzultzen du.
>> Orain, ez optimizazioa apur bat hemen.
Hau da, ziur aski urrats bat alferrik galtzen da, baina hala izan da. Hori da orain ongi.
Gara, gutxienez, sakon eta 0 modu guztiak joan gora.
Ez da oso gogorra eta nahiko erraza da,
baina bihurtzen da sigma funtzioa duten aukera bera dugu
egin dugun bezala, hemen eszenatokian.
Etapa On zenbatuko dugu zenbat pertsona izan ziren ondoan me,
baizik eta nahi izan dugu, 3 + 2 + 1 zenbatu nahi izanez gero
0 behera, era berean, ezin izan dugu punt funtzio
egingo duten I ordez recursive bezala deskribatzeko.
Hemen dezagun behatu ez azkar bat egiaztatu eta ziurtatu ez nuen goof.
>> Gutxienez programa honetan gauza bat oker I egin ez da ezagutzen dut.
Noiz sartu hit I am me at yelling edozein motatako lortu nahi dut?
Zer egingo buruz behar yelled dut?
Bai, prototipoa ahaztu dut, deitu sigma 15 on line funtzio bat erabiltzen dut, beraz,
baina ez line 22 arte deklaratu eta, beraz, onena modu proaktiboan sortu dut hemen
eta prototipo bat aldarrikatu, eta int sigma (int zenbakia) esan dut, eta hori da.
Beheko aldean ezarri da.
>> Edo hau konpontzeko beste modu bat izan nuen,
Funtzio eraman izan dut sortu, hau da, ez da txarra,
baina, gutxienez, zure programak hasten luze lortzeko, Egia,
Nik uste dut beti nagusia izatea goialdean balio batzuk
beraz, fitxategi irakurlea ireki daiteke eta, ondoren, berehala ikusiko
programa horren bidez bilatzeko beharrik gabe egiten
duten funtzio nagusia bila.
Goazen behera nire terminal leihoa Hemen, sigma egin sigma egiten saiatu,
eta dena izorratu nuen hemen ere.
Funtzioa GetInt adierazpen inplizitua ahaztu dut zer gehiago egin esan nahi du?
[Inaudible-ikaslea]
Ona, beraz, itxuraz, eta, beraz, komun akats bat jarri hau hemen utzi,
cs50.h, eta, orain, goazen atzera nire terminal leihoa.
>> Pantaila garbitu dut, eta berrabiarazi egin sigma dut.
Konpilatu dirudi. Dezagun exekutatu me now sigma.
3 zenbakia idatzi dut, eta 6 lortu nuen, beraz, ez da txeke bat zorrotza,
baina, gutxienez, hasiera batean lan egiten ari dela dirudi, baina gaur egun dezagun rip gain,
dezagun benetan errekurtsio ideia leverage, berriz,
testuinguruan oso erraza da, beraz, aste batzuk denbora
fancier datu egiturak aztertuz hasten gara array baino
toolkit, beste tresna dugu eta horrek
manipulatzeko datuen egitura horiek ikusi dugu.
Etorriko ikuspegia, loop-oinarritutako hurbilketa bat da.
>> Let me ordez orain hau.
Let me ordez esan zenbakiaren summation
: 0 behera benetan gauza bera
zenbakia + sigma (zenbakia - 1).
Beste era batera esanda, etapa on bezala punted me ondoan bakoitzaren I,
eta aldi berean mantendu dute azkenik dugu bottomed arte Willy at punting,
0 bezala erantzun gogor kodetuak itzuli zuten.
Hemen ari gara gaur egun, era berean, sigma punting
Halaber, funtzio bera izan zen jatorriz izenekoa,, baina funtsezko ezagutzeko hemen
ari garen ez sigma berdinean deituz.
Ez ari gara n pasatzerakoan.
Kopurua argi eta garbi ari gara pasatzen - 1,
beraz, apur bat txikiagoak arazoa, apur bat txikiagoak arazoa.
>> Zoritxarrez, hori ez da oraindik nahiko irtenbide bat, eta konpondu aurretik
zer jauzi baliteke out bistako batzuk
utzi aurretik joan eta berrabiarazi egin.
Ongi konpilatu dirudi.
Sigma berrabiarazi me 6.
Whoops, utzi sigma berrabiarazi me 6.
Ikusi dugu, aurretik denbora ustekabean a izan arren ere.
Zergatik segmentaziuo hutsegitea críptica hau lortu dut? Bai.
[Inaudible-ikaslea]
Base kasuan ez da, eta, zehazki, zer ziurrenik gertatu da?
Zer portaera sintoma bat da?
Esan apur bat altuagoa.
[Inaudible-ikaslea]
Begizta infinitu eraginkortasunez eta loops infinitua arazoa da
errekurtsio inplikatzen dute, kasu honetan, funtzio bat bera deituz,
bakoitzak funtzio bat deitu zer gertatzen da?
Beno, uste atzera nola ordenagailu batean memoria ezarri dugu.
Ez dagoela, pila, behealdean izeneko zatia memoria esan dugu,
eta bakoitzak funtzio bat deitu apur bat gehiago memoria lortzen jarri
funtzioa aldagai lokalak edo parametroak duten deiturikoak pila honetan,
hala badagokio sigma sigma deiak dei sigma sigma deiak
deiak sigma non istorioa hau?
>> Beno, azkenean overruns guztizko zenbatekoa
memoria duzula zure ordenagailuan eskuragarri.
Ari ustezko lo barruan segmentu inbaditu,
segmentaziuo hutsegitea hau, core isuritako
eta zer core iraultzeko esan nahi dut orain dela core izeneko fitxategi bat
fitxategi bat da zeroen eta bai duten
benetan etorkizunean diagnostikoan erabilgarria izango da.
Begi-bistakoa da ez bada non zure bug
benetan egin dezakezu auzitegiko azterketa apur bat, eta, beraz, hitz egiten,
core dump fitxategia hau, eta, berriro ere, besterik ez da zeroen eta bai sorta osoa
funtsean zure programaren memoria egoera adierazten
une kraskatu modu honetan.
>> Fix Hemen da ezin dugula besterik ez blindly itzultzeko sigma,
kopurua + apur bat txikiagoak arazoa sigma.
Base kasuan nolabaiteko izan behar dugu hemen,
eta zer egin behar oinarriaren kasuan seguruenik izango ote da?
[Inaudible-ikaslea]
Ongi da, eta, beraz, zenbaki positiboa da benetan behar dugu itzuli honetan,
edo beste modu bat jarri, kopurua bada, esan, <= 0
badakizu zer, aurrera eta 0-ra itzuliko naiz,
askoz ere atsegin Willy egin, eta bestela, aurretik joan naiz joan
eta itzuli honetan, beraz, ez da askoz laburragoa
etorriko bertsioa harrotua dugun lehen erabiliz loop bat baino,
baina ez da dotorezia mota da hau.
Zenbaki batzuk itzuli eta math hau guztia eszenikoen ordez
eta gauzak gehituz aldagai tokiko
ordez, esaten ari zaren "Ados, hau da super erraza arazo bat bada,
zenbakia <0 bezala, let me berehala itzultzeko 0. "
>> Ez dugu onartzen negatiboa zenbakiak sartuko
hain gogorra kodea 0 balioa joan naiz.
Baina, bestela, summing ideia hau martxan jarri ahal izateko
zenbaki horiek guztiak elkarrekin eraginkortasunez dezakezu txiki ziztadak hartu
arazoa da, askoz ere atsegin Hemen genuen agertokian,
ondoren, punt arazoa gainerako pertsona hurrengo
baina kasu honetan hurrengo pertsona bakarrik da.
Berdinean izeneko funtzio bat da.
Just aldi bakoitzean gainditu txikiagoak eta txikiagoak eta arazo bat txikiagoa da,
eta nahiz eta ez nahiko formalizatu kodea gauzak dugu hemen
hau da, zehazki zer izan zen telefonoaren liburua aste 0.
Hau da, zehazki zer zen joan aste iraganeko Sean
eta gure zenbakiak bilatzen manifestazioak.
Arazo bat da, hartu eta zatituz behin eta berriro.
>> Beste era batera esanda, ez dago modu bat da, gaur egun itzultzeko
mundu honetan benetako eraikuntza, goi-mailako eraikuntza
zatitzea eta konkistatzeko, eta gauza behin eta berriro
kodea, eta, beraz, ikusi ahal izango dugu berriro, denboran zehar zerbait da.
Orain, bat alde batera utzita, Oraindik errekurtsio berri bada, gutxienez, behar duzu ulertzen gaur egun
zergatik hau dibertigarria da.
Google.com joan noa,
eta zenbait aholku eta trikimailuak errekurtsio bilatzeko noa, sartu.
Esan pertsona duzu ondoan ziren ez bada oraintxe barre.
Ba al errekurtsio esan nahi al duzu?
Esan nahi zenuen-ah, ez gara.
Ongi da, orain dela gainerako guztientzat.
Un poco de Pazko arrautza Txertatutako nonbait dago Google.
Bat alde batera utzita, estekak ikastaroaren web orrian jarri dugu
gaur egun Ordenatzeko hainbat algoritmo sareta hau da,
horietako batzuk, astetik begiratu ditugu, baina zer nice bistaratze honi buruz
saiatu zure kontuan itzulbiratu, algoritmoak zerikusia inguruan hainbat gauza
ezagutu ahal izango dituzu oso erraz sarrera-mota ezberdinak hasteko.
Sarrerek trukatuta, batez ere input ordenatuta, input ausazko eta abar.
Da, saiatu berriz, bereizteko gauza horiek zure kontuan
konturatzen ikastaroa Hitzaldiak orrian web orrian URL honetan
horietako batzuetan zehar arrazoia lagun dezake.
>> Gaur egun, azkenik, lortu dugu arazo hau konpondu ahal izateko pixka bat atzera,
izan zen swap funtzioa besterik ez du funtzionatzen.
eta zer funtzio swap honekin funtsezko arazoa zen,
helburua izan zen, berriz, balio bat trukatzeko hemen eta hemen
hala nola, hori gertatzen da?
Hau ez da ondo lan egitea. Zergatik?
Bai.
[Inaudible-ikaslea]
Zehazki, bugginess honen azalpen
besterik ez zen C funtzioak deitzen duzulako
eta funtzioak horiek argumenturik hartzen, a eta b hemen bezala,
edozein izanda ere balio du funtzio hori ari zaren eskaintzen kopiak pasatzen ari zaren.
Ez zara jatorrizko balioak bere burua,
beraz, hau ikusi genuen buggyc testuinguruan,
buggy3.c, pixka bat begiratu honen antzeko zerbait.
>> Gogoratu izan ditugu, x eta y 1 eta 2 hasieratu, hurrenez hurren.
Inprimatutako dugu zer izan ziren.
Erreklamatu ondoren nintzen ditut aldaketa x, y swap telefonora deituz.
Baina arazoa zen aldaketa hori lan egin zuen,
swap-esparrua, baina soilik funtzionatzen bera.
Bezain laster line 40 truka balio horiek hit
ziren bota, eta, beraz, ez da ezer
jatorrizko funtzio nagusia izan zen benetan aldatu guztiak
hala badagokio uste baduzu, orduan zer itxura gure memoria dagokionez
taula ezkerreko eskuko hau adierazten du-bada
eta nire onena egingo dut guztiontzat ikus-taula ezkerreko eskuko hau
adierazten du, esan, zure RAM, eta pila hazten da modu honetan,
eta nagusiak bezalako funtzio bat deitu dugu, eta nagusia 2 aldagai lokalak, x eta y,
dezagun deskribatzeko x bai hemen, eta utzi hauek deskribatzeko y hemen,
dezagun balioak 1 eta 2 jarri, hau hemen nagusia da, beraz,
eta nagusiak swap funtzioa deiak sistema eragilearen
swap funtzioa ematen bere memoria swath propioa pilaketan
bere pilaketan markoa propioa, eta, beraz, hitz egiten.
Era berean, 32 ints horiek bit esleitzen.
Horietako bat, eta b deitu gertatzen da, baina hori erabat arbitrarioa da.
Deitu daiteke edozein izanda ere nahi, baina zer gertatzen da nagusiak
deiak swap hau 1 hartzen du, kopia bat han jartzen, kopia bat jartzen du.
>> 1 swap tokiko beste aldagaia da, baina, deitu zer? >> Tmp.
Aurkitu, eta, beraz, neure burua ematen dit beste 32 bit hemen utzi,
eta zer ez egin funtzio honetan I?
Int tmp lortzen, eta, beraz, du 1 esan dut, beraz, hau egin nuen adibide honetan azken aldiz jokatu dugu.
Ondoren lortzen b, beraz, b 2, eta, beraz, gaur egun hau bihurtzen da: 2,
eta gaur egun b lortzen temp, beraz, temp 1
beraz, gaur egun b bihurtzen da.
Hori handia da. Lan egin.
Baina orduan bezain laster, funtzioak
swap memoria eraginkortasunez desagertzen beraz, berrerabili daiteke
etorkizunean beste funtzio batzuk, eta nagusietako bat da, jakina, erabat aldatu gabe.
Funtsean, arazo hau konpontzeko modu bat behar dugu,
eta, azkenik, gaur egun hau egiten Horren bidez, modu bat izan dugu
zerbait erakuslea izeneko aurkeztu ahal izango dugu.
Bihurtzen da, arazo hau konpondu ahal izango dugu
x eta y kopiak ez pasa
baina zer pasatu ordez, ez, uste duzu swap funtzioa?
Bai, helbide buruzko zer?
Ez dugu benetan helbide buruzko xehetasun askoz ere hitz egin zuen,
baina arbel hau nire ordenagailuko memorian adierazten badu
zalantzarik gabe izan dugu bytes nire RAM zenbakikuntza
eta esan byte # 1 da, hau da, byte # 2 # 3 byte
byte # 4 byte # ... 2 milioi daukat 2 RAM gigabyte bada,
beraz, zalantzarik gabe izan dugu batzuk zenbakitze arbitrarioak eskema
nire ordenagailuaren memoria banakako bytes guztiak.
>> Zer ordez bada swap deitzen I
x eta y kopiak gainditu baino
zergatik ez x helbidea hemen ordez igaroko da,
y helbidea hemen, funtsean posta helbidea
Ondoren, x eta y swap delako, baina informatuta
x eta y memoria helbidea,
ondoren, trukatu, entrenatu dugu berarekin pixka bat,
potentzialki helbidea gidatuko izan zuen, eta, beraz, hitz egiten,
x, eta bertan kopurua aldatzeko, eta gero y helbidea gidatu
zenbakia aldatu bitartean, nahiz eta ez benetan balio horiek berak kopiak,
beraz, nahiz eta hitz honi buruz nagusia memoria bezala
eta hau ari swap memoria indartsu eta C zati arriskutsua
funtzio edozein memoria ukitu edozein ordenagailuan,
eta hau indartsua da oso fancy gauza egin dezakezu ordenagailua C. programak
Arriskutsua da dezakezu ere hondatzeko oso erraz.
Izan ere, egun hauetan programetan modu ohikoena bat ustiatu ahal izateko
oraindik programatzailea ez egiteko konturatzen
zuen datuak bat egitea ahalbidetzen
helburua ez zen memoria kokalekua idatzi behar da.
>> Esate baterako, bere 10. Tamaina array bat adierazten
baina gero, ustekabean array hori memoria 11 byte jarri saiatzen da,
eta memoria zati ez diren baliozko ukitu hasten zara.
Just contextual honetan, batzuk baliteke jakin
software askotan galdetzen serie zenbakiak, edo izena emateko gakoak,
Photoshop eta Word eta programa hau atsegin dute.
Existitzen arrailak, batzuk bezala ezagutzen, online programa txiki bat exekutatu ahal izango duzu,
eta voila, serie-zenbakia eskaera gehiago ez.
Nola lan?
Kasu askotan, gauza horiek, besterik gabe, ordenagailu aurkitzeko
ordenagailuaren zeroen eta bai testu-segmentu
non funtzio hori non serie-zenbakia eskatu da,
eta espazio hori guztia "" gainidatziko duzu, edo programa exekutatzen ari den bitartean
irudikatu dezakezu gakoa da benetan non gordetzen
zerbait izeneko araztaileak erabiliz, eta software modu crack dezakezu.
Hau ez da, hori da gure helburua esan hurrengo bi egun,
baina oso mundu real-Adar askoko du.
Hori gertatzen da software lapurreta inplikatzeko,
baina ez da makina osoa konpromisoa ere.
>> Izan ere, webgune egun horiek ustiatzen
eta arriskutsua eta datuak leaked eta pasahitzak lapurtzen dira
hau askotan oso bat memoria kudeaketa txarra dagokio,
edo, datu-base kasuan, porrota aurrea
adversarial sarrera, horrela gehiago datozen asteetan,
baina orain kalteak sort preview Sneak ahal izango duzu
ez da gauzak nola kanpaia azpian lan ulertzeko.
Dezagun zergatik hori hautsi ulertzeko
tresna bat duten, gero eta gehiago erabilgarria izango da
gure programak lortu konplexuagoak.
Horrela urrun denean zure programaren akats bat izan duzun
nola joan arazteko buruzko duzu?
Zein da zure teknika izan dira, beraz, orain arte, zure TF ez irakasten
edo, besterik gabe, autodidakta?
[Student] printf.
Printf, eta, beraz, printf du ziurrenik zure laguna izan duten ikusi nahi izanez gero
zer gertatzen da zure programa barruan
jarri besterik ez duzu printf hemen, printf hemen, printf hemen.
Ondoren, exekutatu, eta stuff sorta pantailan oso bat lortuko duzu
ondoren ondorioztatzea zer da benetan okerra zure programa erabil dezakezu.
>> Printf joera oso indartsua gauza bat izango da,
baina oso eskuzko prozesu bat da.
Printf bat jarri hemen duzu, printf hemen
eta jartzen baduzu begizta baten barruan 100 lerro dezakezu
irteera orduan duzu sift bidez.
Ez da programa arazteko user-friendly edo oso mekanismo interaktiboa,
baina zorionez ez badago alternatiba.
Programa bat, esate baterako, deitu GDB, GNU Debugger,
nola erabiltzen duzun arcane txiki bat da.
Txiki konplexu bat da, baina Egia,
gauza horiek non aste honetan jarri da, eta hurrengo
GDB antzeko zerbait ulertzeko aparteko ordu
gordetzeko aukera izango da, ziurrenik ordu hamarnaka epe luzera,
horrela, utzi dizu me gauza hau nola funtzionatzen teaser bat.
>> Nire terminal-leiho batean nago.
Dezagun aurrera eta programa hau, buggy3 konpilatu.
Dagoeneko da data.
Dezagun exekutatu niri bezala, berriz, atzera egin dugu, eta, hain zuzen ere, hautsi.
Baina zergatik da hau? Agian dena izorratu nuen swap funtzioa.
Agian eta b da. Ez dut nahiko mugitu inguruan behar bezala.
Dezagun aurrera eta hau egin.
Baino aski da buggy3 utzi ordez exekutatu me programa GDB,
eta kontatzeko buggy3 exekutatu noa,
eta besteak beste, komando-lerroko argumentu, Tui noa,
eta hau jarri dugu zehaztapenak etorkizuneko arazoak gogorarazteko.
Eta orain, zuri-beltza eta interfaze hau popped sortu hori, berriz,
pixka bat jasanezinak lehen ez da hori guztia delako
Hemen bermerik behera informazioa, baina, gutxienez, zerbait ezagutzen.
Leihoaren goiko, nire benetako kodea da,
eta joan I bada hemen utzi joan nire fitxategia goiko Oso me,
eta, hain zuzen ere, ez da buggy3.c, eta oharra leiho honen behealdeko
GDB galdera hau egin behar dut.
>> Hau ez da nire normal John Harvard gonbitean bezala.
Gonbitean bat GDB kontrolatzeko me ahal izateko.
GDB araztailea da.
Araztaileak ibiltzeko aukera ematen dizu programa bat da
zure programa-line exekuzioa lerroz lerro,
Bidean ezer nahi programa egiten batera,
are funtzio telefonora deituz, edo bilatzen, are garrantzitsuagoa dena,
hainbat aldagai balio.
Dezagun aurrera, eta hori egin.
Aurretik joan eta GDB en gonbitean run idatzi dut,
beraz, idatzi dut exekutatu pantaila behealdeko ezkerreko nabarituko,
eta sakatu dut sartu, eta zer egin horretarako?
Ran literalki nire programa, baina ez nuen benetan ikusi hemen askoz joan
dut ez delako benetan esan araztailea
bereziki denbora une batean gelditu.
Just run idazten programa exekutatzen da.
Benetan, ez dut ezer ikusi. Ezin dut manipulatzeko.
>> Horren ordez utzi Horretarako me.
At GDB galdera hau utzi ordez idatzi me emateko, sartu.
Hori ez da zer idatzi esan nahi dut.
Dezagun ordez idatzi break nagusia.
Beste era batera esanda, zerbait izeneko etendura bat ezarri nahi dut,
egokiekin izendatzen den edo apurtu delako eteteko
leku jakin hori zure programaren exekuzioa.
Main nire funtzioaren izena da.
Oharra GDB pretty smart da.
Hurrena nagusia gertatzen den gutxi gorabehera hasteko line 18
buggy3.c, eta gero konturatu hemen goiko ezkerreko
b + line 18 hurrengo.
Hori me gogoraraziz etendura ezarri dudan line 18.
Oraingo honetan run idatzi dut, nire programa exekutatzen noa
arte etendura hori hits,
beraz, programa me eteteko line 18.
Hemen, gara exekutatu.
Ez da ezer gertatu agertzen dute, baina beheko oharra utzi
hasierako programa, buggy3, 1 etendura nagusian buggy3.c line 18.
Zer egin dezaket orain?
>> Iragarki hasteko inprimatu bezalako gauzak idazten dut,
ez printf, inprimatu x, eta gaur egun hori da arraroa.
$ 1 besterik ez da jakin-mina, ikusten dugu
aldi bakoitzean zerbait inprimatu berri bat $ balioa lortuko duzu.
Hori da, beraz, atzera duzula erreferentzia badaezpada aurreko balioak,
baina orain zer inprimatu me kontatzea da x balioa istorioa Puntu honetan
itxuraz 134514032.
Zer? Non zuen ere etorri?
[Inaudible-ikaslea]
Izan ere, hau da, zer da zabor balio bat deitu dugu, eta ez dugu honi buruz hitz egin gabe,
baina arrazoia hasieratu duzula aldagai
da, jakina, beraz, nahi duzu horietako batzuk balio dute.
Baina harrapatzen duen aldagai gogoratzen deklaratu ahal izango da
nuen, duela une bat bezala nire Adibidez sigma
benetan balio bat emanez gabe.
Gogoratu zer egin nuen hemen sigma.
N deklaratu nuen, baina zer balio zuen ematen dut?
None, bazekien dudalako datozen lerro
GetInt zaindu n barruan balio bat jarriz arazoa.
>> Baina istorioa line 11 puntu honetan
eta lerro 12 eta 13 lerro eta 14 lerro
duten hainbat lerro zehar n balioa zer da?
C ez besterik ez duzu ez dakit.
Da, oro har, zenbait zabor balioa, erabat ausazko zenbaki batzuk
utzi baino gehiago funtsean, batzuk aurreko funtzioa
ondoren exekutatu da, beraz, zure programa exekutatzen
gogora ekarri funtzioa funtzioa, funtzio, funtzio lortzen.
Fotograma horiek guztiak jarri get memoria, eta, ondoren, duten funtzio bueltan,
eta bezala suggested Eraser, azkenean, beren memoria berrerabili dut.
Beno, eta, beraz, besterik ez da x aldagaia hori gertatzen da programa honetan
badirudi jasotako 134514032 atsegin dute balio zabor batzuk
batzuk aurreko funtzioa, ez dut idatzi.
Zerbait eraginkortasunez dator sistema eragilea izan daiteke,
kanpaia azpian funtzio batzuk.
>> Ados, fina, baina utzi gaur egun hurrengo lerroan aurrera.
Idatzi dut nire GDB gonbitean "next" bada, eta sartu hit I,
nabarituko dela mugitzen da nabarmenduz line 19,
baina logikoa inplikazioa da 18 lerro horretan
gaur egun amaitu exekutatzean, hala bada berriz idatzi dut "print x"
Behar dut orain, 1, eta, hain zuzen ere, egin dut.
Berriz ere, $ stuff GDB duzu gogoraraziz modu bat da
grabatuak historia duzula egin.
Orain aurrera eta inprimatu y me utzi, eta, hain zuzen ere, y balioa batzuk crazy da baita,
baina big aurre ez line 19 buruz esleitzeko Oraindik dugulako
2 balioa, eta, beraz, "next" idatzi me berriro.
Eta orain printf line on Oraindik dugu.
Inprimatu x do me.
Let inprimatu y do me. Egia, hau inprimatzeko apur bat nekatuta nago.
Idatzi ordez me "display x" eta "display y,"
eta une bakoitzean etorkizunean komando bat idatzi nuen
I gogorazi nahi zaie, x eta y, zer da zer izango x eta y, x eta y.
>> I ere, bat alde batera utzita, mota "info locals."
Info komando bat berezia da.
Locals esan nahi du me erakusten du aldagai lokalak.
Badaezpada, edo ahaztu dut zoro bat, funtzio korapilatsu
I edo beste norbaitek idatzi info locals esango dizu
zer dira, tokiko funtzio honen barruan aldagai tokiko guztiak
baliteke duzula nahi duzun ikutu zaintzeko.
Orain, printf exekutatu behar da, eta, beraz, utzi Animatu eta idatzi me "hurrengo".
Ingurumena honetan Oraindik ez delako ari gara benetan ikusten
exekutatu behera hemen, baina apur bat Kudeatutako lortzean hemen da nabarituko.
Baina konturatu pantaila gainidazteko da bertan,
beraz, ez da perfektua programa hemen, baina ados naiz ni beti delako Poke inguruan
inprimatu nahi badut.
>> Dezagun hurrengo berriro idatzi, eta, orain, hemen parte interesgarria da.
Y 2 istorioa Puntu honetan da, eta x 1,
iradoki hemen, eta, berriro ere,
arrazoia hau da automatikoki bistaratzeko erabiltzen dut komandoa duelako
display x eta display y, beraz, une idatzi dut hurrengo
x eta y teoria truka izan behar du.
Orain, badakigu hori ez da kasua izango da,
baina une batean ikusi dugu nola murgiltze sakonago dezakegu irudikatu zergatik da hori egia.
Ondoren, eta zoritxarrez, y oraindik 2 eta x da oraindik 1, eta berretsi bezain dezaket.
Inprimatu x, y inprimatu.
Izan ere, ez da aldaketa benetan gertatu da, eta, beraz, utzi hasiko honetan zehar.
Begi bistakoa da swap hondatuta dago.
Dezagun ordez idatzi "run" berriro.
Demagun baietz me, hasieratik berrabiarazi nahi dut, idatzi.
>> Orain atzera line 18 naiz.
Orain konturatu x eta y dira zabor balioak berriro.
Ondoren, hurrengo, hurrengo, hurrengo.
Lortu dut aspertzen bada ere ezin dut idatzi n etorkizunean.
Karaktere-sekuentzia laburrena posible laburtu ahal izango duzu.
Swap dago orain hautsita.
Dezagun dive, beraz, ordez hurrengo idatziz,
urratsa idatzi dut, beraz, barruan dut hurrats funtzio honen
horrela barrena oinez I, step sakatu eta, ondoren, idatzi, beraz.
Iragarki nabarmenduz jauzi behera nire programa txikiagoa line 36.
Orain zer aldagai lokalak?
Info locals.
Ezer ez besterik ez oraindik Nik ez dugulako lerroa ahaztuak,
beraz, goazen Animatu eta esan "hurrengo".
Orain tmp, inprimatu tmp izan dirudi dugu.
Garbage balioa, ezta? Baietz uste dut.
Nola buruz inprimatu inprimatu b, 1 eta 2?
Une batean, ahalik eta azkarren idatzi dut hurrengo berriz
tmp 1 balioa hartu, zorionez,
tmp esleitutako balioa joan delako.
>> Dezagun, inprimatu b inprimatzeko ez,
baina orain tmp inprimatu, eta, hain zuzen ere, 1.
Dezagun hurrengo do me. Dezagun hurrengo do me.
Swap funtzioa amaitu dut.
Naiz oraindik barruan line 40, eta, beraz, utzi inprimatzeko me,
inprimatu b, eta ez dut axola zer tmp da.
Swap da zuzena bezala orduan eta b aldaketa dirudi.
Baina orain badut idatzi ondoan, atzera salto egin dut line 25,
eta, jakina, mota y x eta inprimatu badut
Oraindik ez da aldatu, beraz, ez dugu arazoa konpondu.
Baina diagnostikoan orain agian GDB programa honen
gutxienez dugu ahaztuak urrats bat ulertzeko hurbilago
Zer gertatzen da zaborrik gure kodea printf jarri beharrik gabe,
printf hemen printf hemen, eta, ondoren, exekutatzen ari da behin eta berriro
zer oker joan irudikatu nahian.
>> Aurrera joan eta irten hau guztiz irten batera noa.
Ondoren esan, "Irten hala ere?" Bai.
Orain itzuli naiz nire gonbitean normal, eta egin dut GDB erabiliz.
Bat alde batera utzita, behar ez baduzu, hau-Tui Ez erabili.
Izan ere, alde izanez gero, funtsean, lortuko duzu beheko pantailaren erdia.
Dut gero idatzi bada break nagusia eta, ondoren, exekutatu
Oraindik ezin dut nire programa exekutatu, baina zer egingo da, textually
show me uneko lerroa ko denbora batean.
Tui, textual erabiltzaile-interfazea,
erakusten dizu programaren behin, hau da, ziurrenik pixka bat kontzeptualki errazagoa.
Baina, hain zuzen ere, besterik gabe, ez dut hurrengo, hurrengo, hurrengo,
naiz eta aldi berean lerro bat ikusteko joan, eta benetan nahi izanez gero, zer ari den gertatzen
Zerrenda idatzi ahal izango dut, eta lerro inguruko sorta osoa ikusteko.
>> Bideo bat ikusi duzun arazoa ezartzen du 3. Eskatu ditudan dugu
Nate estaltzen GDB-intricacies batzuk,
eta hau gauza horietako bat da, zintzotasunez, non ehunekoa ez-hutsala batzuk
GDB ez da inoiz ukitu, eta hori txarra izango da
literalki amaitzeko sortu duzulako denbora gehiago gastua geroago seihileko honetan
behera jarraitzen bugs gero nahi duzun hori ordu erdi / ordu jarri bada
aste honetan eta hurrengo ikaskuntza GDB eroso.
Printf zure laguna izan zen.
GDB behar orain zure laguna izan.
>> GDB edozein galdera?
Eta hemen zerrenda azkar bat da indartsua eta erabilgarria komandoak batzuk.
Bai. >> Kate bat inprimatzeko duzu?
Ezin kate bat inprimatzeko duzu? Absolutely.
Ez du zenbaki osoen izan nahiko luke.
Aldakorra s kate bat inprimatu s mota bada.
Erakutsiko dizu zer katea aldagaia dela.
[Inaudible-ikaslea]
Helbidea eta katea bera emango dizu.
Duzu, bai erakutsiko ditu.
Eta azken gauza bat, besterik gabe, horiek onak dira ere jakin nahi duelako.
Backtrace eta markoaren, murgiltze hau azken aldiz sartu me,
berean GDB programa zehatza.
Dezagun aurrera eta erabiltzaile-interfazearen bertsioa textual exekutatu,
apurtu nagusia.
Dezagun aurrera eta berriro exekutatu. Here I am.
Orain hurrengo, hurrengo, hurrengo, hurrengo, hurrengo me, step, idatzi.
>> Eta orain, suposatzen dut orain swap en nahita, baina nago atsegin dut "Damn, x balioa zer zen?"
Ezin dut egin x jada.
Ezin dut egin y Esparru Oraindik ez direlako.
Oraindik ez dute testuinguruan, baina inolako arazorik gabe.
Backtrace idatzi ahal izango dut.
Hori erakusten du me exekutatu duten une honetan funtzio guztiak.
Hasiera behean, nagusia, lerro nagusi
hemen gure argazkia beheko izanik.
Izan ere, swap da lerro gainetik dago swap gainean memoria izan hemen,
eta itzuli nahi badut nagusira aldi baterako esan dezaket "markoa."
Zein zenbaki? # 1 Main markoa da.
Aurretik joan eta esan dut "frame 1."
>> Orain itzuli naiz nagusian, eta x inprimatu ahal izango dut, eta y inprimatu ahal izango dut,
baina ezin dut inprimatu edo b.
Baina esan badut ezin dut, "Ongi da, minutu bat itxaron. Non izan da swap?"
Dezagun aurrera me eta esan "0 markoa."
Orain itzuli naiz non izan nahi dut, eta bat alde batera gisa,
beste komandoak ere, bada atsegin benetan ari zaren aspertuta Idazteko hurrengo, hurrengo, ondoren, hurrengo
oro har, esan dezakezu gauzak bezala "10 hurrengoa," eta hori egingo hurrengo 10 lerro bidez urratsa.
Ere egin dezakezu, "jarraitu" duzunean, benetan elikatzen sortu bidez hurrats idatzi.
Jarraitu zure programa exekutatu egingo da etenik gabe hits etendura beste arte,
begizta batean edo jaistea behera programan.
>> Kasu honetan, jarraitu bukatu dugu, eta programa amaitu da normalean.
Hau Fancy modu bat, beheko prozesua da.
Just zure programa amaitu da normalean.
Horretan gehiago bideo eta saioak arazteko etorri.
Asko izan zen.
Dezagun gure 5 minutuko break hemen, eta itzuli dugu structs eta fitxategiak.
>> Duzu aste honetan pset, bada dived dagoeneko
banaketa-kodea erabiltzen dugun jakin beharko duzu,
iturburua kodea duzun ditugu abiapuntu, teknika batzuk berriak.
Hain zuzen ere, deitzen struct hitz hori berria sartu dugu, egitura,
beraz, era askotako aldagai pertsonalizatuak sor ditzake.
I / O, fitxategi fitxategi-sarrera eta irteera nozioa ere sartu dugu,
eta hau da beraz, egoera gorde ahal izango dugu.
Scramble taula disc fitxategi batean
beraz, irakaskuntza bekadun modura eta nik ulertzen
zer zure programaren barruan, eskuz jolasteko beharrik gabe joan
Scramble jokoak dozenaka.
Hau egin ahal izango dugu gehiago automatedly.
>> Eta egitura baten ideia hori nahiko sinesgarria arazoa konpontzen.
Demagun programa batzuk ezartzea nahi dugun
nolabait mantentzen pista ikasle buruzko informazioa
eta ikasleek, esate baterako, izan dezake ID bat, izen bat
eta Harvard bezalako leku batean etxe bat, eta, beraz, informazio horiek 3 zuzenak dira
mantendu nahi dugu, eta, beraz, utzi aurretik, joan eta programa txiki bat idazten hasteko,
besteak beste, stdio.h.
Besteak beste, do me cs50.h.
Eta gero, nire funtzio nagusia.
Ez dut traba edozein komando-lerroko argumentuak,
eta hemen ikasle bat izan nahi dut, beraz, esan nahi dut
ikasleak izen bat dauka, beraz, esan nahi dut "izena katea."
Ondoren, ikasle batek ere, ID bat du, beraz, int id esan nahi dut,
eta ikasleen etxe bat du, beraz, esan nahi dut, halaber, "katea etxea".
Ondoren, pixka bat hauek eskatu dut gehiago garbian hau atsegin dute.
Ongi da, orain 3 aldagai dituen ikasle bat irudikatu nahi izan dut, eta, beraz, "ikasle bat".
>> Eta orain, balio horiek populatu nahi dut, beraz aurrera eta antzeko zerbait esan
"Id = 123."
Izena David iritsi.
Demagun etxea Mather iritsi,
eta, ondoren, zerbait egin arbitrarioki printf atsegin dut ("% s,
horren ID% d,% s bizi da.
Eta orain, zer hemen entxufatu nahi dut, bata bestearen ondoren?
Izena, id, etxea; bueltan 0.
Ados, izorratu ezean dut nonbait hemen
Pretty good-programa bat da, ikasle batek gordetzen dugu uste dut.
Jakina, hori ez da interesgarria guztiak. Zer egin behar dut 2 ikasle izatea?
Big aurre ez da. 2 pertsonek onartzen dut.
Dezagun aurrera, eta hau nabarmendu eta joan behera hemen,
eta esan "id = 456" I Rob bezalako norbait Kirkland bizi.
>> Ongi, itxaron, baina ezin dut deitu horiek gauza bera
dut kopiatu behar bezala ikusten da,
beraz esan me horiek Daviden aldagai izango da,
eta horien kopia batzuk get me Rob utzi.
Rob hauek deitu dugu, baina hau ez da lanera joan gaur egun
dudalako itxaron, dezagun aldatu me id1, NAME1 eta house1.
Rob 2 izango da, 2.
Dut hau aldatzeko hemen, hemen, hemen, hemen, hemen, hemen.
Itxaron, zer Tommy buruz? Egin dezagun berriro.
Jakina bada oraindik uste duzu, hau da hori egiteko modu ona da, ez da,
beraz, kopiatu / itsatsi txarra.
Baina hau konpondu Duela aste bat.
>> Zein izan da gure konponbidea datu mota bereko hainbat instantzia izan nahi dugu?
[Ikasleak] array bat.
Array bat, eta, beraz, utzi saiatu me up hau garbitzeko.
Dezagun batzuk niretzat gela goialdean me, eta utzi egin ordez me hau hemen.
Pertsona horiek deitu dugu, eta horren ordez, esan nahi dut "ids int,"
eta orain gurekin 3 onartzen dut.
Esan nahi "katea izenak," eta gurekin 3 onartzen dut noa,
eta gero esan nahi "katea etxeak," eta gurekin 3 onartzen dut noa.
Orain ordez, David eta bere tokian tokiko aldagai hemen
horiek kentzeko ahal izango dugu.
Hori sentitzen ona ari garen honetan garbitzeko.
Esan dezaket, orduan, David [0] eta izenak [0] izango da
eta etxeak [0].
Eta gero, Rob, era berean, hau gorde ahal izango dugu.
Dezagun jarri hau behera hemen, eta, beraz, arbitrarioki ids [1] ditu.
Izenak izan du [1],
eta, ondoren, azkenik, etxe [1].
>> Oraindik apur bat lapurtera, eta orain hau irudikatu behar dut,
beraz, demagun "izenak [0], id [0], etxe [0]
eta dezagun pluralize hau.
Identifikadoreak ids, ids.
Eta berriro ere, egiten ari naiz, eta, beraz, berriro ere, dagoeneko ari naiz berriro / kopiatu itsatsi jo
beraz, odds dira beste irtenbide bat da hemen.
Ziurrenik I garbitu sortu begizta bat edo horrelako zerbait,
beraz, azken finean, pixka bat hobea da, baina oraindik ere sentitzen atsegin
Kopiatu / itsatsi dut jo, baina, nahiz eta hau, diotenez, I,
ez da benetan, batez ere, irtenbide egokia baita
zer erabakitzen dugu noizbait bada zer ezagutzen duzu?
Dira benetan ditugu helbide elektronikoak gordetzeko David eta Rob
eta gainontzeko programa honetan.
Telefono zenbakiak ere gorde behar dugu.
Larrialdi kontaktua zenbakiak ere gorde behar dugu.
Datu-pieza horiek guztiak gorde nahi dugun izan dugu,
beraz, nola egiten duzu?
>> Array beste deklaratzeko duzu goialdean, eta, ondoren, zuk eskuz
helbide elektroniko bat [0], e-posta helbidea [1]
David eta Rob eta abar.
Baina ez da benetan suposizio bat besterik ez diseinu hau azpiko
ohorea dudan sistema erabiltzen duten jakin nahi
[I] hainbat array bakoitzean
besterik ez, beraz, gertatzen da pertsona bera aipatzeko,
[0] ids zenbakia 123 da,
eta izen hori bereganatzeko noa [0]
pertsona beraren izena eta etxe [0]
pertsona bera etxe eta abarren matrizeak sortzen dut hainbat.
Baina ez dagoela funtsezko batzeko ez da
informazioa, id, izena eta etxe pieza 3 artean,
nahiz eta erakunde eredu saiatzen ari gara programa hau ez da array.
Arrayak hau egiteko modu programazioko hau.
Zer nahi dugu gure programa eredua pertsona bat da
David, Rob bezalako pertsona horietatik barruan bezalako
edo izen bat eta ID encapsulating eta etxe bat da.
>> Ezin dugu nolabait adierazteko kapsulatzea ideia hau
Horren bidez, pertsona bat ID bat, izen bat eta etxe bat
eta ez benetan hack jotzea horren bidez dugu
fidatzen bracket zerbait
horiek desberdinak array bakoitzean giza berarentzat aipatzen?
Benetan egin ahal izango dugu hau.
Goiko joan me nagusia orain, eta utzi nire datu-mota sortzeko me
benetan lehen aldiz.
Teknika hau erabiliko dugu Scramble
baina hemen aurretik joan eta datu-mota bat sortu dut,
eta badakizu zer, ikasle edo pertsona deitu noa,
typedef define mota noa.
Hau egitura bat da, esan nahi dut,
eta, ondoren, egitura hori mota ikaslea, esan dugu,
nahiz eta datatua me now txiki bat da.
Esan dugu "int id."
Esan dugu "izena katea."
Ondoren, "katea etxea," esan dugu
beraz, gaur egun kode batzuk lerro hauen amaieran
Irakasten dut clang existitzen dela
ints gain, datu mota bat, kateak, gainera, bikoiztu gain, karroza gain.
>> Denbora line 11 une honetan bezala, ez dago datu-mota berri bat izeneko ikasle,
eta gaur egun edozein lekutan ikasleen aldagai bat deklaratzeko I nahi dut,
beraz hemen behera joan me to pertsona.
Orain kentzeko I, eta joan I behera David hemen
eta David benetan esan dezaket David dela,
literalki izena eman dezakegu aldagai neure burua ondoren,
mota ikaslea izango da.
Txiki hau bitxi bat begiratu daiteke, baina hau ez da hori, hainbat
int bat edo kate bat edo mugikor bat zerbait geratuko.
Beraz, zerbait gertatzen deitzen zaio ikasleari gaur egun,
eta egitura honen barruan zerbait jarri nahi dut
Dute gaur egun I sintaxia pieza berri bat erabili ahal izateko, baina nahiko erraza da,
david.id = 123, david.name = "David" D hiriburua,
eta david.house = "Mather,"
eta, orain, stuff hau kentzeko dut hemen.
Nabarituko dugu orain gure programa benetan askoz hobeto birmoldatu
hori gaur egun gure programa benetako mundua islatzen.
>> Ez dago benetako pertsona bat edo ikaslea ideia-mundu bat da.
Hemen dugu orain C pertsona bat edo gehiago bereziki ikasle baten bertsio bat.
Pertsona horren Inside ezaugarri hauek garrantzitsuak dira,
ID, izena eta etxea, eta, beraz, Rob funtsean gauza bera bihurtzen behera hemen,
ikaslea rob, beraz, eta, gaur egun, = 456 rob.id
rob.name = "Rob".
Izan ere, aldagai deritzo Rob zentzugabeak moduko da.
Deitu genezake x edo y edo z.
Izendatu besterik ez dugu semantikoki koherentea izan Rob da,
baina benetan izena da barruan, eremu horretan bertan,
beraz, gaur egun hau dut.
Honek ere ez du horretan gogor Nik kodetuta David diseinu onena bezala sentitzen.
Gogor Nik kodetuta Rob.
Eta oraindik kopia batzuk jotzea eta aldagai berriak nahi ditut bakoitzean denbora itsatsi.
Gainera, itxuraz ematen aldagai horietako bakoitzak izen bat behar dut,
nahiz eta askoz ere nahiago dut deskribatzeko aldagai horiek
oro gisa gehiagotan ikasleak.
>> Orain duten ideiak ongi Gurekin lan batu ahal izango dugu.
eta horren ordez, esan, "Badakizu zer, emaidazu aldakorreko izenekoa ikasle,
eta dezagun dituzte tamaina 3 ", beraz, gaur egun birfin hau gehiago,
eskuz izendatu David kentzeko,
eta horren ordez, ikasleek antzeko zerbait esan dezaket [0] hemen.
Esan dezaket, orduan ikasle [0] hemen,
ikasleak [0] hemen, eta abar, eta I joan daiteke inguruan
garbitu eta hori sortu Rob.
Ere izan dut, orain agian begizta bat gehituz joan
eta benetan balio hauek erabiltzaileak, GetString eta GetInt erabiliz.
Konstante bat gehituz joan izan dut hau txarra da, oro har, baita praktika
3 gogor kodea bezalako zenbaki arbitrarioak hementxe batzuk
eta, ondoren, gogoratu 3 ikasle baino gehiago jarri beharko luke.
Ziurrenik izango litzateke hobeto # define nire fitxategiaren goialdean
faktorea dela, eta, beraz, hain zuzen ere, aurrera eta hau orokortu.
>> Dezagun adibide bat ireki me gaur egungo artean
adibide lehenago, structs1.
Osoagoa # define Hemen erabiltzen duen programa bat da
dio 3 ikasle default goaz.
Hemen ikasle klase bat merezi naiz geratuko,
ikasleek ikasgelan, beraz, eta orain loop bat erabiltzen dut
kodea apur bat gehiago dotorea egiteko, populatu klase
erabiltzailearen sarrera, eta, beraz, 0 = i batetik bestera joateko ikasleek, hau da, 3.
Eta gero, bertsio honetan erabiltzaileari galdetuko dut
ikaslearen ID, eta I GetInt.
Zer da ikaslearen izen-abizenak, eta, ondoren, GetString duten I.
Zein da ikaslearen etxea? I GetString.
Eta gero, behean hemen erabaki dut aldatu
hauek nola naiz inprimatzeko eta benetan loop bat erabili,
eta nor naiz inprimatzeko?
Iruzkina arabera Mather edonork dut inprimatzea,
eta hori izan da Rob eta Tommy beraz, eta abar-benetan Tommy Mather.
Tommy eta David kasu honetan izango litzateke inprimatuta, baina nola lan?
Ez dugu funtzio hau ikusi aurretik, baina zer hau da, etxebizitza bat hartu.
Konparatzen kateak.
>> Apur bat ez-bistako da nola kateak konparatzen bihurtzen da delako
itzultzen du 0 bada horrek esan nahi du kateak berdinak dira.
Itzultzen du -1 bat bada, horrek esan nahi du alfabetikoki dator bat bestea baino lehen,
eta itzultzen du +1 bada beste hitz esan nahi du datorren alfabetikoki
aurretik, eta begiratu online edo man orrialdean dezakezu
zehazki modu bat da hori, baina hori guztia gaur egun egiten da, esaten da
[i]. etxea da "Mather" berdina bada
gero aurrera eta inprimatu, beraz, eta, beraz, Mather da.
Baina hemen zerbait ez dugu ikusi aurretik, eta itzuli dugu hau.
Ez dut gogoratzen inoiz Horretarako nire programak edozein izatea.
Free da itxuraz: memoria, aipatuz memoria askatzeaz,
baina zer memoria am begizta honetan itxuraz programa honen behealdeko libre uzten?
Dut pertsona baten izena bezala askatzeaz dirudi
eta pertsona baten etxea, baina zergatik da hori?
>> Bihurtzen da aste horiek guztiak izan duzula GetString erabiliz
mota dugu bug bat sartzea, behin zure programak batean.
Diseinu esleitzen memoria GetString, beraz, kate bat itzuli,
David bezala, edo Rob, eta ondoren egin dezakezu nahi duzuna
hori zure programa katea dugu gordeak memoria dugulako.
Arazoa denbora hori guztia denbora GetString deitu bakoitzean
dugu, GetString egileek, izan dira sistema eragilearen eskatuz
ezagutzera emango RAM apur bat kate honetan.
Emaiguzu RAM apur bat hau hurrengo Kate.
Emaiguzu batzuk gehiago hurrengo kate honen RAM.
Zer programatzailea, inoiz ez dira egiten
emango digu memoria-back hori,
beraz, zenbait aste hauetan programak guztiak, idatzitakoa
izan dute zer izeneko memoria horren bidez, jauzi bat erabiliz mantentzen dute
gero eta memoria gehiago aldi bakoitzean GetString deitu, eta hori fina.
Nahita egiten dugu, lehen asteetan ez delako interesgarria dela
non katea da datozen kezkatu.
Nahi duzun guztia gertatzen da, hain zuzen ere, hitza Rob itzuli erabiltzaile mota sartu
>> Baina aurrera gaur egun honi buruz gehiago sofistikatu hasteko.
Edonoiz memoria esleitu dugu azkenean hobeto entregatu dugu berriro.
Bestela, zure Mac edo PC mundu errealaren noizean behin esperientzia izan dezakezu
sintomak non ordenagailua gelditu azkenean artezketa
edo ergelak spinning hondartza (e) k besterik ez da ordenagailuaren okupatuko
arreta osoa eta ezin gauzak.
Bugs kopuru edozein daiteke azaldu, baina horiek ahalik eta bugs artean
deitzen dira gauzak memoria ihesak horren bidez norbait software pieza idatzi
memoria libratzeko ez gogoratzeko erabiltzen ari zaren
zuen galdetu sistema eragilea,
ez GetString erabiliz, CS50 gauza bat delako, baina antzeko funtzioak erabiliz
eskatzen memoria sistema eragilearen.
Edo hondatzeko bada, eta inoiz ez benetan itzultzeko memoria hori
diren programa bat motelduz, eta slows eta moteldu sintoma bat izan daiteke
gogoratu free deitzeko ezean.
>> Itzuli dugu noiz eta zergatik deitu nahi duzun,
baina dezagun aurrera neurri ona eta saiatu bereziki programa hau abiarazi.
Deitzen zen structs1, sartu.
Dezagun aurrera eta exekutatu structs1, 123, David Mather,
456, 789, Rob Kirkland
Tommy Mather, eta David-en ikusiko dugu Mather, Tommy Mather.
Apur bat behatu kontrol-programa lan hori.
Orain, zoritxarrez, programa hau da, pixka bat horretan frustrating
Lan hori guztia ez dut 9 kateak hainbat idatzi, sakatu sartu,
izan zen esan Mather izan zen, eta, hala ere, jakina, Mather zen dagoeneko idatzi dut delako banekien.
Gutxienez nice litzateke programa hau datu-base bat bezala gehiago bada
eta gogoratzen da benetan zer idatzi dut
beraz, berriro inoiz ez dut sarrera ikaslea erregistro horiek.
Agian da sistema bat registrarial bezala da.
>> Hau egin ahal izango dugu, I / O, fitxategi fitxategi-sarrera eta irteera gisa ezagutzen den teknika hau erabiliz,
fitxategiak irakurri edo idatzi fitxategiak nahi duzun edozein unetan esaten Oso modu generic
zenbait funtzio multzo bat egin ahal izango duzu.
Dezagun aurrera me eta adibide structs2.c hau ireki
hau da, ia-ia berdinak, baina zer ez gaur egun ikus dezagun.
Fitxategia goialdean ikasle klase bat deklaratzen dut.
Erabiltzailearen sarrera klase populatu ondoren I
beraz, kode lerro horiek zehatz-mehatz nahi aurretik.
Ondoren, joan I erorita badago hemen inprimatu guztioi Mather da arbitrarioki nahi baino lehen,
baina hau ezaugarri berri interesgarri bat da.
Kode lerro hauek berriak dira, eta zerbait aurkeztu dute hemen,
FITXATEGIA, txanoak guztiak, eta * du hemen baita.
Dezagun hau mugitu me hemen, * hemen baita.
>> Funtzio hau ez da ikusi ditugu aurretik, fopen,
baina fitxategia esan nahi du irekita, eta, beraz dezagun gaingabetuak horien bidez,
eta hau da zerbait itzuli dugu psets etorkizuneko
baina lerro hau hemen, funtsean, datu-basea izeneko fitxategi bat irekitzen du
eta irekitzen berariazko modu bat da zer egin dezake, hala nola?
[Inaudible-ikaslea]
Eskuin, eta, beraz, "w", besterik gabe esan nahi du sistema eragilea, kontatzea
fitxategi hau ireki dut idatzi.
Ez dut nahi, irakurtzeko. Ez dut nahi begiratu besterik ez da.
Aldatzeko eta stuff gehitu potentzialki nahi dut,
eta fitxategi izeneko datu-basean.
Deitu behar izan ezer.
Database.txt izan daiteke. Izan daiteke. Db.
Hau foo bezalako hitz bat izan daiteke, baina aukeratu zuen, arbitrarioki I fitxategia datu-basean izena.
Apur bat behatu check itzuli garela etorri egingo zehaztasun handiz denborak aurrera egin ahala,
LH, erakuslea fitxategi bada, ez du horrek esan nahi du berdintasuna NULL guztiak ongi dago.
>> Long Narrazio laburren, fopen bezala funtzio batzuetan huts egin.
Agian fitxategia ez da existitzen. Agian disko leku Oraindik duzu.
Agian ez duzu baimenik karpeta horretan,
beraz bada fopen null zerbait txarra gertatu itzultzen.
Aitzitik, fopen ez badu itzultzeko null guztiak ongi
eta hasi fitxategi hau idazten dut.
Hona hemen beste trikimailu bat da.
Begizta bat baino gehiago errepikatzean nire ikasle bakoitzak,
eta antzeko itxura, beraz, zer egin dugu aurretik,
baina funtzio hau printf fitxategi printf fprintf izeneko lehengusu bat da,
eta 2 bakarrik modu desberdina da.
One, ordez p f hasten da,
baina gero, bere lehen argumentua da itxuraz zer?
[Ikasleak] fitxategia. >> Fitxategi bat da.
Izeneko gauza hau LH, azkenean dugu tease gain fitxategi erakuslea da,
baina orain LH besterik ez dut ireki fitxategia adierazten du,
fprintf hemen erabiltzaile hau inprimatu fitxategi ID esaten, ez pantailan.
Inprimatu erabiltzailearen fitxategi izena, ez pantaila
fitxategia, ez da pantailan, eta, ondoren, behera hemen, jakina, etxea,
fitxategia itxi, eta gero behera hemen memoria libre.
>> Bertsio honetan 2 eta version 1 arteko desberdintasun bakarra
fopen sarrera eta * FITXATEGIA hau da
eta fprintf nozioa, beraz, zer da azken emaitza.
Utzi nire terminal leiho me.
Structs2 exekutatu me, sartu.
Looks guztiak ongi bezala. Dezagun berrabiarazi structs2.
123, David Mather, 456, Rob Kirkland,
789, Tommy Mather, sartu.
Looks portaera bera bezala, baina orain ez dut bada ls
nabarituko zer fitxategia hemen da nire kode guztien artean, datu-basea,
beraz, datu-base gedit, eta begirada ireki.
Fitxategi-formatuak ez da sexiest.
Benetan datuak pieza lerro bakoitzeko lerro bakoitzeko lerro bat,
baina duzun Excel edo CSV fitxategiak erabiltzen dutenen artean, komaz bereiztutako balioak,
Nuen, zalantzarik gabe erabili dute fprintf ordez agian honen antzeko zerbait egin
Excel fitxategi bat baliokidea beraz, benetan izan dut sortu
gauzak banantzen koma, ez bakarrik ildo berriak.
>> Kasu honetan nuen ordez erabiltzen bada koma lerro berriak ordez
Literalki izan dut hau Excel datu-base fitxategia ireki ordez egin nuen gero begiratu hau atsegin dute.
Azken finean, gaur egun dugun fitxategiak idaztea
has dezakegu persisting datuak mantenduz inguruan Diskoko
beraz, informazio gorde ahal izango dugu, behin eta berriro inguruan.
Ohartu, orain pixka bat gehiago ezagutzen diren beste gauza pare bat.
C fitxategi honen goialdean typedef dugu
nahi izan dugu, datu-mota bat sortzeko hitz bat adierazten du delako,
beraz mota honetako deritzo hitza, eta honen barruan egitura
apur bat fancier da orain.
Zergatik hitz bat osatzen da, itxuraz array bat?
Zer da hitz bat intuizioz?
>> Karaktere array bat da.
Karaktere-sekuentzia bat da Itzuli.
Txanoak guztietan CARTAS gertatzen esan arbitrarioki dugu gehienezko luzera
dictionary Scramble erabiltzen ari garen edozein hitz.
Zergatik +1 behar dut?
Karakterea nulua.
Gogoratu Bananagrams Adibidez genuen balio berezi bat behar dugu
hitzaren amaieran ordena pista mantentzeko
non hitz benetan amaitu, eta arazo multzo zehaztapen dio
Hemen emandako hitza boolear bat lotzen ari gara,
Ez, beraz, hitz egiteko, egia edo gezurra.
Dute hitz hau aurkitu duzu dagoeneko, konturatzen garelako
benetan behar dugu gogoratzeko modu bat ez da bakarrik hitz bat Scramble
baina ala ez duzu, giza, aurkitu du
beraz, hitz egiten aurkituko dituzu izanez gero, "" ezin duzu idatzi, idatzi, idatzi, idatzi
eta 3 puntu, 3 puntu, 3 puntu, 3 puntu lortu.
Hitz zerrenda beltza boolearra ezarriz gai izan nahi dugu
eta egia duzun dagoeneko aurkitu du, eta, beraz, hori zergatik egiten dugun
kapsulatuaren egitura honetan.
>> Orain, behera hemen Scramble izeneko beste hiztegi eta egitura hau.
Absenteak hemen hitza typedef kasu honetan delako
hiztegi baten ideia enkapsulatu behar dugu,
eta hiztegi bat hitz sorta osoa dauka,
array hau engaiatuko, eta nola hitz horiek asko daude?
Beno, edozein izeneko hau aldakorra tamaina dio.
Baina besterik ez dugu behar hiztegi bat.
Ez dugu behar izeneko hiztegi datu-mota bat.
Besterik ez dugu behar horietako bat, beraz, bihurtzen da C
ez baduzu, esan typedef, esan besterik ez duzu eta egitura, eta, ondoren, kizkur giltza barruan
zure aldagai jarri gero, izena jarri behar duzu.
Aldagai bat izeneko hiztegi geratuko
itxura hau.
Por el contrario, lerro hauek berrerabilgarriak sortzeko izeneko datu egitura hitza
anitz kopiak sor ditzakezula bezala sortu dugu
ikasleek hainbat kopia.
>> Zer esan nahi du, azken finean, egiten uzten digu?
Dezagun atzera me, demagun, errazagoa da adibide bat aldiz errazagoa,
eta utzi ireki me,, demagun, compare1.c.
Arazoa hemen ibili da benetan itzuli zuritu
kate baten geruza eta prestakuntza gurpilak horiek ari
bihurtzen da, kate bat dela denbora hori guztia
aste 1 benetan agindu ezizen bat besterik ez,
sinonimo, zerbait itxura apur bat gehiago críptica liburutegia CS50
char *, eta ikusi dugu star hau baino lehen.
Fitxategiak testuinguruan ikusi dugu.
>> Dezagun zergatik izan dugu zehatz-mehatz hau ezkutatzen denbora pixka bat ikusteko.
Here compare1.c izeneko fitxategi bat da,
eta galdetzen itxuraz erabiltzaileak 2 kateak, s eta t
eta, ondoren, kateak horiek alderatu line 26 berdintasuna saiatzen da,
ari dira eta berdina esaten baldin bada, "gauza bera idatzi duzu,"
Oraindik ez badira berdinak, esaten du "gauza desberdinak idatzi duzu."
Dezagun aurrera eta programa hau exekutatzeko.
Dezagun joan nire iturburu direktorioan sartu Niri, compare1. Ados konpilatu da.
Dezagun compare1 exekutatu me.
Mapan handiago dut, sartu.
Esan zerbait. HELLO.
Zerbait esan dut berriro. HELLO.
Ez dut behin betiko ez idatzi gauza desberdinak.
>> Dezagun honetan saiatu berriro. Bye Bye.
Definitely ez da desberdina, beraz, zer gertatzen da hemen?
Beno, zer da benetan ari line 26 alderatuta?
[Inaudible-ikaslea]
Bai, eta, beraz, kate bat, datu-mota bihurtzen da zuri gezur mota da.
Katea A char * bat da, baina zer da char *?
Char * A, esan bezala, erakusle bat da,
eta erakuslea da helbide bat eraginkortasunez
memoria kokapena batura, eta gertatuko HELLO bezalako hitz batean idatzitako bada,
kate eztabaidak iraganeko gogoratzen
hitza bezala HELLO da.
Gogoratu HELLO bezalako hitz bat irudikatzen daiteke
karaktere array hau atsegin dute
eta, ondoren, bukaeran, karaktere berezi bat izeneko pertsonaia null
\ lu byte irakurtzerakoan gisa.
Zer da benetan kate bat?
Iragarki hau dela memoria zatiak baino gehiago,
eta hain zuzen ere, amaieran ezagun bakarra kate osoan zehar behin
null karaktere berezi bila.
Baina hau nire ordenagailuko memorian memoria zatia bada,
dezagun arbitrarioki esan Kate hori inoiz baino zortea,
eta got nire ordenagailuaren RAM hasieran kokatzen da.
Byte 0, 1, 2, 3, 4, 5, 6 ...
>> Noiz GetString antzeko zerbait esan dut, eta katea s = GetString do I
zer benetan ari itzuli?
Hainbat astez hauek, zer da benetan ari s gordetzen
kate hau berez ez da, baina, kasu honetan, zer gordetzen da
zer GetString benetan ez delako 0 zenbakia
da, fisikoki ez du itzuli kate bat.
Horrek ez du, nahiz eta benetan kontzeptuala zentzua.
Zer bueltan zenbaki bat du.
HELLO memoria helbidea,
eta katea s ondoren, atzera zuritu geruza hau bada, katea ez da benetan existitzen.
CS50 liburutegia sinplifikazio bat besterik ez da.
>> Honek benetan zerbait char * izenekoa da.
Char zentzua hitz bat delako, HELLO bezala?
Beno, bat karakteretan serieak, pertsonaia multzo bat da.
* Char pertsonaia baten helbidea esan nahi du,
beraz, zer du kate bat itzuli esan nahi du?
A nice, kate bat itzultzeko modu sinple
baino gehiago saiatu figura nola itzuli, 5 edo 6 byte I
utzi duen byte helbidea itzultzeko me?
Lehena.
Beste era batera esanda, memorian pertsonaia bat emateko me helbidea.
Horixe adierazten char *, helbidea memoria pertsonaia bakarra.
Dei aldakorreko s hori.
S denda helbidea, jakin esan arbitrarioki I 0 da,
gauza simple mantentzeko, baina errealitatean, oro har, handiagoa da zenbaki bat.
>> Itxaron minutu bat.
Ari zaren besterik ez bada me lehen karaktere helbidea ematea, nola ezagutzen dut zer da helbidea
pertsonaia bigarren, hirugarren, laugarren eta bosgarren?
[Inaudible-ikaslea]
Bakarrik ezagutzen duzu non katearen amaieran handy trikimailu honen bidez,
beraz, zerbait erabiltzen duzun printf bezala, zer printf literalki bere argumentu gisa hartzen du,
gogoratzen erabiliko dugu% s biltegian, eta, ondoren, gainditu duzu
kate bat gordetzeko aldagaia.
Zer da benetan ari zaren pasatzen kate horretako lehen karaktere helbidea da.
Printf ondoren erabiltzen loop edo, berriz, begizta bat helbidea jaso gainean,
esate baterako, 0, beraz Horretarako me now,
printf ("% s \ n");
When I deitzen printf ("% s \ n", s); benetan zer naiz printf emanez
s lehen karaktere helbidea, arbitrarioak kasu honetan, H.
>> Nola ez dakit zer erakutsi pantailan printf?
Duen pertsonak jarri du martxan, printf bitartean loop bat inplementatu edo bat loop
esaten duen pertsonaia hau ez dira berdinak null karaktere berezi?
Hala ez bada, inprimatu. Nola honi buruz?
Ez bada inprimatu, inprimatu, inprimatu, inprimatu.
Oh, hau berezia da. Gelditu inprimatzeko eta erabiltzaileari itzultzeko.
Eta hori da, hitzez hitz guztiak kanpaia azpian gertatzen ari,
eta horrek asko klase baten lehenengo egunean digeritzen
baina orain benetan eraikin guztia ulertzeko bloke
gure ordenagailuaren memoria barruan joan
eta, azkenean, hau tease dugu gain laguntza apur bat
gure lagun bat Stanford at.
>> Irakaslea Nick Stanford Parlante bideo sekuentzia zoragarri honetan egin du
hizkuntza ezberdinetan sartu era guztietako
Claymation pertsonaia Binky txiki honetan.
Buruz Oraindik duzu ahots bat besterik ez gutxi bigarren Sneak preview entzun
Stanford irakasle batek, eta lortzean ari zaren
5 edo 6 segundotan eskubide hori gaur egun,
baina ohar hau horren gainean amaituko dugu
eta asteazkenean hasiko da.
Erakuslea Binky, preview Fun ematen dizut.
[♪ Music ♪] [irakaslea Parlante] Hey, Binky.
Esnatu. Erakuslea fun denbora da.
[Binky] Zer da hori? Erakusleak buruz ikasi?
Oh, GOODY!
>> Asteazkenean ikusiko dugu.
[CS50.TV]