DAVID J MALAN: Alle rechts, dus dit is CS50. Dit is duidelijk een vrijdag. En dit is het einde van de week een. Dus je kan herinneren dat we waren gebleven, de laatste tijd, met een cliffhanger van soorten. Waarbij wij deze leugen bloot te leggen, dat er geen Ongeacht wat je hebt geleerd groeit up, 1 gedeeld door 10 is, in zelfs 0,1 of 0,100 of 0,10000. In feite, als we dit samen te stellen programma, zoals wij deden gisteren, met, onnauwkeurigheid te maken, en dan doen dot, slash, onnauwkeurigheid, we geleerd dat dit is wat is 1 gedeeld door 10 eigenlijk is. Dus dat is niet echt helemaal het geval. Maar dit doet hint op een bepaald fundamentele beperking van computers. En inderdaad, onder dingen die we gaan doen vandaag is een kijkje nemen op waarom dit heeft gebeurd, welke gevolgen dit heeft, hoe de mensheid heeft nagelaten deze grijpen in een aantal zeer ernstige situations-- het resultaat van die is heel tragisch geweest en expensive-- alsmede een kijkje nemen op de manier waarop we daadwerkelijk kan verdedigen tegen dit soort beperkingen. Zo intuïtief, misschien, Daarom wordt 1 gedeeld door 10, volgens mijn computer hier, niet alleen 1/10, 0,10? Ja. Wat denk jij? Toeschouwer: De Radix is ​​anders? DAVID J MALAN: De wat? Oh, de Radix is ​​anders? Dus niet helemaal. Het is eigenlijk meer fundamenteel voor de hardware. Andere gedachten? Ja. Toeschouwer: Ze vertegenwoordigen nummers anders? DAVID J MALAN: Dus they-- Right. Zij vertegenwoordigen nummers anders. Onnauwkeurig, blijkbaar. Zodat is-- Nou, anders dan wat? Of van wie? Van ons? Toeschouwer: Ja. Ze hebben niet de decimale gebruiken systeem [onverstaanbaar]. DAVID J MALAN: OK. Dus in zekere zin, dat doen ze niet Gebruik het decimale stelsel. Onder de motorkap, alles is inderdaad binair, en dat is verbonden, in feite. Maar het is nog eenvoudiger verklaring dan dat. Ja. Toeschouwer: Ze alleen hebben zoveel bits. Ze kunnen alleen slaan tot een zekere mate zoals bij de decimalen. DAVID J MALAN: Ja. Dit is wat er werkelijk krijgt bij het. Het blijkt dat computers Doorgaans zal altijd alleen Gebruik een eindige hoeveelheid informatie iets vertegenwoordigen. Rechts? Immers, we hebben alleen een vaste hoeveelheid ruimte op de harde schijf. We hebben maar een vast bedrag RAM of computergeheugen. En als je alleen maar een vast bedrag van iets, u kunt toch niet echt tellen tot oneindig of een nummer dat u wilt. U, soort, moeten kiezen wat bereik van de waarden die u gaat ondersteunen. Dus bijvoorbeeld een week of twee geleden, toen we spraken over ASCII, en we spraken over 8 bits, of een byte, zogezegd, het grootste aantal dat we konden vertegenwoordigen met 8 bits was wat? 255. En we kunnen in totaal 256 waarden vertegenwoordigen maar niet als we besteden een van hen op 0-- Nou, maar als we brachten een van hen op 0, dan is het grootste aantal is uiteraard 255. Dus het blijkt, dat dit Voor Ook in deze context. We begonnen te praten, de vorige keer, over floating-point nummers, die verschillen van gehele getallen, in dat ze een komma en, hopelijk, een aantal nummers daarna, maar ze ook. Een computer wordt alleen meestal gaat 32 bits, misschien 64 bits gebruiken een floating point waarde vertegenwoordigt. Dus hoewel we zijn opgegroeid het leren van wiskunde en wetenschap die je absoluut kunt hebben een oneindig aantal nummers na de komma, niet als je eindige geheugen. U, soort, moeten afronden, of kiezen welke nummers je gaat vertegenwoordigen. En dus je kunt bedenken, in zekere zin, dit is van de computer die het dichtst aanpassing aan de waarde die 1/10 het kan krijgen, met slechts 32 of zo bits. En het is niet alleen 1/10. Bijvoorbeeld, als ik dit veranderen naar 1/3, waarvan wij denken dat is nog eenvoudiger. So 1 gedeeld door 3. Laat me het bestand op te slaan. Laat me gaan en opnieuw compileren. En laat me opnieuw te draaien. Ook hier, blijkbaar, 1/3 is niet 0,3 en dan een oneindig aantal van 3 daarna. Je hebt deze onnauwkeurigheid op het einde. Dus wij mensen zijn correct, en wat u is geleerd, in feite, correct, maar we stoten up tegen een aantal beperkingen. En wat ik dacht we vandaag de dag zou doen, is beginnen door te kijken naar, eerlijk gezegd, de dramatische gevolgen van deze Soms, als de mensheid niet helemaal implementeren voor deze realiteit en deze beperkingen. En we zullen een reeks van vignetten te zien van de History Channel, dat duurt een blik op hoe de dingen zijn misgegaan. Het is ongeveer 8 minuten lang, en we zullen terug te komen na deze en neem een ​​kijkje op precies wat mis kan gaan. Als we de lights-- kunnen dimmen [VIDEO AFSPELEN] -Computers, We allemaal gekomen om te accepteren de vaak frustrerende problemen gaan met hen. Bugs, virussen, en software glitches zijn kleine prijzen betalen voor het gemak. Maar in de high-tech en high-speed militaire en ruimtevaartprogramma toepassingen, het kleinste probleem vergroot worden in een ramp. Op 4 juni 1996, wetenschappers voorbereid om een ​​onbemande Ariane 5-raket te lanceren. Het droeg wetenschappelijke satellieten ontworpen precies hoe het vaststellen Aardmagnetische veld wisselwerking met zonne-wind. De raket werd gebouwd voor de European Space Agency en getild uit de faciliteit aan de kust van Frans-Guyana. -En Ongeveer 30 seconden in de vlucht, ze eerst merkte er iets fout gaat. Dat de straalpijpen zwenkbare op een manier die ze echt niet moeten doen. Ongeveer 40 seconden in de vlucht, duidelijk het voertuig was in de problemen, en dat is toen zij de beslissing om het te vernietigen. Een Range Safety Officer enorme lef drukte op de knop, blies de raket voordat het kon uitgegroeid tot een gevaar voor de openbare veiligheid. -Dit Was het meisje reis van de Ariane 5, en haar vernietiging nam plaats als gevolg van een fout ingebed in de software van de raket. -Het Probleem op de Ariane was dat er een getal dat nodig is 64 bits uit te drukken, en hij wilde om te zetten naar een 16 bits getal. Zij verondersteld dat het aantal was nooit erg groot te zijn, de meeste van de cijfers het 64 bit getal waren 0 is. Ze hadden het mis. -De Onvermogen van een softwareprogramma accepteren het soort getal gegenereerd door een ander was de oorzaak van de storing. Software ontwikkeling was geworden van een kostbaar onderdeel van nieuwe technologie. De Ariane 4-raket was erg geweest succesvol, zoveel van de software gecreëerd was ook gebruikt op de Ariane 5. -De Fundamentele probleem was dat de Ariane 5 was sneller versnelde sneller. En de software niet had verantwoord die. -De Vernietiging van de raket was een enorme financiële ramp, allemaal te wijten aan een minuut softwarefout. Maar dit was niet de eerste time data conversie problemen had moderne rakettechnologie geplaagd. -In 1991, met de start van de eerste Golfoorlog, de Patriot raket kende een soortgelijke van het aantal conversie probleem. Dientengevolge, 28 mensen, 28 Amerikaanse soldaten werden gedood en ongeveer 100 anderen gewond, wanneer de Patriot, die verondersteld werd om te beschermen tegen inkomende Scuds, niet aan een raket te vuren. -Wanneer Irak Koeweit binnenviel en Amerika gelanceerd Desert Storm in het begin van 1991, Patriot raketten batterijen werden ingezet te beschermen Saoedi-Arabië en Israël van de Iraakse Scud raketaanvallen. De Patriot is een Amerikaanse, middellange afstand oppervlak-to-air-systeem vervaardigd door Raytheon bedrijf. -De Grootte van de Patriot interceptor, zelf, is ongeveer, ongeveer 20 voet lang. En weegt ongeveer 2000 pond. En het draagt ​​een kernkop van about-- Ik denk dat het ongeveer £ 150. En de kernkop zelf, is een hoog explosief, die moet fragmenten omheen. De behuizing van de kernkop is ontworpen om te fungeren als hagel. -De Raketten uitgevoerd, 4 per container, en worden vervoerd door een oplegger. -De Patriot anti-raketsysteem teruggaat nu ten minste 20 jaar. Het werd oorspronkelijk ontworpen als luchtafweer raket neer te schieten vijandelijke vliegtuigen. In de Eerste Golfoorlog, wanneer die oorlog kwam, het leger wilde het gebruiken om neer te schieten Scuds, niet vliegtuigen. De Iraakse Force was niet zo veel van een probleem, maar het leger was bezorgd over Scuds. En dus ze probeerden upgrade van de Patriot. -Intercepting Een vijand raket reizen op mach vijf zou genoeg zijn uitdagend. Maar toen de Patriot werd in allerijl in dienst, het leger was niet op de hoogte van een Iraakse wijziging die gemaakt hun Scuds bijna onmogelijk te raken. Wat is er gebeurd, is dat de Scuds werden in de komende, waren instabiel, ze werden wiebelen. De reden hiervoor, was de Irakezen, met het oog tot 600 kilometer uit een 300 kilometer afstands raket, nam het gewicht van de voorste kernkop en maakte de kernkop lichter. Dus nu, de Patriot probeert te komen het scud en meestal, de overgrote meerderheid van de tijd, zou het gewoon vliegen door de scud. -Als De Patriot netbeheerders realiseerde de Patriot miste zijn doel, ze ontploft de Patriot's kernkop, eventuele verliezen indien vermijden Men liet de grond vallen. -dat Was wat de meeste mensen zag, die grote vuurballen in de lucht, en verkeerd begrepen als onderschept van Scud kernkoppen. Hoewel in de nacht luchten, Patriots verschenen succesvol zijn vernietigen Scuds op Dhahran, er kon geen fout over zijn prestaties. Er is de Patriot's radarsysteem verloren spoor van een inkomende Scud, en nooit gelanceerd, wijten aan een software fout. Het was de Israëli's die voor het eerst ontdekt dat hoe langer het systeem op, hoe groter de tijd discrepantie werd, als gevolg van een klok ingebed in de computer van het systeem. -Over 2 weken voor de tragedie in Dhahran, de Israëli's gemeld aan het ministerie van Defensie, dat het systeem de tijd verloor, dat na ongeveer 8 uur lopen, ze merkten dat het systeem was steeds merkbaar minder nauwkeurig. Het ministerie van Defensie reageerden door vertel al van de Patriot batterijen geen reactie met de systemen voor een lange tijd. Ze zeiden nooit wat een lange tijd was. 8 uur? 10 uur? 1000 uur? Niemand wist. -De Batterij Patriot gestationeerd op de kazerne bij Dhahran, en de gebrekkige interne klok, had over meer dan 100 uur op de avond van 25 februari. -Het Bijgehouden tijd met een nauwkeurigheid van ongeveer 1/10 van een seconde. Nu 1/10 van een seconde is een interessant nummer omdat het niet kan worden uitgedrukt in binaire, precies. Wat betekent dat, het kan niet uitgedrukt precies, in elke moderne digitale computer. Het is moeilijk te geloven, maar Gebruik dit als een voorbeeld. Laten we het nummer 1/3. 1/3 kan niet worden uitgedrukt decimaal, precies. 03/01 is 0,333 gaande voor oneindigheid. Er is geen manier om dat te doen, met absolute nauwkeurigheid, in decimalen. Dat is precies dezelfde soort probleem dat gebeurde in de Patriot. Hoe langer het systeem liep, de slechter de fout werd. -Na 100 werkuren, de fout tijd was slechts ongeveer 1/3 van een seconde. Maar in termen van gericht op een raket reizen op Mach 5, het resulteerde in een tracking fout van meer dan 600 meter. Het zou een fatale fout zijn voor de soldaten in Dhahran. Wat is er gebeurd, is een Scud lancering was gedetecteerd door vroegtijdige waarschuwing satellieten, en ze nieuw dat de Scud was komen in hun algemene richting. Ze wisten niet waar het vandaan kwam. -Het Was nu aan de radar component van het Patriot systeem, verdedigen Dhahran, te vinden en te houden spoor van de inkomende vijandelijke raketten. -De Radar was erg slim. Het zou eigenlijk bijhouden de positie van de Scud en dan te voorspellen waar het waarschijnlijk zou zijn, de volgende keer, de radar stuurde een puls uit. Dat werd het assortiment poort genoemd. -Dan, Zodra de Patriot beslist genoeg tijd heeft doorgegeven aan terug te gaan en de volgende locatie voor dit gedetecteerde object, het gaat terug. Dus als het ging terug naar de verkeerde plaats het dan ziet geen object en het besluit dat er geen sprake was object was een valse detectie, en laat de baan. De inkomende Scud verdwenen van het radarscherm, en seconden later, sloeg in de kazerne. De Scud gedood 28 en was de laatste één afgevuurd tijdens de Eerste Golfoorlog. Tragisch, de bijgewerkte software aangekomen bij Dhahran de volgende dag. De software fout had al vast, sluiten één hoofdstuk in de onrustige geschiedenis van de Patriot raket. [END AFSPELEN] DAVID J MALAN: Dus zullen we een kijkje nemen op een aantal soortgelijke beperkingen in slechts een beetje. Maar laten we eerst eens overgang naar een paar FYI is. Dus een-- dit weekend, is er zal super secties, die bedoeld zijn om verdringen geplande secties, die zal dus het opstarten van een week. Neem een ​​kijkje op de website van de CS50's voor meer informatie over deze. Ze zullen ook worden gefilmd en gestreamd leven voor diegenen die niet bij te wonen. Probleem set 1 is het website cursus al, en we zullen een kijkje nemen op dat in slechts een klein beetje. En kantooruren te zullen nemen Plaats dit maandag tot en met donderdag. Dus dit was de meest canonieke programma hebben we gekeken naar de vorige keer. Het is net als de eenvoudigste programma kunt u schrijven in C, en zelfs dat is een beetje een gedurfde claim. Rechts? Omdat er een heleboel schijnbare complexiteit van deze. Dus laten we eens een snelle blik op wat sommige van deze elementen waren en dan proberen om te bieden een mentaal model voor de manier waarop Deze eenvoudigste programma werken, en dan gaan we beginnen kijken naar de dingen steeds complexer. Dus deze lijn hier, benadrukt nu, in geel, wat hebben we zeggen, de vorige keer, dat dit voor ons doet? Wat is het doel het dient? Iemand van verder terug? Ja. Toeschouwer: [onverstaanbaar] DAVID J MALAN: Goed. Dus het geeft je toegang commando's, of laten noemen ze functies dat iemand anders schreef, die worden verklaard, als het ware in een ander bestand. Dus we zullen zien wat een .h bestand is ten opzichte van een .c bestand, uiteindelijk. Maar voor nu, weet alleen dat printf bijvoorbeeld is een van de functies die zijn verklaarde in een ander bestand, ergens anders op de harde schijf van de cloud dat stelt ons in staat om toegang te krijgen printf en gebruiken zonder opnieuw uitvinden dat ons wiel. Ondertussen, de belangrijkste. Wat was de analoge van de belangrijkste, de afgelopen week? Ja. Toeschouwer: Groene vlag wordt geklikt. DAVID J MALAN: Ja. Scratch, toen groene vlag geklikt. Het is net als het puzzelstukje dat schoppen dingen af. En dus evenzo deden de wereld besloot enkele jaren geleden dat er in C, en een bos van andere talen, als je wilt naar een programma te schrijven, je eerste functie moet worden genoemd, de belangrijkste. En het moet er zo uitzien. Maar we zullen terugkomen, een andere tijd, aan wat, int, en, leegte, betekent in die context. Voor nu, de accolades zijn soort gelijkaardig puzzelstukje vorm Scratch's dat kapselt sommige aantal lijnen. En onder op de lijnen hier, is dit hier. printf is een functie waarvan het doel in het leven is om een ​​geformatteerde reeks af te drukken. En door geformatteerde, ik bedoel je kunt aansluiten placeholder waarden, en u kunt het aantal decimalen opgeven punten, hoeveel nummers afdrukken na een komma en dergelijke. En printf, natuurlijk, neemt één of meer argumenten of parameters, oftewel, eenvoudiger, als input. Dus printf, net als een heleboel functies neemt ingangen. En die ingangen worden omarmd Door de twee haakjes here. En de binnenkant daarvan is een ingang. Het is een string, zoals wij het hebben genoemd, dat is gewoon een opeenvolging van karakters, zoals een woord of een zin, of een hele essay zelfs, tussen dubbele aanhalingstekens. En dat is wat er gaat het beïnvloeden gedrag van printf omdat natuurlijk het is gewoon een generieke printfunctie. Het gaat niet om te weten wat om af te drukken, tenzij je het te vertellen. En dan, wat kleinigheden. Wat hebben we zeggen dat dit rare volgorde van de symbolen is? Ja. Toeschouwer: Nieuwe lijn. DAVID J MALAN: Nieuwe lijn. Dus het blijkt, kun je niet gewoon op, voeren, als je het schrijven van het programma. In het algemeen is de compiler gaat krijgen een beetje in de war over wat je bedoelt. Integendeel, je moet letterlijk zeggen, geef mij een nieuwe lijn hier. En zo / n is wat we in het algemeen noemen een escape karakter. Zo n, voor nieuwe regel. De compiler kent dat bij het zien / n, moet eigenlijk de computer induceren Uiteindelijk of printf, in casu uitprinten een feitelijke nieuwe lijn, zoals het raken van de, in te voeren, toets op het toetsenbord. En tot slot, wat hebben we zeggen dit stuk van syntax is voor? Wat betekent het vertegenwoordigen? Ja. Toeschouwer: [onverstaanbaar] DAVID J MALAN: Het is gewoon het einde van de lijn. Het is het einde van de verklaring. En beseffen dat we niet zet ze overal. We hebben zeker zet ze niet aan de uiteinden van elke lijn. Bijvoorbeeld, er is niemand op de eerste lijn, er is niemand aan de lijn met, de belangrijkste, is er geen na de accolades, maar je zult beginnen te zien en te krijgen vertrouwd zijn met waar het gevraagd. En het is bijna altijd na een functie bellen of een verklaring, een actie dat je eigenlijk nemen. En weet nu, vooral als onder die minder comfortabel, Dit zijn het soort domme dingen dat je uiteindelijk ongeluk bonzen je hoofd tegen de muur boven. Omdat je logisch zult vertrouwen in een probleem je hebt opgelost voor een probleem set, en dat ding gewoon zal niet compileren of zelfs uit te voeren. En zo vaak, vroeg op, het gaat om omdat je een haakje gemist, of als u een puntkomma gemist. En dus gewoon bewust te zijn van dit soort dingen, en probeer niet te raken gefrustreerd door ze omdat deze zeer snel doet geworden oude hoed. Maar het is heel makkelijk te krijgen gefrustreerd vroeg als gevolg. Dus nu, laten we eens kijken hoe deze lijn is eigenlijk werkt en dan kijken naar een iets meer ingewikkeld. Dus we hebben meer dan hier, de het vermogen om te tekenen op dit scherm. En laten we veronderstellen dat dit is mijn computerscherm, maar ik schrijf het, hello programma, en ik heb niet geïmplementeerd, printf. Iemand anders heeft geïmplementeerd, printf. Wie wil beweren hebben geïmplementeerd, printf? Als we kunnen? Oké, wat is uw naam? STUDENT 1: [? Copal. ?] DAVID J MALAN: Copal, kom op up. Kom op maximaal. Prima. Dus we hebben, hier, sommige naamplaatjes, omdat we een klein spelletje van dit zult maken. En wij bellen u, printf. En als je wilt hierheen komen, wat ik heb net getekend op het scherm, het is heel eenvoudig, er is mij, dit. Oké, ja, hello is mijn naam, printf, als je wilt op te zetten dat. Prima. En als je kunt gaan staan door het computerscherm alsof je de functie die kwam met deze computer systeem. En je doel in het leven is om daadwerkelijk iets af te drukken. Maar net als het programma dat wij net op het scherm hier we zullen moeten eigenlijk geven je wat input. En dus, als mijn input, hier is blijkbaar wat doorgegeven aan printf, Laten soort bespotten het omhoog als dit. Ik ga letterlijk schrijven over een stuk papier, "hello, wereld," backslash N. En om duidelijk te zijn, wat Ik heb net getekend op dit stuk papier, ziet er zo uit. Dus wanneer ik dit programma, en dit gele lijn van de code wordt uitgevoerd, het is alsof ik het hello-programma, ben overhandigen wat input uit om een ​​functie dat iemand anders geschreven. En als je met je vinger, kon eigenlijk met je vinger, tekenen op het scherm, ongeacht het is u zijn ingeleverd, het effect uiteindelijk is precies zien dat, op het scherm. En een klein hoekje geval. En goed, moeten we niet zien de nieuwe lijn, op dit punt. Het zou onjuist zijn voor u expliciet aandacht van de nieuwe regel. Maar als we bleven het schrijven van woorden op het screen, zouden ze uiteindelijk onder dat. Dus heel erg bedankt, maar vasthouden hier in de buurt voor slechts een moment. We moeten nu een andere vrijwilliger, als we konden, dat gaat nodig hebben om de rol te spelen van-- Het is enige mensen in het orkest nu meteen. Hoe about-- OK. Hier. Kom op maximaal. Hoe heet je? STUDENT 2: [? Ivay. ?] DAVID J MALAN: Sorry? STUDENT 2: [? Ivay. ?] DAVID J MALAN: Ethan, kom op up. Nee? Heb ik dat verkeerd, zelfs nadat je het zei twee keer? Kom op maximaal. Het is moeilijk om hier te horen op. OK. En het spijt me, wat is uw naam? STUDENT 2: [? Ivay. ?] [? DAVID J MALAN: Ivay. ?] OK. Voor nu, als je het niet geest, je GetString. STUDENT 2: OK. Cool. DAVID J MALAN: Dus als je wilt om hier te staan ​​voor slechts een moment, laten we eens een kijkje nemen op een iets complexere programma, dat heeft nu drie regels code. Dus we hebben, een, uw naam met behulp printf; twee, een oproep tot GetString, gevolgd door een opdracht tot een variabele genaamd, touw s, of de naam s; en dan nog een oproep aan, printf, maar dan met twee ingangen. Dus hebben we al gedaan staat uw naam, of beter gezegd, we hebben al een printf oproep gedaan. Dus ik ga schrijven, staat je naam. En ja, wat ik ga passeren, printf, in slechts een moment, is heel eenvoudig, dit. Dus als je wilt gaan en trekken deze op het scherm, dat is nu uw input. Prima. En vergeet snaar, die we nu hebben onze eigen lijn van de code hier. Dus, GetString, moeten we om daadwerkelijk op te roepen, GetString. Dus uw doel in het leven is om gewoon lopen uit in het orkest, als je kon, en krijgt de naam van iemand. Maar laten we geven u iets om het op te zetten. Als je wilt, ga gang en krijg een string, krijgt iemands naam op die stuk papier, als je kon. Prima. En we zullen zien, in slechts een moment, wiens naam we krijgen. Ondertussen, wat ik ga moet klaar zijn, is een leeg vel van papier, waar ga ik te slaan wat de waarde is is dat GetString is terug te keren naar mij, Ik, als een string variabele genaamd, s. Prima. Dus wat doe je hier? Nik. Prima. Dus we hebben hier de naam Nik's. Dus dit is wat letterlijk is geretourneerd voor mij, om zo te zeggen, door GetString. Ik, nu, ga voeren de linkerzijde van die uitdrukking, waar ik gewoon kopiëren naar beneden, voor de huidige doeleinden, Nik. Dus nu heb ik een variabele genaamd, s, het opslaan van de naam Nik's. Ik heb al overhandigd aan printf, een eerdere argument. Maar in onze derde en laatste lijn van code, ik heb eigenlijk aan de hand printf iets different-- "hallo,% s," backslash n. En zo de laatste regel ik ga om het laatste wat ik ben send-- ga nu opschrijven, is dit. Zodat de twee regels code, of in plaats van de laatste regel van de code, roept op tot twee inputs-- één deze, en twee, dit. Dus als onze printf functie kunnen nu deze als input, laat me duidelijk het scherm voor je. Eigenlijk niet, kunt u doorgaan. We laten het, sinds het op hetzelfde programma. We moeten zien, hello, Nik. Prima. Dus dit was een flink aantal hoepels om door te springen, net om te schrijven, staat uw te noemen, en, hallo, Nik. Maar dit eenvoudig idee van de boodschap doorgeven, input en output passerende ontvangen, is precies het model dat we gaan moeten voor zelfs de meest complexe functies. Dus dank je wel voor jullie beiden. We hebben een mooie spanning kogel hier voor jou. En dank aan onze GetString en printf vrijwilligers gelijk. Dankjewel. Prima. Dank aan u beiden. Dus we hebben het over dusver meestal ongeveer strings. En het blijkt dat C kan eigenlijk begrijpen een paar verschillende soorten data. In feite, laten we een kijken naar deze hier. Dus C, en een groot aantal andere talen, begrijpen wat genoemd chars. Een char is over het algemeen een byte, of acht bits. En het vertegenwoordigt een enkel karakter, zoals de letter A, of de hoofdstad letter A, of de kleine letter Een of een uitroepteken, of een teken dat u kunt typen op je toetsenbord, en soms zelfs meer. We hebben ook gebeuren met praalwagens te zien. Een vlotter is algemeen een 32-bits waarde, of vier bytes want weer één byte acht bits. Dus een float is een floating point waarde, iets met een komma. En inderdaad, dat is wat de film sprak over wanneer ze sprak over drijvende punt waarden, een aantal vaste aantal bits gebruikt om een ​​reëel getal vertegenwoordigen. Maar er zijn ook dingen genoemd tweepersoonskamers. Deze bestaan ​​in Java, als je APCS hebt genomen, en een dubbele, zoals de naam al gelukkig suggereert, is twee keer zo groot als een float. Het is nog steeds een reëel getal, het heeft gewoon meer bits waarbij steeds precies te zijn, of zelfs grotere aantallen te slaan. int is eenvoudig. We spraken over dat laatste keer. Het is gewoon een integer. En het is over het algemeen 32 bits, of vier bytes. En dus, als je, laten we nu zien, 32 bits-- en we hebben deze week 0, ooit zo briefly-- als je 32 bits, wat is het grootste nummer dat u kan vertegenwoordigen als een integer? Ongeveer? Het is als 4 miljard, en dat is alleen als we die alleen positieve cijfers. Als u 32 bits, en u wilt vertegenwoordigen negatieve getallen als goed, uw bereik is, in essentie, negatief 2 miljard aan positieve 2 miljard. Maar over het algemeen, zullen we beginnen op 0 gaan tot 4 miljard euro. Je hoeft niet precies te weten, maar We kunnen dit zien, in feite, als ik gewoon openen een beetje rekenmachine, hier. Ik kan doen 2 van de 32, en dat is precies hoe groot, hoeveel waarden je kunt vertegenwoordigen, met 32 ​​bits. En het is ongeveer 4 miljard. Dus we zullen blijven zien dat het aantal in een paar verschillende plaatsen. Maar als je meer nodig hebt getallen dan, Het blijkt dat er's zoiets als een lange lang. En een lange lang is algemeen 64 bits, waarvan betekent dat het een grootteorde zelfs groter dan een int. Dus ik kan niet eens de grootste uitspreken nummer dat u kan vertegenwoordigen, maar het is aanzienlijk groter. Nu als een terzijde, historisch, als een int 32 bits, en een lange lange is 64 bits, hoe groot is een lange, niet een lange lang? Je zou denken dat het langer dan een int maar misschien minder lang dan een lange lange, maar het hangt eigenlijk. En zo blijkt uit een van de frustraties ook, met het schrijven van code op bepaalde systemen, is dat niet al deze gegevenstypen hebben vooraf bepaalde waarden. Soms is dit veel bits. Soms is het dat veel bits. Zodat je eigenlijk moet weten, Soms, welke hardware je draait de software op. Gelukkig, andere talen en andere soorten gegevens die nu bestaan, toestaan ​​om precies te zijn. Wel zagen we touwtje, en we zagen Bool, ook, maar het blijkt die komen Alleen de CS50 bibliotheek. Dus die zijn niet gebouwd in C. Deze plaats, komen in dat bestand met de naam CS50.h, dat we uiteindelijk afpellen van de lagen. Maar voor nu, ze zijn gewoon extra gegevenstypen. Een bool is een waar of onwaar, en een string een reeks tekens, als een woord. Nu printf, we hebben gezien, heeft placeholders,% s is één. En je zou kunnen, tot nu toe, afleiden uit deze andere voorbeelden hoe kon je een placeholder hebben voor verschillende gegevenstypen. Bijvoorbeeld, neem een ​​gok, als je wilde afdrukken van een enkele char behulp printf, de plaatsaanduiding is waarschijnlijk% c. En als u wilt afdrukken van een integer met de plaatsaanduiding,% i. % LLD is een lange lange decimale waarde, maar lang lang, dus dat is toegewezen aan dat. En dan% f voor drijvende punt waarde of voor een dubbel, dus soms zijn ze hergebruikt in verschillende contexten. Dus we zullen zien en te gebruiken sommige van die tijd. En printf en andere functies ook escape sequences steun van anderen, en soms dit noodzakelijke. Dus backslash n is een nieuwe lijn. Backslash t, doet iedereen wil een gooi te nemen? Toeschouwer: Tab. DAVID J MALAN: Tab. Dus als je echt wilt het afdrukken van een tabblad, niet een vast aantal ruimtes, maar een daadwerkelijke tabblad karakter, hoef je niet te raken je, tab, toets op het toetsenbord algemeen je eigenlijk doen backslash t. Backslash dubbele aanhalingstekens, waarom zou ik ooit willen dat? Rechts? Waarom kan ik niet het type alleen een dubbele aanhalingstekens op mijn toetsenbord? Toeschouwer: Want anders, het is gaan denken dat het is het einde van graag uw print [? tekst. ?] DAVID J MALAN: Precies. Vergeet niet, met onze printf voorbeelden, als we passeerden om printf in input, aan de linkerkant van deze invoerreeks en rechts van die ingang lente, natuurlijk, was een dubbele offerte. Als uw eigen inbreng heeft een dubbele quote in het midden van die, de computer zou potentieel verward, als bedoeld, Dit doet dubbele aanhalingstekens thuis in het midden? Behoort het met de linker? Behoort het met de juiste? En dus, als je wilt om het super maken helder, je doet backslash dubbel aanhalingsteken, zodat het ontsnapt zogezegd, en het is niet samengevoegd voor iets anders. En er is een paar anderen hier, backslash r, enkele aanhalingstekens, 0, dat we kunnen zien in de tijd, als goed. En nu, hoe zit het met de functies? Zodat acties die we tot nu toe kunnen nemen in deze taal, C, nou, we hebben gezien, printf, natuurlijk en al de anderen op het scherm, hier, dat we zullen gebruiken voor de alleen de eerste paar weken cursus, komen wanneer de CS50 bibliotheek. En ze maken het veel gemakkelijker, in C, om daadwerkelijk te krijgen input van de gebruiker. Het blijkt dat in C, en eerlijk gezegd in een paar talen, het is een echte pijn in de nek te doen iets simpels, zoals prompt de gebruiker voor keyboard voor hun inbreng. En dus deze functies maken het gemakkelijker. En het heeft ook fout gedurende de controle, zodat bij herinneren op woensdag, we zag het, opnieuw proberen, waarschuwing, toen ik niet meewerken, en ik typte een woord, in plaats van een nummer? We hebben het zware werk vroeg gedaan op om ervoor te zorgen dat de gebruiker werkt. Maar dit zijn slechts training wielen die we zal uiteindelijk, en snel opstijgen. Dus om samen te vatten, dan, laten we eens een snelle blik, net zoals we hebben gedaan met Scratch bij sommige canonieke constructies in C. Dit is bedoeld om, sorteren van, zijn een wervelwind tour, gewoon zo dat je een verwijzing en dat je hebt dingen gezien op het eerste. Maar dan zullen we kijken naar de werkelijke codering gebruik van sommige van deze bouwstenen. Dus net als in Scratch, toen we uitspraken willen, of zeggen, wacht, in C, hebben we functioneert als goed, zoals printf. Als we willen een voorwaarde uitdrukken in C, het is vergelijkbaar, in de geest, dat puzzelstukje dat leek dit in Scratch. Maar in plaats daarvan, we letterlijk gewoon schrijven, indien. En dan, tussen haakjes, we zetten een voorwaarde, wanneer die voorwaarde is wat we zullen roepen, nogmaals, een boolean expressie. En nogmaals, dit is een soort van pseudocode. En, in feite is het // is geplaatst. Het is gewoon Engels woorden om mezelf. Maar dit is de algemene structuur van een, indien conditie. Maar we zullen zien beton voorbeelden in slechts een moment. Als u wilt een hebben twee-weg vork in de weg, net als wij deden met onze vrijwilligers op Woensdag, kunt u een hebt, anders als. En als je wilt naar een derde te hebben en laatste voorwaarde, of standaard situatie, kun je gewoon een ander blok, is er. En evenzo met Booleaanse uitdrukkingen, je kunt, en ze samen. En we zagen op woensdag, dat het is geen enkel teken, het twee voor lagere redenen we zullen uiteindelijk zien en mee te spelen. Of-ing dingen samen 2 verticale balken. Op een Amerikaans toetsenbord, dit doorgaans een belangrijke met de Shift-toets boven uw Enter of Return-toets. Dan is er deze dingen die zullen we misschien één of twee keer te gebruiken. Ze zijn functioneel gelijkwaardig aan wat u kunt doen met een, indien anders als, anders als anders, bouwen, maar ze zijn een switch genoemd. Ze zien er heel anders, maar we zullen zien in een aantal van onze distributie-code, voor een toekomstig probleem set, het meest waarschijnlijk, dat het soms gewoon een mooier uiting van een geheel stelletje omstandigheden zonder veel accolades en veel haken en inspringen. Maar ze geven ons niet meer macht dan we al hebben. En nu loops. En deze, zullen we kijken bij iets langzamer. Maar dan zullen we beginnen om deze te gebruiken, vooral voor degenen die al bekend zijn. Dit is de canonieke manier, als ongelooflijk geheimzinnige manier, om een ​​lus in C. schrijven Nu een lus in Scratch was vrij eenvoudig. Je hebt een, voor altijd, blok. Je hebt een, herhaal, blok met slechts een nummer dat u hoeft te typen. En met de, voor de lus, kunt u implementeren deze beide ideeën, maar het is een beetje meer technisch. Maar eerlijk gezegd, het is ook relatief eenvoudig. Als je eenmaal weet de volgorde van operaties, je letterlijk zijn gewoon aan te sluiten in de waarden en vertel de computer wat te doen. Dus hier is een voorbeeld. Dit is een lus die, heel gewoon, telt van de ene getal naar boven via een andere. En alleen door een blik op het, zelfs als je geen ervaring met deze taal, welk nummer is het waarschijnlijk beginnen te tellen bij? OK, 0. En ik gok dat is omdat u zien dat er een int en een i, die een variabele. Het geïnitialiseerd op 0. En dan later, lijkt het we passeren printf, een waarde. En, in feite, heb ik hier een weinig typo. Maar dat is eenvoudig op te lossen. Laat me toe te voegen in, ik hier. We hebben nu printf wezen doorgegeven dat placeholder waarde. En wat gaat tellen door middel van? Publiek: 50. 50. 49. DAVID J MALAN: 49. Zo 50, op het eerste gezicht lijkt het goed. Maar dat, zo blijkt, gaat worden onze voorwaarde dat we blijven controleren. En we gaan een keer te stoppen i niet meer dan 50. Dus deze lus, omgekeerd, moeten uit te voeren, zolang ik minder dan 50. Maar zodra het wordt 50 of 51, of erger, moet het automatisch stoppen. Prima. Dus wat gebeurt er eigenlijk hier? Dus dit is de orde van handelingen voor een lus. One, heb je de zogenaamde initialisatie. Dit geel gemarkeerd brok van de code wordt eerst uitgevoerd, en heeft tot gevolg dat, per Woensdag, je waarschijnlijk denken. Het creëert een variabele i en het heet winkels in de variabele de waarde 0. Dus i is 0 op dit punt in het verhaal. De volgende ding dat gebeurt in dit construct, is dat de voorwaarde wordt gecontroleerd. Dus controleer ik onmiddellijk, is dat ik minder dan 50? En natuurlijk, het antwoord voor nu is, zeker, ja. Ja, omdat ik is 0, en dat is zeker minder dan 50. Wat gebeurt, is dat deze regel code wordt uitgevoerd. En inderdaad, als er meerdere regels code in die accolades, ze krijgen allemaal uitgevoerd ene na de andere. En het effect hier is blijkbaar, om uit te printen het getal i, die zal 0, en vervolgens 1, en vervolgens op 2. Maar waarom? Waarom is het krijgen opgehoogd? Nou, het vierde ding dat er gebeurt is dat deze syntaxis wordt uitgevoerd, na de puntkomma. i ++ is een verkorte manier om te zeggen; neemt de waarde van i, en voeg 1 ervan; en dan de volgende keer rond, voeg 1 ervan; en de volgende keer rond, voeg 1 aan. Dus als we blijven gaan, wat er gaat gebeuren volgende is dat ik ga niet initialiseren ik ooit weer. Als ik bleef initialiseren i 0 tot dit voorbeeld nooit zou eindigen, omdat ik zou worden geplakt op 0. Maar wat er gaat gebeuren is dat de voorwaarde zal worden gecontroleerd, de lijn van de code krijgt uitgevoerd, i wordt geïncrementeerd, voorwaarde zal worden gecontroleerd, code krijgt uitgevoerd. En het bleef fietsen weer, en opnieuw, en opnieuw, totdat ik ++ leidt tot een waarde van 50. De voorwaarde zegt dan: is 50 minder dan 50? Het antwoord is natuurlijk nee, en dus de hele code stopt uitvoeren. En als u meer code op het scherm beneden, dat is wat er vervolgens gebeurt. Het knalt uit deze accolades en steeds meer daarna afgedrukt. Dus een grap nu uit FoxTrot, dat zult u misschien nu begrijpen. Het is altijd grappig. Het is net als de grinnikt soort van percolaat, en dan besef je dat je niet moet te lachen om humor als deze. Maar er is een afhaalrestaurant hier, pedagogisch, ook. Dus het blijkt dat ik ben missen van een stuk van de syntaxis, of FoxTrot's missen van een stuk van de syntaxis hier. Wat ontbreekt, dat we hebben gehad in elk ander voorbeeld, tot nu toe? Terugkeer, is er, dus dat is iets anders, dat we terug naar het duurde niet lang te komen. Wat ontbreekt, hoewel? Ja. Toeschouwer: De initialisatie van [onverstaanbaar]. DAVID J MALAN: OK. Dus ja. Dus eigenlijk, dit is-- Nou, en de telling is geïnitialiseerd boven, of beter gezegd, verklaarde boven. Dus dit is een andere manier van doen. Maar niet in één regel is het wel geldig is. Hoe zit het hier? Toeschouwer: Is het de accolades? DAVID J MALAN: Ja. Dus de accolades ontbreken. Maar deze code, ik bedoel, op hun naam, is eigenlijk, syntactisch geldig. Het blijkt dat je niet moet de accolades Als u slechts één regel code die u wilt uitvoeren binnenkant van de lus. Nu we altijd, in de klas en in al onze verdeelsleutel, zijn de accolades hoe dan ook, gewoon voor de duidelijkheid. Maar beseffen dat in schoolboeken en online voorbeelden je kan heel goed zien krullend bretels ontbreekt soms. En dat is OK, als wat je zijn ingesprongen en beoogd is slechts een enkele regel code, en niet meerdere regels code, mogelijk. Prima. Dus in verband met de kwestie van de onnauwkeurigheid, is een kwestie van de overloop, in die zin dat evenzo hebben integers zijn grenzen aan hen net als floating point waarden? In de wereld een drijvende komma waarden, kunnen we alleen zo nauwkeurig, waarna soms slechte dingen kunnen gebeuren, en onze programma's kunnen worden buggy and error. Nu zelfs met getallen, kun je in de problemen. Nu een integer geen heeft komma of cijfers na het. Het is gewoon een natuurlijk getal, meestal. Dus wat zou er mis met een int gaan? Als ik ben met behulp van een int naar tellen, wat kon er misgaan? Lijkt een stuk eenvoudiger. Ja. Toeschouwer: als de nummer krijgt [onverstaanbaar] DAVID J MALAN: Ja. Wat als je telt zo hoog, dat je kan niet uitdrukken dat heel groot getal. Rechts? Op een gegeven moment, je gaat de grenzen overschrijdt een 32-bits waarde of een 64-bits waarde. Nu nogmaals, ik weet niet hoe naar een 64-bits waarde spreken, maar ik weet dat met een 32-bits geheel getal, de grootste waarde kan zijn, als het enige positieve waarden, is ongeveer 4 miljard. Dus als ik probeer te tellen tot 5 miljard, er iets gaat gebeuren. Maar laten we eens kijken wat er in feite kan gebeuren. In de wereld van integer overloop, waar u, in zekere zin, overlopen de capaciteit van een integer, wat er kan gebeuren? Dus hier is een binair getal, Het is een terugkeer naar 0. Het is allemaal 1's en de plaatsaanduidingen er zijn machten van 2, dus dit is binair. Dit zijn dus 8, 1 bit op het scherm. En als je herinneren of je snel de wiskunde, welke waarde wordt vertegenwoordigd hier bij deze acht 1-bits? 255. En zelfs als je niet helemaal zeker van de wiskunde, zou je het doen uit. Of je kon gewoon soort van de rede doorheen, wacht even, als ik hetgeen een 8 bit waarde, en ik heb 256 mogelijke waarden, maar de eerste is 0, Ik weet alleen dat de grootste gaat worden 255, en dat is wat dit zou kunnen zijn. Dus stel ik probeer om 1 toe te voegen aan deze waarde. Wat zou jij doen in rang school toen het toevoegen van een 1, en het Past niet echt bij, omdat je moet dragen de 1? Wat is dit nummer gaan te worden als je 1 toe te voegen? Het zal worden 0. Rechts? Want als je had meer bits-- en ik zal proberen, soort, typt het uit hier-- als we meer bits, wat we kon hier doen is het toevoegen van de 1, en dan zouden we dit te krijgen. Whoops. We hadden een 1 bit hebben helemaal hierheen. Maar als dit een eindige waarde, het is slechts 8 bits, en dat is vooraf bepaald door de computer, dat 1 effectief er niet. Het valt gewoon een soort van een klif. En dus als je 1 toe tot 255, wat waarde heb je blijkbaar krijgen? 0. En dus nummers per ongeluk, en misschien onbedoeld uiteindelijk wikkelen rond als dit. Dus wat kunnen de gevolgen van dit zijn? Nou, er is een paar verschillende dingen. Zo een, het maakt uiteindelijk op zoek zoals 0, onbedoeld, maar je kunt soort te zien, zelfs in de echte wereld, voor beter of slechter, manifestaties van dit idee van een grens. Bijvoorbeeld, iemand van jullie die ooit heb gespeeld Lego Star Wars, doet iedereen weet toevallig het maximum aantal munten je kunt verzamelen in Lego Star Wars? Neem een ​​gok op basis van vandaag leidende vragen. Het is groter dan 256 of 255. Het is 4 miljard. Zo blijkt, en er is wat people-- wat googlen bevestigd laatste nacht-- hebben 4 miljard gouden munten gekregen, of wat, in Lego Star Wars. Schijnbaar is er een manier om het spel te bedriegen, er is een bug of een functie, waarmee u gewoon toekomt heel veel punten. Maar het grootste mogelijke waarde volgens om dit screenshot van iemand die ik online hebben gevonden, is inderdaad, 4 miljard. Waarom is dat? Juist 4 miljard, waarschijnlijk omdat iemand besloten, die was het schrijven van dit spel, dat ze konden doen 4 miljard, iets, iets, iets, zoals de waarde I opgemaakt met de rekenmachine eerder, maar het is gewoon een beetje schoner voor de mens om het maximale aantal te zeggen van coins-- of studs, zoals ze het noemen them-- dat u kan verzamelen is 4 miljard. En ja, waarom is dit? Hoe is de LEGO-spel de uitvoering van de teller dat is het bijhouden van de aantal munten dat je hebt? Ze zijn met behulp van wat? Toeschouwer: Het stopt tellen na 4 miljard. DAVID J MALAN: Het stopt tellen na 4 miljard, wat betekent dat u afleiden, als programmeur, dat ze waarschijnlijk met een 32 bits getal. Net als de programmeur letterlijk getypte, int, in zijn of haar code, en dat is de aard van de variabele die ze gebruiken om iemands code op te slaan. Zodat er andere manifestaties van dit soort beperkingen. Dus ik heb niet dit game-- gespeeld en ik las over de geschiedenis bevestigen zoals much-- maar in de originele versie van Civilization, waarbij je blijkbaar met elkaar omgaan andere en kan oorlog of vrede, Gandhi moest een van zijn de meest rustige karakters, zoals ik begrijpen, in de eerste versie van Civilization. En in feite op een schaal van 1 tot 10, Zijn agressiviteit was gewoon een 1. Zo ooit zo mild agressief, blijkbaar. Maar op een gegeven moment kun je blijkbaar Installeer de democratie in de geografie. En als je de democratie te installeren in uw versie van het spel, dan is uw agressie niveau naar beneden gaat. Het is een goede zaak. Mensen zijn meer rustige blijkbaar in die situatie. Maar blijkbaar, iemand deed niet een, als, conditie in de oorspronkelijke versie van de code. Dus Gandhi's agressie niveau ging van positief 1, minus 2, om negatieve 1, maar het spel niet begrijpen negatieve getallen. Dus wat is er gebeurd was agressie Gandhi's level ging van 1 naar 0, om negatieve 1, waarin het effect van gehad wikkelen rond het feit de meest agressieve karakter in het spel, op een waarde van 255, op een schaal van 1-10. En sindsdien zijn er geweest meer incarnaties van dit spel, en ze hebben het gehouden als een soort paasei, dat Gandhi is blijkbaar zo vreselijk agressief. Maar het was het resultaat van een zeer eenvoudige programmering fout dat zeer vroege versie van het spel. Nu meer verontrustend, meer Onlangs heeft de Boeing 787 gedocumenteerd als een bug, niet het soort apparaat u in het bijzonder willen een bug te hebben. En de symptomen, die ik gelezen hier, uit een artikel online, Dit was een model 787 vliegtuig die is permanent aangedreven voor 248 dagen kunnen alle verliezen wisselstroom, AC, stroom, als gevolg van de generator regeleenheden, GCUs tegelijkertijd gaan in fail-safe mode. Dus dit was een waarschuwing uitgegeven wanneer dit probleem werd ontdekt. Deze aandoening wordt veroorzaakt door een software teller, intern in de GCUs, zodat een integer of een variabele dat zal overflow na 248 dagen van continu vermogen. Boeing bezig het ontwikkelen van een software-upgrade die GCU zal de onveilige toestand te verhelpen. Zoveel als de raket scenario, waarbij ze hadden een soort van variabele dat was het tellen en het tellen, en het tellen, maar geleidelijk overlopen de grenzen van zijn vermogen, evenzo deden de verdomde vliegtuig een variabele overflow na voldoende tijd van hardlopen. En zo de tong-in-cheek manier van het werken rond deze kwestie is echt, reboot, je vliegtuig elke 247 dagen, dus dat het geheugen wordt uitgewist en de variabele gaat terug naar 0. Maar realiseren, is dit een zeer grote incarnatie van software, maar vooral omdat we horen over Apple's besturingssystemen gaan in auto's, en zelf-rijden auto's van Google, en een aantal incarnaties van software in ons dagelijks leven, tv's en horloges, en nog veel meer, realiseren werden omringd door software, allemaal geschreven door ons mensen. En zoals we allemaal snel ontdekken, het is heel gemakkelijk en zeer typische om fouten te maken bij het schrijven van software. En als je ze niet vangen, een aantal slechte dingen kunnen gebeuren. Nu soms sommige grappige dingen kunnen gebeuren, of op zijn minst soms hebben we weet wat slechtheid verwachten. Dus 0 gedeeld door 0, uit waardering school, is over het algemeen een slechte zaak. Het is niet gedefinieerd. En het blijkt out-- en laten we kijken of mijn mic kan deze afhalen up-- dat Apple had wat pret met dit onlangs. Dus ik heb een iPhone hier. Ik ga Siri te praten en vraag haar om me het antwoord op 0 gedeeld door 0. Wat is 0 gedeeld door 0? SIRI: Stel je voor dat je hebt 0 cookies, en u ze gelijk verdeeld onder 0 vrienden. Hoeveel cookies gaat elke persoon te krijgen? Zie? Het heeft geen zin. En Cookie Monster is triest dat er geen cookies. En je verdrietig dat zijn je hebt geen vrienden. DAVID J MALAN: Het is een soort van irritant. Dus dit is wat er net gezegd. Het is onbepaald, het is niet gedefinieerd, en inderdaad vele programmeertalen of, echt, compilers zal detecteren wanneer u in een programma, proberen te verdelen door 0 0. Leuker dan dit is echter dat blijkbaar, Cookie Monster is op Twitter deze dagen. En hij antwoordde op deze, deze, dat is absoluut schattig. Maar laten we eens een snelle blik op een paar andere constructies, en dan zet een aantal van deze code te gebruiken, in goede manieren. Dus het blijkt, naast voor loops, er is zoiets als een tijdje loop, dat ziet verschillend is geïmplementeerd een beetje differently-- en we zullen uiteindelijk zien examples-- maar in zekere zin, het is eenvoudiger omdat het is het niet mogelijk om te initialiseren en bijgewerkt binnen de grenzen van de lus. U kunt nog steeds implementeren. Zodat u precies dezelfde dingen doen met een lus while, als met een lus, maar je syntax, ultimately-- zoals we zullen uiteindelijk see-- zal anders zijn. Er is zelfs een do while lus, die is eigenlijk een beetje anders, in dat terwijl een lus en een tijdje loop altijd controleren hun staat eerste, als je dit ding boven naar beneden te lezen, Het soort lijkt alsof het gaat om check it toestand laatste, want het is echt de laatste regel code. En inderdaad, dat gaat om bruikbaar te zijn in bepaalde programma's die we schrijven, als je gewoon blindelings iets te doen en uiteindelijk de conditie. Dat is niet per se een slechte zaak. Als we willen variabelen, kunnen we doen het in een paar verschillende manieren. En we zagen in de FoxTrot cartoon, een manier van doen, waar u uw variabele declareren, zoals int teller puntkomma, en dan later-- misschien de volgende lijn, misschien 10 lijnen later-- je eigenlijk initialiseren. Dus deze 2 regels code verklaren een variabele van het type int en noemen het toonbank, dus het geeft me genoeg bits naar een int houden. En dan uiteindelijk, het brengt de waarde 0 in de variabele. Het regelt de 0 en 1 in een patroon, dat we kennen van vorige week, staat voor het aantal die we kennen als 0. Of eerlijk gezegd, kunt u dit veel doen beknopter, net als dit. Nu hebben we ook de vermogen om functies aan te roepen. En in feite, hier is een lijn 2 programma, of een uittreksel daarvan, die ons in staat stelt om daadwerkelijk schrijf wat code die krijgt een string uit de user-- veel zoals onze vrijwilligers een moment ago-- opslaan van het resultaat in een variabele genaamd naam, en then-- net als met onze vrijwilligers met printf-- drukt die waarden door het passeren twee argumenten, de koord, gevolgd door de variabele genoemd, naam zelf. Dus laten we een kijkje nemen, voordat we terug naar Mario komen daar, op een paar nu, voorbeelden van. Ik ga verder open gaan up, laten we zeggen, de functie-0.c. En zoals altijd, deze code is beschikbaar op de website van de cursus, dus je kunt meespelen op thuis en kijk naar het later. Maar hier is het programma in het essentie, van regel 17 tot 22. Het hoofdprogramma is waar de programma gaat altijd om te beginnen. Dit programma, blijkbaar, gaat uit te printen uw naam, dikke darm. Het is vervolgens naar GetString noemen, net zoals we deden met onze vrijwilligers. En dan, dit is interessant, het gaat om PrintName noemen. Het blijkt, al die tijd is er lijkt een functie genaamd PrintName zijn. Dat drukt de naam van iemand. We hebben geen behoefte om printf te gebruiken van weleer, er is PrintName. Maar dat is misleidend omdat PrintName niet komen met C. mensen niet uitvinden ongeveer 40 of 50 jaar geleden, Ik heb, in plaats daarvan. En in feite, als ik blader verder omlaag, bericht hoe ik mijn eigen kunnen schrijven functies in C. We zullen uiteindelijk uitleggen waarom we blijven zeggen, leegte, in een paar plaatsen, maar voor vandaag, laten we kijk maar naar de naam. Op lijn 24, als je wilt creëer je eigen functie, je letterlijk schrijf de naam van de functie. Ik koos PrintName. Haakjes, u vervolgens welke soorten ingangen, en hoeveel u wil deze functie over te nemen. In dit geval wil ik nemen 1 variabele genaamd, naam, en het gaat te zijn het type, touwtje, dus het gaat sommige opeenvolging van karakters. En dan, dit program-- net als in Scratch, kunt u aangepaste puzzel hebben pieces-- gaat deze gewoonte gedrag. Het gaat om printf noemen passeren in, hello, placeholder, en dan gaat het om aan te sluiten in welke de gebruiker genoemd. Dit is dus een voorbeeld van wat een computer wetenschapper zou oproep abstractie of functionele decompositie, die gewoon chique manieren saying-- Is als je dit hoge niveau idee, zoals ik wil functionaliteit die drukt iemands naam, absoluut u kan letterlijk schrijven printf en vervolgens pas in de argumenten die je wilt, en het programma zal werken, zoals zij heeft sinds woensdag. Maar je kunt beginnen met het abstracte weg het begrip afdrukken van een naam. Je kan het een naam geven, zoals PrintName, en dit is dit idee van gelaagdheid van week 0. Voortaan weet ik en je niet te weten of schelen hoe PrintName wordt geïmplementeerd. Ja, het maakt gebruik van printf, misschien niet, wie weet wat er gebruikt? Dat boeit niemand? Nu ik heb het hier op, in plaats van hier naar beneden. En inderdaad, als onze programma's te krijgen meer geavanceerde en verfijnde, we gaan om te blijven nemen voor lief dat lager niveau puzzelstukjes bestaan. Omdat we ze schreef of iemand anders deed, dus dat we dan kunnen bouwen op de top van hen. Laten we eens een kijkje op deze variant functioneren één. Dus dit is een beetje meer geavanceerde, maar het blijkt dat in de bibliotheek CS50's, er is maar een getint functie. We wisten niet dat, jaren geleden, om implementeren van een GetPositiveInt functie. En dat is een beetje vervelend, want als jullie zijn het schrijven van een programma, waarin je wilt een positieve krijgen geheel getal van de gebruiker, je absoluut gebruiken getint. En je kunt absoluut contact op met de conditie en misschien een lus indien deze int groter dan 0 en schreeuwen tegen de gebruiker als hij of zij niet geven u een positief getal. Maar laten we bouwen deze gebouw zelf blokkeren, een, aangepaste Scratch stuk, als je wil. Ik ga een programma Hier die uiteindelijk ik willen in staat zijn om te bellen GetPositiveInt, en ik wil zijn in staat om uit te drukken wat dat int is. Maar dit wordt nu geabstraheerd weg. Het is gewoon gekregen van een hoog niveau naam die zegt wat het doet, dat is geweldig, want het is zeer intuïtief nu te lezen. En als ik dat doe schelen wat er onder de kap, laat me naar beneden scrollen. En het is een beetje intimiderend eerst, met name als dit je eerste programma, maar laten we eens een kijkje nemen. Ik ben niet meer zeggen, leegte, want het blijkt functies net als GetString, kan terug een waarde voor mij. Ze hebben niet alleen om af te drukken op het scherm, ze daadwerkelijk kunnen overhandigen me iets terug. En terwijl voor PrintName, Ik heb niets terug nodig. Ik als bijwerking nodig iets te zien op het scherm, maar ik heb een mens niet nodig om me terug te geven iets. Hier, met GetPositiveInt, zoals met getint, Ik wil terug worden ingeleverd iets. Dus ik zeg niet, leegte, op lijn 23, maar int, dat zegt, deze functie dat ik schrijf, genaamd GetPositiveInt gaat geef me terug een geheel getal, niet niets, niet nietig. Ondertussen gaat het niet nemen ingangen, dus ik heb, een soort van, omgekeerd is. Ik geef elke GetPositiveInt input, ik wil het aan mij zijn output te geven. En wat gebeurt er nu? Dus hier is hoe ik een variabele kan verklaren. Ik heb het gedaan buiten de lus, om redenen die we zullen uiteindelijk zien, maar dit gewoon geeft me 32 bit genoemd, n, en ik heb pre-het bepalen ze integer slaan. En hier is dat, doen terwijl construct, en dit is waarom het nuttig is. Dit letterlijk doen, terwijl n kleiner is dan 1. Dus laten we zien wat er gebeurt. Ik print, gelieve geef me een positieve int. Ik krijg dan een int, met CS50's functioneren en opgeslagen in n. En dan, wat regel code waarschijnlijk wordt uitgevoerd naast, logisch? Welke lijn nummer? Ja, dus 31. Je zou het niet weten dit totdat je hebt verteld of soort afleiden dat, maar dat is waar. Het gaat boven naar beneden en dan blijft herhalen. Dus als ik zeg, het nummer hebt getypt negatieve 1, n is minder dan negatieve 1? Ja. Omdat negatieve 1 kleiner is dan 1. Dus wat er moet gebeuren? Ik ga dit doen terwijl n kleiner is dan 1, dus ik ga terug naar lijn 28 gaan. En elke tijd-- en laten draaien dit-- maken functie 1 om het te compileren, en nu dot slash functie 1. Als ik typ negatief 1, het is gaande te houden schreeuwend op me totdat ik samenwerken omdat elke mijn input is dan 1 en als het terwijl minder dan 1, Ik ga blijven doen. Als ik eindelijk geef het een nummer, zoals 50, gelukkig, het zegt, bedankt voor de 50. Waarom? Want zodra n minimaal 1, stop ik vast komen te zitten in deze lus, en deze nieuwe zoekwoord vandaag, terugkeer, doet letterlijk dat. Dus ik heb net geïmplementeerd, in een gevoel, het equivalent van GetString, waar ik overhandigen terug naar wie is het gebruik van me, wat waarde. Het hoeft niet te worden een string, het is een int. Dus een eenvoudige, snelle Bijvoorbeeld, maar we zullen binnenkort zie een aantal meer geavanceerde versies nog steeds. In feite, laten we eens een kijkje nemen op een numeriek die return.c genoemd. En dit is eigenlijk een beetje eenvoudiger. Dus het doel van dit programma in leven-- laten compileren en voer het uit, dus zorg terugkeer, dot slash, return-- bericht het programma kubussen gewoon de waarde 2. Het is nogal dom, het is moeilijk code, heeft het geen input te nemen, maar het toont wel aan een ander functie die ik zelf heb geschreven. Dus hier heb ik verklaard variabele, genaamd x, van het type int, gelijk aan het aantal 2, volkomen willekeurig. Dit is slechts een paar pluizige afdrukken. Het zegt x is nu, en dergelijke zodanig cubing dot dot dot. En de magie is blijkbaar in de lijn 21. Ik bel een functie genaamd, kubus, Ik ben overhandigen het een vel papier met het nummer 2 geschreven, en welke waarde, wiskundig, wil ik uit te komen? Net zoals een sanity check? 8. Rechts? Ik wil 2 blokjes terug, 2 de kracht van 3, dus 8 terug. Dus waar is kubus geïmplementeerd? Nou, merken dat het hier geïmplementeerd beneden. En net als voorheen, logisch, hoewel de syntax waarschijnlijk erg nieuw voor velen van jullie, Ik wil deze functie bij de hand me terug een vel papier met een int erop. Dus ik heb een int, de naam is willekeurig, maar gunstig genoemd kubus. De invoer naar het, n van typt integer, dus dat is hoe ik kan passeren van het aantal 2 op een vel papier. En dan blijkt C steunen wiskunde, zodat u niet hoeft x voor tijd, je gewoon gebruik maken van de asterisk voor vermenigvuldiging. En dit geeft n maal n keer n, dat is gewoon een waarde in blokjes. Dus waar gaan we heen met dit alles? Dit is zeker een wervelwind tour, wees gerust, dat de super secties en in probleem set 1, u zult liep door dit alles des. En in probleem set 1, zullen we de overgang uit de grafische wereld van Scratch iets meer command line in C. Maar we inspiratie van deze hier spel van weleer, waarin met behulp van C en de standaard editie van de p set je Mario's piramide te implementeren. En in de hacker editie van de p set, als je daarvoor kiest om te kiezen, je zult een beetje meer uit te voeren uitdagend piramide met twee pieken. U zult ook een werktuig algoritme, een hebzuchtige algoritme. Het blijkt er's enkele interessante logica achter het proces van running station een kassier en eigenlijk overhandigen iemand terug veranderen. Er is een algoritme dat is vrij eenvoudig, dat je misschien zelfs intuïtief te begrijpen wanneer je voor het eerst gelezen het-- beseffen dat is wat ik heb altijd gedaan elke keer dat ik iemand wat gezien geld back-- waarmee u altijd verminderen het aantal notities op papier of metalen munten dat je overhandigen aan de gebruiker. En natuurlijk is dwingend want als je naar CVS of wat, je wilt niet overhandigd worden een hele hoop van degenen of een hele hoop centen. U wilt de minste munten, waarschijnlijk, mogelijk. Ten slotte, zult u ook worden aangevochten te ploeteren in de wereld van het water en eigenlijk een appreciatie een mapping tussen stroomsnelheden, van willen, water in een douche, hoeveel water wordt gebruikt. En de toespeling daarin, zal deze clip hier te zijn, die wij op je uiteindelijk voor slechts 60 seconden, dat schetst een beeld van low-flow douchekoppen. [VIDEO AFSPELEN] -Prima. Ik heb hier alles. Ik kreeg de Cyclone F-serie, Hydra, Jetflow, Stockholm Supersteam, noem maar op. -En Wat raden jullie aan? -Wat zoek je? -power Man. Macht. -achtige Silkwood. -Dat Is voor straling. -Dat klopt. -Nu Wat is dit? -Dat Is het Commando 450. Ik denk niet dat één verkopen. -maar Dat is wat we willen. Het is een commando 450. -geen Geloof me. Het wordt alleen gebruikt in het circus. Het is voor de olifanten. -Ik Betalen niets. -Wat Over Jerry? -Hij Kon niet omgaan met dat. Hij is delicaat. Zeker weten. [END AFSPELEN] DAVID J MALAN: Oké. Dat is als voor de CS50. We zien je volgende week. SPEAKER 1: [? Scully?], [? Ian,?] voor zover dit outro project, wat hebben jullie verzinnen? Luidspreker 2: Nou, we hebben gezien Het diverse gedachte, en we denken dat de beste manier to-- SPEAKER 3: Mag ik? Luidspreker 2: Ja. Door alle middelen, eigenlijk. SPEAKER 3: Dus ik denk dat we kunnen samenvatten ons idee voor de outro's met één word-- niets. DAVID J MALAN: Niets? SPEAKER 3: Niets. DAVID J MALAN: Wat betekent dat? SPEAKER 3: De outro's zijn over niets. Luidspreker 2: Nou, ik bedoel, in de filosofie, Ik bedoel, niets is altijd wel iets. SPEAKER 1: Dus what's-- wat is het uitgangspunt? SPEAKER 3: Dus het is net als het leven. OK. Wat heb je vandaag gedaan? DAVID J MALAN: ik opstond, had ontbijt, en kwam te werken. SPEAKER 3: Dat is een outro. Luidspreker 2: Maar, ik bedoel, moet niet er iets gebeuren om hem the-- SPEAKER 3: Nee, nee, nee, nee. Niks gebeurt. SPEAKER 1: Dus waarom zijn we kijken? SPEAKER 3: Omdat het is een outro voor CS50. DAVID J MALAN: Nog niet.