JavaRush /Blog Java /Random-FR /Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6)
Masha
Niveau 41

Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6)

Publié dans le groupe Random-FR
devoirs CS50 pour les cours 5 et 6 Les conférences CS50 sont ici : https://cdn.javarush.com/images/article/155cea79-acfd-4968-9361-ad585e939b82/original.pngcs50.html . Ce matériel contient 3 tâches, des informations théoriques à leur sujet et un guide d'action.

Objectifs

• Approfondissez les fonctions et les bibliothèques • Familiarisez-vous avec la cryptographie, implémentez quelques chiffrements simples

Matériaux additionnels

https://reference.cs50.net/ - explication des fonctions de la bibliothèque utilisées lors de la formation. En anglais. http://computer.howstuffworks.com/c.htm pages 11 à 14 et 39

Préparation

Connectez-vous à cs50.io update50 pour vous assurer que la version de votre espace de travail est à jour. Si vous fermez accidentellement la fenêtre du terminal, accédez au menu Affichage et assurez-vous qu'il y a une coche à côté de l'élément Console (cochez-la si ce n'est pas le cas). Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 1 Cliquez sur (+), à l'intérieur du cercle vert sur le cadre de la fenêtre du terminal, sélectionnez Nouveau terminal . Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 2 Créez un répertoire de travail : mkdir ~/workspace/pset2 notez qu'il y a un espace entre mkdir et ~/workspace/pset2 . Pour récapituler, ~ signifie le répertoire racine, ~/workspace est un dossier appelé workspace dans le répertoire racine, ~/workspace/pset2 est un répertoire appelé pset2 dans ~/workspace . Exécutez maintenant : cd ~/workspace/pset2 pour passer au nouveau répertoire. La ligne de commande ressemble à ceci : username:~/workspace/pset2 $ Si quelque chose ne va pas, répétez les étapes. Vous pouvez également appeler une commande history pour afficher les dernières commandes par ordre chronologique. Vous pouvez également placer votre curseur sur la ligne de commande et appuyer sur la flèche vers le haut de votre clavier pour afficher toutes les commandes dans l'ordre de la dernière entrée à la première. En utilisant le bouton bas, vous pouvez revenir en arrière. D'ailleurs, au lieu de taper les mêmes commandes à chaque fois, vous pouvez faire défiler les commandes que vous avez déjà saisies et les exécuter à nouveau en appuyant sur Entrée. Vous avez peut-être remarqué que David fait exactement cela dans ses conférences. Les tâches de la deuxième semaine doivent être sauvegardées dans pset2 .

Tâche 0. Initialisation

Regardons de plus près les lignes. Dans le fichier initials.c , écrivez un programme qui demande le nom de l'utilisateur (en utilisant la fonction GetString nous obtenons le nom sous forme de chaîne) puis affiche les premières lettres du prénom (ou des noms) et du nom en majuscules sans espaces, points ou autres caractères, uniquement avec un saut de ligne ( \n ). Nous supposons que les utilisateurs saisissent uniquement des lettres (minuscules ou majuscules, ou les deux) plus un espace entre les mots. Considérez que des types nommés Joseph Gordon-Levitt, Conan O'Brien ou David J. Malan n'utiliseront pas le programme. Pour vérifier le bon fonctionnement du programme, appelez check50 : Vous souhaitez jouer avec la mise en œuvre du programme préparé par le staff du CS50 ? Tapez la ligne : username:~/workspace/pset2 $ ./initials Zamyla Chan ZC username:~/workspace/pset2 $ ./initials robert thomas bowden RTBcheck50 2015.fall.pset2.initials initials.c~cs50/pset2/initials
Cryptographie
La cryptographie, science du cryptage et du déchiffrement des informations... En effet, les messages cryptés existent depuis l'Antiquité, et étaient utilisés par les armées pour transmettre des messages secrets. Eh bien, désormais, vos mots de passe sur Facebook et d'autres réseaux sont stockés sous forme cryptée.

Tâche 1. Salut, César !

Informations théoriques
Nous étudierons l'un des chiffres les plus simples - le chiffre de César, du nom de l'empereur romain. Dans ce chiffre, chaque lettre du texte est remplacée par une autre, qui correspond à un nombre fixe de lettres plus bas dans l'alphabet. Ce nombre fixe de lettres s'appelle une clé . Ainsi, la clé 1 transforme la lettre latine C en lettre D, et Z tout au long du cycle en A. Si la clé est 3, alors la lettre C se transformera en F, et Z en C. Exemples : on utilise le chiffre César avec touche 5 sur le mot chat. c -> h a -> f t -> y Caesar (cat, 5) = hfy Clé = 7, mot = ordinateur c->j o->v m->t p->w u->b t->a e->l r->y Caesar(computer,7) = jvtwbaly Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 3 Le chiffre de César est simple, mais, hélas, peu fiable (ce sont des choses interconnectées !) : pour l'alphabet anglais, il n'y a que 25 options de cryptage, il est facile de parcourir toutes les options même sans ordinateur. Cependant, le chiffre de César est souvent utilisé comme étape dans d'autres chiffrements, comme le chiffre de Vigenère (plus de détails à ce sujet dans le paragraphe suivant). "Mathématisons" le chiffre de César. Notons le texte brut par la lettre p, pi est la lettre du texte p qui se trouve à la position i. Appelons la lettre de la clé secrète k, c le texte chiffré et ci la lettre du texte chiffré qui se trouve en position i. Ensuite, vous pouvez calculer chaque lettre du chiffre à l'aide de la formule : ci = (pi + k) % 26 Habituez-vous à cette formalisation, elle permet de programmer l'algorithme et exprime la signification du chiffre avec précision et concision. Si la clé k = 13 et le texte original p est "Assurez-vous de boire votre Ovaltine !", voici le chiffre que nous obtenons : Or fher gb qevax lbhe Binygvar! Notez que O (la première lettre du texte chiffré) est décalé de 13 positions par rapport à la lettre B (la première lettre du texte original). La même chose avec la lettre r (la deuxième lettre du cryptage) est décalée de 13 lettres par rapport à e (la deuxième lettre de l'original). La troisième lettre du cryptage, f, est décalée de 13 lettres de s (la troisième dans l'original), on passe ici en cercle de z à a. Un chiffre César avec la clé 13 porte le nom spécial ROT13 . Il est symétrique : en l’appliquant deux fois, on revient au texte original. Bien sûr, il existe aussi ROT26, celui-ci est généralement super sécurisé, mais seulement si vous n'exprimez pas clairement vos pensées =).
Condition
Écrivez dans le fichier caesar.c un programme qui crypte le texte à l'aide du chiffre César. Fournissez un argument de ligne de commande en entrée du programme : un entier non négatif. Pour simplifier, appelons-le k. Si l'utilisateur exécute le programme sans argument de ligne de commande ou avec plus d'un argument, l'application doit se plaindre et renvoyer la valeur 1 (c'est ainsi que les erreurs sont généralement désignées) : return 1; Dans tous les autres cas, le programme demande à l'utilisateur le texte à chiffrer, puis affiche le texte chiffré avec la clé k (c'est-à-dire décalé de k positions vers la droite le long du cycle). Si le texte contient des caractères qui ne font pas partie de l'alphabet anglais, le programme ne les modifie pas. Après avoir imprimé le texte chiffré, l'application se ferme, main renvoie 0 : return 0; si main ne renvoie pas explicitement zéro, elle le renvoie automatiquement (int est en fait le type de retour de main, mais nous en reparlerons une autre fois). Selon la convention (les règles de bonne forme en programmation), si vous renvoyez explicitement 1 pour indiquer une erreur, vous devez également renvoyer 0 comme indicateur de la réussite du programme. Bien qu'il n'y ait que 26 lettres dans l'alphabet anglais, k peut être supérieur à 26. Essentiellement, la clé k = 27 donnera le même résultat que k = 1, mais vous devez autoriser l'utilisateur à saisir n'importe quel nombre non négatif, non négatif. dépassant 2 ^ 31 – 26 (il doit rentrer dans int). Le programme doit également tenir compte du fait que les lettres minuscules sont cryptées en minuscules et les lettres majuscules sont cryptées en majuscules. Où allons-nous commencer? Puisque l'application doit accepter la valeur de k directement dans la chaîne d'argument, l'en-tête de notre fonction principale ressemble à ceci : int main(int argc, string argv[]) Depuis le chapitre 6, vous savez que argv est un tableau de chaînes. Le réseau peut être considéré comme une rangée de casiers dans une salle de sport. Chacun d’eux a une signification cachée. Dans notre cas, à l'intérieur de chaque cellule il y a un argument comme string Pour ouvrir le premier casier, nous utilisons argv[0], le second - argv[1], et ainsi de suite. Si nous avons n verrous, alors nous devons nous arrêter à argv[n - 1], puisque argv[n] n'existe plus (ou existe, mais appartient à quelqu'un d'autre, il vaut mieux ne pas y toucher). Vous pouvez donc accéder à l'argument k comme ceci : string k = argv[1]; Nous pensons qu'il y a vraiment quelque chose là-dedans ! Rappelez-vous que argc est une variable int égale au nombre de lignes dans argv. Cela signifie qu'il est préférable de vérifier la valeur de argc avant d'essayer d'ouvrir la cellule, car il se peut qu'elle n'existe pas. Idéalement, argc = 2. Pourquoi en est-il ainsi ? À l'intérieur de argv[0] se trouve généralement le nom du programme. Autrement dit, argc vaut toujours au moins 1. Mais notre programme a besoin que l'utilisateur fournisse un argument de ligne de commande k, donc argc = 2. Naturellement, si l'utilisateur entre plus d'un argument sur la ligne de commande, argc grandit également et peut être supérieur à 2 Si l'utilisateur saisit un entier dans une chaîne, cela ne signifie pas que la valeur saisie sera automatiquement stockée sous forme d'entier. Plus précisément, ce ne sera PAS le cas. Ce sera une chaîne, même si elle ressemble exactement à un int ! Nous devons donc convertir la chaîne en int nous-mêmes. Heureusement, il existe une fonction appelée atoi conçue à cet effet. Sa syntaxe est la suivante : int k = atoi(argv[1]); Notez que k est de type int, vous pouvez donc faire de l'arithmétique avec. Avec cette fonction, vous n'avez pas à vous soucier de savoir si l'utilisateur saisit un entier ou, disons, foo : dans ce cas, atoi renverra 0. La fonction atoi est déclarée dans la bibliothèque stdlib.h , alors assurez-vous de # incluez-le au début du programme. Le code sera compilé sans cela, puisque nous avons déjà inclus cette fonction dans la bibliothèque cs50.h . Cependant, il vaut mieux faire confiance aux bibliothèques natives. Vous avez donc k stocké en tant que int. Demandons maintenant la saisie de texte. Si vous avez effectué les devoirs de la première semaine, vous connaissez déjà la fonction de la bibliothèque CS50 appelée GetString. Elle nous aidera. Après avoir reçu k et le texte initial, commençons le cryptage. Pour récapituler, vous pouvez parcourir tous les caractères d'une chaîne et les imprimer en utilisant la boucle suivante : for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } En d'autres termes, tout comme argv est un tableau de chaînes, string est un tableau de caractères. Par conséquent, nous pouvons utiliser des crochets pour accéder à des éléments de chaîne individuels de la même manière que pour obtenir des chaînes individuelles dans argv. Bien entendu, il n’y a rien de cryptographique dans l’impression de chacun des caractères. Ou, techniquement, lorsque k = 0. Mais il faut aider César à chiffrer son texte ! Salut, César ! Pour utiliser strlen, vous devez inclure une autre bibliothèque . Puisque nous automatisons certains tests de validation, le programme devrait se comporter exactement comme ceci : username:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! outre atoi , vous pouvez trouver d'autres fonctions intéressantes dans les bibliothèques ctype.h et stdlib.h . Pour ce faire, suivez le lien et fouillez un peu là-bas. Par exemple, isdigit est clairement quelque chose d'intéressant =). Lorsque vous passez de Z à A (ou de z à a), n'oubliez pas l'opérateur modulo %en langage C. Étudiez également le tableau , il montre les caractères ASCII non seulement pour les lettres. Pour vérifier que le programme fonctionne correctement avec check50 , procédez comme suit : check50 2015.fall.pset2.caesar caesar.c Et si vous souhaitez jouer avec le code créé par l'équipe du CS50, exécutez la commande : ~cs50/pset2/caesar Au fait, uggc://jjj.lbhghor.pbz/jngpu ?i=bUt5FWLEUN0 .
Analyse de la tâche
  1. Obtenez la clé
  2. Obtenir du texte
  3. Crypter
  4. Afficher un message crypté
1. Nous formons la fonction principale afin que l'utilisateur entre la clé sur la ligne de commande et vérifie l'exactitude de la clé. int main(int argc, string argv[]) argc : • int • nombre d'arguments saisis sur la ligne de commande • si argc = 2 tout va bien. Sinon, imprimez les instructions et fermez le programme. • Si argc = 2, nous vérifions si la clé est un entier. • Argv est un tableau de chaînes, une liste avec des arguments entrés. Array est une structure de données contenant différentes données du même type dans différentes cellules. Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 4 Par exemple, l'utilisateur a saisi la chaîne blastoff Team Rocket, puis : Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 5 À l'aide de la fonction atoi(), nous convertissons le nombre obtenu en un entier. Si cela n'est pas possible, la fonction renverra 0. Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 6 2. Demander du texte à l'utilisateur. C'est simple : tout ce que l'utilisateur saisit est une chaîne. 3. Cryptage. L’algorithme est simple, mais comment expliquer à l’ordinateur quelles lettres se succèdent ? Il est temps de penser au tableau ASCII ! Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 7 Cependant, il peut y avoir plus que de simples lettres dans une chaîne... Avant de passer à la modification des chaînes, imaginez que vous n'ayez besoin de modifier qu'un seul caractère. Nous voulons changer les lettres du texte initial, pas les signes ou les chiffres. Que devrions nous faire? Nous devons d’abord vérifier si ce caractère est dans l’alphabet. Cela peut être fait en utilisant la fonction isalpha() . Si le caractère est dans l'alphabet, cette fonction renvoie vrai et faux sinon. Deux fonctions plus utiles - isupper() et islower() renvoient true si la lettre est respectivement majuscule ou minuscule. Ainsi : Isalpha(‘Z’) -> true Isalpha(‘;’) -> false Isupper(‘Z’) ->true Isupper(‘z’) -> false Islower(‘Z’) -> false Islower(‘z’)->true Si isalpha renvoie vrai, il faut changer ce caractère à l'aide de la touche . Considérons et analysons à titre d'exemple le programme de Zamili, l'assistant CS50. Vous vous demandez peut-être pourquoi « A » est un nombre entier alors qu’il s’agit clairement d’une lettre. Il s’avère que les symboles et les entiers sont interchangeables. En mettant la lettre A entre guillemets simples, vous pouvez obtenir son code ASCII en int. Attention : vous avez besoin de guillemets simples ; sans eux, le compilateur recherchera une variable nommée A, pas un symbole. Ensuite, en ligne , nous ajoutons la valeur clé au code ASCII de la lettre et les stockons dans une variable entière. Même si le résultat est un entier, l'instruction printf utilise l'espace réservé %c pour les caractères. Le programme imprime donc le caractère associé au résultat entier. Dans le deuxième cas, nous affichons le numéro en utilisant l'espace réservé %d. Vous pouvez entrer ce code dans l'IDE cs50 et jouer avec. Vérifions comment asciimath fonctionne pour différentes clés. Prenons la valeur 25, nous verrons l'image suivante : Et maintenant, que la clé soit 26 : Nous avons obtenu [, et pas du tout la lettre A. C'est juste le caractère ASCII suivant après Z. Donc ajouter simplement la clé ne sera pas travail. Nous devons utiliser une formule chiffrée pour revenir au début de l’alphabet dès que nous manquons de lettres. N'oubliez pas, nous avons déjà écrit ci-dessus : /* * asciimath.c * by Zamyla Chan * * Calculates the addition of a char and an integer, * and displays both the resultant character and its * ASCII value. * * Usage: ./asciimath key [char] * */ #include #include #include int main(int argc, string argv[]) { if (argc != 2) { printf("print the key next time \n"); return 1; } // key is the second command line argument int key = atoi(argv[1]); //преобразование строки в int int letter = 'A'; printf("\nCalculating '%c' + %d...\n", letter, key); int result = (letter + key); printf("The ASCII value of %c is %d.\n\n", result, result); return 0; } int result = (letter + key);Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 8Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 9ci = (pi + k) % 26 Où ci est la lettre numéro i dans le texte chiffré, pi est la lettre numéro i dans le texte en clair, k est la clé et %26 est le reste de la division par 26 (ou « modulo 26 »). Appliquons cette formule à la lettre Y. Prenons k = 2. Calculons ('Y' + 2) %26 code ASCII de la lettre 'Y' = 89. Puis ('Y' + 2) %26 = (89 + 2 )% 26 = 91%26 = 13 Mais ce n'est pas la valeur ASCII de la lettre A dont nous avons besoin, qui est 65. Donnons maintenant à chaque lettre de l'alphabet une valeur de 0 à 25 dans l'ordre. Dans ce cas, Y = 24. (24+2)%26 = 0 La lettre A a justement un tel indice. Ainsi, cette formule fait référence à l'index alphabétique des lettres, et non à leurs valeurs ASCII. Pour imprimer un caractère crypté, vous aurez besoin de sa valeur ASCII. Et découvrez comment basculer entre une valeur ASCII et un nombre dans l’alphabet. Une fois que nous avons trouvé la formule pour un caractère, nous devons l’appliquer à chaque lettre de la chaîne saisie au clavier. Mais seulement si ce sont des lettres ! Et n’oubliez pas que les majuscules et les minuscules ont des significations différentes. C'est là que les fonctions isupper et islower sont utiles. Vous pouvez avoir deux formules, une pour les majuscules, l'autre pour les minuscules, des fonctions vous aideront à choisir laquelle appliquer. Comment appliquer une formule à chaque caractère d’une chaîne ? N'oubliez pas qu'une chaîne n'est qu'un tableau de caractères. La fonction strlen (longueur de chaîne) vous aidera à déterminer le nombre d'itérations dans une boucle .Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 10

Tâche 2. Parlez-vous français?

Théorie
Le chiffre de Vigenère est un peu plus sûr que le chiffre de César : il utilise un mot comme clé et est difficile à déchiffrer manuellement en utilisant uniquement l'analyse de fréquence ou la force brute. Chaque lettre de la clé génère un nombre et nous obtenons ainsi plusieurs clés pour déplacer les lettres. Exemple : p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина messages p = 25 В то время How длина k = 5 Поэтому его нужно повторять 5 раз. Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 11 Si le nombre de lettres du message n'est pas divisible par la touche, nous n'en utilisons qu'une partie lors de la dernière application de la touche : Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 12 Pour trouver la valeur du décalage, nous utilisons les positions de chaque lettre de notre touche bacon dans l'alphabet (de a à z). Nous comptons à partir de zéro, comme de vrais programmeurs. Et chaque lettre du texte original est décalée d'un nombre donné, comme dans le chiffre de César, ramenant, si nécessaire, après Z au début de l'alphabet. Donc M se déplacera de 1, le premier e ne bougera pas du tout et le second se déplacera de 2 positions. Ci-dessous vous voyez le message original, la clé écrite et le résultat de son application. Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 13 Le chiffre de Vigenère est bien sûr plus fort, mais si l'on connaît la longueur de la clé, il est assez facile à déchiffrer. Comment l'identifier ? Si le texte original est suffisamment long pour que certains mots y apparaissent plusieurs fois, alors vous verrez quelques répétitions : Vous Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 14 pouvez également utiliser la force brute, mais il existe de nombreuses options : 26^n – 1 où n est la longueur de la clé inconnue . Mais généralement, c'est beaucoup. Certes, ce n'est pas un problème pour un ordinateur. Et maintenant les mathématiques du chiffre : Soit p un texte, k le mot-clé, kj la j-ème lettre de la clé, pi la lettre numéro i dans le texte original, ci la lettre numéro i dans le cryptage. . Alors: ci = (pi + kj) % 26
Exercice
Condition Écrivez un programme vigenere.c qui crypte un message en utilisant le chiffre Vigenere. Nous fournissons un argument de ligne de commande à l'entrée du programme : le mot-clé k, composé de lettres de l'alphabet anglais. Si l'application est lancée avec plus d'un argument ou avec un argument non inclus dans l'alphabet, il est nécessaire d'afficher les informations d'erreur et de terminer le programme. Autrement dit, main renverra 1 - dans ce cas, nos tests automatiques comprendront que tout va bien ici et cette condition est prise en compte. Si tout va bien, le programme doit demander une chaîne de texte p, que nous chiffrons avec la clé k obtenue ci-dessus, imprimons le résultat et complétons le programme en renvoyant la valeur 0. Clarification Il faut s'assurer que dans la clé k les caractères A et a sont désignés par 0, B et b par 1, ..., Z et z par 25. Le programme doit appliquer le chiffre de Vigenère uniquement aux lettres du texte p. Les caractères restants (chiffres, signes de ponctuation, espaces) doivent être affichés sans modification. Si l'algorithme doit appliquer le jème caractère k au ème caractère p qui n'est pas dans l'alphabet, appliquez ce jème caractère clé au caractère alphabétique suivant du texte ; vous ne pouvez pas simplement le quitter et passer à un autre personnage dans k. Enfin, le programme doit conserver la casse de chaque lettre de p .
Vous ne savez pas par où commencer ?
Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 15
Voici quelques conseils de Zamilya, assistante de cours CS50
Heureusement, le programme est très similaire au chiffre César, seule la clé est une chaîne plutôt qu’un entier. Si vous avez réussi à implémenter le chiffre du nom du souverain romain, cela peut être un bon début pour la deuxième tâche. Vous avez probablement déjà réalisé que le chiffre de Vigenère avec une lettre comme clé est le même que le chiffre de César. L'algorithme de Vigenère utilise les mêmes étapes que César :
  1. Obtenez la clé
    • le mot de code est le deuxième argument de la ligne de commande argv[1]
    • doit être dans l'alphabet : fonction isalpha
  2. Obtenir du texte
  3. Crypter
  4. Imprimer le texte chiffré
Vérifions donc le deuxième argument de ligne de commande argv[1] pour voir s'il appartient aux caractères alphabétiques. Nous faisons cela en utilisant le isalpha déjà familier . Si la clé est correcte, nous recevons une chaîne de l'utilisateur et commençons le cryptage. La formule du chiffre de Vigenère est similaire à la formule du chiffre de César. Comment convertir une lettre en décalage de chiffre correspondant ? Essayez de comparer les valeurs à l'aide du tableau ASCII. Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 16 Très probablement, vous pourrez trouver un motif entre les lettres et leurs indices alphabétiques en utilisant les séquences du tableau. Avez-vous compris comment soustraire une lettre d'une autre pour obtenir le résultat souhaité ? Les décalages pour les lettres majuscules et minuscules sont les mêmes, vous devrez donc définir deux formules similaires pour déterminer le décalage pour les lettres minuscules et séparément pour les lettres majuscules. N'oubliez pas non plus que la boucle de texte doit ignorer les caractères non anglais. Et n'oubliez pas de préserver la casse des lettres. Si vous regardez la formule de chiffrement : ci = (pi + kj) % 26 vous verrez deux variables d'index, i et j. L'un enregistre la position dans le texte source, l'autre dans la clé. Si votre texte est plus long que la clé, l'index de la clé va de la fin de la clé au début. Comment faire? Utilisation de l'opération de division modulo ! Le résultat de l’opération est le reste de la division de deux nombres. Les avantages pratiques de cette opération en programmation sont tout simplement énormes ! Imaginez qu'un grand groupe de personnes doive être divisé en trois sous-groupes. Une façon d’y parvenir est de leur demander de payer pour le premier, le deuxième et le troisième. Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 17 C'est-à-dire que la première personne appartient au premier groupe, la deuxième au deuxième, la troisième au troisième, la quatrième encore au premier, et ainsi de suite. Vous pouvez utiliser la division modulo pour effectuer la même opération. Numérotons les trois mêmes groupes à partir de zéro. Voici comment procéder : Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 18 Si vous prenez un index et le divisez modulo la valeur maximale, le résultat obtenu ne sera jamais supérieur ou égal à cette valeur. Essayez ce principe pour renvoyer un mot-clé au début ! Seulement, au lieu de trier par groupe, vous avez besoin de l'index du mot-clé afin de pouvoir décaler la lettre correcte sans dépasser la longueur de la clé. Puisque nous automatisons certains tests de votre code, le programme doit se comporter comme indiqué ci-dessous : jharvard@appliance (~/Dropbox/pset2): ./vigenere bacon Meet me at the park at eleven am Negh zf av huf pcfx bt gzrwep oz Comment pouvez-vous tester le programme autrement que de calculer manuellement le texte chiffré ? Nous sommes gentils : pour cela nous avons écrit le programme devigenere . Il prend un et un seul argument de ligne de commande (mot-clé), et son travail consiste à prendre le texte chiffré en entrée et à renvoyer le texte en clair. Exécutez-le : ~cs50/pset2/devigenere k où k est le mot-clé. Si vous souhaitez vérifier l'exactitude de votre programme à l'aide de check50, exécutez : check50 2014.fall.pset2.vigenere vigenere.c Et si vous souhaitez évaluer notre implémentation vigenere, tapez : ~cs50/pset2/vigenere

Comment valider votre code et obtenir des notes

Attention! S'il est important pour vous de vérifier uniquement l'exactitude des tâches, utilisez cs50check. Si vous souhaitez obtenir des notes sur la plateforme edx, suivez la procédure décrite ci-dessous. Gardez à l’esprit que cette procédure utilise le même cs50check pour vérifier les tâches. La seule différence est qu'il mémorise les résultats et calcule le score global.
  1. Connectez-vous à l'IDE CS50
  2. Près du coin supérieur gauche de l'IDE CS50 , là où se trouve son navigateur de fichiers (pas dans la fenêtre du terminal), cliquez avec le bouton droit sur votre fichier initials.c situé dans le répertoire pset2 et cliquez sur Télécharger . Vous devriez voir que le navigateur a chargé initials.c .
  3. Répétez l’opération pour caesar.c .
  4. Répétez l’opération pour vigenere.c .
  5. Dans une fenêtre ou un onglet séparé, connectez-vous à CS50
  6. Cliquez sur l' icône Soumettre dans le coin supérieur gauche de l'écran. Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 19
  7. Dans la liste des dossiers à gauche, cliquez sur le répertoire Problem Set 2 , puis cliquez sur le bouton Télécharger une nouvelle soumission . C'est sur la droite. Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 20
  8. Sur l'écran qui apparaît, cliquez sur le bouton Ajouter des fichiers .... Une fenêtre de sélection de fichiers sur votre ordinateur s'ouvrira. Harvard CS50 : devoirs de la semaine 2 (cours 5 et 6) - 21
  9. Accédez au dossier dans lequel vous conservez initials.c . Il se trouve probablement dans votre dossier Téléchargements ou à l'endroit où votre navigateur place les fichiers par défaut. Lorsque vous trouvez initials.c , cliquez une fois dessus pour le sélectionner, puis cliquez sur Ouvrir.
  10. Cliquez à nouveau sur Ajouter des fichiers .
  11. Recherchez caesar.c et ouvrez-le.
  12. Faites de même pour le fichier vigenere.c .
  13. Cliquez sur Démarrer le téléchargement. Vos fichiers seront téléchargés sur les serveurs CS50 .
  14. Sur l'écran qui apparaît, vous devriez voir la fenêtre Aucun fichier sélectionné . Si vous déplacez le curseur de votre souris vers la gauche, vous verrez une liste des fichiers téléchargés. Pour confirmer, cliquez sur chacun d'eux. Si vous n'êtes pas sûr de quelque chose, vous pouvez télécharger à nouveau les fichiers en répétant les mêmes étapes. Vous pouvez le faire autant de fois que vous le souhaitez jusqu'à fin 2016.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION