[Musik spielt] DAVID J MALAN: All right, Willkommen zurück auf CS50. Dies ist der Beginn der zweiten Woche. Ein Wort von einem unserer Freunde auf dem Campus - wenn Sie interessiert sind, möglicherweise, entweder jetzt oder in Zukunft Begriff noch einmal komfortabler, Lehre Schüler der Mittelstufe ein wenig etwas über Informatik, tun Kopf zu dieser URL. Sie sind in besonderer Bedarf jetzt von Lehrer, vor allem, wenn Sie hatten einige der Exposition gegenüber der Informatik. So erinnern daran, dass beim letzten Mal, haben wir einige Datentypen in C, und Sie fing an, Ihre Hände schmutzig mit diesen bisher Problem in einem Set. Und wir hatten eine char. So etwas in technischer Hinsicht, was ist ein Zeichen, wie Sie sie heute kennen? So ist es ein Zeichen, aber wir genauer jetzt. Was verstehen wir unter Zeichen bedeuten oder einzelne char? Ein nicht-numerischen Zeichen - so nicht unbedingt. Es stellt sich heraus, dass gerade Zahlen, auch Satzzeichen und Buchstaben sind vertreten mit diesen Daten geben bekannt als char. Es ist also nicht unbedingt alphabetisch. Ja? So ist es ein ASCII-Zeichen. Also, wenn Sie denken Sie zurück an Woche Null, wenn hatten wir unsere Byte von Freiwilligen kommen und entweder halten ihre Hände oder nicht alle, vertreten sie Bits. Aber gemeinsam als eine Gruppe von acht, sie repräsentiert ein Byte. Und haben wir die Vorstellung von ASCII zu diesem Vortrag, der ist einfach ein Mapping zwischen Zahlen und Buchstaben. Und ASCII Anwendungen, da diese Menschen implizierte, acht Bits zur Darstellung eines Zeichens. So Dementsprechend kann, wenn acht Bits jeweils an einer der zwei Werte annehmen - Null oder Eins - Das heißt, es gab zwei Möglichkeiten für diese Person - Null oder Eins - zwei für diese Person, zwei für diese Person, zwei für diese ein. Also insgesamt zwei mal zwei mal zwei mal zwei mal zwei - so zwei der achte insgesamt. So gibt es eine Gesamtzahl von Zeichen 256 möglich, dass man stellen mit acht Bits. Nun, diejenigen von Ihnen, sprechen Asian Sprachen vielleicht wissen, dass es mehr Zeichen in der ganzen Welt als nur As und Bs und Cs und Ds. Und in der Tat, nicht ASCII nicht ausreichen viele Sprachen der Welt. Aber mehr dazu ein andermal. Denn jetzt wissen, dass in C, wenn Sie wollen, einen Brief, ein Stück vertreten Zeichensetzung, oder einfach nur etwas Charakter in der Natur, verwenden wir ein Zeichen. Und es ist ein Byte oder acht Bits. Wie wäre es mit einem int? Nun, das ist eine ganze Zahl ein int. Wie viele Bits, wenn Sie sich erinnern, war eine ganze Zahl in der Regel? Jeder Rückruf? So ist es in der Regel 32. Es hängt tatsächlich auf dem Computer dass Sie verwenden. Aber in dem Gerät, und in einer Menge von Computer, es ist 32 Bit oder vier bytes - acht Mal vier. Und ints sind nur für die Speicherung verwendet Zahlen, entweder negativ, positiv oder Null ist. Und wenn du hast 32 Bit und Sie nur kümmern positiven Zahlen können jemand Baseballstadion, wie viele mögliche Zahlen a Computer darstellen kann Null auf bis? Es wäre also zwei der 32, die ist rund vier Milliarden Euro. Also diese Potenzen von zwei sein werden wiederkehrende Themen in der Informatik. Wie wir sehen werden, sind sie sehr bequem mit, auch wenn es nicht ganz funktioniert leicht, die Mathematik im Kopf zu tun. So sagen wir etwa vier Milliarden Euro. Jetzt, ein langer, langer - Sie können Art Vermutung. Es ist mehr als ein int. Wie viele Bits? So 64 Bit oder acht Bytes. Dies bedeutet nur, Sie können sogar vertreten größere Zahlen, größere positive oder größere negative Zahlen. Und wie wäre es mit schwimmen? Das ist eine Gleitkomma Wert von 32 Bits. Dies ist nur eine reelle Zahl, etwas mit einem Komma. Aber wenn Sie stattdessen brauchen mehr Orte nach dem Komma oder Sie wollen stellen eine größere Anzahl mit einigen Fraktion nach, können Sie ein Doppel-, ist die 64 Bit. Aber es ist eine interessante Lieferservice hier. Also, wenn ints werden von 32 Bit und begrenzt auch lange sehnt sich auf 64 begrenzt Bits, diese Art der die Frage aufwirft, was ist, wenn Sie wirklich wollen, zählen mehr als 4 Milliarden Euro für einen int? Nun, verwenden Sie einfach eine lange lange. Aber was, wenn Sie wollen höher zählen als zwei der 64., geben oder nehmen? Nun, das ist eine riesige Anzahl. Aber schließlich, könnten Sie eigentlich kümmern uns um diese Arten von Werten, vor allem, wenn Sie eine Datenbank und beginnen, viel, viel zu sammeln und viele Daten und Zuweisen von eindeutigen Zahlen zu jedem Stück dieser Daten. Also wir irgendwie ein Problem haben. Und ähnlich, mit Gleitkomma Werte - Schwimmer oder Doppelzimmer - wenn Sie haben nur eine begrenzte Anzahl von Bits, konnte wie viele Gesamtzahlen Sie möglicherweise stellen? Nun, es ist weniger klar, wenn man beinhalten eine Dezimalstelle. Aber es ist sicherlich begrenzt. Wenn Sie haben eine begrenzte Anzahl von Bits, eine endliche Anzahl von Menschen, eine endliche Zahl der Glühbirnen, sicherlich können Sie stellen nur eine endliche Anzahl von Gleitkomma-Werte. Aber wie viele reelle Zahlen sind ihre in der Welt? Es gibt eine unendliche. So, dass ist ein bisschen ein Problem, weil wir nicht über eine unendliche Menge von RAM-Speicher oder in unserer Computer. So einige anspruchsvolle Dinge passieren können. Also lasst uns weitermachen und versuchen das hier zum Ausdruck bringen. Lassen Sie mich gehen Sie vor und eröffnen gedit. Ich werde weitermachen und Speichern einer Datei genannt "floats0.c" nur um in Übereinstimmung mit einem Beispiel, das ist online zur Verfügung, wenn Sie möchten. Und ich werde weitermachen und wie folgt definieren - Ich werde weitermachen und sagen, int Haupt Leere, wie wir oft tun. Und dann in diesem Programm, ich bin zu gehen erkläre mich einen Schwimmer, so dass eine 32-Bit- Variable namens f, willkürlich. Und dann werde ich es in speichern Ich weiß es nicht, ein Zehntel, also 0,1. So werde ich zum Ausdruck bringen, dass eine geteilt durch 10 ist die perfekt legitim in C. Und dann in der zweiten Zeile, habe ich einfach ausdrucken wollen diesen Wert. So erinnern die wir nutzen können die bekannte printf. Wir wollen nicht zu verwenden i% für einen int. Wir wollen% f für einen Schwimmer zu verwenden. Und dann werde ich Backslash n tun, close Zitat, Komma, f, Semikolon. Also hier ist mein Programm. Es gibt bereits einen Bug. Hat jemand für die diese angeklickt schon wollen mindestens hinweisen ein Fehler, den ich gemacht habe? Ja? Ja. Ich habe "# include" bei der top, Symptom sie davon, wenn ich versuche, kompilieren, das wird sein, dass die Compiler wird schreien mich an, sagen undefined symbol oder etwas in diesem Sinne. Es ist nicht zu verstehen, etwas mag printf. Also werde ich tun "# include "Speichern Sie die Datei. Und jetzt ist es besser in Form. Aber ich werde auch darauf hinweisen heraus ein neues Detail heute. Zusätzlich zur Angabe Ort Inhaber wie% f% i% s, können Sie manchmal beeinflussen das Verhalten dieser Platzhalter. Zum Beispiel in dem Fall einer schwimmende Punktwert, wenn ich nur will auf eine Dezimalstelle nach der Anzeige Zeit kann ich eigentlich tun 0.1f. Mit anderen Worten, die separate I f und das Prozentzeichen mit 0,1, nur printf erzählen, haben Sie vielleicht eine ganze Reihe von Zahlen nach dem Komma Punkt für mich. Aber ich will nur einen von ihnen zu sehen. Also werde ich jetzt nach vorne gehen und sparen Dieses Programm, das in meinem Terminal gehen Fenster, und ich werde weitermachen und make float 0, geben. Ich sehe, dass etwas kryptischen Zeile, die beginnen, mehr Sinn, als wir machen necken sie auseinander diese und nächste Woche. Jetzt werde ich weitermachen und führen float Null. Und, verdammt. So gibt es einen anderen Fehler hier aus irgendeinem Grund. Ich bin mir ziemlich sicher, dass ein Zehntel oder eine durch 10 geteilt, ist nicht 0.0. Vielleicht bin ich nicht auf der Suche an genügend Stellen. Also, warum nicht ich sagen, zwei 0,2 bis zwei sehen Dezimalstellen anstelle von nur einem. Lassen Sie mich zurück zu meinem Terminal-Fenster hier treffen sich ein paar Mal um siehe meine Geschichte. Sie machen schweben wieder Null, und dann wieder hoch. Und jetzt geben. Und jetzt bin ich ziemlich sicher, dass dies falsch ist. Und was ich tun konnte drei und vier, und ich bin wahrscheinlich zu halten sehen Nullen. Also, wo ist der Fehler? Eine durch 10 geteilt sollte 0,1 sein. Jemand will einen Stich an, was nehmen die grundlegende Frage ist? Ja? Sie sind beide Zahlen. So what? Also mit einem durch 10 geteilt, das ist was kann ich tun in der Arithmetik. Und ich bekomme 0.1. Ja. Und so ist es in der Tat, dass Problem. Wenn Sie nehmen eine ganze Zahl in einem Computer und teilen Sie sie durch eine andere ganze Zahl ist, der Computer ist standardmäßig auf los davon ausgehen, dass Sie eine ganze Zahl wollen. Das Problem ist aber natürlich ist dass 0,1 keine ganze Zahl ist. Es ist eine reelle Zahl ist. Und so, was der Computer tut, indem Standardmäßig ist es nur wegwirft alles nach dem Komma. Es muss nicht rund nach unten oder oben per se. Es ist einfach alles wegwirft nach dem Komma. Und nun, die Sinn macht. Denn jetzt sind wir deutlich links mit Null. Aber warten Sie eine Minute. Ich bin nicht da ein int Null. Ich bin eigentlich sehen 0.00. So wie ich das jetzt zu versöhnen? Wenn man durch 10 geteilt Null ist, aber ich bin Sehen 0,00 wird, wo es immer zurück auf eine reelle Zahl umgewandelt? Ja. Genau. Also hier in Zeile fünf, wenn ich tatsächlich speichern, die 0,1, die dann abgeschnitten Null, in der ein Schwimmer, das ist effektiv äquivalent zu Speicherung nicht als int, sondern in der Tat, als Schwimmer. Darüber hinaus bin ich dann mit printf explizit drucken diese Zahl auf zwei Dezimalstellen obwohl vielleicht nicht eigentlich jeder sein. Also diese Art von saugt, nicht wahr? Anscheinend kann man nicht rechnen, zumindest auf dieser Ebene der Präzision in einem Computer. Aber sicherlich gibt es eine Lösung. Was ist die einfachste Lösung könnten wir vielleicht tun, auch nur hier, um intuitiv dieses Problem lösen? Ja? Drehen Sie die Zahlen in - ja. Auch wenn ich mir nicht ganz sicher, was wirklich los hier, wenn es grundsätzlich hat mit diesen beiden zu tun Sein ints, na ja, warum nicht ich machen, dass 10,0, so dass diese 1.0, speichern Sie die Datei. Lassen Sie mich wieder nach unten gehen, um die Boden und neu kompilieren. Lassen Sie mich nun erneut. Und es gibt - nun, ich habe meine ein Zehntel dargestellt als 0,10. In Ordnung. Also das ist nicht schlecht. Und lassen Sie mich darauf hinweisen, einen anderen Weg konnten wir diese gelöst haben. Lassen Sie mich tatsächlich wieder rollen in der Zeit wann hatten wir dies als eine Zehntel vor einem Augenblick. Und lassen Sie mich gehen Sie vor und speichern Sie diese Datei als einem anderen Dateinamen, um nur habe ein kleines Checkpoint. Das war also eine Version. Und jetzt lassen Sie mich gehen Sie vor und Führen Sie eine weitere Version. Wir nennen diese Version zwei Null indiziert. Und ich werde tun, anstatt diese - wissen Sie was? Hinzufügen von Punkt Null arbeitet in diesem Fall. Aber angenommen, man waren eine Variable. Vermeintliche 10 waren eine Variable. In anderen Worten, die ich nicht annehmen konnte nur hartcodieren .0 am Ende dieser arithmetischen Ausdruck. Nun, ich kann tatsächlich etwas tun in Klammern genannt Gießen. Ich kann das ganze Zahl 10 mit einem Schwimmer gegossen, und ich kann diese Zahl ein, um ein gegossen schweben, wie gut. Dann ist die Mathematik, die gehen zu tun ist effektiv 1,0 dividiert durch 10,0, zur Folge hat, geht in f wie zuvor. Also, wenn ich neu kompilieren dies als Schwimmer machen 2, und nun schwebt 2, bekomme ich die gleiche beantworten, wie gut. Das ist also ein ziemlich konstruiertes Beispiel, Zur Lösung dieses Problems indem Gießen. Aber im Allgemeinen ist Gießen sein wird eine mächtige Sache, vor allem für Problem stellte zwei in einer Woche, wenn Sie wollen einen Datentyp konvertieren eine andere, am Ende des Tages werden in der gleichen Art und Weise dargestellt. Am Ende des Tages, jeder einzelne was wir gesprochen haben bisher ist nur ints unter der Haube. Oder wenn das ist zu Low-Level für Sie, sie sind nur Zahlen unter der Haube. Auch Zeichen, wieder erinnern von Woche Null, sind Zahlen unter der Haube. Welches ist zu sagen, wir können zwischen konvertieren verschiedene Arten von Zahlen, wenn sie sind nur Bits. Wir können zwischen Zahlen umwandeln und Briefe, wenn sie sind nur Bits, und umgekehrt. Und Gießen auf diese Weise ist ein Mechanismus in der Programmierung können Sie das zwangsweise ändern einem Datentyp in einen anderen. Leider ist dies nicht als einfach, wie ich vielleicht gewünscht hätte. Ich gehe zurück in Schwimmern 1, war das die einfachere, einfach eins mit .0 Hinzugefügt auf jeden. Und nur als kurze Auffrischung, lassen Sie mich gehen und kompilieren Dazu machen Schwimmern 2 - Leider ist der Schwimmer machen 1. Und nun lasst uns laufen schwimmt 1. Und in der unteren, bemerken dass ich tatsächlich bekommen 0,1. So, Problem gelöst. Aber noch nicht. Ich gehe jetzt, um ein wenig neugierig, und ich werde zurück in meine printf Anweisung und sagen, weißt du was? Ich möchte, dass dies zu bestätigen ist wirklich ein Zehntel. Und ich werde sehen wollen , sagen wir, fünf Dezimalstellen. Es ist nicht ein Problem. Ich die zwei bis fünf, Ich kompilieren mit zu machen. I erneut als 1 schwimmt. Sieht ziemlich gut aus. Meine Gesundheit Kontrollen könnte es beenden, aber Ich bin immer ein wenig abenteuerlicher. Ich werde 0,5-0,10 ändern. Ich will 10 Stellen nach sehen die Dezimalstelle. Und ich werde weitermachen und neu kompilieren dies und erneut schwimmt 1. Ich Art von Bedauern mit diesem getestet weiter, weil mein Mathe ist nicht so mehr korrigieren, so scheint es. Aber warten Sie eine Minute, vielleicht das ist nur ein Zufall. Vielleicht ist der Computer handelt ein wenig seltsam. Lassen Sie mich gehen Sie vor und machen 20 Dezimalstellen und versichern mir, dass ich weiß, wie Mathematik zu tun. Ich weiß, wie man programmiert. Als Schwimmer 1, neu zusammenstellen, verdammt noch mal. Das ist wirklich, wirklich immer weit von der Marke. Also, was ist denn hier los? Intuitiv auf unseren Annahmen früher über die Größe der Datentypen was ist hier geschehen unter der Haube? Ja? Genau. Wenn Sie wollen, dass diese viel Präzision und das ist eine verdammt viel Präzision - 20 Zahlen nach dem Komma. Du kannst nicht stellen ein beliebige Zahl, wenn Sie ein haben beliebige Anzahl von Bits. Aber wir tun es nicht. Für einen Schwimmer, wir haben nur 32 Bit. Wenn also 32 Bit nur in einem permutiert Weise - genau wie unsere Menschen auf, Bühne Hände nach oben oder unten - in einer endlichen Anzahl von Möglichkeiten, es gibt nur eine begrenzte Anzahl der reellen Zahlen Sie repräsentieren mit diesen Bits. Und damit der Computer schließlich wird gehen zu müssen, fang an zu schneiden Ecken. Der Computer kann diese Details verbergen von uns für ein wenig Zeit. Aber wenn wir anfangen Stossen auf die Zahlen und suchen weiter und weiter in die Hinterkante Zahlen in der ganzen Zahl, dann beginnen wir zu sehen, dass es tatsächlich annähernd die Idee von einem Zehntel. Und so stellt sich heraus, tragisch, es gibt eine unendliche Anzahl von Zahlen können wir nicht genau darstellen in eine Computer mindestens mit einer endlichen Anzahl von Bits, eine endliche Menge an RAM. Nun leider das manchmal hat reale Konsequenzen. Wenn die Menschen nicht recht zu schätzen oder irgendwie für selbstverständlich die Tatsache, dass ihre Computer einfach, was sie sagen, es zu tun und nicht verstehen diese zugrunde liegenden Darstellung Details - davon, ehrlich gesagt, in einigen Sprachen sind versteckt vom Benutzer, im Gegensatz zu C - einige schlechte Dinge passieren können. Und was ich dachte, wir hätten tun ist ein Schritt zurück. Und hier geht es um eine Acht-Minuten-Video. Es lüftete vor ein paar Jahren, und es gibt Einblicke in eigentlich das, was gehen kann falsch, wenn Sie unter-schätzen diese Arten von Informationen in der allzu sehr realen Welt. Wenn wir könnten die Beleuchtung dimmen für ein paar Minuten. Sprecher 1: Wir kommen jetzt zu Engineering zurück Katastrophen auf Modern Marvels. Computer - wir alle kommen, um das zu akzeptieren oft frustrierenden Probleme dass mit ihnen zu gehen. Bugs, Viren-und Software-Pannen sind kleine Preise, die für die zahlen Komfort. Aber in High-Tech-und High-Speed Militär-und Raumfahrt Anwendungen, die kleinste Problem kann in die Katastrophe vergrößert werden. Am 4. Juni 1996 vorbereitet Wissenschaftler Start einer unbemannten Rakete Ariane 5. Es trug wissenschaftliche Satelliten entwickelt, um genau wie zu etablieren das Erdmagnetfeld interagiert mit Sonnenwind. Die Rakete wurde von der Europäischen gebaut Weltraumorganisation und sich von seiner angehobenen Anlage an der Küste von Französisch-Guayana. JACK Ganssle: Bei etwa 37 Sekunden in die Flucht, sie zum ersten Mal bemerkt etwas schief lief. Die Düsen wurden in schwenkbarer ein Weg, sie sollten wirklich nicht. Etwa 40 Sekunden nach dem Flug deutlich das Fahrzeug war in Schwierigkeiten. Und das ist, wenn sie einen Entscheidung, es zu zerstören. Der Bereich Safety Officer, mit enormen Mut, drückte auf den Knopf, explodierte die Rakete, bevor es könnte zu einer Gefahr für die öffentliche Sicherheit. Sprecher 1: Das war die Jungfernfahrt der Ariane 5 und der Zerstörung erfolgte aufgrund eines Fehlers eingebettet in der Rakete Software. JACK Ganssle: Das Problem an der Ariane war, dass es eine Reihe dass erforderliche 64 Bit zu äußern. Und sie wollte konvertieren einem 16-Bit-Zahl. Sie gingen davon aus, dass die Anzahl war nie wird sehr groß, dass die meisten diese Stellen in der 64-Bit Zahl waren Nullen. Sie waren falsch. Sprecher 1: Die Unfähigkeit einer Software Programm, um die Art akzeptieren Zahl durch eine andere erzeugt wurde an der Wurzel des Scheiterns. Software-Entwicklung hatte sich zu einem sehr kostspielige Teil der neuen Technologie. Die Ariane-4-Rakete war sehr gewesen erfolgreich, so viel von der Software erstellt für sie war auch verwendet in der Ariane 5. PHILIP COYLE: Das grundlegende Problem war dass die Ariane 5 war schneller, beschleunigt schneller. Und die Software hatte nicht entfielen dafür. Sprecher 1: Die Zerstörung der Rakete war ein riesiges finanzielles Desaster, allem auf eine Minute Softwarefehler. Aber das war nicht das erste Mal Daten Konvertierung Probleme geplagt hatte modernen Raketentechnik. JACK Ganssle: Im Jahr 1991, mit dem Beginn des ersten Golfkriegs, der Patriot Rakete erlebt eine ähnliche Art einer Reihe Umwandlung Problem. Als Ergebnis wurden 28 amerikanische Soldaten getötet und etwa 100 weitere verletzt wenn der Patriot, der sollte gegen eingehende Scuds zu schützen, versäumt, eine Rakete abzufeuern. Sprecher 1: Als der Irak in Kuwait einmarschierte und America startete Desert Storm in Anfang 1991 Patriot Raketen-Batterien wurden eingesetzt, um Saudi-Arabien zu schützen und Israel von irakischen Scud Raketenangriffe. Der Patriot ist ein US-Mittelstreckenraketen Boden-Luft-System hergestellt von die Firma Raytheon. THEODOR postol: Die Größe des Patriot Abfangjäger selbst ist 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 ein hochexplosive die hat Fragmente um ihn herum. Das Gehäuse der Gefechtskopf ausgelegt wie Schrot handeln. Sprecher 1: Die Raketen sind vier durchgeführt pro Container und transportiert werden von einem Sattelauflieger. PHILIP COYLE: Die Patriot-Anti-Raketen System geht zurück mindestens 20 Jahren. Es wurde ursprünglich als entworfen ein Luftabwehrflugkörper zu abzuschießen feindliche Flugzeuge. In dem ersten Golfkrieg, als dass der Krieg kam, wollte die Armee, es zu benutzen abzuschießen Scuds, nicht Flugzeuge. Die irakische Luftwaffe war nicht so sehr ein Problem. Aber die Armee über Scuds besorgt. Und so versuchten sie zu aktualisieren der Patriot. Sprecher 1: Abfangen eine feindliche Rakete Reisen mit mach fünf Jahre alt war gehen, um genug eine Herausforderung sein. Aber wenn der Patriot wurde in gehetzt Service, war die Armee nicht bewusst ein Irakischen Modifikation gemacht, die ihre Scuds fast unmöglich zu schlagen. THEODOR postol: Was ist passiert ist die Scuds, die waren kommen in waren instabil. Sie wurden Wackeln. Der Grund dafür war die Iraker, in Um 600 Kilometer raus aus ein 300-Kilometer-range missile, nahm Gewicht aus dem vorderen Sprengkopf. Sie machten der Gefechtskopf leichter. So, jetzt die Patriot versucht an der Scud kommen. Und die meisten der Zeit, die überwältigende Mehrheit der Zeit, wäre es nur fliegen durch die Scud. Sprecher 1: Nachdem die Patriot-System Betreiber erkannte das Patriot verpasst ihr Ziel, sie den Patriots gezündet Sprengkopf zu vermeiden möglich Opfer, wenn es erlaubt wurde auf den Boden fallen. THEODOR postol: Das war, was die meisten Menschen sahen wie große Feuerbälle in den Himmel und wie fängt missverstanden von Scud Sprengköpfe. Sprecher 1: Obwohl in den Nachthimmel Patriots erschien, um erfolgreich zu sein zerstören Scuds bei Dhahran es konnte kein Fehler sein, über seine Leistung. Dort verloren die Patriots Radarsystem Spur eines eingehenden Scud und nie startete aufgrund eines Software-Fehlers. Es war die Israelis, die zum ersten Mal entdeckt Je länger das System war, desto größer ist die Zeitabweichung wurde durch ein Taktsignal eingebettet in das System der Computer. JACK Ganssle: Etwa zwei Wochen vor dem Tragödie in Dhahran, die Israelis berichtet, das Verteidigungsministerium dass das System Zeit zu verlieren. Nach etwa acht Stunden läuft, sie bemerkt, dass das System zusehends ungenauer. Das Verteidigungsministerium reagierte mit sagt allen der Patriot-Batterien nicht zu verlassen, die Systeme für eine lange Zeit. Sie habe nie gesagt, was für eine lange Zeit war. Acht Stunden? 10 Stunden? 1000 Stunden? Niemand wusste. Sprecher 1: Die Patriot-Batterie stationiert in der Kaserne in Dhahran und seine interne Uhr fehlerhaft gewesen auf über 100 Stunden in der Nacht 25. Februar. JACK Ganssle: Es verfolgt Zeit, um ein Genauigkeit von etwa einem Zehntel einer Sekunde. Nun ist eine Zehntelsekunde ein interessante Zahl, weil es kann nicht sein ausgedrückt in binäre genau, was bedeutet, es kann nicht genau ausgedrückt werden einem modernen digitalen Computers. Es ist schwer zu glauben, aber Verwenden Sie diese als Beispiel. Nehmen wir die Nummer eins Drittel. Ein Drittel kann nicht ausgedrückt werden in Nachkommastelle genau. Ein Drittel ist 0.333 gehen on für die Unendlichkeit. Es gibt keine Möglichkeit, dass mit zu tun absolute Genauigkeit in Dezimalstellen. Das ist genau die gleiche Art von Problem das geschah in der Patriot. Je länger das System lief, die Schlimmste der Zeitfehler wurde. Sprecher 1: Nach 100 Betriebsstunden, die Fehler in der Zeit nur etwa ein Drittel einer Sekunde. Aber in Bezug auf Targeting eine Rakete Reisen mit mach fünf, führte es in ein Tracking Error von über 600 Metern. Es wäre ein fataler Fehler sein die Soldaten bei Dhahran. THEODOR postol: Was passiert ist, ist ein Scud Einführung wurde von früh erkannt Warnung Satelliten. Und sie wusste, dass die Scud kam in ihrer allgemeinen Richtung. Sie wussten nicht, wo es kam. Sprecher 1: Es war nun an dem Radar Bestandteil des Patriot-System Verteidigung Dhahran zu lokalisieren und zu halten Verfolgen Sie die ankommenden feindlichen Rakete. JACK Ganssle: Das Radar war sehr smart. Es wäre tatsächlich verfolgen die Position des die Scud und dann vorhersagen, wo es wohl das nächste Mal sein das Radar schickte einen Impuls aus. Dass hieß der Bereich Tor. THEODOR postol: Dann, wenn der Patriot entscheidet genug Zeit verstrichen ist, um zu gehen zurück und überprüfen Sie die nächste Position für Diese erfassten Objekt, geht es zurück. Also, wenn es ging zurück in die falsche Ort, es sieht dann kein Objekt. Und es entscheidet, dass es keine Rolle spielt, es war eine falsche Erfassung und lässt den Track. Sprecher 1: Der eingehende Scud verschwunden vom Radarschirm und Sekunden später knallte in der Kaserne. Die Scud getötet und 28 war die letzte feuerte während des ersten Golfkriegs. Tragischerweise kam die aktualisierte Software bei Dhahran am folgenden Tag. Die Software Fehler festgesetzt worden war, Schließen eines Kapitels in der unruhigen Geschichte der Patriot Raketen. Patriot ist eigentlich eine Abkürzung für Phased Array aufspürenden Fangen des Ziels. DAVID J MALAN: All right, so ein ernüchternd Beispiel sicher zu sein. Und zum Glück, diese untere Ebene Bugs sind nicht etwas, dass wir haben in der Regel zu schätzen, sicherlich nicht mit einigen unserer frühesten von Programmen. Vielmehr sind die meisten Bugs du wirst Begegnung wird logisch in der Natur, syntaktische in der Natur, wobei die Code einfach nicht richtig funktionieren. Und Sie wissen, dass es ziemlich schnell. Aber vor allem, wenn wir bekommen, um die Ende des Semesters, es zu gehen werden mehr und mehr von einer Möglichkeit, wirklich schwer denken über die Gestaltung Ihrer Programme und der zugrunde liegenden Darstellung auch dort der Daten. Zum Beispiel werden wir Ihnen MySQL, Das ist eine beliebte Datenbank-Engine dass man mit Websites zu verwenden Speichern von Daten auf dem Back-End. Und du musst anfangen zu entscheiden, das Ende des Semesters nicht nur, was Arten von Daten entlang dieser Linien zu bedienen aber genau, wie viele Bits zu verwenden, ob Sie wollen, um Daten zu speichern wie Datums-und Zeitangaben als Zeiten, und auch Dinge wie, wie groß wollen Sie das eindeutige IDs für, sagen wir, die Nutzer in Ihrer Datenbank. In der Tat, wenn einige von euch gehabt haben Facebook-Konten seit geraumer Zeit, und Sie wissen, wie man Zugang zu erhalten Ihre Benutzer-ID - die manchmal zeigt sich in Ihrem Profil-URL sofern du gewählt Spitznamen für den URL, oder wenn Sie Gebraucht Facebooks Graph API, die öffentlich zugängliche API, mit dem Sie Facebook kann für Rohdaten fragen - Sie können sehen, was Ihre numerische ID ist. Und vor einigen Jahren, im Wesentlichen Facebook musste von der Nutzung verändern das Äquivalent von ints zu lange mit lange, denn im Laufe der Zeit als Nutzer kommen und gehen und schaffen viele Konten und Fake-Accounts, auch sie sehr leicht konnten so etwas wie ein 4 erschöpfen Milliarden möglichen Wert wie ein int. Also mehr auf diese Art von Fragen auf der Straße, als auch. Na gut, das war also Gießen. Das war Ungenauigkeit. Ein paar schnellen Ankündigungen. So Abschnitte beginnen offiziell am kommenden Sonntag, Montag, Dienstag. Sie werden per E-Mail zu hören im Laufe dieser Woche um Ihre Abschnitt Zuordnung. Und du wirst auch hier an dieser Stelle, wie Ihren Abschnitt ändern, wenn Ihr Zeitplan hat sich nun geändert oder Ihre Komfort hat sich nun geändert. Inzwischen P-Satz eins und eins sind Hacker wegen diesem Donnerstag mit der Option, Verlängerung dieser Frist die pro Spezifikationen bis Freitag in typischer Weise. Erkenne, dass mit dem Problem enthalten Satz Spezifikationen sind Anweisungen auf wie das Gerät zu benutzen ist CS50, Marke, sowie einige spezifische Instrumente CS50 wie Stil 50, die Sie bereitstellen können mit Feedback dynamisch auf die Qualität Ihres Codes Stil und auch Check 50, die können Ihnen mit dynamische Rückmeldung bezüglich Ihrer Code des Richtigkeit. Verzeihen Sie, dass wir immer noch Bügeln aus ein paar Knicke mit Check 50. Ein paar von deinen Klassenkameraden, hat starten um 04.00 Uhr am Freitagabend, wenn die spec ging seitdem bemerkt haben ein paar Bugs, die wir arbeiten durch, und entschuldige mich für alle, die erlebt hat unnötige Frustrationen. Der Fehler ist meins. Aber wir werden im Nachgang zu der CS50 diskutieren, wenn das behoben ist. So ein Wort auf Partituren sich. So wird es ein oder zwei Wochen dauern, bis Sie starten, um Feedback zu bekommen Problem Sätze weil Sie noch nicht über eine Lehre Kerl. Und selbst dann werden wir anfangen zu bewerten die C Problem setzt, bevor wir zurück und bewerten Kratzer so dass Sie mehr relevant Feedback schneller. Aber im Allgemeinen pro Lehrplan, CS50 Problem-Sets sind entlang der ausgewertet nach vier Achsen - Umfang, Korrektheit, Design und Stil. Scope wird eine Reihe typischerweise zwischen null und fünf, dass erfasst, wie viel von der Stück, das Sie biss. Typischerweise wollen Sie dies bis fünf sein. Du musst mindestens alles versucht. Und feststellen, es ist ein Multiplikationsfaktor so dass dabei nur ein Teil der Problem-Set ist nicht die beste Strategie. Inzwischen mehr offensichtlich ist die Bedeutung der Richtigkeit - nur ist Ihr Programm korrekt mit Bezug auf die Spezifikation? Dies wird bewusst mehr gewichtet stark als die anderen beiden Achsen durch ein Faktor drei, weil wir erkennen, dass in der Regel wirst du ein verbringen viel mehr Zeit jagen einige Bugs, immer Ihren Code zu arbeiten, dann sind Sie sind es einrücken und die Wahl entsprechende Variablennamen und die mögen, ist die am anderen Ende des Spektrums des Stils. Das ist nicht zu sagen, Stil ist nicht wichtig, und wir predigen sie über Zeit sowohl in Vorträgen und in mehreren Abschnitten. Stil bezieht sich auf die Ästhetik Ihres Codes. Hast du gut gewählt genannten Variablen die kurze, aber etwas sind beschreibende? Ist Ihr Code eingerückt, wie Sie gesehen haben, in Vortrag und in einer Art und Weise Stil mit 50? Schließlich ist Design rechts es in der Mitte. Design ist das härter man eine Put- Finger auf, weil es viel mehr subjektiv. Aber es ist vielleicht die wichtigste von die drei Achsen in Bezug auf pädagogische Wert im Laufe der Zeit und dies wird Die Lehre Stipendiaten Gelegenheit, Ihnen qualitative Feedback. In der Tat, in CS50 obwohl wir zu tun haben diese Formeln und Partituren, am Ende des Tages sind diese sehr bewusst sehr kleine Eimer - Punktwerte von null bis drei und null und fünf. Wir versuchen nicht zu sehr grobe Linien zeichnen zwischen Problem-Sets oder zwischen Studenten, sondern so viel wie zu konzentrieren Wir können uns auf qualitative, longhand Feedback, entweder eingegeben oder verbal aus Ihre besondere Lehre Kerl, Sie bekommen ganz gut zu kennen. Aber im Allgemeinen, das sind die Gewichte dass die verschiedenen Achsen wird. Inzwischen zu, es lohnt halten in darauf, dass Sie sollten nicht davon ausgehen, dass ein drei von fünf ist ein 60% und daher grob versagt. Drei bewusst sein soll Art mitten auf der Straße gut. Wenn Sie immer zu dritt auf die Beginn des Semesters, das ist Tat soll ein guter sein Ort zu beginnen. Wenn Sie immer zu zweit, Messen sind, gibt es auf jeden Fall einiges an Arbeit, um ein wenig zu zahlen mehr Aufmerksamkeit, um die Vorteile Abschnitte und Bürozeiten. Wenn Sie immer Vieren und Fünfen, groß. Aber wirklich, hoffen wir, Flugbahnen sehen unter den Studierenden - sehr individualisiert pro Schüler, aber ausgehend das Semester hier in Art die zwei bis drei der Bereich endet jedoch hier oben in den vier vor fünf Bereich. Das ist, was wir wirklich suchen. Und wir haben im Hinterkopf behalten, dass das Delta Sie zeigen in den Wochen null und Woche 12, wenn ich tue Noten. Es spielt für uns keine Rolle, wie absolut Sie fair zu Beginn, wenn Ihr Weise ist in der Tat nach oben und stark. Academic Ehrlichkeit - so lassen Sie mich auf meiner setzen ernster Stimme nur für einen Augenblick. Also dieser Kurs hat die Unterscheidung von Senden mehr Studierende als jede andere in der Geschichte der Anzeige Bord, glaube ich. Wir haben irgendwie nicht mehr zählen bei dieser Punkt, wie oft dies geschieht. Und das ist nicht, weil die Studenten in 50 sind mehr als ihre unehrlich Klassenkameraden anderswo. Aber erkennen Sie auch, dass wir sehr gut sind bei der Erkennung dieser Art von Dingen. Und das ist der Vorteil, dass ein Informatik Klasse hat, dass wir können und wir vergleichen alle Schüler Problem stellt paarweise gegen jeden andere, nicht nur in diesem Jahr aber alle Vorjahre. Wir haben die Fähigkeit, wie Studenten in die Klasse, um Google zu finden und Code auf Seiten wie github und Diskussionsforen. Es gibt absolut Lösungen für die CS50 p-Sets im Umlauf gibt. Aber wenn Sie sie finden können, können wir sie finden. Und all dies ist sehr viel automatisiert und einfach traurig für uns zu finden. Aber ich möchte betonen auch, dass die Natürlich akademischen Ehrlichkeit Politik sehr sein soll sehr das Gegenteil von diesem Geist. In der Tat, in diesem Jahr haben wir die Dinge neu formuliert in den Lehrplan, dies zu sein, Punkt dot dot, mit mehr Details in den Lehrplan. Aber das übergreifende Thema im Verlauf ist wirklich vernünftig zu sein. Wir wissen, dass es einen signifikanten Menge der pädagogischen Wert in der Zusammenarbeit, zu einem gewissen Grad, mit Klassenkameraden, wobei Sie zwei oder drei oder Sie Ihnen mehr sind Stehen an einer weißen Tafel Whiteboards, so zu sprechen, Ihre Ideen - Schreiben Sie Pseudocode in Bildern, Diagramme, was sollte Mario, wenn sein Sie waren zu schreiben, es zuerst in Pseudocode. Was sollte der Greedy-Algorithmus - wie sollte es pro verhalten Problem setzt man? Und so zu realisieren, dass das Verhalten dass wir zu fördern, ist sehr viel in diese Richtung. Und in den Lehrplan, sehen Sie ein ganze Reihe von Kugeln unter a angemessene Kategorie und ein nicht zumutbar Kategorie hilft, die uns helfen Sie wickeln Ihre Meinung um, wo wir ziehen diese Zeile. Und im Allgemeinen, eine anständige Faustregel ist, dass, wenn Sie kämpfen, um zu lösen einige Fehler und Ihr Freund oder Mitschüler ist neben Ihnen sitzt, ist es für Sie zumutbar, ihm zu zeigen oder ihre Ihr Code und sagen, hey, können Sie helfen mir herauszufinden, was los ist hier falsch? Wir in der Regel nicht umarmen die gegenüberliegende Seite. Es ist nicht die richtige Antwort für Ihre Freund oder Mitschüler hier um zu sagen, oh, nur bei mir und Abbildung aussehen es aus, dass. Das ist eine Art unvernünftig. Aber jemand anderes, ein anderes Gehirn, ein weiteres Paar Augen betrachten Ihrem Bildschirm oder schauen Sie auf Ihren Code und sagen: Du bist sicher, dass du um eine Schleife hier? Oder sind Sie sicher, dass Sie dass Semikolon hier? Oder oh, bedeutet, dass diese Fehlermeldung. Das sind sehr vernünftig und ermutigt Verhaltensweisen. Die Fälle, auf die ich in Anspielung wurde früher laufen auf, wenn die Schüler sind spät in der Nacht, dass schlechte Urteil Entscheidungen und E-Mail ihren Code zu jemand anderes oder einfach nur sagen, hier ist es in Dropbox oder Googeln spät in die Nacht. Und so würde ich ermutigen und bitte Sie, Wenn Sie über solche unvermeidlich Momente von Stress, Sie stoßen bis gegen die Frist, haben Sie keine späten Tag da es bereits Freitag an, dass Punkt-Mail an den Kurs die Köpfe oder mich direkt. Sagen Sie, hören Sie, ich bin an meinem Knackpunkt hier. Lassen Sie uns ein Gespräch und es herausfinden. Das Zurückgreifen auf die Bahn oder eine andere nicht vernünftiges Verhalten ist nie die Lösung, und zu viele von Ihren Klassenkameraden sind nicht mehr hier auf Campus wegen dieser schlechten Beurteilung. Aber es ist sehr einfach, diese Linie Rock. Und hier ist ein kleines Bild zu jubeln Sie von Reddit, so dass jetzt alles wird in Ordnung sein. So eine kurze Zusammenfassung, dann , wo wir aufgehört haben. So letzte Woche daran erinnern, dass wir die Einführung Bedingungen, nicht im Scratch aber in C diesmal. Und es gab einige neue Syntax, aber wirklich keine neuen Ideen per se. Wir hatten booleschen Ausdrücken, dass wir konnten oder zusammen mit zwei vertikalen Stangen oder zusammen mit zwei kaufmännische und sagte, dass sowohl die linke und das Recht muss wahr sein Damit dies auszuführen. Dann mussten wir Schalter, die wir sahen bei kurz, aber ich schlage es wirklich nur andere Syntax für die Erreichung der gleiche Art von Ziel, wenn Sie wissen, in voranzubringen, was Ihre Fälle sein werden. Wir sahen uns an Loops. Eine for-Schleife ist vielleicht die häufigste, oder zumindest die eine, die Menschen erreichen typischerweise für instinktiv. Obwohl es sieht ein wenig kryptisch, Sie werden sehen, viele, viele Beispiele dafür es dauerte nicht lange, da haben Sie bereits Ende der vergangenen Woche. While-Schleifen können ähnlich erreichen die gleiche Sache. Aber wenn Sie wollen, um jede Inkrementierung tun oder Aktualisierung Variable Werte, müssen Sie tun es mehr als die manuell for-Schleife vor erlaubt. Und dann gibt es die do-while-Schleife die uns erlaubt, etwas zu tun mindestens einmal während etwas sonst ist wahr. Und das ist besonders gut für Programme oder für Spiele, wo Sie wollen um den Benutzer für etwas auffordern mindestens einmal. Und dann, wenn er oder sie nicht kooperieren, möchten Sie vielleicht, es zu tun wieder und wieder. Mit Variablen, inzwischen hatten wir Linien von Code wie diesen, das könnte werden zwei Zeilen. Sie könnten deklarieren int genannt Zähler, Semikolon. Oder Sie können einfach zu erklären und definieren, so zu sprechen. Geben Sie ihm einen Wert in der gleichen Zeit. Und dann schließlich, sprachen wir über Funktionen. Und das war ein schönes Beispiel in das Gefühl, dass es zeigt, zwei Arten von Funktionen. Eines ist GetString (), die wiederum Ruft eine Zeichenfolge vom Benutzer. Aber GetString () ist irgendwie interessant, Soweit haben wir es verwendet wird, weil wir schon immer so verwendet mit etwas auf der linken Seite ein Gleichheitszeichen. Das heißt, dass GetString (sagen wir) einen Wert zurückgibt. Es gibt natürlich einen String. Und dann auf der linken Seite, sind wir einfach sparen diese Zeichenfolge innerhalb eines Variable namens name. Dies unterscheidet, in einer Richtung, aus printf printf da, zumindest in unserem Nutzung hier nichts zurück. Nebenbei, es Gegenzug etwas. Wir haben einfach nicht egal, was es ist. Aber es hat was rief ein Nebeneffekt. Und was ist, dass in jeder Nebenwirkung Fall haben wir bisher gesehen? Was bedeutet printf tun? Er druckt etwas auf den Bildschirm, Anzeigen von Text oder Zahlen oder etwas auf dem Bildschirm. Und das ist nur als ein Nebeneffekt weil es nicht wirklich Übergabe es mir zurück. Es ist nicht eine Antwort innerhalb von eine schwarze Box, die kann ich dann erreichen in und greifen. Es ist einfach, es zu tun auf seine eigene, viel wie Colton wurde in diese eingesteckt black box letzte Woche, und er irgendwie magisch war auf dem Brett Zeichnung ohne mich tatsächlich beteiligt. Das wäre ein Nebeneffekt sein. Aber wenn ich tatsächlich musste reichen zurück in hier und sage, oh, hier ist der String von dem Benutzer, das wäre sein ein Rückgabewert. Und so weit wir nur Funktionen verwendet dass andere Leute geschrieben haben. Aber wir tatsächlich tun können diese Arten von Dingen uns. Also werde ich in unterwegs CS50 Gerät wieder. Lassen Sie mich die Registerkarte zu schließen, dass wir hatte vor einem Augenblick öffnen. Und lassen Sie mich gehen Sie vor und eine neue Datei erstellen. Und ich werde weitermachen und nenne dieses positive.c. Deshalb möchte ich etwas mit zu tun positive Zahlen hier. Also werde ich weitermachen und tun int - Entschuldigung - # Include. Lassen Sie uns nicht machen, dass gleichzeitig Fehler wie zuvor. Int main (void), offene lockig Klammer, geschlossen geschweiften Klammer. Und jetzt möchte ich folgendes tun. Ich möchte ein Programm schreiben, dass besteht darauf, dass der Benutzer gibt mich eine positive ganze Zahl. So gibt es keine Funktion GetPositiveInt in der CS50-Bibliothek. Es gibt nur GetInt (). Aber das ist OK, weil ich die haben Konstrukte, mit denen ich eine verhängen können wenig mehr Zwang auf diesen Wert. Ich könnte so etwas tun. So int n - und wenn Sie mit der Eingabe zusammen sind, nur zu realisieren Ich gehe zurück zu gehen und einige Dinge ändern in einem Moment - so int n gleich GetInt (). Und das geht zu setzen ein int Innenseite n. Und lassen Sie mich ein mehr beschreibend. Lassen Sie mich sagen, dass ich so etwas wie verlangen Sie geben mir ein positives Integer. In Ordnung. Also nur ein kleines bisschen von Anweisungen. Und nun, was kann ich tun? Nun, ich weiß schon, aus meinem einfachen Bedingungen oder Zweige, genau wie ich hatte in Scratch, könnte ich etwas sagen wie wenn n kleiner als oder gleich Null ist, dann will ich etwas tun gefallen, das ist nicht positiv. Und dann könnte ich tun - OK, aber ich möchte wirklich, dass int bekommen. So könnte ich hier und ich konnte Art Kopie dieses und Gedankenstrich dieser. Und dann OK. Also, wenn n kleiner als oder gleich Null tun. Nun, was ist, wenn der Benutzer nicht zusammenarbeiten? Nun, dann werde ich leihen diese hier. Und dann habe ich in hier gehen und hier und hier. Also das ist eindeutig nicht die Lösung, nicht wahr? Denn es ist kein Ende in Sicht. Wenn ich will, zu verlangen, dass der Benutzer gibt mich eine positive ganze Zahl, ich kann wirklich die int. Ich kann dann für diese int überprüfen. Aber dann will ich es noch einmal zu überprüfen und Prüfen Sie es wieder ein und überprüfen Sie es erneut. So offensichtlich, was ist besser zu konstruieren, um hier verwenden? Alles klar, so eine Art Schleife. Also werde ich loswerden von fast allen davon. Und ich möchte, um dieses zu erhalten int mindestens einmal. Also werde ich sagen und tun - und ich werde wieder kommen, um die während in nur einem Augenblick - nun, was tun? Ich werde int n bekommt GetInt () zu tun. OK. Also das ist ziemlich gut. Und jetzt, wie oft Ich möchte dies zu tun? Lassen Sie mich die printf Innenseite der Schleife so kann ich immer und immer wieder fordern, wenn es sein muss. Und was will ich diese während Zustand zu tun? Ich will weiter machen während das, was der Fall ist? Ja. N kleiner oder gleich Null ist. Also schon, haben wir deutlich gereinigt diesen Code auf. Wir haben ein sehr einfaches geliehen konstruieren - die do-while-Schleife. Ich habe gerade die wichtigen Linien gestohlen der Code, den ich kopiert und gestartet Einfügen, war das nicht klug. Und jetzt werde ich tatsächlich fügen es in hier und tun Sie es einfach einmal. Und nun, was will ich tun, um ganz am Ende dieses Programms? Ich werde einfach sagen, etwas einfach gefallen, vielen Dank für die - und Ich werde tun,% i für int - Backslash n, Komma, und dann Stecker in n, Semikolon. In Ordnung. Also mal sehen, was jetzt passiert wenn ich dieses Programm ausführen. Ich werde weitermachen und Sie sind positiv. Verdammt. Ein paar Fehler. Also lassen Sie mich zurück blättern bis zum ersten. Nicht durch sie rückwärts arbeiten. Arbeiten Sie sich durch sie von oben nach unten damit sie Kaskade und nur eine Sache falsch sein. Implizite Deklaration Funktion GetInt (). Ja. So war es nicht genug. Ich Art von den gleichen Fehler gemacht, aber ein wenig anders diesmal. Ich muss nicht nur die stdio.h aber auch cs50.h, die das beinhaltet sogenannte Erklärungen bekommen int, der lehren die Appliance oder lehrt C, was GetInt () ist. Also lassen Sie mich erneut speichern. Ich werde die anderen Fehler zu ignorieren weil ich werde hoffen, dass sie sind irgendwie mit dem Fehler im Zusammenhang Ich habe bereits fixiert. Also lass mich gehen und kompilieren mit machen positive, Enter. Verdammt. Drei Fehler, immer noch. Lassen Sie mich nach oben auf die erste. Nicht verwendete Variable n. Wir haben das nicht gesehen. Und auch dies ist ein wenig kryptisch. Dies ist die Ausgabe des Compilers. Und was das hervorgehobene Zeile gibt - positive.c :9:13 - sagt, es ist on line neun zu sagen positive.c, auf der 13. Charakter, 13. Spalte, Sie haben diesen Fehler. Und vor allem, es zu sagen mir verwendete Variable n. Also mal sehen - Linie neun. Ich bin mit n in dem Sinne, dass Ich gebe ihm einen Wert. Aber was der Compiler nicht gefällt, ist dass ich nicht scheinbar benutzen. Aber warten Sie eine Minute, ich bin es zu benutzen. In Zeile 11, ich bin mit ihm hier. Aber wenn ich weiter nach unten scrollen bei positive.c :11 - so auf der Leitung 11, Figur 12, die Compiler sagt mir, die Verwendung von deklarierter Bezeichner n. So Schwarzarbeit bedeutet, dass ich keine Angabe es als ein Variable mit einem Datentyp. Aber warten Sie eine Minute. Ich tat genau das, dass in Zeile neun. So jemand ist wirklich verwirrt hier. Es ist entweder mir oder der Compiler, weil in Zeile neun wieder, ich erklärte ein int n, und ich bin Zuweisung der Rückgabewert GetInt (). Dann bin ich mit dieser Variable n in Zeile 11 und prüft, ob der Wert kleiner ist als oder gleich Null ist. Aber das ist offenbar schlecht und gebrochenen warum? Sagen Sie es wieder? Ah, ich muss n vor deklarieren Eintritt in die Schleife. Aber warum? Ich meine, wir haben nur vorgeschlagen, ein bisschen her, dass es ist in Ordnung, um Variablen zu deklarieren alle auf einer Linie und dann ordnen sie einen gewissen Wert. Eine globale Variable - wir kommen wieder zu dieser Idee in nur einem Augenblick. Warum willst du mich zu setzen es außerhalb der Schleife? Es ist. Genau. Also, wenn auch etwas eingängig, Lassen Sie mich zusammenfassen. Wenn Sie erklären n innen der do-Block gibt - speziell in der diese geschweiften Klammern - die Variable n hat, was genannt Geltungsbereich - nichts mit unserem Scoring-System in die Natürlich - aber einen Rahmen, das ist beschränkt auf den geschweiften Klammern. Mit anderen Worten, in der Regel, wenn Sie erklären, eine Variable in einer Reihe von geschweiften Klammern, dass variable existiert nur innerhalb dieser geschweiften Klammern. So von dieser Logik allein, obwohl Ich habe n in Zeile neun erklärte, es Wesentlichen verschwindet Umfang, verschwindet aus dem Gedächtnis, so zu sprechen, durch die Zeit, die ich getroffen line 11. Weil Linie 11, leider ist außerhalb dieser geschweiften Klammern. So kann ich leider nicht beheben, indem geht zurück auf das, was ich tat es vor. Man könnte auf den ersten tun. Aber was bist du jetzt nicht dabei zyklisch? Sie sind offensichtlich nicht immer die int zyklisch. So können wir verlassen die GetInt (), und wir sollte die GetInt () innerhalb der verlassen Schleife, weil das ist, was wir wollen belästigen die Benutzer immer und immer wieder. Aber es genügt, um zu gehen bis zu Linie, sagen wir, sechs. Int n, Semikolon. Geben Sie es nicht noch einen Wert, weil Sie müssen nicht nur noch brauchen. Aber jetzt hier unten, Hinweise - diese wäre eine sehr einfache Fehler. Ich möchte nicht zu meinem vorherigen Schatten Erklärung der n. Ich möchte das n verwenden, tatsächlich existiert. Und jetzt in der Zeile 10, I n einen Wert zuzuweisen. Aber in Reihensechszylinder erkläre ich n. Und so kann ich oder kann ich nicht verwenden Sie es in Zeile 12 jetzt? Ich kann, weil zwischen dem lockigen Klammern ist n erklärte jetzt? Die hier oben auf Linie fünf. Um eines hier on line 14. Also, wenn ich nun vergrößern, speichern Sie diese Datei, gehen Sie zurück ins Laufen zu bringen und positiv, es kompiliert diese Zeit. Also das ist schon Fortschritte. Slash. . / Positiv, Enter. Ich verlange, dass Sie mir eine positive ganze Zahl ist. Negative 1. Negative 2. Negative 3. Null. One. Und vielen Dank für einen ist was jetzt gedruckt. Lassen Sie mich versuchen, etwas anderes, aus Neugier. Ich bin an Eingang eine ganze Zahl gesagt. Aber was, wenn ich stattdessen in Lamm geben? So sehen Sie nun eine andere Eingabeaufforderung - wiederholen. Aber nirgendwo in meinem Code schrieb ich erneut zu versuchen. Also, wo, vermutlich ist dies wiederholen prompt aus, würden Sie sagen? Ja, von GetInt () selber. So eines der Dinge, CS50-Mitarbeiter tut für Sie, zumindest in diesen ersten paar Wochen wird haben wir eine gewisse Menge geschrieben der Fehlerprüfung, um sicherzustellen, dass, wenn Sie rufen GetInt (), werden Sie mindestens wieder einen int vom Benutzer. Sie erhalten einen String. Sie erhalten einen char. Sie erhalten etwas ganz anderes. Sie erhalten eine int. Nun ist es vielleicht nicht positiv sein. Es ist vielleicht nicht negativ sein. Wir machen keine Garantien, dass rund. Aber wir werden belästigen die Benutzer den Vorgang zu wiederholen, wiederholen, wiederholen, bis er oder sie tatsächlich zusammenwirkt. Ebenso wenn ich 1.23, Ist das nicht eine int. Aber wenn ich in, sagen wir, 50 geben, dass gibt mir einen Wert, den ich wollte. In Ordnung. Also nicht schlecht. Haben Sie Fragen, was wir gerade getan haben? Der Schlüssel zum Mitnehmen ist, klar zu sein, nicht so sehr die Schleife, die wir gesehen haben, vor, obwohl wir nicht wirklich verwendet, aber die Frage der Umfang, in dem Variablen können nur kann nur verwendet werden, innerhalb einiger angegebenen Bereich. Na gut, lassen Sie mich den Vorschlag Sie vorhin sagten, dass einer globale Variable. Nebenbei stellt sich heraus, dass ein anderer Lösung für dieses Problem, aber typischerweise eine falsche Lösung oder eine schlecht konzipierte Lösung ist es, erklären Sie Variable als was rief eine globale Variable. Jetzt bin ich Art von Verletzung meiner Definition von Rahmen, weil es keine geschweiften Klammern an der Spitze und die ganz unten auf einer Datei. Aber die Implikation, dass ist, dass jetzt in der vierten Zeile, n ist eine globale Variable. Und wie der Name schon sagt, ist es nur überall zugänglich. Scratch hat eigentlich diese. Wenn Sie eine Variable verwendet wird, könnten Sie sich erinnern Sie hatte zu entscheiden, ob es für ist diese Sprite oder für alle Sprites. Nun, alle Sprites nur umso deutlicher Art zu sagen, global. Ja? Ah, wirklich gute Frage. So erinnern, dass in der ersten Version von meinem Code, wenn ich falsch deklariert und definiert n in Zeile neun - Ich erklärte es als eine Variable und ich gab ihm einen Wert mit der Zuweisungsoperator - das gab mir zwei Fehler. Eine, die Tatsache, dass n nicht verwendet wurde, und zwei, dass in Zeile 11 es war einfach nicht erklärt. Also das erste, das ich nicht Adresse zu der Zeit. Es ist nicht unbedingt ein Fehler zu erklären eine Variable aber nicht verwenden. Aber eines der Dinge, die wir getan haben, in die CS50 Gerät, bewusst, pädagogisch wird haben wir bis der gekröpfte Erwartungen des Compilers zu machen sicher, dass Sie die Dinge nicht nur richtig, aber wirklich richtig. Denn wenn Sie eine Variable deklarieren wie n-und nie über sie oder ihn richtig, was dann ist es da? Es ist wirklich keinen Zweck. Und es ist sehr einfach im Laufe der Zeit, wenn Sie nicht konfigurieren Ihrem eigenen Computer in auf diese Weise, um nur einen Code, hat kleine Reste hier Reste gibt. Und dann Monate später zurück zu blicken und du bist wie, warum ist diese Linie der Code da? Und wenn es keinen guten Grund, es nicht profitieren Sie oder Ihre Kollegen auf der Straße zu haben, um stolpert dann. Nebenbei, wo ist dass aus? Nun, daran erinnern, dass wir jedes Mal kompilieren Programm, ist all dieses Zeug gedruckt wird. So kommen wir zurück zu diesem. Aber wieder ist ein Dienstprogramm, das machen automatisiert den Prozess der Erstellung von läuft die eigentliche Compiler genannt Klang. Dieses Ding, wir schließlich sehen, hat mit Debugging mit einem speziellen zu tun Programm namens den Debugger. Das hat damit zu tun, die Optimierung code - mehr dazu in Zukunft. Std = c99 - bedeutet dies einfach, verwenden Sie die Fassung von 1999 C. C ist um noch länger als seit , aber sie machten ein paar schöne Änderungen zzgl. 10 Jahren. Und hier ist die relevantesten. Wir sagen, machen alles, was zuvor hätte eine Warnung haben ein Fehler verhindert den Schüler von der Erstellung. Und Wandmittel tun, dass für eine ganze Reihe von Dingen, nicht nur um Variablen in Zusammenhang stehen. Und dann lassen Sie mich zu blättern das Ende dieser Linie. Und auch dies werden wir schließlich komm zurück zu. Dies ist offensichtlich der Name die Datei Ich bin Kompilieren. Das erinnert an die Namen der Datei Ich bin wie der Name Ausgeben meiner lauffähigen Programm. This-LCS50 bedeutet nur, verwenden Sie den CS50 Bibliothek, und alle Nullen und Einsen, dass das Personal geschrieben und kompiliert früher in diesem Jahr, zu integrieren sie in mein Programm. Und wer weiß, was-lm ist? Es ist die Mathematik-Bibliothek, das ist nur dort, auch wenn Sie nicht irgendeine math. Es ist einfach automatisch bereitgestellt die uns zu machen. Nun, lassen Sie mich ein anderes Beispiel hier durch die Eröffnung einer neuen Datei. Und lassen Sie mich zu retten diese ein als string.c. Es stellt sich heraus, dass wir reden über Daten Typen heute, es gibt noch mehr los unter der Haube als wir bisher gesehen. Also lassen Sie mich schnell tun, eine schnelle Programm. Include stdio.h. Und ich werde sparen, dass. Und wissen Sie, lassen Sie mich nicht die gleichen Fehler wieder und wieder. Fügen cs50.h. Und lassen Sie mich gehen jetzt und tun int main (void). Und jetzt habe ich einfach nur, um ein Programm zu tun , das dies tut - erklären einen String genannt s und erhalten einen String von dem Benutzer. Und lassen Sie mich ein wenig Anweisungen hier - bitte geben Sie mir einen String - so der Benutzer weiß, was zu tun ist. Und dann hier unten darunter, Ich möchte folgendes tun - für int i bekommt Null. Wieder typisch Informatiker Zählen beginnen bei Null, aber wir konnten machen, dass man, wenn man wirklich wollte. Jetzt werde ich tun werde ich weniger als die Länge der Zeichenfolge s. So strlen - S-T-R-L-E-N - wieder, es ist übersichtlich, weil es einfacher ist, zu geben, auch wenn es ein wenig kryptisch. Das ist eine Funktion, die wir nicht genutzt haben vor, sondern buchstäblich tut, dass - kehrt zu mir eine Zahl, die für die Länge der Zeichenfolge, dass der Benutzer eingegeben. Wenn sie eingetippt hallo, würde es zurückgeben fünf, weil es fünf Briefe in hallo. Dann, bei jeder Iteration diese Schleife, i plus plus. Also noch einmal, ein Standard, auch wenn konstruieren du bist nicht ganz zu bequem oder kennen es noch nicht. Aber jetzt bei jeder Iteration dieser Schleife, bemerken, was ich tun werde. Ich will weitermachen und ausdrucken aus einem einzigen Zeichen - so% c Backslash n in eine neue Zeile. Und dann wissen Sie, was ich tun will? Was auch immer das Wort ist, die der Benutzer in wie hallo, ich möchte ausdrucken H-E-L-L-O, ein Zeichen pro Zeile. Mit anderen Worten, ich möchte an der get einzelne Zeichen in einem String, wobei bis jetzt hat nur eine Zeichenfolge eine Folge von Zeichen. Und es stellt sich heraus, dass ich s, Halter tun können, i, Klammer zu schließen Klammern, Semikolon. Und ich habe noch eine Sache zu tun. Es ist in einer Datei namens string.h dass strlen deklariert ist. Also, wenn ich will, um diese Funktion zu nutzen, Ich muss dem Compiler mitzuteilen, erwarten, es zu benutzen. Nun lassen Sie mich gehen Sie vor und machen das Programm namens String. Dot, Slash, String. Bitte geben Sie mir einen String. Ich werde weitermachen und geben Sie es. Hallo, in Großbuchstaben, die Eingabetaste. Und jetzt merke ich, habe dies gedruckt ein Zeichen nach dem anderen. So das neue Detail dabei ist, dass ein String ist, Am Ende des Tages kann Zugriff über seinen individuellen Zeichen, indem das Quadrat Klammer-Notation. Und das ist, weil ein String unter die Haube ist in der Tat eine Folge von Zeichen. Aber was ist ordentlich an ihnen ist, in den Arbeitsspeicher des Computers - Mac, PC, was immer es ist - sie sind buchstäblich Rücken an Rücken an Rücken - H-E-L-L-O - an einzelnen, benachbarten Bytes im Speicher. Also, wenn Sie wollen, zu achten, wie sich Byte, das in dieser Schleife wäre Klammer Null, eine Halterung, Halterung zwei, Halterung drei, vier Bügel - Das ist null bis fünf indiziert - das wird auszudrucken H-E-L-L-O in einer eigenen Zeile. Jetzt, als Teaser, lassen Sie mich Ihnen zeigen, die allerlei Dinge, die Sie schließlich sein zu verstehen, zumindest mit einigen in der Nähe suchen. Zum einen, was wir aufgenommen in der heutigen Beispiele, wenn Sie möchten, ist eigentlich einer der ersten Jailbreaks für das iPhone. Jailbreaking bedeutet Knacken des Telefons so können Sie tatsächlich nutzen es auf eine verschiedene Träger oder install Ihre eigene Software. Und Sie werden feststellen, das sieht ganz kryptisch, am wahrscheinlichsten. Aber sieh dir das an. Das iPhone wurde anscheinend mit gekracht eine for-Schleife, wenn ein Zustand, ein anderes Zustand, ein Bündel von Funktionen haben wir nicht gesehen. Und wieder, werden Sie nicht auf den ersten Blick wahrscheinlich zu verstehen, wie dies funktioniert. Aber alles, was wir irgendwie nehmen selbstverständlich in unserem modernen Leben tatsächlich tendenziell sogar zu reduzieren, um einige dieser Grundlagen wir waren Blick auf. Lassen Sie mich gehen, und öffnen Sie eine andere Programm, holloway.c. Also das ist auch etwas, das Sie sollte es wirklich nicht. Auch keiner der Angestellten oder ich konnte wahrscheinlich dieses heraus, indem du es, weil das war jemand Code das war, was ist eingereicht historisch als eine verschleierte C bekannt Wettbewerb, bei dem Sie ein Programm schreiben, , die kompiliert und ausgeführt wird, ist aber so verdammt kryptischen kein Mensch kann verstehen, was es geht zu tun, bis sie tatsächlich ausführen. Also in der Tat, wenn man sich diese Code, sehe ich einen Schalter. Ich sehe main. Ich sehe diese eckigen Klammern impliziert eine Art von einem Array. Will jemand raten, was dieses Programm tatsächlich tut, wenn ich Holloway laufen? Ja. OK. Gut gemacht. Also nur das Personal und ich kann nicht herausfinden heraus, was diese Dinge zu tun. Und nun endlich, lass mich gehen und eröffnen ein anderes Programm. Dieser - wieder, wir machen den Quellcode online zur Verfügung - diese ist nur Art hübsch anzusehen. Alles, was sie tat getroffen wird die Leertaste ziemlich viel. Aber das ist echt Code. Also, wenn Sie denken, das ist hübsch, wenn wir tatsächlich laufen diese an der Eingabeaufforderung schließlich werden Sie sehen, wie wir vielleicht Dinge wie diese zu tun. Also werden wir Sie in diesem Sinne verlassen und wir sehen uns am Mittwoch. [Musik spielt] Sprecher 2: An der nächsten CS50, Das TFS inszenieren eine Meuterei. SPEAKER 3: Da ist er. Holen Sie ihn! [Musik spielt]