[Muziek] DAVID J. MALAN: Dit is hetzelfde als een eerstejaars seminar vandaag. OK. Dus zeer regenachtige buiten. Dit heeft de neiging te gebeuren op woensdag, maar des gelegenheid voor vragen vandaag. Dus laten we beginnen eigenlijk af met de film in slechts een moment. Maar we zullen groots beginnen zoals altijd. Dit is CS50, en dit het einde van week 4. Dus als je ooit hebt bekeken Tv of een film, waarin is er een aantal computer experts en de politie of de FBI, of een agentschap probeert om bepaalde vangen tegenstander, nou ja, je hebt waarschijnlijk gehoord van de uitdrukking "verbeteren," waarbij dat technicus een of andere manier magisch zoomt in oneindig ver naar de criminelen zien identiteit of het kenteken zelfs in de glinstering van een spiegel of de glinstering van het oog van iemand. Dus inderdaad, laten we eens een kijkje nemen op een paar van zulke scènes van Hollywood. [VIDEO AFSPELEN] -OK, Nu laten we een goede blik op je. -Hou vast. Lopen dat terug. -Even wachten. Ga rechts. -Er, Bevriezen dat. -Volledig scherm. -OK, Bevriezen dat. -Tighten Op dat, wil je? -Vector In op die man door het achterwiel. -zoom In hier op deze plek. -Met De juiste apparatuur, het beeld kan worden uitgebreid en geslepen. -Wat is dat? -Het Is een verbetering programma. Kun je duidelijk dat je geen? Ik weet het niet. Laten we verbeteren het. -Verbeter Sectie A6. -Ik Verbeterde het detail, en-- Ik denk dat er genoeg te verbeteren, laat het aan mijn scherm. -Ik Versterkt de reflectie in haar ogen. -Laten We dit doorlopen video toebehoren. -Edgar, Kunt u dit verbeteren? -Hou vol. -Ik Heb gewerkt aan deze reflectie. Reflectie -Someone's. -Reflectie. -Er Is een weerspiegeling van de man gezicht. -De Reflectie. -Er Is een reflectie. -zoom In op de spiegel. -U Kunt een reflectie zien. -Kan U het beeld verbeteren van hier? -Kan Je hem hier te verbeteren? -Kan Je het te verbeteren? Kun je het verbeteren? -Kan We dit verbeteren? -Kan Je het te verbeteren? Wacht even een tweede, zal ik verbeteren. -zoom Via de deur. -Times 10. -zoom. -Intrekken. -Meer. -Wacht, Stoppen. -Stop. -PAUSE Het. -Draai Ons 75 graden om de verticale, alstublieft. -Stop. Ga terug naar de kant de deur weer. -Got Een afbeelding enhancer die kan bitmap? Hé, misschien kunnen we het Pradeep gebruiken Sen methode om te zien in de ramen. -Deze Software is state of the art. -De Eigenwaarde is uitgeschakeld. -Met De juiste combinatie van algorithm-- -Hij's Genomen eliminatie algoritmen naar het volgende niveau, en ik kan ze gebruiken om verbeteren deze foto. -Lock Op en vergroten de z-as. -Verbeteren. -Verbeteren. -Verbeteren. -Freeze En te versterken. [END AFSPELEN] DAVID J. MALAN: Oke, dus al die eigenlijk woorden. Ze zijn gewoon aaneengeregen in een dat is niet echt verstandig. En, in feite, CS50 en cursussen als het heeft de neiging om veel tv en films ruïneren voor jou. Want als die computer experts zijn dreunen voorwaarden en zeggen mooie dingen zoals eigenvectoren en de z-as, en een willekeurig aantal andere eigenlijk meer technische termen, ze zijn eigenlijk gewoon rijgen woorden samen al te vaak. Is dat een van onze hoop is dat als een neveneffect van het volgen van cursussen als dit, zal meer mensen in de wereld daadwerkelijk in staat zijn om te wegen en gewoon ooit zo iets van invloed op de kwaliteit en nauwkeurigheid van die films? In feite, laten we eens een kijkje nemen op de werkelijkheid. Dus hier is het personeel foto van Mary, een van ons onderwijs fellows. En stel dat ze is verdacht van iets. En toch, er is een sprankje een stukje van bewijs in haar ogen, of in de reflectie van haar bril. Nou, als we precies doen zoals de films stellen, waarbij we inzoomen en "verbeteren", dit is hoeveel informatie is in Maria's gezicht wanneer u een beeld vast te leggen met die originele resolutie. En, in feite, kunt u deze stippen te zien. En deze zijn wat zijn genaamd pixels, P-I-X-E-L-S, dat is gewoon een plein doorgaans dat is een punt dat een beeld componeert. En terug in de dag, en eigenlijk zelfs vandaag met een aantal van de huidige LED TVs of lcd-tv's, als je hebt één in uw kamer of thuis, Als je omhoog gaat super dicht bij, en vooral als het een wat oudere tv, kunt u waarschijnlijk ook zien dat deze punten en dat is wat samen een beeld. En er is niet meer informatie dan dit. We hebben "verbeteren", in de zin smoothing dingen over en soort inferring soort, een soort van wat kleur moet naast Mary's oog zodat het eigenlijk niet zo korrelig. Maar als ik blijf inzoomen, er is de bad guy in haar ogen. Als dat is alles wat de informatie hebben we. Je kunt niet maken informatie uit het niets. Er is maar een eindige aantal bits zijn. Dus in Probleem Set 4, waarbij heb je een kans om te spelen met dit soort wereld. In Probleem Set 4, zult u ontdekken de wereld van graphics, en forensisch onderzoek, en eigenlijk code schrijven die herstelt verloren beelden. U zult code te schrijven dat manipuleert bestaande beelden en uiteindelijk begrijpen wat gebeurt onder de motorkap. En, zo blijkt, is het eigenlijk niet zo ingewikkeld. Bijvoorbeeld, als we wilden vertegenwoordigen een smiley, waar met deze zwarte pixels, of deze zwarte stippen, goed, we konden gewoon vertegenwoordigen als ze echt een bitmap. En als je ooit gehoord dat uitdrukking bitmap, misschien het begint nu een maken beetje meer zin vandaag. We weten al wat een beetje is. Het is 0 of 1. En een kaart is gewoon iets zoals een stuk papier dat geeft u een routebeschrijving en heeft misschien een raster van x- en y-coördinaten. Dus hier is een bitmap. Het is een kaart van beetjes waarbij een 1 blijkbaar gaat naar een witte pixel vertegenwoordigen, en een 0 gaat om een ​​zwarte pixel vertegenwoordigen. Maar we kunnen zeker te spiegelen rond. Het maakt eigenlijk niet uit, zodat Zolang we consistent. En hier is hoe in binary-- binnen van het geheugen van een computer, of zelfs in van een bestand op uw harde drive-- kan je opslaan de eenvoudigste smiley afbeeldingen. Maar wat zijn wij, natuurlijk, ontbreekt in dit beeld? Kleur, toch? Het is een voor de hand liggende volgende stap of enhancement om dit te verbeteren met kleur. Dus helaas met slechts een enkele bit, 0 of 1, we kunnen kleuren vertegenwoordigen. Dat kan rood of blauw zijn, of zwart of wit, of groen of roze, of paren kleuren. Maar omwille van de eenvoud, zullen we gewoon aannemen zwart en wit. Dus wat logisch hebben we nodig als we willen implementeren kleur in een afbeelding? Wat moeten we doen? Net als de beperkende factor is dat met een beetje kunt u alleen vertegenwoordigen twee staten, 0 of 1, wit of zwart, wat wil je doen? Publiek: Meer gegevens. DAVID J. MALAN: meer bits, ja meer data, meer bits. En inderdaad, dat is precies hoe kleurenbeelden zijn vertegenwoordigd. In plaats van gebruik maken van een enkel bit, een 0 of 1 voor elke pixel, elke stip, je gewoon gebruik maken van meerdere. Misschien gebruik 8, misschien, meer in het algemeen Gebruik 24, en inderdaad, in Probleem Set 4, zul je spelen met een bestand formaat dat 24 bits gebruikt doorgaans. Maar de meeste van jullie waarschijnlijk vertrouwd met JPEG. Als je ooit hebt genomen een foto op je telefoon, of geüpload of iets gezien op Facebook of Flickr, een aantal van foto-gebaseerde websites, je hebt waarschijnlijk een JPEG-afbeelding gezien. En het blijkt, dit is het bestand indeling we gaan gebruiken in Pset 4, waarbij je gaat moeten afbeeldingen herstellen dat ik per ongeluk heb verwijderd uit een bedorven geheugenkaart in de camera, als je wil. En het blijkt dat hoewel JPEG is vrij sophisticated-- het is veel meer geavanceerde dan de zwarte en witte stippen zagen we een ogenblik geleden, omdat er eigenlijk mooie algoritmen die worden gebruikt om een ​​JPEG comprimeren, zodat dat je een heel mooi kan hebben, beeldkwaliteit, maar met behulp van relatief weinig bits. En we zullen terug te komen compressie voor lang. Het blijkt dat de eerste drie bytes in een JPEG image-- het maakt niet uit wat je een foto hebt genomen van-- de waarden 255, 216, 255. Met andere woorden, als je gewoon zien dat patroon van bits, hier voorgesteld als drie bytes, of 24 bits in totaal, met een hoge waarschijnlijkheid kunt u afleiden dat u op zoek bent naar het op deze eerste drie bytes van een JPEG. En dit is wat bekend zoals de ondertekening van een JPEG. Veel bestandsformaten daar hebben de neiging om te beginnen bepaalde patronen van 0s en 1s, zodat Windows en Mac OS en iOS, en Android weten wat voor soort bestand dat ze zijn, naast de zogenoemde file extensie die een groot aantal bestanden te hebben. Als u hebt .jpg, dat is een andere aanwijzing voor de computer. Dus laten we nu eens kijken naar deze een beetje meer technisch. We weten dat de decimale systeem is 0 tot 9. We weten binaire is 0 en 1. En als je terugdenkt aan Pset 0, we hadden jullie worstelen met, voor een klein beetje, iets genaamd hexadecimale, waar je 16 cijfers, in plaats van 10 of in plaats van 2. En die cijfers, volgens afspraak, zijn 0 tot en met 9 en vervolgens een tot en met f, waarbij f staat voor wat decimaal getal, net als een snelle geestelijke gezondheid controleren? Dus, 15. En een must 10 vertegenwoordigen, gewoon door aard van de bestelling die ik heb gegeven. Het is gewoon een willekeurige overeenkomst, maar het is vrij standaard. Dus als we kijken naar dit patroon drie bytes-- laten gewoon beginnen te kijken naar het in een wijze die in overeenstemming met de manier waarop informatici algemeen naar te kijken en na te denken over files. U kunt zeker nadenken over bestanden in 0s en 1s en decimale, maar in werkelijkheid, zijn we geneigd om binaire gebruiken of meer kenmerkend hexadecimal-- terug van Pset 0. Dus laat me voorstellen dat 255, 216, en 255 zijn deze patronen van 0s en 1s. En u kunt dit controleren als u willen de wiskunde te doen van week 0. Maar voor nu, gewoon aannemen dat dit inderdaad juist. Ik heb net herschreven drie cijfers nummers drie binaire waarden. Nu wat ik ga doen is voeg wat witte ruimte, gewoon omwille van de leesbaarheid's. En bericht, ik ga gewoon dingen uit elkaar. Dus voor, na, voor, na. Ik ben niets interessants meer te doen dan alleen het verspreiden van dingen uit, zodat die aankondiging elke set van acht bits nu twee sets van vier bits. Dit is nuttig omdat hexadecimaal bijzonder mode omdat elke hexadecimale cijfers 0 tot en met f, of meer specifiek 0 tot 15, kan worden vertegenwoordigd precies vier bits. Met andere woorden, in hexadecimale als je willen vertegenwoordigen een 0, het is gewoon 0000, vier nullen. En als je wilt om 15 te vertegenwoordigen, Het is 1111, die vier bits. En als je de wiskunde, als dit degene plaats, dit is de 16s plaats, dat gaat u-- geven eerder dat gaat to-- sorry, in binaire, dat gaat je 15 geven, die plaats, tweeën plaats, handen en voeten en achten plaats. Dus laat me voorstellen dat dat set van vier bits aan de linkerkant is wat we gaan f noemen. Het is het grootste aantal u kan vertegenwoordigen met vier bits. En we weten al van hexadecimaal, f de grootste digit hexadecimale. We hebben nog een f daar aankwam, twee meer daar. En voor nu, neem dan gewoon op vertrouwen dat ik de wiskunde recht hebben gedaan en dat de linkerhelft van die bits, 1101, is hetzelfde als d hexadecimaal. En de rechterhand, 1000, is slechts 8. En dat men gemakkelijk te zien, toch? De 8 represents-- recht is onder die achten plaats. Dus hebben we een in de kolom achten en niets in de handen en voeten, tweeën of degenen. Dus nu meer conventioneel, mensen de neiging om hexadecimale cijfers als dit schrijven, je gewoon squish ze samen, en dan moet je ze met de prefix 0x. Het betekent niets anders dan een visuele aanwijzing voor een human-- hier komt een hexadecimale value-- omdat het kan niet anders duidelijk zijn. Dat wil zeggen, uiteindelijk, dat het patroon van nullen en enen, of het patroon van hexadecimale cijfers equivalent dat je gaan om te beginnen op zoek naar in Probleem Set 4 is dit-- En het probleem Set 4 spec zal lopen u door dit in meer detail-- maar realiseren als een soort geheimzinnige als Dit ziet er misschien op het eerste gezicht, je gaat om te beginnen met het zien van deze veel. En inderdaad, zelfs in GDB, de debugger we op maandag geïntroduceerd en Dan introduceert in Pset 3, gaat vaak laten zien hexadecimale waarden alleen maar omdat ze de neiging om meer te zijn conventionele dan decimaal of binaire in de wereld van computers. Laten we dit in de juiste context. Velen van u misschien dit onthouden foto hier, die van wat kwam? Vista, dus zelfs eerder dan dat Windows XP deed dit debuut. Dus dit is een prachtig landschap. En in feite, als je rond te snuffelen online-- Ik denk dat het een Wikipedia-artikel, waarin iemand ging erg verbazingwekkend uit vonden deze locatie in de wereld opgezet diens camera precies de juiste plek-- en dit vandaag de dag ziet er like-- maar het is precies dezelfde instelling. Dit beeld is echter in een bestand formaat genaamd bitmap, b-m-p. En we gaan naar een super nemen snelle blik op wat dat betekent. Maar bitmap is gewoon een andere manier van die beelden nog steeds met behulp van pixels in 0s en 1s, uiteindelijk. Maar op snelle blik, het heeft een meer interessante handtekening aan het begin van het bestand. Het is niet alleen drie bytes, in plaats van er een heleboel patronen bytes die vooraf bepaalde betekenis. Bijvoorbeeld, ergens in de eerste paar bytes van een bitmapafbeelding zal de grootte van de te beeld, de breedte van het beeld, de hoogte van de afbeelding, zodat bruikbare metadata, als je wil. Nuttige informatie die Photoshop of een grafisch programma dat u gebruikt eigenlijk zou kunnen schelen. Dus meer hierover in Probleem Set 4, maar dit alleen zeggen dat aan het einde van de dag alle bestandsformaten die je hebt gebruikt voor years-- Microsoft Word-bestanden, Numbers-bestanden, Excel-bestanden, een aantal bestandsformaten dat sommigen hebben bekend bestandsextensie zijn slechts 0s en 1s onder de motorkap. En mensen hebben besloten wat de overeenkomsten zijn, welke patronen van 0s en 1s vertegenwoordigen een Word-bestand ten opzichte van een Excel-bestand, ten opzichte van een aantal andere bestandsformaten. Dus in Pset 4, zul je een hebt kans om te spelen met die. Maar wat betekent het om een ​​structuur te hebben. Dit is eigenlijk een mooie segue nu in C, die slechts een paar heeft van de extra functies die we hebben niet gekeken naar nog. Het is een vrij kleine taal en één van de leuke features over C is een structuur. Bijvoorbeeld, als je wilde represent-- laten zeggen dat je wilde een variabele hebben die vertegenwoordigt een student in een programma. Misschien dat je een cursus schrijven registratieprogramma, of de kern winkelen tool, of iets dergelijks. Wat zijn stukjes data gerelateerde een student die te binnen schieten? Als een student vertegenwoordigd met welke waarden? Ja? Je hebt een naam als een student. Wat doet een typische student? PUBLIEK: [onverstaanbaar] DAVID J. MALAN: Dus, sorry. Publiek: Age. DAVID J. MALAN: Een leeftijd of verjaardag equivalent, yep. Wat anders? PUBLIEK: ID-nummer? DAVID J. MALAN: Dus een ID-nummer, misschien een telefoonnummer, misschien een slaapzaal, of huis, of hogeschool, of iets dergelijks. Elk aantal stukken data die u zou kunnen hebben in uw lijst met contacten is wat kan een student te definiëren. Dus als we wilden dit te doen, in de code, we kunnen iets simpels als dit te doen. We zouden een programma, zodat hebben heeft laten we zeggen, int main (void). En als ik wil een vertegenwoordigen student Ik zou kunnen hebben, bijvoorbeeld, een string genaamd naam voor die student, een string genaamd dorm voor die student, misschien een int opgeroepen ID voor die student. En omdat ik ben met behulp van touw, I nodig hebben om terug te gaan en zetten CS50.h. Misschien ga ik stdio.h nodig. Dus laat ik die preventief te doen en ik ben ga dit student.c roepen voor nu en bewaar deze. En nu kan ik iets doen deze variabelen. En we gaan gewoon te schrijven dat als een commentaar in pseudo-code, want het is niet interessant wat we doen voor nu. OK, dus dit is een programma dat een of andere manier slaat een student. Wat wil ik doen als ik wil twee studenten op te slaan? Dus mijn eerste instinct gaat allemaal goed, wacht eens even, als ik een andere student waarom ik niet gewoon doen tekenreeksnaam 2, touwtje dorm 2, int ID2. En we hebben weg gedaan op deze weg vóór en wat onze oplossing voor wat lijkt een soort van een hackish copy-paste te zijn werk hier? Publiek: Een array. DAVID J. MALAN: Ja, we kunnen een array. Rechts deze zeer snel wordt onhandelbaar. Je moet willekeurig soort start naamgeving al deze variabelen. En u, de mens, moeten blijven volgen dat OK naam2 overeenkomt met dorm2 overeen met ID2. Het wordt gewoon een puinhoop. Dus het is een stuk makkelijker, herinneren van een paar weken geleden, om gewoon te heet tekenreeksnamen en misschien geven ons drie van hen. En dan misschien hebben we touwtje slaapzalen en hebben drie ervan of met een constante, int ids en hebben drie van hen. Maar zelfs nu dit voelt een beetje slordig, rechts. We hebben het over studenten en toch Ik ben echt stil te staan ​​bij het lage niveau implementatie details. De student is een naam en een slaapzaal en ID. Waarom kan ik niet gewoon verklaren een variabele riep student en noemen het is. En als ik wil een andere student, waarom heb ik niet noem het t. Of als ik een hele hoop studenten, waarom doe ik gewoon niet zeggen dat ik een hele klas van studenten en het is drie. Met andere woorden, waarom kan ik niet komen met mijn eigen data type, de zogenaamde Studenten, binnen luidt een naam, een ID, is een slaapzaal, is een aantal andere gebieden. En het blijkt dat je kan precies dat doen. Dus C heeft deze functie genaamd structuur. Dat is een taal die functie stelt ons in staat om precies dit te doen. Ik ga om te gaan en open structs.h waar we heen gaan om het te zien volgende definitie van een student. Het blijkt - en dit is zelfs eenvoudiger dan die waarbij een ID een moment geleden. Als u wilt komen met uw zelfgemaakte data type, en naast int en char en zweven en al deze anderen die bestaan, U kunt dit doen door letterlijk schrijven typedef struct, vervolgens een aantal accolades, de binnenkant van die u een lijst van de variabelen die u wilt associëren met deze nieuwe aangepaste gegevens typt zoals een naam en een slaapzaal, en dan na de accolades u een naam voor de nieuwe data type te geven. Dus, bijvoorbeeld, student. En wat is er leuk aan dit bedrijf is dat Als we kijken naar de bijbehorende code, de conventie, eerste van alles, is om dit te zetten in een bestand genaamd iets dot h, een header bestand, dat hebben we niet begonnen met ons te veel. Maar we gaan beginnen gebruik nu wel een beetje. En wat we kunnen doen met deze, uiteindelijk, in deze paar regels code is te verklaren dat precies datatype, een student. En laten we nu gebruiken. Ik ga nu in de een bestand genaamd structs1.c. En laten we een kijkje nemen op een Enkele kenmerken hier. Dus het spul hier is veelal bekende, en we zullen terug te komen op wat niet vertrouwd in slechts een moment. Dit is natuurlijk ook mijn eigen header-bestand, die nieuw is zo goed, behalve voor Pset 3, waar, recall, hebben we helpers.h. Dus je zou #include helpers.h herinneren. Waarom al gebruik ik citaten in plaats van haakjes? Wanneer moet ik kiezen tussen hen? Bijna altijd Ik lijk om haakjes te gebruiken. En dan, ineens op lijn zes Ik ben met behulp van dubbele aanhalingstekens. Waarom zou dat zijn? Ja? PUBLIEK: [onverstaanbaar] DAVID J. MALAN: Dat is een echte, wat? PUBLIEK: Dat is in uw IDE. DAVID J. MALAN: Ja, dat is in mijn werkelijke IDE. En laten we niet stilstaan ​​bij de IDE, omdat dat is gewoon een tool die ik gebruik. Dat is in mijn huidige directory, in het bijzonder. Dus structs.h is mijn eigen bestand niet in de IDE geïnstalleerd, in het besturingssysteem zelf, plaats het in mijn huidige directory. Zodat het verdrag is als je wilt om uw eigen header-bestand omvatten, je gewoon gebruik maken van dubbele aanhalingstekens. Wat hebben we dit ding noemen in lijn 8, in het algemeen? Dit is wat? #define iets. Dit vertegenwoordigt constanten, toch? Als u wilt een hebben waarde in het programma dat je een hele gebruiken paar keer, het is goede conventie om het uit factor, verklaren, met de hekje definiëren, dan, volgens afspraak, in alle hoofdletters word-- al is het niet strikt noodzakelijk, maar Het is de menselijke conventie constanten kapitaliseren zodat ze eruit springen naar je visually-- ruimte en dan is de waarde die u wilt zijn gelijkwaardig is aan de naam van die constant. Geen puntkomma, maar je gewoon volgen dat patroon er. Dus wat doe ik in deze eigenlijke code. Dus laten we een kijkje nemen op de belangrijkste programma hier. In lijn 12 omdat ik hebben opgenomen structs.h, Ik heb nu op magische wijze naar mijn beschikking over een nieuw type data. Ik heb niet alleen toegang hebben tot int, en char, en zweven, en strijkorkest, en blauw en anderen. Ik heb nu toegang tot een type student data. Dus in de lijn 12, ik ben het combineren van twee ideas-- men een aangepaste data type en twee, met behulp van een matrix. En dus in dit programma als Ik wil eigenlijk steunen drie verschillende studenten in mijn programma, ik kan alleen maar zeggen geef me een variabele genoemd studenten, die elk is van het type studenten die is mijn aangepaste data type. En in het bijzonder, geef me drie van die mijn array. Dus nu wat doen we in dit programma? Hier is gewoon een lus iteratie 0-3, want dat is wat de waarde van de studenten is. Ik ben gewoon vragen aan de gebruiker geef mij de naam van de student. En vervolgens in lijn 17, we hebben een meestal vertrouwde lijn. We hebben onze oude vriend GetString aan de rechterkant. En welk stuk van de syntaxis is blijkbaar nieuw, Als je nog nooit hebt geprogrammeerd in C voor, en heb nog nooit gebruik gemaakt van de structuren? Ja? Publiek: De .name. DAVID J. MALAN: De .name. Maar dit is niet te veel van een sprong, want nu studenten beugel i geeft u de i-de student. En als je wilt duiken binnenzijde van die structuur, je gewoon gebruik maken van een enkele periode en vervolgens de naam van de variabele in, of de woning binnen dat U wilt toegang tot krijgen. Op dezelfde manier dan, als ik vragen dan is de gebruiker, geef me de student slaapzaal, U kunt op dezelfde manier op te slaan, dat tekenreeks in de slaapzaal variabele binnen van die student structuur. En nu de dingen een beetje fantasie. En dit is gaan kijken op misschien wel een stuk vrij snel. Maar je zult zien veel meer in Pset 4, dus laten we gewoon blik op het nu. Het blijkt dat in de lijn 23 door middel van 38, wat denk je dat ik misschien aan het doen? Ik heb de opmerkingen verwijderd voor vandaag, maar de versie van de code online verwijzing heeft alle reacties. Wat heb ik lijken te doen? PUBLIEK: het bestand met alle opslaan de informatie die de gebruiker heeft ingevoerd. DAVID J. MALAN: Ja, precies, is een nieuwe manier dat zien we twee, Een ander kenmerk van C, waarbij ik mijn eigen bestanden kunt maken. Tot nu toe vrijwel elk programma je hebt geschreven staatloos is. Zodra het klaar is draait, dat is het. Er is geen geheugen of herinnering van het. Er is geen bestand opgeslagen. Maar als je wilt opslaan input die heeft gebeurd, zoals in een spel of een programma als dit, het blijkt dat we kunnen doen. En je zult dit meer zien in Pset 4 en in paragraaf. Maar deze lijn 23 in wezen creëert een bestand genaamd students.csv. En je zou eerder hebben gezien dit. Zelfs als je nog nooit CS eerder hebt gestudeerd, CSV is door komma's gescheiden variabelen. Het is als een zeer arme man versie van een Excel-bestand, wat betekent dat het kan worden geopend in Excel en in Apple Numbers, en heeft rijen en kolommen. Maar het is niet een eigen formaat als Microsoft of Apple. Het is gewoon komma scheiden van de waarden die we zullen zien in een moment. En gewoon een gok. In lijn 23, aan het Uiteindelijk mijn tweede argument deze nieuwe functie genaamd f geopend voor het bestand geopend is w. Wat zou w duiden? Ja? Publiek: Het laat je schrijven naar het bestand? DAVID J. MALAN: Het laat u schrijven naar het bestand. Dus er is een paar varianten dat we hier kunnen inpluggen. Maar als je gewoon wilt lezen het bestand, dat is kijken en lees het in het geheugen, je gewoon citaat unquote "r" te gebruiken. Als u wilt schrijven naar de bestand, citaat gebruik je unquote "w". Er is ook te voegen en een paar andere dingen als je wilt om bestaande bestanden te wijzigen. Nu gaan we blijven zien dit ding, dan zullen we terugkomen op lijn 24. NULL, zo blijkt, is een bijzondere waarde die kan worden teruggegeven door bepaalde functies als er iets wrong-- is gegaan als het bestand niet bestaat, als je uit het geheugen hebt draaien, of een bos van andere fouten. Maar voor nu, laten we aannemen dat deze is gewoon conventionele foutcontrole. Hier in lijn 26, ik ben itereren 0-3 over al mijn studenten. En dit is een soort van een soort van een nieuwe functie, fprintf, maar gewoon een gok. Als printf is gewoon druk een geformatteerde string wat betekent fprintf waarschijnlijk betekenen? PUBLIEK: afdrukken naar een bestand. DAVID J. MALAN: Druk een opgemaakte string naar een bestand. Dat is wat de extra f middel is bestand. En de nieuwe eerste argument moet worden de variabele die het bestand vertegenwoordigt. Dan hebben we gewoon een formaat touwtje net als printf. En hoewel dit syntax is nieuw, dit enkel betekent dat de stekker in de naam van de student, plug-in het studentenhuis, en dan met fclose, sluit het bestand. En dan lastly-- dit is nieuw en we zullen hierop terugkomen voordat long-- Ik vrijmaken de student redenen dat gebeurde boven daar. Maar we zullen terugkomen die vóór long-- dat is vanwege de manier waarop GetString is eigenlijk werkt onder de motorkap. Dus laten we eens een snelle blik hier. Als ik type ls in mijn directory, merken dat ik niet hebben een bestand genaamd students.csv, gewoon niet, bestaat niet. Dus als ik nu in dit programma samen te stellen, maken structs-1. / structuren-1, en ik ga om verder te gaan en type in Andi, die woont in Berkeley in Yale. We gaan Rob hebben die woont in Thayer deze dagen. En laten we komen met waar de is, denk ik, Maria is in Mather, als ik het goed heb onthouden. Zodat er niets lijkt te gebeuren. Maar als ik typ ls nu, er students.csv. Laten we verder gaan en geopend students.csv. Ook dit is een zeer lichtgewicht bestandsformaat. Maar ik heb gewoon nam een ​​conventie dat ik twee rijen en kolommen hier. De eerste kolom is mensen voornamen. De tweede kolom is de student dorm, of hogeschool, of huis, of wat. En nu heb ik het gered permanent in een bestand. Dus het is niet zo interessant. Maar dit is slechts een opstapje nu op de mogelijkheid om informatie voortduren permanent. Dus laten we zien nu wat meer we kunnen met deze en andere functies. Maar eerst nog vragen? Dat was een stuk, en dat was snel. Maar je zult een hoop te zien Meer in Pset 4, ook. Ja? PUBLIEK: Is er een manier om blijven toevoegen namen aan dat bestand? DAVID J. MALAN: Goede vraag. Is er een manier om verder te gaan toe te voegen namen aan dat bestand? Ja. En, in feite, als je uiteindelijk up opnieuw openen van het bestand, zou je citaat te gebruiken unquote "a" voor append, die zou gewoon een nieuwe lijn, een opnieuw en opnieuw, precies nieuwe lijn. Goede vraag. Overige vragen? Ja? Publiek: Als je liep de programma opnieuw op dit moment, zou het blijven toevoegen namen aan de bestand of zou het openen van een nieuw bestand? DAVID J. MALAN: Ah, goede vraag. Als je liep het programma weer recht Nu, misschien ingetypt nieuwe namen, zou het toe te voegen aan het bestand of het bestand overschrijven? De laatste, want ik ben niet gebruikt append mode. En omdat ik ben gewoon blindelings het openen van het bestand voor schrijven, het is gewoon gaat om het bestand te overschrijven. Dus ik zou wel moeten doen is te voegen, als ik wil eigenlijk een lange termijn database. Nu CSV is handig, eerlijk gezegd, zelfs voor alsof je writing-- en we zullen uiteindelijk dit zien later in het semester bij We gebruiken CSV voor andere doeleinden. Als u alle van de mensen op te slaan die hebben ingeschreven voor een bepaalde gebeurtenis, of aangemeld voor uw student groep, of iets dergelijks, bewaring in dergelijke van formaat is super handig. Omdat letterlijk, als ik waren om dit bestand te downloaden. Ik kon double-- en laten we eigenlijk dit proberen als ik Excel of Numbers hier. Ik ga klik met de rechtermuisknop of de controle op mijn dossier. Whoops. Klik rechts of control-klik op mijn dossier. Kom op, mijn muis niet mee. Download-- Ik ga Download hier alle bestanden zo zodat ik kan dit te grijpen. En laten we eens kijken of dit werkt students.csv-- eerst Ik heb geactiveerd. Nu willen ze mijn contacten te zien. Nu, ik moet registreren. Zien hoe gemakkelijk het is om CSV gebruiken? Ja, keep it up-to-date. OK, nu zijn we klaar voor klasse. OK, oh, wat is nieuw? OK, in de buurt. Dat was magisch. Oké, nu moeten we werken. En nu, het vergeten wat bestand Ik oorspronkelijk geopend, maar wat er A-- we gaan. OK, dus nu hebben we een Excel-bestand. Dankjewel. OK, dus wat ik deed was het makkelijke gedeelte. Natuurlijk kon ik heb vooraf geïnstalleerde Excel of Numbers, of wat dan ook het programma. Maar dit is mooi, want nu kan ik manipuleren de gegevens in een standaardformaat. Dus laten we nu context schakelen naar waar we gebleven laatste keer die beginnen af te nemen zijwieltjes. Maar eerst, je deed het niet zie dit eerder lunch wordt weer gebeurt hier bij Brand en Ijs in Cambridge, Sitar in New Haven. Meld je aan op CS50s website ASAP CS50 om studenten en medewerkers meedoen. Dus namen we zijwieltjes off op maandag als follows-- snaar is verklaard in CS50s bibliotheek voor bepaalde tijd. En het is leuk, omdat het mogelijk maakt ons over variabelen te praten als volledige woorden en zinnen en meer. Maar het blijkt koord bestaat niet. Dat is gewoon een synoniem, of een alias, die we hebben gemaakt voor iets dat eigenlijk een beetje technisch heet een char *. En inderdaad, een voorbeeld zagen we een programma op maandag dat niet gedragen helemaal zoals we verwacht hadden. Dit was de file, vergelijk-0. En herinner me dat te vergelijken-0, indien Ik maandag het programma opnieuw te compileren en run vergelijken-0 en typ moeder in kleine letters, en mamma in kleine letters weer. Het programma stond erop dat ik typt verschillende dingen, hoewel moeder, alles in kleine letters, is identiek visueel. Dus wat was het korte antwoord waarom de computer denkt die twee strings zijn verschillend? Ja? PUBLIEK: [onverstaanbaar] DAVID J. MALAN: Recht. Dus, moeder, de eerste keer Ik typ het in, is dat ergens opgeslagen in mijn computer geheugen, maar op een andere locatie dan de tweede keer dat ik typ moeder. Nu is het zeker kan worden geoptimaliseerd. De computer kan slim zijn en realiseren van deze twee snaren, hey, ze zijn identiek. Laat me niet redundant opslaan. Maar computers doen dat niet optimalisatie tenzij je vertellen ze. Dus, standaard, ze zijn gewoon gaan eindigen op twee verschillende plaatsen in het geheugen. En zo meer duidelijk, toen zijn We vergeleken de twee snaren, de eerste heette s, de tweede heette t, wat er concreet was ik vergelijken hier op lijn 13? Ja. Publiek: Het is de plek in het geheugen de variabele wijzen. DAVID J. MALAN: Precies, ik was het vergelijken van de plaats in het geheugen dat deze variabelen wees. Dus het bijzonder, als moeder was byte nummer 1 en 2, en 3, en 4-- omdat herinner me de backslash 0 moet helemaal aan het einde. En de andere instantie van moeder, m-o-meter, werd op adres 10, 11, 12 en 13. Ik was het vergelijken van 1, dat adres, die locatie in het geheugen, tegen 10, die duidelijk niet hetzelfde. 1 is 10. Dus dit is leuk in dat het is vrij eenvoudig. Maar het is problematisch voorzover kunnen we niet lijken te strings te vergelijken. Dus fundamentally-- en op dit lage niveau, als je wilde implementeren een programma ter vergelijking twee afzonderlijke woorden die de gebruiker heeft getypt in voor de kwaliteit, doen ze line-up voor char char, alleen in algemene termen, wat hebben we nodig om te doen, blijkbaar? Het is niet voldoende alleen om kijk naar die twee adressen. Wat moeten we doen? Ja? PUBLIEK: doorlopen de string [onverstaanbaar]. DAVID J. MALAN: Ja, laten we doorloopt de string. Laten we gebruik maken van een lus, een while-lus, of wat je het meest comfortabel met. En als we hebben twee snaren kreeg ergens in het geheugen, laten we eens kijken naar elk van de eerste teken, dan is elke seconde karakter dan de derde en vierde, en vijfde, tot we hit welke speciale sentinel waarde? PUBLIEK: [onverstaanbaar] DAVID J. MALAN: Ja, de backslash nul, waarna in beide tekenreeks We kunnen besluiten dat is het. Hebben we afgestemd elk personage? Zo niet, return false. Als dat zo is, return true. En dat is precies wat deze versie van het programma te vergelijken-1.c doet. Het is identiek aan wat we keek maandag behalve dat ik heb weggedaan van het woord string-- al dat heeft geen functionele impact-- alle Ik ben nu aan het doen is het verwijderen sommige visuele zijwieltjes, maar om duidelijk te zien dat s en t adressen. En dat is wat de ster, het sterretje, vertegenwoordigt is een adres, ook wel bekend meer technisch als een pointer. Dus toen ik verklaar s op lijn 9 en zeggen: char * s, dat betekent niet dat geef me een string. Dat betekent geef me een variabele waarvan doel in het leven is om een ​​adres op te slaan. Want ik ben op het punt om het te zetten adres van een string in. En inderdaad, GetString, worden duidelijk, niet een string terug. Het heeft geen moeder terug backslash nul per se. Wat doet getString specifiek en precies terug te keren? PUBLIEK: [onverstaanbaar] DAVID J. MALAN: Een adres, de het adres van het eerste teken in sommige touw het heeft gekregen. En nu we zien een speciale zoekwoord opnieuw. En ik zinspeelde eerder. Dit gaat goed conventie dat we opnieuw en opnieuw te zien nu. Ik controleer om ervoor te zorgen dat s is niet van nul en t is niet nul. Omdat op basis van mijn echt snelle melding eerder, wat zou kunnen betekenen als GetString terugkeert niet domicilie maar N-U-L-L, die weer, een aantal speciale waarde? Publiek: Fout. DAVID J. MALAN: Het is een fout. Er is iets fout gegaan. En wat doorgaans zou kunnen gebeuren, in het bijzonder met strings-- die mogelijk van onbekende lengte advance-- misschien wel de computers ' uit het geheugen, misschien u in zo'n getypt lang woord of zin of geplakt zo'n enorme essay er is gewoon niet genoeg geheugen. En dus GetString kan niet terugkeren het adres van de hele zaak, zodat het net terugkeert niets. En er staat een fout is gebeurd door terugzending van de speciale waarde NULL. Het is de nul-adres, om zo te zeggen. Nu blijkt C wordt geleverd met een functie die iteratie doet. We hoeven niet om dit te implementeren met een lus of een tijdje loop onszelf. We kunnen een functie te gebruiken, bondig genoemd, roer comp, of touwtje vergelijken, wiens doel in het leven is om precies dat te doen. Je geeft er twee pointers, twee adressen, en zal naar die adressen en vergelijk brief voor letter voor letter voor kwaliteit, stoppen alleen wanneer wat waar is? Wanneer intuïtief comping moet roer stop iteratie, alleen maar om duidelijk te zijn? Als het hits een backslash 0 in beide touwtje, op welk punt kan beslissen heeft alles afgestemd, of is er een discrepantie geweest? Dus, als we lopen dit nu en probeer onze kleine kapitalisatie spel, dus zorg vergelijken-1, ./compare-1 en typt moeder in kleine letters beide keren. Nu is het hetzelfde. En als ik het weer doen met kleine letters en dan misschien hoofdletters. Nu het inderdaad onderscheidt tussen hoofdletters en kleine letters. Dus niet zo moeilijk of magisch, maar het is nu uitleggen wat er onder de motorkap. Dus wat we nog meer kunnen halen van dit soort les? Dus laten we eens een kijkje op deze. Ik ga om te gaan en schrijven quick programma hier genaamd copy-0. En laten we nu verder gaan en eigenlijk laten we het doen dit-- met exemplaar-0, een kijkje nemen op wat ik hier heb. Ik voor het eerst de gebruiker te vertellen, iets zeggen. Dan krijg ik een string en ik opgeslagen in s. Dan kijk ik of s gelijk is gelijk aan NULL, gewoon terug 1. Dus dit is gewoon standaard foutcontrole. Niets interessants is gebeurd. En inderdaad, als we te ontdoen van de fout controleren, dit ziet eruit als week 1 code op dit moment. Maar ik ben begonnen om een ​​te krijgen beetje beter over. Nu in lijn 16, een week geleden, misschien zelfs een paar dagen of minuten geleden je zou zeggen dat lijn 16 is het creëren van een variabele met de naam t en kopiëren s in. En dat is een perfect redelijke afhaalmaaltijd. Maar zijn nu nauwkeuriger. Wat gebeurt er in de lijn 16? Wat wordt steeds gekopieerd van rechts naar links? Ja? PUBLIEK: Is t krijgt een adres van s? DAVID J. MALAN: Precies, t krijgt het adres van s. Dus om nu duidelijk zijn, als ik ga terug naar die eerdere voorbeeld en ik trekken uit wat ik in hebt getypt. En wat ik heb getypt in-- hier is s, en hier is wat ik heb ergens getypt in geheugen, moeder en vervolgens een backslash 0 dat is toegevoegd voor mij. Wat ik opgeslagen in hier, herinneren, Dit is op plaats 1, 2, 3, 4, dit is wat er momenteel in s. Dus als op lijn 16, zeg ik geef mij een variabele genaamd t en opslag in de waarde van s, wat wordt hier opgeslagen zal niet mom maar alleen het getal 1. Dus als we kijken vooruit in dit programma Nu, wat gaat er gebeuren? Zo merken dat er deze functie je misschien hebben deze gebruikt enige tijd geleden voor Caesar, of Vigenere, of misschien helemaal niet. Ik eis mijn printf, ik ben gaan om te profiteren van de kopie t. Eerste in lijn 19, snel sanity controleren, strlen controleert de lengte van t. Omdat ik het niet wil probeer iets te kapitaliseren als er geen touw daar. Als de gebruiker gewoon op Enter, er is niets te kapitaliseren. Dus ik wil geen lijn 21 te doen. Dus lijn 21 is kapitaliseren welke letter, blijkbaar, in t? PUBLIEK: m? DAVID J. MALAN: Het ziet er alsof het kopiëren van welke? Publiek: m. DAVID J. MALAN: Uh, m. OK, dus de eerste m, want mede dat ik ben loopt naar ToUpper, waarbij als je nog nooit hebt gezien is het alleen een functie om profiteren als invoer. t beugel nul betekent geven me de nul karakter van t. En dus hoe gaat dit foto veranderen, om duidelijk te zijn? Wat moet krijgen herschreven of gewijzigd met betrekking tot s en t en mamma backslash nul. PUBLIEK: [onverstaanbaar] DAVID J. MALAN: Ja, dus dit hier gewoon moet krijgen veranderd to-- fix dit-- moet krijgen veranderd in een hoofdletter m. Maar nu, kijk later in de programma, als ik uitprinten s en t als ik schoon hier, let op wat is gaat gebeuren afdrukken van s en t. Dus zorg copy-0, ./copy-0. Laat me ga je gang en typ in moeder in alle kleine letters. Let op zowel het origineel en de kopie zijn geactiveerd. Waarom? Nou, s en t zijn beide wijzen op, als je wil, het zelfde stuk van het geheugen. En eerlijk gezegd, dit wordt steeds echt uninteresting-- het feit dat we met behulp van het adres nul hier. Ik bedoel, heb ik niet echt schelen waarbij spul is in het geheugen. Sorry ik ben het wissen van een beetje te veel. Maar ik heb niet echt schelen waar dingen zijn in het geheugen. En ja, inderdaad wat programmeurs hebben de neiging te denken over is dat wanneer je praat over een adres, of een pointer, who cares waar het in het geheugen. Kan me niet schelen als het op byte één of een miljard. Ik zorg dat deze variabele effectief wijzend op dat stuk van het geheugen. En dus voortaan in plaats van kibbelen dan willekeurige geheugenadressen, laten we gewoon beginnen met pointers te trekken zo pointers als pijlen. Dus wat s en t werkelijk zijn, Volgens dit programma, vanwege de manier waarop ik heb gemaakt t, het is gewoon twee afzonderlijke variabelen die op hetzelfde stuk geheugen. En we niet schelen waar ze zijn. Dus we kunnen abstracte weg dat detail. Dus hoe kan ik dit oplossen? Als ik wil een versie van de kopie te schrijven programma dat feitelijk kopieert de tekenreeks en speelt alleen de exemplaar, maar intuïtief, wat heeft een te zijn ingrediënt onze oplossing? PUBLIEK: [onverstaanbaar] DAVID J. MALAN: We hebben een wat? PUBLIEK: Brok van het geheugen. DAVID J. MALAN: We moeten een ander deel van het geheugen, toch? We weten niet hoe doe het toch, per se. Maar ik soort moet dit zo gebeuren dat de oorspronkelijke moeder in kleine letters eindigt doordat extra stuk van het geheugen. En toen ik de kopie, I niet willen om dit exemplaar hier wijzigen. Ik plaats dat alleen in dit veranderen exemplaar, zodat het origineel ongewijzigd. Dus, laten we eens kijken hoe we dit kunnen doen. In copy-1, die al ontdaan van commentaar, maar online commentaar. We in plaats daarvan doen de following-- deze lijnen identiek zijn, krijg ik een string en noemen het is. Maar laten we nu eens kijken naar een van onze meest complex maar de laatste van de complexiteit voor een tijdje, lijn 16 doet precies dit. Dus als je comfortabel met de foto we gewoon drew-- geef me een nieuw stuk van het geheugen, kopieert alles erin, laten we eens kijken hoe we dat vertalen naar code. Dus lijn 16, aan de linkerkant, char * t geeft me dit vak hier. Dat is alles wat het doet. Aan de rechterkant, m alloc of malloc, is het toewijzen van geheugen, super luxe, een cryptische manier om gewoon te zeggen geef me een stuk van het geheugen. Hoeveel geheugen hebben we nodig? Nou, is een soort van een grote expressie. Maar laten we eens kijken wat hier staat. Dus dit is natuurlijk, is te geven mij de string lengte van s. Dus, moeder het zou wat zijn? Dus gewoon drie, toch? moeder is drie karakters. Je hoeft niet de telling van de backslash nul wanneer u spreken over de lengte van een string is het eigenlijk de menselijke zichtbare letters. Zo moeder, dus dit geeft me 3. Maar wacht eens even, ik ben nu het toevoegen van 1. Waarom moet ik eigenlijk wil toewijzen 4 bytes en niet slechts 3? Ja? Publiek: voor de sentinel waarde? DAVID J. MALAN: Precies, voor die sentinel waarde. Voor de backslash nul, Ik moet 4 bytes totaal. Dus ik moet de lengte van de snaar plus 1. En dan alleen voor een goede measure-- hoewel dit systeem, Het gaat altijd 1-- te zijn ik zeg vermenigvuldig dit door de grootte van een char. Blijkt sizeof is een operator in C die gewoon vertelt u de aantal bytes dat is die voor een bepaald type data. Het werkt niet voor arrays, typisch, soms ook. Maar in het algemene geval, niet. Maar het zal me vertellen hoeveel bytes een char is, wat blijkt is altijd 1. Dus dit is als vermenigvuldigen met 1. Zo super cryptische zoek regel code. Maar alles wat het doet is geeft me een stuk van het geheugen. Maar het lijkt te kopiëren iets in die geheugen? Nog niet. En wat doe ik op lijn 22, en 23, 24, 25, goed, ik gewoon doen. En dit is een soort van oude school spullen nu. Dit is als Pset 2, waarbij je bent gewoon bewegende dingen ongeveer in het geheugen, of liever strings. Dus ik ben itereren van 0 tot de lengte van de tekenreeks s. En ik ben het kopiëren van de i-de karakter in s in de ie karakter t. En omdat ik, de programmeur, maakte Zorg ervoor dat u precies zo veel bytes toe te wijzen als ik nodig heb, het is perfect één-op-één relatie. En kopieer ik mama in kleine letters naar de nieuwe. En dan tot slot, ik doe deze lijn. En dus het effect is alleen te profiteren hier de t. Dus veel te absorberen, maar als je gewoon overwegen wat er werkelijk aan de hand op onder de motorkap is gewoon het verplaatsen van deze bytes rond, alles is nodig om dit probleem op te lossen alleen maar om ons dit stuk van het geheugen te geven. Nu op het risico van overweldigend, laat me zien een ander voorbeeld dat is bijna identiek, behalve deze ene regel code. Dus dit is de hacker versie van dit programma, als je wil. Maar laten we gewoon destilleren het in wat er gaande is. Lijn 24 gebruikt om dit te t beugel i krijgt s beugel i. Nu, ik ben het veranderen van dit de veel cryptische ster t plus 1 gelijk ster s plus 1. Dus wat er gebeurt en waarom hebben we een ster karakter? We hebben de ster eerder gezien, en het wordt hier anders gebruikt. We eerder zagen char *, nu ik zie Een ster aan het begin, en dat is OK. Want het blijkt dat we kan soort afleiden net van die eerste principes wat er gaande is. Dus gewoon om duidelijk te zijn, wat is s? Vorige week was het een string. Dat niet meer voldoende. Wat is, in het bijzonder? PUBLIEK: [onverstaanbaar] DAVID J. MALAN: Het is een pointer. Het is het adres van de eerste teken dat we ingetypt. OK, wat is t? PUBLIEK: [onverstaanbaar] DAVID J. MALAN: De adres van de eerste byte in t, dat stuk van het geheugen toegewezen. Zo blijkt dat wanneer we itereren van 0 tot op de snaar length-- allereerst, i begint op 0, omdat van deze oude school lus ding. Dus alleen voor eenvoud, laten we veronderstellen dat de eerste regel van de code is eigenlijk gewoon dit, rechts. Wanneer i is nul, het toevoegen zero iets vermoedelijk is niet van plan om een ​​effect te hebben. Dus wat is dit woord? Het blijkt dat de ster operator in deze context is de dereference operator, dat is gewoon een mooie manier om te zeggen te gaan naar het volgende adres. Als s is het adres van de eerste personage in dit stuk van het geheugen, * s middelen gaan daar. En omdat we hebt getekend het beeld op deze manier, u kunt nemen de volgende mentaal model. Als dit s, en je zegt * s * s net zoiets als glijbanen en ladders, als je nog het spel uit de kindertijd, is als volgt dat de pijl en ga naar het adres. * t is hetzelfde. Dus begin hier, ga dan naar de brok. Ik kan het niet alleen doen op dit scherm op die manier. * t betekent om hier te gaan. En dan, de lus is gewoon zeggend bewegen hier dit karakter, bewegen hier dit karakter, bewegen hier dit karakter. Maar hoe doe ik dat incrementatie doen? Ik moet ongedaan maken wat ik net verwijderd. Dit is wat er over het algemeen genoemd pointer rekenkunde, die betekent math met adressen. Als, in deze lus, Ik blijf het verhogen i, en s een adres en t een adres, als ik gewoon blijven toevoegen 1, dat betekent gewoon blijven bewegen naar voren, en vooruit, en vooruit in het geheugen. Het is net als Oxford Street, de straat die het CS gebouw is op. De CS gebouw is op 33 Oxford Street. Dus als je om te doen 33 Oxford Street plus 1, dat brengt u naar 34 Oxford Straat, dan is 35 Oxford Street, dan 36 Oxford Street, wat die gebouwen eigenlijk zijn - indien ze bestaan. En ja, dat is alles wat we doen hier met pointer rekenkunde. Dus het is een super mysterieuze wijze expressie zelf. Maar dat gebeurt onder de motorkap is gewoon het volgen van deze adressen, zoals het volgen van een kaart, als je wil, of na pijlen als we hebben getekend op het scherm. OK, veel te verteren. Elke vraag over de syntaxis, concepten, pointers, malloc of dergelijke. Ja, dan eerst hier. Publiek: Dus waar dat zegt * t gelijk toupper * t, gaat dat kapitaliseren alle letters of gewoon-- DAVID J. MALAN: Ah, echt goede vraag. Dus in deze lijn hier, 31, gaat dit te kapitaliseren de eerste letter of alle letters. Dus laten beantwoorden door te gaan terug naar de eerste beginselen. En de eerste beginselen hier bedoel ik gewoon naar de fundamentele definities van wat er bij. Dus toupper is een functie dat inspeelt een char. Dat is alles. * t betekent naar de first-- naar het adres in t. Dus, op de foto, als dit het brok geheugen we toegewezen met malloc, en dit is t, * t betekent hier te gaan. Ondertussen, je voorbij die waarde, kleine letters m om toupper, je krijgt terug hoofdletter M, waar ga je het zetten? Je zet het op dezelfde locatie. En zo door die logica van die basisdefinities het is slechts kapitaliseren de eerste letter tenzij je herhalen met i of een lus of een tijdje loop, gaat het niet iets meer dan u te vragen doen. Goede vraag. Ja? Publiek: Waarom heb je gebruik maken van de dereference methode in plaats van de serie? DAVID J. MALAN: Ah, goede vraag. Waarom zou je het dereference gebruiken methode in plaats van de array methode? Geen bijzondere reden, om eerlijk te zijn. En inderdaad, deze soort voorbeeld, rechts, Ik ben gewoon ruzie maken van de programma ingewikkelder, meer ogen beglazing over, mensen bekijkt want dit ziet er super mysterieuze, maar ook al is het hetzelfde te doen. En dus, eerlijk gezegd, dit is een onnodig complexe oplossing visueel het probleem. Het is nog steeds een goed ontwerp, vijf van de vijf voor ontwerp, of het nu in de beugel notatie of de aanwijzer notatie. Maar-- vooral wanneer we krijgen later in de cursus in Pset 5 als we implementeren dat woordenboek dat Ik heb het over een paar times-- we eigenlijk zorg over de lage geheugenadressen dat we echt begrijpen wat is er aan de hand. Maar voor nu, blijkt dat dit regel code hier vierkante haakjes niet echt bestaan. Ze zijn wat heet syntactische suiker, die is gewoon een vreemd koele manier om te zeggen de compiler zet vierkante haken zijn dat wiskundige uitdrukking. Dus het is een menselijke conventie kunnen gewoon schrijven deze zeer gebruiksvriendelijk haakjes. Maar wat de compiler, wapengekletter, is echt doet elk moment je schrijft wat gemarkeerd in lijn 24, onder de motorkap is het echt converteren naar deze. Het is gewoon prettiger als mens lezen en schrijven code zoals lijn 24. Maar uiteindelijk degenen zijwieltjes te komen off wanneer iemands eigen comfort wordt sterker. Oké, zo herinneren toen dat dit was het soort grootste probleem we tegenkwamen. En dat is wat leidde tot deze hele verdomde gesprek over pointers, en adressen en kopiëren dingen. Het was omdat we struikelde over dit stom, stom probleem, waarbij Ik geïmplementeerd logically-- met Lauren hier op de demo en het sinaasappelsap in de milk-- een perfect algoritmisch correcte werking voor swapping twee variabelen ' waarden, maar het ding had geen persistente, of permanent, effect op mijn code. En waarom was dat? In een notendop, waarom is dit uitvoering van de swap logisch correct, maar heeft geen invloed de variabelen die worden doorgegeven aan het, als x en y voor de belangrijkste? Wat was de kern van het probleem? Ja? Publiek: Omdat variabel gemaakt kopieën variabele in de pas door middel van de functie. DAVID J. MALAN: Precies, als je voorbij variabelen in een functie, of argumenten in een functie, ze zijn voorbij exemplaar, dat betekent dat je een identieke zoek patroon van bits voor x en y, riep hier en b. En je kunt niets doen je wilt met deze kopieën, maar ze gaan niet hebben Effect op de roeping functie. En, in feite, we trokken dat beeld op het scherm, recall de vorige keer, waarbij als je echt na te denken over wat er gaande onder de hood-- als dit is het geheugen van uw computer, en hier beneden is het stuk van het geheugen wordt gebruikt voor de belangrijkste, Dit is het brok het geheugen wordt gebruikt voor de swap, en dus zelfs als hoofd heeft twee variabelen x en y, swap zou hebben identieke zoek waarden, die beide 1 en 2, maar ze zijn volledig verschillende delen van het geheugen. We hebben een oplossing. En eerlijk gezegd, lijkt het erop dat we nu een oplossing voor dit probleem, rechts. Als we nu de mogelijkheid om dingen te manipuleren door middel van adressen en een soort van glijbanen en ladders stijl, volg dan deze pijlen en gaan waar we willen in het geheugen, konden we niet dit probleem op te lossen het passeren van de belangrijkste om te ruilen niet de waarden die we willen swap, maar intuïtief Wat kunnen we passeren in plaats ruilen? [Onderbreekt hem VOICES] DAVID J. MALAN: Waarom doen we niet alleen doorgeven van de adressen, toch? Waarom gaan we niet geven van een swap schatkaart, als je wil, die leidt naar de actuele waarden x en y. Laten we swap, eigenlijk veranderen deze oorspronkelijke bits, in plaats van gewoon passeren exemplaren van de bits. En ja, in feite, dat is wat naar de oplossing. Deze versie is hier duidelijk slecht en gebrekkig. En nu, op het eerste gezicht, het ziet er gewoon alsof we een stelletje sterren toegevoegd willekeurig en onze vingers gekruist dat zou compileren. Maar, zou het nu samen te stellen. Maar laten we eens kijken wat deze dingen betekenen. En, helaas, de auteurs van C kan een ander symbool gekozen hebben om dit een beetje te maken duidelijker, maar de ster exploitant heeft verschillende betekenis in twee verschillende contexten. En we hebben gezien, maar laten we onderscheiden. Dus op naar de top is er, toen ik a en b zijn veranderd van zijn int in het bad versie naar de sterren, a en b int, Voorheen werden integers. Wat zijn a en b nu in het goede, groene versie? Ze zijn adressen. Adressen van wat, om duidelijk te zijn? Adressen van gehele getallen. Dus het feit dat ik ben zeggen int ster middelen Dit is het adres van een geheel getal specifiek. Dus nu het bericht in de lijnen van de code, iets anders is ook veranderd. TMP gelijk blijft, omdat het is gewoon de tijdelijke integer, geen geheugen magie daar. Maar nu heeft een ster. En in feite elke andere vermelding van a en b, opmerken dat alles wat het veranderen van rood naar groen is dat ik voorvoegsel deze variabelen met sterren. Want ik wil niet a en b te kopiëren. Want als ik gewoon kopiëren a en b en swap a en b, wat ben ik eigenlijk swapping? Net adressen, ik wil ruilen wat er op die adressen. Ik wil daar naar toe gaan. En zo de ster exploitant binnenkant van mijn functie, niet de binnenkant van de parameter lijst, betekent dat je naar die adressen en eigenlijk veranderen deze waarden. Dus wat doet de foto Nu lijken plaats. Nou, als in plaats ik passeren in voor A en B niet 1 en 2-- Ik echt nodig om toe te voegen een andere definitie hier. Dus stel dat dit stuk van het geheugen is op locatie 10. Dit is in plaats 11, maar dit is een beetje een vereenvoudiging, Ik heb nu twee keuzes heb ik pas x en y of ik hun adressen doorgeven? Als ik langs hun adressen als dit, ik heb net Nu moeten implementeren swap per de groene code zodat bij het zien van een en wanneer ziet b, is het niet gewoon kopiëren a en b en verplaats de melk en jus d'orange. De melk en jus d'orange metafoor breekt nu naar beneden, want dat zijn cups van vloeibare en niet kaarten. We in plaats daarvan moeten gaan aanpakken 10 en we moeten gaan aan te pakken 11, en voer dat swapping logica. Dus de logica is hetzelfde, maar we een iets andere manier nodig van toegang tot deze variabelen. En zo op het einde, wat de programma te kijken als dit is. In swap.c letterlijk gekopieerd en plakte de groene versie. Maar ik moet een verandering te maken. Het is niet voldoende alleen om swap te veranderen. Welke andere regel code moet ik veranderen? Ja? Publiek: Waar het neemt de argumenten. DAVID J. MALAN: Waar het zijn argument. Dus als ik scrollen tot de belangrijkste, ik kan niet zomaar passeren in x en y, en, ik beloof, de laatste stuk van de nieuwe syntaxis vandaag. Ik moet passeren niet x en y maar het adres van x en y. En het blijkt, het symbool dat de auteurs van C kozen is als je een ampersand hier te gebruiken, niet om verwarren met de bitsgewijze ampersand, als je een ampersand gebruiken hier en een ampersand hier Deze cijfers voor u, wat is het adres van x, misschien is het 10, wat is het adres van y, misschien is het 11, en geeft deze in plaats daarvan. Zo veel te absorberen alle tegelijk. Maar laten we nu zien snel in onze resterende vier minuten waar dingen mis kan gaan. En als een terzijde, eigenlijk Ik nam deze foto, TF nam deze foto een jaar of twee geleden. Dus dit is de achterste hoek van Eliot eetzaal. Pointers zijn misschien wel de moeilijkste onderwerp dat wij behandelen in CS50. Dus als je je zorgen het soort helling is als misschien is het meer van een hockeystick als dit, te realiseren we zijn soort bijna een piek in termen van de conceptuele complexiteit. En ik brengen dit foto, want ik zweer aan god, in de herfst van 1996, toen ik CS50 met mijn collega-onderwijs, Nishat Mehta, zat hij me in het hoek van de Eliot D. Hall tijdens de lunch, of diner, of iets te proberen om me te helpen begrijpen pointers. En dit is waar ik was weken na het werd in collegezaal toen introduceerde Ik eindelijk begreep pointers. En ik ben hoopvol gestemd dat deze zal veel eerder voor u klikt. Maar beseffen dat dit absoluut onder de meer geavanceerde topics we hebben gekeken. Maar het is een van de krachtigste. En als je het te krijgen, het is echt allemaal gewoon om uiteindelijk bij elkaar komen. Dus wees gerust het niet moeten alle wastafel in vandaag. Dus hier is het laatste programma we gaan kijken. En we gaan eindigen met een snelle drie minuten van claymation gemaakt door onze vriend, Nick Parlante. Hier is een programma, dat op de bovenste twee lijnen verklaart een variabele x en y. Die beide adressen van gehele getallen, AKA pointers. Vervolgens hebben we wijzen genoeg geheugen om een ​​int slaan en op te slaan het adres van die herinnering in x. Dus, het is nog eenvoudiger dan het eerdere voorbeeld. Geef me vier bytes van het geheugen, dat is de grootte van een int, en zet dat adres in x. Deze lijn betekent hier naar het adres in x en zet de betekenis van leven, het getal 42 zijn. Maar deze lijn mij zorgen baart. Ster y betekent naar het adres in y, en zet de ongelukkige nummer 13 daar. Waarom is het gevaarlijk, op dit punt in de story-- zij snel verteld in onze tanende minuten hier-- waarom is het slecht voor mij om te zeggen, ga dan naar het adres in y? Publiek: Je hebt niet [onverstaanbaar]. DAVID J. MALAN: Ik heb niet iets in y. Dus wat is de waarde van y, op dit punt in het verhaal? We hebben geen idee. Het is een aantal vuilnis waarde en evenmin Binky weet. Als we zouden eindigen op deze nota. [VIDEO AFSPELEN] Hé, Binky, wakker worden. Het is tijd voor pointer plezier. -Wat is dat? Leren over pointers? Oh, goody. Nou, om te beginnen, ik denk dat we ga een paar tips nodig. -OK. Deze code kent twee pointers die kan wijzen op gehele getallen. -OK, Nou ik zie het twee pointers, maar lijken niet te wijzen op iets. -Dat klopt. Aanvankelijk pointers wijzen niet op iets. De dingen die ze wijzen op zijn riep pointees en de oprichting ervan een afzonderlijke stap. Oh, rechts, rechts. Ik wist dat. De pointees zijn gescheiden. Dus hoe kan je een pointee toe te wijzen? -OK, Ook deze code toewijst een nieuw integer pointee, en deze deelverzamelingen x te verwijzen. Hé, dat ziet er beter uit. Dus zorg dat hij iets doen. -OK, Zal ik dereferentie de pointer x aan opslaan van het nummer 42 in zijn pointee. Voor deze truc, ik heb mijn toverstaf van dereferentie. -Uw Toverstaf van dereferentie? Uh, dat, dat is geweldig. -Dit Is wat de code eruit ziet. Ik zal gewoon het opzetten van de nummer en-- [POP SOUND] Hé, kijk daar gaat het. Dus, het doen van een dereferentie op x volgt de pijl om toegang te krijgen tot de pointee. In dat geval bewaart 42 in. Hey, probeer het te gebruiken om het nummer op te slaan 13 door de andere wijzer, y. -OK. Ik zal gewoon over te gaan hier naar y, en ontvang de nummer 13 set-up. En neem vervolgens de staf van dereferentie en gewoon-- [Zoemer] Oh, hey, dat werkte niet. Zeggen, uh, Binky, dat doe ik niet denk dereferentie y is een goed idee, want het instellen de pointee een afzonderlijke stap. En ik denk niet dat we ooit deden. Hmm, goed punt. Ja, we toegewezen de wijzer, y, maar we nooit zet deze om te wijzen op een pointee. Hmm, zeer oplettend. Hé, je ziet er goed uit daar, Binky. Kunt u het probleem te verhelpen, zodat y punten dezelfde pointee als x. Tuurlijk, ik gebruik mijn toverstaf van pointer opdracht. Is dat gaat om een ​​te zijn probleem, zoals vroeger? Nee, dit is niet de pointees raken. Het verandert slechts een pointer om naar dezelfde thing-- [Knallend geluid] --as andere. -Oh, ik begrijp het. Nu y punten op dezelfde plaats als x. Dus, wacht, nu y wordt bevestigd. Het heeft een pointee. Zodat u kunt proberen de staf van weer dereferentie aan de 13 sturen over. Oh, ok, hier gaat. Hé, kijk naar die. Nu dereferentie werkt op y. En omdat de wijzers delen dat men pointee ze allebei zien de 13. Ja, het delen, uh, wat dan ook. Dus, gaan we nu plaatsen schakelen? Oh, kijken we uit de tijd. -But-- -Just Herinner me de drie wijzer regels. Nummer 1, de basisstructuur is dat u een pointer, en wijst naar een pointee. Maar de aanwijzer en pointee zijn gescheiden. En de gemeenschappelijke fout is het opzetten van een pointer maar vergeten om het een pointee. Nummer 2, pointer dereferentie vanaf de aanwijzer en volgt de pijl boven om toegang te krijgen zijn pointee. Zoals we allemaal weten, dit werkt alleen als er is een pointee, wat voor soort komt terug om nummer 1 te regeren. Nummer 3, wijzer opdracht duurt een pointer en wijzigingen zij wijzen op de Hetzelfde pointee als een andere pointer. Dus na de opdracht, de twee pointers zal wijzen naar dezelfde pointee, soms is dat heet delen. En dat is alles wat er is om het, echt. Bye-bye nu. [END AFSPELEN] DAVID J. MALAN: Dat is het voor CS50. Dankzij Professor Nick Parlante. We zien je volgende week. [Elektronische muziek]