[Jouer de la musique] DAVID MALAN: Bonjour, tout le monde. Ceci est la super-section de CS50. Les articles ne seront pas affectés commencer pour une autre semaine. Et aujourd'hui, je suis ici avec-- MARIA: Maria. DAVID MALAN: --to effectivement jetez un oeil à problème en créer un, le cours de premières semaines de la matière, vous orienter avec CS50 IDE, un peu de Linux, le système d'exploitation qui est fonctionnant sur IDE, ainsi que regarder quelques-uns de la transition à partir de zéro à C leader jusqu'à en créer un problème. Alors sans plus tarder, dans un ensemble de problèmes, vous allez être présenter à CS50 IDE, qui cette programmation est basée sur le Web environnement que nous utilisons pour pour écrire des programmes. Il a été conçu pour ressembler très rappelle un ordinateur typique système exécutant une exploitation système appelé Linux. Mais il est dans le nuage que l'on appelle, ce qui signifie tout le monde dans la classe peut effectivement avoir son propre compte et l'utiliser, aussi bien. Ainsi, la plupart d'entre vous ont probablement jamais utilisé un environnement Linux avant ou peut-être même un environnement de ligne de commande. Et une ligne de commande environnement est différent. Tout est textuelle. Il est tous les commandes clavier. Et il n'y a pas de passage de la souris, pas d'icônes, pas de fenêtres de dialogue, pas de menus. Il est purement texte. Donc, au début, il genre de se sent comme une étape arrière en termes de sophistication. Mais il finit par être beaucoup plus puissant, certes, pour un chercheur en informatique, en fin de compte. Donc, nous allons jeter un coup d'oeil. Ici, je suis à CS50.io, par lequel vous pouvez vous connecter CS50 IDE. Et tout comme dans Scratch, il ya trois principaux domaines à cet écran. Donc, sur le côté gauche, nous avons ce sera le navigateur de fichiers. Et il ya ce dossier au dessus, qui est maintenant vide depuis que je me suis débarrassé de tous mes fichiers avant super-section. Et voilà où nous enregistrer des fichiers C que nous écrivons. En haut à droite, nous avons un endroit où tous notre code va se faire par écrit. Et en effet, si je clique cela en plus, cette va me laisser choisir de nouveaux fichiers. Et ici, je peux commencer à écrire du code C ou, vraiment, un certain nombre d'autres langues. Et puis au fond où il dit jharvard @ ide50-- et la vôtre sera dire quelque chose d'un peu different-- Quel était ce nom? Fenêtre de terminal. Oui. Ainsi, la fenêtre de terminal est la ligne dite de commande interface via laquelle vous pouvez interagir avec le système d'exploitation sous-jacent. Et pour l'instant, nous allons faire très peu utilisé this-- juste compiler, à regarder les messages d'erreur que nous voyons, et d'exécuter nos programmes. Mais finalement, nous allons de le faire beaucoup plus, aussi bien. Et vous pouvez même installer le logiciel et d'administrer votre espace de travail au sein CS50 IDE, ainsi. Mais plus sur cela une autre fois. Donc, nous allons aller de l'avant et à écrire un programme très simple juste de passer par une période d'échauffement de hello.c, qui est peut-être le programme le plus simple, nous pouvons écrire. Je l'ai déjà ouvert un nouvel onglet. Je vais aller de l'avant et dire inclure io.h. norme Puis int main (void). Et puis printf ("Bonjour, monde" n barre oblique inverse, près devis, fermer entre parenthèses, et point-virgule. D'accord. Alors maintenant, remarquez ma fenêtre est sans titre. Je suis donc très rapidement aller aller jusqu'à Fichier, Enregistrer. Et il est important que Je l'appelle pas «bonjour». Donc, une erreur très commune, surtout dans un ensemble de problèmes, est d'appeler accidentellement simplement votre programme "eau" ou "gourmand" ou "Mario" ou «crédit» ou similaire. Mais vous voulez vraiment faire vous que vous avez l'extension de fichier parce que tel est le seul moyen qui le compilateur et également l'éditeur de code sait que vous êtes effectivement l'écriture de code C. Alors laissez-moi aller de l'avant et cliquez sur Enregistrer. Et maintenant, aussi, ce que CS50 IDE a fait pour nous est il est aussi la coloration syntaxique tout. Donc ça fait tout très coloré. Et tout le but de qui est non fonctionnel. Il est juste de tirer mes yeux à la conceptuellement différentes pièces de ce programme. Donc, nous allons aller de l'avant et de compiler ce. Et je peux compiler ce dans un couple des manières. Et dans une semaine, la façon vieille école que nous avons fait il était littéralement à la «La hello.c clang." de commande Et puis je frappe sur Entrée. Et rien ne semble se passer dans la fenêtre de terminal. Mais qu'est-ce que le changement dans l'IDE? Où, encore une fois, IDE signifie simplement Environnement de développement intégré. Il est une façon élégante de dire ce développement intégré environnement pour le développement de logiciels. Donc, ce qui ne changera dans l'interface utilisateur? Qu'avez-vous remarqué qui est différent, Maria? MARIA: je remarquai quelque chose sous la IDE50 dossier ici. DAVID MALAN: Ouais. Donc, ici, non seulement avons-nous "hello.c." Nous avons aussi «a.out», qui est genre d'un nom stupide pour un programme. Mais en effet, il est le nom par défaut d'un programme lorsque vous venez de compiler votre code et ne pas dire au compilateur ce fichier à la sortie. Donc, si je veux courir, je besoin de dire la compiler-- ou plutôt, je dois dire l'espace de travail que je vouloir exécuter le programme appelé "a.out". Entrer. Et il ya "bonjour, monde. "Maintenant, le" ./ ". est réellement importante. Même si normalement nous ne écrire les noms des commandes, quand il est un programme que vous avez écrite, vous ne voulez dire "./" parce que dit explicitement Linux que vous souhaitez exécuter un programme appelé "a.out" qui est dans ce domaine, où les points signifie ce répertoire que je suis actuellement dans, qui se trouve être appelé espace de travail, "a.out. Parce que si je viens de dire "a.out," Entrez, Je vais obtenir "commande a.out pas trouvé "parce que le computer-- parce que je inventé "a.out;" il ne vient pas avec l'computer-- ne sait pas où chercher, même si elle est juste sous mon nez, pour ainsi dire. D'ACCORD. Donc, nous pourrions changer cela en être «clang -o bonjour hello.c." Et si je appuyez sur Entrée, ce programme est ce que cela va sortie pour moi? Quel est le nom du fichier? Ouais, dans le dos. C'est vrai. "Salut." Donc, "bonjour" va être le nom du programme parce que nous avons utilisé un soi-disant commande argument de la ligne, qui est juste une façon de changer le comportement des le compilateur à fait sortie un nom de fichier spécifique. Et en effet, si je zoome sortir et chercher ici, maintenant je dois non seulement «a.out» et "hello.c» mais aussi «bonjour," ainsi. Alors maintenant, je peux le faire "./hello," Entrez. Et il ya "Bonjour, monde." Mais cette lastly-- et sera désormais la convention on utilise tout au long de la semestre, typically-- est que vous pouvez aussi simplement dire «bonjour faire." Et en effet, il est dit qu'il est en place à ce jour, car il existe déjà. Permettez-moi aller de l'avant et à enlever, avec la commande rm, à la fois "a.out" - et dire "enlever a.out de fichier régulier?" Cela signifie tout simplement, êtes-vous sûr de vouloir supprimer? Je vais dire oui. Et puis, je vais retirer "bonjour" mais pas "hello.c." Je vais dire «oui» explicite, mais "y" est suffisante, aussi bien. Et maintenant remarquer si je tapez ls-- qui, rappelons, signifie films-- il répertorie tous des fichiers dans mon dossier. Et en effet, si je zoome sortir et chercher en haut à gauche, il confirme que ce qui est dans ce dossier, même si elle est étiqueté comme IDE50 ici et non l'espace de travail, il est juste "hello.c." Alors maintenant, ici-bas, si je ne «faire bonjour," Entrez, maintenant je vois une commande beaucoup plus longtemps, mais un commande plus sophistiquée qui va pour être utile dans les semaines à venir. Et maintenant, je peux dire "./hello." Prenons donc un tour rapide une autre commande Linux. Alors, pourquoi ne prenons-nous pas une étape arrière et effectivement regarder C plus généralement, la transition à partir de zéro à C, et ensuite conclure avec un regard au premier problème mettre en C. Tout droit. Donc, je vais aller de l'avant et juste propre mon espace de travail avec Control-L juste de garder l'écran propre. Mais cela n'a pas fonctionnelle un impact contraire. Rappelons que nous avons vu quelques commandes maintenant. Donc, nous avons vu clang, qui généralement vous ne devra pas exécuter manuellement plus. Nous allons plutôt utiliser make. Mais nous avons aussi vu ls, qui montre un liste des fichiers dans mon répertoire. Et maintenant, pourquoi est il ya deux there-- fichiers maintenant, "bonjour" et "hello.c." Pourquoi est-il une étoile ou un astérisque après «bonjour»? Qu'est-ce que cela signifie, en fonction sur ce que nous avons vu dans la première semaine? Qu'en pensez-vous? Qu'est-ce que l'étoile signifie? MARIA: pour-- le programme "bonjour"? DAVID MALAN: "Bonjour *". Oui. Oh yeah? Oh, exécutable. C'est vrai. Cela signifie donc que "bonjour" est exécutable. Donc, en effet, voilà pourquoi Je peux le faire "./hello." D'accord. Alors qu'est-ce que je peux faire ici? Eh bien, il se trouve que je peux créer également des annuaires. Alors laissez-moi aller de l'avant et de créer, par exemple, un répertoire «pset1". Et la spécification du problème posé vous fera faire exactement cela, de sorte que vous ne devez pas vous rappeler aujourd'hui. Mais "pset1 mkdir" semble avoir aucun impact. Mais encore une fois, aucun message d'erreur est généralement une bonne chose. Donc, si je tape "ls" maintenant-- ah, maintenant Je dois un fichier exécutable appelé "bonjour", un fichier appelé C "hello.c." Et puis le slash, ainsi parler, signifie que cela est un répertoire. Donc, en effet, maintenant je veux l'ouvrir. Et je ne double-cliquez pas sur elle comme dans une interface graphique, un environnement graphique. Je dis à la place "cd pset1." Entrer. Rien d'intéressant semble avoir arrivé sauf mon petit prompt ici-- ce est la manière de Linux de rappeler moi où je suis, si ce dossier est ouvert. Il vient de me dire explicitement par opposition à la forme graphique. Et si je tape "ls", pourquoi dois-je vois un autre incitez immédiatement, pensez-vous, quand je lister le contenu d'pset1? MARIA: Vous faites probablement pas avoir quelque chose là-dedans. DAVID MALAN: Ouais. Alors nous avons évidemment pas rien créé là parce que je viens de créer le répertoire. Maintenant, si je voulais créer un file-- pour Ainsi, je pourrais créer un nouveau fichier. Et puis, je pourrais aller à Enregistrer et enregistrer en tant que, comme, "mario.c" si vous faites l'édition standard de pset un. Et puis, comme tout Mac ou PC, simplement choisissez le dossier "pset1, Enregistrer. Et maintenant, le fichier est vide. Mais nous allons effectuer un zoom avant pour une deuxième. Faisons ls ici. Maintenant, nous voyons "mario.c". Donc, il ya quelques autres commandes qui valent gardant à l'esprit au cours time-- claire, ou Control-L est ce que je l'ai été frapper; mkdir nous avons vu; rm nous l'avons vu, ainsi, ce qui est pour l'enlèvement ou la suppression d'un fichier. Méfiez-vous, vous pouvez also-- et si vous regardez à des tutoriels en ligne, vous aurez rm -rf est un moyen très courant de dire supprimer un dossier qui a des choses en elle. Juste être super, super prudent. -rf signifie récursive supprimer quoi que ce soit vous essayez de supprimer et force le supprimer. Donc récursive moyens si elle est un dossier avec un dossier avec un dossier avec un dossier, supprimer tous. Et des moyens de force ne sont même pas me demander oui ou non, je suis sûr? Donc, il est un moyen super dangereux la suppression des tas de trucs rapidement. Mais ne beware-- trop souvent une intrépide étudiant accidentellement supprimer, par exemple, pset une, par exemple. MARIA: Et si ils ont juste -r faire, ils vont de les interroger sur chaque fichier. DAVID MALAN: Quel est modérément ennuyeux. MARIA: Ouais. DAVID MALAN: Voilà pourquoi beaucoup d'entre nous, l'auto inclus, suis dans l'habitude d'utiliser -rf. Mais il est dangereux. Donc, l'acheteur se méfier. Et puis mv est une sorte de intéressant nommé. Voilà donc la commande de mouvement, qui se sent un peu bizarre parce que vous pouvez en effet l'utiliser pour déplacer des fichiers d'un endroit à l'autre. Par exemple, supposons que je foiré. Supposons que je créé un nouveau fichier pour le pset. Et je l'ai enregistré comme "greedy.c." Mais supposons que je accidentellement enregistrer dans IDE50-- donc dans mon espace de travail lui-même et non dans pset1. Vous pouvez voir autant en haut à gauche. Il ya "greedy.c." Et il ya quelques solutions. Donc un, je peux utiliser le de manière conviviale super- de simplement glisser-déposer. Et ce serait en fait résoudre ce problème. Mais aujourd'hui, nous essayons de regarder moyens les plus obscurs mais puissants de le faire. Alors permettez-moi de prendre "ls" dans pset1. Et je ne vois que "mario.c." Permettez-moi aller de l'avant et de faire "cd ..". Alors CD est à nouveau changement de répertoire. «..» Signifie que, si? La dernière fois que je l'ai dit "cd pset1 "d'aller dans pset1. Donc, quand je dis "cd ..", ce que je fais? En arrière. Oui. Cela va donc au parent soi-disant. Remonter d'un niveau, comme sortant d'un dossier. Donc Entrée. Et en effet, regardez ce qu'il a fait. Il m'a touché juste en espace de travail à la place dans de pset1, qui se trouve dans l'espace de travail. Et maintenant, si je tape "ls", il ya tout un tas de trucs. Dans il est "greedy.c". Alors maintenant, laissez-moi utiliser mv littéralement déplacer "greedy.c" dans pset1. Et donc beaucoup de commandes Linux travailler exactement comme cela. Ils prennent aucun argument ou ils prennent un argument ou ils prennent deux ligne de commande arguments et ainsi de suite. Et dans ce cas, il est faire littéralement ce que dit-il, mais succinctly-- greedy.c déplacer dans pset1. Entrer. Rien ne semble se produire. Mais si je fais un ls nouveau, avide a disparu. Et si je le fais "cd pset1", Entrée, puis ls nouveau, maintenant il est au bon endroit. En aparté, si pour certains reason-- particulier si vous avez intermittente connectivité réseau ou vous promener le campus avec le couvercle de votre ordinateur portable fermé puis l'ouvrir encore et votre espace de travail semble un peu hors de synchronisation, pas une grosse affaire. Juste recharger votre navigateur fenêtre, et il devrait resynchronisation de sorte que la gauche navigateur de fichiers ressemble exactement comme la fenêtre du terminal. Ne pas s'inquiéter. En cas de doute, rechargez la page, de sorte Tant que vous avez enregistré les fichiers déjà. D'ACCORD. Donc mv peut également être utilisé pour renommer les fichiers. Et nous allons jeter un oeil à cette dernière commande ici. Donc suppose-- et cela est super-commune, aussi, dès le début. Certains étudiants l'occasion de créer un fichier appelé, disons say-- ce qui est un autre? Comme "WATER.C." Donc, je vais crier, pour aucune raison, dans tous les bouchons. Mais cela ne le nom correct pour le fichier si seulement parce que notre problème réglé spécification ne vous dit pas pour enregistrer le fichier en tant que tous les bouchons "WATER.C." Au lieu de cela, nous nous attendons "water.c" en minuscules. Et, de fait, ceci est problématique car check50, un programme que vous allez pour répondre au problème définir celui qui teste automatiquement la justesse de votre code va crier à vous si il ne peut pas trouver "water.c" en minuscules. Donc, je dois résoudre ce problème. Donc, beaucoup de différentes manières ce faire, le premier d'entre eux serait de contrôle-clic ou un clic droit le nom du fichier et il suffit de changer Renommer. Tout à fait bien de le faire. Mais encore une fois, aujourd'hui, nous allons faire un peu fantaisistes. Prenons mv pour changer "WATER.C" à "water.c." Ainsi, vous pouvez également utiliser le premier argument pour le renommer au second argument Si le second argument est pas, en fait, un dossier ou un nom de répertoire. D'accord. Et enfin, un peu trick-- donc je suis en mon répertoire d'espace de travail pour le moment. Si je veux entrer dans un jeu de processeurs, Je peux certainement taper "cd pset1." Mais il est si fastidieux de taper "pset1» ou plus les noms de fichiers ou des noms de répertoire encore. Donc, très souvent dans Linux, ce qui vous pouvez faire est de commencer à taper "PSE" et juste vous ennuyer, appuyez sur Tab, et laisser la figure de l'ordinateur il pour vous. Super utiles pour entrer dans cette habitude. Le seul hic est que si vous avez plusieurs fichiers ou dossiers à partir par la lettre "p" ou "ps", vous pourriez avoir de taper un peu plus avant la ordinateur sait quoi faire. MARIA: Nous aimons raccourcis. DAVID MALAN: Cette volonté vous faire économiser beaucoup de temps. Et aussi, comme nous le disions dans la leçon, vous peut défiler vers le haut dans l'histoire, de haut en bas, pour trouver récemment exécuté commandes, aussi bien. D'accord. Alors maintenant, nous allons tourner notre attention à un programme simple, bonjour monde. Donc, nous avons compilé ce exactement. Et maintenant, pourquoi ne prenons-nous pas un regard sur les types de données et ensuite la transition de certaines blocs de gratter correspondant à C. MARIA: Awesome. Alors maintenant que vous avez commencé écrire des programmes en C, nous allons commencer à parler sur les types de données et variables. Ainsi, certains types de données que vous voudrait savoir à partir de maintenant sont ceux qui sont surligné en bleu. Nous avons donc int première, qui signifie entier. Et qui détient entiers, comme vous pourrait avoir guessed-- donc 1, 2, 3, et tous les autres des nombres entiers que vous pouvez penser. DAVID MALAN: Et aussi négative. MARIA: Et aussi négatives, yep. Et 0. Ensuite, nous avons flotteurs, qui sont des nombres à virgule flottante. Voilà donc tous les nombres réels qui ont des points décimaux. Donc, 5.0, 5.2, et plus encore chiffres après la virgule, ainsi, ainsi que les effets négatifs. Ensuite, nous avons l'omble qui est un caractère. Donc je pense que nous avons parlé ceci en conférence d'aujourd'hui. Mais nous avons des lettres, pour example-- A, B, C-- qui peut être stocké sous forme de char. Mais ensuite, nous avons beaucoup plus de symboles qui peut être stocké comme un caractère. Et ceux qui sont stockés au format ASCII. Et puis nous avons bool, Quelles sont les booléens. Et ceux évaluée à true ou Faux ou 1 et 0, respectivement. DAVID MALAN: Et rappelez-vous que bool provient de la bibliothèque de CS50. Donc, il est pas intégré C, mais il est super utile d'avoir la notion du vrai et du faux. Et même si vous pourrait think-- fait amusant. Un bool techniquement besoin combien de bits, vraiment, pour représenter Vrai Faux rapport? Combien de bits pensez-vous vous auriez besoin, au maximum? Oui, un seul. Donc, il se trouve que C ne peut pas vous donner juste un peu. La plus petite unité de mesure vous pouvez obtenir est de huit. Donc, il est un peu inutile qu'ils vous sont l'aide d'un octet entier, ou huit bits, pour représenter Vrai ou Faux. Mais cela est juste la façon dont il est implémenté en C par la bibliothèque CS50. MARIA: Et puis ceux qui nous sommes ne vais pas parler aussi largement droit maintenant-- double, voilà pour les plus gros flotteurs. Long long et court sont également des entiers. DAVID MALAN: En effet. En édition pirate de pset un, nous utilisons en fait un long long. Mais pour l'édition standard, il ne devrait pas être nécessaire. MARIA: Cool. D'ACCORD. Donc, vous devriez être operators-- probablement familier avec la plupart de ces. Addition, +; soustraction, -. Pour la multiplication, nous avons le *. Donc, pas le X que nous utilisons habituellement. Division, nous avons la barre oblique inverse. Et modulo est notre dernier opérateur nous allons parler maintenant. Il est un opérateur qui nous permet de prendre le reste d'une division. Donc, si nous avons 4% 2, 4 divisé 2 est par deux avec un reste de 0. Donc 4% 2 est 0. 4% 3 est une. 4% 5 est 4, comme vous pourriez avoir deviné. Et rappelez-vous lorsque vous utilisez tous ces aux opérateurs d'utiliser les règles PEMDAS. DAVID MALAN: Donc pour être clair, si vous faire 4% 2, pourquoi est-ce que 0, exactement? MARIA: Parce que divisé par 4 La figure 2 est un reste 2 avec de 0. Donc modulo nous donne que reste que plutôt que le résultat de la division. DAVID MALAN: Et en effet, ce que nous allons trouver cela utile pour est que, dans certains problèmes ce est pas nécessairement une, si vous voulez avoir le effet de restreindre vous pour une plage de numéros comme 0 à quelque chose, vous pouvez utiliser modulo pour envelopper plus tôt que comme les 2 milliards ou la valeur de 4 milliards que nous avons parlé dans la leçon. MARIA: Ouais. Et même dans les "gourmands" nous pourrions. DAVID MALAN: Oui, problème réglé un, aussi. MARIA: Ouais, agréable. DAVID MALAN: Bon soupçon. MARIA: Désolé. Boolean expressions-- sorte pour les opérateurs booléens, nous allons parler de tout de ces que vous voyez ici. Donc maintenant, nous avons deux signes d'égalité inscrites à la égaux. Donc, ce sont des fins de comparaison. Jusqu'à présent, nous avons seulement vu un signe égal. Voilà où nous assignons une valeur à une variable. Donc, si nous avons vu int n = 5, puis nous avons attribué 5 à la variable n. Mais si nous voulons utiliser == pour comparaison, nous pouvons vérifier si n == 5. Et si n == 5, alors cela est vrai. Opérateurs booléens Donc, nous permettra, au fond, à évaluer booléenne expressions à vrai ou faux. Donc pas equals-- nous avons la point d'exclamation et égaux. Donc, nous pourrions aussi vérifier si n ne égale 5-- si n! = 5. Moins de moins de ou égal à, supérieur à, supérieur ou égal à, puis nous avons la logique ET et le OU logique. Et ceux qui nous permettent d'évaluer multiples expressions booléennes ensemble à venir essentiellement ensemble comme ensemble d'une expression booléenne. Donc, si nous voulons trouver un certain nombre, dire, qui est supérieure à 5 mais inférieure à 15 dans le même temps, nous devrions utiliser la opérateur logique ET pour voir si n est supérieure à 5 && n inférieur à 15. DAVID MALAN: Et ici, aussi, il est vraiment facile tôt accidentellement il suffit d'utiliser un seul esperluette ou d'une seule barre verticale. Et nous espérons que le compilateur crier à vous, car ils réellement avoir un sens très différent. Pour ceux qui sont curieux, ils sont utilisé pour les opérations au niveau du bit, fonctionnant sur des bits individuels. Mais vous ne voulez la paire d'entre eux ici. Et super important est que première, le signe égal, qui est l'opérateur d'égalité que contrairement à l'opérateur d'affectation. MARIA: Et la barre verticale est situé entre la suppression et retour. DAVID MALAN: Oui. Sur un clavier typique États-Unis. MARIA: Yep. Donc, nous allons sauter à droite dans instructions conditionnelles. Dans Scratch, vous avez déjà vu, sans doute, si les états qui vous permettent de vérifier si quelque chose est vrai, alors Fais autre chose. Donc, vous aurait voulu pour vérifier si votre sprite est toucher une autre sprite ou de la frontière de votre écran. Et alors vous pourriez avoir voulu terminer le jeu ou faire autre chose. Donc, la syntaxe pour que est "if (condition)." Donc, si votre sprite est en contact avec quelque chose, puis faire est à l'intérieur des accolades. Ensuite, nous avons les déclarations if-else. Permet Else nous fassions quelque chose si la condition que nous vérifier dans le début est pas vrai. Donc, si le sprite est de toucher le frontière ce faire, d'autre faire quelque chose d'autre. Donc contraire faire autre chose. Ensuite, nous avons un petit exemple pour ceci. Donc, si (military_time <12), nous vouloir printf "Bonjour!" Sinon nous allons printf "Bonsoir!" Exemple de base. DAVID MALAN: Bon. MARIA: Cool. Alors maintenant, nous avons les déclarations switch. Mettez déclarations en général peut nous permettent de faire beaucoup de la même chose que nous venons de parler à propos avec des instructions if. Par exemple, en ce moment nous avons la forme générale de l'instruction switch qui nous permet de prendre une variable appelée n et le comparer à un grand nombre de des valeurs différentes, qui ici nous ont appelé constante1, constante2. Nous pouvons avoir beaucoup plus. Et ceux qui sont appelés cas. Donc, si nous avons un interrupteur Et cela fonctionne déclarer: seulement pour integers-- nous avons une variable dans ce cas qui est n. Si la variable n est égal à égale à Constant1, nous exécutera un certain bout de code ou quelque chose que nous voulons faire. Et puis nous briser. Donc la pause signifie que l'instruction switch va arrêter l'exécution si n est égal à Constant1, puis votre programme va se poursuivre. Il va sortir de la passer déclaration et il va continuer à faire autre chose. Toutefois, si n ne correspond pas à constante1, puis cas pour constante2 seront vérifiés. Donc, si n est égal à constante2, cet autre extrait de code sera exécuté. Et puis, il va briser si tel est égal. Et alors nous pouvons avoir also-- pas nécessairement, though-- un cas de défaut, ce qui va se passer si n ne correspond pas à aucun des cas que vous avez énumérés. Et dans le cas de défaut, nous avons aussi ne pas nécessairement besoin d'une pause parce que l'instruction switch saura dont il a besoin pour mettre fin à la valeur par défaut après cas si tel est le cas. DAVID MALAN: Mais stylistiquement, Nous avons toujours mis là-dedans. MARIA: Ouais. DAVID MALAN: Ouais. Donc, surtout au départ, surtout si parmi ceux de moins confortable, je serais personnellement simplement recommander coller avec les ifs et IFS-elses et si-else-if-elses et ainsi de suite si seulement parce qu'ils sont un peu plus simple. Ceci est une belle optimisation, ou parfois même esthétiquement il rend le code plus lisible. Et en fait, probablement mi-semestre, nous allons voir un problème définir où il semble juste mieux et plus facile à lire pour les humains en utilisant une instruction switch. Mais ne vous inquiétez pas accroché à ce trop tôt. MARIA: Ouais. Si vous avez beaucoup d'if, il pourrait bien ne pas être très lisible. Il pourrait ne pas être très rapide pour vous d'aller à travers elle. Donc passer déclarations peuvent être très utile, aussi bien. Et aussi, ne pas faire pas remember-- oublier de mettre les pauses là. DAVID MALAN: Ne rappelez-vous ceci. MARIA: Parce que vous pourriez tomber travers d'un cas à l'autre. Donc, disons que ce cas constante1 n'a pas eu une instruction break en elle. Ensuite, nous pourrions tomber dans l'intérieur du boîtier constante2. Et nous ne voulons pas le faire si nous avons déjà atteint cas constante1 et il est égal à n. Ainsi, par exemple, si nous avons une variable n qui contient un numéro de classe, et nous voulons voir ce que classe est-- si n est égal à 50, nous allons imprimer "CS50 est Introduction à l'informatique I. " Ensuite, nous allons faire une pause. Et c'est tout. Toutefois, si n est égal à 51, nous allons d'imprimer "CS51 est Présentation à l'informatique II. " Alors, encore une fois, nous allons faire une pause. Toutefois, si nous mettre 124, 61, toute autre numéro que vous pourriez penser, ou le programme ne va pas de reconnaître que. Donc, il va dire: «Désolé, je suis pas familier avec cette classe ". Et il va se casser. DAVID MALAN: Donc vous pouvez vraiment voir la si, d'autre si, idée d'autre ici. Il est juste différent de la syntaxe exprimer la même idée exacte. MARIA: Exactement. Maintenant, nous avons nos opérateurs ternaires. Donc opérateurs ternaires ont trois parts-- une condition, quelque chose à faire si cette condition est vrai, et puis quelque chose à faire si cette condition est fausse. Donc, vous voyez, au fond, la syntaxe de cela ici. Nous avons le point d'interrogation, et puis the-- appelons-nous cela? DAVID MALAN: Le côlon. MARIA: Colon. Je vous remercie. Pardon. Alors regardons notre exemple à voir si nous pouvons donner un sens this-- class_num == 50. Donc, ici, nous voyons notre opérateur booléen == qui compare la variable de class_num 50. Donc magasins class_num un entières. Et si cet entier 50 égaux, alors nous sommes allez stocker "David Malan" à l'intérieur du professeur de chaîne. Si le numéro de classe n'a pas égal à 50, "pas David Malan" va être le professeur. DAVID MALAN: Je vous remercie. Et si cela semble équivalent à ce qui, diriez-vous, à première vue? MARIA: Il me semble comme si-else. DAVID MALAN: Ouais. Et en fait, cela est une sorte d'une jolie un revêtement, pour ainsi dire, la mise en œuvre exactement la logique de si-else mais tout faire en une seule étape. MARIA: Exactement. Oui. Donc, si les états d'autre pourrait- prendre beaucoup d'espace. Ils pourraient être trop long pour quelque chose d'aussi simple que cela. Donc, cela peut être très succincte et très agréable. Alors maintenant, nous allons en regardant l'exécution de quelque chose encore et encore, afin de vérifier pour un conditionner plusieurs fois puis en continuant à faire quelque chose tandis que la condition est vraie. Cela nous amène bien dans les boucles de temps. Pour la gauche, nous avons notre première boucle while. Ainsi, alors que quelque chose est vrai, faire encore et encore quelque chose. Donc, assurez-vous de remarquer que notre état ici est validé au sommet. Considérant que, avec notre deuxième loop-- nous appelons qu'un do-while loop-- nous faisons quelque chose, puis nous vérifions pour une condition. Et si cette condition continue à être vrai, nous allons revenir et faire la chose de nouveau. Donc, la principale différence est là la condition est vérifiée. Et le code ne peut jamais être exécutée si la condition est pas vrai avec la boucle while. Alors qu'avec le do-tout boucle, nous avons le code qui est toujours exécutée au moins une fois. Et puis, alors que la condition continue à être vrai, nous pouvons revenir en arrière et itérer nouveau à l'intérieur. Alors, pourquoi pensez-vous que nous devrions utiliser un do-while boucle sur une boucle while? Exact. Donc, si nous voulons inciter le utilisateur pour une sorte de saisie, si nous voulons leur demander entrer leur nom, nous voulons au moins leur demander une fois. Et si elles ne pénètrent ce nom, nous ne sommes pas vais leur demander à nouveau parce que nous savons déjà. Mais si elles ne pénètrent pas leur nom, ou si elles saisir quelque chose qui est évidemment pas un nom, nous voulons toujours continuer leur demandant sur leur nom. DAVID MALAN: Et dans la leçon, nous avons eu un comme ça avec l'int positif obtenir par exemple, où il n'y a rien à vérifiez d'abord parce que vous avez même pas obtenu un int. Donc, nous voulons faire this-- obtenir un int de la user-- puis vérifier, peut-être, Encore et encore et encore. MARIA: Exactement. Pour loops-- OK. Pour les boucles peuvent nous permettre de faire presque exactement la même chose, aussi. Il est en fait exactement la même chose. Donc, il n'y a rien que vous pouvez faire avec des boucles que vous ne seriez pas capable à faire avec des boucles de temps. Mais pour les boucles peut sembler un peu peu plus compliqué syntaxiquement parce qu'ils ont trois pièces à l'intérieur ce qui était avant tout le état avec des boucles de temps. Ainsi, la première partie que vous la mer, la plus à gauche, nous avons «int nains = 0." Donc voilà où nous initialiser notre variable. Ensuite, nous avons un point-virgule et "nains <7." Donc, cela est où sur condition est effectivement. Voilà donc ce que nous aurions mettre tout dans le tout loop-- », tandis que les nains <7." Ici, cela va dans le milieu de notre boucle. Donc "dwaves <7." Et puis notre dernière partie est "nains ++," qui est où nous mettons à jour notre variable. Donc, la chose importante à réaliser est que cette va passer par cette boucle sept fois et exécuter sept fois. Donc, nous avons sept nains, et ils sont tous allez dire, "Je suis ici pour vous aider, Blanche-Neige " parce qu'ils sont prêts pour aider Blanche-Neige. Avec boucles while, nous l'aurions fait l'initialisation et la mise à jour pas à l'intérieur de la condition, de plus, mais soit avant, soit à l'intérieur de la boucle while veiller à ce que parce nous-- nous avons toujours besoin de ces pièces. Donc, pour nous assurer que nous avons eux, nous aurions encore les ajoutée sur, mais pas à l'intérieur des parenthèses. DAVID MALAN: Et donc il semble like-- à la lecture, par exemple, Je suis presque toujours utiliser, comme, i et n et les variables assez ennuyeux. Il semble que vous pouvez utiliser plus astucieusement nommé les variables, aussi. MARIA: Ouais, il est vraiment très sympa d'utiliser des variables un peu plus descriptives parce surtout si quelqu'un d'autre est la lecture de votre code-- peut-être vous êtes niveleuse ou si vous êtes en collaborant avec quelqu'un-- vous voulez vous assurer qu'ils comprenez ce que vous faites. D'ACCORD. Donc ceci est quelque chose de très funky-- pour boucle à l'intérieur d'une boucle for. Je ne sais pas si nous avons vu cela avant. Probablement pas. Mais nous pouvons effectivement avoir this-- afin boucles au lieu de boucles. Donc ce que quelqu'un veut marcher peut-être moi à travers ce qui se passe ici? DAVID MALAN: Je vais prendre un coup de poignard. MARIA: Cool. DAVID MALAN: OK. Donc, spoiler-- nous voulons imprimer la substance qui est dans le coin en bas à droite Là. MARIA: Droit. Ouais ouais. DAVID MALAN: Alors que nous venons de mettre cet échantillon sortie il. Donc, je peux déduire de la supérieure boucle qui vous êtes itérer sur les lignes boucle la plus externe, pour ainsi dire. Et vous itérer colonnes avec la boucle interne. Et intuitivement, ce devraient rend espérons sens parce que, par nature de tous les programmes que nous avons vu avant, printf, qui est le fonction que nous utilisons, en fin de compte, a la capacité d'imprimer des trucs out essentiellement ligne par ligne. Comme, une fois que vous avez délivrées une nouvelle ligne, il est pas de doubler le dos et l'impression de quelque chose plus élevé dans l'écran, au moins ne pas utiliser printf comme ça. Et à cet égard, il fait sens que la boucle la plus externe devrait se référer aux rangées parce que pour chaque rangée donnée, vous allez vouloir imprimer XXXXX, puis passer à la ligne suivante, XXXXX. Donc rangées viennent en premier. Et puis, au sein de chaque rangée, vous imprimez colonnes. Si vous avez essayé de faire la contraire, il ne serait probablement pas sortir comme vous avez l'intention. MARIA: Ouais. Nous ne pouvions pas revenir à la rangée précédente avec printf. DAVID MALAN: Et ce qui est intéressant par la discussion d'aujourd'hui sur la portée, en fait, est que la ligne est un int qui est déclaré dans la boucle supérieure. Mais remarquez qu'il est encore intérieur de, pour ainsi dire, les accolades que suivre immédiatement, même si elle est techniquement pas au sein de ces accolades. Donc rangée est dans la portée de la totalité de l'extrait de code, tant à l'intérieur de l'extérieur pour la boucle et à l'intérieur de la boucle interne pour. Mais en revanche, où est la colonne de portée? La colonne de la variable? Oui, seulement dans la boucle à l'intérieur. Et cela est OK parce que nous ne consultons pas les à l'extérieur de ses accolades. Tout ce que nous faisons est d'imprimer une nouvelle ligne à la fin il. Alors qu'en fait est OK. Donc, cela a pour effet, il semble que, de faire en trois rangées et quatre colonnes. MARIA: Droit. Alors d'abord nous allons à travers notre première rangée. Et juste dans notre première ligne, nous faisons le quatre colonnes à l'intérieur de la première rangée. Donc, nous imprimons sur quatre x. Et puis nous pouvons sortir de la boucle, puisque nous avons déjà imprimé quatre x. Et nous imprimons une nouvelle ligne. Et puis nous passons par le même processus pour deux autres lignes pour faire un total de trois. DAVID MALAN: Et il est à noter qu'il est juste un artefact de la police de caractères, le fait que la sortie de l'échantillon semble tellement plus grand, comme si il ya plus lignes que de colonnes. Mais il est juste parce que le X est plus grand que large. Voilà tout ce qui se passe là-bas, plus l'espace blanc entre les lignes. MARIA: Droit. Bien. DAVID MALAN: Très bien. Ainsi, un rapide coup d'oeil au problème posé un, répondre à vos questions, et ensuite lever la séance? D'accord. Donc, en un problème réglé, il ya trois principaux défis, en fin de compte. Mais d'abord, vous trouverez que le problème réglé spécification, comme beaucoup le psets cet automne, va vous guider à travers quelques exercices d'échauffement, vous signaler quelques ressources que vous pouvez ou ne l'ont pas déjà vu. Par exemple, CS50 dispose d'une suite de courts métrages, qui sont de courtes vidéos, pas à la différence, mais que sont très specific-- sujet peut-être cinq minutes, 10 minutes de longueur sur des boucles ou des conditions ou des algorithmes ou plus tard des sujets avancés, ainsi. Et nous intégrons généralement ceux dans le problème ensembles afin que les étudiants disposer d'une ressource à laquelle à revoir le matériel qui pourrait avoir déjà venu en conférence ou section. Mais cette façon, il est plus ciblée et plus à leur portée. Nous avons également tendance à intégrer dans le problème définit choses appelées soluces. Donc, presque tous les exemples que je fais en conférence, sur scène ici, nous avons aussi ont tourné sur caméra dans avancer un plus lent, une soluce plus intime par moi sur mon ordinateur portable de ce code, ligne par ligne de sorte que dans la classe, nous allons souvent parcourir quelque chose ou quelqu'un va intervenir avec un répondre à une question. Mais il ne coule pas nécessairement en pour tout le monde dans le public. Donc, vous trouverez le code soluces pour la plupart des exemples ce que nous faisons ici au cours de sorte que vous peut marcher à travers elle à votre propre rythme et rembobiner ou avancer rapidement ou ignorer tout à fait, si vous le souhaitez. Il ya souvent quelques-uns des questions d'échauffement que vous demander de trier des renforcer ce matériel et assurez-vous que vous êtes confortable avant vous continuez avec le reste de la pset. Et puis, bien sûr, il ya le pset lui-même. Et l'une des choses nous avons délibérément faire dans CS50 est presque chaque inintéressante ou intellectuellement inintéressante étape mécanique que vous pourriez avoir à faire est presque toujours très bien documenté. Au cours de la période, nous allons commencer à poser des questions plus rhétoriques comme se rappeler comment faire ceci ou cela? Mais généralement, vous trouverez que les ensembles de problème que vous rencontrez par la mécanique de quelque chose pour que les défis intellectuels, intéressants sont finalement gauche pour vous l'étudiant. Cela dit, Zamyla, à qui nous cesse allusion aujourd'hui dans la leçon, est l'un de nos employés de longue date membre qui détient également soluces sur les problèmes de pset spécifiques comme mario et gourmand, mais pas l'eau cette année. Et il est dans ceux soluces qu'elle souvent offre quelques trucs et astuces pour la façon de procéder, ne jamais vous dire exactement quoi faire, mais rather-- comme une condition, si vous will-- vous donnant au moins un quelques idées de sorte qu'il est à vous, finalement, de décider comment les aborder. MARIA: comme une sorte de haut niveau la compréhension de la logique de ce que nous vous demandons de le faire. DAVID MALAN: Exactement. Et, de fait, de Zamyla soluces sont destinés pour répondre à la Foire question posée où ai-je commencé, surtout quand ces spécifications sont longues un peu intimidant donné tout le texte et l'imagerie qu'ils ont en eux. Donc water.c, vous trouverez après que vous l'avez terminée, est en fait relativement simple. Absolument sont un tas vous allez frapper vos têtes contre le mur en essayant de comprendre pourquoi il ne la compilation ou pourquoi ça ne fonctionne pas correctement. Mais une fois que vous avez terminé avec elle et une fois que vous avez passé quelque temps aux prises avec toute les bugs que vous pourriez avoir, vous trouverez qu'il est un programme très court. Il peut être fait en quelques-unes lignes de code, dont la plupart nous avons vu ici dans la leçon déjà, si vous assemblez les blocs de construction de droite. Et comme nous le suggérons ici, il va demander à de spécifier combien de minutes quelqu'un prend une douche sur le campus. Nous spécifions dans le problème régler le débit de l'eau dans, comme, d'une douche à faible débit la tête, un peu comme le clip Seinfeld nous avons vu hier ou à l'opposé de celui-ci. Et puis vous avez juste pour faire un peu de maths, really-- arithmétique utilisant C à dire nous combien, environ, des bouteilles d'eau est équivalent à ce que si nous sommes prendre une douche n-minute. Maintenant, dans mario.c, cela va un programme pour être légèrement plus long. Il est encore ne va pas être si longtemps. Juste quelques lignes de plus de water.c. Mais ça va être l'occasion pour recréer l'ancienne école Mario pyramide de Super Mario Frères ou quelque suivi. Il ne va pas à regarder comme plus jolie ou aussi coloré que celui-là. Nous allons simplement utiliser petits hashtags comme nous avons ici sur l'écran en utilisant du texte ASCII. Mais il faudra se rapprocher de la même idée. Et ça va être un exercer qu'à première vue semble assez juste simple-- imprimer une pyramide simple. Mais il ya quelques caractéristiques ici que sont intéressantes. Notez que le bord le plus à droite de la pyramide a en fait deux largeur. Donc, il ya deux égale colonnes de hauteur, ce qui rend nécessite un peu peu de réflexion à faire que vous obtenez exactement ce que le droit, en tant opposition à juste un angle parfait ligne. Voilà donc un peu un cas de coin mais correspond au jeu réel. Et il est aussi non-évident à première coup d'œil comment imprimer l'espace blanc. Alors, quand je regarde le Exemple de sortie ici-- et il est aussi dans le spec-- il ressemble un peu à un rectangle, mais une diagonale de la rectangle a été coupée, et il est juste espaces blancs, pour ainsi dire. Et donc un fréquemment posées question ici est toujours, bien, comment puis-je déplacer les hashtags vers la droite? Ou comment puis-je imprimer les espaces vides? Et il est effectivement plus facile que la plupart des étudiants pensent. Exact? Vous pouvez rapprocher visuellement d'un peu frapper la barre d'espace une ou deux fois ou trois fois. Et même si nous avons presque avec printf toujours imprimer une chaîne ou un int ou un mot comme «bonjour, monde »ou une série de mots, Vous pouvez aussi imprimer devis, l'espace, fin de citation. Et ce sera effectivement donner vous un espace blanc il. Donc, gardez cela à l'esprit et ne overthink cela. Vous avez vraiment de décider rangée par rangée par rangée, pas contrairement à votre exemple, un moment où il ya, combien de ceux colonnes doivent être des espaces blancs et combien d'entre eux devrait être hashtags. Il faudra un peu de temps, mais il est finalement un jeu de logique de toutes sortes. MARIA: Ouais. Mais la logique de la ligne passe par ligne va être très utile ici. DAVID MALAN: Ouais. Je pense que l'exemple de code vous même gave-- si elle n'a pas un programme complet. Vous avez encore besoin int et principale et stdio.h vide et #include, beaucoup de trucs de conférence. Mais les blocs de construction semblent être là. Et puis est enfin quelque chose un peu plus algorithmique. Donc, il se trouve que chaque fois que vous aller dans le CVS ou tout dépanneur et quelqu'un vous tend au factures de caisse ou des pièces de monnaie que le changement, il se trouve que ils, les humains, si oui ou non ils le savent ou non, sont probablement en utilisant ce qui est appelé un algorithme glouton, laquelle, si l'on vous doit, disons, 21 $ dans le changement car pour une raison vous avez acheté quelque chose de très bon marché avec une très grosse facture au CVS, il serait vraiment ennuyeux si le caissier vous a donné 21 célibataires ou, pire encore, tout un tas de pièces de monnaie. Plutôt, ce qu'une personne raisonnable est va probablement faire est qu'ils vont pour prendre un 20 $, puis une lettre de 1 $, et vous remettre seulement deux projets de loi dans ce cas. MARIA: Alors qu'ils cherchent à minimiser le changement qu'ils donnent de nouveau à vous. DAVID MALAN: Exactement. Et même beaucoup de pièces de monnaie, ainsi. Si vous deviez, disons, 0,50 $, nous espérons que vous ne voulez pas 50 centimes. Vous voulez au lieu de deux quarts, par exemple. Maintenant, cela ne suppose que le caissier a assez de toute dénomination qui il ou elle pourrait vouloir vous donner. Mais nous ne vous permettons de assumez autant dans le problème. Et l'objectif, à terme, est de mettre en œuvre dans le code C un algorithme glouton. Ainsi, l'utilisateur est autorisé à taper dans combien changer il ou elle est due avec des dollars et en cents, une sorte de virgule flottante valeur probablement. Et puis vous avez à faire le calcul et comprendre algorithmique, ainsi, le nombre de pièces que je peux donner vous minimalement pour vous donner exactement ce montant de changement. Mais il va y avoir une quelques passages délicats ici, non? Comme il ya toute la question de l'imprécision. MARIA: Exactement. Donc, point de flottement Les valeurs ont imprécision. Avons-nous en parlons en conférence d'aujourd'hui? DAVID MALAN: nous avons fait la dernière fois en conférence. Nous avons parlé de l'imprécision. Et vous ne voulez pas de tricher l'utilisateur de la façon dont beaucoup de changement, il ou elle est due. Et donc la procédure pas à pas, dans la spécification du problème posé, réfléchir, en fin de compte, à comment vous pouvez atténuer ces imprécision erreurs, potentiellement. Il est évitable, certainement, pour les données que nous parlons. Et, de fait, pennies-- peut-être nous en remettons aux Zamyla, Je pense que, pour les trucs là. En fin de compte, vous trouverez une progression des problèmes cette semaine, le premier de ce qui est assez petite, puis moyen, puis un peu plus grand. Mais chacun d'eux utiliser le bâtiment pâtés de maisons de la semaine dernière, à partir de cette super-section, problème posé spécification vous met à d'innombrables ressources. Mais encore, voire pas du tout mal, surtout parmi ceux moins à l'aise sans fond préalable, venir à des heures de bureau le lundi et le mardi et Mercredi et jeudi. Accédez au CS50 Discutez via le site Web de la formation, via laquelle vous pouvez chatter avec le personnel et ses camarades de classe. Mais finalement, je pense que le meilleur conseil est tout simplement commencer tôt. Il est pas le genre de la classe que vous devrait être à partir psets mercredi la nuit, ou pire jeudi soir. MARIA: Mon meilleur conseil est avoir commencé lundi. DAVID MALAN: lundi. Donc, si vous ne l'avez pas commencé already-- pas. Mais même si pas lundi, puis mardi. Le plus tôt sera le mieux. Et qui est la raison de la cours a tant de jours de retard est pour vous donner un peu de pression psychologique à commencer plus tôt mais toujours laisser les choses se détériorer lorsque les choses prennent plus de temps que vous attendez. MARIA: Et vous voulez faire usage de les heures de bureau autant que vous le pouvez, aussi. DAVID MALAN: Des questions? D'accord. Eh bien, pourquoi ne nous levions pas ici?