>> [Musik zu spielen]
David J. MALAN: In Ordnung.
Dies ist CS50, und dies ist der Beginn der Woche zwei.
Also lassen Sie uns beginnen heute mit einem Fehler.
Ein Fehler, natürlich, ist ein Fehler in einem Programm,
und Sie werden sehr erhalten mit diesem Konzept vertraut
wenn Sie noch nie programmiert haben zuvor. pset0 und jetzt pset1.
Aber betrachten wir etwas ein wenig einfach auf den ersten.
Dieses Programm hier, dass ich warf zusammen im Voraus,
und ich behaupte, dass dies zu drucken 10 Sterne auf dem Bildschirm mit printf,
aber es ist offensichtlich Buggy in gewisser Weise.
>> Da die Spezifikation, die sollte es 10 Sterne zu drucken,
aber es hat offenbar nicht, was würden Sie behaupten, ist der Fehler?
Ja?
Also es ist eine durch einen Fehler, und was tun Sie damit?
Ok.
Ausgezeichnet.
Also haben wir festgelegt haben, ein Startwert von Null für i,
und wir ein n-Wert von 10 festgelegt haben, aber wir haben weniger als oder gleich verwendet.
Und der Grund dafür, dass dies zwei Zeichen und nicht nur ein Symbol,
wie in einem Mathebuch, ist, dass Sie nicht haben,
ein Weg, die ein Zeichen gleichwertig.
>> Das heißt also, weniger als, aber wenn Sie das Zählen bei Null zu beginnen,
Sie zählen aber den ganzen Weg nach oben durch und gleich 10,
Sie natürlich werde sind 11 Dinge zählen insgesamt.
Und so wirst du 11 Sterne zu drucken.
Also, was könnte eine Lösung für dieses sein?
Ja?
>> Also nur die weniger als einstellen gleich oder knapp sein,
und es gibt, ich behaupte, vielleicht Eine andere Lösung, zu.
Was könnte sonst noch tun?
Ja?
>> So starten gleich es auf 1, und verlassen die weniger als oder gleich.
Und ehrlich gesagt, ich würde behaupten, dass bei einer typischen menschlichen,
Dies ist wahrscheinlich einfacher.
Zählen beginnen bei 1 und zählen bis 10 durch.
Wesentlichen tun, was du meinst.
>> Aber die Realität ist in Programmierung, wie wir gesehen haben,
Informatiker und Programmierer in der Regel nicht anfangen zu zählen bei Null.
Und so ist das in Ordnung, wenn Sie daran zu gewöhnen.
Ihr Zustand wird in der Regel so etwas wie weniger als.
Also einfach eine logische Fehler, dass wir jetzt
zu fixieren und schließlich neu kompilieren dies und bekommen nur 10.
>> Nun, wie über diesen Fehler hier?
Auch hier behaupte ich, dass ich ein Ziel von 10 Drucken stars--
eine pro Zeile dieser Zeit, aber es funktioniert nicht.
Bevor wir vorschlagen, was das Update ist, was hat das
drucken visuell, wenn ich zu kompilieren und führen Sie dieses Programm denken Sie?
Ja?
>> Stern.
Also alle die Sterne auf dem gleichen Linie ist das, was ich gehört habe,
und dann die neue Zeile.
Also lassen Sie uns versuchen.
So machen Buggy-1, ein, und ich sehe den Befehl Klang
dass wir darüber gesprochen letzten Mal.
./buggy-1, und in der Tat sehe ich alle 10 Sterne auf der gleichen Linie, auch wenn ich behaupten,
in meinem Spezifikation nur ein Kommentar oben der Code, den ich auf einen pro tun soll
Linie.
Aber das sieht recht.
>> Jetzt Zeile 15 sieht es aus wie ich bin Druck einen Stern, und dann die Linie 16
es sieht aus wie ich bin Druck eine neue Zeile,
und sie sind beide so eingerückt Ich bin in der Schleife deutlich.
Also sollte ich nicht tun, werden Sterne, neue Linie, Stern, neue Linie, Stern, neue Linie?
Ja?
>> Ja, im Gegensatz zu einer Sprache wie Python, wenn Sie nicht vertraut sind,
Einzug nicht Rolle mit dem Computer.
Es kommt nur auf den Menschen.
Während also hier habe ich erfunden habe Linien 15 und 16--, die schön aussieht,
aber der Computer ist es egal.
Der Computer kümmert sich um tatsächlich mit geschweiften Klammern
um diese Codezeilen.
>> , So dass es genau wie in clear-- Scratch--, dass diese beiden Zeilen Code
ausgeführt werden soll.
Wie einer dieser gelben Scratch-Puzzle Stücke wieder und wieder und wieder.
>> So, jetzt, wenn ich wieder laufen diese program-- ./buggy-2-- Hm.
Ich habe jetzt einen Fehler.
Was habe ich vergessen zu tun?
Ja, so habe ich nicht kompilieren.
So machen Buggy-2.
Keine solche Datei, weil ich nicht tatsächlich kompilieren die zweite Version.
So, jetzt interessant nicht angemeldete variable-- nicht 2.
Wir machen 1.
Machen Buggy-1-- ./buggy-1-- und jetzt Jede von ihnen ist auf der gleichen Linie.
>> Jetzt gibt es eine Ausnahme diese vermeintliche Anspruch von mir
dass Sie diese geschweiften Klammern.
Wann ist es eigentlich, wenn Sie noch OK-- in Abschnitt oder textbooks-- bemerkt
die geschweiften Klammern weglassen?
Ja?
>> Genau.
Wenn es nur eine Code-Zeile, die Sie
wollen mit dem in Verbindung gebracht werden Schleife, wie in unserem ersten Beispiel.
Es ist vollkommen legitim die geschweiften Klammern weglassen
nur als eine Art Bequemlichkeit von der Compiler für Sie.
Ja?
Gute Frage.
Würde es als eine Art Fehler werden?
Wir würden uns wie in CS50 promote-- Styleguide, die URL für die
ist in pset1--, die immer verwenden Sie die geschweiften Klammern.
Sicherlich, wenn Sie neu in der Programmierung sind.
Die Realität ist, wir sind nicht euch verbieten
zu tun, diese Annehmlichkeiten.
Aber wenn Sie gerade erst in den Swing der Dinge,
absolut nur immer die geschweiften Hosenträger, bis Sie den Dreh raus.
Gute Frage.
>> In Ordnung.
So dass dann war ein Fehler.
Zumindest in etwas ziemlich einfach.
Und doch könnte man denken ist ziemlich rudimentär, oder?
Dies ist eine Art der ersten Woche der Blick auf die Sprache
wie finden Sie Ihre Fehler darin.
Aber die Realität sind tatsächlich repräsentativ
von ein paar ziemlich erschreckend Probleme dass in der realen Welt auftreten können.
>> So einige von euch erinnern sich vielleicht an wenn Sie Tech-News zu folgen,
oder vielleicht sogar gefangen Wind davon im Februar
des vergangenen Jahres, dass Apple hatte machte ein bisschen ein Fehler in iOS,
das Betriebssystem auf ihre Handys, und auch
Mac OS, das Betriebssystem auf ihren Desktops und Laptops.
Und Sie sah Schriften wie diese.
Und danach, Apfel versprochen, diesen Fehler zu beheben,
und sehr schnell habe beheben in iOS, aber dann letztlich in Mac OS fest es
als auch.
>> Jetzt keines dieser Schlagzeilen allein wirklich zeigen, was das eigentliche Problem war,
aber der Fehler wurde schließlich reduziert ein Fehler in SSL, Secure Sockets Layer.
Und lange Geschichte kurz, Dies ist die Software
dass unsere Browser und andere Software verwendet werden, um was zu tun?
>> Wenn ich sagte, dass SSL beteiligt sind, wann immer Sie
besuchen Sie eine URL, die mit HTTPS beginnt, was dann könnten SSL verwandt werden?
Verschlüsselung.
Also werden wir darüber reden dies in den kommenden Tagen.
Verschlüsselung, die Kunst des Scrambling-Informationen.
>> Aber lange Rede, kurzer Sinn, Apfel vor einiger Zeit einen Fehler gemacht hatte
in ihrer Implementierung von SSL, die Software, die letztlich implementiert
URLs wie HTTPS oder max Verbindungen gibt es auch.
Das Ergebnis davon ist, dass die Verbindungen könnten potenziell
abgefangen werden.
Und Ihre Verbindungen waren nicht notwendigerweise verschlüsselt
wenn Sie hatte einige schlechte Kerl in zwischen Sie und die Ziel-Website, die
wusste, wie man dies nutzen.
>> Jetzt von Apple letztlich geschrieben ein Update für dieses schließlich
und die Beschreibung ihrer fix war diese.
Sicherer Transport konnte nicht validieren die Authentizität der Verbindung.
Das Problem wurde durch adressiert Wiederherstellung der fehlenden Validierungsschritte.
>> Das ist also ein sehr wellig Hand Erklärung für einfach zu sagen, dass wir vermasselt.
Es ist buchstäblich ein Codezeile, die Buggy war
bei der Umsetzung der SSL und wenn Sie online gehen und suchen für diese
Sie tatsächlich finden der ursprüngliche Quellcode.
Zum Beispiel, das ist ein Screenshot nur ein Teil einer größeren Datei,
aber dies ist eine Funktion scheinbar genannt SSL-Server überprüfen Zeichen Schlüsselaustausch.
Und es dauert eine Reihe von Argumente und Eingänge.
Und wir gehen nicht zu konzentrieren zu sehr auf die Minutien es,
aber wenn man auf dem Code konzentrieren innen dieser obersten function-- uns gelassen
Zoom auf das.
Sie vielleicht schon vermuten, Was könnte der Fehler
sein, auch wenn Sie keine Ahnung haben letztlich, was Sie suchen auf.
Es ist irgendwie eine Anomalie hier, das ist, was?
>> Ja, ich mag es nicht wirklich Das Aussehen der beiden goto ausfällt.
Ehrlich gesagt, weiß ich nicht wirklich, was goto nicht Mittel, sondern mit zwei von ihnen
Rücken an Rücken.
Dass nur irgendwie reibt mich intellektuell der falsche Weg,
und in der Tat, wenn wir auf Vergrößern nur jene Linien, das ist C.
>> So dass eine Menge von Apple-Code wird selbst in C geschrieben,
und dies offenbar ist wirklich equivalent--
nicht zu diesem ziemlich Einbuchtung Version, aber wenn Sie erkennen die Tatsache,
dass es keine geschweiften Klammern, was Apple wirklich schrieb, war Code, der aussieht
so was.
Also habe ich aus und gezoomt ich gerade Fest den Einzug in dem Sinne,
dass, wenn es keine geschweiften Klammern, dass zweiten goto scheitern, das ist in gelb
wird, egal was auszuführen.
Es ist nicht im Zusammenhang mit der Zustand, wenn über ihm.
>> Also auch wieder, wenn Sie nicht ganz verstehen, was dies möglicherweise
tun wissen, dass jeder dieser conditions-- jede dieser Linien
ist ein sehr wichtiger Schritt, in dem Prozess der Überprüfung
Wenn Ihre Daten ist in der Tat verschlüsselt.
So Überspringen eines davon Schritte, nicht die beste Idee.
>> Aber weil wir das haben zweiten goto nicht in gelb,
und weil, wenn wir Art von ästhetisch
bewegen Sie sie nach links, wo es logisch ist im Moment, was
bedeutet das für die Linie bedeuten, Code unterhalb dieser zweiten goto
scheitern würden Sie denken?
Es wird immer übersprungen werden.
So werden in der Regel GOTOs verpönt Gründen, die wir nicht wirklich in zu gehen,
und zwar in CS50 wir eher nicht , diese Erklärung goto lehren,
aber Sie von goto denken kann nicht dahin gehen Sprung
zu einem anderen Teil des Codes.
>> Mit anderen Worten springen diese letzte Zeile ganz,
und so das Ergebnis dieser blöde einfache Fehler, die einfach war
ein Ergebnis wahrscheinlich jemand Kopieren und Einfügen zu einem
oft war, dass die gesamte Sicherheit von iOS und Mac OS
war anfällig für Abfangen von bösen Jungs für einige Zeit.
Bis Apple endlich behoben diese.
>> Nun, wenn einige von euch sind eigentlich Laufen alte Versionen von iOS oder Mac OS,
Sie können gotofail.com gehen die ist eine Website, dass jemand eingestellt
zu bestimmen wesentlich programm
Wenn Ihr Computer ist immer noch anfällig.
Und ehrlich gesagt, wenn es ist, es ist wahrscheinlich eine gute Idee
, um Ihr Telefon zu aktualisieren oder zu Ihr Mac an dieser Stelle.
Aber es gibt nur Zeugnis, wie eine Wertschätzung dieser unteren Ebene
Details und fair einfachen Ideen wirklich kann
übersetzen in Entscheidungen und Probleme, die
affected-- in diesem case-- Millionen von Menschen.
>> Nun ein Wort zur Verwaltung.
Abschnitt wird am kommenden Sonntag starten.
Sie erhalten eine E-Mail von der Empfangs Wochenende zu Abschnitt, an welchem ​​Punkt
die Resektion Prozess beginnt, wenn Sie noch
realisiert haben Sie jetzt einige neue Konflikte.
Also das passiert jedes Jahr, und wir wird in den nächsten Tagen aufnehmen, um zu kommen.
>> Büro hours-- tun halten ein Auge auf diesen Zeitplan hier.
Ändert ein wenig in dieser Woche, insbesondere die Startzeit
und die Lage, also konsultieren dass, bevor Sie sich der Bürozeiten
einem der nächsten vier Nächte.
Und nun ein Wort über die Bewertung, besonders, wie Sie tauchen ein in Problem
setzt ein und darüber hinaus.
>> Also gemäß der Spezifikation, diese sind im Allgemeinen
die Achsen, entlang derer Wir bewerten Ihre Arbeit.
Bereich bezieht sich auf das, was Umfang der Code implementiert
Die Funktionen erforderlich durch unsere Spezifikation.
In anderen Worten, wie viel von ein Stück Satz haben Sie abbeißen.
Haben Sie ein Drittel der es zu tun, eine Hälfte, 100% davon.
Auch wenn es nicht richtig ist, wie viel haben Sie versucht?
So dass die Höhe erfasst Aufwand und die Menge
, zu dem Sie etwas abseits der Probleme Problem Satzes.
>> Correctness-- diese, um Inwieweit ist Ihr Code
im Einklang mit unseren Spezifikationen und frei von Fehlern.
So funktioniert es richtig?
Wenn wir es eine Eingabe, tut es Geben Sie uns die Ausgabe, die wir erwarten?
Design-- jetzt ist dies die erste von Die besonders qualitative diejenigen,
oder die, die menschliche Beurteilung erfordern.
Und in der Tat, das ist, warum wir haben einen Stab von so vielen Lehr Stipendiaten und natürlich
Assistenten.
Inwieweit ist Ihr Code gut geschrieben?
>> Und auch dies ist eine sehr qualitative Bewertung
das wird sich mit Ihnen zu arbeiten bi-direktional in den kommenden Wochen.
So dass, wenn Sie nicht bekommen nur numerische Werte, sondern auch
Eine schriftliche Partituren, oder getippte Feedback oder schriftliche Rückmeldung in englischer Wörter.
Das ist, was wir nutzen, um Sie zu fahren Richtung eigentlich schreiben besseren Code.
Und in Vortrag und Abschnitt werden wir versuchen, darauf out-- so oft wie wir can--
was macht ein Programm nicht nur korrekte und funktionell gut,
sondern auch gut gestaltet.
Die effizienteste es könnte sein, oder auch der schönste kann es sein.
>> Das führt uns zu stylen.
Stil letztlich ein ästhetisches Urteil.
Haben Sie gut wählen Namen für Ihre Variablen?
Haben Sie Ihren Code eingerückt richtig?
Ist es gut aussehen, und deshalb ist es einfach für einen anderen Menschen
Lesen Sie Ihre jeweiligen von deren Richtigkeit.
>> Jetzt allgemein pro Lehrplan punkten wir diese Dinge auf einer Fünf-Punkte-Skala.
Und lassen Sie mich nach Hause Hammer der Punkt dass eine drei ist in der Tat gut.
Sehr schnell machen Leute tun beginnen Arithmetik.
Wenn sie erhalten eine drei von fünf auf Richtigkeit für einige pSoll
und sie verdammt denke, ich werde zu 60% Das ist im wesentlichen ein D oder E.
>> Das ist nicht die Art, wie wir Denken Sie an diese Zahlen.
Eine drei ist in der Tat gut, und das, was wir im allgemeinen am Anfang erwarten
des Begriffs ist, dass wenn Sie bekommen ein Haufen von three's-- vielleicht ein paar
von Messen, ein paar fours-- oder ein paar zu zweit, ein paar fours--
das ist ein guter Ort, um zu starten.
Und so lange, wie wir sehen ein Aufwärtstrend über die Zeit,
Sie sind in einer besonders guten Ort.
>> Die Formel, die wir zur Gewichts Dinge ist im Wesentlichen
dies pro Lehrplan, das bedeutet nur, dass wir
mehr Gewicht auf Richtigkeit.
Weil es sehr oft Korrektheit das nimmt die meiste Zeit.
Vertrauen Sie mir jetzt.
Sie werden mindestens find-- in einem pset--, dass Sie
verbringen 90% Ihrer Zeit Arbeits auf 10% des Problems.
>> Und alles, was irgendwie funktioniert außer einem oder zwei Fehlern,
und das sind die Fehler, die halten Sie bis spät in die Nacht.
Das sind diejenigen, die Art entkommen Sie.
Aber nach dem Schlafen darauf oder die Teilnahme an der Bürozeiten
oder Fragen online, wird wenn Sie zu diesem Ziel zu 100% zu erhalten,
und das ist, warum wir Gewicht Richtigkeit die meisten.
Entwerfen Sie ein bisschen weniger, und Stil ein wenig weniger.
Aber in mind-- Stil zu halten ist vielleicht die einfachste
von diesen zu abbeißen nach dem Style-Guide.
>> Und nun eine ernstere Hinweis auf akademische Ehrlichkeit.
CS50 hat die unglückliche Unterscheidung von der größte Hersteller von Ad-Board
Fällen fast jedes Jahr historisch.
Dies ist nicht, weil die Studenten betrügen in CS50 mehr als jede andere Klasse,
aber wegen der Natur der Arbeit, Die Tatsache, dass es elektronisch,
die Tatsache, dass wir uns für sie, und die Tatsache, wir sind Informatiker,
Ich kann sagen, wir sind leider sehr gut im Erkennen sie.
>> Also, was bedeutet das konkret bedeuten?
So ist es, pro Lehrplan, der Kurs Philosophie
wirklich einkochen, vernünftig zu sein.
Es ist diese Linie zwischen dass man seine Arbeit auf eigene Faust
und immer ein bisschen angemessenen Hilfe von einem Freund,
und regelrechte tun, dass die Arbeit für Ihre Freund, oder das Versenden von ihm oder ihr den Code
so dass er oder sie kann einfach nehmen oder leihen Sie es aus rechts.
Und dass die Linie überquert dass wir in der Klasse gezogen.
>> Sehen, den Lehrplan schließlich für die Leitungen
dass wir als angemessen zu ziehen und unvernünftiges Verhalten,
aber es wirklich kochen auf das Wesen
Ihre Arbeit benötigen, um dein eigener am Ende.
Jetzt mit dieser sagte, es ist ein heuristisches.
Denn wie Sie vielleicht imagine-- von Bürozeiten und den Visuals
und die Videos, die wir haben gezeigt somit far-- CS50
ist in der Tat gedacht, als kollaborative sein und als kooperative und soziale
wie möglich.
Als kollaborative, wie es ist streng.
>> Aber mit diesen Worten, die Heuristik, wie Sie in den Lehrplan zu sehen,
ist, dass, wenn Sie ein Problem mit bist.
Sie haben einige Fehler in Ihrem Code, den Sie nicht lösen können, für Sie zumutbar ist es
Ihren Code an jemand anderen zu zeigen.
Ein Freund, auch in der Klasse, ein Freund neben Ihnen sitzt an der Bürozeiten,
oder ein Mitglied des Personals.
Aber sie können ihren Code, um Sie nicht zu zeigen.
>> In anderen Worten, ein Antwort auf Ihre question--
Ich brauche help-- nicht oh, hier ist mein Code.
Werfen Sie einen Blick auf diese und folgern daraus, was du willst.
Nun, natürlich, es gibt ein Weg, deutlich zu Spiel
Dieses System, bei dem werde ich Ihnen zeigen, mein Code, bevor er eine Frage.
Sie zeigen mir mein Code bevor er eine Frage.
Aber sehen Sie den Lehrplan wieder für die feineren Details, wo diese Linie.
>> Nur um jetzt das Bild malen und teilen so transparent wie möglich
Wo sind wir bei der letzten Jahre, Dies ist die Anzahl der Ad-Board Fällen
dass CS50 hat sich hatte In den letzten sieben Jahren.
Mit 14 Fällen diese jüngste Fall.
In Bezug auf die beteiligten Studenten, es war 20 einige merkwürdige Studenten
im vergangenen Herbst.
Es wurde eine Spitze von 33 Studenten vor einigen Jahren.
Viele von ihnen sind leider nicht mehr hier auf dem Campus.
>> Studenten als Prozentsatz der beteiligten Klasse war in der Vergangenheit von 0% reichten
bis 5,3%, das heißt nur Das ist jährlich eine Herausforderung.
Und auf dieses Ziel hin, was wir tun müssen, ist einen vermitteln wollen
dass wir nur dd-- FYI-- vergleichen zu eine Fairness zu den Studenten, die
sind im Anschluss an die Linie entsprechend.
Wir tun vergleiche alle aktuellen Einreichungen gegen alle vergangenen Missionen
aus den letzten vielen Jahren.
>> Wir wissen auch, wie man sich googelt und finden Sie Code-Repositories
Online-Diskussionsforen online, Job-Websites online.
Wenn ein Schüler es finden kann, können wir sicher finde es so viel wie wir mit Bedauern zu tun.
Also, was Sie in den Lehrplan zu sehen obwohl dies ist Bedauern Klausel.
Ich kann mit Sicherheit schätzen, und wir alle hat
Bediensteten, die natürlich wie gemacht diese oder dieses selbst im Laufe der Zeit,
sicher wissen, wie es ist, wenn Leben im Weg, wenn man bekommt
einige spät in die Nacht deadline-- nicht nur in dieser Klasse,
aber wenn man another-- völlig erschöpft, gestresst,
haben eine ungewöhnlich hohe Zahl andere Dinge zu tun.
Sie werden irgendwann in machen Leben sicherlich ein schlechter, vielleicht zu spät
Nacht Entscheidung.
>> Also pro Lehrplan, gibt es diese Klausel,
so dass, wenn innerhalb von 72 Stunden nach der einige schlechte Entscheidung, bis besitzen Sie es
und erreichen, um mich und einer der Köpfe des Kurses
und wir werden ein Gespräch.
Wir werden Dinge zu behandeln intern in der Hoffnung,
der es immer mehr zu einem Lehr Moment oder Lebenslektion,
und nicht etwas mit Besonders drastisch Auswirkungen
wie man auf diesen Karten hier sehen könnten.
>> Also das ist eine sehr ernste Ton.
Lassen Sie uns für nur ein paar pausieren Sekunden, um die Spannung zu brechen.
>> [Musik zu spielen]
>> David J. MALAN: All right, so war, wie das für einen Übergang?
Um den heutigen primären Themen.
Die erste davon ist die Abstraktion.
Ein weiteres, von denen wird sich das sein Darstellung von Daten, die offen
ist ein wirklich trocken Art zu sagen, wie können wir gehen über die Lösung von Problemen und Denken
über die Lösung von Problemen?
So können Sie in Scratch gesehen haben, und Sie haben vielleicht schon in pset1 mit C gesehen
dass Sie nicht nur nutzen können Funktionen, wie printf,
dass andere Menschen in den vergangenen Jahren schrieb für Sie.
Sie können auch eigene Funktionen schreiben.
>> Und auch wenn Sie möglicherweise nicht über dies in C in pset1 getan, und ehrlich gesagt
Sie nicht wirklich brauchen, um schreiben Sie Ihre eigene Funktion, weil der problem--
während vielleicht auf gewaltige ersten glance-- Sie werden sehen,
kann letztlich gelöst werden nicht so viele Codezeilen.
Aber mit dieser sagte, in Bezug auf von Schreiben eigener Funktion,
erkennen, dass C nicht geben Sie diese Möglichkeit.
>> Ich werde in der heutigen Quellcode zu gehen, die zur Verfügung steht bereits online,
und ich werde weitergehen und offen bis ein Programm namens Funktion 0.c,
und in der Funktion Null Wir werden ein paar Dinge zu sehen.
Im ersten Zeilen 18 bis 23 ist meine Hauptaufgabe.
Und jetzt, wo wir angefangen zu lesen Code, den wir nicht auf der Fliege, Sie schreiben,
sondern ich habe im Voraus geschrieben oder dass Sie in einem Problem eingestellt
möglicherweise erhält mit wurde im Vorfeld geschrieben.
Ein guter Anfang Lesen Code ist jemand anderes
, ist nach der Hauptfunktion.
Herauszufinden, wo Sie diesen Eintrag Punkt ist, um die Ausführung des Programms,
und dann folgen sie logisch von dort.
>> Also dieses Programm offenbar Drucke Ihren Namen gefolgt von einem Doppelpunkt.
Wir verwenden Sie dann GetString von der CS50-Bibliothek
um einen String oder ein Wort oder einen Satz zu bekommen vom Benutzer an der Tastatur.
Und dann gibt es diese Sache hier-- Printname.
>> Jetzt Printname ist nicht ein Funktion, die mit C. kommt
Es ist nicht im Standard-io.h
Es ist nicht in CS50.h.
Es ist ziemlich in der gleichen Datei.
Merken, wenn ich nach unten scrollen ein bit-- Zeilen 25 bis 27--
es ist nur eine hübsche Weise zu kommentieren Ihr Code mit den Sternen und Schrägstriche.
Dies ist ein Mehrzeilen kommentieren, und das ist nur
meine Beschreibung in Blau Was diese Funktion tut.
>> Da in den Zeilen 28 bis 31, Ich habe ein super einfache Funktion geschrieben
dessen Name Printname.
Es dauert, wie viele Argumente würden Sie sagen?
So ein argument--, weil es eine Argument in den Klammern aufgeführt.
Dessen Typ String ist.
Welche ist die Printname sagen ist wie dieser Black-Box
oder Funktion, die nimmt als Eingabe eine Zeichenfolge.
>> Und der Name dieser String bequem wird der Name sein.
Nicht S, N nicht, aber Namen.
Also, was bedeutet Printname tun?
Es ist schön einfach.
So wie eine Zeile Code für printf, aber anscheinend ist es
druckt "Hallo", so und so.
Wo das so und so kommt aus der Argument.
>> Nun ist dies nicht eine große Neuerung.
Wirklich, ich habe ein Programm, das ergriffen werden könnten, haben mit einer Zeile Code geschrieben wurde
indem diese hier oben, und verändert es zu etwas
dazu gehört etwa sechs oder sieben oder so Zeilen Code den ganzen Weg hier unten.
>> Aber es ist das Üben von ein Prinzip als Abstraktion bekannt.
Art der Einkapselung innerhalb eines neuen Funktion, die einen Namen hat, und besser
noch, dass der Name buchstäblich sagt, was sie tut.
Ich meine, das ist nicht printf-- besonders beschreibend.
Wenn ich eine erstellen Puzzle-Stück, oder wenn ich
möchte eine Funktion erstellen dass druckt jemand Name,
die Schönheit Dadurch ist, dass ich eigentlich
geben, die Funktion einen Namen das beschreibt, was es tut.
>> Jetzt dauert es in einen Eingang, Ich habe willkürlich genannt Name,
aber auch das ist wunderbar beschreibenden statt ein wenig
generische wie S. und Leere, denn jetzt, bedeutet nur,
dass diese Funktion nicht gib mir etwas zurück.
Es ist nicht so, dass GetString buchstäblich reicht mir einen String zurück
wie wir mit den Stücken von Papier hat mit Ihren Klassenkameraden in der vergangenen Woche,
sondern es hat nur ein Nebeneffekt.
Er druckt etwas auf den Bildschirm.
>> So dass am Ende des Tages, wenn ich Sie machen Funktion-0, ./function-0,
wir werden sehen, dass es nach meinem Namen fragt.
Ich tippe David, und es Typen, die meinen Namen.
Wenn ich es wieder tun mit Rob, es geht zu sagen: "Hallo, Rob."
So eine einfache Idee, aber vielleicht extrapolieren aus dieser geistig
dass Ihre Programme bekommen ein wenig komplizierter,
und Sie ein Stück schreiben wollen Code und Anruf, dass code-- invoke
dass code-- von einigen beschreibenden Namen wie Printname,
C tut uns leisten diese Fähigkeit.
>> Hier ist ein weiteres einfaches Beispiel.
Zum Beispiel, wenn ich öffnen ein Datei ab heute genannt return.c,
feststellen, was ich hier getan.
Die meisten dieser Hauptfunktion ist printf.
Ich zum ersten Mal zu initialisieren willkürlich ein Variable namens x der Anzahl 2.
Ich habe dann ausdrucken "x ist jetzt % I "übergeben den Wert von x.
Also bin ich einfach nur sagen, was es ist.
>> Jetzt bin ich einfach nur dreist behaupten, mit printf.
Ich Cubing diesen Wert x, und ich bin Dabei durch den Aufruf einer Funktion
genannt Würfel Gang in x als Argument,
und dann die Rettung der Ausgangs in der Variablen selbst, x.
Also ich bin clobbering den Wert von x.
Ich bin das Überschreiben der Wert von x mit dem, was
das Ergebnis des Aufrufens Dieser Würfel Funktion ist.
Und dann habe ich nur einige ausdrucken flauschige Zeug hier zu sagen, was ich getan habe.
>> Also, was ist dann Würfel?
Beachten Sie, was ist grundlegend anders.
Ich habe die Funktion gegeben ein Name wie vorher.
Ich habe einen Namen für ein Argument angegeben.
Dieses Mal ist es als n anstelle des Namens, aber ich könnte es, was ich will.
Dies ist jedoch anders.
Das Ding auf der linken Seite.
Bisher war es, was Keyword?
Boys.
Jetzt ist es offensichtlich Int.
>> Also, was ist vielleicht das wegnehmen?
Wohingegen Leere bedeutet Art Nichts, und das war der Fall.
Printname zurückgegeben nichts.
Sie tat etwas, aber es hat mich nicht zurückgeben
etwas, das ich auf der Put- linken Seite des Gleichheitszeichens
wie ich hier auf der Linie 22 durchgeführt.
>> Also, wenn ich in der Linie 30 zu sagen, was ist das wohl was bedeutet,
über das, was Würfel für mich tut?
Ja?
Es gibt eine ganze Zahl.
So ist es reicht mir zurück, für beispielsweise ein Stück Papier,
, auf die er die Antwort geschrieben.
2 Würfel geschnitten, gewürfelt oder 3 oder 4 cubed-- was auch immer ich in vergangen,
und wie implementiere ich das?
Nun, nur n mal n mal n ist, wie ich könnte einen Wert Würfel.
Also noch einmal, super einfach Idee, aber demonstrative
jetzt, wie wir Funktionen schreiben dass tatsächlich hatten uns zurück
Werte, die von Interesse sein könnten.
>> Schauen wir uns ein letztes Beispiel hier eine Funktion aufgerufen.
In diesem Beispiel beginnt es mehr zwingend zu bekommen.
Also in einer Funktion, diese program-- Ankündigung letztlich
ruft eine Funktion namens GetPositiveInt.
GetPositiveInt kein Funktion in der CS50-Bibliothek,
aber wir beschlossen, wir möchten, dass es existiert.
>> Also, wenn wir später in der Datei nach unten scrollen, merken, wie ich über die Implementierung
bekommen positive int, und ich sagen, es ist mehr zwingend
denn dies ist ein anständiges Anzahl von Codezeilen.
Es ist nicht nur ein dummer kleine Spielzeug-Programm.
Es ist eigentlich habe einige Fehlerprüfung und noch etwas mehr Nützliches zu tun.
>> Also, wenn Sie noch nicht die Komplettlösung gesehen Videos, die wir in pset1 eingebettet haben,
weiß, dass dies eine Art von Schleife in C, im Geiste
auf die Art von Dingen, Scratch tun können.
Und zu tun, sagt dies tun.
Drucken Sie diese aus.
Dann gehen Sie vor und erhalten n-- bekommen einen int und speichern sie in n,
und halten Sie wieder und wieder und tun dies wieder solange n kleiner als eins ist.
>> SO n wird auf weniger als eins nur wenn die menschlichen nicht zusammen.
Wenn er oder sie ist die Eingabe in 0 oder -1 oder -50,
Diese Schleife wird sich halten wieder und wieder ausführen.
Und letztlich feststellen, ich einfach das Wert.
So, jetzt haben wir eine Funktion dass wäre schön gewesen
wenn CS50 würde umzusetzen in CS50.h und CS50.c für Sie,
aber hier können wir nun implementieren diese uns.
>> Aber zwei Anmerkungen zu einigen wichtigen Details.
One-- warum habe ich zu erklären int n, denken Sie, auf der Linie 29
statt nur dabei das hier, das ist,
mehr im Einklang mit was wir getan haben in der vergangenen Woche?
Ja?
Ein guter Gedanke.
Also, wenn wir sie gestellt wurden hier, es ist, als ob wir
halten Sie es immer und immer wieder erklärt.
Dass an und für sich ist nicht problematisch, per se,
denn wir brauchen nur der Wert einmal und dann
wir werden eine neue sowieso.
Aber ein guter Gedanke.
Ja?
>> Schließen.
Also, weil ich n für deklarierte Linie 29 außerhalb der Schleife,
es ist im gesamten Hotel verfügbar diese ganze Funktion.
Nicht die anderen Funktionen, da n ist immer noch innerhalb dieser geschweiften
Hosenträger hier.
SO- sicher.
>> Genau.
Das ist also noch mehr auf den Punkt.
Wenn wir stattdessen erklärt n gleich hier auf der Linie 32,
es ist problematisch, weil Vermutung Wo sonst muss ich darauf zugreifen?
Auf der Linie 34 und der einfache Faustregel ist,
dass Sie nur eine Variable innerhalb der letzten geschweiften Klammern
, in dem Sie sie deklariert.
>> Leider, Zeile 34 ist eine Zeile zu spät,
weil ich schon geschlossen die geschweifte Klammer in Zeile 33
Das entspricht dem geschweifte Klammer auf der Leitung 30.
Und so ist dies eine Art zu sagen, dass diese Variable int ist Gültigkeitsbereich,
sozusagen nur innerhalb dieser geschweiften Klammern.
Es funktioniert einfach nicht außerhalb von ihnen existieren.
>> Also in der Tat, wenn ich dies tun falsch, lassen Sie mich den Code zu speichern
wie es ist-- falsch geschrieben.
Lassen Sie mich gehen Sie vor und machen Sie Funktion-1 und notice-- Fehler.
Verwendung von nicht deklarierter Bezeichner n auf der Linie 35, die hier ist.
Und wenn wir nach oben Weiterhin eine andere.
Verwendung von Schwarz Kennung n auf der Leitung 34.
>> So dass der Compiler, Clang, ist zu bemerken, dass es nur
nicht vorhanden ist, obwohl klar, dass es da visuell.
So eine einfache Lösung wird es dort erklärt.
>> Nun lassen Sie mich zum Blättern der Anfang der Datei.
Was springt dich an, als ein wenig anders
aus dem Material, das wir sahen letzte Woche?
Nicht nur, dass ich Namen, nicht nur Ich habe einige scharfe beinhaltet bis oben,
Ich habe etwas, was ich bin Aufruf eines Prototyps.
Nun, da sieht furchtbar ähnlich, was wir gerade gesehen vor einem Augenblick auf der Linie 27.
>> Lassen Sie uns also folgern aus einer anderen Fehlermeldung, warum ich das getan.
Lassen Sie mich gehen Sie vor und diese Zeilen zu löschen gibt.
Und so wissen wir nichts über Prototyp.
Remake diese Datei.
Machen Sie eine Funktion.
Und jetzt, verdammt, vier Fehler.
Lassen Sie uns nach oben auf die erste.
>> Implizite Deklaration der Funktion bekommen positive int ist ungültig in C99.
C99 bedeutet nur, das 1999 Version der Sprache
C, das, was wir in der Tat mit ist.
Also, was bedeutet das?
Nun C-- und insbesondere C compilers-- sind ziemlich dumm Programme.
Sie wissen nur das, was Sie haben, sagte sie, und das ist
tatsächlich thematischen von letzter Woche.
>> Das Problem ist, dass, wenn ich gehen über die Implementierung Namen hier oben,
und ich eine Funktion namens nennen GetPositiveInt hier auf der Linie 20,
diese Funktion technisch nicht bestehen, bis der Compiler sieht Leitung 27.
Leider ist der Compiler Dinge oben, unten, links, rechts zu tun,
so, weil es nicht gesehen dem Umsetzung der GetPositiveInt,
aber es sieht Sie versuchen es hier verbrauchen,
es nur geht, um bail-- schreien Sie mit einer Fehler nachrichten-- vielleicht
kryptisch, und nicht die tatsächlich kompilieren Sie die Datei.
>> Also eine so genannte Prototyp bis hier ist zwar redundant.
Wörtlich ging ich hier, und ich kopiert und eingefügt, und ich legen Sie ihn hier.
Leere wäre richtig, so dass wir wörtlich zu kopieren und diese Zeit.
Ich habe buchstäblich kopiert und eingefügt es.
Wirklich nur als wie ein Brotkrümel.
>> Ein wenig Ahnung, um den Compiler.
Ich weiß nicht, was das bedeutet noch nicht, aber ich versprach, die Sie
daß es schließlich existiert.
Und das ist, warum dies in line-- Linie 16-- endet mit einem Semikolon.
Es ist überflüssig, von Entwurf.
Ja?
>> Wenn Sie Ihre Bibliothek nicht verlinken zu the-- oh, gute Frage.
Sharp enthält Header-Datei Einschlüsse.
Müssen fast sollte BE-- immer an der Spitze sein
der Datei für eine similar-- für genau der gleiche Grund, ja.
Denn in Standard- io.h ist buchstäblich eine Linie
wie diese, aber mit dem Wort printf und mit seinen Argumenten und der Rückgabetyp.
Und so scharf, indem Sie beinhalten bis hier, was Sie tun buchstäblich
ist das Kopieren und Einfügen der Inhalte von jemand anderem geschrieben bis oben.
Dabei cluing Ihren Code ein, um die Tatsache, dass diese Funktionen nicht vorhanden sind.
Ja?
>> Absolut.
Also eine sehr kluge und richtige Lösung wäre, wissen Sie was?
Ich weiß nicht, was für ein Prototyp ist, aber ich weiß,
wenn ich verstehe, dass C ist nur dumm und überdenkt oben nach unten.
Nun versuchen wir es, was es will.
Lassen Sie uns diesen Code zu schneiden, fügen Sie ihn bis oben, und jetzt schieben Haupt unten.
Auch dies würde das Problem lösen.
>> Aber man konnte sehr leicht kommen mit ein Szenario, in dem die Notwendigkeit, B nennen,
B und vielleicht ruft zurück zu A. Diese ist die so genannte Rekursion
und wir werden darauf zurückkommen.
Und es kann oder auch nicht eine gute sein Sache, aber man kann auf jeden Fall
brechen diese Lösung.
>> Und außerdem würde ich behaupten, stilistisch,
vor allem, wenn Sie Ihre Programme werden diese lange und so lange,
es ist einfach super praktisch an der Spitze Haupt zu setzen
denn es ist das, was die meisten Programmierer gehen zu interessieren.
Und so ist es ein wenig sauberer, wohl, um es zu tun, wie
Ursprünglich habe ich es tat mit einem Prototyp auch
obwohl es ein wenig sieht auf den ersten Blick überflüssig.
Ja?
Es tut uns leid, können Sie es sagen, lauter?
>> Wenn Sie die Standorte der Schalter Umsetzung und der Prototyp?
Also das ist eine gute Frage.
Wenn Sie wieder erklären, diese nach unten hier, mal sehen, was passiert.
Also, wenn ich diese nach unten hier, du sagst.
Oh, sorry.
Lauter?
Noch lauter.
Oh, gute Frage.
Wäre es die Funktion ungültig?
Sie wissen, nach all den Jahren, habe ich haben nie einen Prototyp danach.
Also lassen Sie uns machen-1-Funktion nach tun.
>> [Murmelnd]
David J. MALAN: Oh, warten.
Wir haben immer noch alles bis oben setzen.
Also lassen Sie uns das tun hier, wenn ich mich richtig zu verstehen Ihre Frage.
Ich setze alles, einschließlich der Prototyp über Haupt,
aber ich setze den Prototyp unterhalb der Umsetzung.
>> Also, wenn ich eine machen, ich bin immer zurück error-- eine nicht verwendete Variable n.
Oh, da gibt.
Danke.
Mal sehen, bekommen wir das beheben.
Das ist eine andere Bug, also lasst uns ignorieren.
Lassen Sie uns ganz schnell ein Remake dieses.
>> OK, so dass die Daten nicht Argument durch Format-String
n-- oh, das ist, weil Ich änderte diese hier.
Alles klar, wir wissen, was die Antwort ist alles in Ordnung gehen zu--, hier gehen wir.
Ah, danke für die positive.
Alles klar, ich werde diesen Code beheben after-- ignorieren diese besondere Bug
da dies was-- es funktioniert, ist die Antwort.
>> So ist es nicht überschreiben was Sie gerade getan haben.
Ich vermute, dass der Compiler in einer solchen Weise geschrieben
dass es Ihr Prototyp ignorieren Weil der Körper, so zu sprechen,
der die Funktion hat bereits wurden höher implementiert.
Ich müsste eigentlich konsultieren Das Handbuch des Compilers
zu verstehen, wenn es andere Implikation, aber auf den ersten Blick
nur durch Ausprobieren und Experimentieren, scheint es keine Auswirkungen.
Gute Frage.
>> Also lassen Sie uns jetzt vorantreiben, bewegen weg von Nebenwirkungen, die
sind Funktionen, die so etwas wie visuell auf dem Bildschirm mit printf,
aber keinen Wert zurück.
Und Funktionen, die haben Rück Werte wie wir gerade gesehen haben einige.
Wir haben bereits gesehen diese Vorstellung von Umfang, und wir werden dies immer wieder zu sehen.
Aber jetzt wieder, verwenden Sie die Faustregel
dass eine Variable kann nur verwendet werden, Innenseite der zuletzt geöffneten
und geschlossenen geschweiften Klammern, wie wir sah in diesem speziellen Beispiel.
>> Und wie Sie wies darauf hin, es ist ein ability--
Sie könnten einige dieser Probleme zu lösen, indem eine Variable global
an der Spitze einer Datei.
Aber in fast allen Fällen würden wir auf, dass die Stirn runzeln,
und in der Tat auch nicht gehen in dieser Lösung für jetzt.
So jetzt ist das Essen zum Mitnehmen, dass Variablen haben diese Vorstellung von Umfang.
>> Aber jetzt einen Blick auf ein weiteres lassen trockenen Weg eigentlich auf der Suche
irgend ziemlich interessant Details der Implementierung.
Wie wir Informationen darstellen.
Und wir schon bei diesem sah in der ersten Woche der Klasse.
Mit Blick auf die Binaries, und erinnert uns der Nachkommastellen.
>> Aber erinnern aus der vergangenen Woche, dass C hat verschiedene Datentypen und Bündeln mehr,
aber die nützlichsten jetzt könnte dieser sein.
Ein char oder Charakter, der passiert, zu einem Byte oder acht Bits insgesamt sein.
Und das ist zu sagen, dass die Größe eines char ist nur ein Byte.
Ein Byte acht Bits, so bedeutet dies, dass wir stellen dar, wie viele Zeichen.
Wie viele Buchstaben oder Symbole auf der Tastatur
wenn wir ein Byte oder acht Bits.
Denken Sie zurück an Woche Null.
Wenn Sie acht Bits, wie viele Gesamtwerte
Sie stellen mit Muster von Nullen und Einsen?
One-- mehr.
Also insgesamt 256, wenn Sie Zählen beginnen bei Null.
Also, wenn Sie acht bits-- also, wenn wir hatten unsere Binär-Lampen bis hier wieder,
wir könnten diese Glühbirnen einzuschalten und aus einem von 256 einzigartige Muster.
>> Nun, das ist ein bisschen problematisch.
Nicht so sehr für Englisch und romanischen Sprachen, aber sicherlich
wenn Ihnen vorstellen, für Beispiel asiatische Sprachen, die
haben weit mehr als Symbole wie 26 Buchstaben des Alphabets.
Wir könnten tatsächlich benötigen mehr als ein Byte.
Und zum Glück in den letzten Jahren hat die Gesellschaft
angenommen, die andere Standards verwenden mehr als ein Byte pro Ladung.
>> Aber jetzt in C, der Standard- ist nur ein Byte oder acht Bits.
Eine ganze Zahl ist unterdessen vier Bytes, auch als 32 Bit bekannt.
Was bedeutet, was ist die größte mögliche Anzahl können wir mit einem int darstellen
scheinbar?
Mit einer Milliarde.
So ist es vier Milliarden zu geben oder zu nehmen.
2 auf den 32. Macht, wenn wir nehmen keine negativen Zahlen
und verwenden Sie nur alle positiven Zahlen, es ist vier Milliarden
geben oder nehmen Möglichkeiten.
Ein Schwimmer, mittlerweile ist eine andere Art der Datentyp in C. Es ist immer noch eine Nummer,
aber es ist eine reelle Zahl ist.
Etwas mit einem Komma.
Und es stellt sich heraus, dass C verwendet auch vier Bytes
Fließkommawerte repräsentieren.
>> Leider, wie viele schwimm Punktwerte gibt es in der Welt?
Wie viele reelle Zahlen gibt es?
Es gibt eine unendliche Nummer und für diese Angelegenheit
es gibt eine unendliche Anzahl von ganzen Zahlen.
So sind wir bereits Art von Graben wir uns hier ein Loch.
Wobei offenbar in computers-- an dest Programme in C geschrieben auf them--
kann nur so hoch wie zu zählen vier Milliarden geben oder nehmen,
und Fließkommawerte kann nur scheinbar
eine gewisse endliche Menge an Präzision.
Nur so viele Stellen nach ihre Komma.
>> Denn natürlich, wenn Sie haben nur 32 Bits,
Ich weiß nicht, wie wir gehen, um zu gehen dargestellt durch reale numbers-- wahrscheinlich
mit verschiedenen Mustern.
Aber es gibt sicherlich eine endliche Anzahl solcher Muster,
so auch hier, ist dies problematisch.
>> Jetzt können wir das Problem leicht zu vermeiden.
Wenn Sie nicht mit einem Schwimmer, Sie ein Doppel verwenden
in C, die Ihnen acht Bytes, die ist viel mehr möglich, Muster von Nullen
und Einsen.
Aber es ist immer noch endlich, die gehen zu sein, problematisch, wenn Sie Software schreiben
für Grafiken oder für ausgefallene mathematischen Formeln.
Sie könnten also eigentlich wollen zu zählen größer als die.
Eine lange long-- dumm named-- Auch acht Bytes oder 64 Bits,
und das ist doppelt so lang wie ein int, und es ist für eine lange Ganzzahl.
>> Spaß fact-- wenn ein int vier Bytes, wie lange ist eine lange in der Regel C?
Auch vier Bytes, aber lange lange ist acht Byte,
und das ist aus historischen Gründen.
>> Aber die jetzt zum Mitnehmen ist nur, dass Daten
in einem computer-- das ist, dargestellt werden ein physisches Gerät mit Strom,
es ist in der Regel Fahr diese Nullen und ones--
mit begrenzter Mengen an Präzision.
Also, was ist das Problem?
>> Nun gibt es ein Problem von Integer-Überlauf.
Nicht nur in C, sondern in Computer im Allgemeinen.
Zum Beispiel, wenn diese ist ein Byte im Wert bit--
so, wenn dies acht bit-- alle von denen sind die Nummer eins.
Was diese Nummer darstellt, wenn wir annehmen,
es ist alles positive Werte in binärer?
>> 255, und es ist nicht 256, weil Null ist der niedrigste Zahl.
So 255 ist die höchste , aber das Problem
ist wohl, dass ich es wollte erhöhen diese Variable,
wird mit insgesamt acht Bits wenn ich es zu erhöhen.
>> Nun, sobald ich eine einem auf alle diese diejenigen,
Sie können sich wohl vorstellen, nur visually-- wie die Durchführung einer mit decimals--
etwas los ist, nach links fließen.
Und in der Tat, wenn ich die Nummer hinzufügen man dies, was passiert, in binärer
ist, dass es wieder auf Null überläuft.
>> Also, wenn Sie nur nicht use-- einen int, aber ein einziges Byte auf ganze Zahlen zählen
in einem Programm, das von default-- sobald Sie bekommen 250, 251, 252, 253, 254,
255-- 0 kommt nach 255, das ist wahrscheinlich nicht das, was
ein Benutzer sowieso zufrieden.
>> Jetzt mittlerweile in Gleitkomma-Welt, Sie haben auch ein ähnliches Problem.
Nicht so sehr mit der größten number-- aber das ist immer noch ein Thema.
Aber mit der Menge an Fein dass Sie darstellen kann.
Werfen wir also einen Blick auf dieses Beispiel hier auch aus heutiger Quelle code--
float-0.c.
>> Und bemerken, dass es ein super einfaches Programm, das
sollten offenbar ausdrucken, was Wert?
Was wollen Sie wetten, das wird gedruckt auch wenn es ein bisschen neue Syntax
hier?
So hoffentlich 0.1.
So entspricht einem Zehntel denn ich tue 1 geteilt durch 10.
Ich Speichern der Antwort in einer Variablen namens f.
Diese Variable ist vom Typ Float, der ist ein Schlüsselwort, Ich habe gerade vorgeschlagen existierte.
>> Wir haben das nicht gesehen, aber Dies ist eine Art nette Art und Weise in printf
um wie viele Stellen geben Sie wollen, um nach einem Komma sehen.
Also diese Notation bedeutet nur, dass hier ist ein Platzhalter.
Es ist für eine Floating-Point- Wert, und oh, übrigens,
zeigen Sie sie mit dem Komma mit eine Zahl nach dem Komma.
Also das ist die Anzahl der signifikanten Stellen,
so zu sprechen, dass Sie vielleicht.
>> Also lassen Sie mich gehen Sie vor und tun Schwimmer machen-0, ./float-0,
und anscheinend 1 geteilt durch 10 ist 0,0.
Nun, warum ist das?
>> Wieder gut, ist der Computer unter mich buchstäblich, und ich habe 1 geschrieben
und ich geschrieben 10, und nehmen Sie eine Vermutung, was die angenommene Datentyp für diese beiden
Werte?
Int, ist es technisch etwas ein wenig anders.
Es ist typischerweise eine lange, aber es ist letztlich ein wesentlicher Wert.
Nicht eine Fließkommazahl.
>> Welches ist zu sagen, dass wenn diese ist ein int und das ist ein int,
Das Problem ist, dass der Computer nicht die Fähigkeit haben
noch zu speichern, dass Komma.
Also, wenn Sie tun, 1 geteilt 10 mit ganzen Zahlen
sowohl für den Zähler und Nenner, sollte die Antwort 0,1.
Aber die computer-- weil das sind integers--
nicht weiß, was mit dem 0,1 zu tun.
>> Also was ist es klar machen?
Es ist einfach zu werfen es weg, und was ich letztendlich sehen
ist 0,0, nur weil ich darauf bestanden, dass printf zeigen Sie mir eine Dezimalstelle.
Aber das Problem ist, dass, wenn Sie teilen eine ganze Zahl durch eine ganze Zahl,
Sie werden per Definition get-- von c-- eine ganze Zahl.
Und es wird nicht zu tun etwas schön und bequem
wie um sie herum bis zu der nächste ein oben oder unten.
Es wird abgeschnitten alles nach dem Komma.
>> Also einfach intuitiv, was ist wohl eine Lösung?
Was ist der einfachste Fix hier?
Ja?
Genau.
Warum wir nicht einfach behandeln, diese als effektiv Fließkommawerte
indem er sie in Schwimmern oder Doppelzimmer.
Und jetzt, wenn ich machen Schwimmer-0, oder wenn ich Schwimmer-1 zu kompilieren,
Das ist identisch mit was gerade vorgeschlagen.
Und jetzt habe ich zu tun Schwimmer-0, jetzt bekomme ich mein 0.1.
>> Nun, das ist erstaunlich.
Aber jetzt gehe ich zu tun etwas ein wenig anders.
Ich bin neugierig zu sehen, was wirklich geht unter der Haube,
und ich werde diesen Druck out bis 28 Nachkommastellen.
Ich möchte wirklich sehen, 0.1000-- ein infinite--
[Unverständlich] 27 Nullen nach diesem 0.1.
>> Na mal sehen, ob das was ich in der Tat zu bekommen.
Schwimmer machen-0 gleiche Datei.
./floats-0.
Lassen Sie uns Zoom auf die dramatische Antwort.
Die ganze Zeit, die Sie habe darüber nachgedacht 1 geteilt durch 10 ist, 10% oder 0,1.
Es ist nicht.
Wenigstens soweit die Computer besorgt.
>> Jetzt why-- OK, das komplette Lüge 1 geteilt durch 10 ist 0,1.
Aber das ist nicht why-- das Mitnehmen heute.
Also warum der Computer denken, anders als alle von uns auf dem Zimmer,
dass 1 geteilt durch 10 ist eigentlich, dass verrückt Wert?
Was ist der Computer, der offenbar?
Was ist das?
>> Es ist nicht überlaufen, an sich.
Überlauf ist in der Regel, wenn Sie wickeln um einen Wert.
Es ist diese Frage der Ungenauigkeit in einen Fließkommawert
wo Sie nur 32 oder vielleicht sogar 64 Bit.
Aber wenn es eine unendliche Anzahl der realen numbers--
Zahlen mit Dezimalstellen und Zahlen thereafter-- sicher
Sie repräsentieren können alle von ihnen.
So dass der Computer gegeben hat, uns die nächste Übereinstimmung
auf den Wert darstellen kann mit, dass viele Bits auf den Wert Eigentlich möchte ich,
das ist 0,1.
>> Leider, wenn Sie Mathematik zu tun beginnen, oder Sie
beginnen mit dieser Art von schwimmenden Punktwerte in wichtigen programs--
Finanz-Software, Militär software-- nichts
wo Wahrnehmung ist wahrscheinlich ziemlich wichtig.
Und Sie beginnen Zugabe Zahlen wie diese, und Anfang
diese Software ausgeführt mit wirklich großen Eingänge
oder für viele Stunden oder Lose Tage oder viele Jahre,
Diese winzig kleinen Fehler sicher können im Laufe der Zeit hinzu.
>> Jetzt als beiseite, wenn Sie jemals gesehen Superman 3 oder Office Space
und Sie sich vielleicht erinnern wie diese Jungs gestohlen
eine Menge Geld von ihrem Computer durch die Verwendung Fließkommawerte
und Addition der kleinen Reste, hoffentlich, dass Film
jetzt mehr Sinn macht.
Dies ist, was sie in Anspielung auf in diesem Film.
Die Tatsache, dass die meisten Unternehmen, die nicht aussehen würde
nach einer bestimmten Anzahl der Nachkommastellen,
aber das sind Bruchteile von Cent.
So können Sie damit beginnen, sie auf, Sie beginnen, eine Menge Geld zu machen
in Ihr Bankkonto.
Also das ist Office Space erläutert.
>> Jetzt leider über Office Space, gibt
sind einige beunruhigende rechtmäßig und erhebliche Auswirkungen
Diese Arten von zugrunde liegenden Design-Entscheidungen,
und in der Tat einer der Gründe wir verwenden C im Verlauf
ist, so dass Sie wirklich diesen Boden haben bis zu verstehen, wie Computer funktionieren,
wie die Software funktioniert und nicht nehmen nichts für selbstverständlich.
>> Und in der Tat leider, auch mit dass grundlegende Verständnis,
wir Menschen machen Fehler.
Und was ich dachte, ich würde zu teilen, ist Das achtminütige Video hier genommen
von einem Modern Marvels Episode, die ist eine pädagogische Show auf, wie Dinge funktionieren
dass zwei Bilder malt der, wenn eine missbräuchliche Verwendung
und das Verständnis der Fließkommawerte
führte zu einigen signifikanten unglücklichen Ergebnissen.
Lassen Sie uns einen Blick.
[VIDEO PLAYBACK]
-Wir Nun "Engineering zurück Katastrophen "auf Modern Marvels.
Computern.
Wir haben alle gekommen, um das zu akzeptieren oft frustrierend Probleme, die
bekam mit them-- Bugs, Viren und Software glitches-- zu kleinen Preisen
für die Bequemlichkeit zu zahlen.
Aber in High-Tech-und High-Speed Militär-und Raumfahrtprogramm Anwendungen,
das kleinste Problem kann in die Katastrophe vergrößert werden.
>> Am 4. Juni 1996 vorbereitet Wissenschaftler um eine unbemannte Rakete Ariane 5 starten.
Es wurde die Durchführung wissenschaftlicher Satelliten
genau, wie das zu schaffen Magnetfeld der Erde in Wechselwirkung
mit Sonnenwinde.
Die Rakete gebaut wurde der Europäischen Weltraumorganisation,
und sich von seinem Standort gehoben an der Küste von Französisch-Guayana.
>> -at Etwa 37 Sekunden in der Flug, sie zum ersten Mal
bemerkte etwas falsch lief.
Daß die Düsen schwenkbar in einer Art, wie sie sollten wirklich nicht.
Rund 40 Sekunden in die Flucht, klar das Fahrzeug war in Schwierigkeiten,
und das ist, wenn sie gemacht Die Entscheidung, es zu zerstören.
Der Bereich Sicherheitsbeauftragten, mit enormen Mut, drückte auf den Knopf
und sprengten die Rakete, bevor es zu einer Gefahr für die öffentliche Sicherheit.
>> Dies war das Mädchen Reise der Ariane 5,
und seine Zerstörung nahm Platz, weil der Fehler
in der Software der Rakete eingebettet.
-Der Problem auf der Ariane war, dass es
war eine Zahl, die erforderlich ist 64 Bit, um auszudrücken,
und sie umtauschen wollte es zu einer 16-Bit-Zahl.
Sie gingen davon aus, dass die Zahl war nie sehr groß zu sein.
Dass die meisten dieser Stellen in die 64-Bit-Zahl waren Nullen.
Sie waren falsch.
>> -Der Unfähigkeit eines Softwareprogramm zu akzeptieren,
die Art der Zahl, erzeugt durch ein anderer war an der Wurzel des Fehlers.
Software-Entwicklung hatte sich zu einem sehr kostspielig Teil der neuen Technologie.
Die Ariane-4-Rakete hatte sehr erfolgreich.
So viel von der Software erstellt Es wurde auch in der Ariane 5 verwendet.
>> -Der Grundproblem das war die Ariane-5.
Wurde faster-- schneller beschleunigt und die Software nicht für die bilanziert.
>> -Der Zerstörung der Rakete war eine enorme finanzielle Katastrophe.
Alle aufgrund eines Software-Fehlers Minute.
Aber das war nicht das erste Zeitdatenkonvertierungsprobleme
hatte modernen Raketentechnik geplagt.
>> -In 1991 mit dem Start des ersten Golfkriegs,
der Patriot-Raketen erlebt eine ähnliche Art
einer Reihe Konvertierungsproblem.
Und als Ergebnis 28 people-- 28 Amerikanischen soldiers-- wurden getötet,
und etwa hundert weitere verletzt.
Wenn der Patriot, der angeblich gegen eingehend Scud-Raketen zu schützen,
konnte eine Rakete abzufeuern.
>> -Wenn Irak in Kuwait einmarschierte und Amerika Desert Storm gestartet Anfang 1991,
Patriot Raketen-Batterien eingesetzt wurden zum Schutz Saudi-Arabien und Israel
von irakischen Scud-Raketenangriffen.
Der Patriot ist ein US-Mittelstrecken Boden-Luft-System
von der Raytheon Company.
>> -Der Größe des Patriot Abfangjäger itself--
es geht um rund 20 Meter lang, und es wiegt etwa 2000 Pfund.
Und es trägt einen Sprengkopf von etwa, Ich denke, es ist rund 150 Pfund.
Und der Gefechtskopf selbst ist eine hochexplosive, die
Fragmente hat um ihn herum.
So daß die Hülle des Gefechtskopfes ist ausgelegt, wie ein Schrotkugeln handeln.
>> -Die Raketen durchgeführt werden vier pro Container,
und von einem Sattelauflieger transportiert.
>> -Der Patriot-Raketenabwehrsystem geht mindestens 20 Jahren.
Es wurde ursprünglich entwickelt, als Luftabwehrraketen
zu schießen Sie feindliche Flugzeuge.
Im ersten Golfkrieg wenn dieser Krieg kam auf,
die Armee wollte es benutzen Scud-Raketen abzuschießen, keine Flugzeuge.
Die irakische Luftwaffe nicht so sehr ein Problem,
aber die Armee über Scud-Raketen besorgt.
Und so versuchten sie, Upgrade der Patriot.
>> -Intercepting Einen Feind Raketen Reisen mit Mach 5
sein würde genug Herausforderung.
Aber wenn der Patriot wurde in Dienst stürzte,
Die Armee war nicht bewusst ein irakischer Abänderung, daß
machten ihre fast scuds nicht zu.
>> Was ist passiert ist, dass die Scud-Raketen kamen in instabil waren.
Sie waren wackelig.
Der Grund dafür war die Iraqis-- um 600 Kilometer raus
von einem 300-Kilometer-Bereich missile-- nahm Gewicht aus der vorderen Gefechtskopf,
und aus der Gefechtskopf leichter.
So, jetzt die Patrioten versuchen zu kommen am Jagen, und die meisten der Zeit--
die überwiegende Mehrheit der Zeit-- es wäre nur fliegen durch die Scud.
>> -once Den Patriot Netzbetreiber realisiert der Patriot sein Ziel verfehlt,
sie den Sprengkopf detoniert Patriot , um mögliche Verluste zu vermeiden, wenn es
wurde auf den Boden fallen.
>> -Das War, was die meisten Leute sahen, so groß Feuerbälle in den Himmel,
und als missverstanden Abschnitte mit Scud-Sprengköpfe.
>> -Obwohl In den Nachthimmel, Patrioten zu sein schien erfolgreich zu zerstören
Scud-Raketen, bei Dhahran könnte es keinen Fehler über seine Leistung.
Dort werden die Patriot-Radarsystem verlor einer eingehenden Scud
und nie aufgrund gestartet zu einem Software-Fehler.
>> Es waren die Israelis, die zum ersten Mal entdeckt dass je länger das System eingeschaltet war,
desto größer ist der Zeitunterschied wurde.
Aufgrund eines Takt eingebettet in dem Computer des Systems.
>> -Über Zwei Wochen vor Die Tragödie in Dhahran,
die Israelis berichtet, das Verteidigungsministerium
dass das System Zeit zu verlieren.
Nach etwa acht Stunden Laufen, bemerkten sie
dass das System immer merklich weniger genau.
Das Verteidigungsministerium reagierte mit sagen alle der Patriot-Batterien
die Systeme nicht verlassen für eine lange Zeit.
Sie sagten nie, was eine lange Zeit war.
8 Stunden 10 Stunden, mehr als tausend Stunden.
Niemand wusste.
>> -Der Patriot-Batterie in der Kaserne stationiert
bei Dhahran und seine fehlerhaften internen Uhr befand sich in der über 100 Stunden gewesen
In der Nacht des 25. Februar.
>> -Es Verfolgt Zeit mit einer Genauigkeit von etwa einem Zehntel einer Sekunde.
Nun wird ein Zehntel einer Sekunde ist eine interessante Zahl
weil es nicht ausgedrückt werden können, in binärer genau, was
bedeutet, es kann nicht genau angegeben werden in jedem modernen digitalen Computers.
Es ist schwer zu glauben, aber dies als ein Beispiel.
>> Nehmen wir die Zahl ein Drittel.
Ein Drittel kann nicht sein, in dezimal ausgedrückt genau.
Ein Drittel ist 0,333 geht für die Unendlichkeit.
Es gibt keinen Weg, das zu tun, mit absolute Genauigkeit in eine Dezimalzahl.
Das ist genau die Art von Problem, das geschah in der Patriot.
Je länger das System lief, die schlechter die Zeitfehler wurde.
>> -after 100 Betriebsstunden, die Fehler in Zeit nur etwa ein Drittel
einer Sekunde.
Aber in Bezug auf Targeting ein Raketen Reisen bei Mach 5,
es ergab sich ein Tracking Fehler von mehr als 600 Metern.
Es wäre ein fataler Fehler sein für die Soldaten in Dhahran.
>> Was ist passiert wird eine Scud Start war von Frühwarnsatelliten entdeckt,
und sie wussten, dass eine Scud kam in ihrer allgemeinen Richtung.
Sie wussten nicht, wo es kam.
Es war nun an der Radar Bestandteil des Patriot-System
Verteidigung Dhahran zu finden und zu halten Spur der ankommenden feindlichen Rakete.
>> -Der Radar war sehr smart.
Es wäre tatsächlich verfolgen die Position der Scud
und dann vorhersagen, wo es wohl wäre,
das nächste Mal die Radar schickte einen Impuls aus.
Das war der Range-Gate bezeichnet.
>> -Dann Einmal Patriot entscheidet genug Zeit hat
geleitet, um zurück zu gehen und überprüfen Sie die nächsten Lage für dieses Objekt erkannt
es geht zurück.
Also, wenn es ging zurück in die falsche Ort, dann sieht kein Objekt.
Und es entscheidet, dass es kein Objekt.
, Dass es eine falsche Erfassung und es fällt die Strecke.
>> -Der Eingehenden Scud verschwunden vom Radarschirm,
und Sekunden später, schlug in der Kaserne.
Die Scud getötet 28.
Es war die letzte gefeuert während des ersten Golfkriegs.
Tragischerweise der aktualisierten Software in der Morgendämmerung kam am folgenden Tag.
Die Software Fehler hatte wurde behoben, Schließen
ein Kapitel in der unruhigen Geschichte des Patriot-Raketen.
>> [END VIDEO PLAYBACK]
>> David J. MALAN: Das ist es für CS50.
Wir werden Sie am Mittwoch sehen.
>> [Musik zu spielen]