>> INTERLOCUTEUR 1: Très bien.
Bienvenue.
C'est la deuxième semaine du CS50, et nous avons jusqu'ici été en utilisant des fonctions mais
largement pris pour acquis.
Nous avons utilisé printf qui a le effet secondaire d'impression
choses à l'écran.
Nous avons utilisé rendez-int, float obtenir.
>> Mais que faire si vous voulez vraiment créer vos propres fonctions, comme certains d'
vous avez peut-être déjà commencé à faire pour ensemble de problèmes Un, bien
pas strictement nécessaire?
Eh bien, allons de l'avant et revenir sur cette problème de demande simplement à l'utilisateur
leur nom et d'imprimer quelque chose sur le écran, mais essayez de factoriser certains
de la communauté que nous avons vu dans notre code jusqu'ici.
Donc, je veux dire par ce qui suit.
>> Je vais aller de l'avant et créer un nouveau programme, appelez simplement
il hello.c comme d'habitude.
Je vais aller de l'avant et me donner inclure io.h norme au sommet.
Je vais me donner aussi préventivement la bibliothèque CS50 sorte que
Je ne suis pas crié par le compilateur.
Et maintenant, je vais aller de l'avant et déclarer int, main, vide.
>> Et puis ici, c'est là que je veux pour commencer à externaliser les fonctionnalités de
une autre fonction que je me suis vais écrire mais cela ne
existent actuellement.
Par exemple, supposons que je voulais écrire une fonction qui me permet d'
imprimer bonjour, virgule, puis le nom de certains utilisateurs.
Plutôt que de continuer à faire printf bonjour,% s, ça ne serait pas bien si
il y avait juste une fonction appelée printf, mais pas le nom d'impression?
>> Donc, en d'autres termes, je veux être en mesure de écrire un programme qui fait un peu
quelque chose comme ça.
Tout d'abord, je vais dire printf votre nom, incitant ainsi à l'utilisateur de
me donner son nom, et puis je suis va utiliser la chaîne familières s à
déclarer une chaîne.
Donne-moi une variable de type string, appelez-s, et en ce que le magasin
résultat de l'appel obtenir chaîne.
Mais maintenant, ces dernières semaines, je n'aurais un peu laborieusement fait bonjour,% s / n.
>> Et en d'autres termes, nous avons vu ce exemple un tas de fois, et c'est un
exemple trivial, car il ya juste un ligne de code donc c'est vraiment pas un
gros problème pour continuer à taper à nouveau.
Mais supposons que cette ligne de code ont été effectivement devenir un fardeau, et
ce n'est pas une ligne de code, mais c'est 10 lignes de code quelques semaines à partir de maintenant,
et vous êtes juste fatigué de copier et de coller ou
retaper ce même code.
Ne serait-il pas agréable au lieu de faire printf bonjour,% s et ainsi de suite,
ça ne serait pas bien s'il y avait juste une fonction appelée nom d'impression
prend un argument -
en d'autres termes, il faut d'entrée -
et puis point-virgule.
Alors que la fonction, ne serait-il Soyez gentil si cela existe?
Alors je ne voudrais pas avoir à se soucier ce qui est printf, ce% s et tous
ces complexités qui sont pas tout à fait intéressant.
Ils sont utiles.
>> Donc nom d'impression, malheureusement, n'a pas été inventé certains il ya 40 ans et plus.
Personne ne pensait à écrire.
Mais c'est la beauté d'avoir une langage de programmation, tout comme dans
Scratch vous pouvez définir des blocs personnalisés, de sorte en C et plus n'importe quelle langue, pouvez-vous
définir votre propre fonctionnalité, peut vous définissez vos propres fonctions.
Ainsi, même si nous obtenons principal par automatiquement gratuitement, nous pouvons déclarer
nos propres fonctions.
>> Donc, je vais faire un peu de place ici en haut, et je vais déclarer ma
propre fonction qui va chercher un peu étrange au début, mais nous y reviendrons
Retour à cela avant longtemps.
Je vais dire nulle, ce qui indiquant que cette fonction fait
quelque chose, a un effet secondaire, mais il ne revient pas quelque chose de moi dans le
même manière que se int ou obtenir chaîne elle-même fait.
Et je vais donner à cette fonction une nom de l'appellation d'impression, et je vais
précise que ce gars va prendre une chaîne, et je vais appeler que
nom de chaîne.
Je pourrais l'appeler ce que je veux, mais je veux que mon code soit auto-documenté.
En d'autres termes, si l'un d'entre vous étaient à ouvrir ce fichier et le lire, vous pourriez
sorte de déduire du nom de cette entrée ce rôle qu'il est censé jouer.
>> Et maintenant, ci-dessous, je vais ouvrir accolade et fermé accolade,
et ainsi remarqué que j'ai suivi la même motif sur quatre lignes à travers sept comme
J'ai suivi pendant une bonne semaine plus maintenant entre, par exemple, des lignes et neuf
14 qui composent principal.
En d'autres termes, imprimer le nom est une autre fonction.
Maintenant, le compilateur ne va pas savoir pour appeler automatiquement cette chose
parce que je me suis littéralement viens de l'inventer, mais il saura toujours faire appel principal
automatiquement, et puis bien sûr en ligne 13, j'appelle mon propre fonction.
Et parce que j'ai déclaré que la fonction sur quatre lignes avant principal,
cela va enseigner le compilateur ce entre guillemets », nom d'impression"
signifie et ce qu'il devrait faire.
Donc, je suis en quelque sorte de lui donner une nouvelle coutume bloquer dans le cadre de, disons, zéro.
>> Donc ici, je peux mettre que très commun ou un motif récurrent de code, je garderai
écriture en classe, printf % S bonjour,% s / n ", -
qu'est-ce que je veux mettre ici?
S?
Je tiens donc à mettre le nom dans ce contexte.
Alors remarquer un peu d'une dichotomie ici.
Parce que je déclare ma propre fonction et j'ai un peu arbitrairement appelé
il imprimer le nom, et parce que j'ai spécifié entre parenthèses que cette
fonction prend un argument, le type de qui est une chaîne - c'est donc un mot
ou une phrase ou quelque chose comme ça - et J'appelle ce nom d'argument, que
signifie la seule variable qui est en portée, pour ainsi dire, est le nom.
>> S existe seulement entre ce deux accolades, bien sûr?
Eh bien, tout comme la ligne 10 par le biais 14 Ainsi, tout comme le lundi ne pouvez pas utiliser
S, mais ce que je peux faire est de passer S en caractères d'imprimerie.
Imprimer le nom se trouve juste à lui donner un alias, un synonyme, un surnom,
appelant son nom, et maintenant utiliser dans cette ligne.
Alors maintenant, laissez-moi sauver ce, effectuer un zoom arrière.
>> Permettez-moi d'aller de l'avant et faire bonjour.
On dirait bien.
N'a pas cracher des erreurs. . / Bonjour Entrée.
Quel est mon nom?
David.
Et bonjour David.
Donc, pas tout à fait passionnant, mais il suffit de penser maintenant.
Vous avez maintenant le même ingrédient comme nous l'avons fait dans Scratch
faire nos propres fonctions.
>> Mais il ya un peu d'une chasse aux sorcières.
Supposons que je n'avais pas vraiment pensé cette grâce et je fait sans
vraiment y penser écrit cette fonction ici.
Sent parfaitement raisonnable.
Dans Scratch il n'ya pas de notion d'emplacement dans vos scripts.
Vous pourriez mettre un ici, un ici, une place ici, et il pourrait commencer
à regarder un peu en désordre si vous n'avez pas étalez soigneusement, mais ce n'est pas
Peu importe où physiquement les scripts étaient à l'écran.
Malheureusement, dans C - et c'est la différence langages comme Java et Python
et d'autres que vous connaissez peut-être avec - malheureusement en C, afin de ne
d'importance parce que regarder ce qui se va se passer maintenant.
>> La fonction par défaut qui va à exécuter est, bien sûr, le principal.
Principal va appeler le nom d'impression sur ligne huit, mais malheureusement, le
compilateur ne saura même pas que le nom d'impression existe jusqu'à ce qu'il arrive à la ligne 11,
ce qui n'est malheureusement va être trop tard.
Alors, faisons faire bonjour.
Et maintenant, putain, deux erreurs générées.
Alors maintenant, laissez-moi faire défiler jusqu'à la très D'abord, comme nous devrions toujours faire, et
remarquerez que c'est à me crier dessus, "Déclaration implicite de la fonction
imprimer le nom ".
>> Donc, nous avons vu ce message avant, déclaration implicite de la fonction.
Lorsque nous avons vu ce genre d'erreur?
Quand je ne comprend pas une bibliothèque.
Si j'ai oublié cs50.h et je recevrais engueuler pour obtenir string ou obtenir int.
Mais dans ce cas, cette fonction print nom n'est pas dans une bibliothèque, non?
C'est littéralement dans ce dossier, afin ce qui est vraiment le problème?
>> Eh bien, malheureusement en C, il vous faut si incroyablement littéralement que si vous
vouloir une fonction appelée nom d'impression existe, il faut soit mettre en œuvre
cette fonction tout en haut de votre Code afin qu'il soit accessible à la baisse
fonctions, mais franchement, cela devient bâclé très rapidement.
Personnellement, j'aime donner la priorité principale car alors il est très clair que cette
programme fait à première vue.
Et en plus, vous pouvez obtenir dans le coin bizarre cas où si x veut appeler
Y mais y peuvent appeler x, il vous suffit physiquement ne peut pas vraiment mettre un
au-dessus de l'autre.
>> Mais il se trouve dans C, on peut résoudre ce très simplement.
Je vais mettre un peu d'espace ici, et je vais juste
préventivement, quoique quelque peu redondante, va enseigner l'
compilateur qu'il existe une fonction appelé nom d'impression, il prend une chaîne,
et je vais appeler il n'en citer virgule.
>> Donc cela maintenant en ligne quatre, ce qui nous n'ont pas vu avant, est une déclaration
d'un nom d'impression de fonction, mais c'est seulement une promesse que cette fonction
éventuellement être défini, finalement être mis en œuvre.
Cet maintenant je peux laisser seul car maintenant c'est la définition, la
mise en œuvre, en quelque sorte le dernier mile de la mise en œuvre de cette
fonction particulière.
Donc franchement c'est stupide, c'est ennuyeux, mais c'est la façon dont C est, et c'est
car il vous emmène très littéralement et, comme un ordinateur franchement devrait,
que fait exactement ce que vous lui demandez de faire, et de manière que les commandes est important.
>> Donc, gardez cela à l'esprit et à nouveau, commencer à constater la récurrence de motifs.
Les chances sont que vous voulez, si vous ne l'avez pas déjà, commencer à rencontrer des messages
comme ce qui à première vue semblent complètement énigmatique, mais si vous commencez
de rechercher ces mots clés comme "Déclaration implicite», la mention d'un
fonction dans ce cas - et franchement, vous parfois même obtenir un peu de vert
symbole de la carotte qui vous indique où le problème est probablement -
vous pouvez commencer à travailler votre chemin à travers encore des messages d'erreur invisible.
Toutes les questions sur l'écriture de votre propre fonction de cette façon?
>> Faisons quelque chose qui est un peu plus convaincant.
Plutôt que de simplement faire quelque chose qui a un effet secondaire de l'impression, laissez-moi aller
avant et enregistrer un nouveau fichier, et nous allons appeler cette positive.c, même si c'est
va être un peu différent par rapport à la dernière fois.
Et cette fois, je tiens à re-mettre en œuvre exemple positive.C de dernière heure, qui
est la force à l'utilisateur de donner moi un entier positif.
Mais j'ai dû utiliser obtenir int dernière fois.
N'aurait-il pas été bien s'il y avait une fonction appelée obtenir int positif
que je ne pouvais confier cette morceau de fonctionnalités à?
Donc, la différence est ici nous allons mettre en oeuvre obtenir int positif, mais à la différence
Nom d'impression qui a eu un effet secondaire - il n'a retourné quelque chose pour moi comme
un nombre ou une chaîne -
se int positif est, bien sûr, va revenir, espérons-le, un int positif.
>> Donc, nous allons le faire.
Inclure cs50.h, Inclure norme io.h.
Int void main.
Et maintenant, ici, je vais aller de l'avant et disons int, appelez ça n, est égal
obtenir int positive.
Et tout comme obtenir int existe déjà parce que le personnel a écrit, je vais
à supposer pour le moment que se int positive existe, et maintenant je vais
à aller de l'avant et de dire printf, merci pour l'% i / n ", n.
>> Alors maintenant, si je compile ce programme, ce qui qui va se passer dans mon terminal
fenêtre au bas de l'écran?
Je vais probablement obtenir que même erreur que précédemment.
Essayons donc de cela.
Rendre positif.
Et encore une fois, déclaration implicite de fonction, obtenir int positive.
Ainsi, nous pouvons résoudre ce dans un couple des manières.
Je vais rester simple et juste mettre ma déclaration ici et obtenir
int positive.
J'ai besoin de ce qu'on appelle la signature.
La signature se réfère seulement à l'esthétique de l'
la première ligne du programme.
Alors, que doit obtenir positif int retour?
>> Ainsi, un int.
Je veux dire, idéalement, il serait de retour quelque chose comme int positif, mais que
n'existe pas.
Nous n'avons pas vu que, parmi nos données types, nous devons donc faire face à la
fait que nous avons très peu types de données pour travailler avec.
Mais nous ne pouvons retourner un int et juste confiance que ce sera positif.
Ça va être appelé obtenir int positive.
>> Et maintenant, que diriez-vous de ses arguments?
Faut-il une entrée?
Est-il besoin n'importe quelle entrée?
Donc, il n'a pas besoin de savoir en quoi que ce soit à l'avance.
Recevez chaîne ne pas obtenir int ne fonctionne pas.
Ne printf - il doit avoir une certaine entrée passée dans le - et le nom d'impression
besoin d'un peu d'entrée, mais se int positif ne fait pas.
Donc, je vais explicitement dire le vide du compilateur.
Void est l'absence de toute autre chose.
Alors moyens vide rien ne se passe à l'intérieur de ces parenthèses, virgules.
>> Et maintenant, au fond de mon dossier - et encore une fois, je vais être de nature anal
ici mettre principale dans la partie supérieure, qui est bien pratique car de cette façon,
chaque fois que vous ou quelqu'un d'autre ouvre le fichier, le
fonctionnalité est juste là.
Vous pouvez plonger dans de zéro.
Alors maintenant, je vais reproduire ceci, obtenir nulle int positif, mais je ne suis pas
va frapper un point-virgule maintenant.
Je vais ouvrir accolades, et maintenant j'ai besoin d'emprunter
quelques idées du lundi.
>> Donc, comme vous le savez, nous avons fait quelque chose que faire ce qui suit
quelque chose était vraie.
Et qu'ai-je fait?
J'ai fait quelque chose comme donner moi un entier positif,
peu d'une invite.
Je pourrais utiliser les mots que je veux.
Et puis j'ai utilisé quoi?
Int n est égal à obtenir int, aucun argument à lui.
>> Et la différence.
Lorsque vous appelez une fonction, lorsque vous utilisez une fonction, vous ne mettez pas dans le vide.
Vous ne faites que lorsque vous déclarez une fonction, l'enseignement au compilateur
il doit s'attendre.
Donc, vous n'avez pas besoin de mettre il annuler vous-même.
>> Et maintenant, quel était mon état?
Eh bien, n n'est pas égal à positive, mais c'est juste un pseudo-code.
Alors, comment puis-je exprimer cela plus proprement?
Ainsi, inférieure ou égale à zéro.
Encore une fois, notez que vous pouvez faire inférieure ou égale à.
Même si c'est deux séparés symboles, vous pouvez le faire sur
votre clavier en tant que tel.
>> Mais il ya encore un bug qui J'ai foiré dernière fois aussi.
Je dois déclarer -
exactement.
Je dois déclarer à l'extérieur n de la boucle.
J'ai donc besoin de mettre n place ici, et je ne sais pas envie de re-déclarer ici
de peur que je reçois une nouvelle variable.
Je veux juste d'attribuer une valeur ici.
>> Et maintenant, je ne suis pas tout à fait fini.
Permettez-moi de m'avancer et prétendre que je suis fait.
Rendre positif, et maintenant il ya une nouvelle erreur.
Contrôle atteint la fin de fonction non nulle.
Donc, un nouveau message d'erreur, mais si vous genre de démêler chacun des mots, il
Conseils probablement à ce qui est erroné.
>> Contrôle.
Contrôle signifie simplement à l'ordre des opérations dans le programme.
L'ordinateur est dans le contrôle et quelque chose s'est mal passé.
Alors qu'il arrive en fin de une fonction non nulle.
Quelle fonction est-elle apparemment référence?
Quelle est la fonction est non-nulle?
Donc obtenir int positif, et un peu confusion dans ce puits,
c'est une sorte de vide.
Il a une spécification de vide pour son arguments, mais sa production va
être de type n.
Donc le mot de gauche est le que l'on appelle le type de retour.
Le mot à l'intérieur est ici les zéro ou plusieurs arguments
qu'une fonction prend.
>> Alors, que dois-je faire?
A ce point de mon code, la ligne 21 où l'invite clignotant est maintenant, je
un int positif à l'intérieur de la variable appelée n.
Comment puis-je le rendrai principal?
Littéralement.
Retour n virgule.
>> Ainsi, tout comme Colton retourné un morceau de papier avec une réponse à me faisant tomber
ce morceau de papier dans le petit noir boîte sur la table, pour faire en
code, vous venez d'écrire littéralement, le retour n, et c'est comme si Colton étaient
me remettre quelque chose au dos physique.
Dans ce cas, qu'est-ce qui se passe est d'obtenir int positif va restituer
ce qui est sans doute un effet positif entier à qui?
D'où vient cette valeur finir?
Qui se retrouve dans cette variable, n, et puis nous procédons à la ligne neuf.
>> Donc, en d'autres termes, afin de opérations, ce programme commence
d'exécution, et le compilateur réalise, Oh, vous voulez la bibliothèque?
Permettez-moi d'aller prendre tout ce qui est à l'intérieur de cela.
Oh, vous voulez la bibliothèque IO standard?
Permettez-moi d'aller prendre tout ce qui est à l'intérieur de cela.
Qu'est-ce que le compilateur dire à lui-même quand il frappe quatre lignes?
Oh, vous avez promis de mettre en œuvre le fonction appelée obtenir positive, mais
nous y reviendrons plus tard, quelque chose le long de ces lignes.
>> Void main Int signifie simplement que voici les entrailles de mon programme.
Ligne sept est juste une accolade.
Ligne huit dit sur la gauche, donne moi 32 bits pour un entier, appellent n.
Sur le côté droit, il est dire obtenir int positive.
Maintenant, arrêtons-nous cette histoire parce que maintenant Je ne garde pas déplacer mon curseur vers le bas.
Mon curseur va maintenant ici-bas parce que maintenant obtenir int positif exécute.
Int n est déclarée.
Procédez comme suit.
Printf me donne un entier positif.
>> Obtenez un int de l'utilisateur, le stocker dans n, et peut-être le faire encore et encore.
Cette boucle signifie que ce code pourrait exécuter monter et descendre comme ça à nouveau
et encore, mais lorsque l'utilisateur finalement coopère et me donne un positif
int, j'ai touché la ligne 21, à quel point l' nombre est remis en arrière, et que l'on
dois-je mettre aujourd'hui?
Nine.
Contrôle, pour ainsi dire, retourne pour aligner neuf.
C'est la ligne qui est maintenant en charge.
>> Donc, c'est ce qui se passe tous cette fois sous le capot, mais
lorsque nous avons utilisé des fonctions comme printf ou même obtenir chaîne que quelqu'un d'autre
a écrit pour vous, le contrôle avait été remis La ligne de code à quelqu'un d'autre
par ligne par ligne.
C'est juste que nous ne pouvait pas le voir et nous ne pouvait pas vraiment décrire dans ce
programme parce que c'est une autre fichier sur le disque dur
à notre insu.
Donc, nous allons réellement compiler et exécuter cette entreprise.
>> Rendre positif.
Compiler, c'est le progrès.
. / Positive.
Donnez-moi un entier positif.
Soyons difficile.
Négatif 1.
Zéro.
Donnons-lui 50.
Merci pour le 50, et ainsi de contrôle est maintenant de retour.
Toutes les questions, alors, à ce sujet?
Ouais?
>> [Inaudible].
>> Dites à nouveau.
Oh, bonne question.
Ainsi, vous remarquerez peut-être un parallèle qui Je suis une sorte de coupe sur un coin.
Dans la ligne 12, je veux dire, obtenir int positif retourne un int, mais par la même
logique, il va maintenant de soi que dans ligne six, je dis que les rendements principales
un int, mais qu'avons-nous jamais eu dans l'un de nos programmes?
Nous n'avons jamais eu de mention cette déclaration de mot-clé.
>> Ainsi, il s'avère que, dans C, au moins la version de celui-ci que nous utilisons
fait en 1999, techniquement, ce n'est passe automatiquement pour vous.
Chaque fois que vous mettez en œuvre un programme et vous mettre en œuvre une fonction appelée principale,
cette fonction retournera zéro par par défaut si vous ne dites pas non,
et nul n'est qu'une convention.
Le monde retourne zéro ainsi ce qui indique que tout va bien,
effectivement nous laissant avec quatre milliards choses qui pourraient aller
mal de sorte que si nous revenons un, qui pourrait signifier un code qui signifie que ce
chose s'est mal passé.
Nous pourrions revenir à deux, ce qui signifie cette autre chose s'est mal passé.
Nous pourrions revenir quatre milliards, ce qui signifie que cette autre chose s'est mal passé.
>> Et si vous pensez maintenant de votre propre PC ou Mac, vous aimerez rappeler que
Parfois, vous avez des messages d'erreur incompréhensibles à partir du logiciel que vous êtes
l'aide, et parfois il a un humain Description sympathique, mais il ya
souvent un code ou d'un numéro sur l'écran?
Si cela ne vient pas à l'esprit, juste garder un œil sur elle.
C'est typiquement ce que ces codes se réfèrent.
Ils sont inclus dans Microsoft Word et d'autres programmes de sorte que si vous déposez une
rapport de bogue avec l'entreprise, vous pouvez leur dire, oh, je suis numéro d'erreur 45.
Et certains dos de programmeur à l'entreprise peut regarder que dans son
code et dire, oh, c'est parce que j'ai fait ce bug et c'est pourquoi l'utilisateur
obtenu ce message.
>> Mais franchement, c'est juste un peu distrayant et un peu fastidieux à
conclure que, au moins sur notre premiers programmes, nous avons donc
été omettre.
Mais tout ce temps, chacun de votre les principales fonctions a secrètement eu cette
la ligne automatiquement ajouté pour vous par le compilateur, juste par convention
vous faire gagner du temps.
>> [Inaudible].
>> Vous n'avez pas besoin de l'inclure dans le principal.
C'est très bien.
Vous n'avez pas besoin de comprendre si vous étiez mettre en œuvre une fonction de ce genre.
Sinon, l'appartement de fonction à ne fonctionnerait pas.
Mais dans le principal, ce n'est pas nécessaire.
Dans une semaine ou deux, nous allons commencer à obtenir cette habitude une fois que nous voulons commencer
signifiant erreurs.
Très bonne question.
>> Pause verbale si prompts à souligner que ce vendredi, nous ne serons pas en train de déjeuner
en soi, mais nous serons en train de dîner avec certains des étudiants et du personnel.
Si vous souhaitez nous rejoindre, n'hésitez pas libre d'aller cs50.net/rsvp.
18h00 ce vendredi.
L'espace est, comme toujours, limité, mais nous allons continuer à faire ces derniers sur une presque
chaque semaine si l'espace s'épuise cette semaine.
>> Ainsi, le cliffhanger que nous nous sommes quittés sur Lundi était que les chaînes peuvent réellement
être indexé en qui vous veut juste dire peut obtenir sur le premier caractère, la
second caractère, le troisième caractère et ainsi de suite, parce que vous pouvez
penser effectivement d'une chaîne, comme bonjour, comme dans ce cas-cinq
lettres à l'intérieur des boîtes.
Et vous pouvez obtenir à chacun de ces boîtes avec ce syntaxe Avons-nous
introduire le lundi?
Ces crochets sur votre clavier.
C'est juste voulu aller à l'emplacement zéro.
>> Nous commençons à compter à zéro, de sorte que support zéro signifie h, un support
e signifie, et ainsi de suite.
Et donc tout le temps quand nous avons été utilisant des chaînes et en tapant "bonjour"
et «monde» et d'autres choses sur l'écran, il a été stocké
dans des boîtes de ce genre.
Et prendre une supposition.
Qu'est-ce que chaque case représente physiquement à l'intérieur de votre ordinateur?
>> [Inaudible].
>> Désolé?
>> Personnages.
>> Ainsi, un personnage, certainement dans le cas de chaînes, et un personnage est juste
huit bits ou un octet.
Alors vous êtes probablement au moins vaguement familiers avec le fait que votre
ordinateur doté d'une mémoire.
Il dispose de deux types de mémoire au moins.
L'un est le disque dur sur lequel vous enregistrez farcir en permanence, et c'est
typiquement grande afin que vous puissiez avoir des films et de la musique et ainsi de suite.
>> Ensuite, vous avez un autre type de mémoire appelée RAM, R-A-M, Random Access
Mémoire, et c'est le type de mémoire qui est utilisé lorsque votre ordinateur est
fonctionne, mais si vous perdez votre pouvoir ou batterie meurt, tout ce qui est stocké
dans la RAM disparaît si vous perdez le pouvoir tout à fait, car il n'est pas
persistante.
Vous avez généralement, de nos jours, un concert de celui-ci, deux concerts, voire plus.
Et la hausse de RAM, c'est que c'est beaucoup beaucoup plus rapide que les disques durs
ou même l'état solide entraîne de nos jours, mais il est généralement plus cher, donc
vous avez moins de celui-ci.
>> Alors, la conversation d'aujourd'hui se rapporte vraiment à la RAM, ce type de mémoire qui
n'existe que tant qu'il ya puissance être introduit dans votre ordinateur.
Ainsi, lorsque vous tapez dans H-E-L-L-O, pénétrer sur le clavier, l'H va dans une
octet de RAM, le E va dans un autre octet de mémoire vive, comme c'est
le reste du mot.
Alors, rappelons ce que nous avons pu de faire la dernière fois, c'était cela.
Permettez-moi d'aller de l'avant et d'ouvrir le fichier que nous avons appelé string.c, et rappelons
qu'il avait l'air un peu quelque chose comme ça.
Permettez-moi de réellement roule en arrière et changer il exactement à quoi il ressemblait,
longueur de la chaîne de l'art.
>> Alors regardez le programme ici.
Nous incluons la bibliothèque CS50 si que nous pouvons utiliser obtenir chaîne.
Nous incluons io.h norme afin que nous puissions utiliser printf.
Pourquoi avons-nous inclus ?
C'était nouveau lundi.
Nous avons donc voulu longueur de la chaîne.
Str Long.
Les gens ont décidé il ya quelques années, disons simplement être succincte.
Au lieu de l'appeler «longueur de la chaîne», appelons-le "str leng" et laissez l'
Figure du monde que dehors, et c'est donc ce que nous avons accès à des .
>> Ceci est familier.
Ceci est familier.
C'est un peu nouveau.
En ligne 22 - et nous reviendrons à ce sujet, mais pour savoir maintenant -
et vous voulez savoir ce que d'avoir lire la documentation ou si
vous le saviez déjà C -
obtenir chaîne peut parfois gâcher.
Si l'utilisateur est vraiment contradictoire ou coopératifs et il ou elle vient
ne rien taper au clavier ou types tellement au clavier
il accable la mémoire de l'ordinateur, en théorie, obtenir chaîne pourrait revenir
autre qu'une chose chaîne de caractères.
Il pourrait retourner une valeur spéciale appelée NULL dans toutes les casquettes, N-U-L-L, et c'est
seulement une valeur dite de sentinelle.
C'est une valeur spéciale qui signifie quelque chose de mauvais s'est passé dans ce cas.
C'est l'absence d'une chaîne.
>> Alors NULL Je vérifie pour tout simplement de sorte que, Bref, str Long et
autres fonctions qui viennent avec C, le cas ils s'attendent à une chaîne mais vous les transmettre
l'absence d'une chaîne, si vous passez comme nulles, l'ordinateur ou le programme
va juste planter carrément.
Il se bloque.
Il jettera quelque message d'erreur.
Les mauvaises choses vont arriver.
Ainsi, même si cela est encore pas bien défini -
ce qui fera plus de sens dans une semaine ou deux - dans la ligne 22, c'est juste une
exemple d'auto contrôle d'erreur défensive juste au cas où une fois sur
quelque chose se passe mal millions, à moins mon programme ne plantera pas.
>> Donc, si s ne égaux quelque chose de mauvais, J'ai cette boucle for, et ce fut
où nous avons eu cet autre nouveau morceau de syntaxe.
J'ai une boucle d'itération de zéro jusqu'à la longueur de l'art.
Et puis ici, j'étais impression sur s support i, mais pourquoi n'ai-je utiliser% c tout
un coup au lieu de% s même si s est une chaîne?
C'est un personnage, non?
S est une chaîne, mais s étrier quelque chose, s tranche i où i est nul
ou un ou deux, c'est un individu caractère de la chaîne, et ainsi pour
que, les besoins printf être informé que c'est en effet un caractère d'attendre.
>> Et puis, rappelons-le, qu'est-ce que cette programme réellement faire?
>> Imprimé il dans les colonnes.
>> Oui, exactement.
Il a juste imprimé le mot que je tape dans une colonne, d'un caractère par ligne.
Voyons donc ce message.
Donc, assurez-string.
Compilé OK. . / String.
Permettez-moi de taper dans H-E-L-L-O, saisir et en effet, je l'aurai, un par ligne.
>> Alors permettez-moi de faire une optimisation ici.
Si vous pensez cela, surtout si vous avez programmé avant, il ya
sans doute une inefficacité dans la ligne 24.
En d'autres termes, ce n'est pas nécessairement le meilleur design.
Simple, au moins une fois que vous rappelez-vous ce str Leng est, mais il est
faire quelque chose de stupide potentiellement.
Qu'est-ce qui pourrait être?
>> [Inaudible].
>> Exactement.
C'est la vérification de la longueur de s à chaque fois, même si
H-E-L-L-O va toujours être de cinq caractères.
Chaque fois que dans cette boucle, les cinq ne change pas.
Je pourrais être incrémenter i, mais ce est la longueur de l'art à chaque
itération de cette boucle?
Il est cinq heures, c'est cinq ans, c'est cinq ans, et mais je suis tout de même poser cette
questionner encore et encore et encore.
Maintenant, franchement, l'ordinateur est si sacrément rapide, personne ne va remarquer une
différence dans ce cas, mais ces types des décisions de conception pauvres ne peuvent
commencer à s'accumuler si le compilateur lui-même ne pas essayer de résoudre ce problème pour vous qui
il serait généralement pas, à moins dans l'appareil.
>> Donc, je vais le faire.
Je vais ajouter une virgule après ma première variable, i.
Je vais me donner une autre variables, en l'appelant n, juste en
convention pour les chiffres, et puis je suis va affecter n La valeur de chaîne
longueur de l'art.
Et puis je vais changer mon état d'être quoi?
Je vais changer mon état pour tout i est inférieur à n.
>> Alors maintenant, combien de fois suis-je vérifier la longueur de s?
Une fois, mais c'est OK pour vérifier i contre n, encore et encore, parce que maintenant ceux
Les valeurs ne sont pas réellement en train de changer.
Maintenant, pour l'instant, il suffit de savoir que chaque fois que vous appeler une fonction, il ya un peu de
les frais généraux, ne suffit pas à vous décourager vraiment du jamais utiliser les fonctions, mais
Certes, quand il ya une ligne de code comme ça - et les lignes obtiendront
plus intéressant avant longtemps - où il ya une occasion de réfléchir, si je
taper ce code, combien de fois faut-il exécuter?
Vous allez commencer à voir au fil du temps le performances de vos programmes peuvent
en effet changer.
>> En fait, l'un des problèmes établit que nous avons fait dans les années passées implique
la mise en œuvre, comme vous le rappelez peut-être de semaine zéro, un correcteur orthographique, mais un
Correcteur orthographique qui est conçu pour soutenir un dictionnaire de 150.000, plus
mots que nous vous donnons les gars.
Vous n'avez pas à écrire du code qui charge ces mots dans la RAM, donc en
boîtes, comme nous avons vu sur l'écran un instant Il ya, et puis aussi vite que vous
pouvez, vous devez être en mesure de répondre à une question de la forme, c'est ce mot
mal orthographié?
Est-ce le mot mal orthographié?
>> Et dans quelque chose comme ce que nous avons fait dans les années passées est transformé en,
bien que sur une base opt-in en option, un concours de toutes sortes, par laquelle le
les élèves qui utilisent le moins de RAM et moins temps, moins de cycles CPU, finissent
bouillonne au sommet d'une petite leader board ou le classement que nous mettons sur
page d'accueil du cours comme nous l'avons fait dans les années passées.
Encore une fois, totalement facultative, mais cette parle aux possibilités de conception
qui sommes en avance lorsque nous commencerons construction au sommet de certains d'entre eux
blocs de construction de base.
>> Alors permettez-moi de revenir à ce schéma pour juste un moment et révéler un peu
quelque chose de plus.
Cet effet est une chaîne, et nous avons pris avantage de quelques bibliothèques,
io.h norme qui a -
>> Printf.
>> Printf, entre autres choses.
cs50.h, qui a obtenir int et obtenir chaîne et ainsi de suite, , qui
eu str Long.
Mais il s'avère qu'il ya encore un autre.
Franchement, il ya des tas de tête fichiers qui déclarent fonctions
pour les bibliothèques, mais ce n'est ctype.h en fait va être un peu
avantageux parce que je vais à aller de l'avant et mettre en œuvre une
autre programme ici.
>> Permettez-moi d'aller de l'avant et d'ouvrir quelque chose J'ai écrit à l'avance appelé
capitalize.c, et prenons Regardez comment cela fonctionne.
Remarquez que j'utilise, dans cette version de celui-ci, trois fichiers sont familiers.
Notez que dans la ligne 18, je suis obtenir une ligne de texte.
Avis à la ligne 21, je suis affirmant que le code suivant va
capitaliser s, quel que soit l'utilisateur a tapé , et comment je fais ça?
Eh bien, je prends -
leçon de la dernière fois -
Je déclare i et n et itération sur les caractères de la chaîne.
Et puis qu'est-ce que ce bloc de Code de la ligne 24 à 27
faire en termes simples?
>> Lettre minuscule dos.
>> Exactement.
Si s i support - si le i-ème nature de l'art, qui est un particulier
caractère dans la chaîne, est plus grande que ou égale à un et minuscules -
rappeler que la double esperluette signifier et -
et le même caractère, s i support, est inférieur ou égal à z en minuscules,
cela signifie que c'est un A ou un B ou un C ou point, point, point, ou a z, qui signifie
c'est minuscule.
Qu'est-ce que je veux faire dans ce cas?
Eh bien, je peux le faire un peu énigmatique, mais
nous allons taquiner cet intervalle.
>> Je vais appeler printf, imprime% c parce que je veux reproduire cette
personnage à l'écran.
Je puis va prendre de support i, l' i-ième caractère dans s, et puis pourquoi
je fais ce petit truc ici, Un minuscule de capital moins?
Qu'est ce que cela va donner moi, d'une manière générale?
>> [Inaudible].
>> Exactement.
Je ne me souviens pas vraiment -
il était de 65 pour grand A. Je n'aime pas vraiment rappelez-vous quelle a minuscule est,
mais peu importe.
L'ordinateur sait.
Donc, en disant minuscules un moins A majuscule, ça fait bizarre d'être
soustrayant un chevalier d'un autre, mais quels sont les caractères sous le capot?
Ils sont juste des chiffres.
Donc, quelles que soient ces chiffres, laisser l'ordinateur s'en souviennent
plutôt que de me l'être humain.
>> Alors minuscules un capital moins A est va me donner une différence.
Il arrive à 32, et qui serait le cas pour les minuscules b et B majuscule
et ainsi de suite.
Il reste constante, heureusement.
Donc, je suis essentiellement dire, prendre la lettre minuscule, il faut soustraire large que
la différence standard, et que efficacement les changements de support de i à partir de
minuscules, bien sûr, majuscule, sans que j'aie vraiment à penser
sur ou rappelez-vous, ce sont ceux numéros, nous avons parlé lors de la huitième
bénévoles sont venus sur scène?
Maintenant, quant à lui, dans l'autre, si ce n'est pas une lettre minuscule telle que déterminée
par la ligne 24, juste imprimer.
Je veux seulement toucher l' caractères qui étaient
réellement l'origine minuscules.
>> Voyons donc cela.
Faire capitaliser.
Compilé, OK.
. / Capitaliser.
Et permettez-moi de taper dans H-E-L-L-O en minuscules, Entrée.
Et remarquez qu'il est converti en majuscules.
Permettez-moi de faire à nouveau avec un autre mot.
Que diriez-D-A-V-I-D avec le premier D capitalisés à titre de nom est généralement?
Entrée.
Notez qu'il est toujours correct.
Il a juste sorti ce premier D inchangé via cette autre construction.
>> Donc, gardez à l'esprit, alors, un certain nombre de choses ici.
Premièrement, si jamais vous voulez vérifier deux conditions à la fois, vous pouvez et les
ensemble comme nous l'avions prévu.
Vous pouvez comparer les caractères de cette façon et traiter efficacement les caractères que
chiffres, mais franchement, c'est tellement fichu cryptique Je ne vais jamais à retenir
comment arriver à ce à partir de zéro sans raisonnement pour tout
un peu de temps.
>> N'aurait-il pas été bien si quelqu'un là-bas a écrit une fonction appelée est
inférieur qui pourrait répondre pour moi vrai ou faux, ce personnage est en minuscules?
Bien heureusement, celui qui a écrit ctype.h fait exactement cela.
Laisse-moi aller ici et ajouter CType pour c types, et maintenant, laissez-moi descendre ici et
réécrire cette ligne comme suit.
>> Donc, si elle est appelée est inférieure, je prétends, s support i, alors je vais supprimer
ces deux lignes au total.
Alors maintenant, quelqu'un d'autre, j'espère, a écrit une fonction appelée est plus faible, et il
Il s'avère que qu'ils ont fait et ils ont déclaré à l'intérieur de ctype.h.
Et maintenant, je vais laisser la ligne 27 seul, je vais laisser la ligne 31
seul, mais remarque combien j'ai resserré mon code.
Il est maintenant plus propre.
Il est moins difficile de regarder à travers parce que maintenant la fonction est d'ailleurs
si merveilleusement nommé juste fait ce qu'il dit.
>> Alors maintenant, je vais enregistrer cette.
Je vais effectuer un zoom arrière.
Et tout comme dans Scratch vous pourriez avoir Booléens, les valeurs booléennes vrai ou
faux, c'est exactement ce qui est abaisser efficacement le rendement.
Permettez-moi de recompilation.
Permettez-moi de re-run.
Et maintenant, nous allons essayer de nouveau, H-E-L-L-O, Entrée.
C'est très bien.
Et essayez à nouveau, assurez-vous que ne pas visser quelque chose.
Qui est capitalisée ainsi.
>> Mais ce n'est pas suffisant parce que le autre chose que je ne vais jamais
rappeler à moins que je travaille à travers elle vraiment soigneusement sur, par exemple, le papier est
cette fichue ligne.
Ce ne serait pas bien s'il y avait une fonction appelée à supérieure?
Eh bien, il s'avère qu'il est en ctype.h ainsi.
Je vais aller de l'avant et tapez -
permettez-moi de mettre cette ligne arrière.
Au lieu de cela ici, laissez-moi aller de l'avant et dire substituer à l'% c l'
résultat de l'appel à cette fonction supérieure sur le i-ième caractère de l'art.
Et maintenant, il se fait remarquer un peu équilibré.
Je dois garder une trace de combien de parenthèses j'ai ouvert et fermé.
>> Alors maintenant c'est encore plus propre.
Maintenant ce programme est de mieux en mieux conçu sans doute parce que c'est
beaucoup, beaucoup plus lisible, mais il n'est pas laissé, c'est exact.
Faire capitaliser.
. / Capitaliser.
H-E-L-L-O. Lançons à nouveau, D-A-V-I-D. OK, donc nous sommes toujours en
forme assez bonne.
>> Mais maintenant supérieure.
Je propose qu'il y ait une plus raffinement que nous pourrions faire, ce serait
vraiment sympa, qui pourrait vraiment serrer jusqu'à ce code et vraiment nous donner cinq
sur cinq pour la conception, par exemple.
Ce qui serait bien pour vous débarrasser?
Eh bien, regardez comment sacrément longtemps ce bloc de code est juste pour faire quelque chose de simple.
>> Maintenant, en aparté, que vous pourriez avoir vu dans la section superbe cette dernière
week-end, vous n'avez pas strictement besoin de l' accolades quand vous n'avez qu'un seul
ligne de code, même si nous avons proposé les garder pour que cela fasse une grande
plus clairement, comme en forme de U de Scratch blocs, ce qui est à l'intérieur de la branche.
Mais ne serait-il pas agréable si à supérieure, lorsqu'il est administré son entrée, transformé en
majuscules si elle n'est pas, et ce serait être merveilleux dans le cas contraire, si
il est déjà en majuscule?
Il suffit de passer à travers et le laisser seul.
>> Alors peut-être qu'il ne le fait.
Je pourrais essayer et j'espère juste qu'il fait, mais laissez-moi
introduire une autre chose.
Au lieu d'utiliser ce terminal intégré fenêtre vers le bas ici, rappelons que
Cette icône carré noir vous donne un fenêtre de terminal plus grand que je ne peux plein
écran si je veux?
Ainsi, il s'avère qu'ils sont en quelque sorte bizarrement Nommé, mais il ya ces choses appelées
pages de manuel, pages de manuel, l'homme pour faire court, et je peux y accéder en
homme frappe -
ce que je veux Type?
Man to supérieure.
>> Et maintenant constater s'il existe une fonctionner à l'intérieur de l'ordinateur, en
ce cas, l 'appareil, ce qui est juste le système d'exploitation Linux, ça va
de me donner un ensemble quelque peu énigmatique de sortie, mais vous trouverez plus de temps que
il est formaté toujours à peu près la même si vous commencez à vous y habituer.
Avis au sommet de haut, et est apparemment la même documentation
pour faire baisser.
Celui qui a écrit cela coupait quelque coins et mettre tout cela sur une page.
Le but de ces choses dans la vie est de convertir un
lettre majuscule ou minuscule.
>> Notez que sous Synopsis, la page de manuel m'apprend quel fichier que j'ai
d'inclure d'utiliser cette chose.
Il me donne les signatures de ces fonctions, les deux d'entre eux, même
si nous en ce moment seulement préoccuper un.
Voici maintenant une description.
Pour supérieure convertit la lettre c en majuscule si possible.
>> Toujours pas que instructif, mais laissez-moi maintenant regarder sous la valeur de retour, la chose
ce n'est restitué.
Ainsi, la valeur retournée est celle de l' lettre ou c converti si l'
conversion n'était pas possible.
Qu'est-ce que c?
>> Le caractère original.
>> Le caractère original et nous savons que par, encore une fois, aller jusqu'à l'
synopsis, et celui qui a écrit cette fonction a tout simplement décidé que l'entrée
à la partie supérieure et à faible est juste va être arbitrairement appelé c.
Ils auraient appelé plus rien qu'ils veulent, mais ils l'ont gardé
simple que c.
J'ai donc consulté la page de manuel.
Cette phrase me rassure que si ce n'est pas une lettre minuscule, il est
va me donner juste de retour c, ce qui est parfaite, ce qui veut dire que je peux me débarrasser de
mon état d'autre.
>> Alors permettez-moi de revenir à GEdit, et maintenant laissez-moi faire ça.
Je vais copier mon instruction printf.
Je vais aller de l'avant et à l'intérieur même le pour l'impression de boucle dehors, et obtenir
débarrasser de maintenant toute cette construction if.
N'était-ce pas une mauvaise idée, et il était très beaucoup correctes et cohérentes avec
tout ce que nous avons prêché, mais tout simplement pas nécessaire.
Dès que vous vous rendez compte quelque bibliothèque fonction existe que quelqu'un d'autre
écrit, ou peut-être que vous avez écrit ailleurs dans le fichier, vous pouvez l'utiliser et vraiment
commencer à resserrer le code.
>> Et quand je dis les choses comme bon style, le fait que la personne appelée
fonctionner à haute ou précédemment est inférieur est merveilleusement utile car
ils sont très descriptive.
Vous ne voudriez pas à appeler vos fonctions x et y et z, qui possède
beaucoup, beaucoup moins de sens.
Vous avez des questions sur cette série des améliorations?
>> Donc, il suffit de dire l'un des plats à emporter est comme votre propre problème
set - peut-être problème posé, mais certainement P a placé deux et au-delà, même
quand ils sont correct ne signifie pas nécessairement dire qu'ils sont parfaits juste
ou encore particulièrement bien conçu.
C'est l'autre axe commencer à réfléchir.
Donc, ce fut un intérieur de série de votre la mémoire de l'ordinateur, mais si vous avez un
tas de personnages comme H-E-L-L-O à l'intérieur de RAM, et supposons
que vous appelez dans votre programme obtenir chaîne à plusieurs reprises de sorte que vous
appelez obtenir chaîne une fois, puis vous appeler obtenir à nouveau chaîne.
Eh bien, ce qui va se produire au fil du temps?
>> En d'autres termes, si vous avez une ligne de code, mais hors contexte, comme
string s obtient -
nous allons le faire.
String nom équivaut à obtenir chaîne.
Donc, supposons que la ligne de code est destiné pour demander à l'utilisateur son nom.
Cette ligne de code suivante est destinée à poser l'utilisateur pour son école, et
cette ligne suivante, et ainsi de suite.
Supposons que nous continuons à demander l'utilisateur à un autre, et
un autre et une autre chaîne.
Ils vont rester dans la mémoire dans le même temps.
On ne va pas écraser les autre.
L'école n'est pas écraser l'autre.
Mais où vont-ils tous se retrouver dans la mémoire?
>> Eh bien, si nous commençons à dessiner sur l'écran, que nous pouvons utiliser cette chose
ici comme un tableau, si ce noir rectangle représente mon ordinateur de
mémoire, je vais commencer arbitrairement divisant en petits carrés,
dont chacun représente un octet de la mémoire.
Franchement, si vous avez un gigaoctet de RAM ces jours-ci, vous disposez d'un milliard d'octets
de mémoire de votre ordinateur, de sorte un milliard de ces carrés.
Donc, il suffit de dire, ce n'est pas vraiment à l'échelle.
>> Mais nous pourrions continuer d'attirer tous ces clairement pas à l'échelle carrés, et ce
représente collectivement la mémoire de mon ordinateur.
Maintenant, nous allons juste faire point, point, point.
Donc, en d'autres termes, quand je maintenant inviter l' utilisateur avec de la ficelle get me donner un
chaîne, ce qui se passe?
Si l'utilisateur tape dans "bonjour", qui se termine en H-E-L-L-O. Mais supposons que le
l'utilisateur tape ensuite en -
En fait, je n'aurais pas dû faire bonjour parce que nous demandons
pour leurs noms.
Donc, revenons, si je peux le faire.
>> Donc, si je tape dans D-A-V-I-D pour mon nom, mais rappeler que la deuxième ligne de
code a été à nouveau obtenir chaîne pour obtenir leur école.
Où est ce mot que l'utilisateur types à aller à la prochaine étape?
Eh bien, peut-être que ça va aller dans H-A-R-V-A-R-D. Donc, même si je n'ai
tiré comme deux rangées, ce n'est que tout un tas d'octets dans votre
la mémoire vive de l'ordinateur.
Il ya un problème maintenant parce que maintenant, si je suis utilisant RAM dans ce très raisonnable
mais sorte de manière naïve, que pouvez-vous apparemment pas la distinction?
Où l'on commence et où on finit, non?
Elles sont un genre de brouiller ensemble.
>> Ainsi, il s'avère l'ordinateur ne pas le faire.
Permettez-moi de réellement revenir en arrière dans le temps une quelques personnages, et au lieu de Harvard
aller immédiatement après le nom de l'utilisateur, l'utilisateur obtient en réalité, derrière
les coulisses, un caractère spécial inséré par l'
ordinateur pour lui ou elle.
/ 0, autrement connu comme le caractère nul fâcheusement appelé N-U-L, pas
N-U-L-L, mais que vous écrivez comme / 0.
C'est juste que tous les bits zéro est un marqueur dans entre le premier mot qui de l'utilisateur
dactylographié et le second.
>> Alors Harvard réellement se termine maintenant que cette séquence de caractères
et une plus / 0.
Donc, en d'autres termes, en ayant ces valeurs sentinelles, huit zéro contiguë
morceaux, vous pouvez maintenant commencer à distinguer un caractère d'un autre.
Donc tout ce temps ce qui a été «bonjour» est en fait "bonjour" avec un / 0, et
En attendant, il pourrait très bien être un peu plus de RAM
à l'intérieur de l'ordinateur.
>> Permettez-moi de faire autre chose maintenant.
Il s'avère que toutes ces places nous avons dessin, ils sont, oui,
cordes, mais plus généralement, ces choses sont des tableaux.
Un tableau est juste un morceau de mémoire c'est dos à dos à dos à dos,
et vous utilisez généralement un tableau par de cette notation entre crochets.
Nous allons donc voir ces un peu au fil du temps, mais je vais aller de l'avant et
ouvrir, appelons-les âges.
Et remarquons que nous pouvons faire avec ces mêmes trucs, un peu
peu plus de la syntaxe ici.
>> Ainsi, dans la ligne 17 de ce programme - en fait, je me lance le premier programme
afin que nous puissions voir ce que cette chose fait.
Permettez-moi j'appelle faire âges compiler ce programme.
. / Âges.
Combien de personnes sont dans la salle?
Appelez-trois.
L'âge de la première personne?
18, 19, et 20.
Et maintenant, un peu ridicule, je viens ont fait un programme qui vieillit ceux
trois personnes.
>> Il ya donc clairement une opportunité pour un peu d'arithmétique amusante ici.
Heureusement, les calculs sont corrects.
18 sont allés à 19, 19 est allé à 20, et ainsi de suite.
Mais ce qui est vraiment destiné à être illustrative voici comment nous allons stocker
Les âges de ces trois personnes.
Permettez-moi de zoom en ce qui passe ici.
>> Alors d'abord, ces quelques premières lignes doivent être être obtenir assez familier.
Je suis juste inviter l'utilisateur à l' nombre de personnes dans la salle.
Ensuite, j'utilise obtenir int et faire tout pour le faire encore et encore et encore.
Nous avons vu ce modèle avant, mais la ligne 27 est nouveau et fait assez
utile, et deviendra de plus en plus utile.
Notez que ce qui est différent de la ligne 27 c'est que je me présente à déclarer une
int appelés les âges, mais attendez.
Ce n'est pas seulement int âges.
Il ya ces crochets, à l'intérieur duquel est n.
>> Ainsi, le support n, dans ce contexte, ne à l'intérieur d'une instruction printf ici, mais
dans cette seule ligne 27, cette ligne est dire, me n ints donner, chacun d'entre eux
est de type int.
Il s'agit donc d'un seau, pour ainsi dire, de, Dans ce cas, trois entiers revenir à
dos à dos pour que je efficacement avoir trois variables.
L'alternative, pour être clair, ne serait-ce.
>> Si je voulais de la première étudiante âge, je pourrais le faire.
Si je voulais de la deuxième étudiant âge, je pourrais le faire.
Si je voulais de la troisième étudiant âge, je pourrais le faire.
Et Dieu ne plaise, nous avons besoin de tout le monde âge dans cette salle -
Je veux dire, c'est un diable de beaucoup de copie, coller encore et encore et encore.
Et en plus une fois que je compile ce programme, si un autre élève se promène dans plus de rupture
de cette porte, maintenant mon numéro de variables est incorrect.
>> Alors qu'est-ce qui est bien sur un tableau est aussi Dès que vous commencez à vous sentir
copier-coller, les chances sont que c'est pas la meilleure approche.
Un tableau est dynamique potentiellement.
Je ne sais pas à l'avance combien de personnes vont être dans la chambre,
mais je sais que je dois n d'entre eux, et je vais n comprendre le moment venu.
Cette ligne de code signifie maintenant, donnez-moi une morceau de mémoire qui ressemble à ceci
où le nombre de cases sur l'écran est entièrement dépendant de n que
l'utilisateur a tapé po
>> Alors maintenant, le reste de ce programme est en fait assez similaire à ce que nous
juste fait avec des caractères.
Remarquez que je n'ai une boucle for à partir de la ligne 30.
Donc, juste après je reçois le tableau, je itérer de y est égal à zéro sur un maximum de n.
J'ai juste cette instructive printf message que vous venez dire, donnez-moi l'âge
de personne #% i, alors numéro un, numéro deux, numéro trois.
Et pourquoi ai-je fait cela?
Franchement, les humains préfèrent compter de un sur place tandis que les informaticiens,
zéro à la place.
les informaticiens ne vont pas utiliser ce genre de programme, donc nous sommes
va juste commencer à compter à un comme des gens normaux.
>> Et maintenant, dans la ligne 33, notez la légère autre morceau de syntaxe.
Le i-ième âge en ce que variable de type éventail va obtenir un int.
Et maintenant, enfin, il s'agit juste d' arithmétique ici.
J'ai décidé dans une boucle séparée la revendication un certain temps passe, et maintenant dans cette
boucle séparée, ces lignes exécuter.
>> Un an à partir de maintenant, personne je serai i ans, mais remarquez que ce n'est pas le
variable i.
C'est maintenant% i pour int.
Et remarquez que le premier espace réservé, je brancher i + 1, donc nous comptons comme un
personne normale.
Et puis, pour la valeur de leur âge, pour i ans, je prends les âges support
i - et pourquoi je fais plus un ici?
Ils ont juste âgés.
C'est mon choix stupide de programmes.
Ils ont juste l'âge d'un an.
Je pourrais taper dans n'importe quel nombre que Je veux vraiment là.
>> Alors, quel est réellement l'ensemble des la pertinence ici?
Eh bien, permettez-moi de réellement revenir en arrière ici et peindre une image
de ce qui nous attend.
Ce que nous allons faire avec notre prochain Problème Set Two est barboter dans l'
monde de la cryptographie.
Il s'agit donc d'une chaîne de caractères, de sorte qu'un séquence de plusieurs caractères, et ce
cela nous dit?
Ce n'est pas dans la version en ligne des diapositives.
>> Donc, je prétends que cela équivaut à cela, un annonce stupide de nombreuses années
il ya qui pourraient effectivement se rappeler un de ses origines.
Il s'agit donc d'un exemple de cryptage ou la cryptographie.
Il s'avère que si vous voulez effectivement envoyer des informations ou partager
informations avec quelqu'un en toute sécurité, comme un message comme celui-ci, vous pouvez
brouiller les lettres.
Mais généralement, les mots sont pas brouillés au hasard.
Ils sont permutés d'une manière ou modifiés d'une certaine façon afin que - oups.
C'est un spoiler de plaisir pour la prochaine fois.
>> Ainsi, vous pouvez mapper ce qui est apparemment O à B. Notez que les lignes vers le haut
capitalisation sage.
Apparemment r devient e.
Apparemment F-H-E-R devient S-U-R-E. Alors il s'avère qu'il ya une correspondance, et en
ce cas, il ya une jolie bête cartographie si quelqu'un a pensé à elle?
C'est ce qu'on appelle Rot 13, Rotation 13.
Il est le plus stupide de cryptage mécanismes, car il littéralement juste
ajoute 13 à chacune des lettres, stupide dans le sens que si vous venez
avoir un peu de temps libre sur vos mains et un crayon, ou vous pensez juste qu'il
à travers dans votre tête, vous pouvez essayer tous les ajouts possibles - un, deux,
trois, point, point, point, 25 à un peu faire tourner l'ensemble de l'alphabet, et
Finalement, vous allez découvrir ce que ce message est.
Donc, si vous avez fait quelque chose de ce genre dans école primaire passer des messages à votre
meilleur ami, si votre école primaire enseignant simple lecture de l'
message et brute forcé la solution, vous auriez pu avoir
une réponse par là.
>> Maintenant, bien sûr, dans le monde réel, cryptographie est plus sophistiqué.
Il s'agit d'un extrait de texte à partir d'un Système d'ordinateur ayant des noms d'utilisateur et
mots de passe, comme presque tous les nôtres, et C'est ce que votre mot de passe pourrait
ressembler si stocké sur votre disque conduire, mais sous une forme cryptée.
Ce n'est pas seulement une rotation de lettres, A est B, et B est C. C'est
beaucoup plus sophistiqué, mais il utilise ce qui est généralement connu comme clé secrète
cryptographie.
Cette image raconte ce qui suit histoire avec quelques icônes.
>> Sur la gauche, nous avons ce nous appellerons texte.
Dans le monde de la cryptographie, plaine texte est juste le message original
écrit en anglais ou en français ou n'importe quelle langue.
Si vous souhaitez crypter, nous passerons il imagée par un cadenas, afin
une sorte de de l'algorithme, une fonction ou le programme que quelqu'un a écrit
brouille les lettres que j'espère complicatedly plus que le simple ajout 13
à chacun d'eux.
>> Qu'est-ce que vous sortez de ce processus dans le milieu, il est appelé cryptogramme.
Donc une sorte de mot sexy.
Cela signifie simplement que c'est la crypté version du texte brut.
Et seulement si vous avez ce même secret, 13 ou moins 13, êtes-vous en mesure de
déchiffrer un message comme ça.
>> Donc, dans le problème fixé deux, parmi les choses vous allez faire si dans le Hacker
Édition, vous devrez écrire du code pour casser les mots de passe, calculer
ce qu'ils étaient et comment ils ont été crypté, si nous vous donnons un peu
d'orientation en cours de route.
Dans l'édition standard, nous introduisons un couple de chiffrement, le chiffrement
mécanismes, l'un appelé César, un appelé Vigenère, qui sont encore
chiffrements rotation où A devient quelque chose, B devient quelque chose, mais
vous devez le faire par programmation car il y aura en effet un secret
clé impliquée qui est typiquement un nombre ou un mot-clé que seule l'
expéditeur et le destinataire de ces messages doivent comprendre.
>> Maintenant, cela a effectivement incarnations dans le monde réel.
C'est, par exemple, est peu orphelin Anneau décodeur secret de Annie et vous
peut effectivement mettre en œuvre ces chiffres de rotation -
A devient quelque chose, B devient quelque chose - avec un couple de roues,
une sur l'extérieur, une à l'intérieur de telle sorte que si vous tournez la roue ou
l'anneau, vous pouvez réellement aligner le lettres avec des lettres différentes,
l'obtention d'un code secret.
Et comme le cliffhanger pour aujourd'hui, ce que j'ai pensé que je ferais un peu de
retour en arrière que si vous allumez le téléviseur le 24 Décembre, vous pouvez regarder l'
ad nauseam de film 24 heures dans une rangée.
Mais pour aujourd'hui, je vais l'ouvrir ici et nous donner seulement deux minutes d'un
Christmas Story pédagogiquement pertinente avec un petit bonhomme nommé Ralphie.
>> [LECTURE VIDEO]
>> -Qu'il soit connu à tout le monde que Ralph Parker est nommé
membre de la Little Orphan Annie secrète cercle et a droit à tous
les honneurs et les avantages celui-ci ne se produise.
>> -Signé, Little Orphan Annie.
Contresigné, Pierre André à l'encre.
Honneurs et les avantages déjà à l'âge de neuf ans.
>> [Criant RADIO]
>> Allez, nous allons passer à autre chose.
Je n'ai pas besoin de tout ce que le jazz sur contrebandiers et des pirates.
>> Écoutez-demain soir pour le aventure conclusion du noir
bateau pirate.
Maintenant, il est temps pour le secret d'Annie Message pour vous les membres
du cercle secret.
Rappelez-vous, les enfants.
Seuls les membres du Cercle Secret Annie peut décoder message secret d'Annie.
Rappelez-vous, Annie dépend de vous.
Réglez vos épingles à B2.
Voici le message.
12, 11, 2 -
>> -Je suis à ma première réunion de secret.
>> -25, 14, 11, 18, 16 -
>> -Pierre était en grand ce soir de la voix.
Je pourrais dire 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 chambre dans la maison où un garçon de neuf ans
pouvait s'asseoir dans l'intimité et décodage.
Aha, B. Je suis allé à l'autre.
E. Le premier mot est «être». S. Il venait plus facile maintenant.
U. 25.
C'est R.
>> -Allez, Ralphie.
Je dois y aller.
>> -Je descends tout de suite, Ma.
Gee whiz.
>> -T. O. Soyez sûr d'.
Assurez-vous de quoi?
Quel était Little Orphan Annie veux 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 serai tout de suite.
>> -Je me rapprochais maintenant.
La tension était terrible.
Quel était-il?
Le destin de la planète peut dans la balance.
>> -Ralphie, le go dois de Randy.
>> -Je vais être droit à des Bordel de merde.
>> -On 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, oui.
>> -Assurez-vous de boire votre Ovomaltine.
Ovomaltine?
Un commercial minable?
Fils de pute.
>> [FIN LECTURE VIDÉO]
>> INTERLOCUTEUR 1: C'est CS50, et que sera Problème Set Two.
Rendez-vous la semaine prochaine.
>> ENCEINTE 2: Lors de la prochaine CS50, cela arrive.
>> INTERLOCUTEUR 1: Donc, un sujet que nous n'avons pas regardé ce jour est
que des pointeurs de fonction.
Maintenant, un pointeur de fonction est juste l'adresse d'une population
fonction, mais un peu comme -
fils d'un -