[Powered by Google Translate] § Problem Set 2: Hacker Ausgabe
Rob Bowden, Harvard University
Dies ist CS50. CS50.TV
Also, ich bin Rob. Ich bin ein Senior in Kirkland. Dies ist mein drittes Jahr TFing CS50.
Es ist das erste Mal, dass wir von der traditionellen Frontalunterricht Abschnitt ändern,
wo wir nur irgendwie überprüfen, was passiert in der Vorlesung und dann euch Fragen zu stellen,
jetzt ist viel mehr problem-based, wo wir Spaces verwenden, und -
Oh, so ist die Idee zu diesem Link schickte ich Sie gehen und dann wirst du in meinem Raum.
Hat jemand noch einen Laptop? Okay.
So werden wir werden mit diesem, und wir werden zu tun Probleme leben in Abschnitt
und zu diskutieren und herauszufinden, was falsch ist
und ich könnte nach oben ziehen einige Code, und ich könnte Ihre Ideen zu diskutieren.
So hat jemand schon Schwierigkeiten?
Sie können auf der Seite unterhalten, ich weiß nicht, ob wir Grund dafür musst.
Nun, wie die vorherige Oberabschnitt, wenn Sie an dieser Klasse waren, wissen Sie, was das geht.
Auf allen P-Sets es geht um diese Abschnitte sein.
So P-set 2, Spezifikationen, ich denke, man sah es auf P-Satz 1 bereits.
Aber wir können bei P-Set 2 für was wir über heute gehen sehen.
Und du wirst sehen, einen Teil der Fragen.
So wird dies in allen P-Sets sein, es werde eine Sektion von Fragen.
Bisher haben wir gesagt: "Betrachten Sie diese Gelegenheit zu üben."
Sie werden nicht aufgefordert, dieses Programm vorzulegen.
Die Idee ist, dass diese in Art von Hilfe Sie mit dem Problem Satz loslegen sollen.
Ich denke, auf der Hacker Ausgabe, sind viele von ihnen sollen nur neue, interessante Dinge zu lernen.
Sie dürfen nicht direkt auf das Problem gesetzt.
Und jetzt sind wir nicht mit Ihnen übermittelten sie, aber in der Theorie,
für spätere Problemstellungen, könnten Sie legt sie, und daher kann man entweder zu Abschnitt kommen
oder schauen Sie den Abschnitt, um die Antworten zu erhalten, oder Sie können nur erhalten, sie auf eigene Faust
Wenn Sie keine Lust genieße meine Gegenwart spüren.
So ist die - ich glaube, das ist das erste.
Oh. Auch unter diesen Abschnitten Fragen, die wir auch haben Sie Fragen zu den Shorts.
Also ich denke, in der Theorie, du sollst diese vor kommenden Abschnitt zu sehen,
aber es ist in Ordnung, wenn Sie das nicht tun, werden wir über sie sowieso gehen.
So können wir mit diesen zu starten: "Wie funktioniert eine while-Schleife aus einem do-while-Schleife unterscheiden?
Wenn Letzteres ist besonders nützlich? "
So jemand eine -?
[Student] Die do-while-Schleife wird immer mindestens einmal ausgeführt.
Ja. Also das ist der Unterschied. Eine while-Schleife - ich werde es einfach tun hier - while-Schleife, haben wir die Bedingung
hier, während eine do-while, müssen Sie nicht einen Zustand, bis wir hier unten zu bekommen.
Und so, wenn Ihr Programm ist ausgeführt, und es wird auf die while-Schleife,
es sofort überprüft, ob diese Bedingung erfüllt ist.
Wenn diese Bedingung nicht erfüllt ist, wird es nur überspringen, die Schleife vollständig.
Do-while-Schleife, da das Programm ausgeführt wird, wird es auf die "zu tun."
Nichts passiert an dieser Stelle, nur weiter ausgeführt.
Dann, wenn es die "Weile" trifft, wenn die Bedingung erfüllt ist, wird es wieder loop und es wieder tun
und wieder und wieder, bis die Bedingung nicht erfüllt ist und dann fällt einfach durch.
So, mit dem Unterschied, dass dies überspringen Recht von Anfang an.
Diese notwendigerweise einmal ausgeführt und dann kann mehrmals ausgeführt, wenn die Bedingung ist immer noch wahr.
So die while-Schleife wird es nur einmal tun, oder - die while-Schleife - wir müssen es nicht zu tun,
denn sobald wir sie bekommen, wenn die Bedingung falsch ist, werden wir genau das Richtige überspringen darüber.
Während do-while-Schleife, werden wir es einmal ausführen, unbedingt.
Dann, wenn wir den Zustand zu erhalten, überprüfen wir, ob es wahr oder falsch ist.
Wenn es wahr ist, werden wir es wieder tun, wenn es falsch ist, werden wir einfach weiter gehen.
Also, wenn Letzteres ist besonders nützlich?
Ich kann also in der Gesamtheit der 4 Jahre, 3 Jahre, was auch immer sagen,
dass ich programmiere, habe ich diese verwendet, wie unter 10-mal.
Und wahrscheinlich 5 von ihnen sind in CS50, wenn wir die Einführung do-while-Schleifen sind.
Also, wenn Sie verwendet do-while-Schleifen?
Wann ist die - yeah?
[Student] Wenn Sie versuchen, auf Benutzereingaben oder etwas, das Sie überprüfen möchten, erhalten -
Yeah. So do-while-Schleifen, Benutzereingaben ist die große.
Das ist, warum auf den ersten paar Übungsaufgaben, wenn Sie den Benutzer zu fragen, wie wollen,
"Gib mir einen String," Sie kann nicht fortgesetzt werden, bis Sie diese Zeichenfolge zu erhalten.
Und so, unbedingt, müssen Sie nach der Zeichenfolge mindestens einmal fragen.
Aber dann, wenn sie etwas Schlechtes zu beantworten, dann müssen Sie eine Schleife zurück und fragen wieder.
Aber anders als Benutzereingaben, ist es sehr selten, dass ich einen Fall stoßen
wo ich will loop "mindestens einmal", sondern vielleicht mehr.
Fragen oder -? Hat jemand verwendet eine do-while-Schleife anywhere else?
Okay. Also das nächste ist: "Was bedeutet Kennung Schwarzarbeit
Regel darauf hin, wenn sie von Klang ausgegeben? "
Also, welche Art von Code könnte ich schreiben, um "Schwarzarbeit Kennung?
[Student] Das x = 2?
So können wir nur versuchen, es hier, x = 2.
Wir führen Sie dieses - oh, ich habe nicht darauf klicken. Also hier haben wir bekommen - alles in Ordnung.
"Schwarzarbeit Kennung x verwenden."
Damit ist die Schwarzarbeit Kennung, eine Variable.
Es wird häufig aufrufen, eine Variable eine Kennung.
So ist es vielleicht nicht wissen, es ist eigentlich eine Variable, nicht weiß, was es ist.
Es ist also ein Bezeichner.
Warum ist es Schwarzarbeit? Yeah.
So werden über die Terminologie, die Deklaration einer Variablen klare
ist, wenn Sie "int x" oder "string y", was auch immer sagen.
Die Initialisierung der Variablen, oder die Zuweisung der Variablen,
ist, wenn Sie sagen: "x = 2".
So können wir diese in getrennten Schritten zu tun, int x, x = 2, und bis - wir können ein paar Sachen hier haben -
aber bis diese Linie passiert, wird x noch nicht initialisiert, aber es erklärt wurde.
Und so können wir natürlich tun es in 1 Zeile, und jetzt sind wir deklarieren und initialisieren.
Haben Sie Fragen?
Und schließlich: "Warum ist die Caesar Cipher nicht sehr sicher?"
Also erstens, weiß jemand sagen will, was der Cäsar-Chiffre ist?
[Student] Caesar Cipher ist einfach, dass Sie zuordnen möchten, verschieben Sie jeden Brief,
eine bestimmte Anzahl von Buchstaben gehen über und bewegen wieder vorbei, und es ist nicht sehr sicher, weil
gibt es nur 26 mögliche Optionen und man muss nur jeweils 1 von denen versuchen, bis Sie es erhalten.
Oh. Also sollte ich wiederholen?
Die Cäsar-Chiffre, es ist - ich meine, wirst du mit ihm zu tun haben auf die Probleme, die Sie -
oder ich denke, die Standard Edition des Problems Satz, der nicht auf der Hacker-Ausgabe.
Also auf die Standard Edition des Problems Satz, erhalten Sie eine Meldung wie: "Hallo, Welt"
und Sie haben auch eine Zahl wie 6, und nehmen Sie diese Nachricht, und jeder einzelne Charakter,
Sie drehen es um 6 Stellen im Alphabet.
So ist die "h" in Hello würde h-i-j-k-l-m-n.
Also der erste Brief würde n sein. Wir tun das Gleiche mit e.
Wenn wir eine haben, mögen, z oder so etwas, dann werden wir wieder umschlingen zu "a".
Aber jeder Charakter bekommt zyklisch 6 Zeichen später im Alphabet, und es ist nicht sehr sicher
da es nur 26 Möglichkeiten für wie viele Arten können Sie einen einzelnen Buchstaben zu wickeln.
So kann man nur versuchen, alle 26 von ihnen und vermutlich für einen ausreichend langen Nachricht,
nur 1 von diesen möglichen 26 Dinge geht um lesbar zu sein,
und die Lesbarkeit ein wird die ursprüngliche Nachricht sein.
Also ist es nicht eine sehr gute Möglichkeit der Verschlüsselung überhaupt nichts.
In keinem Zusammenhang mit den Shorts, "Was ist eine Funktion?"
Also, was ist eine Funktion? Ja.
[Student] Es ist wie ein separates Stück Code, den Sie anrufen, um durch zu gehen und erhalten dann den Rückgabewert whatever können.
Yeah. Oder wiederholen, indem auch nur die Beantwortung der nächsten ein - also werde ich es, indem auch die Beantwortung der nächsten beantworten.
Sie können Funktionen verwenden, anstatt nur das Kopieren und Einfügen von Code immer und immer wieder.
Nehmen Sie einfach den Code, steckte es in einen fuction, und dann könnte man einfach die Funktion aufrufen
wo immer Sie wurden Kopieren und Einfügen.
So sind nützlich.
So, jetzt tun wir aktuelle Probleme.
Die erste. So die Idee der erste ist, übergeben Sie einen String, und unabhängig von der -
oder sagt es alle Kleinbuchstaben? Es heißt nicht alle Kleinbuchstaben.
Die Botschaft kann alles sein, und - oh nein. Es macht.
"Der Einfachheit halber können Sie davon ausgehen, dass der Benutzer nur Eingang Kleinbuchstaben und Leerzeichen."
So geben wir eine Meldung mit nur Kleinbuchstaben und dann werden wir abwechselnd
zwischen Groß-und Kleinschreibung - ändern wir die Zeichenfolge Groß-und Kleinschreibung werden abwechselnd.
Also, bevor wir Ihnen eine zweite, noch in das Problem zu tauchen,
was ist das erste, was wir tun müssen?
Oh, was habe ich klicken Sie einfach auf? Oh, ich klickte auf einer E-Mail hier.
Das erste, was wir tun müssen - ich freue an der falsche?
Ist das Teil dieser ein?
Nein, das sind noch drin, though.
Okay, immer noch hier.
Jetzt können wir nicht davon ausgehen, -? Ja. Hier können wir nicht davon ausgehen, dass es nur Kleinbuchstaben und Leerzeichen ist.
So jetzt haben wir mit der Tatsache, dass die Briefe können, was wir sie haben wollen umzugehen.
Und so ist die erste Sache, die wir tun möchten, ist nur die Meldung.
Wir müssen nur einen String zu erhalten, string s = GetString, okay.
Jetzt das Problem, es gibt ein paar Möglichkeiten, es zu tun.
Aber wir gehen zu wollen, bitweisen Operatoren hier verwenden.
Gibt es Menschen, die entweder nicht in der Oberabschnitt,
oder so etwas, weiß und nicht wissen, was bitweisen Operatoren sind?
Oder wie sie in ASCII beziehen in irgendeiner Weise?
[Student] Ich war nicht in der Oberabschnitt, aber ich weiß, was bitweisen Operatoren sind.
Okay. Also habe ich nicht über die Grundlagen von ihnen gehen, aber ich werde erklären,
was wir gehen zu wollen, hier verwenden.
So 'A': Binäre Darstellung des Kapitals A ist die Zahl 65.
Ich werde einfach zu sehen - 41 wird 01000001 sein.
So das sollte 65 in dezimal, so ist dies die binäre Darstellung des Charakters Kapital A.
Jetzt, Kleinbuchstaben die binäre Darstellung der Zeichen 'A'
wird dasselbe sein, fast. Ist, dass - 6, yeah. Das ist richtig.
So binäre Kapital A, binäre Kleinbuchstaben 'a ".
So fest, dass der Unterschied zwischen A und 'a' ist diese einzelnes Bit.
Und dies geschieht, um die 32-Bit, das Bit, das die Nummer 32 sein.
Und das macht Sinn, da A 65; 'a' ist 97.
Der Unterschied zwischen ihnen ist 32.
Jetzt wissen wir also, wir können von A bis 'a', indem A konvertieren
und bitweise Verknüpfung es, mit - das sieht aus wie eine 1.
Dies ist eine bitweise OR, mit 00100000, und dass wird uns 'a ".
Und wir können von 'a' bis A erhalten durch bitweise UND-Verknüpfung
mit 11, 0 an jenem Ort, 11111.
So wird dies dann geben Sie uns genau das, was 'a' war, aber heben sich diese einzelnen Bits
also müssen wir 01000001, ich weiß nicht, ob ich recht gezählt.
Aber diese Technik der bitweisen ODER-Verknüpfung von Kapital zu erhalten, um Kleinbuchstaben
und bitweise Verknüpfung von Kleinbuchstaben zu Kapital zu erhalten, ist nicht ausschließlich auf A.
Alle Buchstaben, K vs k, Z vs z,
alle sind eigentlich nur auf der diesem einzigen Bit unterscheiden.
Und so können Sie verwenden, um von einem beliebigen Kleinbuchstaben jedem Großbuchstaben und umgekehrt.
Okay. So eine einfache Möglichkeit, um von diesen - so anstatt
schreiben, was 1011111 ist - eine einfache Art der Darstellung dieser Zahl und das ist nicht ein
dass ich ging in der Oberabschnitt, aber Tilde (~) ist ein weiteres bitweisen Operator.
Was ~ tut, ist es schaut auf die Bit-Darstellung.
Nehmen wir eine beliebige Anzahl.
Dies ist nur einige Binärzahl, und was ~ hat ist es nur Flips alle Bits.
Das war also eine 1, jetzt eine 0, this a 0 ist, jetzt a 1, 010100.
So, das ist alles ~ tut. So 32 wird die Zahl sein - loszuwerden, dass -
so 32 wird die Zahl 00100000, und so ~ dies sein wird,
diese Zahl hier, dass ich eine 'verknüpft mit.
Hat jeder das sehen? Dies ist sehr verbreitet, wie wenn Sie wollen herausfinden,
für spätere Dinge, die wir sehen werden könnte, wenn wir sehen, wenn wollen -
oder wir wollen alles, jedes einzelne Bit gesetzt mit Ausnahme von 1
Sie neigen dazu, der wenig, dass wir uns nicht festlegen möchten ~ tun.
So wollen wir nicht die 32-Bit gesetzt, so dass wir von 32 nicht ~.
Okay. So können wir alle die hier zu verwenden.
Alle Rechte, so ist es in Ordnung, wenn du nicht fertig sind, werden wir langsam gehen über zusammen,
oder über diese zu gehen, so - durch diese. Gehen Sie durch diese.
So haben wir unsere Schnur, und wir wollen eine Schleife über jedes Zeichen in diesem String und etwas tun, um es.
Also, wie machen wir eine Schleife über einen String? Was sollen wir benutzen?
Ich werde mich nicht, es zu tun hier. Yeah.
So habe ich meine iterator, und er sagte es, aber wie kann ich wissen, wie viele Zeichen in der Zeichenfolge?
Strlen (s), dann i + +.
Also, was ich hier gemacht haben ist nicht der beste Weg, Dinge zu tun.
Weiß jemand, warum?
Weil du die Überprüfung der Sprache der String jede einzelne Zeit.
So wir wollen strlen zu bewegen, ich könnte sagen, hier, int length = strlen (s),
und dann weiß i <Länge, und falls Sie es noch nicht gesehen,
Ich könnte auch int i = 0, length = strlen (s).
Und dies ist etwas besser, denn jetzt habe ich den Umfang beschränkt,
der mit variabler Länge, um nur dieses eine "for" Schleife statt Deklaration bevor
und dass es existiert immer, und falls Sie nicht fangen, warum das so schlecht ist,
oder warum das Original war schlecht, es ist - beginnen bei der for-Schleife.
Ich überprüfte den Zustand. Ist i <die Länge s?
So ist die Länge von s, lasst uns mit "hallo" die ganze Zeit arbeiten.
So Länge s, h-E-l-l-o. Länge ist 5.
So i = 0, Länge 5 ist, so dass ich nicht <5, so dass die Schleife weiter.
Dann gehen wir wieder. Wir überprüfen den Zustand. Ist i <die Länge hallo?
Also lasst uns prüfen die Länge hallo. H-E-l-l-o. Das ist 5; i nicht <5, so gehen wir wieder.
So sind wir Berechnen wir hallo Zählen, für jede Iteration der Schleife,
dachte sogar, es ist nie zu ändern, es ist immer zu 5 sein.
Also haben wir nur daran erinnern, 5 vorne, und jetzt ist alles besser.
So Iteration über die gesamte Zeichenfolge.
Was wollen wir für jedes Zeichen des Strings zu tun?
[Studenten gesprochen, unverständlich]
Yeah. Also, wenn der Charakter ist nicht alphabetisch, dann wollen wir nur über sie zu überspringen.
Da wir über Buchstaben des Alphabets nur kümmern, wir können nicht nutzen eine Nummer.
Wie können wir also tun? So unser Zustand, also wenn wir etwas wollen - überprüfen, ob es alphabetischer ist.
So, wie wir das kontrollieren?
[Student] können Sie einfach die Funktion ist alpha.
Ist die entweder in dieser oder jeder enthalten sind, wie, char.h oder so etwas?
Lasst uns nicht die alpha-Funktion und die explizite - so haben wir s [i],
das ist das achte Zeichen von s, daran erinnern, dass ein String ein Array von Zeichen ist,
so das achte Zeichen von s.
Wenn nun ein Großbuchstabe ist, wissen wir es muss in einem bestimmten Bereich liegen.
Und was ist das Sortiment?
Yeah. Also, wenn s [i] ist ≥ 65 und s [i] ≤ 90, was soll ich stattdessen tun?
Yeah. So sollte man unbedingt noch nie brauchen, um die ASCII-Werte der jemals etwas wissen.
Nie der Zahlen 65, 90, 97 und 102, oder was immer es ist zu denken.
Sie müssen nicht - 112 - Sie brauchen nicht zu denen überhaupt wissen. Das ist auch falsch.
Verwenden Sie nur die einfachen Anführungszeichen, Apostroph Konstanten. So 'A' und weniger als 90 'Z.'
Und das ist deutlich besser - ich würde nicht wissen, aus der Spitze von meinem Kopf, dass Z 90 ist.
Ich weiß aus der Spitze von meinem Kopf, dass 'Z' Hauptstadt Z. ist
So lange, wie diese im Bereich von Kapital A zu Kapital Z, oder wir ist, kann für Kleinbuchstaben überprüfen,
Oder wenn sie in dem Bereich ist ≥ 'a' und ≤ z.
Also das ist unsere Bedingung.
Der Stil, wo man diese Dinge gelegt variiert.
Ich werde es so machen.
Nun, was wollen wir tun?
Wir wissen, dieser Brief ist ein Charakter, ein Buchstabe.
Also müssen wir unterscheiden, ob dies nun ein Großbuchstabe oder ein Kleinbuchstabe sein abwechseln.
Wie halten wir verfolgen, welche den wir wollen, dass es sein?
[Schüler Stimmen, unverständlich]
Also ja, aber lassen Sie mich nachsehen.
Module 0-2 gesagt wurde, war ein Vorschlag rausgeschmissen, und ich stimme dem zu.
Außer beachten Sie, dass, wie - ist dies der Fall? Yeah.
Es ist jedes andere, aber wir können nicht Modul 2 i oder i mod 2, da
feststellen, dass E Kapital ist und 'a' wird klein geschrieben? Aber es gibt ein Leerzeichen getrennt werden?
So sie gehen, um die gleiche mod 2 sein, aber sie sind verschiedene Fälle.
[Studenten Frage unverständlich]
Yeah. So sind wir gerade dabei, einen Zähler zu halten.
Wir könnten auch tun, dass in hier, wenn wir wollten, das könnte ein wenig unhandlich zu bekommen
in der for-Schleife Erklärungen, ich werde die sie hier.
So int count = 0 beginnt.
Und jetzt werde ich zu zählen, wie viele alphabetischer Charaktere, die wir je hatten.
Also werden wir unweigerlich zu zählen + +, da wir eine andere alphabetische Zeichen gefunden.
Aber, jetzt sagst du, wenn count mod 2.
Also, was wenn count mod 2? Oh. Ich werde == 0 für jetzt tun.
Wir gehen auch über diese. Also, wenn Graf mod 2 == 0, was dann?
[Studenten Antwort unverständlich]
So wollen wir es am Ende in Großbuchstaben geschrieben.
Es gibt 2 Fälle; Groß-und Kleinschreibung sind die 2 Fälle.
Also, wenn wir in Kleinbuchstaben wir brauchen, um es in Großbuchstaben.
Wenn es in Großbuchstaben ist brauchen wir nicht zu tun.
Aber gibt es eine Möglichkeit - shouldn't haben umgedreht -
dass wir nicht einmal zu prüfen, ob sie groß oder klein ist?
Was können wir tun, um immer sicher, dass wir immer am Ende auf Großbuchstaben?
So bemerken, was wir für Kleinbuchstaben "a" hat, was, wenn wir die gleiche genaue Sache angetan A Großbuchstaben?
Hat Großbuchstaben Eine Änderung, oder hat den Wert ändern?
Yeah. Also keine Großbuchstaben bitweise mit ~ 32 verknüpft wird, dass gleiche Großbuchstaben sein
denn jeder Großbuchstabe das 32. Bit nicht gesetzt ist.
Also, wenn wir die Zeichen s [i], wollen wir es geworden Klein-oder Großbuchstaben bringen wollen.
Also, wenn es kleingeschrieben war, ist es jetzt in Großbuchstaben, wenn es in Großbuchstaben war es noch Großbuchstaben, und das ist es.
Ich sagte dies in der Oberabschnitt: Sie können 32 verwenden, wenn Sie wollen, aber ich neige zu bevorzugen dabei "a" - A,
Statt einfach nur 32, denn es kann jede andere Bit sein.
Nach der 32-Bit, kann es eine von diesen sein, sonst hätten wir nicht genug
Zahlen, um alle Zeichen repräsentieren.
Also, wenn Sie die 32-Bit zu bekommen, könnte es die 64-Bit sein, es könnte die 128-Bit sein.
Jede dieser Bits kann das Bit, das zwischen Groß-und Kleinschreibung unterscheidet sein.
Ich sollte nicht zu wissen, dass es die 32-Bit ist.
Ich kann dieses 'a' - A bis das Bit, das zwischen den beiden unterscheidet sich
ohne auf die magische Zahl, die 32 ist verlassen.
Und jetzt, sonst zählen war seltsam, und so was will ich tun?
[Schüler Antworten unverständlich]
[Student] Was ist das?
Ich werde es in 1 Sekunde.
So, jetzt, wenn ich will - ich will sicherstellen, dass die Zeichen jetzt Kleinbuchstaben
Und so kann ich oder von 32 und 32 bedeutet 'a' - A.
Beachten Sie aber, die von der gleichen Begründung wie der vorherige, dass, wenn
der Brief war schon Kleinbuchstaben, dann Verknüpfung von 32 nur hält sie Kleinbuchstaben.
Es hat nicht den ursprünglichen Charakter verändert.
Aber jetzt habe ich nicht um nicht zu sagen: "Wenn es aus Kleinbuchstaben besteht, es einfach vergessen,
wenn es in Großbuchstaben ist, dann ändern Sie es. "
Es ist viel bequemer, dies zu tun.
[Student] Würde diese Strategie der Subtraktion des Großbuchstaben aus dem Kleinbuchstaben Arbeit, wenn es nicht 32?
Wenn ja, wie, 34 oder so etwas?
Also, Sie müssen wissen, dass die Differenz zwischen dem 2 -? >> 1 Bit.
Es könnte mehr als ein Bit sein, solange alle Bits unterhalb dieser Position identisch sind.
So benötigen wir mindestens 26 Zeichen - oder gibt es 26 Zeichen.
So benötigen wir mindestens 26 Zahlen, um den Unterschied darstellen -
Die Differenz zwischen Ein-und 'a' hat, um mindestens 26 sein,
sonst würden wir nicht alle den Kapitalmarkt Zahlen dargestellt haben.
Das bedeutet, dass A, wenn wir bei 1 zu beginnen, es geht um all diese Bits zu verwenden,
alle diese ersten 5 Bits, alles durch Z. stellen
Das ist, warum das nächste Bit oder das Bit ist das nächste Bit derjenige gewählt, um zwischen A und unterscheiden ist 'a ".
Das ist auch der Grund dafür, in ASCII-Tabelle gibt es 5 Symbole trennen Großbuchstaben von Kleinbuchstaben.
Da das sind die Symbole, die extra 5, die bis bringt die 32 ist der Unterschied zwischen ihnen.
[Student] So konnten wir es tun, weil ASCII diese Weise entwickelt wurde.
Ja. Aber ASCII - der Unterschied könnte auch diese beiden Bits.
Wie, wenn A waren 10000001, und 'a' war 11100001 - ich vergesse, was auch immer.
Aber wenn es dies, dann könnten wir noch mit 'a' - A.
Es ist gerade die Differenz zwischen A und 'a' ist diese noch 2 Bits.
Ich denke, es 48 geschrieben ist. Ist es 32 + 64? Ich denke es ist?
Jedes einzelnen Zeichens, wie, Z und z, K und k,; wäre es immer noch zwei Bits sein
sie würden immer noch die gleiche genaue Bits außer für jene 2 Bits.
So lange, wie das ist immer wahr, unabhängig davon, ob wir mit ASCII-oder ein anderes System sind,
Solange es ist nur eine bestimmte Anzahl von Bits, die für jeden Charakter sind,
dann ist das funktioniert gut.
Es ist nur so, dass 32 bis wurde, weil es das erste, das wir möglicherweise nutzen könnte ist eingestellt. >> Cool.
Ich neige dazu, es vorziehen, falls Sie noch nicht gesehen haben, wenn der Block ist nur eine einzige Zeile,
Sie können loszuwerden der geschweiften Klammern, so dass ich eher zu bevorzugen, dies zu tun.
Auch Sie wissen, wie wir die Dinge wie s [i] + = 1 zu tun?
Sie können auch s [i] bitweise AND = 32.
Und bitweise OR = 32.
Auch zählen mod 2 == 0.
Also denken Sie daran, dass - ich werde es nicht geschrieben - jeder Wert ungleich Null ist wahr, und 0 ist falsch.
So ", wenn count mod 2 == 0" ist das gleiche wie zu sagen ", wenn nicht zählen mod 2".
Ich würde wahrscheinlich einfach umgekehrt haben die Linien und sagte: "wenn count mod 2,
Haben die OR 1, sonst die AND 1 ", so dass ich nicht brauchen die" nicht. "
Aber das funktioniert genauso gut.
Und was kann ich hier tun?
Man könnte sie mit ternären kombinieren, wenn man wollte, dann aber die hatte gerade die Dinge messier
und wahrscheinlich schwieriger zu lesen, so werden wir nicht tun.
Jemand noch andere Vorschläge?
Ist das alles, das Problem gefragt? Oh yeah.
So loszuwerden, diese leeren Zeilen, jetzt werden wir f,% s zu drucken ist das eine für Streicher,
Wir drucken f, s.
Nun wollen wir ausführen. Habe ich etwas falsch gemacht?
Das ist ein \ ", ich will eine n.
Okay. Jetzt werden wir ausführen. Es wird wahrscheinlich schreien mich an.
Strlen in string.h.
Also das ist das Schöne an Clang ist es sagt Ihnen, was es in ist,
anstelle von GCC, die nur sagt: "Hey, du etwas vergessen, ich weiß nicht, was es war."
Aber das wird mir zu sagen, "Du wolltest string.h gehören."
So dass ich nicht für alles fordert, so ist es nicht etwas zu sagen.
Aber wir werden ihrem Beispiel zu tun ", thanks 4 the add".
Das sieht richtig. Hooray.
So Rückkehr zu Ihrem wichtigsten, fast hätte ich es nie tun.
Es ist optional. Und Haupt ist die einzige Funktion, für die es optional.
Wenn Sie nicht zurückgeben nichts von der Hauptstraße, wird davon ausgegangen, dass Sie auf 0 zurück gemeint.
Haben Sie Fragen?
Okay. So, jetzt das zweite Problem.
"Von Woche 2 der zweiten Vortrag, dass Swapping 2 Variablen" Werte Recall, indem
diese 2 Variablen an eine Funktion (selbst wenn es swap) nicht genau so funktionieren, zumindest nicht ohne 'Zeiger'. "
Und ignorieren Zeigern, bis wir sie bekommen.
Wir wollen 2 Variablen vertauschen; wir nicht mit einer Funktion zu tun.
Wir sind immer noch dabei, es in main tun, wie sie sagt.
Aber um die 2 Variablen verwenden, wollen wir nicht, um eine temporäre Variable verwenden.
Es gibt 2 Möglichkeiten, dies zu tun.
Sie können es mit Ihrem traditionellen binären Operatoren.
So hat jemand eine schnelle und schmutzige Weise, das zu tun?
Es könnte tatsächlich eine Minute dauern, des Denkens. Wenn ich -
Ich werde eingestellt, das Problem auf wie sie fragen. Also, wenn ich 2 Variablen, A, ist das nur eine Zahl
dass sie mir geben, und die Summe der Variablen B, die eine andere Zahl, die ich gegeben habe, ist.
Also, wenn ich diese 2 Variablen haben, jetzt will ich sie zu tauschen.
Das traditionelle, mit Ihrem normalen binären Operatoren, ich meine, wie +, -, ÷.
Nicht bitweisen Operatoren, die auf binären handeln.
Also mit -, +, ÷, und all jene.
Wir könnten etwas wie Swap a = a + b und b = a - b, a = a - b.
So überprüfen Vernunft, und dann werden wir, warum das funktioniert.
Nehmen wir an, a = 7, b = 3 ist, dann a + b werde 10 sein wird.
So wir nun Setzen eines = 10, und dann tun wir b = a - b.
So tun wir b = a - b, die wird bis 7 sein, und b = a - b wieder
oder a = a - b. Welche wird 10 sein - 7, 3 ist.
So jetzt korrekt, "a" betrug 7, b betrug 3 und 7 ist nun b und "a" gleich 3 ist.
So daß Art sinnvoll; 'a' ist die Kombination der zwei Zahlen.
An diesem Punkt, 'a' ist die Kombination, und dann sind wir Subtrahieren der ursprünglichen b,
und dann sind wir abgezogen, was war die ursprüngliche 'a ".
Aber dies bedeutet nicht für alle Zahlen.
Um dies zu sehen, betrachten wir ein System, so denken wir normalerweise an Ganzzahlen als 32 Bit.
Lasst uns auf etwas, das nur wie 4 Bits ist zu arbeiten.
Hoffentlich komme ich mit einem guten Beispiel gerade jetzt.
Also, ich weiß, das wird nicht einfach.
Lassen Sie uns sagen, dass unsere 2-Nummern sind 1111 und 1111, so dass wir in binärer jetzt.
In tatsächlichen Dezimalstellen, wenn Sie daran denken, dass so wollen, a = 15 und b = 15.
Und so erwarten wir, nachdem wir sie zu tauschen - sie haben noch nicht einmal, um die gleichen Zahlen,
aber ich habe es auf diese Weise.
Lasst uns ihnen nicht die gleichen Zahlen. Lasst uns 1111 und 0001.
So a = 15 und b = 1 ist.
Nachdem wir sie tauschen, erwarten wir 'a' bis 1 sein und b bis 15 sein.
Unser erster Schritt ist a = a + b.
Unsere Zahlen sind nur 4 Bit breit, so 'a', die 1111 ist, + b, die 0001 ist,
wird am Ende als 10000, aber wir haben nur 4 Bits.
So, jetzt a = 0 ist.
Und nun wollen wir um b = a - b - eigentlich das noch klappt perfekt.
a = a - b - mal sehen, ob das funktioniert perfekt.
Also b = 0 bis 1, die noch 15 wäre, und dann a = a - b, würde die 1 sein.
Vielleicht funktioniert.
Ich fühle mich wie es gibt einen Grund es nicht funktioniert mit regulären.
Okay, so arbeitet auf der Annahme, dass es nicht mit regulären binären Operationen arbeiten,
und ich werde suchen - ich werde Google zu sehen, ob das wahr ist.
So wollen wir es zu tun mit bitweisen Operatoren und der Schlüssel ist hier XOR.
Also, Einführung XOR (^), wenn Sie es noch nicht gesehen.
Es ist wieder eine bitweise Operator so wirkt es Stück für Stück, und es ist -
Wenn Sie die Bits 0 und 1 haben, dann wird dies 1 sein.
Wenn Sie die Bits 1 und 0 haben, wird es 1 sein, muss man die Bits 0 und 0 es 0 sein werde,
und wenn man die Bits 1 und 1 haben, es wird 0 sein.
So ist es wie OR. Wenn entweder der Bits wahr sind, dann ist es ein, aber im Gegensatz OR, es kann nicht beide Bits wahr sind, die sein.
OR hätte dies ein, wäre XOR haben diese 0 sein.
Also werden wir gehen zu wollen, XOR hier verwenden.
Denken Sie darüber für eine Minute, ich bin zu Google gehen.
Nun, man kann nicht gelesen, dass, ich bin derzeit auf der XOR-Swap-Algorithmus Seite.
Hoffentlich wird dies erklären, warum ich kann nicht -
Das ist genau der Algorithmus, dass wir gerade getan.
Ich weiß immer noch nicht, warum - ich muss nur abgeholt haben ein schlechtes Beispiel,
aber dieser Fall, wo 'a' passiert auf 0 zu werden, nach dem Aufstehen um 5 Bits, so dass nun 'a' 0 ist,
das ist, was heißt "Integer Overflow".
Laut Wikipedia: "Anders als die XOR Swap erfordert diese Variante, dass es einige Methoden verwendet
zu gewährleisten, dass x + y nicht zu einem Integer-Überlauf. "
Also das macht Probleme haben, das war Integer-Überlauf, aber ich habe etwas falsch gemacht.
Ich bin nicht sicher. Ich werde versuchen, sich mit einem anderen.
[Student] Nun, das ist nicht Integer-Überlauf, wenn Sie versuchen, eine Reihe in es gesetzt sind
größer als die Menge an Bits, die Sie zugeordnet haben?
Yeah. Wir haben 4 Bits. That's - wir hatten 4 Bits, wir dann versuchen, ein, um es hinzuzufügen, so dass wir am Ende mit 5 Bits.
Aber das fünfte Bit bekommt nur abgeschnitten, yeah.
Es könnte tatsächlich -
[Student] Heißt werfen Sie einen Fehler, oder tut, dass - wäre das zu werfen einen Fehler entdeckt?
Nr. Also gibt es keinen Fehler. Wenn Sie zu Montage-Ebene zu erhalten, ein spezielles Bit
irgendwo einstellen, dass sagte, es sei ein Überlauf, aber in C Sie Art einfach nicht damit umgehen.
Sie können tatsächlich nicht mit ihm handeln, sofern Sie spezielle Montageanleitung in C.
Lassen Sie uns über XOR Swap denken.
Und ich denke, die Wikipedia-Artikel hätte auch gesagt, dass -
So brachte auch modulare Arithmetik, so dass ich glaube, ich war in der Theorie, tut modulare Arithmetik
als ich sagte, dass 0 - 1 15 wieder.
So dass möglicherweise tatsächlich - auf einer regelmäßigen Prozessor, 0 tut - 1 = 15.
Da landen wir bei 0, haben wir 1 subtrahieren, so dann ist es nur hüllt sich wieder um bis 1111.
So dieser Algorithmus könnte tatsächlich funktionieren, die a + b, die a - b, b - a;, die in Ordnung sein könnte.
Aber es gibt einige Prozessoren, die das nicht tun, und so wäre es nicht in diesen spezifischen diejenigen gut.
XOR Swap läuft auf jedem Prozessor arbeiten. Okay.
Die Idee ist, dass es soll gleich sein, obwohl.
Wo wir sind mit XOR irgendwie die Informationen erhalten, sowohl in 1 der Variablen,
und ziehen Sie dann die Informationen der einzelnen Variablen wieder.
So hat jemand Ideen / die Antwort?
[Schüler Antwort unverständlich]
So, das sollte funktionieren, und auch, XOR kommutativ.
Unabhängig von welcher Reihenfolge diese 2 Zahlen zufällig in hier zu sein,
Dieses Ergebnis wird die gleiche sein.
So a ^ b ist b ^ a.
Vielleicht haben Sie auch sehen dies als schriftliche a ^ = b, b ^ = a, a ^ = b wieder.
Also das ist richtig, und zu sehen, warum das funktioniert, der Bits denken.
Mit einer kleineren Zahl, sagen wir 11.001 und 01.100.
Also das ist 'a', das ist b.
So a ^ = b.
Wir gehen zu setzen 'A' = der XOR dieser 2 Dinge.
So 1 ^ 0 = 1 ist; 1 ^ 1 0 ist; 0 ^ 1 1 ist, und 0 * 0 0 ist; 1 ^ 0 = 1 ist.
So 'a,' wenn man sich die Dezimalzahl aussehen, es geht um sein -
du wirst doch nicht zu viel von einer Beziehung zwischen dem ursprünglichen "a" und dem neuen See 'ein'
aber wenn man die Bits, 'a' ist nun wie ein Geflecht aus den Informationen
sowohl der Original-"a" und der ursprünglichen b.
Also, wenn wir b ^ a, sehen wir, dass wir am Ende mit dem ursprünglichen "ein.
Und wenn wir das Original 'a' ^ die neue 'a,' sehen wir landen wir in der ursprünglichen b.
So (a ^ b) ^ b = der ursprünglichen "a".
Und (a ^ b) ^ a = die ursprüngliche b.
Es gibt - einen anderen Weg zu sehen ist dies nichts XOR selbst ist immer 0.
So 1101 ^ 1101, werden alle Bits würde die gleiche sein.
So gibt es nie einen Fall, wo 1 ist eine 0 und der andere ist 1 sein.
Also das ist 0000.
Dasselbe mit diesem. (A ^ b) ^ b ist wie a ^ (b ^ b).
(B ^ b) wird auf 0 gesetzt werden; a ^ 0 wird nur noch zu 'a,' da alle Bits 0 sind.
So sind die einzigen, die sein werden, wo 'a' war ursprünglich ein 1 - hatten diejenigen.
Und die gleiche Idee hier, ich bin mir ziemlich sicher, dass es auch kommutativ.
Yeah. Ich habe also vor, dass es kommutativen war.
Das ^ 'a,' und es ist assoziativ, so dass nun (b ^ a) ^ a.
Und wir tun können, b ^ (a ^ a).
Und so wieder, erhalten wir den ursprünglichen b.
So 'a' ist nun die Kombination von 'a' und b zusammen.
Mit unserem neuen Combo 'a' sagen wir b = Combo 'a' ^ die ursprüngliche b, erhalten wir die original 'ein. "
Und nun a = Combo 'a' ^ die neue b, die das Original war - oder was ist nun, was war 'a' oder b.
Das ist in diesem Fall hier unten. Dies ist = b, alte b.
So, jetzt ist alles wieder in vertauschter Reihenfolge.
Wenn wir sah tatsächlich an den Bits, b = a ^ b, wird diese 2 XOR,
und die Antwort wird das sein, und dann a = a ^ b ist XORing diese 2 und die Antwort ist.
Haben Sie Fragen? Okay. So der letzte ist etwas wesentlich erschwert.
[Student] Ich glaube, er hat eine Frage. >> Oh, sorry.
[Student] Was ist eigentlich schneller? Wenn Sie diese XOR verwenden, oder ist es, wenn Sie eine neue Variable zu deklarieren?
Also, was ist eigentlich schneller, erklärt eine neue Variable oder mit XOR zu tauschen?
Die Antwort ist, aller Wahrscheinlichkeit nach, eine temporäre Variable.
Und das ist, denn wenn es nach unten zusammengestellt - so bei der Montage Ebene
es gibt nicht so etwas wie lokale Variablen oder irgendwelche temporären Variablen oder alle von diesem Zeug.
Sie sind wie - es gibt Speicher, und es gibt Registern.
Register sind, wo die Dinge aktiv passiert.
Sie fügen Sie nicht 2 Dinge im Speicher; fügen Sie 2 Dinge in Registern.
Und Sie bringen die Dinge aus dem Speicher in die Register, um dann hinzuzufügen,
und dann könnten Sie legte sie zurück in den Speicher, aber die Handlung geschieht in Registern.
Also, wenn Sie mit der temporären Variable Ansatz, in der Regel, was passiert ist
diese 2 Nummern sind bereits in Registern.
Und dann von diesem Punkt an, nachdem Sie sie vertauscht,
es wird nur beginnen mit dem anderen Register.
Überall, wo Sie hatte mit worden b, wird es einfach die Register, die bereits die Speicherung wurde 'a ".
So ist es nicht müssen etwas tatsächlich tun die Swap tun. Yeah?
[Student] Aber es braucht auch mehr Speicher, nicht wahr?
Es dauert nur mehr Speicher, wenn es um diese temporäre Variable speichern muss.
Wie, wenn Sie später, dass temporäre Variable wieder irgendwo,
dann - oder weisen Sie etwas in diesem temporären Variablen.
Dann, wenn er zu jedem Zeitpunkt "a", b in temp haben unterschiedliche Werte oder etwas,
dann wird es zu verschiedenen Orten im Speicher haben, aber es ist wahr, dass
Es gibt viele lokale Variablen, die nur in den Registern existieren wird.
In diesem Fall ist es nie in den Speicher zu schreiben, und so Sie nie Verschwendung von Speicherplatz.
Okay. Letzte Frage ist ein bisschen mehr.
Deshalb hier in diesem CS50 Gerät besteht ein Wörterbuch.
Und der Grund dafür ist, dass [? B66] ist eine Rechtschreibprüfung, wo Sie schreiben werde
mit Hash-Tabellen oder versucht oder eine Datenstruktur.
Du wirst schriftlich eine Rechtschreibprüfung und du gehst zu verwenden dieses Wörterbuch zu tun.
Aber für dieses Problem, wir sind nur gut aussehen, um zu sehen, wenn ein einzelnes Wort im Wörterbuch.
Also anstatt zu speichern das gesamte Wörterbuch in irgendeiner Datenstruktur
und dann mit Blick auf das gesamte Dokument zu sehen, ob alles ist falsch,
Wir wollen einfach nur ein Wort zu finden. So können wir einfach scannen über das gesamte Wörterbuch
und wenn wir nie das Wort im gesamten Wörterbuch, dann war es nicht drin.
Wenn wir scannen über das gesamte Wörterbuch und die das Wort sehen, dann sind wir gut sind, fanden wir es.
Es heißt hier, dass wir beginnen, C die Datei-Handling-Funktion wollen,
da wollen wir das Wörterbuch zu lesen,
aber ich werde den Tipp geben hier um die Funktionen, die Sie denken sollten.
Ich werde sie auf Spaces schreiben.
So die wichtigsten sind Sie wollen an die f öffnen und dann zwangsläufig geschlossen f suchen,
was wird am Ende Ihres Programms gehen, und f Scan f.
Sie könnten auch f zu lesen, aber Sie wahrscheinlich nicht wollen,
denn das - Sie müssen nicht am Ende brauchen, dass.
F-Scan f ist, was du gehst zu verwenden, um Scan über das Wörterbuch.
Und damit Sie nicht brauchen, um Code bis die Lösung, nur versuchen und wie Pseudo-Code den Weg
zu einer Lösung, und dann werden wir darüber diskutieren.
Und tatsächlich, da habe ich Ihnen bereits diese, wenn Sie in einem beliebigen Terminal oder Ihre Appliance Shell gehen,
Ich würde - ich normalerweise - wenn Sie noch nicht gesehen haben, weiß ich nicht, ob du in der Klasse haben,
aber der Mensch, so die Manpages sind ziemlich nützlich für das Betrachten ziemlich jede Funktion.
So kann ich tun, wie der Mensch f, Scan f.
Dies ist nun die Informationen über die Scan-f Familie von Funktionen.
Ich könnte auch ein Mann f, offen, und dass gibt mir die Details davon.
Also, wenn Sie wissen, welche Funktion Sie verwenden, oder Sie lesen Code
und sehen Sie einige Funktionen und du bist wie, "Was tun hat?"
Nur der Mensch, daß Name der Funktion.
Es gibt ein paar seltsame Beispiele, wo Sie zu sagen haben könnte
mögen. Mann 2 diese Funktion Namen, oder man 3 diese Funktion Name,
aber Sie haben nur zu tun, wenn man Namen der Funktion geschieht nicht, um die erste Zeit zu arbeiten.
[Student] So lese ich die Manpage für offen, aber ich bin immer noch auf, wie es und das Programm verwenden verwirrt.
Okay. Ein großer Teil der Menschen Seiten sind weniger als hilfreich.
Sie sind hilfreich, wenn Sie bereits wissen, was sie tun
und dann müssen Sie nur die Reihenfolge der Argumente oder etwas zu erinnern.
Oder sie kann Ihnen einen allgemeinen Überblick, aber einige von ihnen sind sehr überwältigend.
Wie f Scan f, auch. Es gibt Ihnen die Informationen für all diese Funktionen,
und 1 Zeile hier unten passiert, zu sagen, "F-Scan f liest den String Punkt oder Strom."
Aber f öffnen. So, wie würden wir f offen?
Die Idee, ein Programm, das die Datei zu tun braucht I / O ist, dass
müssen Sie zuerst die gewünschte Datei, um Dinge zu tun zu öffnen, und unvermeidlich,
Lesen, was aus dieser Datei und tun Dinge mit ihnen.
F offen ist, was wir, um die Datei zu öffnen.
Das, was wir zurück zu bekommen, so was Datei, die wir öffnen wollen, es gibt uns die -
hier heißt es "/ user / share / dict / words."
Dies ist die Datei, die wir öffnen möchten, und wir wollen sie zu öffnen -
müssen wir explizit angeben, ob wir zu öffnen, es zu lesen, oder wenn wir öffnen möchten sie schreiben wollen.
Es gibt ein paar Kombinationen und solche Sachen, aber wir wollen diese zum Lesen zu öffnen.
Wir wollen aus der Datei gelesen.
Was bedeutet diese Rückkehr? Es gibt eine Datei Stern (*),
und ich werde einfach alles zeigen in der Variablen f, so *
wieder, es ist ein Zeiger, aber wir wollen nicht mit Zeigern umgehen.
Sie können sich denken, wie f, f ist jetzt die Variable, die Sie verwenden, um die Datei stellen sind.
Also, wenn Sie aus der Datei lesen wollen, lesen Sie von f.
Wenn Sie die Datei schließen möchten, schließen Sie f.
So am Ende des Programms, wenn wir unweigerlich wollen die Datei zu schließen, was sollen wir tun?
Wir wollen f schließen.
So, jetzt die letzte Datei-Funktion, dass wir gehen zu wollen, verwenden Scan f, f Scan f.
Und was das tut, ist es über die Datei auf der Suche nach einem Muster zu entsprechen sucht.
Mit Blick auf die Manpage hier, wir int f Scan f sehen, ignorieren Sie den Rückgabewert für jetzt.
Das erste Argument ist die Datei * stream, so das erste Argument wir weitergeben möchten sind f.
Wir über f Scannen.
Das zweite Argument ist eine Format-String.
Ich gebe Ihnen einen Format-String richtig.
Ich denke, wir passieren zu sagen, 127s \ n, eine Menge, die unnötig ist.
Die Idee, was das Format-String ist, können Sie der Scan-f als das Gegenteil von Druck f denken.
So drucken f, Print-f verwenden wir auch diese Art von Format-Parameter,
aber in Druck f, was wir tun, ist - lasst uns bei einer äquivalenten aussehen.
So drucken Sie f, und es gibt eigentlich auch f Druck f, wo das erste Argument werde f sein wird.
Wenn Sie f drucken, könnten wir etwas sagen wie "print 127s \ n" und dann, wenn wir es weiter eine Schnur,
es geht um diese Zeichenfolge und dann eine neue Zeile zu drucken.
Was 127 bedeutet, ich bin mir ziemlich sicher, aber ich habe mich nie darauf beschränkt,
Sie würden nicht einmal zu '127 'in der Druckerei f sagen,
aber was es bedeutet, zeige die ersten 127 Zeichen.
Also ich bin ziemlich sicher, dass das der Fall ist. Sie können, dass Google.
Aber in der nächsten ein Ich bin fast sicher, es bedeutet, dass.
So ist dies zeige die ersten 127 Zeichen, durch eine neue Zeile.
F-Scan f jetzt, anstatt sich mit einer variablen und Drucken,
es wird irgendwann String suchen, und speichern Sie das Muster in die Variable.
Lassen Sie tatsächlich nutzen Scan f in einem anderen Beispiel.
So sagen wir, wir hatten einige int x = 4,
und wir wollten einen String aus zu schaffen - wollte die Zeichenfolge zu erstellen
das war wie, das wird kommen viel später,
etwas, das wie 4.jpg ist.
So könnte dies ein Programm, wo man Summenzähler haben werden,
Summenzähler i, und Sie möchten ein paar Bilder zu speichern.
Sie wollen also i.jpg, wo ich es einige Iteration der Schleife zu speichern.
Also, wie machen wir diese Zeichenfolge für die JPEG?
Wenn Sie drucken 4.jpg wollten, könnten wir nur sagen, Druck f,% d.jpg,
und dann wäre es für die JPEG drucken.
Aber wenn wir den String 4.jpg speichern möchten, verwenden wir Scan f.
So String s - eigentlich haben wir kann nicht - Charakter, char s, lass uns gehen 100.
Also habe ich gerade erklärt einige Array mit 100 Zeichen
und das ist, was wir unweigerlich zu speichern, dass JPEG in.
So werden wir Scan f verwenden, sowie das Format, wie wir% d.jpg sagen,
Um zu drucken 4.jpg, wird das Format dieser werde% d.jpg sein.
So ist das Format% d.jpg, was wir wollen% d mit ersetzen x,
und jetzt müssen wir diese Zeichenfolge irgendwo speichern.
Und wo werden wir diese Zeichenfolge zu speichern, ist in dem Array s.
Also nach dieser Codezeile, s, wenn wir drucken f,% s der Variablen s,
es geht um 4.jpg drucken.
So f Scan f ist die gleiche wie Scan-f, außer jetzt ist es über diese Datei suchen
für das, was in s speichern.
Das ist, was das letzte Argument sein wird.
Wir speichern wollen - "Scan f Familie von Funktionen Scans sowohl nach Format als versuchte unten.
Wenn einer in den Ort Punkte gespeichert sind Sie vielleicht zurück - "
Nein, könnten wir gut sein. Lassen Sie mich für eine Sekunde denken.
So Scan f nicht - was zum Teufel die Funktion, die das tut ist?
So Scan f wird nicht eine ganze Zahl nehmen und dot jpg.
Es ist auf [murmelt] gehen.
Speichern int Variable in String int C.
Was ist das variable, oder was ist diese Funktion aufgerufen?
Ja. That's - ja. Also, was ich dir definieren vorher war s print f,
die - die viel mehr Sinn, warum ich sagte, es war viel mehr wie print f macht.
Scan f ist immer noch der wie print f Art, aber s print f wird es scannen über
und ersetzen Sie die Variablen und jetzt speichern sie in einem String.
Anstatt ihn zu drucken, speichert er es in einem String.
Damit komplett ignorieren. Sie können immer noch der Formatbezeichner denken, als wie der Druck f.
So jetzt, wenn wir die 4.jpg tun wollten, würden wir tun, s print f, x davon.
Also, was Scan f tut - was Ihre Frage sein wird?
[Student] Ich bin nur auf das, was wir versuchen, hier zu tun verwirrt
mit diesem JPEG. Können Sie erklären, dass ein mehr Zeit?
Das war also - es ist weniger BETROFFENEN bis f Scan f jetzt hoffentlich wird es Krawatte zurück in irgendeiner Art und Weise.
Aber was ich ursprünglich beabsichtigt zu zeigen war - das ist eigentlich direkt relevant für diesen [? F5]
Du wirst zu sein mit s print f, wo, sagen wir 100 Bilder,
und Sie wollen image 1.jpg, 2.jpg, 3.jpg lesen.
Also, um das zu tun, müssen Sie f offen, und dann haben Sie in der Zeichenfolge, die Sie öffnen möchten passieren.
So würden wir öffnen möchten 1.jpg;, um die Zeichenfolge, die 1.jpg schaffen,
wir tun s print f% d.jpg--wir nicht für int i = 0 zu tun.
i <40, i + +.
So s print f% d.jpg der i.
So nach dieser Zeile, jetzt die Variable oder das Array s wird 1.jpg gehen.
Oder 0.jpg, 1.jpg, 2.jpg. Und so können wir öffnen, wiederum jedes Bildes für das Lesen.
Also das ist das, was s gedruckt f tut. Siehst du, was s f jetzt tut drucken?
[Student] Okay, so ist es unter - es wird eine Zeichenfolge erstellt, something.jpg, und speichert es dann.
Ja. Es schafft - dies ist ein weiteres Format-String, wie Scan-f-und Print-f,
wo es fügt alle der Variablen in das zweite Argument, könnte s um i entgegen.
Vielleicht - ich meine, das ist der Fall. Aber was auch immer die Reihenfolge der Argumente ist.
Es wird auf alle Variablen in den Format-String einfügen
und dann in unser Puffer speichern, rufen wir, dass ein Puffer, es, wo wir das Speichern der Zeichenfolge sind ist.
So sind wir im Inneren des s Speicherung der korrekt formatierten String,% d mit mit 4 ersetzt worden.
[Student] Also, wenn wir dies taten, ist die Variable f gerade dabei, neu zugewiesen werden?
Ja. Also sollten wir die ursprüngliche f, bevor Sie diese zu schließen.
Aber - und dann auch, wenn es nicht ein f eröffnen hier, dann müssten wir sagen -
Yeah. Aber es wäre zu öffnen hundert verschiedene Dateien.
[Student] Aber wir wären nicht in der Lage sein zugreifen oder - okay.
Okay. So Scan f, f Scan f, ist eine Art von der gleichen Idee,
aber anstatt, anstatt es zu speichern in einen String, es ist mehr wie du bist jetzt
gehen über einen Stachel und Mustererkennung gegen diese Zeichenfolge und speichert die Ergebnisse in Variablen.
Sie können Scan-f über so etwas wie 4.jpg analysieren, und speichern Sie die Zahl 4 in Summe int x.
Das ist das, was wir können Scan-f für den Einsatz.
F-Scan f wird, dass in der Befehlszeile tun.
Ich bin eigentlich ziemlich sicher, das ist, was der CS50-Bibliothek tut.
Also, wenn Sie sagen, "get int," es ist Scan f-ten über - scan f ist der Weg Sie Benutzereingaben.
F-Scan f wird das gleiche tun, sondern mit einer Datei zu scannen vorbei.
Also hier sind wir über diese Datei scannen.
Das Muster, das wir versuchen zu entsprechen, ist eine Schnur, die 127 Zeichen lang ist
gefolgt von einer neuen Zeile
Also ich bin mir ziemlich sicher, dass wir auch nur sagen: "überein s", da im Wörterbuch
wir passieren müssen, sind wir garantiert kein Wort ist, dass lange,
und auch f Scan f, denke ich, wird auf der neuen Linie zu stoppen, egal was.
Aber wir werden auch die neue Linie im Spiel, und -
[Student] Wenn wir nicht auch die neue Linie, wäre es nicht zu finden, Teile eines Wortes?
It - jeweils - Blick auf den Wörterbuch -
So im Wörterbuch, das sind alle unsere Worte.
Jeder ist auf einer neuen Zeile.
Die Scan-f abholen wollte dieses Wort.
Wenn wir nicht um eine neue Linie, dann ist es möglich, dass der nächste Scan f wird gerade gelesen das neue Zeile.
Aber auch neue Linie wird dann einfach ignorieren die neue Linie.
Aber wir werden nie Teil eines Wortes, da wir immer gelesen werden bis zu einer neuen Linie, egal was passiert.
[Student] Aber was, wenn Sie das Wort "Cissa," wie Cissa suchen.
Wird es finden, dass, und sagen, es ist ein Spiel?
Also hier haben wir - es wird lesen - das ist eigentlich ein guter Punkt.
Wir sind nie mit dem aktuellen - das Wort, das wir suchen, ist das erste Argument der Kommandozeile.
So String word = argv 1.
So die Zeichenkette, die wir suchen ist argv 1.
Wir sind nicht auf der Suche nach einem Wort überhaupt in unserem Scan f.
Was wir mit Scan-f macht immer jedes Wort im Wörterbuch,
und dann noch einmal haben wir das Wort wir strcmp verwenden, um sie miteinander zu vergleichen sind.
Wir werden unser Wort zu vergleichen und was wir gerade gelesen haben in.
So unvermeidlich, werden wir am Ende tut ein Bündel von Scan fs
bis es passiert einfach so, dass Scan f will return -
es wird ein zurückzukehren, solange es ein neues Wort übereinstimmt,
und es wird etwas anderes, sobald er es versäumt hat, das Wort überein zurückzukehren.
Wir sind über die gesamte Wörterbuch Lesen, Speichern zeilenweise jedes Wort in die Variable s.
Dann vergleichen wir Wort mit s, und wenn der Vergleich == 0,
strcmp passiert auf 0 zu bringen, wenn ein Spiel gemacht wurde.
Also, wenn es 0 war, dann können wir drucken f, abgestimmt,
oder Wort in Wörterbuch, oder was auch immer Sie wollen f drucken.
Und dann - wir wollen nicht f schließen immer und immer wieder.
Dies ist die Art von Sache, die wir tun wollen, und wir sind nicht nur auf der Suche nach Wort im Wörterbuch.
So konnten wir das tun, wenn wir für ihre Muster, Cissa aussehen wollte, wie du schon gesagt habe,
wenn wir für dieses Muster aussehen wollte, dann wäre es in dem Fall nicht
denn das ist nicht eigentlich ein Wort, aber eines der Wörter im Wörterbuch passiert, dass in ihm haben.
So würde es passen dieses Wort, aber diese Teilmenge des Wortes ist nicht ein Wort selber.
Aber das ist nicht, wie wir mit ihm, wir sind in jedem Wort lesen
und dann vergleichen Sie das Wort haben wir mit diesem Wort.
So sind wir immer verglichen voller Worte.
Ich kann senden die finalisiert Lösungen später.
Dies ist eine Art von fast die richtige Antwort, denke ich.
[Schüler Kommentar unverständlich]
Oh, habe ich loswerden, dass vor? Char s, ich denke, wir sagten 127 - ich vergesse, was die größte ist.
Wir müssen nur tun, 128; so jetzt s lang genug ist.
Wir brauchen nicht alles zu drucken.
Wir sind auch gehen zu wollen, müssen unsere Datei zu schließen, und das sollte über die richtige Antwort sein.
CS50.TV