[Powered by Google Translate] [Review] [Quiz 0] [Lexi Ross, Tommy MacWilliam, Lucas Freitas, Joseph Ong] [Harvardeko Unibertsitateko] [Hau da CS50.] [CS50.TV] Hey, guztiontzat. Ongi etorri Quiz 0, hau da, egiten ari Asteazkena hau saio berrikuspena. Zer da gaur gauean egin behar dugu, naiz 3 TFS beste I, eta elkarrekin ikastaroaren zer egin dugu hain urruti berrikuspena baten bidez joan goaz. Ez da% 100 integrala izango du, baina ideia bat hobea eman beharko luke zer dagoeneko baduzu behera eta zer behar duzun Asteazkena aurretik ikasteko. Eta sentitzen free eskua altxatzeko galdera ari gara joan, baina kontuan hartu ahal izango dugun denbora pixka bat ere izan da amaiera- lortuko dugu bada, minutu gutxiren buruan, ordezko-eta, oro har, galderak egin, beraz, mantendu kontuan, eta, beraz, Aste 0 hasieran hasi goaz. [0 Review Quiz!] [Taldea 0] [Lexi Ross] Baina egin aurretik let-en buruz hitz egin galdetegia logistika. [Logistika] [Quiz gertatzen hitzaldi-lieu Asteazkena 10/10] [(Ikus xehetasun gehiagorako http://cdn.cs50.net/2012/fall/quizzes/0/about0.pdf)] da, urriaren 10ean, asteazkena. Asteazkena honetan, eta URL honen baduzu hemen, den ere CS50.net-'s esteka bat besterik ez da non oinarritzen buruzko informazioa ikusi ahal izango duzu zure azken izena edo eskola-afiliazio, baita buruz zehazki zer galdetegiaren eta estali egingo galdera mota iritsi zarela kontatzen du. Gogoan izan ere aukera izango duzula atalean galdetegia berrikusi, beraz, zure TFS praktikan arazo batzuk baino gehiago behar da joan, eta non behar oraindik aztertzeko galdetegia ikusteko beste aukera ona izan da. Dezagun Bits 'n' Bytes hasieran hasiko da. Gogoratu pixka bat, besterik gabe, 0 edo 1, eta byte bat 8 ​​bit horien bilduma bat da. Dezagun bit bilduma hau begiratu hemen. Ahal izango zenbat bit ez dira irudikatu behar dugu. Non gaude zenbatu besterik ez, horietako 8, zortzi 0 edo 1 unitate. Eta ez baitago 8 bit, byte 1, eta dezagun bihurtzeko hamaseitarrean. Hamaseitarra 16 oinarria da, eta nahiko erraza da bihurtu bitarra zenbaki bat, hau da, zer dela, hamaseitarrean zenbaki bat. Egiten dugun guztia da, 4 talde ditugu, eta horiek digitu hamaseitarra egokia bihurtu dugu. 4 talde eskuin-gehienak hasiko gara, eta, beraz, 0011. Hori bat 1 eta 2 izan behar du, eta, beraz, elkarrekin egiten 3. Eta gero dezagun 4 bloke beste begiratu. 1101. Hori bat 1, bat 4, eta 8 bat izango da. Elkarrekin den 13 izango da, eta horrek D. Eta gogoratu hamaseitarrean ez gara joan 0 9 bidez dugu. 0 joango gara F bidez, eta, beraz, 9 ondoren, 10 A corresponde 11 B, et cetera non F 15. Hemen 13 D bat da, beraz, bihurtu hamartarra da egiten dugun guztia dugu benetan 2 botere posizioa tratatzeko bakoitzean. Ko 1, bat 2, zero 4S, zero 8s, bata 16, et cetera, eta pixka bat zaila da zure burua konputatzeko, baina hurrengo diapositiba gara erantzuna ikusi ahal izango dugu hori. Funtsean, eskuineko aurrean ari gara atzera joan ezkerrera, eta, digitu bakoitzak biderkatzailea 2 dagokion boterea ari gara. Eta gogoratu, hamaseitarrean zenbaki horiek adierazteko dugu 0x hasieran beraz, ez dugu nahastu zenbaki hamartar batekin. On jarraituz, hau ASCII taula bat da, eta zer ASCII erabiltzen ditugu karaktere zenbakizko balioak mapatzeko. Kriptografia pset Gogoratu ASCII taula erabilera zabala egin genuen kriptografia hainbat metodo erabili ahal izateko, Caesar eta Vigenère zifratze, letrak desberdinak bihurtzeko Kate batean, erabiltzaileak emandako gakoa arabera. Dezagun begiratu, ASCII matematika apur bat. 'P' + 1 begira, pertsonaia inprimaki Q izango litzateke, eta gogoratu '5 '≠ 5. Eta, zer egingo bihurtzeko 2 forma horien artean dugu? Ez da benetan gogorregi. 5 lortzeko '0 kentzen dugu ' 5 '0 artean leku 'eta '5 ez delako.' Beste modu 0 gehitu besterik ez dugu joan, beraz, sort aritmetika erregular bezala. Just gogoratu zerbait komatxorik inguruan ditu pertsonaia bat da. eta, beraz, ASCII taulan balio bat dagokio. Oro har, informatikako gaiak sartu mugimenduan. Algoritmo bat zer den eta nola programatzen erabiltzen ikasi genuen algoritmoak ezartzeko. Algoritmoak adibide batzuk oso sinplea bezalako zerbait zenbaki bat bakoiti edo bikoitia den ala ez egiaztatzeko. Hori dela gogoratzen zenbakia MOD 2 eta egiaztatu emaitza 0 bada. Hala bada, nahiz da. Hala ez bada, bakoitiak da. Eta hori benetan oinarrizko algoritmoa adibide bat da. Apur bat gehiago parte hartzen bilaketa bitarra da, joan beharko dugu, geroago berrikuspena saio. Eta programazio algoritmo bat hartzeko erabiltzen dugun terminoa da eta ordenagailua kodea bihurtzeko irakur daiteke. 2 programazioaren adibide da Scratch hau da, zer egin Astea 0 dugu. Nahiz eta ez dugu benetan idatzi kodea gauzatzeko modu bat da algoritmo hau, hau da, zenbakiak 1-10 inprimatzeko, eta hemen gauza bera egin dugu, C programazio-lengoaia. Hauek dira funtzionalki baliokideak, hainbat hizkuntzatan edo sintaxi idatzia. Ondoren, adierazpen boolearra buruz ikasi dugu, eta boolearra balio bat da bai egia edo gezurra da, eta hemen, adierazpen boolearra oftentimes baldintzen barruan, hala badagokio (x ≤ 5), ondo, dagoeneko ezarri dugu, x = 5, beraz, baldintza hori egia ebaluatzeko. Eta, egia bada, edozein egoera azpian da ordenagailua ebaluatu, eta, beraz, kate hori inprimatutako egingo da irteera estandarra, eta epe baldintza edozein izanda ere, bada adierazpena parentesi barruan egiten dio erreferentzia. Gogoratu operadore guztiak. Gogoratu da && eta | | denean saiatzen ari gara baldintza 2 edo gehiago konbinatu == Ez = 2 gauzak berdinak diren ala ez egiaztatzeko. Gogoratu = zereginerako == boolearra operadorea da, berriz. ≤, ≥ eta, ondoren, behin betiko 2 dira auto-azalpen. Logika boolearra berrikuspena, oro har, hemen. Eta adierazpen boolearrak ere garrantzitsua loops, joan gara. 3 loops mota ikasi genuen hain urruti CS50, bitartean, eta egin bitartean. Eta garrantzitsua da jakitea helburu gehienak, berriz, benetan erabili ahal izango dugu, oro har, begizta mota edozein xede edo komun eredu mota batzuk daude programazio zehazki, loops horietako bat deitu osatzen duten eraginkorrenak edo dotoreak horrela kodea. Dezagun joan zer loops horietako bakoitzean joera erabili behar den gehienetan. Batean loop dagoeneko, oro har, dakigu zenbat aldiz batetik bestera joateko nahi dugu. Hori da, zer baldintza jarri dugu. , I = 0, i <10, adibidez. Dagoeneko badakigu zerbait 10 aldiz egin nahi dugu. Orain, berriz, begizta bat, oro har, ez dugu behar jakin zenbat aldiz begizta exekutatu nahi dugu. Baina nolabaiteko baldintza jakin nahi dugu eta egiten dugu beti egia edo beti faltsua. Esate baterako, berriz, ezartzen da. Demagun duen aldagai bat boolearra. Hori egia da bitartean kodea ebaluatu nahi dugu, beraz, pixka bat gehiago hedagarria, pixka bat baino gehiago, oro har, begizta baina begizta for edozein ere sar daitezke, berriz, begizta bat bihurtu da. Azkenik, loops, trickiest izan daiteke berehala ulertu ez, berriz, erabili ohi dira kodea ebaluatzeko lehenengo nahi dugu aurretik, lehen aldiz egoera egiaztatu dugu. Komun bat erabiltzea kasu egin loop bitartean denean, erabiltzailearen sarrera eskuratu nahi baduzu, eta erabiltzaileak eskatu nahi duzu badakizu sarrera gutxienez behin, baina eman ez badute sarrera ona berehala eskatuz ematen dute arte sarrera ona mantendu nahi duzun. Erabilera ohikoena ez loop, berriz, eta dezagun loops hauen benetako egitura begiratzen. Beti izan ohi dute normalean eredu hauek jarraitu. Begizta barruan On 3 osagai izan beharko da: Hasieratzea, normalean zerbait int i = 0 non counter i, egoera, non begizta hau exekutatu betiere baldintza hau oraindik antolatzen jo esan nahi dugu, i <10, eta, ondoren, azkenik, eguneratu, hau da, nola Kontatzailea bezalako Begizta puntu bakoitzean aldagai counter. Gauza komun bat dago ikusteko + + i da, Horrek esan nahi du, Kontatzailea i 1 aldi bakoitzean. I + = 2 antzeko zerbait ere egin dezakezu, Horrek esan nahi du, gehitu 2 i denbora bakoitzean begizta bidez. Eta gero, hori guztia egin loop-zati gisa benetan kodea duen edozein exekutatzen dagokio. Eta, berriz, begizta bat, une honetan benetan dugu Hasieratzea Begizta kanpo, Adibidez, demagun begizta mota bera bezala deskribatu egiten saiatzen ari gara. Int i = 0 begizta hasi aurretik esan nahi dugu. Ondoren, esan genezake <10 i egin bitartean hau, beraz, kode-bloke berean, orain arte bezala, eta oraingoan kodearen zati eguneratzea, adibidez, i + +, benetan Begizta barruan doa. Eta, azkenik, egin, bitartean loop antzekoa da berriz, baina kodea behin ebaluatuko du gogoratu behar dugu baldintza hautatuta dago aurretik, eta, beraz, askoz gehiago zentzuzkoa da du begiratzen baduzu ordena goitik behera. Batean loop kodea ebaluatzen ere bitartean aurretik begiratu bitartean, bitartean begizta bat, berriz, lehen egiaztatzen du. Kontuak eta aldagai. Aldagai berri bat sortu nahi dugu, nahi dugu, lehen abiarazi. Esate baterako, int barra-barra aldakorra initializes baina ez du ematen balio bat, eta, beraz, zer da gaur egun bar balio? Ez dakigu. Batzuk zabor-balio hori memorian gordetzen da lehenago bertan izan daiteke, eta nahi ez dugun aldagai hori erabili dugu balio bat eman arte, beraz, aldarrikatzen dugu hemen. Ondoren, 42 behean hasieratu dugu. Baina, noski, hori egin daiteke, lerro bat, int bar = 42 dakigu. Baina garbitu behar diren hainbat urrats gertatzen da, adierazpena eta Hasieratzea bereizita gertatzen ari dira hemen. Urrats bat gertatzen da, eta, hurrengo, int baz = bar + 1 beheko-adierazpen hau, baz-gehikuntzak, beraz, kode-bloke honen amaieran ginen baz balioa inprimatu nahi izanez gero, 44 ​​izango litzateke aldarrikatzen dugu, eta delako 1> bar abiarazi, Kontatzailea eta, ondoren, berriz ere + +. Hau nahiko laburki baino gehiago joan gara, baina oso ona da orokor bat izan zer diren hariak eta gertaerak ulertzeko. Egin dugu, batez ere hau Scratch beraz, hari dezakezu uste kode hainbat sekuentzia gisa aldi berean exekutatzen ari da. Actuality, ziur aski, ez aldi berean exekutatzen baina sort abstraktuan da pentsatzen dugu modu horretan. Scratch, adibidez, hainbat sprites izan genuen. Exekutatzean izan daiteke kode desberdin aldi berean. Oinez-ko beste zerbait esanez pantailaren beste zati bat. Ekitaldiak logika bereizten beste modu bat Zure kodea elementu desberdinen artean, eta Scratch gertaerak simulatzeko gai Broadcast erabiliz ginen, eta hori benetan Jaso dut, ez When I Hear baina funtsean, informazioa transmititzeko modu bat da , bat Sprite beste. Esate baterako, nahi jokoa transmititu ahal izango duzu, eta noiz Sprite beste jasotzen jokoa baino gehiago, modu jakin batean erantzuten du. Programazioa ulertzeko eredu garrantzitsu bat da. Just Aste oinarrizko 0 baino gehiago joan, zer joan dugu, beraz, orain arte, dezagun C programa erraza da. Testua pixka bat hemendik txikia izan daiteke, baina joan Pasatuko zait benetan azkarra. 2 goiburua, goi cs50.h eta stdio.h fitxategiak ari gara, besteak beste. Ondoren, etengabe ari gara izeneko muga definitzen 100 izan behar du. Ondoren ari gara, gure funtzio nagusia ezartzeko. Geroztik ez dugu erabili komando lerro argumentoak hemen void jarri behar dugu nagusiaren argumentu gisa. Nagusiak gainetik int ikusten dugu. Hori bueltan mota da, eta, beraz, itzultzeko 0 behealdean. Eta CS50 liburutegiko funtzioa erabiltzen ari gara lortu int sarrera erabiltzaileari galdetu, eta gordetzeko dugu hau aldagaia x beraz, x aldarrikatzen dugu batez ere, eta hasieratu dugu x = GetInt. Egiaztatu ondoren, erabiltzaileari eman zigun ona sarrera ikusteko. ≥ LIMIT 1 kodea errore bat itzuli eta errore-mezu bat inprimatu nahi dugu. Eta, azkenik, erabiltzaileak ematen badira onak sarrera zenbakia plazan, eta emaitza hori inprimatu goaz. Just ziurtatu horiek guztiak hit hasiera kodea hemen atal ezberdinak etiketak ikusi ahal izango duzu. Etengabe, goiburu fitxategiak aipatu dut. Oh, int x. Ziurtatu tokiko aldagai bat gogoratzeko. Hori kontrastatzen aldagai global bat, buruz hitz egin dugu. pixka bat geroago, berrikuspena saio, eta liburutegiko funtzioa printf deitzen ari gara, hala bada ez genuen, stdio.h goiburu fitxategi printf deitu ahal izango genuke. Eta gezi hemen got moztu da% d seinalatuz uste dut, printf Kate formateatzen da. Zenbaki bat,% d aldagai hau inprimatu dio. Eta hori da, Aste 0. Orain Lucas jarraitzea. Hey, guys. Nire izena Lucas da. Campusean, Mather etxe onena sophomore bat naiz, eta 1 eta 2,1 Astea buruz pixka bat hitz egin dut. [1 eta 2,1 Astea!] [Lucas Freitas] Lexi zen bezala, esaten Scratch etatik C zure kodea itzultzen hasi ginen nabaritu dugun gauza bat da, ez bakarrik ahal izango duzu Zure kodea idatzi eta exekutatu jada bandera berdea erabiliz. Egia esan, pauso batzuk erabili zure C programa bat egin behar duzu fitxategi exekutagarri bat bihurtu da. Funtsean, zer ez duzu programa bat idazten ari da zure ideia itzultzeko hizkuntza konpilatzailea ulertzen, beraz, programa bat idazten ari zaren C zer egiten ari zaren benetan zerbait idazten zure konpiladore hori ulertzeko, eta, ondoren, konpiladorea da, kode hori itzuli egingo da zerbait, zure ordenagailuak ulertzen sartu. Eta gauza da, zure ordenagailua ez da benetan oso muda. Zure ordenagailua bakarrik ulertu 0 s eta 1s beraz, benetan lehen ordenagailuak jendea normalean programatu 0 s eta 1s, baina ez, jada, thank God. Ez dugu 0 s eta 1s sekuentziak memorizatzeko loop edo, berriz, loop eta abar. Horregatik konpilatzailea dugu. Zer konpiladore bat ez da, funtsean, itzultzen C kodea, Gure kasuan, zure ordenagailuak ulertzeko hizkuntza bat, objektu-kodean, eta konpilatzailea erabiltzen ari garen deritzo clang, eta, beraz, hau da, benetan ikurra clang. Zure programa behar duzu, 2 gauza egin behar duzu. Lehenik eta behin, zure programa konpilatu behar duzu, eta, ondoren, programa exekutatzen ari zaren. Horretarako aukera asko duzu zure programa konpilatu. Ko lehen clang program.c programa zure programaren izena da. Kasu honetan, ikusi besterik ez esaten ari dira dezakezu "Hey, konpilatu nire programa." Ari zara esaten ez edo ezer "nire programa izen hori nahi dut". Bigarren aukera izen bat ematea da programa. Esan dezakezu clang-o eta, ondoren, nahi duzun izena fitxategi exekutagarria izendatu behar dira eta, ondoren, program.c. Eta, halaber, egin ahal duzu egiteko programa, eta ikusi nola 2 lehen kasuak Jarri dut c, eta hirugarren bat besterik ez dut programa? Bai, ez litzateke duzu ez jartzea. C denean egiteko erabiltzen duzun. Bestela konpilatzailea da benetan at Yell. Eta gainera, ez dakit bada gogoratzen duzu guys, baina aldiz ere erabiltzen dugu-lcs50 edo-lm asko. Izeneko lotzen ditu. Kontatzen besterik ez du konpiladore liburutegi horiek erabili egingo dute bertan, hala badagokio cs50.h erabili nahi duzu benetan idatzi program.c-lcs50 clang. Ez baduzu hori egin, konpiladorea ez da jakin ari zaren funtzio horiek erabiliz cs50.h. Eta 2 aukera dituzu zure programa exekutatu nahi duzun. Zenuen clang program.c Ez baduzu eman izena zure programa. Exekutatu. / A.out erabiliz duzu. A.out izena clang zure programa ematen ez baduzu, eman izena estandar bat da. Bestela, / programa egiten ari zaren izena eman duzu zure programa bada, eta, gainera, egin duzun programaren izena duen programa bat da, iritsi da dagoeneko programatu dira izen bereko c fitxategi gisa. Ondoren Datu-mota eta datu-buruz hitz egin dugu. Funtsean datuak erabiltzen dituzten kaxak little mota gauza bera dira balioak gordetzeko, beraz, datu-motak, egia esan just Pokémons bezala. Tamaina eta mota guztiak etortzen dira. Ez dakit analogia horrek zentzua badu. Datuak tamaina benetan makinaren arkitektura araberakoa da. Datuen tamaina naiz hemen erakusteko 32-bit makina, gure tresnaren kasua da, benetan baina benetan, zure Mac edo Windows ere kodifikazioa ziurrenik 64-bit makina bat ari zaren, beraz, gogoratu datuak tamaina naiz dut hemen erakusteko 32-bit makina dira. Lehen ikusi dugun int bat izan zen, hau da, nahiko erraza. Int zenbaki oso bat gordetzeko erabiltzen dituzu. Pertsonaia, karakterra ere ikusi dugu. Gutun bat edo sinbolo bat little erabili nahi duzun bada, seguruenik ari zaren char bat erabili du. Karaktereen A 1 byte da, eta horrek esan nahi du, 8 bit, Lexi esan du. Funtsean dugu ASCII taula duen 256 0 s eta 1s konbinazio posible, eta, orduan, char bat idazten duzunean itzuli da pertsonaia input zenbaki bat duzula ASCII taulan, Lexi bezala esan. Horrez gain, mugikorra, hamartar zenbakiak gordetzeko erabiltzen ditugu. 3,14 aukeratu nahi duzun bada, adibidez, mugikor bat erabiltzen ari zaren joan edo bikoitza doitasun gehiago ditu. Float A 4 byte ditu. Bikoitza A 8 byte ditu, beraz, desberdintasun bakarra da doitasun. Era berean, luze bat erabiltzen da zenbaki osoen eta 32-bit makina bat ikus dezakezu int luze eta tamaina bera dute, beraz, ez da benetan zentzurik luze bat erabili 32-bit makina bat. Baina ari zaren Mac eta 64-bit makina bat erabiliz gero, benetan luze bat tamaina 8 beraz, arkitektura benetan araberakoa da. 32-bit makina ez du zentzurik luze bat erabili benetan. Eta gero, luze, beste alde batetik, 8 byte ditu, beraz, oso ona da jada zenbaki oso bat izan nahi duzun. Eta, azkenik, kate ditugu, hau da, benetan char * char bat erakuslea da. Oso erraza da katea tamaina hori izan bezala uste karaktere kopurua duzula bertan, baina benetan bera char * char bat, hau da, 4 byte erakuslea baten tamaina du. Char * tamaina 4 byte da. Ez du axola bada, ez duzu hitz txiki bat edo gutun bat edo ezer. 4 bytes izango da. Apur bat ere ikasi dugu casting buruz, beraz, ikusi ahal izango dituzu, baldin baduzu, adibidez, programa bat dela dio int x = 3 eta, ondoren, printf ("% d", x / 2) do you guys ezagutzen zer pantailan inprimatu egingo? Norbaitek? >> [Ikasleak] 2. 1. >> 1, bai. 3/2, 1,5 lortu da, baina ari gara zenbaki oso bat erabiliz geroztik hamartar zatia ez da joan, eta 1 izan duzu. Nahi ez baduzu, zer egin ahal izango duzu gertatuko, esate baterako, mugikor bat aldarrikatu da y = x. Ondoren, x 3 erabiltzen da gaur egun 3.000 y en. Eta gero, y / 2 inprimatu ahal izango duzu. Egia esan, 2 bat izan behar dut. han. 3.00/2.00 egin behar da, eta 1,5 lortu duzu. .2 F 2 unitate hamartar hamartar parte eskatu besterik ez dugu. .3 F bada benetan izan 1.500 da. Bada, 2 1,50 izango da. Horrez gain, kasu honetan hemen. Karroza egin duzu bada, x = 3,14, eta, ondoren, printf x 3,14 lortu duzu. Eta egiten baduzu x = x int, Horrek esan nahi du, tratatzeko int gisa x eta x inprimatu 3,00 izan duzu. Ez duela zentzurik? Zaren lehen tratatzeko delako x zenbaki oso bat, eta, beraz, parte hamartar ari ez ikusi egin zaio, eta, ondoren, x ari zaren inprimatzeko. Eta, azkenik, gainera dezakezu Horretarako, int x = 65, eta ondoren char c = x deklaratzeko, eta, ondoren, inprimatu c benetan ari zaren eskuratu du A, eta, beraz, funtsean, hemen zer egiten ari zaren osokoa pertsonaia itzultzeko, ASCII taula ez bezala. Math operadore buruz ere hitz egin dugu. Gehienak nahiko erraza da, eta, beraz, +, -, *, /, eta mod, 2 zenbakien zatiketa baten hondarra da buruz ere hitz egin dugu. Duzu 10% 3 bada, esate baterako, zatitzea 3 10 esan nahi du, eta gainerakoa zer den? 1 izango da, eta, beraz, benetan da oso erabilgarria da programa asko. Vigenère eta Caesar pretty sure you guys guztiak erabili mod naiz. Math operadore buruz, oso kontuz ibili behar da, * eta / konbinatuz. Adibidez, ez baduzu (3/2) * 2 zer egingo eskuratu duzu? [Ikasleak] 2. Bai, 2, 3/2 delako 1,5 izan da, baina ari zaren eragiketa geroztik egiten 2 zenbaki osoen arteko benetan ari zaren besterik gabe, 1. kontuan hartu behar, eta, ondoren, 1 * 2 2 izango da, eta, beraz, oso, oso kontuz ibili aritmetika egiten osoko zenbakien delako lortzeko 2 = 3 izan daiteke, kasu horretan. Eta, gainera, oso kontuz ibili buruz lehentasuna. Normalean erabili beharko zenuke parentesi ziur badakizula zer egiten ari zaren. Erabilgarria lasterbideak batzuk, jakina, i + + edo i + = 1 bat da erabili edo + =. I = i + 1 egiten gauza bera da. Ere egin dezakezu i - edo i - = 1, -1 = i gauza bera da, guys asko batean erabiltzen duzun zerbait, loops, gutxienez. Era berean, *, * = egiten baduzu, adibidez bada, i * = 2 i = i * 2 esatea gauza bera da, eta zatiketa gauza bera. Do i / = 2 i = i / 2 gauza bera da. Orain funtzioak. Zaudete ikasi funtzio oso ona estrategia kodea gorde ari zaren programazioa bitartean, eta, beraz, nahi duzun lana egiteko kodea, behin eta berriro, ziurrenik funtzio bat erabili nahi duzun besterik ez, beraz, ez duzu kodea eta gehiagoko berriz kopiatu eta itsatsi. Izan ere, funtzio nagusia da, eta erakusteko I funtzio baten formatua hori dela pretty bistako ikusteko duzu. Funtzioak ere erabiltzen ditugu, liburutegi batzuk, Adibidez, printf, GetIn CS50 liburutegia da, eta horrek, eta toupper bezalako beste funtzioak. Funtzio horiek guztiak dira benetan beste liburutegi ezarri eta noiz tether fitxategi horiek jarri duzu zure programaren hasieran eman me funtzio kodea mesedez esaten ari zaren beraz, ez dut neure ezartzeko? Eta, gainera, ahal izango duzu zure funtzioak idatzi, eta, beraz, behin programazioa hasten zara liburutegiak ez funtzioak behar duzula konturatzen zara. Azken pset, adibidez, marrazteko, Scramble, eta bilaketak idatzi dugu, eta oso, oso garrantzitsua da funtzio idatzi ahal izango dira erabilgarria delako, eta horiek erabiltzen ditugu programazio denbora guztian, eta kode asko gordetzen du. Funtzio baten formatua hau da. Itzulera mota ditugu hasieran. Zer da bueltan mota da? Besterik ez da zure funtzioa itzuli egingo da. Funtzio bat behar duzu, adibidez, faktore bada, hori zenbaki oso bat faktoriala kalkulatzeko, ziurrenik osoko bat itzuli ere egingo. Gero, bueltan mota int izango da. Printf benetan bueltan mota void ezer ez delako ari zaren itzuli. Ari zara gauzak inprimatzeko pantaila eta funtzioa irten ondoren. Ondoren funtzioa aukeratu ahal izango duzu izena. Apur bat arrazoizko behar duzu, ez bezala, XYZ bezalako izen bat aukeratu edo x2f bezala. Saiatu zentzua duen izen bat osatzen dute. Esate baterako, bada faktore, esan faktore. Funtzio bat da hori zerbait marrazteko bada, izendatzeko marrazteko. Eta gero, ere deitzen diren argumentuak parametro dugu, zure funtzioa behar bezalako baliabideak Zure kodea bere zeregina burutzeko. Zenbaki baten faktoriala kalkulatu nahi duzun bada seguruenik zenbaki bat izan behar du, eta faktore bat kalkulatu behar duzu. Argudioak behar zarela telefono zenbaki bat bera da. Eta gero, zerbait egin behar eta balioa itzultzeko amaieran void funtzioa ezean. Ikus dezagun adibide bat. Nahi dut zenbaki guztiak batzen funtzio bat zenbaki osoen array bat idatzi nahi izanez gero, lehenik eta behin, itzulera mota int izango da daukat zenbaki osoen array bat delako. Bezalako izen funtzioa sumArray izan dut, eta, ondoren, array bera hartu du joan, int nums eta, ondoren, ezagutzen dut, beraz, zenbat zenbakiak batzea daukat array luzera. Ondoren, aldakorra izeneko batura, adibidez, 0 abiarazi behar dut, eta aldi bakoitzean array elementu bat ikusten dut gehitu behar dut batura, beraz, bat egin nuen loop. Bezala Lexi esan zuen, int i = 0, i 0 badira, positiboa da. Da bada, orduan 0 = 0 da, eta <0 bada, negatiboa da. Eta beste bat egiten bada, bestela, bestela. Bien arteko aldea da, hau da, benetan joan > 0, <0 edo = 0 hiru aldiz egiaztatu bada, hala badagokio, kopurua 2 duzu, adibidez, hona etorri eta esan egingo (x> 0), eta bai esan nahi da, eta, beraz, positiboa inprimatu dut. Baina, nahiz eta hori> 0 ezagutzen dut, eta ez da 0 edo <0 izango Jarraitzen dut egingo da 0, 0 <, beraz, benetan ari naiz IFS barruan baina ez dute Dagoeneko dudalako ezagutzen dela eta baldintza horiek ez betetzean. Erabili ahal izango dut, bada, bestela, bestela adierazpena. Dio funtsean, x = 0 positiboa bada inprimatzen ditut. Ez bada, hau ere probatu dut. 2 ez bada ez noa. Funtsean izan nuen x = 2 badira, esan nahi duzun (x> 0), bai, eta, beraz, inprimatu. Orain ezagutzen dut> 0 eta lehenengo bazaizu Ez dut baita kode hau exekutatu. Kodea exekutatzen azkarrago, egia esan, 3 aldiz azkarrago erabiltzen badituzu. Ikasi dugu, eta buruz edo. Ez dut honen bidez Lexi dagoeneko horietako buruz hitz egiten duelako. Besterik ez da && eta | | operadorea. Gauza bakarra esan dut kontuz 3 baldintza bete behar da. Erabili parentesi oso nahasgarria delako baldintza bat behar duzu eta beste bat edo beste bat. Erabili parentesi ziur zure baldintzak zentzurik izango Kasu horretan, adibidez, delako, pentsa dezakezu hori lehenengo baldintza, eta bat edo beste izango da edo bat konbinatzen 2 baldintzak eta edo hirugarren bat, beraz, kontuz ibili. Eta, azkenik, hitz switches gara. Switch bat oso erabilgarria da, aldagai bat behar duzu. Demagun n aldagai bat duzula 0, 1 edo 2 izan daiteke, eta Kasu horietan bakoitzean zeregin bat egiteko joan zaren. Esan aldatzeko aldagaia dezakezu, eta horrek adierazten du balioa eta, ondoren, value1 atsegin hau egin nahi dut, eta, ondoren, hautsi I, horrek esan nahi du, ez dut beste edozein kasu begiratu dagoeneko badugu pozik delako, kasu horretan eta, ondoren, balioa2, eta abar, eta nik ere default switch bat izan daiteke. Horrek esan nahi du, ez badu betetzeko kasuetan izan dut edozein naiz duten I beste zerbait egin behar du, baina hori aukerakoa. Hori da dena niretzat. Egin ditzagun orain Tommy. Ondo da, hau da, Aste 3-ish izango. Hauek estaltzen dugu, kripto, esparrua, array, et cetera gai batzuk dira. Just kripto hitz azkar bat. Ez gara hasiera honetan Hammer. Hau egin genuen, 2 pset, baina galdetegirako ziurtatu diferentzia badakizu Zesarren zifratua eta Vigenère zifratze artean, zifraketen lan horiek, bai eta zer enkriptatzeko bezala eta testua desenkriptatu 2 zifraketen horiek erabiliz. Gogoratu, César zifratze, besterik gabe, pertsonaia bakoitzak biratzen kopuru bera, duzula mod alfabetoaren letren kopurua. Eta Vigenère zifratze, beste alde batetik, pertsonaia bakoitzak biratzen beste kopuru bat, eta, beraz, baizik eta esaten baino 3 Vigenère biratuko pertsonaia bakoitzak pertsonaia bakoitzak biratzeko zenbatekoa keyword batzuk arabera non hitzarekin letra bakoitza beste kopuru batzuk adierazten Testu laueko biratzeko. Dezagun lehen esparrua aldakorreko buruzko eztabaida. Aldagai mota desberdinak daude 2. Aldagai lokalak ditugu, eta horiek definitu egingo da nagusia edo funtzio edo bloke kanpo kanpo, eta hauek eskuragarri izango da zure programa edozein. Funtzio bat bada, eta funtzio hori, berriz, begizta bat da global handia, aldagaia da nonahi. Tokiko aldagai bat da, beste alde batetik, bertan definitzen da leku scoped. Funtzio bat bada, hemen duzu, adibidez, funtzio g hau dugu, eta g barruan aldagai bat dago hemen izeneko y eta horrek esan nahi du horrek tokiko aldagai bat da. Nahiz eta aldagai hau deitzen da, y eta aldagai 2 funtzio hauek deritzo y ez daki zer diren, bata bestearen aldagai lokalak. Beste alde batetik, hemen int x = 5 diogunean, eta funtzioa edozein esparrutik kanpo dago. Nagusiaren esparrutik kanpo, beraz, aldagai global bat da. 2 funtzio horien barruan, esan nahi du, x diot edo x + + Horren bidez, y eta y desberdinak dira aldagai bera x naiz sartzen. Aldagai global eta tokiko aldagai bat arteko aldea da. Den neurrian, diseinu dagokionez, batzuetan izango da seguru asko ideia bat hobea aldagai tokiko mantentzeko bakoitzean ziurrenik duzu aldagai global sorta bat izatea geroztik oso nahasgarria lor daiteke. Funtzio sorta bat bada, gauza bera aldatzea ahaztu zer funtzio hau ustekabean aldatzen global honetan dezake, eta beste funtzio hau ez da buruz jakin, eta lortu du nahiko nahasgarria gehiago kodea. Aldagai tokiko mantentzea bakoitzean ziurrenik duzu diseinu besterik ez ona da. Arrayak, gogoan, besterik gabe, mota bereko elementu zerrendak. CI barrualdea ezin izan 1, 2,0 bezalako zerrenda bat, kaixo. Besterik ez dugu egin. Array bat aldarrikatzen dugu C elementu guztiak mota bereko. Hemen, 3 zenbaki osoen array bat daukat. Hemen array luzera izan dut, baina ez dut besterik ez bada ere geratuko sintaxi honetan non zer elementu guztiak dira zehaztu ez dut 3 teknikoki behar dut. Konpilatzailea da smart nahikoa izarrekin nola big array izan behar du. Orain, array bat balio edo ezarri nahi dut hau da sintaxia hori egin da. Honek benetan aldatzeko bigarren array-elementu, izan ere, gogoratu, zenbakitze 0 hasten da, ez 1. Nahi dut balio irakurri nahi izanez gero, antzeko zerbait esan daiteke I int x = array [1]. Edo nahi dut balio hori ezarri nahi izanez gero, naiz atsegin dut hemen egiten, Esan array I [1] = 4. Garai hartan beren indizea by elementuak sartzeko edo beren posizioa edo non array daude, eta zerrenda 0 hasten da. Ere ahal izango dugu array of array, eta hau deitzen da multi-dimentsioko array bat. Multi-dimentsioko array bat daukagu horrek esan nahi du, errenkadak eta zutabeak antzeko zerbait izan dezakegu, eta hau ikusteko edo pentsatzen modu bat besterik ez da. Multi-dimentsioko array bat daukat esan beharrik hasteko noa indizea 1 baino gehiago delako saretako daukat errenkadan Oraindik duzu esatea ez da zenbaki bat ematen diguten. Hau da, benetan besterik ez digute zenbakien zerrenda bat egingo da. Demagun array hau daukat hemen. Sareta izeneko array bat daukat, eta bere 2 errenkada eta 3 zutabe esaten dut, eta, beraz, hau da ikusteko modu bat da. Elementu lortu [1] nahi dut esango dut [2] horrek esan nahi du, zeren horiek dira lehenik eta, ondoren, errenkadak zutabe 1 errenkada esan dut 1etik aurrera salto egin dut. Ondoren, hemen baino gehiago etorri zutabe 2 naiz joan, eta balioa 6 noa. Zentzurik? Multi-dimentsioko array, gogoan, teknikoki horretarako array array bat besterik ez dira. Array-array array izan ahal izango dugu. Mantendu egingo dugu, baina benetan, modu batean pentsatu hau nola ari da banatuta, eta zer gertatzen da ikusteko hau atsegin sareta batean. Funtzioak array pasatzen dugu, portatzen ari dira desberdinak erregularra aldagai pasatzen dugu funtzio baino pixka bat int edo mugikor bat igaro bezala. Pasatzen dugu char edo int edo datu horiek beste edozein mota funtzioa bada aldatzen begirada bat hartu besterik ez dugu aldagai horren balioa aldaketa hori ez hedatzeko deitu duen funtziora. Array batekin, beste alde batetik, hori gertatuko da. Array bat pasatzen bada, eta funtzio batzuk, funtzio hori elementu batzuk aldatzen itzuli naiz izeneko funtzioa nire array ezberdina izan du, eta, horretarako hiztegia erreferentzia da array gainditu, aurrerago ikusiko dugun bezala dugu. Hori nola erakusleak lana, non horiek oinarrizko datu-motak, Beste alde batetik, balioa gainditu. Ezin dugu uste hori aldagai batzuen kopia bat egin eta, ondoren, kopia pasatzen gisa. Ez du axola aldagai horrekin zer egiten dugun. Deitu duen funtziora ezin izango jakitun zela aldatu. Arrayak pixka bat bakarrik Zentzu horretan desberdinak dira. Esate baterako, besterik ez dugu ikusi bezala, nagusietako bat da, besterik gabe, funtzio bat 2 argumentu hartu dezakete. Lehen argumentua da funtzio nagusia argc, edo argumentu kopurua, eta bigarren argumentua deritzo argv eta horiek argumentuak horien benetako balioak dira. Demagun izeneko programa bat this.c daukat, esan dut, eta hau egiteko, eta hau exekutatzeko komando-lerroan noa. Orain argumentuak batzuk pasatzeko nire programa izeneko hau, Esan nuen zerbait. /, Hau da cs 50. Hau da, David egin imajinatu dugu egunero terminalean. Baina orain, programa hori barruan funtzio nagusia balio horiek ditu, beraz, argc 4. Pixka bat nahasgarria izan daiteke benetan, bakarrik ari cs 50 pasatzen dugulako. Hori da soilik 3. Baina gogoratu argv lehenengo elementua edo lehen argumentua funtzioa bertan izena da. Beraz, horrek esan nahi du, 4 gauza dugula hemen, eta lehen elementu da. / hau izango da. Eta hau izango da kate gisa irudikatzen. Ondoren, gainontzeko elementuak zer idatzi programaren izena ondoren. Beraz, bezala, bat alde batera utzita, ziurrenik pset 2 ikusi gogoratu katea 50 ≠ osokoaren 50. Beraz, ezin dugu esan, antzeko zerbait 'int x = argv 3. Hori ez zentzurik, hau kate bat delako, eta hau oso bat da. Beraz, bada 2 arteko bihurtu nahi baduzu, gogoan, ari dugu. izeneko atoi magia funtzio hau. Kate bat hartzen du, eta kate horren barruan irudikatzen osoko itzultzen du. Beraz, akats bat da erraza galdetegia egiteko, besterik gabe, automatikoki mota egokia pentsatzen. Baina jakin horiek beti izango da kateak nahiz eta katea, zenbaki oso bat edo pertsonaia bat edo mugikor bat besterik ez dauka. Beraz, gaur egun utzi iraupena buruz hitz egiteko. Algoritmo horiek crazy gauza horiek guztiak ez ditugu, Benetan erabilgarria bihurtzen da galdera, "Zenbat denbora egin dute?" Zerbait asymptotic notazioa izeneko ordezkatzen dugu. Beraz, horrek esan nahi du - ondo, demagun gure algoritmoa ematen dugu Benetan, benetan, benetan big sarrera batzuk. Galdera nahi dugu, "Zenbat denbora hartu du? Zenbat urrats dira gure algoritmoa hartu da exekutatu sarrera tamaina funtzio gisa? " Exekutatu denbora deskribatzeko ahal izango dugu modu Beraz, lehen big O. Eta hau gure kasurik txarrenaren lasterketak denbora da. Beraz, bada, array bat ordenatzeko nahi dugu, eta gure algoritmoa array bat ematen diogu beheranzko ordenan ordena goranzko behar da, den kasuan txarrena izan. Hau da gure goiko denbora hartuko du gure algoritmoa gehienezko luzera aritzeko da. Beste alde batetik, Ω hori best-kasuan exekutatzen denbora deskribatzeko. Beraz, bada,, dagoeneko horrela antolatu array bat ematen dugu ordenatzeko algoritmo bat, zenbat denbora izango da ordenatzeko hartu? Eta hau, beraz, txikiagoa iraupena doazen deskribatzen du. Hortaz, hona hemen deskribatzen duten hitz batzuk besterik ez orokor batzuk aldiz. Hauek ordena gorakorrean daude. Azkarrena denborak dugu deitzen da etengabe. Horrek ez du axola zenbat elementu gure algoritmoa ematen dugu esan nahi du, ez du axola nola big da gure array, ordenatzeko edo edozein dela ere array egiten ari gara egiten, beti izango da denbora kopuru bera hartu. Beraz, bat besterik ez 1, hau da, konstante bat irudikatu ahal izango dugu. Run logaritmikoa denbora ere begiratu dugu. Beraz, bilaketa bitarra antzeko zerbait logaritmikoa da, non denbora erdian behin, arazoa moztu dugu eta, ondoren, gauzak besterik ez handiagoa bertatik. Eta ari zara inoiz bada O bat idazten edozein faktore algoritmoa, beharko ez kontuan hartu zure eguneko lana gisa. Martxan aldiz alderatu dugu garrantzitsua da gauza horiek kontuan mantentzeko. Beraz, bada algoritmoa O (n) bat izan dut, eta beste norbaitek O algoritmo batek (2n) hauek dira benetan asymptotically baliokidea. Beraz, bada, kopuru handi bat eleventy milioi bezalako n imajinatu dugu: beraz, eleventy milioi alderatuz antzeko zerbait eleventy milioi + 3 ari gara, bat-batean +3 ez du benetan egin diferentzia handi bat jada. Horregatik, kontuan hartuta hasteko gauza horiek baliokideak izango dugu. Konstanteak horrelako gauzak hemen, beraz, ez da 2 x honetan, edo 3 gehituz, horiek besterik ez dira konstanteak, eta horiek jaregiteko. Beraz, zergatik run garai hauetan 3 guztiak O (n) esaten ari dira berdinak dira. Era berean, dugu, 2 run aldiz beste bada, demagun O (n ³ + 2n ²), gehitu ahal izango dugu + N + 7, eta, ondoren, beste exekuzio-denbora besterik O (n ³) dugu. berriz, horiek gauza bera dira, zeren eta hauek ez dira berdinak. Hauek gauza bera dira, barkatu. Beraz, horiek berak dira delako ³ n hori 2n ² menderatzeko. Zer da, ez da gauza bera exekutatzen dugu bada aldiz O (n ³) eta O bezala (n ²) n ³ n ² hau baino askoz handiagoa delako. Beraz dugu adierazlerik izanez gero, bat-batean hasten da axola, baina besterik ez ari gara faktore gara hemen aurre, ondoren, ez da egingo dira besterik ez delako jaregiteko axola. Dezagun algoritmo batzuk ikusi dugu hain urruti begirada bat eta bere exekuzio-denbora buruz hitz egiteko. Zerrenda batean zenbaki bat begiratzeko modu lehen, ikusi dugu, bilaketa lineala izan zen. Eta bilaketa lineala ezartzeko super erraza da. Zerrenda bat besterik ez dugu, eta zerrendako elementu bakoitza begiratu goaz kopurua aurkituko dugu arte bilatzen ari gara. Beraz, horrek esan nahi du kasurik okerrenean, O (n). Eta kasurik okerrenean hemen elementu bada izan liteke azken elementua eta, ondoren, bilaketa lineala erabiliz elementu bakoitza begiratu behar dugu azkena zela benetan zerrendan jakin dugu iritsi arte. Ezin dugu amore eman erdiraino eta esatea, "ziurrenik da ez". Bilaketa lineala, gauza osoa begiratu behar dugu. Best-kasuan lasterka, beste alde batetik, etengabeko Kasu horretan, onena bilatzen ari garen elementua delako zerrendan lehena. Beraz eramango gaitu, zehazki 1 pausoa, ez du axola nola big zerrenda egingo ari gara aldi bakoitzean lehenengo elementu bila. Beraz, bilaketa duzunean, gogoan, ez du behar gure zerrenda ordenatuko. Ari gara, besterik gabe, delako elementu bakoitza baino gehiago begiratu behar, eta ez du benetan axola zein ordenatan elementu horiek dira sartu A adimendunak bilaketa algoritmoa bilaketa bitarra antzeko zerbait da. Gogoan izan, bilaketa bitarra ezartzea da noiz ari zaren egon zerrendan erdian at bilatzen. Eta ari gara erdi-erdian delako, zerrenda hori horrela antolatu behar dugu edo, bestela, ez dakigu non erdi-erdian dago, eta baino gehiago begiratu behar dugu zerrenda osoa aurkituko, eta, ondoren, puntu horretan ari gara denbora alferrik galtzen. Beraz, zerrenda ordenatuko dugu, eta erdi-erdian aurkituko dugu, erdian konparatzeko goaz elementu bilatzen ari gara. Da oso handia bada, ondoren, eskuineko erdia ahaztu ahal izango dugu ezagutzen dugulako gure elementu oso handia da dagoeneko eta elementu horren eskubidea dena handiagoa da, gero, ez dugu behar dago bilatzeko jada. Non, beste alde batetik, gure elementu oso baxua bada, ezagutzen dugu elementu hori ezkerreko dena ere oso baxua da, beraz, ez da benetan zentzurik han bilatzeko, bai. Horrela, pauso bakoitzean eta aldi bakoitzean dugu zerrendaren erdigunea, gure arazoa moztu erdi bat-batean ari gara ezagutzen dugun delako sorta osoa ezin da zenbaki bat bilatzen ari gara. Pseudocode honetan zerbait bilatzeko hau atsegin dute, eta zerrenda mozten ari garelako bakoitza denbora erdia, gure kasuan txarrena-run denbora lineal jauziak logaritmikoa. Beraz, bat-batean dugu log-zerrenda batean elementu bat aurkitzeko urratsak. Best-kasuan lasterketak denbora, ordea, oraindik ere etengabe dezagun orain delako, besterik ez diotenez, bilatzen ari garen elementua dela beti, jatorrizko zerrenda erdian zehatza. Beraz, gure zerrendan hazten dugu big nahi dugu, baina bilatzen ari gara elementu erdi-erdian bada, gero bakarrik, eramango gaitu urrats 1. Beraz, horregatik, O (log n) eta Ω (1) edo etengabe ari gara. Dezagun benetan zerrenda honetan bilaketa bitarra exekutatu. Beraz, demagun 164 elementu bila ari garela. Lehenik eta behin, egin dugu aurkitu zerrenda honen erdigunea. Beraz, zerbait gertatzen da erdigunea dela erori 2 zenbakiak horien artean, beraz, besterik gabe arbitrarioki esan, bere esku dagoen guztia egiten du bere erdigunea 2 zenbakien artean daude, dezagun biribildu sortu. Behar dugu, hau egiten dugu bidea pauso bakoitzean. Beraz biribiltzeko dugu, eta 161 gure zerrendan erdian dela esaten dugu. Beraz, 161 <164 eta 161 ezkerreko elementu guztietan <164 ere, eta, beraz, badakigu ez dela gurekin laguntzeko baino gehiago bilatzen hasteko elementu delako, ezin da ez bilatzen ari gara. Beraz, zer egin dezakegun da, besterik ezin dugu ahaztu hori zerrenda osoan ezkerreko erdi inguru, eta gaur egun 161 aurrerantzean eskubidea bakarrik kontuan hartu. Beraz, berriro ere, hau erdigunea da; dezagun biribildu sortu. Orain 175 handiegia da. Beraz, ez da hemen edo hemen bilatzen lagunduko digu badakigu, beraz besterik gabe bota, eta azkenean 164 hit dugu. Bilaketa bitarra edozein galdera? Dezagun mugitu dagoeneko horrela antolatu zerrenda baten bidez bilatzen benetan zenbakien zerrenda bat hartu, edozein ordenatan eta zerrenda hori egiteko ordena gorakorrean. Lehenengo begiratu dugu algoritmoa deitzen zen burbuila sort. Eta hau ikusi ditugun algoritmoak errazagoa izango litzateke. Bubble sort dio zerrenda barruan 2 elementu edozein leku, zenbaki handiagoa da kopurua txikiagoa ezkerreko zentzua, gero swap goaz, horrek esan nahi du, zerrenda hori izango da delako "Ordenatuko" baino zen. Eta bakarrik ari gara berriro prozesu hau jarraituko du, eta behin eta berriro azkenean, bere kokaleku zuzena burbuila mota elementuak eta arte horrela antolatu zerrenda bat dugu. Denbora run O izango da (n ²). Zergatik? Beno, izan ere, kasurik okerrenean, elementu guztiak hartu behar dugu, eta amaitzeko konparatzen zerrendako beste elementu bat behin goaz. Baina kasu horretan, onena,, dagoeneko horrela antolatu zerrenda bat dugu, burbuila sort behin bitartez, esan du "Laguia ez nuen trukeak edozein egiteko, beraz, egin dut." Beraz, best-kasuan Ω (n) denbora behar dugu. Dezagun exekutatu burbuila zerrenda bat ordenatu. Edo lehen, dezagun begiratu pseudocode batzuk benetan azkar. Segimendua egiteko, begizta-iterazio guztietan nahi dugu esan nahi dugu, mantendu ala ez elementu edozein aldatu dugu jarraipena. Beraz, hau da arrazoia, ez dugu truka edozein elementu gelditzeko dugu. Beraz, gure begizta Irteeran ez dugu truka ezer egin, beraz, esan hori faltsua dugu. Orain, zerrendan zehar joan eta elementu alderatu elementu i + 1 i goaz da eta kasua bada ez dagoela kopurua handiagoa da zenbaki txikiagoa ezkerreko ondoren ari gara horiek swap. Eta gero trukatu egin dugun elementu bat gogoratzen dugu. Horrek esan nahi du zerrendan zehar joan, gutxienez, 1 denbora gehiago behar ditugu dugun egoera gelditu da zerrenda osoa dagoeneko horrela antolatu delako, trukeak edozein ez dugu egin, alegia. Beraz, hori dela eta, gure egoera behera hemen 'elementu batzuk trukatu egin dira bitartean.' Beraz, gaur egun dezagun zerrenda bat begiratu. Zerrenda 5,0,1,6,4 daukat. Bubble sort modu guztiak hasteko ezkerreko, eta alderatu egingo i elementuak, eta, beraz, 0 eta 1 + i, elementu 1. , Esan ondo 5> 0 da, baina oraintxe bertan 5 ezkerrera, beraz, 5 eta 0 trukatu behar dut. Noiz horietako swap I, bat-batean, beste zerrenda hau lortu dut. Orain 5> 1, eta, beraz, horiek swap dugu. 5> 6 ez da, beraz, ez dugu hemen ezer egin beharko. Baina 6> 4, eta, beraz, trukatu behar ditugu. Berriz ere, zerrenda osoa bitartez, azkenean, ezagutzeko exekutatu behar dugu horiek ordena; horiek swap gara, eta puntu honetan zerrendan zehar exekutatu 1 denbora gehiago behar ditugu Ziurtatu dena bere ordena da, eta hau burbuila puntu sort amaitu dadin. Beste elementu batzuk hartu eta hauek ordenatzeko algoritmoa aukeraketa sort da. Aukeraketa sort atzean dagoen ideia da eraikitzeko ari gara zerrendaren zati bat ordenatuko joan 1 elementu aldi berean. Eta horretarako goaz ezkerreko zerrendan segmentu eraikitzen da. Eta, batez ere, behin - Urrats bakoitzean, txikiena utzi dugu elementu ari dugu. ez dela horrela antolatu oraindik, eta, hori horrela antolatu segmentu eraman dugu. Horrek esan nahi du etengabe gutxieneko Unsorted elementu aurkitu behar dugu eta, ondoren, gutxieneko elementu hartu eta edozein dela ere duten swap utzi-gehienak elementu hori ez da horrela antolatu. Honen denbora exekutatu O izango da kasu txarrena delako (n ²) beste elementu bakoitza elementu bakar behin alderatu behar dugu. Ari gara zerrendaren ezkerreko erdia hasten bada, behar delako esaten osoan segmentu eskuineko bidez joan txikiena elementua aurkitu. Eta gero, berriz, osoa baino gehiago joan eta eskuineko segmentu behar dugu mantentzeko pasa dela eta baino gehiago baino gehiago berriz. Hori n ² izango da. Bat behar loop beste baten barruan loop goaz n ² iradokitzen du. Kasu onena pentsamendu, demagun du ematen diogu, dagoeneko horrela antolatu zerrenda bat; egia esan, ez dugu ez n ² baino hobeto edozein. Aukeraketa sort hori ezagutzeko modu ez duelako gutxieneko elementu besterik ez da bat da bilatzen gertatuko. Behar du, hala ere, ziur hori da, benetan gutxieneko egiteko. Eta ziur gutxieneko hori egiteko modu bakarra, algoritmo honen bidez, elementu bakoitza berriro begiratu. Beraz, benetan, ematen baduzu ematen aukeraketa sort, dagoeneko horrela antolatu zerrenda bat, ez da edozein zerrenda bat ematen hori oraindik ez da horrela antolatu baino hobeto egin du. Hain zuzen ere, gertatzen den kasuan izan bada zerbait O (zerbait) eta zerbait omega, besterik esan gehiago succinctly zerbait θ. Beraz, bada etorriko dela edonon, hori da hori, besterik gabe esan nahi du ikusten duzu. Zerbait n theta izanez gero ², bai big O (n ²) eta Ω (n ²) da. Kasu onena eta txarrena kasuan, beraz, ez du diferentzia, algoritmoa da aldi bakoitzean gauza bera egiten du. Beraz, hau da, zer aukeraketa sort pseudocode itxura. Funtsean ari gara baino gehiago batetik bestera joateko zerrendan nahi dut esan nahi du ezkerretik eskuinera, eta begizta-iterazio bakoitzean, mugitu noa zerrendaren zati hau horrela antolatu gutxieneko elementu sartu. Eta behin zerbait mugitu dut, inoiz ez dut elementu hori berriro begiratu behar. Swap dut elementu bat ezkerreko zerrendatik segmentu bezain laster, delako ordenatuko ari garen guztia egiten ari delako Orden Gorakorra Minimoetarako erabiliz. Beraz, esan genuen, ados, posizioa i Oraindik dugu, eta begiratzen elementu guztiak behar dugu i eskubidea ordena gutxieneko aurkituko. Beraz, horrek esan nahi du, 1 + i bilatzeko zerrendaren bukaeran nahi dugu. Eta orain, elementu ari gara gaur egun begira gure gutxieneko baino gutxiago bada, orain arte, , gogoan, gutxienez off ari gara hasi besterik ez izan edozein izanda ere elementu ari gara; gutxieneko bere gain hartzen dut. Elementu bat iruditzen zait hori baino txikiagoa bada, orduan esan nahi dut joan, ados, ondo, gutxienez, berria aurkitu dut. Non gutxieneko zela gogoratzen dut. Beraz, gaur egun, behin hori Unsorted eskuineko segmentu bidez dut joan, Posizioa i elementu gutxieneko elementu swap noa esan dezaket. Hau da nire zerrenda sortu du, nire horrela antolatu ezkerretik eskuinera zerrenda zati, eta ez dugu inoiz elementu bat begiratu behar berriro zati horretan behin. Behin trukatuko dugu. Hargatik exekutatu aukeraketa sort zerrenda honetan. Blue elementu hemen i izango da, eta elementu gorri gutxieneko elementu izango da. Beraz, bide guztiak hasten i zerrendaren ezkerreko, eta, beraz, 5. Orain gutxieneko Unsorted elementu aurkitu behar dugu. Beraz, 0 <5, eta, beraz, 0 my new minimoa esaten dugu. Baina ezin dut gelditu, nahiz eta aitortu 0 txikiena dugulako, beste elementu guztietan ziurtatu zerrenda bidez exekutatu behar dugu. 1 Beraz, handiagoa da, 6 handiagoa da, 4 handiagoa da. Horrek esan nahi du, elementu horiek guztiak begiratu ondoren, 0 txikiena erabaki dut. Beraz, 5 eta 0 swap noa. Behin hori swap I, zerrenda berri bat lortu dut joan, eta inoiz ez 0 dela berriro begiratu behar dut ezagutzen dut behin trukatuko dugu dudalako, ordenatuko dut da eta egiten gaude. Orain, beraz, zerbait gertatzen da elementu urdina da berriro 5, eta 1 begiratu behar dugu, 6 eta 4 1 zehazten duten gutxieneko elementu txikiena da, beraz, 1 eta 5 swap dugu. Berriz ere, begiratu behar dugu - compare 5, 6 eta 4, eta 4 eta 5 swap dugu, eta, azkenik, alderatu duten 2 zenbakiak, eta horiek swap lortuko dugu gure zerrenda ordenatuko arte. Aukeraketa sort edozein galdera? Ongi da. Dezagun azken gaia mugitzeko hemen, eta hori errekurtsio. Errekurtsio, gogoan,, hau benetan meta gauza da, non funtzio bat behin eta berriz dei egiten die bere burua. Beraz, uneren batean, gure fuction da berriz, eta behin eta berriz, bera deituz, geure burua deituz gelditzeko dugu noizbait izan behar. Hori egiten ez badugu, ondoren, delako besterik ez ari gara Horretarako betirako jarraituko du, eta, gure programa ez da amaitutzat joan. Baldintza hau oinarri kasuan deitzen diogu. Eta oinarri kasuan dio, baizik eta funtzio bat berriro deituz baino, Besterik ez dut balio batzuk itzuli egingo da. Beraz, balio bat dugu itzuliko behin, gelditu behar dugu geure burua deituz, eta gainerako deiak egin dugu hain urruti ere itzultzeko. Errekurtsiboaren kasuan oinarri kasuan kontrakoa da. Eta hori dela eta, dei bat egiteko ari gara gaur egun oraindik sartu funtzioa nahi dugu Eta, seguruenik, ez da beti, nahiz eta, beharbada argumentuak desberdinak erabili. Beraz, bada, deitzen f funtzio bat dugu, eta f izeneko hartu du 1 argumentua, eta mantendu besterik ez dugu f (1), f (1), f (1) telefonora deituz, eta, beraz, besterik ez da gertatzen 1 argumentua kasu recursive jaitsierak, oraindik ari gara inoiz ez gelditzeko. Nahiz eta oinarri-kasu bat dugu, ziur azkenean base Kasu horretan, hit dugu egin behar dugu. Ez dugu mantendu, recursive kasu honetan gelditzea. Oro har, geure buruari deitzen diogu, ziurrenik ari gara beste argumentu bat izan aldi bakoitzean. Funtzioa errekurtsiboa oso sinplea da. Beraz, hau Zenbaki baten faktoriala kalkulatzeko. Gora Gora hemen dugu gure oinarria kasuan. Kasu n ≤ 1, ez gabiltza faktore berriro deitzeko. Geldiarazten ari dugu; besterik ari gara balio batzuk itzuli. Hau da, ez bada egia, orduan gure recursive kasua sakatu dugu. Iragarki hemen ari gara ez bakarrik faktore (n), deituz ez litzateke oso lagungarria izan delako. Beste zerbait faktoriala deitu dugu. Eta horrela, ikus dezakezu, azkenean, faktore (5) edo zerbait pasatzen dugu, faktore (4), eta, beraz, deitu dugu, eta, azkenean, oinarri kasu honetan hit goaz. Beraz, itxura ona. Dezagun zer gertatzen den benetan exekutatu dugu hau ikus-en. Pila da, eta demagun nagusia da funtzio hau deitu argumentu bat behar du (4). Beraz, behin faktore ikusten eta = 4, faktore bera deituko. Orain, bat-batean, faktore (3) dugu. Beraz, funtzio horiek gero eta handiagoa mantentzeko, azkenean, gure base kasuan hit arte. Puntu honetan, honen balioa bueltan bueltan (NX honen balioa itzulera) da, honen balioa itzulera NX honen balioa bueltan da. Azkenean, zenbaki batzuk sakatu behar dugu. Hemen goian, bueltan 1 esaten dugu. Horrek esan nahi du, behin zenbaki hori itzuli dugu, hau da, pop dezakegu pila off. Beraz, faktore hau (1) egiten da. 1 itzultzen du, hau faktore (1) itzulerak, 1 itzulera hau. Horretarako balio itzulera, gogoan, NX zen honen balioa itzultzeko. Beraz, bat-batean, lasaia daki 2 itzuli nahi dut. Beraz, gogoratu, itzuli honen balioa besterik ez da NX Itzultzen den balioa sortu hemen. Beraz, gaur egun esan 3 dezakegu x 2, eta, azkenik, hemen esan ahal izango dugu hau 4 x 3 x 2 besterik ez da izango. Eta itzulera behin, nagusi bat barruan osokoaren bakarra lortu dugu. Errekurtsio edozein galdera? Guztiak eskubidea. Beraz, amaieran, galderak egiteko denbora gehiago baina, orain, Joseph gainerako gaiak estaltzeko izango da. [Joseph Ong] eskubidea. Beraz, gaur egun ditudan recursions buruz hitz egin, dezagun eztabaida pixka bat sort batu zer da. Batu sort da, funtsean, zenbakien zerrenda ordenatzeko beste modu bat. Eta nola funtzionatzen du, merge sort zerrenda bat duzu, eta zer egiten dugun , esan dezagun zatitu 2 halves sartu. Dugu lehenik eta behin exekutatu batu sort berriro ezkerreko erdia, ondoren exekutatu batu sort eskuineko erdia dugu, eta horrek ematen digu orain 2 halves antolatuko dira, eta, gaur egun, halves horiek elkarrekin konbinatu goaz. Pixka bat zaila da adibide bat gabe, beraz, mozioak bidez egingo dugu, eta ikusi zer gertatzen den. Beraz zerrenda honetan, zatitu dugu 2 halves hasten zara. Batu sort ezkerreko erdia eskaintzen ditugu. Beraz, ezker erdian, eta, orain, horiek exekutatu dugu zerrenda honen bidez berriro lortzen merge sort sartu gainditu, eta, ondoren, berriro begiratzen dugu, zerrenda honen ezkerraldean eta batu sort on exekutatu dugu. Orain, behera 2 zenbakien zerrenda bat lortzen dugu, eta gaur egun ezkerreko erdia 1 bakarrik elementu luze da, eta ezin dugu zatitu zerrenda bat dituen elementu 1 erdiak bakarrik sartu da, beraz, esatea besterik ez dugu, behin 50 dugu, 1 elementua besterik ez da, dagoeneko ordenatuko da. Ari egin ondoren, ikusi ahal izango dugu zerrenda honen erdia eskuinera joan, eta 3 ere ordenatuta, eta, beraz, zerrenda honetako bi halves antolatuko dira zenbaki horiek itzuli batera sartu ahal izango dugu. Beraz, itxura, 50 eta 3 3 50 baino txikiagoa da, beraz, hasten da eta, ondoren, 50 dator sartu Orain, hori egin, atzera egin dugu eskuineko erdia da zerrenda horretan, eta ordenatu. 42 propioa zenbakia da, beraz, dagoeneko horrela antolatu du. Beraz, gaur egun horiek alderatu dugu, 2 eta 3 42 baino txikiagoa da, eta, beraz, duten lortzen lehen jarri, Gaur egun, 42 lortzen jarri, eta 50 lortzen jarri sartu Orain, hori horrela antolatu, modu guztiak joaten gara goian, 1337 eta 15. Beno, zerrenda honen ezkerreko zatian aztertuko dugu; 1337, berez da, beraz horrela antolatu eta bera, 15. Beraz, orain 2 zenbakiak hauek konbinatu dugu jatorrizko zerrenda, 15 <1337 ordenatzeko, hasten da eta, ondoren, 1337 doan sartu Eta orain, bi halves jatorrizko zerrenda top sortu horrela antolatu dugu. Eta hori guztia egin behar dugu konbinatu hauek. Itxura zerrenda honetan lehenengo 2 zenbakiak, 3 <15 ditugu, beraz, doa sort array sartu da lehen aldiz. 15 <42, eta, beraz, sartu jartzen da orain, 42 <1337, doan sartu 50 <1337, eta, beraz, sartu doa eta iragarki-Hori besterik ez dugu hartu 2 zenbakiak off zerrenda honetan. Beraz, ez ari gara 2 zerrendak artean txandakatuz. Ari gara hasieran, eta elementu hartzen ari gara txikiagoa da eta, ondoren, gure array jarriz. Orain halves guztiak batu dugu, eta egiten gaude. Edozein galdera buruz sort batu? Bai? [Student] bada splitting talde desberdinetan, zergatik ez zatitu besterik ez dute behin eta 3 eta 2 talde batean? [Galdera ulertezinak gainerakoa] Arrazoia - beraz, galdera da, zergatik ezin batu besterik ez dugu lehen urratsa dugu ondoren? Arrazoia honako hau egin ahal izango dugu, bi aldeetan elementu ezker-gehienak etan hasiko da, eta, ondoren, txikiago bat hartu eta jarri da, ezagutzen dugun horiek banakako zerrendak aginduak jaso ditu ordenatuko dira. Beraz, bada, halves bi elementu ezker gehien bilatzen dut, Zerrendetan duten elementuak txikiena izan ari dira ezagutzen dut. Beraz, jarri ahal izango dut handi horren zerrendan elementu lekuak txikiena. Beste alde batetik, 2 zerrendak horietan han bigarren maila begiratuz gero, 50, 3, 42, 1337 eta 15, horiek ez dira ordenatuko da. Beraz, bada, 50 eta 1337 at I, 50 jarri nire zerrendan lehen noa. Baina hori ez da benetan zentzurik, 3 delako out elementu horien guztien txikiena da. Beraz, arrazoi bakarra konbinatuz urrats hau egin ahal izango dugu gure zerrendak dagoeneko horrela antolatu direlako. Zein da zergatik modu guztiak beheraino dugu bakarra zenbaki bat dugu, zenbaki bakarra delako badakizu eta bera da dagoeneko horrela antolatu zerrenda bat. Edozein galdera? Ez? Complexity? Beno, urrats bakoitzaren amaieran zenbakiak dezakezu eta erdi log n aldiz, zerrenda bat zatitzen ahal izango dugu, hau da, non n x log n konplexutasuna lortuko dugu. Eta ikus merge sort kasuan onena da n log n duzu, eta, beraz, besterik ez da gertatzen txarrena kasuan, edo han Ω dela ere n n saioa. Kontuan hartu zerbait. Mugitzea, goazen fitxategi batzuk super oinarrizko I / O. Scramble begiratu bada, nabarituko sistema nolabaiteko izan genuen duzu log fitxategi bat idazteko kode bidez irakurriz gero. Ikus dezagun nola egin dezake. Beno, fprintf dugu, besterik ez printf dezakezu uste, baina fitxategi batean ordez inprimatzea, eta, beraz, hasieran f. Kode sort hemen, zer egiten da, Scramble duzu gisa ikus dezake, errenkada zenbakiak dira errenkadan out doa 2 dimentsioko array inprimatzeko bidez. Kasu honetan, printf bistaratzen zure terminal edo zer atal irteera estandarra deitzen dugu. Eta orain, kasu honetan, guztiak egin behar dugu ordezkatu printf fprintf batera, dira zer fitxategia inprimatu nahi duzun, eta kasu honetan bistaratzen besterik ez da fitxategi hori ordez inprimatzeko zure terminal. Beno, gero begs galdera: Non fitxategi moduko hau lortuko dugu, eskuinera? Fprintf fuction saioa gainditu genuen, baina ez zen ideia izan genuen. Beno, kodea hasieran, zer egin genuen zatia kode hau hemen baino gehiago izan zen, funtsean dio irekitako fitxategi log.txt deiak. Zer ondoren egiten dugu ziurtatu fitxategi hori benetan ondo ireki egin behar dugu. Beraz, arrazoi baino gehiago egin dezake huts egin, ez duzu zure ordenagailuan nahikoa leku, adibidez. Beraz, garrantzitsua da beti fitxategia duen edozein eragiketa aurretik egiaztatu fitxategi hori ez da ondo ireki zen. Beraz, zer, fopen argumentu bat behar du, ondo, fitxategi berri bat ireki ahal izango dugu modu askotan. Zer da egin ahal izango dugu, gainditu ahal izango dugu w, horrek esan nahi du, gainidatzi fitxategia da irteerak badago, Bat gainditu ahal izango dugu, fitxategia amaieran erantsi du gainidazteko ordez, edo r zehaztu ahal izango dugu, eta horrek esan nahi du, dezagun ireki fitxategia irakurtzeko-soilik gisa. Beraz, bada programa saiatuko da fitxategi edozein aldaketa egiteko, Yell horietan, eta ez dezagun egin horiek. Azkenik, behin gaude fitxategia egin, egindako eragiketak egiten ari da, Ziurtatu fitxategia itxi egiten dugu egin behar dugu. Eta horrela, programaren amaieran, horiek berriro pasatzeko zoaz fitxategi hau ireki duzun, eta besterik ez da itxi. Beraz, hau zerbait garrantzitsua egin duzula egin duzula. Beraz, gogoratu fitxategi bat ireki dezakezu, eta ondoren fitxategia idatzi, eragiketak egiteko fitxategia, baina gero fitxategia itxi bukaeran izango duzu. Oinarrizko fitxategia edozein galdera I / O? Bai? [Student galdera, ulertezina] Eskuin hemen. Galdera da, non log.txt Fitxategi hau ez agertzen? Beno, besterik ez duzu log.txt ematen bada, sortzen da exekutagarriaren direktorioa berean. Beraz, you're - >> [Student galdera, ulertezina] Bai. Karpeta berean, edo direktorio berean, deitzen duzun bezala. Orain memoria, pila, eta zeure. Beraz, memoria ezarritako ordenagailuan nola? Beno, memoria imajinatu dezakezu bloke hau hemen sort gisa. Eta memoria zeure han itsatsita, eta hori hor behera pila deitzen dugu. Eta zeure hazten beheranzko eta pila hazten goranzko. Beraz, aipatu gisa Tommy - oh, ondo, eta beste 4 segmentu dut bigarren bat lortu behar dugu Tommy lehenago esan bezala, bere funtzioak nola deitzen bere burua, eta elkarri deitu ezagutzen duzu? Sortu dira pilaren markoa moduko hau. Beno, nagusia deiak foo foo pilaketan jartzen bada lortzen. Foo deiak bar, bar pila jarri, eta hori lortzen pila jarri ondoren. Eta itzuliko dute, dute bakoitzean get hartu off pila. Zer kokaleku horietan bakoitzean eta memoria eduki sakatuta? Beno, goiko aldean, testu-segmentua da, programa bera dauka. Hori makina kodea Beraz, han, behin zure programa konpilatu duzu. Ondoren, edozein hasieratu global aldagai. Beraz, zure programan aldagai global duzu, eta esan bezala, = 5, lortzen segmentu horretan jarri, eta eskubide hori pean, edozein uninitialized global datuak, hau da, besterik ez INT bat behar duzu, baina ez duzu esan ezer berdina da. Konturatzen global aldagai horiek ez dira, beraz, nagusiaren kanpo ari dira. Beraz, horrek esan nahi du edozein global aldagaiak deklaratu dira, baina ez dira hasieratu. Beraz, zer zeure en? Memoria esleitu malloc, lortu dugu pixka bat erabiliz. Eta, azkenik, tokian tokiko aldagai pila baduzu eta beren parametro edozein funtzio deitu dezakezu. Azken gauza, ez duzu benetan zer ingurune-aldagai badakite, baina bakoitzean programa exekutatzen duzun, zerbait lotutako da, hala nola hau programa ran duten pertsona izen hori erabiltzen da. Eta hori izan da sort-beheko aldean. Memoria helbideak, balio hamaseitarra dagokionez, 0 goialdeko Irteeran balioak doazenak, eta modu guztiak, beheraino jaisten. Kasu honetan, 32-bit sistema baduzu, , behealdean helbidea da 0x izango da, af ondoren, 32 bit direlako, 8 byte da, eta kasu honetan 8 byte 8 hamaseitarrean digituak dagokio. Beraz, behera hemen, nahi, 0xffffff ari zaren joan, eta han 0 izan zaren. Beraz, zer dira erakusleak? Batzuk, agian, ez dute estaltzen Atal honetan aurretik. baina gainean genuen joan hitzaldia, erakuslea datu mota bat da, beraz, zein denda, 50 bezalako balioa ordez nolabaiteko, memoria kokapena batzuen helbidea gordetzen. Memoria hori Like [ulertezinak]. Beraz, kasu honetan, zer egin dugu, zenbaki oso bat edo int * erakuslea dugu, hamaseitarra hau 0xDEADBEEF helbidea ditu. Beraz, zer behar dugu, hau da, gaur egun, memoria kokapena batzuk erakuslea puntu honetan, eta hori bat besterik ez, balio memoriaren kokaleku honen 50. Sistema batzuetan 32-bit, 32 bit-sistema guztietan, erakusleak hartzen dute 32 bit edo 4 bytes. Baina, esate baterako, 64-bit sistema bat, erakusleak 64 bit dira. Beraz, zerbait nahi duzu kontuan mantentzeko. Beraz, azken-bit sistema bat, erakusle bat da amaiera bit luze. Erakusleak dira sort zaila digeritzen gauza aparteko gabe, beraz memoria dinamikoa esleipena adibide baten bidez joan. Zer memoria esleipen dinamikoa ez, edo zer malloc deitzen diogu, multzoa kanpo datuak nolabaiteko esleitu duzu aukera. Beraz, datu horiek sort Programaren iraupena iraunkorra. Ezagutzen duzun delako, aldarrikatu x funtzio baten barruan, eta funtzioak hori bada, ez dute gehiago izan zen x gordetzen diren datuak sartzeko. Zer erakusleak gaitezen egin da memoria edo denda-balioak gordetzeko dezagun memoria segmentu bat, hain zuzen ere, zeure. Orain behin izarrekin itzuli dugu funtzioa, betiere, erakuslea memoria kokaleku hori, eta gero zer egin ahal izango dugu, bertan balioak begiratu besterik ez dezakegu. Dezagun adibide bat bilatzeko: Hau da gure memoria layout da berriro. Eta funtzio hau dugu, nagusia. Zer egiten da, ados, hain erraza, eskuineko? Int x = 5, pilaketan aldagai nagusia. Beste alde batetik, gaur egun erakuslea deiak funtzioa giveMeThreeInts aldarrikatzen dugu. Eta, beraz, gaur egun funtzio honetan sartu dugu, eta bat besterik ez da, pila marko berria sortzen dugu. Hala eta guztiz ere, pila marko honetan, int * temp aldarrikatzen dugu, mallocs Gurekin 3 zenbaki osoko. Beraz, int tamaina emango digu zenbat byte int hau da, eta malloc ematen digu espazio asko byte on zeure. Beraz, kasu honetan, 3 zenbaki osoko nahikoa leku sortu ditugu, eta zeure modu bat da bertan, hau da, zergatik marrazten dut gorago. Gaude egin ondoren, itzuli gara hemen, besterik ez duzu 3 ints itzuli eta helbidea itzultzen du, kasu honetan, non memoria hori baino gehiago da. Eta erakuslea = switch ezarri dugu, eta han erakuslea beste besterik ez dugu. Baina, zer funtzioak hori pilatuta hemen eta desagertu egingo da. Beraz, temp desagertzen da, baina oraindik ere mantentzen dugu non helbidea 3 zenbaki osoko horiek sare barruan daude. Beraz, multzo honetan, erakusleak dira scoped lokalean eta pilatuak fotogramaren baina memoria dute erreferentzia, zeure da. Ez duela zentzurik? [Student] Hori izan errepikatu duzu? >> [Joseph] Bai. Beraz, I itzuli pixka bat izanez gero, temp esleitu ikusiko duzu han sortu zeure memoria batzuk. Beraz, funtzio hau, giveMeThreeInts itzultzen, pila hau hemen da desagertuko. Eta edozein aldagai, kasu honetan, erakusle hau marko pilatuak banatzen zen. Hau desagertu egingo da, baina itzuli gara temp geroztik eta erakuslea ezarri dugu = aldi baterako, erakuslea da kokapen memoria berean aldi baterako izan zen seinalatu. Beraz, gaur egun, nahiz eta temp, tokiko erakuslea hori galduko dugu, aldagaia erakuslea horren barruan zer zen seinalatuz helbidea memoria oraindik mantenduko dugu. Zalantzak dituzu? Hori da gai bat nahasgarria mota izan daiteke, ez baduzu baino gehiago desagertu atalean. , Ezin dugu zure TF behin betiko gainean eta, jakina, galderei erantzun ahal izango dugu amaieran, saio berrikuspena. Baina gai konplexu bat sort da, eta diren erakusteko adibide gehiago behar dut argitzeko zer erakusleak benetan lagunduko du. Kasu honetan, erakusleak array baliokideak dira, beraz, bakarrik erabili ahal izango dut erakuslea hau array bat int gisa gauza bera gisa. Beraz, 0 sartu naiz, indexatzeko eta lehen osokoa aldatu 1, Bigarren zenbaki aldatu, 2 eta 3. osokoa 3. Beraz, erakusleak gehiago. Beno, gogoratzen Binky. Kasu honetan banatzen dugu erakuslea, edo erakuslea izendatu dugu. baina hasieran, deklaratu dut erakuslea, ez da memorian edozein lekutan seinalatuz. Zabor barruan balioak da. Beraz, ez daki non erakuslea da seinalatuz daukat. Helbide bat besterik ez da, 0 eta 1 non hasieran deklaratu bete ditu. Ezin dut ezer egin honekin deitzen diot nik malloc arte eta, ondoren, me zeure non balioak jarri ahal izango dut barruan espazio txiki bat ematen dio. Ondoren, berriro ere, ez dakit zer memoria honen barruan. Beraz, lehenengo gauza egin behar dut egiaztatzeko sistema memoria nahikoa izan zuten ala ez me itzuli zenbaki oso 1 lehenengo lekua, hau da, zergatik egiaztatu egiten ari naiz. Erakuslea null bada, horrek esan nahi du ez dela nahikoa leku edo beste zenbait errorea gertatu da, beraz, irten beharko nuke nire programa.  Baina zuen arrakasta izanez gero, gaur egun erakuslea erabili ahal izango dut eta zer * erakuslea ez da non helbidea honako hau da non balio hori da, eta berdintasuna 1 ezartzen du. Beraz, hemen baino gehiago izanez gero, memoria hori existitu egiaztatzen ari gara. Badakizu badagoela eta gero, jarri dezakezu zer balio jarri nahi duzun, baina kasu honetan, 1. Gaude berarekin egin ondoren, erakuslea askatzea behar duzu. sistema memoria Lehenik eta behin galdetu itzuli behar dugulako. Ordenagailua ez delako ezagutzen ari egiten dugunean. Kasu honetan esplizituki ari gara kontatzea, ados, gaude memoria horrekin egiten da. Beste prozesu batzuk behar izanez gero, beste programa bat behar da, sentitzen free aurrera joan eta eraman. Zer ere egin ahal izango dugu, besterik ez gaitezke multzoa aldagai lokalak helbidea. Beraz, int x nagusia pilatuak markoaren barruan dago. Eta ampersand hau erabiltzen dugu, eta operadorea, zer egiten da x hartzen du, eta x memorian datu batzuk besterik ez da, baina helbide bat du. Dago nonbait. Beraz deituz & x, zer hau ez da ematen digu x helbidea. Hau eginez, erakuslea puntu egiten ari gara non x memoria da. Orain ez dugu * antzeko zerbait x, gaude 5 itzuli. Star deritzo dereferencing. Helbidea jarraitzen duzu, eta gordetzen ez dago balioa lortuko duzu. Edozein galdera? Bai? [Student] 3-puntako gauza egin ez baduzu, ez konpilatu oraindik ere? Bai. 3-erakuslea gauza egin ez baduzu, oraindik konpilatu egingo da, baina erakutsi dut zer gertatzen da bigarren batean, eta hori egin gabe, hori memoria leak deitzen dugun. Ez sistema ematen ari zara atzera bere memoria, eta beraz, ondoren programa da pilatzen, berriz, joan memoria hori ez erabiltzea, eta, kito erabili daiteke. Ikusi duzun inoiz bada Firefox zure ordenagailuan kilobyteko 1,5 milioi, zereginen kudeatzailea, zer ari den gertatzen. Memoria leak duzu programa ez dutela manipulazioa. Beraz, nola ez erakuslea aritmetika lan? Beno, erakusle aritmetika indexatzeko bezalako sort da array batean. Kasu honetan, erakusle bat daukat, eta zer gertatzen da, hain zuzen ere, erakuslea puntu egin dut lehenengo elementu 3 zenbaki osoko ditudan esleitu array hau. Beraz, gaur egun egiten dudana, star erakuslea besterik ez zerrendan lehenengo elementua aldatzen da. Star erakuslea +1 hemen puntu. Beraz, erakuslea hemen baino gehiago da, erakuslea +1 da hemen, erakusle +2 da hemen. Beraz, 1 gehitu array honetan zehar mugitzea gauza bera da. Zer egiten dugu, hau da, helbidea, erakuslea +1 egiten dugu hemen baino gehiago, eta hemen balioa lortzeko, izar bat jarri adierazpen osoa dereference. Beraz, kasu honetan, lehen array hau kokapena dut ezartzeko, 1 bigarren kokalekua, 2 eta hirugarren 3 kokapena. Orduan, zer baino gehiago egiten ari naiz hemen gure erakuslea +1 inprimatzeko dut, horrek ematen dit 2. Orain erakuslea naiz incrementing, beraz erakuslea erakuslea +1 berdinen horrek egiten du aurrera. Eta beraz, gaur egun inprimatu badut +1 erakuslea da, erakuslea +1 gaur egun 3 kasu honetan, zein bistaratzen 3. Eta ahal izateko free zerbait, erakusle ematen dut array back got I malloc hasieran egon behar seinalatuz. Beraz, kasu honetan, I 3 deitu hementxe, hau ez litzateke izango eskubidea, array-erdian delako. Kendu behar dut jatorrizko kokapena Leku aurretik I askatzea hasierako lehen. Beraz, hona hemen adibide bat gehiago parte hartzen da. Kasu honetan, 7 karaktere array batean karaktere ari gara esleitzean. Eta, kasu honetan, zer egiten ari garen, horietako lehenengoa 6 urtetik gorako begizta batean ari gara, eta horiek ezartzen ari gara Z. Beraz, int for i = 0, i> 6, i + +, Beraz, erakuslea + just egingo i eman digu, kasu honetan, erakuslea, erakuslea +1, erakuslea +2, +3 erakuslea, eta, beraz, eta beraz, loop en aurrera. Zer egin egingo da helbide hori lortzen, dereferences balioa lortu du, eta aldaketak Z. bat balio Gero, amaieran gogoratu honek kate bat da, ezta? Kateak guztiak amaitutzat null izaera amaituko da. Beraz, ez dut erakuslea 6 amaierako karakterea null jarri dut sartu Eta orain zer, batez ere, naiz egiten hemen printf kate bat ezartzeko, ezta? Beraz, ez printf now denean da kate baten amaiera iritsi? Amaierako karakterea null hits. Beraz, kasu honetan, nire jatorrizko erakuslea puntu array honen hasieran. Lehen karaktere inprimatzen ditut. Bat baino gehiago eraman dut. Pertsonaia bat inprimatu dut. Eraman ditut. Eta hau egiten iristeko amaiera arte mantendu dut. Eta orain amaiera * erakuslea dereference eta amaierako karakterea null itzuli. Eta, beraz, nire bitartean begizta bidez balioa legala denean bakarrik ez dela null amaierako pertsonaia. Beraz, gaur egun irten I begizta hau. Eta, beraz, kendu dut 6 erakuslea honetan, Atzera egin nuen hasieran. Gogoan izan, hau egiten ari naiz, hasieran joan behar dut askatzea duelako. Beraz, hori izan zen asko ezagutzen dut. Ba al dago edozein galdera? Mesedez, bai? [Student galdera ulertezinak] Ezin esan ozenago? Sentitzen dugu. [Student] diapositiba azken eskuinera erakuslea aurretik askatu On non ziren erakuslearen balioa benetan duzun bezala, aldatzen? [Joseph] Beraz, hementxe. >> [Student] Oh, ados. [Joseph] Beraz, erakusle ken minus bat daukat, eskuinera, gauza bat atzera mugitzen da, eta gero libre I erakuslea honetan array-hasieratik adierazi behar duelako. [Student] Baina hori ez litzateke da beharrezkoa izan gelditu line ondoren. [Joseph] Beraz, nuen, gero gelditu, hori kontuan hartu beharko litzateke memoria leak, nuen ez delako exekutatu free. [Student] I [ulertezinak] lehen hiru lerroak non erakuslea +1 [ulertezina] izan duzu ondoren. [Joseph] Uh huh. Beraz, zein da galdera dago? Sentitzen dugu. Ez, ez. Joan, joan, mesedez. [Student] Beraz, ez duzu erakusleak balioa aldatuz. Erakuslea ken ken egin duzu, ez luke izan. [Joseph] Bai, zehazki. Beraz, erakuslea +1 eta +2 erakuslea do I, Ez dut erakuslea egiten berdinen erakuslea +1. Beraz, erakusle besterik egonaldi array hasieran seinalatuz. Bakarrik da plus egin behar dut plus ezartzen duen balioa erakuslea barruan back, benetan dela mugitzen da hau ere. Guztiak eskubidea. Galdera gehiago? Berriz ere, hau jasanezinak sort bada, saio egingo dira estali. Galdetu zure irakaskuntza fellow da, eta amaieran galderak erantzun ahal izango dugu. Eta, normalean, ez dugu nahi minus hori egin. Mantenduz me pista zenbat array Nik konpentsatu behar du. Beraz, oro har, hau da, besterik gabe, nola erakuslea aritmetika lanak azaltzeko. Baina, zer egin izan ohi dugu erakuslea kopia bat sortu nahi dugu, hau da, eta, ondoren, kopia hori erabili dugu inguruan mugitzen ari gara, katean. Beraz, kasu hauetan kate osoa kopia inprimatu erabili nahi duzun, baina ez dugu erakuslea ken 6 ez bezala edo zenbat mugitu dugu segimendua besterik ez delako gure jatorrizko puntu hori oraindik zerrendaren hasieran adierazi badakigu eta aldatuak dugun kopia hau izan zen. Beraz, oro har aldatzeko, zure erakuslea jatorrizko kopiak. Ez saiatu bezala ordenatzeko don't aldatzen jatorrizko kopia. Zure jatorrizko kopiak bakarrik aldatzen saiatzen. Beraz, katea pasatzen dugu printf sartu nabarituko duzu ez duzu aurrean izar bat jarri genuen beste dereferences guztietan bezala, ezta? Beraz, inprimatu badu kate osoa% s helbide bat espero da, eta kasu honetan, erakuslea edo karaktere array bat bezala, kasu honetan. Pertsonaiak, char * s, eta array gauza bera dira. Erakuslea karakteretakoa izan behar da, eta karaktere array dira gauza bera. Eta, beraz, guztiak egin behar dugu da erakuslea pasatzeko. Ez dugu * erakuslea edo horrelako ezer atsegin pasatzeko. Beraz, array-ak eta erakusleak, gauza bera dira. Denean zerbait egiten ari zarenean x bezala array bat hemen [y], kanpaia azpian egiten esaten da, ados, pertsonaia multzo bat da, beraz, erakuslea da. Eta, beraz, x gauza bera dira, eta, beraz, zer egiten da y gehitzen du x aurrera memoria askoz ere gauza bera da. Eta orain, x + y helbidea ematen digu nolabaiteko eta helbidea dereference edo arrow jarraitu dugu non memoria kokapena dela eta balioa lortuko dugu memoria kokaleku horretara. Beraz, eta, beraz, bi hauek gauza bera dira. Sintaktiko azukre bat besterik ez da. Gauza bera egiten dute. Bata bestearen syntactics ezberdinak dira. Beraz, zer oker joan daiteke erakusleak? , Antzekoa da. Ongi da. Beraz, gauza txarrak. Batzuk egin ahal izango duzu, gauza txarrak ez dira egiaztapena zure malloc dei itzultzen null, ezta? Kasu honetan, sistema dut galdetuz niri emateko zer da zenbaki hori? 2 bilioi aldiz 4 bezala, zenbaki oso bat tamaina da, 4 byte delako. Galdetzen dut 8 milioi byte bezala. Jakina, nire ordenagailua ez da askoz memoria atzera me emateko gai izango da. Eta ez genuen egiaztatu null bada, eta, beraz, saiatu dereference han - jarraitu arrow non egingo - ez dugu memoria hori. Hau da, zer, null erakuslea dereferencing deitzen dugu. Eta hori funtsean eragiten nahi duzun segfault. Segfault dezakezu modu bat da. Beste gauza txarrak egin ahal izango duzu - oh ondo. Horixe zen null erakuslea dereferencing. Ongi da. Beste gauza txarrak - ondo konpontzen, hori bakarrik ez txeke bat jarri egiaztatzen erakuslea den null eta irten programaren gertatzen da malloc hori null erakuslea itzultzen bada. Hori xkcd komiki. Pertsonak ulertzen da orain. Ordenatzeko. Beraz, memoria. Eta horren gainean joan nintzen. Malloc deituz begizta batean ari gara, baina denbora malloc deitzen dugun bakoitzean pista galdu non erakuslea da apuntatzen ari gara, ari gara delako clobbering. Beraz, dei malloc hasierako ematen dit memoria baino gehiago dago hemen. Nire erakuslea honen erakusle. Orain, ez dut libre da, eta, beraz, gaur egun malloc deitu dut berriro. Orain puntu ezazu hemen. Orain nire memoria seinalatuz hemen. Baino gehiago seinalatuz hemen. Baino gehiago seinalatuz hemen. Baina pista galdu dut hemen esleitu I baino gehiago memoria helbideak. Eta, beraz, gaur egun ez daukat erreferentzia edozein jada. Beraz, ezin dut askatzea itzazu begizta honen kanpo. Eta beraz, honen antzeko zerbait konpontzeko, memoria libratzeko ahaztuz gero eta memoria-leak hau lortuko duzu, Memoria libratzeko begizta honen barruan zauden behin egin behar duzu. Beno, hau da, zer gertatzen den. Zu asko gorroto hau ezagutzen dut. Baina orain YAY! 44.000 kilobyteko bezala. Beraz, libre begizta-amaieran, eta hori memoria besterik ez askatzea, aldi bakoitzean. Funtsean, programa ez da izan memoria leak jada. Eta orain, beste zerbait egin dezakezu memoria batzuk libre birritan eskatu duzula. Kasu honetan, zerbait malloc, bere balioa aldatzeko aukera ematen dizu. Askatzea duzu behin duzulako egin ziren esan duzu. Baina gero, libratuko dugu berriro. Zerbait nahiko txarra da. Ez da, hasieran segfault joan baina ondoren zer hau ez da bikoitza corrupts hau zure zeure askatzeaz egitura, berriz, ikasi eta apur bat gehiago duzu hau aukeratu duzu klase bat hartu CS61 bezala. Baina, funtsean, ondoren ordenagailua nahastu ahal izateko, berriz, joan oroimena kokapenak dira, non eta bertan gordeta buruz - non datuak memorian gordetzen. Eta horrela erakuslea uzten birritan gauza txar bat egin nahi ez duzula. Beste gauzak gaizki joan daiteke, ez da sizeof erabiliz. Beraz, kasu honetan 8 byte malloc eta hori bi zenbaki osoen gauza bera da, ezta? Beraz, Guztiz ziurra da, baina ez da? Beno,, Lucas buruz hitz egin zuen gisa arkitekturetan ezberdinetan, Osoko zenbaki luzerak desberdinak dira. Beraz,-tresnak erabiltzen ari zaren, zenbaki osoen 4 buruz bytes, baina beste sistema batzuk on 8 byte izango dute agian edo 16 byte dute agian. Beraz, besterik ez dut erabiltzen bada, zenbaki hau hemen Programa hori lan-tresnaren, baina ez da nahikoa beste sistema batzuk memoria esleitu. Kasu honetan, hau da, zer sizeof operadorea erabiltzen da. Diegu sizeof (int), hau ez da  ematen digu programa martxan dagoela sistema osokoa baten tamaina. Beraz, kasu honetan, sizeof (int) 4 itzuliko da aparatuaren antzeko zerbait, eta, gaur egun, hau borondate 4 * 2, hau da, 8, besterik ez da, bi zenbaki osoen beharrezko espazioa zenbatekoa. Beste sistema bat, int 16 byte edo 8 byte bezala bada, besterik ez da nahikoa byte itzuli kopuru hori gordetzeko. Eta, azkenik, structs. Beraz, nahi izanez gero, sudoku-taula bat gordetzeko memoria, nola liteke hau egiten dugu? Uste duzu Lehenik eta behin, aldagai bat bezala, bigarren gauza aldagaia, aldagai bat hirugarren gauza, dago gaizki, ezta gauza laugarren aldagai bat? Beraz, hobekuntza bat honen gainean egin dezakezu 9 x 9 array egiteko. Hori da fina, baina zer bada beste gauza batzuk asoziatu nahi duzun sudoku taula nahi zer taula zailtasuna da, edo, esate baterako, zein den zure puntuazioa, edo zenbat denbora taula hau konpontzeko neurriak hartu behar duzu? Beno, zer egin dezakezu, eta egitura bat sor dezakezu. Zer da, funtsean, esaten dut egitura definitzen dut hemen, eta sudoku-taula duen taula bat da, 9 x 9 osatzen dute dut definituz. Eta zer maila izena erakusleak du. Horrez gain, x eta y,, non oraintxe nago koordenatuak diren. Horrez gain, denbora [ulertezina], eta mugitzen da sartu dut, orain arte, guztira du. Eta, beraz, kasu honetan, datu-sorta osoa multzokatzea ahal izango dut bakar bat egitura izatea, aldagai desberdinen inguruan hegan bezala atsegin ordez ez dut benetan mantentzeko pista. Eta hau aukera ematen dizu, eta egitura honen barruan gauza ezberdinak erreferentziatutako sort sintaxia nice dute gurekin. Besterik ez dut egin ahal izango board.board, eta sudoku-taula lortu dut. Board.level, nola gogorra da. Board.x eta board.y eman dit, non taula izan liteke I koordenatuak. Eta beraz, zer deitzen dugun egiturari, eremu naiz sartzen. Hau sudokuBoard que tengo mota bat da, eta horrek definitzen du. Eta orain hemen gaude. "Taula" mota sudokuBoard izeneko aldagai bat daukat. Eta horrela, gaur egun osatzen duten egitura hau hemen eremu guztiak sartu ahal izango dut. Structs buruzko edozein galdera? Bai? [Student] int x, y, bai deklaratu lerro bat? >> [Joseph] Uh huh. [Student] Beraz, ezin do besterik ez duzu hori horiek guztiak? X bezala, y koma aldiz guztira dela? [Joseph] Bai, zalantzarik izan duzu hori egin, baina arrazoia x eta y lerro berean jarri dut - eta galdera da zergatik egin dezaket besterik ez dugu lerro berean? Zergatik ez jarri besterik ez dugu horiek guztiak lerro berean x eta y dira elkarren artean lotutako eta hau besterik ez da estilistikoki zuzena, neurri batean, bi gauza delako lerro berean taldekatzea horrela sort gauza bera dira. Eta zatitu besterik ez dut horiek alde batera utzita. Style gauza bat besterik ez da. Diferentzia inolako egiten funtzionalki. Structs buruzko galderak beste edozein? Bat defini dezakete Pokédex duzu eta egitura batekin. Pokemon A zenbaki bat du eta gutun bat, jabea, mota bat du. Eta gero Pokemon array bat izanez gero duzu, osatzen dezakezu Pokédex bat, ezta? Ados, cool. Beraz, buruzko galderak structs. Hauek dira structs lotutako. Azkenik, GDB. Zer esan nahi du GDB utzi egin nahi duzu? Zure programa arazteko aukera ematen du. Eta ez baduzu erabiltzen GDB, gomendatzen nuke labur begira eta besterik ez zer GDB da, nola lan egiten duten, nola erabil dezakezu, eta probatzeko programa bat. Eta beraz, zer GDB aukera ematen dizu do eteteko [ulertezina] sortu zure programaren bidez eta praktikoak line. Esate baterako, nahi pausatu exekuzioa dut nire programaren 3. Line atsegin at eta linea 3 naiz inprimatu balioak daude guztiak. Eta beraz, zer deitzen dugun lerro bat bezala gelditzea etendura-puntua jarriz lerro hartan deitzen dugun eta, ondoren, inprimatu ahal izango dugu programaren egoera aldagai garai hartan. Ezin dugu, orduan programaren lerro-lerro zehar. Eta gero, pilaren egoera garai hartan ikusi ahal izango dugu. Eta beraz, GDB, zer egiten dugun clang deitzen dugun C fitxategia erabili ahal izateko, baina pasa-ggdb Ez dugu. Eta behin gaude egin duten gdb exekutatu besterik ez dugu Emaitzeko fitxategia irteera. Eta, beraz, testu-masa atsegin batzuk lortuko duzu hau atsegin dute, baina benetan egin behar duzula komandoak idatzi hasieran. Break nagusia etendura jartzen nagusia. Zerrenda 400 kode lerro zerrendatzen line 400 inguru. Eta, beraz, kasu honetan dezakezu begiratu eta esan, oh, Line 397 etendura-puntua, lerro hau ezarri nahi dut, eta, ondoren, zure programa Urrats horretan doa eta hondatu. Eteteko han da, eta inprimatu dezakezu, adibidez,, baxua edo goi balioa. Eta, beraz, jakin behar duzun komando sorta bat daude, eta slideshow hau igo dira web orrian, hala bada nahi besterik ez duzu hauek erreferentzia edo like jarri zure orriak Cheat, sentitzen free. Cool. Hori Quiz Review 0 izan zen, eta makila inguruan dugu, edozein zalantza izanez gero. Guztiak eskubidea.  [Txalo] [CS50.TV]