JavaRush /Blog Java /Random-FR /Harvard CS50 : devoirs de la semaine 1 (cours 3 et 4)
Masha
Niveau 41

Harvard CS50 : devoirs de la semaine 1 (cours 3 et 4)

Publié dans le groupe Random-FR
Harvard CS50 : devoirs de la semaine 1 (cours 3 et 4) - 1Amis, vous pouvez glaner des informations théoriques de base dans les notes du séminaire . Là, en plus des bases du C, il décrit comment se connecter à un cloud IDE CS50 spécial (cela doit être fait pour exécuter et vérifier les tâches), et décrit les commandes Linux et les structures de langage de base nécessaires. Si vous ne trouvez pas suffisamment d'informations sur C dans le cours et les notes, tournez-vous vers d'autres sources. Par exemple, ceux répertoriés à la fin de cet article. Dans le sujet " Matériaux supplémentaires "
  • Objectifs de la première semaine
  • IDE CS50
  • Mise à jour de la ligne de commande et du plan de travail
  • Travailler dans l'EDI
  • Bonjour c!
  • Insectes?
  • Contrôle de validation : test check50
  • Bases du C : comparaison avec Scratch
  • Types de données de base en C
  • Bibliothèques C
  • Rebonjour C : analyse de la syntaxe des programmes les plus simples
  • Un peu plus sur les E/S en C
Matériaux dans ce sujet :
  • Saisie de données validée : fonctions spéciales de la bibliothèque cs50.h
  • Tâche 1. Calcul intelligent de la consommation d'eau
  • Tâche 2. Mario est avec nous !
  • Tâche 3. Il est temps de changer
  • Comment valider votre code et obtenir des notes
  • Ressource de code
  • littérature supplémentaire

Saisie de données validée : fonctions spéciales de la bibliothèque cs50.h

Pour rendre ce cours plus pratique, nous avons développé une bibliothèque spéciale CS50, qui possède notamment des fonctions très utiles pour le traitement des données saisies par l'utilisateur.
  • GetString()lit la chaîne saisie par l'utilisateur ;

  • GetInt()lit la chaîne saisie par l'utilisateur et vérifie si elle contient un entier ;

  • GetFloat()lit la chaîne saisie par l'utilisateur et vérifie si elle contient un nombre à virgule flottante ;

  • GetLongLong()lit la chaîne saisie par l'utilisateur et vérifie si elle contient un nombre réel long.

Tâche 1. Calcul intelligent de la consommation d'eau

Harvard CS50 : devoirs de la semaine 1 (cours 3 et 4) - 2C’est logique : plus vous prenez une douche longtemps, plus vous dépensez d’eau pour ce processus. Voyons combien ? Même si votre douche est à peine ouverte, environ 6 litres d'eau en sortent par minute. Et ce sont 12 bouteilles d'eau que vous emportez avec vous pour boire. Habituellement, une personne prend une douche pendant environ 10 minutes. Au total, pour se laver, vous avez besoin de 120 bouteilles d'un demi-litre. Beaucoup! Créez un fichier water.cdans votre ~/workspace/pset1. Le programme doit compter le nombre de bouteilles d'eau utilisées pour une douche en fonction de l'heure. C'est-à-dire:
  1. Le programme demande à l'utilisateur le nombre de minutes passées sous la douche
  2. L'utilisateur saisit un entier positif
  3. Le programme affiche le nombre de bouteilles utilisées par l'utilisateur.
username:~/workspace/pset1 $ ./water
minutes: 10
bottles: 120
Par souci de simplicité, cette fois, nous supposerons que l'utilisateur saisit toujours correctement le nombre de minutes, c'est-à-dire que nous ne vérifions pas si le nombre saisi est positif et entier. Plus tard, nous apprendrons à rédiger des chèques, mais pour l'instant, cela suffit. Pour vérifier que le programme fonctionne correctement, check50,vous devez saisir la ligne suivante dans le terminal :
check50 2015.fall.pset1.water water.c
Et si vous voulez voir comment waterfonctionne le programme écrit par l'équipe du cours, exécutez la commande suivante :
~cs50/pset1/water

