[Powered by Google Translate] [Semaine 3]
[David J. Malan - Université de Harvard]
[C'est CS50. - CS50.TV]
Permettez-moi de nous orienter dans la direction de l'endroit où nous nous étions arrêtés la dernière fois,
qui commençait à réfléchir un peu plus sur la syntaxe
et essayer de penser un peu moins à tous les points caractéristiques
qui prend un peu de temps pour s'acclimater à ce jour en termes de points-virgules
et les parenthèses et les accolades,
de commencer à prendre les choses un peu à un niveau conceptuel plus élevé
de sorte que les problèmes que nous avons maintenant commencer à résoudre au cours des prochaines semaines
vont impliquer beaucoup plus dans les problèmes conceptuels de haut niveau
et un peu moins dans la syntaxe que vous obtenez vos pieds mouillés
et salir les mains avec une partie de la syntaxe de ces dernières semaines.
>> Ainsi, rappelons que la semaine dernière, nous avons introduit cette notion d'un tableau.
Et un tableau en anglais peut être décrit comme quoi? >> [Réponse de l'élève inaudible]
Désolé?
Une collection de? >> [Réponse de l'élève inaudible] >> Très bien.
Une collection d'objets. Donc, nous avons vu des tableaux dans Scratch.
Si vous arrivé à utiliser pour pset 0 l'une des listes Scratch que vous pouvez faire traîner les choses
comme les oranges et les bananes dans un inventaire de toutes sortes,
c'est un peu comme ce qui est un tableau.
Puis techniquement plus, dans le contexte d'un ordinateur réel,
un tableau est simplement un espace contigu de mémoire.
En d'autres termes, vous disposez d'un octet, puis un autre octet, puis un autre octet, puis un autre octet,
et si vous deviez dessiner ces octets dans un tableau,
ils seraient dos à dos à dos à dos. C'est ce que nous entendons par contiguës.
>> Donc, c'est l'octet numéro 1, puis 2, puis 3.
Cela ne signifie pas ici, ici, ici, ici.
Un tableau est un espace contigu sur 0 ou plus octets.
Alors, quels sont-ils utiles pour?
Rappelons que nous avons eu ce genre d'exemple artificiel des notes de quiz personnes stockage dans un programme
pour calculer votre moyenne quiz pour certains cours,
et nous rappelons que nous avons pu commencer à écrire ce programme en déclarant une quiz1 variable.
Ensuite, nous pourrions avoir une autre variable appelée quiz2.
Mais alors, si il y avait 3 quiz dans cette classe, quiz4.
Ou si il y avait un quiz hebdomadaire, il serait quiz5, quiz6, quiz7.
Donc, vous auriez toutes ces variables déclarées à l'intérieur de la principale
ou ailleurs dans votre programme,
et le problème avec cette approche, mais il est facile de simplement copier et coller,
est-ce juste devient très vite difficile à gérer.
A Dieu ne plaise que vous avez réellement avoir 30 ou 50 quiz quiz.
Si c'est comme un quiz école style pop plus élevé du jour,
alors vous avez juste une liste ridiculement longue de variables étant déclarées,
et ce juste très rapidement devient hors de contrôle.
C'est moche, c'est difficile à entretenir, il est tellement plus facile de faire une faute de frappe
si vous obtenez une erreur de frappe numéro 1 dans votre programme.
>> Nous avons donc introduit la notion d'un tableau à la place.
Et rappelons que nous avons mis en œuvre ce programme en faisant un petit quelque chose comme ça.
Laissez-moi aller dans la source d'aujourd'hui lundi 3 Répertoire
et d'ouvrir ensemble, dont nous avons vu la dernière fois.
Et même s'il y avait une couple de trucs nouveaux C ici,
parmi eux la notion d'une constante,
Rappelons que nous avons déclaré plusieurs flotteurs essentiellement en utilisant la syntaxe suivante:
flotteur, puis le nom de la variable, puis nous avons utilisé des crochets vraiment pour la première fois,
et ce que nous avons fait à l'intérieur de ces crochets a été effectivement mis un certain nombre.
Mais au lieu de mettre un certain nombre, je mets ce mot en majuscules, des quiz.
Et quelle a été la motivation pour mettre un mot en majuscules comme quiz
puis en utilisant la ligne 17 du truc ici pour effectivement donner qu'un nombre?
Quelle était la motivation là-bas? Ouais.
>> [Réponse de l'élève inaudible] >> Exactement.
Si nous voulons changer cette valeur 2, il suffit de le changer dans 1 place
parce envisager - je ne me souviens même pas ce que ce programme fait exactement,
mais si vous venez de le parcourir vous voyez des quiz, des jeux-questionnaires.
Vous voyez quiz, ici-bas plus de jeux.
Donc, si nous n'avions pas cette constante, cette forte utilisation de définir,
nous aurions tapé 2, puis 2, puis 2, puis 2, ce qui est bien. Il serait tout aussi correcte.
Mais supposons que l'année prochaine nous avons 3 tests dans CS50.
Donc, je dois y aller et mettre à jour le code, je dois le recompiler,
mais le problème est que si je fais quelque chose de stupide, comme je l'ai oublier 1 mention de 2
et d'oublier de brancher 3, l'ensemble du programme pourrait très bien se casser.
Donc, nous ne faisons que des ennuis.
>> Ainsi, la notion d'une constante est tout au sujet de la factorisation d'un morceau de données,
qu'il s'agisse d'une chaîne ou d'un char ou un flotteur ou autre,
et déclarant 1 place afin que vous puissiez plus facilement le changer à l'avenir.
Et c'est aussi, franchement, un peu plus facile à lire parce que si vous venez de penser à cela maintenant,
c'est quiz, ou nous pourrions même renommer quelque chose comme NUMBER_OF_QUIZZES
ou quelque chose de plus explicite.
Le code devient un peu plus clair quant à ce qu'il fait,
et vous vous demandez un peu moins que le numéro 2 pourrait arriver à dire.
Ainsi, la constante n'avait rien à voir fondamentalement avec les tableaux.
Le tableau a été introduite par le biais de ces crochets.
>> Donc remarquerez que la ligne 23, nous demandons à l'utilisateur, «Quelles étaient vos scores quizz?"
Ensuite, nous avons juste cette boucle qui demande à l'utilisateur apparemment pour leurs grades. Comment?
Il parcourt de 0 à 2. Et je dis 2, car Quiz en majuscules est actuellement de 2.
Donc, il parcourt de 0 à 2, puis l'imprime Quiz # quelque chose de quelque chose,
puis il utilise GetFloat pour obtenir une valeur à partir de l'utilisateur.
Donc, remarquez que ce n'est le seul autre élément nouveau de la syntaxe de mercredi dernier.
Si vous voulez stocker quelque chose dans un emplacement particulier dans ce tableau,
nous utilisons à nouveau les crochets.
>> Il ya donc un peu de dichotomie.
La première fois que vous utilisez les crochets
vous l'utilisez pour spécifier la taille que vous souhaitez que le tableau soit.
Mais ce contexte prochaine, ici, où nous avons à nouveau utiliser ces crochets
signifie dans ce tableau où voulez-vous mettre un peu de valeur?
Et ici la distinction peut être déduite à partir du contexte.
Nous avons ici un type de données, nous avons alors le nom d'une variable,
puis nous avons nos crochets avec un nombre à l'intérieur, point-virgule. C'est tout.
Donc, c'est une déclaration.
C'est comme si nous avions fait quelque chose comme flotteur grade1; grade2 flotteur;
mais encore une fois, très rapidement incombe en copie beaucoup trop, coller,
de sorte qu'au lieu nous venons de le simplifier en tant que telle,
ce qui signifie que désormais, nous avons une classe qui peut être stocké à tranche 0,
nous avons une autre catégorie qui peut être stocké à support 1,
mais si je gaffe et, par exemple, ma boucle va si loin -
Par exemple, je fais cette inférieur ou égal à,
qui rappel a été la source d'un bug précédent -
ce qui signifie concrètement que sur certains accidentelle troisième itération de cette boucle
J'utilise le support 2. En effet, ce qui pourrait se passer ici? Désolé?
[L'élève] Il va être remplacé. >> Va-t-il être remplacé?
Que faudrait-il remplacé?
Ceci est littéralement dire remplacer ce qui est à l'emplacement 2 avec la valeur de retour de GetFloat.
Mais le problème est de savoir comment est la taille du tableau à ce point dans l'histoire?
[Réponse de l'élève inaudible] >> Le tableau n'est encore que de taille 2
car le tableau, comme toute autre variable, a été déclaré en premier, avant que nous l'utilisions,
et nous avons spécifié ici à cause de cette constante que j'ai 2 classes que je vais mettre.
>> Mais rappelez-vous, les informaticiens commencer à compter à partir de 0.
Ainsi, le premier emplacement de ce tableau est une parenthèse 0.
L'emplacement suivant est 1. Cette chose est un tant soit peu trop loin sur le côté.
Donc, en d'autres termes, si j'ai effectivement eu ce tableau -
et laissez-moi voir comment cette coopère ici pour nous -
si j'ai un tableau que j'ai tout simplement tracée comme suit
et j'ai alloué de l'espace pour 2 éléments, je pourrais dessiner ce comme cela dans la mémoire
où cette grande toile blanche est.
C'est juste la RAM que j'ai dans mon ordinateur, un concert de RAM, 2 Go de RAM, peu importe,
mais ces 2 boîtes désormais individuellement représentent un flotteur, 32 bits.
Donc, si je mets numéro 1 ici comme 1.0, puis j'ai mis un autre numéro ici comme 3,2
mais alors je fais le support 2, c'est comme mettre quelque chose ici.
Et comme l'image l'indique, il n'y a rien.
C'est un peu comme la terre aucun homme, car je n'ai pas demandé le système d'exploitation
de me donner ce quiz tiers.
Si je voulais ce quiz troisième, j'aurais eu la prévoyance
de demander au système d'exploitation pour qu'il en déclarant QUIZ être pas 2
mais au lieu de correspondre à 3.
>> Donc, en d'autres termes, l'image que nous avons effectivement avoir sous la main ressemble à ceci ici.
C'est à nouveau la terre de personne. Nous ferions mieux de ne pas essayer d'écrire des valeurs ici.
Mais encore une fois, les informaticiens parce compter à partir de 0,
quand on parle de cet endroit dans le tableau, qui est censé être l'emplacement 0,
ce qui est censé être l'emplacement 1, ce qui n'existe même pas
parce que nous ne demandaient le système d'exploitation pour 2 tels endroits.
Ainsi, ceux d'entre vous avec une expérience préalable de la programmation à partir d'autres langues
savez peut-être que ce n'est pas toujours le cas avec des tableaux ou des objets appelés vecteurs.
Au contraire, vous pouvez simplement continuer à ajouter et en ajoutant et en ajoutant des choses à des tableaux,
qui, franchement, nous avons eu cette capacité de Scratch et pourtant nous semblons avoir renoncé ici
car avec vous programmez en C beaucoup plus explicite.
Il n'ya que vous et l'ordinateur en ce moment, et que l'ordinateur ne va faire
ce que vous lui demandez de faire.
Donc, si vous ne lui demandez de vous donner 2 flotteurs au moyen de la ligne 22 ici,
c'est tout ce que vous allez retrouver du système d'exploitation: l'espace pour 2.
>> Ainsi, de plus en plus sont vos programmes vont parfois être bogué en ce qui concerne les tableaux.
C'est juste une sorte de la nature de la bête lequel nous sommes tous faillibles,
et à un moment donné vous voulez indice très probable delà de la limite de votre tableau.
Et c'est juste une façon élégante de dire vous êtes entré dans quelque chose de support
et quelque chose était tout simplement trop grand d'un nombre. Vous êtes allé au-delà des limites de votre tableau.
Mais la hausse est maintenant ceci.
Le reste de ce programme a vraiment rien de fondamentalement à voir avec les tableaux.
C'est tout simplement sur quelques calculs simples pour les moyennes informatiques.
Nous avons donc ici, dans cette boucle for abord ici une somme variable appelée que nous initialiser à 0.
Ensuite, nous avons une itération de 0 à 2 fois et on ajoute à cela variable de sommation
la note i, de sorte tranche 0, alors la classe 1.
Et puis, comme vous le feriez à l'école primaire pour calculer la moyenne,
nous nous contentons de prendre cette somme, le diviser par le nombre total de questionnaires,
et puis pour faire bonne mesure que nous appelons ici une fonction appelée tour.
>> Maintenant, en passant, quel est le problème avec cette int parenthèses sur la ligne 34?
Il aurait pu trouver déjà dans l'article, n'ont pas vraiment parlé formellement ici,
mais quelle est cette int dans parens probablement faire? >> [Réponse de l'élève inaudible]
Oui, cela fait référence à la coulée ou le transtypage,
ce qui signifie que la prise 1 de type de données et à le convertir à un autre.
Vous ne pouvez pas faire cela avec tous les types de données parce que parfois il serait un peu étrange.
Mais dans ce cas, si la valeur de retour de la série est un flotteur
parce que, après tout, je vais prendre un flotteur et en le divisant par un nombre comme 2,
Je vais revenir un flotteur.
Mais les gens d'école primaire ne sont pas vraiment heureux de savoir que leur moyenne était de 93,4
car ils vont se rendre compte qu'ils étaient toujours très proche de celle au 95 arrondissements.
>> Donc, nous voulons utiliser à la place de int autour de tout le monde au plus proche entier,
qui dans ce cas va être 94 avec aucun point après.
Donc, c'est juste une petite astuce mathématique.
Et nous reviendrons à cette notion de coulée car elle aura des conséquences,
si vous n'avez pas déjà découvert, pour le problème de jeu 2.
Ainsi, un tableau, alors, vous pouvez penser - ça va me faire sourire toute la journée.
Elle ressemble à ceci si vous dessinez une image de celui-ci,
mais l'essentiel est que la taille est également sélectionné par vous
lorsque vous le demandez du système d'exploitation.
Toutes les questions, puis sur les tableaux? Ouais.
[Question étudiant inaudible]
Ah, bonne question.
La question est de savoir ce qui se passe au 0 null dans le tableau? Il n'existe pas dans ce contexte.
Qui n'existe que dans le contexte de chaînes, que nous sommes sur le point de venir à dans un moment.
Mais pour un tableau, comme dans ce cas, tout ce que vous obtenez est ce que vous demandez au système d'exploitation pour.
>> Et en passant, de peur que ce soit clair,
Je continue à dire que vous demandez au système d'exploitation, demander au système d'exploitation.
Un système d'exploitation, comme vous le savez sans doute, est Mac OS, Windows, Linux.
Lorsque vous appelez des fonctions telles que GetFloat
ou que vous déclarez des variables telles que les grades,
à la fin de la journée vous êtes effectivement demandez à quelqu'un de vous donner ce que la mémoire
parce que nous, programmeurs en herbe
n'ont aucune idée de la façon de réellement obtenir un accès physique à la mémoire.
Mais quelqu'un fait: le système d'exploitation.
Donc, en plus de nous présenter avec de jolies icônes et les menus et les dossiers et autres
que vous voyez sur votre bureau, que ce soit un Mac ou un PC,
systèmes d'exploitation aussi faire les trucs de bas niveau mondain,
les trucs très techniques de la gestion du gigaoctet
ou 2 gigaoctets de mémoire que vous avez, la gestion de la CPU que vous avez, et ainsi de suite.
Ainsi, lorsque vous écrivez du code,
vous êtes vraiment accrocher à votre système d'exploitation dans ce sens.
Je vais devoir minimiser. Très bien.
>> Autres questions sur les tableaux?
Non? D'accord.
Ainsi, la transition naturelle de tableaux est effectivement un sujet qui est un peu familier.
Et nous avons examiné très brièvement à cette dernière fois aussi.
Il s'agissait d'un exemple de chaîne de mercredi.
Cet exemple de chaîne est un programme très simple,
et j'ai réellement simplifiée par un couple de lignes à des fins d'aujourd'hui.
Tout ce qu'il fait dans la ligne 19 est d'obtenir une chaîne de l'utilisateur, le stocke dans une variable appelée s.
Puis, à la ligne 22 en avant c'est apparemment l'impression que chaîne de 1 caractère par ligne.
Mais comment se fait-il cela?
Nous sommes déclarer une variable i, sa mise égale à 0,
et cela devient vieille habitude maintenant.
Nous n'avions pas vu ce jusqu'au mercredi, mais vous pouvez sorte de déduire de son nom
strlen renvoie simplement ce que lorsque s donnée? La longueur de la chaîne.
Donc, si je passe une chaîne, entre guillemets, DAVID,
j'espère que ça va revenir à moi le numéro 5 en raison de DAVID.
Donc, c'est son but dans la vie est de prendre une chaîne, que ce soit codé en dur par vous
ou dans ce cas branché comme une variable, comme argument,
et il comprend ce à quoi la longueur de cette chaîne est.
>> Alors, voici maintenant nous empruntons quelques notations de l'exemple précédent questionnaire.
Cela n'a rien à voir avec flotteurs, n'a rien à voir avec des quiz,
mais il s'avère que le petit mensonge nous vous avons dit depuis 1 semaine
c'est une chaîne n'existe pas vraiment en C.
Une chaîne à la fin de la journée est vraiment juste un tableau.
Il s'agit d'un tableau d'octets, de sorte octet, octet, octet, octet, ce qui rappel est à seulement 8 bits,
afin morceau de mémoire, morceau de mémoire, morceau de mémoire, morceau de mémoire.
Et le moyen par lequel une chaîne est mise en œuvre
est en mettant le premier caractère ici,
puis ici, puis là, puis là, dos à dos à dos dans la mémoire de l'ordinateur.
Donc, si vous voulez épeler un mot comme BONJOUR, vous mettriez 1 H caractère,
alors E, alors L alors L, alors O - 5 caractères au total - quelque part dans la mémoire vive de votre ordinateur.
Mais le détail clé ici est que ils vont être dos à dos à dos à dos,
juste à côté de l'autre.
Quand quand je dis s [i], ce qui en anglais est-ce me donner?
Qu'est-ce que s [i] représentent dans ce cas? Ouais.
>> [L'élève] Le ième caractère dans la chaîne. >> Exactement. Le ième caractère dans la chaîne.
Maintenant, je va commencer à 0 selon ma boucle for ici,
mais c'est bien parce que tout commence à compter à partir de 0.
Donc, s [0] va représenter la lettre H dans un mot comme BONJOUR,
s [1] va représenter une telle lettre E dans un mot comme BONJOUR, et ainsi de suite.
Et ce que nous semblons faire à chaque itération de cette boucle
est à stocker temporairement le ième caractère dans une variable appelée c, qui est juste un char,
puis nous imprimons sur c
de sorte qu'à la fin de la journée ce que ce programme ne est le suivant.
Si je vais dans le répertoire source et je fais et je chaine1 aller de l'avant et exécutez chaine1,
puis je tape un mot comme BONJOUR, Entrez, tout ce qu'il fait est d'imprimer ce caractère 1 à la fois.
>> Il ya donc une opportunité pour le raffinement ici.
Je suis un peu faire plus de travail, même si c'est plus clair peut-être de cette façon, que nécessaire.
Quelle ligne de code ici ce que je peux sans doute jeter tout à fait? Ouais.
Ligne 24. En ligne 24 Je déclare une variable c.
Je suis stocker le ième caractère de s dedans, mais je me sers ici c.
Donc, je suis en utilisant c, donc je sens que je ne peux pas jeter la ligne 24 de suite.
[Commentaire étudiant inaudible] >> Exactement.
Alors, quand il s'agit de parler de la conception des programmes,
remarqué cette légère simplification du code, ce qui est tout aussi lisible,
mais se rendre compte que s est juste une variable, son type de données est un tableau,
si s [i] va tout simplement de retourner instantanément à vous le ième caractère dans cette chaîne.
Et si vous souhaitez l'imprimer, c'est très bien.
Vous avez juste à utiliser% c parce que vous n'êtes pas l'impression d'une chaîne de caractères,
vous imprimez un caractère dans une chaîne, et cela a aussi pour effet d'imprimer le ième caractère.
Et de rappeler que la seule différence vraiment de la semaine dernière avec l'aide de printf
est que, tandis que dans les semaines passées nous ferions quelque chose de super simple,
comme marques% s, puis le nom d'une chaîne ici,
nous sommes maintenant plongée dans un peu plus sous le capot et en disant:
ne pas afficher la chaîne; imprimer le caractère unique celle-ci.
>> Ainsi, nous pouvons faire quelque chose d'un peu différent ici parce qu'il ya 1 autre - pas de bug
parce que ce programme est bon, mais je fais quelque chose de stupide
que je l'ai mentionné brièvement le mercredi.
Mais en y repensant, comment pourrait-conception de ce programme est d'améliorer encore davantage? Ouais.
[Réponse de l'élève inaudible] >> Oh, très bien.
Ainsi, rappelons que nous avons introduit une seconde variable appelée n dernière fois,
qui semble être en contradiction avec nous-mêmes parce que mon objectif il ya une seconde
C'était juste pour jeter une variable comme inutile,
mais rappelons que le mercredi nous avons réellement fait cela.
J'ai changé la boucle for pour avoir réellement une virgule ici, alors n = strlen,
et puis là-bas que j'ai fait i <n, alors j'ai fait mes incréments.
Quel est le gain fondamental que je suis atteinte en changeant mon initialisation à cette
et mon état à ce moment? >> [Réponse de l'élève inaudible] >> Exactement.
Je ne suis pas strlen rappelant encore et encore et encore parce que rappeler combien la boucle pour les travaux.
Même si elles commencent à se compliquer l'avenir,
Rappelons que la chose avant le premier point-virgule est l'initialisation, ce qui arrive une fois.
La condition, cependant, est dans le milieu,
et cela est vérifié à chaque fois que vous passez par la boucle.
>> Donc, c'est un peu stupide de demander de l'ordinateur à la même question encore et encore -
Quelle est la longueur de BONJOUR? Quelle est la longueur de BONJOUR? Quelle est la longueur de BONJOUR? -
parce que nous voyons aujourd'hui et mercredi, ce n'est certainement va prendre du temps,
et ce n'est pas une très bonne utilisation du temps en raison de comprendre la longueur d'une chaîne
prend effectivement un peu d'effort.
Il n'est pas instantané, car il est dans certaines langues.
Donc, en changeant ce à n, le prix que je paie, c'est quoi?
Nous assistons à un compromis ici.
Je peux gagner du temps en ne demandant pas la même question encore et encore foutu,
mais ça va me coûter quelque chose, qui est quoi?
>> [L'élève] Vous perdez une certaine quantité de mémoire. >> Exactement. Ça va me coûter un peu de mémoire.
Donc, dans ce cas, il me coûte quoi?
Un autre 32 bits, car n est juste un int, comme l'implique le mot ici int.
Mais est-ce que ça va?
Franchement, ce n'est probablement pas grave parce que si vous pensez à ce sujet,
plus la chaîne est, le plus de temps, je vais pas gaspiller
car strlen va se faire appelé encore et encore et encore
pour chaque itération de la boucle.
Et ces jours-ci, mon Mac dispose de 2 Go de RAM, ces jours 4 gigs de RAM parfois.
Je pense que je peux me permettre de 4 de ces octets à fait accélérer les choses.
Mais cela va être un compromis et un thème vraiment dans la programmation et en informatique
de ne jamais vraiment obtenir quelque chose gratuitement.
Si vous voulez améliorer quelque chose, vous avez à payer pour cela dans l'autre main en quelque sorte.
L'espace en fonction du temps dans ce cas.
>> Donc, tout cela a été mené vers quelque chose comme ceci cryptique,
qui, comme vous l'avez probablement deviné maintenant, dit réellement?
[Réponse de l'élève inaudible] >> Ouais, c'est donc, Assurez-vous de boire votre Ovomaltine,
fait en utilisant un algorithme appelé ROT13, ROT 1-3,
ce qui signifie simplement tourner toutes les lettres de 13 places,
ce qui signifie prendre un, puis ajouter 13 à l'aller et dot, dot, dot
tout le chemin à la 13e lettre de suite, faire la même chose pour B et pour C et D et ainsi de suite.
Et si nous avons effectivement convertir ce ici utilisant un décalage de 13 places,
Nous allons revenir à ce petit Ralphie avait, qui était, Assurez-vous de boire votre Ovomaltine.
Mais maintenant, pour le problème de set 2, dans l'édition standard du moins,
vous devez sorte de ne chiffrer vous-même,
et nous devons en quelque sorte prendre en entrée comme ça et crypter ou décrypter.
>> Alors laquelle de ces sortes de principes fondamentaux nous conduit à cette occasion?
Jetons un coup d'oeil à ce troisième exemple ici.
Tout d'abord, il est appelé ASCII. Qu'est-ce que ASCII référer à?
Code standard américain pour l'échange d'information,
qui est vraiment loin de dire quoi? Quel est l'ASCII?
[Réponse de l'élève inaudible] >> Qu'est-ce que c'est? >> [L'élève] Une carte de caractère. >> Une carte personnage.
Il vient de mappe chiffres aux lettres parce que le monde a normalisé
ce nombre représentera quelles lettres afin que chacun d'entre nous peuvent utiliser des ordinateurs
et nos programmes sont tous simplement compatible quand il s'agit de l'impression de choses à l'écran.
Donc, rappelons que 65 arrive à représenter A, 97 arrive à représenter une minuscule.
Et si ce programme est simple ici ASCII en profitant de ce fait -
que le monde sait que le capital est de 65 A - et c'est juste l'impression de la cartographie.
>> Donc, avant de plonger dans le code, permettez-moi, au lieu d'ouvrir une fenêtre de terminal.
Permettez-moi aller de l'avant et de faire ASCII, puis nous allons simplement lancer cette chose juste pour gâcher la sortie.
Et il le fait exactement cela: un tableau vraiment grand qui raconte juste moi tous les différents codes
pour l'ensemble des lettres différentes.
Ainsi, un programme super simple, mais je n'ai pas eu à coder en dur ces 52 lignes de production:
26 majuscules, 26 minuscules.
Au lieu de cela, j'ai fait ce programme avec un couple de boucles.
Remarquez ce que j'ai fait ici.
J'ai réitéré à partir de i est de 65 à jusqu'à 65 + 26 parce que je voulais imprimer 26 lettres
dans l'alphabet anglais, i + + à chaque itération, et maintenant le remarquer à nouveau.
C'est la récurrence de notre ami transtypage
lequel vous convertir 1 type de données à un autre
car qu'est-ce que je veux faire dans ce programme particulier?
Je veux compter numériquement, car c'est comme ça que j'ai grandi comptage - 65, 66, 67, et ainsi de suite -
mais je ne veux pas imprimer uniquement les chiffres.
Je veux imprimer la lettre, suivie du numéro.
Je veux imprimer A: nombre, B: nombre, mais je peux le faire avec la même variable exacte.
Donc je imprimer c% comme un espace réservé pour un caractère,
% D comme un espace réservé pour un chiffre ou un nombre.
Alors que dois-je brancher pour ces 2 espaces réservés?
Je branchez d'abord dans l'équivalent pour les caractères de i, puis-je imprimer sur i lui-même.
>> Donc remarqué cela aussi fonctionne.
Je peux aussi jeter un flotteur à partir d'un int
afin de passer d'un nombre réel en entier,
ici je peux passer d'un int en char, qui est un peu bizarre -
ne pas tout à fait correspondre sur le monde réel - mais dans les ordinateurs
un char est juste un nombre sous le capot,
Nous sommes donc jamais être aussi explicite ici à l'ordinateur, en disant:
printf, imprimez-je pas que 65 ans, l'imprimer comme son équivalent numérique.
Et il s'avère que je n'ai même pas techniquement besoin de cela.
Ce que je faisais tout à l'heure est explicitement coulée
en spécifiant le type de données que je veux aller de et vers.
Mais remarquez que j'ai déjà ce c% placeholder
et cette autre espace réservé% c ici.
Même si ce n'est pas int, l'ordinateur se rend compte qu'un char,
c'est juste un int sous le capot.
>> Donc, si j'ai effectivement recompiler cela et relancer le programme d'ASCII,
remarquez qu'il fonctionne toujours juste parce que l'ordinateur rend compte qu'il ya cette correspondance.
Maintenant, il est plus important de faire la conversion explicite dans le monde des flotteurs à ints
car il vous fait prendre une décision calculée:
jeter tout après la virgule.
Ici, il n'y a vraiment rien à jeter parce qu'un personnage est juste un nombre,
et une chaîne de caractères est simplement un tableau de caractères.
Alors, quand vient le temps de mettre en œuvre certaines de chiffrement ou de déchiffrement,
comment est-ce que nous pouvons réellement traduire quelque chose comme ça absurde de,
Assurez-vous de boire votre Ovomaltine?
Et si nous savons maintenant - prenons comme hypothèse - que la clé,
le nombre que nous sommes en rotation l'ensemble de ces lettres par, est le numéro 13?
Donc, nous sommes passés de la lettre B tout le chemin à O au début de la phrase,
Assurez-vous de boire votre Ovomaltine, parce que si je fais B
et puis je vais C, D, E, F, G, H, I, J, K, L, M, N, O,
c'est pourquoi le cryptage de la lettre B devient O
parce que je viens d'ajouter 13 à l'.
>> Donc, si je veux décrypter cela, je dois essentiellement en O, puis soustrayez 13 de celui-ci.
Ou bien, franchement, parce qu'il ya 26 lettres dans l'alphabet, c'est merveilleusement symétrique,
on peut aussi ajouter 13 et nous allons revenir à la lettre B.
Mais comment allez-vous mettre en œuvre quelque chose comme ceci dans César
ou bien la manipulation des chaînes en général?
Si la lettre B est ce numéro?
Quelle est la lettre B? Donc, c'est 66, non?
Donc, si la lettre A est de 65 et la lettre B est de 66,
donc 66, tout ce que j'ai à faire est d'ajouter 13 à elle, et cela me donne 79.
Et si nous allons à notre feuille de triche peu, 79 en effet des cartes sur O.
>> Mais il ya un peu un cas coin ici.
Quelle est, par exemple, la lettre Z?
Si nous faisons 66 + 25 à faire tout le chemin jusqu'à la fin de l'alphabet, nous sommes à 91.
91 + 13 donne-moi 104, et devinez quoi?
104 n'est pas égale à une lettre majuscule.
Revenons à une feuille de triche peu ici.
Si je réexécutez ce programme dans l'appareil, notez que 104, si je retourne à la fenêtre du terminal,
104 est apparemment le h minuscule.
Il nous faut donc un truc clé ici afin de vous assurer que lorsque nous commençons à Z
et on ajoute 13 à ce que nous ne voulons juste continuer à aller de l'avant en nombres toujours plus grands.
Que voulons-nous vraiment faire?
Vous voulez enrouler autour.
>> Ainsi, il s'avère, comme vous avez vu sans doute dans la section maintenant ou dans les spécifications du problème posé lui-même
rendu compte qu'il ya cette autre opérateur en C qui est aussi un signe pour cent,
mais alors que nous avons utilisé ici pour spécifier% un espace réservé,
savoir que, surtout pour les 2 set problème, il ya aussi quelque chose comme ceci:
int x = y% z.
Permettez-moi de présenter cela comme une forme très générale de ce.
Pour cent signifie que dans un langage de programmation? >> [L'élève] Modulo.
Modulo, qui est une façon élégante de dire le reste.
Même si il ya une légère différence avec la définition là,
cela signifie diviser par z y, mais ne retourne pas le résultat de cette division;
au contraire, retourner le reste.
>> Donc, si y est en fait 3 et z est en fait 2, 3 divisé par 2 est égal à 1 avec un reste de 1,
alors qu'est-ce réellement x égale dans ce scénario? 1.
C'est comme une simple idée de bas niveau.
Il faut un peu de temps pour obtenir votre esprit enroulé autour de lui
car il a probablement été un moment depuis que vous aviez même se soucier de restes
et effectivement les utiliser pour quelque chose résolue,
mais dans ce cas, le simple fait que vous pouvez passer d'un grand nombre comme 3
à un nombre relativement petit comme le 2, puis envelopper efficacement
en utilisant le reste à une valeur plus petite comme 1 va être un truc précieux
que l'on peut utiliser à la fois pour quelque chose comme César et ce Vigenere autre chose
problème posé en 2, mais cela va être un truc récurrent tout au long du semestre.
Cette idée simple et facile de simplement prendre le reste en général
va nous permettre de s'enrouler autour.
Et comme on commence à jouer plus avec des tableaux, comme on commence à jouer avec plus de mémoire elle-même,
cela va devenir de plus en plus un truc puissant.
>> Ainsi, toutes les questions, alors sur ASCII ou la représentation sous forme de tableaux de chaînes de caractères?
Et nous le prendrons en hausse de 1 cran plus loin. Ouais.
[Question étudiant inaudible] >> Bonne question.
Qu'est-ce que cela signifie quand une variable d'un astérisque en face d'elle?
Permettez-moi de répondre à cette différer dans le détail,
mais qui se réfère à un sujet connu comme un pointeur.
Pointeurs ont à voir avec la mémoire, et nous sommes en fait aujourd'hui
faire le premier pas vers cette discussion,
mais pour l'instant, permettez-moi de prétendre que l'étoile n'existe pas
et nous continuerons à demander cordes cordes au lieu d'utiliser char *,
que vous avez probablement vu avant et je mettrai à l'écran dans un moment comme un teaser.
Donc, nous allons revenir à cela en détail beaucoup plus que beaucoup d'entre vous aimerez sûrement.
Finalement, pas aujourd'hui. Ouais.
>> [Question étudiant inaudible]
Dans quel contexte avez-vous à donner le signe d'un caractère? >> [L'élève] Ouais.
Donc, par défaut, lorsque vous ne mettez pas un +, seulement des nombres positifs sont pris en charge.
Donc, si vous écrivez juste le numéro 1, c'est un positif 1.
Si vous voulez vraiment de préciser la négation d'une valeur,
vous avez littéralement faire -1 sur votre clavier.
Mais ce n'est probablement pas votre question. >> [Réponse de l'élève inaudible]
>> Bonne question. D'accord.
Donc, cela a à voir, je crois, avec une sorte de bug vous avez couru dans
parce que vous étiez conversion d'un entier à un personnage,
mais de toute façon la négativité se sont impliqués,
et si le personnage vient de sortir munged en quelque sorte.
Donc pour l'instant, permettez-moi de simplifier un peu jusqu'à ce que nous reviendrons sur ce genre de sujet.
Pour l'instant, penser à des choses de cette façon - et c'est une simplification excessive.
Mais dans le monde d'un nombre entier, vous avez combien de bits sont à votre disposition?
Vous avez 32 bits.
Et jusqu'à présent, nous avons parlé du nombre total d'entiers, vous pouvez donc représenter
est à environ 4 milliards au total parce que vous avez 32 bits,
de sorte que c'est 2 à la 32, de sorte que c'est à peu près 4 milliards d'euros.
Mais nous avons vu une semaine ou 2 il ya que vous n'avez pas vraiment une plage de numéros
de 0 sur un maximum de 4 milliards.
La gamme va de la place environ 2 milliards d'négative positive 2 milliards d'euros.
Mais cela pose alors la question, comment voulez-vous représenter la notion de négatif 2000000000
et encore moins négative 1?
Pour l'instant, nous pouvons simplifier et dire que nous allons utiliser le bit le plus à gauche
de ces 32 bits, et si c'est un 1, il s'agit d'un nombre négatif,
et si c'est un 0, il s'agit d'un nombre positif.
Le problème avec cette représentation simplifiée des nombres négatifs
est que si vous avez été délibérément d'être intelligent et d'essayer de convertir à partir d'un personnage à un certain nombre
ou vice versa, il n'y a aucune une telle chose comme un caractère négatif.
Dans le monde de l'ASCII, qui utilise seulement 8 bits, les 8 bits de ceux matière,
et le bit le plus à gauche n'a rien à voir avec la négativité.
Et juste pour être clair, quand je dis bits à gauche,
rappelle que lorsque nous avons fait nos peu-exemples se rapportant à la première semaine
Rappelons que nous avons dessiné des choses comme 1001101, quelque chose comme ça.
Quand je dis le bit le plus à gauche, je viens littéralement faire la 1 que vous écrivez tout le chemin vers la gauche.
Ainsi, dans le monde de personnages n'y a pas de notion de négativité,
de sorte que le bit le plus à gauche a vraiment quelque chose à voir avec ASCII, rien à voir avec la négativité.
>> Alors que cela ressemble - et hors de contexte, il est difficile de répondre exactement -
mais de toute façon, votre code a été confusion que bit de gauche comme représentant une valeur négative
quand il faisait véritablement partie du personnage en question.
Et encore, je simplifie parce que les ordinateurs font réellement quelque chose d'un peu plus chics
qu'un simple changement de ce bit le plus à gauche à 1 pour un signe négatif par rapport à un 0.
Ils ont plutôt, si vous êtes curieux de Google, utilisez quelque chose de typiquement appelé complément à 2,
qui est un peu plus sophistiquée d'une approche
mais l'idée est finalement le même.
>> Donc en bref, il y avait à voir avec le fait que vous avez été un certain nombre à masser un caractère
ou vice versa, mais votre code n'était pas conscient du fait
que 1 de ces bits ont une signification dans le monde numérique.
Ce n'est pas le cas dans le monde de caractère.
Mais il semble que vous avez fixé, dans ce cas, caduque, maintenant. D'autres questions.
D'accord.
Donc, à ce jour, tous les programmes que nous avons écrites ont pris d'entrée peut-être de l'utilisateur
sous la forme de fonctions comme getInt, GetString,
ou si vous avez lu l'avant dans divers livres ou des références en ligne,
vous vous auriez pu utiliser des fonctions telles que scanf qui, franchement, que nous utilisons dans la bibliothèque CS50.
Mais dans une semaine ou 2, nous allons effectivement vous montrer comment la bibliothèque CS50 est mis en œuvre
afin que nous puissions prendre les roues d'entraînement hors tout.
>> Mais il s'avère qu'il ya une autre façon d'obtenir les commentaires d'un utilisateur.
En fait, nous avons nous-mêmes été en utilisant des arguments de ligne de commande
pour un couple de semaines maintenant.
Chaque fois que nous nous sommes heurtés Clang ou nous avons lance make,
nous n'avons pas seulement tapé clang, Entrez, nous n'avons pas tapé faire, Entrée.
Qu'avons-nous généralement écrite après le cliquetis mot à notre terminal de fenêtres rapide?
[L'élève] Le nom du fichier. >> Le nom du fichier, non?
Hello.c ou mario.c ou quel que soit le nom du fichier concerné est.
Et dans ce sens, ce que vous avez vraiment fait est que vous avez influencé le comportement des Clang
parce que certainement les gens qui ont écrit Clang n'avais aucune idée de ce que vous avez peu vieux
j'allais écrire un programme appelé mario.c années plus tard.
Alors il fallait en quelque sorte influencer le comportement de ce programme,
et que Clang programme a dû être rédigé de telle manière qu'il puisse accepter l'entrée de votre
par l'ajout de mots sur la demande de confirmation avant l'utilisateur clique sur Enter.
>> Ainsi, il s'avère que depuis quelque temps, nous avons été en déclarant la quasi-totalité de nos programmes
pour commencer comme ça - int main (void) - et puis nous avons pris les devants
et a commencé à écrire notre code.
Et nous pourrions avoir une forte comprend au début du fichier,
mais la quasi-totalité de nos programmes jusque-là ont commencé avec ce
même si vous avez vu en coupe, dans les livres, références en ligne
que ce n'est pas en fait avoir comme nulle.
Une autre forme légitime pour ce faire prendre est int argc, puis chaîne argv [].
Alors maintenant, ce qui est cela implique?
Il s'avère que argc, qui est une convention humaine - ce qu'on pourrait appeler foo,
mais il serait tout simplement beaucoup moins clair pour les lecteurs -
argc est juste un argument à la fonction appelée main qui représente quoi?
Qu'est-ce que argc reposer pour ceux qui connaissent?
>> [Réponse de l'élève inaudible] >> Ouais, nombre d'arguments ou de comptage argument.
C'est aussi simple que cela.
Combien d'arguments ont été passés à ce programme?
Qu'est-ce que ça veut dire?
Si la ligne de commande j'ai couru quelque chose comme ça - clang-mario.c -
argc lorsque je tape Entrez va prendre une valeur de quelque peu confuse, 2.
Ainsi, il s'avère que argc est le nombre de l'argument,
mais pour des raisons historiques, le nom du programme lui-même est inclus dans ce décompte.
Donc, argc vaut 2 lorsque j'ai écrit clang mario.c.
Qu'est-ce que argv contient-il?
Tout d'abord, argv ressemble à une chaîne, mais pas tout à fait
car dès mercredi dernier, et d'autant plus aujourd'hui,
ces crochets indiquent ce qui? C'est un tableau.
Il n'ya pas de nombre dans le tableau, ce qui devrait donner un sens intuitivement
parce que les gens qui ont écrit Clang année il ya certainement eu aucune idée
combien de mots que les gens comme nous, tapez à l'invite avant de frapper sur Entrée.
>> Donc dans ce cas là, ils ont déclaré que la principale fonction que de prendre un tableau d'arguments,
0 ou plusieurs arguments.
Ils ne savent pas à l'avance combien ils sont,
il n'est donc pas délibérément à l'intérieur de certains de ces crochets.
Mais le fait que les crochets sont là disent l'ordinateur,
s'attendre à un tableau.
Argv est juste abbréviation de vecteur d'arguments.
Un vecteur est une façon élégante de dire ensemble,
et le tableau est une façon élégante de dire une liste ou d'une collection.
Donc, cela signifie simplement que si vous écrivez comme ceci principal
au lieu de comme la façon dont nous avons fait pendant ces deux dernières semaines,
votre programme a maintenant le pouvoir d'accepter les arguments de ligne de commande
de sorte que plus vous avez à écrire mario, puis appuyez sur Entrée,
puis tapez dans un certain nombre de combien de blocs que vous voulez élevé de la pyramide d'être,
puis appuyez de nouveau sur Entrée.
Nous n'avons même pas besoin d'utiliser GetString plus ou getInt ou GetFloat pour cette question.
Nous pouvons seulement espérer à l'utilisateur de taper ces mots à l'invite de lui-même
tout comme les auteurs de Clang décidé que ce serait un programme très ennuyeux
si pour compiler votre code vous devez d'abord clang tapé, appuyez sur Entrée,
puis nous l'avons dit à l'utilisateur, s'il vous plaît entrez le nom du fichier que vous voulez compiler,
puis on tape dans mario.c et appuyez sur Entrée.
Mais c'est exactement ce que nous avons fait à nos utilisateurs des deux dernières semaines.
Nous utilisons GetString et nous attendons que le programme est en cours d'exécution pour les inciter pour l'entrée.
Cela ne doit plus être le cas.
>> Donc, dans cet exemple ici, nous avons maintenant argv chaîne,
et cela aussi est un peu simpliste,
roues de formation qui seront très bientôt se détacher.
C'est le moyen le plus approprié d'écrire cette déclaration alternative principale
car il s'avère que ce que nous continuons à appeler chaîne a fait une étoile,
un astérisque, dans sa définition même, mais cela semble peu compliqué,
il est déroutant au premier abord, si nous simplifions par la simple création d'un synonyme de sortes
dans la bibliothèque CS50 que les cartes char * mot à cette chaîne plus convivial.
>> Donc, nous allons effectivement essayer cette époque. Permettez-moi aller de l'avant et d'ouvrir gedit ici.
Permettez-moi aller de l'avant et d'ouvrir de argv 1.
Ce programme imprime apparemment les arguments, mais dans des termes anglais,
en regardant ce code, qu'est-ce que faire plus spécifiquement?
Si je tape dans la barre de commandes a.out foo, ce qui est imprimé dans ma fenêtre en noir et blanc?
A.out foo bar, Entrée.
Allez-y. Ouais. >> [Réponse de l'élève inaudible]
Bon. Donc a.out, nouvelle ligne, foo, la nouvelle ligne, un bar, une nouvelle ligne.
Pourquoi est-ce? Nous pouvons certainement confirmer dans un instant.
Il s'agit d'une sorte de ligne de code moelleux.
Il ne fait qu'afficher une nouvelle ligne juste pour rendre les choses plus joli à l'écran.
Il s'agit d'une boucle qui est une itération de 0 sur un maximum de argc,
et ce n'est incrémenter à chaque itération + +.
Donc, ce dit maintenant imprimer une chaîne de caractères, comme le laisse entendre ce% s.
Argv [i] est à peu près la même idée de l'exemple précédent.
Nous l'appelions la variable s, et maintenant il est appelé, de façon arbitraire, argv.
Cela signifie imprimer l'argument ième qui a été tapé en ligne de commande,
et puis après tout cela est fait, pour faire bonne mesure d'imprimer une nouvelle ligne.
>> Alors voyons voir ça. Permettez-moi d'ouvrir la fenêtre du terminal.
Permettez-moi de compiler argv 1, et maintenant laissez-moi courir argv 1, Entrée. Hmm. D'accord.
Lançons foo bar. Intéressant. Baz.
Et si vous êtes déjà demandé pourquoi je tape ceci,
c'est juste aussi une convention d'ordinateur stupide science.
Le monde a besoin souvent de simples espaces réservés pour les mots verbales.
Donc, si vous voulez parler de la ficelle générique,
les informaticiens ont tendance à dire que foo quand ils ont besoin d'un mot au hasard,
puis ils disent bar si ils ont besoin d'un deuxième mot aléatoire,
puis ils disent baz s'ils ont besoin d'un troisième mot, puis ils disent qux s'ils ont besoin d'un quatrième mot,
et puis il ya un grand débat religieux en ligne de ce qui vient après qux,
afin que vous puissiez Google que de comprendre ce que l'autre mot arbitraire devrait être.
Mais ceux-ci n'ont aucune signification quelconque,
si foo bar, si vous Google que cela ne ont un sens,
qui fait partie de l'étymologie ici.
>> Donc, tout cela est fait alors l'impression 1 de ces chaînes par ligne.
Donc, si je la place, cependant, voulait obtenir un peu plus chics,
suppose que je ne voulais pas d'imprimer chaque chaîne par ligne;
Je voulais imprimer chaque caractère de chaque chaîne par ligne.
Comment pourrais-je le faire à la place?
Que dois-je changer au sujet de ce programme si je veux imprimer non chaque mot
mais je veux imprimer chaque mot lettre par lettre par lettre,
puis la lettre du mot suivant par lettre par lettre?
Comment pouvons-nous combiner ces idées jusque-là? Ouais.
[L'élève]% c. Tous droits >>. Nous avons donc besoin d'un endroit c%.
Bon, parce que je ne veux pas d'imprimer des chaînes entières, je veux imprimer des caractères. Quoi d'autre?
>> [Réponse de l'élève inaudible] >> Intéressant.
Il nous faut donc une sorte de deuxième dimension ici maintenant
parce penser argv comme un tableau, mais c'est un tableau de chaînes.
Mais comme d', comme, il ya 15 minutes, ce qui est une chaîne? C'est un tableau de caractères.
Alors, vraiment, argv est un tableau d'un tableau de caractères,
un ensemble de tableaux de caractères.
Ainsi, il s'avère que l'on peut utiliser les notations support un peu plus carrés. Alors allons-y.
Dans le haut de cette boucle sur la ligne 19, je vais parcourir depuis i jusqu'à argc,
mais je vais faire ceci:
pour - je ne peux pas je utiliser maintenant.
J'ai besoin d'une autre variable parce que je veux itérer sur les mots
mais aussi sur les lettres dans les mots
donc je sorte de présenter un axe vertical et un axe horizontal, sorte de vue conceptuel.
Donc j int obtient 0, alors je veux faire aussi longtemps que j j est inférieur - et je vais nettoyer tout ça un peu.
Comment puis-je parcourir les lettres dans une chaîne? Nous l'avons fait il ya un instant.
Strlen de argv [i]. Bon.
Et encore une fois, je fais un peu ici l'inefficacité en ne créant pas ou n que ce soit,
mais nous reviendrons là-dessus.
>> Alors maintenant, j + +. Maintenant, je dois tiret davantage ici.
Qu'est-ce que je veux maintenant imprimer sur chaque itération?
[Réponse de l'élève inaudible] >> Donc [i] me donnera la parole.
[I] [j], un peu comme une matrice.
Ceux d'entre vous avec les mathématiques y horizons,
nous sommes en quelque sorte de l'indexation encore plus loin dans cette matrice ou cette série de tableaux,
cette structure 2-dimensionnelle.
Alors maintenant, nous allons voir ce qui se passe ici. Permettez-moi d'ouvrir ma fenêtre de terminal plus grand.
Permettez-moi de faire de relancer argv 1.
Et j'ai foiré ici, ce qui est une bonne leçon parce que moi aussi oublié de le faire.
Déclarer implicitement "strlen" fonction de la bibliothèque C avec unsigned »-
Je ne sais même pas ce que le reste de ce moyen, mais j'ai vu ça avant,
déclarer implicitement.
Chaque fois que nous voyons cette erreur, qu'est ce que cela signifie en général?
>> [Réponse de l'élève inaudible] >> J'ai oublié une bibliothèque en haut. Mais attendez une minute.
D'habitude, je suis foutu parce que j'ai oublié la bibliothèque CS50, mais c'est là.
D'habitude, je suis foutu parce que j'ai oublié de base I / O.
Et franchement, je n'ai même pas besoin de cela. Nous n'utilisons pas GetString aujourd'hui.
Alors qu'est-ce que je suis absent?
Il ya une autre bibliothèque que maintenant nous avons besoin d'utiliser string.h parfois appelé,
et c'est tout de suite une autre bibliothèque qui a plus de fonctions qui ne sont pas dans la norme I / O.
>> Donc, revenons à ma grande fenêtre de terminal.
D'accord. Maintenant, bon sang, je suppose que j'avais tort. J'ai été en utilisant la bibliothèque CS50.
Ainsi, nous pouvons résoudre ce problème dans l'une des 2 façons.
Nous pouvons prendre les roues d'entraînement hors en ce moment et tout cela,
ou en nature let de garder cette simplification juste pour le moment, de retour dans collez ce,
résoudre ce problème, et maintenant revenir à la fenêtre du terminal.
Donc, pour être clair, dans la bibliothèque CS50 n'est pas seulement les fonctions,
c'est aussi le mot clé string, ce qui explique pourquoi cette erreur vient de se passer.
>> Alors on y va. J'ai fixé les deux questions de la bibliothèque. Entrée. Bon.
Argv 1, foo bar, Entrée. Excellent.
Nous avons donc maintenant chaque lettre de chaque mot imprimé 1 par ligne,
ce qui ne permet pas d'avoir un programme très intéressant,
mais remarquez maintenant nous avons la capacité non seulement de l'itération sur les mots
mais aussi sur des lettres individuelles à-dire, ce qui semble terriblement familier
de même le plus simple des applications telles que lettres de brouillage dans une chaîne comme ça.
Allons de l'avant et de prendre notre pause de 5 minutes ici.
Et quand nous reviendrons, nous allons commencer à parler de l'efficacité
avec laquelle nous pouvons faire ces choses.
>> Très bien. Nous sommes de retour.
Merci à l'un de nos facteurs de transcription qui joue beaucoup de Bananagrams,
nous avons en fait tout un tas de caractères avec nous ici aujourd'hui
physiquement incarnée avec ces petits morceaux de plastique,
et permettez-moi de proposer que cette ardoise vierge blanche représente ici la RAM dans mon ordinateur -
ordinateur portable, ordinateur de bureau, peu importe - et il ressemble à beaucoup de lui
parce que si on commence à découper jusqu'à présent RAM dans de petits morceaux de la grosseur d'octets,
nous allons arbitrairement que quelque chose de cette taille et de ce que représente floue -
voilà, et attardons-nous un zoom arrière un peu ici -
disons que quelque chose de cette taille représente un seul octet.
Donc, on peut en effet s'adapter à tout un tas d'octets ou de caractères à l'intérieur de cette mémoire,
comme suggéré par la taille relative ici.
>> Supposons donc maintenant que l'objectif est d'allouer de la mémoire pour une chaîne.
Comment cela fonctionne réellement?
Dans les programmes que nous avons écrit, nous avons souvent eu recours à GetString,
mais maintenant, clairement, il ya cette autre voie par laquelle nous pouvons obtenir saisie de l'utilisateur dans argv
via des arguments de ligne de commande.
Mais qu'est-ce qui se passe vraiment sous le capot?
Il s'avère que nous appelons - nous allons revenir en arrière pour GetString - la fonction GetString
dans la bibliothèque CS50, l'utilisateur est invité à saisir une chaîne de caractères,
l'utilisateur tape un mot - appelons-BONJOUR.
Et nous avons dit depuis ces deux dernières semaines que la valeur de retour de GetString
est en fait une chaîne de caractères, comme le mot BONJOUR.
>> Mais ce qui est GetString vraiment?
Que l'utilisateur tape dans BONJOUR, Entrée, GetString est de trouver,
ok, combien de caractères est-ce? Il s'agit d'H-E-L-L-O.
Donc, il a besoin d'allouer, il doit demander au système d'exploitation - Linux dans ce cas -
pendant au moins 5 octets pour stocker BONJOUR.
Et ce qu'il procède alors à faire une fois qu'il rentre les 5 octets à partir du système d'exploitation
est d'établir BONJOUR dos à dos à dos à dos.
Et donc ce qui est vraiment revenu de GetString est un bloc de données qui ressemble à ceci.
Mais c'est un peu inexact, car il s'avère que ce n'est pas aussi simple
comme tout stocker dans BONJOUR mémoire de l'ordinateur
car supposons que mon programme que je vous écris en C puis appelle GetString nouveau,
et le mot suivant que l'utilisateur tape dans est bye, bye.
Eh bien, j'ai besoin pour s'adapter à ce BYE mot quelque part en mémoire.
Je ne peux pas clobber BONJOUR.
Par exemple, je ne veux pas l'ordinateur de simplement commencer à écraser comme ceci
le mot d'origine parce que je pourrais encore utiliser le mot BONJOUR dans une variable
ailleurs dans mon programme.
>> Donc B-Y-E doit se retrouver ailleurs dans la mémoire.
Mais la convention est généralement que la chaîne suivante vous allouez
sans doute, mais pas toujours, va se retrouver à l'emplacement de mémoire disponible suivant.
Et si je n'ai pas demandé le système d'exploitation pour toute la mémoire
depuis la dernière fois que j'ai appelé GetString, les chances sont le BYE mot
va se retrouver tout de suite après le mot BONJOUR en mémoire.
Mais à ce stade, vous pouvez peut-être voir où se pose un problème potentiel.
Parce que les morceaux suivants de la mémoire, les octets suivants qui étaient juste libre -
nettoyer ardoise blanche - dans la mémoire de l'ordinateur était juste à côté BONJOUR,
il se sent comme la première chaîne J'ai demandé pourrait soudainement changer maintenant
parce que j'ai changé pour l'essentiel HELLOBYE
au lieu de demarcing quelque sorte le début de BYE et la fin de BONJOUR.
>> Ainsi, il s'avère que ce qui se passe vraiment sous le capot,
que vous pourriez avoir entrevu dans les références en ligne ou de l'article ou des livres
ou pas du tout pour l'instant, c'est qu'il ya effectivement une démarcation délibérée
entre les mots dans la mémoire d'un ordinateur.
Et en fait, dans ce cas-ci, plutôt que de simplement mettre BYE juste à côté BONJOUR,
au contraire, l'ordinateur met un caractère spécial, le caractère spécial nulle, pour ainsi dire,
qui est représenté par un marqueur de contre-oblique 0.
Donc, longue histoire courte, rappelons que les personnages sont représentés en ASCII.
ASCII est juste une mise en correspondance entre les numéros et les lettres,
et la plupart de ces lettres commencent environ 65 pour le capital A,
mais il s'avère que vous pouvez certainement représenter le chiffre 0 comme un entier ou en binaire,
et il s'avère que le monde a décidé il ya bien longtemps: «Vous savez quoi?"
"Faisons 0 Nombre réserve de ne pas représenter tous les caractères sur le clavier -
"Pas de lettres, pas de chiffres, pas de ponctuation. 0 est spécial."
"Il va y avoir du caractère spécial nulle, et nous allons l'écrire comme \ 0".
La différence étant que nous venons d'écrire 0, 0 est un personnage.
Rappelez-vous que il ya des codes ASCII pour 0, de 1, de 2, de 3
car le caractère 0 est différent du nombre 0.
Et vous pouvez voir que si vous regardez en arrière de la semaine 1 lorsque nous avons parlé ASCII,
0 et 1 et 2 et 3 sur toute la hauteur à 9 ont leurs propres codes ASCII.
Ils ne sont pas, par hasard, de 0 à 9. Ils sont très différents.
Donc 0 signifie simplement «Je suis spécial», et les \ 0 signifie littéralement: «Je ne suis pas le caractère 0."
«Je suis cette valeur particulière, le caractère nul."
J'ai donc fait besoin d'un autre de ces car je ne peux pas faire la même erreur deux fois.
>> Ainsi, après le mot BYE nous allons aussi avoir besoin d'un autre de ces caractères nuls.
Permettez-moi de prendre ma plume ici et laissez-moi dessiner rapidement un autre \ 0
de sorte que, après j'ai demandé au système d'exploitation de 2 chaînes
via GetString suivi par un autre appel à GetString,
c'est ce qui est fait en mémoire.
Alors, quand je rentre une chaîne, je suis vraiment se remettre que,
et quand je reçois la chaîne suivante, je suis vraiment se remettre ça.
Donc, cela pose la question, strlen, tout d'abord, que doit-il revenir?
Quand je l'appelle strlen sur la chaîne s et s est le mot BONJOUR que l'utilisateur a tapé dans,
qu'est-ce que nous avons évidemment dire la longueur de BONJOUR était il ya quelques minutes?
Il était de 5, non? H-E-L-L-O. Et c'est bien ainsi strlen œuvres.
Elle renvoie ce qu'est un être humain normal peut s'y attendre de la longueur d'une chaîne de l'être.
Mais en réalité, quelle est la taille du tableau de caractères qui est stockant bonjour?
Il s'agit en fait 6.
Donc, strlen ne mentionne pas ce fait pour vous.
Mais sous le capot de l'ordinateur est en effet en utilisant 6 octets pour stocker un mot de 5-lettre,
et cela est vrai, peu importe combien de temps le mot est.
Il va toujours y avoir un caractère nul particulière se terminant à la fin de la chaîne
à démarcation sa longueur totale.
>> Alors, si vous êtes la personne la mise en œuvre strlen 20, il ya 30 ans,
comment allez-vous mettre en œuvre strlen lui-même?
Nous prenons pour acquis qu'il existe, tout comme nous tenons pour acquis ce qui existe printf,
mais si BONJOUR est le mot en question
et ce que j'ai en mémoire est quelque chose qui ressemble à ceci,
si vous aviez à réimplémenter strlen parce que vous avez été invité à
ou parce que, franchement, vous ne saviez pas existé strlen -
vous avez eu à rouler celui-ci sur votre propre - comment pourriez-vous mettre en œuvre strlen
lorsqu'il est administré quelque chose qui ressemble à ceci?
Maintenant que nous savons d'une chaîne est un tableau, on peut itérer sur chacun des caractères individuels
en utilisant quelque chose comme - nous allons essayer de le faire à la volée.
>> Laissez-moi aller dans l'appareil. Permettez-moi de créer un nouveau fichier, strlen.c.
Permettez-moi maintenant aller de l'avant et ne comprennent stdio.h afin que nous ayons accès à printf.
Permettez-moi de faire int main (void). Oh. Je vais le faire moi-même pour le moment alors. [Rires]
Merci.
C'est ce que je fais. Très bien.
Donc, avant je me suis tourné sur l'écran, j'ai tapé tout cela.
Et maintenant ce que je vais faire est la suivante:
printf ("Donnez-moi une chaîne:")
C'est juste les instructions moelleux.
Maintenant, laissez-moi faire GetString string s =.
J'ai déjà besoin de faire un changement maintenant.
J'utilise la bibliothèque CS50 tout à coup, alors laissez-moi aller de l'avant et taper cs50.h.
Et maintenant, nous allons faire ceci: printf ("La longueur est:% d, strlen [s] -
et je n'ai pas encore fini. Que dois-je ajouter à ce programme?
>> [L'élève] string.h. >> String.h.
Donc pour l'instant, nous utilisons strlen, nous allons donc assurez-vous que le compilateur sait où c'est,
donc un peu de raison vérifier.
Je reçois une chaîne à la ligne 8, et dans la ligne 9 j'imprime sur sa longueur% d.
Alors allons-y et ouvrez cette place.
Nous avons faire strlen - compile bien -
strlen - permettez-moi de zoomer - Entrez, H-E-L-L-O, Entrée. La longueur est de 5.
>> Bon, strlen semble fonctionner, mais le monde le savait.
Donc, nous allons maintenant mettre en œuvre strlen nous comme suit.
Permettez-moi de profiter de cette bibliothèque là.
Nous n'avons plus accès à string.h parce que je ne savais même pas qu'il existait.
Mais c'est bien parce que je peux mettre en œuvre strlen moi
et qu'elle soit prise une chaîne appelée entrée,
et maintenant j'ai besoin de comprendre la longueur de cette chaîne.
Alors, comment puis-je faire cela?
Que faire si je fais - nous allons voir comment faire cela - Que voulez-vous faire?
>> [Réponse de l'élève inaudible] >> OK.
Ainsi, nous pouvons le faire dans un tas de façons. Je vais essayer d'adopter cette approche.
Permettez-moi de me donner une variable int i, donc je commence à 0.
Et laissez-moi vous dire ceci: alors que l'entrée [i] n'est pas égal à quoi? \ 0.
Ainsi, il s'avère, comme dans le cas avec tous les caractères lors de leur écriture littéralement dans un programme,
vous devez utiliser des guillemets simples, et non des guillemets doubles.
Donc, si je devais écrire la lettre a, je le ferais, la lettre b, je le ferais.
Ceci, en revanche, serait une chaîne, pas un caractère individuel.
>> Donc, je veux \ 0 littéralement. Qu'est-ce que je veux faire dans cette boucle?
En fait, j'ai besoin d'une autre variable, de sorte int length obtient 0.
Même si vous n'étiez pas sûr pourquoi nous avons commencé la façon dont nous l'avons fait,
maintenant que nous allons dans cette voie, qu'est-ce que je veux faire sur la ligne 9?
longueur + + et puis ici-bas sur la ligne 10, la longueur de retour.
Alors, comment est strlen mis en œuvre?
Il est effectivement mis en œuvre sans doute comme ça.
Peut-être que la personne a utilisé une boucle for, peut-être une boucle Do While - qui sait?
Nous aimerions vraiment regarder sous le capot le code source réelle
dans un fichier appelé string.c probablement.
>> Mais ici, nous allons réfléchir à ce que je fais.
Je déclare une variable appelée i, le définissant comme égal à 0.
Je puis déclarer une autre longueur variable appelée, le définissant comme égal à 0.
Alors je dis tout le ième caractère en entrée n'est pas égal au caractère spécial null, \ 0,
incrémenter la longueur.
Mais dès que le ième caractère est ce caractère spécial, ce qui se passe à la boucle?
Il courts-circuits. Il s'arrête, ce qui signifie que nous avons ensuite retourner instantanément longueur.
>> Donc, si je n'ai pas gâcher, nous allons aller de l'avant et revenir à ma fenêtre de terminal.
Permettez-moi de recompiler. Et je n'ai visser en place.
Redéclaration incompatibles de la fonction strlen bibliothèque.
Alors que j'essayais d'obtenir trop intelligent pour mon propre bien ici.
Le compilateur sait en réalité qu'il existe une fonction appelée strlen
même si nous n'avons pas inclus la bibliothèque. C'est très bien. Peu importe.
Nous allons juste à coopérer alors. Nous allons renommer cette longueur.
Permettez-moi de changer l'utilisation de celui-ci à la longueur ici, et cela rendra plus heureux Clang.
Soit dit en passant, parce que certaines de ces fonctions sont horriblement commun -
strlen, prinf - ils ont en fait sorte de statut spécial.
Et si Clang sait juste un petit quelque chose de spécial.
Ce n'est pas toujours le cas avec la plupart des fonctions, c'est pourquoi nous nous sommes crié.
>> Je vais essayer à nouveau. Heureusement, il a travaillé ce moment-là.
Alors maintenant, permettez-moi de gérer mon propre strlen programme.
Donnez-moi une corde: H-E-L-L-O, Entrée. Et j'ai merdé.
Pourquoi? >> [Réponse de l'élève inaudible] >> Exactement.
J'ai donc moi-même ici une boucle très belle apparence infinie
parce que même si je suis d'incrémentation longueur à chaque itération,
que vais-je bien ne pas faire? Je ne suis pas en incrémentant i. D'accord. Solution facile. Oui?
D'accord. No. Maintenant, nous irait à l'encontre de certains autre erreur commune où je dois parenthèses.
Et franchement, ce code est en train de regarder laid,
donc nous allons essayer de répondre à ce nettoyage en place dans un instant.
Mais maintenant je suis en incrémentant la longueur et i.
Franchement, je vois déjà une possibilité d'amélioration, mais nous reviendrons là-dessus.
>> Alors maintenant, nous allons simplement nous assurer que nous sommes au moins fait des progrès.
Ce qui est arrivé à quelques-uns d'entre vous, et j'ai oublié de mentionner à l'avance.
Quand vous avez le malheur d'un tel scénario, comment pouvez-vous résoudre ce problème
court de redémarrage de l'appareil ou de votre ordinateur ou de fermer la fenêtre?
Il est effectivement facile.
Commande C envoie cette petite carotte symbole C, et qui se termine juste la plupart des programmes.
Si vous avez une boucle infinie vraiment mauvaise impression qui est parfois une infinité de choses,
parfois vous pourriez avoir à faire Control C un millier de fois pour le rendre réellement entendre.
Il suffit donc de se rendre compte maintenant parce que je ne suis pas l'impression de quelque chose, qui a été assez facile.
Et techniquement, une fois suffit, mais je ne s'impatientent et j'ai l'habitude de frapper autant de fois.
>> Donc, strlen. Donnez-moi une corde: BONJOUR. Est-ce que ça va marcher cette fois?
D'accord. Une autre erreur commune. Avoir à recompiler.
C'était délibéré, celui-là. Très bien.
Donc, strlen, H-E-L-L-O, Entrée. Excellent.
Donc, nous avons maintenant un strlen à 5.
Donc, nous avons littéralement réimplémenté cette roue.
Alors maintenant, nous allons nettoyer tout ça parce que cela ne me fais pas impressionné
avec la conception de mon code.
Que pouvons-nous éliminer clairement dans ce programme pour nettoyer tout ça?
[Réponse de l'élève inaudible] >> Oui. Littéralement, nous traitons i et longueur identique.
Alors, pourquoi ne pas simplement faire preuve d'intelligence et de dire alors que la longueur?
Au contraire, nous allons simplement appeler sa longueur, pour commencer, l'initialiser à 0
car par défaut la chaîne n'a pas de longueur jusqu'à ce que nous comprendre de quoi il s'agit.
>> Maintenant, nous faisons cela, et maintenant c'est un programme assez élégant.
Une variable. Je l'ai nettoyé, il resserré.
Alors maintenant, revenons à ma fenêtre de terminal. Allons de l'avant et de lancer ça.
Assurez-strlen. On dirait bien. Exécutez à nouveau strlen, Entrée.
Donnez-moi une corde: BONJOUR, Entrée. Et il semble fonctionner comme 5.
Maintenant, pour être clair, si je n'avais pas écrit, par exemple, dans BONJOUR 1 chaîne de caractères
puis BYE dans un autre, nous pouvons certainement plusieurs mots.
Si l'expression fait, je voulais taper n'était pas BONJOUR, mais, par exemple,
BONJOUR TOUT LE MONDE, notez que ce que nous n'aurions pas cette situation est ici, non?
Cela donne à penser que c'est 2 chaînes.
Vous ne pouvez certainement avoir des caractères barre d'espace, donc si nous avons effectivement tapé dans une phrase plus longue
Comme le monde BONJOUR, ce que nous aurions vraiment dans la mémoire
regarde un petit quelque chose comme ça là-bas.
>> Très bien. Toutes les questions, puis sur la représentation des cordes ici?
Non? Très bien.
Donc je l'ai dit plus tôt que l'appel à strlen encore et encore délibérément comme ça
n'est probablement pas la meilleure idée, parce que vous allez faire beaucoup de travail
encore et encore et encore.
En effet, ce type de travail est nécessaire pour déterminer la longueur d'une chaîne, apparemment?
Vous devez commencer au début et puis regardez, regardez, regardez, regardez, regardez
jusqu'à ce que vous voir enfin ce caractère spécial, à ce moment, ah, maintenant je sais la longueur.
Donc, plus tôt, quand nous avions strlen appelé encore et encore et encore,
la raison pour laquelle je propose que c'était un peu stupide parce que encore une fois, cette chaîne ressemble à ça.
Il ne va pas changer à chaque fois que vous parcourez une boucle,
si vous faites un travail inutile.
Dans le même temps vous devez savoir, en passant, que les compilateurs comme Clang ces jours-ci
ont été développés depuis de nombreuses années,
et writers de compilateur, programmeurs, sont assez intelligents.
Et il s'avère que les compilateurs Clang et d'autres peuvent réellement comprendre que,
bien, oui, vous avez écrit strlen dans votre état,
ce qui signifie techniquement que nous appelons encore et encore et encore.
Mais les compilateurs intelligents peuvent réellement optimiser ce genre de décisions des utilisateurs pauvres
de votre code pour redresser les choses.
>> Alors ne viens de réaliser que, parfois, le compilateur est plus intelligent que nous
et type de cacher nos propres erreurs.
Mais certainement quand il s'agit de séries de problèmes et autres,
ne penser à ces décisions de conception fondamentalement erronée
peut-être pour la simple raison que nous ferions beaucoup plus de travail
que nous avons à faire. Mais combien plus de travail?
Dans le cas des MONDE BONJOUR, nous allons commencer à généraliser l'ampleur de ce problème.
Quelle est la longueur du problème ou de la taille du problème
lorsque le mot l'utilisateur a tapé n'est BONJOUR?
C'est apparemment 5, peut-être 6. Plus ou moins 1. Peu importe.
C'est tellement proche nous allons l'appeler 5.
>> Alors, quelle est la taille du problème ici en essayant de comprendre la longueur de BONJOUR?
Il est 1, 2, 3, 4, 5, et peut-être 6 pour le dernier caractère, mais nous allons généraliser ce que n.
Donc, n, juste la variable n, est ce que les informaticiens utilisent généralement
pour décrire l'ampleur d'un problème, et le problème qui se pose est combien de temps BONJOUR?
Combien de temps faut strlen prendre?
Il faut de l'ordre de n étapes, où chaque étape signifie oeil à un personnage,
regarder un personnage, regardez un personnage.
Et nous avons eu cette discussion il ya quelque temps, le nombre d'opérations se passe quelque chose.
Le premier jour de classe que nous avions tous maladroitement debout,
et puis tout le monde a commencé appariement hors uns avec les autres
afin de réellement compter idéalement combien de personnes étaient dans la salle.
Et nous avons aussi fait une autre chose à la place où si je l'ai fait de manière old school
de débutant 1, 2, 3, 4, 5, 6 et ainsi de suite,
ça aussi, la taille de ce problème était de taille n. Il y avait des gens dans la salle n.
Mais je ne pouvais accélérer les choses, non? Style de l'école primaire je pouvais commencer à compter en 2s.
2, 4, 6, 8, 10, 12. Et cela se sent tellement plus rapide, et il est effectivement.
Il est littéralement deux fois plus vite, mais encore une fois, si 400 autres personnes ont marché dans cette salle
tout à la fois, ces algorithmes faudrait encore 200 400 ou peut-être pas.
>> Mais en revanche, si nous voulons vraiment faire preuve d'intelligence et nous avons tous, au lieu de vous compter vous-mêmes,
rappeler comment cet algorithme travaillé.
Vous tous levés. Permettez-moi d'avancer rapidement à ce sujet.
Vous tous debout, vous appariés, puis la moitié d'entre vous assis,
moitié d'entre vous assis, la moitié d'entre vous assis,
et à chaque itération de cette boucle de la semaine 0, on réduit de moitié le problème à la main
et se rendit à n / 2, alors n / 4, puis n / 8.
Et l'implication de cela est que si un autre 400 personnes marchent dans la pièce, pas une grosse affaire,
il nous faudra plus d'1 tour, pas plus de 400 tours, 200 tours non plus.
Et l'histoire nous dit tout à l'heure j'avais à faire un petit quelque chose à ce sujet.
Cette ligne rouge est ici linéaire, c'est tout droit, et il est étiqueté comme n
parce que la taille d'un problème se développe,
si votre algorithme ou un programme avec lequel vous résolvez elle prend des mesures n,
nous pouvons tracer une ligne droite où il prend plus de temps plus la taille du problème.
Et l'approche twosies, comptage 2, 4, 6, 8, toujours en ligne droite, juste un peu mieux.
Il faut du temps un peu moins, de sorte que la ligne jaune est en dessous du point de la ligne rouge pour le point.
>> Mais mieux encore était-ce Saint-Graal de ce que nous appelions de temps logarithmique
où même si encore une fois on double le nombre de personnes dans la salle,
on double la taille de ce répertoire à partir du premier jour de classe,
pas grave, il faut 1 larme page de plus, prend 1 séance plus bas
afin de résoudre un problème qui est deux fois plus grand.
Et si la conversation que nous avons maintenant la chance de commencer à avoir est
comment pouvons-nous réellement résoudre les problèmes efficacement
si l'on considère le plus simple des problèmes de ce genre?
Supposons que nous ayons 8 portes derrière lesquelles il ya des chiffres,
et chacun de ces nombres ne sont pas triées en aucune façon,
ils sont des entiers aléatoires juste derrière ces portes,
et nous poser la question comment allez-vous trouver le nombre - qui sait -
7 derrière ces portes?
Que feriez-vous, un être humain, faire pour me trouver le numéro 7
si encore une fois chacun d'entre eux sont des portes et de voir une valeur que vous devez ouvrir une porte?
Qu'est-ce que votre algorithme est peut-être?
>> [Réponse de l'élève inaudible] >> Donc, commencer par la gauche et ouvrez la porte, ouvrir une porte, ouvrir une porte.
Et dans le pire des cas, combien de temps cela va nous prendre pour trouver le numéro 7?
Et encore, ils ne sont pas triés, donc ce n'est pas aussi facile que, eh bien, je vais ouvrir la porte 7.
Il pourrait nous prendre, au maximum, 8 étapes.
Dans le pire des cas, 7 est aléatoire à la fin de la ligne de portes,
de sorte que nous pourrions avoir à essayer toutes les portes n.
Encore une fois ici, nous semblons avoir un algorithme linéaire.
En fait, nous avons fait ce juste une couple d'années.
Un de vos prédécesseurs a été contestée avec précision ce
où nous n'avons pas eu une version numérique, nous avons plutôt eu un tableau noir
avec quelques morceaux de papier sur elle.
Et ce que j'ai pensé que je pourrais faire est de prendre un bref retour sur la façon dont cela a duré,
l'une des meilleures opportunités et peut-être les plus difficiles sur scène
Pour une démonstration, ici, sur Sanders.
Nous avions 2 rangées de chiffres.
Nous allons seulement regarder ce qui se passe ici avec Sean pour le très haut de ces lignes.
À moins que ne plus jamais bénévoles CS50,
nous avons eu la bénédiction de Sean garder ce à la caméra,
donc il sait que des centaines de personnes ont suivi ce depuis des années.
Mais Sean a fait un travail incroyable - ou qu'il a fait - au fait de nous trouver un nombre particulier.
>> Donc, nous allons voir comment il a résolu cet algorithme afin que nous reprendrons cette conversation avant longtemps
de la façon dont nous voyons les choses de manière efficace.
[Malan sur la vidéo] J'ai caché derrière ces portes, au nombre 7,
mais niché dans certaines de ces portes et d'autres nombres non négatifs,
et votre but est de penser à cette rangée supérieure de chiffres que juste un tableau
ou tout simplement une suite de feuilles de papier avec des chiffres derrière eux,
et votre but est, en utilisant uniquement la baie supérieure ici, trouvez-moi le numéro 7.
Et nous allons donc critique comment vous allez le faire. Tous droits >>.
[Malan] Trouvez-nous au nombre 7, s'il vous plaît.
[Rires]
[Malan] Non [rires]
5, 19, 13, [rires]. Ce n'est pas une question piège.
1.
[Rires]
A ce stade, votre score n'est pas très bon, alors vous pourriez aussi bien continuer. [Rires]
3.
Allez-y. Franchement, je ne peux pas m'empêcher de me demander ce que vous même y penser. [Rires]
Seule la rangée du haut, de sorte que vous avez à gauche 3. Donc, trouver moi 7.
[Étudiants en murmurant]
[Malan] 17.
[Étudiants en murmurant]
[Malan] 7! [Applaudissements]
>> Donc, le mercredi, nous plonger dans ce et des algorithmes plus sophistiqués pour trouver des choses.
Pour l'instant, nous allons vous laisser avec Sean et vous voyez le mercredi.
[CS50.TV]