[Powered by Google Translate] DAVID J. MALAN: All right, dies CS50, und dies ist der
Beginn der zweiten Woche.
Danke.
Lassen Sie uns hier beginnen mit einem Telefonanruf.
Ich bin über 617-BUG-CS50-Wahlrad auf.
CS50: Dies ist CS50.
Für Shuttle Boy, 1 drücken.
Um neu zu starten, drücken Sie 9.
DAVID J. MALAN: So sagte er zum Shuttle Boy, 1 drücken.
Also werden wir Sie 1 drücken.
CS50: Was ist Ihre Herkunft?
Für Quad, 1 drücken.
Mather, drücken Sie 2.
Boylston, drücken Sie 3.
Lamont, drücken Sie 4.
Mem Hall, Taste 5 drücken.
Um neu zu starten, drücken Sie 0.
DAVID J. MALAN: Wir werden ein für Quad drücken.
CS50: Next Shuttle fährt in dieser Minute um 1:10 Uhr und
dann um 1:20 Uhr, 13.30 Uhr, 01.40 Uhr.
Dies ist CS50.
>> DAVID J. MALAN: Also das ist CS50 Stimme.
Und es ist ein Beispiel für die Art der endgültigen Projekte,
So können Sie beispielsweise abbeißen Richtung
das Ende des Semesters.
Zum Beispiel besteht, dass shuttleboy.cs50.net -
eigentlich ein Projekt, dass ich zum ersten Mal schrieb nach der Einnahme von CS51
zurück, wenn ich ein grundständiges war.
Und die Inspiration war hier damals war alles, was sie hatten
die gedruckten Shuttle-Bus Zeitpläne, und es gab keine
Begriff suchen Dinge online.
Und so habe ich eine Art Taube in ein Wochenende, strömte durch die
gedruckten Zeitplan, und es ein Computerprogramm portiert.
Zu dieser Zeit passiert das Computerprogramm geschrieben werden
in C. Und Sie tatsächlich lief es, indem Shuttle Boy at a
Blinken aufgefordert, wie wir wurden bisher habe tun.
Aber im Laufe der Jahre hat sie in einem Augenblick entwickelt
Messaging bot.
Es ist vor kurzem in diese Website entwickelt, in eine
SMS-basiertes Tool, sowie in dieser Stimme-basiertes Tool.
Und das ist an den möglichen Dinge anzudeuten, dass man
für sich selbst tut, indem Semester Ende.
>> Zum Beispiel gibt, geschieht das SMS-Version von Shuttle Boy
wie folgt zu arbeiten.
Wenn auf Ihrem Handy, senden Sie eine SMS an 41411 und
senden Sie dann die Sonderzeichen sboy für Shuttle Boy,
gefolgt von A und B, wobei A ein Ursprung und B ein
Ziel -
zum Beispiel Boylston Raum Quad -
was sollte man wieder innerhalb von wenigen Sekunden ist ein Text
Nachricht von Shuttle Boy sagen Ihnen genau, wenn die
nächsten Shuttles sind, von diesem Punkt A werde, dass
Punkt B.
Und dies ist ein allgemeineres Beispiel von dem, was bekannt als
Verwendung einer API.
>> So zum Beispiel, ist dies hier nur shuttleboy.cs50.net, die
tatsächliche Web-basierte Inkarnation dies.
Aber die Daten, die diese und andere Anwendungen unterstreicht, dass CS50
entwickelt werden alle an alle hier in Form ausgesetzt
von APIs, Application Programming Interfaces.
Und das ist nur eine andere Art zu sagen, dass Leute wie wir
das Internet und andere haben einige Zeit damit verbracht,
Software, die Sie verwenden können, um Daten von uns zu packen und
Dann bauen Sie Ihre eigenen Anwendungen auf
dieses Datensatzes.
So zum Beispiel, diese Shuttle Boy API-Seite hier, die
zufällig in der CS50 Bedienungsanleitung, im wesentlichen Dokumente werden
wie Sie zu fragen CS50-Server für die Daten gehen.
Zum Beispiel, wenn Sie sich mit CSV-Dateien, Komma
getrennte Werte, das sind nur eine Art quick and dirty
Excel-ähnliche Dateien.
So können Sie Shuttle Boy für alle Daten auf allen der Fragen
Häuser und ihre GPS-Koordinaten, und Sie erhalten
Zurück im Wesentlichen eine Tabellenkalkulation so, dass
Sie können dann in einem Programm Ihrer eigenen zu lesen und dann
generieren Ergebnisse, wie Shuttle Boy selbst
passiert zu tun.
Für die mehr vertraut, moderner Datendarstellungen
gehören JSON, JavaScript Object Notation.
Etwas wird sich dann mit Ihnen in Richtung
das Ende des Semesters.
>> Aber noch einmal, dies ist nur eine von mehreren eigenen APIs CS50 ist.
Und die aufregendste Sache ist jetzt, in diesen Tagen, Facebook und
Twitter und Google und so ziemlich jede populäre Website aus
muss es irgendeine Art von API, die, wenn Sie die ausgelesenen
Dokumentation auf ihrer Website, melden Sie sich für eine
Account haben, können Sie mit dem Schreiben beginnen Software auf der Oberseite
welche Werkzeuge oder Daten, die Unternehmen dort zur Verfügung stellt.
Und so ein eigener Lehre Stipendiaten vor ein paar Jahren
schrieb eine Mac-Version davon.
So auf den Link mit dem Titel Mac hier links oben, können Sie tatsächlich
laden Sie ein Mac OS Widget, das auf dem eigenen Mac läuft die tun
gleiche Art von Dingen.
So geht es um den Bau auf der Oberseite von Datensätzen wie diese.
Aber mehr auf, daß gegen Ende des Semesters.
>> Lassen Sie uns also in Echtzeit schnell einen Fehler tauchen, nur um eine Art, an
Dinge, erwärmt sich noch heute, und denke zurück auf einige der
Dinge, die wir sahen in der vergangenen Woche.
Insbesondere, lass mich gehen Sie vor und nach oben ziehen, sagen wir,
Dieses Beispiel hier.
Buggy1.c, ist dies auf den Verlauf der Website verfügbar, wenn Sie würde
es gerne herunterladen und herumzustochern sich.
Aber lasst uns hier vergrößern zu diesem relativ kurzen Programm, und nur
a super-schnelle Rekapitulation der einige der grundlegenden Bausteine, die
wir wirklich gehen, um nur anfangen, für selbstverständlich.
>> So das blaue Zeug, in den Zeilen 1 bis 9 sind nur
Softball Fragen.
So sind nur Kommentare.
Sie haben keine funktionelle Bedeutung.
Aber sie sind Kommentare in dem Sinne, dass sie Hinweise sind, dass
Ich, der Mensch, machte mich so, dass in der Vorlesung und nach
Vortrag, kann ich eigentlich daran erinnern, was dieses Programm
macht, ohne sich durch sie Zeile für Zeile lesen und
Neuerstellung Geschichte in meinem Kopf.
Außerdem, wenn ich die Hand dieses Programm, um jemand anderes, wie
Sie ist es viel klarer zu Ihnen, weil von Kommentaren wie diesem,
was das Programm ist eigentlich zu tun, oder zumindest, was die
Programm tun soll.
Ob es richtig ist eine ganz andere Sache.
Jetzt, in C, mit mehrzeiligen Kommentaren, daran erinnern, dass on line
hier ist die Magie Symbol / *.
Es bedeutet, hier kommt der Beginn eines Kommentars.
Und nichts anderes zählt, bis Sie das Ende Terminator erreichen,
das ist * /, das Gegenteil.
So ist die Tatsache, dass ich 80-einige seltsame Sterne haben hier
von links nach rechts ist wirklich nur ein ästhetisches Detail.
Es hat keine funktionale Bedeutung.
>> Nun, wie etwa Zeile 11?
Was bedeutet das in juristischer Hinsicht zu tun?
Was ist das?
PUBLIKUM: Beinhaltet die Norm.
DAVID J. MALAN: OK, gut.
So umfasst die stdio.h Bibliothek.
Also, was bedeutet das?
Nun, in diesen Dateien, stdio.h, sind eine ganze Reihe von
Funktion Erklärungen -
das ist, Code, dass jemand anderes geschrieben hat.
Und ein perfektes Beispiel für eine Funktion, die in deklariert ist
stdio.h ist -
die beliebtesten inzwischen?
So printf, zu einem der gebräuchlichsten verwenden, sicher
früh, aus dieser Bibliothek ist da.
Wenn ich diese Zeile Code auszuschließen, wird Clang gehen zu schreien
bei mir etwas über einen unerklärten Symbol.
Etwas Schwarzarbeit ist wohl das Schlüsselwort, denn
wir haben nicht den Compiler, was printf sieht informiert
wie wenn wir diese Linie gehören.
Und mehr auf die Erde, wirklich, was diese Zeile sagt, ist
öffnen Sie die Datei, stdio.h, wo sie auf dem Server ist
Festplatte oder das Gerät auf die Festplatte, und copy-paste es
Recht dort in meine Akte, ohne meine
dass Sie dies manuell tun.
>> Nun, wenn wir hier unten, um Haupt-, bald fangen wir
Hänseleien auseinander, was int und was nichtig ist.
Aber jetzt, lasst uns an den drei Zeilen sehen
innerhalb von 15 bis 17.
Diese hier habe ich Anspruch als buggy.
Linie 7 in meinen Kommentaren sagt: "Sollte 10 ausgeben
Sternchen aber nicht. "Warum funktioniert das nicht drucken, in der Tat,
10 solcher Sterne?
PUBLIKUM: [unverständlich].
DAVID J. MALAN: Genau.
So bemerken, dass wir beginnen, um von 0 zu zählen.
Und das ist eigentlich eine Konvention in der Programmierung und
Informatik allgemein, beginnend zu zählen
von 0 statt 1.
Und das wirklich nur aus der Tatsache, dass für
Beispiel, wenn wir acht Leute hatten auf der Bühne, wenn
Niemand hob ihre Hand, sie waren
alle effektiv Nullen.
Und so ist es nur eine Art Computer-Konvention so,
daher beginnt bei 0..
Wenn es das ist die niedrigste Zahl können Sie in binärer darstellen.
>> Also hier haben wir begonnen Initialisierung i auf 0 gesetzt.
Wir haben festgelegt i gleich 0 ist.
Aber dann habe ich diesen Fehler gemacht hier zu sagen i kleiner oder
gleich 10 ist.
Aber wenn Sie denken, dass durch, wenn ich bei 0 und starten Sie dann gehe ich
bis zu 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ich bin eigentlich los
drucken Sie 11 Sterne auf dem Bildschirm, weil ich oben gegangen waren
zu und gleich 10 ist.
So ist die einfache Lösung hier dann ist was?
PUBLIKUM: [unverständlich].
DAVID J. MALAN: Ändern Sie einfach auf weniger als.
Wenn Sie wirklich wollen, können Sie dies tun.
Aber im Allgemeinen ist das verpönt.
Und so beginnen, von 0 zu zählen ist nur etwas, sollten Sie
Regel gewöhnen.
Nun, was dieses ganze Konstrukt in sich selbst?
Diese Zeile 15 renzeichen eine for-Schleife.
Also für keine Funktion.
Es ist nur eine Feststellung.
Es ist ein Looping Konstrukt, wie wir in Scratch sah.
Und es besteht aus drei Teilen.
Feststellen, dass es das erste Teil um
links von der Strichpunkt.
Es ist der mittlere Teil zwischen den beiden Semikola.
Und dann gibt es noch die rechte Hand auf der rechten Seite
des zweiten Semikolon.
Nun hat der erste davon und?
PUBLIKUM: [unverständlich].
DAVID J. MALAN: Zurück da?
Yeah?
PUBLIKUM: Initialisierung.
>> DAVID J. MALAN: Initialisierung.
Also, was bedeutet das?
Wir haben eine Variable namens i deklariert.
Es ist vom Typ int, weil ich int i angegeben haben.
Und ich bin der Initialisierung i auf den Wert von 0 auf.
Also, was ist das wirklich sagen?
Es ist tatsächlich sagen dem Computer hey, gib mir genug
Speicher, genug RAM, um eine Reihe passen, und setzen Sie dann die
Nummer 0 in diesem Stück RAM.
Und nebenbei, wie groß ist ein int in der Regel, zumindest innerhalb
des Gerätes?
PUBLIKUM: 32 bit.
DAVID J. MALAN: 32 Bit.
Das heißt also, gib mir 32 Bit, sonst als 4 Bytes bekannt,
und setzen Sie den Wert 0 in ihm, das ist ziemlich einfach, weil
Es bedeutet nur, alle Bits auf 0 gesetzt.
>> So, jetzt ist der zweite Teil hier die Bedingung.
Und der Zustand, wie der Name schon vermuten lässt, ist das, was wird geprüft
wieder und wieder und wieder, ob es wahr oder falsch ist.
Das ist also nur sagen, führen Sie die folgenden Zeilen Code -
nämlich Linie 16, weil das die einzige eingerückt ist
darunter -
solange i kleiner als 10 ist.
Und nach jedem Durchlauf dieser Schleife, gehen Sie
Inkrementierung, die in diesem Fall ist i + +.
Nun hat es nicht bis i + + sein.
Es könnte i sein -.
Aber wenn ich das tat, was ist das Verhalten gehen
um dieses Programms sein?
PUBLIKUM: Es wird eine Endlosschleife.
DAVID J. MALAN: Es wird eine Art Endlosschleife,
es sei denn, wir bekommen nach negativer 2 Milliarden oder so viel Glück.
Vielleicht Dinge herum wickeln, nur von der Natur der endlichen
Anzahl der Bits, die wir für eine int zugewiesen.
Aber es ist sicherlich noch weit mehr als 10 durchlaufen und
sicherlich mehr als 11 Mal hier.
>> Und jetzt, nur so nebenbei, erkennen, dass i + + und i -
sind wirklich nur syntaktischer Zucker.
Es ist nur Kurzschreibweise für das, was ein wenig mehr
explizit wie folgt geschrieben:
i = i + 1.
Das heißt identisch i + +.
Es nur irgendwie sieht schöner zu sagen i + +.
Es ist mehr prägnant, besser lesbar.
Und so die meisten Menschen tun, statt.
Dies ist aber funktionell identisch
was wir gerade gesehen haben.
Also kurz gesagt, ist die schnelle Lösung hier nur zu sagen, iterieren i
von 0 bis hinauf zu weniger als 10 ist.
Und dann werden wir in der Tat erhalten 10 Sterne.
>> Also lasst uns versuchen.
Lassen Sie mich öffnen Sie das Terminal an der Unterseite.
Lassen Sie mich in das Verzeichnis zu gehen, dass diese ist in.
Und ich werde es manuell kompilieren mit Clang für jetzt.
Und ich werde dies als buggy1.c kompilieren Sie die Eingabetaste.
Und jetzt buggy1, warum gibt es keine solche Datei oder das Verzeichnis
genannt buggy1?
PUBLIKUM: [unverständlich].
DAVID J. MALAN: Yeah.
Also ist es eigentlich als a.out.
So erinnern, wenn Sie laufen nur Clang, wo Clang ist die
Compiler, und Sie nicht den Namen Sie
geben, um Ihr Programm, es geht um standardmäßig auf a.out.
So in der Tat, wenn ich ls -
oops.
Und ich didn't - die Schwarz-Weiß-Thema einige
Sie konfrontiert wurde behoben.
Aber lassen Sie mich dies tun.
Dort haben wir a.out auf der linken Seite befindet.
Also müssen wir a.out statt buggy1 laufen.
>> Also lass mich gehen Sie vor und tun dies.
. / A.out, Enter.
Und ich anscheinend nicht was tun?
PUBLIKUM: Speichern.
DAVID J. MALAN: Speichern meiner Datei.
Also das ist einfach durch Drücken Control S, oder gehen zu lösen
Datei, Speichern, wie in den meisten Programmen.
Lassen Sie mich gehen hier unten, löschen Sie den Bildschirm, führen Sie es erneut.
Und es gibt noch ein Bug.
So, was los ist -
PUBLIKUM: Sie haben nicht kompilieren.
DAVID J. MALAN: Ah, gut.
Ich wusste nicht kompilieren.
Wie ein Idiot, ich bin auf den Code schauen, um zu sehen, was los ist.
So clang buggy1.c, jetzt a.out.
Und puh, gespeichert.
>> So sieht es ein wenig hässlich, weil es keine neue Linie
überall im Programm.
Aber noch einmal, das ist nur ein ästhetisches Detail.
Und zumindest, wenn wir diejenigen zähle, sollten wir
nun 10 solcher Sterne.
Nun, was ist mit diesem zweiten Warm-up Beispiel?
So in buggy2, behaupte ich, dass diese Version auch gedruckt werden
10 Sterne, eine pro Zeile.
Also dieser Zeit habe ich einen Zeilenumbruch, nur um
Dinge ein wenig schöner.
Aber anstatt, was ich bekomme ist.
So lass mich tun clang buggy2.c, Enter.
Jetzt ist es wieder aufgerufen a.out.
Enter.
Ich sehe nur eine neue Linie, nur das letzte neue Zeile,
bewegt meine Aufforderung, die nächste Zeile.
Und doch klar ich habe Druck *, dann eine neue Zeile,
*, Dann eine neue Zeile.
Aber was ist der Fehler hier?
Yeah?
PUBLIKUM: [unverständlich].
>> DAVID J. MALAN: Genau.
Ganz im Gegensatz zu einigen Sprachen wie Python, wo Einkerbung
tatsächlich funktionelle Bedeutung, in
Sprache wie C -
wie wir sehen werden, PHP, JavaScript -
die Vertiefung ist wirklich nur für den Menschen 'profitieren.
So ist die Tatsache, dass ich 16 und 17 eingerückt sieht toll aus,
aber es hat keine funktionale Bedeutung hier.
Wenn ich beide Leitungen als Teil der für die Ausführung
Schleife, dann muss ich sie in geschweiften Klammern umschließen indem Sie diese.
Sie können nur schneiden diese Ecke und lassen Sie die geschweiften Klammern ein, wenn
Was ist der Fall?
PUBLIKUM: Nur eine Zeile.
DAVID J. MALAN: Nur eine Zeile.
Also das ist einfach irgendwie eine nette Art von Syntax Detail, so dass
Sie verschwenden keine Zeit mit dem Schreiben drei Linien, von denen zwei
geschweiften Klammern, nur zu schreiben eine einzige Zeile Code.
Aber wenn Sie zwei oder mehr Zeilen, wir
Tat brauchen, dies zu tun.
>> So, jetzt lass mich speichern Sie diese.
Lassen Sie mich gehen Sie vor und erneut ausführen Clang.
Dann lass mich erneut a.out, und jetzt bekomme ich sie eine pro Zeile.
Nun, a.out ist wieder eine Art stummen Namen für ein Programm.
Wie kann ich feststellen Clang tatsächlich geben mir einen Dateinamen
das ist mehr benutzerfreundlich, wie buggy2 selbst?
Ein wenig mehr klar?
PUBLIKUM: [unverständlich].
DAVID J. MALAN: OK, ich kann also tatsächlich die sehr
benutzerfreundliche Verknüpfung und schreiben Sie einfach machen buggy2.
Ich weiß nicht angeben. C in diesem Fall, und drücken Sie Enter.
Und was machen tut, ist es kompiliert buggy2.c für mich durch
fragen Clang es zu tun.
Insbesondere ist es Clang nennt, läuft es Clang mit viel mehr
Kommandozeilen-Argumente oder Schalter, als ich tatsächlich benötigen.
In der Zeit werden wir wieder zu dem, was alle diese verschiedenen
kryptischen Bindestrich Ausdrücken bedeutet.
Aber jetzt ist das nur sparen mir die Mühe
mit sich zu erinnern und zu tippen all jene
verschiedenen Bindestrich Ausdrücke.
Und der Kopf der es letztlich
dass ich jetzt haben buggy2.
Wenn ich dies tun manuell will, obwohl ich
kann stattdessen tun -
Klang-o buggy2 und dann buggy2.c.
Und das wird ähnlich wie mir eine Datei namens buggy2.
>> Also kurz gesagt, ist Clang der Compiler.
Stellen Sie nur ein benutzerfreundliches Tool, das werden wir mit mehr
und mehr, weil es nur beginnt,
Dinge zu vereinfachen für uns.
Und wir geben 0 schließlich.
Denn jetzt, nur weil, aber wir beginnen Hänseleien, dass ein Teil
heute und am Mittwoch.
Haben Sie Fragen zu irgendwas davon?
Yeah?
PUBLIKUM: [unverständlich]
ls in Anführungszeichen da?
DAVID J. MALAN: OK.
Wenn ich typisierte ls in Anführungszeichen, die mich tat etwas Magie
hinter den Kulissen einen Fehler beheben.
Ich habe vergessen, wie wir erzählt haben viele von Ihnen auf der
Diskussionsrunden zu tun -
wir tun dies jetzt - sudo yum-y update appliance50.
Whoops, dass das stimmt geschrieben.
So ist das Gerät wie ein Betriebssystem.
Es läuft dieses Betriebssystem namens Fedora.
Und jetzt wegen meiner langsamen Internet-Verbindung, ich habe
wirklich abgespritzt es.
So läuft sudo yum update, wie wir Sie in der tun soll
Problem gesetzt, wird im wesentlichen wie läuft automatische Updates
in Mac OS oder Windows.
Und der Grund für das Funktionieren dieser ganz am Anfang der
Problem-Set ist, denn wenn wir das Gerät geschaffen, I
up, versaut und ich versehentlich alle Ihre Programme suchen
schwarz auf einem schwarzen Bildschirm, weshalb Sie nicht sehen, sind sie
standardmäßig aktiviert.
Aber die neueste Version des Gerätes behebt dieses.
Und das werde ich in der Pause fix, sobald ich Internet haben
Konnektivität.
>> So die Anführungszeichen nur versteckt mein Fehler, sehr diskret,
anscheinend.
Weitere Fragen?
Ja?
PUBLIKUM: Woher kommen aus machen?
[Unverständlich]
DAVID J. MALAN: Gute Frage.
Woher stammen aus machen?
Es ist ein Linux-Programm, das für viele Jahre bestanden hat, lange
vor CS50.
Und es kommt mit einem Betriebssystem wie Fedora.
Es ist nicht von der CS50-Bibliothek.
In der Tat, das einzige, was von der CS50-Bibliothek gekommen
so weit, dass wir gesehen haben, sind GetString, GetInt, die alle
die Hole-Funktionen, und das Wort string, und einige
Soweit das Wort bool.
Aber wir, dass neben necken, wenn wir tauchen in den CS50
Gerät selbst.
>> Also ja, eine weitere Frage hier.
PUBLIKUM: Als Sie sagten zu machen und dann fehlerhaft, wie funktioniert das
Computer wissen [unverständlich]?
DAVID J. MALAN: Gute Frage.
Also, wenn Sie gerade laufen zu lassen buggy1 oder machen buggy2, wie
nicht zu wissen?
So standardmäßig, wenn Sie buggy1 geben, machen sucht nach einem
Datei namens buggy1.c.
Und dann führt die entsprechenden Clang Befehle
wodurch das Überschreiben der Standard-Ausgabe-Datei namens a.out.
In der Tat, wenn wir was machen schauen, was -
Beenden wir diese.
Wenn wir was machen wirklich tat schauen, machen buggy2,
es ist bereits up to date.
Also lassen Sie mich entfernen rm-Befehl, der
Programm, das ich schrieb vor.
Eingabe Y-E-S, um zu bestätigen, dass ich es entfernen wollen.
Wenn ich jetzt tun zu machen, feststellen, dass in dieser sehr langen Linie,
es ist das letzte, was hier-o buggy2.
Alle machen tut vergeht dieses Argument, so zu sprechen,
Clang, so dass ich nicht haben geben Sie es mir.
>> Alles klar, so dass eine schnelle paar administrative
Ankündigungen.
So für Abschnitte, die offiziell begann kommenden
Sonntag, werden Sie wollen immer bringen, wenn
Sie haben ein, ein Laptop.
Wenn Sie nicht über einen Laptop, nicht erreichen, um mich
fallen mir eine E-Mail.
Und wir werden herausfinden, einen Workflow.
Was in der Regel werden Sie im Abschnitt zu finden, ist, dass sie Teil sind
konzeptionellen Teil hands-on.
Wir gezielt einsetzen Abschnitt von Fragen, Teil
der Woche gestellten Aufgabe, durch einige der Fuß
Das konzeptionelle Material aus der Vorlesung.
Und das ist alles im aktuellen Problem-Set.
Und wir werden auch in einigen Mitmach-Aktionen tauchen, manchmal
von denen wird benötigt, um eingereicht werden, manchmal
welche nicht.
Zum Beispiel, diese erste Woche, sind sie nur als gedacht
Aufwärmübung.
Und Sie werden feststellen, dass diese Probleme wirklich nur, dass.
Sie soll eher klein, aber nicht notwendigerweise
triviale Programme zu schreiben, die nicht unbedingt
spannende an und für sich, sind aber gute Chancen,
üben mit Syntax, mit neuen Funktionen, in den Komfort eines
wo Sie ein paar von deinen Klassenkameraden vorstellen, wie
sowie Ihre TF.
>> Und was wir im Laufe der Zeit tun kann, ist ein Tool namens CS50 Spaces,
wobei anstelle der nur mit dem CS50 Appliance, werden Sie
Statt auf eine Webseite gehen, in einem Browser, wo Sie in der Lage
Code in einem Browser-Fenster während der Abschnitt zu schreiben.
Und dann, wenn Sie in entscheiden, können Sie Ihre Lehre Kollegen dann zeigen
was auch immer es ist, Sie auf Ihrem Bildschirm Eingabe in Ihrem Browser
Fenster an der Vorderseite der Klasse, ob anonym oder
öffentlich, so dass er oder sie kann dann durch mit Fuß
Ihre Klassenkameraden, was Sie gut gemacht, was du nicht auch tun.
Und wieder, versicherte Rest alles schön können anonymisiert werden.
Aber es wird eine schöne Gelegenheit für viel mehr
Interaktivität als so etwas wie Vortrag ermöglicht.
>> In der Zwischenzeit müssen wir diese Dinge als Super
Abschnitte, die optional sind, aber offen für alle in
die Klasse, so dass man dies mehr gemeinsam tun für
Aufgabe gestellt ein.
Hier ist der Zeitplan.
Dies ist auch auf der Homepage cs50.net geschrieben.
Beachten Sie, dass es dann ein Hacker-spezifisch sein
ein morgen Nachmittag.
Und wir werden filmen ein heute und morgen einen und veröffentlichen die
online innerhalb von 24 Stunden.
Also, wenn Sie nicht können jede dieser Zeiten keine Sorgen machen.
Und wieder ist der Zeitplan jetzt online unter cs50.net.
>> In Bezug auf die Schnitte selbst, sollten Sie einen bekommen haben
E-Mail, die Sie auffordert, den Kurs der homepage zu finden
Ihre Sektion.
Wenn das Leben hat sich verändert, und Sie müssen Ihren Bereich zu ändern,
kein Problem.
Gehen Sie zurück zu der gleichen URL, cs50.net/section, Singular,
und du wirst füllen ähnlicher Form, so dass Sie
dann geben Sie uns Ihre Wünsche.
Und wir werden Follow-up durch Ende der Woche, was wir können
unterzubringen.
Letzte Woche erinnern, dass wir mit CS50 Discuss vorgeschlagen,
des Kurses Diskussionsplattform, in der Vorlesung.
Also mussten wir 40 Fragen, die gestellt und wurden
antwortete während der Vorlesungszeit.
So schien es gut zu funktionieren, so dass wir weiterhin
versuchen, dies zu tun.
Wenn während der Vorlesungszeit, müssen Sie nicht nur wohl fühlen Anhebung
Ihre Hand, kein Problem.
Zum cs50.net/discuss, dort posten, und einer unserer Lehre
Fellows werden entweder beantworten elektronisch oder heben ihre
Hand auf Ihrem Namen anonym zu fragen, abhängig
auf der Art der Frage.
Und in Bezug auf Feedback, werden in der Regel pset sein
wieder innerhalb einer Woche.
Weil es dauert eine Weile für die Abschnitte zu erreichen
Gleichgewichtslage wird die erste pset, 0 und 1, ein wenig sein
verzögert wie die Dinge beruhigen.
Aber dafür in den nächsten Wochen dran bleiben, um zu kommen.
>> Alles klar, also lassen Sie mich auf meinem schweren gestellt
Stimme für einen Moment.
Also das ist eigentlich eine interessante Klima zu sein
diese Diskussion, was mit all den anderen Dingen,
los auf dem Campus verwandten dazu.
Aber CS50 hat sicherlich hatte seine Geschichte dieser besonderen
Thema in so viel wie in jedem Jahr, dieser Kurs ist für viele
Jahr, Ad-Boards rund 3% der Klasse.
Das letzte Jahr, 2011, CS50 Ad-Boarded 35 Studenten.
Dies ist nicht, denke ich, wegen des Mangels an Klarheit.
Erkenne, dass im Laufe der Lehrplan, gibt es eine Seite der
Erklärung, wo die Linien sind.
Das gleiche Aussage auf jedem der wiederholten
Problem setzt auf Seite eins.
>> Also habe ich erwähne dies heute wirklich nur um
Leute von diesem aufmerksam.
Und wir haben verschiedene Dinge ausprobiert.
Und was ich dachte, wir würden heute gerade einen Moment Zeit nehmen, um
tatsächlich einige der jüngsten Fälle, die kommen haben aussehen.
Anstatt sollten Sie diese als schmutzigen kleinen Geheimnisse, eigentlich
weisen darauf hin, was die Schüler gemacht haben und wie wir festgestellt
es und wirklich das, was das übergeordnete Motivation ist für
auch dieses Gespräch.
Also mit dieser sagte, die Linie im wesentlichen ist dies -
gemäß dem Lehrplan, sind Sie willkommen, Sie werden aufgefordert, die
sprechen Sie mit Klassenkameraden.
Das ist der ganze Zweck der mit diese kollaborative
Sprechstunden in Annenberg und die Menschen ermutigen für die
endgültige Projekt zusammen zu arbeiten.
Aber die Linie wird gezeichnet, wenn es Zeit kommt, um tatsächlich zu schreiben
Ihre endgültige Lösung.
Speaking in Englisch, völlig in Ordnung, spricht in Pseudo-Code,
völlig in Ordnung.
E-Mail ein Klassenkamerad Ihrer pset, ließ sie schauen über
der Bildschirm wie die Hände der Eingabe fortfahren,
über die Leitung als auch.
Sie auf dem Lehrplan für die besonderen Linien.
>> Aber nur um ein Bild zu malen, wie diese ist leider ein
Wirklichkeit erkennen, dass es Websites gibt,
Lösungen haben von dieser Klasse und viele andere Klassen.
Die Tatsache, dass Sie oder rund 3% von euch wissen, dass diese existiert
bedeutet, dass wir wissen, dass diese existiert.
Die Tatsache, dass es Websites wie dieses, wo Sie
kann jemand zahlen, um tatsächlich das Problem Sätze - das war
eine tatsächliche Fall, kam im letzten Jahr.
Dies ist eine Website namens odesk.com.
Und Tim war der Name der Person hier, die über die Entsendung wurde
diese Website und fragte jemand seine pset 7 in zu tun
diesem besonderen Fall.
Nun, das ist odesk.com sehr Google-Lage, und auch wir sind
sehr gut googeln.
Auch hier gibt es Seiten - und das ist eher ein
grauenhaft, ehrlich gesagt.
[Gelächter]
DAVID J. MALAN: Die lustige Sache über diese Seite ist, wenn
lesen Sie die Info-Seite, reden sie über ihre Corporate
Kultur und wie Kunden-Service ist die Nummer eins
Priorität, um sicherzustellen, dass Ihre Aufträge zu bekommen
wandte sich in der Zeit.
>> Aber im Ernst, wieder die Tatsache, dass diese Seiten
existieren, erkennen wir auch, sind bewusst
diese Art von Websites.
Und um Ihnen ein Gefühl von dem, was bildet dies in der Regel
dauert, wir in der Regel keine großen Skandale, wo Menschen
sind auf jede Art von massiven zusammen, sondern
Es ist diese Late-Night-Momente der Schwäche, in dem Sie haben, so
viel zu tun, es 04.00 Uhr ist, du bist erschöpft, und Sie
denken sich, na ja, lassen Sie mich nur einen Blick auf meine
Mitbewohnerin oder mein Freund den Code oder dergleichen.
Und die Manifestationen dies leider beinhalten Studenten
Eine Vorlage etwas und Schüler B submitting
etwas, was sicherlich in einem Computer
Wissenschaft Klasse, ist bemerkenswert einfach für Informatiker
mit Software zu erkennen.
Dies ist ein weiteres gemeinsames Paradigma, wo Sie Art habe
wurde neben der jemand arbeitet, vielleicht reden in
Englisch, just fine, Pseudocode.
Aber dann ist es an der Zeit, um tatsächlich zu unterwerfen und die pset
nur über E-Mail oder Dropbox oder dergleichen ausgetauscht zu werden.
Aber in einem Versuch, um es weniger offensichtlich, dass dies
was passiert ist, dann ist dies, was eingereicht werden.
Auch dies nicht stolpern gut geschriebenen Stücke
Software wie wir tatsächlich erkennen
diese Art von Dingen.
Und in der Tat, was wir tun müssen, ist Software benutzt, die vergleicht alle
diesjährigen Einreichungen gegen alle vergangenen Jahres
Einreichungen, gegen alles, was wir gefunden auf der
Internet, gegen jede Job-Website gibt.
Es ist alles sehr automatisiert.
Und so machen wir das wirklich in großer Fairness gegenüber den 97%, die
arbeiten wirklich ihre Ärsche off in diesem und in anderen
Klassen und setzen in all dieser Bemühungen, so dass die Arbeit
sie letztlich einzureichen ist ihre eigene.
Und ich kann gehen für Alters.
>> Dies sind nur eine Handvoll der letztjährigen Fälle.
Ein paar Studenten eingereichten diese Dateien identisch für pset 2,
pset 3, pset 4, pset 5, pset 6, pset 9.
In diesem Fall war das Quiz 0 und im letzten Jahr, wo zwei
Studenten eingereicht identisch Satz unter vielen
andere, "Die Anforderung des Typs -" Punkt, Punkt, Punkt.
So auch in einer Klasse von 600 haben wir dies erkennen
vorgelegt am Quiz.
Also kurz gesagt, das - ehrlich gesagt, ich hasse mit dieser Art von
Gespräch - aber das ist wirklich eine bewusste Anstrengung
in diesem Jahr versuchen, zur Senkung dieser Nummer.
Denn obwohl wir sagen, diese Art von Dingen alle
Jahr, denke ich, die Realität wobei an wohnte für ein paar
mehr Sekunden als üblich und eigentlich nur darauf hinweisen,
dass das, was könnte wie, äh, nicht so eine große Sache scheint, zumindest
denken Sie zurück an diesem besonderen Augenblick, sowohl in Fairness
Sie und Ihre Mitschüler hier.
Also, wenn Sie irgendwelche Fragen haben, wo die Linie
ist, bitte einfach erreichen, um mich persönlich.
Aber die Antwort ist immer, völlig betonte bei der
last minute, Bargeld in einem späten Tage.
Oder wenn es eine Frage der nicht mit einer späten Tagen,
ehrlich, mailen Sie mir persönlich.
Wir werden herausfinden etwas heraus.
Bitte nicht Ihre Zeit hier an der Harvard in Gefahr.
>> Nun, ich dachte, wir sollten die Stimmung aufzuhellen, so dass ich
enthalten diese als die nächste Folie.
[Gelächter]
DAVID J. MALAN: Diese Website war großartig.
Ich habe tatsächlich ein wenig abgelenkt.
Es gibt diese ein.
Und dann dieses war erstaunlich.
Okay, so dieser kitten späten denke nachts, wenn so
diese Entscheidungen.
Alles klar, also zurück zu mehr Spaß und weniger ernste Sachen, wie
Bedingungen.
>> Alles klar, also unterhielten wir uns kurz über diese.
Dies ist etwas, das wahrscheinlich sehr vertraut aus
die Welt der Scratch.
Und in der Welt der Scratch, haben wir dieses Bedürfnis manchmal
hinausgehen Gabel in der Straße.
Entweder dies oder jenes tun oder diese andere Sache hier.
Und wenn wir dies tun wollen, können wir, in C jetzt dies, wenn
else-Konstrukt.
Und dann haben wir hier boolesche Ausdrücke.
Zum Beispiel, Boolesche Ausdrücke Hier können wir OR
sie zusammen, in dem Sinne, dass wir diesen Zustand haben oder
Diese Bedingung.
Wir können und sie zusammen, in dem Sinne, dass wir wollen
check this Zustand und Zustand.
Und hier haben wir eine Switch-Anweisung jetzt, das ist nicht so
ähnliche syntaktisch zu diesen Arten von Bedingungen, aber es
ermöglicht es uns, den Gegenwert von if, else if, else if, else do
wenn und dergleichen durch einfaches aufzuzählen fallweise
von Fall zu Fall.
So sahen wir diese letzten Zeit.
Und dann begannen wir zu berühren, auf Dinge wie Schleifen.
Wir sahen eine von diesen einen Moment vor.
Aber es gibt diese anderen looping Konstrukte.
>> Zum Beispiel werden diese hier.
So while (Bedingung), tun diese Sache wieder und wieder.
So grundlegend, scheint, was anders zu sein zwischen diesem
for-Schleife und dieser while-Schleife hier?
Diese for-Schleife und diese while-Schleife.
Yeah?
Was ist das?
PUBLIKUM: [unverständlich].
DAVID J. MALAN: Gut.
Während also in der for-Schleife Zustand, es ist eindeutig
mehr Syntax.
Es gibt diese Initialisierung, gibt es dieses Update.
In einer while-Schleife, es gibt nur diese Bedingung.
So scheint es, dass es ein wenig nach unten gegenüber der for Vergleich ist
Schleife, was bedeutet, dass, wenn wir die Variablen haben wollen, und wir wollen
einer Inkrementierung haben, wir haben tatsächlich zu
Tun Sie dies, was uns.
>> Also lass mich gehen Sie vor und eröffnen gedit.
Lassen Sie mich Umstieg auf das Gerät.
Und lassen Sie uns einfach eine schnelle kleine Beispiel, dass
zeichnet eine davon von der anderen.
Und im Hinterkopf hier sollte ich sagen eine Sache.
Ich habe ausdrücklich erwähnte den Namen Tim.
Tim war eigentlich jemand, dass ein Schüler zu finden, zu tun versucht
ihre Hausaufgaben für sie.
Wir hatten keine Tim in diesem Bereich vor.
So realisieren, damit ich einen Schüler offenbart, war es nicht ein Student.
Es war eine zufällige Person im Internet Dinge zu tun
durch einen Bevollmächtigten im letzten Jahr.
So finden wir auch.
Also in diesem Fall hier, lass mich gehen Sie vor und
Öffnen Sie eine neue Datei.
Datei, Neu.
Das gibt mir eine Registerkarte hier.
Lassen Sie mich gehen Sie vor und speichern Sie es als loop.c.
Lassen Sie mich gehen, und klicken Sie auf Speichern.
Und dann hier unten, lasst uns weitermachen und schriftlich
# Include.
Lassen Sie mich zu vergrößern in.
Jetzt tun wir int main (void).
Nun lassen Sie mich gehen Sie vor und tun for (int i = 0; i <
oh, 10; i + +).
Und jetzt werde ich weitermachen und haben den Stern zu drucken, dass ich
habe früher.
Und dann am Ende des Programms, wir gerade dabei,
drucken Sie eine neue Zeile, nur so, dass meine Aufforderung
sieht nicht alles chaotisch.
0 zurück.
Scheint syntaktisch korrekt?
So weit.
Also mal sehen.
>> Lassen Sie mich also verkleinern, gehe in mein Terminal-Fenster.
Und lassen Sie mich gehen Sie vor und führen Sie Schleife, weil ich dies als
was loop.c.
So stellen Schleife.
Scheint OK zu kompilieren.
Lassen Sie mich laufen Schleife, und jetzt die Eingabetaste.
Und es scheint zu druckenden 10 Sterne haben.
So lasst uns einfach wandeln diese in eine while-Schleife und sehen, was
Arten von Fragen, die wir stolpern.
Also anstatt dies, lass mich gehen hier und sagen, während i
weniger als 10 -
Lassen Sie mich loszuwerden der for-Schleife.
OK, so haben wir ein paar Probleme bereits.
So die Bedingung ist die gleiche, aber ich bin natürlich fehlen die
Initialisierung.
Ich vermisse die Inkrementierung.
Also, was soll der Compiler wahrscheinlich sagen Sie mir, wenn ich es versuchen
dieses Programm kompilieren?
Yeah?
PUBLIKUM: [unverständlich].
>> DAVID J. MALAN: Gut.
Es wird also so etwas wie Schwarzarbeit sagen - in diesem
Fall Variable I.
Und in der Tat, der nicht deklarierte Bezeichner i verwenden.
Und so ist dies im Gegensatz zu Sprachen wie PHP und
Python und Ruby, mit denen einige von euch vielleicht bekannt sein,
wo man nur irgendwie Beginn der Verwendung von Variablen
nolens volens und nicht um sie zu deklarieren Sorgen
explizit immer.
In C und in Sprachen wie Java und C + +, muss man
Super explizit.
Und wenn Sie eine Variable namens i wollen, müssen Sie mir sagen,
Welche Art von Variable es sich handelt.
So werden wir zu haben, um dieses Problem beheben wie folgt.
Ich werde gehen müssen hier und geben int i; daher
Ich habe erklärt, eine Variable namens i.
Jetzt habe ich übersprungen einem Schritt.
Ich habe natürlich nicht sie initialisiert, aber wir sehen, ob das am
mindestens Fabrikate Clang Stop beschweren.
Lassen Sie mich also ein Remake dieses Programm.
>> Alles klar, jetzt ist es nur beschweren
aus einem anderen Grund.
"Variable 'i' ist nicht initialisiert, wenn hier verwendet." Alle Rechte, so
das ist ziemlich eindeutig.
Initialisiert bedeutet nur, setzen sie gleich einem Wert.
Und wir haben das nicht getan, so lassen Sie gleich 0 mich versuchen.
Nun wollen wir versuchen, diese wieder und wieder laufen Clang.
Zusammengestellt dieser Zeit.
Und ich bin zu, um sie auszuführen.
Aber große alte Endlosschleife, weil ich das getan
Initialisierung, habe ich den Zustand getan, aber ich habe noch nie getan
jede Art von Inkrementierung.
Also, wie kann ich tun, die Inkrementierung?
Nun, in einer while-Schleife, fühlt es sich wie ich zu haben bin
um es im Inneren der Schleife zu tun, denn ähnlich wie die erste
Woche Beispielen zu tun looping Konstrukte, wie bei
die Socken und mit dem Selbst-Zählung, hatten wir zu tun
etwas ganz am Ende, wie gehen Sie zurück auf die nächste Zeile.
Was, wenn ich voran gehen und tun dies i + + hier?
Lassen Sie uns nicht einmal kompilieren dies.
Fang mich schon.
Was ist hier falsch?
PUBLIKUM: [unverständlich].
>> DAVID J. MALAN: Also ist es definitiv nicht int.
Es ist i.
Und die geschweiften Klammern, wie zuvor,
Einrückung ist nicht genug.
So, jetzt habe ich dieses Konstrukt.
So, während ich weniger als 10 ist, drucken Sie einen Stern,
dann erhöhen i.
Und die Art und Weise eine while-Schleife funktioniert ist, dass, sobald Sie traf die
Ende der Schleife, die in diesem Fall sieht die Leitung 10,
es geht zurück in die Linie 6, an welcher Stelle die
Bedingung wird erneut geprüft werden.
Und wenn ich noch weniger als 10, werden wir tun Linien 8 und
dann 9, dann werden wir treffen 10, und gehen Sie zurück bis 6, wieder und
wieder und wieder und wieder, so lange, wie ich weniger als 10 ist.
So lasst uns wieder laufen hier zu machen.
>> Okay, haben wir zusammengestellt okay.
Lassen Sie mich re-run-Schleife.
Und jetzt scheint es tatsächlich zu funktionieren.
So Vor-und Nachteile hier?
Nun, so weit es ist eigentlich nicht ganz plo -
so cute.
Alles klar, das war ein - ah, das war ein Unfall.
Alles klar, also gehen wir zurück in die for-Schleife.
So for-Schleifen sind nett, weil sie super ausdrückliche sind.
Und obwohl sie ein wenig klobig zu schreiben sind, ist es
sehr mächtig und erlaubt es Ihnen zu tun
mehrere Dinge auf einmal.
While-Schleifen nicht scheinen, um eine riesige Menge an Wert haben nur
noch nicht, weil es sich anfühlt, wir müssen nur mehr Arbeit zu tun.
Wir haben, um die Initialisierung hier aufgestellt, die
Update hier unten, und wir müssen uns daran erinnern, um all das zu tun.
Also werden wir in der Zeit sehen, dass while-Schleifen tatsächlich verleihen
sich nahezu verschiedenen Kontexten unterschiedliche Daten
Strukturen wie Listen und Hash-Tabellen, die Dinge werden wir um
Mitte Semester.
Aber jetzt wissen, dass es diese dritte Art bekannt als do-
while-Schleife.
Und wir haben das kurz gesehen.
Und dies könnte super hilfsbereit mit pset 1.
Jedes Mal, wenn Sie wollen, etwas zu tun, und dann prüfen, ob
der Benutzer zusammen, und wenn sie es nicht tat, es wieder tun, eine do-
while-Schleife eignet sich für diese Art von Logik.
Denn als der Besteller von oben nach unten hier andeutet,
Sie bedeutet wörtlich tun.
Und tun dies immer und immer wieder, was könnte das sein?
Vielleicht bedeutet es ruft GetInt oder GetString und dann
Überprüfen Sie den Wert GetInt oder GetString und dann schreien
an den Benutzer, wenn sie nicht, indem man sie zusammen
wieder und wieder und wieder.
Wo möchten Sie einmal etwas zu tun,
dann prüfen eine Bedingung.
>> Also lasst uns versuchen.
Lassen Sie mich tatsächlich ändern dies nun zu einem do-while-Schleife.
Und ich werde weitermachen und gehen Sie folgendermaßen vor.
So gehen Sie folgendermaßen vor.
Lasst uns int i = GetInt (), aber lassen Sie uns zuerst sagen, der Benutzer
was zu tun ist.
So ein wenig anders diesmal.
"Gib mir ein int".
Also werde ich printf dafür.
Und jetzt werde ich nach unten gehen hier, und ich werde dies tun,
während ich es, sagen wir, mehr als -
Lassen Sie uns sehen, ist i, sagen wir, weniger als 0, oder i
größer als 10 ist.
In anderen Worten, ich möchte eine Zahl von 1 bis 9, nur
willkürlich.
Also bin ich mit einem kombinierten booleschen Ausdruck hier
sicherstellen, dass i kleiner als 0 oder größer als 10 ist, in dem
Fall werde ich diese Schleife hier wieder tun.
Also noch einmal, dies zu tun -
solange i kleiner als 0 oder i größer als 10 ist.
>> So, jetzt lass uns weitermachen und tun dies, wenn wir das getan haben.
Lass uns einfach tun, eine schnelle Plausibilitätsprüfung.
printf ("Thanks, i% d", i).
Also das einfache Programm fragt den Benutzer nach einem int,
sorgt dafür, dass es innerhalb eines gewissen Bereich, 1 bis 9,
und dann dankt dem Benutzer durch sie daran erinnern, was sie gerade
eingetippt, nur als kleine Plausibilitätsprüfung.
Aber mal sehen, ob das funktioniert wie vorgesehen.
Lassen Sie mich gehen Kopf runter und wieder zum Laufen zu bringen Schleife.
Hmm.
"Schwarzarbeit Kennung 'i' verwenden". Das ist merkwürdig.
Ich dachte, wir beschlossen, dass.
Gleiche Symptom, aber unterschiedliche Codes.
Yeah?
PUBLIKUM: [unverständlich] innerhalb der beiden, müssen wir
[Unverständlich].
>> DAVID J. MALAN: Genau.
So dies tatsächlich führt uns zu einem Thema wie Umfang bekannt.
Es stellt sich heraus, dass C wieder, es wirklich braucht man buchstäblich.
Und wenn Sie etwas tun, wo Sie deklarieren int
und ordnen sie dann einen Wert, aber Sie tun, der in einer
Paar von geschweiften Klammern, was C tut, ist es davon ausgegangen, dass
wollen nur die 32 Bit bekannt als i existieren, um innerhalb der
Rahmen dieser geschweiften Klammern, die im Rahmen von Linien
6 bis 9. So i erklärt wird, und es wird eine zugewiesene
Wert in Zeile 8, aber sobald man außerhalb zu bekommen
Linie 9 unterhalb der geschweiften Klammer ist i nicht mehr in
Umfang, so zu sprechen.
S-C-O-P-E. Es ist nicht mehr im richtigen Kontext.
So, jetzt gibt es kein i, so ist es, als ob wir noch nicht einmal
erklärt es überhaupt nicht.
>> Also, was ist ein Update dann für so etwas, wenn die
Grund ist, dass ich innerhalb der geschweiften Klammern deklariert ist, die
ist offenbar schlecht?
Hier?
PUBLIKUM: [unverständlich].
DAVID J. MALAN: Yeah.
So können wir initialisieren außen.
Also lass mich gehen Sie vor und löschen Sie die Erklärung Teilen, wobei
I die Art und lass es mich tun hier oben.
So in Zeile 5, heißt es nun: "Gib mir einen int." Nennen Sie es i.
Beachten Sie in Zeile 9, Ich will nicht, dies zu tun, weil ich
bereits die 32 Bit.
Ich will nicht, um den Computer für eine frage
verschiedene 32 Bit.
Ich möchte die gleichen 32 Bit verwenden.
Und jetzt, weil ich in Zeile 5 deklariert ist, ist es immer noch legit
um es in Zeile 11 und Zeile 12 zu verwenden.
>> Also lassen Sie mich versuchen, dies zu kompilieren und zu sehen
wenn Clang stoppt schreien.
machen Schleife.
So, jetzt ist es "implicit declaration of function
'GetInt' ist ungültig in C99. "Was ist das?
Yeah?
PUBLIKUM: [unverständlich].
DAVID J. MALAN: Yeah.
So, jetzt, dass ich tatsächlich mit GetInt, ist dies nicht etwas,
das kommt einfach mit C. Das kommt von CS50.
Also müssen wir das hier.
Und lassen Sie mich zurück in die Eingabeaufforderung nach unten
hier und wieder zum Laufen zu bringen.
Okay, endlich.
Jetzt haben wir das und das andere Fehler behoben.
Lassen Sie mich jetzt laufen Schleife und sehen was passiert.
"Gib mir ein int." Ich gebe es 11.
Ich gebe es -1.
Ich gebe es foo.
Ich gebe es 5.
Und jetzt ist es tatsächlich funktioniert.
Aber die Aufforderung für einen Grund hier geändert.
Warum hat es zu sagen versuchen eine dieser Zeiten, aber geben Sie mir eine
int Die anderen drei Zeiten?
Warum ist das Verhalten anders?
PUBLIKUM: Gab es einen String zurück.
DAVID J. MALAN: Sorry?
PUBLIKUM: Sie gab ihm einen String.
DAVID J. MALAN: Yeah.
So haben wir es einen String in diesem dritten Versuch,
wenn ich foo getippt.
Foo ist ein String.
Es ist natürlich nicht ein int.
Und die Art und Weise, dass CS50 hat GetInt implementiert ist, dass wir
nicht überprüfen, ob etwas ist kleiner als 0 oder größer als 10
für Sie, denn wie wir im Voraus wissen, welche Art von
int du?
Aber wir können minimal für Sie zu prüfen, haben die Benutzer mindestens
Geben Sie eine ganze Zahl?
Und wenn sie es nicht taten, haben wir beim Anwender schreien, indem Sie "retry" auf
der Bildschirm.
>> So, jetzt haben wir ein Programm, das ist eine Schleife. Okay.
Nun ist das der diese Art von besseren Konstrukt?
Also das ist, wo die Dinge ein wenig chaotisch zu starten, wird die
Tatsache, dass Sie daran denken, eine Variable zu deklarieren hier haben
wenn Sie wollen, um es in einiger verwenden
geschweiften Klammern und außen.
Aber selbst wenn dies sieht ein wenig kryptisch auf den ersten
Blick gerade wieder, erinnere mich an die einfachen Logik.
Um etwas in C zu verwenden, ob sie eine Funktion ist oder
es ist eine Variable, müssen Sie es schließen, wenn es eine Funktion ist
in irgendeiner Bibliothek, oder Sie brauchen, um es zu erklären.
Aber jetzt müssen Sie zusätzliche eingedenk der Tatsache, dass
Sie erklären es im richtigen Rahmen.
Sie sind nicht Putting es zu fest in Klammern.
>> Lassen Sie mich also tatsächlich wieder rollen.
Wenn wir zurück zu unserem beispielsweise von früher, und ich gehe
zurück, um int, int i = 0; i <10; i + +, und ich
do printf Sterne, wie diese, und schließen Sie dann paren, und jetzt
printf i ist jetzt -
nach der gleichen Logik, was wird passieren, wenn ich versuchen
dieses Programm kompilieren?
PUBLIKUM: Invalid Kennung.
DAVID J. MALAN: So es ist eine andere ungültige Kennung,
Schwarzarbeit Kennung.
Nun, das ist der Grund, ein wenig anders.
Es gibt offensichtlich keine geschweiften Klammern hier, aber die gleichen
Idee, gilt die gleiche Geschichte des Anwendungsbereichs.
Wenn Sie eine Variable wie i Innenseite ein erklärtes
for-Schleife, auch wenn Sie nicht explizit die geschweiften geschrieben
Hosenträger, der sie geistig denken, wie immer dort zu sein, in denen
Fall i ist nur gültig innerhalb der for-Schleife.
Es ist nicht gültig, wenn Sie in die nächste Zeile, erhalten die in
In diesem Fall ist jetzt 10.
Also einfach ein paar Fragen der Reichweite und dergleichen.
Alles klar, noch Fragen?
>> Alles klar, so ist dies eine Art trivial kleines Programm,
Drucken gerade kleine Sterne.
Aber mal sehen, ob du dieses Lied hier zu erinnern.
Dies ist ein unglaublich ärgerlich Lied, das die Kinder auf zu singen würde
der Schulbus und dergleichen.
Aber was ist schön daran ist, dass es auf diese Zyklizität hat,
wobei es "99 Flaschen Bier an der Wand,
99 Flaschen Bier.
Nehmen Sie eine unten, Pass It Around, 98 Flaschen Bier an der
Wand. "Und dann das Lied wiederholt die 97, dann 96, dann
95, dann 94, den ganzen Weg hinunter auf 0, wenn du eigentlich, dass
weit auf dem Bus.
Also das ist ein nettes Programm, von Gerät zu sortieren, weil meine
Gott, wenn du könntest einfach implementieren diese mit ein paar
Zeilen Code, können Sie spuckte den gesamten Texte zu diesem
Song recht schnell.
Aber auf dem Weg, können wir beginnen jetzt zu necken neben einigen
dieser grundlegenden looping Konstrukte und jetzt auch
Einführung Funktionen, die wir selbst zu schreiben, Werte zurückgeben
dass wir umfahren.
Aber zuerst, warum wir nicht voran gehen und nehmen unsere Fünf-Minuten-
brechen hier?
Und wenn wir zurück sind, werden wir dieses Lied singen.
>> Alles klar, also sind wir zurück.
Und wenn ich sage wir jetzt dieses Lied singen, ich meine,
programmatisch, nicht verbal.
Also hier haben wir beer1.c, die eine Implementierung ist
bestimmtes Lied.
Und nur klar zu sein, für diejenigen, die nicht vertraut mit dem, was
dieses Ding aussieht, lassen Sie mich gehen Sie vor
und machen beer1, Enter.
Nun lassen Sie mich laufen beer1, und was wir sehen - wie viele Flaschen
Bier wird es geben?
Ich werde in 99 geben, wie das Lied sagt.
Enter.
Und wenn wir jetzt blättern -
oops - wenn wir durch all dies zu blättern, werden wir sehen, dass
Diese Tat singen das ganze Lied.
Warten Sie eine Minute.
Meine Bildlaufleiste ist ein wenig durcheinander.
Lassen Sie uns die größeren Fenster.
So beer1, 99, es geht los.
Also hier haben wir den ganzen Song, viel schneller durch die gesungen
Computer als könnte es von uns gewesen.
So bemerken, aber die zyklische Natur hier.
Er sagt, 99, dann 99, dann "nehmen Sie eine unten, geben sie
herum ", dann 98.
Und jetzt ist es wiederholt immer und immer wieder.
>> Also das ist eigentlich eine perfekte Gelegenheit für eine Art von
Looping konstruieren.
Beachten Sie, dass ich irgendwie Schneiden einer Ecke hier bin.
Beachten Sie, dass ich sage "98 Flaschen Bier an der Wand,
97 Flaschen Bier an der Wand, "und das war nur so
dass, wenn wir ein Flaschen Bier zu bekommen, habe ich nicht
über die englische Grammatik zu kümmern.
Aber wir können auch dieses Problem beheben mit ein wenig einer if
Zustand, vielleicht.
Wenn diese Zahl ist einzigartig, voran gehen und sagen, "flasche",
ansonsten, wenn es plural ist, sagen Sie "Flaschen".
Aber jetzt bin ich völlig schneiden diese Ecke.
Also lasst uns sehen, was wir hier haben.
Also haben wir einige Kommentare an der Spitze.
Ich bin auch diese beiden Bibliotheken, wie
Wir haben allgemein gewesen.
Und jetzt lassen Sie mich unten scrollen, um die erste
Ist Codezeilen.
Zeile 17 startet main.
Linie 21 und 20 hat, wie viele Flaschen Bier wird es geben?
Und dann rufe ich GetInt.
Und jetzt habe ich ein bisschen eine Plausibilitätsprüfung.
>> Also das ist eine Konvention, dass wir jetzt beginnen die Annahme zu
strenger überprüfen die Eingaben des Benutzers.
Manchmal muss man einfach nicht wollen, um sie wieder aufgefordert
und immer wieder.
Wenn der Benutzer Schrauben und nicht kooperieren, in Ordnung.
Beenden und einfach nicht mit ihnen umzugehen.
Und damit ist das, was ich hier tue.
Wenn n kleiner als 1 ist, bin ich gerade dabei, beim Anwender schreien,
"Sorry, das macht keinen Sinn." Und dann bin ich zu gehen
beliebig 1 zurück.
Also noch einmal, dies ist nur eine Konvention zu gewöhnen.
Denn jetzt, nehmen Sie es auf den Glauben.
Aber bis jetzt haben wir immer wieder 0, da
wir gesagt haben wieder 0 bedeutet was?
PUBLIKUM: Erfolg.
DAVID J. MALAN: Erfolg, das ist alles.
So, jetzt haben wir endlich beginnen zu denken
Nicht-Erfolge -
mit anderen Worten, Grenzfälle, Fehlerbedingungen -
jetzt habe ich eine unendliche Versorgung, oder zumindest vier Milliarden
möglichen Dinge, die schief gehen können in meinen Programmen.
Und ich kann beginnen Zuordnung zu einzelnen Nummern.
Nun, in der Regel genügt es, einfach zurück
etwas anderes als 0 ist.
So werden wir einfach zurück 1 für jetzt.
Aber der Grund für die Rückkehr 1 ist, dass, sobald Sie wieder
1, erraten, was passiert mit dem Rest des Programms?
Es stoppt.
Das war's.
So ist die Tatsache, dass ich wieder 1 ist effektiv
Kurzschließen dieses Programms Ausführung, so dass
nichts unterhalb der Linie 27 wird weiter ausgeführt.
Sobald Haupt zurück, das ist es.
>> Alles klar, also wenn der Benutzer nicht kooperieren und wir erreichen line 30
weil sie in einem legitimen Zahl eingegeben haben, hier ist meine
Umsetzung dieses Lied.
Also habe ich zuerst gedruckt einen Zeilenumbruch, nur für
Ästhetik.
Ich habe jetzt eine for-Schleife.
Und ich merke, mache die Dinge in einem etwas
von einer anderen Richtung.
Ich habe nicht weniger als zu tun, habe ich nicht zu + + zu tun.
Ich kann stattdessen sagen initialisieren eine Variable i, setzen Sie sie auf
n, die Anzahl der Benutzer eingegeben wird, gehen Sie wie folgt, so
solange i größer als 0 ist, dann habe ich -
sobald Sie eine Iteration dieser Schleife beendet.
So können wir Countdown mit einer for-Schleife als gut.
Nun, dies ist so ziemlich Wochen ein Zeug jetzt mit printf.
So print "% d Flaschen Bier an der Wand." Print "% d
Flaschen Bier. "" Nehmen Sie ein unten, geben sie herum. "Print
"% D Flaschen Bier an der Wand." So ist es immer noch% d, aber
feststellen, dass das Argument für printf ist im Wandel.
Nach dem Komma, ich habe ich, weil ich bis 99 sagen wollen.
Nach diesem Komma, habe ich i, weil ich 99 sagen wollen.
Nach diesem Komma, habe ich i - 1, weil ich 98 in sagen wollen
diese erste Iteration, und so weiter.
Und jetzt hier unten, ich habe nur einige kleine dumme Bemerkung.
Und dann die Linie 42, zurück I 0 durch Konvention, was bedeutet, dass
alles ist okay.
>> So was, wenn ich vermasselt?
Was könnte ein häufiger Fehler hier zu sein?
Nun, was ist, wenn ich sagte versehentlich gut, will ich zu zählen
auf 0, ich will 0 Flaschen Bier an der Wand?
Also sage ich, i größer oder gleich 0 ist.
Was wird das Symptom, dass ich jetzt sehen, ob ich neu kompilieren zu sein
beer1 und führen Sie es?
PUBLIKUM: Negativ.
DAVID J. MALAN: Ja, es ist gonna go negativ.
Dies ist ein Off-by-one-Fehler, ein unglaublich
häufiger Fehler zu machen.
Lasst uns tatsächlich zurück zum Terminal-Fenster und tun es
Hier, so können wir mehr in einer Zeit zu sehen.
Geben, 99 Flaschen Bier.
Schließen, aber wir gingen immer so leicht zu weit.
Wir sangen das Lied zu weit nach unten, so dass wir jetzt noch den
negative Zahl ist.
So ist es nicht ganz geklappt.
>> Alle Rechte, so können wir leicht beheben, dass durch den Rückgriff auf die
wie es einmal war.
Aber was sind einige Möglichkeiten nun für
Verbesserung?
Nun, lassen Sie mich offen beer2.c und scrollen Sie hier und nehmen Sie eine
Blick auf diese Version.
Was ist das erste, was ins Auge springt dich an, als verschiedene
in dieser Version hier?
PUBLIKUM: [unverständlich].
DAVID J. MALAN: Yeah, so nicht mehr i, weil es sich um
mir wissen Sie was, ich frage den Benutzer n, und dann bin ich
Setzen i gleich n, und dann bin ich ändern i, aber ich bin nie
Berühren n wieder.
Also, was zum Teufel war der Punkt von Ihnen Zuteilung weitere 32
Bits als ich gerade so, dass ich eine andere Variable haben?
Also in diesem Fall, ich irgendwie erkannt, dass unnötige
Design-Merkmal.
Und ich gehe jetzt zu sagen, während n größer als 0 ist, gehen
vor und drucken Sie das gleiche Lied, indem ein n printf die
zweite Argument, n - 1 als zweites Argument hier unten.
Und dann bei jeder Iteration dieser Schleife vor und gehen Sie einfach
dekrementieren n sich.
Jetzt, funktional, dieses Programm
wird identisch sein.
Wenn ich in 99 geben, startet n bei 99.
Ich Dekrement, Dekrement, Dekrement, Dekrement.
Ich werde den ganzen Weg runter auf "Eine Flasche Bier auf
die Wand, eine Flasche Bier.
Nehmen Sie eine unten, geben sie herum.
0 Flaschen Bier an der Wand. "Das Ende, denn ich habe
erhalten die Bedingung richtig.
Es ist größer als 0.
Ich habe diesen Fehler nicht machen.
>> Also, was ist besser, Version ein oder Version zwei?
So hörte ich einen Haufen Murren für zwei Personen.
Warum zwei?
Was ist das?
PUBLIKUM: [unverständlich].
DAVID J. MALAN: Oh, okay.
So wird es nicht unter 0 gehen, aber denken Sie daran, in der Version ein, die
Original richtige Version nicht unter 0 entweder gehen.
Also denken Sie daran, dass dies die richtige Version ist.
Also lassen Sie es mindestens vergleichen die beiden richtigen Versionen.
Was ist ein Argument zugunsten der Version
zwei davon, mmm, besser?
Yeah?
Zielgruppe: IT benötigt weniger Platz.
DAVID J. MALAN: Okay, so dass es weniger Platz, nicht wahr?
Während Version ein verwendet 32 ​​Bits für n, und dann noch
32 Bit für i.
Version zwei verwendet nur 32 Bits für n, so dass
scheint ein Plus.
Andere Gedanken?
Möchte jemand zu Gunsten der man argumentieren?
Yeah?
PUBLIKUM: Sie müssen zusätzliche Zeile Code für n verwenden -.
>> DAVID J. MALAN: Okay, sicher.
Also das ist fair.
So dies nur, zumindest für mich -
Ich meine, das fühlt sich tatsächlich ein wenig chaotischer, die Tatsache, dass
Ich kann mir nicht kapseln alle meine Logik sortieren in einem
schöne Linie, die for-Schleife, wie die for-Schleife können.
Hier, ich Art zum Wenden auf dieser n -
am Ende der Schleife, weil
Es ist logisch notwendig.
Aber es ist irgendwie reibt mich in die falsche Richtung, nur weil es
scheint unabhängig von der Logik der hier oben, obwohl
wieder, es ist notwendig.
Andere Gedanken?
Yeah?
PUBLIKUM: [unverständlich].
>> DAVID J. MALAN: Yeah.
So was, wenn Sie stattdessen am Ende des Liedes, wollte
drucken Sie wieder den Namen des Songs?
Wie "Danke fürs Mitspielen 99 Flaschen Bier", oder etwas
dumme wie das?
Aber der Punkt ist, du wolltest Zugriff auf den ursprünglichen Wert.
Die Tatsache, dass Sie mutiert oder n verändert auf jeder
Iteration und haben daher ihren ursprünglichen Wert vernichtet
bedeutet, dass Sie einfach nicht tun, dass am Ende.
Nun wohl, wir eindeutig nicht wollen
daß in diesem Programm.
So who cares?
Aber das ist ein sehr wichtigen Punkt.
Und um ehrlich zu sein, es gibt wirklich keine ein
Recht hier zu beantworten.
Sie sind beide gleich richtig.
Ich könnte so oder so überzeugt sein.
Ich werde sagen, dass im Allgemeinen, es ist ein gutes Prinzip ist, wenn Sie
fragte der Benutzer für einen gewissen Wert und Sie in einer Variable gespeichert
wie n, einfach irgendwie im Prinzip, ist es wahrscheinlich eine gute
zu, dass etwa halten.
Und alle Daten, die Sie immer und immer wieder mutieren, nur
geben Sie sich eine Kopie dieser Variablen, nur so, dass Sie
Zugriff auf das Original.
Sie verbringen 32 weitere Bits, aber die Realität ist dies
Computer, wie, zwei Gigabyte RAM in diesen Tagen,
und wir sind mehr als 32 Bits Wortklauberei?
Wirklich nicht so eine große Sache.
Und auch auf diesem Gerät hier, mit einem halben Gig oder ein
Gigabyte RAM, 32-Bit im Vergleich zu 64 Bits,
nicht so eine große Sache.
Noch heute, es geht um den Weg von der Größe überwältigt
des Programms selbst, die sein würde mehrere hundert
Kilobyte, wenn nicht ein paar Megabyte, in diesen Tagen.
>> So vernünftigen Bedenken, keine richtige Antwort.
Aber zumindest das sind die Gedanken, die beginnen, sollten
gehen Ihnen durch den Kopf?
Denn in pset 0, obwohl wir eigentlich nur zu erwarten
Korrektheit, oder zumindest Ablehnung diverse Bugs, dass
Sie könnten auftreten, haben, wie wir vorankommen, ist Design
werde ein weiterer wichtiger Aspekt sein, sowohl das Schreiben von Code
und auch unsere Auswertung Code.
Und so zumindest Gedanken machen, Dinge wie diese.
Und nur weil etwas funktioniert, bedeutet nicht, es ist gut,
bedeutet nicht, es ist gut entwickelt.
Und das ist eines der Dinge, die Lehre Stipendiaten und
Übungsaufgaben helfen uns zu necken Teil im Laufe der Zeit.
>> Nun, was ist, sagen wir, diese Version hier?
Lassen Sie mich etwas tun, ein wenig sexy hier in einem Augenblick.
Lassen Sie mich zunächst loszuwerden dies.
Und nun dieses Problem beheben grammatische Frage.
So in dieser Version möchte ich die Grammatik zu fixieren, so dass
anstatt nur sagen, Klammern s, wie "Flasche"
oder "Flaschen" -
Ich will nicht, dass Ecken abgeschnitten -
Ich möchte auch dynamisch auszudrucken das Wort "Flaschen"
oder "Flasche", so Mit diesen% s Platzhalter heute.
Also muss ich bedingt überprüfen, was ist der Wert von i.
Und wenn es 1 ist, möchte ich "Flasche" sagen, und wenn es etwas
anderes, ich will "Flaschen" zu sagen. So wollen wir versuchen, dies zu tun.
Also, wenn i == 1, dann lassen Sie mich gehen Sie vor und erklären -
Ich brauche einen String, so lass es mich tun String s1, weil es die
erste String Ich kümmere mich jetzt.
Ich werde "Flasche" sagen. Und dann wollen wir mal sehen, string
s2 - und ich werde erklären, wo ich in einem Moment gehe -
"Flaschen." So erinnern, dass in diesem Lied haben wir in der Lage sein müssen
Dinge, zwei verschiedene Wörter potenziell drucken.
Also, wenn wir wieder hier schauen, bemerken, dass, wenn wir um
Dieses Beispiel hier ", zwei Flaschen Bier an der Wand,
zwei Flaschen Bier, nehmen Sie eine unten, Pass It Around ", ich will
Diese vierte Zeile, jetzt zu sagen "eine Flasche Bier auf die
Wand ". Also habe ich zu entscheiden brauchen, möchte ich sagen:" Flaschen "oder
"Flasche"? Also werde ich willkürlich sagen, alles in Ordnung,
Ich werde jetzt eine Variable namens s1, string
ein, das geht eingesteckt hier und auch hier zu bekommen,
, weil diese Worte sind immer gleich, nur weil der
Natur des Songs.
Und ich werde zu nennen s2, was Wort ich will
schließlich erscheinen hier unten.
Jetzt, buchstäblich, 99 von 100, es geht um das zu sein
gleichen in diesen beiden Fällen, denn 3 ist Plural, 2
Plural, ist 4 Plural.
Aber in dieser Ecke Fall, wo wir auf 2 und dann 1 oder
sogar 1 und dann 0, ich brauche diese Logik.
So habe ich einige Zeit in meinem Code immer dieses Recht zu verbringen.
Also, wenn ich das tue, wenn i == 1, dann s1 gleich "flasche"
und s2 gleich "Flaschen", weil dies für 1 sein
Flasche, und dies wird für 0 Flaschen.
Und das hier, was soll das darstellen?
Nur um klar sein.
Dies ist nur ein Kommentar.
So ist die Tatsache, dass man einzeilige Kommentare haben bedeutet, dass Sie
kann Ihr Code wie folgt kommentieren, aber eine weitere gemeinsame
Paradigma ist auch, dass, wenn Sie einen super-kurzen Satz, dass
Sie wollen sich selbst gestellt und es ist einfach besser lesbar zu setzen
es richtig am Ende der Zeile Code, können Sie
absolut etwas tun.
>> Und was jetzt, wenn ich das tun? Else if i ist nicht gleich 1 ist.
So Paukenschlag gleich -
Ausrufezeichen wird als "bang" bekannt.
So Knall = 1.
Also, wenn ich nicht gleich 1 ist, was ich stattdessen tun wollen?
Nun, das erste Wort will ich was?
So String 1 sollte "Flaschen" für mehrere Flaschen sein,
und dann wird das Plural "Flaschen" als gut, denn jetzt.
Und wir werden sehen, ob dies tatsächlich bringt uns zu
wohin wir gehen wollen.
So wenn ich nun hier unten scrollen, bemerken, dass ich in dem Einstecken
nicht nur ich, sondern s1.
Ich bin in i und s1 Einstecken.
Und dann hier unten, ich bin minus 1, welches das gleiche wie
vorher, aber s2.
In anderen Worten, ich möchte das englische Wort, basierend ändern
auf dieser Logik.
Nun, es ist schon einige Probleme in diesem Code.
Was ist schon aus dem Tor durchbrochen hier?
Yeah?
PUBLIKUM: [unverständlich].
>> DAVID J. MALAN: Genau.
So habe ich schon verletzt die Lektion des Anwendungsbereichs.
Also habe ich erklärt, S1 und S2, aber ich habe es innerhalb von getan
geschweiften Klammern, was bedeutet, yeah, dieser Code funktioniert bis
bis Zeile 42, aber sobald ich die Leitung 43 getroffen, erraten, was nicht
mehr existiert?
Nun, ich denke, was nicht mehr in diesem Bereich - weder S1 oder S2.
Also müssen wir dieses Problem beheben.
Also lassen Sie mich löschen Erklärungen.
Und ich lasse die Variablennamen und löschen diese hier
und löschen Sie diese hier ein.
Und in welchem ​​Leitungen sollte ich wirklich erklären, diese Dinge?
PUBLIKUM: [unverständlich].
DAVID J. MALAN: Yeah, also wahrscheinlich
hier oben, 33-ish.
So String s1 und dann String s2.
Und es stellt sich heraus, kann ich dies tun.
Wenn Sie deklarieren zwei Variablen des gleichen Typs,
Sie können eigentlich nur ein Komma und das tun in C. Alle
rechts, so jetzt habe ich zwei Variablen -
S1 und S2.
Ich Zuweisung ihnen Werte in diesen
Bedingungen hier oder hier.
Und dann bin ich mit ihnen unten.
Wie gut ist das jetzt zur Arbeit gehen?
>> Nun, es ist immer noch ein wenig buggy, aber wir wenigstens sehen
wie weit wir gekommen.
Also lassen Sie mich voran gehen und beer3.
Ist das beer3?
Yep, das ist beer3.
Und jetzt lassen Sie mich gehen Sie vor und führen Sie beer3.
399 99.
Wir können wahrscheinlich überspringen meisten von ihnen.
Und hier unten, schau dir das an.
"Eine Flasche Bier an der Wand, eine Flasche Bier, nehmen
ein nach unten, Pass It Around, 0 Flaschen Bier an der Wand. "
Aber ich Ihre Aufmerksamkeit auf nur die Hälfte der Lösung.
Art von hier oben geschraubt.
So scheint es, dass die Ecke Fällen, wenn i gleich ergeben, was
zwei Werte?
PUBLIKUM: 2, 1.
DAVID J. MALAN: 2 und 1 liegt.
Es ist nicht 1 und nicht 1.
Es ist wirklich nur die letzten beiden Strophen dieses Liedes.
Also, was kann ich statt möchten Sie tun?
So scheine ich fing den Fall gewesen, wo, wenn i == 1 ist,
dann das erste Wort ist "flasche", aber das zweite Wort
ist "Flaschen". Aber hier, ich möchte dies ändern, um == 2 sein.
Und wenn dies der Fall ist, was ich will die
erste Wort sein?
Publikum: "Bottles".
DAVID J. MALAN: "Bottles", so für zwei Flaschen.
Und dann dieses Wort hier sein sollte -
Publikum: "Bottle".
DAVID J. MALAN: "Bottle", Singular.
>> Alles klar, lasst uns zu verkleinern, gehen Sie zurück hierher, re-make ausführe,
re-run beer3, Typ 99 wieder.
Okay, "Segmentation fault (core dumped)."
Was habe ich falsch gemacht?
PUBLIKUM: Sie haben noch einen Wert [unverständlich].
DAVID J. MALAN: Ah, ausgezeichneter Ausgangspunkt.
Alles klar, so was ist hier falsch?
So Segmentation Fault, und wir sind eigentlich los, um zu sehen
dies schon ein paar Mal in der Zukunft bewusst.
Aber jetzt, was bedeutet das eigentlich?
Eine Segmentation Fault fast immer bedeutet, dass Sie
irgendwie versucht, Speicher, RAM in Ihrem Computer zuzugreifen,
dass Sie nicht selbst, dass Sie nicht wirklich fragte der
Betriebssystem für.
Also in diesem Fall, bemerken, was ich getan habe, das ist
fehlerhaft in meiner Logik.
Ich habe S1 und S2 ein Wert zugewiesen, wenn i gleich 1 ist.
Ich habe auch getan, wenn ich 2 gleich.
Aber ich habe es nicht in der unendlichen Reihe von anderen getan
Möglichkeiten -
insbesondere 3 oder 4 oder Punkt, Punkt, Punkt, 99.
So ein Update für dieses konnte nur lasst uns
haben einen anderen Zustand.
Und lassen Sie mich hier hingehen und sagen s1 entspricht -
was sollte es hier sein?
PUBLIKUM: [unverständlich].
>> DAVID J. MALAN: "Bottles", denn in den üblichen Fall,
es ist nur die gleiche Sache.
So entspricht Zitat unquote "Flaschen." So für mehrere
Flaschen und dann hier für mehrere Flaschen.
Okay, jetzt lassen Sie mich zurück zu meinem Terminal-Fenster,
recompile, re-starten Sie es.
99.
Puh.
Und lassen Sie uns tun, eine schnelle Plausibilitätsprüfung.
Technisch wären wir wollen alle diese zu lesen, um sicherzustellen, dass
sie sind richtig, aber wir betrachten
zumindest die bekannten Täter.
3 Flaschen, 2 Flaschen, 2 Flaschen, 1
Flasche, 1 Flasche, 0 Flaschen.
Wir scheinen zumindest behoben haben es für jetzt.
Aber der Haken dabei ist, dass das, was ein Gott schreckliches Durcheinander ist
nur zu lösen eine dumme
ein Zeichen grammatische Details.
Es gibt also eine Art Grund, dass ich geschnitten diese Ecke
früher, weil es einfach völlig nervig müssen
schreibe diesen viel Code.
Aber es stellt sich heraus, dass es etwas eleganter Wege
Ausdruck der genau dasselbe.
Und wir können dies wie folgt tun.
>> Lassen Sie mich lassen Sie dieses auf dem Bildschirm für einen Moment und
einzuführen etwas bekannt als ternäre Operator.
Dies ist eine Art One-Liner, der meinte nur ist, um unsere
lebt ein wenig sexier, wie versprochen.
Und ich werde tun dies wie folgt.
Gib mir einen String namens s1, und lassen Sie mich
zuweisen wie folgt.
(I == 1)?
"Flasche", ansonsten "Flaschen". String s2 erhält (i == 2)?
"Flasche", ansonsten "Flaschen".
Also, was ist dann der Unterschied?
Diese beiden Zeilen Code, argumentiere ich, kann
ersetzen Sie diesen ganzen Schlamassel.
So nenne ich es ein Chaos, nur weil es eine Art reibt mir die
falsche Weg, dass es so viele Zeilen Code ist.
Nicht falsch.
Es ist nicht schlechtes Design.
Möchten, ist dies vollkommen richtig und völlig in Ordnung.
Aber Codierung erhält langweilig, wenn du dich so auszudrücken
verdammt gezielt wieder und wieder und wieder mit einer einfachen
Szenario wie diesem.
So C hat einige Shortcuts, wie diese.
So dies im Wesentlichen sagt erklären, einen String namens s1 und
weisen sie entweder diesen Wert oder der Wert, wenn i == ist -
sorry, sollte ich dies deutlicher zu sagen.
Deklarieren Sie eine Variable s1, weisen Sie diesen Wert, wenn das wahr ist.
Ansonsten weisen Sie diesen Wert.
Also mit anderen Worten, ist diese Art von einer einzeiligen Weg
sagen, wenn sonst aber dabei eine Zuordnung auf dem Weg.
Also, wenn i 1 ist, dann gehen Sie vor und nennen das "Flasche". Und
dann ist dies anders, nennen es "Flaschen". Unterdessen, s2, das
zweite Wort, dass wir definieren müssen, wenn i gleich 2 ist, schreiben wir
S2 auf "Flasche". Andernfalls setzen Sie ihn auf "Flaschen". Und was
Das bedeutet jetzt ist, kann ich durch diese gehen und löschen Sie alle
diese Zeilen Code.
Und wenn ich sage, etwas lächerlich, dass dies jetzt
sexier, es ist sexier in der Art von Stilgefühl.
Die Tatsache, dass funktionell, dieser Code tatsächlich zu
tun genau dasselbe.
Und auch wenn es vielleicht ein wenig kryptisch auf den ersten Blick
Blick, denn wir haben nicht dieses Konstrukt gesehen, würde ich
argumentieren, dass es letztendlich würde so viel mehr sein
lesbar und so viel einfacher für uns Menschen zu sortieren der
zu verstehen, denn jetzt kann man einfach lesen Sie die
Code alle auf einer Linie.
Es ist immer noch im Geiste ein, wenn, wo dieser ist die
Zustand und dann ist was drin ist der, wenn, und dies
ist, was im Inneren des anderen.
Aber wir können dies nur wesentlich eleganter machen.
>> Und wenn ich jetzt zurück zu meinem Terminal, nachdem alle gelöschten
dieser Zeilen und ersetzte sie mit nur diesen beiden,
recompile, re-run Flaschen Bier mit 99, Ankündigung, dass mein
Grammatik ist in der Tat noch richtig.
Also noch einmal, etwas zu beginnen.
2 Flaschen Bier, 1 Flasche Bier.
Sieht richtig.
Yeah.
So, da haben wir eine viel prägnante Lösung.
So auch dieses, wie Sie sich wohler mit C, nicht
unbedingt mit dem ersten pset oder sogar Sekunden, aber
erkennen, dass diese Konstrukte können uns erlauben, die Dinge jemals tun
mehr elegant.
Jetzt machen wir eine andere Sache hier.
Lassen Sie mich gehen Sie vor und eröffnen return1.c.
Jetzt beginnen wir ein anderes Problem in einer Weise, dass zu lösen
ermöglicht es uns, komplexere Code zu schreiben.
>> Also hier ist ein einfaches kleines Programm, dessen Zweck im Leben
ist, um Werte zu inkrementieren.
Und tatsächlich, lassen Sie uns einen Schritt zurück.
Lassen Sie mich dies manuell tun.
Lass es mich tun sind und int main (void).
Und lassen Sie mich nennen diese increment.c.
Und was will ich tun?
Ich werde weitermachen und so etwas sagen wie -
nennen wir die Zahlen gleich -
int x.
So int x erhält 2; printf x ist% d, neue Zeile, x.
Also ich tippe schnell, aber irgendwie vertraute Dinge jetzt.
Dann werde ich x + + zu tun.
Dann werde ich die gleiche Satz noch einmal zu drucken.
Und dann werde ich auf 0 zurück, nur um das Programm zu beenden.
Alles klar, so ist dies ein Programm, das
Inkremente eine Zahl ist.
Es ist zuerst zu etwas zu 2 zu initialisieren, und dann ist es
werde es erhöhen und erneut ausdrucken.
>> So lasst uns laufen Inkrement, unglaublich einfaches Programm.
Aber jetzt nehme an, dass ich cube den Wert wollen, dies zu tun
etwas willkürlich.
Und ich wirklich tun möchte, x erhält den Würfel von ihm.
So konnte ich nutzen, was die pow-Funktion aufgerufen, aber ich weiß nicht
wirklich wissen, wo das ist leer.
Also werde ich dies zu tun auf die altmodische Art und Weise.
x mal dies entspricht x mal x mal x.
Also ich bin Cubing den Wert, multipliziert sie von selbst wieder
und wieder und wieder, so dass wir die Macht
von 3 in diesem Fall.
So, jetzt die Zahlen, die ich drucken soll sein sollte, wie wir sehen,
hier - machen Schrittweite, so ist es eigentlich nicht wirklich erhöhen
mehr, aber wir werden den Namen allein zu lassen -
2 und dann 8.
Jetzt haben wir die Anfänge der Möglichkeit zur Verfeinerung
Hier, wobei diese Cubing Ding Multiplizieren eines Anzahl
selbst für sich selbst fühlt, wie diese könnte nur sein,
nützlich als eine Funktion haben, so wie jemand beschlossen
Jahren - Sie wissen, eine Art nützlich, wenn einer von uns setzt sich
und schreibt printf so daß der Rest der Welt benutzt werden kann,
warum gehen wir nicht hinsetzen und schreiben eine Funktion namens cube
das tut dieses Cubing für uns, so dass wir nicht mehr manuell
Umsetzung der Begriff der Cubing Werte hier?
>> So ein einfaches Beispiel, aber wir gehen Sie vor und nutzen dies als
Gelegenheit, unsere eigene Funktion zu schreiben.
So bisher haben wir nur die wichtigsten, verwendet und die wir verwendet haben andere
Menschen funktioniert, aber wir haben nicht unsere eigene geschrieben.
So here we go.
Ich werde weitermachen und schreibe eine Funktion namens cube.
Und ich bin zu haben, dauert eine Eingabe.
So seine Eingabe wird ein Integer sein.
Und wie ist es jetzt tun?
Es wird int Ausgang erklären = Eingang eingegebene Zeit
Mal-Eingang.
Und dann geht es los, um diesen Ausgang zurück.
Und dann habe ich um genau zu sein jetzt.
Diese Funktion wird einen int zurück.
Also hier ist dann, wie würden Sie Ihre eigenen Funktionen schreiben.
Sie zunächst entscheiden, was ist der Name Ihres
Funktion sein wird.
Und im Allgemeinen, ist etwas erläuternden gut, also werde ich
nennen es Würfels.
Dann müssen Sie angeben, was es wird zurückkehren, ist das, was
sein Ausgang sein wird.
Und wir haben nicht so viele Möglichkeiten noch.
Int, char, float, bool, string.
Denn jetzt, ich werde mit einem int bleiben, weil ich es will
um eine ganze Zahl zurück.
Dann müssen Sie angeben, welche ihre Eingaben, wenn überhaupt, sind.
Und wenn cube ein Argument nimmt etwas zwischen
Klammern, haben Sie zu geben, dass Argument einen Namen, so dass
Sie nennen es etwas, wie Sie durchführen oder Sie schreiben
diese Funktion, und Sie haben, um ihm eine Art, die in diesem
Fall sein wird int.
Also kurz gesagt, ist cube eine Funktion, die einen Integer übernimmt
als Eingabe und gibt eine ganze Zahl als Ausgabe.
>> Also, was bedeutet es mit diesem Eingang zu tun?
Nun, in Zeile 14, erkläre ich eine Variable namens Ausgang, und ich
weisen Sie ihm den Wert, Eingang eingegebene Zeit mal Eingang.
Und dann habe ich wieder ausgegeben.
So wie verwende ich das dann?
Was muss ich ändern, diese markierten Zeichen on line
7 zu werden, denken Sie?
PUBLIKUM: [unverständlich].
DAVID J. MALAN: Yeah, so Würfel x.
So x eine Variable ist, die es hält einige Wert bedeutet.
Glücklicherweise ist es vom Typ integer.
Und weil x ist ein int, das heißt, ich kann es, in Würfel weitergeben.
Und obwohl ich das Überschreiben der Wert von x mit dem Wert
von cube x, als der Fall gewesen bisher, jedes Mal, wenn
haben die gleichen Zeichen und eine Zeile Code, das Zeug auf der rechten Seite
ausgeführt und dann wird die zugeordnete
Wert links.
So die Reihenfolge der Operationen ist, wie wir hoffen.
So funktioniert das?
Nun, lassen Sie mich gehen hier unten.
Lassen Sie mich öffne meine Terminal-Fenster.
Lassen Sie mich wissen Inkrement zu machen, die Eingabetaste.
"Implizite Deklaration der Funktion 'cube' ist ungültig
C99. "Nebenbei bezieht C99 auf die Sprache C, wie es war
definiert im Jahr 1999 war das ein Update über die Version von
1989, ein Update über die ursprüngliche ist.
So das ist alles das bedeutet.
>> Also, was bedeutet es, dass "implizite Deklaration der
Funktion 'Cube' ist ungültig? "Es ist hier genau richtig.
Es ist richtig, es in Zeile 12.
PUBLIKUM: [unverständlich].
DAVID J. MALAN: Was ist das?
PUBLIKUM: Es ist nicht vor.
DAVID J. MALAN: Es ist nicht vor.
Also das ist die Sache.
C ist eine Art von dumm, oder C-Compiler sind irgendwie dumm.
Sie haben wirklich nur tun, was man von ihnen erzählen.
Und sie insbesondere nur lesen den Code von oben nach unten,
links nach rechts.
Also, wenn der Compiler, Clang, liest den Code, Linie 1, es
heraus, wie dies zu tun.
Oh, hier kommt main.
Okay, lass mich gehen Sie vor und deklarieren Sie eine Variable x.
Lassen Sie mich etwas ausdrucken.
Line 7, was zum Teufel ist cube?
Es ist nicht in stdio.h deklariert.
Es funktioniert nicht mit C. komme ich habe keine Ahnung, was zu tun ist.
Und so Clang nur bails und beendet mit dieser Fehlermeldung.
So können wir das in ein paar Möglichkeiten zu beheben.
Wir lehren kann Clang was cube durch Verschieben nur wo das ist
Erklärung.
Also habe ich ausgeschnitten und eingefügt es atop main.
Jetzt erkennen, dass, nur weil Haupt nicht mehr erste, ist es
noch standardmäßig ausgeführt.
Main main.
Es ist das Standard-Name der Funktion.
Es spielt keine Rolle, wo sie in einer Datei.
Aber zumindest jetzt Clang hat cube gesehen, bevor ich es zu benutzen.
Also lasst uns sehen, ob Clang ist jetzt glücklicher.
Machen Inkrement, kam es zu kompilieren diese Zeit.
>> Lassen Sie mich laufen Inkrement.
Und in der Tat, es scheint zu funktionieren.
Jetzt können Sie kommen mit Szenarien schließlich, wo
es ist nicht möglich, jede Funktion gesetzt
über jede andere Funktion.
Du wirst in diesem Endlosschleife in der Realität nicht weiterkommen,
wo dieser Kerl will hier aber dies
Mann muss da sein.
Also das funktioniert nicht immer.
So glücklicherweise hat C eine elegantere Lösung.
Ich werde diese zurück gebracht, wo es war, nur weil ich
bevorzugen, als grundsätzlich, dass Haupt immer
an der Spitze, weil es ist einfach schön zu sehen, was dieses Programm
hat standardmäßig.
Und was ich tun werde hier wird erklärt, was heißt
ein Prototyp.
Ich werde wieder erkläre mich cube-Funktion, indem sie buchstäblich
Kopieren und Einfügen.
Eigentlich ist das nicht wörtlich.
So wörtlich Kopieren und Einfügen line 15
bis oberhalb der Linie 6.
Es spielt keine Rolle, welche Linie diese landet auf.
Es passiert in Zeile 4 sein.
Aber es muss sein müssen, bevor main.
Aber den Unterschied bemerken.
Linie 4 endet mit einem Semikolon, was bedeutet, hey,
Clang, nimm mein Wort für sie, dass es existiert eine Funktion
als Würfel, der einen int und gibt eine int.
Aber ich werde nicht sagen, was es ist.
Genau wissen, dass ich Sie schließlich sagen versprechen.
Und in der Tat, jetzt ist es in Ordnung, dass diese nach unten ist unten.
>> So ist dies im Allgemeinen besser, da dann an der Oberseite
Ihre Datei können Sie einfach rattern, Schnellfeuer-, eine Zeile
jeder, was die Namen der Funktionen sind, was ihre
Eingänge sind, was ihre Ausgänge sind.
Und um es noch deutlicher, Eingang bedeutet in der Regel Argument oder
Parameter synonym.
Output bedeutet, Rückgabewert, was bedeutet es
Hand zurück zu mir.
Also in diesem Fall hier hat cube an der Spitze erklärt worden, aber
definiert, sonst bekannt als implementiert, an der Unterseite.
So, jetzt gehen wir wieder hier und starten Sie diese.
So, jetzt lass mich voran gehen und wieder zum Laufen zu bringen, erneut ausführen Inkrement.
Und jetzt scheint es zu funktionieren prima.
So können wir jetzt weitermachen und sich so etwas wie der Faktor
Bier Beispiel in dieser vierten Version.
Lassen Sie mich also nach unten scrollen hier.
Und feststellen, dass ich irgendwie hat diese Lektion zu Herzen gerade jetzt.
Die Tatsache, dass ich sang die gleiche Strophe wieder und
immer und immer wieder das gleiche chorus line in dem Lied, fühlte
wie, warum nicht ich Faktor, in eine Funktion?
Und in der Tat, sollte dies eine der Motivationen sein.
Neben der Tatsache, dass jemand anderes in der Welt Vielleicht möchten
einen Würfel Funktion -
das ist ein guter Grund, um etwas ausklammern und schreiben Sie Ihre
eigene benutzerdefinierte Funktion -
wenn es ein Stück Code in Ihrem Programm, das macht einfach
konzeptionellen Sinn, dass Sie Art will give it a
Namen - wie in diesem Fall, Chorus -
dann kann man ähnlich schreiben, dass als separate Funktion.
Sie müssen nicht alles in main schreiben, wenn es nur
fühlt sich sauberer zu trennen und ihm einen Namen geben.
>> Also in diesem Fall hier bemerken, dass ich einen Kommentar atop haben
Diese Funktion, die gerade singt über die
bestimmte Anzahl von Flaschen.
Beachten Sie hier, dass ich nicht brauchen, um diese aufrufen
Dinge Eingang und Ausgang.
In der Tat, dieses Mal habe ich gerade angerufen meinen Input b für Flasche.
Und hier bemerken, Leere schlägt was?
Das Chor -
PUBLIKUM: nicht zurückgeben.
DAVID J. MALAN: Hat keinen Wert zurück.
Und in der Tat haben Funktionen keine Werte zurück.
Sie können nur etwas tun.
Sie haben, was Nebenwirkungen genannt, welche in diesem
Fall ist nur eine ganze Reihe von Drucken auf dem Bildschirm.
So bemerken, dass dieser Code hier, ich buchstäblich nur gestohlen
das vorherige Beispiel.
Der einzige Unterschied besteht darin, anstelle der Verwendung von i als meinen
Variable, bin ich jetzt mit b als meine Variable.
So I b haben hier unten, I b haben hier unten habe ich b
minus 1 hier unten.
Aber der Code ist genau gleich.
Aber nur, um Sie jetzt zeigen, wie wir diese verwenden, lassen Sie mich gehen
voraus und tatsächlich ändern sich hierbei um ein für Schleife.
for (int i = n; i> n; i -).
>> Also habe ich, dass von unserem vorherigen Beispiel gestohlen.
Bisher ist es in Zeile 37, dass ich begonnen habe
singen dieses lästige Lied.
Aber anstatt, ich bin gerade dabei, jetzt rufen Chor der i.
Fertig.
So, jetzt in jeder Iteration dieser Schleife, nenne ich diese andere
Funktion, Chorus, die ich zufällig zu schreiben.
Es wurde nicht von jemand anderem Jahren geschrieben.
Aber Chor, inzwischen verwendet printf zu drucken
Ohne diese vier Zeilen.
Aber die Tatsache, dass ich rufe Chor wieder und wieder in ein
Schleife bedeutet, dass ich gehe zu bekommen, ganz am Ende, die
genau das gleiche Lied wie ich bisher haben.
Also kurz gesagt, wenn ich jetzt zurückblicke auf mein Code, obwohl
funktional dies entspricht, feststellen, dass es
Ausgangspunkt, um noch besser lesbar.
Ich weiß nicht genau wissen, wie GetInt
umgesetzt wird.
Ehrlich gesagt, ich weiß nicht, wie Chor umgesetzt wird.
Aber es macht mir nichts aus.
Es ist mir egal, weil ich jetzt der sortieren zu können, wie ein Mensch, lesen
Diese von oben nach unten.
Und weil die Funktionen nach, was sie mit dem Namen
tun, ist mein Code immer lesbar.
Und da unsere Programme bekommen viel komplexer -
durch die Semester Ende, werden Sie schriftlich Hunderte von Zeilen
Code, der in Sprachen wie PHP und JavaScript und dergleichen -
Sie finden, dass es so viel einfacher, als den Überblick zu behalten der ist
was du getan hast.
Und wenn Sie beginnen die Zusammenarbeit mit Freunden oder
Partnern oder Kollegen, werden Sie in der Lage sein, viel mehr schreiben
massiven Programme ab, um diese Grundübung
Bausteine.
>> Also mit dieser sagte, warum nicht wir nennen es einen Tag?
Und wir werden Sie am Mittwoch sehen.
[Applaus]