Tâche 2. Mario est avec nous !

Harvard CS50 : devoirs de la semaine 1 (cours 3 et 4) - 3Connaissez-vous le plombier le plus célèbre du monde ? Avec l’aide de Nintendo, le gars fictif moustachu et légèrement potelé avec une casquette rouge est devenu un héros pour plusieurs générations de joueurs. Si vous ne savez pas de qui nous parlons, voici un lien vers le jeu classique de 1985 : croyez-moi, il est toujours aussi bon et vaut le détour ! Vous pouvez également trouver une version du classique Super Mario pour smartphones ou émulateurs hors ligne. Nous avons besoin de tout cela pour le développement général, ce n'est malheureusement pas encore une tâche ;). Et la tâche est la suivante. A la fin du premier niveau de Mario, chaque joueur a vu cette demi-pyramide : Créez un fichier mario.cdans votre ~/workspace/pset1. Notre programme dessinera une demi-pyramide similaire à celle que vous voyez, mais directement dans la console, sans graphique : chacun des blocs sera constitué d'une icône dièse (#). Même si vous n'avez pas encore compris comment faire, croyez-moi : c'est facile. Pour rendre le problème plus intéressant, ajoutons-y la possibilité de régler la hauteur de la demi-pyramide à l'aide d'un entier non négatif de 0 à 23. La hauteur de la pyramide sur l'image est considérée comme étant à l'endroit le plus élevé, c'est-à-dire égal à 8. Si l'utilisateur saisit le numéro de manière incorrecte, vous devez lui demander de le refaire une fois. Générez ensuite (en utilisant printf une pyramide). Prenez soin d'aligner le coin inférieur gauche de votre demi-pyramide avec le bord gauche de la fenêtre du terminal, comme dans l'exemple ci-dessous. Le texte souligné est ce que l'utilisateur saisit lui-même.
username:~/workspace/pset1 $ ./mario

height: 8
       ##
      ###
     ####
    #####
   ######
  #######
 ########
#########
Notez que les deux colonnes les plus à droite ont la même hauteur. Cela ne vaut pas encore la peine de générer des tuyaux, des nuages ​​et Mario lui-même =). Au moins pour cette tâche. Si l'utilisateur a saisi des données incorrectes (n'a pas saisi un nombre, ou a saisi un nombre inférieur à un ou supérieur à 23), le programme doit lui demander de saisir à nouveau les données, comme dans l'exemple ci-dessous, où le texte souligné est ce qui l'utilisateur a saisi à partir du clavier. Pour lire la chaîne saisie, utilisez GetInt. Cela peut aider à vérifier les entrées incorrectes, mais pas dans tous les cas.
username:~/workspace/pset1 $ ./mario
Height: -2
Height: -1
Height: foo
Retry: bar
Retry: 1
##
Pour compiler le programme, saisissez la ligne dans le terminal :
make mario
ou une version plus transparente mais plus longue :
clang -o mario mario.c -lcs50
Après cela, exécutez le programme pour exécution :
./mario
Si vous souhaitez vérifier que le programme fonctionne correctement, exécutez check50:
check50 2015.fall.pset1.mario mario.c
Et si vous souhaitez jouer avec la version de Mario des assistants de cours, tapez la ligne suivante :
~cs50/pset1/mario

Tâche 3. Il est temps de changer

