[Powered by Google Translate] [Procédure pas à pas - 2 Set problème] [Zamyla Chan - Université de Harvard] [C'est CS50. CS50.TV] Très bien. Bonjour à tous et bienvenue dans Procédure pas à pas 2. Tout d'abord, je tiens à vous féliciter pour la finition pset 1. Je sais que ça aurait pu être un peu difficile pour certains d'entre vous, aurait pu être votre premier programme informatique que vous avez écrit, mais n'oubliez pas que, à la fin de cela, lorsque vous regardez en arrière à la fin du semestre, vous aurez l'air moins pset 1 et vous allez dire, "Hé, je pu faire ça en 5 minutes." Donc, connaître et faire confiance qu'à la fin de cela, vous trouverez certainement pset 1 assez simple. Mais pour l'instant c'est un accomplissement énorme, et félicitations pour se faire. Maintenant, aussi un petit mot avant d'entrer dans le vif du walkthrough. Je veux juste faire une petite note que j'ai parfois ne pas avoir assez de temps pendant les procédures pas à pas à passer par tous les moyens de faire seul le problème posé et non seulement peut-être se concentrer sur 1 ou 2 types de mises en œuvre, moyens que vous pourriez le faire. Mais cela ne veut pas dire que vous êtes interdit de faire les choses autrement. Il ya souvent, comme l'informatique, de nombreuses façons de faire les choses, et donc certainement n'hésitez pas à utiliser un autre type de solution que j'ai peut-être présenté. [Pset 2: Crypto - Zamyla Chan - zamyla@cs50.net] [Pset2 - 0. Une section de Questions - 1. César - 2. Vigenere] Très bien. Donc problème posé 2: Crypto est un plaisir. Encore une fois, avec chaque pset vous commencerez avec une section de questions qui va être menée dans vos sections avec vos collègues enseignant affecté. Nous n'allons pas passer par ces au cours de la procédure pas à pas, mais ils ont certainement vous aidera à remplir le pset. Ainsi, la première partie de l'ensemble de problèmes qui est à César. Et ainsi de César quelqu'un va vous passer une clé avec un entier, et vous permet de chiffrer une chaîne de texte qu'ils vous fournissent et leur redonner une chose crypté. Si quelqu'un regardait Un conte de Noël, il ya un exemple de ce que là-bas. Puis la seconde partie de l'ensemble problème est Vigenère, qui est une technique de cryptage plus avancé. Et donc nous allons chiffrer un morceau de texte, sauf qu'au lieu avec juste un seul entier, nous allons en fait l'encoder avec un mot-clé que l'utilisateur va nous fournir. Ok, donc le premier outil dans la boîte à outils d'aujourd'hui qui se passe réellement à la mise à jour de l'appareil. Sur le forum de discussion, nous verrions des choses comme, «Pourquoi ça ne marche pas?" "Pourquoi ne Soumettre travail 50?" et souvent la solution est en fait de mettre à jour votre appareil. Et si vous venez de courir dans une fenêtre de terminal dans votre appareil sudo yum-y - c'est un drapeau dit oui, mettre à jour tout - mise à jour, alors votre appareil sera mise à jour si besoin est. Et il ne fait pas de mal si vous êtes déjà à la version la plus récente de l'appareil. Puis il va juste dire aucune mise à jour disponible et vous pouvez continuer à travailler le long. Mais ce qui est bon pour exécuter, même à chaque fois que vous ouvrez l'appareil puisque nous sommes encore - parfois, si nous entrons dans un bug - le fixer dans l'appareil. Donc, assurez-vous que vous disposez de la version la plus récente de l'appareil et exécuter cette mise à jour là-bas. Très bien. Donc, puisque nous avons affaire avec des lettres et changeant, chiffrement des choses, nous allons vraiment envie de devenir le meilleur ami de notre tableau ASCII. Il y en a de nombreux en ligne, si vous trouvez. Peut-être même faire vos propres. Fondamentalement, avec chaque lettre et chaque chiffre et chaque personnage il existe un nombre qui leur sont associés, et il est donc bon de voir leurs valeurs ASCII à côté de la lettre même. Cela va certainement vous aider dans le jeu de problème. Une chose qui m'a vraiment aidé dans ce problème posé était de fait l'imprimer, et comme je vivais, je voudrais vraiment attirer sur elle, écrire: «Si cela doit aller là-bas, alors ..." Type de tirer sur lui et il marquer, deviennent les meilleurs amis avec votre table ASCII. Ensuite, nous avons quelques outils à notre disposition. Cette fois, au lieu de réellement demander à l'utilisateur la totalité de leur entrée nous allons faire une combinaison. Nous allons les inviter pour une entrée, mais nous allons aussi tout simplement utiliser les arguments de ligne de commande. Alors, quand ils dirigent leur programme, généralement vous dites. / Bonjour, par exemple, si votre programme a été hello.c. Mais cette fois, au lieu de dire ça, ils peuvent mettre des mots, des arguments plus tard. Et donc nous allons utiliser tout ce qu'ils passent pour nous en tant que leur contribution ainsi, donc aller au-delà simplement demander d'entier, mais aussi en utilisant des arguments de ligne de commande. Et puis nous irons dans les tableaux et les chaînes de caractères, que nous allons utiliser beaucoup aussi. Voici juste un exemple de 1 table ASCII mini. Comme je l'ai dit, chaque lettre correspond à un chiffre, et ainsi vous familiariser avec ça. Il vous sera utile. Et plus tard, lorsque nous avons commencer à faire quelques ASCIIMath traiter avec les chiffres - ajoutant, soustrayant les - alors certainement bon de se référer à ce tableau. Alors, voici un exemple de chiffrement de César - quelque chose que vous avez joué avec. C'est juste une roue. Essentiellement, il ya un alphabet externe et puis il ya un alphabet intérieure. Donc, voici un bon exemple de l'algorithme de chiffrement de César mais avec une touche de 0. Pour l'essentiel, A est aligné avec A, B est alignée avec B, sur toute la hauteur à Z. Mais alors que nous voulions une clé de 3, par exemple. Puis nous faire tourner la roue intérieure de sorte que A s'aligne maintenant avec D, etc Et donc c'est essentiellement ce que nous allons faire. Nous n'avons pas une roue, mais ce que nous allons faire est de faire de notre programme type de décaler l'alphabet avec nous un certain nombre de numéros. Donc, comme je l'ai déjà dit, nous allons avoir affaire avec des arguments de ligne de commande ainsi que d'obtenir un nombre entier. Donc, la façon dont un utilisateur d'exécuter votre programme César, c'est de dire. / Caesar puis en entrant un numéro de suite. Et ce nombre représente la clé, le changement, nombre de fois que vous allez être en rotation la roue intérieure de votre chiffre de César. Et si vous voyez ici un exemple. Si nous sommes entrés dans les lettres de A à L dans notre chiffrement de César, alors il serait entrée D à O, parce que c'est chaque lettre déplacé plus de 3 fois, tout comme l'exemple de la roue que je vous ai montré. Alors si vous avez entré, par exemple, ce n'est CS50! alors il serait également déplacer toutes les lettres. Et c'est une chose importante dans César et Vigenère c'est que nous allons ignorer toutes les lettres non. Donc, tous les espaces, de caractères, etc, numéros, nous allons garder le même. Nous allons seulement de déplacer les lettres dans ce cas. Donc, comme vous le voyez dans la roue, nous avons seulement les lettres qui s'offrent à nous, si nous ne voulons décaler les lettres et chiffrer les lettres. Donc la première chose à faire, vous avez vu que l'utilisation de César dans le problème set 2 est d'exécuter César et ensuite entrer un numéro lorsque vous l'exécutez dans le terminal. Donc, ce que nous devons faire est d'obtenir en quelque sorte la clé et y accéder. Et si nous voulons en quelque sorte voir que ça va être l'argument de commande deuxième ligne. Le premier va être. / César, et la prochaine sera le numéro de clé. Donc, avant que nous ayons int main (void) pour lancer nos programmes C. Nous allons décoller une couche un peu et de voir qu'au lieu de passer dans le vide à notre fonction principale nous sommes vraiment affaire avec 2 paramètres. Nous avons un int argc, puis nommé un tableau de chaînes appelé argv. Donc argc est un entier, et il représente le nombre d'arguments passés à votre programme. Et puis, argv est en fait la liste des arguments passés. Tous les arguments sont des chaînes, et ainsi de argv représente un tableau, une liste de chaînes. Parlons un peu des tableaux un peu. Les tableaux sont essentiellement une nouvelle structure de données. Nous avons ints, nous avons doublé, nous avons cordes, et maintenant nous avons des tableaux. Les tableaux sont des structures de données qui peuvent contenir plusieurs valeurs du même type, Donc, essentiellement, une liste de n'importe quel type que vous voulez. Essentiellement, si vous voulez une liste d'entiers tout en 1 variable, alors vous devez créer une nouvelle variable qui était de tableau de type int. Ainsi, les tableaux sont à l'index zéro, ce qui signifie que le premier élément du tableau est à l'index 0. Si le tableau est de longueur 4, comme dans cet exemple, votre dernier élément serait à l'index 3, qui est de 4 à 1. Donc, pour créer une matrice, vous feriez quelque chose comme ça. Que vous vouliez un tableau à double. Cela vaut pour tout type de type de données, cependant. Donc, disons que vous voulez un tableau à double. Disons que vous voulez l'appeler la boîte aux lettres. Comme vous le feriez initialiser toute autre double, vous diriez double et puis le nom, mais cette fois nous avons mis entre crochets, puis le nombre, il y aura la longueur de la matrice. Notez que dans les tableaux nous ne pourrons jamais changer la longueur, ainsi vous avez toujours de définir et de choisir le nombre de boîtes, le nombre de valeurs de votre réseau va tenir. Donc, pour définir des valeurs différentes dans votre tableau, vous allez utiliser cette syntaxe suivante, comme vous le voyez sur la diapositive. Vous avez 0 Indice boîte aux lettres sera fixé à 1,2, indice de boîte aux lettres 1 set à 2,4, etc Alors, maintenant que nous avons passé en revue les tableaux un peu, revenons à la argc et argv. Nous savons que argv est maintenant un tableau de chaînes. Alors, quand un utilisateur passe - dire qu'ils exécutent un programme - disent-ils. / bonjour David Malan, ce que le programme peut faire pour vous est déjà effectivement arriver à ce argc et argv sont. Donc, vous n'avez pas besoin de s'inquiéter à ce sujet. Argc, dans ce cas serait de 3 parce qu'il voit 3 mots distincts séparés par des espaces. Et alors le tableau dans le cas présent, le premier indice serait. / Bonjour, le prochain David, le prochain Malan. Quelqu'un voit tout de suite quelle est la relation entre argv,  le tableau, et argc est? Ouais. Nous allons entrer dans ce dans un exemple args.c. Voyons si l'on peut profiter de la relation entre le 2. Ici, vous trouverez peut-être que dans l'appareil de l'application par défaut d'ouvrir les fichiers. c est parfois Emacs. Mais nous voulons traiter avec gedit, de sorte que vous pouvez faire est que vous pouvez faire un clic droit sur votre fichier C, allez dans Propriétés, Ouvrir avec, puis choisissez gedit, Définir par défaut, et maintenant votre programme devrait s'ouvrir dans gedit au lieu d'Emacs. Parfait. Donc ici, j'ai un programme que je veux imprimer chaque argument de ligne de commande. Donc, quoi que l'utilisateur saisit, je veux essentiellement le retourner de nouveau à eux sur une nouvelle ligne. Alors, quelle est la structure que nous pouvons utiliser pour itérer sur quelque chose - quelque chose que vous avez probablement utilisé dans votre 1 pset? Si vous souhaitez passer par un nombre défini de choses? >> [L'élève] boucle For. Pour la boucle. Exactement. Donc, nous allons commencer avec la boucle for. Nous avons pour int i = 0. Disons simplement commencer par une variable d'initialisation standard. Je vais quitter la condition d'un ensemble et dire ensuite: i + +, va faire des choses là-bas. Très bien. Donc, en repensant à argv, si argv est la liste des arguments passés dans le programme et argc est le nombre d'arguments dans le programme, cela signifie que argc est essentiellement la longueur de argv, droit, parce qu'il va y avoir autant d'arguments que la valeur de argc. Donc, si nous voulons effectuer une itération sur chaque élément de argv, nous allons vouloir à chaque fois accéder à la variable dans argv à l'index donné. Qui peut être représenté avec ça, non? Cette variable représente ici la chaîne que dans ce cas parce que c'est un tableau de chaînes - la chaîne particulière à cet index donné. Qu'est-ce qu'on veut faire, dans ce cas, nous voulons l'imprimer, alors disons que printf. Et maintenant, argv est une chaîne, alors nous voulons mettre cet espace réservé là-bas. Nous voulons une nouvelle ligne juste pour faire bien paraître. Nous avons donc ici une boucle pour. Nous n'avons pas encore la condition. Donc, je commence à 0, puis à chaque fois qu'il va imprimer la chaîne donnée à cet index particulier dans la matrice. Alors quand est-ce que nous voulons arrêter l'impression sur les éléments du tableau? Quand nous avons fini, non? Lorsque nous avons atteint la fin du tableau. Donc, nous ne voulons pas dépasser delà de la longueur du tableau, et nous savons déjà nous n'avons pas besoin de réellement savoir ce qui active la longueur de argv est car il nous est donné, et ce que c'est que ça? Argc. Exactement. Donc, nous voulons faire ce nombre argc processus de fois. Je ne suis pas dans le bon répertoire. Très bien. Maintenant, nous allons faire args. Pas d'erreur, ce qui est optimal. Alors disons simplement exécuter args. Quel est ce va revenir pour nous? Il va tout simplement de l'imprimer en arrière. "Vous args entré dans le programme, je vais le remettre à vous." Alors disons que nous voulons dire args alors foo bar. Alors il l'imprime de nouveau à nous. Tout va bien? Il ya donc un exemple de la façon dont vous pouvez utiliser argc et argv sachant que argc représente la longueur de argv. Assurez-vous que vous n'avez pas toujours accès aux tableaux un au-delà de la longueur du tableau parce que C va certainement crier à vous. Vous obtiendrez quelque chose appelée faute de segmentation, qui n'est jamais amusant, revient à dire que vous essayez d'accéder à quelque chose qui n'existe pas, ne vous appartient pas. Donc, assurez-, et surtout avec le zéro indexation, nous ne voulons pas - Comme par exemple, si nous avons un tableau de longueur 4, que l'index 4 tableau n'existe pas parce que nous commençons à 0, à zéro index. Il deviendra une seconde nature, tout comme pour les boucles quand on commence à 0. Il suffit donc de garder cela à l'esprit. Vous ne voulez pas toujours accéder à l'index d'un tableau qui est hors de votre portée. Ainsi, nous pouvons maintenant voir comment nous pouvons type d'accès les arguments de ligne de commande qui sont passés po Mais comme vous avez vu la chaîne, le argv est en fait un tableau de chaînes. Donc, ce n'est pas vraiment un entier encore, mais dans César nous voulons traiter avec des nombres entiers. Heureusement, il existe une fonction créée pour nous qui peut réellement convertir une chaîne en un entier. Aussi ici nous ne traitons pas avec l'entrée d'utilisateur où nous les incitant pour l'entrée ici pour la clé, donc nous ne pouvons pas réellement Nouvelle invite en disant: "Oh, donnez-moi un autre nombre entier, par exemple, si elle n'est pas valide." Mais nous avons encore besoin de vérifier pour une utilisation correcte. Dans César, ils ne sont autorisés à passer en numéro 1, et donc ils ont à exécuter. / César et alors ils doivent vous donner un numéro. Donc argc doit y avoir un certain nombre. Quel numéro ce que ce serait si elles doivent passer de vous. / César puis sur une touche? Qu'est-ce que argc? >> [L'élève] 2. Deux >>. Exactement. Donc, vous voulez vous assurer que argc est 2. Sinon, vous avez essentiellement refuser d'exécuter le programme. Dans main, c'est une fonction qui dit int main, oui, alors nous avons toujours à 0 la pratique bon retour à la fin d'un programme réussi. Donc, si, par exemple, ils vous donnent 3 arguments de ligne de commande au lieu de 2 ou vous donner 1, par exemple, alors qu'est-ce que vous allez faire, c'est que vous aurez envie de vérifier que puis retourner 1 dire, non, je ne peux pas procéder à ce programme. [L'élève] Il ne peut pas être un espace dans votre texte. >> Pardon? [L'élève] Il ne peut pas être un espace dans le texte que vous essayez de crypter. Ah! Pour ce qui est du texte que nous essayons de chiffrer, qui provient en fait plus tard lorsque nous donnons ce texte. Donc maintenant nous sommes juste accepter comme arguments de la commande le nombre, l'évolution réelle pour le cryptage de César. [L'élève] Pourquoi avez-vous besoin de 2 au lieu de seulement 1 argc? Il ya certainement numéro 1. Droite. La raison pour laquelle nous avons besoin de 2 pour argc au lieu de 1 C'est parce que quand vous exécutez un programme et dire. / césar ou. / bonjour, qui compte réellement comme un argument de ligne de commande. Alors qui prend déjà en hausse de 1 et ainsi de suite, puis nous saisir 1 extra. Alors vous êtes saisie en fait une chaîne dans l'argument de ligne de commande. Qu'est-ce que vous voulez faire, car César nous voulons faire face à un nombre entier, de sorte que vous pouvez utiliser cette fonction atoi. Et dans le fond, vous lui passez dans une chaîne, puis il vous retourner un entier si c'est possible de faire cette chaîne en un entier. Maintenant, souvenez quand nous avons affaire à des choses printf ou GetString, comme ça, nous incluons les bibliothèques qui sont spécifiques à nous. Donc, au début, nous commençons par une norme hash tag I / O,. H, quelque chose comme ça. Eh bien, atoi n'est pas dans l'une de ces bibliothèques, donc ce que nous avons à faire, c'est qu'il faut inclure la bibliothèque juste pour cela. Donc, retour à rappeler Procédure pas à pas 1 où j'ai discuté de la fonction manuelle. Vous tapez l'homme dans votre terminal, puis suivie par le nom d'une fonction. Et pour que fera apparaître une liste complète de son utilisation, mais ainsi il mettra en place qui appartient à la bibliothèque qui. Donc, je vais laisser ça à vous d'utiliser la fonction manuelle avec atoi et de déterminer dans quelle bibliothèque vous devez inclure pour être en mesure d'utiliser la fonction atoi. Donc, nous avons la clé et maintenant il s'agit d'obtenir le texte en clair, et que va réellement être saisie de l'utilisateur dans lequel vous inviter. Nous avons abordé getInt et GetFloat, et ainsi dans la même veine nous allons avoir affaire à GetString. Mais dans ce cas, nous n'avons pas besoin de faire tout do while ou while pour vérifier. GetString va certainement nous donner une chaîne, et nous allons chiffrer ce que l'utilisateur nous donne. Ainsi, vous pouvez supposer que l'ensemble de ces chaînes utilisateur saisies sont correctes. Grande. Alors une fois que vous avez la clé et une fois que vous avez le texte, maintenant ce qui reste est que vous devez chiffrer le texte en clair. Juste pour couvrir rapidement sur jargon, en clair est ce que l'utilisateur accorde à vous, et le cryptogramme est ce que vous revenez à eux. Donc, cordes, pour être en mesure de passer par réellement lettre par lettre parce que nous avons à passer chaque lettre, nous comprenons que les chaînes, si l'on sorte de décoller la couche, on voit qu'ils sont vraiment une liste de caractères. On arrive après les autres. Et afin que nous puissions traiter cordes comme des tableaux, parce qu'ils sont des tableaux de caractères. Donc, disons que vous avez une chaîne nommée texte, et, dans ce texte variable est stockée C'est CS50. Puis texte à l'index 0 serait un T majuscule, indice 1 serait h, etc Et puis, avec des tableaux, dans l'exemple argc dans args.c, nous avons vu que nous avons dû parcourir un tableau et nous avons donc dû parcourir à partir de i = 0 jusqu'à i est inférieure à la longueur. Nous avons donc besoin d'un moyen de comprendre ce que la longueur de notre chaîne est si nous allons itérer sur celui-ci. Heureusement, encore une fois, il ya une fonction là pour nous, bien que plus tard dans la CS50 vous aurez certainement être en mesure de mettre en œuvre et faire votre propre fonction qui peut calculer la longueur d'une chaîne. Mais pour l'instant, nous allons utiliser la longueur de chaîne, de sorte strlen. Vous passez une chaîne, puis il reviendra vous un int qui représente la longueur de votre chaîne. Regardons un exemple de la façon dont nous pourrions être en mesure d'effectuer une itération sur chaque caractère dans une chaîne et faire quelque chose avec ça. Ce qu'on veut faire, c'est une itération sur chaque caractère de la chaîne, et ce que nous voulons faire, c'est de nous imprimer retour chaque caractère 1 par 1 sauf que nous ajouter quelque chose à côté de lui. Donc, nous allons commencer avec la boucle for. Int i = 0. Nous allons laisser de l'espace pour la condition. Nous voulons itérer jusqu'à ce que nous arrivons à la fin de la chaîne, non? Alors quelle fonction nous donne la longueur de la chaîne? [Réponse de l'élève inaudible] C'est la longueur des arguments de ligne de commande. Mais pour une chaîne que nous voulons utiliser une fonction qui nous donne la longueur de la chaîne. Donc, c'est la longueur de chaîne. Et oui, alors vous devez passer une chaîne devant elle. Il a besoin de savoir quelle est la chaîne dont il a besoin pour calculer la longueur d'. Alors dans ce cas, nous avons affaire avec la chaîne s. Grande. Alors ce que nous voulons faire, nous allons printf. Maintenant, nous voulons traiter avec des personnages. Nous voulons imprimer chaque caractère individuel. Lorsque vous voulez imprimer un flotteur, vous devez utiliser l'espace réservé comme f%. Avec un int vous pouvez utiliser% d. Et ainsi de même, avec un personnage que vous utilisez c% à dire que je vais être l'impression d'un caractère qui est stocké dans une variable. Nous avons donc cela, et nous allons ajouter un point et un espace à elle. Quel personnage utilisons-nous? Nous allons utiliser ce que nous sommes au caractère de la chaîne. Alors nous allons utiliser quelque chose avec de la ficelle, mais nous voulons être accéder au caractère certain là-bas. Donc, si une chaîne est juste un tableau, alors comment pouvons-nous accéder à des éléments de tableaux? Nous avons ces crochets, et puis nous avons mis l'index à l'intérieur. Nous avons donc entre crochets. Notre indice dans ce cas, nous pouvons simplement utiliser i. Exactement. Donc, ici, nous disons que nous allons impression d'un caractère suivi d'un point et un espace, et ce caractère va être la lettre i dans notre chaîne s. Je vais sauver ce. D'accord. Maintenant, je vais courir longueur de la chaîne. Nous avons donc eu une chaîne appelée OMG, et maintenant il est souligné encore plus. De la même façon, disons que nous voulons réellement obtenir une chaîne à l'utilisateur. Comment pourrions-nous faire cela? Avant, comment sommes-nous arrivés un int? Nous avons dit getInt, non? Mais ce n'est pas int, nous allons donc GetString. Faisons en sorte que la longueur de chaîne. Ici, nous n'avons pas entrer dans une invite spécifique. Donc je ne sais pas. Je vais mettre mon nom ici, et si je peux faire une de ces choses où je affecter un mot pour chaque lettre ou quelque chose comme cela. Cool. Donc, c'est la longueur de chaîne. Nous sommes donc à César. Nous avons quelques outils sur la façon dont nous itérer sur une chaîne, comment nous accéder à chaque élément individuel. Alors maintenant, nous pouvons revenir au programme. Comme je l'ai mentionné précédemment, dans la table ASCII, votre meilleur ami, vous allez voir les numéros qui sont associés à chaque lettre. Voici donc dire que notre texte en clair, c'est que je suis étourdi! Ensuite, chacun de ces personnages va avoir un certain nombre et la valeur ASCII associé, même l'apostrophe, même l'espace, même le point d'exclamation, de sorte que vous aurez envie de garder cela à l'esprit. Alors que notre touche que l'utilisateur inclus dans leur argument de ligne de commande est de 6. Des moyens pour que la première lettre, qui est I, qui est représenté par 73, Pour revenir à ce que leur lettre est représentée par la valeur ASCII de 73 + 6. Dans ce cas, ce serait 79. Maintenant, nous voulons aller au caractère suivant. Donc, la prochaine index 1 du texte en clair serait l'apostrophe. Mais rappelez-vous, nous voulons seulement pour chiffrer les lettres. Donc, nous voulons faire en sorte que l'apostrophe reste en fait le même, que nous ne changeons pas de 39 à quelque 45 est. Nous voulons le garder comme une apostrophe. Donc, nous voulons nous souvenir de ne chiffrer les lettres parce que nous voulons que tous les autres symboles rester inchangé dans notre programme. Une autre chose que nous voulons est de préserver la capitalisation. Alors, quand vous avez une lettre majuscule, il devrait rester comme une majuscule. Lowercases devrait rester comme des minuscules. Ainsi, certaines fonctions utiles pour être en mesure de faire face à lettres seulement chiffrement préserver et maintenir la capitalisation des choses sont les fonctions IsLower IsAlpha, isupper,. Et si ce sont des fonctions qui retournent une valeur booléenne vous. Fondamentalement, vraie ou fausse. Est-ce une majuscule? Est-ce alphanumérique? Est-ce une lettre, essentiellement. Donc, voici 3 exemples de la façon dont vous utilisez cette fonction. Fondamentalement, vous pouvez tester si la valeur retournée par cette fonction est vraie ou fausse sur la base de cette entrée. Soit faire quelque chose de pas chiffrer ou crypter ou assurez-vous que c'est en majuscules, etc [L'élève] Pouvez-vous expliquer un peu plus ceux et comment les utiliser? >> Oui, bien sûr. Donc, si nous regardons en arrière, nous avons ici un I majuscule, non? Nous savons donc que je passe à O parce que je + 6 est O. Mais nous voulons nous assurer que ce O va être une capitale O. Donc, en gros, qui est une sorte de va changer notre entrée. Donc, que ce soit en majuscules ou ne pas vouloir sorte de changer la façon dont nous traitons avec elle. Alors, si nous utilisons la fonction isupper sur cet indice particulier, si isupper ("I"), qui renvoie vrai pour nous, afin que nous sachions que c'est supérieur. Alors sur cette base, plus tard, nous irons dans une formule que vous allez utiliser pour changer les choses de César, oui, alors, fondamentalement, il va y avoir une formule légèrement différente si elle est en majuscules par opposition aux minuscules. Donner un sens? Ouais. Pas de soucis. J'ai parlé un peu sur l'ajout de 6 à une lettre, qui n'est pas tout à fait logique sauf quand on sorte de comprendre que ces caractères sont un peu interchangeables avec des nombres entiers. Ce que nous faisons, c'est que nous sorte de casting utilisation implicite. Nous allons passer à jeter un peu plus tard où vous prenez une valeur et que vous mettez dans un autre type qu'à l'origine. Mais avec cette pset nous serons en mesure d'utiliser de manière interchangeable type de caractères et correspondant à leurs valeurs entières. Donc, si vous avez simplement envelopper un personnage avec seulement les apostrophes, alors vous serez en mesure de travailler avec elle pour les entiers, le traitant comme un entier. Ainsi, le C majuscule se rapporte à 67. F minuscule porte à 102. Encore une fois, si vous voulez connaître ces valeurs, regardez à votre table ASCII. Alors allons-y dans des exemples de la façon dont vous pourriez être en mesure de soustraire et d'ajouter, comment vous pouvez en fait vraiment travailler avec ces personnages, de les utiliser de manière interchangeable. Je dis que ASCIIMath va calculer l'ajout d'un personnage à un nombre entier puis affiche le caractère obtenu ainsi que la valeur résultante ASCII. Et alors voici ce que je dis - we'll accord avec cette partie plus tard - mais au fond, je veux dire que l'utilisateur doit dire ASCIIMath courir avec une clé, et je dis que cette clé va être le nombre avec laquelle nous allons ajouter ce personnage. Voici donc remarqué que depuis que je suis exigeant une clé, puisque je suis exigeant qu'ils me donnent 1 chose, Je tiens seulement à accepter. / Asciimath et une clé. Donc, je vais demander que argc est égal à 2. Si ce n'est pas le cas, alors je vais retourner 1 et le programme se terminera. Alors, je dis la clé ne va pas être l'argument première commande en ligne, ça va être la deuxième, et comme vous le voyez ici, Je vais le transformer en un entier. Alors je vais mettre un caractère à r. Notez que le type de la variable chr est en fait un entier. La façon dont je suis capable d'utiliser r comme un entier est en l'enveloppant avec ces apostrophes. Mais revenons à notre instruction printf où nous avons un espace réservé pour un caractère puis un espace réservé pour un nombre entier, le caractère est représenté par la CHR, et le nombre entier est la clé. Et alors nous allons en conséquence ajouter les 2 ensemble. Donc, nous allons ajouter r + quelle que soit la clé est puis nous allons imprimer le résultat de cela. Faisons donc asciimath. C'est à ce jour, nous allons donc il suffit d'exécuter asciimath. Oh, mais le voir, il ne fait rien parce que nous n'avons pas réellement lui donner une touche. Alors, quand il rentre tout juste 1, notre fonction principale, c'est juste de rentrer de nouveau à nous. Alors nous allons passer à une clé. Quelqu'un me donner un numéro. >> [L'élève] 4. 4. D'accord. Donc r a augmenté de 4 va nous donner v, ce qui correspond à la valeur ASCII de 118. Alors qu'il sorte de logique que - En fait, je peux vous demander, qu'est-ce que vous pensez que la valeur ASCII de r est si r + 4 est de 118? Alors ouais, r est de 114. Donc, si vous regardez sur la table ASCII puis, bien sûr, vous allez voir que r est représentée par 114. Alors, maintenant que nous savons que nous pouvons ajouter des entiers de caractères, cela semble assez simple. Nous allons juste pour itérer sur une chaîne comme nous l'avons vu dans l'exemple précédent. Nous allons vérifier si c'est une lettre. Si c'est le cas, nous allons le passer par tout l'essentiel est. Assez simple, sauf quand vous arrivez à aimer ça, vous voyez que z, représenté par 122, puis vous donnerait un caractère différent. En fait, nous voulons rester dans notre alphabet, non? Nous devons donc trouver un moyen de type d'emballage autour. Lorsque vous atteignez zed et que vous voulez augmenter d'un certain nombre, vous ne voulez pas aller au-delà dans la section alphabet ASCII; vous voulez habiller arrière tout le chemin vers A. Mais gardez à l'esprit que vous êtes toujours en préservant le cas. Donc, sachant que les lettres ne peuvent pas devenir des symboles tout comme les symboles ne sont pas va changer aussi. Dans le pset dernier n'a certainement pas besoin, mais une option est de mettre en œuvre votre pset gourmand en utilisant la fonction module. Mais maintenant, nous allons en fait besoin d'utiliser le module, donc on va plutôt aller sur ce morceau un peu. Essentiellement, quand vous avez x modulo y, qui vous donne le reste de x divisé par y. Voici quelques exemples ici. Nous avons 27% 15. Fondamentalement, lorsque vous soustraire 15 de 27, autant de fois que possible sans obtenir négatif alors vous obtenez 12 gauche au-dessus. Donc, c'est un peu comme dans le cadre des mathématiques, mais comment pouvons-nous réellement l'utiliser? Ça va être utile pour notre Cache-coeur. Pour ce faire, disons juste que je vous ai demandé tout à diviser en 3 groupes. Parfois, vous faites cela dans des groupes et des choses comme ça. Disons que j'ai dit, "Ok, je veux que vous tous d'être divisé en 3." Comment pourriez-vous faire cela? [Réponse de l'élève inaudible] Oui, exactement. Comptez. D'accord. Nous allons effectivement le faire. Voulez-vous commencer? [Les étudiants compter off] 1, 2, 3, 4. Mais rappelez-vous ... >> [L'élève] Oh, désolé. C'est un très bon point. Vous avez dit 4, mais en fait nous voulons vous dire 1 parce que nous ne voulons 3 groupes. Alors, comment - Non, c'est un très bon exemple, car alors comment pourriez-vous dire 1? Quel est le lien entre 4 et 1? Eh bien, 4 mod 3 est 1. Donc, si vous continuez, vous seriez 2. Nous avons donc 1, 2, 3, 1, 2. Encore une fois, vous êtes en fait la 5ème personne. Comment savez-vous à dire 2 au lieu de 5? Vous dites que 5 mod 3 est 2. Je veux voir combien de groupes de 3 sont en reste, alors que pour Moi Et alors, si nous avons continué le long de la salle entière, alors nous verrions que nous sommes toujours à appliquer effectivement la fonction mod de nous à type de décompter. C'est un plus genre d'exemple concret de la façon dont vous pouvez utiliser modulo parce que je suis sûr que la plupart d'entre nous ont probablement passé par ce processus où nous avons eu à décompter. Toute question concernant modulo? Il sera très important de comprendre les concepts de cela, donc je veux m'assurer que vous les gars à comprendre. [Étudiant] S'il n'y a pas de reste, elle vous donne le nombre réel? Si l'un des 3 premiers d'entre eux l'avait fait, il aurait pu leur donner ce qu'ils étaient réellement, ou aurait-il donné [inaudible] >> C'est une bonne question. Quand il n'y a pas de reste pour le modulo - afin que vous ayez 6 mod 3 - qui donne vraiment vous sauvegardez 0. Nous en reparlerons un peu plus tard. Oh oui, par exemple, la 3ème personne - 3 mod 3 est en fait 0, mais elle a dit 3. Donc, c'est un peu comme une prise intérieure, par exemple, comme correct, si le mod est 0, alors je vais être la 3ème personne. Mais nous y reviendrons dans une sorte de savoir comment nous pourrions faire face à ce 0 est tard. Alors maintenant, nous ont en quelque sorte une manière de cartographier la zed à la bonne lettre. Alors maintenant, nous sommes passés à travers ces exemples, nous sorte de voir comment César pourrait fonctionner. Vous voyez les 2 alphabets et puis vous voyez les déplacer. Essayons donc d'exprimer et que, en termes de formule. Cette formule est en fait donnée à vous dans la spécification, Mais soyons genre de look grâce à ce que chaque variable signifie. Notre résultat final va être le texte chiffré. Donc, ce que dit le ième caractère du texte chiffré va correspondre à la ième caractère du texte en clair. C'est logique, car nous voulons toujours faire la queue ces choses. Donc, il va y avoir le ième caractère de la k chiffré en plus, ce qui est la clé de notre - qui fait sens - et puis nous avons ce mod 26. Rappelez-vous l'époque où nous avons eu l'zed nous ne voulions pas rentrer dans le personnage, donc nous voulions le mod et le type d'enveloppe autour de l'alphabet. Après zed vous iriez à a, b, c, d, jusqu'à ce que tu dois le bon numéro. Nous savons donc que zed, si + 6, nous donnerait f car après zed vient a, b, c, d, e, f. Alors n'oublions pas que nous savons pour sûr que zed + 6 va nous donner f. En valeurs ASCII, z est de 122 et f est de 102. Nous devons donc trouver un moyen de faire de notre formule de César nous donner 102 après prise en 122. Donc, si nous appliquons cette formule, l'% ('z' + 6) 26, qui donne vraiment vous 24 parce que 122 + 6 est 128; 128% 26 donne vous 24 reste. Mais cela ne veut pas dire f. Ce n'est certainement pas 102. C'est pas non plus la 6ème lettre de l'alphabet. Alors, évidemment, nous avons besoin d'avoir un moyen de peaufiner cela un peu petite. Pour ce qui est de l'alphabet, nous savons que z est la lettre 26 et f est le 6ème. Mais nous sommes en informatique, donc nous allons à l'index à 0. Alors au lieu de z étant le nombre 26, nous allons dire que c'est le numéro 25 parce que a est 0. Alors maintenant, nous allons appliquer cette formule. Nous avons représenté par z 25 + 6, ce qui vous donne 31. Et 31 mod 26 vous donne 5 comme reste. C'est parfait parce que nous savons que f est la 5ème lettre de l'alphabet. Mais il n'est pas encore f, non? Il n'est pas encore 102. Alors pour ce pset, un défi sera d'essayer de trouver la relation entre la conversion entre ces valeurs ASCII et l'index alphabétique. Essentiellement, ce que vous voulez faire, vous voulez commencer avec des valeurs ASCII, mais alors vous voulez traduire en quelque sorte un index alphabétique puis de calculer quelle lettre il devrait être - en gros, ce que son index alphabétique est du caractère de chiffrement - puis de traduire cette information aux valeurs ASCII. Donc, si vous sortir votre table ASCII, puis essayer de trouver des relations entre, disons, 102 et 5 ou le 122 et 25. Nous avons reçu notre clé à partir des arguments de ligne de commande, nous avons reçu le texte en clair, nous l'avons chiffrée. Maintenant, tout ce qui nous reste à faire est de l'imprimer. Nous pourrions le faire de deux façons différentes. Ce que nous pourrions faire est réellement imprimer que nous avançons. Comme nous l'itération sur les caractères de la chaîne, nous pourrions tout simplement imprimer tout de suite quand on le calculer. Sinon, vous pouvez également stocker dans un tableau et avoir un tableau de caractères et à la fin itérer sur ce tableau entier et l'imprimer. Donc, vous avez deux options pour cela. Et n'oubliez pas que c% va être l'espace réservé pour l'impression d'un personnage. Donc là nous avons César, et maintenant nous passons à Vigenère, qui est très similaire à César, mais juste un peu plus complexe. Donc, essentiellement, avec Vigenère est que vous allez être en passant un mot-clé. Ainsi, au lieu d'un numéro, vous allez avoir une chaîne, et que va agir comme votre mot-clé. Puis, comme d'habitude, vous allez obtenir une invite pour une chaîne de l'utilisateur puis chiffrer et ensuite leur donner le dos chiffré. Donc, comme je le disais, c'est très semblable à César, sauf qu'au lieu de passage par un certain nombre, le nombre qui se passe réellement à changer à chaque fois d'un personnage à. Pour représenter le nombre réel de se déplacer, il est représenté par les lettres du clavier. Donc, si vous entrez dans un décalage d'un, par exemple, alors cela correspond à un décalage de 0. Donc, c'est encore une fois de retour à l'index alphabétique. Ce qui peut être utile si vous voyez ce que nous sommes vraiment affaire avec des valeurs ASCII ainsi que les lettres, ainsi que l'indice alphabétique, peut-être trouver ou créer votre propre table ASCII qui montre l'index alphabétique de 0 à 25, de a à z, et les valeurs ASCII de sorte que vous pouvez sorte de voir la relation et esquisser et essayer de trouver quelques modèles. De même, si vous déplaçant à la demande de certains sous f - et c'est soit f minuscules ou majuscules - puis qui correspondrait à 5. Sommes-nous bien jusqu'ici? La formule de Vigenère est un peu différent. Fondamentalement, vous voyez que c'est juste comme César, mais au lieu de simplement k, nous avons indice k j. Notez que nous n'avons pas l'utiliser parce que i pour l'essentiel, la longueur du mot clé n'est pas nécessairement la durée de notre texte chiffré. Ce sera un peu plus clair quand nous voyons un exemple que j'ai un peu plus tard. Fondamentalement, si vous exécutez votre programme avec un mot-clé de ohai, alors cela signifie que chaque fois, ohai va être votre quart de travail. Ainsi, en fonction de la position que vous êtes dans votre mot-clé, vous allez passer votre personnage certaine chiffré de ce montant. Encore une fois, tout comme César, nous voulons nous assurer que nous préservons la capitalisation des choses et nous chiffrer lettres seulement, pas des caractères ou des espaces. Alors regardez à César sur les fonctions que vous avez utilisés, la façon dont vous avez décidé de changer la façon dont les choses, et de l'appliquer à votre programme ici. Donc, nous allons mapper cela. Nous avons un texte clair qui nous avons obtenu de l'utilisateur à partir GetString Ce disant ... est CS50! Ensuite, nous avons un mot-clé de ohai. Les 4 premiers caractères sont assez simples. Nous savons que T va être déplacé par o, puis h va être décalée par h, i va être déplacé par un. Ici, vous voyez que représente 0, oui, alors la valeur finale est en fait juste la même lettre comme avant. Alors s est décalée par i. Mais alors vous avez ces périodes là. Nous ne voulons pas de chiffrer ce que, si nous n'avons pas le modifier en quoi que ce soit et il suffit d'imprimer sur la période inchangé. [L'élève] Je ne comprends pas comment vous savez que cela est décalé par - Où avez-vous - >> Oh, désolé. En haut vous voyez ici que l'argument de ligne de commande ohai ici, qui va être le mot clé. Et donc en gros, vous êtes à vélo sur les caractères de la clé. [L'élève] Donc o va être déplacer le même - Donc, o correspond à un certain nombre dans l'alphabet. [L'élève] Droit. Mais où avez-vous obtenu le rôle de CS50? Oh. C'est dans GetString où vous êtes comme, "Donne-moi une chaîne à encoder." [L'élève] Ils vont vous donner cet argument à passer par et puis vous demandera votre première chaîne. Ouais >>. Alors, quand ils exécuter le programme, qu'ils vont inclure le mot clé dans leurs arguments de ligne de commande quand ils l'exécuter. Puis, une fois que vous avez vérifié qu'ils ont effectivement donné 1 et pas plus, pas moins, alors vous allez les inviter pour une chaîne, dire: «Donnez-moi une corde." C'est donc là que dans ce cas ils vous ai donné ce ... est CS50! Alors vous allez l'utiliser et l'utilisation ohai et itération. Remarquez qu'ici nous avons sauté sur le cryptage des périodes, mais en termes de notre position pour ohai, la prochaine, nous avons utilisé o. Dans ce cas, c'est un peu plus difficile à voir parce que c'est 4, nous allons donc continuer un peu. Il suffit de coller avec moi ici. Ensuite, nous avons i et s, qui sont ensuite traduites par o et h respectivement. Ensuite, nous avons un espace, et ainsi nous savons que nous n'allons pas pour chiffrer les espaces. Mais remarquez que, au lieu d'aller à un à cet endroit, ici, nous chiffrer par un - je ne sais pas si vous pouvez voir que - juste ici. Donc ce n'est pas comme vous avez réellement prédéterminé, par exemple, o va ici, h va ici, un passe ici, je passe ici, o, h, a, i, o, h, a, i. Vous ne faites pas cela. Vous ne changer votre position dans le mot-clé quand vous savez que vous allez effectivement être crypter une lettre réelle. Est-ce que ce genre de sens? D'accord. Alors que quelques rappels. Vous voulez vous assurer que vous ne passer à la lettre suivante dans votre mot-clé si le caractère dans votre texte en clair est une lettre. Donc, dire que nous sommes à l'o. Nous remarquons que le caractère suivant, l'indice i du texte en clair, est un nombre, par exemple. Ensuite, nous n'avançons pas j, l'indice de notre mot-clé, jusqu'à ce que nous atteignons une autre lettre. Encore une fois, vous voulez également vous assurer que vous enveloppant au début du mot-clé lorsque vous êtes à la fin de celui-ci. Si vous voyez ici, nous sommes à i, la prochaine doit être o. Donc, vous voulez trouver un moyen de pouvoir enveloppant le début de votre mot-clé chaque fois que vous atteignez la fin. Et à nouveau, ce type d'opérateur est utile dans ce cas pour envelopper? Comme dans le comptage hors exemple. [L'élève] Le signe pour cent. >> Ouais, le signe pour cent, ce qui est modulo. Donc, modulo sera utile ici si vous souhaitez envelopper l'indice dans votre ohai. Et juste un petit truc: Essayez de penser à emballant sur le mot clé un peu comme le hors comptage, où si il ya 3 groupes, la 4ème personne, leur nombre qui, selon eux, 4 mod 3, qui était de 1. Donc, essayer de penser de cette façon. Comme vous avez vu dans la formule, partout où vous avez ci et alors pi mais alors kj, vous voulez vous assurer que vous garder la trace de ceux-ci. Vous n'avez pas besoin de l'appeler i, vous n'avez pas besoin de l'appeler j, mais vous voulez vous assurer que vous gardez une trace de la position que vous êtes dans votre texte en clair ainsi que la position que vous êtes à votre mot-clé parce que ceux qui ne vont pas nécessairement être la même. Non seulement le mot-clé - il pourrait s'agir d'une longueur tout à fait différent de votre texte en clair. De plus, votre texte en clair, il ya des chiffres et des caractères, donc il ne va pas correspondre parfaitement ensemble. Oui. [L'élève] Y at-il une fonction pour changer la casse? Pouvez-vous changer un A au capital? Oui >>, il n'y a aucun doute. Vous pouvez vérifier - je crois que c'est toupper, tout mot 1. Mais quand vous essayez de chiffrer les choses et de préserver le texte, il est préférable d'avoir fondamentalement cas distincts. Si c'est une majuscule, alors vous voulez passer par cette parce que dans votre formule, lorsque vous regardez en arrière la façon dont nous devons sorte de go interchangeable entre la façon ASCII de représenter les nombres et l'indice réel alphabétique, nous voulons nous assurer que il va y avoir une sorte de modèle que vous allez utiliser. Une autre note sur le schéma, en fait. Vous allez certainement être jongler avec les chiffres. Essayez de ne pas utiliser des numéros de magie, qui est un exemple du style. Donc, disons que vous voulez quelque chose de tout décalage dans le temps par aimé - Bon, alors soupçon, un autre spoiler, c'est quand vous allez être quelque chose de déplacement d'un certain montant, essayez de ne pas représenter que par un nombre réel mais plutôt essayer de voir si vous pouvez utiliser la valeur ASCII, qui sorte de faire plus de sens. Une autre note: Parce que nous avons affaire à des formules, même si votre FO sorte de savoir ce motif que vous utilisez peut-être, au mieux dans votre genre de commentaires expliquer la logique, comme, "J'utilise ce modèle parce que ...» et le type d'expliquer succinctement le motif de vos commentaires. [Cette procédure pas à pas a été 2] S'il n'y a pas d'autres questions, alors je vais rester ici pour un peu. Bonne chance avec votre pset 2: Crypto et merci d'être venu. [L'élève] Je vous remercie. Merci >>. [Media introduction Hors ligne]