1 00:00:00,000 --> 00:00:02,670 [Powered by Google Translate] § Problem Set 2: Hacker Ausgabe 2 00:00:02,670 --> 00:00:04,910 Rob Bowden, Harvard University 3 00:00:04,910 --> 00:00:07,410 Dies ist CS50. CS50.TV 4 00:00:07,410 --> 00:00:15,770 Also, ich bin Rob. Ich bin ein Senior in Kirkland. Dies ist mein drittes Jahr TFing CS50. 5 00:00:15,770 --> 00:00:22,220 Es ist das erste Mal, dass wir von der traditionellen Frontalunterricht Abschnitt ändern, 6 00:00:22,220 --> 00:00:25,610 wo wir nur irgendwie überprüfen, was passiert in der Vorlesung und dann euch Fragen zu stellen, 7 00:00:25,610 --> 00:00:32,250 jetzt ist viel mehr problem-based, wo wir Spaces verwenden, und - 8 00:00:32,250 --> 00:00:37,410 Oh, so ist die Idee zu diesem Link schickte ich Sie gehen und dann wirst du in meinem Raum. 9 00:00:37,410 --> 00:00:42,410 Hat jemand noch einen Laptop? Okay. 10 00:00:42,410 --> 00:00:47,050 So werden wir werden mit diesem, und wir werden zu tun Probleme leben in Abschnitt 11 00:00:47,050 --> 00:00:50,740 und zu diskutieren und herauszufinden, was falsch ist 12 00:00:50,740 --> 00:00:56,390 und ich könnte nach oben ziehen einige Code, und ich könnte Ihre Ideen zu diskutieren. 13 00:00:56,390 --> 00:01:02,140 So hat jemand schon Schwierigkeiten? 14 00:01:02,140 --> 00:01:07,000 Sie können auf der Seite unterhalten, ich weiß nicht, ob wir Grund dafür musst. 15 00:01:07,000 --> 00:01:12,270 Nun, wie die vorherige Oberabschnitt, wenn Sie an dieser Klasse waren, wissen Sie, was das geht. 16 00:01:12,270 --> 00:01:19,200 Auf allen P-Sets es geht um diese Abschnitte sein. 17 00:01:19,200 --> 00:01:22,550 So P-set 2, Spezifikationen, ich denke, man sah es auf P-Satz 1 bereits. 18 00:01:22,550 --> 00:01:27,400 Aber wir können bei P-Set 2 für was wir über heute gehen sehen. 19 00:01:27,400 --> 00:01:29,460 Und du wirst sehen, einen Teil der Fragen. 20 00:01:29,460 --> 00:01:37,530 So wird dies in allen P-Sets sein, es werde eine Sektion von Fragen. 21 00:01:37,530 --> 00:01:41,340 Bisher haben wir gesagt: "Betrachten Sie diese Gelegenheit zu üben." 22 00:01:41,340 --> 00:01:44,940 Sie werden nicht aufgefordert, dieses Programm vorzulegen. 23 00:01:44,940 --> 00:01:48,480 Die Idee ist, dass diese in Art von Hilfe Sie mit dem Problem Satz loslegen sollen. 24 00:01:48,480 --> 00:01:53,220 Ich denke, auf der Hacker Ausgabe, sind viele von ihnen sollen nur neue, interessante Dinge zu lernen. 25 00:01:53,220 --> 00:01:58,590 Sie dürfen nicht direkt auf das Problem gesetzt. 26 00:01:58,590 --> 00:02:01,810 Und jetzt sind wir nicht mit Ihnen übermittelten sie, aber in der Theorie, 27 00:02:01,810 --> 00:02:07,480 für spätere Problemstellungen, könnten Sie legt sie, und daher kann man entweder zu Abschnitt kommen 28 00:02:07,480 --> 00:02:10,380 oder schauen Sie den Abschnitt, um die Antworten zu erhalten, oder Sie können nur erhalten, sie auf eigene Faust 29 00:02:10,380 --> 00:02:16,350 Wenn Sie keine Lust genieße meine Gegenwart spüren. 30 00:02:16,350 --> 00:02:21,010 So ist die - ich glaube, das ist das erste. 31 00:02:21,010 --> 00:02:29,280 Oh. Auch unter diesen Abschnitten Fragen, die wir auch haben Sie Fragen zu den Shorts. 32 00:02:29,280 --> 00:02:33,440 Also ich denke, in der Theorie, du sollst diese vor kommenden Abschnitt zu sehen, 33 00:02:33,440 --> 00:02:38,550 aber es ist in Ordnung, wenn Sie das nicht tun, werden wir über sie sowieso gehen. 34 00:02:38,550 --> 00:02:42,590 So können wir mit diesen zu starten: "Wie funktioniert eine while-Schleife aus einem do-while-Schleife unterscheiden? 35 00:02:42,590 --> 00:02:46,210 Wenn Letzteres ist besonders nützlich? " 36 00:02:46,210 --> 00:02:49,390 So jemand eine -? 37 00:02:49,390 --> 00:02:52,730 [Student] Die do-while-Schleife wird immer mindestens einmal ausgeführt. 38 00:02:52,730 --> 00:03:02,950 Ja. Also das ist der Unterschied. Eine while-Schleife - ich werde es einfach tun hier - while-Schleife, haben wir die Bedingung 39 00:03:02,950 --> 00:03:19,760 hier, während eine do-while, müssen Sie nicht einen Zustand, bis wir hier unten zu bekommen. 40 00:03:19,760 --> 00:03:24,130 Und so, wenn Ihr Programm ist ausgeführt, und es wird auf die while-Schleife, 41 00:03:24,130 --> 00:03:26,380 es sofort überprüft, ob diese Bedingung erfüllt ist. 42 00:03:26,380 --> 00:03:30,710 Wenn diese Bedingung nicht erfüllt ist, wird es nur überspringen, die Schleife vollständig. 43 00:03:30,710 --> 00:03:34,390 Do-while-Schleife, da das Programm ausgeführt wird, wird es auf die "zu tun." 44 00:03:34,390 --> 00:03:37,920 Nichts passiert an dieser Stelle, nur weiter ausgeführt. 45 00:03:37,920 --> 00:03:42,690 Dann, wenn es die "Weile" trifft, wenn die Bedingung erfüllt ist, wird es wieder loop und es wieder tun 46 00:03:42,690 --> 00:03:46,730 und wieder und wieder, bis die Bedingung nicht erfüllt ist und dann fällt einfach durch. 47 00:03:46,730 --> 00:03:50,600 So, mit dem Unterschied, dass dies überspringen Recht von Anfang an. 48 00:03:50,600 --> 00:03:56,770 Diese notwendigerweise einmal ausgeführt und dann kann mehrmals ausgeführt, wenn die Bedingung ist immer noch wahr. 49 00:03:56,770 --> 00:04:03,720 So die while-Schleife wird es nur einmal tun, oder - die while-Schleife - wir müssen es nicht zu tun, 50 00:04:03,720 --> 00:04:07,900 denn sobald wir sie bekommen, wenn die Bedingung falsch ist, werden wir genau das Richtige überspringen darüber. 51 00:04:07,900 --> 00:04:11,770 Während do-while-Schleife, werden wir es einmal ausführen, unbedingt. 52 00:04:11,770 --> 00:04:14,560 Dann, wenn wir den Zustand zu erhalten, überprüfen wir, ob es wahr oder falsch ist. 53 00:04:14,560 --> 00:04:19,790 Wenn es wahr ist, werden wir es wieder tun, wenn es falsch ist, werden wir einfach weiter gehen. 54 00:04:19,790 --> 00:04:24,680 Also, wenn Letzteres ist besonders nützlich? 55 00:04:24,680 --> 00:04:31,190 Ich kann also in der Gesamtheit der 4 Jahre, 3 Jahre, was auch immer sagen, 56 00:04:31,190 --> 00:04:38,780 dass ich programmiere, habe ich diese verwendet, wie unter 10-mal. 57 00:04:38,780 --> 00:04:43,140 Und wahrscheinlich 5 von ihnen sind in CS50, wenn wir die Einführung do-while-Schleifen sind. 58 00:04:43,140 --> 00:04:47,510 Also, wenn Sie verwendet do-while-Schleifen? 59 00:04:47,510 --> 00:04:49,510 Wann ist die - yeah? 60 00:04:49,510 --> 00:04:53,180 [Student] Wenn Sie versuchen, auf Benutzereingaben oder etwas, das Sie überprüfen möchten, erhalten - 61 00:04:53,180 --> 00:04:59,700 Yeah. So do-while-Schleifen, Benutzereingaben ist die große. 62 00:04:59,700 --> 00:05:03,160 Das ist, warum auf den ersten paar Übungsaufgaben, wenn Sie den Benutzer zu fragen, wie wollen, 63 00:05:03,160 --> 00:05:08,520 "Gib mir einen String," Sie kann nicht fortgesetzt werden, bis Sie diese Zeichenfolge zu erhalten. 64 00:05:08,520 --> 00:05:12,980 Und so, unbedingt, müssen Sie nach der Zeichenfolge mindestens einmal fragen. 65 00:05:12,980 --> 00:05:16,950 Aber dann, wenn sie etwas Schlechtes zu beantworten, dann müssen Sie eine Schleife zurück und fragen wieder. 66 00:05:16,950 --> 00:05:20,810 Aber anders als Benutzereingaben, ist es sehr selten, dass ich einen Fall stoßen 67 00:05:20,810 --> 00:05:27,170 wo ich will loop "mindestens einmal", sondern vielleicht mehr. 68 00:05:27,170 --> 00:05:33,370 Fragen oder -? Hat jemand verwendet eine do-while-Schleife anywhere else? 69 00:05:33,370 --> 00:05:36,780 Okay. Also das nächste ist: "Was bedeutet Kennung Schwarzarbeit 70 00:05:36,780 --> 00:05:43,310 Regel darauf hin, wenn sie von Klang ausgegeben? " 71 00:05:43,310 --> 00:05:47,380 Also, welche Art von Code könnte ich schreiben, um "Schwarzarbeit Kennung? 72 00:05:47,380 --> 00:05:49,550 [Student] Das x = 2? 73 00:05:49,550 --> 00:05:52,650 So können wir nur versuchen, es hier, x = 2. 74 00:05:52,650 --> 00:06:04,830 Wir führen Sie dieses - oh, ich habe nicht darauf klicken. Also hier haben wir bekommen - alles in Ordnung. 75 00:06:04,830 --> 00:06:07,100 "Schwarzarbeit Kennung x verwenden." 76 00:06:07,100 --> 00:06:11,610 Damit ist die Schwarzarbeit Kennung, eine Variable. 77 00:06:11,610 --> 00:06:13,910 Es wird häufig aufrufen, eine Variable eine Kennung. 78 00:06:13,910 --> 00:06:17,300 So ist es vielleicht nicht wissen, es ist eigentlich eine Variable, nicht weiß, was es ist. 79 00:06:17,300 --> 00:06:19,380 Es ist also ein Bezeichner. 80 00:06:19,380 --> 00:06:26,060 Warum ist es Schwarzarbeit? Yeah. 81 00:06:26,060 --> 00:06:32,190 So werden über die Terminologie, die Deklaration einer Variablen klare 82 00:06:32,190 --> 00:06:37,360 ist, wenn Sie "int x" oder "string y", was auch immer sagen. 83 00:06:37,360 --> 00:06:41,910 Die Initialisierung der Variablen, oder die Zuweisung der Variablen, 84 00:06:41,910 --> 00:06:44,510 ist, wenn Sie sagen: "x = 2". 85 00:06:44,510 --> 00:06:52,950 So können wir diese in getrennten Schritten zu tun, int x, x = 2, und bis - wir können ein paar Sachen hier haben - 86 00:06:52,950 --> 00:07:00,350 aber bis diese Linie passiert, wird x noch nicht initialisiert, aber es erklärt wurde. 87 00:07:00,350 --> 00:07:06,760 Und so können wir natürlich tun es in 1 Zeile, und jetzt sind wir deklarieren und initialisieren. 88 00:07:06,760 --> 00:07:10,730 Haben Sie Fragen? 89 00:07:10,730 --> 00:07:18,390 Und schließlich: "Warum ist die Caesar Cipher nicht sehr sicher?" 90 00:07:18,390 --> 00:07:23,830 Also erstens, weiß jemand sagen will, was der Cäsar-Chiffre ist? 91 00:07:23,830 --> 00:07:28,100 [Student] Caesar Cipher ist einfach, dass Sie zuordnen möchten, verschieben Sie jeden Brief, 92 00:07:28,100 --> 00:07:34,420 eine bestimmte Anzahl von Buchstaben gehen über und bewegen wieder vorbei, und es ist nicht sehr sicher, weil 93 00:07:34,420 --> 00:07:42,260 gibt es nur 26 mögliche Optionen und man muss nur jeweils 1 von denen versuchen, bis Sie es erhalten. 94 00:07:42,260 --> 00:07:45,470 Oh. Also sollte ich wiederholen? 95 00:07:45,470 --> 00:07:51,600 Die Cäsar-Chiffre, es ist - ich meine, wirst du mit ihm zu tun haben auf die Probleme, die Sie - 96 00:07:51,600 --> 00:07:56,110 oder ich denke, die Standard Edition des Problems Satz, der nicht auf der Hacker-Ausgabe. 97 00:07:56,110 --> 00:08:01,550 Also auf die Standard Edition des Problems Satz, erhalten Sie eine Meldung wie: "Hallo, Welt" 98 00:08:01,550 --> 00:08:08,410 und Sie haben auch eine Zahl wie 6, und nehmen Sie diese Nachricht, und jeder einzelne Charakter, 99 00:08:08,410 --> 00:08:11,310 Sie drehen es um 6 Stellen im Alphabet. 100 00:08:11,310 --> 00:08:16,560 So ist die "h" in Hello würde h-i-j-k-l-m-n. 101 00:08:16,560 --> 00:08:19,600 Also der erste Brief würde n sein. Wir tun das Gleiche mit e. 102 00:08:19,600 --> 00:08:23,530 Wenn wir eine haben, mögen, z oder so etwas, dann werden wir wieder umschlingen zu "a". 103 00:08:23,530 --> 00:08:29,280 Aber jeder Charakter bekommt zyklisch 6 Zeichen später im Alphabet, und es ist nicht sehr sicher 104 00:08:29,280 --> 00:08:35,440 da es nur 26 Möglichkeiten für wie viele Arten können Sie einen einzelnen Buchstaben zu wickeln. 105 00:08:35,440 --> 00:08:42,919 So kann man nur versuchen, alle 26 von ihnen und vermutlich für einen ausreichend langen Nachricht, 106 00:08:42,919 --> 00:08:46,860 nur 1 von diesen möglichen 26 Dinge geht um lesbar zu sein, 107 00:08:46,860 --> 00:08:50,300 und die Lesbarkeit ein wird die ursprüngliche Nachricht sein. 108 00:08:50,300 --> 00:08:56,240 Also ist es nicht eine sehr gute Möglichkeit der Verschlüsselung überhaupt nichts. 109 00:08:56,240 --> 00:08:59,070 In keinem Zusammenhang mit den Shorts, "Was ist eine Funktion?" 110 00:08:59,070 --> 00:09:03,370 Also, was ist eine Funktion? Ja. 111 00:09:03,370 --> 00:09:11,640 [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. 112 00:09:11,640 --> 00:09:18,160 Yeah. Oder wiederholen, indem auch nur die Beantwortung der nächsten ein - also werde ich es, indem auch die Beantwortung der nächsten beantworten. 113 00:09:18,160 --> 00:09:22,410 Sie können Funktionen verwenden, anstatt nur das Kopieren und Einfügen von Code immer und immer wieder. 114 00:09:22,410 --> 00:09:27,200 Nehmen Sie einfach den Code, steckte es in einen fuction, und dann könnte man einfach die Funktion aufrufen 115 00:09:27,200 --> 00:09:29,870 wo immer Sie wurden Kopieren und Einfügen. 116 00:09:29,870 --> 00:09:33,350 So sind nützlich. 117 00:09:33,350 --> 00:09:35,860 So, jetzt tun wir aktuelle Probleme. 118 00:09:35,860 --> 00:09:46,490 Die erste. So die Idee der erste ist, übergeben Sie einen String, und unabhängig von der - 119 00:09:46,490 --> 00:09:52,060 oder sagt es alle Kleinbuchstaben? Es heißt nicht alle Kleinbuchstaben. 120 00:09:52,060 --> 00:09:57,730 Die Botschaft kann alles sein, und - oh nein. Es macht. 121 00:09:57,730 --> 00:10:01,610 "Der Einfachheit halber können Sie davon ausgehen, dass der Benutzer nur Eingang Kleinbuchstaben und Leerzeichen." 122 00:10:01,610 --> 00:10:08,180 So geben wir eine Meldung mit nur Kleinbuchstaben und dann werden wir abwechselnd 123 00:10:08,180 --> 00:10:15,450 zwischen Groß-und Kleinschreibung - ändern wir die Zeichenfolge Groß-und Kleinschreibung werden abwechselnd. 124 00:10:15,450 --> 00:10:22,920 Also, bevor wir Ihnen eine zweite, noch in das Problem zu tauchen, 125 00:10:22,920 --> 00:10:32,420 was ist das erste, was wir tun müssen? 126 00:10:32,420 --> 00:10:36,900 Oh, was habe ich klicken Sie einfach auf? Oh, ich klickte auf einer E-Mail hier. 127 00:10:36,900 --> 00:10:42,870 Das erste, was wir tun müssen - ich freue an der falsche? 128 00:10:42,870 --> 00:10:49,320 Ist das Teil dieser ein? 129 00:10:49,320 --> 00:10:51,320 Nein, das sind noch drin, though. 130 00:10:51,320 --> 00:10:55,160 Okay, immer noch hier. 131 00:10:55,160 --> 00:11:03,160 Jetzt können wir nicht davon ausgehen, -? Ja. Hier können wir nicht davon ausgehen, dass es nur Kleinbuchstaben und Leerzeichen ist. 132 00:11:03,160 --> 00:11:07,770 So jetzt haben wir mit der Tatsache, dass die Briefe können, was wir sie haben wollen umzugehen. 133 00:11:07,770 --> 00:11:11,910 Und so ist die erste Sache, die wir tun möchten, ist nur die Meldung. 134 00:11:11,910 --> 00:11:19,790 Wir müssen nur einen String zu erhalten, string s = GetString, okay. 135 00:11:19,790 --> 00:11:24,890 Jetzt das Problem, es gibt ein paar Möglichkeiten, es zu tun. 136 00:11:24,890 --> 00:11:29,840 Aber wir gehen zu wollen, bitweisen Operatoren hier verwenden. 137 00:11:29,840 --> 00:11:35,280 Gibt es Menschen, die entweder nicht in der Oberabschnitt, 138 00:11:35,280 --> 00:11:37,480 oder so etwas, weiß und nicht wissen, was bitweisen Operatoren sind? 139 00:11:37,480 --> 00:11:41,710 Oder wie sie in ASCII beziehen in irgendeiner Weise? 140 00:11:41,710 --> 00:11:45,650 [Student] Ich war nicht in der Oberabschnitt, aber ich weiß, was bitweisen Operatoren sind. 141 00:11:45,650 --> 00:11:49,560 Okay. Also habe ich nicht über die Grundlagen von ihnen gehen, aber ich werde erklären, 142 00:11:49,560 --> 00:11:51,830 was wir gehen zu wollen, hier verwenden. 143 00:11:51,830 --> 00:11:59,680 So 'A': Binäre Darstellung des Kapitals A ist die Zahl 65. 144 00:11:59,680 --> 00:12:07,560 Ich werde einfach zu sehen - 41 wird 01000001 sein. 145 00:12:07,560 --> 00:12:14,170 So das sollte 65 in dezimal, so ist dies die binäre Darstellung des Charakters Kapital A. 146 00:12:14,170 --> 00:12:19,440 Jetzt, Kleinbuchstaben die binäre Darstellung der Zeichen 'A' 147 00:12:19,440 --> 00:12:33,350 wird dasselbe sein, fast. Ist, dass - 6, yeah. Das ist richtig. 148 00:12:33,350 --> 00:12:37,670 So binäre Kapital A, binäre Kleinbuchstaben 'a ". 149 00:12:37,670 --> 00:12:43,940 So fest, dass der Unterschied zwischen A und 'a' ist diese einzelnes Bit. 150 00:12:43,940 --> 00:12:49,440 Und dies geschieht, um die 32-Bit, das Bit, das die Nummer 32 sein. 151 00:12:49,440 --> 00:12:53,910 Und das macht Sinn, da A 65; 'a' ist 97. 152 00:12:53,910 --> 00:12:56,610 Der Unterschied zwischen ihnen ist 32. 153 00:12:56,610 --> 00:13:03,770 Jetzt wissen wir also, wir können von A bis 'a', indem A konvertieren 154 00:13:03,770 --> 00:13:09,710 und bitweise Verknüpfung es, mit - das sieht aus wie eine 1. 155 00:13:09,710 --> 00:13:20,900 Dies ist eine bitweise OR, mit 00100000, und dass wird uns 'a ". 156 00:13:20,900 --> 00:13:26,850 Und wir können von 'a' bis A erhalten durch bitweise UND-Verknüpfung 157 00:13:26,850 --> 00:13:33,700 mit 11, 0 an jenem Ort, 11111. 158 00:13:33,700 --> 00:13:43,840 So wird dies dann geben Sie uns genau das, was 'a' war, aber heben sich diese einzelnen Bits 159 00:13:43,840 --> 00:13:50,070 also müssen wir 01000001, ich weiß nicht, ob ich recht gezählt. 160 00:13:50,070 --> 00:13:56,750 Aber diese Technik der bitweisen ODER-Verknüpfung von Kapital zu erhalten, um Kleinbuchstaben 161 00:13:56,750 --> 00:14:02,080 und bitweise Verknüpfung von Kleinbuchstaben zu Kapital zu erhalten, ist nicht ausschließlich auf A. 162 00:14:02,080 --> 00:14:06,510 Alle Buchstaben, K vs k, Z vs z, 163 00:14:06,510 --> 00:14:10,080 alle sind eigentlich nur auf der diesem einzigen Bit unterscheiden. 164 00:14:10,080 --> 00:14:16,290 Und so können Sie verwenden, um von einem beliebigen Kleinbuchstaben jedem Großbuchstaben und umgekehrt. 165 00:14:16,290 --> 00:14:26,670 Okay. So eine einfache Möglichkeit, um von diesen - so anstatt 166 00:14:26,670 --> 00:14:32,170 schreiben, was 1011111 ist - eine einfache Art der Darstellung dieser Zahl und das ist nicht ein 167 00:14:32,170 --> 00:14:39,710 dass ich ging in der Oberabschnitt, aber Tilde (~) ist ein weiteres bitweisen Operator. 168 00:14:39,710 --> 00:14:42,520 Was ~ tut, ist es schaut auf die Bit-Darstellung. 169 00:14:42,520 --> 00:14:45,630 Nehmen wir eine beliebige Anzahl. 170 00:14:45,630 --> 00:14:53,130 Dies ist nur einige Binärzahl, und was ~ hat ist es nur Flips alle Bits. 171 00:14:53,130 --> 00:15:00,630 Das war also eine 1, jetzt eine 0, this a 0 ist, jetzt a 1, 010100. 172 00:15:00,630 --> 00:15:08,320 So, das ist alles ~ tut. So 32 wird die Zahl sein - loszuwerden, dass - 173 00:15:08,320 --> 00:15:23,320 so 32 wird die Zahl 00100000, und so ~ dies sein wird, 174 00:15:23,320 --> 00:15:29,980 diese Zahl hier, dass ich eine 'verknüpft mit. 175 00:15:29,980 --> 00:15:35,600 Hat jeder das sehen? Dies ist sehr verbreitet, wie wenn Sie wollen herausfinden, 176 00:15:35,600 --> 00:15:40,740 für spätere Dinge, die wir sehen werden könnte, wenn wir sehen, wenn wollen - 177 00:15:40,740 --> 00:15:44,710 oder wir wollen alles, jedes einzelne Bit gesetzt mit Ausnahme von 1 178 00:15:44,710 --> 00:15:47,910 Sie neigen dazu, der wenig, dass wir uns nicht festlegen möchten ~ tun. 179 00:15:47,910 --> 00:15:53,090 So wollen wir nicht die 32-Bit gesetzt, so dass wir von 32 nicht ~. 180 00:15:53,090 --> 00:15:57,790 Okay. So können wir alle die hier zu verwenden. 181 00:15:57,790 --> 00:16:03,000 Alle Rechte, so ist es in Ordnung, wenn du nicht fertig sind, werden wir langsam gehen über zusammen, 182 00:16:03,000 --> 00:16:11,870 oder über diese zu gehen, so - durch diese. Gehen Sie durch diese. 183 00:16:11,870 --> 00:16:20,790 So haben wir unsere Schnur, und wir wollen eine Schleife über jedes Zeichen in diesem String und etwas tun, um es. 184 00:16:20,790 --> 00:16:26,710 Also, wie machen wir eine Schleife über einen String? Was sollen wir benutzen? 185 00:16:26,710 --> 00:16:30,980 Ich werde mich nicht, es zu tun hier. Yeah. 186 00:16:30,980 --> 00:16:42,940 So habe ich meine iterator, und er sagte es, aber wie kann ich wissen, wie viele Zeichen in der Zeichenfolge? 187 00:16:42,940 --> 00:16:47,030 Strlen (s), dann i + +. 188 00:16:47,030 --> 00:16:49,860 Also, was ich hier gemacht haben ist nicht der beste Weg, Dinge zu tun. 189 00:16:49,860 --> 00:16:51,860 Weiß jemand, warum? 190 00:16:51,860 --> 00:16:55,290 Weil du die Überprüfung der Sprache der String jede einzelne Zeit. 191 00:16:55,290 --> 00:17:06,859 So wir wollen strlen zu bewegen, ich könnte sagen, hier, int length = strlen (s), 192 00:17:06,859 --> 00:17:11,900 und dann weiß i 00:17:20,410 Ich könnte auch int i = 0, length = strlen (s). 194 00:17:20,410 --> 00:17:25,010 Und dies ist etwas besser, denn jetzt habe ich den Umfang beschränkt, 195 00:17:25,010 --> 00:17:29,150 der mit variabler Länge, um nur dieses eine "for" Schleife statt Deklaration bevor 196 00:17:29,150 --> 00:17:34,990 und dass es existiert immer, und falls Sie nicht fangen, warum das so schlecht ist, 197 00:17:34,990 --> 00:17:39,410 oder warum das Original war schlecht, es ist - beginnen bei der for-Schleife. 198 00:17:39,410 --> 00:17:43,380 Ich überprüfte den Zustand. Ist i 00:17:46,790 So ist die Länge von s, lasst uns mit "hallo" die ganze Zeit arbeiten. 200 00:17:46,790 --> 00:17:49,670 So Länge s, h-E-l-l-o. Länge ist 5. 201 00:17:49,670 --> 00:17:57,580 So i = 0, Länge 5 ist, so dass ich nicht <5, so dass die Schleife weiter. 202 00:17:57,580 --> 00:18:02,750 Dann gehen wir wieder. Wir überprüfen den Zustand. Ist i 00:18:08,390 Also lasst uns prüfen die Länge hallo. H-E-l-l-o. Das ist 5; i nicht <5, so gehen wir wieder. 204 00:18:08,390 --> 00:18:13,330 So sind wir Berechnen wir hallo Zählen, für jede Iteration der Schleife, 205 00:18:13,330 --> 00:18:17,380 dachte sogar, es ist nie zu ändern, es ist immer zu 5 sein. 206 00:18:17,380 --> 00:18:22,530 Also haben wir nur daran erinnern, 5 vorne, und jetzt ist alles besser. 207 00:18:22,530 --> 00:18:24,990 So Iteration über die gesamte Zeichenfolge. 208 00:18:24,990 --> 00:18:31,470 Was wollen wir für jedes Zeichen des Strings zu tun? 209 00:18:31,470 --> 00:18:38,510 [Studenten gesprochen, unverständlich] 210 00:18:38,510 --> 00:18:47,000 Yeah. Also, wenn der Charakter ist nicht alphabetisch, dann wollen wir nur über sie zu überspringen. 211 00:18:47,000 --> 00:18:52,300 Da wir über Buchstaben des Alphabets nur kümmern, wir können nicht nutzen eine Nummer. 212 00:18:52,300 --> 00:19:10,850 Wie können wir also tun? So unser Zustand, also wenn wir etwas wollen - überprüfen, ob es alphabetischer ist. 213 00:19:10,850 --> 00:19:14,060 So, wie wir das kontrollieren? 214 00:19:14,060 --> 00:19:18,720 [Student] können Sie einfach die Funktion ist alpha. 215 00:19:18,720 --> 00:19:23,160 Ist die entweder in dieser oder jeder enthalten sind, wie, char.h oder so etwas? 216 00:19:23,160 --> 00:19:32,710 Lasst uns nicht die alpha-Funktion und die explizite - so haben wir s [i], 217 00:19:32,710 --> 00:19:40,460 das ist das achte Zeichen von s, daran erinnern, dass ein String ein Array von Zeichen ist, 218 00:19:40,460 --> 00:19:43,180 so das achte Zeichen von s. 219 00:19:43,180 --> 00:19:49,280 Wenn nun ein Großbuchstabe ist, wissen wir es muss in einem bestimmten Bereich liegen. 220 00:19:49,280 --> 00:19:54,370 Und was ist das Sortiment? 221 00:19:54,370 --> 00:20:07,860 Yeah. Also, wenn s [i] ist ≥ 65 und s [i] ≤ 90, was soll ich stattdessen tun? 222 00:20:07,860 --> 00:20:18,470 Yeah. So sollte man unbedingt noch nie brauchen, um die ASCII-Werte der jemals etwas wissen. 223 00:20:18,470 --> 00:20:25,640 Nie der Zahlen 65, 90, 97 und 102, oder was immer es ist zu denken. 224 00:20:25,640 --> 00:20:32,470 Sie müssen nicht - 112 - Sie brauchen nicht zu denen überhaupt wissen. Das ist auch falsch. 225 00:20:32,470 --> 00:20:41,940 Verwenden Sie nur die einfachen Anführungszeichen, Apostroph Konstanten. So 'A' und weniger als 90 'Z.' 226 00:20:41,940 --> 00:20:47,930 Und das ist deutlich besser - ich würde nicht wissen, aus der Spitze von meinem Kopf, dass Z 90 ist. 227 00:20:47,930 --> 00:20:52,690 Ich weiß aus der Spitze von meinem Kopf, dass 'Z' Hauptstadt Z. ist 228 00:20:52,690 --> 00:21:02,100 So lange, wie diese im Bereich von Kapital A zu Kapital Z, oder wir ist, kann für Kleinbuchstaben überprüfen, 229 00:21:02,100 --> 00:21:17,010 Oder wenn sie in dem Bereich ist ≥ 'a' und ≤ z. 230 00:21:17,010 --> 00:21:19,010 Also das ist unsere Bedingung. 231 00:21:19,010 --> 00:21:22,520 Der Stil, wo man diese Dinge gelegt variiert. 232 00:21:22,520 --> 00:21:29,520 Ich werde es so machen. 233 00:21:29,520 --> 00:21:31,520 Nun, was wollen wir tun? 234 00:21:31,520 --> 00:21:39,530 Wir wissen, dieser Brief ist ein Charakter, ein Buchstabe. 235 00:21:39,530 --> 00:21:46,270 Also müssen wir unterscheiden, ob dies nun ein Großbuchstabe oder ein Kleinbuchstabe sein abwechseln. 236 00:21:46,270 --> 00:21:48,820 Wie halten wir verfolgen, welche den wir wollen, dass es sein? 237 00:21:48,820 --> 00:21:55,520 [Schüler Stimmen, unverständlich] 238 00:21:55,520 --> 00:21:59,150 Also ja, aber lassen Sie mich nachsehen. 239 00:21:59,150 --> 00:22:04,910 Module 0-2 gesagt wurde, war ein Vorschlag rausgeschmissen, und ich stimme dem zu. 240 00:22:04,910 --> 00:22:11,780 Außer beachten Sie, dass, wie - ist dies der Fall? Yeah. 241 00:22:11,780 --> 00:22:18,270 Es ist jedes andere, aber wir können nicht Modul 2 i oder i mod 2, da 242 00:22:18,270 --> 00:22:22,950 feststellen, dass E Kapital ist und 'a' wird klein geschrieben? Aber es gibt ein Leerzeichen getrennt werden? 243 00:22:22,950 --> 00:22:27,150 So sie gehen, um die gleiche mod 2 sein, aber sie sind verschiedene Fälle. 244 00:22:27,150 --> 00:22:29,150 [Studenten Frage unverständlich] 245 00:22:29,150 --> 00:22:34,690 Yeah. So sind wir gerade dabei, einen Zähler zu halten. 246 00:22:34,690 --> 00:22:38,730 Wir könnten auch tun, dass in hier, wenn wir wollten, das könnte ein wenig unhandlich zu bekommen 247 00:22:38,730 --> 00:22:41,300 in der for-Schleife Erklärungen, ich werde die sie hier. 248 00:22:41,300 --> 00:22:48,840 So int count = 0 beginnt. 249 00:22:48,840 --> 00:22:54,070 Und jetzt werde ich zu zählen, wie viele alphabetischer Charaktere, die wir je hatten. 250 00:22:54,070 --> 00:22:59,550 Also werden wir unweigerlich zu zählen + +, da wir eine andere alphabetische Zeichen gefunden. 251 00:22:59,550 --> 00:23:09,130 Aber, jetzt sagst du, wenn count mod 2. 252 00:23:09,130 --> 00:23:12,590 Also, was wenn count mod 2? Oh. Ich werde == 0 für jetzt tun. 253 00:23:12,590 --> 00:23:21,740 Wir gehen auch über diese. Also, wenn Graf mod 2 == 0, was dann? 254 00:23:21,740 --> 00:23:27,830 [Studenten Antwort unverständlich] 255 00:23:27,830 --> 00:23:32,750 So wollen wir es am Ende in Großbuchstaben geschrieben. 256 00:23:32,750 --> 00:23:37,520 Es gibt 2 Fälle; Groß-und Kleinschreibung sind die 2 Fälle. 257 00:23:37,520 --> 00:23:40,990 Also, wenn wir in Kleinbuchstaben wir brauchen, um es in Großbuchstaben. 258 00:23:40,990 --> 00:23:43,710 Wenn es in Großbuchstaben ist brauchen wir nicht zu tun. 259 00:23:43,710 --> 00:23:50,760 Aber gibt es eine Möglichkeit - shouldn't haben umgedreht - 260 00:23:50,760 --> 00:23:54,800 dass wir nicht einmal zu prüfen, ob sie groß oder klein ist? 261 00:23:54,800 --> 00:24:02,240 Was können wir tun, um immer sicher, dass wir immer am Ende auf Großbuchstaben? 262 00:24:02,240 --> 00:24:07,830 So bemerken, was wir für Kleinbuchstaben "a" hat, was, wenn wir die gleiche genaue Sache angetan A Großbuchstaben? 263 00:24:07,830 --> 00:24:11,900 Hat Großbuchstaben Eine Änderung, oder hat den Wert ändern? 264 00:24:11,900 --> 00:24:23,100 Yeah. Also keine Großbuchstaben bitweise mit ~ 32 verknüpft wird, dass gleiche Großbuchstaben sein 265 00:24:23,100 --> 00:24:29,220 denn jeder Großbuchstabe das 32. Bit nicht gesetzt ist. 266 00:24:29,220 --> 00:24:40,920 Also, wenn wir die Zeichen s [i], wollen wir es geworden Klein-oder Großbuchstaben bringen wollen. 267 00:24:40,920 --> 00:24:46,890 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. 268 00:24:46,890 --> 00:24:54,290 Ich sagte dies in der Oberabschnitt: Sie können 32 verwenden, wenn Sie wollen, aber ich neige zu bevorzugen dabei "a" - A, 269 00:24:54,290 --> 00:25:01,150 Statt einfach nur 32, denn es kann jede andere Bit sein. 270 00:25:01,150 --> 00:25:03,610 Nach der 32-Bit, kann es eine von diesen sein, sonst hätten wir nicht genug 271 00:25:03,610 --> 00:25:05,840 Zahlen, um alle Zeichen repräsentieren. 272 00:25:05,840 --> 00:25:09,110 Also, wenn Sie die 32-Bit zu bekommen, könnte es die 64-Bit sein, es könnte die 128-Bit sein. 273 00:25:09,110 --> 00:25:13,990 Jede dieser Bits kann das Bit, das zwischen Groß-und Kleinschreibung unterscheidet sein. 274 00:25:13,990 --> 00:25:18,350 Ich sollte nicht zu wissen, dass es die 32-Bit ist. 275 00:25:18,350 --> 00:25:27,130 Ich kann dieses 'a' - A bis das Bit, das zwischen den beiden unterscheidet sich 276 00:25:27,130 --> 00:25:33,000 ohne auf die magische Zahl, die 32 ist verlassen. 277 00:25:33,000 --> 00:25:38,770 Und jetzt, sonst zählen war seltsam, und so was will ich tun? 278 00:25:38,770 --> 00:25:43,920 [Schüler Antworten unverständlich] 279 00:25:43,920 --> 00:25:45,920 [Student] Was ist das? 280 00:25:45,920 --> 00:25:49,850 Ich werde es in 1 Sekunde. 281 00:25:49,850 --> 00:25:55,690 So, jetzt, wenn ich will - ich will sicherstellen, dass die Zeichen jetzt Kleinbuchstaben 282 00:25:55,690 --> 00:26:04,140 Und so kann ich oder von 32 und 32 bedeutet 'a' - A. 283 00:26:04,140 --> 00:26:06,510 Beachten Sie aber, die von der gleichen Begründung wie der vorherige, dass, wenn 284 00:26:06,510 --> 00:26:11,670 der Brief war schon Kleinbuchstaben, dann Verknüpfung von 32 nur hält sie Kleinbuchstaben. 285 00:26:11,670 --> 00:26:16,220 Es hat nicht den ursprünglichen Charakter verändert. 286 00:26:16,220 --> 00:26:19,910 Aber jetzt habe ich nicht um nicht zu sagen: "Wenn es aus Kleinbuchstaben besteht, es einfach vergessen, 287 00:26:19,910 --> 00:26:23,650 wenn es in Großbuchstaben ist, dann ändern Sie es. " 288 00:26:23,650 --> 00:26:26,900 Es ist viel bequemer, dies zu tun. 289 00:26:26,900 --> 00:26:33,190 [Student] Würde diese Strategie der Subtraktion des Großbuchstaben aus dem Kleinbuchstaben Arbeit, wenn es nicht 32? 290 00:26:33,190 --> 00:26:35,330 Wenn ja, wie, 34 oder so etwas? 291 00:26:35,330 --> 00:26:41,840 Also, Sie müssen wissen, dass die Differenz zwischen dem 2 -? >> 1 Bit. 292 00:26:41,840 --> 00:26:49,840 Es könnte mehr als ein Bit sein, solange alle Bits unterhalb dieser Position identisch sind. 293 00:26:49,840 --> 00:26:58,500 So benötigen wir mindestens 26 Zeichen - oder gibt es 26 Zeichen. 294 00:26:58,500 --> 00:27:04,590 So benötigen wir mindestens 26 Zahlen, um den Unterschied darstellen - 295 00:27:04,590 --> 00:27:07,650 Die Differenz zwischen Ein-und 'a' hat, um mindestens 26 sein, 296 00:27:07,650 --> 00:27:10,760 sonst würden wir nicht alle den Kapitalmarkt Zahlen dargestellt haben. 297 00:27:10,760 --> 00:27:18,630 Das bedeutet, dass A, wenn wir bei 1 zu beginnen, es geht um all diese Bits zu verwenden, 298 00:27:18,630 --> 00:27:23,900 alle diese ersten 5 Bits, alles durch Z. stellen 299 00:27:23,900 --> 00:27:32,170 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 ". 300 00:27:32,170 --> 00:27:40,930 Das ist auch der Grund dafür, in ASCII-Tabelle gibt es 5 Symbole trennen Großbuchstaben von Kleinbuchstaben. 301 00:27:40,930 --> 00:27:49,050 Da das sind die Symbole, die extra 5, die bis bringt die 32 ist der Unterschied zwischen ihnen. 302 00:27:49,050 --> 00:27:51,840 [Student] So konnten wir es tun, weil ASCII diese Weise entwickelt wurde. 303 00:27:51,840 --> 00:27:57,280 Ja. Aber ASCII - der Unterschied könnte auch diese beiden Bits. 304 00:27:57,280 --> 00:28:12,040 Wie, wenn A waren 10000001, und 'a' war 11100001 - ich vergesse, was auch immer. 305 00:28:12,040 --> 00:28:18,100 Aber wenn es dies, dann könnten wir noch mit 'a' - A. 306 00:28:18,100 --> 00:28:22,650 Es ist gerade die Differenz zwischen A und 'a' ist diese noch 2 Bits. 307 00:28:22,650 --> 00:28:32,240 Ich denke, es 48 geschrieben ist. Ist es 32 + 64? Ich denke es ist? 308 00:28:32,240 --> 00:28:40,160 Jedes einzelnen Zeichens, wie, Z und z, K und k,; wäre es immer noch zwei Bits sein 309 00:28:40,160 --> 00:28:45,160 sie würden immer noch die gleiche genaue Bits außer für jene 2 Bits. 310 00:28:45,160 --> 00:28:48,870 So lange, wie das ist immer wahr, unabhängig davon, ob wir mit ASCII-oder ein anderes System sind, 311 00:28:48,870 --> 00:28:53,050 Solange es ist nur eine bestimmte Anzahl von Bits, die für jeden Charakter sind, 312 00:28:53,050 --> 00:28:55,050 dann ist das funktioniert gut. 313 00:28:55,050 --> 00:29:06,110 Es ist nur so, dass 32 bis wurde, weil es das erste, das wir möglicherweise nutzen könnte ist eingestellt. >> Cool. 314 00:29:06,110 --> 00:29:14,520 Ich neige dazu, es vorziehen, falls Sie noch nicht gesehen haben, wenn der Block ist nur eine einzige Zeile, 315 00:29:14,520 --> 00:29:24,280 Sie können loszuwerden der geschweiften Klammern, so dass ich eher zu bevorzugen, dies zu tun. 316 00:29:24,280 --> 00:29:34,010 Auch Sie wissen, wie wir die Dinge wie s [i] + = 1 zu tun? 317 00:29:34,010 --> 00:29:41,090 Sie können auch s [i] bitweise AND = 32. 318 00:29:41,090 --> 00:29:46,400 Und bitweise OR = 32. 319 00:29:46,400 --> 00:29:51,490 Auch zählen mod 2 == 0. 320 00:29:51,490 --> 00:30:00,900 Also denken Sie daran, dass - ich werde es nicht geschrieben - jeder Wert ungleich Null ist wahr, und 0 ist falsch. 321 00:30:00,900 --> 00:30:07,880 So ", wenn count mod 2 == 0" ist das gleiche wie zu sagen ", wenn nicht zählen mod 2". 322 00:30:07,880 --> 00:30:11,580 Ich würde wahrscheinlich einfach umgekehrt haben die Linien und sagte: "wenn count mod 2, 323 00:30:11,580 --> 00:30:15,350 Haben die OR 1, sonst die AND 1 ", so dass ich nicht brauchen die" nicht. " 324 00:30:15,350 --> 00:30:18,650 Aber das funktioniert genauso gut. 325 00:30:18,650 --> 00:30:25,660 Und was kann ich hier tun? 326 00:30:25,660 --> 00:30:29,060 Man könnte sie mit ternären kombinieren, wenn man wollte, dann aber die hatte gerade die Dinge messier 327 00:30:29,060 --> 00:30:33,770 und wahrscheinlich schwieriger zu lesen, so werden wir nicht tun. 328 00:30:33,770 --> 00:30:37,330 Jemand noch andere Vorschläge? 329 00:30:37,330 --> 00:30:41,580 Ist das alles, das Problem gefragt? Oh yeah. 330 00:30:41,580 --> 00:30:51,070 So loszuwerden, diese leeren Zeilen, jetzt werden wir f,% s zu drucken ist das eine für Streicher, 331 00:30:51,070 --> 00:30:56,620 Wir drucken f, s. 332 00:30:56,620 --> 00:30:59,330 Nun wollen wir ausführen. Habe ich etwas falsch gemacht? 333 00:30:59,330 --> 00:31:03,200 Das ist ein \ ", ich will eine n. 334 00:31:03,200 --> 00:31:07,840 Okay. Jetzt werden wir ausführen. Es wird wahrscheinlich schreien mich an. 335 00:31:07,840 --> 00:31:11,250 Strlen in string.h. 336 00:31:11,250 --> 00:31:14,290 Also das ist das Schöne an Clang ist es sagt Ihnen, was es in ist, 337 00:31:14,290 --> 00:31:19,140 anstelle von GCC, die nur sagt: "Hey, du etwas vergessen, ich weiß nicht, was es war." 338 00:31:19,140 --> 00:31:29,220 Aber das wird mir zu sagen, "Du wolltest string.h gehören." 339 00:31:29,220 --> 00:31:32,130 So dass ich nicht für alles fordert, so ist es nicht etwas zu sagen. 340 00:31:32,130 --> 00:31:42,540 Aber wir werden ihrem Beispiel zu tun ", thanks 4 the add". 341 00:31:42,540 --> 00:31:47,880 Das sieht richtig. Hooray. 342 00:31:47,880 --> 00:31:52,370 So Rückkehr zu Ihrem wichtigsten, fast hätte ich es nie tun. 343 00:31:52,370 --> 00:31:57,110 Es ist optional. Und Haupt ist die einzige Funktion, für die es optional. 344 00:31:57,110 --> 00:32:07,140 Wenn Sie nicht zurückgeben nichts von der Hauptstraße, wird davon ausgegangen, dass Sie auf 0 zurück gemeint. 345 00:32:07,140 --> 00:32:13,070 Haben Sie Fragen? 346 00:32:13,070 --> 00:32:20,980 Okay. So, jetzt das zweite Problem. 347 00:32:20,980 --> 00:32:24,810 "Von Woche 2 der zweiten Vortrag, dass Swapping 2 Variablen" Werte Recall, indem 348 00:32:24,810 --> 00:32:30,780 diese 2 Variablen an eine Funktion (selbst wenn es swap) nicht genau so funktionieren, zumindest nicht ohne 'Zeiger'. " 349 00:32:30,780 --> 00:32:37,020 Und ignorieren Zeigern, bis wir sie bekommen. 350 00:32:37,020 --> 00:32:40,070 Wir wollen 2 Variablen vertauschen; wir nicht mit einer Funktion zu tun. 351 00:32:40,070 --> 00:32:43,410 Wir sind immer noch dabei, es in main tun, wie sie sagt. 352 00:32:43,410 --> 00:32:48,360 Aber um die 2 Variablen verwenden, wollen wir nicht, um eine temporäre Variable verwenden. 353 00:32:48,360 --> 00:32:50,770 Es gibt 2 Möglichkeiten, dies zu tun. 354 00:32:50,770 --> 00:32:56,310 Sie können es mit Ihrem traditionellen binären Operatoren. 355 00:32:56,310 --> 00:33:00,180 So hat jemand eine schnelle und schmutzige Weise, das zu tun? 356 00:33:00,180 --> 00:33:07,650 Es könnte tatsächlich eine Minute dauern, des Denkens. Wenn ich - 357 00:33:07,650 --> 00:33:12,130 Ich werde eingestellt, das Problem auf wie sie fragen. Also, wenn ich 2 Variablen, A, ist das nur eine Zahl 358 00:33:12,130 --> 00:33:17,800 dass sie mir geben, und die Summe der Variablen B, die eine andere Zahl, die ich gegeben habe, ist. 359 00:33:17,800 --> 00:33:22,700 Also, wenn ich diese 2 Variablen haben, jetzt will ich sie zu tauschen. 360 00:33:22,700 --> 00:33:31,550 Das traditionelle, mit Ihrem normalen binären Operatoren, ich meine, wie +, -, ÷. 361 00:33:31,550 --> 00:33:36,630 Nicht bitweisen Operatoren, die auf binären handeln. 362 00:33:36,630 --> 00:33:39,600 Also mit -, +, ÷, und all jene. 363 00:33:39,600 --> 00:33:52,980 Wir könnten etwas wie Swap a = a + b und b = a - b, a = a - b. 364 00:33:52,980 --> 00:34:04,260 So überprüfen Vernunft, und dann werden wir, warum das funktioniert. 365 00:34:04,260 --> 00:34:13,320 Nehmen wir an, a = 7, b = 3 ist, dann a + b werde 10 sein wird. 366 00:34:13,320 --> 00:34:18,820 So wir nun Setzen eines = 10, und dann tun wir b = a - b. 367 00:34:18,820 --> 00:34:30,250 So tun wir b = a - b, die wird bis 7 sein, und b = a - b wieder 368 00:34:30,250 --> 00:34:38,650 oder a = a - b. Welche wird 10 sein - 7, 3 ist. 369 00:34:38,650 --> 00:34:44,850 So jetzt korrekt, "a" betrug 7, b betrug 3 und 7 ist nun b und "a" gleich 3 ist. 370 00:34:44,850 --> 00:34:48,679 So daß Art sinnvoll; 'a' ist die Kombination der zwei Zahlen. 371 00:34:48,679 --> 00:34:53,000 An diesem Punkt, 'a' ist die Kombination, und dann sind wir Subtrahieren der ursprünglichen b, 372 00:34:53,000 --> 00:34:56,860 und dann sind wir abgezogen, was war die ursprüngliche 'a ". 373 00:34:56,860 --> 00:35:01,150 Aber dies bedeutet nicht für alle Zahlen. 374 00:35:01,150 --> 00:35:08,880 Um dies zu sehen, betrachten wir ein System, so denken wir normalerweise an Ganzzahlen als 32 Bit. 375 00:35:08,880 --> 00:35:13,050 Lasst uns auf etwas, das nur wie 4 Bits ist zu arbeiten. 376 00:35:13,050 --> 00:35:15,450 Hoffentlich komme ich mit einem guten Beispiel gerade jetzt. 377 00:35:15,450 --> 00:35:18,680 Also, ich weiß, das wird nicht einfach. 378 00:35:18,680 --> 00:35:26,720 Lassen Sie uns sagen, dass unsere 2-Nummern sind 1111 und 1111, so dass wir in binärer jetzt. 379 00:35:26,720 --> 00:35:34,630 In tatsächlichen Dezimalstellen, wenn Sie daran denken, dass so wollen, a = 15 und b = 15. 380 00:35:34,630 --> 00:35:37,630 Und so erwarten wir, nachdem wir sie zu tauschen - sie haben noch nicht einmal, um die gleichen Zahlen, 381 00:35:37,630 --> 00:35:41,140 aber ich habe es auf diese Weise. 382 00:35:41,140 --> 00:35:47,100 Lasst uns ihnen nicht die gleichen Zahlen. Lasst uns 1111 und 0001. 383 00:35:47,100 --> 00:35:51,860 So a = 15 und b = 1 ist. 384 00:35:51,860 --> 00:35:57,670 Nachdem wir sie tauschen, erwarten wir 'a' bis 1 sein und b bis 15 sein. 385 00:35:57,670 --> 00:36:01,780 Unser erster Schritt ist a = a + b. 386 00:36:01,780 --> 00:36:08,770 Unsere Zahlen sind nur 4 Bit breit, so 'a', die 1111 ist, + b, die 0001 ist, 387 00:36:08,770 --> 00:36:16,780 wird am Ende als 10000, aber wir haben nur 4 Bits. 388 00:36:16,780 --> 00:36:22,540 So, jetzt a = 0 ist. 389 00:36:22,540 --> 00:36:34,080 Und nun wollen wir um b = a - b - eigentlich das noch klappt perfekt. 390 00:36:34,080 --> 00:36:39,630 a = a - b - mal sehen, ob das funktioniert perfekt. 391 00:36:39,630 --> 00:36:53,720 Also b = 0 bis 1, die noch 15 wäre, und dann a = a - b, würde die 1 sein. 392 00:36:53,720 --> 00:36:56,210 Vielleicht funktioniert. 393 00:36:56,210 --> 00:36:59,020 Ich fühle mich wie es gibt einen Grund es nicht funktioniert mit regulären. 394 00:36:59,020 --> 00:37:06,400 Okay, so arbeitet auf der Annahme, dass es nicht mit regulären binären Operationen arbeiten, 395 00:37:06,400 --> 00:37:15,040 und ich werde suchen - ich werde Google zu sehen, ob das wahr ist. 396 00:37:15,040 --> 00:37:23,490 So wollen wir es zu tun mit bitweisen Operatoren und der Schlüssel ist hier XOR. 397 00:37:23,490 --> 00:37:28,780 Also, Einführung XOR (^), wenn Sie es noch nicht gesehen. 398 00:37:28,780 --> 00:37:34,610 Es ist wieder eine bitweise Operator so wirkt es Stück für Stück, und es ist - 399 00:37:34,610 --> 00:37:39,910 Wenn Sie die Bits 0 und 1 haben, dann wird dies 1 sein. 400 00:37:39,910 --> 00:37:45,230 Wenn Sie die Bits 1 und 0 haben, wird es 1 sein, muss man die Bits 0 und 0 es 0 sein werde, 401 00:37:45,230 --> 00:37:47,640 und wenn man die Bits 1 und 1 haben, es wird 0 sein. 402 00:37:47,640 --> 00:37:56,180 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. 403 00:37:56,180 --> 00:37:59,320 OR hätte dies ein, wäre XOR haben diese 0 sein. 404 00:37:59,320 --> 00:38:02,250 Also werden wir gehen zu wollen, XOR hier verwenden. 405 00:38:02,250 --> 00:38:09,960 Denken Sie darüber für eine Minute, ich bin zu Google gehen. 406 00:38:09,960 --> 00:38:16,230 Nun, man kann nicht gelesen, dass, ich bin derzeit auf der XOR-Swap-Algorithmus Seite. 407 00:38:16,230 --> 00:38:21,340 Hoffentlich wird dies erklären, warum ich kann nicht - 408 00:38:21,340 --> 00:38:34,190 Das ist genau der Algorithmus, dass wir gerade getan. 409 00:38:34,190 --> 00:38:37,330 Ich weiß immer noch nicht, warum - ich muss nur abgeholt haben ein schlechtes Beispiel, 410 00:38:37,330 --> 00:38:44,940 aber dieser Fall, wo 'a' passiert auf 0 zu werden, nach dem Aufstehen um 5 Bits, so dass nun 'a' 0 ist, 411 00:38:44,940 --> 00:38:48,730 das ist, was heißt "Integer Overflow". 412 00:38:48,730 --> 00:38:54,370 Laut Wikipedia: "Anders als die XOR Swap erfordert diese Variante, dass es einige Methoden verwendet 413 00:38:54,370 --> 00:38:59,780 zu gewährleisten, dass x + y nicht zu einem Integer-Überlauf. " 414 00:38:59,780 --> 00:39:08,350 Also das macht Probleme haben, das war Integer-Überlauf, aber ich habe etwas falsch gemacht. 415 00:39:08,350 --> 00:39:10,520 Ich bin nicht sicher. Ich werde versuchen, sich mit einem anderen. 416 00:39:10,520 --> 00:39:13,640 [Student] Nun, das ist nicht Integer-Überlauf, wenn Sie versuchen, eine Reihe in es gesetzt sind 417 00:39:13,640 --> 00:39:16,640 größer als die Menge an Bits, die Sie zugeordnet haben? 418 00:39:16,640 --> 00:39:23,730 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. 419 00:39:23,730 --> 00:39:26,690 Aber das fünfte Bit bekommt nur abgeschnitten, yeah. 420 00:39:26,690 --> 00:39:28,970 Es könnte tatsächlich - 421 00:39:28,970 --> 00:39:33,010 [Student] Heißt werfen Sie einen Fehler, oder tut, dass - wäre das zu werfen einen Fehler entdeckt? 422 00:39:33,010 --> 00:39:40,720 Nr. Also gibt es keinen Fehler. Wenn Sie zu Montage-Ebene zu erhalten, ein spezielles Bit 423 00:39:40,720 --> 00:39:47,020 irgendwo einstellen, dass sagte, es sei ein Überlauf, aber in C Sie Art einfach nicht damit umgehen. 424 00:39:47,020 --> 00:39:55,160 Sie können tatsächlich nicht mit ihm handeln, sofern Sie spezielle Montageanleitung in C. 425 00:39:55,160 --> 00:39:58,110 Lassen Sie uns über XOR Swap denken. 426 00:39:58,110 --> 00:40:02,220 Und ich denke, die Wikipedia-Artikel hätte auch gesagt, dass - 427 00:40:02,220 --> 00:40:07,310 So brachte auch modulare Arithmetik, so dass ich glaube, ich war in der Theorie, tut modulare Arithmetik 428 00:40:07,310 --> 00:40:11,160 als ich sagte, dass 0 - 1 15 wieder. 429 00:40:11,160 --> 00:40:15,410 So dass möglicherweise tatsächlich - auf einer regelmäßigen Prozessor, 0 tut - 1 = 15. 430 00:40:15,410 --> 00:40:20,430 Da landen wir bei 0, haben wir 1 subtrahieren, so dann ist es nur hüllt sich wieder um bis 1111. 431 00:40:20,430 --> 00:40:28,930 So dieser Algorithmus könnte tatsächlich funktionieren, die a + b, die a - b, b - a;, die in Ordnung sein könnte. 432 00:40:28,930 --> 00:40:34,030 Aber es gibt einige Prozessoren, die das nicht tun, und so wäre es nicht in diesen spezifischen diejenigen gut. 433 00:40:34,030 --> 00:40:39,880 XOR Swap läuft auf jedem Prozessor arbeiten. Okay. 434 00:40:39,880 --> 00:40:42,280 Die Idee ist, dass es soll gleich sein, obwohl. 435 00:40:42,280 --> 00:40:50,120 Wo wir sind mit XOR irgendwie die Informationen erhalten, sowohl in 1 der Variablen, 436 00:40:50,120 --> 00:40:54,120 und ziehen Sie dann die Informationen der einzelnen Variablen wieder. 437 00:40:54,120 --> 00:41:04,330 So hat jemand Ideen / die Antwort? 438 00:41:04,330 --> 00:41:14,540 [Schüler Antwort unverständlich] 439 00:41:14,540 --> 00:41:22,220 So, das sollte funktionieren, und auch, XOR kommutativ. 440 00:41:22,220 --> 00:41:27,620 Unabhängig von welcher Reihenfolge diese 2 Zahlen zufällig in hier zu sein, 441 00:41:27,620 --> 00:41:30,100 Dieses Ergebnis wird die gleiche sein. 442 00:41:30,100 --> 00:41:35,800 So a ^ b ist b ^ a. 443 00:41:35,800 --> 00:41:51,860 Vielleicht haben Sie auch sehen dies als schriftliche a ^ = b, b ^ = a, a ^ = b wieder. 444 00:41:51,860 --> 00:42:00,200 Also das ist richtig, und zu sehen, warum das funktioniert, der Bits denken. 445 00:42:00,200 --> 00:42:10,400 Mit einer kleineren Zahl, sagen wir 11.001 und 01.100. 446 00:42:10,400 --> 00:42:12,790 Also das ist 'a', das ist b. 447 00:42:12,790 --> 00:42:15,540 So a ^ = b. 448 00:42:15,540 --> 00:42:22,380 Wir gehen zu setzen 'A' = der XOR dieser 2 Dinge. 449 00:42:22,380 --> 00:42:32,920 So 1 ^ 0 = 1 ist; 1 ^ 1 0 ist; 0 ^ 1 1 ist, und 0 * 0 0 ist; 1 ^ 0 = 1 ist. 450 00:42:32,920 --> 00:42:37,380 So 'a,' wenn man sich die Dezimalzahl aussehen, es geht um sein - 451 00:42:37,380 --> 00:42:41,160 du wirst doch nicht zu viel von einer Beziehung zwischen dem ursprünglichen "a" und dem neuen See 'ein' 452 00:42:41,160 --> 00:42:45,600 aber wenn man die Bits, 'a' ist nun wie ein Geflecht aus den Informationen 453 00:42:45,600 --> 00:42:49,970 sowohl der Original-"a" und der ursprünglichen b. 454 00:42:49,970 --> 00:42:57,930 Also, wenn wir b ^ a, sehen wir, dass wir am Ende mit dem ursprünglichen "ein. 455 00:42:57,930 --> 00:43:08,910 Und wenn wir das Original 'a' ^ die neue 'a,' sehen wir landen wir in der ursprünglichen b. 456 00:43:08,910 --> 00:43:18,380 So (a ^ b) ^ b = der ursprünglichen "a". 457 00:43:18,380 --> 00:43:27,910 Und (a ^ b) ^ a = die ursprüngliche b. 458 00:43:27,910 --> 00:43:37,010 Es gibt - einen anderen Weg zu sehen ist dies nichts XOR selbst ist immer 0. 459 00:43:37,010 --> 00:43:45,020 So 1101 ^ 1101, werden alle Bits würde die gleiche sein. 460 00:43:45,020 --> 00:43:47,920 So gibt es nie einen Fall, wo 1 ist eine 0 und der andere ist 1 sein. 461 00:43:47,920 --> 00:43:51,080 Also das ist 0000. 462 00:43:51,080 --> 00:43:57,240 Dasselbe mit diesem. (A ^ b) ^ b ist wie a ^ (b ^ b). 463 00:43:57,240 --> 00:44:03,680 (B ^ b) wird auf 0 gesetzt werden; a ^ 0 wird nur noch zu 'a,' da alle Bits 0 sind. 464 00:44:03,680 --> 00:44:08,050 So sind die einzigen, die sein werden, wo 'a' war ursprünglich ein 1 - hatten diejenigen. 465 00:44:08,050 --> 00:44:12,070 Und die gleiche Idee hier, ich bin mir ziemlich sicher, dass es auch kommutativ. 466 00:44:12,070 --> 00:44:17,590 Yeah. Ich habe also vor, dass es kommutativen war. 467 00:44:17,590 --> 00:44:24,680 Das ^ 'a,' und es ist assoziativ, so dass nun (b ^ a) ^ a. 468 00:44:24,680 --> 00:44:28,970 Und wir tun können, b ^ (a ^ a). 469 00:44:28,970 --> 00:44:31,540 Und so wieder, erhalten wir den ursprünglichen b. 470 00:44:31,540 --> 00:44:37,120 So 'a' ist nun die Kombination von 'a' und b zusammen. 471 00:44:37,120 --> 00:44:49,660 Mit unserem neuen Combo 'a' sagen wir b = Combo 'a' ^ die ursprüngliche b, erhalten wir die original 'ein. " 472 00:44:49,660 --> 00:45:05,170 Und nun a = Combo 'a' ^ die neue b, die das Original war - oder was ist nun, was war 'a' oder b. 473 00:45:05,170 --> 00:45:13,620 Das ist in diesem Fall hier unten. Dies ist = b, alte b. 474 00:45:13,620 --> 00:45:16,550 So, jetzt ist alles wieder in vertauschter Reihenfolge. 475 00:45:16,550 --> 00:45:22,960 Wenn wir sah tatsächlich an den Bits, b = a ^ b, wird diese 2 XOR, 476 00:45:22,960 --> 00:45:33,920 und die Antwort wird das sein, und dann a = a ^ b ist XORing diese 2 und die Antwort ist. 477 00:45:33,920 --> 00:45:41,090 Haben Sie Fragen? Okay. So der letzte ist etwas wesentlich erschwert. 478 00:45:41,090 --> 00:45:43,180 [Student] Ich glaube, er hat eine Frage. >> Oh, sorry. 479 00:45:43,180 --> 00:45:49,380 [Student] Was ist eigentlich schneller? Wenn Sie diese XOR verwenden, oder ist es, wenn Sie eine neue Variable zu deklarieren? 480 00:45:49,380 --> 00:45:55,190 Also, was ist eigentlich schneller, erklärt eine neue Variable oder mit XOR zu tauschen? 481 00:45:55,190 --> 00:45:59,600 Die Antwort ist, aller Wahrscheinlichkeit nach, eine temporäre Variable. 482 00:45:59,600 --> 00:46:05,780 Und das ist, denn wenn es nach unten zusammengestellt - so bei der Montage Ebene 483 00:46:05,780 --> 00:46:12,320 es gibt nicht so etwas wie lokale Variablen oder irgendwelche temporären Variablen oder alle von diesem Zeug. 484 00:46:12,320 --> 00:46:16,060 Sie sind wie - es gibt Speicher, und es gibt Registern. 485 00:46:16,060 --> 00:46:20,920 Register sind, wo die Dinge aktiv passiert. 486 00:46:20,920 --> 00:46:24,750 Sie fügen Sie nicht 2 Dinge im Speicher; fügen Sie 2 Dinge in Registern. 487 00:46:24,750 --> 00:46:28,160 Und Sie bringen die Dinge aus dem Speicher in die Register, um dann hinzuzufügen, 488 00:46:28,160 --> 00:46:33,180 und dann könnten Sie legte sie zurück in den Speicher, aber die Handlung geschieht in Registern. 489 00:46:33,180 --> 00:46:38,750 Also, wenn Sie mit der temporären Variable Ansatz, in der Regel, was passiert ist 490 00:46:38,750 --> 00:46:42,810 diese 2 Nummern sind bereits in Registern. 491 00:46:42,810 --> 00:46:46,570 Und dann von diesem Punkt an, nachdem Sie sie vertauscht, 492 00:46:46,570 --> 00:46:51,540 es wird nur beginnen mit dem anderen Register. 493 00:46:51,540 --> 00:46:56,510 Überall, wo Sie hatte mit worden b, wird es einfach die Register, die bereits die Speicherung wurde 'a ". 494 00:46:56,510 --> 00:47:02,180 So ist es nicht müssen etwas tatsächlich tun die Swap tun. Yeah? 495 00:47:02,180 --> 00:47:05,690 [Student] Aber es braucht auch mehr Speicher, nicht wahr? 496 00:47:05,690 --> 00:47:10,280 Es dauert nur mehr Speicher, wenn es um diese temporäre Variable speichern muss. 497 00:47:10,280 --> 00:47:14,830 Wie, wenn Sie später, dass temporäre Variable wieder irgendwo, 498 00:47:14,830 --> 00:47:18,920 dann - oder weisen Sie etwas in diesem temporären Variablen. 499 00:47:18,920 --> 00:47:24,630 Dann, wenn er zu jedem Zeitpunkt "a", b in temp haben unterschiedliche Werte oder etwas, 500 00:47:24,630 --> 00:47:30,680 dann wird es zu verschiedenen Orten im Speicher haben, aber es ist wahr, dass 501 00:47:30,680 --> 00:47:34,800 Es gibt viele lokale Variablen, die nur in den Registern existieren wird. 502 00:47:34,800 --> 00:47:44,370 In diesem Fall ist es nie in den Speicher zu schreiben, und so Sie nie Verschwendung von Speicherplatz. 503 00:47:44,370 --> 00:47:58,620 Okay. Letzte Frage ist ein bisschen mehr. 504 00:47:58,620 --> 00:48:04,850 Deshalb hier in diesem CS50 Gerät besteht ein Wörterbuch. 505 00:48:04,850 --> 00:48:12,390 Und der Grund dafür ist, dass [? B66] ist eine Rechtschreibprüfung, wo Sie schreiben werde 506 00:48:12,390 --> 00:48:15,780 mit Hash-Tabellen oder versucht oder eine Datenstruktur. 507 00:48:15,780 --> 00:48:22,660 Du wirst schriftlich eine Rechtschreibprüfung und du gehst zu verwenden dieses Wörterbuch zu tun. 508 00:48:22,660 --> 00:48:28,280 Aber für dieses Problem, wir sind nur gut aussehen, um zu sehen, wenn ein einzelnes Wort im Wörterbuch. 509 00:48:28,280 --> 00:48:31,250 Also anstatt zu speichern das gesamte Wörterbuch in irgendeiner Datenstruktur 510 00:48:31,250 --> 00:48:35,180 und dann mit Blick auf das gesamte Dokument zu sehen, ob alles ist falsch, 511 00:48:35,180 --> 00:48:38,490 Wir wollen einfach nur ein Wort zu finden. So können wir einfach scannen über das gesamte Wörterbuch 512 00:48:38,490 --> 00:48:44,300 und wenn wir nie das Wort im gesamten Wörterbuch, dann war es nicht drin. 513 00:48:44,300 --> 00:48:52,150 Wenn wir scannen über das gesamte Wörterbuch und die das Wort sehen, dann sind wir gut sind, fanden wir es. 514 00:48:52,150 --> 00:48:56,580 Es heißt hier, dass wir beginnen, C die Datei-Handling-Funktion wollen, 515 00:48:56,580 --> 00:48:59,930 da wollen wir das Wörterbuch zu lesen, 516 00:48:59,930 --> 00:49:07,680 aber ich werde den Tipp geben hier um die Funktionen, die Sie denken sollten. 517 00:49:07,680 --> 00:49:11,510 Ich werde sie auf Spaces schreiben. 518 00:49:11,510 --> 00:49:20,490 So die wichtigsten sind Sie wollen an die f öffnen und dann zwangsläufig geschlossen f suchen, 519 00:49:20,490 --> 00:49:26,540 was wird am Ende Ihres Programms gehen, und f Scan f. 520 00:49:26,540 --> 00:49:31,060 Sie könnten auch f zu lesen, aber Sie wahrscheinlich nicht wollen, 521 00:49:31,060 --> 00:49:34,200 denn das - Sie müssen nicht am Ende brauchen, dass. 522 00:49:34,200 --> 00:49:41,880 F-Scan f ist, was du gehst zu verwenden, um Scan über das Wörterbuch. 523 00:49:41,880 --> 00:49:46,370 Und damit Sie nicht brauchen, um Code bis die Lösung, nur versuchen und wie Pseudo-Code den Weg 524 00:49:46,370 --> 00:50:05,200 zu einer Lösung, und dann werden wir darüber diskutieren. 525 00:50:05,200 --> 00:50:14,110 Und tatsächlich, da habe ich Ihnen bereits diese, wenn Sie in einem beliebigen Terminal oder Ihre Appliance Shell gehen, 526 00:50:14,110 --> 00:50:18,250 Ich würde - ich normalerweise - wenn Sie noch nicht gesehen haben, weiß ich nicht, ob du in der Klasse haben, 527 00:50:18,250 --> 00:50:23,490 aber der Mensch, so die Manpages sind ziemlich nützlich für das Betrachten ziemlich jede Funktion. 528 00:50:23,490 --> 00:50:27,330 So kann ich tun, wie der Mensch f, Scan f. 529 00:50:27,330 --> 00:50:32,300 Dies ist nun die Informationen über die Scan-f Familie von Funktionen. 530 00:50:32,300 --> 00:50:37,070 Ich könnte auch ein Mann f, offen, und dass gibt mir die Details davon. 531 00:50:37,070 --> 00:50:40,750 Also, wenn Sie wissen, welche Funktion Sie verwenden, oder Sie lesen Code 532 00:50:40,750 --> 00:50:43,000 und sehen Sie einige Funktionen und du bist wie, "Was tun hat?" 533 00:50:43,000 --> 00:50:45,280 Nur der Mensch, daß Name der Funktion. 534 00:50:45,280 --> 00:50:47,340 Es gibt ein paar seltsame Beispiele, wo Sie zu sagen haben könnte 535 00:50:47,340 --> 00:50:51,620 mögen. Mann 2 diese Funktion Namen, oder man 3 diese Funktion Name, 536 00:50:51,620 --> 00:50:58,230 aber Sie haben nur zu tun, wenn man Namen der Funktion geschieht nicht, um die erste Zeit zu arbeiten. 537 00:50:58,230 --> 00:51:03,010 [Student] So lese ich die Manpage für offen, aber ich bin immer noch auf, wie es und das Programm verwenden verwirrt. 538 00:51:03,010 --> 00:51:06,170 Okay. Ein großer Teil der Menschen Seiten sind weniger als hilfreich. 539 00:51:06,170 --> 00:51:08,470 Sie sind hilfreich, wenn Sie bereits wissen, was sie tun 540 00:51:08,470 --> 00:51:12,670 und dann müssen Sie nur die Reihenfolge der Argumente oder etwas zu erinnern. 541 00:51:12,670 --> 00:51:17,640 Oder sie kann Ihnen einen allgemeinen Überblick, aber einige von ihnen sind sehr überwältigend. 542 00:51:17,640 --> 00:51:22,220 Wie f Scan f, auch. Es gibt Ihnen die Informationen für all diese Funktionen, 543 00:51:22,220 --> 00:51:28,120 und 1 Zeile hier unten passiert, zu sagen, "F-Scan f liest den String Punkt oder Strom." 544 00:51:28,120 --> 00:51:32,360 Aber f öffnen. So, wie würden wir f offen? 545 00:51:32,360 --> 00:51:38,470 Die Idee, ein Programm, das die Datei zu tun braucht I / O ist, dass 546 00:51:38,470 --> 00:51:45,070 müssen Sie zuerst die gewünschte Datei, um Dinge zu tun zu öffnen, und unvermeidlich, 547 00:51:45,070 --> 00:51:51,220 Lesen, was aus dieser Datei und tun Dinge mit ihnen. 548 00:51:51,220 --> 00:51:55,350 F offen ist, was wir, um die Datei zu öffnen. 549 00:51:55,350 --> 00:52:04,190 Das, was wir zurück zu bekommen, so was Datei, die wir öffnen wollen, es gibt uns die - 550 00:52:04,190 --> 00:52:11,970 hier heißt es "/ user / share / dict / words." 551 00:52:11,970 --> 00:52:16,740 Dies ist die Datei, die wir öffnen möchten, und wir wollen sie zu öffnen - 552 00:52:16,740 --> 00:52:21,440 müssen wir explizit angeben, ob wir zu öffnen, es zu lesen, oder wenn wir öffnen möchten sie schreiben wollen. 553 00:52:21,440 --> 00:52:26,490 Es gibt ein paar Kombinationen und solche Sachen, aber wir wollen diese zum Lesen zu öffnen. 554 00:52:26,490 --> 00:52:29,380 Wir wollen aus der Datei gelesen. 555 00:52:29,380 --> 00:52:34,290 Was bedeutet diese Rückkehr? Es gibt eine Datei Stern (*), 556 00:52:34,290 --> 00:52:37,260 und ich werde einfach alles zeigen in der Variablen f, so * 557 00:52:37,260 --> 00:52:40,840 wieder, es ist ein Zeiger, aber wir wollen nicht mit Zeigern umgehen. 558 00:52:40,840 --> 00:52:46,470 Sie können sich denken, wie f, f ist jetzt die Variable, die Sie verwenden, um die Datei stellen sind. 559 00:52:46,470 --> 00:52:49,850 Also, wenn Sie aus der Datei lesen wollen, lesen Sie von f. 560 00:52:49,850 --> 00:52:54,820 Wenn Sie die Datei schließen möchten, schließen Sie f. 561 00:52:54,820 --> 00:53:00,350 So am Ende des Programms, wenn wir unweigerlich wollen die Datei zu schließen, was sollen wir tun? 562 00:53:00,350 --> 00:53:06,750 Wir wollen f schließen. 563 00:53:06,750 --> 00:53:12,600 So, jetzt die letzte Datei-Funktion, dass wir gehen zu wollen, verwenden Scan f, f Scan f. 564 00:53:12,600 --> 00:53:20,930 Und was das tut, ist es über die Datei auf der Suche nach einem Muster zu entsprechen sucht. 565 00:53:20,930 --> 00:53:39,100 Mit Blick auf die Manpage hier, wir int f Scan f sehen, ignorieren Sie den Rückgabewert für jetzt. 566 00:53:39,100 --> 00:53:45,230 Das erste Argument ist die Datei * stream, so das erste Argument wir weitergeben möchten sind f. 567 00:53:45,230 --> 00:53:47,900 Wir über f Scannen. 568 00:53:47,900 --> 00:53:53,680 Das zweite Argument ist eine Format-String. 569 00:53:53,680 --> 00:53:58,310 Ich gebe Ihnen einen Format-String richtig. 570 00:53:58,310 --> 00:54:05,180 Ich denke, wir passieren zu sagen, 127s \ n, eine Menge, die unnötig ist. 571 00:54:05,180 --> 00:54:12,490 Die Idee, was das Format-String ist, können Sie der Scan-f als das Gegenteil von Druck f denken. 572 00:54:12,490 --> 00:54:17,160 So drucken f, Print-f verwenden wir auch diese Art von Format-Parameter, 573 00:54:17,160 --> 00:54:25,000 aber in Druck f, was wir tun, ist - lasst uns bei einer äquivalenten aussehen. 574 00:54:25,000 --> 00:54:32,550 So drucken Sie f, und es gibt eigentlich auch f Druck f, wo das erste Argument werde f sein wird. 575 00:54:32,550 --> 00:54:40,980 Wenn Sie f drucken, könnten wir etwas sagen wie "print 127s \ n" und dann, wenn wir es weiter eine Schnur, 576 00:54:40,980 --> 00:54:44,050 es geht um diese Zeichenfolge und dann eine neue Zeile zu drucken. 577 00:54:44,050 --> 00:54:49,690 Was 127 bedeutet, ich bin mir ziemlich sicher, aber ich habe mich nie darauf beschränkt, 578 00:54:49,690 --> 00:54:52,470 Sie würden nicht einmal zu '127 'in der Druckerei f sagen, 579 00:54:52,470 --> 00:54:57,090 aber was es bedeutet, zeige die ersten 127 Zeichen. 580 00:54:57,090 --> 00:54:59,350 Also ich bin ziemlich sicher, dass das der Fall ist. Sie können, dass Google. 581 00:54:59,350 --> 00:55:03,000 Aber in der nächsten ein Ich bin fast sicher, es bedeutet, dass. 582 00:55:03,000 --> 00:55:08,880 So ist dies zeige die ersten 127 Zeichen, durch eine neue Zeile. 583 00:55:08,880 --> 00:55:14,680 F-Scan f jetzt, anstatt sich mit einer variablen und Drucken, 584 00:55:14,680 --> 00:55:22,620 es wird irgendwann String suchen, und speichern Sie das Muster in die Variable. 585 00:55:22,620 --> 00:55:26,360 Lassen Sie tatsächlich nutzen Scan f in einem anderen Beispiel. 586 00:55:26,360 --> 00:55:31,670 So sagen wir, wir hatten einige int x = 4, 587 00:55:31,670 --> 00:55:41,110 und wir wollten einen String aus zu schaffen - wollte die Zeichenfolge zu erstellen 588 00:55:41,110 --> 00:55:44,250 das war wie, das wird kommen viel später, 589 00:55:44,250 --> 00:55:49,020 etwas, das wie 4.jpg ist. 590 00:55:49,020 --> 00:55:51,870 So könnte dies ein Programm, wo man Summenzähler haben werden, 591 00:55:51,870 --> 00:55:56,420 Summenzähler i, und Sie möchten ein paar Bilder zu speichern. 592 00:55:56,420 --> 00:56:02,430 Sie wollen also i.jpg, wo ich es einige Iteration der Schleife zu speichern. 593 00:56:02,430 --> 00:56:05,500 Also, wie machen wir diese Zeichenfolge für die JPEG? 594 00:56:05,500 --> 00:56:11,720 Wenn Sie drucken 4.jpg wollten, könnten wir nur sagen, Druck f,% d.jpg, 595 00:56:11,720 --> 00:56:14,410 und dann wäre es für die JPEG drucken. 596 00:56:14,410 --> 00:56:20,050 Aber wenn wir den String 4.jpg speichern möchten, verwenden wir Scan f. 597 00:56:20,050 --> 00:56:30,860 So String s - eigentlich haben wir kann nicht - Charakter, char s, lass uns gehen 100. 598 00:56:30,860 --> 00:56:35,400 Also habe ich gerade erklärt einige Array mit 100 Zeichen 599 00:56:35,400 --> 00:56:39,830 und das ist, was wir unweigerlich zu speichern, dass JPEG in. 600 00:56:39,830 --> 00:56:47,920 So werden wir Scan f verwenden, sowie das Format, wie wir% d.jpg sagen, 601 00:56:47,920 --> 00:56:54,980 Um zu drucken 4.jpg, wird das Format dieser werde% d.jpg sein. 602 00:56:54,980 --> 00:57:04,020 So ist das Format% d.jpg, was wir wollen% d mit ersetzen x, 603 00:57:04,020 --> 00:57:06,590 und jetzt müssen wir diese Zeichenfolge irgendwo speichern. 604 00:57:06,590 --> 00:57:12,500 Und wo werden wir diese Zeichenfolge zu speichern, ist in dem Array s. 605 00:57:12,500 --> 00:57:21,640 Also nach dieser Codezeile, s, wenn wir drucken f,% s der Variablen s, 606 00:57:21,640 --> 00:57:26,280 es geht um 4.jpg drucken. 607 00:57:26,280 --> 00:57:38,930 So f Scan f ist die gleiche wie Scan-f, außer jetzt ist es über diese Datei suchen 608 00:57:38,930 --> 00:57:43,600 für das, was in s speichern. 609 00:57:43,600 --> 00:57:46,160 Das ist, was das letzte Argument sein wird. 610 00:57:46,160 --> 00:57:54,170 Wir speichern wollen - "Scan f Familie von Funktionen Scans sowohl nach Format als versuchte unten. 611 00:57:54,170 --> 00:58:02,450 Wenn einer in den Ort Punkte gespeichert sind Sie vielleicht zurück - " 612 00:58:02,450 --> 00:58:12,910 Nein, könnten wir gut sein. Lassen Sie mich für eine Sekunde denken. 613 00:58:12,910 --> 00:58:26,350 So Scan f nicht - was zum Teufel die Funktion, die das tut ist? 614 00:58:26,350 --> 00:58:31,650 So Scan f wird nicht eine ganze Zahl nehmen und dot jpg. 615 00:58:31,650 --> 00:58:43,490 Es ist auf [murmelt] gehen. 616 00:58:43,490 --> 00:58:49,360 Speichern int Variable in String int C. 617 00:58:49,360 --> 00:58:55,940 Was ist das variable, oder was ist diese Funktion aufgerufen? 618 00:58:55,940 --> 00:59:04,950 Ja. That's - ja. Also, was ich dir definieren vorher war s print f, 619 00:59:04,950 --> 00:59:09,820 die - die viel mehr Sinn, warum ich sagte, es war viel mehr wie print f macht. 620 00:59:09,820 --> 00:59:14,700 Scan f ist immer noch der wie print f Art, aber s print f wird es scannen über 621 00:59:14,700 --> 00:59:17,510 und ersetzen Sie die Variablen und jetzt speichern sie in einem String. 622 00:59:17,510 --> 00:59:19,620 Anstatt ihn zu drucken, speichert er es in einem String. 623 00:59:19,620 --> 00:59:25,070 Damit komplett ignorieren. Sie können immer noch der Formatbezeichner denken, als wie der Druck f. 624 00:59:25,070 --> 00:59:34,510 So jetzt, wenn wir die 4.jpg tun wollten, würden wir tun, s print f, x davon. 625 00:59:34,510 --> 00:59:38,520 Also, was Scan f tut - was Ihre Frage sein wird? 626 00:59:38,520 --> 00:59:40,820 [Student] Ich bin nur auf das, was wir versuchen, hier zu tun verwirrt 627 00:59:40,820 --> 00:59:43,450 mit diesem JPEG. Können Sie erklären, dass ein mehr Zeit? 628 00:59:43,450 --> 00:59:52,710 Das war also - es ist weniger BETROFFENEN bis f Scan f jetzt hoffentlich wird es Krawatte zurück in irgendeiner Art und Weise. 629 00:59:52,710 --> 01:00:02,240 Aber was ich ursprünglich beabsichtigt zu zeigen war - das ist eigentlich direkt relevant für diesen [? F5] 630 01:00:02,240 --> 01:00:08,520 Du wirst zu sein mit s print f, wo, sagen wir 100 Bilder, 631 01:00:08,520 --> 01:00:13,630 und Sie wollen image 1.jpg, 2.jpg, 3.jpg lesen. 632 01:00:13,630 --> 01:00:21,520 Also, um das zu tun, müssen Sie f offen, und dann haben Sie in der Zeichenfolge, die Sie öffnen möchten passieren. 633 01:00:21,520 --> 01:00:30,020 So würden wir öffnen möchten 1.jpg;, um die Zeichenfolge, die 1.jpg schaffen, 634 01:00:30,020 --> 01:00:37,660 wir tun s print f% d.jpg--wir nicht für int i = 0 zu tun. 635 01:00:37,660 --> 01:00:46,580 i <40, i + +. 636 01:00:46,580 --> 01:00:51,130 So s print f% d.jpg der i. 637 01:00:51,130 --> 01:00:56,320 So nach dieser Zeile, jetzt die Variable oder das Array s wird 1.jpg gehen. 638 01:00:56,320 --> 01:01:10,610 Oder 0.jpg, 1.jpg, 2.jpg. Und so können wir öffnen, wiederum jedes Bildes für das Lesen. 639 01:01:10,610 --> 01:01:19,550 Also das ist das, was s gedruckt f tut. Siehst du, was s f jetzt tut drucken? 640 01:01:19,550 --> 01:01:25,720 [Student] Okay, so ist es unter - es wird eine Zeichenfolge erstellt, something.jpg, und speichert es dann. 641 01:01:25,720 --> 01:01:30,360 Ja. Es schafft - dies ist ein weiteres Format-String, wie Scan-f-und Print-f, 642 01:01:30,360 --> 01:01:37,530 wo es fügt alle der Variablen in das zweite Argument, könnte s um i entgegen. 643 01:01:37,530 --> 01:01:42,280 Vielleicht - ich meine, das ist der Fall. Aber was auch immer die Reihenfolge der Argumente ist. 644 01:01:42,280 --> 01:01:45,440 Es wird auf alle Variablen in den Format-String einfügen 645 01:01:45,440 --> 01:01:52,250 und dann in unser Puffer speichern, rufen wir, dass ein Puffer, es, wo wir das Speichern der Zeichenfolge sind ist. 646 01:01:52,250 --> 01:02:00,750 So sind wir im Inneren des s Speicherung der korrekt formatierten String,% d mit mit 4 ersetzt worden. 647 01:02:00,750 --> 01:02:08,080 [Student] Also, wenn wir dies taten, ist die Variable f gerade dabei, neu zugewiesen werden? 648 01:02:08,080 --> 01:02:18,110 Ja. Also sollten wir die ursprüngliche f, bevor Sie diese zu schließen. 649 01:02:18,110 --> 01:02:22,810 Aber - und dann auch, wenn es nicht ein f eröffnen hier, dann müssten wir sagen - 650 01:02:22,810 --> 01:02:29,280 Yeah. Aber es wäre zu öffnen hundert verschiedene Dateien. 651 01:02:29,280 --> 01:02:37,360 [Student] Aber wir wären nicht in der Lage sein zugreifen oder - okay. 652 01:02:37,360 --> 01:02:44,230 Okay. So Scan f, f Scan f, ist eine Art von der gleichen Idee, 653 01:02:44,230 --> 01:02:53,610 aber anstatt, anstatt es zu speichern in einen String, es ist mehr wie du bist jetzt 654 01:02:53,610 --> 01:03:02,420 gehen über einen Stachel und Mustererkennung gegen diese Zeichenfolge und speichert die Ergebnisse in Variablen. 655 01:03:02,420 --> 01:03:11,290 Sie können Scan-f über so etwas wie 4.jpg analysieren, und speichern Sie die Zahl 4 in Summe int x. 656 01:03:11,290 --> 01:03:13,430 Das ist das, was wir können Scan-f für den Einsatz. 657 01:03:13,430 --> 01:03:16,300 F-Scan f wird, dass in der Befehlszeile tun. 658 01:03:16,300 --> 01:03:19,200 Ich bin eigentlich ziemlich sicher, das ist, was der CS50-Bibliothek tut. 659 01:03:19,200 --> 01:03:29,050 Also, wenn Sie sagen, "get int," es ist Scan f-ten über - scan f ist der Weg Sie Benutzereingaben. 660 01:03:29,050 --> 01:03:34,670 F-Scan f wird das gleiche tun, sondern mit einer Datei zu scannen vorbei. 661 01:03:34,670 --> 01:03:41,090 Also hier sind wir über diese Datei scannen. 662 01:03:41,090 --> 01:03:45,460 Das Muster, das wir versuchen zu entsprechen, ist eine Schnur, die 127 Zeichen lang ist 663 01:03:45,460 --> 01:03:48,100 gefolgt von einer neuen Zeile 664 01:03:48,100 --> 01:03:54,770 Also ich bin mir ziemlich sicher, dass wir auch nur sagen: "überein s", da im Wörterbuch 665 01:03:54,770 --> 01:03:57,770 wir passieren müssen, sind wir garantiert kein Wort ist, dass lange, 666 01:03:57,770 --> 01:04:03,310 und auch f Scan f, denke ich, wird auf der neuen Linie zu stoppen, egal was. 667 01:04:03,310 --> 01:04:06,970 Aber wir werden auch die neue Linie im Spiel, und - 668 01:04:06,970 --> 01:04:13,960 [Student] Wenn wir nicht auch die neue Linie, wäre es nicht zu finden, Teile eines Wortes? 669 01:04:13,960 --> 01:04:22,900 It - jeweils - Blick auf den Wörterbuch - 670 01:04:22,900 --> 01:04:26,200 So im Wörterbuch, das sind alle unsere Worte. 671 01:04:26,200 --> 01:04:30,500 Jeder ist auf einer neuen Zeile. 672 01:04:30,500 --> 01:04:32,510 Die Scan-f abholen wollte dieses Wort. 673 01:04:32,510 --> 01:04:38,750 Wenn wir nicht um eine neue Linie, dann ist es möglich, dass der nächste Scan f wird gerade gelesen das neue Zeile. 674 01:04:38,750 --> 01:04:44,180 Aber auch neue Linie wird dann einfach ignorieren die neue Linie. 675 01:04:44,180 --> 01:04:49,440 Aber wir werden nie Teil eines Wortes, da wir immer gelesen werden bis zu einer neuen Linie, egal was passiert. 676 01:04:49,440 --> 01:04:54,530 [Student] Aber was, wenn Sie das Wort "Cissa," wie Cissa suchen. 677 01:04:54,530 --> 01:04:57,380 Wird es finden, dass, und sagen, es ist ein Spiel? 678 01:04:57,380 --> 01:05:05,110 Also hier haben wir - es wird lesen - das ist eigentlich ein guter Punkt. 679 01:05:05,110 --> 01:05:10,660 Wir sind nie mit dem aktuellen - das Wort, das wir suchen, ist das erste Argument der Kommandozeile. 680 01:05:10,660 --> 01:05:16,460 So String word = argv 1. 681 01:05:16,460 --> 01:05:20,020 So die Zeichenkette, die wir suchen ist argv 1. 682 01:05:20,020 --> 01:05:23,290 Wir sind nicht auf der Suche nach einem Wort überhaupt in unserem Scan f. 683 01:05:23,290 --> 01:05:28,030 Was wir mit Scan-f macht immer jedes Wort im Wörterbuch, 684 01:05:28,030 --> 01:05:34,320 und dann noch einmal haben wir das Wort wir strcmp verwenden, um sie miteinander zu vergleichen sind. 685 01:05:34,320 --> 01:05:39,210 Wir werden unser Wort zu vergleichen und was wir gerade gelesen haben in. 686 01:05:39,210 --> 01:05:45,110 So unvermeidlich, werden wir am Ende tut ein Bündel von Scan fs 687 01:05:45,110 --> 01:05:52,130 bis es passiert einfach so, dass Scan f will return - 688 01:05:52,130 --> 01:05:54,800 es wird ein zurückzukehren, solange es ein neues Wort übereinstimmt, 689 01:05:54,800 --> 01:06:01,360 und es wird etwas anderes, sobald er es versäumt hat, das Wort überein zurückzukehren. 690 01:06:01,360 --> 01:06:08,440 Wir sind über die gesamte Wörterbuch Lesen, Speichern zeilenweise jedes Wort in die Variable s. 691 01:06:08,440 --> 01:06:17,240 Dann vergleichen wir Wort mit s, und wenn der Vergleich == 0, 692 01:06:17,240 --> 01:06:21,650 strcmp passiert auf 0 zu bringen, wenn ein Spiel gemacht wurde. 693 01:06:21,650 --> 01:06:31,510 Also, wenn es 0 war, dann können wir drucken f, abgestimmt, 694 01:06:31,510 --> 01:06:35,370 oder Wort in Wörterbuch, oder was auch immer Sie wollen f drucken. 695 01:06:35,370 --> 01:06:41,450 Und dann - wir wollen nicht f schließen immer und immer wieder. 696 01:06:41,450 --> 01:06:50,410 Dies ist die Art von Sache, die wir tun wollen, und wir sind nicht nur auf der Suche nach Wort im Wörterbuch. 697 01:06:50,410 --> 01:06:56,660 So konnten wir das tun, wenn wir für ihre Muster, Cissa aussehen wollte, wie du schon gesagt habe, 698 01:06:56,660 --> 01:07:00,260 wenn wir für dieses Muster aussehen wollte, dann wäre es in dem Fall nicht 699 01:07:00,260 --> 01:07:08,010 denn das ist nicht eigentlich ein Wort, aber eines der Wörter im Wörterbuch passiert, dass in ihm haben. 700 01:07:08,010 --> 01:07:13,560 So würde es passen dieses Wort, aber diese Teilmenge des Wortes ist nicht ein Wort selber. 701 01:07:13,560 --> 01:07:17,250 Aber das ist nicht, wie wir mit ihm, wir sind in jedem Wort lesen 702 01:07:17,250 --> 01:07:19,740 und dann vergleichen Sie das Wort haben wir mit diesem Wort. 703 01:07:19,740 --> 01:07:25,780 So sind wir immer verglichen voller Worte. 704 01:07:25,780 --> 01:07:29,620 Ich kann senden die finalisiert Lösungen später. 705 01:07:29,620 --> 01:07:32,050 Dies ist eine Art von fast die richtige Antwort, denke ich. 706 01:07:32,050 --> 01:07:34,720 [Schüler Kommentar unverständlich] 707 01:07:34,720 --> 01:07:40,870 Oh, habe ich loswerden, dass vor? Char s, ich denke, wir sagten 127 - ich vergesse, was die größte ist. 708 01:07:40,870 --> 01:07:44,100 Wir müssen nur tun, 128; so jetzt s lang genug ist. 709 01:07:44,100 --> 01:07:46,570 Wir brauchen nicht alles zu drucken. 710 01:07:46,570 --> 01:07:56,440 Wir sind auch gehen zu wollen, müssen unsere Datei zu schließen, und das sollte über die richtige Antwort sein. 711 01:07:56,440 --> 01:07:59,440 CS50.TV