Harvard CS50 : devoirs de la semaine 1 (cours 3 et 4) - 4Sous nos latitudes, nous n'avons pas vu cela, mais aux USA, semble-t-il, il existe un tel jouet, montré sur la photo : les cylindres sont conçus pour des pièces de différents diamètres (et dénominations), ils sont libérés par un mécanisme à ressort , et l'unité elle-même peut être attachée à la ceinture d'un enfant caissier. Mais que se passe-t-il si quelqu’un paie au caissier avec une grosse facture ? Imaginez à quel point il sera difficile de compter les pièces de monnaie. Pour minimiser le nombre de pièces émises, vous pouvez utiliser des algorithmes dits « gourmands ». Selon la définition du National Institute of Standards and Technology (NIST), ils trouvent toujours la solution optimale à chaque étape de la résolution d'un problème, en supposant que la solution finale (obtenue à partir de la totalité de ces étapes) sera également optimale. Qu'est-ce que ça veut dire? Imaginons qu'un caissier doive 41 centimes de monnaie à un client et qu'il ait à sa ceinture des cylindres de pièces de monnaie pour des coupures de 25, 10, 5 et 1 centimes. Un caissier guidé par un algorithme « gourmand » voudra immédiatement donner le maximum dès la première étape. À ce stade, la solution optimale ou la meilleure serait de distribuer 25 pence. 41-25 = 16, 16 pence restant à payer. Évidemment, 25 pence, c'est trop, ce qui laisse 10. 16-10 = 6. Maintenant, nous distribuons 5 pence selon le même principe, puis 1. Ainsi, l'acheteur ne recevra que quatre pièces en coupures de 25, 10. , 5 et 1 pence. Il s'avère que les instructions « gourmandes » étape par étape pour l'émission d'argent sont optimales non seulement pour ce cas, mais également pour les dénominations en devises américaines (et celles de l'Union européenne également). Autrement dit, si le caissier dispose de suffisamment de pièces de n'importe quelle dénomination, l'algorithme fonctionnera mieux, c'est-à-dire qu'il émettra le nombre minimum de pièces dans tous les cas possibles. Alors, quel est le nombre minimum de pièces dont nous avons besoin pour rendre la monnaie ? C'est notre troisième tâche. Créez un fichier greedy.cdans votre répertoire ~/workspace/pset1. Donné : pièces de monnaie en coupures de 25, 10, 5, 1 cent. Le programme doit :
  1. Demander à l'utilisateur combien de monnaie il doit rendre
  2. Calculez le nombre minimum de pièces avec lesquelles vous pouvez faire cela
Note:Nous utiliserons une fonction GetFloatde la bibliothèque CS50 pour l'entrée et printfde la bibliothèque d'E/S standard pour la sortie. De plus, le programme doit vérifier l'exactitude de la saisie. Nous vous avons demandé d'utiliser GetFloat, pour permettre à l'utilisateur de saisir une valeur en dollars et en cents séparés par un point. Par exemple, si nous devons 9,75 $, l’utilisateur doit saisir 9,75 $, mais pas 9,75 $ ou 975. Vous devez vous assurer que l’utilisateur saisit un nombre logique. GetFloatDisons non négatif ; la fonction elle-même n’aidera pas à cela . Si l'utilisateur effectue une saisie incorrecte, vous devez lui demander de la répéter et d'exécuter le programme uniquement avec les données correctes. Méfiez-vous des inexactitudes inhérentes aux nombres à virgule flottante. Par exemple, 0,01 ne peut pas être représenté directement par float. Essayez d'utiliser une sortie formatée, par exemple avec 50 décimales, en utilisant le code ci-dessous :
float f = 0.01;
printf("%.50f\n", f);
D'ailleurs, avant de compter quoi que ce soit, il serait logique de convertir le montant total en centimes (et en même temps de le convertir de en float) int, ce qui permettra d'éviter bien des erreurs et des difficultés. Pour vous assurer que notre analyseur de code automatique puisse vérifier correctement votre problème, assurez-vous que la dernière ligne de la sortie de votre programme ne contient aucune autre information que le nombre minimum de pièces : un entier suivi d'un \n (ceux qui apprennent JavaRush nous savons bien de quoi nous parlons ici =)). Vous trouverez ci-dessous un exemple de ce à quoi devrait ressembler le résultat de votre programme.
username:~/workspace/pset1 $ ./greedy
O hai! How much change is owed?
0.41
4
Compte tenu de la nature des nombres à virgule flottante, vous pouvez ignorer le zéro et saisir un tel nombre sous la forme .41. Bien entendu, les utilisateurs qui souhaitent vérifier dans le programme la possibilité de saisir des données incorrectes dans leur intégralité devraient voir quelque chose comme :
username:~/workspace/pset1 $ ./greedy
O hai! How much change is owed?
-0.41
How much change is owed?
-0.41
How much change is owed?
foo
Retry: 0.41
4
Sur la base de ces exigences et de l'exemple que vous avez vu ci-dessus, votre code devrait très probablement contenir une sorte de boucle. Si en testant l'application, vous vous rendez compte que la boucle ne s'arrête pas, vous pouvez interrompre l'exécution du programme avec la combinaison ctrl-c (parfois plusieurs fois). Vous savez déjà comment compiler et exécuter un programme. Si vous souhaitez vérifier si votre programme fonctionne correctement, à l'aide de l'utilitaire check50, saisissez la ligne suivante dans le terminal :
check50 2015.fall.pset1.greedy greedy.c
Et si vous voulez jouer avec ce programme réalisé par les assistants de cours, écrivez la commande suivante :
~cs50/pset1/greedy

Comment valider votre code et obtenir des notes

  1. Option 1

    S'il est important pour vous de vérifier l'exactitude du code, et non d'obtenir une note finale, vous pouvez le vérifier et le corriger à l'aide de la commande.

    check50 2015.fall.pset1.name name.c

    entré dans la ligne terminale du CS50 IDE ? où nameest le nom de votre fichier de tâches.

  2. Option 2

    Si vous souhaitez obtenir des notes (essentiellement la même chose que si vous exécutiez check50, mais en mémorisant le résultat et en remplissant certains formulaires en anglais, suivez ces étapes :

    • Étape 1 sur 2

      1. Lorsque les applications sont prêtes, connectez-vous à l'IDE CS50.
      2. Dans le coin supérieur gauche de l'IDE CS50, dans son navigateur de fichiers, et non dans la fenêtre du terminal, faites un clic gauche ou un clic droit sur votre fichier hello.c (celui situé dans le répertoire pset1) et cliquez sur Télécharger. Vous devriez constater que le navigateur a chargé hello.c.
      3. Répétez l’opération pour l’eau.c.
      4. Répétez l’opération pour Mario.c.
      5. Répétez l’opération pour gourmand.c.
      6. Dans un onglet ou une fenêtre séparé, connectez-vous à CS50 Submit .
      7. Cliquez sur Soumettre dans le coin inférieur gauche de la fenêtre.
      8. Sous Ensemble de problèmes 1 dans la fenêtre qui apparaît, cliquez sur Télécharger une nouvelle soumission.
      9. Dans la fenêtre qui apparaît, cliquez sur Ajouter des fichiers…. Une fenêtre appelée Open Files devrait apparaître.
      10. Accédez à l’emplacement où hello.c est téléchargé. Il se trouve généralement dans le dossier Téléchargements ou dans le dossier qui vous est attribué par défaut pour les téléchargements. Une fois que vous avez trouvé hello.c, cliquez une fois dessus pour le marquer, puis cliquez sur Ouvrir.
      11. Cliquez à nouveau sur Ajouter des fichiers... et la fenêtre Ouvrir les fichiers réapparaîtra.
      12. Recherchez maintenant le fichier water.c de la même manière. Cliquez dessus, puis cliquez sur Ouvrir (ou « Ouvrir »).
      13. Trouvez maintenant mario.c. Et aussi cliquez et ouvrez de la même manière.
      14. Tout est pareil avec le fichier greedy.c.
      15. Cliquez sur Démarrer le téléchargement pour commencer à télécharger vos fichiers sur les serveurs CS50.
      16. Sur l'écran qui apparaît, vous verrez une fenêtre intitulée Aucun fichier sélectionné. Si vous déplacez le curseur de votre souris vers la gauche de l'écran, vous verrez une liste des fichiers que vous avez téléchargés. Cliquez sur chacun pour confirmer le contenu de chacun. (Pas besoin de cliquer sur d'autres boutons ou icônes). Si vous êtes sûr d'être prêt à envoyer le fichier pour vérification, considérez que vous avez terminé ! Si vous souhaitez vérifier à nouveau votre code vous-même ou réparer quoi que ce soit, revenez à CS50 Submit et répétez ces étapes. Vous pouvez renvoyer autant de fois que vous le souhaitez ; Seule la soumission la plus récente sera évaluée.
  3. Étape 2 sur 2 (elle n'est pas requise pour l'évaluation, si cela =))

    Allez maintenant sur le lien https://www.edx.org/course/cs50s-introduction-computer-science-harvardx-cs50x où vous trouverez des formulaires spéciaux. Vous devez y répondre à plusieurs questions théoriques, puis cliquer sur Soumettre en dessous.

Les questions marquées d'un astérisque sont obligatoires :
  • D'accord, j'aurais dû voir celui-ci venir ! En quelques phrases, qu'est-ce qu'une bibliothèque ? * (Décrivez brièvement ce qu'est une bibliothèque)
  • En quelques phrases, quel rôle joue-t-il #include <cs50.h> lorsque vous l'écrivez au-dessus d'un programme ? *(quel est le rôle de la ligne #include <cs50.h> qui apparaît en haut de certains programmes ?)
  • Environ combien d’heures diriez-vous avoir consacrées à l’ensemble de problèmes 0 : Scratch ?
  • Environ combien d’heures diriez-vous que vous avez consacré à l’ensemble de problèmes 1 : C ?
  • Quelle est votre opinion sur le CS50x jusqu'à présent ? *(Votre opinion sur le CS50 pour le moment, choisissez l'option J'aime ou Je n'aime pas)
  • Avez-vous demandé de l'aide à des camarades de classe ou au personnel via le groupe Facebook CS50 à l'adresse http://www.facebook.com/groups/cs50 ? *(avez-vous demandé de l'aide à d'autres étudiants ou assistants dans le groupe Facebook)
  • Avez-vous demandé de l'aide à des camarades de classe ou au personnel via le Subreddit CS50 sur http://www.reddit.com/r/cs50 * (avez-vous demandé de l'aide à d'autres étudiants ou assistants via Subreddit)
  • Avez-vous demandé de l'aide à vos camarades de classe ou au personnel via Twitter en utilisant @cs50 ou #cs50 ? *(avez-vous demandé de l'aide à d'autres étudiants ou à des assistants techniques sur Twitter en utilisant @cs50 ou #cs50).
Amis, si vous avez des questions, écrivez-les dans les commentaires sous ce guide. Si vous n'avez pas atteint le niveau 5 de JavaRush pour recevoir une invitation à l'info, nous vous recommandons de le faire. C'est gratuit, intéressant et pas très difficile.

Ressource de code :

  1. Troisième conférence

    http://cdn.cs50.net/2015/fall/lectures/1/w/src1w.zip

  2. Quatrième conférence

    http://cdn.cs50.net/2015/fall/lectures/1/f/src1f.zip

    http://cdn.cs50.net/2015/fall/lectures/1/f/src1f/

littérature supplémentaire

http://cpp.com.ru/kr_cbook - Version russe du livre classique sur C des auteurs du langage - Brian Kernighan et Dennis Ritchie. Largement connu dans les cercles étroits sous le nom de K&R. La traduction, cependant, n'est pas de l'édition la plus récente. Lisez les trois premiers chapitres. Il y aura un peu plus de matériel que nécessaire, mais suffisamment pour résoudre les problèmes. https://computer.howstuffworks.com/c.htm est une ressource recommandée par les auteurs de CS50. En anglais. Page 1-7, 9 et 10.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION