[Powered by Google Translate] DAVID J. MALAN: Très bien.
C'est CS50, et c'est la fin de la deuxième semaine.
Si vous vous attendez à avoir faim autour de la même heure demain, sachez que nous allons
de convoquer un petit groupe demain, jeudi, 1:15 PM.
Il ya cette URL ici si vous voulez confirmer votre présence.
Les places sont limitées, donc s'il vous plaît pardonnez si le formulaire a remplir par le temps que vous
remplir ce formulaire.
Un autre URL que cela puisse être d'intérêt est la suivante.
>> Donc, dans à peu près un mois, le cours va être mis à la disposition
d'autant plus largement par EDX, par lequel les gens sur l'Internet sera
en mesure de suivre, d'engager dans le cadre très activement, en fait.
Ils vont utiliser l'appareil CS50 CS50 et Discuter et la plupart des
différents outils logiciels que nous avons déjà eu recours à ce semestre.
Et l'une des initiatives que nous aimerions prendre comme une expérience cette année
est de voir à quel point le contenu que nous pouvons traduire dans d'autres parlée et
langues écrites.
Donc, si vous pouvez avoir un intérêt à participer à ce projet, lequel
nous allons fournir des transcriptions anglaises et sous-titres pour le cours de
des conférences et des séminaires et des shorts et des sections et autres -
si vous parlez couramment ou écrire couramment une autre langue, nous le ferions
l'amour de vous engager dans ce projet, par lequel vous prenez l'un ou plusieurs des
vidéos, de les traduire dans une langue que vous connaissez très bien.
Pour vous donner une idée de l'interface, il ya cette interface utilisateur basée sur le Web
que nous allons utiliser qui permettra de créer une interface utilisateur pour l'essentiel comme ça.
Cette m'apprenait quelque Halloween auparavant.
Et sur le côté droit, il en noir à côté de ces horodateurs,
vous verrez les différentes choses qui sortaient de ma bouche ce jour-là.
Et puis, au-dessous, vous serez en mesure de traduire dans une autre langue.
Exactement ce que la cartographie est entre les deux, dans ce cas, Anglais
et, disons, espagnol.
Donc, c'est en fait un très convivial outil.
Vous pouvez revenir en arrière et avance rapide très facilement avec les raccourcis clavier.
Donc, si vous souhaitez prendre part à cette expérience et avoir vos mots
vu et lu par potentiellement des milliers de gens là-bas, s'il vous plaît ne me sens
libre de participer.
>> Maintenant, un mot sur le chaton du lundi, de peur que nous avons envoyé un trop
un message effrayant.
Nous rendons compte que les heures de bureau et suggèrent que les articles suggèrent, l'
conception du cours est très bien d'avoir des élèves collaborent et
parler à travailler par le biais ensembles de problèmes et les problèmes ensemble.
Et vraiment la ligne est juste en bas, encore une fois, en fin de compte le travail que vous
doivent soumettre doit être la vôtre.
Et c'est donc, en toute honnêteté - dans les heures de bureau, il est tout à fait normal -
il est tout à fait à prévoir, même - à discuter avec certains
amis à côté de vous.
Si il ou elle est aux prises avec un sujet, et vous êtes comme, oh, eh bien laissez-
moi de vous donner un aperçu de certaines ligne de code que j'ai écrit.
C'est très bien.
Ce qui se passe.
Et c'est très propice, je pense, avec le processus d'apprentissage.
Lorsque la ligne, encore une fois, se sont croisés lorsque la tête est en quelque sorte incliné sur
ici pendant quelques secondes ou beaucoup trop de minutes pour que vraiment avoir juste
été l'occasion de déblocage pour votre ami.
Et bien sûr, quand les choses deviennent échangées via e-mail et Dropbox et
similaires, il ya trop de la ligne.
Ainsi, par tous les moyens, à l'aise et se sentent encouragés à discuter avec des amis
et camarades de classe sur des psets et plus encore.
Et juste réaliser que ce que vous avez finalement soumettre devrait vraiment être l'
produit de votre création et non pas quelqu'un d'autre.
>> Ainsi, dans la même veine de créatures en peluche, vous pourriez
connais ce gars là.
C'est donc un film terriblement ringard il ya des années.
N'importe qui ici vu Spaceballs?
Très bien.
Ainsi, un bon nombre ici.
Donc, c'est notre façon merveilleusement académique de présenter aujourd'hui en fin de compte
la notion de cryptographie.
Et si l'un des problèmes spécifiques à un domaine pour pset 2, qui viendra
demain soir tard, est de plonger dans le monde de la cryptographie, qui
est l'art de crypter ou brouiller l'information.
Et cela concerne en fin de compte dans le monde de la sécurité.
>> Maintenant sécurité le plus pour nous, se présente sous la forme de mécanismes assez banales.
Nous avons tous des noms d'utilisateur et mots de passe.
Et nous avons tous des noms d'utilisateur et mots de passe très mauvais, le plus probable.
Si votre mot de passe est le même sur plusieurs sites Web, ce n'est probablement pas
la meilleure idée, comme nous le verrons vers la fin du semestre.
Si votre mot de passe est écrit sur une note collante - sans blague - sur votre
moniteur, qui n'est pas non plus forcément la meilleure conception, mais tout à fait un commun
phénomène.
Et si vous n'êtes pas en utilisant la cryptographie pour chiffrer vos mots de passe, ils sont
particulièrement vulnérables.
Donc, si vous pensez que vous être super intelligent en ayant un mot caché
documenter quelque part sur votre disque dur qui contient tous vos mots de passe, mais
c'est dans un dossier que personne ne va regarder dans, qui n'est pas non plus une très
Mécanisme sécurisé.
Et qu'est-ce pset 2 va présenter cet art de la cryptographie et
brouiller l'information pour que les choses comme les mots de passe sont
d'autant plus sécurisé.
Afin de motiver ce problème très réel du monde avec un très non dans le monde réel
scénario, laissez-moi vous présenter l'un de nos clips préférés ici à partir de cette
film, Spaceballs.
>> [LECTURE VIDEO]
-Casque, vous démon, ce qui se passe?
Que faites-vous à ma fille?
-Permettez-moi de vous présenter le chirurgien plastique brillant jeune, le Dr Philip
Schlotkin, le plus grand homme nose job dans l'ensemble
univers et de Beverly Hills.
-Votre Altesse.
Nez-emploi?
Je ne comprends pas.
Elle a déjà eu un travail de nez.
C'était un doux 16 présents.
-Non, ce n'est pas ce que vous pensez.
C'est bien pire.
Si vous ne me donnez pas la combinaison du bouclier d'air, le Dr Schlotkin sera
donner à votre fille le dos de son ancien nez.
-Non!
Où avez-vous trouvé ça?
-Très bien.
Je vais vous dire.
-Non, papa, non.
Vous ne devez pas.
Tu es juste-, ma chère.
Je vais rater votre nouveau nez.
Mais je ne vais pas leur dire la combinaison peu importe quoi.
-Très bien.
Dr Schlotkin, faire de ton mieux.
-Je vous en prie.
-Non!
Attendez, attendez.
Je vais vous dire.
-Je savais que ça marcherait.
D'accord, donnez-le moi.
-La combinaison est un.
-Un.
-Deux.
-Trois
-Trois.
-Quatre.
-Cinq
-Cinq.
Ainsi, la combinaison est une, deux, trois, quatre, cinq.
C'est la plus stupide que j'ai jamais entendue combinaison dans ma vie.
C'est le genre de chose un idiot pourrait avoir sur ses bagages.
-Merci, Votre Altesse.
-Qu'avez-vous fait?
-J'ai éteint le mur.
-Non, vous n'avez pas.
Vous avez éteint le film en entier.
-Je dois avoir appuyé sur le mauvais bouton.
-Eh bien, le remettre en place.
Mettez la vidéo sur l'.
-Oui, monsieur.
Oui, monsieur.
-Allons, Erna.
Venez, Gretchen.
Bien sûr, vous savez que je vais encore vous facturer pour cela.
-Eh bien, at-elle fonctionné?
Où est la porte?
-Il a travaillé, monsieur.
Nous avons la combinaison.
-Grande.
Maintenant, nous pouvons prendre toutes les dernier souffle d'air frais de la planète Druidia.
Quelle est la combinaison?
-Un, deux, trois, quatre, cinq.
-Un, deux, trois, quatre, cinq?
-Oui.
-C'est incroyable.
J'ai la même combinaison sur mes bagages.
Préparer Spaceball 1 pour un départ immédiat.
-Oui, monsieur.
-Et changer la combinaison sur mes bagages.
-Aïe!
[FIN LECTURE VIDÉO]
>> DAVID J. MALAN: Un film étonnant, vous devriez maintenant voir tous.
Ainsi, le contexte ici est que les données insécurité est une occasion de
le chiffrer et de les brouiller.
Et si cela, par exemple, est un exemple d'un message chiffré.
Ceci dit effectivement quelque chose en anglais.
Mais ce n'est évidemment pas tout à fait évident.
Et nous allons le plein cercle venu aujourd'hui pour démêler ce secret
message ici est.
Mais dans le monde réel des ordinateurs, les choses ne regardent même pas comme ils pourraient
être des phrases en anglais.
Par exemple, voici ce que vous pourriez trouver sur un standard Linux ou Mac ou
Ordinateur Unix dans un fichier qui était autrefois appelé le fichier mot de passe.
De nos jours, il a été déplacé vers d'autres lieux.
Mais si vous regardez au bon endroit sur un système, vous verrez non seulement votre
nom d'utilisateur ou d'autres personnes sur le système, mais vous verrez une
version cryptée du mot de passe.
En effet, la crypte mot, il suggère que la substance suivante est cryptée.
Et cette série de lettres et de caractères apparemment aléatoires et des chiffres et
ainsi de suite peuvent être déchiffrées que par quelque secret sachant généralement -
un mot secret, un code secret.
Et si en effet, l'art de la cryptographie se résume finalement à faire confiance à certains
tri et de savoir quelque chose que quelqu'un d'autre ne fonctionne pas.
Nous allons étudier cela en détail un peu plus aujourd'hui et dans l'ensemble de processeurs à venir.
>> Et maintenant, un mot sur Pass / Fail.
Donc, en particulier, que certains d'entre vous ont plongé dans pset 1, l'appareil, et
un tout nouveau monde pour vous-même, s'est rendu compte que les frustrations et
difficultés confusion et seulement d'ordre technique sont à prévoir.
Surtout avec le pset d'abord, où il ya tellement de choses nouveau, le simple fait
familiariser avec ls et cd et toutes ces commandes ésotériques dans un nouvel environnement.
Et ce n'est séparée de la matière réelle et elle-même programmation.
Donc réaliser, aussi, qu'il ya certainement des heures de bureau qui existent
la structure de support.
Les articles commencent ce dimanche.
Mais surtout, si vous vous sentez juste que ce n'est pas le
monde pour vous, sachez que ce n'est vraiment juste prendre du temps.
Et s'il n'y avait pas cette opportunité ans pour moi de prendre une classe
réussite / échec, honnêtement, je n'aurais jamais mis les pieds dans la salle de classe.
Et vous pouvez changer cela jusqu'à ce que, par exemple, le cinquième lundi du cours.
Donc, si vous êtes sur le bord maintenant, se rendre compte que, plutôt que la tête dans une autre
eaux tout à fait, ne vient certainement envisager le passage à succès / échec.
Encore une fois, il n'y a pas vraiment de cette culture ici à Harvard de prendre les choses
réussite / échec puisque tout le monde veut vraiment atteindre ou overachieve.
Mais franchement, c'est une merveilleuse façon d'essayer quelque chose qui pourrait ne pas
vous être familier.
Et vous finirez par faire dans la plupart des cas tout à fait beaux, peut-être
bien à votre grande surprise.
Et plus concrètement, ce que je pense de réussite / échec le fait généralement,
d'autant plus que vous pourriez avoir expérimenté avec pset 0, si vous avez mis
en 10 heures, 15 heures, 25 heures dans certains pset - et vous êtes juste taper
la tête contre le mur,
et il se fait super-tard dans la nuit,
mais vous avez pris le pset comme 90% du chemin,
vous savez que vous ne pouvez pas comprendre une chose -
réussite / échec prend vraiment le bord au large d'une classe comme ça, où vous pouvez trier
de dire heureusement pas grave, je sais que ce n'est pas parfait.
Mais j'ai travaillé mon cul sur ce point.
Je suis assez heureux avec où il a fini.
Et qui répondra aux attentes de réussite / échec.
Il ne faut donc garder cela à l'esprit.
>> Très bien.
Ainsi, ceux d'entre vous qui ont lutté pour utiliser l'Université de Harvard Wi-Fi savoir
qu'il ya un SSID CS50, une connexion Wi-Fi flottant autour de vous
pourrait avoir plus de chance d'.
C'est un peu ironique que le mot de passe pour ce - si vous souhaitez essayer
La connexion à ce pour de meilleures vitesses et laissez-nous savoir si ce n'est pas mieux -
est une, deux, trois, quatre, cinq, sur toute la hauteur de huit parce huit est
plus sûr que de cinq ans.
Donc, si vous avez besoin du mot de passe Wi-Fi, connectez-vous sans fil CS50 ici.
Un, deux, trois, quatre, cinq, six, sept, huit.
Et après le CS50 Discutez si vous avez encore des problèmes de connectivité intermittents,
et nous allons les pouvoirs en place savent pour cet espace.
>> Très bien.
Ainsi, un teaser rapide, surtout pour ceux d'entre vous qui sont des garçons ou des filles du ventilateur
Tout d'Apple.
Ce que je déterrés de quelques années en arrière était ce fichier ici, ilock.c, juste pour
sorte de rendre plus concret et plus complexe une partie de la plus élémentaire C
programmes que nous avons été l'écriture.
Alors j'ai ouvert ce fichier, ilock.c.
Il est disponible sur la page des cours pour aujourd'hui.
Sur le côté gauche, vous verrez une longue liste de fonctions.
Donc, le gars qui a écrit ce écrivit un grand nombre de fonctions,
plus que principal.
Il a utilisé tout un tas de bibliothèques ici.
Et si on commence à défiler, de quoi il s'agit réellement est la très
premier, je crois, craquer pour l'iPhone d'origine.
Quand tu as voulu jailbreaker l'iPhone original, ce qui signifie untether
il d'AT & T et fait installer un logiciel spécial sur elle et faire des choses
que Apple ne voulait pas les gens à faire -
bien, quelqu'un a pris le temps de comprendre exactement comment ils pourraient exploiter
failles logicielles, les erreurs, bugs, dans le logiciel d'Apple.
Et c'est ainsi que naquit ilock.c.
Que si vous l'avez compilé sur un ordinateur et installé sur un iPhone
a été connecté à votre ordinateur via, par exemple, un câble USB, ce serait vous donner
des privilèges d'administrateur ou root sur votre iPhone et vous permettent de faire à peu près
ce que vous voulez.
>> Et donc, il ya eu ce chat et à la souris fascinant entre Apple et
le reste du monde en particulier celles qui, à l'instar de nombreuses entreprises, essayez de verrouiller
leurs trucs bas de sorte que vous ne pouvez faire ce que bon leur intention.
Mais grâce à des gens comme celui-ci et leur compréhension de bas niveau
détails et, dans ce cas, de programmation C et un grand nombre des constructions familières
que nous avons commencé à jouer avec, vous êtes en mesure de tirer parti de la réalité
matériel d'une manière bon vous semble et pas nécessairement une personne morale.
Ainsi, par exemple, je n'ai aucune idée de ce que tout cela est fait.
Mais GetVersion semble assez simple.
Et on dirait que c'est une fonction que cette personne a écrit.
Prenez une sorte de nombre entier comme argument, ne retourne rien, mais
semble boucle avec une boucle for ici et une condition if, si la condition,
casser, et en quelque sorte se rapporte aux numéros de version.
Si nous défiler vers le bas -
même si beaucoup de ces mots clés vont être nouvelle, et il ya une
beaucoup de fonctions dans ici nous n'avons jamais vu et pourrait ne jamais voir plus
Au cours du semestre -
à la fin de la journée, il suit les mêmes règles et la logique que nous avons été
jouer avec à ce jour.
Donc, c'est beaucoup trop vieux pour craquer vos 3s 4s iPhone ou 5s, ou peu de temps ces jours-ci,
mais je sais que tout cela est très bien tiré de ce monde que nous avons
plongé dans.
>> Donc, nous allons jeter un oeil à un exemple un peu plus simple.
Celui-ci, juste pour se réchauffer avec un peu de syntaxe et aussi d'autres données
type que nous avons parlé mais je n'ai pas vraiment vu en C. Il s'agit donc d'un
fichier appelé positive1.c.
Et par les commentaires au début, cela exige simplement que l'utilisateur de fournir un
nombre positif.
C'est donc un exemple d'une boucle do-while, ce qui est agréable pour l'utilisateur interactif
programmes où vous devez indiquer à l'utilisateur de faire quelque chose.
Et si elles ne coopèrent pas, vous criez sur eux ou de refuser leur entrée.
Affaire au point, je vais faire des lignes 19 à 24, tant que l'utilisateur a
ne m'a pas donné un nombre positif.
Or, ce détail ici sur la ligne 18, pourquoi ai-je déclarer n-dessus cet ensemble
construction en boucle plutôt que juste à côté de la ligne 22 où je
se soucient réellement pour obtenir n?
Ouais?
[Inaudible]
>> DAVID J. MALAN: Ouais, donc cette question de portée.
Et en terme profane, qu'est-ce que la portée référence?
Ouais?
[Inaudible]
DAVID J. MALAN: Pouvez-vous parler un peu plus fort?
INTERLOCUTEUR 1: Où vous pouvez accéder à une variable particulière.
DAVID J. MALAN: Parfait.
Où vous pouvez accéder à une variable particulière.
Et généralement, la règle d'or à ce jour est que la portée de certaines
variable est définie par les accolades les plus récentes bouclés que vous avez vu.
Et dans ce cas, si j'ai fait l'erreur de déclarer n sur la ligne 22,
cette ligne pourrait fonctionner.
Je voudrais obtenir un int, et je le mis dans cette variable n dans la ligne 22.
Mais quelle ligne de code devrait maintenant aucune idée de ce dont je parle?
Donc, 25 ans, et il s'avère que 24, aussi, parce que dans ce cas, elle ne relève pas
des accolades.
Donc, juste un peu d'une nuisance, mais très facile à régler en déclarant simplement
l'extérieur variable de la fonction elle-même.
>> Maintenant nous allons voir plus tard aujourd'hui, vous pouvez aller plus loin.
Et vous pourriez même obtenir un peu paresseux -
et ce n'est pas à recommander, en général -
mais vous pourriez même devenir paresseux et de mettre une variable au niveau mondial, pour ainsi dire, pas
à l'intérieur d'une fonction, non pas à l'intérieur d'une boucle, mais dans le fichier lui-même, à l'extérieur
de toutes les fonctions que vous avez écrit, comme je l'ai fait ici sur la ligne 15.
Mais ce qui est généralement mal vu.
Mais réalisez que c'est parfois une solution à d'autres problèmes, comme nous allons
éventuellement voir.
Donc pour l'instant, nous allons le laisser comme ça.
Mais nous allons voir si nous pouvons réécrire cette juste de commencer à nous exprimer d'une
peu différemment.
>> Ainsi, ce programme, juste pour être clair, est positif1.
Permettez-moi aller de l'avant ici et dans ma fenêtre de terminal font positif1, Entrée.
Compile, d'accord.
Je vais courir positif1, appuyez sur Entrée.
J'exige que vous me donnez un entier positif.
Je dirai -1.
Cela n'a pas fonctionné.
0, 99, qui semble fonctionner.
Peut-être pas le test le plus rigoureux.
Mais au moins, c'est un bon test de cohérence que nous sommes sur la bonne voie.
Alors maintenant, laissez-moi aller de l'avant et d'ouvrir une deuxième version de cette.
Et ce qui est différent déjà?
Il met en œuvre la même chose.
Mais ce qui saute le plus clairement différent cette fois?
Ouais, donc ce bool en vert.
Gedit a mis en évidence en vert ce mot-clé connue sous le nom bool,
qui est un type de données.
Elle ne vient pas intégré à toutes les versions de C. Vous devez inclure une
bibliothèque spécifique.
Dans notre cas, j'ai inclus la bibliothèque CS50 afin que nous
avoir accès à bool.
Mais à la ligne 18, nous semblons avoir une valeur booléenne appelée ici reconnaissants.
Donc, j'aurais pu appeler cette chose.
Mais je l'ai appelé reconnaissants juste pour type de transmettre une signification sémantique.
Donc, d'abord sur la ligne 18, je suis apparemment pas reconnaissants parce que le
Valeur booléenne reconnaissants est initialisée à false dans la ligne 18.
Et puis, il semble que j'ai fait ici, dans les lignes 21 à 23, c'est que je viens de
sorte de réécrire ma logique.
Donc pas fonctionnellement différentes.
Mais à la ligne 22 maintenant, je vérifie si l'int l'utilisateur a fourni est supérieure à
0, alors j'ai simplement changer la valeur du reconnaissants à true.
Et pourquoi dois-je faire cela?
Parce que dans la ligne 25, apparemment, je vais vérifier une condition.
Pour ce faire, tout en reconnaissant la boucle est fausse.
>> Je propose donc comme une alternative à la version ci parce qu'il ya au moins une
peu plus intuitive, peut-être.
C'est un peu plus à la terre en anglais.
Donc, procédez comme suit lorsque vous n'êtes pas heureux ou tout est faux reconnaissants.
Et cette fois-ci, j'ai apparemment ne se soucient pas de se rappeler ce que l'utilisateur a tapé
en raison préavis n'y a pas de n variables.
Donc en fait, je -
un petit mensonge là-bas.
Fonctionnellement, le programme est un peu différent une fois que nous aller au fond des
parce que je ne suis pas se souvenir de ce n est.
Mais j'ai voulu montrer ici aussi que même si nous avons vu et getInt
GetString utilisé sur le côté droit d'un signe égal à ce jour de sorte que
nous nous souvenons de la valeur, techniquement, ce n'est pas strictement nécessaire.
Si pour une raison quelconque vous n'avez tout simplement pas envie de sauvegarder la valeur, vous voulez juste
pour vérifier la valeur, notez que nous pouvons simplement écrire ce que getInt ouvert
parenthèse, parenthèse ouvrante.
Cette fonction va retourner une valeur, comme nous l'avons dit.
Il va vous redonner un int.
Et si vous mentalement penser à ce qui se passe, quand je tape dans 99, getInt
renvoie le nombre 99.
Et donc conceptuellement, c'est comme si mon code étaient en fait cela.
Donc, si 99 est en effet supérieur à 0, puis reconnaissants devient vraie.
Puis la ligne 25 réalise ooh, c'est fini parce que je suis maintenant heureux.
Et à la ligne 26, nous disons simplement, grâce pour l'entier positif, quelle qu'elle
se trouvait.
>> Maintenant, nous allons faire une légère sucre syntaxique ici, pour ainsi dire.
Voyons voir si nous pouvons nettoyer cette ligne 25 avec cette variance troisième et dernière
dans positive3.
Donc, la différence n'est que maintenant est ce que la ligne de code?
Ouais, donc 25.
Et nous n'avons pas vraiment vu ce truc tout de suite.
Mais nous avons vu le point d'exclamation, le lundi, ce qui dénote quoi?
Si non, ou la négation.
Alors, prenez une valeur booléenne et retourner sa valeur.
Vrai devient faux.
Faux devient vrai.
Donc, je proposerais, c'est même un peu plus intuitive d'un mode de
l'écriture du code parce que j'ai encore initialiser reconnaissant à faux.
Je fais toujours ce qui suit.
J'ai mis reconnaissants à true lorsque le moment sera venu.
Mais maintenant vous pouvez vraiment juste traduire ce code verbalement gauche à droite,
tout en ne reconnaissant.
Parce bang, ou point d'exclamation, désigne la notion de pas, alors tout
pas reconnaissants.
>> Encore une fois, nous n'avons pas mis en place de nouveaux concepts en soi.
Nous avons parlé de booléens en arrière quand nous avons joué avec Scratch.
Mais maintenant, nous pouvons réaliser juste commencer à écrire notre code dans
nombreuses façons différentes.
Donc, en particulier dans pset1, si vous êtes en quelque sorte du mal à comprendre la façon de
écrire un programme, les chances sont que vous avez de la chance car il va y avoir de
certain nombre de solutions que vous pouvez arriver à.
Par exemple, ce n'est que trois pour même le plus simple des programmes.
Très bien.
Et maintenant rappeler le lundi, nous sommes partis sur cette note avec les valeurs de retour.
Donc, pour la toute première fois, nous avons écrit un programme qui n'a pas seulement principal,
il a aussi sa propre fonction personnalisée que j'ai écrit ici.
Donc, à la ligne 31 à 34, j'ai mis en place une fonction cube.
Ce n'est pas complexe.
C'est juste une fois par fois a, dans ce cas.
Mais ce qui est important, c'est que je prends d'entrée sous la forme d'un et
Je suis de retour de sortie sous la forme d'une fois par fois par.
>> Alors maintenant, j'ai la possibilité, tout comme j'avais l'habitude de la fonction printf seul, de faire appel
cette fonction en appelant la fonction cube.
Et la fonction cube prend certaines entrées.
Et la fonction cube retourne une sortie.
Et si par contre, printf juste fait quelque chose.
Il ne revint pas tout ce qui nous intéressait - même si, en tant que
de côté, il ne retourne pas de valeur.
Il vous suffit généralement l'ignorer.
Printf juste fait quelque chose.
Il a eu un effet secondaire de l'impression à l'écran.
Par contre ici, nous avons la fonction cube, qui
renvoie en fait quelque chose.
>> Donc, ce qui est généralement -
pour ceux qui connaissent ça, c'est une idée assez simple.
Mais pour ceux qui sont moins familiers avec cette idée de passer en intrants et d'obtenir
sorties arrière, essayons quelque chose de simple juste super.
Quelqu'un est-il à l'aise de monter sur scène en quelques mots?
Vous devez être à l'aise avec une caméra sur vous, aussi.
Ouais.
Ok, quel est ton nom?
KEN: Ken.
DAVID J. MALAN: Ken.
Très bien, Ken.
Venez sur place.
Ainsi, Ken va être une fonction en quelque sorte ici.
Et nous allons aller de l'avant et de le faire.
Prenons un peu de fantaisie.
Enchanté de faire votre connaissance.
Bienvenue sur scène.
Très bien.
Frappons ce bouton ici.
Très bien.
Vous avez donc ici un tableau moderne.
Et ce que je suis est la fonction principale, par exemple.
Et je n'ai pas un iPad dans ma main.
Je ne me souviens pas vraiment comment - et, en fait, ne peut pas dire cela.
Je n'ai pas vraiment de bonne écriture.
Et par conséquent, je veux que vous imprimer quelque chose sur l'écran pour moi.
>> Je suis donc être le programme principal.
Et je vais vous dire ceci en l'écrivant dans mon poulet et aux rayures
puis en passant vous une entrée.
Donc, aussi stupide que cet exercice est, la notion de fonction et d'appeler un
la fonction et le retour d'une fonction se résume à cela.
Je suis principale.
Je viens d'écrire printf ("quelque chose") sur l'écran.
Je l'exécution de ce programme.
Et dès que se printf appelée, elle prend un argument - ou un paramètre,
parfois -
entre guillemets.
Voici cet argument.
Je suis en train de passer à Ken.
Maintenant, il est une boîte noire écrit un certain nombre d'années qui, apparemment,
ne sait imprimer des choses sur l'écran.
>> Donc, exécuter.
Ce n'est pas mal.
Donc, très bon.
Alors maintenant, Ken se fait exécuter.
At-il besoin pour me remettre quelque chose en retour?
Donc pas que nous avons vu jusqu'à présent.
Encore une fois, ne fait printf retourner un nombre.
Mais nous allons ignorer pour l'instant parce que nous ne l'avons jamais utilisé.
Donc, c'est tout pour Ken.
Et maintenant principal revient à exécuter -
principal prend le contrôle du programme à nouveau parce que cette ligne de code,
printf, se fait exécuter.
Et nous allons sur notre façon quel que soit l'exécution d'autres lignes sont là.
>> Très bien.
Alors maintenant, nous allons essayer un exemple légèrement différent.
Et cette fois-là, nous allons d'abord effacer l'écran ici.
Et cette fois, nous ferons la fonction de cubage.
Mais cette fois, je m'attends à une valeur de sortie.
Donc, nous allons aller de l'avant et de le faire.
Alors maintenant, j'ai une ligne de code qui dit que x = cube (x).
Donc en fait let's -
la ligne de code, rappel, ressemble à ceci.
x cube = (x).
Alors, comment est-ce d'aller travailler?
Alors allons-y et donnez-vous un écran blanc à nouveau.
Et je vais écrire maintenant vers le bas la valeur de x, qui à ce moment de
temps se trouve être, disons, 2, garder les choses simples.
J'ai donc écrit sur un bout de papier la valeur de 2,
qui est ma valeur x.
Je le remettre à Ken.
KEN: Et je viens de rédiger la réponse?
DAVID J. MALAN: Oui, nous allons simplement écrire la réponse.
D'accord.
Et maintenant, il doit retourner quelque chose.
Donc -
parfait.
Belle segue.
>> Alors maintenant, il me tend de nouveau la valeur de 8 dans ce cas.
Et je fais quoi avec ça?
Eh bien, effectivement, nous allons voir.
Obtenir ce droit.
Que vais-je faire avec elle?
Maintenant, je vais prendre cette valeur et en fait le stocker dans les
mêmes bits dans la mémoire.
Mais remarquez, je suis un peu mal ici.
Je suis un peu confus parce que là où puis-je réellement écrire la valeur de x?
Parce que ce que je viens de faire est physiquement Ken main un morceau de papier
qui a la valeur 2, qui est x.
Et en effet, c'est précisément ce qui se passe.
Ainsi, il s'avère que lorsque vous appelez une fonction, et que vous passez dans un argument
comme "bonjour le monde" ou si vous passez un argument comme 2, en général, vous êtes
passant dans une copie de cet argument.
Et si juste que j'ai écrit ici le numéro 2 et le tendit à Ken, qui doit
dire que j'ai encore une copie de la valeur 2 quelque part.
Car en effet, maintenant que j'ai décidé de remonter la valeur 8, j'ai besoin de revenir en arrière
RAM et fait écrire 8, où j'ai eu le numéro 2.
>> Donc visuellement rappeler cette notion de passage dans la lettre
une copie de la valeur.
Ken fait sa chose, me remet quelque chose en retour - dans ce cas,
une valeur comme 8.
Et puis, je dois faire quelque chose avec cette valeur si je
voulez le garder.
Donc, tout cela va être trop familier avant longtemps.
Merci beaucoup pour cette démo ici, Ken.
Très bien.
Très bien fait.
Voyons donc comment cela se rapporte finalement à une partie de la fonction
appeler que nous avons fait ici.
Alors laissez-moi aller de l'avant et nous ramener à l'exemple de cubage ici.
Et remarquez que si nous voulons vraiment commencer à prendre plus loin, nous allons
d'avoir à tenir compte du fait que le nombre x qui a été adoptée en
ici est différent de ce qui réellement passé à la fonction.
Encore une fois, ce adoptée par copie va devenir très
germane dans un instant.
>> Donc, nous allons jeter un oeil à quelque chose qui ne fonctionne pas tout à droite encore.
Je vais aller de l'avant et d'ouvrir un exemple poussette troisième, qui
est vicié par la nature.
Et ça s'appelle buggy3, et il met en œuvre une fonction de permutation.
Nous avons donc ici une fonction principale qui a x et y arbitrairement initialisée à
1 et 2, respectivement.
Nous pourrions utiliser getInt, mais nous avons juste besoin d'un simple exercice.
Il est donc codé en dur comme 1 et 2.
Dans les lignes 21 et 22, nous semble-t-imprimer x et y, un par ligne.
Puis, à la ligne 23, je prétends que je échanger ces valeurs, dot, dot, dot.
J'ai apparemment appeler une fonction dans la ligne 24 appelée échange
qui prend deux arguments.
Il est tout à fait légitime pour les fonctions de prendre deux arguments.
Nous avons vu printf le font déjà.
Donc échange prend apparemment x et y.
Et comme son nom l'indique, j'espère que ça va
permuter ces deux valeurs.
Alors, je demande à la ligne 25, permutées.
Et réimprimer x et y dans l'hypothèse où
ils ont en effet été échangés.
Mais si je fait exécuter ce programme -
Permettez-moi d'ouvrir une fenêtre de terminal.
Permettez-moi de faire buggy3.
Comme son nom l'indique, ce ne va pas bien finir.
Parce que quand je la touche Entrée, vous remarquerez que x est 1.
y est égal à 2.
Et pourtant, à la fin du programme, ils sont toujours, en fait, la même chose.
>> Donc, fondée sur la démonstration tout à l'heure avec Ken, ce qui se passe réellement?
Eh bien, nous allons plonger dans cette fonction d'échange.
C'est super court.
C'est seulement quelques lignes de code long.
Mais quel est le problème fondamental basé sur la simple histoire a dit à
ici avec Ken?
Pourquoi est-échange cassé?
[Inaudible]
Exactement.
Nous sommes donc les stocker dans une copie, et non la variable elle-même.
En d'autres termes, l'échange prend deux arguments apparemment, un int.
Et il est arbitrairement appelé a et b.
Et ici, je suis passé en x et y, qui sont respectivement 1 et 2.
Mais je ne suis pas littéralement passer en x.
Je ne suis pas littéralement le passage en y.
Je passe une copie de x et de y une copie.
C'est comme presque comme si vous avez copié et collé dans permuter les valeurs que
vous voulez qu'il fait manipuler.
Donc, si c'est le cas, lorsque moi, le programme, lancer l'exécution
ligne 35, puis 36 -
quand j'arrive à la ligne 37, à ce stade de l'histoire, quelle est la valeur de a?
À ce stade de l'histoire, la ligne 37, quelle est la valeur d'un en ce moment?
Donc, il devrait juste être 1.
Pas vrai?
Parce que x a été adoptée en tant que premier argument.
Et cette fonction, il suffit arbitrairement appelle son premier argument, un.
Est même y, le second argument.
Et c'est juste arbitrairement appeler le second argument b.
>> Maintenant, cette dichotomie est en fait assez simplement expliqué.
Pensez-y.
Aucun d'entre nous ont rencontré la personne qui a écrit printf.
Alors certes, il ou elle n'a aucune idée de ce que nos variables 30 ans plus tard vont
à appeler.
Donc il doit y avoir une distinction entre ce que vous appelez des variables dans
fonctions que vous écrivez et ce que vous appelez des variables dans les fonctions que vous êtes
appelant ou l'utilisation.
Donc, en d'autres termes, j'ai écrit mes variables comme x et y.
Mais si quelqu'un d'autre avait écrit la fonction de permutation, il ou elle a certainement
ne sais pas ce que mes variables vont être appelés.
Alors rends compte que c'est pourquoi vous avez cette dualité de noms.
Techniquement, je pourrais faire ça par hasard.
Mais ils seraient encore passé en autant d'exemplaires.
Il serait tout simplement une pure coïncidence si esthétiquement que la personne qui a écrit
échange avait utilisé les mêmes noms.
>> Très bien.
Donc, à ce moment de l'histoire, la ligne 37, a est 1.
b est égal à 2.
Et maintenant, je passe à les échanger.
Eh bien tout d'abord, permettez-moi de réellement faire beaucoup plus simplement.
Je ne sais pas ce que ces trois lignes de code ont été faites.
Permettez-moi de le faire.
b obtient un.
Terminé.
Pourquoi est-ce cassé, logiquement?
C'est un peu la chose intuitive, non?
Ainsi, un devient b.
Et b devient un.
Mais le problème est que dès que la ligne 37 est exécuté, quelle est la
valeur de a et b?
Le même, 1.
Parce que vous avez mis à mal, pour ainsi dire, tu as changé b pour égaler un.
Donc, une fois la ligne 37 est exécutée, c'est très bien.
Vous avez maintenant deux exemplaires du numéro 1 à l'intérieur de cette fonction.
Alors quand vous dites dans la ligne 38, un obtient b, eh bien, vous êtes un peu foutu.
Parce que vous êtes juste attribuant 1 à 1.
Vous avez un peu perdu la valeur que vous souciait.
>> Ainsi, dans la version originale de ce fait, notez ce que j'ai fait.
J'ai plutôt eu une troisième ligne de code qui ressemble à ceci.
Je déclare une variable temporaire - tmp est un nom très commun
pour une variable temporaire.
C'est un int car elle doit correspondre à ce que je veux faire une copie d'.
Je stocker une copie d'un intérieur de tmp. Donc, une fois la ligne 37 a été exécutée,
la valeur de a est -
santé mentale vérification rapide -
1.
La valeur de b est 2.
Et la valeur de tmp est aussi 1.
Alors maintenant, je exécuter la ligne 38.
Donc, une fois la ligne 38 exécute, a prend la valeur de b.
Et b est 2.
Ainsi, un qui passe à 2.
Donc, à ce moment de l'histoire, a est 2, b est 2,
et tmp est 1.
Alors maintenant, en toute logique, nous pouvons juste valeur tmp plop a en b.
Et c'est fait.
>> Donc, nous avons résolu ce problème.
Malheureusement, quand je lance ce programme sous cette forme, il ne fait pas échanger
toutes les valeurs.
Mais pour être clair, pourquoi?
J'ai corrigé le problème logique de tout à l'heure.
Mais encore une fois, si je lance ce programme, x et y restent inchangés à la fin de
exécution du programme.
[Inaudible]
DAVID J. MALAN: Donc, nous n'avons pas retourné quoi que ce soit.
Donc, c'est vrai.
Mais il s'avère qu'il ya un petit problème ici parce que jusqu'à présent, le
seule chose que nous avons été en mesure de revenir, c'est une chose.
Et il s'agit d'une restriction de C. Vous ne pouvez retourner vraiment une valeur,
dans ce cas, je suis un peu coincé ici
parce que je pouvais retourner la nouvelle valeur de x ou je pourrais retourner le
nouvelle valeur de y.
Mais je veux aussi revenir.
Donc, le retour n'est pas la solution simple ici.
Mais le problème est fondamentalement pourquoi?
Qu'avons-nous fait échangé?
a et b.
Mais a et b sont des copies de x et de y, ce qui signifie que nous venons de faire tout cela
travailler - nous venons de passer comme trois minutes à parler de l'échange
fonction et chacune de ces trois variables.
Et c'est très bien, parfaitement correct dans l'isolement.
Mais une portée et b n'est que dans ces lignes ici.
Ainsi, tout comme une boucle for, si vous déclarez un entier i pour l'intérieur de la
boucle - de même, si vous êtes à l'intérieur déclarant a et b d'une fonction qui
vous avez écrit, ils sont seulement valide dans les de cette fonction.
Ce qui signifie que dès que swap est fait exécuter et nous allons partir de la ligne 24 à
ligne 25, x et y ont pas été changé.
Vous venez de perdre un tas de troquer des copies de variables.
>> Ainsi, il s'avère que la solution à cette question est effectivement non évidente.
Ce n'est pas tout à fait suffisant pour renvoyer des valeurs parce que nous pouvons
seulement retourner une valeur.
Et je veux vraiment échanger x et y dans le même temps.
Donc, nous allons revenir à cela.
Mais pour l'instant, se rendre compte que le problème provient fondamentalement du fait
que a et b sont des copies.
Et ils sont dans leur propre champ d'application.
Eh bien, nous allons essayer de résoudre ce en quelque sorte.
Permettez-moi de revenir en arrière en fait ici et d'ouvrir, disons, une quatrième variante
De ce fait, buggy4.
Et que dire de cela?
Il s'agit d'un problème similaire mais plus simple à regarder avant de prendre un coup de poignard au
le résoudre.
Ce programme est appelé incrément.
Et apparemment il initialise un entier x à 1 à la ligne 18.
J'ai ensuite prétendre x est 1.
J'ai ensuite réclamation incrémentation, point, point, point.
J'appelle ensuite incrément.
Mais ensuite, dans les lignes 22 et 23, je prétends qu'il a été incrémenté.
Je prétends x est maintenant quel qu'il soit, 2 sans doute.
>> Mais ce programme est bogué.
Quel est le problème?
Ouais?
[Inaudible]
DAVID J. MALAN: Exactement.
Alors x est déclarée manifestement sur la ligne 18.
C'est à l'intérieur des accolades principal.
Donc, la réponse simple est que, eh bien, x existe ici.
Il n'existe pas dans la ligne 32.
Ainsi, ce programme fait même pas compiler.
Le compilateur, quand j'ai essayer de compiler ce code, va me crier dessus
sur certains identificateur non déclaré ou quelque chose à cet effet.
En fait, nous allons essayer.
C'est faire buggy4.
Il est là.
L'utilisation de x identificateur non déclaré dans la ligne 32.
Et effectivement, nous allons être plus explicite ici aujourd'hui pour que ce soit utile dans
les heures de bureau et à la maison.
Notez que c'est un peu cryptique écrite.
Mais le fait que Clang a hurlé à nous, en disant:
buggy4.c: 32:5, est réellement utile.
Cela signifie que l'erreur est sur la ligne 32, à cinq position de caractère.
Donc, un, deux, trois, quatre, cinq.
C'est, en fait, où est le problème.
Et aussi garder à l'esprit aux heures de bureau et à la maison, j'ai de la chance ici.
J'ai une erreur.
Ça va être relativement facile à corriger.
Mais si vous obtenez un écran tout plein de messages d'erreur écrasante, encore une fois,
se rendre compte que la plus inférieure pourrait bien être le symptôme d'
les plus hautes.
Il faut donc toujours pourchasser vos bugs de haut en bas.
Parce qu'il pourrait s'agir d'un effet en cascade qui vous suggère
ont des problèmes de façon plus que vous avez réellement le faire.
>> Alors, comment pouvons-nous résoudre ce problème si mon objectif est d'incrémenter x?
Qu'est-ce que c'est?
D'accord.
Nous pouvons donc x planétaire.
Prenons le raccourci que je garde tout à l'heure.
Mais diable, nous avons juste besoin d'une solution rapide.
Alors disons simplement int x ici.
Cela fait x planétaire.
Alors maintenant, principal a accès.
Et l'incrément peut y avoir accès.
Et laissez-moi aller de l'avant et de compiler ce moment.
Assurez-buggy4, Entrée.
Semble compiler maintenant.
Lançons buggy4, et il semble réellement.
Maintenant, c'est une de ces choses -
faites ce que je dis, pas ce que je fais, comme je viens de faire ici.
Parce qu'en général, nos programmes vont devenir beaucoup plus intéressant et
beaucoup plus que cela.
Et si votre solution aux problèmes de la vie est juste, euh, mettre tous les
variables au début de votre fichier, faire très rapidement des programmes se
horriblement difficile à gérer.
Il devient plus difficile d'imaginer de nouveaux noms de variables.
Il devient plus difficile de comprendre ce que la variable fait quoi.
>> Et donc, en général, ce n'est pas une bonne solution.
Donc, nous allons faire mieux.
Nous ne voulons pas d'utiliser une variable globale ici.
Je ne veux pour incrémenter x.
Donc, je ne pouvais évidemment -
à la fin de la journée, c'est un peu une histoire idiote car nous venons de le faire.
Mais si je ne savais pas à propos de cet opérateur, ou je n'étais pas autorisé à
le changer en principal lui-même, comment pourrais-je mettre en œuvre Ken ici, ce
le temps n'est pas au cube, mais pour incrémenter?
Comment puis-je changer cette chose ici?
Ouais.
[Inaudible]
DAVID J. MALAN: Très bien.
Alors, pourquoi ne puis-je pas passer dans x?
Et puis, plutôt que de le retourner, pourquoi ne puis-je pas simplement faire return x + 1?
Maintenant, les choses un couple plus avoir à changer ici.
Je suis sur la bonne voie.
Que dois-je tweak?
Quelqu'un d'autre.
Ouais?
[Inaudible]
DAVID J. MALAN: j'ai besoin de changer le type de retour de l'augmentation
car il n'est pas annulée.
Vide signifie rien n'est retourné.
Mais de toute évidence, il est maintenant.
Donc, cela doit changer en int d'être cohérent avec ce que
Je suis en train de revenir.
>> Maintenant, autre chose est encore buggé ici.
Ouais?
[Inaudible]
DAVID J. MALAN: Donc j'ai besoin d'incrémenter x?
[Inaudible]
DAVID J. MALAN: Ah, donc j'ai besoin de passer x.
J'ai donc besoin de le faire ici.
Ainsi, le prototype, je dois changer cette place ici.
Donc, ce doit être un entier.
Cela doit devenir -
hmm.
En fait, j'ai un bug ici-bas.
Fixons cette première.
Que devrait-il être fait?
Donc, il faut que ce soit quelque chose d'int.
Il pourrait être x.
Mais franchement, si vous commencez à appeler tous vos variables x, il va devenir
de moins en moins claire qui est qui.
Donc on va plutôt choisir arbitrairement une convention de nommage différent pour mon
fonctions auxiliaires, les fonctions j'écris.
Nous allons l'appeler un.
Ou nous pourrions l'appeler - appelons-le even_number d'être encore plus explicite.
Alors je dois retourner quelque soit le nombre est plus 1.
Et maintenant, je dois changer quelque chose d'autre ici et un
autre chose ici.
Qu'est-ce que je dois changer sur la ligne 21 en premier?
Je dois l'attribuer à x.
Donc, je ne peux pas appeler x incrément.
Je dois me rappeler la réponse en changeant la valeur de x sur
le côté gauche.
Et même si x est maintenant sur la gauche et la droite, c'est tout à fait bien, car
le côté droit se exécuté en premier puis se fait flac dans la gauche
chose à la main, x dans ce cas.
Et puis enfin, il s'agit d'une solution facile maintenant.
Cela devrait correspondre à ce que tout est en bas.
Numéro Int.
>> Très bien.
Ainsi, tout un tas de changements pour une fonction vraiment stupide.
Mais représentant de choses que nous allons de plus en plus envie de faire.
Donc, assurez-buggy4.
J'ai merdé quelque part.
Oh mon Dieu.
Cinq erreurs, comme, un programme de six lignes.
Alors qu'est-ce qui ne va pas à la ligne 18, caractère 5?
Très bien.
Je dois donc déclarer cette int.
Très bien.
Voyons donc, tout un tas d'autres erreurs.
Oh mon dieu.
19, 18, 21.
Mais encore une fois, nous allons simplement effacer l'écran -
L commande ici - et re-run Clang.
Ainsi, cinq problèmes est en fait celui-là.
Alors maintenant, nous allons lancer buggy4, Entrée.
Ouf.
x est incrémenté correctement.
>> Très bien.
Vous avez des questions sur la façon d'incrémenter les numéros?
Ouais?
SPEAKER 2: Pourquoi est-ce que vous pouvez simplement changer x en nombre dans la variable
nom et il saura ce que tu veux dire?
DAVID J. MALAN: Bonne question.
Comment est-ce que je peux juste changer x en nombre et le programme saura
immédiatement?
Encore une fois, penser que c'est cette abstraction.
Donc, si je suis principale et Ken est incrémentale, franchement, je m'en fous
ce que Ken appelle son iPad.
Je me moque de ce qu'il appelle tout ce qui a à voir avec sa mise en œuvre
de cette fonctionnalité.
Il s'agit donc d'un détail d'implémentation que j'ai, main, ne
à se soucier.
Et donc il suffit de changer régulièrement l'intérieur de la fonction, le numéro ici
et le nombre ici, c'est tout ce qu'il faut tant que je recompiler.
C'est un peu comme si vous y pensez - beaucoup d'entre nous, ceux d'entre vous avec conducteur
licences qui ont parcourus, ou si vous avez même poussé dans une voiture -
plupart d'entre nous n'ont aucune idée de comment fonctionne une voiture sous le capot.
Et littéralement, si vous ouvrez le capot, la plupart d'entre nous - moi y compris -
ne vont pas vraiment ce que nous étudions.
Un peu comme vous pourriez vous sentir avec des trucs comme ça maintenant.
Mais nous n'avons pas vraiment à se soucier comment la voiture fonctionne.
Nous n'avons pas se soucier de ce ensemble des bielles et des pistons et des câbles à l'intérieur de
la voiture sont en train de faire.
>> Donc, quelque chose comme ce que vous appelez le piston n'a pas d'importance
ici, dans ce cas.
Même idée.
Ouais?
[Inaudible]
DAVID J. MALAN: S'il y avait plus d'utilisations du moment variable xa il ya,
vous, le programmeur, aurait à les changer partout.
Ou vous pouvez littéralement faire Fichier, Menu, puis sur Rechercher / Remplacer,
quelque chose comme ça.
Mais vous allez avoir à faire ces changements vous-même.
Vous devez être cohérent.
[Inaudible]
DAVID J. MALAN: Un ordre particulier comme ici?
Si c'était un autre numéro int?
Ouais.
Donc ordre importe quand vous appelez la fonction.
Donc, si je devais appeler incrément ici avec quelque chose virgule quelque chose,
il ya une correspondance directe.
La première variable, quelque chose comme ça, on fait une copie de la première
l'argument ici.
Désolé, cela ne devrait pas être une parenthèse.
Les lignes second argument allant à la seconde.
>> Donc, l'ordre, oui, les questions.
Très bien.
Désolé j'ai pris un long chemin pour y arriver.
D'autres questions?
Très bien.
Donc, nous allons voir si nous ne pouvons pas dresser un portrait de ce qui se passe réellement
ici sous le capot, pour ainsi dire.
Il s'agit donc d'un rectangle qui pourrait représenter la mémoire de votre ordinateur.
Donc, même si vous n'avez aucune idée comment fonctionne la mémoire RAM ou comment fonctionne, au moins
supposons que vous avez des bouquets de lui ces jours-ci.
Vous avez mégaoctets de celui-ci.
Vous avez gigaoctets de celui-ci.
Et nous savons par semaine zéro qu'un octet est juste quoi?
8 bits.
D'accord, donc 8 zéros et de uns.
Donc, si votre ordinateur dispose d'un Go de RAM, deux Go de RAM ces jours-ci, vous avez un
milliard ou 2 milliards d'octets de mémoire, soit environ 8 milliards ou 16 milliards
bits, à l'intérieur de votre ordinateur.
Maintenant, contrairement à l'exemple de Willy peu laineux, ce n'est pas des particules magnétiques
généralement plus.
De plus en plus, dans les ordinateurs portables moins, c'est solid state drives, SSD, que
n'ont tout simplement pas de pièces mobiles.
C'est tout électronique.
C'est toute l'électricité en fonction.
Alors, pensez, même si, de ce rectangle représentant la juste un ou deux
gigaoctets de mémoire que vous avez.
>> Donc, c'est un morceau de mémoire.
Maintenant, le monde de l'informatique a en quelque sorte morceaux cloisonnées de
mémoire pour faire des choses différentes.
Ainsi, par exemple, si c'est la RAM de votre ordinateur - comme le suggère le
rectangle là - se trouve que, par convention, dans la partie supérieure de votre mémoire, de sorte
de parler, c'est généralement ce que l'on appelle un segment de texte.
Ce sont les zéros et ceux que vous avez réunies.
Alors, quand nous avons regardé sous le capot ce qui est a.out, tous les
les zéros et de uns -
lorsque vous exécutez un programme, ces zéros et de uns sont chargés de votre disque dur
lecteur dans quelque chose appelé RAM.
Et dans la RAM, ils sont mis dans la partie supérieure.
Maintenant, quant à lui, vous avez autre chose.
Données initialisées, non initialisées.
Ces deux andains de mémoire se référer à des variables globales, qui
vous n'utilisez pas souvent.
Mais parfois, si vous le faites, ils finissent là-bas aussi.
Ensuite, il ya d'autres choses.
Les variables d'environnement, que nous n'aborderons pas passer beaucoup de temps sur.
Mais alors, de deux choses importantes qui reviendra tout au long de cette
semestre, pile et le tas.
>> Ainsi, la plupart de la mémoire de votre ordinateur est réservé lors de l'exécution d'un programme de
quelque chose qui s'appelle la pile et quelque chose qui s'appelle le tas.
Et nous n'allons pas parler de tas d'aujourd'hui, mais nous allons
parler de la pile.
Et la pile est destinée à évoquer l'aspect visuel de la salle à manger comme
plateaux-repas en Maison Mather, ou partout où vous arrive d'être, où l'
réfectoire du personnel les nettoyer tous les jours.
Ils les comparent à partir du sol sur place.
Et même dans la mémoire, il ya cette idée de mettre quelque chose sur un
empiler, mettre quelque chose sur une pile, mettre quelque chose sur une pile.
Et qu'entendons-nous par là?
Eh bien, nous allons effectuer un zoom avant sur juste la moitié inférieure de cette image, de votre ordinateur
RAM, de proposer ce qui suit.
Il s'avère que lorsque vous exécutez un programme comme a.out ou bonjour, quelle que soit
ce programme est que vous avez écrit,
de plus, ces zéros et de uns sont chargés à partir de votre disque dur - ce qui est
stockage à long terme, y reste même lorsque vous tirez sur la fiche -
chargé dans la RAM.
RAM est plus rapide que les disques durs.
Il est plus petit que les disques durs.
Mais c'est là que vivent des programmes alors que vous êtes les exécuter.
>> Donc, vous double-cliquez sur un programme sur un Mac ou un PC - il est chargé de
disque dur dans la RAM.
Dès qu'il est chargé dans la mémoire vive, les zéros et de uns aller au sommet façon, l'
dits segment de texte.
Mais dès le début du programme en cours d'exécution en réalité, la principale
fonction est appelée.
Et principale, comme nous l'avons vu, a souvent des variables locales.
Et il a les entiers et les chaînes de caractères et les caractères, etc.
Donc, si votre programme que vous avez écrit ou le programme que vous avez
double-cliqué utilisé des variables à l'intérieur de la principale, ils finissent à la
bas de votre pile de la mémoire, pour ainsi dire.
Maintenant, plus concrètement, qu'est-ce que cela signifie réellement?
Cela signifie simplement que si nous allions à numéroter les choses -
si nous allions au nombre des octets de RAM dans votre ordinateur, vous remarquerez que
cela pourrait être numéro zéro octet.
C'est peut-être l'octet numéro un, deux, trois, quatre, cinq, six, tous
le chemin jusqu'à voulez -
2 milliards seraient d'autant là-haut au sommet.
Donc, en d'autres termes, lorsque nous parlons de la mémoire RAM ou en termes d'octets, il
signifie simplement que quelqu'un a décidé de numéroter ce chacun des
ces morceaux de mémoire.
>> Alors, quand vous avez besoin de 32 bits pour un int, ou vous avez besoin de 8 bits pour un char, le cas
finissent-ils en mémoire?
Eh bien conceptuellement, ils ont juste se retrouver au bas de cette
chose qui s'appelle la pile.
Mais ce qui est intéressant c'est maintenant que principal appelle une fonction.
Supposons une fonction appelée foo, juste un nom arbitraire.
Qu'est-ce qui se passe est le principal se trouve au bas de cette pile de la mémoire.
Foo est maintenant mis sur le dessus de la principale dans la mémoire.
Ainsi, toutes les variables locales que foo a finir sorte de vue conceptuel ci-dessus
celles principale.
Si foo appelle une autre fonction appelée barre, ces variables se retrouvent ici.
Si la barre appelle autre chose, ici, ici, ici.
Donc ce qui est intéressant à propos de l'exécution d'un programme, c'est que tant que vous appelez des fonctions,
et que ces fonctions appeler des fonctions, et que ces fonctions appeler des fonctions,
vous construisez cette pile de fonctions en mémoire.
Et seulement une fois qu'une fonction retourne, vous commencez à obtenir que la mémoire en arrière.
Donc l'une des façons les plus faciles à exécuter de mémoire dans un programme informatique est de
écrire des fonctions qui ne retournent jamais.
>> Ainsi, par exemple, nous allons démontrer autant avec un
programme volontairement buggée.
Permettez-moi aller de l'avant et ne # include, int main (void).
Et je vais faire tout (2> 1), qui ne sera probablement jamais
changer sur nous.
Et laissez-moi aller de l'avant maintenant et faire printf.
En fait, ça va être moins intéressant visuellement.
Faisons-le.
Pour int (i = 0; i> 0).
Faisons de cette erreur, i + +.
Et il ne faut pas printf ici.
Voyons en pratique ce que je prêche.
Ayons une méthode ici.
Chœur vide, et nous dirons int i.
Et puis je vais vous dire, printf -
oh, nous allons rendre cela plus intéressant.
Nous allons effectivement pas imprimer quoi que ce soit.
Disons simplement le faire.
Chorus (i).
>> Très bien.
Donc, c'est buggé, car pourquoi?
Je fais ce que je vais en place parce que le programme ne fait rien
d'intérêt.
Mais ce n'est pas le but.
L'objectif est d'écrire un programme dont la fonction principale fait quoi, apparemment?
Appelez-même.
Et en fait, nous n'avons pas besoin de la boucle.
Nous allons simplifier ce juste pour ne pas perdre de vue la réalité
bug fondamentale.
Principaux appels chœur pour chanter quelques chœurs.
Ensuite, j'ai fait quelque chose de stupide, et j'ai eu choeur choeur appel parce que j'ai supposé
quelqu'un d'autre allait peut-être le mettre en œuvre.
Et maintenant, cela ne va pas encore à compiler.
Je dois faire quoi?
J'ai besoin du prototype, souvenez-vous.
J'ai donc besoin d'avoir ici chœur void (int i);.
>> Alors maintenant, si je descends ici -
en fait, nous allons utiliser la plus grande fenêtre.
Allons de l'avant et de faire chorus.
Utilisez du déclarant non identifié i.
Oh, que c'était stupide.
Nous n'avons pas besoin de l'argument.
Disons simplement le faire.
Si seulement nous avions commencé de cette façon.
Il aurait été un programme beaucoup plus facile à écrire.
Donc là.
Maintenant, nous allons passer à ma fenêtre de terminal, re-run Clang.
Et nous y voilà.
Cela a été très rapide.
Qu'est-ce qui s'est passé en réalité, si?
Eh bien, maintenant, je vais ajouter la ligne d'impression, afin que nous puissions voir.
Alors laissez-moi vous dire printf, disons, que je suis ici.
Ok, pas de variables, nous allons le laisser comme ça.
Permettez-moi de faire exécuter à nouveau.
Permettez-moi de re-run chœur.
Et allez.
Continuez.
Soit dit en passant, pourquoi n'at-il pas écrasé encore?
L'erreur de segmentation qui s'est passé super vite qu'avant.
[Inaudible]
DAVID J. MALAN: Exactement.
Donc, il faut du temps pour imprimer.
Il prend juste plus de travail de la part de l'ordinateur.
Et ça y est.
Segmentation fault.
>> Donc remarqué à quel point des programmes rapides de fonctionner.
Si vous n'êtes pas l'impression de quelque chose, super rapide.
Mais nous avons toujours eu cette erreur de segmentation, car ce qui se passait?
Eh bien, si vous pensez à la façon dont la mémoire de votre ordinateur est exposé, ce
se trouve être principale.
Mais ici -
nous allons simplement appeler ce chœur, et appelons ce chœur.
Et maintenant, si je fais mon esthétique droite, ce n'est tout simplement dire chœur,
chorus, chorus, chorus, chorus, chorus, chorus, ad nauseam.
Et finalement, qu'est-ce qui va se passer?
Si le tableau d'ensemble est littéralement cela, ce qui se passe juste conceptuel?
Les dépassements de pile le tas.
Ou pire, il vous suffit de dépassement tout, y compris le segment de texte, ce qui est
les zéros et de uns qui représentent votre programme.
En bref, c'est tout simplement super, super-mauvaises.
Pas vrai?
Votre programme a échappé à tout contrôle.
Vous utilisez la mémoire beaucoup plus que vous aviez l'intention à cause d'un stupide
erreur, dans ce cas.
Ou dans ce cas, une fonction très délibérément fait elle-même appel.
Or, ce n'est pas mal du tout.
Fonctions elles-mêmes appel a fait une grande puissance
lorsque vous l'utilisez correctement.
Je ne l'ai pas utilisé correctement ici.
>> Donc, ce n'est pas mal du tout.
Mais le fait que je n'ai jamais vraiment m'empêcher d'appel est un droit fondamental
faiblesse ici de ce programme.
Alors, où allons-nous avec tout cela?
Eh bien, qu'est-ce qui se passe réellement?
Quand j'appelle la fonction d'incrémentation, comme nous le faisions dans ces exemples,
J'ai une valeur comme 1 que je passe po
Je passe une copie de la première.
Donc, ce qui suit se produit.
Alors allons-y dans l'exemple incrément.
Et ce gars juste ici.
Alors, voici ce qui se passe réellement.
Quand j'ai appelé incrément, et je passe en x, imagée ce qui est
qui se passe ici est la suivante -
si j'ai la valeur de 1 stockés ici, et j'ai effectivement appeler incrémentation, qui
est maintenant appelé chorus -
Ouais, c'est moi jetant ici.
Donc appelons cette augmentation.
Et nous ne savons pas ce que cette fonction suivante va être.
Alors qu'est-ce qui se passe réellement est ici quelque part dans le main, j'ai un morceau de
mémoire qui stocke le nombre 1.
Quand j'appelle incrément, j'utilise un autre morceau de la mémoire, mais maintenant je
avoir la copie du 1.
Quand je incrémenter cette valeur, cela devient 2 - horriblement écrit sur le
écran ici.
Mais alors, qu'est-ce qui se passe dès le retour incrément?
Cette mémoire est simplement remis au système d'exploitation, ce qui signifie que tous les
vous avez fait n'est rien d'utile.
Celui qui a été à l'origine dans principal est toujours bien là.
>> Alors, où allons-nous avec ça?
Eh bien, il s'avère que dans la mémoire que vous avez ce dos à dos séquence de
octets que vous pouvez mettre des trucs po
Et il se trouve que nous avons déjà vu quelque chose qui implique la mise
choses dos à dos à dos à dos.
Qu'est-ce qu'une chaîne, basée sur une semaine et maintenant deux semaines?
Donc, c'est juste une collection de caractères.
Ainsi, il s'avère, tout comme vous pouvez mettre des numéros en mémoire, vous pouvez même
mettre des caractères en mémoire.
Et une fois que nous commençons à mettre les caractères en mémoire dos à dos à dos à
en arrière, il s'avère que l'utilisation la plus simple des choses comme une boucle for ou
une boucle while, nous pouvons itérer -
de gauche à droite sur les caractères d'une chaîne -
et commencer à les masser en caractères totalement différents.
Un pourrait devenir B. B pourrait devenir C. Alors qu'en fin de compte, nous pouvons prendre une
Phrase en anglais qui fait réellement sens et convertir chacun de ces
lettres une à la fois en se promenant dans la mémoire de notre ordinateur de gauche à
droit de chiffrer réellement.
>> Alors prenons notre pause de cinq minutes ici, et quand nous reviendrons, nous allons
démarrer ce processus de brouiller l'information.
>> Très bien.
Donc, avant de nous plonger dans une certaine crypto et ces choses appelées tableaux, permettez-moi
pause pour toutes les questions parce que j'ai l'impression vraiment une sorte de confuse certains
ces sujets.
Donc, nous allons fixer maintenant, si nous le pouvons.
Donc nous venons de parler valeurs de retour.
Nous avons parlé arguments.
Et nous avons parlé de cette notion, que nous y reviendrons dans les prochaines semaines
venir, de considérer la mémoire comme un tas de ces empilé
plateaux, pour ainsi dire.
De bas en haut, de telle sorte que chaque plateau qui se placer sur la pile représente
une fonction qui est en cours d'appel.
Des questions?
Alors que diriez-vous - laissez-moi essayer de poser une question.
Je garde gâcher cela, mais maintenant it's - vous avez tous vu le visage du garçon.
Donc, nous allons revenir à cela.
>> Permettez-moi de poser une question ici.
Permettez-moi de simplifier ce retour à ce qu'il était avant certains de nos plus tôt Q & A.
Et le fait que l 'accroissement a parenthèse ouverte, int nombre, fermé
parenthèses.
Qu'est-ce que le numéro int représentent-ils?
[Inaudible]
DAVID J. MALAN: Un argument.
D'accord, mais qu'est-ce qu'un argument?
[Inaudible]
DAVID J. MALAN: Désolé, c'est quoi?
SPEAKER 3: Quelque chose que vous passez po
DAVID J. MALAN: Très bien.
Donc, quelque chose que vous passez po
Et plus généralement, c'est juste l'entrée.
Si vous écrivez une fonction et le but de cette fonction dans la vie est de faire
quelque chose d'un peu différent à chaque fois que vous l'utilisez, alors la seule façon pour
que cela se produise vraiment semble être de lui fournir d'entrée de sorte qu'il
peut faire quelque chose de différent avec cette entrée à chaque fois.
>> Donc, vous devez spécifier deux choses quand une fonction prend entrées.
Vous devez spécifier le nom que vous voulez donner à cette entrée, uniquement pour
votre propre convenance de sorte que vous pouvez y faire référence dans la fonction que vous
vous écrivez, comme je l'ai fait ici dans la ligne 32.
Mais vous devez également spécifier son type car C est un langage de programmation
qui exige que
que si vous voulez une variable, vous devez dire à l'ordinateur ce qu'il
le type de données qu'il est,
en grande partie pour qu'il sache combien de bits d'
allouer à cette variable.
Parce que cela pourrait être six -
désolé, il ne sera pas six.
Il peut être 16.
Il peut être 8.
Il peut être 32, voire 64 ans.
Mais l'ordinateur a besoin de savoir.
Maintenant, l'int sur le côté gauche représente ce qui, par contraste?
[Inaudible]
DAVID J. MALAN: Qu'est-ce que c'est?
[Inaudible]
DAVID J. MALAN: Le type de la fonction et, plus spécifiquement, la
Type de sa production.
Droite.
Ainsi, alors que la chose entre parenthèses représente sa contribution, le cas échéant, le
chose à la gauche représente sa sortie.
Et dans ce cas, l'accroissement apparemment retourne un int.
Et donc int est le type de retour de cette fonction.
>> Qu'est-ce que ça veut dire au retour?
Littéralement, vous utilisez le mot-clé return.
Et puis si ce que vous êtes de retour à la droite du mot-clé est un
entier, alors c'est bien conforme à ce que nous avons promis.
Vous ne pourriez pas faire quelque chose comme ça -
bonjour, monde -
parce que c'est une chaîne.
Évidemment, il n'est pas un entier.
Donc en bref, le fardeau est vraiment sur nous, le programmeur, pour être précis que
à ce que nous retournant et puis effectivement aller sur le retournant.
Et puis pour faire un peu plus clair le contexte -
il est là à nouveau.
Le contexte -
grosse surprise à venir dans un instant.
Le contexte ici est que la mémoire de votre ordinateur est, encore une fois, un
gigaoctet, deux giga-octets, peu importe.
C'est peut-être plus.
C'est peut-être moins.
Mais l'ordinateur qu'il considère comme ayant des sections différentes.
Quelque chose se passe là-bas.
Quelque chose d'autre se passe là-haut.
Différentes choses va au milieu.
Et aujourd'hui, nous venons de commencer à raconter cette histoire.
>> Mais nous reviendrons sur ce fil du temps.
Pour l'instant, le seul élément de la mémoire nous nous soucions vraiment est le segment de texte
parce que cela représente seulement les zéros et de uns
Clang qui a fourni en sortie.
Ainsi, lorsque vous exécutez une commande au clavier comme a.out ou vous double
cliquez sur une icône sous Mac OS ou Windows, votre programme est chargé à partir de votre disque dur
conduire dans la RAM.
Et c'est flac en haut de la RAM de votre ordinateur, pour ainsi dire.
Maintenant, quant à lui, que votre programme est lancé et principale est appelée dans le
programme que vous avez écrit ou le programme Microsoft ou Apple écrit, l'un de ses
variables locales finissent là-bas au fond de la mémoire de votre ordinateur.
Mais si principal appelle une autre fonction qui lui-même a des variables ou des
arguments, ils finissent par-dessus.
Et si cette fonction appelle quelque chose, ils finissent par-dessus,
au-dessus, au-dessus de celui-ci.
Et une seule fois une fonction d'exécution ne se fait la pile de plateaux, de sorte
de parler, commencez à obtenir plus en plus bas.
Et c'est ce qui alors, en un mot, nous explique pourquoi, lorsque vous appelez cube -
ou si vous appelez incrément -
vous êtes de passage dans une copie de la valeur.
Et qu'est-ce que cela signifie de façon imagée, c'est que vous êtes littéralement écrit l'
numéro 1 dans une autre partie de la mémoire, qui change de 1 à 2, dans le cas d'
increment -
ou d'un 8, dans le cas de cube -
puis lancer loin que la mémoire dès que l'incrément ou le cube
retour de la fonction.
>> Question.
[Inaudible]
DAVID J. MALAN: Où - variables globales sont stockées dans ce qui est
actuellement appelé les données initialisées ou des données non initialisées.
La différence étant, si vous avez une variable globale, et vous l'assigner
immédiatement une valeur avec le signe égal, il finit par en haut là-bas.
Et si vous venez de dire int x-virgule sans valeur, il finit en légère hausse
inférieure dans la RAM tout simplement par convention.
D'autres questions.
Très bien.
>> Donc, cette image va revenir que nous aurons plus puissant avec ce que nous pouvons faire
avec l'ordinateur.
Mais pour l'instant, nous allons avoir une brève introduction à la cryptographie, un type spécifique de
cryptographie qui ne résout pas tous les problèmes du monde, mais ne résoudre
certains d'entre eux.
Dans ce cas là, nous avons quelque chose appelé cryptographie à clé secrète.
Et cryptographie à clé secrète, comme son nom l'indique, tire sa sécurité
à partir d'un secret.
Ainsi, par exemple, si vous êtes de retour à l'école primaire et que vous êtes de passage d'un
petite lettre d'amour secret pour le garçon ou la fille que vous concassage sur - si vous
voulu passer que par le public, vous n'auriez probablement pas écrire
une telle note en anglais ou quel que soit votre langue maternelle est, au contraire, vous
peut le chiffrer.
Ou bien vous pouvez leur envoyer un message texte de ces journées.
Mais vous pouvez effectivement passer d'une note dans la classe.
Et pour ce faire en toute sécurité, de manière à ce que vos amis et les enseignants
ne sais pas ce que vous écrivez, vous pourriez trouver un assez simple
algorithme -
jeune si vous pourriez être -
juste brouiller les mots.
Ainsi, au lieu d'écrire un, vous pourriez écrire B. Au lieu de B, vous pourriez écrire
C. Au lieu de C, vous pouvez écrire D, et ainsi de suite.
Ou vous pourriez trouver une traduction plus sophistiquée de lettres
à des lettres différentes.
Mais le hic, c'est le garçon ou la fille à qui vous envoyez cette note doit
savoir quelque chose.
Qui est ce qui, évidemment?
Comme, quel est votre secret.
Comme, qu'est-ce que la cartographie entre As et Bs et Cs et Ds?
Est-il juste en ajouter un, pour ainsi dire, à chacune des lettres de passer d'
De A à B, B à C?
Est-il plus complexe que cela?
Ainsi, vous et votre écraser besoin d'avoir cette information secrète.
Mais il ya une sorte de catch-22 ici.
Si c'est la première fois que vous envoyez cette lettre d'amour à travers la
classe, comment est-ce que garçon ou fille, va savoir ce que le secret est encore?
Donc, la clé secrète de chiffrement ne résout pas tous les problèmes du monde.
Et il ya en fait une relation que nous reviendrons vers
semestre de fin.
>> De même, aucun d'entre nous ont probablement jamais envoyé un -
De même, la plupart de nous ne connaît pas quelqu'un qui travaille, par exemple, à
Amazon.com.
Et pourtant, beaucoup d'entre nous ont probablement acheté des trucs sur Amazon.com.
Et nous avons appris à supposer que ces e-commerce
les transactions sont sécurisées.
Pas vrai?
L'URL https dit probablement.
Il ya peut-être un peu ridicule cadenas quelque part.
Il ya une sorte de cryptographie sécuriser vos informations de carte de crédit
entre vous et Amazon.com.
Et pourtant, si la cryptographie consiste à savoir un secret, et pourtant je ne suis pas
connais personne chez Amazon, et je n'ai certainement pas arrangé tout type de
secret avec quelqu'un chez Amazon, comment mon ordinateur ou mon navigateur fais ça?
Eh bien, s'avère qu'il ya d'autres types de cryptographie qui permettent de résoudre au total
ce problème.
Mais pour aujourd'hui, nous allons nous concentrer sur le simple, où vous pouvez organiser dans
faire progresser la connaissance de certains secrets, comme plus 1 ou une correspondance entre A et des B.
>> Et le processus de cryptographie implique généralement présent.
Vous avez un texte ordinaire, représenté ici à gauche.
Vous l'exécutez à travers une sorte d'algorithme ou une procédure
pour le chiffrer.
Peut-être que c'est juste A devient B, B devient C. Et puis vous vous retrouvez avec
chiffrer le texte.
Pendant ce temps, une fois que votre écraser reçoit la note secrète, il ou elle doit alors
décrypter par inversion généralement que l'algorithme de façon à obtenir
sauvegarder le texte en clair.
Maintenant il ya incarnations physiques de ce.
Par exemple, il s'agit d'un anneau décodeur petit secret.
Et c'est un anneau dans le sens où il ya deux cadrans ici.
Sur le pourtour extérieur de cette chose, il ya les lettres A à Z,
même si elles sont dans un ordre aléatoire.
Et à l'intérieur, il ya en fait quelques chiffres, de sorte que avec ce
anneau, vous pouvez sorte de transformer l'extérieur mais pas à l'intérieur afin d'aligner
chiffres avec des lettres.
Et dans le clip que vous allez voir - dont certains que vous avez pu voir 24/7
autour de la saison de Noël à partir d'un film intitulé A Christmas Story.
Vous verrez que Ralphie petite était si désireux de comprendre ce petit orphelin
Message secret d'Annie était lui qui avait été communiquée, je pense que, dans le
former des messages numériques sur un boîtier de série.
Et il fallait accumuler toutes les petites cartes qui sont venus
dans la boîte de céréales.
Il fallait les envoyer po
Il fallait récupérer l'anneau décodeur secret, afin que vous puissiez enfin comprendre
ce que la cartographie est entre lettres et chiffres,
ou des lettres et des lettres.
Donc, je vous donne ce petit clip de Un conte de Noël pour motiver pset 2 et
notre discussion, en un instant, de tableaux.
Nous avons donc ici Ralphie.
>> [LECTURE VIDEO]
-Qu'il soit connu à tout le monde que Ralph Parker est nommé
membre du Cercle Annie, la petite orpheline secret et a droit à tous les
les honneurs et les avantages qui y survenant.
Signé: Little Orphan Annie.
Contresigné, Pierre André!
À l'encre!
Honneurs et les avantages sociaux, déjà à l'âge de neuf ans.
Allez, passons à autre chose.
Je n'ai pas besoin de tout ce que le jazz au sujet des contrebandiers et des pirates.
Écoutez-demain soir pour conclure l'aventure de The Black
Pirate Ship.
Maintenant il est temps pour Annie message secret pour vous, membres
du Secret Circle.
Rappelez-vous, les enfants, seuls les membres du Secret Circle Annie peut décoder
Message secret d'Annie.
Rappelez-vous, Annie a besoin de vous.
Réglez vos épingles à B2.
Voici le message.
12, 11 -
-Je suis dans mon premier secret réunion.
-14, 11, 18, 16 -
-Pierre était en voix ce soir grand.
Je pourrais dire que le message de ce soir était vraiment important.
-3, 25.
C'est un message d'Annie elle-même.
Rappelez-vous, ne le dites à personne.
-90 Secondes plus tard, je suis dans la seule pièce de la maison où un garçon de neuf ans
pouvait s'asseoir dans la vie privée et de décodage.
Aha, B. Je suis allé à l'autre.
E. Le premier mot est l'être.
S. Il venait plus facile maintenant.
U.
-Oh, allez, Ralphie.
Je dois y aller.
-Je descends tout de suite, ma.
Gee whiz-.
-T, O. Assurez-vous de.
Assurez-vous de quoi?
Quel était Little Orphan Annie essaie de dire?
Assurez-vous de quoi?
-Ralphie!
Randy a obtenu d'aller.
Voulez-vous s'il vous plaît de sortir?
-Très bien, maman.
Je vais tout de suite.
-Je me rapprochais maintenant.
La tension était terrible.
Qu'est-ce que c'était?
Le sort de la planète peut se bloquer dans la balance.
-Ralphie!
Randy doit y aller.
-Je vais être dès la sortie, bordel de merde.
-Gee, y est presque.
Mes doigts volaient.
Mon esprit était un piège d'acier.
Chaque pore vibré.
Il était presque clair.
Oui, oui, oui, oui.
-Assurez-vous de boire votre Ovomaltine.
Ovomaltine?
Une publicité minable?
Fils de pute.
[FIN LECTURE VIDÉO]
>> DAVID J. MALAN: Donc nous avons là la cryptographie.
Alors, comment dans un ordinateur peut-on aller sur la mise en œuvre ou
représenter les choses comme ça?
Eh bien, nous avons besoin d'une façon de nous exprimer un peu plus souple que
nos variables à ce jour ont permis.
Nous avons eu ints.
Nous avons eu des chars.
Nous avons eu des flotteurs et des chambres doubles et quelques autres.
Mais ce sont des pièces individuelles de la mémoire qui ne nous permet pas vraiment de
exprimer des choses comme des mots et des phrases et des phrases.
En effet, nous avons appelé ces chaînes choses.
Mais nous avons promis que c'est vraiment juste une simplification dans le CS50
bibliothèque que nous avons l'intention de décoller.
>> Et nous allons donc commencer à faire ici.
Permettez-moi aller de l'avant et d'ouvrir un fichier -
l'ensemble de ces documents sont disponibles en ligne habitude -
array.c appelé à résoudre un problème sans rapport avec cordes, mais qui dresse un
image ici de la façon dont nous pourrions utiliser ce qu'on appelle un tableau.
Un tableau est un type de données.
Il s'agit d'un type de variable, en quelque sorte, qui a de multiples types de données plus petits
à l'intérieur de celui-ci de nouveau au dos à dos à dos.
Ainsi, par exemple, si nous voulons écrire un petit programme qui vous donne votre
Quiz moyenne pour un cours comme celui 50 qui a deux questionnaires, vous pourriez très facilement
écrire ce programme - la base même sur quelques-uns des matériaux de la semaine dernière -
en utilisant getInt et un couple de variables.
Int quiz1, int quiz2, et c'est assez simple.
C'est peut-être 10, 20 lignes de code, max, pour mettre en œuvre un programme qui demande à l'
utilisateur pour deux scores de quiz, puis calcule leur moyenne en les ajoutant
ainsi, en divisant par deux, puis l'impression des résultats.
Nous pourrions probablement le faire assez facilement maintenant, après
un certain nombre de minutes.
>> Mais le problème est que suppose que 50 en avaient trois ou quatre quiz.
Supposons que vous vouliez utiliser le même programme pour une classe qui avait
jeux-questionnaires hebdomadaires.
Pensez à une classe qui a des quiz hebdomadaire.
Si il ya comme 16 ou tant de semaines dans un semestre, vous avez maintenant 16 variables -
int quiz1, int quiz2, int quiz3, int quiz4.
Dès que vous commencez à voir cette redondance, ce copier-coller
du code, il doit commencer à faire que vous souhaitez, il y avait une meilleure façon.
Et heureusement, parce que des tableaux, il est.
Alors allons-y.
Tout d'abord, laissez moi vous présenter une chose très simple que nous n'avons pas utilisé à ce jour,
mais vous allez le voir de temps en temps dans le code.
C'est ce qu'on appelle généralement une constante.
Donc, c'est une constante dans le sens où cette valeur ne change jamais.
La convention de l'homme lors de la création d'une constante est d'utiliser la totalité du capital
lettres, juste pour qu'il se démarque vraiment dans votre code.
Et le mot-clé spécial que vous utilisez dans C est # define.
Donc, si vous dites # define, puis un espace, puis le mot que vous voulez utiliser pour
la constante de nom, et ensuite la valeur de la constante.
Alors préavis, ceci est différent de l'attribution quelque chose à une variable.
Il n'ya pas de signe égal.
Il n'ya pas de point-virgule.
C'est ce qui est généralement connu comme une directive de préprocesseur, mais plus sur
une autre fois.
>> Pour l'instant, ce qui crée une valeur immuable appelé QUIZ dont réelle
valeur numérique est 2.
Donc, partout où vous voyez des quiz, des jeux-questionnaires, des jeux-questionnaires tout au long de ce dossier, c'est
simplement le numéro 2.
Maintenant, si je regarde principal maintenant, nous allons voir comment cela fonctionne.
Dans un premier temps, il semble un peu obscur.
Mais c'est tous les trucs de la première semaine.
Demandez à l'utilisateur pour les grades.
Comment pouvons-nous faire cela?
Eh bien, à la ligne 22 -
c'est vraiment la partie juteuse -
Je déclare un flotteur, mais pas seulement un seul flotteur.
Je déclare, au contraire, un tableau de valeurs à virgule flottante.
Cette variable va être appelé qualités, comme le laisse entendre ici.
Mais la seule nouvelle syntaxe sont donc ces crochets, le fait
ce que j'ai dit grades flotteurs et ensuite support ouvert, puis un certain nombre.
Remarquez, si cela est une constante, c'est juste comme nous l'avons fait.
Cela signifie que l'ordinateur hey, donne-moi deux flotteurs, et nous allons collectivement appeler
les notes.
Ceci est en contraste à un processus beaucoup plus pénible comme ça.
Float grade1, flotter grade2, et ainsi de suite.
Ainsi, un tableau nous permet de mettre en œuvre cette idée, mais beaucoup moins hirsute, dans
de telle sorte que nous pouvons écrire une seule ligne de code au lieu de, disons, 16 pour un 16
semestre semaine.
Donc je ne voulais pas coder en dur 2 parce que si vous pensez à ce sujet maintenant
logiquement - suppose que l'année prochaine CS50 changements à 3 quiz à la place.
Et j'ai eu le numéro 2 ici.
J'ai eu le numéro 2 ici.
Il devient très pénible et très facile à visser et à changer accidentellement
une valeur de 3 et de manquer une autre valeur de 2.
Donc, je vais plutôt abstraite à cette distance et utiliser cette constante qui, comme son
nom l'indique, ne change jamais.
Et maintenant, peu importe si nous avons différents quizz cette année ou la prochaine, je
suffit de le changer en un seul endroit, ici en haut.
>> C'est tout ce que constante est.
Pendant ce temps, la nouvelle fonctionnalité conceptuelle est celle d'un tableau.
Ainsi, les crochets de me donner ce beaucoup de chars et me laisse collectivement
appelle les classes ici.
Alors maintenant, nous allons voir ce que je vais faire.
Ici, à la ligne 24 est le début d'une boucle for.
C'est vraiment rien d'extraordinaire.
Il est juste en utilisant des questionnaires au lieu d'un nombre codé en dur.
Mais il n'y a rien intellectuellement différent là-bas la semaine dernière.
C'est juste printf.
Donc printf ("% d quizz nombre de% d") parce que je veux juste me donner imprimer quizz
Numéro un des deux, puis deux sur deux.
Donc, c'est une chose purement esthétique.
Mais la partie la plus intéressante est maintenant en ligne 27.
Afin de remplir l'un des deux marqueurs avec une virgule flottante
valeur, nous utilisons à nouveau entre crochets.
Dans ce cas, je suis en utilisant i parce que cette boucle for a commencé avec i égal à
quelle valeur, apparemment?
0.
>> Ainsi, à la première itération de cette boucle, c'est comme si je
a écrit cela dans le code.
Mais sur la seconde itération de cette boucle, c'est comme si je
a écrit ceci dans mon code.
Mais le fait que je suis en utilisant une variable est parfait parce que, comme son nom l'
suggère, c'est de faire varier sa valeur à chaque itération.
Donc, je suis remplissant ce tableau à une place à la fois.
Qu'est-ce que ce tableau ressemble?
Eh bien, la raison pour laquelle j'ai dessiné ce super simple rectangle sur l'écran ici
avant c'était pour cette raison.
Un tableau est juste un morceau de mémoire suivi d'un autre morceau de mémoire,
suivi d'un autre bloc de mémoire, et ainsi de suite.
Donc, si mon tableau est de taille 2, dans ce cas là, tout ce que je ferais par
tapant dans mes scores de quiz, comme ici.
J'ai obtenu 100 sur celui-ci.
Et puis j'ai eu un 99 sur celui-ci.
Alors cette mémoire pourrait même ne pas être utilisé parce que j'ai seulement demandé à la
ordinateur pour un tableau de taille 2.
Ces carrés sont toujours là.
Pas vrai?
Vous avez encore deux gigaoctets de RAM, même si vous êtes seulement
demander deux flotteurs.
Donc, l'idée derrière les tableaux, c'est que l'ordinateur prend juste un morceau de mémoire
et répartit ensuite les petits morceaux dos à dos à dos à dos.
Et si c'est tout un tableau est.
C'est un espace contigu de mémoire, à l'intérieur de laquelle vous pouvez mettre des choses.
>> Maintenant, ce qui se passe ensuite faire juste un peu d'arithmétique ennuyeux.
Si je descendez ici, c'est là que je puis itérer sur le tableau.
Je viens avec la somme de toutes les valeurs dans le tableau.
Et puis-je utiliser la fonction round ici pour réellement faire la
divisé par la somme des quiz.
Mais permettez-moi de saluer ma main à ce que le tri de l'arithmétique assez pour le moment.
Mais tout ce qui est fait pour moi est finalement calculer une moyenne.
Quiz Alors d'abord, plus second questionnaire, divisé par 2, puis l'impression
il comme un int.
>> Mais nous allons maintenant la transition vers un autre exemple appelé chaine1,
qui dresse un portrait similaire, mais en utilisant des chaînes.
Permettez-moi aller de l'avant et de simplifier cela pour un instant.
Et pardonne l'indentation pour le moment.
Avis à la ligne 19 de cet exemple, je reçois une chaîne à l'utilisateur.
Mais remarquez ce que je fais en suivant les lignes 22 en avant.
Je suis en fait une itération de i jusqu'à - et c'est un nouveau truc -
strlen longueur de la chaîne,.
Il s'agit d'une fonction qui est livré avec C que si vous passez une chaîne, il raconte
vous combien de caractères sont dans cette chaîne.
Voilà tout.
Le fait que ce soit strlen au lieu de la longueur de chaîne est juste parce que c'est
plus succinct.
Il ya 30 ans, les gens ont aimé écrire des choses aussi succinctement que possible.
Nous avons donc conservé cette convention ici.
i + + signifie simplement incrémenter i à chaque itération.
Et maintenant, remarquez ce qui est vraiment intéressant.
Donc, à la ligne 24, je dis ordinateur, donnez-moi un personnage, huit
bits, et l'appeler c.
Mais quel est ce sur le côté droit de dire?
En anglais, ce que ça représente?
[Inaudible]
DAVID J. MALAN: Exactement.
Donnez-moi le premier caractère dans le tableau.
Ou, plus généralement, donne-moi le caractère i-ème dans le tableau.
Et se rendre compte qu'il est important maintenant que les informaticiens, nous sommes en fait
compter à partir de 0.
Vous n'avez pas le pouvoir discrétionnaire maintenant pour commencer à faire cela.
Maintenant, il faut se comporter conformément aux attentes de l'ordinateur et
compter à partir de zéro, car [0] va être le premier
caractère dans une chaîne.
[1] va être le deuxième.
[2] va être la troisième, et ainsi de suite.
Ainsi, ce programme, si je le compiler - c'est, encore une fois, chaine1.
>> Donc, assurez-string1.
Et maintenant je cours chaine1 dans ma fenêtre de terminal.
Il est en attente d'entrée, donc je vais taper dans, disons, David.
Entrée.
Et maintenant, il imprime DAVID tous sur des lignes différentes, car
remarqué ce que je fais.
Je suis d'imprimer un caractère à la fois.
Maintenant, nous n'allons pas entrer dans les détails aujourd'hui à ce sujet.
Mais j'ai supprimé il ya un moment cette vérification ici.
Il s'avère que si l'utilisateur se conduit mal, contradictoire, ou tout simplement
confus, vous pouvez effectivement ne parviennent pas à donner une chaîne d'une certaine longueur.
Si vous appuyez sur la mauvaise touche sur le clavier, vous pouvez donner
aucune chaîne à tous.
Ou si vous êtes méchant, vous pourriez essayer de coller de la valeur d'un gigaoctet de l'
essai pour combler cette chaîne.
Et si l'ordinateur manque de mémoire, il s'avère que nous allons
pour récupérer cette valeur spéciale appelée nulle.
Donc pour l'instant, sachez simplement qu'il ya cette valeur spéciale appelée nulle selon laquelle
nous permettra de vérifier quand nous sommes sortis de la mémoire, entre autres choses.
>> Mais si j'ouvre maintenant chaîne2, vous remarquerez une différence ici.
Remarquez ici une différence avec string2.
Avec chaîne2, cette boucle for est un peu différent.
Permettez-moi de supprimer les zéros de sorte que nous pouvons en parler une autre fois.
Mais ce qui est différent de la boucle for, cette fois?
Et je peux revenir à l'exemple précédent.
C'est donc la deuxième version.
Ceci est une version un.
Un, deux, un, deux.
Donc, l'appel strlen est où?
C'est dans la première partie de la boucle for.
Toute pensée quant à pourquoi je fais cela?
Ouais.
[Inaudible]
DAVID J. MALAN: Nous n'avons donc pas appeler la fonction à chaque fois.
Exactement.
Rappelons à partir de boucles qui ils sont super simple une fois que vous sorte de
comprendre que c'est l'initialisation, la
condition, et la mise à jour.
Le problème est que la condition se produit sur tous les
itération de la boucle.
Et si dans cet exemple ici, ce qui est mauvais sur le fait
que c'est mon état?
Vous appelez strlen encore et encore et encore.
Mais une fois que j'ai tapé dans DAVID, la longueur de cette chaîne est de cinq.
Et ça ne va pas changer à chaque itération de la boucle parce que le
chaîne est encore D-A-V-I-D. Donc, c'est une allusion à ce qui se passe de devenir un
idée plus important connu sous le nom une décision de conception, où - n'ont tout simplement pas
rendre l'ordinateur faire le travail inutile.
>> Or, comme un avant-goût de pset 2, pset 2 dans l'édition standard est
va vous mettre au défi de mettre en œuvre effectivement un certain nombre de chiffres, certains
nombre d'algorithmes de chiffrement, de sorte que vous pouvez crypter et décrypter
des messages secrets, un peu comme la Ralphie personne là décodé.
Dans l'édition pirate de pset 2, nous allons aller un peu plus loin.
Nous allons vous remettre un fichier à partir d'un système réel de l'ordinateur qui contient une
tas de noms d'utilisateur et mots de passe chiffrés réels, et le défi
pour l'édition pirate va être à casser les mots de passe et des figures
ce que la cryptographie ou quel secret a été utilisé pour effectivement
générer les mots de passe.
Et nous allons le faire en utilisant une nouvelle fonctionnalité de C que je vais vous donner
vous avez juste une démo de, connu sous le nom de ligne de commande arguments.
>> Ainsi, il s'avère, comme certains d'entre vous ont vu dans la section ou dans les manuels,
principal ne doit pas toujours être vide entre parenthèses.
Il s'avère que principal peut également être écrit comme ceci, avec deux arguments,
argc et argv, où argc est le nombre de mots que vous tapez après
le nom du programme sur votre ligne de commande.
Et argv sont les mots réels.
Et comme les crochets y penser, argv est un tableau apparemment.
Ça va être une chaîne après une série après une chaîne en mémoire.
Donc, ce que nous allons être en mesure de le faire, à commencer par pset 2, est
quelque chose comme ça.
Si je fais argv1, qui est un exemple, nous allons revenir à lundi, et exécuter
il, remarquez que cela ne semble pas faire quoi que ce soit pour le moment.
Il se contente d'afficher son nom propre.
Mais si je dis au revoir classe, notez que ce programme itère apparemment
sur chacun des mots qui ont été tapés à l'invite.
Et les moyens par lesquels nous allons accéder aux mots que l'utilisateur a
tapé à l'invite est de changer principale, à partir de ce week-end, de int
main (void) en int main (argc, argv).
Et c'est ainsi que va naître arguments de ligne de commande.
Et une fois que vous obtenez vraiment sophistiqué à cela, vous serez en mesure d'écrire
programmes vraiment trippy, comme celui-là, qui va au-delà de
certaines des fonctionnalités que nous avons fait jusqu'à présent, mais tous très puissant.
>> Donc, nous allons laisser ce avec cela sur l'écran.
Et nous allons vous voir lundi.