>> [Jouer de la musique]
CAMILLE Rekhson: Salut, tout le monde.
Bienvenue sur le quiz CS50 zéro session d'examen.
Je suis Camille.
Et je vais aller sur certains sujets avec vous
les gars aujourd'hui pour vous aider préparer pour le quiz.
Alors, voici notre non exhaustive liste des sujets que vous
devrait être familier avec le quiz.
Ceux-ci ont été prises directement du syllabus.
Je sais que cela semble beaucoup.
Mais croyez-moi, vous avez appris tous ces choses dans les dernières semaines.
>> Donc, nous allons certainement aller sur un grand nombre de ces aujourd'hui.
Mais aussi prendre un certain temps sur votre propre à commenter ces choses.
Et si vous ne connaissiez pas ce que certaines de ces choses sont,
assurez-vous demander de nous.
Aussi, pour le mot officiel sur le quiz, aller à ce lien.
Cela aura toutes les informations avec la chambre que vous devez aller,
diviser par ordre alphabétique, et aussi quelques conseils sur ce matériaux
vous devriez être en train d'étudier, et quelle sorte des questions du quiz vous pouvez vous attendre.
Donc, assurez-vous de vérifier.
>> Aussi, quelques conseils pour quand vous se préparent à l'examen.
Les pratiques de codage sur le papier.
Je sais que vous avez pris l'habitude d'avoir la vérification des IDE pour vos erreurs pour vous,
et it's-- lorsque vous tapez le haut, il est un peu différent que d'avoir
pour écrire les choses.
Donc pratiquer faire quelques codage.
Quelques bonnes fonctions de pratiquer faire sont strlen et atoi,
voir si vous pourriez écrire ceux sur votre propre.
Être familier avec les ensembles de problèmes.
La plupart des années il ya des questions qui concernent
à une partie du matériau de problème posé.
Donc, assurez-vous que vous comprenez comment faire tous les ensembles de problèmes.
>> Essayez de faire quelques-uns des anciens quiz sous la contrainte de temps de 75 minutes.
Un grand nombre des quiz peut être une sorte de longue.
Donc, il est une bonne façon de donner vous un peu de pratique,
et combien de temps il sera vous prendre, et comment vous
devrait diviser votre temps pour vous assurer vous avez terminé tout à la fin.
Et aussi, vous obtenez une seule page, deux feuilles de référence face
que vous pouvez écrire ce que vous veulent à utiliser pendant le quiz.
Ainsi, lorsque vous créez ça, ça aussi
excellente façon d'étudier parce vous examinerez genre de choses
comme vous l'écrivez.
>> Donc, des questions générales concernant le quiz, ou comment il fonctionne?
Oui.
>> AUDIENCE: Will cette liste de sujets que vous venez montré disponible pour nous
en ligne?
>> CAMILLE Rekhson: Cette diapositive entière spectacle sera affiché sur le site Web.
Aussi, la vidéo de l'examen d'aujourd'hui session sera sur le site.
Donc, ne vous inquiétez pas trop à propos les choses par écrit partout.
Il y serons tous.
D'autres questions?
OK, alors nous allons commencer.
>> Donc, une chose de se familiariser avec est les différents types de données et la taille
qu'ils prennent.
Cela peut aussi être une grande chose à écrire sur votre feuille de référence,
juste pour vous assurer que vous se souvenir de tous ceux-ci.
Mais-- afin caractères sont 1 octet.
Ints sont 4 octets.
Un long, long, qui est fondamentalement plus espace pour un nombre entier, est de 8 octets.
Un flotteur est de 4 octets.
Un double, qui vous donne essentiellement plus d'espace pour stocker un flotteur, est de 8 octets.
Et puis un pointeur est également 8 octets.
Des questions sur ces?
>> Donc binaire est un autre sujet que nous avons couvert un peu ce semestre.
Alors, faisons un peu pratiquer avec conversion
entre le binaire et décimal.
Donc, quelqu'un a une idée de ce que que première serait?
N'importe qui?
Ouais, il est 42.
Donc, si vous vous souvenez, chaque des places en binaire
est fondamentalement comme 2 à la puissance de cet endroit.
>> Alors que la première place est 2 à la puissance 0.
Et nous avons 0 là, donc rien.
Le prochain endroit est 2 à la première puissance.
Et nous avons un 1 là, de sorte que est essentiellement un 2.
Le prochain endroit est de 2 à la seconde, ce qui est quatre.
Nous ne disposons pas quelque chose là.
Le prochain endroit est plus de 2 à la troisième, qui serait 8.
Et nous en avons un il.
Et nous continuons.
Ce last-- le plus à Celui de gauche est où nous avons 32.
Et donc, nous avons essentiellement 32 plus 8, plus 2 pour obtenir 42.
Des questions?
>> AUDIENCE: Quel est l'indice pour?
>> CAMILLE Rekhson: L'indice nous dit, fondamentalement, il est binaire.
Donc, il ya un 2 il.
Si il y avait dans la prochaine like-- l'un, ou quand nous sommes conversion décimal
en binaire, il ya un 10 nous montrant que ce nombre est à l'origine en décimal.
>> AUDIENCE: Je vous remercie.
>> CAMILLE Rekhson: Ouais.
D'autres questions sur celui-là?
OK, donc nous allons essayer la prochaine on alors, décimal en binaire.
Donc, en prenant 50 et mettant qu'en binaire.
Comment feriez-vous cela?
Oui.
>> Audience: 110010.
>> CAMILLE Rekhson: Oui.
Donc One-- un moyen facile de penser la conversion de décimal en binaire
est to-- il est souvent utile d'écrire ce que les différentes puissances de 2 sont.
Et puis passer par là, et de voir quel que soit le plus élevé de ceux
est que vous pouvez mettre dans le nombre décimal, sans passer par-dessus.
>> Donc dans ce cas, l'un des les puissances de 2 est de 32.
Donc 32 va dans 50.
Mais la prochaine mise sous tension serait 64, qui, évidemment, ne rentre pas dans 50.
Donc, nous avons le plus élevé est le 32.
Le prochain jusqu'au 16.
Et 32 plus 16 est seulement 48.
Alors que se glisse dans 50.
Alors que nous avons 1 est dans les deux d'entre eux.
Et puis, si nous continuons à descendre, la seule chose que nous devons partis
2 est plus pour obtenir de 48 à 50.
Alors nous avons un 1 dans cette position, et un 0 dans la dernière position.
Parce qu'il n'y a rien dans 2 au 0-ème place.
Questions sur la conversion décimal en binaire?
>> Alors maintenant, nous allons essayer de faire certains addition binaire.
Comment lorsque vous ajoutez les deux en haut?
Oui.
>> Audience: 11100.
>> CAMILLE Rekhson: Oui.
Donc, faire plus en binaire est assez la même que de le faire en décimal.
Sauf si vous avez deux être de 1 additionnés, 1 + 1 est égal à 2,
mais 2 en binaire est 1 0.
Donc, vous devez porter le 1, et de garder pour la porter ces quelques colonnes.
Et à part ça, il suffit d'ajouter normalement.
Vous avez des questions à ce sujet?
Oui.
>> AUDIENCE: Désolé, ce qui est le dernier endroit?
Il ya six numéros.
Donc, la colonne de gauche, quelle valeur est-il?
CAMILLE Rekhson: Sur ce fond un?
Public: Sur celle du haut, pour 50.
CAMILLE Rekhson: Pour 50?
Oh, donc le plus à gauche est 32.
>> AUDIENCE: 32?
>> CAMILLE Rekhson: Ouais, donc il serait être de 32, 16, puis 8, 4, 2, 1 ou 0--.
Eh bien, il est 2 du zéro, qui est de 1.
Oui.
Toutes les autres questions à ce sujet?
OK, donc nous allons faire un peu avec la valeur hexadécimale.
Donc, cela pourrait être un peu moins familier,
parce que je sais que nous avons fait beaucoup plus avec binaire.
Mais une très bonne façon de penser hexadécimale
est de briser un binaire Numéro en 4 morceaux de bits.
Parce que chacun 4 bits d'un nombre binaire est fondamentalement
l'un des nombres hexadécimaux.
>> Donc, si nous avons cette première, Fondamentalement, nous avons huit des 1.
Donc, ceux qui peuvent être divisés up--
>> Audience: 255.
>> CAMILLE Rekhson: le dire.
Audience: 255 en décimal, ou 0xFF en hexadécimal.
CAMILLE Rekhson: Oui, il est.
Donc, si vous divisez que jusqu'à en deux morceaux de 4 bits,
nous avons essentiellement quatre séries de 1.
Quel est le maximum-- fondamentalement un maximum
nous pouvons obtenir avec 4 bits en binaire.
Et le maximum que nous pouvions obtenir pour qui en hexadécimal serait un F.
Donc, nous aurions deux F de.
Vous avez des questions à ce sujet?
Oui?
>> AUDIENCE: Pouvez-vous répéter.
CAMILLE Rekhson: Bien sûr.
Ainsi, chaque, au fond, lieu de hexadécimale est
équivalent à 4-bits d'un binaire.
Donc, la meilleure façon de le faire est de le casser en morceaux de 4 bits.
Donc dans ce cas, nous avons huit des 1.
Donc, si nous nous séparons ceux en deux morceaux de 4 bits,
nous aurions deux séries de quatre des 1.
Et chacun de ceux est équivalent à F.
Si vous pensez que about-- Je sais que nos cerveaux sont
type de câble à penser plus par décimal,
parce que ce que nous sommes habitués.
Donc, d'une manière que vous pourriez penser que ce les quatre des 1 est égal à 15 en décimal.
Et 15 en hexadécimal est F. Voilà une autre façon que vous pouvez penser à travers elle.
Oui.
>> Public: Quelle est la 0x pour?
>> CAMILLE Rekhson: La 0x indique qu'il est hexadécimal.
Nous avons donc juste que préfixer là, normalement.
Autres questions à ce sujet.
OK, nous allons donc essayer d'aller puis dans l'autre sens.
Dans ce cas, nous have-- désolé?
AUDIENCE: [inaudible].
CAMILLE Rekhson: Nous allons binaire.
Donc, dans l'autre sens.
Mais dans ce cas, nous avons 5 et A. Donc, si nous pensons à ce sujet,
si chacun de la those-- 5 et A sont le tant va représenter un morceau de 4 bits,
comment voulez-vous dire 5 en binaire?
>> PUBLIC: 0101.
>> CAMILLE Rekhson: Ouais, de telle sorte que la partie est 0101.
Et puis, comment voulez-vous dire un in--
>> AUDIENCE: 10.
CAMILLE Rekhson: Dites it-- désolé?
AUDIENCE: 10.
CAMILLE Rekhson: Ouais, donc qui est la deuxième partie.
Et puis, si vous mettez les deux ensemble, qui est
comment vous obtenez le plein binaire pour l'hexadécimal.
Oui?
>> Public: Pour savoir que A est 1010, que vous avez à mémoriser?
Ou pouvez-vous like--
>> CAMILLE Rekhson: Donc, si vous-- l'differe-- sorte
quand vous allez à travers binaire, essentiellement binaire
a 0 à 9 et A à F comme ses 16 choses.
Donc, si tout le chemin 0 à 9-- si vous-- 9, puis A, essentiellement
si nous avons converti en décimal, A serait comme 10, B serait comme 11.
Et si vous pensez à la 1010 binaire est 8 et 2,
parce que ceux sont les deux lieux qui ajoutent jusqu'à 10, qui
est exactement ce que A est équivalent à.
Voilà donc une sorte de facile façon de penser à ce sujet.
Autres questions sur hexadécimal.
>> OK, alors maintenant nous allons prendre Un regard sur les opérateurs binaires.
Donc, ce peut certainement monter sur le quiz.
Je sais que nous avons pas travaillé avec eux beaucoup.
Mais nous allons juste faire une petite revue de ces derniers.
Alors espérons qu'ils seront un peu plus familier pour vous.
Ainsi, les six opérateurs de bits que nous avons sont listés ici.
Et ils nous ont laissé manipuler des bits individuels.
Donc, l'opérateur ET est un seul esperluette.
Ne pas confondre cela avec la double esperluette,
qui est le ET logique que nous permet de comparer deux choses.
>> Le single ET est comment nous pouvons manipuler les choses au niveau du bit.
Donc, cela nous donne le résultat de 1 si les deux des arguments que nous comparons
sont les same-- ou sont 1.
Et la barre verticale, OU, donnera nous 1 si au moins l'un d'eux est de 1.
Donc, fondamentalement, exactement ce que les mots signifient.
Et, si les deux bits sont 1, 1 et 1 nous donne 1.
Mais avec l'OU, si elle est 0 ou 1, ou 1 ou 1, dans les deux cas,
nous avons 1 comme étant l'un d'eux.
Alors nous aurions une 1.
AUDIENCE: Qu'entendez-vous qu'il dit lui donne 1?
>> CAMILLE Rekhson: Le résultat. En quelque sorte, comme vous
would-- si vous avez 0 et 1, la résultat de cette serait 1-- ou 0
et 1 des résultats obtenus par ce serait 0, désolé.
Ouais, il a eu la gentillesse de la résultat de l'expression.
Et puis, ce symbole caret est le XOR, ou OU exclusif.
Cela signifie donc que exclusivement une ou exactement l'un des deux arguments est égal à 1.
Et puis ce serait vous donner 1.
>> La petite ligne ondulée est l'opérateur NOT.
Donc, contrairement au reste d'entre eux, qui fonctionnent sur une paire de bits,
l'opérateur ne prend pas seulement un bit, et retournez-le.
Donc, si vous give-- si vous faites PAS 0, cela vous donnerait 1.
Et si vous ne le faites pas 1, cela vous donnerait 0.
Oui?
>> Public: Quelle est la différence entre l'OU avec une ligne
et la ou avec deux?
CAMILLE Rekhson: Donc l'OR avec deux lignes est la logique OU.
Voilà donc pour comparer deux entiers pleins, ou two--
pour voir si les choses sont égales.
Ou comme ce faire est égal à cela, OU il est égal à ce genre de chose.
Alors que la barre unique ou, est de faire les choses au niveau du bit.
Oui.
>> AUDIENCE: Qu'entendez-vous par bit?
>> CAMILLE Rekhson: Donc bit travaille directement avec les bits en binaire.
>> AUDIENCE: Oh, je vois.
>> CAMILLE Rekhson: Ouais, donc travailler avec 0 et de 1.
Nous ferons quelques exemples de ce après, il est juste afin de ne pas trop confus.
Et puis les deux derniers sont le décalage à gauche et le décalage à droite.
Qui sont essentiellement deux de moins que signes ou supérieure à deux signes.
Et ils ont à peu décalés le nombre donné de places
que vous donnez dans la direction.
Donc, il serait soit le déplacer vers la gauche, ou vers la droite.
Oui?
Public: Quelle est la syntaxe d'exécution?
>> CAMILLE Rekhson: Nous allons passer par un exemple dans une seconde.
Donc, je l'espère, cela peut aider.
Vous avez des questions sur tout ce qui est ici, before-- OK.
Donc, en passant par quelques exemples.
Commençons par l'ET chers.
Que ferions-nous obtenir si nous avons fait 0 et 1?
>> AUDIENCE: 0.
CAMILLE Rekhson: OK, et si nous avons fait 1 ET 1?
Public: 1.
CAMILLE Rekhson: Ouais, si nous avons fait 0 ou un?
Public: 1.
CAMILLE Rekhson: Comment environ 1 ou 1?
Public: 1.
CAMILLE Rekhson: OK, comment environ 0 XOR 1?
Public: 1.
CAMILLE Rekhson: Et 1 XOR 1?
AUDIENCE: 0.
CAMILLE Rekhson: Les gars, vous êtes bon.
Que diriez-vous pas 0?
>> Public: 1.
CAMILLE Rekhson: et non 1?
AUDIENCE: 0.
CAMILLE Rekhson: OK, et puis cette dernière l'un est un peu un avec le déplacement.
Donc, si nous initialement fixé x soit 8, et alors y est x décalé vers la gauche 3,
qu'est-ce que nous donner?
>> AUDIENCE: [inaudible].
CAMILLE Rekhson: le dire.
AUDIENCE: [inaudible].
CAMILLE Rekhson: Donc, ce nous donne effectivement 64.
AUDIENCE: [inaudible].
CAMILLE Rekhson: Donc, je suis juste va écrire ce ici,
donc cela fait un peu de sens.
Si nous avons 2 à 0, 2 à la 1, 2 de la 2, 2 à 3 va y avoir huit.
Et si nous voulons le faire passer 3 plus de bits vers la gauche, ce serait de 2 à 4,
2 à 5, et 2 à la 6, et 2 à la 6 est 64.
Est-ce que cela a du sens?
Oui.
>> Public: Est-ce que tous les quarts des 1 et de 0 du nombre binaire à the--
>> CAMILLE Rekhson: Oui.
Et vous ne serez pas avoir à vous soucier de la quiz sur ceux-ci étant négative.
Nous ne ferons pas affaire avec vous changements négatifs en aucune façon.
Toutes les autres questions à ce sujet?
Oui.
>> Audience: Si ça se déplaçant vers la droite, tout ce qui est tout ce qui wasn't--
était pas partie à l'origine de la chose 0?
>> CAMILLE Rekhson: Ouais, vous feriez il suffit d'ajouter des 0 dans l'original.
Oui.
>> Auditoire: Alors, quelle est cette 100 décalée vers la droite trois fois?
CAMILLE Rekhson: 100 décalée vers la droite,
alors ce serait prendre tous les 1 et de 0 et juste de les transférer
vers la droite autant de fois que vous le déplacement vers la droite.
>> AUDIENCE: [inaudible]?
CAMILLE Rekhson: Eh bien, sont 100-- vous parler de 100 en binaire,
ou 100 en décimal?
AUDIENCE: Je suis désolé, 100 en binaire.
>> CAMILLE Rekhson: 100 en binaire, si vous passez à la droite-
si vous passez à la droite une fois, il serait devenu 10.
Si vous passez vers la droite deux fois, il deviendrait 001.
Et puis si vous passez à nouveau, vous sorte de perdre le bit.
Ouais, ça est juste 0.
Toutes les autres questions à ce sujet?
Oui.
>> AUDIENCE: il devient Alors 000.
>> CAMILLE Rekhson: Oui.
OK, donc nous allons passer par un peu de maths ASCII.
Donc, les personnages peuvent essentiellement être traités comme des entiers
sur la base de leurs valeurs ASCII.
Donc, si nous nous sommes assis int A est égal à 65, l'INT B A plus égale 1, int char c est égal à
D moins 1, et de l'omble D est égal à 68, ce qui serait d'imprimer au fond?
>> Donc, nous sommes l'impression these-- bénisse vous-- nous sommes
imprimer ces tout comme Chars pour cent sur la base du C.
Donc, nous sommes essentiellement imprimer la valeur de caractère de toutes les quatre
de ces variables.
Comme un indice, 65 est la valeur ASCII du capital A. Peut-être que cela a aidé.
Quoi?
>> AUDIENCE: ABCD.
>> CAMILLE Rekhson: Ouais, donc cela imprimer exactement
ABCD parce que nous fixons int Une égale à la valeur ASCII du A.
Donc, si nous imprimons ce que comme un caractère, nous obtenons seulement des capitaux A,
A plus 1 serait un B majuscule en ASCII.
D moins 1 serait un C majuscule en ASCII.
Et 68 est la valeur ASCII de D. Questions sur ASCII?
Oui.
>> Auditoire: Alors, l'guillemets autour A, est-ce que le changement A à l'ASCII?
>> CAMILLE Rekhson: Il uses-- il apostrophes count-- autour de la Une
en fait un caractère.
Et si vous faites affaire avec dans le nombre form--
Ainsi, lorsque, comme dans ce cas, il est étant traitée comme un int--
alors il serait traiter avec sa valeur ASCII.
Oui.
>> AUDIENCE: recommandez-vous nous avons une table de référence ASCII?
>> CAMILLE Rekhson: Je ne think-- pas
>> AUDIENCE: Ou serait-il seulement être traiter avec ceux-ci?
>> CAMILLE Rekhson: Je pense que nous le ferait avec des choses faciles.
Je ne pense pas que ce serait mal d'écrire peut-être
ce que le capital A et A sont minuscules, simplement ce que ces gammes commencent avec.
Mais je ne pense pas que vous devez prendre toutes les l'espace pour mettre toute une table ASCII.
Oui.
>> Public: Quelle est la différence entre dire int A et C omble,
comme vous le faites au sommet?
>> CAMILLE Rekhson: Donc, il est juste comment qui est stocké dans la mémoire.
Mais vous pouvez le traiter de toute façon.
Comme nous le voyons ici, nous faisons imprimer le A en tant que caractère.
AUDIENCE: Voilà donc le même que A?
CAMILLE Rekhson: Ouais.
D'autres questions?
>> Auditoire: Alors, pour cent C soit disant imprimer un caractère?
>> CAMILLE Rekhson: Oui.
>> Auditoire: Alors, même si A a seulement été défini comme un nombre entier,
si nous essayons d'imprimer une char comme un 65, il would--
CAMILLE Rekhson: Ce serait aller à va essentiellement à table ASCII
et obtient quelles que soient les caractères dans le tableau ASCII pour que 65.
>> AUDIENCE: Je vous remercie.
>> CAMILLE Rekhson: Ouais.
Oui?
>> AUDIENCE: Donc, si vous avez% I,% I, % I,% I, serait-il juste print--
CAMILLE Rekhson: Ouais, si vous avez fait tout ce que je 4%, il
serait imprimer le ASCII valeurs de chacun de ces quatre.
D'autres questions?
OK, donc la portée, essentiellement présent nous aide à déterminer où
une variable existe dans votre programme.
Donc, nous avons parlé de deux différents types de champ, globales et locales.
>> Si une variable est scope globalement, cela signifie que le programme entier
a accès à cette variable.
Et si vous l'échelle mondiale la portée d'une variable, vous
déclarer avant votre fonction principale.
Donc, il est fait dès le départ.
Et puis tout votre programme peut accéder.
>> Si elle est scope seulement localement, que variables confinée à une région spécifique.
Donc, si vous déclarez dans une boucle, seulement que pour la boucle peut y accéder.
Ou si vous déclarez l'intérieur une fonction spécifique,
que cette fonction puisse y accéder.
Questions sur la portée.
>> OK, donc le prototypage de fonctions.
Fondamentalement parce que C, lorsque il compile, lit de haut en bas.
Si vous déclarez une fonction à la fin de votre code,
le compilateur ne sait pas que cette fonction existe.
Donc, ce que nous utilisons sont des prototypes, qui racontent essentiellement le compilateur,
Cette fonction existe, aller chercher pour elle plus tard dans le code.
Ainsi, la manière que vous faites un prototype de fonction
est exactement comment vous commencez hors d'écrire une fonction.
Vous donnez le type de retour, le nom de la fonction,
et puis tous les arguments que cette fonction prend.
>> Donc, à regarder un exemple rapide, dans ce Notre cas de la fonction que nous utilisons ici
est essentiellement une fonction de cube.
Donc, en prenant dans un entier et retourner le cube entier de ce.
Donc, parce que nous avons écrit que fonction ci-dessous la fonction principale,
et nous voulons utiliser la sortie de that-- ou nous
vouloir que la fonction dans notre fonction principale,
nous mettons son chemin prototype au sommet de notre programme.
Et puis, quand nous appelons dans notre fonction principale,
le compilateur sait que cette fonction est écrit plus tard, et ira le chercher,
et va l'utiliser correctement.
Questions sur le prototypage?
Oui.
>> Auditoire: Alors, quel est le point?
Je ne comprends pas le point de prototypage.
Pourquoi ne pas simplement avoir là-bas?
>> CAMILLE Rekhson: Eh bien, si il est ici, alors quand
vous obtenez à la ligne cube de x dans votre fonction principale,
le compilateur aura aucune idée que la fonction de cube existe réellement.
>> AUDIENCE: ne pourriez-vous il suffit de mettre en face?
>> CAMILLE Rekhson: Il est de meilleures pratiques de codage
pour la mettre sous votre fonction principale.
Voilà pourquoi nous le ferions faire du prototypage.
Tout simplement parce que, si vous a eu beaucoup de fonctions,
ce serait vraiment salissant lire toutes ces fonctions
avant de vous rendre à la viande de votre programme.
Ouais, et vous aviez un q--
>> Auditoire: Alors, est de déclarer votre variable au sommet
de sorte que vous pouvez y accéder, en faire une variable globale?
Est-ce semblable à ce où il est le déclarant
là-haut, de sorte qu'il sait que il va y accéder plus tard
et vous pouvez l'utiliser?
>> CAMILLE Rekhson: Ouais.
Oui.
>> Audience: Si the-- toute supplémentaire fonctions que vous créez clé de l'extérieur
de cette chose, ou--
>> CAMILLE Rekhson: Ouais, si vous êtes la création d'un autre principale functions--
lui-même est l'function-- si vous créez d'autres fonctions,
ils devraient être à l'extérieur.
Oui?
>> AUDIENCE: Quel est pour cent D?
CAMILLE Rekhson: Pourcentage D est la même chose que pour cent I.
Elle se réfère à un nombre entier.
Oui.
>> Auditoire: Alors, ce que fait principal int?
Quel était ce vide?
CAMILLE Rekhson: Void dit il faut en aucun argument.
AUDIENCE: [inaudible].
CAMILLE Rekhson: Pouvez-vous parler un peu plus fort, désolé?
AUDIENCE: Ouais, désolé, pourquoi vous mettez nulle pour le premier,
puis int entrée pour le second?
CAMILLE Rekhson: Oh, pour les deux different-- pour la fonction principale
par rapport à la fonction de cube?
Donc, dans la fonction principale, nous utilisons vide, car il
n'y a pas de paramètres étant prises en.
Alors que dans le cube fonction, nous avons une entrée.
Voilà pourquoi il dit int, entrée, parce qu'il ya des arguments que nous sommes
en prenant en exécuter notre fonction.
Oui.
Y at-il des questions?
>> OK, puis rapidement virgule flottante imprécision.
Donc, nous avons une infinité de nombres réels.
Mais il ya seulement une nombre fini de bits
que nous pouvons utiliser pour afficher les numéros, et les représenter.
Alors nous nous retrouvons avec une certaine imprécision.
Et vos chiffres ne seront pas toujours être très exactement ce que
vous pensez qu'ils sont quand vous êtes face à virgule flottante.
Ceci est juste quelque chose de bon à savoir.
Questions sur ce sujet?
Oui.
>> Public: Est-ce référant à l'idée de dépassement de bits
ce qui était dans la conférence?
Était-ce quelque chose de séparé?
>> CAMILLE Rekhson: Ils sont complètement séparé, ouais.
D'accord, super.
Pulak GOYAL: Salut, tout le monde.
Mon nom est Pulak, et je vais être aller plus pointeurs.
Premier think OK, alors laissez- sur ce qui ressemble à la mémoire.
Donc, comme vous pouvez le voir ici, nous prendre mémoire et nous divisons le haut
dans un tas de blocs.
Et nous référencer chaque bloquer par une adresse, non?
Et ne Quelqu'un se souvient ce type de la notation que nous utilisons pour désigner une adresse?
>> AUDIENCE: hexadécimal, 0X.
>> Pulak GOYAL: hexadécimal, non?
Ainsi, le 0X signifie que nous sommes parler hexadécimal.
OK, alors comment pouvons-nous créer des pointeurs?
Donc, nous prenons le type, nous mis it-- ajouter une étoile à elle,
puis on ajoute le nom de la variable.
Ainsi, les exemples que nous avons vus sont int star du x, char étoiles y et z flotter commencent.
Donc, quand je dis int étoiles x, quelqu'un peut me dire
ce que je suis une sorte de parler de là-bas?
>> PUBLIC: L'emplacement du disque.
>> Pulak GOYAL: Désolé, quoi?
Peux-tu répéter cela?
PUBLIC: L'emplacement de disque.
>> Pulak GOYAL: Donc, si ce actually-- Je voulais dire, est quand nous avons int star du x,
nous disons est la création un pointeur, et
peut stocker l'adresse d'un variable qui est un int, non?
Donc, avec l'omble étoiles y, nous créons un pointeur
qui peut stocker l'adresse d'une variable qui est un produit de carbonisation.
Alors que de sens pour tout le monde?
OK cool
>> OK, donc avec des pointeurs, il ya deux opérations importantes que nous pouvons faire.
Il ya référencement, et il ya déréférencement.
Oui?
>> Public: Pourriez-vous un peu plus lent?
>> Pulak GOYAL: Bien sûr.
Ouais, Ouais so--, poser des questions que je vais si long vous-- si quelque chose est claire.
Donc, nous avons référencement et le déréférencement.
Alors, quand vous voulez pour obtenir l'adresse d'une variable, puis utilisez l'esperluette.
Alors disons que je déclarai int x quelque part.
Et je veux obtenir l'adresse de ce et de le transmettre dans, je ferais esperluette x.
Et lorsque vous voulez obtenir le valeur associée à un pointeur,
vous utilisez le déréférencement opérateur, ce qui est une étoile.
>> Disons donc que je devais int star du x, et Je l'ai eu en montrant quelque chose.
Si je veux obtenir la valeur de ce qu'il est montrant, je voudrais juste faire star du x.
Est-ce clair?
Vous avez des questions à ce sujet?
Oui.
>> Auditoire: Alors, en général, vous ne sera pas capable de faire à x et étoiles
x x avec la même.
Est-ce correct?
En effet, si x est un variable, alors vous avez
à faire à x pour obtenir qu'il est un pointeur.
Mais si x est un pointeur, alors vous avez besoin faire star du x pour obtenir la variable.
>> Pulak GOYAL: Oui, de sorte que le question était de savoir quand
utilisons-nous un moment star-- voulez-vous utiliser l'étoile,
et lorsque nous utilisons le esperluette, et pouvons-nous
utiliser avec le même type de variable?
Donc, en général si vous avez, par exemple, un int x,
vous serait surtout utilisez le esperluette pour obtenir l'adresse de ce.
Parce qu'il ne fait pas logique de déférence dans x.
Considérant que, si nous avions int star du x, vous seriez utilisez opération de déréférencement
car il n'y aurait aucun sens à utiliser à x dans ce cas.
Est-ce que cela a du sens?
>> Auditoire: Alors, vous ne pouvez pas et puis un pointeur?
Pulak GOYAL: Donc vous techniquement, fait
peut faire l'esperluette d'un pointeur.
Mais ce qui sort de la champ d'application de cette classe.
Pour la purpose-- pour vos gars » fins, lorsque vous avez des pointeurs,
vous voulez utiliser l'opérateur de déréférencement pour obtenir la valeur associée à ce.
Et quand vous avez régulière les variables, comme un int x,
vous voulez utiliser l'esperluette opérateur pour obtenir l'adresse de ce.
D'accord?
>> OK, donc regardons pointeurs et ce qui se passe sous le capot.
Donc la première chose que je faisais ici l'int x déclarée est égale à cinq.
L'adresse de cette variable est 0x04, et la valeur est 5.
Voyons donc ce qui se passe avec la ligne suivante.
Alors maintenant, nous déclarons un pointeur.
Son adresse est 0x08, et son valeur est l'adresse de x.
Cela fait-il sens pour tout le monde?
Vous avez des questions à ce sujet?
>> OK, et maintenant nous allons voir ce que qui se passe avec la ligne suivante.
Donc, avec cette ligne suivante, nous avons l'adresse de copie étant 0x10,
et sa valeur est 5.
Donc, la raison pour laquelle nous avons obtenu cinq est que nous avons dit, nous déréférencer
pointeur, ce qui nous avons déclaré un int étoiles.
Et il went-- quand nous déréférencer, il dit, OK, ce qui est dans le 0x04 de fente.
Et il est allé à cela.
Et ce que x est un x0-- 0x04, et la valeur est 5.
Cela a-t-il du sens?
Oui?
>> Public: Pourquoi est l'adresse de la copie seulement 4 octets au-dessus du pointeur x?
>> Pulak GOYAL: Oui, cela est une erreur on--
>> CAMILLE Rekhson: Donc, oui, souvenez- cela est écrit en hexadécimal.
Pulak GOYAL: Oh, oui.
CAMILLE Rekhson: Donc, ce est en fait 8 puis 16
parce que nous avons dit que, le pointeur, rappelez-vous,
dans notre IDE va ​​être long de 8 octets.
Pulak GOYAL: Ouais.
Donc, juste pour être clair, pointeurs sont 8 octets de long.
Un int est de 4 octets.
Donc la raison pour laquelle ce sauté de 0x04 à 0x08
est parce que nous devions faire un saut de 8 octets.
Et puis depuis pour-- copie est juste un int,
il est 4 octets, ce qui est la moitié de 8 octets.
Nous avons donc simplement sauter à 0x10, qui est deux loin de 0x08.
D'autres questions?
OK, let's-- ouais?
>> Public: Pourquoi pas la valeur du int copie
juste the-- pourquoi est-ce 5 au lieu de 0x04?
>> Pulak GOYAL: OK, pourquoi est-ce 5?
OK, donc quand the-- sorte de laissez-première réfléchir en termes de types.
Donc, je dis int copie est égal à pointeur étoiles.
Alors, quel est le type de pointeur?
Il est un int étoiles.
Et quand je déréférence cela, le type devient un int.
Donc, ce que nous attendons pour stocker ici est en fait un int.
Cela a-t-il du sens?
AUDIENCE: Bien sûr, peu.
Pulak GOYAL: Donc, généralement lorsque vous pensez en termes de types,
Il vous aide à comprendre quelle est la type de la valeur qui devrait y aller.
Ainsi, vous pouvez généralement exclure beaucoup de ces erreurs courantes
en pensant en termes de types.
Permettez-moi de passer par un peu plus de diapositives.
Et nous pouvons obtenir des questions à la fin de la section de pointeur.
OK, donc nous avons un programme de poussette ici.
Et donc ne anyone-- quelqu'un peut dire moi ce qui ne va pas avec ce programme?
Bon, alors ce que nous sommes attendant à faire ici
est-- ce que nous voulons faire est de prendre la variable int x
et tournez it-- rendre égal 5 au lieu de 3, puis imprimer cela.
Mais cela ne se passe.
Quelqu'un peut me dire pourquoi?
Oui?
>> AUDIENCE: Lorsque la fonction to_five prend x car il est l'argument,
elle ne prend pas x elle-même, mais la place crée une copie, un, de celui-ci.
Et il forme des opérations sur ce point.
Mais à cause de cela, vous ne faites pas changer la valeur réelle de x.
Puisque vous êtes [inaudible].
>> Pulak GOYAL: Droit, droite, donc quand nous appelons
to_five la fonction, ce qui nous faisons est de penser,
me donner une copie de la de la valeur à cette fonction.
Cette fonction, alors, va et de faire quelques manipulations.
Mais une fois qu'il revient, il est maintenant hors du champ d'application de la fonction principale ici.
Et si x est toujours, en fait, égal à 3, et nous imprimons 3.
OK, donc nous allons voir comment cela se passe.
>> OK, donc il n'y a rien déclaré.
Ensuite, ici, x est égal à 3.
Et maintenant, il est-- à la position deux, un est toujours pas dans la portée.
Et maintenant, nous allons à positionner trois, où un assume maintenant la valeur de 3.
A quatre, nous changeons maintenant à 5.
Mais maintenant, quand nous revenir au cinq, ce qui est la déclaration d'impression,
un est maintenant hors de portée.
Et X est toujours égal à 3.
Cela fait-il sens pour tout le monde?
OK, nous allons donc maintenant nous allons parler de la façon dont nous pouvons utiliser des pointeurs pour résoudre ce problème.
Est-ce que quelqu'un a des idées comment nous pourrait résoudre ce problème en utilisant des pointeurs?
>> AUDIENCE: Vous prenez en un int étoiles à la place d'un int pour to_five.
>> Pulak GOYAL: Désolé, pourriez-vous parler?
>> AUDIENCE: Vous prenez en un int étoiles à la place d'un int pour to_five.
Pulak GOYAL: OK, oui.
Donc, nous allons pass-- au lieu de passer tout simplement la valeur, Passons par référence.
Cette nouvelle fonction, non?
Et en passant l'adresse, nous avons peut faire des manipulations sur l'adresse.
Et si nous sommes réellement, en fait, changer x.
Donc, nous allons voir comment ça fonctionne.
>> OK, donc dans cet exemple nous l'avons fixé.
Nous avons changé notre signature de to_five à prendre dans un int
étoile au lieu de simplement un int ici.
Ensuite, nous déréférencer ce et attribuer un 5 à elle.
Et maintenant, cette volonté, en fait, imprimer 5.
Donc, nous allons voir comment les étapes travaillent ici.
>> Donc, avec la première étape, il n'y a rien encore déclaré.
Donc, ici, à la deuxième étape, nous l'avons dit x est égal à 3,
mais est encore hors de portée.
Maintenant, par la troisième ligne, nous avons x est toujours égal à trois.
Et maintenant, nous avons passé in-- ce qui est stockée dans un est maintenant l'adresse de x.
Cela fait-il sens pour tout le monde, comment nous sommes arrivés là?
Droite, nous avons le amper-- voilà comment nous avons passé une esperluette x à la fonction
to_five.
Ensuite, à la ligne suivante, ce qui nous faisons, est que nous déréférencer un.
>> Et par un déréférencement, nous sommes en mesure pour modifier la valeur de x à partir de 3 à 5.
Parce x vit à cette adresse 0x12.
Et puis, enfin, quand nous retournons au principal,
Bien que cette une est maintenant hors de champ d'application, nous avons, en fait, changé x.
Et il est 5.
Vous avez des questions à ce sujet?
Oui?
>> AUDIENCE: Pouvez-vous me dire ce que l'esperluette x était?
Je pensais esperluette était comme ET.
>> Pulak GOYAL: Oui, si nous utilisons les mêmes symbole pour beaucoup de choses différentes.
Donc, ici, quand vous en have-- ce cas, lorsque vous avez,
Je guess-- dans ce cas, lorsque vous avez affaire à des pointeurs,
quand vous mettez l'esperluette devant d'un int, une variable int, ou d'un char,
ou un flux, ce que vous dites est, donnez-moi l'adresse de cette.
Mais ce que vous pensiez, quand le monde vous devez utiliser esperluette est, disons,
dans une instruction if.
Vous avez un vrai, et certaines variables qui évaluent à quelque booléenne,
et quelques autres variables que valider certaines booléenne
et vous voulez obtenir le et de cela.
Ensuite, vous pouvez utiliser l'esperluette.
ENCEINTE 1: Ouais, donc seulement aujourd'hui, nous avons parlé de trois utilisations différentes
de esperluette.
Nous avons deux esperluette, qui est ce Pulak vient de décrire.
Nous avons une esperluette, qui ce qui est décrit Camille
plus tôt, qui est l'une esperluette.
Et voilà pour bit à bit.
Et remarquez que les deux et-- conditionnelle ou, désolé,
ET logique bit à bit et ET, ceux-ci ont deux nombres, non?
Il a été quelque chose de esperluette quelque chose esperluette,
quelque chose de quelque chose esperluette.
Ici, quand nous avons juste esperluette quelque chose, que ça déréférencement.
>> Pulak GOYAL: Ouais, bonne question.
Oui.
>> Public: Pourquoi en ligne 5a et étoile à devenir N / A?
Pourquoi ont-ils juste genre de conservent pas le mêmes valeurs de la ligne précédente?
>> Pulak GOYAL: Parce que nous avons liquidé la fonction.
Et qu'est-ce happens-- afin what-- maintenant nous sommes
hors de portée de cette fonction, ce qui se passe réellement
est retiré de ceux-ci sont mémoire.
Oui.
>> AUDIENCE: Entre 3 ou 4 étoiles A est égal à 5.
Pulak GOYAL: Oui.
Public: Qu'est-ce que représentent exactement?
Pulak GOYAL: Qu'est-ce que cela signifie?
AUDIENCE: Ouais.
Pulak GOYAL: Donc, le question était, ce qui est
that-- que faites-vous en ligne quand nous disons, étoile est égal à 5?
Alors rappelez-vous la star de la opérateur de déréférencement.
Alors, quand un, dans ce cas, est un pointeur.
Il est un int étoiles.
Alors, quand nous déréférencer un par en utilisant l'étoile, ce que nous disons
est, aller à tout ce qui est stocké à la adresse, stockée dans a-- afin take-- donc un,
en ce moment, a une certaine Adresse stockées.
Allez là où ce que les points d'adresse à, et Aujourd'hui, le changement quel qu'il soit à cinq.
Oui.
>> AUDIENCE: Pouvez-vous dire en termes plus simples?
Changer l'adresse d'un à 5.
>> Pulak GOYAL: Nous ne sommes pas modification de l'adresse d'un à cinq.
A a une certaine adresse en elle, qui est la adresse de la variable d'intérêt.
Et ce que nous disons quand nous déréférencement est,
maintenant nous voulons change-- nous sommes maintenant référencement
l'intérêt directement de la variable.
Est-ce que cela a du sens?
>> ENCEINTE 1: Une autre façon de penser de celui-ci est donc un go-- est une adresse.
La star dit aller à ce aborder et examiner sa valeur.
Et maintenant définir sa valeur à 5.
Donc, il est dit, aller à la adresse de x, qui
va être ce qui est stocké dans un, et de les modifier à 5.
Pulak GOYAL: Ouais?
Auditoire: Alors, où est la position le pointeur va, l'adresse.
Mais la valeur est affectée d'un valeur sur la base de l'adresse.
Pulak GOYAL: Ouais.
Toutes les autres questions à ce sujet?
AUDIENCE: Je ai une question.
Pulak GOYAL: Ouais, désolé.
Auditoire: Alors, quand vous store-- sorte si vous dites [inaudible] a.
Pulak GOYAL: Oui.
Public: Avez-vous de stocker le x par une esperluette?
Pourquoi ne pas simplement dire x avant votre int [inaudible]?
Pulak GOYAL: So--
AUDIENCE: [inaudible].
Pulak GOYAL: est donc votre question-- oh.
Donc, votre question est, pourquoi ne peut pas nous-- à la fonction to_five, pourquoi pas nous
il suffit de passer un x, non?
>> AUDIENCE: Droit.
>> Pulak GOYAL: OK, ouais, donc ce nouveau remonte à notre discussion sur les types.
Donc la fonction est maintenant to_five attend un type de int étoiles.
Alors, quel est le type de x?
X est juste un int.
Mais ce que cette fonction attend est un int étoiles.
Donc, il attend une variable a une adresse mémorisée en elle.
Voilà donc comment mettre le vous-- esperluette, et ainsi qui est
comment nous passons dans le adresse, qui est maintenant--
et qui interprète que comme un int étoiles, ouais.
Grande question.
Toutes les autres questions à ce sujet?
OK cool.
>> OK, nous allons donc maintenant nous allons parler à propos de l'arithmétique de pointeur.
Donc, ici, additionner et soustraire i ajuste le pointeur
par i fois la taille de le type d'octets de pointeur.
Alors regardons comment ça ressemble.
Donc, ici, nous avons déclaré x est égal à un entier 5.
Et maintenant, nous allons déclarer un pointeur y et passez dans l'adresse de x-bas.
Alors que nous avons.
Donc x est stocké à 0x04.
Maintenant, y est égal à cela.
Et quelqu'un peut me dire ce qu'ils en pensent qui va se passer quand nous le faisons, plus y est égal à 1?
Oui?
>> AUDIENCE: cela va changer à 0 fois 0 8?
>> Pulak GOYAL: Taille et bien--
>> AUDIENCE: vous vous déplacez l'adresse.
Pulak GOYAL: Ouais il était-- oui.
So-- droit.
Il va donc changer de 0x08.
Et because-- donc vous devriez utiliser cette formule, 1 fois la taille du pointeur
et les pointeurs sont de size--
>> [ÉTUDIANTS MURMUR]
>> Pulak GOYAL: Droit.
>> [ÉTUDIANTS MURMUR]
>> ENCEINTE 1: Alors que le type le pointeur to--
>> Pulak GOYAL: Est, ouais, ouais, ça fait 4 octets.
>> ENCEINTE 1: Alors ints sont 4 octets.
>> Pulak Goyal: Donc, si nous avions a-- Disons disons que nous avons déclaré, je suppose, un caractère.
Qu'est-ce qui that-- alors disons nous avoir x carbonisé à une ou quelque chose.
Et nous avons eu l'adresse de ce à 0x04, ce serait y est égal à 1, plus faire maintenant?
Pardon quoi?
>> AUDIENCE: 0x05.
Pulak GOYAL: 0x05, à droite.
Est-ce que tout le monde voit ça?
OK, et maintenant, disons qu'il est un flotteur.
Ce qui se passerait?
N'importe qui?
Donc flotteurs sont combien d'octets?
>> Public: 4 octets.
>> Pulak GOYAL: Droit.
Donc, ce serait la même chose que cela.
Bien.
OK, et maintenant nous allons parler à propos de pointeurs et les tableaux.
Donc, vous avez vu ce sur la deux ensembles précédents p,
où nous pouvons treat-- tableaux et donc pointeurs ne sont pas la même chose.
Mais nous pouvons traiter les tableaux comme des pointeurs.
Donc, ici, nous avons ce tableau ici, qui dispose de trois emplacements.
Dans la première, nous slot-- avoir une, deux et trois.
>> Donc, si nous-- afin que nous puissions attribuer en disant, nous avons tableau,
déréférence cela.
Et puis quand nous déréférencer que, ce que nous faisons réellement
se réfère à la même fente.
Donc tableau étoiles est égal à 1.
Nous could- comment pourrait- nous écrivons that-- ce qui est
une autre façon nous pourrions écrire cela?
>> AUDIENCE: Array 0 égal à 1.
>> Pulak GOYAL: Exactement, tout le monde ne voit que?
Donc même chose ici.
Alors, quand nous avons tableau plus 1, nous do-- afin even--
rappeler avec l'arithmétique que nous venons de parler, quand nous faisons plus 1
ou le déplacer sur de 4 octets, à droite.
Est-ce que tout le monde voit ça?
Et de ce côté, quand nous déréférencer que nous pouvons mettre cela à 2.
Et voilà comment nous fixons le prochain bloc à deux.
Et donc une autre façon d'écrire ce serait aussi le support de tableau
0 support est égal à 1.
>> Public: Avez-vous besoin des parenthèses?
>> Pulak GOYAL: Oui, parce que vous êtes déréférencement la quantité totale
tableau plus 1.
OK, et même chose pour un tableau plus 2.
Vous avez des questions à ce sujet?
Oui.
Auditoire: Alors tableau est automatiquement fixé à 0?
>> Pulak GOYAL: Array est-- désolé, quoi?
>> AUDIENCE: Array est 0.
L'adresse de la gamme est juste 0.
>> Pulak GOYAL: Donc la question était, est l'adresse du tableau juste 0?
Donc, non, tableau a une certaine adresse.
Alors, quand nous déréférencer, that's-- de sorte que vous pouvez penser about--
littéralement comme un pointeur pointant au début d'un tableau.
Alors qui a une certaine adresse.
Nous ne savons pas ce qu'il est.
Mais quand nous déréférencer, nous savons qui est le début de la matrice.
Et quand nous nous déplaçons par 1, nous ne faisons que déplacer
par rapport à l'endroit où était cette adresse.
D'autres questions?
Oui?
>> AUDIENCE: Donc, si vous faites support de tableau, plus 1--
Pulak GOYAL: Désolé, I-- pourrait vous parler?
AUDIENCE: Ouais, si vous faites support de tableau [inaudible].
Alors si vous mettez le pointer--
Pulak GOYAL: Désolé, je ne peux pas vous entendre.
Pouvez-vous dire une fois de plus?
>> Public: Vous êtes OK.
>> Pulak GOYAL: OK, désolé.
OK cool.
Any-- ouais.
Donc, quand vous allez dans le support de tableau 3--
>> Pulak GOYAL: Ouais.
>> AUDIENCE: --isn't there-- ne serait pas il soit quatre taches comme 0, 1, 2, 3 et?
Pourquoi est-il pas int tableau 2?
>> Pulak GOYAL: Non, si juste la convention C est-- quand nous déclarons le tableau,
nous-- le nombre que nous y mettons est le nombre d'emplacements que nous voulons.
Mais les indices du tableau sont effectivement tableau 0, tableau 1 et tableau 2.
Donc, il est tout simplement la convention sur la façon dont nous avons la déclaration de tableaux.
Ouais, d'autres questions?
Oui.
Auditoire: Alors, nous sommes toujours parler de pointeurs, non?
Pulak GOYAL: Ouais.
Public: Pourriez-vous faire encore STAR pour tableau 0 est égal à 1?
Pulak GOYAL: Non, non, so-- OK, donc la question était pouvait
vous venez de faire étoiles support de tableau zéro, puis disent que égaux à 1.
Donc, non, ce que nous disons voici ce que nous pouvons think--
nous pouvons traiter les tableaux comme des pointeurs.
Donc, nous sommes ce que nous have-- dicton est que nous avons deux façons
maintenant faire référence à un même bloc.
Donc, si vous avez doing-- gamme zéro, le type de qui est maintenant un int.
Et si vous prenez l'étoile qui, vous obtenez une chose valide.
Donc, ce que nous disons ici, est il existe deux autres façons
pour désigner le même bloc.
Vous pouvez soit le faire ensemble 0 support est égal à 1.
Ou vous pouvez faire déréférencer tableau, et avoir cette égale à 0.
Il suffit donc deux façons de faire la même chose.
Oui.
>> Public: Pourquoi est-il pas taille de int 1 pour ajouter to--
>> Pulak GOYAL: Taille du 1 int.
>> AUDIENCE: Parce que ce déplacement d'un arrêt.
>> Pulak GOYAL: Parce que ce juste la façon dont C fonctionne.
Il est juste la façon pointeur arithmétique est défini.
Il va prendre le pointeur.
Et puis tout ce que vous ajoutez à elle, il va multiplier ce
par la taille de tout la boutique de pointeur est, ouais.
Oui.
>> Auditoire: Alors, vous dites que nous pouvons traiter pointeurs et les tableaux les mêmes,
mais qu'ils sont différents.
Donc, ce qui les rend différents?
Que pouvons-nous pas faire avec l'un mais pas l'autre?
>> Pulak GOYAL: Aux fins de la présente classe, je pense que ce que it's-- faire vous--
>> ENCEINTE 1: Donc, nous-- OK, donc, pour par exemple, si vous allouez de la mémoire
et vous avez un pointeur vers un nombre entier, par exemple.
Si vous avez essayé de démarrer faire l'arithmétique des pointeurs
et aller au-delà de la quantité de mémoire vous avez alloué, vous souhaitez rencontrez des erreurs.
Nous savons avec des tableaux, nous dis d'avance, OK, je
vouloir allocate-- ce essentiellement dit, je tiens à allouer
assez de place pour trois entiers.
Et maintenant nous pouvons traiter la mémoire comme si nous avons tous les trois de ces entiers.
Est-ce que ce genre de sens?
>> Pulak GOYAL: Ouais.
Oui.
>> Auditoire: Alors, une étoile tableau, est que l'attribution 1
à l'index 0 du tableau?
Pulak GOYAL: Oui.
>> Auditoire: Alors, ce qui est après la deux lignes suivantes en termes de the-- I
comprenez que vous essayez utiliser un pointeur arithmétique ici,
mais encore une fois, je ne comprends pas ce pointeur arithmétique est.
Donc, le tableau plus 1, vous êtes dire que vous êtes maintenant
allez vouloir parler le premier index dans le tableau.
>> Pulak GOYAL: Droit, et donc la raison qui fonctionne est un tableau,
ici, nous pouvons penser comme un int étoiles.
Et donc quand nous ne l'arithmétique des pointeurs sur elle, rappelez-vous la formule où
nous prenons the-- Je suppose que tout ce qui l'adresse actuelle est,
et puis quand nous ajoutons 1 à elle, nous avons effectivement
multiplier une de la taille de la chose nous manipuler.
Donc dans ce cas, la taille d'un int.
Et puis nous déplaçons transmettre par beaucoup.
>> ENCEINTE 1: Alors semblant vous avez b tableau étoiles.
Pulak GOYAL: OK, ouais.
ENCEINTE 1: Avec votre main.
Va ici.
Pulak GOYAL: Ou je peux just-- ouais.
OK Donc ici--, donc à la gamme en commençant, est juste ici.
Alors, quand nous déréférencer tableau, nous étions juste se référant au premier bloc ici.
Mais maintenant, quand je fais tableau plus 1, que est-- cette flèche est maintenant ici.
Est-ce que cela a du sens?
Droit, parce que ce bloc est int taille, qui est de 4 octets.
Et donc, ce que nous faisons est que nous sommes déplacer ce pointeur de 4 octets plus.
Chaque fois que nous faisons l'arithmétique sur lui, il sera toujours
déplacer par incréments de 4 octets.
Parce que cela est comme un int étoiles.
Cela a-t-il du sens?
D'ACCORD.
>> Auditoire: Alors les choses dans le tableau étaient 5 octets, nous passerions qu'il 5 bytes--
>> Pulak GOYAL: Bon, alors si nous avions un étoiles char, nous passerions par 1 octet seulement.
Ainsi, dans le cas des étoiles de type char, il serait juste déplacer plus de 1.
Public: Pour obtenir le côté vous avez besoin d'une étoile.
Pulak GOYAL: Ouais, ouais, fait cela fait sens?
ENCEINTE 1: Nous pouvons discuter à ce sujet plus tard.
Pulak GOYAL: Ouais, ouais, bien sûr.
OK cool.
Passons à la section suivante.
ENCEINTE 1: Oh, OK cool.
Ouais c'est moi.
Tout droit, impressionnant.
OK, cool, alors maintenant nous sommes sur un peu plus d'informations générales sur la mémoire.
Aussi, je comprends le fait que ils allaient assez rapidement.
Il ya beaucoup de matière à obtenir en une heure et demie.
Mais si il ya des sujets que vous envie d'aller plus en profondeur dans,
nous allons avoir les heures de bureau cette semaine
où vous pouvez discuter avec nous sur une base individuelle.
Ou vous pouvez simplement venir à la End et nous causons de choses.
Et comme toujours, se sentir à poser des questions.
Impressionnant.
Alors, voici notre image de mémoire nous avons vu dans la leçon d'un milliard de fois.
Et nous savons que cette pile croît à partir du bas
et le tas pousse vers le bas.
Et quelle est la différence entre les choses que nous gardons sur le tas et les choses
que nous gardons sur la pile?
Quelqu'un jeter quelque chose là-bas.
Oui.
>> Public: Est-il empiler pour des choses qui sont juste
les variables éphémères que nous sommes juste déclarant utiliser certaines fonctions?
ENCEINTE 1: Belle, ouais.
Donc tout moment où, nous allons dire que nous sommes dans une fonction,
et nous avons juste quelques variables locales.
Ceux vont se retrouver sur la pile.
Si, à la place, nous appelons malloc et effectivement allouer de la mémoire,
qui revient toujours dans le tas.
Donc, ouais cool?
>> Et rappelez-vous que toute la mémoire que vous allouez avec malloc,
que ça va finir sur le tas.
Et si vous oubliez de gratuitement, l'ordinateur de
ne va pas de savoir que vous avez terminé avec elle.
Donc, il va juste accrocher là-bas dans la mémoire.
Et vous êtes essentiellement que les fuites mémoire.
Vous êtes le perdre.
Parce que vous jamais dit l'ordinateur, hey je suis fini de l'utiliser, vous pouvez utiliser,
mettre d'autres choses là-bas.
Bien.
Des questions là-bas?
Oui.
>> AUDIENCE: Alors, quel genre de mémoire est pile?
Aliments non dynamique, délégué?
Que voudriez-vous l'appeler?
>> ENCEINTE 1: Bien sûr, si vous pouviez penser comme des variables locales.
Appels à des fonctions réelles vont empiler.
autre chose?
Oui?
Public: Comment avez-vous gratuitement la mémoire vous a ajouté à the--
ENCEINTE 1: Bien sûr, donc quand vous allouez mémoire sur le tas, vous appelez malloc.
Et alors que vous redonne une pointeur vers une certaine adresse en mémoire.
Alors dites-vous appelé ce pointeur, non?
Ensuite, vous dites juste pointeur libre.
Et qui libère la mémoire.
Bien.
D'autres questions?
Oui.
>> Public: Qu'est-ce que allouée dynamiquement signifie?
>> ENCEINTE 1: allouée dynamiquement des moyens, dans le cadre de votre programme.
Ainsi, lorsque vous appelez malloc dans au milieu de votre programme,
au début du programme, il n'y a pas la mémoire allouée.
Et comme l'ordinateur étape à travers ce code,
il va allouer la mémoire.
Voilà ce que nous entendons par dynamiquement.
Bonne question.
Oui?
AUDIENCE: Lorsque vous définissez une tableau avec les crochets,
fait cela encore [inaudible]?
ENCEINTE 1: Voilà une bonne question.
Je pense que lorsque vous allouez un tableau, il met effectivement sur la pile.
Je ne suis pas positif au sujet de que, pour ne pas me citer.
>> SPEAKER 2: Je pense que oui it-- il le met sur la pile.
>> ENCEINTE 1: met sur la pile.
OK, cool, confirmé.
D'autres questions?
Oui?
>> AUDIENCE: Lorsque vous déléguez malloc, ne fait pas l'ordinateur automatiquement
allouer de la mémoire pour vos variables?
ENCEINTE 1: Ouais, pour vos variables locales,
il met automatiquement mémoire sur la pile.
Auditoire: Alors, quelle est la point d'utiliser malloc?
ENCEINTE 1: Quelle est la point d'utiliser malloc?
Donc, nous avons vu un tas d'exemples, comme, par exemple, en utilisant swap,
où nous voulons que le champ d'application de la variable à être quelque chose
au-delà de son appel de fonction.
Et nous voulons quelque chose que nous pouvons passer autour
et que nous pouvons accéder à partir de différents endroits.
Voilà où nous voudrions mettre la mémoire sur le tas.
Alors que tous ces différents fonctions y ont accès.
>> Public: Pourriez-vous expliquer cela?
>> ENCEINTE 1: Donc une option est-- de sorte que le question était, pouvons-nous simplement allocate--
Désolé, nous pouvons déclarer une variable globale, essentiellement.
Voilà une option.
Mais avec beaucoup de celles, celles ont tendance à être vraiment malpropre.
Et nous pensons généralement de ce que mauvaise conception.
Oui.
Cool, d'autres questions?
Impressionnant.
OK, passer.
Donc, cela est effectivement comment nous allouer de la mémoire.
Nous en avons parlé un peu.
Nous utilisons cette fonction appelée malloc.
Et vous lui dites combien d'octets mémoire, donc le nombre d'octets sur le tas,
tu veux.
Et il va retourner l'adresse, si un pointeur vers, un morceau de la mémoire
qu'il est alloué pour vous.
Donc, le type va être étoiles vide.
Ça va être un pointeur sur tout ce que vous décidez de mettre là-dedans.
Chaque fois que vous appelez malloc, nous avons déjà dit
vous devez libérer afin que nous ne pas avoir des fuites de mémoire.
>> Quelle est l'autre chose que vous absolument
avoir à faire chaque seule fois que vous appelez malloc?
OK, vous avez à le libérer.
Quelle est l'autre chose?
Vérifiez null, belle.
Alors, oui, il a raison là-haut sur le plateau.
Si vous essayez d'allouer mémoire et vous avez plus de mémoire,
l'ordinateur va dire, Je dois rien à vous donner.
Et il vous donne retour nul.
Questions à ce sujet?
Oui.
>> Public: Pourquoi voudriez-vous à déclarer un pointeur avec un type spécifique
quand étoiles vide peut gérer tous les types de pointeurs de toute façon?
ENCEINTE 1: Bonne question.
Pourquoi devrions-nous dire int étoiles par opposition à annuler étoiles
quand nulle étoile ne peut tout gérer?
Donc, nous ne voulons pas jamais transtyper explicitement pointeurs.
Il est juste une mauvaise pratique.
Mais nous allons parler int étoiles tout comme une compréhension de,
ceci est un pointeur sur un entier.
>> AUDIENCE: OK.
>> ENCEINTE 1: Ouais, et il permet de manipuler les valeurs en elle
comme des entiers.
>> AUDIENCE: Oh, OK.
Et nulle étoile ne serait pas vous laisser faire ça?
>> ENCEINTE 1: Cela dépend de la contexte Ouais, donc ne vous inquiétez pas
ne vous inquiétez pas trop sur le type là.
Il suffit de savoir que, en général, malloc renvoie un pointeur sur quelque chose.
Bonne question.
>> Public: Pourquoi avez-vous multipliez il 10 fois? [INAUDIBLE].
>> ENCEINTE 1: Bien sûr, je était juste faisant exemple au hasard ici, où
Je voulais allouer suffisamment espace pour stocker 10 entiers.
Juste un choix aléatoire.
Oui.
Ouais, quoi de neuf?
>> Public: Ce que vous faites dire en vérifiant nulle?
Voulez-vous de vérifier la pointeur NULL ou le malloc?
ENCEINTE 1: Oui, exactement.
Donc la question est, ce qui voulons-nous dire par chèque nul?
Nous voulons to-- quand nous appelons malloc et nous sommes rentrés un pointeur,
nous voulons dire, est pointeur égale à null?
Donc littéralement PTR.
PTR est égale à null.
Oui.
Auditoire: Alors, je était gentil de se demander, si vous
initialiser le pointeur dans malloc, ne pointer vers le début de malloc?
Parce que si elle est un array--
ENCEINTE 1: Voilà une très bonne question.
Ouais, si vous appelez malloc, la pointeur qui it-- disons,
alors voici nous allouons 10 octets de mémoire.
Donc, je suis désolé, assez ambiante pendant 10 entiers,
nous allons obtenir l'adresse de que la première pièce de la mémoire.
C'est une bonne question.
Oui.
>> PUBLIC: En allouant 10 entiers généralisées,
pourriez-vous utiliser en fait que pointeur comme like-- presque
comme un tableau d'entiers?
ENCEINTE 1: Ouais, si vous le pouvez l'utiliser comme un tableau d'entiers?
Oui, exactement, voici ce que Pulak juste vous a montré on-- un couple il ya glisse,
où nous disons, OK, cela est vraiment juste genre de-- nous
peut considérer comme une tableau de 10 nombres entiers.
Il arrive juste pour être sur le tas.
AUDIENCE: Mais vous ne pouviez pas l'accès avec une notation entre crochets?
ENCEINTE 1: Vous pouvez réellement accéder avec une notation entre crochets, ouais.
Vous pouvez les traiter de la même.
Oui.
>> Public: Pourquoi pointeur jamais nulle?
>> ENCEINTE 1: Pourquoi pointeur jamais nulle?
Si vous allez utiliser tout de la mémoire sur votre tas.
Si votre programme est de manger jusqu'à, manger jusqu'à, manger de la mémoire,
et il n'y a rien à gauche, puis malloc va say-- si vous dites,
Je veux plus de 100 octets, ce qui se passe à-dire, je ne ai pas 100 octets.
Voici nulle.
Cela signifie, je échoué.
Oui.
>> AUDIENCE: Dans ce cas, null est rien, non?
>> ENCEINTE 1: Oui, dans ce cas, nulle est rien.
Vous avez pas d'adresse.
Il n'y a pas de mémoire.
Tout droit, passer.
OK, parlons très rapidement sur les débordements de tampon.
Quand pouvons-nous rencontrer débordement de tampon?
Disons que nous avons a-- nous allouer un bloc de mémoire,
et nous allons écrire la chaîne dans.
Et nous allons dire, OK, je vais à allouer
assez de place pour six caractères.
Et je vais demander à l'utilisateur pour une entrée.
Et les entrées de l'utilisateur, par exemple, bonjour.
Et qui correspond parfaitement bien parce que nous avons
la place pour tous les caractères de bonjour, et le caractère de terminaison nulle.
Beaucoup d'espace, pas de problème.
>> Mais que faire si nous donnons l'occasion pour un utilisateur mal à utiliser notre programme,
et qu'ils tapent dans pas six caractères, ou cinq personnages, mais un million.
Ils gardent la dactylographie, et la saisie, et dactylographie, ce qui va se passer?
Eh bien, nous ne donnons que le enough-- informatique ou désolé,
nous ne donnions cette chaîne assez d'espace pour 5 caractères.
Donc, nous allons obtenir quelque chose comme ce, lorsque la personne qui est le mal
tapant entrée peut écraser la taille de la mémoire tampon,
et peut aller effectivement passé le montant qu'il est à l'origine alloué.
Et puis ce que vous pouvez faire, le vraiment mal chose que vous pouvez faire,
est d'écraser l'adresse de retour.
Ce qui signifie essentiellement vous pouvez sorte de prendre
contrôle du comportement du programme.
Donc, à un niveau très élevé buffer overflow est quand
vous allouez une certaine quantité de mémoire.
Et puis vous-- ce parce que vous êtes prenant entrée de l'utilisateur ou quelque chose
comme that-- vous dépassez les limites de ce que vous avez alloué à l'origine
et commencer à gâcher votre programme.
Oui?
>> Public: Pourquoi pas que juste retourner une erreur de segmentation?
>> ENCEINTE 1: Pourquoi pas que retourner une erreur de segmentation?
Cela pourrait.
Parfois, le compilateur ou au cours d'une de votre exécution
qui se passe réellement pour vérifier cela.
Si certaines choses se produisent, et cette est une sorte de niveau inférieur,
alors vous devez savoir.
Mais si vous ne concevez pas ces systèmes correctement,
alors vous avez la chance de ne pas l'attraper et juste
permettant à l'ordinateur la take-- le mal personne de contrôler votre ordinateur.
Oui.
>> AUDIENCE: [inaudible]?
ENCEINTE 1: Bien sûr.
Oh, quand je dis tampon, je veux juste dire la quantité de mémoire que vous avez alloué.
Donc ici, je dis, oh, nous avons alloué six char-- assez de place pour six caractères.
Et je demande juste que mon tampon où je pourrais écrire des informations.
Oui.
Toutes les autres questions à ce sujet?
Oui.
>> Public: Comment pouvez-vous arrêter il?
Comment voulez-vous arrêter il?
ENCEINTE 1: question impressionnant.
Comment voulez-vous arrêter il?
Comment prévenir le débordement de la mémoire tampon ne?
Eh bien une façon de le faire est quelque chose comme GetString, où nous augmentons constamment
la quantité de mémoire que nous allouons si l'utilisateur entre un grand nombre de texte.
Un autre la chose est, si vous ne veulent six personnages, faire une vérification rapide.
Dites seulement entrée six caractères.
Oui.
Donc, disons que vous étiez travailler on-- nous allons
aller pour le web, un peu plus tard dans la course-- mais nous allons
dire que vous travaillez sur un formulaire, vous feriez simplement limiter combien pourrait remis.
Oui.
>> AUDIENCE: GetString tire la mémoire de la pile, à droite?
Juste pour clarifier?
ENCEINTE 1: Une fois de plus?
Public: Est-ce que GetString prendre la mémoire de la pile?
ENCEINTE 1: Je crois Getm-- get int prend la mémoire du tas
car il appelle alloc.
AUDIENCE: Oh.
D'ACCORD.
ENCEINTE 1: Ouais, malloc et realloc.
D'autres questions?
Oui.
>> Auditoire: Alors, en définissant la taille de la mémoire tampon,
vous empêcher quelqu'un de être en mesure d'injecter du code
qui peut glisser au-delà de la [inaudible].
>> ENCEINTE 1: Donc, en définissant la taille de la mémoire tampon,
vous avez dit, OK voici comment la quantité de mémoire que nous pouvons utiliser.
Si vous permettez à l'utilisateur d'écrire sur elle, alors vous allez avoir des problèmes.
Donner un sens.
Impressionnant.
Passons long.
D'accord.
Parlant d'erreurs, voici certains messages d'erreur courants
qui aurait pu montré pendant que vous étiez codage, travailler sur vos ensembles de problèmes.
Bonne chance que l'un des Ces spectacles sur le quiz
si dernières années sont une indication.
Ainsi, les réponses sont un peu ici sur la carte.
Mais se sentir libre de crier un peu plus.
>> Pourquoi une erreur de segmentation pourrait se produire?
Pourquoi pourriez-vous obtenir une erreur de segmentation lorsque vous utilisez votre programme?
>> AUDIENCE: [inaudible].
>> ENCEINTE 1: Bon.
Oui, si nous essayons de l'accès mémoire qui est pas donné à nous.
Si nous déréférencer un pointeur NULL.
Par exemple, si nous appelons malloc, et d'oublier de vérifier si elle est nulle,
et nous essayons simplement de l'utiliser, de l'ordinateur va nous donner une erreur de segmentation.
Bien.
Qu'en est-il implicite déclaration de fonction?
Qu'est-ce que ça veut dire?
AUDIENCE: Vous essayez d'utiliser un fonction que vous ne l'avez pas défini.
ENCEINTE 1: Bon.
Vous essayez d'utiliser une fonction que vous ne l'avez pas défini.
Donc, cela pourrait être l'une des deux choses.
Peut-être qu'il était comme l'exemple Camille vous a montré plus tôt.
Et vous avez une fonction principale qui appelle quelque chose appelé cube.
Et disons que vous avez employée pour écrire ce prototype.
Vous avez oublié de dire, hey ordinateur, Je dois cette fonction appelée cube.
Vous verrez plus tard.
Disons que vous avez oublié d'écrire le prototype, vous pourriez obtenir cette erreur.
Une autre chose est, disons vous avez essayé d'utiliser printf,
et oublié d'inclure la bibliothèque standard,
alors il va dire implicite déclaration de fonction.
Et pour couronner le tout, identificateur non déclaré.
Oui.
>> Public: Vous avez un champ de problème.
Comme peut-être que vous essayez de appeler une variable locale qui est
dans une autre sorte de zone.
ENCEINTE 1: Grande, donc si vous avez une variable qui est pas dans la portée,
et vous essayez de l'utiliser, vous allez avoir des ennuis.
Et plus généralement, disons vous essayez d'utiliser x, avec jamais dire int
x est égal à 5, alors vous êtes va avoir des ennuis.
Excusez-moi, questions sur cette?
Impressionnant, soufflant à droite le long.
>> OK, récursivité, pourquoi might-- de laisser see-- je perdu mon sch-- oh ici nous allons,
Assurez-vous simplement que nous sommes à peu près sur le calendrier.
Tout droit, cool.
OK, récursivité, l'idée générale de la récursivité, une fonction récursive
est une fonction qui appelle lui-même.
OK, alors qu'est ce que je dire par un concept de programme
par lequel une fonction elle-même appelle.
Quel serait some-- ce qui est un bonne raison d'utiliser la récursivité?
Quand pourrait-il être utile?
Ou ce qui est un programme qui a vraiment se prête à la récursivité?
>> AUDIENCE: la recherche binaire.
>> ENCEINTE 1: recherche binaire se prête à la récursivité,
parce que vous avez ce problème que vous peut briser en petits morceaux,
et effectuer en continu le même algorithme dessus.
Cela conduit à, dans de nombreux cas, plus Code élégant qui est plus précis.
Nous sommes tout simplement l'exemple de recherche binaire.
Un autre exemple est le tri par fusion.
Parfois, quand vous pensez un algorithme, comme factorielle,
il se sent juste récursif, non?
Parce que nous savons que la factorielle 5 est une factorielle 4 fois 5.
Et donc quand vous configurez un problème de cette façon, il se sent juste récursive.
Donc, ce serait une excellente façon de l'écrire.
Des questions?
Oui.
>> Public: Qu'est-ce qu'un scénario de base?
>> ENCEINTE 1: Oh ce qui est un cas de base?
Je l'ai dit, ne pas oublier d'inclure un scénario de base.
Disons que nous écrivions une fonction factorielle,
et nous faisions factorielle de 5.
Et nous savons une factorielle de 5 est 5 fois par factorielle de 4,
bla, bla, bla, bla.
Comment savons-nous quand arrêter?
Comment savons-nous que nous avoir fait un certain nombre?
Parce que si nous gardions appelant factorielle, alors nous ne serions jamais obtenir une réponse, non?
Alors, quand savons-nous comment arrêter dans l'exemple factorielle.
Toute personne, ouais.
>> PUBLIC: Quand le 1 factorielle est 1.
ENCEINTE 1: Bon.
Donc, nous savons.
Nous pouvons prendre pour acquis que Une factorielle est égal à 1.
Donc, si nous arrivons à un point où nous appelons factorielle sur 1,
juste aller de l'avant et revenir 1.
Et cela est votre cas de base.
Parce que nous savons que quand nous sommes arrivés, et nous serons toujours frappé, nous allons never--
nous ne serons pas juste continuer pour toujours.
D'autres questions sur la récursivité?
Oui.
>> Auditoire: Alors, quand vous revenez 1, il vient automatiquement
va arrêter le programme, non?
>> ENCEINTE 1: Ouais donc quand vous retour d'appel 1, si-- disons,
disons factorielle de 2 appels factorielle de 1, factorielle de 1
va simplement restituer 1.
Et maintenant factorielle de 2 dira OK, 2 fois 1 est 2, et retourner cette réponse.
Oui.
>> Public: Avez nous devons nous inquiéter sur la portée de la récursivité
quand vous allez dans un algorithme?
>> ENCEINTE 1: Ah, oui.
Oui, vous avez à vous soucier de portée dans le cadre de la récursion.
Donc, seules les variables définies dans cette course de la fonction
vont être utiles.
Ouais bonne question.
Très bien, gardons déplaçant le long.
Parce que nous avons beaucoup de matériel pour passer à travers.
Mais comme je l'ai dit, se sentir libre de frapper les heures de bureau, ou de nous après le fait.
>> Ceci est juste une diapositive vraiment rapide.
Nous avons appris beaucoup de choses sur recherches et les tris.
S'il te plaît s'il te plaît s'il te plaît, ces sections sont en ligne,
Je crois au cs50.net/quizzes.
Alors, allez prendre ce tableau et le mettre sur votre feuille d'examen,
parce qu'il y aura une question à ce sujet.
S'il vous plaît ne pas se tromper.
Très rapidement, ce que signifie ce tableau,
est il parle de Big O, que nous connaissons être la limite supérieure de un algorithmes
temps de marche.
Et nous avons l'oméga, qui est va être la limite inférieure
d'un environnement d'exécution des algorithmes.
D'accord?
>> AUDIENCE: [inaudible].
>> ENCEINTE 1: Ouais, ce qui est la dernière chose?
Quel est thêta?
Il est si nous-- nous allons seulement soucier dans cette classe dans le cas
où notre borne supérieure et notre borne inférieure sont les mêmes.
Ouais, voilà la seule fois où il est va venir dans cette classe.
OK, je vais continuer.
Si vous ne l'avez pas pris votre photo, Je vous promets qu'ils seront en ligne.
>> OK, impressionnant, structures.
Pourquoi pourrions nous voulons structs?
Qu'est-ce une raison utile nous pourrions vouloir structures.
Quelqu'un crier quelque chose.
Eh bien, regardons la par exemple sur la carte.
Disons que nous avons affaire avec tous ces étudiants.
Si nous faisons un programme pour CS50, il ya comme 800 personnes.
Nous devons write-- nous allons besoin de gérer un grand nombre d'informations
sur les élèves.
Ce serait bien si nous pourrions sorte de groupe
this-- toutes les informations que a à voir avec un élève en particulier
dans un type de données.
Mais nous savons qu'il n'y a pas de données type appelé, étudiants, non?
Nous avons un nombre entier, nous avons un flotteur, nous avons une chaîne, ou une étoile de char,
mais nous ne disposons pas, un étudiant.
>> Donc, nous pouvons faire est effectivement sorte de définir notre propre structure, appelez-étudiant,
et nous pouvons associer une certaine différents domaines avec cette structure.
Donc dans ce cas, nous allons dire que nous avons un étudiant.
Et les choses que nous nous soucions propos sont le numéro de la carte d'étudiant
et le nom de l'étudiant.
Et maintenant, nous pouvons associer ce ID et ce nom avec un élève donné.
Voyons quelques exemples.
>> OK, alors voici je dis, OK, nous allons disons que nous voulons faire un étudiant.
Je l'appelle l'élève 1.
Et son numéro d'identification, dans ce cas, nous pouvons accéder
en faisant juste le nom de l'étudiant parsèment le domaine, nous voulons accéder.
Donc, cela va juste être étudiant 1 point ID, et nous avons mis il égal à 1.
Parce que souvenez-vous, nous avons dit que ID va être un entier.
Et de manière très similaire, nous pouvons dire que cette nom de l'étudiant va être Davin,
par example.
Donc, nous ne pouvons tout simplement d'accéder au champ d'une structure en utilisant ces points.
Questions à ce sujet?
Oui.
>> Public: Est-il possible pour protéger vos variables?
Yat-il un moyen de protéger les variables étant accessibles à partir de l'extérieur?
>> ENCEINTE 1: Y at-il de toute façon pour protéger vos variables
étant accessibles à partir de l'extérieur?
Pas dans le champ d'application de CS50.
D'autres questions?
Oui.
>> Public: Quel est typedef struct?
Qu'est-ce que chaque composant signifie?
ENCEINTE 1: Ah, ce qui est typedef struct?
Qu'est-ce que chaque composant moyenne de ce type?
>> AUDIENCE: Ouais.
>> ENCEINTE 1: OK, cool.
Donc, cela dit, hey ordinateur, je vouloir créer une nouvelle structure.
Et je vais définir une définition pour cela, de sorte que je puisse l'utiliser
comme si elle était un type tout au long de mon programme.
OK, je tiens donc à définir une structure.
Et je vais maintenant être capable de l'utiliser comme un type.
Et son nom est étudiant.
Et voici ses champs.
>> Auditoire: Alors, est que typedef struct [inaudible]?
ENCEINTE 1: Si vous voulez être en mesure de utiliser cette structure tout au long de votre programme,
et dans la plupart des cas dans CS50 nous faire, nous avons à dire de type Def.
Et qui lui permet d'utiliser la même façon dont nous utilisons comme int ou float.
L'ordinateur sait toujours ce qu'il est.
Oui.
>> AUDIENCE: Pouvons-nous écrire ceci dans le fichier d'en-tête?
>> ENCEINTE 1: Oh, désolé.
Devons-nous écrivons ceci dans le fichier d'en-tête?
Vous pouvez écrire ceci au début de votre programme, au début de votre programme de c.
Ouais, ce serait le plus endroit raisonnable pour elle.
Là-bas.
AUDIENCE: Même question, donc avant principal?
ENCEINTE 1: droit, vous en aurez besoin pour être quelque part que tout le monde peut y accéder.
Donc, avant de principale dans votre cas, oui.
Public: Y at-il une différence entre mettre l'étudiant sur le dessus et sur le fond?
ENCEINTE 1: Ah, est-il un différence entre l'étudiant de mettre
en haut ou en bas?
Let-- sauver cette question, et lorsque nous arriverons à des listes liées,
nous verrons que, OK?
Donc, tenir à ce que pendant une seconde.
La dernière chose que je veux mentionner ici, est au lieu d'avoir une structure,
nous avons un pointeur sur une structure, nous pouvons changer notre notation
être un peu plus agréable.
>> Nous pouvons dire, disons que nous avons une pointeur vers un étudiant plutôt que de simplement
un étudiant.
Si nous voulons avoir accès à un champ, au lieu de faisant, bien aller déréférence le pointeur,
puis accéder au nom de domaine.
Cette notation ressemble un peu salissant avec la star dans ce point.
Tout à fait exact, mais une sorte de façon plus propre de le faire,
est juste de dire le nom pointeur de la flèche.
Et qui combine effectivement déréférencement et l'accès à un beau symbole.
Questions à ce sujet?
>> PUBLIC: Il suffit de dire que une fois de plus.
>> ENCEINTE 1: Disons que une fois de plus.
>> AUDIENCE: Exactement ce que vous venez de dire.
ENCEINTE 1: Bien sûr, exactement ce que je viens de dire.
Si nous avons un pointeur à un étudiant plutôt que l'étudiant lui-même,
nous can-- une façon que nous pouvons accéder à la domaine est de déréférencer, puis
Nom d'accès.
Une autre façon, plus agréable, nous peut le faire, ce qui est juste
un peu de sucre syntaxique, est juste à faire pointeur nom de flèche.
Et qui va combiner le déréférencement et accédez.
Ouais, assez cool.
D'accord.
>> Donc, nous allons parler de l'autre question.
Débutons aux nœuds, que nous allons utiliser
dans les listes liées dans une seconde.
Donc, ici, vous remarquerez qu'il ya est le noeud de texte à la fois sur le fond,
et sur le dessus.
Avant, lorsque nous définissions étudiant, nous avons juste eu étudiant sur le fond.
Nous ne disposons pas des étudiants sur le dessus.
Quelqu'un sait pourquoi cela pourrait être?
Quelle est la différence?
Oui.
Auditoire: Alors, vous utilisez noeud est la définition de noeud,
de sorte qu'il est une chose récursive?
ENCEINTE 1: Bon.
Oui, nous avons besoin de nos noeuds avoir pointeur à d'autres nœuds.
Donc, puisque nous utilisons ce type avant qu'il ne soit réellement défini,
nous avons besoin de le mettre en haut de même il sait ce qu'il est.
Auditoire: Alors, nous avons encore besoin au fond?
ENCEINTE 1: Oui.
Auditoire: Alors, toujours au fond.
ENCEINTE 1: Toujours au fond.
Donc, tous les vôtres seront avoir au fond.
D'autres questions?
Tout droit, laisse ainsi parler effectivement à propos liée listes très rapidement.
Donc, les listes chaînées soient: nous les utilisons au lieu de tableaux dans certains cas,
parce que nous savons que les tableaux sont un longueur fixe, alors que les listes chaînées
nous pouvons grandir et rétrécir comme nous voulons.
Donc, ceci est un exemple de ce que une liste chaînée pourrait ressembler.
Ce que nous devons voir est la tête de la liste.
Alors, où la liste commence.
Et puis il nœud, chaque noeud suivant, est
responsable de connaître où le noeud suivant est.
Donc dans ce cas, le nœud qui stocke 1 est responsable de savoir où est 3.
La personne qui stocke 3 est responsables de savoir où 9 est.
Et 9 a personne d'autre pour pointer vers.
Il est la fin de la liste, il dit simplement nulle.
D'accord?
>> Public: Quel est le point de tout cela?
>> ENCEINTE 1: Quel est le point de tout cela?
>> AUDIENCE: Ouais.
ENCEINTE 1: Parce que, de laisser dire que nous avons des données.
Et nous ne savons pas exactement comment beaucoup de données que nous voulons à l'avance.
Donc, avec un tableau, disons où nous vouloir compter les gens dans la première rangée.
Il ya des chances qu'il ne va pas changer.
Nous pouvons simplement dire, OK, je veulent un tableau de taille six.
Mais si nous voulons quelque chose que cela va changer.
>> Par exemple, disons que je tentais de garder une trace des étudiants
comme ils viennent dans la salle pour la session d'examen.
Je ne sais pas combien d'entre vous les gens vont se présenter.
Donc, je pourrais vouloir une structure de données que je peux étendre et réduire.
Parce que peut-être quelqu'un quitter, peut-être que quelqu'un viendra.
Et à tout moment, nous peut ajouter ou supprimer des nœuds.
Cool, bonne question.
Oui.
>> Public: Si vous pouvez utiliser quelque chose comme GetString
qui garde vous permettant de faire plus de données que vous en avez besoin, pourquoi avez-vous besoin de ce trop?
>> ENCEINTE 1: Pourquoi vous utilisez la liste lorsqu'ils sont liés
vous pouvez utiliser quelque chose comme GetString?
C'est une bonne question.
Rappelez-vous que l'un des Get-- les chutes de GetString
est que nous ne faisons pas un très bon travail de libérer cette mémoire,
et nous avons lancé un tas de des fuites de mémoire dans votre programme?
Vous pourriez prendre un statiquement gamme de taille et de garder cultiver.
Mais vous auriez à trouver de nouveaux endroits dans la mémoire.
Il serait tout simplement beaucoup de frais généraux.
>> Une des belles choses sur liée listes plutôt que de tableaux, est tableaux
sont tous dans le même emplacement dans la mémoire.
Il doit être continu morceaux de mémoire.
Considérant que les listes chaînées, 2 et 3 mai être totalement dans des endroits différents.
Comme 2 est ici, et 3 est ici.
Et aussi longtemps qu'ils ont une pointeur à l'autre, il est très bien.
Nous savons que nous pouvons les trouver.
Question là-bas?
>> AUDIENCE: GetString est une fonction dans la bibliothèque de CS50, non?
Il ne existe pas dans les programmes réels.
>> ENCEINTE 1: Exact.
Droit, qui est l'autre chose.
GetString ne pas exister en dehors du contexte de CS50.
Oui.
>> AUDIENCE: fait donc le fait que deux pourraient être très éloignés,
est l'impact de l'efficacité des accéder aux éléments sur la liste?
ENCEINTE 1: Voilà une très bonne question.
La question était, fait l'impact l'efficacité de l'accès
ces différents éléments dans la liste.
En fait, oui.
Parce que nous savons, nous allons si-- disons que nous voulons accéder
le deuxième élément du tableau, on sait nous ne pouvons faire ensemble étrier 1, à droite.
Il va toujours être au même endroit.
Mais si nous voulons arriver à ce 3, nous ne pouvons pas simplement dire, aller chercher ce que 3.
Nous avons à dire, OK, commencer à le début de la liste,
et maintenant nous avons fait de marcher à travers jusqu'à ce que nous
trouver le nombre qui nous intéresse.
>> Donc dans ce cas nous disons, OK ceci est le premier nombre.
Donc, essentiellement, qui est l'index 0.
Maintenant, nous devons trouver le deuxième chiffre.
Voilà l'indice 1.
Alors que se passe réellement to-- juste accéder, va prendre du temps N.
Cool, grand vieux N. Ouais.
>> PUBLIC: Quels sont chacune des listes?
Sont-ils chacun des tableaux, ou quoi?
ENCEINTE 1: Voilà une très bonne question.
Quels sont chacun des structures que je suis en tirer?
Ils sont des noeuds.
Donc, chacun de ces petits la structure comporte deux parties.
Il a un nombre entier qui détient.
Voilà les données réelles que ça accrocher.
Voilà le genre de partie utile.
Et, voici ce que rend une liste chaînée,
il a un pointeur vers le noeud suivant.
Impressionnant question.
Très bien, alors regardons très regardez rapidement quelques exemples de ce que
nous pourrions faire avec les listes chaînées.
>> Donc, un exemple très rapide est, Supposons que nous voulons faire une recherche.
Quel genre de recherche ne peut pas nous faisons sur les listes chaînées?
>> AUDIENCE: Binary.
>> ENCEINTE 1: binaire.
Pourquoi ne pouvons-nous pas utiliser la recherche binaire?
>> AUDIENCE: [inaudible].
ENCEINTE 1: droit, car avec binaire la recherche, nous avons dû compter sur le fait
que nous pourrions simplement sauter dans le tableau à tout moment.
Nous pourrions simplement dire, aller à l'élément intermédiaire.
Avec ici, comme nous avons dit un peu plus tôt,
nous ne pouvons pas simplement sauter à l'élément central.
Afin de trouver une élément, nous avons effectivement
avoir à marcher à travers l'ensemble de notre liste.
>> Donc, si nous voulions faire une recherche, le mieux que nous puissions faire est simplement une recherche linéaire.
Nous commençons à la tête, nous check-- disons que nous sommes
la recherche de 9-- nous commençons à la tête.
Nous disons, est-ce 9?
Non.
Est-ce 9?
Non.
Est-ce 9?
Oui, nous l'avons trouvé.
OK, voilà tout ce que.
Voici un peu de pseudo-code.
Je vais laisser cela pour vous les gars pour le taux de désabonnement plus sur votre propre,
juste parce que nous manquons un peu à court de temps.
>> Parlons de l'insertion.
Nous avons vu une démo vraiment cool de cette conférence dans laquelle nous disions,
OK, nous avons cette liste chaînée où chacun pointe vers une autre,
et quelqu'un arrive sur la scène.
Comment nous insérons-nous que personne dans notre liste chaînée?
Eh bien, une mauvaise façon de faire, qui est je pense que ce que nous avons vu en premier,
est lorsque la personne en avant automatiquement
souligné la nouvelle personne.
Et puis nous avons abandonné le genre de seconde moitié de la liste, à droite?
Parce que nous ne savons pas où il est dans la mémoire plus.
Donc, pour être très prudent au sujet de la ordre dans lequel nous insérons les choses.
>> Donc, ici, disons que nous voulons mettre 1 à l'avant de notre liste.
Tout d'abord, nous avons 1 point à la deuxième element-- ou l'élément
qui contient une.
Donc, nous faisons cela, juste pour que nous ne sommes pas va perdre au second semestre.
Et maintenant, nous pouvons avoir le point de la tête à 1.
Encore une fois, ceci est juste comme super haut niveau.
Voilà comment nous pourrions insérer un noeud.
Nous avons beaucoup de pseudo-code ici-- désolé,
Je ne sais pas pourquoi je suis appelant pseudo-code.
Il est code réel.
Vous pouvez aller vérifier plus tard.
>> Très bien, nous allons très quickly-- d'autres questions
sur les listes liées avant que je passer à un couple d'autres données
structures dans nos 10 dernières minutes.
>> AUDIENCE: Devons-nous maintenant comment l'écrire sur un test?
>> ENCEINTE 1: Avons-nous besoin de savoir comment to--
>> AUDIENCE: Ecrire sur un test.
>> ENCEINTE 1: Nous devons to-- vous devriez être prêt
à écrire, insert, supprimer, rechercher des listes chaînées sur le test.
Voilà quelque chose que nous pourrait attendre que vous fassiez.
Il suffit d'aller sur elle.
Si vous avez des questions sur le code, tirer votre TF un email,
venir à des heures de bureau.
Il ya encore beaucoup de temps d'étudier, ne vous inquiétez pas.
Tout droit, toute l'autre questions sur les listes chaînées?
Oui.
>> Auditoire: Alors, si vous ne l'utilisez pointeur pour aller à la une sur le droit
avant d'utiliser le pointeur pour l'une sur le côté gauche, qui est
l'équivalent de la suppression tout, non?
ENCEINTE 1: Ouais.
AUDIENCE: [inaudible].
ENCEINTE 1: droit, puisque nous ne pouvons pas l'obtenir, il est en fait encore pire.
Parce que non seulement nous ne savons pas où il est, nous ne pouvons plus l'utiliser,
mais nous ne sommes pas we've-- libérant plus que la mémoire.
Donc, il est tout simplement traîner et non être utile parce que nous ne pouvons pas le trouver.
Ouais, question cool.
>> Très bien, nous allons parler de piles.
Nous avons vu des piles très rapidement.
Ils sont d'abord dans la dernière structures de données sur.
Nous pensons donc que des piles dans Annenberg des plateaux où nous nous classons les choses sur le dessus.
Et si vous allez Venez vous un plateau, vous êtes
toujours va prendre celui sur le haut, ce qui est le plus recently--
Quelle est la chose que nous avons plus a récemment mis sur le dessus de la pile.
Ainsi, vous pouvez sorte de penser à ce genre de visuel lorsque vous songez à piles.
Et puis, nous avons crevé quelque chose sur le dessus de la pile.
>> Si nous soient: oh, et les mots que nous utiliser quand nous parlons de ces données
structures est généralement, si nous mettre quelque chose sur la pile,
nous disons que nous pousser sur la pile.
Et si nous prenons quelque chose hors de la pile, nous disons que nous allons sauter hors de la pile.
Si vous allez mettre en œuvre un stack-- dont je doute
vous recommandons d'essayer out-- vous êtes allez vouloir garder une trace de,
disons que vous utilisez un tableau.
Je sais que nous avons parlé en conférence sur l'utilisation de deux matrices
ou des listes liées à la mise en œuvre d'une pile.
Si vous utilisez un tableau, vous devez keep--
excuse moi-- nous avons besoin de garder une trace de la taille et de la capacité.
Ainsi, le nombre maximum que notre pile peut contenir.
Questions sur les piles?
>> Public: Quelle est la différence entre la taille et la capacité?
ENCEINTE 1: La différence entre taille et la capacité, question génial.
Donc, disons que nous sommes utilisant un tableau, et nous
allouer suffisamment de place pour 10 entiers.
Et nous commençons à remplir tout ça.
Et nous poussons les choses sur, et nous pop off choses.
Nous voulons garder une trace du maximum Numéro nous pouvons tenir, qui est la capacité.
Et nous voulons garder la trace de la nombre actuel que nous avons, qui est de taille.
Bonne question.
Tout le reste sur des piles?
Très bien, parlons à propos de surprise, les files d'attente.
>> Contrairement à piles, qui sont la première à la dernière out, ce sont d'abord entré, premier sorti.
Donc, cela est like-- penser à une ligne.
Pensez à la queue à l'Apple Store pour obtenir ce produit.
Et la première personne en ligne devrait être la première personne qui a aidé.
Donc la première chose qui a poussé est ce la première chose qui a sauté.
Bien?
Très similarly-- Oh, les mots qui nous utilisons au lieu de pousser et pop--
que je viens d'utiliser, Je suis sorry-- est que nous disons,
si nous mettons quelque chose dans la file d'attente, nous disons en file d'attente il.
Si nous prenons quelque chose de la file d'attente, nous disons que nous dequeued.
Ce.
Je peux se prononcera ceux trompe, mais vous voyez l'idée.
Et là encore, tout comme les piles, si nous mettons en œuvre cette forme de tableau,
nous avons besoin de garder une trace de la la taille, la capacité, et la tête.
Qu'est-ce que je veux dire par la tête?
Pourquoi avons-nous besoin de garder piste de la tête?
>> AUDIENCE: Parce que est là le début de votre liste est.
ENCEINTE 1: Ouais, essentiellement la tête est où le début de notre file d'attente est.
Parce que nous savons, à la différence des piles, qui-- Je vais essayer de faire face à cette way--
nous savons que cela va toujours réduire de cette façon et se développer de cette façon.
Les files d'attente, les gens viennent sur la fin et laissez depuis le début,
nous devons donc garder une trace d'où le départ est.
Voilà ce que je veux dire par nous devons garder une trace de l'endroit où la tête est.
Bien?
D'accord.
Huit minutes, en couple plusieurs sujets, nous pouvons le faire.
>> Tout droit, table de hachage.
Nous avons parlé très brièvement sur les tables de hachage.
Pour faire le quiz, vous avez juste besoin de les comprendre à un niveau élevé.
L'idée de base est que vous avez ces données.
Et nous voulons y accéder dans le temps qui est plus vite que quelque chose comme un lien
liste.
Parce que nous avons dit, si nous étions chercher dans une liste chaînée,
cela pourrait prendre du temps N.
Même l'accès peut prendre N fois dans une liste chaînée.
Les tables de hachage nous donner un moyen que nous pouvons accéder plus rapidement les choses, et plus
rechercher rapidement les choses, sans avoir les contraintes d'un tableau
où nous avons fixé la taille.
>> Nous pensons donc que d'une structure de données où, où nous mettons dans la structure de données
est dépendante de cette fonction de hachage magique.
Donc dans ce cas, le hachage magique fonction est en train de prendre un mot,
vérifier ce que la première lettre est, et puis juste les trier par ordre alphabétique.
Donc, nous avons essentiellement les mettons dans différents seaux.
Quand on voit la banane, nous disons, OK, nous allons mettre dans le seau B.
Quand nous voyons Apple, nous allons mettre dans l'un seau.
Si nous avons vu abricot, nous allons mettre dans l'un seau.
D'accord?
>> Donc suppose que je regardais, je pour-- Je ne sais pas, ce qui est un autre fruit?
Supposons que je cherchais orange.
Où dois-je chercher?
Dans le godet d'O.
Oui, il ya un seul endroit que l'orange pourrait être, OK?
Donc je l'ai dit ce qui se passe si-- bien je l'ai dit plus tôt,
disons que nous mettons abricot in-- mais je vraiment compte du fait que, oh non,
si je devais mettre en Berry, il est va entrer en conflit avec la banane.
Où nous mettons si il ya déjà quelque chose en notre table?
Eh bien, nous avons deux options.
>> Option numéro un est linéaire sondage, ce qui signifie essentiellement,
disons que je veux essayer de mettre Berry, et je vois, oh non,
bananes déjà là, Je dis juste OK, laissez-
me regarde pour la prochaine place disponible.
Donc, je descends, je dis, oh, il n'y a rien dans le seau D.
Je ne peux pas vraiment penser à des fruits qui commencent par la lettre D,
donc je vais juste mettre baies là.
Durian.
OK, donc puisqu'il ya rien là encore,
Je pourrais tout aussi bien utiliser cet endroit.
Quel est l'inconvénient de cela?
>> PUBLIC: Il est hors de commande.
>> ENCEINTE 1: Désolé?
PUBLIC: Il est hors de commande.
>> ENCEINTE 1: Il est out-- droite, nous pourrions nous retrouver
avec des choses qui ne sont pas in-- stocké dans des seaux dans la manière
que nous attendons qu'ils soient.
Donc, si nous étions à la recherche Berry, avant de nous l'avons dit,
Oh, nous pouvons regarder dans un seau.
Ce ne pouvait être dans un seau.
Mais maintenant, vraiment, il pourrait être dans tous les seaux, non?
>> OK, voici une autre option, chaining-- séparée
qui est l'idée que nous allons à utiliser un peu plus tard dans P situé à 5.
Plutôt que de simplement avoir un espace dans chaque godet,
pourquoi avons-nous pas chaque seau être un pointeur sur une liste chaînée?
Où nous disons, OK, il ya un seau pour tout ce qui commence par A.
Et il va juste être un lien liste des fruits qui commencent par A.
Donc, si nous obtenons un nouveau fruit, disons nous nous get-- avocat, nous avons pomme,
disons que nous obtenons d'abricot, comment pourrions-nous mettre dans la liste?
Eh bien, nous allions au seau 0, et nous aimerions il suffit d'insérer dans notre liste aimé,
aussi simple que cela.
>> Maintenant, je continue à dire seau.
Nous pourrions mettre en œuvre cette dans un certain nombre de façons.
Une façon typique que cette genre d'image suggère,
est peut-être comportant un réseau de pointeurs vers des listes liées.
Voilà une façon que nous pouvons mettre en œuvre une table de hachage.
Public: Seriez-vous besoin d'un autre liste parce que la banane et baies sont hors
de l'ordre?
ENCEINTE 1: Seriez-vous need-- ah, vous ne
besoin d'une autre liste, parce que la banane et de baies sont hors de commande?
Dans ce cas, notre fonction de hachage, qui nous dit où mettre les choses
ne se soucient pas de la deuxième lettre.
Il ne se soucie pas de classement par ordre alphabétique, il ne se soucie que la première lettre.
Question?
>> Public: Quelle est la définition de ce fonction, et ce que cela ressemble?
ENCEINTE 1: Ah, bon.
OK, donc nous ne devons pas vous inquiétez pas trop pour ce quiz.
Donc, je ne mettais pas dans les coulisses.
Nous allons être introduit à lui pour régler P 5.
Mais fondamentalement, dit-il, donné un nouvel élément, où dois-je le mettre?
Ou, disons que je suis à la recherche un élément, où peut-il être?
Ouais, bonne question.
>> OK, très rapidement, les arbres et les essais.
Ainsi, un arbre est simplement toute sorte de structure de données organisée.
Et nous allons voir beaucoup de photos qui fera de ce super clair.
Et un trie, que nous avons vu en classe, est un genre très spécial de l'arbre
qui fonctionne essentiellement comme une table de hachage multi-niveau.
C'est super cool.
Nous allons voir dans juste une seconde.
Très bien, nous allons donc parler des arbres en premier.
Donc, cela est par exemple très typique de un arbre, où nous avons une certaine hiérarchie.
Vous voyez que l'on est au en haut, à droite?
Et je peux dire haut parce qu'il ya clairement une commande parce que nous
ont ces flèches descendre.
Alors que, la chose en haut, Je demande que le nœud racine.
Donc, on est le nœud racine.
Et les choses au fond, qui ont rien de se détacher eux,
Je dis ce sont les nœuds feuilles.
Donc 8,9 5, 6, 7, OK.
Et généralement la terminologie de nous puisse dire est, 1 est la société mère de 3.
Donc, il est la chose qui vient d'un niveau au-dessus, et les points à elle.
Et 3 est de 1 enfant.
Il est la chose que 1 points à.
Question?
>> AUDIENCE: Pouvez-vous revenir à la diapositive précédente, s'il vous plaît?
>> ENCEINTE 1: Puis-je revenir à la diapositive précédente?
Bien sur.
Questions sur ce sujet?
Ou vous voulez juste pour le regarder?
AUDIENCE: Je ne l'ai pas passer au travers.
>> ENCEINTE 1: OK, cool, ouais.
Ce seront tous en ligne il ne faut pas vous soucier de chaque mot.
Et dans l'intérêt de temps, je vais aller.
Est-ce OK?
Impressionnant.
OK cool.
Donc, nous allons parler d'un kind-- très spécifiques
Nous avons donc ces générale structure des arbres,
qui est juste tout ce qui nous permet au genre de choses de rang hiérarchique.
>> Arbres binaires sont des choses où chaque noeud a au plus deux enfants.
D'accord?
Et je l'ai dit, OK, de sorte que semble pour correspondre à cette description.
Je l'ai dit noeud, pas un arbre de recherche binaire.
Qu'est-ce qu'un arbre binaire de recherche?
Il est triée.
Donc, vous savez que, dans un arbre de recherche binaire,
tout pour le tout tree-- aux nœuds gauche est plus petit,
et tout à la nœuds est juste plus grand.
Donc, ce ne sont pas un arbre de recherche binaire.
Ceci est juste un arbre binaire.
Donc, nous avons une grande catégorie de arbres, légèrement plus petite catégorie
des arbres binaires, recherche par A- arbres binaires de recherche.
Bien?
D'accord.
>> Et maintenant, plus fun de tous, nous avons nos essais.
Vous les gars a vu cette image dans la conférence?
Ouais, il devrait vous être familier de super.
Regardons comment nous pourrions effectivement mettre en œuvre.
Ou en fait, voyons, est-ce que même venir?
Non.
Très bien, nous ne même pas à soucier que le faible niveau des trucs.
Nous aurons beaucoup de temps pour aborder ensuite P mis 5.
Mais pour l'instant, juste très haut niveau, nous sachez que cela est à quoi il ressemble.
Nous l'avons décrit comme une sorte de une table de hachage multi-niveaux
where-- qu'est-ce que ce magasin?
Cette stocke les noms de scientifiques que nous pouvons réellement
chercher par juste sorte de suite à la différentes tables de hachage vers le bas, tout va bien?
>> Le but de ceci est, en théorie, ils fournissent constante de temps Look Up.
Donc, si je veux vérifier que, par exemple, qui est someone--
qui se trouve dans cette Mandel trie, je pouvais très rapidement
dans linear-- Je suis désolé, en constante de temps, comprendre
si oui ou non il est dans le trie.
Mais un con, est de regarder l'ampleur de ce est.
Nous ne sommes même pas que le stockage beaucoup de données, et il est énorme.
Donc un gros con est qu'il utilise une grande quantité de mémoire.
Oui.
>> Public: Pourquoi faut-il fournir constante de temps, exactement?
>> ENCEINTE 1: Une fois de plus?
>> AUDIENCE: Quelle est l'intuition la raison pour laquelle il offre constante de temps?
>> ENCEINTE 1: Excellente question.
Pourquoi faut-il fournir constante de temps?
Donc, ce que nous pouvons faire est, nous allons disons que nous sommes à la recherche de Mandel.
Nous savons que nous voulons commencer dans le premier niveau à M.
Nous savons que nous voulons suivre à E. Donc, qui est de faire un pas, deux pas, non?
Nous suivons à N. Nous suivons à D. Nous suivons à E. Nous suivons à L.
Et puis la prochaine chose que nous vérifions says-- ce delta dit oui, que ce
dans notre tableau.
Voilà un mot.
Voilà une entrée valide dans notre trie.
Donc, vous dites, OK, qui a eu sept étapes.
Mais si nous avons ajouté comme un zillion plus scientifiques à cette structure de données,
nous ne serions pas avoir à vérifier un tas d'autres choses.
Nous ne va jamais avoir à prendre sept étapes, la longueur de la personne de
prénom.
>> Donc, nous aimons à penser d'exécution que, supposons
nous augmentons la taille de notre Structure de données, combien de temps
est ce que ça va prendre?
Dans ce cas, si l'on ajoute un tas plus de scientifiques, il n'a pas d'importance.
Il va toujours à prendre le même laps de temps.
Il est temps constant.
Oui.
>> Public: Comment savez-vous pas pour numériser sur les autres numéros?
ENCEINTE 1: Comment puis-je savoir comment to--
AUDIENCE: Comme comment savez-vous que vous alliez directement à partir de M à E et non à M à A?
ENCEINTE 1: Oh, bien sûr.
Parce que je savais que je étais à la recherche du mot Mandel,
et je sais juste qu'il est M-E. Donc that-- oui, aller de l'avant.
AUDIENCE: Souhaitez-vous pas avoir à regarder les autres lettres
dans le reste de la [inaudible]?
>> ENCEINTE 1: Ah, je ne voudrais pas avoir à regarder the-- OK, très bien.
c'est une excellente question.
Cela dépend de la façon dont nous l'appliquer.
Si nous mettons en œuvre comme juste comme une série de tableaux
où nous savons que E est toujours à la position 0,
Je ne sais pas, quel que soit numéro d'index est à.
Oui, nous pouvons juste faire constante temps, ne, ne, ne, faire.
Bien.
Question là-bas?
>> Public: Est-constante de temps la même chose que le temps réel?
ENCEINTE 1: Est-constante de temps la même chose est en temps réel?
Je ne suis pas vraiment sûr en temps réel est.
Public: Durée Comme ça progresse littéralement deuxième
par seconde au lieu d'être une variable indépendante.
>> ENCEINTE 1: Oh, oui, vous peut penser de cette façon.
En d'autres termes, il est dépendant pas de la taille de la structure de données.
Voilà une façon de penser à elle.
D'autres questions?
Peut-être dans un premier temps en l'histoire, nous avons terminé à temps.
Si vous avez des questions, ne hésitez pas à venir nous demander, allez à la section,
parler à votre FO, bureau heures sont 08:00 et 8h30
à 11h00 le lundi et le mardi, de sorte il est un temps peu différent,
alors assurez-vous de noter que.
Oui.
>> Public: Est-ce que nous devons savoir des trucs comme arguments de ligne de commande,
ls tiret, tiret quel que soit?
>> ENCEINTE 1: ligne de commande des arguments et des commandes Linux,
Oui, vous avez besoin de connaître ceux.
Very-- il est comme le genre de niveau des trucs, nous avons couvert dans la section 0,
dans la mesure où les commandes Linux en déplacement.
>> PUBLIC: Les heures Annenberg?
ENCEINTE 1: heures de bureau, je ne suis pas entièrement sûr où ils sont.
Mais vous pouvez vérifier le site web, et il vous le dira.