[Speel van musiek] DAVID J. MALAN: Dit is soos 'n groentjie seminaar vandag. OK. So baie reën uit. Dit is geneig om te gebeur op Woensdae, maar des te meer geleentheid vir vrae van vandag. So laat ons begin eintlik af met die film in net 'n oomblik. Maar ons sal grandly begin soos altyd. Dit is CS50, en dit is die einde van die week 4. So as jy ooit gekyk TV of 'n fliek waarin daar is 'n paar rekenaar kundiges en die polisie, of FBI, of 'n agentskap probeer om 'n paar te vang teenstander, wel, jy het waarskynlik gehoor van die uitdrukking "te verbeter," waardeur dit een of ander manier tegnikus mettertyd zoomt in oneindig ver na die misdadigers te sien identiteit of die kenteken selfs in die blink van 'n spieël of die glinstering van iemand se oog. So ja, laat ons 'n blik op 'n paar sulke tonele uit Hollywood. [Video speel] -OK, Nou, laat ons 'n goeie blik op jou. -Hou dit vas. Begin dit terug. -Wag 'n minuut. Gaan regs. -Daar, Vries dit. -Volskerm. -OK, Vries dit. -Tighten Op dit, sal jy? Vector in daardie man deur die agterwiel. -Zoom In reg hier op hierdie plek. -Met die regte toerusting, die beeld vergroot kan word en geslyp. -Wat is dit? -Dit Is 'n verbetering program. -Kan Jy duidelik dat om enige? -Ek weet nie. Kom ons verbeter dit. -Enhance Artikel A6. -Ek Versterk die detail, and-- Ek dink daar is genoeg om te verbeter, stel dit aan my skerm. -Ek Versterk die weerkaatsing in haar oog. -Laat Hierdie loop deur video verbetering. -Edgar, Kan jy dit verbeter? -Hou vas. -I've Werk op die besinning. Weerspieëling -Someone se. -Reflection. -Daar Is 'n weerspieëling van die man se gesig. -Die Besinning. -Daar Is 'n weerspieëling. -Zoom In die spieël. -Jy Kan 'n weerspieëling te sien. -Kan Jy die beeld te verbeter van hier af? -Kan Jy hom hier te verbeter? -Kan Jy dit verbeter? Kan jy dit te verbeter? -Kan Ons dit verbeter? -Kan Jy dit verbeter? -Hold Op 'n tweede, sal ek verhoog. -Zoom In aan die deur. -Times 10. -Zoom. -Trek in. -Meer. -Wait, Stop. SECRET. -Pause Dit. -Rotate Ons 75 grade rondom die vertikale, asseblief. SECRET. Gaan terug na die kant oor die deur, weer. -Got 'N beeld verbete wat kan bitmap? Hey, miskien kan ons die Pradeep gebruik Sen metode om te sien in die vensters. -Dit Sagteware is die toestand van die kuns. -Die Eiewaarde is af. -Met die regte kombinasie van algorithm-- -hy Se geneem uitskakeling algoritmes na die volgende vlak, en ek kan dit gebruik om verbeter die foto. -Lock Op en vergroot die z-as. -Enhance. -Enhance. -Enhance. -Freeze En te verbeter. [Einde afspeel] DAVID J. MALAN: Alle reg, sodat Al wat is eintlik woorde. Hulle is maar net gespan saam in 'n manier wat nie eintlik sinvol. En, in werklikheid, CS50 en kursusse soos dit geneig is om 'n baie van die TV en flieks ruïneer vir jou. Want wanneer die rekenaar kundiges is huppelend af en sê terme fancy dinge soos eievektore, en die z-as, en 'n aantal ander eintlik meer tegniese terme, hulle regtig net bedrading woorde saam al te dikwels. Is dat een van ons hoop is dat, as 'n newe-effek van die neem van kursusse soos hierdie, sal meer mense in die wêreld werklik in staat wees om te weeg in en net so effens beïnvloed ooit die kwaliteit en akkuraatheid van die films? In werklikheid, laat ons 'n blik op die werklikheid. So hier is die personeel van foto Maria, een van ons onderrig genote. En veronderstel sy is vermoedelik van iets. En tog, daar is 'n sprankie 'n stuk van bewyse in haar oog, of in die weerspieëling van haar bril. Wel, as ons presies doen soos die films stel, waarin ons zoom en "verbeter", dit is hoe baie inligting is in Maria se gesig wanneer jy 'n beeld te vang met daardie oorspronklike resolusie. En, in werklikheid, kan jy hierdie punte te sien. En dit is wat genoem pixels, P-I-X-E-L-S, wat net 'n vierkant tipies dit is 'n punt wat 'n beeld komponeer. En terug in die dag, en eintlik nog vandag met 'n paar van vandag se LED TVs of LCD TVs, as jy het ' een in jou kamer of by die huis, as jy gaan super naby daaraan, en veral as dit 'n ietwat ouer TV, jy kan waarskynlik selfs sien dat hierdie kolle en dit is wat komponeer 'n beeld. En daar is geen meer inligting as dit. Ons kon "verbeter", in die sin van gladstryking dinge oor en soort afleidings soort, soort van wat kleur moet langs Mary's oog sodat dit nie eintlik so pixelated. Maar as ek hou inzoomen, is daar is die slegte ou in haar oë. Soos dit is al die inligting wat ons het. Jy kan nie ' inligting uit niks. Daar is slegs 'n eindige aantal bisse daar. So in Probleem Stel 4, waar jy het 'n geleentheid om te speel met hierdie soort van die wêreld. In Probleem Stel 4, sal jy verken die wêreld van beelde, en forensiese ondersoeke, en eintlik skryf kode wat herstel verlore beelde. Jy sal kode te skryf wat manipuleer bestaande beelde en uiteindelik verstaan ​​wat is gaan op onder die kap. En dit blyk, dit is eintlik nie al wat ingewikkeld. Byvoorbeeld, as ons wou verteenwoordig 'n smiley face waar met hierdie swart pixels, of hierdie swart kolle, Wel, ons kan eenvoudig verteenwoordig hulle as werklik 'n bitmap. En as jy ooit gehoor het dat uitdrukking bitmap, miskien dit begin nou 'n maak bietjie meer sin vandag. Ons weet reeds wat 'n bietjie is. Dit is 0 of 1. En 'n kaart is net iets soos 'n stukkie papier wat gee jou aanwysings en het miskien 'n rooster van x- en y-koördinate. So hier is 'n bitmap. Dit is 'n kaart van stukkies waardeur 'n 1 is blykbaar gaan 'n wit pixel verteenwoordig, en 'n 0 gaan 'n swart pixel verteenwoordig. Maar ons kon beslis flip dit rond. Dit maak nie regtig saak so Solank as wat ons is konsekwent. En hier is hoe, in binary-- binnekant geheue van 'n rekenaar of selfs binne van 'n lêer op jou hard drive-- kan jy slaan die eenvoudigste van smiley face beelde. Maar wat is ons, natuurlik, ontbreek in hierdie beeld? Kleur, reg? Dit is 'n duidelike volgende stap of verbetering om dit te verbeter met kleur. So ongelukkig met net 'n enkele bietjie, 0 of 1, kan ons kleur verteenwoordig. Dit kan rooi, of blou wees, of swart of wit, of groen, of pienk, of enige pare van kleure. Maar ter wille van eenvoud, sal ons net aanneem swart en wit. So, wat logies moet ons as ons wil implementeer kleur in 'n beeld? Wat moet ons doen? Soos as die beperkende faktor hier is dat met 'n bietjie kan jy net verteenwoordig twee state, 0 of 1, wit of swart, wat wil jy doen? GEHOOR: Meer data. DAVID J. MALAN: Meer stukkies, ja meer data, meer stukkies. En, inderdaad, dit is presies hoe kleur prente verteenwoordig. Eerder as 'n enkel bietjie, 'n 0 of 1 vir elke pixel, elke dot, jy net die gebruik van verskeie. Miskien gebruik 8, miskien, meer algemeen gebruik 24, en inderdaad, in Probleem Stel 4, sal jy speel met 'n lêer formaat wat 24 stukkies gebruik tipies. Maar die meeste van julle is waarskynlik vertroud is met JPEG. As jy al ooit geneem 'n foto op jou selfoon, of foto of iets gesien op Facebook, of Flickr, enige aantal van foto gebaseerde webwerwe, jy het waarskynlik 'n JPEG prent gesien voor. En dit blyk, is dit die lêer formaat ons gaan gebruik in PSet 4, waardeur jy gaan moet beelde herstel dat ek per ongeluk het verwyder van 'n beskadig geheue kaart in die kamera, as jy wil. En dit blyk dat selfs al JPEG is redelik sophisticated-- dit is baie meer gesofistikeerd as die swart en wit kolle ons het 'n oomblik gelede, want daar is eintlik fancy algoritmes wat word gebruik om 'n JPEG compress, so dat jy 'n baie mooi kan hê, kwaliteit foto, maar met behulp relatief min stukkies. En ons sal terug te kom kompressie voor lank. Dit blyk dat die eerste drie grepe in 'n JPEG image-- maak nie saak wat jy 'n foto geneem het of-- is die waardes 255, 216, 255. Met ander woorde, as jy net sien dat patroon van stukkies, hier verteenwoordig as drie grepe, of 24 stukkies totaal met 'n hoë waarskynlikheid kan jy aflei dat jy op soek is na dit op hierdie eerste drie grepe van 'n JPEG. En dit is wat bekend staan as die handtekening van 'n JPEG. Daar is baie van die lêer formate daar is geneig om te begin met sekere patrone van 0e en 1e, sodat Windows en Mac OS en iOS, en Android weet watter soort lêer hulle is, bykomend tot die sogenaamde lêer uitbreiding wat 'n baie lêers. As jy jpg, dit is 'n ander leidraad tot die rekenaar. So laat ons kyk nou na hierdie 'n bietjie meer tegnies. Ons weet die desimale stelsel is 0 tot 9. Ons weet binêre is 0 en 1. En as jy dink terug aan PSet 0, ons het jou stoei met, vir 'n bietjie iets genoem heksadesimaal, waar jy 16 syfers, in plaas van 10 of in plaas van 2. En dié syfers deur konvensie, is 0 tot 9 en dan 'n deur f, waar f verteenwoordig wat desimale getal, net soos 'n vinnige gesonde verstand kontroleer? So, 15. En 'n moet 10 verteenwoordig, net deur aard van die bestel wat ek gegee het. Dis net 'n arbitrêre konvensie, maar dit is redelik standaard. So as ons kyk na hierdie patroon drie bytes-- laat net begin om te kyk na dit in 'n wyse wat in ooreenstemming is met hoe rekenaar wetenskaplikes oor die algemeen kyk na en dink oor lêers. Jy kan seker dink oor lêers in 0e en 1e en desimale, maar in werklikheid, is ons geneig om binêre gebruik of meer tipies hexadecimal-- terug van PSet 0. So laat my voorstel dat 255, 216, 255 en is net hierdie patrone van 0e en 1e. En jy kan dit kyk of jy wil die wiskunde te doen van Week 0. Maar vir nou, net aanneem dat dit inderdaad korrek is. Ek het net herskryf drie desimale getalle as drie binêre waardes. Nou wat ek gaan doen, is om voeg net 'n paar wit ruimte, net ter wille van leesbaarheid se. En kennis, Ek gaan net om dinge uitmekaar beweeg. So voor, agter, voor, agter. Ek is niks interessant ander doen as net die verspreiding van dinge uit sodat daardie kennisgewing elke stel agt stukkies is nou twee stelle vier stukkies. Dit is nuttig omdat heksadesimale is veral die mode want elke heksadesimale syfer 0 deur f, of meer spesifiek 0 tot 15, kan word met presies vier stukkies. Met ander woorde, in heksadesimaal as jy wil verteenwoordig 'n 0, dit is net 0000, vier nulle. En as jy wil om 15 verteenwoordig, dit is 1111, wat vier stukkies. En as jy die wiskunde te doen, As dit is die kinders plaasvind, dit is die 16s plek, wat gaan you-- gee eerder wat gaan aan- jammer, in binêre, wat gaan jy 15 gee, kinders plek, twees plek, viere en agstes plek. So laat my stel dat stel van vier stukkies aan die linkerkant is wat ons gaan f noem. Dit is die grootste getal wat jy kan met vier stukkies. En ons weet reeds van heksadesimaal, f is die grootste syfer in heksadesimaal. Ons het 'n ander f het daar twee daar. En vir nou, net op geloof dat ek die wiskunde reg gedoen en dat die linker helfte van daardie stukkies, 1101, is dieselfde as d in heksadesimaal. En die regterhand, 1000, is net 8. En dat 'n mens maklik om te sien, reg? Die 8 represents-- reg onder daardie agts plek. So het ons een in die kolom agts en niks in die viere, twees of kinders. So nou meer konvensioneel, mense is geneig om heksadesimale syfers soos hierdie te skryf, jy net suig hulle saam, en dan kan jy hulle as voorvoegsel met 0x. Dit beteken niks anders as 'n visuele leidraad na 'n human-- hier kom 'n heksadesimale value-- omdat dit kan nie anders wees voor die hand liggend. Wat is om te sê, uiteindelik, wat die patroon van nulle en ene, of die patroon van die heksadesimale syfers in dieselfde dat jy gaan om te begin soek na in Probleem Stel 4 is this-- En die probleem Stel 4 spec sal wandel jy deur middel van hierdie in meer detail-- maar besef as 'n soort van arcane as hierdie dalk lyk met die eerste oogopslag, jy gaan begin sien dit 'n baie. En in die feit, selfs in GDB, die debugger ons op Maandag bekendgestel en Dan stel in PSet 3, gaan dikwels wys jou heksadesimale waardes net omdat hulle geneig is om meer te wees konvensionele as desimale of binêre in die wêreld van rekenaars. Nou laat sit dit in konteks. Baie van julle dalk onthou foto hier, wat van wat gekom het? Vista, sodat selfs vroeër as dat Windows XP het dit debuut. So, dit is 'n pragtige landskap. En in werklikheid, as jy poke rond online-- Ek dink dit is 'n Wikipedia artikel, waarin iemand het baie verbasend uit het gevind dat hierdie plek in die wêreld opgestel sy of haar kamera in presies die regte place-- en dit vandag lyk, maar like-- dit is presies dieselfde omgewing. Hierdie beeld is, is in 'n lêer formaat genoem bitmap, b-m-p. En ons gaan 'n super neem vinnige blik op wat dit beteken. Maar bitmap is net 'n ander manier van verteenwoordig beelde nog steeds met behulp pixels in 0e en 1e uiteindelik. Maar op 'n vinnige blik, dit het 'n meer interessante handtekening aan die begin van die lêer. Dit is nie net drie grepe, eerder daar 'n hele klomp van die patrone van grepe wat voorafbepaalde betekenis. Byvoorbeeld, iewers in die eerste paar grepe beeld bitmap van gaan om die grootte van die wees beeld van die breedte van die beeld, Die hoogte van die beeld, so nuttige metadata, as jy wil. Nuttige inligting wat Photoshop of enige grafiese program wat jy gebruik kan eintlik omgee. So meer hieroor in Probleem Stel 4, maar dit is slegs om te sê dat aan die einde van die dag al die lêer formate wat jy het al met behulp vir years-- Microsoft Word-lêers, Getalle lêers, Excel-lêers, enige aantal lêer formate dat sommige dalk bekend lêer uitbreiding is net 0e en 1e onder die kap. En mense het besluit wat die konvensies is, wat patrone van 0e en 1e verteenwoordig 'n Woord lêer teenoor 'n Excel-lêer, versus enige aantal ander lêer formate. So in PSet 4, sal jy 'n het geleentheid om te speel met dit. Maar wat beteken dit om 'n struct het. Dit is eintlik 'n mooi segue nou in C, wat slegs 'n paar het van bykomende funksies wat ons het nie gekyk na nog. Dit is 'n mooi klein taal en een van die mooi eienskappe oor C is 'n struct. Byvoorbeeld, as jy wou represent-- laat sê jy wou 'n veranderlike daardie verteenwoordig 'n student in 'n program. Miskien was jy 'n kursus te skryf registrasie program, of kern shopping instrument, of iets soos dit. Wat is die stukke van data wat verband hou aan 'n student wat by my opkom? Soos 'n student verteenwoordig met watter waardes? Ja? Jy het 'n naam as 'n student. Wat doen 'n tipiese student? GEHOOR: [onhoorbaar] DAVID J. MALAN: So, jammer. GEHOOR: Age. DAVID J. MALAN: 'n ouderdom of verjaardag in dieselfde, yep. Wat anders? GEHOOR: ID nommer? DAVID J. MALAN: So 'n ID-nommer, miskien 'n telefoonnommer, miskien 'n dorm, of huis, of kollege, of iets soos dit. Enige aantal stukke van die data wat jy mag hê in jou kontakte lys is wat dalk 'n student te definieer. So as ons wou om dit te doen, in die kode, ons kan iets eenvoudig soos dit te doen. Ons kan 'n program sodat hê het kom ons sê, int main (void). En as ek wil 'n verteenwoordig student Ek kan hê, byvoorbeeld, 'n string genoem naam vir daardie student, 'n string genoem dorm vir daardie student, Miskien 'n int genoem ID vir die student. En omdat ek met behulp van string, ek nodig om terug te gaan en sit CS50.h. Miskien gaan ek stdio.h nodig. So laat my preemptively diegene doen en ek is gaan hierdie student.c noem vir nou en behalwe hierdie. En nou kan ek iets te doen met hierdie veranderlikes. En ons is net gaan om te skryf wat as 'n kommentaar in pseudo-kode, want dit is nie interessant wat ons doen vir nou. OK, so dit is 'n program wat een of ander manier slaan 'n student. Wat wil ek doen as ek wil twee studente stoor? So my eerste instink gaan om alles reg wees, wag 'n minuut, as ek 'n ander student waarom ek nie doen net string naam 2, string dorm 2, int id2. En ons het weg gedoen langs die pad voor en wat was ons oplossing vir wat lyk soort van 'n afskrif plak hackish te wees werk hier? GEHOOR: 'n skikking. DAVID J. MALAN: Ja, Ons kan 'n skikking gebruik. Reg om hierdie baie vinnig raak lomp. Jy het om te arbitrêr soort begin noem al hierdie veranderlikes. En jy, die mens, te hou spoor wat OK NAME2 ooreenstem met dorm2 ooreenstem met id2. Dit word net 'n gemors. So dit is 'n baie makliker, onthou van 'n paar weke gelede, net om te genoem string name en miskien gee ons drie van dié. En dan het ons dalk string slaapsale en drie van dié, of met 'n konstante, int ids en het drie van daardie. Maar selfs nou dit voel 'n bietjie slordig, reg. Ons praat oor studente en nog Ek is regtig woning op die lae vlak besonderhede implementering. Die student is 'n naam en 'n dorm en ID. Hoekom kan ek nie net 'n veranderlike verklaar genoem student en noem dit is. En as ek wil 'n ander student, Hoekom het ek nie net noem dit t. Of as ek wil 'n hele klomp studente, waarom net nie ek nie sê ek het 'n hele klas van studente, en dit is drie van hulle. Met ander woorde, kan waarom nie ek kom met my eie soort data, genoem Studente, binne wat 'n naam, 'n ID, is 'n dorm, is 'n aantal van ander velde. En dit blyk jy kan presies dit te doen. So C het hierdie funksie genoem struct. Dit is 'n taal funksie wat kan ons juis dit doen. Ek gaan om voort te gaan en maak structs.h waar ons gaan na die sien volgende definisie van 'n student. Dit blyk uit - en hierdie een is selfs eenvoudiger as die een wat 'n ID 'n oomblik gelede. As jy wil om te kom met jou tuisgemaakte tipe data, en bykomend tot int, en char en dryf en al hierdie ander wat bestaan, kan jy dit doen deur letterlik skryf typedef struct, dan 'n paar krulhakies, binnekant van wat jy n lys van die veranderlikes wat jy wil assosieer met hierdie nuwe persoonlike data tik soos 'n naam en 'n dorm, en dan na die krulhakies jy 'n naam op die nuwe tipe data gee. So, byvoorbeeld, student. En wat is lekker oor hierdie nou is dat As ons kyk na die ooreenstemmende kode, die konvensie, eerste van alles, is hierdie plaas in 'n lêer genaamd iets dot h, 'n kop-lêer, wat ons het nie begin gebruik onsself te veel. Maar ons gaan om te begin gebruik van nou nogal 'n bietjie. En wat ons kan doen met hierdie, uiteindelik in hierdie paar reëls van die kode is verklaar presies dit tipe data, 'n student. En nou, laat se gebruik. Ek gaan nou gaan in 'n lêer genaamd structs1.c. En laat ons 'n blik op 'n paar eienskappe hier. So die dinge hier is meestal bekende, en ons sal kom terug na wat is nie vertroud in net 'n oomblik. Dit is natuurlik ook my eie header-lêer, wat is 'n nuwe, asook, behalwe vir PSet 3 waar Onthou, ons het helpers.h. So jy kan include helpers.h onthou. Hoekom al gebruik ek aanhalings in plaas van hakies? Wanneer ek kies tussen hulle? Byna altyd lyk asof ek om hakies te gebruik. En dan, almal van 'n skielike op lyn ses Ek gebruik dubbele aanhalingstekens. Hoekom kan dit wees? Ja? GEHOOR: [onhoorbaar] DAVID J. MALAN: Dit is 'n werklike, wat? GEHOOR: Dit is in jou IDE. DAVID J. MALAN: Ja, dit is in my werklike IDE. En laat ons nie die bewoners van die IDE, want dit is net 'n instrument wat ek gebruik. Dit is in my huidige gids, spesifiek. So structs.h is my eie lêer nie in die IDE geïnstalleer is, in die bedryfstelsel self, eerder dit is in my huidige gids. So het die konvensie is as jy wil om jou eie kop lêer in te sluit, jy net gebruik dubbele aanhalingstekens. Wat doen ons hierdie ding noem in lyn 8, in die algemeen? Dit is wat? # define iets. Dit verteenwoordig konstantes, reg? As jy wil 'n te hê waarde in jou program dat jy 'n hele gebruik n klomp van die tye, dit is goeie konvensie om dit uit faktor, verklaar dat dit met die hash simbool definieer, dan, deur die konvensie, in alle hoofletters word-- al is dit nie streng nodig nie, maar dit is menslike konvensie om konstantes kapitaliseer sodat hulle spring uit op jou visually-- ruimte en dan is die waarde wat jy wil wees gelykstaande aan die naam van wat konstant. Geen kommapunt, maar jy net volg dat die patroon is daar. So, wat doen ek in hierdie werklike kode. So laat ons neem 'n blik op die hoofprogram hier. In reël 12 omdat ek ingesluit structs.h, Ek het nou mettertyd aan my beskikking 'n nuwe soort data. Ek het nie net toegang tot int, en char en vlot, en string, en blou en ander. Ek het nou toegang tot 'n tipe student data. So in lyn 12, ek kombinasie twee ideas-- n mens 'n persoonlike tipe data en twee, met behulp van 'n skikking. En so in hierdie program as Ek wil eintlik ondersteun drie verskillende studente in my program, ek kan net sê gee my 'n veranderlike genoem studente, wat elk is van die tipe studente, wat is my persoonlike data tipe. En spesifiek, gee my drie van dié in my skikking. So nou wat doen ons in hierdie program? Hier is net 'n lus vir die iterating 0-3, want dit is wat die waarde van studente is. Ek is net waarna die gebruiker gee my die student se naam. En dan in lyn 17, ons 'n meestal bekende lyn. Ons het ons ou vriend GetString aan die regterkant. En wat stuk sintaksis is blykbaar 'n nuwe, As jy nog nooit in C het geprogrammeer voor, en het nog nooit gebruik word om die structs? Ja? GEHOOR: Die Name. DAVID J. MALAN: Die Name. Maar dit is nie te veel van 'n sprong, want nou studente hakies i gee jou die i-de student. En as jy wil om te duik binnekant van die struktuur, jy net gebruik om 'n enkele tydperk en dan is die naam van die veranderlike binne, of die eiendom in daardie jy wil om toegang te kry. Net so dan, as ek gevra het die gebruiker, gee my die student se dorm, jy kan insgelyks winkel wat string in die dorm veranderlike binnekant van daardie student struktuur. En nou is dinge 'n bietjie fancy. En dit gaan lyk op dalk 'n baie baie gou. Maar jy sal sien dit baie meer in PSet 4, so laat ons net blik op dit nou. Dit blyk dat in line 23 deur 38, wat dink jy ek dalk doen? Ek het die kommentaar verwyder vir vandag, maar die weergawe van die kode aanlyn verwysing het al kommentaar. Wat doen ek blyk te wees doen? GEHOOR: die lêer met al Spaar die inligting wat die gebruiker aangegaan. DAVID J. MALAN: Ja, presies, dit is 'n nuwe manier wat ons nou sien twee Nog 'n kenmerk van C, waardeur ek my eie lêers kan skep. Tot dusver byna elke program jy geskryf het is staatloos. Sodra dit gedoen is hardloop, dit is dit. Daar is geen geheue of herinnering van dit. Daar is geen lêer gestoor. Maar as jy wil red insette wat gebeur het, soos in 'n spel of 'n program soos hierdie, dit blyk ons ​​kan doen. En jy sal dit meer sien in PSet 4 en in Afdeling. Maar hierdie lyn 23 in wese skep 'n lêer genaamd students.csv. En jy kan voor het hierdie. Selfs as jy nog nooit voorheen CS bestudeer, CSV is komma geskei veranderlikes. Dit is soos 'n baie arm man se weergawe van 'n Excel-lêer, wat beteken dat dit kan oopgemaak word in Excel en in Apple Getalle, en dit het rye en kolomme. Maar dit is nie 'n eie formaat soos Microsoft of Apple. Dis net kommas skeiding van die waardes wat ons sal sien in 'n oomblik. En net 'n raaiskoot. In lyn 23, op die heel einde, my tweede argument om hierdie nuwe funksie genoem f oop vir die lêer oop is w. Wat kan w dui? Ja? GEHOOR: Dit kan jy skryf na die lêer? DAVID J. MALAN: Dit kan jy skryf na die lêer. So is daar 'n paar van die variante dat ons hier kan aansluit in. Maar as jy net wil om te lees die lêer, wat kyk na dit en lees dit in die geheue, het jy net quote unquote "r" te gebruik. As jy wil om te skryf aan die lêer, haal jy gebruik unquote "w". Daar is ook voeg en 'n paar ander dinge as jy wil om bestaande lêers te verander. Nou gaan ons hou dit sien ding, dan sal ons terug te kom om te reël 24. NULL, dit blyk, is 'n spesiale waarde wat kan teruggestuur word deur sekere funksies as iets wrong-- gegaan het indien die lêer nie bestaan ​​nie, As jy nie van die geheue het hardloop, of 'n klomp van die ander foute. Maar vir nou, laat ons net aanvaar dat dit is net konvensionele foutopsporing. Hier in lyn 26, ek iterating 0-3 oor al my studente. En dit is 'n soort van soort van 'n nuwe funksie, fprintf, maar net 'n raaiskoot. As printf is net druk 'n geformatteerde string, wat beteken fprintf waarskynlik beteken? GEHOOR: Druk na 'n lêer. DAVID J. MALAN: Druk 'n geformateerde string na 'n lêer. Dit is wat die addisionele f middel is lêer. En die nuwe eerste argument moet wees die veranderlike wat jou lêer verteenwoordig. Dan het ons net 'n formaat string net soos printf. En selfs al is dit sintaksis is 'n nuwe, dit net beteken prop in die student se naam, plug-in die student dorm, en dan met fclose, maak die lêer. En dan lastly-- dit is nuut en ons sal terug kom voordat long-- ek bevry die student vir die redes wat gebeur het bo is daar. Maar ons sal terug te kom om die wat voor long-- dit is as gevolg van hoe GetString is eintlik werk onder die kap. So laat ons neem 'n vinnige blik hier. As ek tik ls in my gids, sien dat ek dit nie doen nie 'n lêer genaamd students.csv, net nie daar nie, nie bestaan ​​nie. So as ek nou hierdie program saam te stel, maak structs-1. / structs-1, en ek gaan om voort te gaan en tik in Andi, wat woon in Berkeley by Yale. Ons gaan Rob het wat woon in Thayer hierdie dae. En laat kom met waar is, dink ek, Maria is in Mather, as ek reg onthou het. So dit lyk asof niks gebeur nie. Maar as ek tik ls nou, daar is students.csv. Kom ons gaan voort en oop students.csv. Dit is weer eens 'n baie liggewig lêer formaat. Maar ek het net 'n konvensie aangeneem dat ek twee rye en kolomme hier. Die eerste kolom is mense se eerste name. Die tweede kolom is die student se dorm, of kollege, of huis, of iets anders. En nou het ek dit gered permanent in 'n lêer. So dit is nie al wat interessant. Maar dit is net 'n stepping stone nou om in staat om inligting te volhard permanent. So laat ons sien nou wat meer kan ons doen met hierdie en ander funksies. Maar eers, enige vrae? Dit was 'n baie, en dit was vinnig. Maar jy sal 'n baie te sien meer in PSet 4, as well. Ja? GEHOOR: Is daar 'n manier om voortgaan toevoeging van name om die lêer? DAVID J. MALAN: Goeie vraag. Is daar 'n manier om voort te gaan toevoeging van name om die lêer? Ja. En, in werklikheid, as jy uiteindelik up re-opening van die lêer, sou jy quote gebruik unquote "n" vir aanhegnavraag, wat sou net voeg 'n nuwe lyn, 'n weer en weer, presies nuwe lyn. Goeie vraag. Ander vrae? Ja? GEHOOR: As jy het die program weer op die oomblik, sou dit hou die toevoeging van name aan die lêer of sou dit oop te maak 'n nuwe lêer? DAVID J. MALAN: Ag, goeie vraag. As jy hardloop die program weer reg nou, miskien getik in nuwe name, sou dit toe te voeg tot die lêer of die lêer oorskryf? Die laasgenoemde, want ek is nie die gebruik van aanhegnavraag af. En omdat ek net blindelings die opening van die lêer vir skryf, dit is net gaan om die lêer oorskryf. So sou ek inderdaad hoef te doen is voeg, as ek wil eintlik 'n lang termyn databasis. Nou CSV is nuttig, eerlik, selfs vir soos as jy writing-- en ons sal uiteindelik sien later in die semester wanneer ons gebruik CSVs vir ander doeleindes. As jy wil al die mense op te slaan wat vir 'n gebeurtenis, of ingeskryf vir jou student groep, of iets soos dit, stoor die data in hierdie soort van formaat is super gerieflik. Omdat letterlik, as ek was om hierdie lêer aflaai. Ek kon double-- en laat eintlik dit te probeer as ek Excel of Nommers hier. Ek gaan regs-kliek of Control-kliek my lêer. Oeps. Regs-kliek of Control-kliek my lêer. Kom, my muis nie saam. Download-- ek gaan aflaai hier al die lêers sodat net sodat ek kan hierdie een te gryp. En laat ons sien of dit werk students.csv-- eerste keer Ek het geaktiveer. Nou wil hulle my kontakte te sien. Nou, ek moet registreer. Kyk hoe maklik dit is om CSVs gebruik? Ja, hou dit op datum is. OK, nou is ons gereed vir klas. OK, o, wat is nuut? OK, naby. Dit was magies. OK, nou het ons te werk. En nou is dit vergeet wat Ek het oorspronklik lêer oopgemaak word, maar wat daar a-- ons gaan. OK, so nou het ons 'n Excel-lêer. Dankie. OK, so wat ek gedoen het, was die maklike deel. Natuurlik het ek kon vooraf geïnstalleer Excel, of Getalle, of wat ook al program. Maar dit is lekker, want nou kan ek manipuleer die data in 'n standaard formaat. So nou, laat ons konteks oorskakel na waar ons opgehou het laaste tyd, wat was om te begin af te neem opleiding wiele. Maar eers moet jy nie het nie sien dit vroeër middagete is dit weer gebeur hier by Vuur en Ice in Cambridge, Sitar in New Haven. Teken op CS50s webwerf so gou as moontlik om CS50 studente en personeel aan te sluit. So het ons opleiding wiele af op Maandag as follows-- string is verklaar in CS50s biblioteek vir 'n geruime tyd. En dit is lekker, want dit kan ons oor veranderlikes te praat as volledige woorde en sinne en nog baie meer. Maar dit blyk string bestaan ​​nie. Dit is net 'n sinoniem of 'n alias, wat ons geskep het vir iets wat is eintlik 'n bietjie meer tegniese genoem char *. En inderdaad, 'n voorbeeld het ons gesien van 'n program op Maandag dit het nie gedra nogal soos ons verwag het nie. Dit was die lêer, vergelyk-0. En onthou dat vergelyk-0, as Ek Maandag se program heropstel en hardloop vergelyk-0 en tik in ma in klein en ma in klein weer. Die program het daarop aangedring ek tik verskillende dinge, selfs al ma, alles in klein, is identies visueel. So wat was die kort antwoord waarom die rekenaar dink daardie twee snare is anders? Ja? GEHOOR: [onhoorbaar] DAVID J. MALAN: Right. So, ma, die eerste keer Ek tik dit in, is om iewers gestoor in my rekenaar se geheue, maar in 'n ander plek as die tweede keer wat ek tik in ma. Nou is dit beslis kan word new. Die rekenaar kan slim wees en besef dat hierdie twee stringe, hey, hulle is identies. Laat my nie kere stoor dit. Maar rekenaars dit nie doen nie optimalisering, tensy jy hulle vertel om te. So, by verstek, hulle is net gaan aan die einde in twee verskillende plekke in die geheue. En so meer duidelik wanneer wees ons vergelyk die twee stringe, die eerste genoem s, die tweede genoem t, wat spesifiek was ek vergelyk hier op die lyn 13? Ja. GEHOOR: Dis die plek in die geheue dat die veranderlike sal wys. DAVID J. MALAN: Presies, ek was vergelyk die plek in die geheue dat diegene veranderlikes verwys na. So spesifiek, as ma was by byte nommer 1, en 2, en 3, en 4-- want onthou agteroorskuisstreep 0 moet al die pad aan die einde wees. En die ander geval van ma, m-o-m, was by adres 10, 11, 12, en 13. Ek was te vergelyk 1, daardie adres, wat plek in die geheue, teen 10, wat natuurlik nie dieselfde nie. 1 is nie 10. So dit is lekker in daardie dit is redelik eenvoudig. Maar dit is problematies sover kan ons nie lyk snare te vergelyk. So fundamentally-- en op hierdie lae vlak, as jy wou implementeer 'n program om te vergelyk twee afsonderlike woorde wat die gebruiker getik in vir gehalte, doen hulle line-up vir char char, net in algemene terme, wat doen wat ons moet doen, glo? Dit is nie voldoende om net kyk na die twee adresse. Wat moet ons doen? Ja? GEHOOR: iterasies deur die string [onhoorbaar]. DAVID J. MALAN: Ja, laat Itereer deur die string. Kom ons gebruik 'n lus vir die, 'n while lus, of alles wat jy die meeste gemaklik met. En as ons het twee stringe het iewers in die geheue, laat ons kyk na elke se eerste karakter, dan elke tweede karakter, dan die derde en vierde en vyfde, totdat ons getref wat spesiale brandwag waarde? GEHOOR: [onhoorbaar] DAVID J. MALAN: Ja, agteroorskuisstreep nul, op watter punt in óf string ons kan besluit dit is dit. Het ons ooreenstem elke enkele karakter? Indien nie, keer terug onwaar. As dit so is, terug te keer waar. En so dit is presies wat hierdie weergawe van die program te vergelyk-1.c doen. Dit is identies aan wat ons gekyk na Maandag, behalwe dat ek ontslae geraak van die woord string-- al wat geen funksionele impact-- al Ek doen nou die verwydering 'n visuele opleiding wiele, maar om dit duidelik dat sien s en t is adresse. En dit is wat die ster, die asterisk, verteenwoordig is 'n adres, andersins bekend meer tegnies as 'n wyser. So wanneer ek verklaar s op reël 9 en sê char * s, dit beteken nie dat gee my 'n string. Dit beteken vir my 'n veranderlike wie doel in die lewe is om 'n adres te stoor. Omdat ek oor die plaas adres van 'n string in dit. En inderdaad, GetString, te wees duidelik, nie 'n string terug te keer. Dit maak nie ma terug backslash nul, per se. Wat beteken GetString spesifiek en juis terugkeer? GEHOOR: [onhoorbaar] DAVID J. MALAN: 'n adres, die adres van die eerste karakter in sommige string wat dit gekry het. En so nou ons sien 'n spesiale navraag weer. En ek verwys na hierdie vroeër. Dit gaan 'n goeie konvensie dat ons sal weer en weer kyk nou. Ek check om seker te maak dat die s is nie van nul en t is nie null. Omdat gebaseer op my regtig vinnige melding vroeër, wat kan beteken as GetString terugkeer nie 'n adres, maar N-U-L-L, wat weer 'n paar spesiale waarde? GEHOOR: Fout. DAVID J. MALAN: Dit is 'n fout. Iets het verkeerd geloop. En wat tipies kan gebeur, veral met strings-- wat dalk onbekende lengte in advance-- Miskien is die rekenaars uit die geheue, miskien jy in so 'n getikte lang woord of sin of geplak so 'n groot opstel daar is net nie genoeg geheue. En so GetString kan nie terugkeer die adres van die hele ding, sodat dit net terug niks. En dit sê 'n fout het gebeur deur die terugkeer van die spesiale NULL waarde. Dit is die nul-adres, om so te praat. Nou blyk dit kom met 'n C funksie dat iterasie doen. Ons hoef nie te implementeer met 'n lus vir die of 'n while lus onsself. Ons kan nie 'n funksie te gebruik, saaklik genoem, roer comp, of string vergelyk, wie se doel in die lewe is om presies dit te doen. Jy gee dit twee wysers, twee adresse, en dit sal gaan na die adresse en dan te vergelyk brief brief vir brief vir gehalte, stop net vir dit wat waar is? Wanneer intuïtief comp moet roer ophou iterating, net om duidelik te wees? Wanneer dit tref 'n backslash 0 in óf string, op watter punt is dit kan besluit Alles het wat ooreenstem, of is daar 'n verskil is? So, as ons hardloop dit nou en probeer ons klein kapitalisasie spel, so maak vergelyk-1, ./compare-1 en tik ma in klein sowel tye. Nou is dit dieselfde ding. En as ek doen dit weer met klein en dan miskien hoofletters. Nou is dit inderdaad onderskei tussen die boonste en kleinletters. So nie al wat hard of magiese, maar dit beteken nou verduidelik wat gaan aan onder die enjinkap. So, wat meer kan ons onttrek Van hierdie soort van les? So laat ons neem 'n blik op hierdie. Ek gaan om voort te gaan en skryf 'n vinnige program hier genoem kopie-0. En nou, laat ons gaan voort en eintlik Kom ons doen this-- met kopie-0, 'n blik op wat ek hier het. Ek het eers die gebruiker te vertel, sê iets. Toe kry ek 'n string en ek gestoor in s. Dan gaan ek as s gelyk gelyk NULL, net terug 1. So dit is net standaard fout nagaan. Niks interessant gebeur het. En in die feit, as ons ontslae te raak van die fout nagaan, dit lyk soos 1 week kode op die oomblik. Maar ek het begin om 'n te kry bietjie beter oor dat. Nou in lyn 16, 'n week gelede, miskien selfs 'n paar dae of minute gelede jy kan sê lyn 16 is skep van 'n veranderlike genoem t en kopiëring is in dit. En dit is 'n perfek redelike afhaal. Maar wees nou meer akkuraat. Wat gebeur in lyn 16? Wat is om gekopieer van links na regs? Ja? GEHOOR: Is t kry 'n adres van s? DAVID J. MALAN: Presies, t is om die adres van die s. So nou duidelik te wees, as ek gaan terug na wat vroeër byvoorbeeld en ek trek die ding wat ek in getik het. En wat ek getik in-- hier is s, en hier is wat ek in iewers getik in geheue, ma en dan 'n backslash 0 dit is bygevoeg vir my. Wat ek gestoor in hier, onthou, dit is op plek 1, 2, 3, 4, Dit is wat tans in s. So as op die lyn 16, sê ek gee my ander veranderlike genoem t en store by die waarde van s, wat kry hier gestoor sal nie ma maar eerder net die nommer 1. So as ons vorentoe kyk in hierdie program Nou, wat gaan gebeur? So sien dat daar hierdie funksie jy dalk het hierdie gebruik 'n geruime tyd gelede vir die keiser of Vigenere, of dalk glad nie. Ek eis met my printf, ek is gaan om te kapitaliseer die kopie t. Eerste in die lyn 19, vinnige gesonde verstand kyk, StrLen tjeks die lengte van t. Want ek wil nie probeer om iets te kapitaliseer As daar is geen string daar. As die gebruiker net druk Enter, daar is niks om te kapitaliseer. So ek wil nie line 21 te doen. So lyn 21 kapitaliseer watter letter, blykbaar, in t? GEHOOR: m? DAVID J. MALAN: Dit lyk soos dit is kopiëring watter een? GEHOOR: m. DAVID J. MALAN: Uh, m. OK, so die eerste m, omdat kennisgewing dat ek verby te toupper, wat as jy dit nog nooit gesien het dit is net 'n funksie om kapitaliseer aangesien sy insette. t bracket nul beteken gee vir my die nul karakter van t. En so hoe gaan dit prentjie verander, om duidelik te wees? Wat moet kry herskryf of verander met betrekking tot s en t en ma backslash nul. GEHOOR: [onhoorbaar] DAVID J. MALAN: Ja, so hierdie een hier net moet verander kry aan- los this-- moet raak verander na 'n kapitaal m. Maar nou, kyk later in die program, as ek druk s en t as ek skoon hier, kyk wat is gaan gebeur uit te druk s en t. So maak kopie-0, ./copy-0. Laat my gaan voort en tik in ma in alle klein. Let beide die oorspronklike en die kopie gekapitaliseer. Hoekom? Wel, s en t is albei verwys na, as jy wil, dieselfde stuk van die geheue. En eerlik, dit is om regtig uninteresting-- die feit wat ons gebruik adres nul hier. Ek bedoel, ek het nie regtig omgee waar dinge is in die geheue. Jammer ek skoonmaak 'n bietjie te veel. Maar ek het nie regtig omgee waar dinge in die geheue. En so, inderdaad wat programmeerders is geneig om te dink oor is dat wanneer jy praat oor 'n adres, of 'n wyser, wat omgee waar dit in die geheue. Ek gee nie om as dit by byte een of 'n miljard. Ek het net sorg dat dit veranderlike is effektief wys op daardie stuk van die geheue. En so, voortaan, eerder as verskoning oor arbitrêre geheue adresse, laat net begin om te trek wenke as wysers, as pyle. So, wat s en t werklik is, volgens hierdie program, as gevolg van hoe ek geskep t, dit is net twee afsonderlike veranderlikes wys op dieselfde stuk van die geheue. En ons gee nie om waar hulle is. Sodat ons kan abstrakte weg wat detail. So hoe kan ek dit regmaak? As ek wil 'n weergawe van die kopie te skryf program wat eintlik afskrifte van die string en kapitaliseer net die kopie, net intuïtief, wat het 'n wees bestanddeel ons oplossing? GEHOOR: [onhoorbaar] DAVID J. MALAN: Ons moet 'n wat? GEHOOR: stuk van die geheue. DAVID J. MALAN: Ons moet 'n ander deel van die geheue, reg? Ons weet nie hoe om doen dit nie, noodwendig nie. Maar ek soort van moet dit so gebeur dat die oorspronklike ma in kleinletters beland in daardie ekstra stuk van die geheue. En dan wanneer ek die kopie, ek wil nie hierdie kopie hier te verander. Ek plaas net hier te verander kopie sodat die oorspronklike is onveranderd. So, laat ons sien hoe ons dit kan doen nie. In kopie-1, wat reeds gestroop van kommentaar, maar online kommentaar. Ons plaas doen following-- hierdie lyne identies, kry vir my 'n string en noem dit is. Maar nou laat ons kyk na een van ons mees kompleks, maar die laaste van die kompleksiteit vir 'n rukkie, lyn 16 doen presies dit. So as jou gemaklike met die prentjie wat ons net drew-- gee my 'n nuwe stuk van die geheue, kopieer alles in dit, Kom ons kyk hoe ons te vertaal dat die kode. So line 16, op die linkerkant, char * t gee my die boks hier. Dit is al wat dit doen nie. Op die regterkant, m alloc of malloc, is geheuetoekenning, super fancy, 'n kriptiese manier om net te sê gee my 'n stuk van die geheue. Hoeveel geheue het ons nodig? Wel, is 'n soort van 'n groot uitdrukking. Maar laat ons sien wat dit sê hier. So hierdie, natuurlik, is gee vir my die string lengte van s. So, ma moet dit wat wees? So net drie, reg? ma is drie karakters. Jy tel nie die backslash nul wanneer jy praat oor die lengte van 'n string dis eintlik die menslike sigbare letters. So ma, so dit gee my 3. Maar wag 'n minuut, ek voeg nou 1. Hoekom moet ek eintlik wil ken 4 grepe en nie net 3? Ja? GEHOOR: Vir die brandwag waarde? DAVID J. MALAN: Presies, vir daardie brandwag waarde. Vir agteroorskuisstreep nul, Ek moet 4 grepe totaal. So ek moet die lengte van die string plus 1. En dan net vir 'n goeie measure-- selfs al op hierdie stelsel, dit is altyd gaan 1-- te wees ek sê vermenigvuldig dit met die grootte van 'n kar. Blyk sizeof is 'n operateur in C wat net vir jou vertel die aantal grepe wat wat nodig is vir 'n sekere tipe data. Dit werk nie vir skikkings, Tipies, soms is dit nie. Maar in die algemene geval, no. Maar dit sal vir my sê hoeveel grepe n char is, wat blyk altyd 1. So dit is soos vermenigvuldig met 1. So super kriptiese soek reël van die kode. Maar al wat dit doen is gee vir my 'n stuk van die geheue. Maar beteken dit blyk te wees kopiëring enigiets in daardie geheue? Nog nie. En so wat doen ek op die lyn 22, en 23, 24, 25, goed, ek het net dit te doen. En dit is 'n soort van ou skool stuff nou. Dit is soos PSet 2, waar jy net beweeg dinge rond in die geheue, of eerder in stringe. So ek iterating van 0 tot die lengte van die string s. En ek is die kopiëring van die i-de karakter in s in die i-de karakter in t. En omdat Ek, die programmeerder, gemaak seker presies soos baie grepe toewys as ek nodig het, dit is perfek een-tot-een verhouding. En ek kopieer ma in onderkas om die nuwe een. En dan laastens, ek doen hierdie lyn. En so die effek is slegs om te kapitaliseer hier t. So 'n baie om te absorbeer nie, maar as jy net oorweeg wat regtig aangaan op onder die kap is net die beweging van hierdie grepe rond, alles wat is nodig om op te los hierdie probleem is regverdig om ons die stuk van die geheue te gee. En aan die risiko van oorweldigend, laat ek jou wys een ander voorbeeld wat amper identies, behalwe vir hierdie een reël van die kode. So dit is die hacker weergawe van hierdie program, as jy wil. Maar laat ons net distilleer dit in wat gaan aan. Line 24 gebruik word om hierdie t wees bracket i kry s bracket i. Nou, ek is te verander in die veel meer kriptiese star t plus 1 gelyk star s plus 1. So wat gebeur en hoekom het ons 'n ster karakter? Ons het die ster gesien nie, en dit word anders hier gebruik word. Ons het vroeër gesien char *, nou is ek sien 'n ster aan die begin, en dit is OK. Omdat dit blyk ons kan soort van net aflei van dié eerste beginsels wat aangaan. So net om duidelik te wees, wat s? Verlede week was dit 'n string. Dit beteken nie meer genoeg nie. Wat is s, spesifiek? GEHOOR: [onhoorbaar] DAVID J. MALAN: Dit is 'n wyser. Dit is die adres van die eerste karakter wat ons getik. OK, wat is t? GEHOOR: [onhoorbaar] DAVID J. MALAN: Die adres van die eerste byte in t, dat deel van die geheue hertoegewys. So dit blyk dat wanneer ons Itereer van 0 tot aan die einde string length-- eerste van alles, i begin by 0, want van hierdie ou skool vir lus ding. So net vir die eenvoud, laat aanvaar dat die eerste reël van die kode is regtig net hierdie, reg. As ek nul, en voeg nul iets vermoedelik gaan nie 'n effek. So, wat is hierdie woord? Dit blyk dat die ster operateur in hierdie konteks is die dereference operateur, wat net 'n fancy manier om te sê gaan aan die volgende adres. So as s is die adres van die eerste karakter in hierdie deel van die geheue, * s middel gaan daar. En omdat ons getrek die prentjie op hierdie manier, kan jy die neem van die volgende geestelike model. As dit is s, en jy sê * s, * s soort van soos geute en ladders, as jy onthou die spel van kleins af, is soos volg dat die pyl en gaan die adres. * t is die dieselfde ding. So hier begin, gaan na die stuk. Ek kan nie net trek op die skerm op die manier. * t beteken om hier te gaan. En dan, die lus is net sê beweeg hier hierdie karakter, beweeg hier hierdie karakter, beweeg hier hierdie karakter. Maar hoe doen ek dit incrementation doen? Ek het nodig om ongedaan te maak wat ek net verwyder. Dit is wat algemeen genoem wyser rekenkundige, wat beteken wiskunde met adresse. As in hierdie lus, Ek hou die verhoog i, en s is 'n adres en t is 'n adres, as ek net bly by 1, wat net beteken bly beweeg vorentoe, en stuur en stuur in die geheue. Dit is soos Oxford Street, die straat dat die CS gebou is op. Die CS geboue is op 33 Oxford Street. So as jy was om te doen 33 Oxford Street plus 1, wat bring jy 34 Oxford Straat, dan 35 Oxford Street, dan 36 Oxford Street, ongeag die geboue eintlik - indien hulle bestaan. En so, dit is al wat ons doen hier met wyser rekenkundige. So dit is 'n super arcane manier van uitdrukking onsself. Maar alles wat gebeur onder die enjinkap is net na hierdie adresse, soos na 'n kaart, as jy wil, of die volgende pyle soos ons het getrek op die skerm. OK, 'n baie om te verteer. Enige vraag oor sintaksis, konsepte, wysers, malloc, of die wil. Ja, hier eerste. GEHOOR: So waar daardie sê * t gelyk toupper * t, is dat gaan om te kapitaliseer al die letters of just-- DAVID J. MALAN: Ag, regtig 'n goeie vraag. So in hierdie lyn hier, 31, gaan dit om te kapitaliseer die eerste letter van of al die briewe. So laat antwoord dat deur te gaan terug na die eerste beginsels. En die eerste beginsels hier bedoel ek gaan net na die basiese definisies van wat betrokke is. So toupper is 'n funksie wat kapitaliseer n kar. Dit is al. * t beteken gaan na die first-- gaan na die adres in t. So, in die prentjie, indien dit die stuk geheue ons toegeken met malloc, en dit is t, * t beteken gaan hier. Intussen is jy verby wat waarde, klein m om toupper, jy kry terug kapitaal M, waar gaan jy dit plaas? Jy sit dit in dieselfde plek. En so deur daardie logika van daardie basiese definisies is dit net kapitaliseer die eerste letter tensy jy Itereer met i of 'n lus of 'n while lus, dit gaan nie om enigiets meer as jy hom vra nie. Goeie vraag. Ja? GEHOOR: Hoekom het jy gebruik die dereference metode eerder as die skikking? DAVID J. MALAN: Ag, goeie vraag. Hoekom sal jy die dereference gebruik metode in plaas van die skikking metode? Geen spesifieke rede, om eerlik te wees. En, in werklikheid, vir hierdie soort voorbeeld, regs, Ek is net die maak van die argument program meer ingewikkeld, meer oë glas oor, mense uitcheck want dit lyk super arcane, maar selfs al is dit dieselfde ding doen. En so, eerlik, dit is 'n onnodig visueel komplekse oplossing om die probleem. Dit is nog steeds 'n goeie ontwerp, vyf uit vyf vir die ontwerp, of dit nou in die bracket notasie of die wyser notasie. But-- veral wanneer ons later in die kursus in PSet 5 wanneer ons implementeer woordeboek wat Ek het genoem 'n paar van times-- ons sal eintlik omgee oor die lae vlak geheue adresse dat ons regtig verstaan wat gaan aan. Maar vir nou, is dit blyk dat hierdie reël van die kode hier vierkantige hakies nie regtig bestaan ​​nie. Hulle is wat genoem sintaktiese suiker, wat is net 'n uitgesoekte koel manier om te sê die samesteller vat vierkantige hakies te wees wat wiskundige uitdrukking. So dit is 'n menslike konvensie in staat wees om net skryf hierdie baie gebruikers-vriendelike hakies. Maar wat die samesteller, klang, regtig doen enige tyd jy skryf wat uitgelig in lyn 24, onder die enjinkap dit is regtig dit na hierdie. Dit is net meer aangenaam as 'n mens lees en skryf kode soos lyn 24. Maar uiteindelik diegene opleiding wiele te kom af wanneer 'n mens se eie gerief kry sterker. Alle reg, sodat onthou dan dat dit was die soort grootste probleem Ons het in. En dit is wat hierdie hele gelei damn gesprek oor wysers, en adresse, en kopiëring dinge. Dit was omdat ons struikel oor hierdie stupid, dom probleem, waardeur Ek geïmplementeer logically-- met Lauren hier op die demo en die lemoensap in die milk-- 'n perfek algoritmies korrekte funksie vir die uitruiling van twee veranderlikes ' waardes, maar die damn ding het nie 'n aanhoudende, of permanente, effek op my kode. En hoekom is dit? In 'n neutedop, hoekom is dit implementering van swap logies korrek, maar het geen impak op die veranderlikes wat geslaag om dit, soos x en y vir hoof? Wat was die kern van die probleem? Ja? GEHOOR: Omdat veranderlike gemaak afskrifte van veranderlike in die pas deur funksie. DAVID J. MALAN: Presies, wanneer jy slaag veranderlikes in 'n funksie, of argumente in 'n funksie, hulle is verbygegaan kopie, wat beteken dat jy 'n identiese soek patroon van die stukkies vir beide x en y, genoem hier a en b. En jy kan enigiets doen jy wil met dié kopieë, maar hulle gaan nie het uitwerking op die roeping funksie. En, in werklikheid, is ons het dit prentjie op die skerm, onthou laaste keer, waardeur as jy regtig dink oor wat gaan op onder die hood-- as dit is jou rekenaar se geheue, en af ​​hier is die stuk van geheue wat gebruik word vir die hoof, dit is die deel van geheue wat gebruik word vir swap, en so selfs as hoof het twee veranderlikes, x en y, swap dalk identies soek waardes, wat albei 1 en 2, maar hulle is heeltemal verskillende dele van die geheue. So moet ons 'n oplossing vir hierdie. En eerlik, wil dit voorkom dat ons nou 'n oplossing vir hierdie probleem, reg. As ons nou die vermoë om dinge manipuleer deur middel van adresse en, soort van geute en lere styl, volg hierdie pyle en iewers heen te gaan wat ons wil in die geheue, kan ons nie hierdie probleem deur te los wat van hoof te ruil nie die waardes wat ons wil swap, maar net intuïtief wat kan ons slaag om plaas te ruil? [INTERPOSING VOICES] DAVID J. MALAN: Hoekom het ons nie net slaag dit die adresse, reg? Hoekom gee ons nie 'n ruil skat kaart, as jy wil, wat lei dit na die werklike waardes x en y. Kom ons ruil, eintlik verander diegene oorspronklike stukkies, eerder as net verby afskrifte van die stukkies. En so, in werklikheid, dit is wat gaan die oplossing wees. Hierdie weergawe is hier duidelik sleg en verkeerd is. En nou, met die eerste oogopslag, dit lyk net asof ons 'n klomp van die sterre bygevoeg lukraak en ons vingers gekruis dat dit sou stel. Maar, sou dit nou saam te stel. Maar laat ons sien wat hierdie dinge beteken nie. En ongelukkig, die skrywers van C kan nog 'n simbool gekies om dit 'n bietjie te maak duidelik, maar die ster operateur het verskillende betekenis in twee verskillende kontekste. En ons het gesien; maar laat ons onderskei. So by die top daar toe ek 'n en b verander uit om int in die slegte weergawe sterre, A en B int, Voorheen was heelgetalle. Wat is 'n en b nou in die goeie, groen weergawe? Hulle is adresse. Adresse van wat, om duidelik te wees? Adresse van heelgetalle. So die feit dat ek sê int star middel Hierdie is die adres van die 'n heelgetal, spesifiek. So nou kennis van die reëls van die kode, iets anders het ook verander. tmp bly dieselfde, want dit is net die tydelike heelgetal, geen geheue magic daar. Maar 'n nou moet 'n ster. En, in werklikheid, elke ander melding van a en b, sien dat al wat verander van rooi na groen is dat ek as voorvoegsel daardie veranderlikes met sterre. Want ek wil nie 'n en b kopieer. Want as ek net kopieer a en b en ruil A en B, wat ek eintlik uitruiling? Net adresse, ek wil ruil Wat is op die adresse. Ek wil om daar te gaan. En so het die ster operateur binnekant van my funksie, nie binnekant van die parameter lys beteken jy gaan na die adresse en eintlik verander daardie waardes. So wat doen die prentjie nou lyk plaas. Wel, as ek verby plaas in vir A en B nie 1 en 2-- Ek het eintlik nodig om by te voeg een ander definisie hier. So veronderstel dat hierdie stuk geheue is op plek 10. Dit is by die plek 11, maar dit is 'n bietjie van 'n vereenvoudiging, Ek het nou twee keuses het ek slaag x en y of ek hulle adresse te slaag? As ek slaag hulle adresse soos hierdie, ek het net nou nodig om te implementeer swap per die groen-kode sodat wanneer dit sien 'n en wanneer dit sien kom b, beteken dit nie net kopieer a en b en beweeg die melk en lemoensap. Die melk en lemoensap metafoor breek nou af, want dit is koppies van vloeibare en nie kaarte. Ons plaas moet gaan aan te spreek 10 en ons nodig om te gaan om aan te spreek 11, en voer dan dat uitruiling logika. So het die logika is dieselfde, maar ons het 'n effens ander manier nodig toegang tot daardie veranderlikes. En so in die einde, wat die program het om te lyk soos dit is. In swap.c letterlik gekopieer en geplak die groen weergawe. Maar ek moet een verandering te maak. Dit is nie voldoende om net swap verander. Wat ander reël van die kode het ek nodig om te verander? Ja? GEHOOR: Waar dit neem om die argumente. DAVID J. MALAN: Waar dit neem om sy argument. So as ek blaai tot hoof, ek kan nie net slaag in x en y, en, ek belowe, die laaste stuk nuwe sintaksis vandag. Ek nodig het om te slaag in nie x en y maar die adres van x en y. En dit blyk, die simbool dat die skrywers van C gekies is as jy 'n ampersand hier gebruik, nie om verwar word met die bis ampersand, as jy 'n ampersand gebruik hier en 'n ampersand hier hierdie figure uit vir jou, Wat is die adres van x, miskien is dit 10, wat is die adres van y, miskien is dit 11, en gaan diegene in plaas. So baie om al absorbeer in 'n keer. Maar laat ons nou sien vinnig ons oorblywende vier minute waar dinge verkeerd kan gaan. En as 'n eenkant, eintlik Ek het hierdie foto, TF het hierdie foto 'n jaar of twee gelede. So dit is die agterste hoek van Eliot eetsaal. Pointers is dalk die moeilikste onderwerp wat ons dek in CS50. So as jy bekommerd die soort helling is soos miskien is dit meer van 'n hokkiestok soos hierdie, besef ons soort van nader 'n hoogtepunt in terme van die konseptuele kompleksiteit. En ek bring hierdie foto, want ek sweer God, in die herfs 1996, toe ek CS50 met my onderrig mede, Nishat Mehta, sit hy my in die hoek van die Eliot D. Hall oor middagete, of aandete, of iets om te probeer om my te help verstaan ​​wenke. En dit is waar ek was weke na dit is in lesing toe ingevoer Ek het uiteindelik verstaan ​​wenke. En ek is hoopvol dat dit sal ver gouer vir jou klik. Maar besef dit absoluut onder die meer gesofistikeerde onderwerpe Ons het gekyk na. Maar dit is een van die mees kragtige. En wanneer jy dit kry, dit is regtig al net gaan om uiteindelik saam te kom. So wees verseker dit nie moet al sink in vandag. So hier is die laaste program ons gaan om te kyk na. En ons gaan eindig met 'n vinnige drie minute van die claymation gemaak deur ons vriend, Nick Parlante. Hier is 'n program, wat op die top twee lyne verklaar 'n veranderlike x en y. Wat albei adresse heelgetalle, AKA wenke. Ons het toe te ken genoeg geheue na 'n int stoor en die stoor van die adres van daardie geheue in x. So, is dit nog makliker as die voorbeeld voordat. Gee my vier grepe van die geheue, dit is die grootte van 'n int, en sit dit in x adres. Hierdie lyn beteken hier gaan na die adres in x en sit die betekenis van die lewe, die nommer 42 is daar. Maar hierdie lyn bekommer my. Ster y beteken gaan na die adres in y, en sit die ongelukkige nommer 13 is daar. Hoekom is dit gevaarlik, op hierdie punt in die story-- hoewel vinnig vertel in ons besig om te kwyn minute here-- hoekom is dit sleg vir my om te sê, gaan na die adres in y? GEHOOR: Jy het nie [onhoorbaar]. DAVID J. MALAN: Ek het nie sit iets in y. So, wat is die waarde van y, op hierdie punt in die verhaal? Ons het geen idee nie. Dit is 'n paar vullis waarde en ook nie Binky weet. As ons kon eindig op hierdie nota. [Video speel] Hey, Binky, wakker. Dit is tyd vir wyser pret. -Wat is dit? Meer inligting oor die riglyne? O, goody. -Goed, Om te begin, ek dink ons ​​is gaan 'n paar wenke nodig. -OK. Hierdie kode ken twee pointers wat kan verwys na heelgetalle. -OK, Goed ek sien die twee wysers, maar hulle lyk nie te wees om iets te wys. -Dis reg. Aanvanklik wenke nie wys nie. Die dinge wat hulle wys is genoem pointees en die opstel van hulle op is 'n aparte stap. -OH, Regs, regs. Ek het geweet dat. Die pointees is geskei. So hoe kan jy 'n pointee ken? -OK, Goed hierdie kode toegeken word nie 'n nuwe heelgetal pointee, en hierdie deel stelle x wys om dit te. Hey, wat lyk beter. So maak dit iets te doen. -OK, Sal ek dereference die wyser x om stoor die nommer 42 in sy pointee. Vir hierdie truuk, sal ek moet my towerstaffie van dereferencing. -Jou Towerstaffie van dereferencing? Uh, dat dit is 'n groot. -Dit Is wat die kode lyk. Ek sal net die opstel van die aantal and-- [POP KLANK] Hey, kyk daar dit gaan. So, doen 'n dereference op x volg die pyl om toegang te verkry sy pointee. In hierdie geval, om te slaan 42 daar. Hey, probeer om dit te gebruik om die aantal te stoor 13 deur die ander pointer, y. -OK. Ek sal net gaan oor hier om y, en kry die nommer 13 ingestel. En dan neem die muur van dereferencing en just-- [Sirene klank] -OH, Hey wat nie gewerk het nie. Sê, uh, Binky, doen ek nie, dink dereferencing y is 'n goeie idee, want die opstel die pointee is 'n aparte stap. En ek dink nie ons ooit gedoen het. -Hmm, Goeie punt. -Yeah Ons toegeken die wyser, y, maar ons nooit sit dit om te verwys na 'n pointee. -Hmm, Baie oplettend. Hey, jy kyk goed daar Binky. Kan jy dit op te los sodat y punte dieselfde pointee as x. -Sure, Ek gebruik my towerstaffie van wyser opdrag. -Is Dit gaan 'n wees probleem, soos tevore? Nee, dit beteken nie die pointees raak. Dit verander net een wyser om te wys op dieselfde thing-- [Knal KLANK] --as ander. -O ek sien. Nou y punte na dieselfde plek as x. So, wag, nou y is vasgestel. Dit het 'n pointee. Sodat jy kan probeer om die muur van die weer dereferencing die 13 oor te stuur. -OH, OK, hier gaan. Hey, kyk na dit. Nou dereferencing werke op y. En omdat die wysers deel dat een pointee, het hulle albei sien die 13. -Yeah, Deel, uh, wat ook al. So, gaan ons nou plekke skakel? -OH, Kyk ons ​​uit tyd. -But-- -net Onthou die drie wyser reëls. Nommer 1, die basiese struktuur is dat jy 'n wyser, en dit wys oor 'n pointee. Maar die wyser en pointee is geskei. En die algemene fout is om 'n wyser maar om te vergeet om te gee dit 'n pointee. Nommer 2, wyser dereferencing begin by die wyser en volg die pyl oor om toegang tot sy pointee. Soos ons almal weet, dit werk net as daar is 'n pointee, wat soort van kry terug nommer 1 regeer. Nommer 3, pointer opdrag neem een ​​wyser en verander dit om te verwys na die dieselfde as 'n ander pointee wyser. So na die opdrag, die twee wysers sal verwys na dieselfde pointee, soms is genoem wat deel. En dit is al wat daar is om dit, regtig. Bye-bye nou. [Einde afspeel] DAVID J. MALAN: Dit is dit vir CS50. Dank aan Professor Nick Parlante. Ons sal sien dat jy volgende week. [Elektroniese musiek Speel]