[Powered by Google Translate] [§ 4] [weniger komfortabel] [Nate Hardison] [Harvard University] [Dies ist CS50.] [CS50.TV] Alles klar, willkommen zurück zu Abschnitt. In dieser Woche Abschnitt werden wir ein paar Dinge zu tun. Wir gehen nach ersten recap Problem Set 2 gehen, was der Cäsar und Vigenère Problem set. Und dann werden wir in Quiz 0 Bewertungen tauchen und verbringen Sie ein wenig Zeit rekapitulieren, was wir gesprochen haben in jedem der Vorträge so weit, und wir tun auch ein paar Probleme vom Vorjahr Quiz. So können Sie Jungs haben eine gute Möglichkeit, um darauf vorbereiten. Um zu beginnen, habe ich ein paar gute Lösungen gebootet für das vorangegangene Problem Set, Set Problem 2, in diesen Raum. Wenn euch alle getroffen diesen Link, und wenn Sie auf meinen Namen, und klicken Sie auf meine erste Revision Sie werden sehen, caesar.c, die genau das, was ich bin auf der Suche ist. Lassen Sie uns über das wirklich schnell zu sprechen. Dies ist nur eine Probenlösung. Dies ist nicht unbedingt die perfekte Lösung. Es gibt viele verschiedene Wege, dies zu schreiben, aber es gibt ein paar Dinge, die ich hervorheben wollte , die ich sah, als ich mit einem Gehalt, häufige Fehler, dass ich denke, Diese Lösung macht einen sehr guten Job in der Handhabung. Die erste ist mit einer Art von Header Kommentar am Anfang. In den Zeilen 1 bis 7 sehen Sie die Details, was genau dieses Programm tut. Ein guter fachlicher Praxis, wenn du schreibst C-Code unabhängig davon, ob Ihr Programm in einer einzigen Datei enthalten sind oder ob es über mehrere Dateien aufgeteilt ist es, eine Art haben Orientieren Kommentar am Anfang. Dies gilt auch für Menschen, die gehen und Code schreiben, in der realen Welt. Dies ist, wo sie Informationen zum Urheberrecht finden setzen. Unten sind die # enthält. Auf der Linie 16 gibt es diese # define, was wir kommen zurück, um in nur einem Bit. Und dann noch einmal die Funktion startet, sobald wichtigsten Starts, weil dieses Programm wurde in einem einzigen Funktion enthalten Die erste Sache, die-passiert und das ist sehr idiomatisch und typisch für ein C-Programm das dauert in Kommandozeilenargumenten-ist, dass es prüft sofort für das Argument count, argc. Genau hier sehen wir, dass dieses Programm erwartet 2 Argumente genau. Denken Sie daran, dass es erste Argument, das das spezielle ist das ist immer der Name des Programms, die ausgeführt ist, der Name der ausführbaren Datei. Und so was dieser tut, ist es verhindert, dass Benutzer das Programm laufen mit mehr oder weniger Argumente. Der Grund wollen wir dieses Recht weg zu überprüfen ist, weil können wir nicht wirklich auf diese argv-Array hier zuverlässig bis wir eingecheckt haben, um zu sehen, wie groß es ist. Einer der häufigsten Fehler, die ich sah, war Menschen würden sofort reingehen und Greifer argv [1]. Sie hatten das zentrale Argument aus dem Array zu packen und nicht die a bis i auf sie zu überprüfen, und dann würden sie den Test für argc sowie den nächsten Test zu tun, ob das erste Argument war tatsächlich eine ganze Zahl gleichzeitig, und das nicht funktionieren, da in dem Fall, dass es keine Argumente angegeben Sie werden packte ein Argument, das nicht da ist oder der Versuch, eine, die nicht da ist zu packen. Die andere große Sache, sollten Sie feststellen, dass Sie wollen immer auszudrucken irgendeine hilfreiche Fehlermeldung dem Benutzer zu orientieren sie. Ich bin sicher, Sie haben alle Programme ausführen, wo alle es plötzlich abstürzt, und Sie erhalten diese lächerlichen kleinen Dialog, der sich öffnet und sagt etwas furchtbar kryptisch und vielleicht gibt Ihnen einen Fehlercode oder so ähnlich das macht keinen Sinn. Dies ist, wo Sie wirklich wollen, etwas Hilfreiches bieten und dem Benutzer gezielte, so dass, wenn sie es laufen sie "Oh," face palm gehen. "Ich weiß genau, was zu tun ist. Ich weiß, wie man dieses Problem beheben." Wenn Sie nicht drucken eine Nachricht, dann am Ende tatsächlich sodass der Anwender zu gehen überprüfen Sie Ihre Source-Code um herauszufinden, was falsch gelaufen ist. Es gibt auch einige Male, dass Sie verschiedene Fehlercodes verwenden werden. Hier haben wir nur benutzt man sagen, es war ein Fehler, es war ein Fehler, es war ein Fehler. Bigger Programme, die oft Programme, die von anderen Programmen aufgerufen werden, wird eine Art von speziellen Fehlercodes in verschiedenen Szenarien zurück programmatisch zu kommunizieren, was Sie sonst Verwenden Sie nur ein nettes englisches Nachricht für. Cool. Als wir arbeiten, können Sie sehen, wir ziehen den Schlüssel aus. Wir testen, ob der Schlüssel passt. Wir bekommen eine Nachricht durch den Benutzer. Der Grund, warum wir es in diesem Zweck while-Schleife, und das ist etwas, das wir abdecken in ein wenig, aber es stellt sich heraus, dass, wenn Sie geben Control D wenn du das GetString prompt auf dem Terminal was das tatsächlich tut, ist es sendet einen besonderen Charakter an das Programm. Es nennt sich die ELF oder das Ende der Datei Charakter. Und in diesem Fall wird unsere Botschaft String null sein, so war dies nicht etwas, was wir für aufgegebenes das Problem setzte sich. Aber wie wir weiter gehen, jetzt, wo wir begonnen, über Zeiger zu sprechen und dynamische Speicherzuweisung auf dem Heap, Überprüfung auf null, wenn Sie eine Funktion, die haben könnte null zurück, wie ein Wert ist etwas, das Sie in die Gewohnheit zu tun bekommen werde. Dies ist hier in erster Linie zur Illustration. Aber wenn man sehe GetString in der Zukunft, so von Problem-Set 4 auf, sollten Sie dies im Hinterkopf behalten. Auch dies ist kein Problem für Problem-Set 3 entweder weil wir es nicht bedeckt hatte noch. Schließlich kommen wir zu diesem Teil, wo wir auf die wichtigsten Verschlüsselungs-Schleife und es gibt ein paar Dinge vor sich geht. Erstens haben wir über die gesamte Nachricht String selbst durchlaufen. Hier haben wir die strlen Anruf in dem Zustand gehalten, die einige von Ihnen haben darauf hingewiesen, ist nicht ein guter Weg zu gehen. Es stellt sich heraus in diesem Fall ist es auch nicht groß, teils, weil wir ändern den Inhalt der Nachricht selbst innerhalb der for-Schleife, so dass, wenn wir eine Nachricht, die 10 Zeichen lang ist, Zum ersten Mal beginnen wir, dass for-Schleife strlen wird, was zurück? 10. Aber wenn wir dann ändern Nachricht, sagen wir ändern ihre fünfte Zeichen und wir in einem \ 0 Zeichen werfen in der fünften Position, auf einer anschließenden Iteration strlen (message) wird nicht zurückkehren, was er tat das erste Mal, dass wir iteriert, aber es wird stattdessen zurückgeben 5, weil wir in diesem Nullabschlusszeichen warf, und Länge der Zeichenfolge definiert durch die Position des \ 0. In diesem Fall ist dies ein guter Weg zu gehen, weil wir es zu ändern sind an Ort und Stelle. Aber man merkt, dass dies tatsächlich ist überraschend einfach zu verschlüsseln wenn Sie können die Mathematik richtig. Alles, was erforderlich ist, ob das Schreiben prüfen, ob Sie auf der Suche ist Groß-oder Kleinschreibung. Der Grund warum wir nur noch für, dass der Check und wir müssen nicht für den Check Die alpha Fall ist, weil wenn ein Charakter in Großbuchstaben oder ob es Kleinbuchstaben dann ist es definitiv ein alphabetisches Zeichen, weil wir keine Groß-und Kleinschreibung Ziffern. Die andere Sache, die wir tun, und das ist ein wenig knifflig- wird haben wir die Standard-Cäsar-Chiffre Formel modifiziert dass wir gaben das Problem set-Spezifikation. Was ist hier anders ist, dass wir abgezogen in der Groß-Fall Kapital A, und dann haben wir hinzugefügt Capital eine Zurück in am Ende. Ich weiß, einige von euch haben dies in Ihrem Code. Hat einer von euch tun dies in eure Einsendungen? Sie tat dies. Können Sie erklären, was das bedeutet, SAHB? Durch Subtraktion it out, weil du ein mod richtig gemacht, nachdem er, Sie müssen es nehmen, so dass die Art und Weise erhalten Sie [Husten] Position. Und dann, indem Sie es später wieder Sie verschoben über die eine, die Sie wollten. Ja, genau. Was SAHB sagte, war, dass, wenn wir hinzufügen möchten unsere Botschaft und unser Schlüssel zusammen und dann mod, dass mod, dass durch NUM_LETTERS, wenn wir nicht skalieren unsere Botschaft in die entsprechende Bereichs 0 bis 25 ersten, dann könnten wir am Ende immer eine wirklich seltsame Zahl weil die Werte, die wir sehen, wenn wir uns auf die Meldung [i] suchen, wenn wir auf die i-te Zeichen unserer Klartext-Nachricht suchen, ist ein Wert, irgendwo in diesem Bereich von 65 bis 122 basierend auf den ASCII-Werte für Großbuchstaben A bis Kleinbuchstaben z. Und so, wenn wir MOD IT um 26 oder NUM_LETTERS, denn das war unsere # oben rechts hier definieren, das wird uns einen Wert, der in der 0 bis 25 ist, und wir müssen einen Weg finden, um dann zu skalieren, dass wieder und bekommen es in den entsprechenden ASCII-Bereich. Der einfachste Weg dies zu tun ist, einfach zu skalieren alles nieder in den Bereichs 0 bis 25 zu beginnen, und dann verschieben alles wieder am Ende. Ein weiterer häufiger Fehler, dass ich sah, wie Menschen in laufen ist, dass wenn Sie nicht tatsächlich diese Skalierung auf Anhieb und fügen Sie Nachricht und Schlüssel zusammen und fügen Sie sie, sagen wir, in eine char-Variable, das Problem mit, dass ist seit message [i] ist eine relativ große Zahl beginnen mit- erinnern, dass es mindestens 65, wenn es sich um einen Groß-Charakter- wenn Sie einen großen Schlüssel, sagen, so etwas wie 100, und fügen Sie die 2 zusammen in einem signed char wirst du einen Überlauf zu bekommen sind. Du wirst einen Wert, der größer als 127 ist zu bekommen, das ist der größte Wert, dass ein char Variable aufnehmen kann. Wieder ist der Grund, warum Sie wollen würde, um diese Art der Sache zu beginnen tun. Einige Leute herum diesem Fall, indem Sie eine if-else und Testen zu sehen, ob es wäre Überlauf bevor Sie das tun, aber auf diese Weise umgeht, dass. Und dann in dieser Lösung, die wir ausgedruckt den ganzen String ganz am Ende. Andere Leute ein Zeichen in einer Zeit gedruckt. Beide sind genial. An diesem Punkt kann euch irgendwelche Fragen haben, irgendwelche Kommentare dazu? Lust, Dinge, die Sie nicht mögen? Ich hatte eine Frage. Vielleicht habe ich es verpasst während Ihrer Erklärung, aber wie funktioniert das Programm Überspringen der Räume zum Verbinden der Schlüssel zu der Länge des Textes? Dies ist nur Caesar-Chiffre. >> Oh, sorry, yeah. Ja, wir sehen, dass. In der Caesar-Chiffre wir herum, dass da wir nur umgedreht Zeichen. Wir haben nur gedreht werden, wenn sie groß oder klein waren. You guys ein ziemlich gutes Gefühl this? Fühlen Sie sich frei, um dieses Haus zu kopieren, nehmen Sie es, vergleichen Sie es mit, was euch geschrieben hat. Auf jeden Fall fühlen sich frei, Fragen darüber zu senden. Und wieder erkennen, dass das Ziel hier mit Ihrem Problem stellt nicht um euch zu perfekten Code für Ihr Problem Sätze zu schreiben. Es ist eine Lernerfahrung. Yeah. Zurück zur do while-Schleife, wenn es gleich null, so null bedeutet nur nichts, sie einfach Enter drücken? Null ist eine spezielle Zeiger-Wert, und wir verwenden null, wenn wir sagen wollen haben wir einen Zeiger Variable, die nichts zeigt. Und so es in der Regel bedeutet, dass diese Variable, wird diese Meldung variable ist leer, und hier, weil wir mit dem CS50 spezielle String-Typ sind, was ist der CS50-String-Typ? Haben Sie gesehen, was es ist, wenn David wieder zog die Kapuze in der Vorlesung? Es ist ein funky-es ist ein Zeiger, nicht wahr? Okay, yeah. >> Es ist ein char *. Und so wirklich konnten wir ersetzen Sie diese hier mit char * message, und so die GetString-Funktion, wenn sie nicht erfolgreich zu einen String vom Benutzer es kann nicht analysiert eine Zeichenfolge, und der einzige Fall, in dem es nicht analysieren kann einen String ist, wenn der Benutzer das Ende der Datei Charakter, die Steuerung D, das ist nicht etwas, was Sie normalerweise tun, aber wenn das passiert, Dann wird die Funktion dieses Nullwert als eine Möglichkeit zu sagen, zurück "Hey, habe ich nicht bekommen eine Zeichenkette." Was würde passieren, wenn wir nichts dagegen unternehmen, message = null, das ist etwas, was wir bisher noch nicht da? Warum wäre das hier ein Problem sein? Weil ich weiß, dass wir ein wenig geredet in Vortrag über Speicherlecks. Ja, lasst uns tun, und mal sehen, was passiert. Basil Frage war, was passiert, wenn wir eigentlich gar nicht haben Diese Nachricht = null-Test? Lasst uns nach oben an die Spitze. You guys können diese Zeile auskommentieren. Eigentlich werde ich es in einer Revision zu speichern. Dies wird Revision 3 sein. Was Sie tun müssen, um dieses Programm laufen soll musst du dieses Zahnrad-Symbol oben klicken Sie hier, und Sie haben ein Argument, um es hinzuzufügen. Sie haben, um ihm den Schlüssel Argument, da wir in einer Befehlszeile Argument übergeben wollen. Hier werde ich ihm die Nummer 3. Ich mag 3. Jetzt Zoomen wieder heraus, das Programm läuft. Es läuft, Kompilieren, bauen. Here we go. Es wartet darauf, aufgefordert werden. Wenn ich geben in so etwas wie hallo-wo war das? Oh, nahm mein Programm zu lange laufen. Ich war zu lange Schlammschlachten. Hier geht es. Jetzt bin ich in hallo eingeben. Wir sehen, dass es angemessen verschlüsselt. Nun, was passiert, wenn wir prompt GetString auf null zurück tun? Denken Sie daran, sagte ich, dass wir das gemacht haben, indem Sie Steuerung D zur gleichen Zeit. Ich werde nach oben hier. Wir werden es wieder laufen. Building. Dort geht es. Nun, wenn ich die Kontrolle D getroffen Ich habe diese Linie, die opt/sandbox50/bin/run.sh sagt Segmentation fault. Habt ihr gesehen, dass vor? [Student] Warum gibt es keine->> Sorry? [Student] Warum gibt es keine Core-Dump in diesem Fall? Die Core-Dump ist-die Frage ist, warum gibt es keine Core-Dump hier? Die Frage ist, dass es sein kann, aber die Core-Dump ist eine Datei Das geht auf der Festplatte gespeichert. In diesem Fall haben wir Core-Dumps deaktiviert auf der Flucht Server, so dass wir nicht die Menschen seg fehlgeschlagenes und Aufbau Tonnen Core-Dumps. Aber man kann sich ein. Core-Dumps sind die Art von Dingen, die man oft deaktivieren können, und manchmal tun. Die Segmentation Fault, um Ihre Frage zu beantworten, Basilikum, sagt, dass wir, um einen Zeiger zuzugreifen versucht das war nicht auf etwas hinweisen. Angemeldet Binky in dem Video, wenn Binky versucht, GO Access einen Zeiger, der nicht in die Richtung geht, etwas zu? In diesem Fall, schätze ich technisch der Zeiger auf etwas zeigt. Es ist auf null, was technisch 0 ist zeigt, aber das ist so definiert, in einem Segment, welche nicht zugänglich sind von Ihrem Programm, so erhalten Sie einen Segmentation Fault weil Sie nicht zugreifen sind Speicher, das ist in einem gültigen Bereich wie der Heap-Segment oder den Stapel Segment oder Datensegment. Cool. Haben Sie noch Fragen zu Caesar? Lasst uns weitermachen. Lassen Sie uns Revision 2 wirklich schnell zu suchen. Das ist Vigenère. Hier in Vigenère wir durch dieses ein ziemlich schnell gehen, weil wieder Vigenère und Caesar sind ziemlich ähnlich. Header-Kommentar ist vor, # Define ist, bevor zu vermeiden, mit dieser magischen Zahlen. Die nette Sache ist sagen wir wollten sich zu bewegen ein anderes Alphabet oder so ähnlich. Anstatt manuell gehen ändern sich 26 der im Code konnten wir diese auf 27 ändern oder legen Sie es nach unten wenn wir mit verschiedenen Alphabete, verschiedene Sprachen. Auch wir haben dieses Kontrollkästchen des Arguments count, und wirklich kann man fast dies als Vorlage. So ziemlich jeder, das Sie schreiben, sollte- wenn es Befehlszeile auch Argumente-some Folge von Zeilen das liest sich wie dies am Anfang. Das ist eine der ersten sanity Tests, die Sie tun möchten. Hier das, was wir hatten war, dass wir dafür gesorgt, dass das Schlüsselwort gültig war, und das war die zweite Prüfung, dass wir es taten. Beachten Sie wieder, dass wir diese getrennt von argc und 2. Beachten Sie, dass in diesem Fall eine Sache, die wir tun mussten, war stattdessen der Verwendung a bis i wollten wir die gesamte Zeichenfolge zu validieren, und um das zu tun, Sie haben tatsächlich Zeichen für Zeichen gehen über der Zeichenfolge. Es gibt keinen guten Weg, um etwas auf es nennen denn auch, zum Beispiel, a bis i 0 zurück wenn es nicht analysieren kann eine ganze Zahl, so dass nicht einmal arbeiten. Wieder schöne Nachricht, die besagt, was genau passiert ist. Dann ist hier wieder, übernehmen wir auch den Fall, wo Der Benutzer gibt in einer Kontrollgruppe D zufällige Buchstabenkombination. Und dann Charlotte hatte eine Frage zuvor, wie wir es schaffen, Räume überspringen in unserem String hier. Dies war eine Art ähnlich dem, was wir taten mit dem Myspace-Programm dass wir das gemacht im Schnitt, und die Art und Weise dies funktioniert ist, dass wir die Anzahl der Briefe, die wir gesehen hatten verfolgt. Als wir gingen über den Meldungs-String, als wir über Charakter ging durch Charakter, Wir verfolgen den Index als Teil unserer for-Schleife, und dann werden wir auch verfolgt die Anzahl der Buchstaben, so nicht Sonderzeichen, nicht-stellig, nicht-weißen Raum dass wir hatten in der separaten variable gesehen. Und dann diese Lösung verändert die Taste eine eigentliche Schlüssel integer zu bekommen, und das tut sie on the fly, direkt vor geht es dann um die eigentliche Nachricht Charakter zu verschlüsseln. Es gibt einige Lösungen, die perfekt waren großartig zu das wäre zu ändern den Schlüssel bis bei der Prüfung auf die Gültigkeit des Schlüssels. Neben dafür sorgen, dass der Charakter und das Schlüsselwort wurde ein alphabetisches Zeichen auch gedreht, dass in einen Integer in der Bereichs 0 bis 25, um dann überspringen Sie mit dem später tun in dieser for-Schleife. Auch hier sehen Sie hier das ist wirklich das exakt gleiche Code dass wir verwendet Caesar an dieser Stelle. Du tust genau dasselbe, so der eigentliche Trick ist, herauszufinden, wie das Schlüsselwort in einem ganzzahligen einzuschalten. Eine Sache, die wir hier gemacht haben, die ist ein wenig dichter ist, dass wir diesen Satz wiederholt, ich denke, man könnte es nennen, 3 getrennten Zeiten auf den Leitungen 58, 59 und 61. Kann mir jemand erklären, was genau diese Phrase tut? Es ist Zugriff auf einen Charakter, wie du gesagt hast. Ja, es ist [unverständlich] ein Zeichen in das Schlüsselwort, und so ist es Anzahl der Buchstaben zu sehen, weil man nur in Bewegung sind zusammen das Schlüsselwort wenn man einmal den Brief gesehen, so, das wird tatsächlich überspringen Räume und stuff like that. Ja, genau. Und dann, sobald Sie das Schlüsselwort leere sehen Sie nur mod so dass Sie wieder bewegen. Genau. Das ist eine perfekte Erklärung. Was Kevin sagte, ist, dass wir Index in der Schlüsselwort wollen. Wir wollen die num_letters_seen Charakter zu bekommen, wenn man so will, aber wenn num_letters_seen übersteigt die Länge des Schlüsselworts die Art und Weise erhalten wir wieder in den entsprechenden Bereich nutzen wir die mod-Operator um effektiv herum wickeln. Zum Beispiel, wie in der kurzen, ist unser Stichwort Speck, und es ist 5 Zeichen lang sein. Aber wir haben 6 Buchstaben im Klartext an dieser Stelle gesehen und verschlüsselte 6. Am Ende werden wir den Zugriff auf das num_letters_seen, welches 6, mod die Länge des Schlüsselworts, 5, und so bekommen wir ein, und so, was wir tun ist, werden wir Zugriff auf das erste Zeichen in unserer Keyword an diesem Punkt. Alles klar, alle Fragen zu Vigenère bevor wir weiter? You guys ein ziemlich gutes Gefühl this? Cool, super. Ich möchte sicherstellen, dass Sie Jungs sind immer die Chance, Code zu sehen dass wir denken, sieht gut aus und haben die Chance, daraus zu lernen. Das wird das letzte Mal sein wir werden mit Räumen für vorerst und wir den Übergang gehe jetzt, und ich werde zu cs50.net/lectures gehen so können wir uns ein wenig Quiz Bewertung. Der beste Weg, denke ich, zu tun beginnen Quiz bewerten ist auf diese Vorträge Seite kommen, cs50.net/lectures, und unter jeder der Woche Überschriften, also wenn ich hier in Woche 0, Ich sehe, dass wir eine Liste von Themen, die wir in Woche 0 abgedeckt haben. Wenn eines dieser Themen scheint Ihnen nicht vertraut Sie möchte auf jeden Fall gehen Sie zurück und durchkämmen die Vorlesungsunterlagen und möglicherweise auch durch die Vorträge überfliegen, sehen sie wieder, wenn Sie wollen, um ein Gefühl für das, was ist los mit jedem dieser Themen zu bekommen. Ich werde zusätzlich sagen, in diesem Jahr einer der coolen Ressourcen, die wir haben ist diese Shorts dass wir erstellt haben, und wenn man sich in Woche 0, haben wir nicht alle Themen abgedeckt, aber wir haben nicht wenige von ihnen, einige der schwieriger diejenigen, so beobachtete diese Shorts wieder ist ein guter Weg, um Sie auf dem Laufenden. Insbesondere werde ich in einem Stecker für den 3 gesetzt auf dem Boden, da ich die habe. Aber wenn Sie mit binären kämpfen, Bits, hex, solche Sachen, Binär ist ein großartiger Ort zu starten. ASCII ist eine andere, die gut, zu sehen ist. Sie können sogar mich 1.5x Geschwindigkeit wenn ich zu langsam bin. Da es sich um Kritik, fühlen Sie sich frei, das zu tun. Nur um wirklich schnell zu starten, werden wir über ein paar von diesen Quiz-Aufgaben gehen nur, um schnell durch diese Abwanderung. Zum Beispiel, lasst uns an den Problemzonen 16 schauen, dass ich hier oben auf dem Board hat. Wir haben diese folgende Berechnung im Binär-, und wir wollen keine Arbeit zu zeigen. Okay, ich werde geben diesem einen Schuss. You guys sollte folgen zusammen mit Papier, und wir werden dies sehr schnell tun. Wir wollen die folgende Berechnung in binärer durchzuführen. Ich habe 00110010. Und ich werde es 00110010 hinzuzufügen. Für die mathematische Genies folgenden zusammen zu Hause, Diese wird wirksam Multiplikation mit 2. Lassen Sie uns beginnen. Wir werden das gleiche hinaus Algorithmus, was wir tun folgen wenn wir Dezimalzahlen addieren. Wirklich der einzige Unterschied hier ist, dass wir Schleife wieder um einmal haben wir 1 + 1 statt, wenn wir bis 10 erhalten. Wenn wir von der rechten, starten sehr schnell, was ist die erste Ziffer? [Student] 0. >> [Nate H.] 0. Große, die zweite Ziffer? [Student] 1. [Nate H.] Ist es ein 1? 1 + 1 ist? [Student] 10. [Nate H.] Genau, so was ist die Ziffer, dass ich Recht schreibt unter den 2 diejenigen addiert? [Student] 1, 0 oder 0 und tragen dann das 1. [Nate H.] 0 und tragen eine 1, genau. Weiter ein up, Basil, du bist auf. Was ist das dritte? >> [Basil] 1. [Nate H.] 1, perfekt. Kevin? [Kevin] 0. >> [Nate H.] 0, Charlotte? [Charlotte] 0. >> [Nate H.] Ja, und was soll ich tun? [Student] Die 1. [Nate H.] Und was soll ich tun? Und dann trage ich das ein. Perfekt, SAHB? >> [SAHB] Jetzt haben Sie ein. [Nate H.] Und soll ich tun hier nichts? [SAHB] Dann für die nächsten ein Sie haben 1, weil man über 1 durchgeführt. [Nate H.] Great, so können wir hier es zu beenden up. Cool. [Student] Hat 0 + 0 = 0? 0 + 0 = 0 ist. 1 + 1, wie du gesagt hast, ist 10 oder 1, 0, eher. 10 ist eine falsche Bezeichnung, weil mir 10 bedeutet die Zahl 10, und es ist die Marotte, wie wir vertreten, wenn wir es zu schreiben sind. Wir vertreten die Zahl 2 von 1, 0, und die Zahl 10 ist etwas anders. Was ist irgendwie schön zu binär ist, dass es wirklich nicht so viele Fällen müssen Sie lernen. Es gibt 0 + 0 = 0, 0 + 1 = 1, 1 + 1 = 0, und dann Durchführung einer 1, und dann können Sie hier auf der dritten Spalte von rechts wir hatten dieses 1, 1 und 1. Und 1 + 1 + 1 eine 1 ist, und Sie tragen ein weiteres 1. Wenn du tust binäre Addition, ziemlich einfach. Ich tun würde, ein paar mehr von diesen zur Vernunft zu überprüfen euch bevor du gehst in denn dies ist Wahrscheinlich etwas, das wir auf dem Quiz sehen werden. Jetzt lasst uns diese nächste man als gut. Lassen Sie uns Probleme 17. Wir werden die folgende Binärzahl in eine Dezimalzahl umwandeln. Ich habe 10100111001. Angemeldet in der binären Video, dass ich Ich ging durch ein paar Beispiele, und ich zeigte, wie alles funktioniert, wenn du es tust in dezimal. Wenn Sie in dezimaler Darstellung arbeite ich denke, wir sind An diesem Punkt in unserem Leben so fließend, dass es ist ziemlich leicht zu beschönigen die Mechanik, wie es tatsächlich funktioniert. Aber dazu eine kurze Zusammenfassung, wenn ich die Nummer 137 haben dies wirklich bedeutet, und auch dies ist in dezimaler Darstellung- die Zahl 137 in Dezimal bedeutet, dass ich 1 x 100 + 3 x 10 + 7 x 1 haben. Dies gilt umso bleiben auf dem Bildschirm. Und dann, wenn man sich diese Zahlen genau hier, 100, 10 und 1, sehen Sie, dass sie tatsächlich sind alle Potenzen von 10. Ich habe 10 ², 10 ¹, 10 und dem Null. Wir haben eine ähnliche Art der Sache im Binär-, außer, dass unsere Basis, wie wir es nennen, ist 2 statt 10. Diese 10s, dass ich mich hier schrieb am Boden, Diese 10 ², 10 ¹, 10 auf die Null, 10 ist unsere Basis, und der Exponent, 0, 1, oder 2, wird durch die Position der Zahl in der Nummer, die wir schreiben impliziert. 1, wenn wir es betrachten, ist dies ein in der zweiten Position. Die 3 ist in der ersten Position, und die 7 ist in der 0. Position. Das ist, wie wir die verschiedenen Exponenten unten für unsere Basen erhalten. Nach all dieser wir kommen, eigentlich weißt du was? Wir tun-wo haben meine Undo-Knopf gehen? Dort geht es. Ich liebe diese rückgängig Sache. Danach denke ich zumindest für mich der einfachste Weg, die Konvertierung zu starten eine binäre Zahl oder eine Hexadezimalzahl, wo die Basis ist 16 und nicht 10 oder 2 ist, gehen Sie vor und schreiben Sie der Basen und Exponenten für alle Zahlen in meinem Binärzahl an der Spitze. Wenn wir von links nach rechts wieder das ist Art von Intuition, Ich werde wieder auf schwarz Hier haben wir die 2 auf die 0. Position und dann haben wir 2 ¹, 2 ², und dann 2 der 3, die 2 bis 4, 2 an die 5, 6, 7, 8, 9 und 10. Diese Zahlen, die ich aufgeschrieben habe, sind alle Exponenten. Ich schrieb nur die Grundlagen hier in den ersten 3 nur für den Raum. An dieser Stelle werde ich weitermachen und ich bin eigentlich los, um zu löschen Die Sachen, die wir in dezimaler tat, wenn das okay ist. Sie haben alle, dass. Diejenigen von Ihnen, das Ansehen von Online Ich bin sicher in der Lage sein, mich zurückspulen, wenn Sie möchten. Wechseln zurück zum Stift. Nun, was wir tun können, wenn Sie Jungs sind nicht ganz bis auf Ihrem Potenzen von 2 zu beschleunigen, das ist total cool. Es geschieht. Ich verstehe. Ich hatte einmal ein Vorstellungsgespräch, wo ich wurde gesagt, ich sollte alle Potenzen von 2 weiß bis über 2 bis 30.. Es war nicht ein Job, den ich bekam. Jedenfalls kann euch voran gehen und die Mathematik zu tun hier, aber mit binären es nicht wirklich Sinn machen, und noch macht es Sinn mit dezimal oder hexadezimal entweder die Mathematik, wo man Nullen zu tun. Sie können sehen, ich habe hier 0, hier eine 0, 0 hier hier 0, 0 hier 0 ein. Warum könnte es nicht sinnvoll, die tatsächliche Mathematik zu tun die entsprechende Potenz von 2 für diese Position berechnen? Genau wie Charlotte sagte, wird es 0 sein. Könnte genauso gut sparen Sie sich die Zeit, wenn die Berechnung Potenzen von 2 ist nicht Ihre Stärke. In diesem Fall brauchen wir nur, um es für 2 Berechnung der 0,-ist? [Student] 1. [H. Nate] 1, 2 bis 3, nämlich das-? [Student] 8. >> [Nate H.] 8. 2 bis 4 die? [Student] 2. Es tut mir leid, 1. [Nate H.] 2 der 4 ist 16, genau. 2 der 5, Kevin? >> 32. [Nate H.] 32, 2 der 8? [Student] 32 x 8, 256. [Nate H.] Perfect. Und 2 auf die 10? [Student] 1024. [Nate H.] Yeah, 1024. Sobald wir haben diese Zahlen, die wir sie alle Zusammenfassend kann. Und das ist, wo es wirklich wichtig ist, ein paar Dinge zu tun. Man wird langsam gehen und überprüfen Sie Ihre Arbeit. Man kann sagen, dass es eine 1 am Ende dieser Zahl, also sollte ich auf jeden Fall erhalten eine ungerade Zahl, wie mein Ergebnis weil alle die anderen gehen, um sogar Zahlen da sie eine Binärzahl ist. Die andere Sache zu tun ist, wenn Sie zu diesem Zeitpunkt auf dem Test zu erhalten und du hast es geschrieben, diese weit und du bist nicht mehr viel Zeit Blick auf die Anzahl der Punkte, dass dieses Problem wert ist. Dieses Problem, wie Sie sehen, wenn ich kann klappen zurück zu meinem Laptop wirklich schnell- Dieses Problem ist 2 Punkte wert, so ist dies nicht die Art der Addition Sie sollten gehen durch, wenn Sie wirklich unter Zeitdruck sind. Aber wir werden wieder zurück in den iPad, und wir werden durch sie wirklich schnell gehen. Ich mag dabei die kleinen Zahlen zuerst weil ich finde, dass einfacher. Ich mag 32 und 8, weil sie zusammen ziemlich leicht zu gehen, und wir bekommen 50. 16 und 1 bekommt 17. Es wir 57, und dann können wir den Rest dieses, so können wir tun, 57, 156. Komm schon. Man gut, mal sehen. Wir hatten 57, 256 und 1024. An dieser Stelle würde ich lieber nur durchlaufen. Ich habe keine Ahnung. Ich brauchen eindeutig zu lesen, auf diese. 7, 6 und 4, erhalten Sie 17. 1, 5, 5, 2, 13. Dann bekommen wir 3, und dann bekommen wir ein. 1337. Osterei, anybody? Wer erkennt diese Nummer? Chris erkennt die Nummer. Was bedeutet es, Chris? [Chris] Leet. Leet, also, wenn Sie dies zu betrachten, sieht es aus wie leet. Hacker Zeug. Watch out für diese Art von Sachen auf dem Midterm oder Quiz, eher. Wenn Sie diese Art von Sachen und sehen Sie sich fragen, "Huh" das könnte tatsächlich etwas bedeuten. Ich weiß nicht. David mag legt es in. Es ist ein guter Weg, um sanity überprüfen. Wie okay, kann ich sehen, was los ist. Das ist Week 0/Week 1 stuff. Wenn wir wieder zurück in unserem Laptop jetzt Verkleinern und ein paar andere Dinge. Es gibt ASCII, was wir getan haben eine Menge mit den Problem-Sets. Dieser Begriff des Kapitals A. Was ist das eigentlich? Zu wissen, es ist die Dezimalzahl. 65 ist, was es ist in der ASCII-Tabelle zugeordnet, und das ist daher, wie der Computer schreibt er, und das ist, wie wir schon immer weg mit tatsächlich schriftlich der Charakter Kapital A und der Charakter Kleinbuchstaben a in einigen dieser Lösungen und Problemstellungen, die Sie getan haben. Ein paar andere Dinge. Wir haben Aussagen, boolean Ausdrücke, Bedingungen, Schleifen, Variablen und Threads. Diejenigen scheinen alle Sinne zum größten Teil machen? Einige dieser Terminologie ist ein wenig funky mal an. Ich mag an einer Aussage zum größten Teil etwas, das mit einem Semikolon endet denken. Aussagen wie x = 7, die eine variable setzt, vermutlich als x = 7. Vermutlich x ist auch eine Art, die die Nummer 7 speichern kann, so ist es ein int oder möglicherweise ein Schwimmer oder eine kurze oder eine char, so ähnlich. Ein boolescher Ausdruck verwendet diese doppelte gleich und der Knall gleich oder nicht gleich, kleiner als, größer als, weniger als oder gleich alle dieser Art von Sachen. AGB sind dann, wenn else-Anweisungen. Ich würde denken, dass man nicht einen anderen, ohne eine entsprechende if. Ebenso können Sie nicht über ein anderes, wenn ohne eine entsprechende if. Loops, erinnern an die 3 Arten von Schleifen wir in man euch hämmerte für die letzten paar Abschnitte und Problemstellungen. Der Arbeit, während, wenn Sie daran Benutzereingaben sind, mit while-Schleifen, bis eine bestimmte Bedingung true ist, und dann mit den for-Schleifen, wenn Sie benötigen wissen, welche Iteration der Schleife Sie sind momentan in ist, wie ich darüber denke. Oder wenn du tust eine für jedes Zeichen in einem String Ich möchte etwas tun, für jedes Element in einem Array Ich möchte etwas zu diesem Element zu tun. Themen und Veranstaltungen. Diese haben wir nicht so explizit in C bedeckt, aber nicht vergessen, das von Scratch. Dies ist der Begriff mit verschiedenen Skripten. Dies ist auch dieser Begriff des Rundfunks ein Ereignis. Einige Leute nicht Rundfunks in ihre Projekte zunächst das ist total cool, aber diese sind 2 verschiedene Wege im Umgang mit diesen größeres Problem als Parallelität, das ist, wie Sie Programme ausführen zu bekommen oder scheinbar zur gleichen Zeit ausführen? Unterschiedliche Aufgaben ausgeführt werden, während auch andere Aufgaben ausgeführt werden. Dies ist, wie das Betriebssystem zu funktionieren scheint. Deshalb ist, obwohl beispielsweise Ich habe meine Browser läuft, kann ich auch auf Spotify drehen und spielen ein Lied. Das ist eher eine begriffliche Sache zu verstehen. Ich würde einen Blick auf die Themen kurzen Start wenn Sie möchten, um mehr darüber zu erfahren, dass. Mal sehen, ich glaube, es hätte sein können Ein Problem auf das in einer von diesen. Nochmals, ich denke Themen und Ereignisse sind nicht etwas, das wir in C abdecken nur weil es wesentlich schwieriger als in Scratch. Sie sollten nicht über sie dort machen, aber auf jeden Fall verstehen die Konzepte, verstehen, was vor sich geht. Bevor wir fortfahren, werden alle Fragen zur Woche 0 Material? Jeder ein ziemlich gutes Gefühl? Understanding Variablen und was eine Variable ist? Umzug auf. Woche 1. Ein paar Dinge hier, die nicht besonders abgedeckt wurden im Quiz bewerten notwendig und auch weitere konzeptionelle Dinge zu denken. Die erste ist diese Vorstellung von dem, was Quellcode, Compiler und Objekt-Code sind. Anybody? Basil. Ist Objekt-Code, ich meine Quellcode ist, was Sie in Klang setzen, und Objekt-Code ist, was Klang setzt aus, so dass Ihr Computer kann das Programm lesen. Genau. Der Quellcode ist der C-Code, dass Sie tatsächlich geben auf. Object-Code ist, was du aus Klang. Es ist die 0 und 1 in dieser binären Format. Und was passiert, wenn Sie eine Reihe von Objekt-Dateien haben, sagen Sie kompilieren ein Projekt oder ein Programm, das mehrere Quellcode-Dateien verwendet, die vereinbarungsgemäß die. c-Datei Erweiterung. Deshalb haben wir caesar.c, vigenère.c haben. Wenn Sie das Schreiben von Java-Programmen sind Sie ihnen die Erweiterung. Java. Python-Programme haben die Erweiterung. Py oft. Sobald Sie mehrere. C Dateien haben, kompilieren Sie sie. Clang spuckt all diese binären Müll. Dann, weil Sie nur 1 Programm Sie haben den Linker Link alle diese Objektdateien zusammen in 1 ausführbare Datei. Dies ist auch, was passiert, wenn Sie den CS50-Bibliothek verwenden, zum Beispiel. Das CS50-Bibliothek ist, dass sowohl. H Header-Datei die Sie gelesen haben, dass # includecs50.h. Und dann ist es auch eine spezielle binäre Library-Datei Das ist zusammengestellt worden, dh 0 und 1, und dass Flag-l, also, wenn wir gehen zurück zu unserem Spaces und wir freuen sehr schnell an, was hier vor sich geht, wenn wir in unserem clang Befehl aussehen, Was wir haben, ist dies ist unser Quellcodedatei hier richtig. Dies sind ein paar Compiler-Flags. Und dann ganz am Ende, diese-l flags Link in die tatsächliche binäre Dateien für diese 2-Bibliotheken, die CS50-Bibliothek und dann die Mathematik-Bibliothek. Verstehen jede Art von Dateien 'Zweck bei der Zusammenstellung Prozess ist etwas, das Sie wollen in der Lage sein geben mindestens ein hohes Maß Überblick. Source code kommt in. Object-Code kommt heraus. Object-Code-Dateien miteinander verknüpfen, und Sie erhalten eine schöne, ausführbare Datei. Cool. Dies gilt auch, wo Sie Fehler an mehreren Stellen erhalten können in der Kompilierung. Dies ist, wo, zum Beispiel, wenn Ihnen diese Verknüpfung Flagge, Die CS50 Flagge, und man sie weglassen in Spaces oder wenn Sie Ihren Code ausführen möchten, das ist, wo Sie einen Fehler in der Verknüpfung Phase bekommen, und der Linker wird sagen: "Hey, du bist ein GetString genannt das ist in der CS50-Bibliothek. " "Sie sagte mir, es war in der CS50-Bibliothek, und ich kann nicht finden, den Code für sie." Das ist, wo Sie es in Verknüpfung haben, und das ist separaten von einem Compiler-Fehler, weil der Compiler wird auf Syntax und solche Sachen suchen. Es ist gut zu wissen, was los ist, wenn. Andere Dinge zu wissen. Ich würde sagen, Sie wollen auf jeden Fall einen Blick auf die kurz auf typecasting von Jordan getan zu nehmen zu verstehen, was ints unter der Haube sind, Welche Zeichen sind unter der Haube. Wenn wir über ASCII reden und wir tatsächlich Blick auf die ASCII-Tabelle, was das tut gibt uns ein unter die Haube schauen , wie der Computer tatsächlich stellt Kapital A und die Ziffer 7 und ein Komma und ein Fragezeichen. Der Computer hat auch besondere Weise zu repräsentieren die Zahl 7 als integer. Es hat eine besondere Art und Weise, um die Zahl 7 als Gleitkommazahl darstellen, und diejenigen, sind sehr unterschiedlich. Typecasting ist, wie Sie sagen, der Computer "Hey, ich Sie konvertieren möchten von einer Darstellung in einer anderen Darstellung. " Warum gehen wir nicht einen Blick auf, dass. Ich würde auch einen Blick auf die kurz auf Bibliotheken und kurz auf Compiler. Diejenigen Diskussion über den Prozess der Erstellung, was eine Bibliothek ist, und gehen über einige dieser Fragen, die Sie gefragt kommen könnten. Fragen zu Woche 1 Material? Gibt es irgendwelche Themen hier, die abschreckend wirken Sie möchten, zu decken? Ich versuche, durch die meisten dieser früheren Themen zu blasen, so dass wir bekommen können, um Zeiger und tun ein bisschen Rekursion. Gedanken? Nichts zu decken? Zeit für etwas Schokolade vielleicht? Ihr seid durch sie arbeiten. Ich werde zu halten nippen an meinem Kaffee. Woche 2. Guter Ruf, guten Ruf. In Woche 2 sprachen wir ein wenig mehr über die Funktionen. In den ersten paar Übungsaufgaben wir nicht wirklich schreiben alle Funktionen auf allen andere als welcher Funktion? [Student] Main. >> Main, genau. Und so haben wir die verschiedenen Kostüme, die wichtigsten trägt gesehen. Es ist das einzige, in dem es keine Argumente, und wir nur sagen Leere zwischen den Klammern und dann gibt es die andere, wo wir wollen Befehlszeilenargumente nimmst, und wie wir gesehen haben, das ist, wo man int argc und String argv Array oder jetzt, dass wir tatsächlich String ausgesetzt die char *, dass es sein werden wir mit dem Schreiben beginnen sie als char * argv und dann Klammern. In Problem Set 3, sah euch eine Reihe von Funktionen, und Sie eine Reihe von Funktionen implementiert, zeichnen, schauen, Gerangel. Die Prototypen wurden alle für Sie geschrieben. Was ich schon immer über hier funktioniert wirklich schnell zu sprechen ist, dass es 3 Teile, um sie, wenn Sie eine Funktion zu schreiben. Sie müssen den Rückgabetyp der Funktion anzugeben. Sie müssen einen Namen für die Funktion angeben, und dann müssen Sie angeben, die Liste der Argumente oder Parameter-Liste. Zum Beispiel, wenn ich eine Funktion schreiben zu summieren ein paar Zahlen und dann zu mir zurück die Summe, was meine Rückgabetyp wäre wenn ich wollte Zahlen summieren und dann wieder die Summe? Dann wird der Name der Funktion. Wenn ich gehe voraus und schreiben im Grünen, ist dieser Teil der Rückgabetyp. Dieser Teil ist der Name. Und dann in Klammern ist, wo ich die Argumente zu geben, häufig abgekürzt als args, manchmal genannt params für Parameter. Und wenn Sie eine haben, müssen Sie nur angeben ein. Wenn Sie mehrere trennen Sie jeweils mit einem Komma. Und für jedes Argument geben Sie es 2 Dinge, die sind-Kevin? [Kevin] Sie haben die Art und dann den Namen geben. Und dann der Name, und der Name ist der Name, den Sie verwenden wollen zu diesem Argument innerhalb der Summe-Funktion beziehen, innerhalb der Funktion, die Sie gerade schreiben. Sie müssen nicht, zum Beispiel, wenn ich werde zu summieren, sagen, ein Array von Ganzzahlen-wir tun int-Array, und ich gebe mir ein paar geschweiften Klammern gibt- wenn ich dann ein Array der Summe-Funktion Ich gehe in die erste Position der Liste der Argumente. Aber das Array, dass ich übergeben muss nicht den Namen arr haben. Arr sein wird, wie ich auf dieses Argument beziehen innerhalb des Körpers der Funktion. Die andere Sache, die wir brauchen, um zu berücksichtigen, und das ist etwas anders funktioniert, aber ich denke, es ist ein wichtiger Punkt, ist, dass in C, wenn ich schreibe eine Funktion wie diese wie kann ich wissen, wie viele Elemente in diesem Array? Dies ist so etwas wie eine Fangfrage. Wir sprachen über diese ein wenig in der vergangenen Woche Abschnitt. Woher weiß ich, die Anzahl der Elemente in einem Array in C? Gibt es eine Möglichkeit? Es stellt sich heraus, dass es keine Möglichkeit zu wissen. Man muss es passieren, getrennt. Es gibt einen Trick, dass Sie tun können wenn Sie in der gleichen Funktion in dem das Array deklariert wurde, und du bist mit einem Stapel-Array eingesetzt. Aber das funktioniert nur, wenn in der gleichen Funktion sind. Wenn Sie ein Array mit einer anderen Funktion oder wenn Sie deklariert haben eine Reihe und Sie das Array setzen auf dem Heap, haben Sie malloc verwendet  und solche Sachen, dann sind alle Wetten ab. Dann haben Sie eigentlich um passieren ein besonderes Argument oder ein anderer Parameter sagen Ihnen, wie groß das Array ist. In diesem Fall würde ich wollen ein Komma-ich bin zu verwenden sorry, es geht aus dem Bildschirm hier- und ich würde in einem anderen Argument übergeben  und nennen es int len ​​für die Länge. Eine Sache, die kommen könnten auf der Quiz fragt Sie zu schreiben oder zu implementieren eine bestimmte Funktion aufgerufen etwas. Wenn wir nicht geben Ihnen die Prototypen, so dass diese ganze Sache hier dieses ganze Durcheinander wird die Funktion Erklärung oder die Funktion Prototyp namens, Dies ist eines der ersten Dinge, die Sie wollen festzunageln, wenn sie nicht gegeben hat Sie sofort auf das Quiz. Der andere Trick, den ich gelernt habe, ist, dass sagen, wir geben Ihnen einen Prototypen für eine Funktion, und wir sagen: "Hey, du hast es zu schreiben." Innerhalb der geschweiften Klammern, die Sie auf dem Quiz Wenn Sie feststellen, dass es eine Rückkehr geben und Sie bemerken, dass der Rückgabetyp ist etwas anderes als Leere, was bedeutet, dass die Funktion nicht wieder etwas bedeutet, dann, was Sie wollen auf jeden Fall tun, schreiben irgendeine Art von return-Anweisung am Ende der Funktion. Return, und in diesem Fall, wir setzen eine leere, weil wir in die leere füllen wollen. Aber das bekommt man das Denken in der richtigen Weise, wie werde ich dieses Problem anzugehen? Und es erinnert Sie gehen zu müssen, die einen Wert zurückgeben an den Aufrufer der Funktion. Yeah. >> [Student] Hat Stil anzuwenden, wenn wir das Schreiben von Code sind auf dem quiz? Wie Einrückung und solche Sachen? >> [Student] Yeah. Nein, nicht so viel. Ich denke, eine Menge, das ist etwas, was wir auf dem Quiz am Tag der werde klären, aber in der Regel Gedanken über # enthält und diese Art von Zeug, es ist eine Art von außen. [Student] Müssen Sie Ihre handschriftlichen Code zu kommentieren? Müssen Sie Ihre handschriftlichen Code zu kommentieren? Kommentierte ist immer gut, wenn man über einen Teil des Kredits sind besorgt oder Sie wollen Ihre Absicht, den Grader kommunizieren. Aber ich wieder auf dem Quiz selbst und auf das Quiz Tage klären, aber ich glaube nicht, dass es erforderlich werden, um Kommentare zu schreiben, nicht werden. Normalerweise nicht, aber es ist definitiv die Art von Dingen, wo Sie kommunizieren können Ihre Absicht, wie "Hey, das ist, wo ich mit ihm gehe ist." Und manchmal, die mit einen Teil des Kredits zu helfen. Cool. Basil. [Basil] Was ist der Unterschied zwischen dem Deklarieren, sagen wir, int lang in den Argumenten oder Parametern gegenüber der Deklaration einer Variablen innerhalb der Funktion? Wow, ging Kaffee auf der Luftröhre. [Basil] Wie die Dinge wollen wir in Argumente. Ja, das ist eine große Frage. Wie wählen Sie, welche Dinge Sie in den Argumenten wollen gegenüber, was ihr im Inneren tun sollten der Funktion? In diesem Fall haben wir aufgenommen beides als Argumente weil sie etwas, wer würde die Summe-Funktion wird braucht, um diese Dinge zu spezifizieren. Die Summe Funktion, wie wir darüber gesprochen, hat keine Möglichkeit zu wissen, wie groß das Array ist es aus seiner Anrufer oder wer auch immer ist mit der Summe-Funktion. Es hat keine Möglichkeit zu wissen, wie groß das Array ist. Der Grund gehen wir in dieser Länge hier als Argument Denn das ist etwas, dass wir im Grunde sagen die Aufrufer der Funktion, Wer wird die Summe Funktion zu nutzen, "Hey, nicht nur Sie haben, um uns eine Reihe von ints, müssen Sie auch, uns zu sagen, wie groß das Array, das Sie gegeben haben uns ist. " [Basil] Diese werden sowohl Befehlszeilenargumente sein? Nein, das sind aktuelle Argumente, dass Sie an die Funktion übergeben. Lass es mich tun eine neue Seite hier. [Basil] Wie Namen würde Pass- [Nate H.] Wenn ich int main (void) und ich werde in meinem return 0 legte hier auf dem Boden, und sagen, ich will die Summe-Funktion aufrufen. Ich möchte sagen, int x = Summe (); Um die Summe-Funktion Ich habe sowohl im Array übergeben, dass ich zu summieren möchten und die Länge der Anordnung, so ist dies in dem vorausgesetzt, ich hatte ein Array von ints, sagen, ich hatte int numbaz [] = 1, 2, 3, Art der Nutzung, die bis gehackt Syntax genau dort, was ich dann tun würde, ist in der Summe würde ich wollen in übergeben sowohl numbaz und die Zahl 3 die Summe-Funktion zu sagen "Okay, hier das Array Ich möchte Sie zu summieren ist." "Hier ist seine Größe." Macht das Sinn? Beantwortet das Ihre Frage? In vielerlei Hinsicht ist es tut parallel, was wir mit den wichtigsten zu tun wenn wir die Argumente der Kommandozeile haben. Ein Programm wie Cäsar-Chiffre, zum Beispiel erforderlich, dass Befehlszeilenargumente nicht in der Lage, etwas zu tun. Es wäre nicht wissen, wie sie zu verschlüsseln, wenn Sie nicht sagen, was zu verwendenden Schlüssel oder wenn Sie nicht sagen, was Zeichenfolge zu verschlüsseln wollte. Aufforderung zur Eingabe, das ist, wo wir 2 verschiedene Mechanismen haben zur Aufnahme Eingabe in vom Benutzer, zum Aufnehmen Informationen in vom Benutzer. Für Problem Set 1 sahen wir diese GetInt, GetString, GetFloat Weg der Aufforderung zur Eingabe, und das ist als mit dem Standard-Input-Stream. Es ist ein wenig anders. Es ist etwas, dass Sie auf einmal tun können, im Gegensatz zu wenn Sie das Programm, rufen Sie, wenn Sie das Programm laufen beginnen. Die Befehlszeilenargumente alle sind angegeben, wenn Sie das Programm laufen beginnen. Wir haben das Mischen der zwei von denen. Wenn wir Argumenten für eine Funktion, ist es ähnlich wie Befehlszeilenargumente to main. Es ist, wenn Sie die Funktion, die Sie brauchen, um es zu sagen berufen was genau er braucht, um seine Aufgaben zu erfüllen. Eine weitere gute Sache an und schaue ich lasse man es betrachtet in Ihrer Freizeit, und es wurde in der überdachten quiz-war diese Vorstellung von Umfang und lokalen Variablen gegenüber globalen Variablen. Sie achten darauf. Nun, wir bekommen auf diesem anderen Zeug, in Woche 3 wir kamen ins Gespräch über das Suchen und Sortieren. Suchen und Sortieren, zumindest in CS50, ist sehr viel eine Einführung in einige der theoretischen Teile der Informatik. Das Problem des Suchens, das Problem des Sortierens sind groß, kanonische Probleme. Wie finden Sie eine bestimmte Anzahl in einer Reihe von Milliarden von Zahlen? Wie finden Sie einen bestimmten Namen in einem Telefonbuch Das ist auf Ihrem Laptop gespeichert? Und so stellen wir diesen Begriff der asymptotischen Laufzeiten um wirklich zu quantifizieren, wie lange, wie schwer diese Problem sind, wie lange sie dauern zu lösen. In, glaube ich, 2011-Quiz gibt es ein Problem, dass ich denke Verdienste Abdecken sehr schnell, was ist ein, Problem 12. O nein, es ist Omega. Wir reden hier über die schnellstmögliche Laufzeit reden für einen bestimmten Algorithmus und dann der langsamsten möglichen Laufzeit. Diese Omega und O sind wirklich nur Verknüpfungen. Sie sind notational Verknüpfungen zu sagen wie schnell in der besten möglichen Fall wird unser Algorithmus laufen, und wie langsam im schlimmsten Fall wird der Algorithmus laufen? Lassen Sie uns ein paar von ihnen, und diese wurden ebenfalls behandelt in der kurzen über asymptotische Notation, die ich sehr empfehlen. Jackson hat einen wirklich guten Job. Mit binären Suche, reden wir über binäre Suche als ein Algorithmus, und wir in der Regel darüber reden in Bezug auf seine großen O. Was ist das große O? Was ist die langsamste mögliche Laufzeit der binären Suche? [Student] N ²? Schließen, schätze ich ähnlich. Es ist viel schneller als die. [Student] Binary? >> Ja, binäre Suche. [Student] Es ist log n. Anmelden n, so was tut sich n das? Es halbiert es jede Iteration. Genau, so in der langsamsten möglichen Fall, sagen, wenn Sie eine sortierte Array von einer Million Zahlen und die Zahl, die Sie suchen entweder das allererste Element in der Matrix oder der allerletzten Element in dem Array. Denken Sie daran, arbeitet der binären Suchalgorithmus, indem man die mittlere Element, zu sehen, ob das ist das Spiel, das Sie suchen. Wenn es ist dann groß, finden sie ihn. Im besten Fall, wie schnell muss binäre Suche laufen? [Studenten] 1. 1, ist es konstanter Zeit, big O von 1. Yeah. [Student] Ich habe eine Frage. Wenn Sie sagen, Sie n, du meinst mit Bezug zur Basis 2, richtig? Ja, das ist so, dass die andere Sache. Wir sagen log n, und ich denke, wenn ich in der Highschool war Ich habe immer angenommen, dass Log-Basis 10 war. Yeah, also ja, melden Basis 2 in der Regel ist das, was wir verwenden. Wieder geht zurück auf binäre Suche, wenn Sie sich für entweder gesuchten das Element am Ende oder das Element am Anfang, weil man in der Mitte und beginnen dann zu verwerfen je nachdem, welche Hälfte nicht den Kriterien entsprechen, die Sie suchen, und gehen Sie auf die nächste halbe und die nächste halbe und die nächste Hälfte. Wenn ich für die größte Element in der Millionen Integer-Array suchen Ich werde es höchstens log von 1 Million mal halbieren bevor ich endlich testen und sehen, dass das Element Ich suche ist in dem größten oder im höchsten Index des Arrays, und das wird log n zu nehmen, sich von 1 Million mal. Bubble sort. Do you guys erinnere mich an den Bubble-Sort-Algorithmus? Kevin, kannst du mir eine kurze Zusammenfassung von dem, was passiert in der Bubble-Sort-Algorithmus? [Kevin] Grundsätzlich geht es durch alles, was in der Liste. Es sieht auf den ersten beiden. Falls die erste größer ist als die zweite Swaps es ihnen. Dann vergleicht zweiten und dritten, dasselbe, Swaps dritten und vierten, den ganzen Weg hinunter. Größere Zahlen folgen bis zum Ende. Und nachdem wie viele Schleifen fertig. Genau, so was Kevin sagte, ist, dass wir größere Zahlen zu sehen Blase bis zum Ende des Arrays. Zum Beispiel, haben Sie was dagegen zu Fuß uns durch dieses Beispiel, wenn dies unser Angebot? [Kevin] Sie nehmen 2 und 3. 3 ist größer als 2, so dass Sie tauschen sie. [Nate H.] Right, so tauschen wir diese, und so bekommen wir 2, 3, 6, 4 und 9. [Kevin] Dann vergleichen Sie die 3 und 6. 3 ist kleiner als 6, so lassen Sie sie, und 6 und 4, würdest du tauschen sie, weil 4 ist kleiner als 6 ist. [Nate H.] Right, so bekomme ich 2, 3, 4, 6, 9. [Kevin] und 9 ist größer als 6, so dass Sie es verlassen. Und du würdest gehen zurück durch sie wieder. [Nate H.] Bin ich an dieser Stelle getan? >> [Kevin] Nr. Und warum bin ich nicht an dieser Stelle getan? Weil es sieht aus wie mein Array wird sortiert. Ich sehe es. [Kevin] Gehe durch sie wieder und stellen Sie sicher, dass es nicht mehr Swaps bevor Sie komplett zu stoppen. Genau, so dass Sie brauchen, um gehen durch und stellen Sie sicher, dass es keine Swaps dass man an dieser Stelle machen. Es war wirklich nur Glück, wie du gesagt hast, dass wir am Ende nur mit, um ein Durchlauf machen und wir sortiert. Aber um dies im allgemeinen Fall tun wir eigentlich, dies immer und immer wieder tun. Und in der Tat war dies ein Beispiel für die bestmögliche Fall wie wir sahen, in das Problem. Wir sahen, dass die bestmögliche Fall n wurde. Wir gingen durch das Array 1 mal. Was ist die denkbar schlechteste Fall für diesen Algorithmus? [Kevin] N ². Und was bedeutet das aussehen? Was würde ein Array aussehen, dass würde n ² Zeit? [Kevin] [unverständlich] sortiert. Genau, so hätte ich das Array 9, 7, 6, 5, 2, zuerst die 9 würden bubble den ganzen Weg bis. Nach 1 Iteration hätten wir 7, 6, 5, 2, 9. Dann würde das 7 sprudeln, 6, 5, 2, 7, 9, und so weiter und so fort. Wir müssten das gesamte Array durch n Zeiten gehen, und Sie können tatsächlich etwas präziser als dies denn wenn wir umgezogen den 9 den ganzen Weg bis in seine letzten möglichen Position wir wissen, dass wir nie gegen dieses Element wieder zu vergleichen. Sobald wir beginnen sprudeln die 7 bis wir wissen, dass wir aufhören können, wenn die 7 ist direkt vor dem 9 da wir schon die 9, um es verglichen. Wenn Sie dies auf intelligente Weise zu tun, es ist nicht wirklich, ich denke, dass viel Zeit. Du wirst doch nicht um alle möglichen [unverständlich] Kombinationen vergleichen jedes einzelne Mal, wenn Sie gehen durch jede Iteration. Aber dennoch, wenn wir über diese Obergrenze sprechen wir sagen, dass Sie sind auf der Suche n ² Vergleiche ganzen Weg durch. Gehen wir zurück, und da wir fangen an, sich ein wenig zu kurz auf Zeit Ich würde sagen, man sollte auf jeden Fall durch den Rest dieser Tabelle gehen, füllen sie alle aus. Denken Sie an Beispiele. Denken Sie an konkreten Beispielen. Das ist wirklich praktisch und hilfreich zu tun. Zeichnen Sie es heraus. Dies ist die Art der Tabelle, dass, wie Sie durch in der Informatik Sie sollten wirklich anfangen, diese auswendig zu kennen. Dies sind die Arten von Fragen erhalten Sie in Interviews. Dies sind Arten von Dingen, die gut zu wissen sind, und über diese Grenzfälle denke, wirklich herauszufinden, wie man denken wohl wissend, dass für Bubble sortieren die denkbar schlechteste array mit dieser Art ist eine, die in umgekehrter Reihenfolge ist. Pointers. Sprechen wir ein wenig über Zeiger. In den letzten Minuten haben wir hier Ich weiß, das ist etwas, mit Datei-I / O, die ist ziemlich neu. Wenn wir reden über Zeiger den Grund wollen wir über Zeiger zu sprechen Denn ein, wenn wir in C arbeiten wir sind wirklich auf einem relativ niedrigen Niveau im Vergleich zu den meisten modernen Programmiersprachen. Wir sind tatsächlich in der Lage, die Variablen im Speicher zu manipulieren, herauszufinden, wo sie tatsächlich in unserem RAM sich befinden. Sobald Sie auf Betriebssystem-Klassen sehen Sie nehmen verschwunden , dass das ist, wieder Art von Abstraktion. Das ist nicht der Fall. Wir haben den virtuellen Speicher, die versteckt diese Details ist von uns bekommen. Aber jetzt kann man davon ausgehen, dass, wenn Sie ein Programm haben, zum Beispiel, wenn Sie die Schaltung Ihrer Caesar-Chiffre-Programm- Ich werde wieder zurück in meinem iPad wirklich schnell- dass am Anfang Ihres Programms, wenn Sie, sagen wir, 4 Gigabyte RAM auf Ihrem Laptop, Sie erhalten neben diesen Brocken gesetzt, und wir werden dieses RAM nennen. Und es beginnt in einem Ort, den wir gehen auf 0 nennen wollen, und endet an einem Ort, dass wir 4 Gigabyte nennen. Ich kann wirklich nicht schreiben. Mann, das ist gehackt. Wenn Ihr Programm führt das Betriebssystem schnitzt RAM, und es gibt verschiedene Segmente für verschiedene Teile des Programms zu leben in. Hier unten in diesem Bereich ist eine Art Niemandsland. Wenn Sie gehen ein wenig weiter hier Sie haben tatsächlich bekam die Stelle, wo der Code für Ihr Programm lebt. Dass die tatsächlichen Binärcode, dass ausführbare Datei tatsächlich wird in den Speicher geladen wenn Sie ein Programm ausführen, und sie lebt in der Code-Segment. Und wie das Programm führt der Prozessor sieht in dieser Code-Segment um herauszufinden, was ist die nächste Anweisung? Was ist der nächste Codezeile muss ich ausführen? Es gibt auch ein Daten-Segment, und dies ist, wo diese String-Konstanten gespeichert, dass Sie schon mit bekommen. Und dann weiter oben gibt es diesen Ort genannt Heap. Wir greifen auf Speicher in es mit malloc, und dann in Richtung der Spitze des Programms gibt es die Stapel, und das ist, wo wir für die meisten von Anfang gespielt haben sind. Dies ist nicht maßstabsgetreu oder nichts. Eine Menge davon ist sehr Maschine abhängig, Betriebssystem abhängig, aber dies ist vergleichsweise wie Dinge Chunked aufstehen. Wenn Sie ein Programm ausführen, und Sie erklären, eine Variable namens x- Ich werde ein anderes Feld unten zu ziehen, und dies wird in den RAM als gut. Und ich werde sie suchen müssen. Wir ziehen gezackte Linien, um anzuzeigen, das ist nur ein kleiner Teil der RAM und nicht alle, wie wir ziehen an der Spitze. Wenn ich erklären, eine Integer-Variable namens x, was ich dann tatsächlich bekommen, ist eine Zuordnung Das ist in der Symboltabelle mein Programm gespeichert das verbindet den Namen x in dieser Region der Erinnerung, die ich gezeichnet haben hier zwischen den vertikalen Balken. Wenn ich eine Zeile Code in meinem Programm, x = 7 sagt der Prozessor weiß "Oh, okay, ich weiß, dass x das Leben an dieser Stelle in Erinnerung." "Ich werde weitermachen und schreiben Sie eine 7 gibt." Woher weiß er, was Lage dies zu meinem Gedächtnis ist? Nun, das ist alles bei der Kompilierung getan. Der Compiler kümmert Zuteilen wobei jede der Variablen gehen, gehen und die Schaffung einer speziellen Zuordnung bzw. Verbindung der Punkte zwischen einem Symbol und wohin es geht, eine variable Namen und wo es wird in Erinnerung bleiben. Aber es stellt sich heraus, dass wir tatsächlich auf sie in unserer Programme. Diese bekommt wichtig, wenn wir sprechen über einige der Datenstrukturen zu starten, das ist ein Konzept, dass wir gehen zu einem späteren Zeitpunkt einzuführen. Aber jetzt, was Sie wissen, ist, dass ich einen Zeiger auf diesen Standort zu erstellen, x. Zum Beispiel kann ich eine Zeiger-Variable. Wenn wir eine Zeiger-Variable erstellen wir den Stern-Notation. In diesem Fall sagt das werde ich einen Zeiger auf ein int erstellen. Es ist eine Art wie jede andere. Wir geben ihm eine Variable wie y, und dann setzen wir sie gleich an die Adresse zu einer Adresse. In diesem Fall, können wir y auf x zeigen indem Sie die Adresse von x, die wir mit diesem kaufmännisches, und dann setzen wir y auf ihn verweisen. Was dies im Wesentlichen bedeutet, wenn wir in unserem RAM aussehen dies schafft eine separate Variable. Es wird nennen es y, und wenn diese Zeile Code ausführt es ist eigentlich noch ein bisschen Zeiger, die wir üblicherweise als Pfeil zu zeichnen erstellen, und es setzt y zu x verweisen. Ja. [Student] Wenn x ist bereits ein Zeiger, würden Sie genau das zu tun int * y = x anstatt das kaufmännische? Ja. Wenn x ist bereits ein Zeiger, dann können Sie 2 Zeiger einander gleich, In diesem Fall wäre nicht y zu x hinweisen, aber es würde was x ist darauf zu Punkt. Leider können wir aus der Zeit. Was ich an dieser Stelle sagen, können wir über diese offline zu sprechen, aber ich würde sagen der Arbeit beginnen über dieses Problem, # 14. Sie sehen, es ist schon ein wenig für Sie ausgefüllt hier. Sie können sehen, dass, wenn wir 2 Zeiger deklarieren, int * x und * y, und beachten Sie, dass zeigt das * neben der Variablen war etwas, das getan im letzten Jahr. Es stellt sich heraus, dass dies ähnlich zu dem, was wir tun, in diesem Jahr ist. Es spielt keine Rolle, wo Sie die * schreiben, wenn Sie erklären den Zeiger sind. Aber wir haben die * verfasst neben dem Typ denn das macht es sehr klar, dass du Deklaration eines Zeigers variabel. Sie können sehen, dass der Deklaration der 2 Zeiger gibt uns 2 Boxen. Hier, wenn wir x gleich malloc was dieser sagt, ist abgesehen von Speicher im Heap. Diese kleine Box hier, dieser Kreis wird auf dem Heap entfernt. X verbunden. Beachten Sie, dass y ist immer noch nicht zeigen zu nichts. Um Speicher, um die Zahl 42 in x speichern wir nutzen, was Notation? [Student] * x = 42. Genau, * x = 42. Das bedeutet, folgen Sie dem Pfeil und werfen 42 drin. Hier, wo wir y und x gesetzt haben wir y zeigt auf x. Auch dies ist wie, was Kevin wo wir y gleich x gesetzt ist. Y verweist nicht auf x. Vielmehr ist es das, was x ist so gut darauf zeigt. Und dann endlich in dieser letzten Box gibt es 2 mögliche Dinge, die wir tun könnten. Einer ist, wir könnten * x = 13 sagen. Die andere Sache ist, wir könnten sagen Alex, weißt du, was wir hier tun? Man könnte sagen, * x = 13 oder- [Student] Man könnte sagen, int whatever. [Nate H.] Wenn diese wurden als int-Variable bezeichnet konnten wir das tun. Wir könnten auch sagen * y = 13, weil sie beide darauf sind an der gleichen Stelle, so konnten wir verwenden entweder variable zu erhalten. Yeah. >> [Student] Was würde es aussehen, wenn wir einfach sagen int x 13? Das würde erklären eine neue Variable namens x, das nicht funktionieren würde. Wir hätten eine Kollision, weil wir x ein Zeiger hier oben erklärt. [Student] Wenn wir hatten nur diese Aussage selbst, was würde es aussehen in Bezug auf den Kreis? Wenn wir x mussten = 13 dann müssten wir ein Feld, und anstatt einen Pfeil Coming Out of the box, wir würden es nur als eine 13 zu ziehen. [Student] In der Box. Okay. Danke für das Aufpassen und viel Glück auf Quiz 0. [CS50.TV]