1 00:00:00,000 --> 00:00:02,200 [Powered by Google Translate] [Semaine 3] 2 00:00:02,200 --> 00:00:03,950 [David J. Malan - Université de Harvard] 3 00:00:03,950 --> 00:00:07,140 [C'est CS50. - CS50.TV] 4 00:00:07,140 --> 00:00:10,720 Permettez-moi de nous orienter dans la direction de l'endroit où nous nous étions arrêtés la dernière fois, 5 00:00:10,720 --> 00:00:13,890 qui commençait à réfléchir un peu plus sur la syntaxe 6 00:00:13,890 --> 00:00:17,150 et essayer de penser un peu moins à tous les points caractéristiques 7 00:00:17,150 --> 00:00:20,630 qui prend un peu de temps pour s'acclimater à ce jour en termes de points-virgules 8 00:00:20,630 --> 00:00:22,360 et les parenthèses et les accolades, 9 00:00:22,360 --> 00:00:25,630 de commencer à prendre les choses un peu à un niveau conceptuel plus élevé 10 00:00:25,630 --> 00:00:28,800 de sorte que les problèmes que nous avons maintenant commencer à résoudre au cours des prochaines semaines 11 00:00:28,800 --> 00:00:32,340 vont impliquer beaucoup plus dans les problèmes conceptuels de haut niveau 12 00:00:32,340 --> 00:00:36,310 et un peu moins dans la syntaxe que vous obtenez vos pieds mouillés 13 00:00:36,310 --> 00:00:40,090 et salir les mains avec une partie de la syntaxe de ces dernières semaines. 14 00:00:40,090 --> 00:00:43,690 >> Ainsi, rappelons que la semaine dernière, nous avons introduit cette notion d'un tableau. 15 00:00:43,690 --> 00:00:49,320 Et un tableau en anglais peut être décrit comme quoi? >> [Réponse de l'élève inaudible] 16 00:00:49,320 --> 00:00:51,710 Désolé? 17 00:00:51,710 --> 00:00:54,810 Une collection de? >> [Réponse de l'élève inaudible] >> Très bien. 18 00:00:54,810 --> 00:00:57,820 Une collection d'objets. Donc, nous avons vu des tableaux dans Scratch. 19 00:00:57,820 --> 00:01:01,880 Si vous arrivé à utiliser pour pset 0 l'une des listes Scratch que vous pouvez faire traîner les choses 20 00:01:01,880 --> 00:01:05,410 comme les oranges et les bananes dans un inventaire de toutes sortes, 21 00:01:05,410 --> 00:01:07,100 c'est un peu comme ce qui est un tableau. 22 00:01:07,100 --> 00:01:10,980 Puis techniquement plus, dans le contexte d'un ordinateur réel, 23 00:01:10,980 --> 00:01:14,730 un tableau est simplement un espace contigu de mémoire. 24 00:01:14,730 --> 00:01:18,590 En d'autres termes, vous disposez d'un octet, puis un autre octet, puis un autre octet, puis un autre octet, 25 00:01:18,590 --> 00:01:21,330 et si vous deviez dessiner ces octets dans un tableau, 26 00:01:21,330 --> 00:01:24,510 ils seraient dos à dos à dos à dos. C'est ce que nous entendons par contiguës. 27 00:01:24,510 --> 00:01:26,690 >> Donc, c'est l'octet numéro 1, puis 2, puis 3. 28 00:01:26,690 --> 00:01:29,680 Cela ne signifie pas ici, ici, ici, ici. 29 00:01:29,680 --> 00:01:33,800 Un tableau est un espace contigu sur 0 ou plus octets. 30 00:01:33,800 --> 00:01:36,160 Alors, quels sont-ils utiles pour? 31 00:01:36,160 --> 00:01:40,090 Rappelons que nous avons eu ce genre d'exemple artificiel des notes de quiz personnes stockage dans un programme 32 00:01:40,090 --> 00:01:42,580 pour calculer votre moyenne quiz pour certains cours, 33 00:01:42,580 --> 00:01:46,780 et nous rappelons que nous avons pu commencer à écrire ce programme en déclarant une quiz1 variable. 34 00:01:46,780 --> 00:01:49,550 Ensuite, nous pourrions avoir une autre variable appelée quiz2. 35 00:01:49,550 --> 00:01:52,030 Mais alors, si il y avait 3 quiz dans cette classe, quiz4. 36 00:01:52,030 --> 00:01:55,710 Ou si il y avait un quiz hebdomadaire, il serait quiz5, quiz6, quiz7. 37 00:01:55,710 --> 00:01:58,520 Donc, vous auriez toutes ces variables déclarées à l'intérieur de la principale 38 00:01:58,520 --> 00:02:00,470 ou ailleurs dans votre programme, 39 00:02:00,470 --> 00:02:03,870 et le problème avec cette approche, mais il est facile de simplement copier et coller, 40 00:02:03,870 --> 00:02:06,120 est-ce juste devient très vite difficile à gérer. 41 00:02:06,120 --> 00:02:09,360 A Dieu ne plaise que vous avez réellement avoir 30 ou 50 quiz quiz. 42 00:02:09,360 --> 00:02:12,080 Si c'est comme un quiz école style pop plus élevé du jour, 43 00:02:12,080 --> 00:02:15,910 alors vous avez juste une liste ridiculement longue de variables étant déclarées, 44 00:02:15,910 --> 00:02:17,780 et ce juste très rapidement devient hors de contrôle. 45 00:02:17,780 --> 00:02:20,820 C'est moche, c'est difficile à entretenir, il est tellement plus facile de faire une faute de frappe 46 00:02:20,820 --> 00:02:23,910 si vous obtenez une erreur de frappe numéro 1 dans votre programme. 47 00:02:23,910 --> 00:02:26,800 >> Nous avons donc introduit la notion d'un tableau à la place. 48 00:02:26,800 --> 00:02:30,760 Et rappelons que nous avons mis en œuvre ce programme en faisant un petit quelque chose comme ça. 49 00:02:30,760 --> 00:02:33,950 Laissez-moi aller dans la source d'aujourd'hui lundi 3 Répertoire 50 00:02:33,950 --> 00:02:37,160 et d'ouvrir ensemble, dont nous avons vu la dernière fois. 51 00:02:37,160 --> 00:02:39,940 Et même s'il y avait une couple de trucs nouveaux C ici, 52 00:02:39,940 --> 00:02:41,920 parmi eux la notion d'une constante, 53 00:02:41,920 --> 00:02:47,140 Rappelons que nous avons déclaré plusieurs flotteurs essentiellement en utilisant la syntaxe suivante: 54 00:02:47,140 --> 00:02:51,750 flotteur, puis le nom de la variable, puis nous avons utilisé des crochets vraiment pour la première fois, 55 00:02:51,750 --> 00:02:55,450 et ce que nous avons fait à l'intérieur de ces crochets a été effectivement mis un certain nombre. 56 00:02:55,450 --> 00:02:59,780 Mais au lieu de mettre un certain nombre, je mets ce mot en majuscules, des quiz. 57 00:02:59,780 --> 00:03:03,220 Et quelle a été la motivation pour mettre un mot en majuscules comme quiz 58 00:03:03,220 --> 00:03:08,170 puis en utilisant la ligne 17 du truc ici pour effectivement donner qu'un nombre? 59 00:03:08,170 --> 00:03:11,240 Quelle était la motivation là-bas? Ouais. 60 00:03:11,240 --> 00:03:13,360 >> [Réponse de l'élève inaudible] >> Exactement. 61 00:03:13,360 --> 00:03:16,630 Si nous voulons changer cette valeur 2, il suffit de le changer dans 1 place 62 00:03:16,630 --> 00:03:19,680 parce envisager - je ne me souviens même pas ce que ce programme fait exactement, 63 00:03:19,680 --> 00:03:22,040 mais si vous venez de le parcourir vous voyez des quiz, des jeux-questionnaires. 64 00:03:22,040 --> 00:03:24,720 Vous voyez quiz, ici-bas plus de jeux. 65 00:03:24,720 --> 00:03:28,180 Donc, si nous n'avions pas cette constante, cette forte utilisation de définir, 66 00:03:28,180 --> 00:03:33,320 nous aurions tapé 2, puis 2, puis 2, puis 2, ce qui est bien. Il serait tout aussi correcte. 67 00:03:33,320 --> 00:03:36,220 Mais supposons que l'année prochaine nous avons 3 tests dans CS50. 68 00:03:36,220 --> 00:03:39,190 Donc, je dois y aller et mettre à jour le code, je dois le recompiler, 69 00:03:39,190 --> 00:03:43,820 mais le problème est que si je fais quelque chose de stupide, comme je l'ai oublier 1 mention de 2 70 00:03:43,820 --> 00:03:46,750 et d'oublier de brancher 3, l'ensemble du programme pourrait très bien se casser. 71 00:03:46,750 --> 00:03:48,720 Donc, nous ne faisons que des ennuis. 72 00:03:48,720 --> 00:03:53,170 >> Ainsi, la notion d'une constante est tout au sujet de la factorisation d'un morceau de données, 73 00:03:53,170 --> 00:03:56,070 qu'il s'agisse d'une chaîne ou d'un char ou un flotteur ou autre, 74 00:03:56,070 --> 00:04:00,070 et déclarant 1 place afin que vous puissiez plus facilement le changer à l'avenir. 75 00:04:00,070 --> 00:04:03,660 Et c'est aussi, franchement, un peu plus facile à lire parce que si vous venez de penser à cela maintenant, 76 00:04:03,660 --> 00:04:07,840 c'est quiz, ou nous pourrions même renommer quelque chose comme NUMBER_OF_QUIZZES 77 00:04:07,840 --> 00:04:09,430 ou quelque chose de plus explicite. 78 00:04:09,430 --> 00:04:11,830 Le code devient un peu plus clair quant à ce qu'il fait, 79 00:04:11,830 --> 00:04:15,780 et vous vous demandez un peu moins que le numéro 2 pourrait arriver à dire. 80 00:04:15,780 --> 00:04:18,920 Ainsi, la constante n'avait rien à voir fondamentalement avec les tableaux. 81 00:04:18,920 --> 00:04:22,990 Le tableau a été introduite par le biais de ces crochets. 82 00:04:22,990 --> 00:04:26,610 >> Donc remarquerez que la ligne 23, nous demandons à l'utilisateur, «Quelles étaient vos scores quizz?" 83 00:04:26,610 --> 00:04:31,120 Ensuite, nous avons juste cette boucle qui demande à l'utilisateur apparemment pour leurs grades. Comment? 84 00:04:31,120 --> 00:04:37,460 Il parcourt de 0 à 2. Et je dis 2, car Quiz en majuscules est actuellement de 2. 85 00:04:37,460 --> 00:04:42,310 Donc, il parcourt de 0 à 2, puis l'imprime Quiz # quelque chose de quelque chose, 86 00:04:42,310 --> 00:04:45,830 puis il utilise GetFloat pour obtenir une valeur à partir de l'utilisateur. 87 00:04:45,830 --> 00:04:49,050 Donc, remarquez que ce n'est le seul autre élément nouveau de la syntaxe de mercredi dernier. 88 00:04:49,050 --> 00:04:53,120 Si vous voulez stocker quelque chose dans un emplacement particulier dans ce tableau, 89 00:04:53,120 --> 00:04:55,460 nous utilisons à nouveau les crochets. 90 00:04:55,460 --> 00:04:57,030 >> Il ya donc un peu de dichotomie. 91 00:04:57,030 --> 00:04:59,040 La première fois que vous utilisez les crochets 92 00:04:59,040 --> 00:05:02,250 vous l'utilisez pour spécifier la taille que vous souhaitez que le tableau soit. 93 00:05:02,250 --> 00:05:06,580 Mais ce contexte prochaine, ici, où nous avons à nouveau utiliser ces crochets 94 00:05:06,580 --> 00:05:10,540 signifie dans ce tableau où voulez-vous mettre un peu de valeur? 95 00:05:10,540 --> 00:05:13,650 Et ici la distinction peut être déduite à partir du contexte. 96 00:05:13,650 --> 00:05:17,130 Nous avons ici un type de données, nous avons alors le nom d'une variable, 97 00:05:17,130 --> 00:05:20,770 puis nous avons nos crochets avec un nombre à l'intérieur, point-virgule. C'est tout. 98 00:05:20,770 --> 00:05:22,290 Donc, c'est une déclaration. 99 00:05:22,290 --> 00:05:28,390 C'est comme si nous avions fait quelque chose comme flotteur grade1; grade2 flotteur; 100 00:05:28,390 --> 00:05:31,730 mais encore une fois, très rapidement incombe en copie beaucoup trop, coller, 101 00:05:31,730 --> 00:05:34,260 de sorte qu'au lieu nous venons de le simplifier en tant que telle, 102 00:05:34,260 --> 00:05:38,800 ce qui signifie que désormais, nous avons une classe qui peut être stocké à tranche 0, 103 00:05:38,800 --> 00:05:41,760 nous avons une autre catégorie qui peut être stocké à support 1, 104 00:05:41,760 --> 00:05:46,890 mais si je gaffe et, par exemple, ma boucle va si loin - 105 00:05:46,890 --> 00:05:48,740 Par exemple, je fais cette inférieur ou égal à, 106 00:05:48,740 --> 00:05:50,620 qui rappel a été la source d'un bug précédent - 107 00:05:50,620 --> 00:05:55,590 ce qui signifie concrètement que sur certains accidentelle troisième itération de cette boucle 108 00:05:55,590 --> 00:06:00,380 J'utilise le support 2. En effet, ce qui pourrait se passer ici? Désolé? 109 00:06:00,380 --> 00:06:02,860 [L'élève] Il va être remplacé. >> Va-t-il être remplacé? 110 00:06:02,860 --> 00:06:04,520 Que faudrait-il remplacé? 111 00:06:04,520 --> 00:06:10,890 Ceci est littéralement dire remplacer ce qui est à l'emplacement 2 avec la valeur de retour de GetFloat. 112 00:06:10,890 --> 00:06:13,690 Mais le problème est de savoir comment est la taille du tableau à ce point dans l'histoire? 113 00:06:13,690 --> 00:06:17,730 [Réponse de l'élève inaudible] >> Le tableau n'est encore que de taille 2 114 00:06:17,730 --> 00:06:22,730 car le tableau, comme toute autre variable, a été déclaré en premier, avant que nous l'utilisions, 115 00:06:22,730 --> 00:06:27,220 et nous avons spécifié ici à cause de cette constante que j'ai 2 classes que je vais mettre. 116 00:06:27,220 --> 00:06:29,930 >> Mais rappelez-vous, les informaticiens commencer à compter à partir de 0. 117 00:06:29,930 --> 00:06:33,620 Ainsi, le premier emplacement de ce tableau est une parenthèse 0. 118 00:06:33,620 --> 00:06:40,210 L'emplacement suivant est 1. Cette chose est un tant soit peu trop loin sur le côté. 119 00:06:40,210 --> 00:06:42,870 Donc, en d'autres termes, si j'ai effectivement eu ce tableau - 120 00:06:42,870 --> 00:06:46,790 et laissez-moi voir comment cette coopère ici pour nous - 121 00:06:46,790 --> 00:06:52,360 si j'ai un tableau que j'ai tout simplement tracée comme suit 122 00:06:52,360 --> 00:06:56,750 et j'ai alloué de l'espace pour 2 éléments, je pourrais dessiner ce comme cela dans la mémoire 123 00:06:56,750 --> 00:06:58,020 où cette grande toile blanche est. 124 00:06:58,020 --> 00:07:00,920 C'est juste la RAM que j'ai dans mon ordinateur, un concert de RAM, 2 Go de RAM, peu importe, 125 00:07:00,920 --> 00:07:05,400 mais ces 2 boîtes désormais individuellement représentent un flotteur, 32 bits. 126 00:07:05,400 --> 00:07:10,860 Donc, si je mets numéro 1 ici comme 1.0, puis j'ai mis un autre numéro ici comme 3,2 127 00:07:10,860 --> 00:07:15,280 mais alors je fais le support 2, c'est comme mettre quelque chose ici. 128 00:07:15,280 --> 00:07:17,820 Et comme l'image l'indique, il n'y a rien. 129 00:07:17,820 --> 00:07:20,450 C'est un peu comme la terre aucun homme, car je n'ai pas demandé le système d'exploitation 130 00:07:20,450 --> 00:07:23,550 de me donner ce quiz tiers. 131 00:07:23,550 --> 00:07:26,940 Si je voulais ce quiz troisième, j'aurais eu la prévoyance 132 00:07:26,940 --> 00:07:31,700 de demander au système d'exploitation pour qu'il en déclarant QUIZ être pas 2 133 00:07:31,700 --> 00:07:34,210 mais au lieu de correspondre à 3. 134 00:07:34,210 --> 00:07:39,000 >> Donc, en d'autres termes, l'image que nous avons effectivement avoir sous la main ressemble à ceci ici. 135 00:07:39,000 --> 00:07:42,260 C'est à nouveau la terre de personne. Nous ferions mieux de ne pas essayer d'écrire des valeurs ici. 136 00:07:42,260 --> 00:07:45,300 Mais encore une fois, les informaticiens parce compter à partir de 0, 137 00:07:45,300 --> 00:07:49,520 quand on parle de cet endroit dans le tableau, qui est censé être l'emplacement 0, 138 00:07:49,520 --> 00:07:53,890 ce qui est censé être l'emplacement 1, ce qui n'existe même pas 139 00:07:53,890 --> 00:07:57,380 parce que nous ne demandaient le système d'exploitation pour 2 tels endroits. 140 00:07:57,380 --> 00:08:00,130 Ainsi, ceux d'entre vous avec une expérience préalable de la programmation à partir d'autres langues 141 00:08:00,130 --> 00:08:04,150 savez peut-être que ce n'est pas toujours le cas avec des tableaux ou des objets appelés vecteurs. 142 00:08:04,150 --> 00:08:06,930 Au contraire, vous pouvez simplement continuer à ajouter et en ajoutant et en ajoutant des choses à des tableaux, 143 00:08:06,930 --> 00:08:10,720 qui, franchement, nous avons eu cette capacité de Scratch et pourtant nous semblons avoir renoncé ici 144 00:08:10,720 --> 00:08:15,160 car avec vous programmez en C beaucoup plus explicite. 145 00:08:15,160 --> 00:08:17,980 Il n'ya que vous et l'ordinateur en ce moment, et que l'ordinateur ne va faire 146 00:08:17,980 --> 00:08:19,530 ce que vous lui demandez de faire. 147 00:08:19,530 --> 00:08:24,270 Donc, si vous ne lui demandez de vous donner 2 flotteurs au moyen de la ligne 22 ici, 148 00:08:24,270 --> 00:08:27,640 c'est tout ce que vous allez retrouver du système d'exploitation: l'espace pour 2. 149 00:08:27,640 --> 00:08:34,049 >> Ainsi, de plus en plus sont vos programmes vont parfois être bogué en ce qui concerne les tableaux. 150 00:08:34,049 --> 00:08:37,520 C'est juste une sorte de la nature de la bête lequel nous sommes tous faillibles, 151 00:08:37,520 --> 00:08:42,490 et à un moment donné vous voulez indice très probable delà de la limite de votre tableau. 152 00:08:42,490 --> 00:08:45,980 Et c'est juste une façon élégante de dire vous êtes entré dans quelque chose de support 153 00:08:45,980 --> 00:08:49,970 et quelque chose était tout simplement trop grand d'un nombre. Vous êtes allé au-delà des limites de votre tableau. 154 00:08:49,970 --> 00:08:51,530 Mais la hausse est maintenant ceci. 155 00:08:51,530 --> 00:08:54,990 Le reste de ce programme a vraiment rien de fondamentalement à voir avec les tableaux. 156 00:08:54,990 --> 00:08:58,180 C'est tout simplement sur quelques calculs simples pour les moyennes informatiques. 157 00:08:58,180 --> 00:09:03,200 Nous avons donc ici, dans cette boucle for abord ici une somme variable appelée que nous initialiser à 0. 158 00:09:03,200 --> 00:09:09,020 Ensuite, nous avons une itération de 0 à 2 fois et on ajoute à cela variable de sommation 159 00:09:09,020 --> 00:09:12,620 la note i, de sorte tranche 0, alors la classe 1. 160 00:09:12,620 --> 00:09:15,130 Et puis, comme vous le feriez à l'école primaire pour calculer la moyenne, 161 00:09:15,130 --> 00:09:19,420 nous nous contentons de prendre cette somme, le diviser par le nombre total de questionnaires, 162 00:09:19,420 --> 00:09:22,520 et puis pour faire bonne mesure que nous appelons ici une fonction appelée tour. 163 00:09:22,520 --> 00:09:28,580 >> Maintenant, en passant, quel est le problème avec cette int parenthèses sur la ligne 34? 164 00:09:28,580 --> 00:09:31,730 Il aurait pu trouver déjà dans l'article, n'ont pas vraiment parlé formellement ici, 165 00:09:31,730 --> 00:09:35,210 mais quelle est cette int dans parens probablement faire? >> [Réponse de l'élève inaudible] 166 00:09:35,210 --> 00:09:38,500 Oui, cela fait référence à la coulée ou le transtypage, 167 00:09:38,500 --> 00:09:41,690 ce qui signifie que la prise 1 de type de données et à le convertir à un autre. 168 00:09:41,690 --> 00:09:45,400 Vous ne pouvez pas faire cela avec tous les types de données parce que parfois il serait un peu étrange. 169 00:09:45,400 --> 00:09:49,640 Mais dans ce cas, si la valeur de retour de la série est un flotteur 170 00:09:49,640 --> 00:09:53,880 parce que, après tout, je vais prendre un flotteur et en le divisant par un nombre comme 2, 171 00:09:53,880 --> 00:09:55,840 Je vais revenir un flotteur. 172 00:09:55,840 --> 00:10:00,760 Mais les gens d'école primaire ne sont pas vraiment heureux de savoir que leur moyenne était de 93,4 173 00:10:00,760 --> 00:10:04,420 car ils vont se rendre compte qu'ils étaient toujours très proche de celle au 95 arrondissements. 174 00:10:04,420 --> 00:10:09,540 >> Donc, nous voulons utiliser à la place de int autour de tout le monde au plus proche entier, 175 00:10:09,540 --> 00:10:12,730 qui dans ce cas va être 94 avec aucun point après. 176 00:10:12,730 --> 00:10:14,530 Donc, c'est juste une petite astuce mathématique. 177 00:10:14,530 --> 00:10:17,570 Et nous reviendrons à cette notion de coulée car elle aura des conséquences, 178 00:10:17,570 --> 00:10:21,640 si vous n'avez pas déjà découvert, pour le problème de jeu 2. 179 00:10:21,640 --> 00:10:25,210 Ainsi, un tableau, alors, vous pouvez penser - ça va me faire sourire toute la journée. 180 00:10:25,210 --> 00:10:27,830 Elle ressemble à ceci si vous dessinez une image de celui-ci, 181 00:10:27,830 --> 00:10:31,460 mais l'essentiel est que la taille est également sélectionné par vous 182 00:10:31,460 --> 00:10:34,050 lorsque vous le demandez du système d'exploitation. 183 00:10:34,050 --> 00:10:39,460 Toutes les questions, puis sur les tableaux? Ouais. 184 00:10:39,460 --> 00:10:47,080 [Question étudiant inaudible] 185 00:10:47,080 --> 00:10:49,310 Ah, bonne question. 186 00:10:49,310 --> 00:10:53,150 La question est de savoir ce qui se passe au 0 null dans le tableau? Il n'existe pas dans ce contexte. 187 00:10:53,150 --> 00:10:57,430 Qui n'existe que dans le contexte de chaînes, que nous sommes sur le point de venir à dans un moment. 188 00:10:57,430 --> 00:11:02,300 Mais pour un tableau, comme dans ce cas, tout ce que vous obtenez est ce que vous demandez au système d'exploitation pour. 189 00:11:02,300 --> 00:11:04,050 >> Et en passant, de peur que ce soit clair, 190 00:11:04,050 --> 00:11:07,030 Je continue à dire que vous demandez au système d'exploitation, demander au système d'exploitation. 191 00:11:07,030 --> 00:11:10,090 Un système d'exploitation, comme vous le savez sans doute, est Mac OS, Windows, Linux. 192 00:11:10,090 --> 00:11:13,560 Lorsque vous appelez des fonctions telles que GetFloat 193 00:11:13,560 --> 00:11:19,280 ou que vous déclarez des variables telles que les grades, 194 00:11:19,280 --> 00:11:23,200 à la fin de la journée vous êtes effectivement demandez à quelqu'un de vous donner ce que la mémoire 195 00:11:23,200 --> 00:11:25,940 parce que nous, programmeurs en herbe 196 00:11:25,940 --> 00:11:28,800 n'ont aucune idée de la façon de réellement obtenir un accès physique à la mémoire. 197 00:11:28,800 --> 00:11:31,100 Mais quelqu'un fait: le système d'exploitation. 198 00:11:31,100 --> 00:11:36,630 Donc, en plus de nous présenter avec de jolies icônes et les menus et les dossiers et autres 199 00:11:36,630 --> 00:11:39,050 que vous voyez sur votre bureau, que ce soit un Mac ou un PC, 200 00:11:39,050 --> 00:11:42,240 systèmes d'exploitation aussi faire les trucs de bas niveau mondain, 201 00:11:42,240 --> 00:11:44,680 les trucs très techniques de la gestion du gigaoctet 202 00:11:44,680 --> 00:11:48,780 ou 2 gigaoctets de mémoire que vous avez, la gestion de la CPU que vous avez, et ainsi de suite. 203 00:11:48,780 --> 00:11:50,170 Ainsi, lorsque vous écrivez du code, 204 00:11:50,170 --> 00:11:53,900 vous êtes vraiment accrocher à votre système d'exploitation dans ce sens. 205 00:11:53,900 --> 00:11:55,720 Je vais devoir minimiser. Très bien. 206 00:11:55,720 --> 00:11:59,980 >> Autres questions sur les tableaux? 207 00:12:00,330 --> 00:12:02,520 Non? D'accord. 208 00:12:02,520 --> 00:12:06,680 Ainsi, la transition naturelle de tableaux est effectivement un sujet qui est un peu familier. 209 00:12:06,680 --> 00:12:09,570 Et nous avons examiné très brièvement à cette dernière fois aussi. 210 00:12:09,570 --> 00:12:12,500 Il s'agissait d'un exemple de chaîne de mercredi. 211 00:12:12,500 --> 00:12:15,060 Cet exemple de chaîne est un programme très simple, 212 00:12:15,060 --> 00:12:18,120 et j'ai réellement simplifiée par un couple de lignes à des fins d'aujourd'hui. 213 00:12:18,120 --> 00:12:22,680 Tout ce qu'il fait dans la ligne 19 est d'obtenir une chaîne de l'utilisateur, le stocke dans une variable appelée s. 214 00:12:22,680 --> 00:12:28,670 Puis, à la ligne 22 en avant c'est apparemment l'impression que chaîne de 1 caractère par ligne. 215 00:12:28,670 --> 00:12:30,730 Mais comment se fait-il cela? 216 00:12:30,730 --> 00:12:33,350 Nous sommes déclarer une variable i, sa mise égale à 0, 217 00:12:33,350 --> 00:12:35,770 et cela devient vieille habitude maintenant. 218 00:12:35,770 --> 00:12:39,270 Nous n'avions pas vu ce jusqu'au mercredi, mais vous pouvez sorte de déduire de son nom 219 00:12:39,270 --> 00:12:44,610 strlen renvoie simplement ce que lorsque s donnée? La longueur de la chaîne. 220 00:12:44,610 --> 00:12:47,940 Donc, si je passe une chaîne, entre guillemets, DAVID, 221 00:12:47,940 --> 00:12:51,810 j'espère que ça va revenir à moi le numéro 5 en raison de DAVID. 222 00:12:51,810 --> 00:12:55,600 Donc, c'est son but dans la vie est de prendre une chaîne, que ce soit codé en dur par vous 223 00:12:55,600 --> 00:12:58,840 ou dans ce cas branché comme une variable, comme argument, 224 00:12:58,840 --> 00:13:01,980 et il comprend ce à quoi la longueur de cette chaîne est. 225 00:13:01,980 --> 00:13:06,470 >> Alors, voici maintenant nous empruntons quelques notations de l'exemple précédent questionnaire. 226 00:13:06,470 --> 00:13:09,390 Cela n'a rien à voir avec flotteurs, n'a rien à voir avec des quiz, 227 00:13:09,390 --> 00:13:13,100 mais il s'avère que le petit mensonge nous vous avons dit depuis 1 semaine 228 00:13:13,100 --> 00:13:16,330 c'est une chaîne n'existe pas vraiment en C. 229 00:13:16,330 --> 00:13:20,230 Une chaîne à la fin de la journée est vraiment juste un tableau. 230 00:13:20,230 --> 00:13:25,140 Il s'agit d'un tableau d'octets, de sorte octet, octet, octet, octet, ce qui rappel est à seulement 8 bits, 231 00:13:25,140 --> 00:13:28,130 afin morceau de mémoire, morceau de mémoire, morceau de mémoire, morceau de mémoire. 232 00:13:28,130 --> 00:13:31,210 Et le moyen par lequel une chaîne est mise en œuvre 233 00:13:31,210 --> 00:13:33,070 est en mettant le premier caractère ici, 234 00:13:33,070 --> 00:13:37,470 puis ici, puis là, puis là, dos à dos à dos dans la mémoire de l'ordinateur. 235 00:13:37,470 --> 00:13:42,160 Donc, si vous voulez épeler un mot comme BONJOUR, vous mettriez 1 H caractère, 236 00:13:42,160 --> 00:13:48,240 alors E, alors L alors L, alors O - 5 caractères au total - quelque part dans la mémoire vive de votre ordinateur. 237 00:13:48,240 --> 00:13:52,080 Mais le détail clé ici est que ils vont être dos à dos à dos à dos, 238 00:13:52,080 --> 00:13:54,200 juste à côté de l'autre. 239 00:13:54,200 --> 00:13:58,820 Quand quand je dis s [i], ce qui en anglais est-ce me donner? 240 00:14:01,240 --> 00:14:04,550 Qu'est-ce que s [i] représentent dans ce cas? Ouais. 241 00:14:04,550 --> 00:14:07,800 >> [L'élève] Le ième caractère dans la chaîne. >> Exactement. Le ième caractère dans la chaîne. 242 00:14:07,800 --> 00:14:12,260 Maintenant, je va commencer à 0 selon ma boucle for ici, 243 00:14:12,260 --> 00:14:14,850 mais c'est bien parce que tout commence à compter à partir de 0. 244 00:14:14,850 --> 00:14:19,160 Donc, s [0] va représenter la lettre H dans un mot comme BONJOUR, 245 00:14:19,160 --> 00:14:24,530 s [1] va représenter une telle lettre E dans un mot comme BONJOUR, et ainsi de suite. 246 00:14:24,530 --> 00:14:27,130 Et ce que nous semblons faire à chaque itération de cette boucle 247 00:14:27,130 --> 00:14:32,780 est à stocker temporairement le ième caractère dans une variable appelée c, qui est juste un char, 248 00:14:32,780 --> 00:14:35,010 puis nous imprimons sur c 249 00:14:35,010 --> 00:14:37,620 de sorte qu'à la fin de la journée ce que ce programme ne est le suivant. 250 00:14:37,620 --> 00:14:42,900 Si je vais dans le répertoire source et je fais et je chaine1 aller de l'avant et exécutez chaine1, 251 00:14:42,900 --> 00:14:51,920 puis je tape un mot comme BONJOUR, Entrez, tout ce qu'il fait est d'imprimer ce caractère 1 à la fois. 252 00:14:51,920 --> 00:14:54,010 >> Il ya donc une opportunité pour le raffinement ici. 253 00:14:54,010 --> 00:14:58,150 Je suis un peu faire plus de travail, même si c'est plus clair peut-être de cette façon, que nécessaire. 254 00:14:58,150 --> 00:15:03,270 Quelle ligne de code ici ce que je peux sans doute jeter tout à fait? Ouais. 255 00:15:03,270 --> 00:15:08,290 Ligne 24. En ligne 24 Je déclare une variable c. 256 00:15:08,290 --> 00:15:14,320 Je suis stocker le ième caractère de s dedans, mais je me sers ici c. 257 00:15:14,320 --> 00:15:20,160 Donc, je suis en utilisant c, donc je sens que je ne peux pas jeter la ligne 24 de suite. 258 00:15:20,160 --> 00:15:23,850 [Commentaire étudiant inaudible] >> Exactement. 259 00:15:23,850 --> 00:15:26,240 Alors, quand il s'agit de parler de la conception des programmes, 260 00:15:26,240 --> 00:15:30,740 remarqué cette légère simplification du code, ce qui est tout aussi lisible, 261 00:15:30,740 --> 00:15:34,680 mais se rendre compte que s est juste une variable, son type de données est un tableau, 262 00:15:34,680 --> 00:15:38,610 si s [i] va tout simplement de retourner instantanément à vous le ième caractère dans cette chaîne. 263 00:15:38,610 --> 00:15:40,620 Et si vous souhaitez l'imprimer, c'est très bien. 264 00:15:40,620 --> 00:15:43,680 Vous avez juste à utiliser% c parce que vous n'êtes pas l'impression d'une chaîne de caractères, 265 00:15:43,680 --> 00:15:48,520 vous imprimez un caractère dans une chaîne, et cela a aussi pour effet d'imprimer le ième caractère. 266 00:15:48,520 --> 00:15:51,390 Et de rappeler que la seule différence vraiment de la semaine dernière avec l'aide de printf 267 00:15:51,390 --> 00:15:54,220 est que, tandis que dans les semaines passées nous ferions quelque chose de super simple, 268 00:15:54,220 --> 00:15:58,510 comme marques% s, puis le nom d'une chaîne ici, 269 00:15:58,510 --> 00:16:01,190 nous sommes maintenant plongée dans un peu plus sous le capot et en disant: 270 00:16:01,190 --> 00:16:06,090 ne pas afficher la chaîne; imprimer le caractère unique celle-ci. 271 00:16:06,090 --> 00:16:10,570 >> Ainsi, nous pouvons faire quelque chose d'un peu différent ici parce qu'il ya 1 autre - pas de bug 272 00:16:10,570 --> 00:16:14,090 parce que ce programme est bon, mais je fais quelque chose de stupide 273 00:16:14,090 --> 00:16:16,810 que je l'ai mentionné brièvement le mercredi. 274 00:16:16,810 --> 00:16:22,680 Mais en y repensant, comment pourrait-conception de ce programme est d'améliorer encore davantage? Ouais. 275 00:16:22,680 --> 00:16:28,280 [Réponse de l'élève inaudible] >> Oh, très bien. 276 00:16:28,280 --> 00:16:32,120 Ainsi, rappelons que nous avons introduit une seconde variable appelée n dernière fois, 277 00:16:32,120 --> 00:16:34,850 qui semble être en contradiction avec nous-mêmes parce que mon objectif il ya une seconde 278 00:16:34,850 --> 00:16:37,380 C'était juste pour jeter une variable comme inutile, 279 00:16:37,380 --> 00:16:40,700 mais rappelons que le mercredi nous avons réellement fait cela. 280 00:16:40,700 --> 00:16:46,170 J'ai changé la boucle for pour avoir réellement une virgule ici, alors n = strlen, 281 00:16:46,170 --> 00:16:52,120 et puis là-bas que j'ai fait i 00:16:57,660 Quel est le gain fondamental que je suis atteinte en changeant mon initialisation à cette 283 00:16:57,660 --> 00:17:01,590 et mon état à ce moment? >> [Réponse de l'élève inaudible] >> Exactement. 284 00:17:01,590 --> 00:17:06,170 Je ne suis pas strlen rappelant encore et encore et encore parce que rappeler combien la boucle pour les travaux. 285 00:17:06,170 --> 00:17:08,790 Même si elles commencent à se compliquer l'avenir, 286 00:17:08,790 --> 00:17:12,480 Rappelons que la chose avant le premier point-virgule est l'initialisation, ce qui arrive une fois. 287 00:17:12,480 --> 00:17:14,359 La condition, cependant, est dans le milieu, 288 00:17:14,359 --> 00:17:17,710 et cela est vérifié à chaque fois que vous passez par la boucle. 289 00:17:17,710 --> 00:17:22,420 >> Donc, c'est un peu stupide de demander de l'ordinateur à la même question encore et encore - 290 00:17:22,420 --> 00:17:25,920 Quelle est la longueur de BONJOUR? Quelle est la longueur de BONJOUR? Quelle est la longueur de BONJOUR? - 291 00:17:25,920 --> 00:17:29,740 parce que nous voyons aujourd'hui et mercredi, ce n'est certainement va prendre du temps, 292 00:17:29,740 --> 00:17:34,320 et ce n'est pas une très bonne utilisation du temps en raison de comprendre la longueur d'une chaîne 293 00:17:34,320 --> 00:17:37,030 prend effectivement un peu d'effort. 294 00:17:37,030 --> 00:17:39,760 Il n'est pas instantané, car il est dans certaines langues. 295 00:17:39,760 --> 00:17:43,920 Donc, en changeant ce à n, le prix que je paie, c'est quoi? 296 00:17:43,920 --> 00:17:45,640 Nous assistons à un compromis ici. 297 00:17:45,640 --> 00:17:49,460 Je peux gagner du temps en ne demandant pas la même question encore et encore foutu, 298 00:17:49,460 --> 00:17:51,740 mais ça va me coûter quelque chose, qui est quoi? 299 00:17:51,740 --> 00:17:55,050 >> [L'élève] Vous perdez une certaine quantité de mémoire. >> Exactement. Ça va me coûter un peu de mémoire. 300 00:17:55,050 --> 00:17:56,670 Donc, dans ce cas, il me coûte quoi? 301 00:17:56,670 --> 00:18:01,530 Un autre 32 bits, car n est juste un int, comme l'implique le mot ici int. 302 00:18:01,530 --> 00:18:03,300 Mais est-ce que ça va? 303 00:18:03,300 --> 00:18:05,800 Franchement, ce n'est probablement pas grave parce que si vous pensez à ce sujet, 304 00:18:05,800 --> 00:18:09,030 plus la chaîne est, le plus de temps, je vais pas gaspiller 305 00:18:09,030 --> 00:18:11,920 car strlen va se faire appelé encore et encore et encore 306 00:18:11,920 --> 00:18:13,520 pour chaque itération de la boucle. 307 00:18:13,520 --> 00:18:18,070 Et ces jours-ci, mon Mac dispose de 2 Go de RAM, ces jours 4 gigs de RAM parfois. 308 00:18:18,070 --> 00:18:22,420 Je pense que je peux me permettre de 4 de ces octets à fait accélérer les choses. 309 00:18:22,420 --> 00:18:26,590 Mais cela va être un compromis et un thème vraiment dans la programmation et en informatique 310 00:18:26,590 --> 00:18:28,320 de ne jamais vraiment obtenir quelque chose gratuitement. 311 00:18:28,320 --> 00:18:32,880 Si vous voulez améliorer quelque chose, vous avez à payer pour cela dans l'autre main en quelque sorte. 312 00:18:32,880 --> 00:18:35,880 L'espace en fonction du temps dans ce cas. 313 00:18:35,880 --> 00:18:40,700 >> Donc, tout cela a été mené vers quelque chose comme ceci cryptique, 314 00:18:40,700 --> 00:18:44,070 qui, comme vous l'avez probablement deviné maintenant, dit réellement? 315 00:18:44,070 --> 00:18:47,420 [Réponse de l'élève inaudible] >> Ouais, c'est donc, Assurez-vous de boire votre Ovomaltine, 316 00:18:47,420 --> 00:18:52,490 fait en utilisant un algorithme appelé ROT13, ROT 1-3, 317 00:18:52,490 --> 00:18:55,500 ce qui signifie simplement tourner toutes les lettres de 13 places, 318 00:18:55,500 --> 00:18:58,720 ce qui signifie prendre un, puis ajouter 13 à l'aller et dot, dot, dot 319 00:18:58,720 --> 00:19:04,640 tout le chemin à la 13e lettre de suite, faire la même chose pour B et pour C et D et ainsi de suite. 320 00:19:04,640 --> 00:19:10,850 Et si nous avons effectivement convertir ce ici utilisant un décalage de 13 places, 321 00:19:10,850 --> 00:19:14,580 Nous allons revenir à ce petit Ralphie avait, qui était, Assurez-vous de boire votre Ovomaltine. 322 00:19:14,580 --> 00:19:18,160 Mais maintenant, pour le problème de set 2, dans l'édition standard du moins, 323 00:19:18,160 --> 00:19:21,680 vous devez sorte de ne chiffrer vous-même, 324 00:19:21,680 --> 00:19:25,990 et nous devons en quelque sorte prendre en entrée comme ça et crypter ou décrypter. 325 00:19:25,990 --> 00:19:29,850 >> Alors laquelle de ces sortes de principes fondamentaux nous conduit à cette occasion? 326 00:19:29,850 --> 00:19:32,650 Jetons un coup d'oeil à ce troisième exemple ici. 327 00:19:32,650 --> 00:19:38,430 Tout d'abord, il est appelé ASCII. Qu'est-ce que ASCII référer à? 328 00:19:38,430 --> 00:19:40,460 Code standard américain pour l'échange d'information, 329 00:19:40,460 --> 00:19:43,850 qui est vraiment loin de dire quoi? Quel est l'ASCII? 330 00:19:43,850 --> 00:19:47,890 [Réponse de l'élève inaudible] >> Qu'est-ce que c'est? >> [L'élève] Une carte de caractère. >> Une carte personnage. 331 00:19:47,890 --> 00:19:51,390 Il vient de mappe chiffres aux lettres parce que le monde a normalisé 332 00:19:51,390 --> 00:19:55,380 ce nombre représentera quelles lettres afin que chacun d'entre nous peuvent utiliser des ordinateurs 333 00:19:55,380 --> 00:19:59,340 et nos programmes sont tous simplement compatible quand il s'agit de l'impression de choses à l'écran. 334 00:19:59,340 --> 00:20:04,680 Donc, rappelons que 65 arrive à représenter A, 97 arrive à représenter une minuscule. 335 00:20:04,680 --> 00:20:08,510 Et si ce programme est simple ici ASCII en profitant de ce fait - 336 00:20:08,510 --> 00:20:12,770 que le monde sait que le capital est de 65 A - et c'est juste l'impression de la cartographie. 337 00:20:12,770 --> 00:20:16,320 >> Donc, avant de plonger dans le code, permettez-moi, au lieu d'ouvrir une fenêtre de terminal. 338 00:20:16,320 --> 00:20:21,550 Permettez-moi aller de l'avant et de faire ASCII, puis nous allons simplement lancer cette chose juste pour gâcher la sortie. 339 00:20:21,550 --> 00:20:25,960 Et il le fait exactement cela: un tableau vraiment grand qui raconte juste moi tous les différents codes 340 00:20:25,960 --> 00:20:27,950 pour l'ensemble des lettres différentes. 341 00:20:27,950 --> 00:20:32,100 Ainsi, un programme super simple, mais je n'ai pas eu à coder en dur ces 52 lignes de production: 342 00:20:32,100 --> 00:20:34,860 26 majuscules, 26 minuscules. 343 00:20:34,860 --> 00:20:37,790 Au lieu de cela, j'ai fait ce programme avec un couple de boucles. 344 00:20:37,790 --> 00:20:39,720 Remarquez ce que j'ai fait ici. 345 00:20:39,720 --> 00:20:44,790 J'ai réitéré à partir de i est de 65 à jusqu'à 65 + 26 parce que je voulais imprimer 26 lettres 346 00:20:44,790 --> 00:20:49,860 dans l'alphabet anglais, i + + à chaque itération, et maintenant le remarquer à nouveau. 347 00:20:49,860 --> 00:20:52,540 C'est la récurrence de notre ami transtypage 348 00:20:52,540 --> 00:20:54,620 lequel vous convertir 1 type de données à un autre 349 00:20:54,620 --> 00:20:57,480 car qu'est-ce que je veux faire dans ce programme particulier? 350 00:20:57,480 --> 00:21:02,650 Je veux compter numériquement, car c'est comme ça que j'ai grandi comptage - 65, 66, 67, et ainsi de suite - 351 00:21:02,650 --> 00:21:04,420 mais je ne veux pas imprimer uniquement les chiffres. 352 00:21:04,420 --> 00:21:08,030 Je veux imprimer la lettre, suivie du numéro. 353 00:21:08,030 --> 00:21:18,640 Je veux imprimer A: nombre, B: nombre, mais je peux le faire avec la même variable exacte. 354 00:21:18,640 --> 00:21:21,630 Donc je imprimer c% comme un espace réservé pour un caractère, 355 00:21:21,630 --> 00:21:25,080 % D comme un espace réservé pour un chiffre ou un nombre. 356 00:21:25,080 --> 00:21:27,750 Alors que dois-je brancher pour ces 2 espaces réservés? 357 00:21:27,750 --> 00:21:33,960 Je branchez d'abord dans l'équivalent pour les caractères de i, puis-je imprimer sur i lui-même. 358 00:21:33,960 --> 00:21:36,400 >> Donc remarqué cela aussi fonctionne. 359 00:21:36,400 --> 00:21:39,320 Je peux aussi jeter un flotteur à partir d'un int 360 00:21:39,320 --> 00:21:41,750 afin de passer d'un nombre réel en entier, 361 00:21:41,750 --> 00:21:46,100 ici je peux passer d'un int en char, qui est un peu bizarre - 362 00:21:46,100 --> 00:21:48,680 ne pas tout à fait correspondre sur le monde réel - mais dans les ordinateurs 363 00:21:48,680 --> 00:21:51,140 un char est juste un nombre sous le capot, 364 00:21:51,140 --> 00:21:53,590 Nous sommes donc jamais être aussi explicite ici à l'ordinateur, en disant: 365 00:21:53,590 --> 00:21:58,920 printf, imprimez-je pas que 65 ans, l'imprimer comme son équivalent numérique. 366 00:21:58,920 --> 00:22:02,110 Et il s'avère que je n'ai même pas techniquement besoin de cela. 367 00:22:02,110 --> 00:22:05,020 Ce que je faisais tout à l'heure est explicitement coulée 368 00:22:05,020 --> 00:22:08,760 en spécifiant le type de données que je veux aller de et vers. 369 00:22:08,760 --> 00:22:11,840 Mais remarquez que j'ai déjà ce c% placeholder 370 00:22:11,840 --> 00:22:14,930 et cette autre espace réservé% c ici. 371 00:22:14,930 --> 00:22:18,880 Même si ce n'est pas int, l'ordinateur se rend compte qu'un char, 372 00:22:18,880 --> 00:22:21,080 c'est juste un int sous le capot. 373 00:22:21,080 --> 00:22:25,100 >> Donc, si j'ai effectivement recompiler cela et relancer le programme d'ASCII, 374 00:22:25,100 --> 00:22:31,210 remarquez qu'il fonctionne toujours juste parce que l'ordinateur rend compte qu'il ya cette correspondance. 375 00:22:31,210 --> 00:22:34,870 Maintenant, il est plus important de faire la conversion explicite dans le monde des flotteurs à ints 376 00:22:34,870 --> 00:22:37,460 car il vous fait prendre une décision calculée: 377 00:22:37,460 --> 00:22:40,140 jeter tout après la virgule. 378 00:22:40,140 --> 00:22:44,990 Ici, il n'y a vraiment rien à jeter parce qu'un personnage est juste un nombre, 379 00:22:44,990 --> 00:22:48,220 et une chaîne de caractères est simplement un tableau de caractères. 380 00:22:48,220 --> 00:22:52,530 Alors, quand vient le temps de mettre en œuvre certaines de chiffrement ou de déchiffrement, 381 00:22:52,530 --> 00:22:56,770 comment est-ce que nous pouvons réellement traduire quelque chose comme ça absurde de, 382 00:22:56,770 --> 00:22:58,670 Assurez-vous de boire votre Ovomaltine? 383 00:22:58,670 --> 00:23:02,700 Et si nous savons maintenant - prenons comme hypothèse - que la clé, 384 00:23:02,700 --> 00:23:08,010 le nombre que nous sommes en rotation l'ensemble de ces lettres par, est le numéro 13? 385 00:23:08,010 --> 00:23:11,800 Donc, nous sommes passés de la lettre B tout le chemin à O au début de la phrase, 386 00:23:11,800 --> 00:23:14,710 Assurez-vous de boire votre Ovomaltine, parce que si je fais B 387 00:23:14,710 --> 00:23:19,600 et puis je vais C, D, E, F, G, H, I, J, K, L, M, N, O, 388 00:23:19,600 --> 00:23:23,760 c'est pourquoi le cryptage de la lettre B devient O 389 00:23:23,760 --> 00:23:26,570 parce que je viens d'ajouter 13 à l'. 390 00:23:26,570 --> 00:23:33,460 >> Donc, si je veux décrypter cela, je dois essentiellement en O, puis soustrayez 13 de celui-ci. 391 00:23:33,460 --> 00:23:36,880 Ou bien, franchement, parce qu'il ya 26 lettres dans l'alphabet, c'est merveilleusement symétrique, 392 00:23:36,880 --> 00:23:41,260 on peut aussi ajouter 13 et nous allons revenir à la lettre B. 393 00:23:41,260 --> 00:23:44,290 Mais comment allez-vous mettre en œuvre quelque chose comme ceci dans César 394 00:23:44,290 --> 00:23:46,600 ou bien la manipulation des chaînes en général? 395 00:23:46,600 --> 00:23:51,380 Si la lettre B est ce numéro? 396 00:23:51,380 --> 00:23:55,290 Quelle est la lettre B? Donc, c'est 66, non? 397 00:23:55,290 --> 00:23:59,220 Donc, si la lettre A est de 65 et la lettre B est de 66, 398 00:23:59,220 --> 00:24:03,940 donc 66, tout ce que j'ai à faire est d'ajouter 13 à elle, et cela me donne 79. 399 00:24:03,940 --> 00:24:09,150 Et si nous allons à notre feuille de triche peu, 79 en effet des cartes sur O. 400 00:24:09,150 --> 00:24:11,290 >> Mais il ya un peu un cas coin ici. 401 00:24:11,290 --> 00:24:15,170 Quelle est, par exemple, la lettre Z? 402 00:24:15,170 --> 00:24:20,180 Si nous faisons 66 + 25 à faire tout le chemin jusqu'à la fin de l'alphabet, nous sommes à 91. 403 00:24:20,180 --> 00:24:24,520 91 + 13 donne-moi 104, et devinez quoi? 404 00:24:24,520 --> 00:24:29,200 104 n'est pas égale à une lettre majuscule. 405 00:24:29,200 --> 00:24:31,610 Revenons à une feuille de triche peu ici. 406 00:24:31,610 --> 00:24:38,070 Si je réexécutez ce programme dans l'appareil, notez que 104, si je retourne à la fenêtre du terminal, 407 00:24:38,070 --> 00:24:41,800 104 est apparemment le h minuscule. 408 00:24:41,800 --> 00:24:46,400 Il nous faut donc un truc clé ici afin de vous assurer que lorsque nous commençons à Z 409 00:24:46,400 --> 00:24:50,260 et on ajoute 13 à ce que nous ne voulons juste continuer à aller de l'avant en nombres toujours plus grands. 410 00:24:50,260 --> 00:24:52,600 Que voulons-nous vraiment faire? 411 00:24:52,600 --> 00:24:54,570 Vous voulez enrouler autour. 412 00:24:54,570 --> 00:25:00,250 >> Ainsi, il s'avère, comme vous avez vu sans doute dans la section maintenant ou dans les spécifications du problème posé lui-même 413 00:25:00,250 --> 00:25:05,730 rendu compte qu'il ya cette autre opérateur en C qui est aussi un signe pour cent, 414 00:25:05,730 --> 00:25:11,020 mais alors que nous avons utilisé ici pour spécifier% un espace réservé, 415 00:25:11,020 --> 00:25:15,420 savoir que, surtout pour les 2 set problème, il ya aussi quelque chose comme ceci: 416 00:25:15,420 --> 00:25:18,990 int x = y% z. 417 00:25:18,990 --> 00:25:22,770 Permettez-moi de présenter cela comme une forme très générale de ce. 418 00:25:22,770 --> 00:25:25,580 Pour cent signifie que dans un langage de programmation? >> [L'élève] Modulo. 419 00:25:25,580 --> 00:25:28,790 Modulo, qui est une façon élégante de dire le reste. 420 00:25:28,790 --> 00:25:31,620 Même si il ya une légère différence avec la définition là, 421 00:25:31,620 --> 00:25:37,210 cela signifie diviser par z y, mais ne retourne pas le résultat de cette division; 422 00:25:37,210 --> 00:25:39,650 au contraire, retourner le reste. 423 00:25:39,650 --> 00:25:47,390 >> Donc, si y est en fait 3 et z est en fait 2, 3 divisé par 2 est égal à 1 avec un reste de 1, 424 00:25:47,390 --> 00:25:51,550 alors qu'est-ce réellement x égale dans ce scénario? 1. 425 00:25:51,550 --> 00:25:54,540 C'est comme une simple idée de bas niveau. 426 00:25:54,540 --> 00:25:56,480 Il faut un peu de temps pour obtenir votre esprit enroulé autour de lui 427 00:25:56,480 --> 00:25:58,740 car il a probablement été un moment depuis que vous aviez même se soucier de restes 428 00:25:58,740 --> 00:26:01,160 et effectivement les utiliser pour quelque chose résolue, 429 00:26:01,160 --> 00:26:05,290 mais dans ce cas, le simple fait que vous pouvez passer d'un grand nombre comme 3 430 00:26:05,290 --> 00:26:08,920 à un nombre relativement petit comme le 2, puis envelopper efficacement 431 00:26:08,920 --> 00:26:14,160 en utilisant le reste à une valeur plus petite comme 1 va être un truc précieux 432 00:26:14,160 --> 00:26:17,690 que l'on peut utiliser à la fois pour quelque chose comme César et ce Vigenere autre chose 433 00:26:17,690 --> 00:26:22,240 problème posé en 2, mais cela va être un truc récurrent tout au long du semestre. 434 00:26:22,240 --> 00:26:24,880 Cette idée simple et facile de simplement prendre le reste en général 435 00:26:24,880 --> 00:26:26,530 va nous permettre de s'enrouler autour. 436 00:26:26,530 --> 00:26:31,140 Et comme on commence à jouer plus avec des tableaux, comme on commence à jouer avec plus de mémoire elle-même, 437 00:26:31,140 --> 00:26:35,800 cela va devenir de plus en plus un truc puissant. 438 00:26:35,800 --> 00:26:43,420 >> Ainsi, toutes les questions, alors sur ASCII ou la représentation sous forme de tableaux de chaînes de caractères? 439 00:26:43,420 --> 00:26:47,430 Et nous le prendrons en hausse de 1 cran plus loin. Ouais. 440 00:26:47,430 --> 00:26:52,350 [Question étudiant inaudible] >> Bonne question. 441 00:26:52,350 --> 00:26:55,370 Qu'est-ce que cela signifie quand une variable d'un astérisque en face d'elle? 442 00:26:55,370 --> 00:26:57,720 Permettez-moi de répondre à cette différer dans le détail, 443 00:26:57,720 --> 00:27:00,100 mais qui se réfère à un sujet connu comme un pointeur. 444 00:27:00,100 --> 00:27:03,440 Pointeurs ont à voir avec la mémoire, et nous sommes en fait aujourd'hui 445 00:27:03,440 --> 00:27:06,330 faire le premier pas vers cette discussion, 446 00:27:06,330 --> 00:27:08,600 mais pour l'instant, permettez-moi de prétendre que l'étoile n'existe pas 447 00:27:08,600 --> 00:27:15,380 et nous continuerons à demander cordes cordes au lieu d'utiliser char *, 448 00:27:15,380 --> 00:27:19,530 que vous avez probablement vu avant et je mettrai à l'écran dans un moment comme un teaser. 449 00:27:19,530 --> 00:27:23,010 Donc, nous allons revenir à cela en détail beaucoup plus que beaucoup d'entre vous aimerez sûrement. 450 00:27:23,010 --> 00:27:25,760 Finalement, pas aujourd'hui. Ouais. 451 00:27:25,760 --> 00:27:42,810 >> [Question étudiant inaudible] 452 00:27:42,810 --> 00:27:47,080 Dans quel contexte avez-vous à donner le signe d'un caractère? >> [L'élève] Ouais. 453 00:27:47,080 --> 00:27:52,130 Donc, par défaut, lorsque vous ne mettez pas un +, seulement des nombres positifs sont pris en charge. 454 00:27:52,130 --> 00:27:55,390 Donc, si vous écrivez juste le numéro 1, c'est un positif 1. 455 00:27:55,390 --> 00:27:57,710 Si vous voulez vraiment de préciser la négation d'une valeur, 456 00:27:57,710 --> 00:28:01,060 vous avez littéralement faire -1 sur votre clavier. 457 00:28:01,060 --> 00:28:20,440 Mais ce n'est probablement pas votre question. >> [Réponse de l'élève inaudible] 458 00:28:20,440 --> 00:28:22,200 >> Bonne question. D'accord. 459 00:28:22,200 --> 00:28:24,970 Donc, cela a à voir, je crois, avec une sorte de bug vous avez couru dans 460 00:28:24,970 --> 00:28:27,640 parce que vous étiez conversion d'un entier à un personnage, 461 00:28:27,640 --> 00:28:29,780 mais de toute façon la négativité se sont impliqués, 462 00:28:29,780 --> 00:28:32,380 et si le personnage vient de sortir munged en quelque sorte. 463 00:28:32,380 --> 00:28:36,710 Donc pour l'instant, permettez-moi de simplifier un peu jusqu'à ce que nous reviendrons sur ce genre de sujet. 464 00:28:36,710 --> 00:28:39,570 Pour l'instant, penser à des choses de cette façon - et c'est une simplification excessive. 465 00:28:39,570 --> 00:28:43,500 Mais dans le monde d'un nombre entier, vous avez combien de bits sont à votre disposition? 466 00:28:43,500 --> 00:28:45,190 Vous avez 32 bits. 467 00:28:45,190 --> 00:28:49,030 Et jusqu'à présent, nous avons parlé du nombre total d'entiers, vous pouvez donc représenter 468 00:28:49,030 --> 00:28:52,430 est à environ 4 milliards au total parce que vous avez 32 bits, 469 00:28:52,430 --> 00:28:55,100 de sorte que c'est 2 à la 32, de sorte que c'est à peu près 4 milliards d'euros. 470 00:28:55,100 --> 00:28:58,810 Mais nous avons vu une semaine ou 2 il ya que vous n'avez pas vraiment une plage de numéros 471 00:28:58,810 --> 00:29:01,240 de 0 sur un maximum de 4 milliards. 472 00:29:01,240 --> 00:29:06,340 La gamme va de la place environ 2 milliards d'négative positive 2 milliards d'euros. 473 00:29:06,340 --> 00:29:10,990 Mais cela pose alors la question, comment voulez-vous représenter la notion de négatif 2000000000 474 00:29:10,990 --> 00:29:13,260 et encore moins négative 1? 475 00:29:13,260 --> 00:29:17,960 Pour l'instant, nous pouvons simplifier et dire que nous allons utiliser le bit le plus à gauche 476 00:29:17,960 --> 00:29:22,380 de ces 32 bits, et si c'est un 1, il s'agit d'un nombre négatif, 477 00:29:22,380 --> 00:29:25,090 et si c'est un 0, il s'agit d'un nombre positif. 478 00:29:25,090 --> 00:29:28,570 Le problème avec cette représentation simplifiée des nombres négatifs 479 00:29:28,570 --> 00:29:33,700 est que si vous avez été délibérément d'être intelligent et d'essayer de convertir à partir d'un personnage à un certain nombre 480 00:29:33,700 --> 00:29:37,190 ou vice versa, il n'y a aucune une telle chose comme un caractère négatif. 481 00:29:37,190 --> 00:29:42,550 Dans le monde de l'ASCII, qui utilise seulement 8 bits, les 8 bits de ceux matière, 482 00:29:42,550 --> 00:29:46,810 et le bit le plus à gauche n'a rien à voir avec la négativité. 483 00:29:46,810 --> 00:29:49,670 Et juste pour être clair, quand je dis bits à gauche, 484 00:29:49,670 --> 00:29:54,610 rappelle que lorsque nous avons fait nos peu-exemples se rapportant à la première semaine 485 00:29:54,610 --> 00:30:02,570 Rappelons que nous avons dessiné des choses comme 1001101, quelque chose comme ça. 486 00:30:02,570 --> 00:30:07,210 Quand je dis le bit le plus à gauche, je viens littéralement faire la 1 que vous écrivez tout le chemin vers la gauche. 487 00:30:07,210 --> 00:30:11,910 Ainsi, dans le monde de personnages n'y a pas de notion de négativité, 488 00:30:11,910 --> 00:30:16,360 de sorte que le bit le plus à gauche a vraiment quelque chose à voir avec ASCII, rien à voir avec la négativité. 489 00:30:16,360 --> 00:30:19,390 >> Alors que cela ressemble - et hors de contexte, il est difficile de répondre exactement - 490 00:30:19,390 --> 00:30:25,840 mais de toute façon, votre code a été confusion que bit de gauche comme représentant une valeur négative 491 00:30:25,840 --> 00:30:29,160 quand il faisait véritablement partie du personnage en question. 492 00:30:29,160 --> 00:30:32,250 Et encore, je simplifie parce que les ordinateurs font réellement quelque chose d'un peu plus chics 493 00:30:32,250 --> 00:30:37,080 qu'un simple changement de ce bit le plus à gauche à 1 pour un signe négatif par rapport à un 0. 494 00:30:37,080 --> 00:30:41,270 Ils ont plutôt, si vous êtes curieux de Google, utilisez quelque chose de typiquement appelé complément à 2, 495 00:30:41,270 --> 00:30:43,830 qui est un peu plus sophistiquée d'une approche 496 00:30:43,830 --> 00:30:45,490 mais l'idée est finalement le même. 497 00:30:45,490 --> 00:30:50,530 >> Donc en bref, il y avait à voir avec le fait que vous avez été un certain nombre à masser un caractère 498 00:30:50,530 --> 00:30:53,750 ou vice versa, mais votre code n'était pas conscient du fait 499 00:30:53,750 --> 00:30:56,510 que 1 de ces bits ont une signification dans le monde numérique. 500 00:30:56,510 --> 00:30:59,940 Ce n'est pas le cas dans le monde de caractère. 501 00:30:59,940 --> 00:31:04,270 Mais il semble que vous avez fixé, dans ce cas, caduque, maintenant. D'autres questions. 502 00:31:06,030 --> 00:31:07,110 D'accord. 503 00:31:07,110 --> 00:31:11,560 Donc, à ce jour, tous les programmes que nous avons écrites ont pris d'entrée peut-être de l'utilisateur 504 00:31:11,560 --> 00:31:14,330 sous la forme de fonctions comme getInt, GetString, 505 00:31:14,330 --> 00:31:16,990 ou si vous avez lu l'avant dans divers livres ou des références en ligne, 506 00:31:16,990 --> 00:31:21,390 vous vous auriez pu utiliser des fonctions telles que scanf qui, franchement, que nous utilisons dans la bibliothèque CS50. 507 00:31:21,390 --> 00:31:25,370 Mais dans une semaine ou 2, nous allons effectivement vous montrer comment la bibliothèque CS50 est mis en œuvre 508 00:31:25,370 --> 00:31:27,890 afin que nous puissions prendre les roues d'entraînement hors tout. 509 00:31:27,890 --> 00:31:31,340 >> Mais il s'avère qu'il ya une autre façon d'obtenir les commentaires d'un utilisateur. 510 00:31:31,340 --> 00:31:34,670 En fait, nous avons nous-mêmes été en utilisant des arguments de ligne de commande 511 00:31:34,670 --> 00:31:36,500 pour un couple de semaines maintenant. 512 00:31:36,500 --> 00:31:41,150 Chaque fois que nous nous sommes heurtés Clang ou nous avons lance make, 513 00:31:41,150 --> 00:31:45,050 nous n'avons pas seulement tapé clang, Entrez, nous n'avons pas tapé faire, Entrée. 514 00:31:45,050 --> 00:31:49,340 Qu'avons-nous généralement écrite après le cliquetis mot à notre terminal de fenêtres rapide? 515 00:31:51,110 --> 00:31:52,900 [L'élève] Le nom du fichier. >> Le nom du fichier, non? 516 00:31:52,900 --> 00:31:57,560 Hello.c ou mario.c ou quel que soit le nom du fichier concerné est. 517 00:31:57,560 --> 00:32:01,910 Et dans ce sens, ce que vous avez vraiment fait est que vous avez influencé le comportement des Clang 518 00:32:01,910 --> 00:32:05,750 parce que certainement les gens qui ont écrit Clang n'avais aucune idée de ce que vous avez peu vieux 519 00:32:05,750 --> 00:32:08,890 j'allais écrire un programme appelé mario.c années plus tard. 520 00:32:08,890 --> 00:32:13,150 Alors il fallait en quelque sorte influencer le comportement de ce programme, 521 00:32:13,150 --> 00:32:18,140 et que Clang programme a dû être rédigé de telle manière qu'il puisse accepter l'entrée de votre 522 00:32:18,140 --> 00:32:23,480 par l'ajout de mots sur la demande de confirmation avant l'utilisateur clique sur Enter. 523 00:32:23,480 --> 00:32:27,860 >> Ainsi, il s'avère que depuis quelque temps, nous avons été en déclarant la quasi-totalité de nos programmes 524 00:32:27,860 --> 00:32:32,840 pour commencer comme ça - int main (void) - et puis nous avons pris les devants 525 00:32:32,840 --> 00:32:35,110 et a commencé à écrire notre code. 526 00:32:35,110 --> 00:32:37,910 Et nous pourrions avoir une forte comprend au début du fichier, 527 00:32:37,910 --> 00:32:40,660 mais la quasi-totalité de nos programmes jusque-là ont commencé avec ce 528 00:32:40,660 --> 00:32:44,200 même si vous avez vu en coupe, dans les livres, références en ligne 529 00:32:44,200 --> 00:32:46,570 que ce n'est pas en fait avoir comme nulle. 530 00:32:46,570 --> 00:32:55,820 Une autre forme légitime pour ce faire prendre est int argc, puis chaîne argv []. 531 00:32:55,820 --> 00:32:57,500 Alors maintenant, ce qui est cela implique? 532 00:32:57,500 --> 00:33:01,320 Il s'avère que argc, qui est une convention humaine - ce qu'on pourrait appeler foo, 533 00:33:01,320 --> 00:33:03,710 mais il serait tout simplement beaucoup moins clair pour les lecteurs - 534 00:33:03,710 --> 00:33:09,330 argc est juste un argument à la fonction appelée main qui représente quoi? 535 00:33:09,330 --> 00:33:12,450 Qu'est-ce que argc reposer pour ceux qui connaissent? 536 00:33:12,450 --> 00:33:14,980 >> [Réponse de l'élève inaudible] >> Ouais, nombre d'arguments ou de comptage argument. 537 00:33:14,980 --> 00:33:16,510 C'est aussi simple que cela. 538 00:33:16,510 --> 00:33:19,160 Combien d'arguments ont été passés à ce programme? 539 00:33:19,160 --> 00:33:20,630 Qu'est-ce que ça veut dire? 540 00:33:20,630 --> 00:33:27,090 Si la ligne de commande j'ai couru quelque chose comme ça - clang-mario.c - 541 00:33:27,090 --> 00:33:35,440 argc lorsque je tape Entrez va prendre une valeur de quelque peu confuse, 2. 542 00:33:35,440 --> 00:33:40,150 Ainsi, il s'avère que argc est le nombre de l'argument, 543 00:33:40,150 --> 00:33:46,280 mais pour des raisons historiques, le nom du programme lui-même est inclus dans ce décompte. 544 00:33:46,280 --> 00:33:51,950 Donc, argc vaut 2 lorsque j'ai écrit clang mario.c. 545 00:33:51,950 --> 00:33:54,290 Qu'est-ce que argv contient-il? 546 00:33:54,290 --> 00:33:57,020 Tout d'abord, argv ressemble à une chaîne, mais pas tout à fait 547 00:33:57,020 --> 00:33:59,310 car dès mercredi dernier, et d'autant plus aujourd'hui, 548 00:33:59,310 --> 00:34:02,890 ces crochets indiquent ce qui? C'est un tableau. 549 00:34:02,890 --> 00:34:07,110 Il n'ya pas de nombre dans le tableau, ce qui devrait donner un sens intuitivement 550 00:34:07,110 --> 00:34:10,790 parce que les gens qui ont écrit Clang année il ya certainement eu aucune idée 551 00:34:10,790 --> 00:34:16,300 combien de mots que les gens comme nous, tapez à l'invite avant de frapper sur Entrée. 552 00:34:16,300 --> 00:34:22,280 >> Donc dans ce cas là, ils ont déclaré que la principale fonction que de prendre un tableau d'arguments, 553 00:34:22,280 --> 00:34:24,590 0 ou plusieurs arguments. 554 00:34:24,590 --> 00:34:26,460 Ils ne savent pas à l'avance combien ils sont, 555 00:34:26,460 --> 00:34:29,690 il n'est donc pas délibérément à l'intérieur de certains de ces crochets. 556 00:34:29,690 --> 00:34:32,750 Mais le fait que les crochets sont là disent l'ordinateur, 557 00:34:32,750 --> 00:34:34,639 s'attendre à un tableau. 558 00:34:34,639 --> 00:34:37,489 Argv est juste abbréviation de vecteur d'arguments. 559 00:34:37,489 --> 00:34:39,889 Un vecteur est une façon élégante de dire ensemble, 560 00:34:39,889 --> 00:34:42,980 et le tableau est une façon élégante de dire une liste ou d'une collection. 561 00:34:42,980 --> 00:34:47,360 Donc, cela signifie simplement que si vous écrivez comme ceci principal 562 00:34:47,360 --> 00:34:51,100 au lieu de comme la façon dont nous avons fait pendant ces deux dernières semaines, 563 00:34:51,100 --> 00:34:54,699 votre programme a maintenant le pouvoir d'accepter les arguments de ligne de commande 564 00:34:54,699 --> 00:34:58,520 de sorte que plus vous avez à écrire mario, puis appuyez sur Entrée, 565 00:34:58,520 --> 00:35:01,610 puis tapez dans un certain nombre de combien de blocs que vous voulez élevé de la pyramide d'être, 566 00:35:01,610 --> 00:35:03,100 puis appuyez de nouveau sur Entrée. 567 00:35:03,100 --> 00:35:07,720 Nous n'avons même pas besoin d'utiliser GetString plus ou getInt ou GetFloat pour cette question. 568 00:35:07,720 --> 00:35:12,370 Nous pouvons seulement espérer à l'utilisateur de taper ces mots à l'invite de lui-même 569 00:35:12,370 --> 00:35:16,850 tout comme les auteurs de Clang décidé que ce serait un programme très ennuyeux 570 00:35:16,850 --> 00:35:20,550 si pour compiler votre code vous devez d'abord clang tapé, appuyez sur Entrée, 571 00:35:20,550 --> 00:35:24,090 puis nous l'avons dit à l'utilisateur, s'il vous plaît entrez le nom du fichier que vous voulez compiler, 572 00:35:24,090 --> 00:35:26,920 puis on tape dans mario.c et appuyez sur Entrée. 573 00:35:26,920 --> 00:35:29,850 Mais c'est exactement ce que nous avons fait à nos utilisateurs des deux dernières semaines. 574 00:35:29,850 --> 00:35:33,550 Nous utilisons GetString et nous attendons que le programme est en cours d'exécution pour les inciter pour l'entrée. 575 00:35:33,550 --> 00:35:36,710 Cela ne doit plus être le cas. 576 00:35:36,710 --> 00:35:41,160 >> Donc, dans cet exemple ici, nous avons maintenant argv chaîne, 577 00:35:41,160 --> 00:35:43,390 et cela aussi est un peu simpliste, 578 00:35:43,390 --> 00:35:45,610 roues de formation qui seront très bientôt se détacher. 579 00:35:45,610 --> 00:35:50,860 C'est le moyen le plus approprié d'écrire cette déclaration alternative principale 580 00:35:50,860 --> 00:35:54,740 car il s'avère que ce que nous continuons à appeler chaîne a fait une étoile, 581 00:35:54,740 --> 00:35:58,440 un astérisque, dans sa définition même, mais cela semble peu compliqué, 582 00:35:58,440 --> 00:36:02,600 il est déroutant au premier abord, si nous simplifions par la simple création d'un synonyme de sortes 583 00:36:02,600 --> 00:36:09,340 dans la bibliothèque CS50 que les cartes char * mot à cette chaîne plus convivial. 584 00:36:09,340 --> 00:36:13,180 >> Donc, nous allons effectivement essayer cette époque. Permettez-moi aller de l'avant et d'ouvrir gedit ici. 585 00:36:13,180 --> 00:36:17,010 Permettez-moi aller de l'avant et d'ouvrir de argv 1. 586 00:36:17,010 --> 00:36:21,620 Ce programme imprime apparemment les arguments, mais dans des termes anglais, 587 00:36:21,620 --> 00:36:26,290 en regardant ce code, qu'est-ce que faire plus spécifiquement? 588 00:36:26,290 --> 00:36:35,910 Si je tape dans la barre de commandes a.out foo, ce qui est imprimé dans ma fenêtre en noir et blanc? 589 00:36:35,910 --> 00:36:41,260 A.out foo bar, Entrée. 590 00:36:43,120 --> 00:36:48,300 Allez-y. Ouais. >> [Réponse de l'élève inaudible] 591 00:36:48,300 --> 00:36:52,730 Bon. Donc a.out, nouvelle ligne, foo, la nouvelle ligne, un bar, une nouvelle ligne. 592 00:36:52,730 --> 00:36:54,980 Pourquoi est-ce? Nous pouvons certainement confirmer dans un instant. 593 00:36:54,980 --> 00:36:56,940 Il s'agit d'une sorte de ligne de code moelleux. 594 00:36:56,940 --> 00:36:59,560  Il ne fait qu'afficher une nouvelle ligne juste pour rendre les choses plus joli à l'écran. 595 00:36:59,560 --> 00:37:03,730 Il s'agit d'une boucle qui est une itération de 0 sur un maximum de argc, 596 00:37:03,730 --> 00:37:07,210 et ce n'est incrémenter à chaque itération + +. 597 00:37:07,210 --> 00:37:12,270 Donc, ce dit maintenant imprimer une chaîne de caractères, comme le laisse entendre ce% s. 598 00:37:12,270 --> 00:37:16,460 Argv [i] est à peu près la même idée de l'exemple précédent. 599 00:37:16,460 --> 00:37:19,580 Nous l'appelions la variable s, et maintenant il est appelé, de façon arbitraire, argv. 600 00:37:19,580 --> 00:37:24,270 Cela signifie imprimer l'argument ième qui a été tapé en ligne de commande, 601 00:37:24,270 --> 00:37:28,690 et puis après tout cela est fait, pour faire bonne mesure d'imprimer une nouvelle ligne. 602 00:37:28,690 --> 00:37:31,600 >> Alors voyons voir ça. Permettez-moi d'ouvrir la fenêtre du terminal. 603 00:37:31,600 --> 00:37:37,470 Permettez-moi de compiler argv 1, et maintenant laissez-moi courir argv 1, Entrée. Hmm. D'accord. 604 00:37:37,470 --> 00:37:40,850 Lançons foo bar. Intéressant. Baz. 605 00:37:40,850 --> 00:37:42,640 Et si vous êtes déjà demandé pourquoi je tape ceci, 606 00:37:42,640 --> 00:37:45,010 c'est juste aussi une convention d'ordinateur stupide science. 607 00:37:45,010 --> 00:37:48,050 Le monde a besoin souvent de simples espaces réservés pour les mots verbales. 608 00:37:48,050 --> 00:37:50,090 Donc, si vous voulez parler de la ficelle générique, 609 00:37:50,090 --> 00:37:53,250 les informaticiens ont tendance à dire que foo quand ils ont besoin d'un mot au hasard, 610 00:37:53,250 --> 00:37:55,530 puis ils disent bar si ils ont besoin d'un deuxième mot aléatoire, 611 00:37:55,530 --> 00:37:59,100 puis ils disent baz s'ils ont besoin d'un troisième mot, puis ils disent qux s'ils ont besoin d'un quatrième mot, 612 00:37:59,100 --> 00:38:01,520 et puis il ya un grand débat religieux en ligne de ce qui vient après qux, 613 00:38:01,520 --> 00:38:04,940 afin que vous puissiez Google que de comprendre ce que l'autre mot arbitraire devrait être. 614 00:38:04,940 --> 00:38:07,480 Mais ceux-ci n'ont aucune signification quelconque, 615 00:38:07,480 --> 00:38:10,100 si foo bar, si vous Google que cela ne ont un sens, 616 00:38:10,100 --> 00:38:12,780 qui fait partie de l'étymologie ici. 617 00:38:12,780 --> 00:38:17,550 >> Donc, tout cela est fait alors l'impression 1 de ces chaînes par ligne. 618 00:38:17,550 --> 00:38:19,900 Donc, si je la place, cependant, voulait obtenir un peu plus chics, 619 00:38:19,900 --> 00:38:22,550 suppose que je ne voulais pas d'imprimer chaque chaîne par ligne; 620 00:38:22,550 --> 00:38:26,220 Je voulais imprimer chaque caractère de chaque chaîne par ligne. 621 00:38:26,220 --> 00:38:28,550 Comment pourrais-je le faire à la place? 622 00:38:28,550 --> 00:38:33,720 Que dois-je changer au sujet de ce programme si je veux imprimer non chaque mot 623 00:38:33,720 --> 00:38:37,290 mais je veux imprimer chaque mot lettre par lettre par lettre, 624 00:38:37,290 --> 00:38:40,590 puis la lettre du mot suivant par lettre par lettre? 625 00:38:40,590 --> 00:38:43,650 Comment pouvons-nous combiner ces idées jusque-là? Ouais. 626 00:38:43,650 --> 00:38:47,390 [L'élève]% c. Tous droits >>. Nous avons donc besoin d'un endroit c%. 627 00:38:47,390 --> 00:38:50,680 Bon, parce que je ne veux pas d'imprimer des chaînes entières, je veux imprimer des caractères. Quoi d'autre? 628 00:38:50,680 --> 00:38:54,290 >> [Réponse de l'élève inaudible] >> Intéressant. 629 00:38:54,290 --> 00:38:56,860 Il nous faut donc une sorte de deuxième dimension ici maintenant 630 00:38:56,860 --> 00:39:02,300 parce penser argv comme un tableau, mais c'est un tableau de chaînes. 631 00:39:02,300 --> 00:39:07,170 Mais comme d', comme, il ya 15 minutes, ce qui est une chaîne? C'est un tableau de caractères. 632 00:39:07,170 --> 00:39:12,320 Alors, vraiment, argv est un tableau d'un tableau de caractères, 633 00:39:12,320 --> 00:39:14,870 un ensemble de tableaux de caractères. 634 00:39:14,870 --> 00:39:19,170 Ainsi, il s'avère que l'on peut utiliser les notations support un peu plus carrés. Alors allons-y. 635 00:39:19,170 --> 00:39:23,650 Dans le haut de cette boucle sur la ligne 19, je vais parcourir depuis i jusqu'à argc, 636 00:39:23,650 --> 00:39:25,760 mais je vais faire ceci: 637 00:39:25,760 --> 00:39:27,580 pour - je ne peux pas je utiliser maintenant. 638 00:39:27,580 --> 00:39:30,300 J'ai besoin d'une autre variable parce que je veux itérer sur les mots 639 00:39:30,300 --> 00:39:32,640 mais aussi sur les lettres dans les mots 640 00:39:32,640 --> 00:39:37,280 donc je sorte de présenter un axe vertical et un axe horizontal, sorte de vue conceptuel. 641 00:39:37,280 --> 00:39:43,930 Donc j int obtient 0, alors je veux faire aussi longtemps que j j est inférieur - et je vais nettoyer tout ça un peu. 642 00:39:43,930 --> 00:39:48,410 Comment puis-je parcourir les lettres dans une chaîne? Nous l'avons fait il ya un instant. 643 00:39:48,410 --> 00:39:54,670 Strlen de argv [i]. Bon. 644 00:39:54,670 --> 00:39:57,860 Et encore une fois, je fais un peu ici l'inefficacité en ne créant pas ou n que ce soit, 645 00:39:57,860 --> 00:39:59,610 mais nous reviendrons là-dessus. 646 00:39:59,610 --> 00:40:03,270 >> Alors maintenant, j + +. Maintenant, je dois tiret davantage ici. 647 00:40:03,270 --> 00:40:06,950 Qu'est-ce que je veux maintenant imprimer sur chaque itération? 648 00:40:06,950 --> 00:40:09,720 [Réponse de l'élève inaudible] >> Donc [i] me donnera la parole. 649 00:40:09,720 --> 00:40:12,910 [I] [j], un peu comme une matrice. 650 00:40:12,910 --> 00:40:14,810 Ceux d'entre vous avec les mathématiques y horizons, 651 00:40:14,810 --> 00:40:19,340 nous sommes en quelque sorte de l'indexation encore plus loin dans cette matrice ou cette série de tableaux, 652 00:40:19,340 --> 00:40:21,380 cette structure 2-dimensionnelle. 653 00:40:21,380 --> 00:40:25,070 Alors maintenant, nous allons voir ce qui se passe ici. Permettez-moi d'ouvrir ma fenêtre de terminal plus grand. 654 00:40:25,070 --> 00:40:28,170 Permettez-moi de faire de relancer argv 1. 655 00:40:28,170 --> 00:40:33,090 Et j'ai foiré ici, ce qui est une bonne leçon parce que moi aussi oublié de le faire. 656 00:40:33,090 --> 00:40:37,150 Déclarer implicitement "strlen" fonction de la bibliothèque C avec unsigned »- 657 00:40:37,150 --> 00:40:40,360 Je ne sais même pas ce que le reste de ce moyen, mais j'ai vu ça avant, 658 00:40:40,360 --> 00:40:42,000 déclarer implicitement. 659 00:40:42,000 --> 00:40:45,540 Chaque fois que nous voyons cette erreur, qu'est ce que cela signifie en général? 660 00:40:45,540 --> 00:40:48,520 >> [Réponse de l'élève inaudible] >> J'ai oublié une bibliothèque en haut. Mais attendez une minute. 661 00:40:48,520 --> 00:40:51,690 D'habitude, je suis foutu parce que j'ai oublié la bibliothèque CS50, mais c'est là. 662 00:40:51,690 --> 00:40:54,480 D'habitude, je suis foutu parce que j'ai oublié de base I / O. 663 00:40:54,480 --> 00:40:57,960 Et franchement, je n'ai même pas besoin de cela. Nous n'utilisons pas GetString aujourd'hui. 664 00:40:57,960 --> 00:40:59,900 Alors qu'est-ce que je suis absent? 665 00:40:59,900 --> 00:41:04,860 Il ya une autre bibliothèque que maintenant nous avons besoin d'utiliser string.h parfois appelé, 666 00:41:04,860 --> 00:41:08,980 et c'est tout de suite une autre bibliothèque qui a plus de fonctions qui ne sont pas dans la norme I / O. 667 00:41:08,980 --> 00:41:11,640 >> Donc, revenons à ma grande fenêtre de terminal. 668 00:41:11,640 --> 00:41:16,670 D'accord. Maintenant, bon sang, je suppose que j'avais tort. J'ai été en utilisant la bibliothèque CS50. 669 00:41:16,670 --> 00:41:18,460 Ainsi, nous pouvons résoudre ce problème dans l'une des 2 façons. 670 00:41:18,460 --> 00:41:21,510 Nous pouvons prendre les roues d'entraînement hors en ce moment et tout cela, 671 00:41:21,510 --> 00:41:26,600 ou en nature let de garder cette simplification juste pour le moment, de retour dans collez ce, 672 00:41:26,600 --> 00:41:30,180 résoudre ce problème, et maintenant revenir à la fenêtre du terminal. 673 00:41:30,180 --> 00:41:33,080 Donc, pour être clair, dans la bibliothèque CS50 n'est pas seulement les fonctions, 674 00:41:33,080 --> 00:41:36,920 c'est aussi le mot clé string, ce qui explique pourquoi cette erreur vient de se passer. 675 00:41:36,920 --> 00:41:43,010 >> Alors on y va. J'ai fixé les deux questions de la bibliothèque. Entrée. Bon. 676 00:41:43,010 --> 00:41:49,250 Argv 1, foo bar, Entrée. Excellent. 677 00:41:49,250 --> 00:41:52,830 Nous avons donc maintenant chaque lettre de chaque mot imprimé 1 par ligne, 678 00:41:52,830 --> 00:41:55,290 ce qui ne permet pas d'avoir un programme très intéressant, 679 00:41:55,290 --> 00:41:59,350 mais remarquez maintenant nous avons la capacité non seulement de l'itération sur les mots 680 00:41:59,350 --> 00:42:04,090 mais aussi sur des lettres individuelles à-dire, ce qui semble terriblement familier 681 00:42:04,090 --> 00:42:10,330 de même le plus simple des applications telles que lettres de brouillage dans une chaîne comme ça. 682 00:42:10,330 --> 00:42:12,410 Allons de l'avant et de prendre notre pause de 5 minutes ici. 683 00:42:12,410 --> 00:42:14,410 Et quand nous reviendrons, nous allons commencer à parler de l'efficacité 684 00:42:14,410 --> 00:42:17,670 avec laquelle nous pouvons faire ces choses. 685 00:42:19,370 --> 00:42:21,900 >> Très bien. Nous sommes de retour. 686 00:42:21,900 --> 00:42:26,970 Merci à l'un de nos facteurs de transcription qui joue beaucoup de Bananagrams, 687 00:42:26,970 --> 00:42:30,000 nous avons en fait tout un tas de caractères avec nous ici aujourd'hui 688 00:42:30,000 --> 00:42:32,520 physiquement incarnée avec ces petits morceaux de plastique, 689 00:42:32,520 --> 00:42:36,910 et permettez-moi de proposer que cette ardoise vierge blanche représente ici la RAM dans mon ordinateur - 690 00:42:36,910 --> 00:42:39,790 ordinateur portable, ordinateur de bureau, peu importe - et il ressemble à beaucoup de lui 691 00:42:39,790 --> 00:42:44,090 parce que si on commence à découper jusqu'à présent RAM dans de petits morceaux de la grosseur d'octets, 692 00:42:44,090 --> 00:42:48,970 nous allons arbitrairement que quelque chose de cette taille et de ce que représente floue - 693 00:42:48,970 --> 00:42:52,430 voilà, et attardons-nous un zoom arrière un peu ici - 694 00:42:52,430 --> 00:42:56,120 disons que quelque chose de cette taille représente un seul octet. 695 00:42:56,120 --> 00:43:00,400 Donc, on peut en effet s'adapter à tout un tas d'octets ou de caractères à l'intérieur de cette mémoire, 696 00:43:00,400 --> 00:43:02,860 comme suggéré par la taille relative ici. 697 00:43:02,860 --> 00:43:06,780 >> Supposons donc maintenant que l'objectif est d'allouer de la mémoire pour une chaîne. 698 00:43:06,780 --> 00:43:08,680 Comment cela fonctionne réellement? 699 00:43:08,680 --> 00:43:11,380 Dans les programmes que nous avons écrit, nous avons souvent eu recours à GetString, 700 00:43:11,380 --> 00:43:16,300 mais maintenant, clairement, il ya cette autre voie par laquelle nous pouvons obtenir saisie de l'utilisateur dans argv 701 00:43:16,300 --> 00:43:18,190 via des arguments de ligne de commande. 702 00:43:18,190 --> 00:43:20,580 Mais qu'est-ce qui se passe vraiment sous le capot? 703 00:43:20,580 --> 00:43:24,920 Il s'avère que nous appelons - nous allons revenir en arrière pour GetString - la fonction GetString 704 00:43:24,920 --> 00:43:28,190 dans la bibliothèque CS50, l'utilisateur est invité à saisir une chaîne de caractères, 705 00:43:28,190 --> 00:43:30,780 l'utilisateur tape un mot - appelons-BONJOUR. 706 00:43:30,780 --> 00:43:35,410 Et nous avons dit depuis ces deux dernières semaines que la valeur de retour de GetString 707 00:43:35,410 --> 00:43:37,750 est en fait une chaîne de caractères, comme le mot BONJOUR. 708 00:43:37,750 --> 00:43:39,660 >> Mais ce qui est GetString vraiment? 709 00:43:39,660 --> 00:43:45,230 Que l'utilisateur tape dans BONJOUR, Entrée, GetString est de trouver, 710 00:43:45,230 --> 00:43:47,930 ok, combien de caractères est-ce? Il s'agit d'H-E-L-L-O. 711 00:43:47,930 --> 00:43:52,500 Donc, il a besoin d'allouer, il doit demander au système d'exploitation - Linux dans ce cas - 712 00:43:52,500 --> 00:43:55,410 pendant au moins 5 octets pour stocker BONJOUR. 713 00:43:55,410 --> 00:43:59,570 Et ce qu'il procède alors à faire une fois qu'il rentre les 5 octets à partir du système d'exploitation 714 00:43:59,570 --> 00:44:04,120 est d'établir BONJOUR dos à dos à dos à dos. 715 00:44:04,120 --> 00:44:11,070 Et donc ce qui est vraiment revenu de GetString est un bloc de données qui ressemble à ceci. 716 00:44:11,070 --> 00:44:16,850 Mais c'est un peu inexact, car il s'avère que ce n'est pas aussi simple 717 00:44:16,850 --> 00:44:20,310 comme tout stocker dans BONJOUR mémoire de l'ordinateur 718 00:44:20,310 --> 00:44:24,140 car supposons que mon programme que je vous écris en C puis appelle GetString nouveau, 719 00:44:24,140 --> 00:44:28,210 et le mot suivant que l'utilisateur tape dans est bye, bye. 720 00:44:28,210 --> 00:44:31,300 Eh bien, j'ai besoin pour s'adapter à ce BYE mot quelque part en mémoire. 721 00:44:31,300 --> 00:44:33,790 Je ne peux pas clobber BONJOUR. 722 00:44:33,790 --> 00:44:37,320 Par exemple, je ne veux pas l'ordinateur de simplement commencer à écraser comme ceci 723 00:44:37,320 --> 00:44:41,400 le mot d'origine parce que je pourrais encore utiliser le mot BONJOUR dans une variable 724 00:44:41,400 --> 00:44:43,070 ailleurs dans mon programme. 725 00:44:43,070 --> 00:44:45,900 >> Donc B-Y-E doit se retrouver ailleurs dans la mémoire. 726 00:44:45,900 --> 00:44:50,460 Mais la convention est généralement que la chaîne suivante vous allouez 727 00:44:50,460 --> 00:44:54,940 sans doute, mais pas toujours, va se retrouver à l'emplacement de mémoire disponible suivant. 728 00:44:54,940 --> 00:44:57,370 Et si je n'ai pas demandé le système d'exploitation pour toute la mémoire 729 00:44:57,370 --> 00:45:01,380 depuis la dernière fois que j'ai appelé GetString, les chances sont le BYE mot 730 00:45:01,380 --> 00:45:05,790 va se retrouver tout de suite après le mot BONJOUR en mémoire. 731 00:45:05,790 --> 00:45:10,550 Mais à ce stade, vous pouvez peut-être voir où se pose un problème potentiel. 732 00:45:10,550 --> 00:45:13,310 Parce que les morceaux suivants de la mémoire, les octets suivants qui étaient juste libre - 733 00:45:13,310 --> 00:45:18,230 nettoyer ardoise blanche - dans la mémoire de l'ordinateur était juste à côté BONJOUR, 734 00:45:18,230 --> 00:45:23,670 il se sent comme la première chaîne J'ai demandé pourrait soudainement changer maintenant 735 00:45:23,670 --> 00:45:26,410 parce que j'ai changé pour l'essentiel HELLOBYE 736 00:45:26,410 --> 00:45:31,310 au lieu de demarcing quelque sorte le début de BYE et la fin de BONJOUR. 737 00:45:31,310 --> 00:45:33,920 >> Ainsi, il s'avère que ce qui se passe vraiment sous le capot, 738 00:45:33,920 --> 00:45:37,570 que vous pourriez avoir entrevu dans les références en ligne ou de l'article ou des livres 739 00:45:37,570 --> 00:45:41,780 ou pas du tout pour l'instant, c'est qu'il ya effectivement une démarcation délibérée 740 00:45:41,780 --> 00:45:45,890 entre les mots dans la mémoire d'un ordinateur. 741 00:45:45,890 --> 00:45:52,480 Et en fait, dans ce cas-ci, plutôt que de simplement mettre BYE juste à côté BONJOUR, 742 00:45:52,480 --> 00:45:58,610 au contraire, l'ordinateur met un caractère spécial, le caractère spécial nulle, pour ainsi dire, 743 00:45:58,610 --> 00:46:03,050 qui est représenté par un marqueur de contre-oblique 0. 744 00:46:03,050 --> 00:46:06,700 Donc, longue histoire courte, rappelons que les personnages sont représentés en ASCII. 745 00:46:06,700 --> 00:46:09,680 ASCII est juste une mise en correspondance entre les numéros et les lettres, 746 00:46:09,680 --> 00:46:13,870 et la plupart de ces lettres commencent environ 65 pour le capital A, 747 00:46:13,870 --> 00:46:19,780 mais il s'avère que vous pouvez certainement représenter le chiffre 0 comme un entier ou en binaire, 748 00:46:19,780 --> 00:46:22,690 et il s'avère que le monde a décidé il ya bien longtemps: «Vous savez quoi?" 749 00:46:22,690 --> 00:46:27,550 "Faisons 0 Nombre réserve de ne pas représenter tous les caractères sur le clavier - 750 00:46:27,550 --> 00:46:30,810 "Pas de lettres, pas de chiffres, pas de ponctuation. 0 est spécial." 751 00:46:30,810 --> 00:46:35,830 "Il va y avoir du caractère spécial nulle, et nous allons l'écrire comme \ 0". 752 00:46:35,830 --> 00:46:41,170 La différence étant que nous venons d'écrire 0, 0 est un personnage. 753 00:46:41,170 --> 00:46:45,700 Rappelez-vous que il ya des codes ASCII pour 0, de 1, de 2, de 3 754 00:46:45,700 --> 00:46:50,570 car le caractère 0 est différent du nombre 0. 755 00:46:50,570 --> 00:46:54,270 Et vous pouvez voir que si vous regardez en arrière de la semaine 1 lorsque nous avons parlé ASCII, 756 00:46:54,270 --> 00:46:59,130 0 et 1 et 2 et 3 sur toute la hauteur à 9 ont leurs propres codes ASCII. 757 00:46:59,130 --> 00:47:02,300 Ils ne sont pas, par hasard, de 0 à 9. Ils sont très différents. 758 00:47:02,300 --> 00:47:08,770 Donc 0 signifie simplement «Je suis spécial», et les \ 0 signifie littéralement: «Je ne suis pas le caractère 0." 759 00:47:08,770 --> 00:47:11,360 «Je suis cette valeur particulière, le caractère nul." 760 00:47:11,360 --> 00:47:16,930 J'ai donc fait besoin d'un autre de ces car je ne peux pas faire la même erreur deux fois. 761 00:47:16,930 --> 00:47:21,550 >> Ainsi, après le mot BYE nous allons aussi avoir besoin d'un autre de ces caractères nuls. 762 00:47:21,550 --> 00:47:27,090 Permettez-moi de prendre ma plume ici et laissez-moi dessiner rapidement un autre \ 0 763 00:47:27,090 --> 00:47:30,480 de sorte que, après j'ai demandé au système d'exploitation de 2 chaînes 764 00:47:30,480 --> 00:47:33,270 via GetString suivi par un autre appel à GetString, 765 00:47:33,270 --> 00:47:35,640 c'est ce qui est fait en mémoire. 766 00:47:35,640 --> 00:47:39,900 Alors, quand je rentre une chaîne, je suis vraiment se remettre que, 767 00:47:39,900 --> 00:47:43,450 et quand je reçois la chaîne suivante, je suis vraiment se remettre ça. 768 00:47:43,450 --> 00:47:47,910 Donc, cela pose la question, strlen, tout d'abord, que doit-il revenir? 769 00:47:47,910 --> 00:47:54,650 Quand je l'appelle strlen sur la chaîne s et s est le mot BONJOUR que l'utilisateur a tapé dans, 770 00:47:54,650 --> 00:47:57,800 qu'est-ce que nous avons évidemment dire la longueur de BONJOUR était il ya quelques minutes? 771 00:47:57,800 --> 00:48:01,290 Il était de 5, non? H-E-L-L-O. Et c'est bien ainsi strlen œuvres. 772 00:48:01,290 --> 00:48:05,670 Elle renvoie ce qu'est un être humain normal peut s'y attendre de la longueur d'une chaîne de l'être. 773 00:48:05,670 --> 00:48:11,030 Mais en réalité, quelle est la taille du tableau de caractères qui est stockant bonjour? 774 00:48:11,030 --> 00:48:12,770 Il s'agit en fait 6. 775 00:48:12,770 --> 00:48:15,740 Donc, strlen ne mentionne pas ce fait pour vous. 776 00:48:15,740 --> 00:48:20,300 Mais sous le capot de l'ordinateur est en effet en utilisant 6 octets pour stocker un mot de 5-lettre, 777 00:48:20,300 --> 00:48:22,380 et cela est vrai, peu importe combien de temps le mot est. 778 00:48:22,380 --> 00:48:26,470 Il va toujours y avoir un caractère nul particulière se terminant à la fin de la chaîne 779 00:48:26,470 --> 00:48:28,800 à démarcation sa longueur totale. 780 00:48:28,800 --> 00:48:33,430 >> Alors, si vous êtes la personne la mise en œuvre strlen 20, il ya 30 ans, 781 00:48:33,430 --> 00:48:35,520 comment allez-vous mettre en œuvre strlen lui-même? 782 00:48:35,520 --> 00:48:39,980 Nous prenons pour acquis qu'il existe, tout comme nous tenons pour acquis ce qui existe printf, 783 00:48:39,980 --> 00:48:42,850 mais si BONJOUR est le mot en question 784 00:48:42,850 --> 00:48:45,220 et ce que j'ai en mémoire est quelque chose qui ressemble à ceci, 785 00:48:45,220 --> 00:48:48,130 si vous aviez à réimplémenter strlen parce que vous avez été invité à 786 00:48:48,130 --> 00:48:50,260 ou parce que, franchement, vous ne saviez pas existé strlen - 787 00:48:50,260 --> 00:48:54,280 vous avez eu à rouler celui-ci sur votre propre - comment pourriez-vous mettre en œuvre strlen 788 00:48:54,280 --> 00:48:57,760 lorsqu'il est administré quelque chose qui ressemble à ceci? 789 00:48:57,760 --> 00:49:02,750 Maintenant que nous savons d'une chaîne est un tableau, on peut itérer sur chacun des caractères individuels 790 00:49:02,750 --> 00:49:06,320 en utilisant quelque chose comme - nous allons essayer de le faire à la volée. 791 00:49:06,320 --> 00:49:12,060 >> Laissez-moi aller dans l'appareil. Permettez-moi de créer un nouveau fichier, strlen.c. 792 00:49:12,060 --> 00:49:19,260 Permettez-moi maintenant aller de l'avant et ne comprennent stdio.h afin que nous ayons accès à printf. 793 00:49:19,260 --> 00:49:25,820 Permettez-moi de faire int main (void). Oh. Je vais le faire moi-même pour le moment alors. [Rires] 794 00:49:25,820 --> 00:49:28,300 Merci. 795 00:49:28,300 --> 00:49:31,000 C'est ce que je fais. Très bien. 796 00:49:31,000 --> 00:49:34,820 Donc, avant je me suis tourné sur l'écran, j'ai tapé tout cela. 797 00:49:34,820 --> 00:49:37,550 Et maintenant ce que je vais faire est la suivante: 798 00:49:37,550 --> 00:49:40,360 printf ("Donnez-moi une chaîne:") 799 00:49:40,360 --> 00:49:42,700 C'est juste les instructions moelleux. 800 00:49:42,700 --> 00:49:45,700 Maintenant, laissez-moi faire GetString string s =. 801 00:49:45,700 --> 00:49:47,260 J'ai déjà besoin de faire un changement maintenant. 802 00:49:47,260 --> 00:49:52,740 J'utilise la bibliothèque CS50 tout à coup, alors laissez-moi aller de l'avant et taper cs50.h. 803 00:49:52,740 --> 00:50:00,720 Et maintenant, nous allons faire ceci: printf ("La longueur est:% d, strlen [s] - 804 00:50:00,720 --> 00:50:03,540 et je n'ai pas encore fini. Que dois-je ajouter à ce programme? 805 00:50:03,540 --> 00:50:05,740 >> [L'élève] string.h. >> String.h. 806 00:50:05,740 --> 00:50:10,800 Donc pour l'instant, nous utilisons strlen, nous allons donc assurez-vous que le compilateur sait où c'est, 807 00:50:10,800 --> 00:50:12,390 donc un peu de raison vérifier. 808 00:50:12,390 --> 00:50:16,400 Je reçois une chaîne à la ligne 8, et dans la ligne 9 j'imprime sur sa longueur% d. 809 00:50:16,400 --> 00:50:19,400 Alors allons-y et ouvrez cette place. 810 00:50:19,400 --> 00:50:23,380 Nous avons faire strlen - compile bien - 811 00:50:23,380 --> 00:50:30,120 strlen - permettez-moi de zoomer - Entrez, H-E-L-L-O, Entrée. La longueur est de 5. 812 00:50:30,120 --> 00:50:32,730 >> Bon, strlen semble fonctionner, mais le monde le savait. 813 00:50:32,730 --> 00:50:37,310 Donc, nous allons maintenant mettre en œuvre strlen nous comme suit. 814 00:50:37,310 --> 00:50:39,490 Permettez-moi de profiter de cette bibliothèque là. 815 00:50:39,490 --> 00:50:42,590 Nous n'avons plus accès à string.h parce que je ne savais même pas qu'il existait. 816 00:50:42,590 --> 00:50:45,970 Mais c'est bien parce que je peux mettre en œuvre strlen moi 817 00:50:45,970 --> 00:50:50,200 et qu'elle soit prise une chaîne appelée entrée, 818 00:50:50,200 --> 00:50:53,830 et maintenant j'ai besoin de comprendre la longueur de cette chaîne. 819 00:50:53,830 --> 00:50:55,880 Alors, comment puis-je faire cela? 820 00:50:55,880 --> 00:51:00,190 Que faire si je fais - nous allons voir comment faire cela - Que voulez-vous faire? 821 00:51:00,190 --> 00:51:04,130 >> [Réponse de l'élève inaudible] >> OK. 822 00:51:04,130 --> 00:51:05,970 Ainsi, nous pouvons le faire dans un tas de façons. Je vais essayer d'adopter cette approche. 823 00:51:05,970 --> 00:51:10,220 Permettez-moi de me donner une variable int i, donc je commence à 0. 824 00:51:10,220 --> 00:51:19,380 Et laissez-moi vous dire ceci: alors que l'entrée [i] n'est pas égal à quoi? \ 0. 825 00:51:19,380 --> 00:51:23,480 Ainsi, il s'avère, comme dans le cas avec tous les caractères lors de leur écriture littéralement dans un programme, 826 00:51:23,480 --> 00:51:25,940 vous devez utiliser des guillemets simples, et non des guillemets doubles. 827 00:51:25,940 --> 00:51:29,250 Donc, si je devais écrire la lettre a, je le ferais, la lettre b, je le ferais. 828 00:51:29,250 --> 00:51:33,440 Ceci, en revanche, serait une chaîne, pas un caractère individuel. 829 00:51:33,440 --> 00:51:38,470 >> Donc, je veux \ 0 littéralement. Qu'est-ce que je veux faire dans cette boucle? 830 00:51:38,470 --> 00:51:42,650 En fait, j'ai besoin d'une autre variable, de sorte int length obtient 0. 831 00:51:42,650 --> 00:51:46,190 Même si vous n'étiez pas sûr pourquoi nous avons commencé la façon dont nous l'avons fait, 832 00:51:46,190 --> 00:51:50,110 maintenant que nous allons dans cette voie, qu'est-ce que je veux faire sur la ligne 9? 833 00:51:50,110 --> 00:51:55,820 longueur + + et puis ici-bas sur la ligne 10, la longueur de retour. 834 00:51:55,820 --> 00:51:58,370 Alors, comment est strlen mis en œuvre? 835 00:51:58,370 --> 00:52:00,550 Il est effectivement mis en œuvre sans doute comme ça. 836 00:52:00,550 --> 00:52:03,470 Peut-être que la personne a utilisé une boucle for, peut-être une boucle Do While - qui sait? 837 00:52:03,470 --> 00:52:05,940 Nous aimerions vraiment regarder sous le capot le code source réelle 838 00:52:05,940 --> 00:52:08,520 dans un fichier appelé string.c probablement. 839 00:52:08,520 --> 00:52:10,480 >> Mais ici, nous allons réfléchir à ce que je fais. 840 00:52:10,480 --> 00:52:13,640 Je déclare une variable appelée i, le définissant comme égal à 0. 841 00:52:13,640 --> 00:52:17,520 Je puis déclarer une autre longueur variable appelée, le définissant comme égal à 0. 842 00:52:17,520 --> 00:52:25,440 Alors je dis tout le ième caractère en entrée n'est pas égal au caractère spécial null, \ 0, 843 00:52:25,440 --> 00:52:27,070 incrémenter la longueur. 844 00:52:27,070 --> 00:52:32,550 Mais dès que le ième caractère est ce caractère spécial, ce qui se passe à la boucle? 845 00:52:32,550 --> 00:52:36,540 Il courts-circuits. Il s'arrête, ce qui signifie que nous avons ensuite retourner instantanément longueur. 846 00:52:36,540 --> 00:52:40,740 >> Donc, si je n'ai pas gâcher, nous allons aller de l'avant et revenir à ma fenêtre de terminal. 847 00:52:40,740 --> 00:52:43,550 Permettez-moi de recompiler. Et je n'ai visser en place. 848 00:52:43,550 --> 00:52:46,320 Redéclaration incompatibles de la fonction strlen bibliothèque. 849 00:52:46,320 --> 00:52:48,650 Alors que j'essayais d'obtenir trop intelligent pour mon propre bien ici. 850 00:52:48,650 --> 00:52:51,610 Le compilateur sait en réalité qu'il existe une fonction appelée strlen 851 00:52:51,610 --> 00:52:55,290 même si nous n'avons pas inclus la bibliothèque. C'est très bien. Peu importe. 852 00:52:55,290 --> 00:52:58,230 Nous allons juste à coopérer alors. Nous allons renommer cette longueur. 853 00:52:58,230 --> 00:53:04,110 Permettez-moi de changer l'utilisation de celui-ci à la longueur ici, et cela rendra plus heureux Clang. 854 00:53:04,110 --> 00:53:08,900 Soit dit en passant, parce que certaines de ces fonctions sont horriblement commun - 855 00:53:08,900 --> 00:53:12,390 strlen, prinf - ils ont en fait sorte de statut spécial. 856 00:53:12,390 --> 00:53:15,310 Et si Clang sait juste un petit quelque chose de spécial. 857 00:53:15,310 --> 00:53:18,760 Ce n'est pas toujours le cas avec la plupart des fonctions, c'est pourquoi nous nous sommes crié. 858 00:53:18,760 --> 00:53:21,350 >> Je vais essayer à nouveau. Heureusement, il a travaillé ce moment-là. 859 00:53:21,350 --> 00:53:23,560 Alors maintenant, permettez-moi de gérer mon propre strlen programme. 860 00:53:23,560 --> 00:53:29,740 Donnez-moi une corde: H-E-L-L-O, Entrée. Et j'ai merdé. 861 00:53:29,740 --> 00:53:34,750 Pourquoi? >> [Réponse de l'élève inaudible] >> Exactement. 862 00:53:34,750 --> 00:53:39,180 J'ai donc moi-même ici une boucle très belle apparence infinie 863 00:53:39,180 --> 00:53:42,270 parce que même si je suis d'incrémentation longueur à chaque itération, 864 00:53:42,270 --> 00:53:47,860 que vais-je bien ne pas faire? Je ne suis pas en incrémentant i. D'accord. Solution facile. Oui? 865 00:53:47,860 --> 00:53:52,430 D'accord. No. Maintenant, nous irait à l'encontre de certains autre erreur commune où je dois parenthèses. 866 00:53:52,430 --> 00:53:54,430 Et franchement, ce code est en train de regarder laid, 867 00:53:54,430 --> 00:53:56,460 donc nous allons essayer de répondre à ce nettoyage en place dans un instant. 868 00:53:56,460 --> 00:53:58,810 Mais maintenant je suis en incrémentant la longueur et i. 869 00:53:58,810 --> 00:54:02,630 Franchement, je vois déjà une possibilité d'amélioration, mais nous reviendrons là-dessus. 870 00:54:02,630 --> 00:54:05,270 >> Alors maintenant, nous allons simplement nous assurer que nous sommes au moins fait des progrès. 871 00:54:05,270 --> 00:54:08,320 Ce qui est arrivé à quelques-uns d'entre vous, et j'ai oublié de mentionner à l'avance. 872 00:54:08,320 --> 00:54:12,420 Quand vous avez le malheur d'un tel scénario, comment pouvez-vous résoudre ce problème 873 00:54:12,420 --> 00:54:15,130 court de redémarrage de l'appareil ou de votre ordinateur ou de fermer la fenêtre? 874 00:54:15,130 --> 00:54:16,860 Il est effectivement facile. 875 00:54:16,860 --> 00:54:21,680 Commande C envoie cette petite carotte symbole C, et qui se termine juste la plupart des programmes. 876 00:54:21,680 --> 00:54:25,990 Si vous avez une boucle infinie vraiment mauvaise impression qui est parfois une infinité de choses, 877 00:54:25,990 --> 00:54:29,960 parfois vous pourriez avoir à faire Control C un millier de fois pour le rendre réellement entendre. 878 00:54:29,960 --> 00:54:33,910 Il suffit donc de se rendre compte maintenant parce que je ne suis pas l'impression de quelque chose, qui a été assez facile. 879 00:54:33,910 --> 00:54:37,970 Et techniquement, une fois suffit, mais je ne s'impatientent et j'ai l'habitude de frapper autant de fois. 880 00:54:37,970 --> 00:54:43,400 >> Donc, strlen. Donnez-moi une corde: BONJOUR. Est-ce que ça va marcher cette fois? 881 00:54:44,580 --> 00:54:47,490 D'accord. Une autre erreur commune. Avoir à recompiler. 882 00:54:47,490 --> 00:54:50,430 C'était délibéré, celui-là. Très bien. 883 00:54:50,430 --> 00:54:54,260 Donc, strlen, H-E-L-L-O, Entrée. Excellent. 884 00:54:54,260 --> 00:54:55,910 Donc, nous avons maintenant un strlen à 5. 885 00:54:55,910 --> 00:54:58,100 Donc, nous avons littéralement réimplémenté cette roue. 886 00:54:58,100 --> 00:55:02,080 Alors maintenant, nous allons nettoyer tout ça parce que cela ne me fais pas impressionné 887 00:55:02,080 --> 00:55:04,080 avec la conception de mon code. 888 00:55:04,080 --> 00:55:07,200 Que pouvons-nous éliminer clairement dans ce programme pour nettoyer tout ça? 889 00:55:07,200 --> 00:55:11,840 [Réponse de l'élève inaudible] >> Oui. Littéralement, nous traitons i et longueur identique. 890 00:55:11,840 --> 00:55:16,440 Alors, pourquoi ne pas simplement faire preuve d'intelligence et de dire alors que la longueur? 891 00:55:16,440 --> 00:55:20,450 Au contraire, nous allons simplement appeler sa longueur, pour commencer, l'initialiser à 0 892 00:55:20,450 --> 00:55:23,340 car par défaut la chaîne n'a pas de longueur jusqu'à ce que nous comprendre de quoi il s'agit. 893 00:55:23,340 --> 00:55:26,160 >> Maintenant, nous faisons cela, et maintenant c'est un programme assez élégant. 894 00:55:26,160 --> 00:55:28,660 Une variable. Je l'ai nettoyé, il resserré. 895 00:55:28,660 --> 00:55:31,980 Alors maintenant, revenons à ma fenêtre de terminal. Allons de l'avant et de lancer ça. 896 00:55:31,980 --> 00:55:35,670 Assurez-strlen. On dirait bien. Exécutez à nouveau strlen, Entrée. 897 00:55:35,670 --> 00:55:40,680 Donnez-moi une corde: BONJOUR, Entrée. Et il semble fonctionner comme 5. 898 00:55:40,680 --> 00:55:45,580 Maintenant, pour être clair, si je n'avais pas écrit, par exemple, dans BONJOUR 1 chaîne de caractères 899 00:55:45,580 --> 00:55:48,840 puis BYE dans un autre, nous pouvons certainement plusieurs mots. 900 00:55:48,840 --> 00:55:53,150 Si l'expression fait, je voulais taper n'était pas BONJOUR, mais, par exemple, 901 00:55:53,150 --> 00:55:58,920 BONJOUR TOUT LE MONDE, notez que ce que nous n'aurions pas cette situation est ici, non? 902 00:55:58,920 --> 00:56:00,580 Cela donne à penser que c'est 2 chaînes. 903 00:56:00,580 --> 00:56:06,060 Vous ne pouvez certainement avoir des caractères barre d'espace, donc si nous avons effectivement tapé dans une phrase plus longue 904 00:56:06,060 --> 00:56:08,390 Comme le monde BONJOUR, ce que nous aurions vraiment dans la mémoire 905 00:56:08,390 --> 00:56:12,730 regarde un petit quelque chose comme ça là-bas. 906 00:56:12,730 --> 00:56:18,910 >> Très bien. Toutes les questions, puis sur la représentation des cordes ici? 907 00:56:18,910 --> 00:56:20,450 Non? Très bien. 908 00:56:20,450 --> 00:56:25,130 Donc je l'ai dit plus tôt que l'appel à strlen encore et encore délibérément comme ça 909 00:56:25,130 --> 00:56:28,070 n'est probablement pas la meilleure idée, parce que vous allez faire beaucoup de travail 910 00:56:28,070 --> 00:56:30,280 encore et encore et encore. 911 00:56:30,280 --> 00:56:36,150 En effet, ce type de travail est nécessaire pour déterminer la longueur d'une chaîne, apparemment? 912 00:56:36,150 --> 00:56:40,720 Vous devez commencer au début et puis regardez, regardez, regardez, regardez, regardez 913 00:56:40,720 --> 00:56:44,930 jusqu'à ce que vous voir enfin ce caractère spécial, à ce moment, ah, maintenant je sais la longueur. 914 00:56:44,930 --> 00:56:48,040 Donc, plus tôt, quand nous avions strlen appelé encore et encore et encore, 915 00:56:48,040 --> 00:56:52,080 la raison pour laquelle je propose que c'était un peu stupide parce que encore une fois, cette chaîne ressemble à ça. 916 00:56:52,080 --> 00:56:54,880 Il ne va pas changer à chaque fois que vous parcourez une boucle, 917 00:56:54,880 --> 00:56:56,890 si vous faites un travail inutile. 918 00:56:56,890 --> 00:57:00,620 Dans le même temps vous devez savoir, en passant, que les compilateurs comme Clang ces jours-ci 919 00:57:00,620 --> 00:57:02,530 ont été développés depuis de nombreuses années, 920 00:57:02,530 --> 00:57:05,690 et writers de compilateur, programmeurs, sont assez intelligents. 921 00:57:05,690 --> 00:57:10,170 Et il s'avère que les compilateurs Clang et d'autres peuvent réellement comprendre que, 922 00:57:10,170 --> 00:57:13,650 bien, oui, vous avez écrit strlen dans votre état, 923 00:57:13,650 --> 00:57:17,520 ce qui signifie techniquement que nous appelons encore et encore et encore. 924 00:57:17,520 --> 00:57:21,880 Mais les compilateurs intelligents peuvent réellement optimiser ce genre de décisions des utilisateurs pauvres 925 00:57:21,880 --> 00:57:23,870 de votre code pour redresser les choses. 926 00:57:23,870 --> 00:57:27,360 >> Alors ne viens de réaliser que, parfois, le compilateur est plus intelligent que nous 927 00:57:27,360 --> 00:57:29,210 et type de cacher nos propres erreurs. 928 00:57:29,210 --> 00:57:31,620 Mais certainement quand il s'agit de séries de problèmes et autres, 929 00:57:31,620 --> 00:57:35,340 ne penser à ces décisions de conception fondamentalement erronée 930 00:57:35,340 --> 00:57:38,110 peut-être pour la simple raison que nous ferions beaucoup plus de travail 931 00:57:38,110 --> 00:57:41,330 que nous avons à faire. Mais combien plus de travail? 932 00:57:41,330 --> 00:57:44,960 Dans le cas des MONDE BONJOUR, nous allons commencer à généraliser l'ampleur de ce problème. 933 00:57:44,960 --> 00:57:48,100 Quelle est la longueur du problème ou de la taille du problème 934 00:57:48,100 --> 00:57:50,770 lorsque le mot l'utilisateur a tapé n'est BONJOUR? 935 00:57:50,770 --> 00:57:53,790 C'est apparemment 5, peut-être 6. Plus ou moins 1. Peu importe. 936 00:57:53,790 --> 00:57:55,680 C'est tellement proche nous allons l'appeler 5. 937 00:57:55,680 --> 00:58:00,480 >> Alors, quelle est la taille du problème ici en essayant de comprendre la longueur de BONJOUR? 938 00:58:00,480 --> 00:58:06,790 Il est 1, 2, 3, 4, 5, et peut-être 6 pour le dernier caractère, mais nous allons généraliser ce que n. 939 00:58:06,790 --> 00:58:10,300 Donc, n, juste la variable n, est ce que les informaticiens utilisent généralement 940 00:58:10,300 --> 00:58:13,890 pour décrire l'ampleur d'un problème, et le problème qui se pose est combien de temps BONJOUR? 941 00:58:13,890 --> 00:58:17,050 Combien de temps faut strlen prendre? 942 00:58:17,050 --> 00:58:21,010 Il faut de l'ordre de n étapes, où chaque étape signifie oeil à un personnage, 943 00:58:21,010 --> 00:58:23,350 regarder un personnage, regardez un personnage. 944 00:58:23,350 --> 00:58:26,850 Et nous avons eu cette discussion il ya quelque temps, le nombre d'opérations se passe quelque chose. 945 00:58:26,850 --> 00:58:29,910 Le premier jour de classe que nous avions tous maladroitement debout, 946 00:58:29,910 --> 00:58:32,060 et puis tout le monde a commencé appariement hors uns avec les autres 947 00:58:32,060 --> 00:58:35,990 afin de réellement compter idéalement combien de personnes étaient dans la salle. 948 00:58:35,990 --> 00:58:39,860 Et nous avons aussi fait une autre chose à la place où si je l'ai fait de manière old school 949 00:58:39,860 --> 00:58:44,800 de débutant 1, 2, 3, 4, 5, 6 et ainsi de suite, 950 00:58:44,800 --> 00:58:49,360 ça aussi, la taille de ce problème était de taille n. Il y avait des gens dans la salle n. 951 00:58:49,360 --> 00:58:52,010 Mais je ne pouvais accélérer les choses, non? Style de l'école primaire je pouvais commencer à compter en 2s. 952 00:58:52,010 --> 00:58:55,560 2, 4, 6, 8, 10, 12. Et cela se sent tellement plus rapide, et il est effectivement. 953 00:58:55,560 --> 00:59:01,720 Il est littéralement deux fois plus vite, mais encore une fois, si 400 autres personnes ont marché dans cette salle 954 00:59:01,720 --> 00:59:08,250 tout à la fois, ces algorithmes faudrait encore 200 400 ou peut-être pas. 955 00:59:08,250 --> 00:59:13,310 >> Mais en revanche, si nous voulons vraiment faire preuve d'intelligence et nous avons tous, au lieu de vous compter vous-mêmes, 956 00:59:13,310 --> 00:59:15,280 rappeler comment cet algorithme travaillé. 957 00:59:15,280 --> 00:59:17,110 Vous tous levés. Permettez-moi d'avancer rapidement à ce sujet. 958 00:59:17,110 --> 00:59:20,430 Vous tous debout, vous appariés, puis la moitié d'entre vous assis, 959 00:59:20,430 --> 00:59:22,510 moitié d'entre vous assis, la moitié d'entre vous assis, 960 00:59:22,510 --> 00:59:27,350 et à chaque itération de cette boucle de la semaine 0, on réduit de moitié le problème à la main 961 00:59:27,350 --> 00:59:30,040 et se rendit à n / 2, alors n / 4, puis n / 8. 962 00:59:30,040 --> 00:59:35,350 Et l'implication de cela est que si un autre 400 personnes marchent dans la pièce, pas une grosse affaire, 963 00:59:35,350 --> 00:59:40,120 il nous faudra plus d'1 tour, pas plus de 400 tours, 200 tours non plus. 964 00:59:40,120 --> 00:59:43,640 Et l'histoire nous dit tout à l'heure j'avais à faire un petit quelque chose à ce sujet. 965 00:59:43,640 --> 00:59:47,750 Cette ligne rouge est ici linéaire, c'est tout droit, et il est étiqueté comme n 966 00:59:47,750 --> 00:59:50,250 parce que la taille d'un problème se développe, 967 00:59:50,250 --> 00:59:54,690 si votre algorithme ou un programme avec lequel vous résolvez elle prend des mesures n, 968 00:59:54,690 --> 00:59:58,620 nous pouvons tracer une ligne droite où il prend plus de temps plus la taille du problème. 969 00:59:58,620 --> 01:00:03,280 Et l'approche twosies, comptage 2, 4, 6, 8, toujours en ligne droite, juste un peu mieux. 970 01:00:03,280 --> 01:00:08,440 Il faut du temps un peu moins, de sorte que la ligne jaune est en dessous du point de la ligne rouge pour le point. 971 01:00:08,440 --> 01:00:12,580 >> Mais mieux encore était-ce Saint-Graal de ce que nous appelions de temps logarithmique 972 01:00:12,580 --> 01:00:14,830 où même si encore une fois on double le nombre de personnes dans la salle, 973 01:00:14,830 --> 01:00:18,240 on double la taille de ce répertoire à partir du premier jour de classe, 974 01:00:18,240 --> 01:00:22,310 pas grave, il faut 1 larme page de plus, prend 1 séance plus bas 975 01:00:22,310 --> 01:00:25,550 afin de résoudre un problème qui est deux fois plus grand. 976 01:00:25,550 --> 01:00:27,460 Et si la conversation que nous avons maintenant la chance de commencer à avoir est 977 01:00:27,460 --> 01:00:30,380 comment pouvons-nous réellement résoudre les problèmes efficacement 978 01:00:30,380 --> 01:00:32,510 si l'on considère le plus simple des problèmes de ce genre? 979 01:00:32,510 --> 01:00:36,210 Supposons que nous ayons 8 portes derrière lesquelles il ya des chiffres, 980 01:00:36,210 --> 01:00:39,720 et chacun de ces nombres ne sont pas triées en aucune façon, 981 01:00:39,720 --> 01:00:42,830 ils sont des entiers aléatoires juste derrière ces portes, 982 01:00:42,830 --> 01:00:47,290 et nous poser la question comment allez-vous trouver le nombre - qui sait - 983 01:00:47,290 --> 01:00:50,250 7 derrière ces portes? 984 01:00:50,250 --> 01:00:53,400 Que feriez-vous, un être humain, faire pour me trouver le numéro 7 985 01:00:53,400 --> 01:00:56,810 si encore une fois chacun d'entre eux sont des portes et de voir une valeur que vous devez ouvrir une porte? 986 01:00:56,810 --> 01:00:59,650 Qu'est-ce que votre algorithme est peut-être? 987 01:00:59,650 --> 01:01:05,310 >> [Réponse de l'élève inaudible] >> Donc, commencer par la gauche et ouvrez la porte, ouvrir une porte, ouvrir une porte. 988 01:01:05,310 --> 01:01:08,570 Et dans le pire des cas, combien de temps cela va nous prendre pour trouver le numéro 7? 989 01:01:08,570 --> 01:01:12,800 Et encore, ils ne sont pas triés, donc ce n'est pas aussi facile que, eh bien, je vais ouvrir la porte 7. 990 01:01:12,800 --> 01:01:15,240 Il pourrait nous prendre, au maximum, 8 étapes. 991 01:01:15,240 --> 01:01:19,940 Dans le pire des cas, 7 est aléatoire à la fin de la ligne de portes, 992 01:01:19,940 --> 01:01:22,090 de sorte que nous pourrions avoir à essayer toutes les portes n. 993 01:01:22,090 --> 01:01:24,440 Encore une fois ici, nous semblons avoir un algorithme linéaire. 994 01:01:24,440 --> 01:01:27,030 En fait, nous avons fait ce juste une couple d'années. 995 01:01:27,030 --> 01:01:29,910 Un de vos prédécesseurs a été contestée avec précision ce 996 01:01:29,910 --> 01:01:32,050 où nous n'avons pas eu une version numérique, nous avons plutôt eu un tableau noir 997 01:01:32,050 --> 01:01:33,780 avec quelques morceaux de papier sur elle. 998 01:01:33,780 --> 01:01:36,940 Et ce que j'ai pensé que je pourrais faire est de prendre un bref retour sur la façon dont cela a duré, 999 01:01:36,940 --> 01:01:40,760 l'une des meilleures opportunités et peut-être les plus difficiles sur scène 1000 01:01:40,760 --> 01:01:42,530 Pour une démonstration, ici, sur Sanders. 1001 01:01:42,530 --> 01:01:44,000 Nous avions 2 rangées de chiffres. 1002 01:01:44,000 --> 01:01:47,280 Nous allons seulement regarder ce qui se passe ici avec Sean pour le très haut de ces lignes. 1003 01:01:47,280 --> 01:01:49,660 À moins que ne plus jamais bénévoles CS50, 1004 01:01:49,660 --> 01:01:52,010 nous avons eu la bénédiction de Sean garder ce à la caméra, 1005 01:01:52,010 --> 01:01:54,670 donc il sait que des centaines de personnes ont suivi ce depuis des années. 1006 01:01:54,670 --> 01:01:59,500 Mais Sean a fait un travail incroyable - ou qu'il a fait - au fait de nous trouver un nombre particulier. 1007 01:01:59,500 --> 01:02:04,570 >> Donc, nous allons voir comment il a résolu cet algorithme afin que nous reprendrons cette conversation avant longtemps 1008 01:02:04,570 --> 01:02:08,300 de la façon dont nous voyons les choses de manière efficace. 1009 01:02:08,300 --> 01:02:12,300 [Malan sur la vidéo] J'ai caché derrière ces portes, au nombre 7, 1010 01:02:12,300 --> 01:02:16,710 mais niché dans certaines de ces portes et d'autres nombres non négatifs, 1011 01:02:16,710 --> 01:02:19,980 et votre but est de penser à cette rangée supérieure de chiffres que juste un tableau 1012 01:02:19,980 --> 01:02:22,920 ou tout simplement une suite de feuilles de papier avec des chiffres derrière eux, 1013 01:02:22,920 --> 01:02:26,960 et votre but est, en utilisant uniquement la baie supérieure ici, trouvez-moi le numéro 7. 1014 01:02:26,960 --> 01:02:30,800 Et nous allons donc critique comment vous allez le faire. Tous droits >>. 1015 01:02:30,800 --> 01:02:33,880 [Malan] Trouvez-nous au nombre 7, s'il vous plaît. 1016 01:02:36,210 --> 01:02:38,350 [Rires] 1017 01:02:41,610 --> 01:02:44,460 [Malan] Non [rires] 1018 01:02:45,760 --> 01:02:58,080 5, 19, 13, [rires]. Ce n'est pas une question piège. 1019 01:03:00,560 --> 01:03:02,390 1. 1020 01:03:04,560 --> 01:03:06,910 [Rires] 1021 01:03:06,910 --> 01:03:10,760 A ce stade, votre score n'est pas très bon, alors vous pourriez aussi bien continuer. [Rires] 1022 01:03:12,490 --> 01:03:14,070 3. 1023 01:03:17,340 --> 01:03:23,480 Allez-y. Franchement, je ne peux pas m'empêcher de me demander ce que vous même y penser. [Rires] 1024 01:03:25,010 --> 01:03:28,870 Seule la rangée du haut, de sorte que vous avez à gauche 3. Donc, trouver moi 7. 1025 01:03:28,870 --> 01:03:45,360 [Étudiants en murmurant] 1026 01:03:46,270 --> 01:03:49,870 [Malan] 17. 1027 01:03:49,870 --> 01:03:55,460 [Étudiants en murmurant] 1028 01:03:56,920 --> 01:04:01,550 [Malan] 7! [Applaudissements] 1029 01:04:01,550 --> 01:04:06,080 >> Donc, le mercredi, nous plonger dans ce et des algorithmes plus sophistiqués pour trouver des choses. 1030 01:04:06,080 --> 01:04:10,200 Pour l'instant, nous allons vous laisser avec Sean et vous voyez le mercredi. 1031 01:04:11,280 --> 01:04:13,000 [CS50.TV]