DAVID J. MALAN: In Ordnung. Also willkommen in der ersten CS50 Obduktion für ein Quiz. Wir dachten, wir würden einweihen diese Tradition in diesem Jahr. Und das wird eine Chance sein durch die gehen Lösungen zum Quiz. Und wir beschleunigen oder verlangsamen Basis auf Interesse derer hier. So sind Sie wahrscheinlich hier, weil Sie interessiert, wie könnten Sie haben oder sollten einige beantwortet haben dieser Probleme. Also, warum nicht wir einen Blick in diesem Abschnitt zuerst? So bekommen Saiten. Dies gab drei verschiedene Versionen eines Programms, war schließlich soll eine Zeichenfolge von einem Benutzer zu bekommen. Ob es tat, war links an Ihnen zu bestimmen. Und wir fragten in Frage 0, nehme an, dass die Version 1 ist kompiliert und ausgeführt. Warum könnte das Programm abstürzt? Auf den ersten Blick, irgendwelche Vorschläge , warum? Ja. ZIELGRUPPE: Also ich erinnere mich, diese in eine vorherige Beispiel der Blick auf die char * s und zu sehen, den Scan der s-und sehen, denn es ist ein Zeiger, wie hat es sich auf, was Sie in gescannt? Ist es s oder die Adresse von s? DAVID J. MALAN: OK. Gut. So sind letztlich die Quelle eines Problems vermutlich werde reduzieren auf diese Variable s. Und es ist in der Tat eine Variable. Der Datentyp dieser Variablen ist char *, was bedeutet, es wird enthalten die Adresse eines Zeichens. Und darin liegt die Einsicht. Es wird die Adresse enthalten ein Zeichen oder, allgemeiner, die Adresse des ersten Zeichens in ein ganzer Block von Zeichen. Aber der Haken ist, dass Scan-s, Zweck in Leben, eine Adresse gegeben und gegeben ein Format-Code, wie% s lesen eine Zeichenfolge in das Stück Speicher an dieser Adresse. Aber weil es keine Gleichheitszeichen vor Semikolon, dass auf der ersten Code-Zeile, weil wir nicht wirklich zuteilen beliebigen Speicher mit malloc, denn es kam nicht wirklich zuteilen ein Array mit einer gewissen Größe, die alle Sie tun, ist das Lesen der Benutzer- Tastatureingaben in eine komplette Müll-Wert, der ist in s standardmäßig. Also Chancen sind Sie gehen zu abstürzt, sind, wenn dass Adresse nicht einfach so passieren ein Wert, der du sein kannst, in der Tat, zu schreiben. So schlecht, nicht zu vergeben Ihr Gedächtnis gibt. So in Frage 1, fragten wir, nehme an, dass die Version 2 ist kompiliert und ausgeführt. Warum könnte das Programm abstürzt? Also dieses ist weniger fehlerbehaftet. Und es gibt wirklich nur eine offensichtliche Weise, wo man auslösen segfault hier. Und das ist thematisch. Jedes Mal, wenn wir mit c in Erinnerung, was könnten Sie tun, um einen Speicherzugriffsfehler herbei Version 2? ZIELGRUPPE: Wenn Sie diese Eingabe in verwenden ein String, der länger als 49 ist Zeichen. DAVID J. MALAN: Genau. Jedes Mal, wenn Sie etwas fester Länge sehen wenn es um eine Anordnung kommt, Ihre Radar sollte gehen, dass dies sein problematisch, wenn Sie nicht die Überprüfung sind die Grenzen eines Arrays. Und das ist das Problem hier. Wir sind immer noch mit scanf. Wir sind immer noch mit% s, was bedeutet, versuchen um eine Zeichenfolge vom Benutzer gelesen. Das wird in s gelesen werden, die, An diesem Punkt ist effektiv die Adresse eines Teil des Speichers oder dessen Äquivalent. Es ist der Name eines Arrays der Zeichen-Speicher. Aber genau das, wenn Sie einen String lesen das ist länger als 49 Zeichen, 49 weil man Platz für den umgekehrten Schrägstrich müssen 0, wirst du zum Überlaufen dass Puffer. Und Sie vielleicht Glück haben und in der Lage, einen 51. Charakter, 52., 53.. Aber irgendwann, das Betriebssystem wird sagen, nein. Dies ist definitiv nicht Speicher dürfen Sie zu berühren. Und das Programm wird sich abstürzt. Also gibt, sollten die Heuristik beliebig sein Zeit, die Sie feste Länge haben, müssen Sie um sicherzustellen, dass Sie die Überprüfung der Länge von was auch immer es ist, Sie versuchen, in sie zu lesen. ZIELGRUPPE: Also zu lösen, könnten Sie eine Erklärung Überprüfung tatsächlich gehabt haben ist die Länge größer oder kleiner als? DAVID J. MALAN: Unbedingt. Sie müssen nur eine Bedingung , die sagt, wenn die - oder vielmehr muss man nicht unbedingt wissen im Voraus, wie viele Zeichen der Benutzer wird sich geben, weil Sie haben Huhn und das Ei. Nicht, bis Sie es mit scanf gelesen habe können Sie herausfinden, wie lang es ist. Aber an diesem Punkt, ist es zu spät, weil Sie bereits in lesen einige Speicherblock. So nebenbei, die CS50-Bibliothek vermeidet diese Frage überhaupt, Rückruf durch die Verwendung fgetc. Und es liest ein Zeichen in einer Zeit, Zehenspitzen zusammen, wohl wissend, dass Sie können ein Zeichen, wenn nicht überlaufen Sie lesen ein zu einer Zeit. Der Haken ist mit getstring Rückruf dass wir uns immer wieder neu Größe dass Teil des Speichers, die ist nur ein Schmerz. Es ist eine Menge von Zeilen Code, um das zu tun. So wäre ein weiterer Ansatz sein tatsächlich eine Cousine, so zu sprechen, von scanf. Es gibt Varianten einer Menge von diesen Funktionen, die tatsächlich überprüfen Länge, wie viele Zeichen Sie können maximal lesen. Und man konnte angeben, nicht lesen mehr als 50 Zeichen. Damit wäre ein weiterer Ansatz sein, aber weniger entgegen von größeren Eingängen. Also Frage 2 fragt, nehme diese Version 3 kompiliert und ausgeführt. Woran kann das Programm abstürzt? Also das ist eigentlich das gleiche beantworten, obwohl es sieht ein wenig schicker. Wir verwenden malloc, die wie fühlt sich wir geben uns mehr Möglichkeiten. Und dann sind wir zu befreien, dass Speicher am Ende. Es ist immer noch nur 50 Byte Speicherplatz. So könnten wir immer noch versuchen zu lesen in 51, 52, 1000 Bytes. Es wird für abstürzt genau dem gleichen Grund. Aber es ist ein weiterer Grund. Was sonst könnte Rück neben malloc die Adresse eines Speicherstück? Es könnte null zurück. Und weil wir nicht für die Überprüfung dass wir vielleicht etwas tun dumm aus einem anderen Grund, der ist, dass wir könnten sagen, scanf, lesen die Benutzereingabe von der Tastatur 0 in Lage, AKA null. Und das auch, wird auf jeden Fall Auslöser einer Schutzverletzung. Also für den Zweck des Quiz ist, würden wir entweder von denen als angenommen triftigen Grund. Einer ist identisch. Man ist ein wenig differenzierter. Schließlich, in Bezug auf die Programm Speichernutzung, wie die Version 2 zu tun und Version 3 unterscheiden? Also für das, was es wert ist, sahen wir einen scheinbar endlosen Vorrat an möglichen Antworten. Und unter den Antworten der Menschen, was wir waren hoffen, aber wir anderen akzeptiert Dinge, war eine Erwähnung der Tatsache, dass die Version 2 wird mit die sogenannten Stack. Version 3 wird mit dem Heap. Und funktionell, tut dies nicht wirklich machen, dass alle viel von einem Unterschied. Am Ende des Tages sind wir immer noch nur immer 50 Byte Speicherplatz. Aber das war eine der möglichen Antworten dass wir auf der Suche. Aber Sie werden sehen, wie Sie Ihre Quiz bekommen zurück von der TF, dass wir das gemacht haben anderen Diskussionen akzeptieren ihre unterschiedlichen Verwendungen von Speicher auch. Aber Stack und Heap gewesen wäre eine einfache Antwort mit zu gehen. Haben Sie Fragen? Ich gebe dir Rob. ROB BOWDEN: Also Problem 4. Dies ist die eine, wo Sie hatte zu füllen in der Anzahl der Bytes von allen Diese verschiedenen Arten verwendet. Also erste, was wir sehen. Angenommen, ein 32-Bit-Architektur, wie dieses Gerät CS50. Also eine der grundlegenden Dinge über 32-Bit-Architekturen, die uns sagt, dass genau, wie groß ein Zeiger geht in der Architektur. Also sofort, wir wissen, dass jede Zeiger Typ 32 Bits oder 4 Bytes. So suchen Sie in dieser Tabelle ein Knoten * ist ein Zeiger-Typ. Das wird 4 Bytes. Struct Knoten *, das ist buchstäblich identisch mit Knoten Stern. Und damit geht um 4 Bytes. String, so dass es nicht wie ein noch Zeiger, aber die typedef ein String ist nur ein char *, die ist ein Zeiger-Typ. Also das wird 4 Bytes. Also diese drei sind alle 4 Bytes. Jetzt, Knoten und Schüler sind ein wenig komplizierter. So suchen Sie in Knoten und Schüler, sehen wir Knoten nach einer ganzen Zahl und einem Zeiger. Und Schüler zwei Zeiger darin. So dass zumindest für unseren Fall hier der Weg dass wir am Ende der Berechnung der Größe der Diese Struktur ist nur hinzufügen, bis alles das ist in der Struktur. Also für Knoten, haben wir eine ganze Zahl, das ist 4 Bytes. Wir haben einen Zeiger, der 4 Bytes ist. Und so ein Knoten wird zu nehmen 8 Byte. Und ebenso für Studenten, haben wir ein Zeiger, der 4 Byte und ein anderer ist Zeiger, der 4 Bytes ist. Also das geht zu Ende Sein bis 8 Byte. So Knoten und Schüler sind 8 Byte. Und diese drei sind alle 4 Bytes. Fragen dazu? Ja. ZIELGRUPPE: Ist es ein 64-Bit- Architektur, würde das verdoppeln alle? ROB BOWDEN: Es würde nicht verdoppeln alle. Also 64-Bit-Architektur, sie, wieder, Veränderungen, die grundlegende Sache, dass ein Zeiger ist jetzt 64 Bit. Ja. So ist ein Zeiger 8 Byte. Also diese, die 4 Bytes waren gehen, um 8 Bytes sein. Ein Student, der zwei Zeiger war, Nun, jetzt es geht um werden 8 Byte, 8 Byte. Es wird zu 16 Byte zu machen. Aber ein Knoten noch 4 Bytes. So wird dieser Zeiger 8 Byte. Das ist 4 Bytes. So ein Knoten ist nur noch 12 Bytes. Alle anderen Fragen auf, dass man? Also das nächste, das sind die HTTP-Statuscodes. Und Sie nach Umständen zu beschreiben, hatte unter denen diese Macht an Sie zurückgegeben werden. ein Problem, das ich hörte einige Studenten ist, dass sie versuchte, die Fehler auf Ende des Auftraggebers. Also, wenn wir versuchen, den Antrag zu stellen an den Server, geht etwas falsch an unserem Ende. Aber im allgemeinen sind diese Codes , die vom Server zurückgegeben. Also, um herauszufinden, was los ist wollen wir falsch oder richtig auf dem Server, bewirkt, dass diese Dinge zurückgegeben werden. Warum könnte ein Server zurück Statuscode 200? Irgendwelche Gedanken? Ja. So etwas erfolgreich der Antrag ging durch. Und sie sind in der Lage, zurück was auch immer Sie fragte nach. So war alles in Ordnung. Was etwa 302 gefunden? Ja. ZIELGRUPPE: Der Server war auf der Suche für das, was Sie angefordert haben. Aber es konnte ihn nicht finden. Es gibt also ein Fehler. ROB BOWDEN: So war der Server suchen, was Sie wollten. Also einfach hier suchen, 302 gefunden, es war in der Lage, es zu finden. ZIELGRUPPE: Tut mir leid. Gefunden bedeutet, dass sie tat es. Entschuldigung. ROB BOWDEN: Also 302 gefunden. Der Server ist in der Lage zu finden was Sie wollten. ZIELGRUPPE: Aber es ist nicht angezeigt oder? ROB BOWDEN: Die Differenz zwischen Diese 302 und 200 ist, dass es weiß, was Sie wollen. Aber es ist nicht genau, wo Sie wollte fragen. Also 302 ist ein typisches Umleitung. So haben Sie eine Seite angefordert. Es weiß, oh, ich will um Ihnen diese zurück. Dies ist jedoch in einer anderen URL. Also hey, die Sie tatsächlich wollen, dass diese. DAVID J. MALAN: Es ist ein Stück, das die gab, dass wir euch eine Umleitung Funktion, die die Kopffunktion verwendet daß wiederum ausgedruckt Lage, Doppelpunkt und dann die URL, auf die Sie den Benutzer zurückweisen möchten. Auch wenn Sie nicht sehen, 302 es ausdrücklich, dass das, was PHP würde magisch als Header einfügen sagen, genau das, was Rob sagte, dass es - gefunden. Aber hier gehen statt. ROB BOWDEN: OK. So was über 403 verboten? ZIELGRUPPE: Ich denke, es ist, dass der Server ist im Grunde sagen, dass der Client kann nicht auf die Startseite. ROB BOWDEN: Also ja. Nun, wir waren die typische Antwort erwarten ist so etwas wie die Dateien nicht angemessen chmodded. Das ist wahrscheinlich, unter welchen Umständen Sie sah. Aber es gibt einen Grund dafür, dass der Client Schuld könnte hier sein. Es gibt tatsächlich ein weiteres Status-Code - 401. Das sind also sehr ähnlich. 401 ein. Und 403 ist untersagt. Und so unberechtigten Sie ausschließlich bekommen, wenn Sie nicht eingeloggt Aber der Anmeldung könnte bedeuten, dass Sie berechtigt sind. Aber wenn Sie bereits eingeloggt, und Sie noch nicht über die Berechtigung, dann können Sie auch verboten. Also, wenn Sie eingeloggt sind und müssen nicht Genehmigung ist auch verboten etwas, das man bekommen kann. DAVID J. MALAN: Und der Mechanismus, durch welche diese Probleme sind in der Regel gelöst, auf dem Server über welchen Befehl? Chmod, wenn es in der Tat ein Berechtigungen Ausgabe auf die Datei oder das Verzeichnis. ROB BOWDEN: Dann 404 nicht gefunden. Ja. Also im Gegensatz zu 302, wo es nicht genau wo Sie fragen, aber es weiß, was Sie wollen, nur hat es diese keine Ahnung, was Sie wollen. Und Sie anfordern, etwas gültig. 418 Ich bin eine Teekanne und dann 500 internen Server. Also, warum sollten Sie das her? So abstürzt - Ich eigentlich nicht wissen, die Einstufung Standard für diese. Aber wenn Ihre PHP-Code hatte etwas falsch daran, in der Theorie, könnte es tatsächlich abstürzt, in welchem ​​Fall diese 500 Internal Server Error, etwas, ist falsch mit Ihrem Server des Konfiguration. Oder gibt es eine Syntax-Fehler in der PHP-Code. Oder etwas Schlimmes vor sich geht. DAVID J. MALAN: Wir haben sehen segfault unter die Antworten ein paar Leute. Und technisch könnte es passieren. Aber das wäre ein PHP, das Programm sein geschrieben von anderen Menschen, eigentlich segfaulted, die nur, wenn diese Personen oben geschraubt und schrieb fehlerhaften Code in ihre Dolmetscher würde PHP selbst abstürzt. Also auch wenn 500 ist wie eine Schutzverletzung im Geiste, ist es fast immer der Ergebnis einer Konfigurationsdatei Ausgabe mit Ihrem Web-Server oder, wie Rob sagte, Syntaxfehler, wie Sie hat ein Angebot nicht zu schließen. Oder Sie ein Semikolon irgendwo verloren. ZIELGRUPPE: Also für den Shuttle pset, ich denken, wenn ich es tat, wenn ich das angeklickt Browser, aber nichts kam, was sie weiße Seite aufgerufen. Aber es war wegen der Codes. Ich glaube, das war kein JavaScript, oder? ROB BOWDEN: Ja. ZIELGRUPPE: Würde das Fehler noch kommen? ROB BOWDEN: Also würden Sie nicht bekommen haben dieser Fehler, weil alles aus Sicht der Web-Server war völlig in Ordnung. Aber Sie angefordert index.html. Sie beantragt shuttle.js und service.js. Und es war in der Lage, erfolgreich zurück an euch alle diese Dinge - 200. OK. Es ist nur, wenn Ihr Browser versucht, interpretieren den JavaScript-Code, es ist wie, warten, ist dies nicht gültigen JavaScript-Fehler. Noch Fragen? Gut. DAVID J. MALAN: Also das nächste Sie war die Nummer 11. Und 11 war der schrecklichste für eine Menge Leute. So ist die wichtigste Sache, hier zu beachten war, dass dies in der Tat zu ein doppelt verketteten Liste. Aber das war nicht das gleiche wie im letzten Jahr doppelt verknüpfte Liste Problem, die nicht geben, haben Sie den Vorbehalt, dass die Liste könnte in der Tat sein, unsortiert. Also die Tatsache, dass die Liste war unsortiert und die Tatsache, dass das Wort war unterstrichen es bedeutet wurde, um zu vermitteln dass dies tatsächlich eine Vereinfachung von dem, was sonst gewesen wäre, eine größere Herausforderung Problem und eine längere. So war ein häufiger Fehler, hier zu setzen haben im vergangenen Jahr die Lösung auf ein Pager und dann einfach blind zu kopieren, dass sich wie die Antwort, die die richtige ist Antwort auf eine andere Frage im Geiste. Aber die Feinheiten hier waren wie folgt. So eine haben wir ein Knoten deklariert und in üblicher Weise definiert. Dann definiert man eine Liste der global sein Zeiger mit null initialisiert. Dann anscheinend gibt es zwei Funktionen wir haben Prototypen für hier, einfügen und zu entfernen. Und dann haben wir hier einige Beispiel-Code zu tun, ein paar von Insertionen. Und dann bitten wir Sie, vervollständigen die Umsetzung des Einsatzes unten dergestalt eine Möglichkeit, dass es in die Liste eingefügt n in konstanter Zeit, unterstrich auch, auch wenn bereits vorhanden ist. So ist die Schönheit des Seins in der Lage, einfügen in konstanten Zeit ist, dass es bedeutet, dass Sie einfügen müssen der neue Knoten, wo? In der Front. So ist es eliminiert, Gott sei Dank, wenigstens einer der Fälle, die erfordern noch mehr Zeilen Code, wie damals, im letzten Jahr und auch in der Klasse, wenn wir durch diese Art der Sache gesprochen mit Menschen und mit einigen verbale Pseudo-Code. Also in der Lösung hier, mal überspringen zu, dass, nur um eine visuelle auf haben der Bildschirm. Beachten Sie, dass wir tun, die folgenden. Und auch feststellen, das andere Vereinfachung war, dass auch wenn es bereits vorhanden ist, so bedeutet dies, auch wenn die Zahl ist schon da, du kannst einfach blind ein anderes einfügen Kopie. Und das auch, sollte ein sein Vereinfachung, so dass Sie könnte konzentrieren, wirklich, einige der mehr intellektuell interessante Teil und nicht nur einige zusätzliche Fehlerprüfung Angesichts der begrenzten Zeit. Also in diesem Probenlösung, weisen wir einen Zeiger auf die linke Seite hier zu einem Knoten. Jetzt merke, dass die Zeiger, so Rob sagte, ist nur 32 Bit. Und es muss nicht tatsächlich enthalten eine Adresse, bis Sie weisen Sie die Adresse. Und das tun wir auf der rechten Seite über malloc. Wie ein guter Bürger, überprüfen wir, dass malloc nicht tatsächlich null, so dass wir nicht versehentlich zu erstellen ein segfault hier. Und jedes Mal, wenn Sie malloc im Leben verwenden, sollte die Überprüfung werden für null, damit Sie haben einen subtilen Bug. Dann initialisieren wir, dass von null Zuweisen von n und vorherigen und nächsten. Und in diesem Fall hier, I initialisiert vorherige Null ist, weil diese neue Knoten wird der neue sein Anfang meiner Liste. Also es geht um sein nichts vor ihr. Und ich möchte die wesentlichen anhängen vorhandene Liste auf den neuen Knoten durch Einstellung neben sich selbst gleich auflisten. Aber ich bin nicht nur noch nicht fertig. Also, wenn die Liste selbst bereits existierte, und es mindestens einen Knoten bereits vorhanden, wenn dies die Liste hier und ich setzen Sie einen neuen Knoten hier, ich müssen sicherstellen, dass meine ehemaligen Knoten weist nach hinten, um meine neuen Knoten, denn dies ist wiederum ein doppelt verketteten Liste. Also machen wir eine Plausibilitätsprüfung. Wenn Liste ist nicht null, wenn es bereits einen oder mehrere Knoten gibt, dann hinzufügen, dass Rückbezug sozusagen. Und dann das letzte, was wir brauchen zu tun, ist eigentlich die globale aktualisieren Variablenliste selbst zu Punkt zu diesem neuen Knoten. Ja. ZUSCHAUER: In der Mauspfeil [Unverständlich] gleich null ist, geht das befassen sich mit der Liste, weil die Liste ist null? DAVID J. MALAN: Nö. Das ist einfach, mich als pro-aktiv Vorsicht, dass, wenn das ist mein ursprünglichen Liste mit vielleicht einigen mehr Knoten hier und ich meine Einsetzen neuen Knoten hier, es geht nichts mehr hier zu sein. Und ich möchte, dass die Idee zu erfassen indem Sie den vorherigen null auf dem neuen Knoten. Und vermutlich, wenn mein Code korrekt ist und es gibt keinen anderen Weg zu legen außer dieser Funktionsknoten, vermutlich bereits, auch wenn Liste einen oder mehrere Knoten in der es vermutlich die Liste der erste Knoten haben würde vorherige Zeiger von null sich. ZIELGRUPPE: Und nur ein Follow-up. Der Grund, warum Sie setzen Zeiger neben Gleichen Liste wird Sie machen den Zeiger sind Liste vor, dass es zeigen auf die nächste, ich denke - Ich tun nicht - nur nennt? DAVID J. MALAN: Genau. Und so wollen wir zwei Fällen tatsächlich der Ansicht hier wirklich, auch wenn die Bestellung werden wir sie prüfen, ist nicht ziemlich der gleiche wie der Code. Sondern auf einem hohen Niveau, wenn diese für Liste, und dies ist ein 32-Bit- Zeiger, ist die einfachste Szenario dass dies standardmäßig Null. Und angenommen, ich möchte die einfügen Nummer 50 war die erste Nummer. Also werde ich weitermachen und zuweisen ein Knoten, die gehen zu enthalten drei Felder - n, vorherigen und nächsten. Ich werde die Nummer 50 gesetzt hier, da dies n sein. Das wird der nächste sein. Und dies wird sein vorheriges. Und so was kann ich in diesem Fall tun? Nun, ich habe gerade Linie 1 hier. Pointer n n bekommt. Ich bin dann zu sagen, frühere bekommen sollte null. Es wird also null sein. Dann werde ich als nächstes sagen wird, um die Liste zu bekommen. Und das funktioniert nur gut aus. Dies ist null. Und so sage ich, der neue Knoten der nächsten Feld sollte bekommen, was das ist. Damit setzt ein weiteres null da. Und dann das letzte, was Ich habe hier überprüfen. Wenn Liste ist nicht gleich null, aber es ist gleich null, so dass wir überspringen insgesamt. Und so alles, was ich als nächstes tun ist Liste bekommt Zeiger, der bildhaft führt ein Bild so. Also das ist ein Szenario. Und die eine, die Sie wurden zu fragen Insbesondere ist eine Situation wie dieser, wo wir bereits eine Ein-Knoten-Liste. Und wenn ich wieder in der ursprünglichen Problemstellung, der nächste wir werden legen sagen wir 34 ist, nur für die um der Diskussion willen. Also werde ich einfach nur bequem hinweisen, dass hier. Ich habe gerade malloced. Nehmen wir an, ich bin Überprüfung auf null. Nun, ich werde zu initialisieren n 34 ist. Und dies wird n sein. Das wird der nächste sein. Und dies wird sein vorheriges. Lassen Sie uns sicherstellen, dass ich nicht erhalten diese nach hinten. Zurück kommt zuerst in der Definition. Lassen Sie mich dies zu beheben. Dies ist vorherige. Dies ist der nächste. Auch wenn diese identisch sind, wir halten es konsistent. Vorherige. Dies ist der nächste. Also ich habe gerade malloced meine Anmerkung, geprüft für null zugeordnet, 34 in den Knoten. Zurück bekommt null. Also das gibt mir, dass. Weiter erhält Liste. So ist diese Liste. Also das ist jetzt die gleiche wie diese Zeichnung Pfeil, so daß sie auf einen Punkt in der gleichen. Und dann werde ich prüfen, ob Liste nicht gleich null. Und es ist diesmal nicht. Dann werde ich um Liste zu tun vorherige bekommt Zeiger. So Liste previous bekommt PTR. So hat dies die Wirkung der Umsetzung eine grafische Pfeil hier. Und das ist immer ein wenig gewellt, die Linien. Und dann, endlich, ich aktualisieren Liste zu Punkt auf Zeiger. So, jetzt deutet dies auf diesem Kerl. Und jetzt machen wir einen schnellen Plausibilitätsprüfung. Hier ist die Liste, das ist, die globale Variable. Der erste Knoten ist in der Tat 34, weil Ich bin nach dieser Pfeil. Und das ist richtig, weil ich Einsatz am Anfang der Liste Alle neuen Knoten. Seine nächste Feld führt mich zu diesem Kerl. Wenn ich weitermachen, schlug ich nächste ist null. Also gibt es keine Liste mehr. Wenn ich auf früheren, bekomme ich zurück, wo ich erwarte. So gibt es immer noch ein paar Hinweise, offensichtlich zu manipulieren. Aber die Tatsache, dass man Ihnen sagte, zu tun dies in konstanter Zeit bedeutet, dass Sie nur eine endliche Anzahl von Dingen dürfen Sie zu tun. Und was ist diese Zahl? Es könnte ein Schritt sein. Es könnte zwei sein. Es könnte 1000 Stufen. Aber es ist endlich, das heißt, Sie können nicht haben jede Art von looping los hier, keine Rekursion, keine Schleifen. Es ist gerade zu hart codierte Linien Code, wie wir in diesem Beispiel. Also das nächste Problem 12 hat uns gebeten, runden die Implementierung von remove unten in der Weise, dass es entfernt n aus der Liste in linearer Zeit. So haben Sie ein wenig mehr haben Spielraum jetzt. Sie können davon ausgehen, dass n, falls vorhanden in der Liste, wird anwesend sein nicht mehr als einmal. Und das auch sein soll ein Quiz-basierten vereinfachenden Annahme, so dass, wenn Sie die Zahl 50 irgendwo zu finden in der Liste, können Sie nicht auch tun haben, um über weiter Sorgen laufen, auf der Suche nach allen möglichen Kopie von 50, die gerade übertragen würde in eine Einzelheit in begrenzter Zeit. Also mit entfernen, auf jeden Fall war dies eine anspruchsvoller und mehr Code zu schreiben. Aber auf den ersten Blick, ehrlich gesagt, könnte es Blick überwältigend und wie etwas es gibt keine Möglichkeit, Sie haben könnten kommen mit einem Quiz auf. Aber wenn wir uns auf die einzelnen Schritte, Hoffentlich wird es plötzlich schlagen Sie, dass jede dieser einzelnen Schritte macht offensichtlich Sinn im Rückblick. Werfen wir also einen Blick. Also zuerst initialisieren wir Zeiger Liste zu sein sich. Weil ich will, die lineare Zeit, dass Mittel Ich werde einige Schleife haben. Und ein üblicher Weg, um über die laufen Knoten in einer Listenstruktur oder jede Art der Struktur iterativ zu nehmen ein Zeiger auf der Vorderseite des Daten Struktur und dann starten Sie einfach die Aktualisierung es und gehen Sie Ihren Weg durch die Datenstruktur. Also werde ich genau das tun. Während Zeiger, meine temporäre Variable, nicht gleich null, lassen gehen Sie vor und überprüfen. Habe ich Glück? Ist das Feld in der n Knoten Ich bin derzeit suchen gleich der Zahl ich suche? Und wenn ja, wollen wir etwas tun. Nun merkt das, wenn die Bedingung umgibt die gesamte folgende Zeilen Code. Das ist das einzige, was mich interessiert - Finden einer Zahl in Frage. Also gibt es keine andere, die vereinfacht Dinge konzeptionell ein wenig. Aber jetzt wurde mir klar, und haben Sie vielleicht nur erkannte dies nach dem Denken es durch ein Bit, gibt es eigentlich zwei Fälle hier. Einer ist, wo der Knoten bei der Anfang der Liste, die eine ist wenig ärgerlich, denn das ist eine Sonderfall, weil Sie zu tun haben mit diesem Ding, was Nur Anomalie. Überall sonst in der Liste, es ist die gleiche Sache. Es gibt einen vorherigen Knoten und eine nächste Knoten vorherigen Knoten, nächsten Knoten. Aber dieser Kerl ist ein kleines Special wenn er am Anfang. Also, wenn der Zeiger entspricht der Liste selbst, so dass, wenn ich am Anfang des die Liste und ich habe n gefunden, ich brauche , um ein paar Dinge zu tun. Man, ich brauche, um die Liste zu ändern weisen auf das nächste Feld, 50. So nehme an, dass ich versuche 34 zu entfernen. Also dieser Kerl muss gehen weg in nur einem Augenblick. , Liste, so werde ich sagen, wird nächste Zeiger. Nun, das ist Zeiger. Weiter zeigt sich hier. Also das ändert sich dieses Pfeil rechts jetzt um auf diesem Kerl hier zeigen. Nun, denkt daran, wir haben eine temporäre Variable ist. So haben wir nicht alle verwaisten Knoten, weil ich auch diesen Kerl in meinem Implementierung von remove. So jetzt, wenn Liste selbst nicht null ist, Ich muss ein wenig etwas zu beheben. Ich muss jetzt dafür sorgen, dass dieser Pfeil, die zuvor zeigen wird 50 bis 34, hat das alles weg, weil, wenn ich versuche, loszuwerden von 34, 50 besser nicht halten jede Art von Rückverweis, um es als das Pfeil vorgeschlagen. Also habe ich nur diese Zeile. Also dann bin ich fertig. Dieser Fall ist eigentlich recht einfach. Hacken Sie den Kopf der Liste ist relativ einfach. Leider gibt es diese ärgerlich else-Block. So, jetzt habe ich den Fall zu prüfen, wo gibt es etwas in der Mitte. Aber es ist nicht zu schrecklich, außer Syntax wie diese. Also, wenn ich nicht am Anfang der Liste, ich bin irgendwo in der Mitte. Und diese Linie hier ist zu sagen, Start Zu welcher Knoten, den Sie gerade sind. Zum nächsten Feld des vorherigen Knotens und zeigen, dass am Zeiger. Wir tun dies bildhaft. Das wurde immer komplizierter. Also, wenn ich eine frühere Felder hier - wir tun dies - neben Felder hier. Ich werde meine Zeiger eher vereinfachen als ziehe eine ganze Reihe von Dinge hin und her, kreuz und quer einander. Und nun lassen Sie uns einfach sagen, das ist 1, 2, 3 zum Zwecke der Diskussion, auch obwohl das nicht eine Linie mit das Problem in Frage. Also hier ist meine verketteten Liste. Ich versuche, zwei in diese zu entfernen bestimmte Version der Geschichte. Also ich habe Zeiger aktualisiert werden, um diesen Kerl zeigt. Das ist also PTR. Er hat hier zeigt. Dies ist die Liste, die vorhanden weltweit als zuvor. Und er zeigt hier, egal was. Und jetzt versuche ich, zwei zu entfernen. Also, wenn Zeiger wird hier zeigen, ich bin gehen, um zu folgen, offenbar, die vorherige Zeiger, die mich bei 1 setzt. Ich bin dann zu sagen, dass der nächste Feld, das bringt mich auf, dies zu Box hier, wird sich gleich Zeiger neben. Also, wenn dieser Zeiger ist diese nächste. Das bedeutet, dass diese Bedürfnisse Pfeil zu diesem Kerl zeigen. Also, was das Codezeile muss nur getan ist ein bisschen dafür. Und nun, das ist wie ein Blick Schritt in die richtige Richtung. Wir wollen im Wesentlichen bis 2 snip von der Mitte der 1 und 3. So macht es Sinn, dass wir wollen, Route diesen Zeiger um ihn herum. Also das nächste Zeile prüft, ob Zeiger nächste nicht null ist, gibt es jemand tatsächlich rechts von 2, das bedeutet, dass wir auch zu tun haben, ein wenig schnippeln hier. Also ich muss jetzt diesen Zeiger folgen und aktualisieren Sie die vorherigen Zeiger auf dieser Kerl, ein wenig von einer do Umgehung hier den Punkt hier. Und nun, das ist optisch schön. Es ist ein wenig chaotisch, dass es in Niemand zeigt auf die zwei nicht mehr. 2 nach links zeigt. Und 2 nach rechts zeigt. Aber er kann machen, was er will, weil er ist dabei, befreit zu werden. Und es spielt keine Rolle, was diese Werte nicht mehr. Was wichtig ist, dass die verbleibende Jungs sind über Routing und unter ihm jetzt. Und in der Tat ist das, was wir als nächstes tun. Wir geben Zeiger, der bedeutet, dass wir sagen, die Betriebssystem, sind Sie herzlich willkommen dies zurückfordern. Und dann endlich, wir zurückkehren. Else implizit, wenn wir noch nicht zurückgegeben, wir müssen weiter suchen. So entspricht Zeiger Zeiger neben nur bedeutet bewegen diesen Kerl hier. Bewegen Sie diesen Kerl hier. Bewegen Sie diesen Kerl hier, wenn in der Tat, wir haben die Nummer nicht finden wir suchen noch auf der Suche. Also ehrlich gesagt, sieht es ganz überwältigend, denke ich, auf den ersten Blick, vor allem, wenn Sie kämpfte mit diesem während des Quiz dann sehen, so etwas. Und Sie selbst auf die Schulter klopfen. Nun, es gibt keinen Weg, ich hätte kommen mit, dass auf dem Quiz. Aber ich würde behaupten, Sie können, wenn Sie brechen es nach unten in diese einzelnen Fällen und nur zu Fuß durch sorgfältig, wenn auch, zugegeben, unter stressigen Umständen. Gott sei Dank, das Bild gemacht alles, was glücklicher. Sie könnten dies in zeichnen eine beliebige Anzahl von Möglichkeiten. Sie müssen nicht um die kreuz und quer zu tun Sache hier. Man könnte es mit gerade tun Zeilen wie diese. Aber der Kern des Problems, in Generell war zu erkennen, dass die Bild am Ende sollte ein wenig aussehen so etwas wie dies, weil konstante Zeit angedeutet, dass Sie zu halten Störungen und Störungen und Verklemmen der neue Knoten zu Beginn auf der Liste. Haben Sie Fragen? Die wohl größte Herausforderung sicherlich die Codierung Fragen. ZIELGRUPPE: Also ist die Liste ähnlich Kopf in den vorherigen Beispielen. DAVID J. MALAN: Genau, genau. Nur ein anderer Name für eine globale Variable. World wide was? ROB BOWDEN: OK. Das ist also die eine, wo man hatte, den Absatz zu schreiben. Einige Leute schrieb Essays für diese Frage. Aber Sie müssen nur diese sechs Begriffe verwenden um zu beschreiben, was passiert, wenn Sie versuchen, facebook.com kontaktieren. Also werde ich nur durch den Prozess sprechen mit all diesen Bedingungen. Also in unserem Browser, geben wir facebook.com und drücken Sie Enter. Also unsere Browser geht um ein Konstrukt HTTP verlangen, dass es sich auf senden durch einen Prozess zu Facebook für Auf Facebook, um uns mit der Antwort HTML seiner Seite. Also, was ist der Prozess, durch die der HTTP-Anforderung tatsächlich bekommt zu Facebook? Also zuerst müssen wir übersetzen Facebook.com. Also nur der Name Facebook.com gegeben, wo tatsächlich die HTTP-Anfrage gehen müssen? Also müssen wir übersetzen Facebook.com zu einer IP-Adresse, die eindeutig identifiziert, was wir eigentlich Maschine wollen, um diese Anforderung zu senden. Ihr Laptop verfügt über eine IP-Adresse. Alles, was mit dem Internet verbunden hat eine IP-Adresse. So DNS, Domain Name System, ist, dass was los ist, um die Übersetzung zu behandeln facebook.com aus einer IP-Adresse, die Sie wirklich wollen, zu kontaktieren. Also haben wir die DNS-Server zu kontaktieren und sagen wir, was ist facebook.com? Er sagt, oh, es ist die IP-Adresse 190,212 etwas, etwas, etwas. Gut. Jetzt weiß ich, welche Maschine Ich möchte zu kontaktieren. Also dann können Sie Ihre HTTP-Anfrage senden über dieser Maschine. Also, wie kommt es zu dieser Maschine? Nun, der Antrag geht von Router zu Router Prellen. Denken Sie daran, die beispielsweise in der Klasse, wo sahen wir tatsächlich die Route, die der Pakete nahm, als wir versuchten, zu kommunizieren. Wir sahen es über den Atlantik springen Ozean an einem Punkt oder was auch immer. Also der letzte Term-Port. Also das ist jetzt auf Ihrem Computer. Sie können mehrere Dinge haben derzeit die Kommunikation mit dem Internet. So kann ich laufen, sagen wir, Skype. Ich hätte einen Web-Browser geöffnet. Ich könnte so etwas haben, dass torren-Dateien. Also alle diese Dinge sind Kommunizieren mit dem Internet in irgendeiner Weise. Also, wenn Ihr Computer einige Daten erhält aus dem Internet, wie funktioniert es wissen, welche Anwendung tatsächlich will, dass die Daten? Woher weiß er, ob diese besondere Daten für die bedeutete, torren Anwendung im Gegensatz auf dem Web-Browser? Also das ist der Zweck der Häfen in das Alle diese Anwendungen haben behauptete einen Port auf Ihrem Computer. Also Ihr Web-Browser sagt, hey, Ich bin auf Port 1000 hört. Und Ihre torren Programm sagt, Ich bin auf Port 3000 hört. Und Skype sagt, ich bin mit Port 4000. Also, wenn Sie einige Daten zu bekommen, die gehört eine dieser Anwendungen, die Daten mit welchem ​​Port markiert es tatsächlich sollte zusammen gesendet werden. Also das sagt, oh, ich gehöre auf Port 1000. Ich weiß, dann muss ich diese weiterleiten entlang auf meiner Web-Browser. Also der Grund, es ist hier von Bedeutung ist, dass Web-Server sind in der Regel hören auf Port 80. Also, wenn ich Facebook.com kontaktieren, ich bin Kommunikation mit einigen Maschine. Aber ich muss sagen, welcher Anschluss, dass Maschine möchte ich mit zu kommunizieren. Und Web-Server sind in der Regel Port 80. Wenn sie wollten, könnten sie es eingestellt bis so listet es als auf Port 7000. Und dann in einem Web-Browser, konnte ich manuell eingeben Facebook.com: 7000 bis senden die Anfrage an Port 7000 der Facebook-Web-Server. DAVID J. MALAN: Und in diesem Fall, auch wenn wir nicht verlangen, dass die Menschen erwähne das, in diesem Fall, welchen Port würde der Antrag tatsächlich gehen? Versuchen Sie es erneut. Genau. Suchen Sie nicht nach, aber eine Subtilität das ist es keiner der Letzte. ROB BOWDEN: Also die HTTPS, da es hören, die speziell für die verschlüsselt, es ist auf Port 4430. ZIELGRUPPE: Und E-Mails sind 25, oder? DAVID J. MALAN: Outbound E-Mails, 25, yep. ROB BOWDEN: Ich weiß nicht einmal die meisten wissen die - all die unteren sind in der Regel für Dinge vorbehalten. Ich denke, alles unter 1024 ist reserviert. ZIELGRUPPE: Warum haben Sie sagen, 3 war die falsche Nummer? ROB BOWDEN: Weil in einer IP-Adresse, es gibt vier Gruppen von Ziffern. Und sie sind von 0 bis 255. So 192.168.2.1 ist eine gemeinsame lokalen Netz IP-Adresse. Beachten Sie, alle, die weniger als 255 sind. Also, wenn ich mit 300 gestartet wird, dass konnte nicht möglicherweise eine der Zahlen. DAVID J. MALAN: Aber das dumme Clip aus - war es CSI, wo sie ein Zahl, die zu groß war für die IP-Adresse. ROB BOWDEN: Sie haben Fragen dazu? Der nächste, so dass komplette Veränderung in Thema, aber wir haben diese PHP-Array für die Häuser in der Quad. Und wir haben eine ungeordnete Liste. Und wir jedes Listenelement ausdrucken möchten nur das Haus Namen enthält. So haben wir eine foreach-Schleife. Also denken Sie daran, die Syntax ist foreach Array als Element im Array. So durch jede Iteration der Schleife, Haus wird auf einem der nehmen Werte innerhalb des Arrays. Bei der ersten Iteration, Haus Cabot Haus sein wird. Auf einer zweiten Iteration Haus wird Courier sein Haus und so weiter. Also für jeden Quad als Haus, wir sind nur gehen, um zu drucken - Sie könnte auch hallte haben - das Listenelement und dann der Name des Hauses und schließen Sie dann das Listenelement. Die geschweiften Klammern sind hier optional. Und dann sagte, dass wir auch in der Frage selbst, denken Sie daran, schließen Sie die ungeordnete Liste-Tag. Also müssen wir PHP-Modus zu verlassen um dies zu tun. Oder wir haben hallte könnte die schließen ungeordnete Liste-Tag. DAVID J. MALAN: Auch gut hier würde gewesen, eine alte Schule für eine Nutzung Schleife mit einem $ i = 0 0 und zählt mit zu herauszufinden, die Länge des Strahlen. Völlig auch in Ordnung, nur etwas wortreicher. ZIELGRUPPE: Also, wenn Sie im Begriff waren, [Unverständlich], würden Sie tun - Ich vergesse, was die Schleife [unverständlich] ist. Würden Sie $ Quad Halterung i? DAVID J. MALAN: Genau. Ja, genau. ROB BOWDEN: Sonst noch was? DAVID J. MALAN: In Ordnung. Trade-offs. Es gab also Bündel von Antworten kann jeder von diesen. Wir waren eigentlich nur auf der Suche nach etwas Zwingendes für ein auf dem Kopf und eine Kehrseite. Und Nummer 16 fragte, Validierung Nutzer Eingangs Client-Seite, wie mit JavaScript anstelle der Server-Seite, wie mit PHP. Also, was ist ein auf dem Kopf von Dabei Client-Seite? Nun, das ist eines der Dinge, die wir vorgeschlagen dass Sie Wartezeit zu reduzieren, da Sie nicht zu stören, die in Kontakt Server, die einige Minuten dauern kann Millisekunden oder sogar ein paar Sekunden dass durch die Vermeidung und nur Validierung Nutzer zur Client-Seite durch Auslösung eines auf-submit Handler und nur die Kontrolle, haben sie geben etwas für Name? Haben sie etwas zu geben in für E-Mail-Adresse? Haben sie wählen Sie ein Studentenwohnheim aus das Dropdown-Menü? Sie können sie sofortiges Feedback geben mit der Gigahertz-Computer oder was auch immer sie haben, das ist tatsächlich auf ihrem Schreibtisch. So ist es nur eine bessere Benutzer erleben in der Regel. Aber eine Kehrseite des Tuns Client-Seite Validierung, wenn Sie es tun, auch ohne Dabei serverseitige Validierung ist, dass Äusserste, was man weiß, CS50 kommen dass man einfach alle Daten, die Sie wollen senden einem Server eine beliebige Anzahl von Möglichkeiten. Ehrlich gesagt, in fast jedem Browser, können Sie Klicken Sie um in die Einstellungen und nur JavaScript auszuschalten, das würde daher, deaktivieren Sie jede Form von Validierung. Aber Sie könnten auch daran erinnern, dass auch ich haben einige obskure Dinge in der Klasse mit telnet und eigentlich vorgibt, ein Browser durch Senden get Anforderungen an einen Server. Und das ist sicherlich nicht mit einem beliebigen JavaScript. Das ist nur mir der Eingabe von Befehlen an einer Tastatur. Also wirklich, jeder Programmierer innerhalb genug Komfort mit der Web-und HTTP könnten Daten senden, was er oder sie will zu einem Server ohne Validierung. Und wenn der Server nicht auch die Überprüfung, haben sie mir einen Namen zu geben, ist dies tatsächlich eine gültige E-Mail-Adresse, tat sie wählen, ein Wohnheim, könnten Sie am Ende bis Einfügen gefälschte oder einfach nur leere Daten in Ihre Datenbank, die wahrscheinlich wird nicht eine gute Sache sein, wenn Sie wurden unter der Annahme, es war da. Also das ist eine lästige Realität. Aber im allgemeinen clientseitige Validierung ist groß. Es bedeutet aber zweimal so viel Arbeit. Obwohl es existieren verschiedene Bibliotheken, JavaScript-Bibliotheken für Beispiel, die so viel zu machen, weniger Kopfschmerzen. Und Sie können einige der Code wiederverwenden Server-Side-, Client-Seite. Aber schon klar, dass es in der Regel zusätzliche Arbeit. Ja. ZIELGRUPPE: Also, wenn wir nur die weniger sicher - DAVID J. MALAN: [lacht] Ugh. Diese sind immer schwieriger diejenigen zu entscheiden. ROB BOWDEN: Das wäre angenommen. DAVID J. MALAN: Was? ROB BOWDEN: ich dieses Problem geschaffen. Das wäre akzeptiert worden. DAVID J. MALAN: Ja. ZIELGRUPPE: Kühle. ROB BOWDEN: Aber haben wir nicht akzeptieren für die erste - gut, das, was wir suchen, ist etwas, wie Sie nicht zu haben, Kommunikation mit dem Server. Wir haben nicht einfach akzeptieren schneller. PUBLIKUM: Was ist mit Sie Seite nicht neu laden? ROB BOWDEN: Ja. Das war eine akzeptierte Antwort. DAVID J. MALAN: Alles, wo wir fühlten uns es war eher als nicht wahrscheinlich dass Sie wussten, was Sie waren sagen, das ist eine schwierige Linie manchmal ziehen. Mit einer verketteten Liste statt einer Anordnung zur Aufrechterhaltung eines sortierte Liste von ganzen Zahlen. Also ein auf dem Kopf zitieren wir oft mit verknüpften Listen, die motiviert ihre ganze Einführung war man Dynamik bekommen. Sie können wachsen. Sie können schrumpfen. So müssen Sie nicht haben, um durch den Reifen springen mehr Speicher tatsächlich schaffen mit einem Array. Oder Sie müssen nicht nur sagen, sorry, Benutzer. Das Array gefüllt ist. So dynamische Wachstum der Liste. Ein Nachteil ist aber der verbundenen Listen? ZIELGRUPPE: Es ist linear. Die Suche auf verketteten Liste ist linear statt dessen, was Sie sich einloggen DAVID J. MALAN: Genau. Die Suche auf einer verketteten Liste ist linear, auch wenn es sortiert, da kann man nur folgendermaßen Semmelbrösel, diese Zeiger vom Beginn der Liste bis zum Ende. Sie können nicht nutzen, wahlfreien Zugriff und also binäre Suche, auch wenn es sortiert, dass man zu tun mit einem Array. Und es gibt auch eine andere Kosten. Ja. ZIELGRUPPE: Speicher ineffizient? DAVID J. MALAN: Ja. Nun, das würde ich nicht unbedingt sagen ineffizient. Aber es kostet Sie mehr Speicher, weil du 32 Bit für jeden Bedarf Knoten für den zusätzlichen Zeiger, um dest für eine einfach verkettete Liste. Nun, wenn Sie nur ganze Zahlen und Speicherung Sie hinzufügen den Zeiger sind, ist, dass tatsächlich Art von nicht-trivial. Es ist eine Verdoppelung der Menge an Speicher. Aber in Wirklichkeit, wenn Sie die Speicherung sind ein verkettete Liste von Strukturen, die haben könnte 8 Bytes, 16 Bytes, noch mehr als das, vielleicht ist es weniger eines Grenzkosten. Aber es ist eine Kosten dennoch. Also entweder von denen hätte war fein wie Nachteile. 18. Mit PHP anstatt C zu schreiben ein Befehlszeilenprogramm. So, hier ist es oft schneller sich für eine Sprache wie PHP oder Ruby oder Python. Sie müssen nur schnell öffnen bis einem Texteditor. Sie haben viel mehr Funktionen zur Verfügung. PHP hat die Küchenspüle von Funktionen, wohingegen in C, Sie haben sehr, sehr wenig. In der Tat, die Jungs wissen, auf die harte Tour dass Sie nicht haben, Hash-Tabellen. Sie müssen nicht Listen verknüpft haben. Wenn Sie diejenigen wollen, müssen Sie setzen sie sich. So ein Kurspotenzial von PHP oder wirklich jede interpretierte Sprache ist die Schnelligkeit mit dem Sie Code schreiben. Aber ein Nachteil, sahen wir, als ich schnell eine Misspeller Schlag Umsetzung in der Vorlesung mit PHP, ist dass die Verwendung einer übersetzten Sprache ist in der Regel langsamer. Und wir sahen, dass nachweislich ein Erhöhung in der Zeit von 0,3 Sekunden bis 3 Sekunden wegen der Auslegung dass tatsächlich passiert. Ein weiterer Vorteil war, dass Sie nicht zu kompilieren. Also es beschleunigt auch die Entwicklung nebenbei bemerkt, weil Sie nicht haben, zwei Schritte, um ein Programm. Sie haben nur eine. Und so, das ist ziemlich überzeugende als auch. Mit einer SQL-Datenbank statt eine CSV-Datei, um Daten zu speichern. So SQL-Datenbank ist für pset7 verwendet. CSV-Dateien, die Sie nicht viel nutzen. Aber du hast es so verwendet, indirekt in pset7 auch durch Gespräche mit Yahoo Finance. Aber CSV ist wie eine Excel-Datei, sondern super einfach, in der die Spalten nur durch Komma abgegrenzt innen eines ansonsten Textdatei. Und mit einer SQL-Datenbank ein wenig mehr überzeugend. Es ist ein auf dem Kopf, weil Sie die Dinge wie auswählen und einfügen und löschen. Und Sie erhalten, vermutlich, Indizes, MySQL und andere Datenbanken, wie Oracle, bauen für Sie in Erinnerung, die bedeutet, dass Ihr wählen ist wahrscheinlich nicht werde linear von oben nach unten sein. Es ist eigentlich los, um etwas zu sein wie binäre Suche oder etwas im Geiste. So sind sie in der Regel schneller. Aber ein Nachteil ist, dass es ist nur mehr Arbeit. Es ist mehr Aufwand. Sie haben zu den Datenbanken zu verstehen. Sie haben, um es einzurichten. Sie benötigen einen Server zu laufen die Datenbank auf. Sie müssen verstehen, wie es zu konfigurieren. Das sind also nur diese Arten von Kompromissen. Während eine CSV-Datei, können Sie schaffen sie mit gedit. Und du bist gut zu gehen. Es gibt keine Komplexität darüber hinaus. Verwendung eines Trie anstelle einer Hashtabelle mit separater Verkettung zu speichern ein Wörterbuch der Wörter erinnert von pset5. So versucht ein auf den Kopf, in der Theorie zumindest ist was? Constant Zeit, zumindest wenn Sie Hashing von jedem der einzelnen Buchstaben in einem Wort, wie Sie könnte für pset5 haben. Das könnte fünf Hashes, sechs sein Hashes, wenn es fünf oder sechs Buchstaben in dem Wort. Und das ist ziemlich gut. Und wenn es auf eine obere Grenze, wie Ihre Worte lang sein könnte, ist, dass tatsächlich asymptotisch konstante Zeit. Während eine Hash-Tabelle mit separater Verkettung, das Problem, dass es mit Art der Datenstruktur ist, dass der Leistung der Algorithmen in der Regel abhängig von der Anzahl von Dingen bereits in der Datenstruktur. Und das ist definitiv der Fall mit Ketten, wobei die mehr Sachen, die man setzen in einer Hash-Tabelle, die mehr denen Ketten gehen, was im schlimmsten bedeutet Fall das, was Sie vielleicht gesucht werden ist ganz am Ende einer dieser Ketten, die effektiv obliegt in etwas linear. Jetzt, in der Praxis könnte es absolut der Fall, dass eine Hash-Tabelle ist mit Ketten schneller ist als eine entsprechende Trie Umsetzung. Aber das ist aus verschiedenen Gründen, unter sind die Versuche verwenden eine ganze Reihe von Speicher Das kann in der Tat langsam Dinge unten, weil Sie nicht bekommen, schön Vorteile der so genannte Caching, wo die Dinge, die nahe beieinander liegen im Speicher zugegriffen werden kann häufig schneller. Und manchmal kann man mit zu kommen eine wirklich gute Hash-Funktion. Auch wenn Sie ein bisschen verschwenden Speicher, könnte man in der Tat in der Lage, schnell und nicht die Dinge finden, so schlecht, wie linear. Also kurz gesagt, es war nicht unbedingt mit irgendwelchem ​​eine oder sogar zwei bestimmte Dinge, die wir gesucht haben. Wirklich alles, was überzeugend als oben und unten allgemein unser Auge gefangen. ROB BOWDEN: Also für den Kopf, wir haben nicht selbst akzeptieren "schneller." Sie musste etwas darüber zu sagen. Selbst wenn man theoretisch schneller, sagte, wir wussten, dass Sie Art verstanden dass es 0 von 1. Und Hash-Tabelle, in der Theorie, nicht 0 von 1. Die Erwähnung nichts über Laufzeit in der Regel haben Sie die Punkte. Aber "schneller", die meisten Lösungen auf die große Tafel, die versucht waren, wurden objektiv langsamer als Lösungen waren, dass Hash-Tabellen. So schneller an und für sich ist nicht wirklich wahr. DAVID J. MALAN: Dom de dom dom. Ich bin wahrscheinlich der einzige, der erkennt, das ist, wie das ist zu vermuten, ausgesprochen werden, oder? ROB BOWDEN: Ich hatte wirklich keine Ahnung. DAVID J. MALAN: Es machte Sinn in meinem Kopf. ROB BOWDEN: Ich mache diese. OK. Das ist also die eine, wo man ziehen musste das Diagramm ähnlich wie Sie vielleicht haben auf früheren Prüfungen gesehen. Also lasst uns einfach, dies zu betrachten. So aus dem HTML-Knoten haben wir zwei Kinder, der Kopf und der Körper. Also haben wir verzweigen - Kopf und Körper. Der Kopf hat eine Titel-Tag. So haben wir einen Titel. Nun, die eine Sache, eine Menge Leute vergessen ist, dass diese Textknoten sind Elemente innerhalb dieses Baumes. Also hier passieren wir sie als Ovale zeichnen um sie von diesen zu unterscheiden Knotentypen. Aber Mitteilung auch hier haben wir oben, Mitte und unten wird am Ende als Textknoten. So vergessen die war etwas einer gemeinsamen Fehler. Der Körper hat drei Kinder - diese drei divs. So div, div, div und dann der Text Knoten Kinder dieser divs. Das ist ziemlich viel es für diese Fragen. DAVID J. MALAN: Und es ist bemerkenswert, auch wenn wir uns nicht auf diese wohnen Details in der Zeit verbringen wir auf JavaScript, dass die Bestellung der Fall ist, in Tatsächlich Angelegenheit technisch. Also, wenn Kopf kommt, bevor der Körper in HTML, dann sollte es die erscheinen in der aktuellen DOM links des Körpers. Dass sein ist in der Regel nur FYI, so genannten Dokument um, wo es nicht egal. Und wenn du die Implementierung eines Parsers ein Programm, das HTML in Gebäude liest auf den Baum im Speicher, um ehrlich zu sein, das ist wohl intuitiv, was Sie tun es trotzdem - von oben nach unten, von links nach rechts. ROB BOWDEN: Fragen dazu? Sollte ich das nächste? DAVID J. MALAN: Sicher. ROB BOWDEN: OK. Das ist also der Pufferüberlauf Angriff Frage. Die Hauptsache ist, hier zu erkennen ist, na ja, wie könnte ein Gegner Trick dieses Programm in der Ausführung beliebigen Code? So argv1 die erste Befehlszeile Argument zu diesem Programm, das sein kann beliebig lange. Aber hier sind wir mit memcpy kopieren argv1, die hier ist bar. Wir übergeben Sie als Argument. Und so ist es unter den Namen bar. Also sind wir memcpying bar in diesen Puffer c. Wie viele Bytes zu kopieren wir? Nun jedoch viele Bytes Bar passiert, verwenden, die Länge dieses Argument. Aber c ist nur 12 Byte breit. Wenn wir also eine Befehlszeile ein Argument das ist mehr als 12 Bytes, wir sind werde diese überlaufen insbesondere Puffer. Nun, wie könnte ein Gegner auszutricksen die programmieren, beliebigen Code auszuführen? Also denken Sie daran, dass hier Haupt ruft foo. Und so ist, dann Haupt Anrufe foo. Ziehen wir dies. So haben wir unsere Stack. Und hat ein Hauptstapelrahmen an der Unterseite. An einem gewissen Punkt, foo Haupt Anrufe. Nun, sofort, foo Haupt Anrufe. Und so foo bekommt seinen eigenen Stack-Frame. Jetzt, an einem gewissen Punkt, foo wird, um zurückzukehren. Und ging foo Renditen, müssen wir wissen, an welche Codezeile innerhalb der Haupt wir waren, um zu wissen, wo wir sollten in Haupt wieder aufzunehmen. Wir können foo aus einer ganzen nennen Haufen von verschiedenen Orten. Wie können wir wissen, wo sie zurückkehren? Nun müssen wir, dass irgendwo zu speichern. Also irgendwo hier rechts herum, speichern wir wo wir noch einmal zurück foo Renditen. Und das ist die Absenderadresse. So, wie ein Gegner könnte nutzen hierfür ist die Tatsache, dass dieser Puffer c gespeichert ist, lassen Sie uns sagen, hier ist c. Also haben wir 12 Bytes für c bekam. Dies ist c. Und das ist Stapelring foo. Also, wenn der böswillige Benutzer mehr geht Bytes als 12, oder sie einen Befehl eingeben Zeilenargument, die länger als 12 ist Zeichen, dann werden wir diesen Puffer überlaufen. Wir können weitermachen. Und irgendwann, weit gehen wir genug, dass wir beginnen Überschreiben Sie diese Absender-Adresse. Also, wenn wir die Rücksprungadresse zu überschreiben, Dies bedeutet, dass, wenn foo Renditen, sind wir dorthin, wo die Rückkehr böswilliger Benutzer sagt es von was es Wert eingegeben wird, gleichgültig mit welchen Zeichen, die der Benutzer eingegeben werden. Und so, wenn der böswillige Benutzer wird besonders klug, er kann dies zurück zu irgendwo in der printDef Funktion oder irgendwo in der malloc Funktion, nur irgendwo willkürlich. Aber auch klüger ist, was, wenn er der Benutzer zurückkehrt, genau hier. Und dann Ausführen starten diese als Codezeilen. Also an diesem Punkt, der Benutzer eingeben kann was er will in dieser Region. Und er hat die komplette Kontrolle über das Programm. Fragen dazu? Also komplett die nächste Frage ist die Neuimplementierung von foo in einer Weise dass es nicht mehr anfällig. Also gibt es ein paar Möglichkeiten Sie könnte das getan haben. Wir haben immer noch nur c wobei der Länge 12. Man könnte dies geändert haben als Teil der Lösung. Wir haben auch einen Scheck zu machen Bar war sicher nicht null ist. Obwohl Sie nicht brauchen dass für die volle Punktzahl. Also sind wir die erste Prüfung String-Länge-Bar. Wenn es mehr als 12, dann nicht tatsächlich tun die Kopie. Also das ist ein Weg, es zu reparieren. Eine weitere Möglichkeit der Fixierung ist es anstelle c mit der Länge nur 12, lassen Sie es werden der Länge strlen (bar). Eine weitere Möglichkeit der Fixierung ist eigentlich nur, um zurückzukehren. Also, wenn Sie hatte gerade losgeworden alle dieses, wenn Sie hatte gerade alle gelöscht Zeilen Code, würden Sie bekommen haben volle Punktzahl, da diese Funktion nicht wirklich etwas zu erreichen. Es ist das Kopieren der Befehlszeile Argument in eine Array in seine lokalen Stack-Frame. Und dann die Sache zurück. Und was auch immer es versierter ist weg. Also Rückkehr war auch eine ausreichende Weg, um die volle Punktzahl. DAVID J. MALAN: Nicht ganz der Geist der die Frage, aber die pro akzeptabel spec dennoch. ROB BOWDEN: Fragen zu einem der das? Die eine Sache, dass Sie mindestens benötigt, um Code kompiliert haben. Also auch wenn Sie nicht technisch anfällig, wenn der Code nicht kompilieren, können wir nicht akzeptieren wollten, dass. Keine Fragen? OK. DAVID J. MALAN: Wollen Sie , diesen Titel zu sagen? ROB BOWDEN: Nein DAVID J. MALAN: Also in diesem, diese war entweder gute oder schlechte Nachrichten. Dies ist buchstäblich das gleiche Problem als erste Quiz. Und es ist fast die gleiche Problem pset1. Aber es wurde bewusst vereinfacht, um sein eine einfachere Pyramide, eine, die sein können, mit einem leicht gelöst einfacher Iteration. Und wirklich, was wir auf immer hier war nicht so sehr die Logik, weil wahrscheinlich zu diesem Zeitpunkt, sind Sie mehr Komfort als Sie waren, in der ersten Woche mit for-Schleifen oder warum Loops, aber wirklich auseinander zu necken, dass Sie ein wenig bequem mit der sind Vorstellung, dass PHP ist nicht nur über das, was Programmierung. Es kann tatsächlich als eine Sprache verwendet werden, Befehlszeilenprogramme schreiben. Und in der Tat ist das, was wir versuchten, Ihre Aufmerksamkeit zu zeichnen. Dies ist ein Kommandozeilen-PHP-Programm. Also C-Code hier, während korrekt in C, nicht für PHP zu korrigieren. Aber der Code ist wirklich das gleiche. Wenn Sie die Lösungen für Quiz vergleichen 0 gegen ein Quiz, werden Sie feststellen, dass es ist fast identisch mit Ausnahme einige Dollar-Zeichen und für die Fehlen eines Datentyps. Insbesondere dann, wenn wir einen Blick hier, Sie werden sehen, dass wir durchlaufen, in diesem Fall von 1 bis 7 durch. Wir hätten es getan haben 0 Index. Aber manchmal denke ich, es ist nur mental leichter, über Dinge zu denken von 1 bis 7. Wenn Sie einen Block, dann zwei Blöcke, dann drei, dann Punkt, Punkt, Punkt sieben. Wir haben j auf 1 initialisiert und dann zählen auf bis zu i. Und hier ist alles ansonsten identisch. Aber bemerkenswert sind ein paar Dinge. Wir geben Ihnen diese beiden Zeilen, diese erste ein, goofily als Kram genannt für scharfe Knall. Und dass, nur gibt den Pfad, der Ordner, in dem ein Programm sein kann festgestellt, dass Sie verwenden möchten um diese Datei zu interpretieren. Und dann die Linie nach, dass der bedeutet natürlich, geben Sie PHP-Modus. Und die Zeile ganz unten bedeutet Ausfahrt PHP-Modus. Und das funktioniert im Allgemeinen mit interpretierte Sprachen. Es ist irgendwie ärgerlich, wenn Sie schreiben, eine Programm in einer Datei namens foo.php. Und dann die Benutzer müssen nur erinnern, OK, um dieses Programm ausführen, ich auf den Typ "php foo.php Raum." Art von ärgerlich, wenn sonst nichts. Und es zeigt auch, dass das Programm ist in PHP, das ist nicht alles geschrieben das Beleuchten des Benutzers. So können Sie die. Php ganz zu entfernen Rückruf von Vortrag. Und Sie können tatsächlich tun. / Foo, wenn Sie es, indem sie es chmodded haben ausführbaren Datei. So chmod a + x foo wäre getan. Und wenn Sie auch den Kram hier hinzufügen. Aber wirklich, war das Problem immer bei Ausdruck von etwas. Kein HTML, kein C-Code-Sicherheit, nur einige PHP. So Milo dann in Problem 25 zurück. Und in 25, wurden Sie die folgenden gegeben Skelett-Code, der eine war ziemlich einfache Web-Seite. Und die saftigen Teil HTML-weise war nach unten Hier, wo wir innerhalb des Körpers haben eine Form, die eindeutige ID der Eingänge hat innerhalb dessen war zwei Eingänge, einen mit einer Idee des Namens, eines mit einer Idee der Taste. Die erste war Typ Text, der zweite vom Typ einreichen. Und so haben wir euch eigentlich mehr Zutaten als man benötigt, nur so ihr hattet Optionen, mit denen um dieses Problem zu lösen. Sie müssen nicht unbedingt brauchen alle diese IDs. Aber es ermöglicht Ihnen zu lösen sie auf unterschiedliche Weise. Und an der Spitze, feststellen, dass Das Ziel war es, auslösen ein Fenster wie diese - Hallo, Milo! - Pop-up im Browser mit die Super-einfach, wenn nicht hässlich, Alarm-Funktion. Und so, letztlich läuft es darauf hinaus konzeptionell irgendwie Hören für Einreichungen des Formulars Client-Seite , Nicht die Server-Seite, irgendwie reagiert auf diese Vorlage durch packte den Wert, den der Benutzer eingegeben in dem Namensfeld, und dann Anzeige in den Körper einer Warnung. So ein Weg, dies zu tun ist mit jQuery, die ein wenig aussieht syntaktisch verwirrend auf den ersten. Sie können dies mit reinem DOM-Code zu tun - document.getelement nach ID. Aber lassen Sie uns einen Blick auf diese Version. Ich habe ein paar wichtige Linien zuerst. So ein, haben wir diese Linie, das ist, identisch, was man gesehen haben in, glaube ich, form2.html aus der Klasse 9 in der Woche. Und das ist nur zu sagen, führen der folgende Code, wenn das Dokument ist fertig. Da dies nur wichtig, weil HTML-Seiten werden oben zu lesen unten, von links nach rechts. Und deshalb, wenn Sie versuchen zu tun, etwas in Code hier oben bis zu einem gewissen DOM Element, einige HTML-Tag, das ist nach unten hier, bist du es tun zu früh, weil dies nicht sogar in den Speicher gelesen wurden. So sagen diese document.ready Linie, wir sagen, hier ist ein Code, Browser. Aber nicht ausführen Sie dies, bis die ganze Dokument fertig ist, ist, dass die DOM Baum im Speicher vorhanden ist. Dieser ist ein wenig mehr einfach, wenn ein syntaktisch bisschen anders, wo ich sage, Halte das HTML-Element, dessen einzigartige Kennung ist Eingänge. Das ist, was die Hash-Tag bezeichnet, die eindeutige ID. Und dann rufe ich. Einreichen. So. Einreichen hier ist eine Funktion, sonst als ein Verfahren bekannt, das innerhalb des Objekts auf der linken Seite gibt, dass ich nicht zu markieren. Also, wenn Sie denken, der Eingänge als Objekt in Erinnerung - und in der Tat ist es. Es ist ein Knoten in einem Baum - . Einreichen Einrichtung, wenn diese Form mit Diese ID wird vorgelegt, führen Mit dem folgenden Code. Ich weiß nicht, was der Name der Funktion ist, dass ich die Ausführung. So, hier bin ich mit, wie früher, was ist genannte Lambda-Funktion oder eine anonyme Funktion. Es ist gar nicht intellektuell interessante anders als es keinen Namen hat, das ist gut, wenn Sie nur sind jemals, es einmal anzurufen. Und innen gibt habe ich eigentlich umgehen die Vorlage des Formulars. Ich zuerst eine Variable deklarieren Wert genannt. Und was ist dann die Wirkung dieser hervorgehobene Teil jetzt hier? Was bedeutet, dass bei einem zu tun hohem Niveau für mich? Zielgruppe: IT bekommt den Wert, den die Benutzer nicht in der unten stehenden HTML-Code. Es wird diese ID und dann findet den Wert der IT. DAVID J. MALAN: Genau. Es packt die Knoten, deren einzigartige Kennung ist der Name. Es wird der Wert darin, die ist vermutlich, was der Benutzer eingegeben selbst zu tragen. Und dann speichert er, dass in der Variable namens Wert. Nebenbei haben Sie auch könnte dies getan, ein wenig anders. Indem er etwas völlig akzeptabel var Wert liegen wird document.getElementById. Und deshalb ist es ein wenig langweilig, nicht mit jQuery. "Name". Wert. So völlig akzeptabel. Verschiedene Möglichkeiten, dies zu tun. jQuery nur neigt dazu, ein wenig mehr sein, prägnant und definitiv mehr beliebt unter Programmierern. Nun, ich mache ein bisschen Verstand zu überprüfen, weil in das Problem Aussage, die wir ausdrücklich gesagt, wenn der Benutzer hat noch nicht eingegeben seine Namen, eine Benachrichtigung nicht zeigen. Aber man kann für das überprüfen, indem Sie einfach Kontrolle für die leere Zeichenfolge für eine Zitat-Zitat Ende, wenn es nichts wirklich da. Aber wenn es nicht gleich quote-unquote, Ich möchte Warnungen rufen. Und das Interessante dabei ist, dass wir sind mit den Plus-Operator, der tut, was in JavaScript? Verketten. So ist es wie PHPs Punkt-Operator. Gleiche Idee, etwas andere Syntax. Und ich bin nur der Erstellung der Zeichenfolge, Sie sah auf dem Screenshot - Hallo, so und so. Und dann das letzte Detail ist diese. Warum habe ich falsch innen zurück dieser anonymen Funktion? ZIELGRUPPE: Es gibt keinen Wert. Sie steckte es in Form. Es sagt nur, wenn der Wert nicht gleich leer, dann tun Sie es. Es war eine leere in dieser Vorlage. DAVID J. MALAN: OK. Aber vorsichtig. Es ist niemand anderes hier. Und das return false außerhalb der if-Bedingungen. Also das hervorgehobene Zeile, return false, führt, egal was, wenn das Formular abgeschickt wird. Was false zurück innerhalb dieses Event-Handler, wie es heißt, die Veranstaltung in Frage als Vorlage? ZIELGRUPPE: Weil es nur einmal. DAVID J. MALAN: nur einmal passiert. Nicht ganz. Ja? ZIELGRUPPE: Es verhindert, dass das Formular von Vorlage auf das Standardverhalten, was die Seite neu zu laden machen würde. DAVID J. MALAN: Genau. Also ich bin Überlastung der Begriff hier einreichen, weil ich sage, ist die Form eingereicht werden. Aber, wie Sie vorschlagen, ist es eigentlich nicht wurde im wahrsten HTTP Weg übermittelt. Wenn Sie auf Absenden, weil Sie auf unserer onSubmit Handler, wir Abfangen dass Form Vorlage so zu sprechen. Wir sind dann unser Ding mit JavaScript-Code. Aber ich bin bewusst false zurück, weil das, was ich will nicht geschehen ein Bruchteil einer Sekunde später ist für die ganze Form sich auf die Bahn abgegeben werden Server mit Schlüssel-Wert-Paare durch Veränderung die URL, die so etwas wie q = Katzen oder was auch immer wir getan haben, zum Beispiel in der Klasse. Ich glaube nicht, dass das passiert, weil gibt es keinen Server für diese Abhör bilden Unterwerfung. Es ist rein in JavaScript-Code. Und das ist, warum ich noch nicht einmal eine action-Attribut auf meiner Form, weil ich nicht für dieses beabsichtigen, immer auf den Server zu gehen. So ist es, die eingereicht. Aber wir Abfangen diese Form Einreichung und verhindern, dass die Standard- Verhalten, das eigentlich gehen den ganzen Weg auf den Server. ZIELGRUPPE: So halten es Client-Seite. DAVID J. MALAN: Halten es Client-Seite. Genau richtig. Weiter oben war mein oh MySQL. ROB BOWDEN: OK. So war diese erste Frage in der Regel rau für die Menschen. Obwohl die späteren ging besser. Sie hatten also die richtigen Daten wählen Typen für beide Säulen. Und beide von diesen haben einige Dinge über sie, dass machen die Wahl schwer. So int war keine gültige Geben Sie für Nummer. Der Grund dafür ist eine 12-stellige Konto Nummer, ist ein int nicht groß genug, um Gesamt speichern Ziffern. So würde eine gültige Wahl eine große gewesen sein int, wenn Sie wissen, dass passiert. Eine andere Wahl hätte ein char-Feld der Länge 12. Also entweder von denen würde gearbeitet haben. Int nicht. Jetzt, Balance, denken Sie zurück an pset7. So haben wir speziell Dezimalstelle auf speichern Sie den Wert von Aktien oder - DAVID J. MALAN: Cash. ROB BOWDEN: Cash. Wir verwendeten Dezimalzahl, die Menge an zu speichern Geld, das der Benutzer derzeit. Also der Grund, warum wir das tun, ist weil, denken Sie daran, die Schwimmer. Es gibt in Gleitkomma-Präzision. Es kann nicht genau das Geld speichern Werte wie wir wollen hier. So Dezimalzahl ist in der Lage, genau Store etwas, sagen wir, zwei Dezimalstellen. Das ist, warum Balance, sie wollen wir Dezimal-und nicht schwimmen zu können. DAVID J. MALAN: Und auch, auch, obwohl das wäre vielleicht klug in anderen Zusammenhängen zu denken, vielleicht ist eine Chance für einen int. Ich werde einfach im Auge behalten Dinge in ein paar Cent. Da haben wir gezeigt, explizit die Standard Wert des Seins 100.00, dass heißt, es könnte nur ein int sein. Und noch eine Zahl mit Subtilität zu war, dass es nicht gemeint um eine Fangfrage sein. Aber daran erinnern, dass ein int in MySQL, wie in C, zumindest in der Gerät ist 32-Bit. Und auch wenn wir nicht erwarten, dass Sie genau wissen, wie viele Stellen, die Mittel, nicht daran erinnern, dass die größte Zahl Sie potentiell darstellen kann mit einem 32-Bit-Zahl ist in etwa, was? Welche Nummer haben wir immer sagen? 2 bis 32, die in etwa das, was ist? Sie müssen nicht genau wissen. Aber grob ist hilfreich im Leben. Es ist rund 4 Milliarden Euro. Also haben wir gesagt, dass ein paar mal. Ich weiß, ich habe das ein paar Mal gesagt. Und es ist rund 4 Milliarden Euro. Und das ist eine gute Regel Faust wissen. Wenn Sie 8-Bit-, 256 haben ist die magische Zahl. Wenn Sie 32 Bit, 4 haben Milliarden geben oder nehmen. Also, wenn Sie nur auf 4 Milliarden zu schreiben, Sie werden sehen, dass es weniger Stellen als 12, was bedeutet, dass es nicht klar Ausdrucks genug zu erfassen ein 12-stellige Kontonummer. ROB BOWDEN: OK. So gingen die anderen besser. So nehme an, dass die Bank schreibt eine 20 $ monatlich Wartungsgebühr auf alle Konten. Mit SQL-Abfrage, welche die Bank konnte Abzug $ 20 von jedem Zahl, auch wenn es ergeben sich einige negative Salden? Also im Grunde gibt es vier Haupttypen von Abfragen - einzufügen, wählen, aktualisieren und löschen. Also, was tun wir denken, wir sind hier benutzen? Aktualisieren. Werfen wir also einen Blick. So, hier sind wir zu aktualisieren. Welche Tabelle aktualisieren wir Konten? So aktualisieren Konten. Und dann die Syntax sagt, was Konten aktualisieren wir? Nun, wir Balance-Einstellung gleich die aktuellen Wert von minus 20 Balance. So wird dies alle Zeilen aktualisieren von Konten, Subtraktion $ 20 aus dem Gleichgewicht. DAVID J. MALAN: Ein häufiger Fehler hier auch wenn wir es manchmal verziehen, war es eigentlich PHP-Code hier Aufruf der Query-Funktion oder setzen Anführungszeichen um alles, dass nicht brauchen, um dort zu sein. ROB BOWDEN: Denken Sie daran, dass MySQL eine eigene Sprache von PHP. Wir passieren zu MySQL in PHP zu schreiben. Und PHP wird dann Senden über dem MySQL-Server. Aber Sie brauchen nicht in PHP, um kommunizieren mit einem MySQL-Server. DAVID J. MALAN: Genau. Also keine Variablen mit Dollar-Zeichen In diesem Zusammenhang sein. Es kann nur die gesamte Mathematik zu tun innerhalb der Datenbank. ROB BOWDEN: OK. Also das nächste. Ist das der nächste? Ja. Also mit welcher SQL-Abfrage, die die Bank Abrufen der Kontonummern der reichsten Kunden, die mit Guthaben mehr als 1000? Also, welche der vier Arten werden wir hier? Wählen Sie. So wollen wir auswählen. Was wollen wir wählen? Welche Spalte wollen wir wählen? Wir wollen speziell Nummer zu wählen. Aber wenn Sie die Sterne, die wir auch das akzeptiert. Nummer So wählen Sie aus, welche Tabelle? Konten. Und dann die Bedingung, die wir wollen? Wo Gleichgewicht größer als 1000. Wir auch mehr akzeptiert oder gleich. Letzte. Mit SQL-Abfrage, welche die Bank konnte Nähe, das heißt, zu löschen jedes Konto, das hat eine Bilanz von 0 $? Also, welcher der vier sind wir gehen zu verwenden? Löschen. So ist die Syntax für das? Löschen von welchem ​​Tisch? Konten. Und dann, auf dem der Zustand wir löschen wollen - wo Saldo gleich Null. So löschen Sie alle Zeilen aus Konten wobei der Rest Null ist. Fragen zu einem von diesen? Möchten Sie die Warteschlange? DAVID J. MALAN: Queue Führer. Also in diesem, haben Sie etwas haben wir vertraut Struktur, die wir erkundet ein Bit in der Klasse neben der Strukturen, welche ein Daten war Struktur im Geiste verwandt. Der Unterschied allerdings mit einer Warteschlange dass wir irgendwie daran erinnern, wer war am Anfang der Warteschlange, in großer Teil, so dass wir mehr machen effizientere Nutzung des Speichers zumindest wenn wir mit einem Array. Da erinnern, wenn wir ein Array, wenn zum Beispiel ist dies die Front die Warteschlange, wenn ich in der Warteschlange bekommen hier und dann jemand in der Leitung wird hinter mir, hinter mir, hinter mir, und eine Person aus der Reihe tanzt, können Sie könnte, wie wir sahen einige unserer menschlichen Freiwillige in der Klasse, haben alle verschieben diese Weise. Aber im allgemeinen, nachdem jeder tun etwas ist nicht die beste Nutzung der Zeit in einem Programm, weil es bedeutet, dass Ihre Algorithmus in dem, was läuft asymptotische Laufzeit? Es ist linear. Und ich fühle mich wie das ist irgendwie dumm. Wenn der nächste in der Reihe ist der nächste Person, die angeblich in die zu gehen ist speichern, nicht alle haben sie sich zusammen zu bewegen. Lassen Sie die Person aus gepflückt werden wenn die Zeit kommt, zum Beispiel. So können wir ein wenig Zeit, es zu retten. Und so zu tun, aber, dass Mittel dass der Kopf der Schlange oder die Anfang der Warteschlange wird zu immer tiefer und tiefer zu bewegen in die Reihe und schließlich könnte tatsächlich wickeln um, wenn wir mit ein Array, um die Menschen zu speichern in dieser Warteschlange. So kann man fast denken, der Array als eine kreisförmige Daten Struktur in diesem Sinne. Also irgendwie muss man den Überblick über die zu halten Größe von ihr oder wirklich das Ende von und dann, wenn der Anfang ist. So schlagen wir vor, dass Sie erklären, eine solche Warteschlange Berufung q es, nur ein Buchstabe. Dann schlagen wir vor, dass die Front auf Null und initialisiert die Größe auf Null initialisiert werden. So jetzt gibt es nichts, innerhalb dieser Warteschlange. Und wir bitten Sie, füllen Sie bitte den Umsetzung der Enqueue unten in derart, dass die Funktion fügt n zu das Ende von q und dann true zurück. Aber wenn q voll ist oder negativ, die Funktion sollte anstelle return false. Und wir gaben Sie ein paar von Annahmen. Aber es sind nicht wirklich funktional relevant ist, existiert nur, dass bool, weil technisch nicht tut bool gibt es in C sei denn, Sie sind ein bestimmte Header-Datei. So, dass war nur sicherstellen, dass es wurden nicht ist das ein Trick Frage Art der Sache. So Enqueue, in der Probe haben wir vorgeschlagen, Lösungen wie folgt realisieren. Eins, prüfen wir zuerst die Leichtigkeit, die niedrig hängenden Früchte. Wenn die Warteschlange voll ist oder die Zahl, die Sie versuchen zu legen sind weniger als Null ist, die wir in die besagte Spezifikation des Problems sollte nicht erlaubt sein, denn wir wollen nur nicht-negative Werte, dann sollten Sie nur sofort false zurück. So einige relativ einfach Fehlerprüfung. Wenn Sie aber, dass die tatsächlichen hinzufügen möchten Nummer, um ein wenig zu tun hatten Sie Denken Sie hier. Und das ist, wo es ein wenig ärgerlich mental, weil man herauszufinden, wie man Rundum behandeln. Aber der Keim der Idee hier ist, dass der Interesse für uns ist, dass Rundum- oft bedeutet, modulare Arithmetik und die Mod-Betreiber, die Seiten Prozent, wo Sie von einem größeren Wert gehen zurück auf Null und dann eins und zwei und drei und dann wieder um auf Null, eins und zwei und drei und so weiter wieder. So schlagen wir vor, die Art und Weise, dies zu tun ist dass wir indizieren sollen in die Array namens Zahlen, bei denen unsere Zahlen liegen. Aber um dorthin zu kommen, wollen wir zuerst zu tun was auch immer die Größe der Warteschlange ist aber dann hinzufügen, dass unabhängig von der vorne auf der Liste steht. Und die Wirkung davon ist, mit uns setzen die richtige Position in der Warteschlange und nicht davon ausgehen, dass die erste Person in der Schlange ist am Anfang, was er oder sie konnte absolut sein, wenn wir wurden ebenfalls verlagert alle. Aber wir sind nur die Schaffung von Arbeit für uns selbst, wenn wir nahmen dass bestimmten Weg. So können wir es relativ einfach zu halten. Wir müssen bedenken, dass wir gerade fügte eine int in der Warteschlange. Und dann haben wir nur true zurück. Inzwischen in dequeue, fragten wir Sie folgendes tun. Umsetzung in einer Weise, dass es aus der Warteschlange entfernt, also entfernt und zurückgegeben, INT an der Vorderseite Warteschlange. Um den int zu entfernen, genügt es, zu vergessen. Sie brauchen nicht zu sein Bit überschreiben. Also ist es eigentlich noch gibt. So wie Daten auf einer Festplatte, wir sind nur ignorieren die Tatsache, dass es jetzt dort. Und wenn q leer ist, sollten wir stattdessen zurückgeben negativ ein. Also das fühlt sich willkürlich. Warum zurück minus 1 statt falsch? Ja. ZIELGRUPPE: Q ist die Speicherung positive Werte. Da Sie nur positive Werte speichern in der q, negativ ist ein Fehler aufgetreten. DAVID J. MALAN: OK, stimmt. Also, weil wir nur positive Speicherung Werte oder Null ist, dann ist es in Ordnung, Rückkehr einen negativen Wert wie ein Wächter Wert, ein spezielles Symbol. Aber du bist Umschreiben der Geschichte gibt, weil der Grund, nur wir sind Rückkehr nicht-negative Werte Denn wir wollen haben eine Sentinelwert. Also genauer gesagt, warum nicht einfach Rückkehr in Fällen von Fehlern falsch? Ja. ZIELGRUPPE: Sie haben versagt um eine ganze Zahl zurück. DAVID J. MALAN: Genau. Und das ist, wo C bekommt ziemlich Zwangs. Wenn Sie sagen, Sie gehen um einen int zurück, Sie haben um einen int zurück. Sie können nicht schick und beginnen Rückkehr ein bool oder ein Schwimmer oder ein String oder so ähnlich. Nun, mittlerweile, JavaScript und PHP und einige andere Sprachen können in der Tat, Sie haben verschiedene Rück Arten von Werten. Und das kann wirklich nützlich sein, wo Sie könnten positive Ganzzahlen, Nullstellen zurückkehren, ints negativen oder falsch oder null sogar Fehler zu bedeuten. Aber wir haben das nicht Vielseitigkeit in C. Also mit dequeue, was wir vorschlagen zu tun ist - ROB BOWDEN: Sie können false zurück. Es ist nur so, dass falsch ist Hash definieren falsche Null. Also, wenn Sie false zurück, Sie zurück Null sind. Und Null ist ein gültiger, was in unserem Warteschlange während negative 1 ist nicht, ob falsche passiert negative 1 sein. Man sollte aber auch nicht brauchen, um das zu wissen. DAVID J. MALAN: Das ist warum ich es nicht sagen. ROB BOWDEN: Aber es war nicht wahr dass man nicht false zurück. DAVID J. MALAN: Sicher. So dequeue, bemerken wir akzeptieren Erlöschen als Argument. Und das ist, weil wir nicht Durch nichts in. Wir wollen einfach nur, um das Element zu entfernen an der Vorderseite der Warteschlange. Also, wie können wir dabei vorgehen? Nun, zunächst wollen wir dies tun schnelle Plausibilitätsprüfung. Wenn die Queue-Größe 0 ist, gibt es keine Arbeit zu tun. Zurück negativ ein. Fertig. Also das ist ein paar Zeilen von meinem Programm. So bleiben nur vier Zeilen. So, hier habe sich entscheiden, verringern die Größe. Und effektiv Verringern der Größe bedeutet, dass ich vergessen habe etwas drin. Aber ich habe auch zu aktualisieren, wo die vor den Zahlen sind. So, das zu tun, muss ich zwei Dinge tun. Muss ich erst einmal, was die Anzahl erinnern ist an der Vorderseite der Warteschlange, , weil ich das Ding zurück. Also ich möchte nicht versehentlich vergessen über sie und dann überschreiben. Ich werde einfach in einen int erinnern. Und jetzt möchte ich aktualisieren q.front zu q.front eins werden. Also, wenn dieser die erste Person in war Linie, nun, ich möchte plus 1 zu tun weisen auf die nächste Person in der Schlange. Aber ich muss diese Rundum behandeln. Und wenn die Kapazität ist eine globale Konstante, das wird mir zu erlauben, stellen Sie sicher, als ich auf die letzte Person in Zeile, wird die Modulo-Operation bringen mich zurück auf Null bei der Anfang der Warteschlange. Und das übernimmt die Rundum hier. Und dann gehe ich auf n zurück. Nun, genau genommen, habe ich nicht müssen n erklären. Ich wusste nicht, um es zu packen und speichern vorübergehend, da der Wert immer noch da. So konnte ich genau die richtige Arithmetik um den ehemaligen Chef zurück der Warteschlange. Aber ich fühlte mich nur, dass dies mehr klar tatsächlich greifen die int, legte es n, und dann wieder, dass der Übersichtlichkeit halber aber nicht unbedingt notwendig. Psst. Sie sind alle aussprechbar in meinem Kopf. ROB BOWDEN: Also erste Frage der binäre Baum Problem. Also erste Frage ist, sind wir unter diesen Zahlen. Und wir irgendwie in sie einfügen wollen Diese Knoten, so dass es ein gültig binären Suchbaum. So ist die eine Sache, über erinnern binäre Suchbäume ist, dass es nicht nur, dass die Sache auf der linken Seite ist geringer und die Sache die rechte ist größer. Es sein muss, dass die gesamte Struktur auf Links ist weniger und die gesamte Baum nach rechts größer. Also, wenn ich hier 34 an der Spitze, und dann Ich habe hier 20, das ist also gültig, weit, weil 34 hier oben. 20 nach links gehen. Also das ist, weniger. Aber ich kann nicht dann setzen hier 59, weil obwohl 59 ist auf der rechten Seite von 20, es ist immer noch auf der linken Seite der 34. Also mit dieser Einschränkung im Hinterkopf, die einfachste Weg, wahrscheinlich die Lösung dieses Problem ist es einfach irgendwie dieser Zahlen - so 20, 34, 36, 52, 59, 106. Und dann legen Sie die von links nach rechts. Also 20 geht hier. 34 geht hier. 36 geht hier. 52, 59, 106. Und könnte man auch mit gefunden haben, einige einstecken und zu realisieren, oh, warte, ich habe nicht genug Zahlen haben , dies in hier zu füllen. Also muss ich, was meine reshift Route Note sein wird. Aber beachten Sie, dass in der letzten drei, wenn Sie lesen von links nach rechts, ist es in teigender Reihenfolge. So, jetzt wollen wir zu erklären, was die Struktur wird für die sein Knoten in diesem Baum. So was brauchen wir in einem binären Baum? Einen Wert vom Typ So haben wir int, so dass einige int-Wert. Ich weiß nicht, was wir als es in der Lösung - int n. Wir brauchen einen Zeiger auf den linken Tochter und ein Zeiger auf das rechte Kind. Also, es wird so aussehen. Und es wird tatsächlich vor aussehen wann haben die doppelt verknüpfte Liste stuff, so Bekanntmachung - Ich werde scrollen, um alle die Weg zurück zu Problem 11. So merkt es gleich aussieht, außer wir nur zufällig diese nennen unterschiedliche Namen. Wir haben noch eine ganze Zahl Wert und zwei Zeigern. Es ist nur so, dass anstelle der Behandlung der Zeiger als Hinweis auf die nächste, was und die vorherige Sache, wir behandeln die Zeiger auf den linken Nachfolger zeigen und rechte Kind. OK. Also das ist unsere Struktur-Knoten. Und nun, die einzige Funktion, die wir brauchen, um Umsetzung dafür ist, Traverse, die wir über den Baum-, Druck gehen wollen aus den Werten der Baum in Ordnung. So suchen Sie hier, würden wir drucken möchten aus 20, 34, 36, 52, 59 und 106. Wie erreichen wir das? So ist es ziemlich ähnlich. Wenn Sie in der Vergangenheit Prüfung sah das Problem dass Sie ausdrucken wollte der ganze Baum mit Komma zwischen alles, war es eigentlich auch einfacher. So, hier ist die Lösung. Das war wesentlich einfacher wenn du es getan hast rekursiv. Ich weiß nicht, ob jemand versucht, es iterativ zu tun. Aber zuerst müssen wir unsere Basisfall. Was ist, wenn die Wurzel ist null? Dann sind wir nur gehen, um zurückzukehren. Wir wollen nicht, etwas zu drucken. Else, wir werden durchqueren rekursiv nach unten. Drucken Sie die gesamte linke Unterbaum. Also alles weniger zu drucken als meine aktuellen Wert. Und dann werde ich mich selbst zu drucken. Und dann werde ich meine rekursiv gesamten rechten Unterbaum, so dass alles größer als mein Wert. Und das wird gedruckt alles in Ordnung. Fragen wie diese tatsächlich führt das? ZIELGRUPPE: Ich habe eine Frage auf die [unverständlich]. ROB BOWDEN: So ein Weg der Annäherung keine rekursiven Problem ist, man denke nur an darüber mag man denken, über all die Grenzfälle. So betrachten, dass wir wollen Drucken Sie sich dieses ganze Baum. Also alles, werden wir den Schwerpunkt auf ist dies insbesondere Knoten - 36. Die rekursive Aufrufe, so tun wir die, die gerade arbeiten. So, hier, dieses rekursiven Aufruf Traverse, die wir ohne darüber nachzudenken über sie, nur Durchlaufen des linken drei, sich vorstellen, dass bereits 20 druckt und 34 für uns. Und dann, wenn wir irgendwann rekursiv rufen Traverse auf die rechts, das wird richtig gedruckt 52, 59 und 106 us. Also da kann 20, 34 zu drucken, und die anderen können drucken, 52, 59, 108, alles, was wir brauchen, um in der Lage zu tun ist Druck uns selbst in der Mitte davon. So drucken Sie alles, was vor uns liegt. Drucken Sie uns selbst, so der aktuelle Knoten Druck 36, regelmäßige printf und dann drucken alles, was uns nach. DAVID J. MALAN: Hier Rekursion wird wirklich schön. Es ist diese erstaunliche Sprung des Glaubens, wo Sie das kleinste bisschen Arbeit zu tun. Und dann lassen Sie jemand sonst den Rest erledigen. Und dass jemand anderes ist ironischer Sie. Also für schwere Pluspunkte, wenn Sie blättern in den Fragen - ROB BOWDEN: Auf die Fragen? DAVID J. MALAN: Und ein wenig nach unten zu die Zahlen, weiß jemand, wo diese Zahlen her? ROB BOWDEN: Ich habe buchstäblich keine Ahnung. DAVID J. MALAN: Sie erscheinen während des Quiz. ZIELGRUPPE: Sind sie die gleichen Zahlen? DAVID J. MALAN: Diese Zahlen. Ein kleines Osterei. Also für diejenigen unter Ihnen, Online-Beobachtung an Hause, wenn Sie uns per E-Mail zu sagen, heads@CS50.net, was die Bedeutung Diese wiederkehrenden von sechs Zahlen sind während ein Quiz, werden wir Sie Dusche mit erstaunlicher Aufmerksamkeit in der letzten Vortrag und ein Stress-Ball. Nice, subtil. ROB BOWDEN: Irgendwelche letzten Fragen über alles, was auf dem Quiz?