1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID MALAN: Très bien, bienvenue. 3 00:00:12,580 --> 00:00:13,290 C'est CS50. 4 00:00:13,290 --> 00:00:15,130 C'est le début de la septième semaine. 5 00:00:15,130 --> 00:00:18,890 Donc ça a été un certain temps, donc je pensais que nous avions prendre un tour d'horizon de ce que nous 6 00:00:18,890 --> 00:00:20,760 quittés et où nous allons maintenant. 7 00:00:20,760 --> 00:00:23,310 >> Donc cette chose pourrait ici avoir causé une certaine angoisse au premier abord. 8 00:00:23,310 --> 00:00:27,680 Mais espérons que vous commencez à s'acclimater à ce que cela désigne ici - 9 00:00:27,680 --> 00:00:32,670 étoile qui représente un pointeur, ce qui est tout ce qui, en termes plus simples? 10 00:00:32,670 --> 00:00:33,400 Il s'agit donc d'une adresse. 11 00:00:33,400 --> 00:00:35,490 >> Donc, c'est l'adresse de quelque chose en mémoire. 12 00:00:35,490 --> 00:00:38,260 Et nous avons commencé à peler les couches Il ya quelques semaines, des choses comme 13 00:00:38,260 --> 00:00:41,800 GetString et d'autres fonctions tout ce temps ont été revient 14 00:00:41,800 --> 00:00:46,010 adresses des choses en mémoire, comme le l'adresse du premier caractère de 15 00:00:46,010 --> 00:00:46,990 certaines séquences. 16 00:00:46,990 --> 00:00:50,360 >> Donc, nous avons également introduit valgrind, qui vous commencerez à utiliser pour résoudre ce problème 17 00:00:50,360 --> 00:00:53,380 régler, en particulier pour la prochaine problème réglé ainsi. 18 00:00:53,380 --> 00:00:54,980 Et valgrind fait quoi pour nous? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Il vérifie les fuites de mémoire, et il vérifie également pour abus de mémoire. 21 00:01:01,020 --> 00:01:05,890 >> Il peut, avec une certaine probabilité, détecter si votre code va toucher mémoire 22 00:01:05,890 --> 00:01:07,100 qu'il ne devrait tout simplement pas. 23 00:01:07,100 --> 00:01:10,410 Donc, pas nécessairement une fuite, mais si vous aller au-delà des limites de certaines 24 00:01:10,410 --> 00:01:14,730 tableau, et que vous exécutez en fait valgrind et induire ce comportement tout 25 00:01:14,730 --> 00:01:17,870 valgrind est en marche dans votre programme est fonctionne à l'intérieur de celui-ci, vous aurez 26 00:01:17,870 --> 00:01:21,460 messages comme celui-ci - «invalide écrire des taille 4 », qui, rappelons quelques 27 00:01:21,460 --> 00:01:25,880 il ya quelques semaines signifiait que je devais accidentellement comme sur un int trop loin 28 00:01:25,880 --> 00:01:27,250 au-delà des limites d'un tableau. 29 00:01:27,250 --> 00:01:30,790 Et si la taille 4 signifie ici que la taille de cette int particulier. 30 00:01:30,790 --> 00:01:35,260 >> Alors, prenez réconfort dans le fait que la sortie de valgrind, le format de celui-ci, 31 00:01:35,260 --> 00:01:36,170 est tout simplement atroce. 32 00:01:36,170 --> 00:01:40,180 Il est vraiment difficile de voir à travers le désordre pour l'information intéressante. 33 00:01:40,180 --> 00:01:42,910 Donc ce que nous avons fait ici est juste extrait une partie du couple de plus 34 00:01:42,910 --> 00:01:43,850 lignes intéressantes. 35 00:01:43,850 --> 00:01:46,760 Mais se rendre compte que 80% de valgrind de sortie va être un peu 36 00:01:46,760 --> 00:01:47,650 distraction. 37 00:01:47,650 --> 00:01:52,820 >> Il suffit de regarder pour des motifs de ce genre - droite invalide, nulle lire, 40 octets 38 00:01:52,820 --> 00:01:56,690 et un nombre de blocs sont certainement perdus, mots-clés comme ça. 39 00:01:56,690 --> 00:02:01,920 Et ce que vous voyez est quelque espérons genre de trace de ce qui fonctionne le 40 00:02:01,920 --> 00:02:03,340 erreur est en fait po 41 00:02:03,340 --> 00:02:07,195 Dans ce cas là, dans quelle branche d' mon code était apparemment l'erreur? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 dans un fichier appelé memory.c, qui était l'exemple que nous jouions avec 44 00:02:14,130 --> 00:02:14,890 à l'époque. 45 00:02:14,890 --> 00:02:16,460 Donc, ce n'est probablement pas dans malloc. 46 00:02:16,460 --> 00:02:18,630 C'était probablement dans mon code à la place. 47 00:02:18,630 --> 00:02:20,910 Nous allons donc voir ce nouveau et de nouveau avant longtemps. 48 00:02:20,910 --> 00:02:24,080 >> Alors scanf, cela est venu dans un quelques formes jusque-là. 49 00:02:24,080 --> 00:02:26,410 Nous avons vu sscanf brièvement. 50 00:02:26,410 --> 00:02:28,330 C'était quelque chose d'un certain nombre de vous plonge dans dans votre 51 00:02:28,330 --> 00:02:29,535 préparations pour le quiz. 52 00:02:29,535 --> 00:02:33,130 Et scanf est en fait ce que le CS50 bibliothèque a été utilise sous l' 53 00:02:33,130 --> 00:02:36,560 hotte pendant un certain temps afin pour obtenir des entrées de l'utilisateur. 54 00:02:36,560 --> 00:02:40,420 >> Par exemple, si je me déplace vers le CS50 appareil ici, laissez-moi ouvrir un 55 00:02:40,420 --> 00:02:45,315 exemple aujourd'hui que l'on appelle scanf-0.c Et c'est super simple. 56 00:02:45,315 --> 00:02:46,590 C'est juste quelques lignes de code. 57 00:02:46,590 --> 00:02:50,880 Mais il démontre vraiment comment getInt a travaillé tout ce temps. 58 00:02:50,880 --> 00:02:54,710 >> Dans ce programme, ici, à la ligne 16 , Un avis que je déclare un int. 59 00:02:54,710 --> 00:02:57,270 Donc, pas de pointeurs, rien de magique là, juste un int. 60 00:02:57,270 --> 00:03:00,330 Puis, dans la ligne 17, je l'invite de utilisateur pour un certain nombre, s'il vous plaît. 61 00:03:00,330 --> 00:03:02,930 Puis à la fin de 18, j'utilise scanf ici. 62 00:03:02,930 --> 00:03:06,910 Et je l'ai précisé, un peu comme printf, que je m'attends devis 63 00:03:06,910 --> 00:03:08,110 unquote pour cent i. 64 00:03:08,110 --> 00:03:10,920 >> Donc pour cent i, bien sûr, désigne un int. 65 00:03:10,920 --> 00:03:14,580 Mais remarquez que le second argument de scanf est. 66 00:03:14,580 --> 00:03:17,350 Comment décririez-vous la deuxième argument après la virgule? 67 00:03:17,350 --> 00:03:19,450 Qu'est-ce que c'est? 68 00:03:19,450 --> 00:03:20,670 >> C'est l'adresse de x. 69 00:03:20,670 --> 00:03:25,490 Donc, c'est utile car en fournissant scanf avec l'adresse de x, ce qui ne 70 00:03:25,490 --> 00:03:29,560 qui leur permettent cette fonction à faire? 71 00:03:29,560 --> 00:03:33,010 Non seulement y aller, mais aussi faire quoi? 72 00:03:33,010 --> 00:03:34,060 >> Faire un changement à elle. 73 00:03:34,060 --> 00:03:38,080 Parce que vous pouvez y aller, c'est une sorte de comme une carte à un emplacement dans la mémoire. 74 00:03:38,080 --> 00:03:41,900 Et tant que vous fournissez scanf, ou une autre fonction avec une telle carte, qui 75 00:03:41,900 --> 00:03:45,840 fonction peut y aller, et pas seulement regardez la valeur, mais il peut aussi 76 00:03:45,840 --> 00:03:49,670 modifier cette valeur, ce qui est utile si le but dans la vie de scanf est d' 77 00:03:49,670 --> 00:03:53,060 numériser entrée de l'utilisateur, en particulier à partir du clavier. 78 00:03:53,060 --> 00:03:57,830 Et f désigne la mise en forme, tout comme printf, le f désigne un format 79 00:03:57,830 --> 00:03:58,930 chaîne que vous voulez imprimer. 80 00:03:58,930 --> 00:04:04,430 >> Donc en bref, cette ligne 18 dit simplement: essayez de lire un int de l'utilisateur de 81 00:04:04,430 --> 00:04:10,420 clavier et stocker à l'intérieur de x, à quelle que soit l'adresse x arrive à vivre à. 82 00:04:10,420 --> 00:04:14,860 Et puis enfin, la ligne 19 dit simplement: merci pour l'int, dans ce cas. 83 00:04:14,860 --> 00:04:15,940 >> Alors laissez-moi aller de l'avant et faire cela. 84 00:04:15,940 --> 00:04:18,570 Donc, assurez-scanf 0. 85 00:04:18,570 --> 00:04:20,130 Permettez-moi d'aller de l'avant et agrandir 86 00:04:20,130 --> 00:04:22,960 Je vais courir avec cette points slash scanf 0. 87 00:04:22,960 --> 00:04:24,020 Nombre, s'il vous plaît? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Merci pour le 50. 90 00:04:25,730 --> 00:04:27,270 Donc, c'est assez simple. 91 00:04:27,270 --> 00:04:28,160 >> Maintenant, ce que n'est-il pas fait? 92 00:04:28,160 --> 00:04:29,940 Ce n'est pas faire tout un tas de vérification d'erreur. 93 00:04:29,940 --> 00:04:33,000 Par exemple, si je ne coopèrent pas, et je ne tape pas dans un certain nombre, mais 94 00:04:33,000 --> 00:04:37,860 au lieu que j'écris quelque chose comme «bonjour», c'est juste un peu étrange. 95 00:04:37,860 --> 00:04:41,130 Et l'une des choses les CS50 bibliothèque a été fait pour nous depuis un certain 96 00:04:41,130 --> 00:04:43,440 temps, c'est que reprompting et reprompting. 97 00:04:43,440 --> 00:04:49,320 >> La tentative de rappel phrase était dans cs50.c, et c'est la raison pour laquelle dans getInt 98 00:04:49,320 --> 00:04:51,670 la bibliothèque CS50 est en fait un ensemble de bouquet de longues lignes, parce que nous sommes 99 00:04:51,670 --> 00:04:53,190 la vérification des trucs stupides comme ça. 100 00:04:53,190 --> 00:04:55,730 L'utilisateur at donne pas nous, en fait, un int? 101 00:04:55,730 --> 00:04:57,910 At-il nous donner quelque chose comme une lettre alphabétique? 102 00:04:57,910 --> 00:05:01,410 Si oui, nous voulons détecter que et hurler à eux. 103 00:05:01,410 --> 00:05:03,915 >> Mais les choses deviennent plus intéressantes Dans l'exemple suivant. 104 00:05:03,915 --> 00:05:09,840 Si je vais à scanf-1.c, quelle est la chose qui est fondamentalement modifiée dans 105 00:05:09,840 --> 00:05:11,135 cette prochaine exemple? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 J'utilise char *, bien sûr, au lieu d'int. 108 00:05:16,010 --> 00:05:19,210 >> Donc, c'est intéressant, parce que char *, rappelons-le, est vraiment juste l' 109 00:05:19,210 --> 00:05:20,190 même chose en tant que chaîne. 110 00:05:20,190 --> 00:05:23,840 Alors, il se sent comme c'est peut-être un super- implémentation simple de GetString. 111 00:05:23,840 --> 00:05:26,010 Mais j'ai épluché la couche de la bibliothèque CS50, donc je suis 112 00:05:26,010 --> 00:05:27,550 appel de cette char * maintenant. 113 00:05:27,550 --> 00:05:30,070 Voyons donc où, plus que partout ailleurs, nous allons mal. 114 00:05:30,070 --> 00:05:30,840 >> Ligne 17 - 115 00:05:30,840 --> 00:05:33,950 Je le répète, s'il vous plaît donnez-moi quelque chose, dans ce cas, d'une chaîne. 116 00:05:33,950 --> 00:05:37,940 Et puis dans la ligne suivante, j'appelle scanf, de plus, ce qui lui donne un code de format, 117 00:05:37,940 --> 00:05:39,310 mais cette fois pour cent s. 118 00:05:39,310 --> 00:05:41,900 Et puis cette fois, je suis ce qui lui donne un tampon. 119 00:05:41,900 --> 00:05:43,550 >> Maintenant, remarquez, je ne suis pas à l'aide l'esperluette. 120 00:05:43,550 --> 00:05:47,120 Mais pourquoi est-ce probablement OK ici? 121 00:05:47,120 --> 00:05:49,760 Parce que ce qui est déjà tampon? 122 00:05:49,760 --> 00:05:50,770 C'est déjà un pointeur. 123 00:05:50,770 --> 00:05:51,650 C'est déjà une adresse. 124 00:05:51,650 --> 00:05:54,510 >> Et disons ce mot de «confondre», permettez-moi de il suffit d'appeler c'est, par exemple, pour 125 00:05:54,510 --> 00:05:55,050 simplicité. 126 00:05:55,050 --> 00:05:58,250 Mais je l'ai appelé tampon parce que dans général, dans la programmation, si vous avez un 127 00:05:58,250 --> 00:06:02,130 morceau de mémoire, qui une chaîne vraiment seulement, vous pourriez l'appeler un tampon. 128 00:06:02,130 --> 00:06:04,460 C'est un endroit pour stocker des informations. 129 00:06:04,460 --> 00:06:07,400 >> Semblable à des choses comme YouTube, lorsque ils tampon, pour ainsi dire, que 130 00:06:07,400 --> 00:06:10,270 signifie simplement que c'est le téléchargement de morceaux l'Internet et les stocker dans une 131 00:06:10,270 --> 00:06:14,160 tableau local, un morceau de la mémoire locale afin que vous pouvez regarder plus tard sans 132 00:06:14,160 --> 00:06:16,830 il sauter ou accroché vous pendant la lecture. 133 00:06:16,830 --> 00:06:20,930 >> Donc, il ya un problème cependant, parce que je dis scanf, s'attendre à une 134 00:06:20,930 --> 00:06:22,320 Chaîne de l'utilisateur. 135 00:06:22,320 --> 00:06:24,410 Voici l'adresse du un morceau de la mémoire. 136 00:06:24,410 --> 00:06:26,180 Mettez cette chaîne là. 137 00:06:26,180 --> 00:06:31,230 Pourquoi est-ce lié donner nous trouble, si? 138 00:06:31,230 --> 00:06:33,490 >> Qu'est-ce que c'est? 139 00:06:33,490 --> 00:06:35,510 Suis-je autorisé à accéder la partie de la mémoire? 140 00:06:35,510 --> 00:06:36,250 Vous savez, je ne sais pas. 141 00:06:36,250 --> 00:06:39,210 Parce a tampon été initialisé à quelque chose? 142 00:06:39,210 --> 00:06:39,820 Pas vraiment. 143 00:06:39,820 --> 00:06:43,090 Et c'est ce que nous avons appelé une valeur d'ordures, qui 144 00:06:43,090 --> 00:06:44,040 n'est pas un mot formel. 145 00:06:44,040 --> 00:06:49,200 Cela signifie simplement que nous n'avons aucune idée de ce que les bits sont à l'intérieur des quatre octets qui 146 00:06:49,200 --> 00:06:51,240 J'ai réparti comme tampon. 147 00:06:51,240 --> 00:06:52,450 >> Je n'ai pas appelé malloc. 148 00:06:52,450 --> 00:06:53,940 J'ai certainement pas appelé GetString. 149 00:06:53,940 --> 00:06:56,380 Alors, qui sait ce qui est réellement à l'intérieur du tampon? 150 00:06:56,380 --> 00:07:00,550 Et pourtant dire scanf aveuglément, allez-y et mettre ce que l'utilisateur a tapé. 151 00:07:00,550 --> 00:07:04,460 >> Donc ce qui est susceptible de causer dans notre code si nous courons? 152 00:07:04,460 --> 00:07:05,700 Probablement une erreur de segmentation. 153 00:07:05,700 --> 00:07:07,970 Peut-être pas, mais probablement une erreur de segmentation. 154 00:07:07,970 --> 00:07:10,620 Et je dis peut-être pas parce que parfois vous le faites, parfois 155 00:07:10,620 --> 00:07:11,380 vous n'obtenez pas une erreur de segmentation. 156 00:07:11,380 --> 00:07:14,280 Parfois vous avez juste avoir de la chance, mais il est néanmoins va être 157 00:07:14,280 --> 00:07:15,340 un bug dans notre programme. 158 00:07:15,340 --> 00:07:17,060 >> Alors laissez-moi aller de l'avant et de compiler cela. 159 00:07:17,060 --> 00:07:18,280 Je vais faire de la façon old school. 160 00:07:18,280 --> 00:07:23,825 Alors clang dash 0, scanf-1, scanf-1.c, Entrée. 161 00:07:23,825 --> 00:07:24,720 Oops, trop vieille école. 162 00:07:24,720 --> 00:07:26,550 Voyons voir. 163 00:07:26,550 --> 00:07:28,440 Où ai-je aller? 164 00:07:28,440 --> 00:07:29,700 Oh, char buffer d'*. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Oh, merci - 167 00:07:35,130 --> 00:07:36,930 Enregistrer, OK - 168 00:07:36,930 --> 00:07:37,690 très vieille école. 169 00:07:37,690 --> 00:07:38,900 Très bien, ça fait un moment. 170 00:07:38,900 --> 00:07:41,720 >> Donc, je viens de sauvé le fichier après faisant que temporaire 171 00:07:41,720 --> 00:07:42,700 changer il ya un instant. 172 00:07:42,700 --> 00:07:46,090 Et maintenant, j'ai compilé manuellement avec Clang. 173 00:07:46,090 --> 00:07:49,500 Et maintenant, je vais aller de l'avant et exécuter scanf-1, Entrée. 174 00:07:49,500 --> 00:07:50,290 Chaîne s'il vous plaît. 175 00:07:50,290 --> 00:07:51,600 Je vais taper dans «bonjour». 176 00:07:51,600 --> 00:07:54,070 >> Et maintenant, voici où, franchement, printf CAN est un peu ennuyeux. 177 00:07:54,070 --> 00:07:56,020 Ce n'est pas vraiment aller à erreur de segmentation dans ce cas. 178 00:07:56,020 --> 00:07:59,860 Printf est un peu spécial car il est tellement superbe couramment utilisé que 179 00:07:59,860 --> 00:08:03,570 printf est essentiellement faire nous une faveur et la réalisation, 180 00:08:03,570 --> 00:08:04,830 ce n'est pas un pointeur valide. 181 00:08:04,830 --> 00:08:09,080 Permettez-moi de prendre sur moi de tout imprimer dans parenthèses nulle, voire 182 00:08:09,080 --> 00:08:13,340 si ce n'est pas nécessairement ce nous nous attendions. 183 00:08:13,340 --> 00:08:16,940 >> Donc, nous ne pouvons pas vraiment facilement induire une erreur de segmentation avec cela, mais clairement cette 184 00:08:16,940 --> 00:08:18,600 n'est pas le comportement que je voulais. 185 00:08:18,600 --> 00:08:19,800 Alors quelle est la solution simple? 186 00:08:19,800 --> 00:08:25,650 Eh bien, dans scanf-2, permettez-moi de proposer que au lieu d'allouer une réalité juste 187 00:08:25,650 --> 00:08:30,100 char *, laissez-moi être un peu plus intelligent sur cela, et laissez-moi allouer un tampon 188 00:08:30,100 --> 00:08:32,940 comme une séquence de 16 caractères. 189 00:08:32,940 --> 00:08:34,200 >> Donc, je peux faire cela dans un couple des manières. 190 00:08:34,200 --> 00:08:35,610 Je ne pouvais absolument utiliser malloc. 191 00:08:35,610 --> 00:08:38,980 Mais je peux revenir à deux semaines lorsque J'avais juste besoin de tout un tas d' 192 00:08:38,980 --> 00:08:39,620 caractères. 193 00:08:39,620 --> 00:08:40,860 C'est juste un tableau. 194 00:08:40,860 --> 00:08:44,870 Alors laissez-moi plutôt redéfinir tampon à être un ensemble de 16 caractères. 195 00:08:44,870 --> 00:08:47,340 >> Et maintenant, quand je passe tampon - 196 00:08:47,340 --> 00:08:49,940 et c'est quelque chose que nous n'avons pas parler dans deux semaines - 197 00:08:49,940 --> 00:08:53,730 mais vous pouvez traiter un tableau comme si c'est une adresse. 198 00:08:53,730 --> 00:08:56,390 Techniquement, comme nous l'avons vu, ils sont un peu différent. 199 00:08:56,390 --> 00:09:01,290 Mais scanf ne m'en voudra pas si vous lui passez le nom d'un tableau, parce que ce 200 00:09:01,290 --> 00:09:05,030 Clang fera pour nous, c'est essentiellement traiter le nom de ce tableau comme 201 00:09:05,030 --> 00:09:08,280 l'adresse du bloc de 16 octets. 202 00:09:08,280 --> 00:09:09,550 >> Donc, c'est mieux. 203 00:09:09,550 --> 00:09:12,110 Cela signifie maintenant que je peux espérons procédez comme suit. 204 00:09:12,110 --> 00:09:16,800 Permettez-moi de faire un zoom arrière pour un moment et faire faire scanf-2, compilé OK. 205 00:09:16,800 --> 00:09:19,390 Maintenant, permettez-moi de ne suis slash scanf-2. 206 00:09:19,390 --> 00:09:22,430 Chaîne s'il vous plaît. "Bonjour." Et il semblait fonctionner pour le moment. 207 00:09:22,430 --> 00:09:26,020 >> Mais quelqu'un peut proposer un scénario dans laquelle il ne pourrait pas continuer à travailler? 208 00:09:26,020 --> 00:09:28,550 Ouais? 209 00:09:28,550 --> 00:09:30,640 Quelque chose de plus de 16 caractères. 210 00:09:30,640 --> 00:09:32,020 Et en fait, nous pouvons être un peu plus précis. 211 00:09:32,020 --> 00:09:36,540 Quelque chose de plus puis 15 caractères, parce que vraiment, nous devons garder à l'esprit 212 00:09:36,540 --> 00:09:39,920 que nous avons besoin que les anti-slash zéro implicitement à la fin de la chaîne, 213 00:09:39,920 --> 00:09:42,950 qui est un côté scanf sera typiquement prendre soin de nous. 214 00:09:42,950 --> 00:09:46,210 >> Permettez-moi de faire quelque chose comme - 215 00:09:46,210 --> 00:09:48,040 Parfois, nous pouvons simplement le laisser comme ça. 216 00:09:48,040 --> 00:09:50,630 OK, donc nous avons maintenant induit l' notre erreur de segmentation. 217 00:09:50,630 --> 00:09:51,000 Pourquoi? 218 00:09:51,000 --> 00:09:54,940 Parce que j'ai tapé à plus de 15 personnages, et c'est pourquoi nous avons fait 219 00:09:54,940 --> 00:09:58,280 mémoire touché que j'ai fait ne devrait pas avoir. 220 00:09:58,280 --> 00:10:00,180 >> Alors, quelle est vraiment la solution ici? 221 00:10:00,180 --> 00:10:02,210 Eh bien, si nous avons besoin d'une chaîne plus longue? 222 00:10:02,210 --> 00:10:03,960 Eh bien, nous faisons peut-être 32 octets. 223 00:10:03,960 --> 00:10:05,160 Eh bien, si ce n'est pas assez de temps? 224 00:10:05,160 --> 00:10:06,040 Comment environ 64 octets? 225 00:10:06,040 --> 00:10:07,080 Et si ce n'est pas assez de temps? 226 00:10:07,080 --> 00:10:09,640 Comment environ 128 ou 200 octets? 227 00:10:09,640 --> 00:10:12,660 Ce qui est vraiment la solution ici, dans la cas général, si nous ne savons pas dans 228 00:10:12,660 --> 00:10:14,460 l'avance ce que l'utilisateur va taper? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> C'est juste une sorte de grosse douleur dans le cul, pour être honnête, ce qui explique pourquoi le 231 00:10:23,050 --> 00:10:29,050 Bibliothèque CS50 a quelques dizaines de lignes de Code qui mettent en œuvre collectivement 232 00:10:29,050 --> 00:10:32,390 GetString chaîne d'une manière que nous n'avons pas doivent savoir à l'avance ce que l' 233 00:10:32,390 --> 00:10:33,430 utilisateur va taper. 234 00:10:33,430 --> 00:10:37,370 En particulier, si vous regardez en arrière cs50.c d'il ya deux semaines, vous verrez 235 00:10:37,370 --> 00:10:40,480 GetString qui ne fait pas utiliser scanf de cette façon. 236 00:10:40,480 --> 00:10:43,720 Plutôt, il lit un caractère à la fois. 237 00:10:43,720 --> 00:10:46,010 >> En raison d'une bonne chose à propos lecture d'un caractère est que nous pouvons 238 00:10:46,010 --> 00:10:48,490 nous assurer de toujours avoir au moins un caractère. 239 00:10:48,490 --> 00:10:51,740 Je peux simplement déclarer un char, puis prendre ces mesures véritablement bébé à juste 240 00:10:51,740 --> 00:10:54,380 lire un caractère à une moment à partir du clavier. 241 00:10:54,380 --> 00:10:58,240 Et puis, ce que vous verrez GetString ne fait que chaque fois qu'il s'exécute sur, 242 00:10:58,240 --> 00:11:02,280 disons, 16 octets de mémoire, il utilise malloc, ou un de ses cousin, à 243 00:11:02,280 --> 00:11:06,810 allouer plus de mémoire, la copie l'ancienne mémoire dans le nouveau, puis ramper 244 00:11:06,810 --> 00:11:09,900 ainsi, obtenir un caractère à la fois, et quand il est à court de cette 245 00:11:09,900 --> 00:11:13,370 morceau de mémoire, le jette, grabs un gros morceau de la mémoire, copie ancienne 246 00:11:13,370 --> 00:11:14,750 dans de nouveaux et répète. 247 00:11:14,750 --> 00:11:18,480 Et c'est vraiment une douleur à fait mettre en œuvre quelque chose d'aussi simple que 248 00:11:18,480 --> 00:11:19,710 La contribution d'un utilisateur. 249 00:11:19,710 --> 00:11:21,090 >> Ainsi, vous pouvez utiliser scanf. 250 00:11:21,090 --> 00:11:22,430 Vous pouvez utiliser d'autres fonctions similaires. 251 00:11:22,430 --> 00:11:25,420 Et beaucoup de manuels scolaires et en ligne exemples font, mais ils sont tous 252 00:11:25,420 --> 00:11:27,210 vulnérables à ce genre de problème. 253 00:11:27,210 --> 00:11:29,550 Et en fin de compte, se faire une erreur de segmentation est assez ennuyeux. 254 00:11:29,550 --> 00:11:30,680 Ce n'est pas bon pour l'utilisateur. 255 00:11:30,680 --> 00:11:33,560 >> Mais dans le pire des cas, ce qui ne il fondamentalement mettre votre 256 00:11:33,560 --> 00:11:37,160 code au risque d'? 257 00:11:37,160 --> 00:11:39,250 Une sorte d'attaque, potentiellement. 258 00:11:39,250 --> 00:11:41,680 Nous avons parlé d'une telle attaque - débordement de la pile. 259 00:11:41,680 --> 00:11:44,660 Mais en général, si vous êtes autorisé à débordement de tampon, comme nous avons fait un 260 00:11:44,660 --> 00:11:48,070 Il ya quelques semaines, avec juste écrit plus de "bonjour" sur la pile, vous 261 00:11:48,070 --> 00:11:52,330 peut en effet prendre le relais, potentiellement, un ordinateur, ou tout au moins à obtenir des données qui 262 00:11:52,330 --> 00:11:53,510 ne vous appartient pas. 263 00:11:53,510 --> 00:11:55,970 >> Donc en bref, c'est pourquoi nous avons les roues de formation. 264 00:11:55,970 --> 00:11:59,090 Mais maintenant, nous commençons à les enlever, que nos programmes ne doivent plus, 265 00:11:59,090 --> 00:12:00,610 nécessairement, entrée de l'utilisateur. 266 00:12:00,610 --> 00:12:03,960 Mais dans le cas du problème posé six, votre contribution proviendra d'une énorme 267 00:12:03,960 --> 00:12:07,520 fichier de dictionnaire avec 150 certains quelques mille mots. 268 00:12:07,520 --> 00:12:10,330 >> Ainsi, vous n'aurez pas à vous soucier de entrée arbitraire de l'utilisateur. 269 00:12:10,330 --> 00:12:13,720 Nous allons vous donner quelques hypothèses sur ce fichier. 270 00:12:13,720 --> 00:12:20,340 Toutes les questions sur des pointeurs ou scanf ou saisie de l'utilisateur en général? 271 00:12:20,340 --> 00:12:24,450 >> D'accord, donc un coup d'œil puis à une fuite sujet il ya deux semaines. 272 00:12:24,450 --> 00:12:28,590 Et c'est cette notion de structure. 273 00:12:28,590 --> 00:12:34,180 Non pas que - cette notion de structure, qui était quoi? 274 00:12:34,180 --> 00:12:35,430 Qu'est-ce que struct faire pour nous? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Définir - 277 00:12:39,860 --> 00:12:41,710 désolé? 278 00:12:41,710 --> 00:12:42,820 Définir un type de variable. 279 00:12:42,820 --> 00:12:44,410 Donc, en quelque sorte. 280 00:12:44,410 --> 00:12:46,180 Nous sommes en fait la combinaison de deux sujets. 281 00:12:46,180 --> 00:12:49,510 Donc, avec typedef, rappelons que nous pouvons déclarer un type de la nôtre, comme un 282 00:12:49,510 --> 00:12:51,500 synonyme, comme chaîne de char *. 283 00:12:51,500 --> 00:12:56,200 Mais en utilisant typedef struct et, nous pouvons vraiment créer nos propres structures de données. 284 00:12:56,200 --> 00:12:59,600 >> Par exemple, si je retourne dans gedit ici pendant un moment, et je vais de l'avant 285 00:12:59,600 --> 00:13:08,230 et faire quelque chose comme, permettez-moi à sauver ce que, disons, structs.c 286 00:13:08,230 --> 00:13:10,840 temporairement, je vais juste à aller de l'avant et de comprendre 287 00:13:10,840 --> 00:13:14,360 standardio.h, void main int. 288 00:13:14,360 --> 00:13:18,960 Et puis ici, suppose que je veux d'écrire un programme qui stocke 289 00:13:18,960 --> 00:13:21,840 plusieurs étudiants provenant de plusieurs maisons, par exemple. 290 00:13:21,840 --> 00:13:24,430 Donc, c'est comme un registrariat base de données de quelque sorte. 291 00:13:24,430 --> 00:13:29,550 >> Donc, si je dois le nom d'un étudiant, je pourrait faire quelque chose comme nom char *, 292 00:13:29,550 --> 00:13:31,570 et je ferai quelque chose comme - 293 00:13:31,570 --> 00:13:34,410 en fait, nous allons utiliser la bibliothèque CS50 juste un moment pour en faire une 294 00:13:34,410 --> 00:13:38,380 peu plus simple, afin que nous puissions emprunter ces dizaines de lignes de code. 295 00:13:38,380 --> 00:13:39,340 Et nous allons simplement garder les choses simples. 296 00:13:39,340 --> 00:13:42,610 Nous gardons chaîne, et maintenant GetString. 297 00:13:42,610 --> 00:13:47,420 >> Donc je prétends maintenant que j'ai enregistré le nom de certains élèves, et la maison de 298 00:13:47,420 --> 00:13:50,240 certains élèves, simplement en utilisant des variables comme nous l'avons fait et dans une semaine. 299 00:13:50,240 --> 00:13:52,370 Mais supposons que je veux maintenant soutenir plusieurs étudiants. 300 00:13:52,370 --> 00:13:58,460 D'accord, donc mes instincts sont à faire chaîne name2, obtient GetString, string 301 00:13:58,460 --> 00:14:01,370 house2 obtient GetString. 302 00:14:01,370 --> 00:14:05,850 Et puis notre troisième étudiant, Faisons name3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> D'accord, c'est donc j'espère frappant vous comme une sorte de stupide, 304 00:14:09,170 --> 00:14:11,580 car ce processus est vraiment jamais aller à la fin, et il va tout simplement 305 00:14:11,580 --> 00:14:13,130 faire mon code semble pire et de pire en pire. 306 00:14:13,130 --> 00:14:14,810 Mais nous avons résolu cela aussi dans deux semaines. 307 00:14:14,810 --> 00:14:19,450 Quelle était notre solution relativement propre lorsque nous avons eu plusieurs variables de l' 308 00:14:19,450 --> 00:14:23,580 même type de données qui sont tous reliés, mais nous ne voulions pas ce gâchis atroce 309 00:14:23,580 --> 00:14:26,870 des variables du même nom? 310 00:14:26,870 --> 00:14:30,060 Qu'avons-nous fait à la place? 311 00:14:30,060 --> 00:14:31,260 >> Donc, je pense que j'ai entendu quelques endroits. 312 00:14:31,260 --> 00:14:32,590 Nous avons eu un tableau. 313 00:14:32,590 --> 00:14:37,110 Si vous souhaitez plusieurs instances d' quelque chose, pourquoi ne pas nettoyer tout cela 314 00:14:37,110 --> 00:14:39,540 et dire simplement, donnez-moi tableau appelé noms? 315 00:14:39,540 --> 00:14:41,640 >> Et pour l'instant, nous allons coder en dur 3. 316 00:14:41,640 --> 00:14:44,450 Et alors me donner un autre tableau appelé maisons, et laissez-moi 317 00:14:44,450 --> 00:14:45,800 Code maintenant difficile 3. 318 00:14:45,800 --> 00:14:49,220 Et j'ai massivement nettoyé le plaisante que je viens de créer. 319 00:14:49,220 --> 00:14:52,400 Maintenant, j'ai toujours codé en dur 3, mais même le 3 pourrait venir de manière dynamique à partir de l' 320 00:14:52,400 --> 00:14:54,350 l'utilisateur ou argv, ou analogue. 321 00:14:54,350 --> 00:14:55,720 Donc, c'est déjà plus propre. 322 00:14:55,720 --> 00:15:00,100 >> Mais ce qui est gênant à ce sujet est que maintenant, même si un nom est en quelque sorte 323 00:15:00,100 --> 00:15:02,280 fondamentalement lié à la maison de l'étudiant - 324 00:15:02,280 --> 00:15:04,720 c'est un étudiant que j'ai vraiment vouloir représenter - 325 00:15:04,720 --> 00:15:08,080 J'ai maintenant deux rangées parallèles dans le sens où ils sont le 326 00:15:08,080 --> 00:15:13,930 même taille, et les noms support 0 vraisemblablement cartes jusqu'aux maisons support 0, 327 00:15:13,930 --> 00:15:16,600 et les noms Support 1 cartes aux maisons support 1. 328 00:15:16,600 --> 00:15:19,280 En d'autres termes, cet étudiant vit dans cette maison, et que d'autres élèves 329 00:15:19,280 --> 00:15:20,530 vit dans cette autre maison. 330 00:15:20,530 --> 00:15:23,720 Mais sûrement ce qui pourrait être fait encore plus proprement. 331 00:15:23,720 --> 00:15:24,990 >> Eh bien, il peut, en fait. 332 00:15:24,990 --> 00:15:28,730 Et permettez-moi d'aller de l'avant et ouvrir jusqu'à structs.h, et vous aurez 333 00:15:28,730 --> 00:15:31,130 Voir cette idée ici. 334 00:15:31,130 --> 00:15:34,905 Remarquez que j'ai utilisé typedef, comme vous fait allusion il ya un instant de déclarer notre 335 00:15:34,905 --> 00:15:35,570 propre type de données. 336 00:15:35,570 --> 00:15:39,660 Mais je suis également en utilisant cette autre mot-clé appelé struct qui me donne une nouvelle 337 00:15:39,660 --> 00:15:40,790 la structure de données. 338 00:15:40,790 --> 00:15:43,980 >> Et cette structure de données je prétends va d'avoir deux choses à l'intérieur de 339 00:15:43,980 --> 00:15:47,060 il - une chaîne appelée nom, et une chaîne appelée maison. 340 00:15:47,060 --> 00:15:49,820 Et le nom que je vais donner à cette structure de données va 341 00:15:49,820 --> 00:15:51,005 d'être appelé étudiant. 342 00:15:51,005 --> 00:15:54,030 Je pourrais l'appeler ce que je veux, mais sémantiquement faire 343 00:15:54,030 --> 00:15:55,810 sens pour moi dans mon esprit. 344 00:15:55,810 --> 00:15:59,160 >> Alors maintenant, si j'ouvre une meilleure version du programme j'ai commencé à écrire 345 00:15:59,160 --> 00:16:00,390 là, permettez-moi de faire défiler vers le haut. 346 00:16:00,390 --> 00:16:03,190 Et il ya encore quelques lignes de code ici, mais je me concentrerai pour 347 00:16:03,190 --> 00:16:04,160 le moment sur une. 348 00:16:04,160 --> 00:16:07,790 J'ai déclaré une constante appelée étudiants et codé en dur 3 pour l'instant. 349 00:16:07,790 --> 00:16:11,110 Mais maintenant, remarquez comment propre mon code commence à arriver. 350 00:16:11,110 --> 00:16:15,030 >> Dans la ligne 22, je déclare éventail d'étudiants. 351 00:16:15,030 --> 00:16:18,760 Et remarquez cet élève est apparemment maintenant un type de données. 352 00:16:18,760 --> 00:16:23,360 Parce que dans la partie supérieure de ce fichier, notez J'ai inclus ce fichier d'en-tête 353 00:16:23,360 --> 00:16:24,820 que je me suis arrêtée il ya quelques instants. 354 00:16:24,820 --> 00:16:28,820 Et ce fichier d'en-tête avait tout simplement cette définition d'un étudiant. 355 00:16:28,820 --> 00:16:32,470 >> Alors maintenant, j'ai créé mes propres données personnalisées Type que les auteurs de C années 356 00:16:32,470 --> 00:16:33,890 Il ya ne pense pas que de l'avance. 357 00:16:33,890 --> 00:16:34,570 Mais pas de problème. 358 00:16:34,570 --> 00:16:35,870 Je peux le faire moi-même. 359 00:16:35,870 --> 00:16:39,050 Il s'agit donc d'un tableau appelé les étudiants, chacun des membres dont 360 00:16:39,050 --> 00:16:41,100 est une structure de l'élève. 361 00:16:41,100 --> 00:16:44,270 Et je veux que trois d'entre eux dans le tableau. 362 00:16:44,270 --> 00:16:46,030 >> Et maintenant, que fait le reste de ce programme? 363 00:16:46,030 --> 00:16:47,550 J'ai besoin de quelque chose un peu arbitraire. 364 00:16:47,550 --> 00:16:51,450 Donc, de ligne 24 avant, I itérer de 0 à 3. 365 00:16:51,450 --> 00:16:54,000 Je demande alors à l'utilisateur Le nom de l'étudiant. 366 00:16:54,000 --> 00:16:56,110 Et puis-je utiliser GetString comme avant. 367 00:16:56,110 --> 00:16:59,410 Puis-je demander à la maison de l'étudiant, et j'utilise GetString comme avant. 368 00:16:59,410 --> 00:17:01,780 >> Mais remarquez - légèrement nouveau morceau de syntaxe - 369 00:17:01,780 --> 00:17:07,010 Je peux encore l'indice de la i-ème étudiant, mais comment puis-je obtenir les données spécifiques 370 00:17:07,010 --> 00:17:08,354 à l'intérieur du champ de la structure? 371 00:17:08,354 --> 00:17:11,770 Eh bien, ce qui est apparemment le nouveau morceau de syntaxe? 372 00:17:11,770 --> 00:17:13,339 C'est juste de l'opérateur point. 373 00:17:13,339 --> 00:17:14,510 >> Nous n'avons pas vraiment vu cela auparavant. 374 00:17:14,510 --> 00:17:17,819 Vous l'avez vu dans pset cinq si vous avez plongé déjà avec les fichiers bitmap. 375 00:17:17,819 --> 00:17:22,372 Mais le point signifie juste à l'intérieur de cette struct ou plusieurs champs, donnent dot 376 00:17:22,372 --> 00:17:24,510 nom, ou me donner maison dot. 377 00:17:24,510 --> 00:17:28,690 Cela signifie aller à l'intérieur de la structure et obtenir ces domaines particuliers. 378 00:17:28,690 --> 00:17:30,200 >> Qu'est-ce que le reste de ce programme? 379 00:17:30,200 --> 00:17:31,190 Ce n'est pas tout ce que sexy. 380 00:17:31,190 --> 00:17:34,640 Remarquez que je itérer de 0 à 3 fois, et je crée simplement un Anglais 381 00:17:34,640 --> 00:17:40,500 phrase comme telle et telle chose est de telle ou une telle maison, en passant le nom de point de 382 00:17:40,500 --> 00:17:43,320 le i-ème étudiant et leur maison ainsi. 383 00:17:43,320 --> 00:17:47,560 >> Et puis enfin, maintenant nous allons commencer à obtenir anale à ce sujet, maintenant que nous sommes 384 00:17:47,560 --> 00:17:49,580 familier avec ce que malloc et d'autres fonctions ont été 385 00:17:49,580 --> 00:17:50,570 faisant tout ce temps. 386 00:17:50,570 --> 00:17:54,220 Pourquoi dois-je libérer la fois le nom et la maison, même si je 387 00:17:54,220 --> 00:17:56,960 ne pas appeler malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString fait. 389 00:17:58,020 --> 00:18:00,930 Et ce fut le sale petit secret pour plusieurs semaines, mais a GetString 390 00:18:00,930 --> 00:18:03,530 été une fuite mémoire dans le placer tout le semestre à ce jour. 391 00:18:03,530 --> 00:18:05,990 Et Valgrand sera finalement révéler ce à nous. 392 00:18:05,990 --> 00:18:10,730 >> Mais ce n'est pas une grosse affaire, parce que je sais que je ne peux tout simplement libérer le nom 393 00:18:10,730 --> 00:18:15,750 et la maison, bien que techniquement, pour être super, super sûr, je serais 394 00:18:15,750 --> 00:18:17,890 faire un peu de vérification d'erreur ici. 395 00:18:17,890 --> 00:18:19,040 Quels sont vos instincts vous disent? 396 00:18:19,040 --> 00:18:22,480 Que devrais-je vérifiais pour avant que je libère ce qui est un 397 00:18:22,480 --> 00:18:25,470 chaîne, alias laquelle un char *? 398 00:18:25,470 --> 00:18:33,460 >> Je devrais vraiment vérifier si les étudiants support i nom dot ne 399 00:18:33,460 --> 00:18:34,840 égal nulle. 400 00:18:34,840 --> 00:18:40,400 Puis ce sera OK pour aller de l'avant et gratuit ce pointeur, et même ou dans l'autre 401 00:18:40,400 --> 00:18:41,160 un aussi. 402 00:18:41,160 --> 00:18:46,860 Si les étudiants support i maison dot n'est pas égale à null, ce sera maintenant protéger 403 00:18:46,860 --> 00:18:52,520 contre le boîtier d'angle dans laquelle GetString retourne quelque chose comme nulle. 404 00:18:52,520 --> 00:18:57,310 Et nous avons vu il ya un instant, printf volonté nous protéger ici en disant simplement 405 00:18:57,310 --> 00:18:58,990 null, ce qui va avoir l'air bizarre. 406 00:18:58,990 --> 00:19:02,340 Mais au moins, il ne sera pas une erreur de segmentation, comme nous l'avons vu. 407 00:19:02,340 --> 00:19:05,990 >> Eh bien, permettez-moi de faire autre chose ici. struct-0 est une sorte de programme stupide 408 00:19:05,990 --> 00:19:09,700 parce que j'entre toutes ces données, puis il a perdu une fois le programme terminé. 409 00:19:09,700 --> 00:19:10,940 Mais permettez-moi d'aller de l'avant et faire ça. 410 00:19:10,940 --> 00:19:12,830 Permettez-moi de faire le terminal fenêtre un peu plus grand. 411 00:19:12,830 --> 00:19:17,000 Permettez-moi de struct-1, qui est une nouvelle version de ce. 412 00:19:17,000 --> 00:19:18,520 >> Je vais zoom avant un peu. 413 00:19:18,520 --> 00:19:21,620 Et maintenant, permettez-moi de courir dot slash struct-1. 414 00:19:21,620 --> 00:19:22,590 Nom de l'élève - 415 00:19:22,590 --> 00:19:31,500 David Mather, nous allons faire Rob Kirkland, Faisons Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Ce qui est intéressant est maintenant préavis - 417 00:19:33,650 --> 00:19:35,540 et je sais que cela parce que J'ai écrit le programme - 418 00:19:35,540 --> 00:19:38,930 il ya maintenant un fichier sur mon actuel répertoire appelé students.csv. 419 00:19:38,930 --> 00:19:40,420 Certains d'entre vous ont vu ceux-ci dans le monde réel. 420 00:19:40,420 --> 00:19:42,980 >> Qu'est-ce qu'un fichier CSV? 421 00:19:42,980 --> 00:19:44,170 Valeurs séparées par des virgules. 422 00:19:44,170 --> 00:19:46,670 C'est un peu comme un pauvre homme La version d'un fichier Excel. 423 00:19:46,670 --> 00:19:50,580 C'est un tableau de lignes et de colonnes vous pouvez ouvrir dans un logiciel comme Excel, 424 00:19:50,580 --> 00:19:51,800 ou des chiffres sur un Mac. 425 00:19:51,800 --> 00:19:55,180 >> Et si j'ouvre ce fichier ici sur gedit, Avis - et les chiffres ne sont pas là. 426 00:19:55,180 --> 00:19:57,360 C'est juste GEdit dire moi numéros de ligne. 427 00:19:57,360 --> 00:19:59,740 Avis sur la première ligne de cette fichier est David et Mather. 428 00:19:59,740 --> 00:20:01,450 La ligne suivante est Rob virgule Kirkland. 429 00:20:01,450 --> 00:20:04,170 Et la troisième ligne est Lauren virgule Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Alors qu'est-ce que j'ai créé? 431 00:20:05,480 --> 00:20:09,580 J'ai maintenant écrit un programme en C qui efficacement peut générer des feuilles de calcul 432 00:20:09,580 --> 00:20:11,840 qui peut être ouvert dans un programme comme Excel. 433 00:20:11,840 --> 00:20:15,520 Pas tout à fait de contraindre un ensemble de données, mais si vous avez beaucoup plus grands morceaux de 434 00:20:15,520 --> 00:20:18,440 données que vous voulez réellement manipuler et faire des graphiques et de les 435 00:20:18,440 --> 00:20:21,260 aiment, c'est peut-être une façon de créer ces données. 436 00:20:21,260 --> 00:20:25,370 En outre, CSVs sont réellement superbe commune juste pour stocker des données simples - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, par exemple, si vous obtenez cotations boursières par leur soi-disant 438 00:20:28,940 --> 00:20:33,180 API, le service gratuit qui vous permet de Stock obtenir up-to-the-date actuelle 439 00:20:33,180 --> 00:20:35,650 citations pour les entreprises, ils de les restituer à l' 440 00:20:35,650 --> 00:20:37,800 super simple format CSV. 441 00:20:37,800 --> 00:20:39,380 >> Alors, comment avons-nous fait cela? 442 00:20:39,380 --> 00:20:42,530 Eh bien remarquer, la plupart de ce programme de pratiquement les mêmes. 443 00:20:42,530 --> 00:20:46,870 Mais remarquez ici, plutôt que print les élèves dehors, sur la ligne 35 444 00:20:46,870 --> 00:20:51,040 avant, je prétends que j'économise le étudiants sur le disque, si vous enregistrez un fichier. 445 00:20:51,040 --> 00:20:53,630 >> Donc, notez que je suis déclarer une FILE * - 446 00:20:53,630 --> 00:20:57,260 maintenant, c'est un peu une anomalie dans C. Pour une raison quelconque, FILE est tout en majuscules, 447 00:20:57,260 --> 00:21:00,690 ce qui n'est pas comme la plupart des autres types de données en C. Mais c'est un haut- 448 00:21:00,690 --> 00:21:02,320 type de données, FILE *. 449 00:21:02,320 --> 00:21:05,900 Et je déclarer un pointeur vers un fichier, comment vous pouvez penser. 450 00:21:05,900 --> 00:21:08,070 >> fopen signifie fichier ouvert. 451 00:21:08,070 --> 00:21:09,470 Quel fichier que vous voulez ouvrir? 452 00:21:09,470 --> 00:21:12,620 Je veux ouvrir un fichier que je veux appeler arbitrairement students.csv. 453 00:21:12,620 --> 00:21:14,480 Je pourrais appeler ça que je veux. 454 00:21:14,480 --> 00:21:15,200 >> Et puis prendre une supposition. 455 00:21:15,200 --> 00:21:18,960 Qu'est-ce que le second argument à fopen probablement dire? 456 00:21:18,960 --> 00:21:21,480 Droite, w pour écrire, pourrait r pour être lu. 457 00:21:21,480 --> 00:21:24,120 Il ya pour append si vous voulez ajouter des lignes et non 458 00:21:24,120 --> 00:21:25,200 écraser le tout. 459 00:21:25,200 --> 00:21:28,005 >> Mais je veux juste de créer ce fichier une fois, donc je vais utiliser devis unquote w. 460 00:21:28,005 --> 00:21:31,880 Et je sais que seulement pour l'avoir lu la documentation, ou la page de manuel. 461 00:21:31,880 --> 00:21:35,100 Si le fichier n'est pas nulle - en d'autres termes, Si tout va bien là-bas - 462 00:21:35,100 --> 00:21:37,820 permettez-moi de parcourir la étudiants de 0 à 3. 463 00:21:37,820 --> 00:21:40,410 >> Et maintenant, remarquez qu'il ya quelque chose un tant soit peu différent 464 00:21:40,410 --> 00:21:42,110 sur la ligne 41 ici. 465 00:21:42,110 --> 00:21:42,960 Ce n'est pas printf. 466 00:21:42,960 --> 00:21:46,530 C'est fprintf pour le fichier printf. 467 00:21:46,530 --> 00:21:47,790 Donc, il va écrire dans le fichier. 468 00:21:47,790 --> 00:21:48,860 Quel fichier? 469 00:21:48,860 --> 00:21:53,630 Celui dont le pointeur que vous spécifiez comme premier argument. 470 00:21:53,630 --> 00:21:55,940 >> Ensuite, nous spécifions une chaîne de format. 471 00:21:55,940 --> 00:21:59,660 Ensuite, nous spécifions que nous voulons chaîne plug-in pour le premier pour cent s, et 472 00:21:59,660 --> 00:22:04,320 puis une autre variable ou le second pour cent s. 473 00:22:04,320 --> 00:22:06,760 Ensuite, nous fermons le dossier avec fclose. 474 00:22:06,760 --> 00:22:09,380 Que je libère la mémoire comme avant, même si Je devrais aller en arrière et ajouter 475 00:22:09,380 --> 00:22:10,540 quelques vérifications pour NULL. 476 00:22:10,540 --> 00:22:12,090 >> Et c'est tout. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose me donne l' possibilité de créer des fichiers texte. 478 00:22:16,960 --> 00:22:19,640 Maintenant, vous verrez dans le problème ensemble cinq, ce qui implique images, vous utiliserez 479 00:22:19,640 --> 00:22:20,990 fichiers binaires au lieu. 480 00:22:20,990 --> 00:22:24,200 Mais, fondamentalement, l'idée est la même, même si les fonctions dont vous aurez 481 00:22:24,200 --> 00:22:28,710 voir sont un peu différentes. 482 00:22:28,710 --> 00:22:32,580 >> Donc visite éclair, mais vous obtiendrez trop familier avec le fichier I/O-- 483 00:22:32,580 --> 00:22:34,960 entrée et de sortie - avec pset cinq. 484 00:22:34,960 --> 00:22:38,607 Et des questions sur le bases initiales ici? 485 00:22:38,607 --> 00:22:39,857 Ouais? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Que faire si vous essayez de dégager une valeur nulle? 488 00:22:43,710 --> 00:22:48,880 Je crois que, à moins libre a obtenu un peu plus convivial, vous pouvez 489 00:22:48,880 --> 00:22:49,890 potentiellement une erreur de segmentation. 490 00:22:49,890 --> 00:22:54,160 En lui passant NULL est mauvais parce que je n'aime pas croire sans la peine de vérifier pour vous, 491 00:22:54,160 --> 00:22:57,330 parce que cela pourrait éventuellement être une perte de temps pour qu'il puisse lui-même faire pour 492 00:22:57,330 --> 00:22:59,022 tout le monde dans le monde. 493 00:22:59,022 --> 00:23:00,590 Bonne question, cependant. 494 00:23:00,590 --> 00:23:04,300 >> Très bien, alors ce genre de se nous un sujet intéressant. 495 00:23:04,300 --> 00:23:07,010 Le thème du jeu de problème cinq est criminalistique. 496 00:23:07,010 --> 00:23:08,420 Au moins c'est une partie de l'ensemble de problème. 497 00:23:08,420 --> 00:23:12,030 Forensics se réfère généralement à l' récupération des informations qui peuvent ou 498 00:23:12,030 --> 00:23:14,110 ne pas avoir été supprimé délibérément. 499 00:23:14,110 --> 00:23:18,680 Et donc j'ai pensé vous donner un rapide goût de ce qui se passe vraiment sur tous les 500 00:23:18,680 --> 00:23:21,230 cette fois sous l' capot de votre ordinateur. 501 00:23:21,230 --> 00:23:23,960 >> Par exemple, si vous avez à l'intérieur de votre ordinateur portable ou votre ordinateur de bureau une 502 00:23:23,960 --> 00:23:28,040 disque dur, c'est soit une mécanique appareil qui tourne en fait - 503 00:23:28,040 --> 00:23:31,650 il ya des choses circulaires appelés plateaux qui ressemble pas à ce que je 504 00:23:31,650 --> 00:23:34,540 juste eu à l'écran ici, mais c'est de plus en plus vieille école. 505 00:23:34,540 --> 00:23:37,370 Il s'agit d'un trois-et-un-demi-pouce disque dur. 506 00:23:37,370 --> 00:23:40,070 Et trois pouces et demi se réfère d' avec de la chose lorsque vous l'installez 507 00:23:40,070 --> 00:23:40,890 dans un ordinateur. 508 00:23:40,890 --> 00:23:44,890 >> Beaucoup d'entre vous les gars dans vos ordinateurs portables maintenant avoir les disques SSD ou disques SSD, 509 00:23:44,890 --> 00:23:46,260 qui n'ont pas de pièces mobiles. 510 00:23:46,260 --> 00:23:49,170 Ils sont plus comme RAM et moins comme ces dispositifs mécaniques. 511 00:23:49,170 --> 00:23:51,450 Mais les idées sont toujours les mêmes, certainement en ce qui concerne 512 00:23:51,450 --> 00:23:52,790 au problème posé cinq. 513 00:23:52,790 --> 00:23:57,400 >> Et si vous pensez maintenant un disque dur représente étant un cercle, qui 514 00:23:57,400 --> 00:23:58,930 Je vais dessiner comme ça ici. 515 00:23:58,930 --> 00:24:02,290 Lorsque vous créez un fichier sur votre ordinateur, qu'il s'agisse d'un SSD, ou en 516 00:24:02,290 --> 00:24:06,610 ce cas, un disque dur de vieille école, ce fichier comprend plusieurs bits. 517 00:24:06,610 --> 00:24:10,510 Disons que c'est ce 0 et 1, tout un tas de 0 et de 1. 518 00:24:10,510 --> 00:24:11,660 Donc, c'est tout mon disque dur. 519 00:24:11,660 --> 00:24:13,225 C'est apparemment un assez gros fichier. 520 00:24:13,225 --> 00:24:18,080 Et il utilise le 0 et de 1 à l' partie du plateau physique. 521 00:24:18,080 --> 00:24:19,750 >> Eh bien, quelle est la partie physique? 522 00:24:19,750 --> 00:24:25,310 Eh bien, il s'avère que sur un disque dur, au moins de ce type, il ya 523 00:24:25,310 --> 00:24:27,340 ces petits minuscules particules magnétiques. 524 00:24:27,340 --> 00:24:32,630 Et ils ont essentiellement nord et pôles sud à eux, de sorte que si vous 525 00:24:32,630 --> 00:24:35,710 tourner un de ces particules magnétiques Ainsi, vous pourriez dire que c'est 526 00:24:35,710 --> 00:24:36,720 représentant un 1. 527 00:24:36,720 --> 00:24:39,340 Et si c'est l'envers du Sud à au nord, vous pourriez dire que c'est 528 00:24:39,340 --> 00:24:40,390 ce qui représente un 0. 529 00:24:40,390 --> 00:24:43,660 >> Ainsi, dans le monde physique réel, c'est comment vous pourriez représenter quelque chose dans 530 00:24:43,660 --> 00:24:45,670 état binaire du 0 et un 1. 531 00:24:45,670 --> 00:24:46,720 Donc, c'est tout un fichier. 532 00:24:46,720 --> 00:24:49,300 Il ya tout un tas de magnétique des particules qui sont de cette façon ou leur 533 00:24:49,300 --> 00:24:51,920 De cette façon, la création de modèles de 0 et de 1. 534 00:24:51,920 --> 00:24:56,760 >> Mais il s'avère que lorsque vous enregistrez un fichier, certaines informations sont enregistrées séparément. 535 00:24:56,760 --> 00:25:00,000 Il s'agit donc d'une petite table, un répertoire, pour ainsi dire. 536 00:25:00,000 --> 00:25:05,810 Et je vais appeler ce nom de colonne, et Je vais appeler cet endroit de la colonne. 537 00:25:05,810 --> 00:25:08,850 >> Et je vais vous dire, supposons c'est mon CV. 538 00:25:08,850 --> 00:25:14,050 Mon resume.doc est stocké à emplacement, disons 123. 539 00:25:14,050 --> 00:25:15,390 Je vais toujours pour ce numéro. 540 00:25:15,390 --> 00:25:18,810 Mais il suffit de dire que, tout comme dans la mémoire RAM, vous pouvez prendre un disque dur 541 00:25:18,810 --> 00:25:22,350 c'est un gigaoctet ou 200 gigaoctets ou un téraoctet, et vous pouvez 542 00:25:22,350 --> 00:25:23,750 nombre de tous les octets. 543 00:25:23,750 --> 00:25:26,480 Vous pouvez numéroter tous les morceaux de 8 bits. 544 00:25:26,480 --> 00:25:29,030 >> Donc, nous allons dire que cette est l'emplacement 123. 545 00:25:29,030 --> 00:25:32,070 Donc ce répertoire à l'intérieur de mon exploitation système se souvient que mon 546 00:25:32,070 --> 00:25:34,250 CV est à l'emplacement 123. 547 00:25:34,250 --> 00:25:36,850 Mais ça devient intéressant lorsque vous supprimez un fichier. 548 00:25:36,850 --> 00:25:37,820 >> Ainsi, par exemple - 549 00:25:37,820 --> 00:25:40,790 et heureusement, la plupart du monde a pris sur cette - ce qui arrive quand 550 00:25:40,790 --> 00:25:45,040 vous faites glisser un fichier sur votre Mac OS Trash ou votre corbeille de Windows? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Quel est le but de le faire? 553 00:25:50,510 --> 00:25:53,860 C'est évidemment pour se débarrasser du dossier, mais qu'est-ce que le fait de glisser 554 00:25:53,860 --> 00:25:57,550 tomber dans votre corbeille ou votre Corbeille faire sur un ordinateur? 555 00:25:57,550 --> 00:25:59,230 >> Absolument rien, vraiment. 556 00:25:59,230 --> 00:26:00,320 C'est un peu comme un dossier. 557 00:26:00,320 --> 00:26:01,800 Il s'agit d'un dossier spécial, pour être sûr. 558 00:26:01,800 --> 00:26:04,460 Mais est-il réellement supprimer le fichier? 559 00:26:04,460 --> 00:26:06,780 >> Eh bien, non, parce que certains d'entre vous sans doute ont été comme, oh putain, vous n'avez pas 560 00:26:06,780 --> 00:26:07,420 dire de le faire. 561 00:26:07,420 --> 00:26:09,130 Donc vous double cliquez sur le Corbeille. 562 00:26:09,130 --> 00:26:11,630 Vous avez poussé autour et vous avez récupéré le fichier juste en le faisant glisser 563 00:26:11,630 --> 00:26:12,110 sortir de là. 564 00:26:12,110 --> 00:26:14,420 Donc, clairement, ce n'est pas nécessairement le supprimer. 565 00:26:14,420 --> 00:26:15,990 >> OK, vous êtes plus intelligent que cela. 566 00:26:15,990 --> 00:26:18,860 Vous savez que, tout en le faisant glisser dans le Corbeille ne signifie pas 567 00:26:18,860 --> 00:26:19,930 vous vider la corbeille. 568 00:26:19,930 --> 00:26:24,110 Alors vous allez jusqu'à le menu, et vous dites Vider la corbeille ou sur Vider la Corbeille. 569 00:26:24,110 --> 00:26:25,360 Alors qu'est-ce qui se passe? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Ouais, donc il est supprimé plus. 572 00:26:32,530 --> 00:26:37,660 Mais tout ce qui arrive est la suivante. 573 00:26:37,660 --> 00:26:45,350 L'ordinateur oublie où resume.doc était. 574 00:26:45,350 --> 00:26:47,400 >> Mais ce qui n'a pas changé apparemment dans l'image? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Les bits, le 0 et de 1 que je prétends sont sur le site d'un certain aspect physique de 577 00:26:55,570 --> 00:26:56,280 le matériel. 578 00:26:56,280 --> 00:26:57,110 Ils sont toujours là. 579 00:26:57,110 --> 00:26:58,930 C'est juste l'ordinateur dispose d' oublié ce qu'ils sont. 580 00:26:58,930 --> 00:27:03,160 >> Donc, c'est essentiellement libéré le fichier de les bits de sorte qu'elles peuvent être réutilisées. 581 00:27:03,160 --> 00:27:06,940 Mais ce n'est que vous créez d'autres fichiers, et d'autres fichiers, en plus de fichiers sera 582 00:27:06,940 --> 00:27:12,150 probabiliste, ceux 0 et de 1, ces particules magnétiques, se réutilisés, 583 00:27:12,150 --> 00:27:16,220 côté à l'envers ou à l'endroit, pour d'autres fichiers, 0 et de 1. 584 00:27:16,220 --> 00:27:17,980 >> Alors, vous avez ce laps de temps. 585 00:27:17,980 --> 00:27:19,860 Et ce n'est pas du prévisible longueur, vraiment. 586 00:27:19,860 --> 00:27:22,240 Cela dépend de la taille de votre disque lecteur et le nombre de fichiers que vous avez et 587 00:27:22,240 --> 00:27:23,490 comment rapidement vous faire de nouveaux. 588 00:27:23,490 --> 00:27:27,050 Mais il ya cette fenêtre de temps pendant qui que ce fichier est toujours parfaitement 589 00:27:27,050 --> 00:27:27,770 recouvrable. 590 00:27:27,770 --> 00:27:31,050 >> Donc si jamais vous utilisez des programmes comme McAfee ou Norton pour essayer de récupérer 591 00:27:31,050 --> 00:27:35,680 données, tout ce qu'ils font est d'essayer de récupérer cette soi-disant répertoire pour 592 00:27:35,680 --> 00:27:37,340 comprendre où votre fichier a été. 593 00:27:37,340 --> 00:27:40,605 Et parfois, Norton et dira: fichier est de 93% récupérable. 594 00:27:40,605 --> 00:27:42,020 Eh bien, qu'est-ce que ça veut dire? 595 00:27:42,020 --> 00:27:45,690 Cela signifie simplement que dans un autre fichier coïncidence fini par utiliser, par exemple, 596 00:27:45,690 --> 00:27:48,920 ces morceaux de votre fichier d'origine. 597 00:27:48,920 --> 00:27:51,950 >> Donc ce qui est réellement impliqué à récupérer les données? 598 00:27:51,950 --> 00:27:55,720 Eh bien, si vous n'avez pas quelque chose comme Norton pré-installé sur votre ordinateur, 599 00:27:55,720 --> 00:27:59,510 le mieux que vous pouvez parfois faire est de regarder à l'intégralité du disque dur à la recherche d' 600 00:27:59,510 --> 00:28:00,510 schémas de bits. 601 00:28:00,510 --> 00:28:05,350 Et l'un des thèmes de jeu de problème cinq, c'est que vous allez consulter la 602 00:28:05,350 --> 00:28:09,570 équivalent d'un disque dur, un légiste l'image d'une carte flash compacte à partir d'une 603 00:28:09,570 --> 00:28:13,660 un appareil photo numérique, la recherche de la 0s et de 1 qui généralement, avec une grande 604 00:28:13,660 --> 00:28:16,720 probabilité, représentent l' démarrage d'une image JPEG. 605 00:28:16,720 --> 00:28:21,120 >> Et vous les gars peuvent récupérer les images par en supposant, si je vois ce modèle de 606 00:28:21,120 --> 00:28:24,380 bits sur l'image légiste, avec forte probabilité, qui marque 607 00:28:24,380 --> 00:28:25,650 le début d'un fichier JPEG. 608 00:28:25,650 --> 00:28:29,520 Et si je vois le même schéma encore, qui marque probablement le début d' 609 00:28:29,520 --> 00:28:32,440 autre JPEG, et un autre JPEG, ou un autre format JPEG. 610 00:28:32,440 --> 00:28:34,970 Et c'est généralement la façon dont récupération de données va fonctionner. 611 00:28:34,970 --> 00:28:37,870 Ce qui est bien JPEG est bien le format du fichier lui-même est peu 612 00:28:37,870 --> 00:28:44,400 complexe, au début de chaque telle fichier est en fait assez identifiable 613 00:28:44,400 --> 00:28:47,370 et simple, comme vous allez le voir, Si vous n'avez pas déjà. 614 00:28:47,370 --> 00:28:50,270 >> Donc, nous allons regarder de plus près dessous le capot pour savoir exactement ce qui a été 615 00:28:50,270 --> 00:28:53,360 passe, et ce que ces 0 et de 1 sont, pour vous donner un peu plus d'un 616 00:28:53,360 --> 00:28:55,330 contexte de ce défi particulier. 617 00:28:55,330 --> 00:28:55,510 >> [LECTURE VIDEO] 618 00:28:55,510 --> 00:28:58,700 >> -Où votre PC stocke plus des données permanentes. 619 00:28:58,700 --> 00:29:03,390 Pour ce faire, les données transitent de RAM ainsi que des signaux de logiciels qui indiquent 620 00:29:03,390 --> 00:29:06,110 le disque dur comment stocker ces données. 621 00:29:06,110 --> 00:29:09,410 Les circuits de disques durs traduisent ces signaux en tension 622 00:29:09,410 --> 00:29:10,870 fluctuations. 623 00:29:10,870 --> 00:29:14,970 Ceux-ci, à leur tour, contrôlent le disque dur de pièces mobiles, certains des rares 624 00:29:14,970 --> 00:29:17,910 pièces mobiles laissés dans le informatique moderne. 625 00:29:17,910 --> 00:29:22,130 >> Certains des signaux de commande d'un moteur qui tourne plateaux revêtus de métal. 626 00:29:22,130 --> 00:29:25,470 Vos données sont effectivement stockées sur ces plateaux. 627 00:29:25,470 --> 00:29:28,610 D'autres signaux se déplacent de lecture / écriture têtes de lecture ou d' 628 00:29:28,610 --> 00:29:30,710 écrire des données sur les plateaux. 629 00:29:30,710 --> 00:29:35,450 Ce mécanisme aussi précis qu'un humain cheveux ne pouvait même pas passer entre le 630 00:29:35,450 --> 00:29:37,280 têtes et plateaux tournants. 631 00:29:37,280 --> 00:29:40,316 Pourtant, tout cela fonctionne à des vitesses fantastiques. 632 00:29:40,316 --> 00:29:40,660 >> [FIN LECTURE VIDÉO] 633 00:29:40,660 --> 00:29:42,190 >> DAVID MALAN: Zoom en un peu plus profonde maintenant à ce qui est 634 00:29:42,190 --> 00:29:44,360 effectivement sur ces plateaux. 635 00:29:44,360 --> 00:29:44,720 >> [LECTURE VIDEO] 636 00:29:44,720 --> 00:29:47,660 >> -Voyons ce que nous venons vu au ralenti. 637 00:29:47,660 --> 00:29:51,710 Quand une brève impulsion de l'électricité est envoyé à la tête de lecture / écriture, si flips 638 00:29:51,710 --> 00:29:54,650 sur une petite électromagnétique pour une fraction de seconde. 639 00:29:54,650 --> 00:29:58,970 L'aimant crée un champ, qui change la polarité d'un minuscule, minuscule 640 00:29:58,970 --> 00:30:02,850 partie des particules métalliques qui manteau de chaque surface du plateau. 641 00:30:02,850 --> 00:30:05,940 >> Une série de motifs de ces minuscules, zones chargées plan sur le disque 642 00:30:05,940 --> 00:30:08,470 représente un seul bit d' les données dans le nombre binaire 643 00:30:08,470 --> 00:30:10,530 système utilisé par les ordinateurs. 644 00:30:10,530 --> 00:30:13,775 Maintenant, si le courant est envoyé dans un sens à travers la tête lecture / écriture, la zone 645 00:30:13,775 --> 00:30:15,970 est polarisée dans une direction. 646 00:30:15,970 --> 00:30:17,950 Si le courant est envoyé dans l' sens inverse, l' 647 00:30:17,950 --> 00:30:19,930 la polarisation est inversée. 648 00:30:19,930 --> 00:30:22,370 >> Comment vous obtenez des données depuis le disque dur? 649 00:30:22,370 --> 00:30:24,090 Juste inverser le processus. 650 00:30:24,090 --> 00:30:26,550 Ce sont donc les particules sur le disque qui obtiennent le courant dans le 651 00:30:26,550 --> 00:30:27,960 lecture / écriture en mouvement. 652 00:30:27,960 --> 00:30:30,700 Mettez-les ensemble des millions de ces segments magnétisés, et 653 00:30:30,700 --> 00:30:32,160 vous avez un fichier. 654 00:30:32,160 --> 00:30:36,060 >> Maintenant, les morceaux d'un fichier unique peut être dispersés sur un lecteur de 655 00:30:36,060 --> 00:30:39,970 plateaux, un peu comme le gâchis de papiers sur votre bureau. 656 00:30:39,970 --> 00:30:43,500 Ainsi, un fichier supplémentaire spécial conserve la trace d'où tout est. 657 00:30:43,500 --> 00:30:45,985 Ne vous aimeriez avoir quelque chose comme ça? 658 00:30:45,985 --> 00:30:46,470 >> [FIN LECTURE VIDÉO] 659 00:30:46,470 --> 00:30:47,820 >> DAVID MALAN: OK, probablement pas. 660 00:30:47,820 --> 00:30:52,070 Alors, combien d'entre vous les gars grandi avec ça? 661 00:30:52,070 --> 00:30:53,970 OK, donc c'est de moins en moins mains chaque année. 662 00:30:53,970 --> 00:30:56,550 Mais je suis contente que tu sois au moins familier avec eux, parce que cela et notre propre 663 00:30:56,550 --> 00:31:00,520 livre démo, malheureusement, sont en train de mourir d'une très une mort lente ici de familiarité. 664 00:31:00,520 --> 00:31:04,010 >> Mais c'est ce que j'ai, au moins, de retour en lycée, l'utilisation utilisé pour les sauvegardes. 665 00:31:04,010 --> 00:31:08,110 Et c'était incroyable, parce que vous pourrait stocker 1,4 mégaoctets sur 666 00:31:08,110 --> 00:31:08,930 ce disque donné. 667 00:31:08,930 --> 00:31:12,260 Et ce fut la version haute densité, comme indiqué par la HD, qui présente 668 00:31:12,260 --> 00:31:14,240 à-dire avant les vidéos HD d'aujourd'hui. 669 00:31:14,240 --> 00:31:16,400 >> Densité standard était de 800 kilo-octets. 670 00:31:16,400 --> 00:31:18,640 Et avant cela, il y avait Disques de 400 kilo-octets. 671 00:31:18,640 --> 00:31:23,120 Et avant cela, il y avait 5 et 1/4 disques pouces, qui étaient de véritables disquette, 672 00:31:23,120 --> 00:31:25,680 et un peu plus large et plus grand que ces choses ici. 673 00:31:25,680 --> 00:31:29,150 Mais vous pouvez réellement voir le soi-disant aspect disquette de ces disques. 674 00:31:29,150 --> 00:31:32,630 >> Et fonctionnellement, ils sont en fait assez similaire aux disques durs d'au 675 00:31:32,630 --> 00:31:33,570 moins ce type. 676 00:31:33,570 --> 00:31:37,270 Encore une fois, les SSD dans les ordinateurs les plus récents travailler un peu différemment. 677 00:31:37,270 --> 00:31:41,530 Mais si vous vous déplacez cette petite languette métallique, vous pouvez voir un petit biscuit, 678 00:31:41,530 --> 00:31:42,560 ou plateau. 679 00:31:42,560 --> 00:31:43,830 >> Ce n'est pas métallique comme celui-ci. 680 00:31:43,830 --> 00:31:46,000 Celui-ci est en fait quelque cher matière plastique. 681 00:31:46,000 --> 00:31:46,750 Et vous pouvez sorte de se tortiller. 682 00:31:46,750 --> 00:31:50,310 Et vous avez trully juste essuyé quelques nombre de bits ou de particules magnétiques 683 00:31:50,310 --> 00:31:51,220 à partir de ce disque. 684 00:31:51,220 --> 00:31:52,710 >> Donc, heureusement, il n'y a rien à ce sujet. 685 00:31:52,710 --> 00:31:55,790 Si cette chose est la façon - et couvre vos yeux et à ceux de votre voisin - 686 00:31:55,790 --> 00:31:58,865 il vous suffit de retirer ce genre de ensemble hors de la gaine comme ça. 687 00:31:58,865 --> 00:32:01,900 Mais il ya un petit ressort, donc conscient de cela avec vos yeux. 688 00:32:01,900 --> 00:32:03,620 Alors maintenant, vous avez vraiment une disquette. 689 00:32:03,620 --> 00:32:07,090 >> Et ce qui est remarquable au sujet de cette est que dans la mesure où il s'agit d'une 690 00:32:07,090 --> 00:32:10,830 représentation à petite échelle d'un plus grand disque dur, ces choses sont super, 691 00:32:10,830 --> 00:32:11,590 super simple. 692 00:32:11,590 --> 00:32:15,170 Si vous pincez le fond des choses, maintenant que que chose de métallique est éteint, et le zeste 693 00:32:15,170 --> 00:32:20,990 les ouvrir, tout ce qu'il ya, c'est deux morceaux de feutre et le disque soi-disant disquette 694 00:32:20,990 --> 00:32:22,930 avec une pièce de métal à l'intérieur. 695 00:32:22,930 --> 00:32:25,990 >> Et il en va de la moitié des le contenu de mon disque. 696 00:32:25,990 --> 00:32:27,540 Il en va de l'autre moitié d'entre eux. 697 00:32:27,540 --> 00:32:31,375 Mais c'est tout ce qui tournait à l'intérieur de votre ordinateur antan. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> Et encore une fois, de mettre cela en perspective, quelle est la taille maximum de votre 700 00:32:38,310 --> 00:32:39,560 disques durs de nos jours? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 gigaoctets, un téraoctet, peut-être en un ordinateur de bureau, 2 téraoctets, 3 703 00:32:46,230 --> 00:32:47,630 téraoctets, 4 téraoctets, non? 704 00:32:47,630 --> 00:32:52,480 Il s'agit d'un mégaoctet, donner ou prendre, qui ne peut même pas tenir un MP3 classique 705 00:32:52,480 --> 00:32:55,310 anymore ces jours-ci, ou certains fichier musical similaire. 706 00:32:55,310 --> 00:32:59,500 >> Donc, un petit souvenir pour vous aujourd'hui, et également pour aider à contextualiser ce 707 00:32:59,500 --> 00:33:03,570 nous allons prendre pour acquis maintenant problème posé cinq. 708 00:33:03,570 --> 00:33:04,820 Donc, ce sont à vous. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Alors permettez-moi de transition à l'endroit où sera passer la prochaine pset ainsi. 711 00:33:13,370 --> 00:33:18,470 Donc, nous avons maintenant mis cette page pour - oh, quelques annonces rapidement. 712 00:33:18,470 --> 00:33:21,730 >> Ce vendredi, si vous souhaitez rejoindre CS50 pour le déjeuner, aller à l'endroit habituel, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 Et projet final - 715 00:33:25,100 --> 00:33:28,520 si par le programme, nous avons mis en ligne le spécification du projet final déjà. 716 00:33:28,520 --> 00:33:31,410 Sachez que cela ne signifie pas c'est dû en particulier bientôt. 717 00:33:31,410 --> 00:33:33,990 Il a publié, vraiment, juste pour obtenir vous les gars y penser. 718 00:33:33,990 --> 00:33:37,620 Et en effet, un super-importante pourcentage d'entre vous sera s'attaque 719 00:33:37,620 --> 00:33:40,780 projets finaux sur le matériel que nous n'ont même pas appris à la classe, 720 00:33:40,780 --> 00:33:42,730 mais sera dès la semaine prochaine. 721 00:33:42,730 --> 00:33:45,530 >> Remarquez, cependant, que la spec appelle à quelques différents composants de l' 722 00:33:45,530 --> 00:33:46,190 projet final. 723 00:33:46,190 --> 00:33:49,590 La première, dans quelques semaines, est une pré-proposition, un e-mail assez décontracté pour 724 00:33:49,590 --> 00:33:52,760 votre TF pour lui dire ou ce que vous êtes réfléchir à votre projet, avec 725 00:33:52,760 --> 00:33:53,650 Pas d'engagement. 726 00:33:53,650 --> 00:33:56,710 Proposition sera votre particulier engagement, en disant: ici, c'est ce que 727 00:33:56,710 --> 00:33:57,770 Je voudrais faire pour mon projet. 728 00:33:57,770 --> 00:33:58,250 Qu'en pensez-vous? 729 00:33:58,250 --> 00:33:58,650 Trop gros? 730 00:33:58,650 --> 00:33:59,145 Trop petit? 731 00:33:59,145 --> 00:34:00,330 Est-il gérable? 732 00:34:00,330 --> 00:34:02,230 Et vous voyez les spécifications pour plus de détails. 733 00:34:02,230 --> 00:34:05,060 >> Quelques semaines après que le statut rapport, qui est une façon similaire 734 00:34:05,060 --> 00:34:08,260 email décontracté à votre TF-à-dire à quel point loin derrière vous êtes dans votre finale 735 00:34:08,260 --> 00:34:12,360 la mise en œuvre du projet, suivie d' le CS50 Hackathon à laquelle tout le monde 736 00:34:12,360 --> 00:34:17,520 est invité, qui sera un événement à partir de 20h00 un soir jusqu'à 07h00 737 00:34:17,520 --> 00:34:19,150 H le lendemain matin. 738 00:34:19,150 --> 00:34:22,560 Pizza, comme je peux l'ai mentionné la semaine zéro, wil sera servi à 21h00, 739 00:34:22,560 --> 00:34:24,120 La nourriture chinoise à 01:00. 740 00:34:24,120 --> 00:34:27,929 Et si vous êtes encore éveillé à 5h00, nous vous emmènerons à IHOP pour le petit déjeuner. 741 00:34:27,929 --> 00:34:31,310 >> Ainsi, le Hackathon est l'un des plus des expériences mémorables dans la classe. 742 00:34:31,310 --> 00:34:35,290 Ensuite, la mise en œuvre est due, et puis l'apogée CS50 Foire. 743 00:34:35,290 --> 00:34:38,070 Plus de détails sur tous ces dans les semaines à venir. 744 00:34:38,070 --> 00:34:40,739 >> Mais revenons à quelque chose vieille école - 745 00:34:40,739 --> 00:34:41,920 encore une fois, un tableau. 746 00:34:41,920 --> 00:34:45,040 Donc, un tableau était belle, parce qu'elle n'en résout problèmes comme nous avons vu qu'un 747 00:34:45,040 --> 00:34:49,290 Il ya actuellement des structures d'étudiants obtenir un peu hors de contrôle si nous 748 00:34:49,290 --> 00:34:52,405 veulent avoir un élève, étudiant deux, étudiant trois, étudiant dot dot dot, 749 00:34:52,405 --> 00:34:54,400 un nombre arbitraire d'étudiants. 750 00:34:54,400 --> 00:34:58,850 >> Donc, les tableaux, il ya quelques semaines, fondit en et résolu tous nos problèmes de pas 751 00:34:58,850 --> 00:35:03,340 savoir à l'avance combien de choses de quelque type que nous pourrions souhaiter. 752 00:35:03,340 --> 00:35:07,390 Et nous avons vu que struct peuvent nous aider mieux organiser notre code et le garder 753 00:35:07,390 --> 00:35:11,660 variables conceptuellement similaires, comme un nom et une maison, ensemble, de sorte que nous 754 00:35:11,660 --> 00:35:15,570 peut les traiter comme une seule entité à l'intérieur qui sont au nombre de plus petits morceaux. 755 00:35:15,570 --> 00:35:17,810 >> Mais tableaux présentent certains inconvénients. 756 00:35:17,810 --> 00:35:19,780 Quels sont certains des inconvénients Nous avons rencontré 757 00:35:19,780 --> 00:35:22,320 avec des tableaux jusqu'à présent? 758 00:35:22,320 --> 00:35:23,450 Qu'est-ce que c'est? 759 00:35:23,450 --> 00:35:28,130 Taille fixe - même si bien que vous pourriez être en mesure d'allouer de la mémoire pour une 760 00:35:28,130 --> 00:35:32,310 tableau, une fois que vous savez combien d'étudiants vous avez, combien de caractères que vous avez 761 00:35:32,310 --> 00:35:35,460 de l'utilisateur, une fois que vous avez alloué le tableau, vous avez genre de peinture 762 00:35:35,460 --> 00:35:36,740 vous dans un coin. 763 00:35:36,740 --> 00:35:40,600 >> Parce que vous ne pouvez pas insérer de nouveaux éléments dans le milieu d'un tableau. 764 00:35:40,600 --> 00:35:43,660 Vous ne pouvez pas insérer d'autres éléments à la fin d'un tableau. 765 00:35:43,660 --> 00:35:47,750 Vraiment, vous devez recourir à la création d'un tout nouveau tableau, comme nous en avons discuté, 766 00:35:47,750 --> 00:35:49,320 la copie de l'ancien dans le nouveau. 767 00:35:49,320 --> 00:35:52,610 Et encore une fois, c'est le mal de tête qui GetString traite pour vous. 768 00:35:52,610 --> 00:35:56,170 >> Mais encore une fois, vous ne pouvez même insérer quelque chose dans le milieu du tableau 769 00:35:56,170 --> 00:35:58,200 si le taux n'est pas entièrement rempli. 770 00:35:58,200 --> 00:36:03,010 Par exemple, si ce tableau ici de taille six seulement a cinq choses en elle, 771 00:36:03,010 --> 00:36:06,080 Eh bien, vous pouvez simplement virer quelque chose sur la fin. 772 00:36:06,080 --> 00:36:08,200 Mais que faire si vous voulez insérer quelque chose dans le milieu de l' 773 00:36:08,200 --> 00:36:11,280 tableau, même si cela peut avoir cinq des six choses en elle? 774 00:36:11,280 --> 00:36:14,250 >> Eh bien, qu'avons-nous faire quand nous avions tous de nos volontaires humains en scène 775 00:36:14,250 --> 00:36:15,110 semaines passé? 776 00:36:15,110 --> 00:36:18,710 Si nous voulions mettre quelqu'un ici, que ce soit ces gens comment faire avancer ce 777 00:36:18,710 --> 00:36:22,540 chemin, ou à ces gens comment faire avancer ce Ainsi, et qui est devenu cher. 778 00:36:22,540 --> 00:36:26,950 Le déplacement de personnes à l'intérieur d'un ensemble fini d'ajouter et coûtant 779 00:36:26,950 --> 00:36:31,240 nous le temps, donc beaucoup de notre n carré les temps de parcours comme le tri par insertion, pour 780 00:36:31,240 --> 00:36:32,550 Ainsi, dans le pire des cas. 781 00:36:32,550 --> 00:36:36,520 Alors tableaux sont grands, mais vous devez savez à l'avance la taille que vous voulez. 782 00:36:36,520 --> 00:36:38,030 >> Alors OK, voici une solution. 783 00:36:38,030 --> 00:36:43,860 Si je ne sais pas à l'avance combien d' étudiants que je pourrais avoir, et je sais une fois 784 00:36:43,860 --> 00:36:47,870 Je décide, cependant, je suis coincé avec qui de nombreux étudiants, pourquoi ne pas simplement toujours 785 00:36:47,870 --> 00:36:51,740 allouer le double d'espace que je pourrais penser que je dois? 786 00:36:51,740 --> 00:36:54,450 N'est-ce pas une solution raisonnable? 787 00:36:54,450 --> 00:36:58,240 >> De façon réaliste, je ne pense pas que nous sommes va avoir besoin de plus de 50 emplacements 788 00:36:58,240 --> 00:37:02,190 dans un tableau d'une classe moyenne taille, donc on va plutôt Round Up. 789 00:37:02,190 --> 00:37:07,040 Je vais faire 100 emplacements dans mon tableau, juste de sorte que nous pouvons certainement obtenir l' 790 00:37:07,040 --> 00:37:10,330 nombre d'étudiants, je m'attends à être dans une certaine classe de taille moyenne. 791 00:37:10,330 --> 00:37:14,320 Alors pourquoi ne pas rassembler et d'allouer plus de mémoire, typiquement, pour un tableau 792 00:37:14,320 --> 00:37:16,290 que vous pensez que vous pourriez même avoir besoin? 793 00:37:16,290 --> 00:37:20,190 Qu'est-ce que c'est facile refoulement à cette idée? 794 00:37:20,190 --> 00:37:21,440 >> Vous êtes en train de perdre la mémoire. 795 00:37:21,440 --> 00:37:25,350 Littéralement chaque programme que vous écrivez ensuite est peut-être en utilisant deux fois plus de mémoire que 796 00:37:25,350 --> 00:37:26,680 vous avez réellement besoin. 797 00:37:26,680 --> 00:37:28,990 Et c'est juste ne se sent pas comme un particulièrement solution élégante. 798 00:37:28,990 --> 00:37:31,990 De plus, il diminue juste le probabilité d'un problème. 799 00:37:31,990 --> 00:37:35,300 S'il vous arrive d'avoir un cours très populaire un semestre et vous avez 101 800 00:37:35,300 --> 00:37:39,610 étudiants, le programme est encore face fondamentalement la même question. 801 00:37:39,610 --> 00:37:44,280 >> Donc, heureusement, il ya une solution à cette annonce à tous nos problèmes dans la forme 802 00:37:44,280 --> 00:37:46,790 des structures de données qui sont plus complexes que ceux 803 00:37:46,790 --> 00:37:47,970 nous avons vu jusqu'à présent. 804 00:37:47,970 --> 00:37:50,530 C'est, je prétends, c'est une liste chaînée. 805 00:37:50,530 --> 00:37:51,920 Il s'agit d'une liste de numéros - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, et 34 - 807 00:37:54,970 --> 00:38:00,120 qui ont été reliés entre eux par l'intermédiaire de ce que j'ai dessiné des flèches. 808 00:38:00,120 --> 00:38:03,580 >> En d'autres termes, si je voulais représenter un tableau, je pourrais faire 809 00:38:03,580 --> 00:38:04,910 quelque chose comme ça. 810 00:38:04,910 --> 00:38:07,310 Et je vais mettre cela sur le dessus dans un instant. 811 00:38:07,310 --> 00:38:09,970 Je pouvais faire - 812 00:38:09,970 --> 00:38:12,520 bonjour, tout droit. 813 00:38:12,520 --> 00:38:14,470 Stand by. 814 00:38:14,470 --> 00:38:17,360 Nouvel ordinateur ici, clair - 815 00:38:17,360 --> 00:38:18,090 Très bien. 816 00:38:18,090 --> 00:38:21,730 >> Donc, si j'ai ces chiffres dans le tableau - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 pas nécessairement à l'échelle. 819 00:38:30,530 --> 00:38:33,730 Bon, alors voici mon tableau - 820 00:38:33,730 --> 00:38:34,980 oh mon dieu. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Bon, alors voici mon tableau. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Oh mon dieu. 825 00:38:45,050 --> 00:38:48,820 >> [Rires] 826 00:38:48,820 --> 00:38:49,440 >> DAVID MALAN: Pretend. 827 00:38:49,440 --> 00:38:52,330 C'est trop d'effort pour revenir et corriger cela, il ya - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Nous avons donc cette série de 9, 17, 22, 26, et 34. 830 00:38:57,650 --> 00:39:00,260 Pour ceux d'entre vous peut voir l' erreur embarrassante Je viens de faire, 831 00:39:00,260 --> 00:39:00,830 il est là. 832 00:39:00,830 --> 00:39:04,490 >> Donc, je prétends que c'est une solution très efficace. 833 00:39:04,490 --> 00:39:07,310 J'ai réparti comme beaucoup ints que J'ai besoin - un, deux, trois, 834 00:39:07,310 --> 00:39:09,100 quatre, cinq ou six - 835 00:39:09,100 --> 00:39:11,660 et j'ai ensuite stocké les numéros à l'intérieur de cette matrice. 836 00:39:11,660 --> 00:39:15,220 Mais supposons, alors, je veux insérer une valeur comme le numéro 8? 837 00:39:15,220 --> 00:39:16,100 Alors, où faut-il aller? 838 00:39:16,100 --> 00:39:18,530 Supposons que je veux insérer un nombre identique 20. 839 00:39:18,530 --> 00:39:19,790 Alors, où faut-il aller? 840 00:39:19,790 --> 00:39:23,160 Quelque part au milieu, ou le nombre 35 doit aller 841 00:39:23,160 --> 00:39:24,010 quelque part à la fin. 842 00:39:24,010 --> 00:39:25,320 Mais je suis tout à fait hors de l'espace. 843 00:39:25,320 --> 00:39:29,120 >> Et c'est donc un enjeu fondamental des tableaux qui ne sont la solution. 844 00:39:29,120 --> 00:39:32,280 J'ai réclamé il ya un instant, GetString résout ce problème. 845 00:39:32,280 --> 00:39:37,380 Si vous souhaitez insérer un sixième numéro dans cette matrice, ce qui est au moins l'un 846 00:39:37,380 --> 00:39:40,090 Solution Vous pouvez retomber sur pour sûr, comme nous le faisons avec GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Qu'est-ce que c'est? 849 00:39:46,030 --> 00:39:48,190 >> Eh bien, le rendre plus grand est plus facile à dire qu'à faire. 850 00:39:48,190 --> 00:39:52,810 Nous ne pouvons pas nécessairement faire le tableau plus grand, mais que pouvons-nous faire? 851 00:39:52,810 --> 00:39:56,570 Faire un nouveau tableau qui est plus grand, de taille 6, ou peut-être la taille 10, si nous voulons 852 00:39:56,570 --> 00:40:00,490 de devancer les choses, puis copiez l'ancien tableau dans le nouveau, puis 853 00:40:00,490 --> 00:40:01,680 libérer l'ancien tableau. 854 00:40:01,680 --> 00:40:05,770 >> Mais quelle est la durée maintenant de ce processus? 855 00:40:05,770 --> 00:40:09,870 Il est grand O n, parce que la copie va vous coûter quelques unités de 856 00:40:09,870 --> 00:40:13,480 temps, donc pas idéal si nous devons allouer un nouveau tableau, qui va 857 00:40:13,480 --> 00:40:15,610 à consommer deux fois plus mémoire temporaire. 858 00:40:15,610 --> 00:40:16,660 Copiez neuf avec du vieux - 859 00:40:16,660 --> 00:40:18,800 Je veux dire, c'est juste un mal de tête, qui est, encore une fois, pourquoi nous avons écrit 860 00:40:18,800 --> 00:40:19,920 GetString pour vous. 861 00:40:19,920 --> 00:40:21,380 >> Alors, que pouvons-nous faire à la place? 862 00:40:21,380 --> 00:40:25,000 Eh bien, si notre structure de données a effectivement des lacunes en elle? 863 00:40:25,000 --> 00:40:30,790 Supposons que je relâche mon objectif d'avoir blocs contigus de mémoire, où 9 864 00:40:30,790 --> 00:40:34,500 est juste à côté de 17, ce qui est juste à côté de 22, et ainsi de suite. 865 00:40:34,500 --> 00:40:39,570 >> Et supposons que 9 peut être ici en RAM, et 17 peuvent être ici en RAM, 866 00:40:39,570 --> 00:40:40,990 et 22 peut être plus ici dans la RAM. 867 00:40:40,990 --> 00:40:43,610 En d'autres termes, je n'ai pas besoin d'eux même dos à dos plus. 868 00:40:43,610 --> 00:40:47,850 Je dois juste quelque sorte enfiler une aiguille à travers chacun de ces nombres, ou chaque 869 00:40:47,850 --> 00:40:51,010 de ces nœuds, que nous appellerons l' rectangles comme je l'ai tiré les vers, 870 00:40:51,010 --> 00:40:55,670 rappeler comment se rendre à la dernière un tel noeud de la première. 871 00:40:55,670 --> 00:40:59,940 >> Alors, quelle est la construction de programmation nous avons vu tout récemment avec qui je 872 00:40:59,940 --> 00:41:03,030 peut mettre en œuvre ce thread, ou dessiné ici, avec qui je peux 873 00:41:03,030 --> 00:41:05,430 mettre en œuvre ces flèches? 874 00:41:05,430 --> 00:41:06,500 Pointeurs Donc, pas vrai? 875 00:41:06,500 --> 00:41:09,560 Si je allouer pas seulement un int, mais un nœud - et par 876 00:41:09,560 --> 00:41:10,810 noeud, je veux juste conteneur. 877 00:41:10,810 --> 00:41:12,900 Et visuellement, je veux dire un rectangle. 878 00:41:12,900 --> 00:41:16,420 Ainsi, un nœud doit apparemment pour contenir deux valeurs - 879 00:41:16,420 --> 00:41:21,490 l'int lui-même, et puis, comme le laisse entendre la moitié inférieure du rectangle, 880 00:41:21,490 --> 00:41:23,010 assez d'espace pour un int. 881 00:41:23,010 --> 00:41:26,130 >> Il suffit donc de penser à l'avenir ici, quelle est la taille de ce nœud, ce 882 00:41:26,130 --> 00:41:27,170 récipient en question? 883 00:41:27,170 --> 00:41:29,250 Combien d'octets pour l'int? 884 00:41:29,250 --> 00:41:31,310 Vraisemblablement 4, si ce n'est le même que d'habitude. 885 00:41:31,310 --> 00:41:33,270 Et puis, combien d'octets pour le pointeur? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Donc ce conteneur, ou ce nœud, est va être une structure de 8 octets. 888 00:41:37,940 --> 00:41:41,760 Oh, et c'est une heureuse coïncidence que nous avons introduit cette notion de 889 00:41:41,760 --> 00:41:44,400 une structure ou une structure C. 890 00:41:44,400 --> 00:41:48,890 >> Donc, je prétends que je veux prendre une étape vers cette plus sophistiqué 891 00:41:48,890 --> 00:41:52,560 mise en oeuvre d'une liste de numéros, un liste chaînée de chiffres, je dois faire un 892 00:41:52,560 --> 00:41:56,920 peu plus de réflexion à l'avant et déclarer non seulement un int, mais une struct 893 00:41:56,920 --> 00:41:58,620 que je vais l'appeler, de façon classique ici, noeud. 894 00:41:58,620 --> 00:42:01,630 Nous pourrions l'appeler tout ce que nous voulons, mais nœud va être thématique dans beaucoup 895 00:42:01,630 --> 00:42:03,560 des choses que nous commençons à examiner maintenant. 896 00:42:03,560 --> 00:42:06,480 >> A l'intérieur de ce noeud est un int n. 897 00:42:06,480 --> 00:42:09,350 Et puis, cette syntaxe, un peu bizarre au premier abord - 898 00:42:09,350 --> 00:42:12,960 struct noeud * à côté. 899 00:42:12,960 --> 00:42:16,900 Eh bien imagée, c'est quoi? 900 00:42:16,900 --> 00:42:21,000 C'est la moitié inférieure de le rectangle que nous avons vu 901 00:42:21,000 --> 00:42:22,730 Il ya juste un moment. 902 00:42:22,730 --> 00:42:27,600 >> Mais pourquoi dis-je struct noeud * plutôt que de simplement noeud *? 903 00:42:27,600 --> 00:42:31,370 Parce que si ce pointeur pointe sur un autre nœud, c'est juste l' 904 00:42:31,370 --> 00:42:32,760 l'adresse d'un noeud. 905 00:42:32,760 --> 00:42:35,630 C'est conforme à ce que nous avons discuté de pointeurs jusqu'à présent. 906 00:42:35,630 --> 00:42:39,690 Mais pourquoi, si je revendique cette structure est appelé nœud, dois-je dire struct 907 00:42:39,690 --> 00:42:42,660 nœud à l'intérieur ici? 908 00:42:42,660 --> 00:42:43,190 >> Exactement. 909 00:42:43,190 --> 00:42:46,490 C'est en quelque sorte une réalité stupide de C. Le typedef, pour ainsi dire, n'a pas 910 00:42:46,490 --> 00:42:47,220 encore arrivé. 911 00:42:47,220 --> 00:42:48,510 C est super littéral. 912 00:42:48,510 --> 00:42:51,050 Il lit votre code de recharge à bas, de gauche à droite. 913 00:42:51,050 --> 00:42:54,930 Et jusqu'à ce qu'il frappe qui virgule sur la ligne de fond, devinez ce qui ne 914 00:42:54,930 --> 00:42:57,590 exister en tant que type de données? 915 00:42:57,590 --> 00:42:59,060 Noeud, noeud entre guillemets. 916 00:42:59,060 --> 00:43:03,050 >> Mais en raison de la plus verbeux déclaration que j'ai faite sur la première ligne - 917 00:43:03,050 --> 00:43:05,340 noeud struct typedef - 918 00:43:05,340 --> 00:43:08,790 parce que cela est venu en premier, avant l' accolades, c'est un peu comme 919 00:43:08,790 --> 00:43:11,800 pré-éduquer Clang que vous connaître, donnez-moi une struct 920 00:43:11,800 --> 00:43:13,570 appelé nœud de structure. 921 00:43:13,570 --> 00:43:16,270 Franchement, je n'aime pas les choses d'appel struct noeud, struct noeud tout 922 00:43:16,270 --> 00:43:17,090 tout au long de mon code. 923 00:43:17,090 --> 00:43:20,660 Mais je ne l'utilise une fois, juste à l'intérieur, afin que je puisse efficacement 924 00:43:20,660 --> 00:43:25,010 créer une sorte de référence circulaire, non un pointeur vers moi en soi, mais un 925 00:43:25,010 --> 00:43:29,400 pointeur vers un autre de un type identique. 926 00:43:29,400 --> 00:43:32,330 >> Ainsi, il s'avère que sur une structure de données comme ça, il ya quelques 927 00:43:32,330 --> 00:43:34,470 les opérations qui pourraient être d'intérêt pour nous. 928 00:43:34,470 --> 00:43:37,460 Nous pourrions insérer dans une liste comme ça. 929 00:43:37,460 --> 00:43:39,850 Nous pourrions vouloir supprimer à partir d'une liste de ce genre. 930 00:43:39,850 --> 00:43:43,490 Nous pourrions vouloir consulter la liste pour un valeur, ou, plus généralement, traverse. 931 00:43:43,490 --> 00:43:46,410 Et traverse est juste une façon élégante de disant départ à gauche et déplacer tous 932 00:43:46,410 --> 00:43:47,650 le chemin vers la droite. 933 00:43:47,650 --> 00:43:52,640 >> Et remarquez, même avec cette légèrement plus structure de données sophistiqué, laissez- 934 00:43:52,640 --> 00:43:56,510 me propose que nous pouvons emprunter quelques-uns des les idées des deux dernières semaines et 935 00:43:56,510 --> 00:43:58,410 mettre en œuvre une fonction appelée chercher comme ça. 936 00:43:58,410 --> 00:44:01,360 Il va retourner true ou faux, indiquant, oui ou 937 00:44:01,360 --> 00:44:03,390 non, n est compris dans la liste. 938 00:44:03,390 --> 00:44:05,960 Son second argument est un pointeur à la liste lui-même, de sorte qu'une 939 00:44:05,960 --> 00:44:07,920 pointeur à un noeud. 940 00:44:07,920 --> 00:44:10,350 >> Tout ce que je vais ensuite faire est de déclarer une variable temporaire. 941 00:44:10,350 --> 00:44:12,730 Nous l'appellerons ptr par convention, pour pointer. 942 00:44:12,730 --> 00:44:15,220 Et je lui assigner égale à la au début de la liste. 943 00:44:15,220 --> 00:44:16,680 >> Et maintenant remarquer la boucle while. 944 00:44:16,680 --> 00:44:20,640 Tant que le pointeur n'est pas égal null, je vais vérifier. 945 00:44:20,640 --> 00:44:24,520 Est pointeur flèche n égal à le n qui a été adoptée en? 946 00:44:24,520 --> 00:44:26,410 Et attendez une minute - nouveau morceau de syntaxe. 947 00:44:26,410 --> 00:44:29,324 Qu'est-ce que la flèche tout d'un coup? 948 00:44:29,324 --> 00:44:30,574 Ouais? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Exactement. 951 00:44:34,810 --> 00:44:38,860 Donc, alors qu'il ya quelques minutes, nous avons utilisé la notation par points pour accéder à quelque chose 952 00:44:38,860 --> 00:44:43,080 à l'intérieur d'un de la structure, si la variable vous avez n'est pas la struct 953 00:44:43,080 --> 00:44:47,420 lui-même, mais un pointeur vers une struct, Heureusement, un morceau de syntaxe 954 00:44:47,420 --> 00:44:48,620 finalement logique intuitive. 955 00:44:48,620 --> 00:44:52,360 La flèche signifie suivre le pointeur, comme nos flèches signifient généralement 956 00:44:52,360 --> 00:44:56,570 imagée et aller à le champ de données à l'intérieur. 957 00:44:56,570 --> 00:44:59,700 Alors flèche est la même chose que dot, mais vous utilisez quand vous avez un pointeur. 958 00:44:59,700 --> 00:45:05,270 >> Donc, pour récapituler puis, si le champ n à l'intérieur de la structure appelé pointeur 959 00:45:05,270 --> 00:45:07,760 égal à égal n, retourner vrai. 960 00:45:07,760 --> 00:45:11,970 Sinon, cette ligne ici - pointeur égaux pointeur suivante. 961 00:45:11,970 --> 00:45:17,540 Donc ce que cela fait, avis, c'est que si je je suis actuellement en montrant la struct 962 00:45:17,540 --> 00:45:21,430 contenant 9 et 9 n'est pas le numéro Je suis à la recherche - suppose que je suis à la recherche 963 00:45:21,430 --> 00:45:22,830 pour n égal à 50 - 964 00:45:22,830 --> 00:45:25,930 Je vais mettre à jour mon pointeur temporaire de ne pas remarquer à ce noeud 965 00:45:25,930 --> 00:45:31,190 plus, mais pointeur flèche à côté, ce qui va me mettre ici. 966 00:45:31,190 --> 00:45:34,270 >> Maintenant, j'ai réalisé un tourbillon mise en place. 967 00:45:34,270 --> 00:45:37,380 Le mercredi, nous allons effectivement faire ce avec certains humains et avec un peu plus 968 00:45:37,380 --> 00:45:38,900 Code à un rythme plus lent. 969 00:45:38,900 --> 00:45:42,990 Mais se rendre compte, nous sommes en train de faire nos données structures plus complexes afin que notre 970 00:45:42,990 --> 00:45:45,780 algorithmes peuvent devenir plus efficace, qui va être nécessaire pour 971 00:45:45,780 --> 00:45:50,500 pset six ans, lorsque nous chargeons en, encore une fois, ceux 150.000 mots, mais il faut le faire 972 00:45:50,500 --> 00:45:55,650 efficacement, et idéalement, créer un programme qui fonctionne pour nos utilisateurs de ne pas en 973 00:45:55,650 --> 00:46:00,460 linéaire, hors de n au carré, mais dans constante de temps, dans l'idéal. 974 00:46:00,460 --> 00:46:02,300 >> Nous vous verrons mercredi. 975 00:46:02,300 --> 00:46:07,240 >> Président: À la prochaine CS50, David oublie son scénario de base. 976 00:46:07,240 --> 00:46:12,770 >> DAVID MALAN: Et c'est comme ça que vous envoyez des messages texte avec C. Que le - 977 00:46:12,770 --> 00:46:14,020 >> [MESSAGE TEXTE DIVERS Sons de notification] 978 00:46:14,020 --> 00:46:19,734