Tip:
Highlight text to annotate it
X
>> INTERLOCUTEUR 1: Salut tout le monde.
Nous allons commencer.
Je pense que les gens sont toujours en cours à filtrer po
Mais dans l'intérêt de temps, afin que nous puissions obtenir les gars d'ici à temps,
nous allons commencer.
Alors, bienvenue à la CS50 Quiz 0 avis.
Pour ceux d'entre vous qui n'ont pas réalisé encore, vous avez une question sur mercredi.
Woo-hoo.
>> Si vous n'avez pas encore commencé à étudier ou n'ont pas réalisé que cela existe encore,
quiz passées et toutes les informations sur votre quiz sont sur cs50.net/quizzes.
Il ya des trucs assez bon là-bas, quiz dernières de la dernière 10
année ainsi que des informations sur ce quiz et sujets
qui seront couverts.
Donc, nous allons commencer.
>> Donc, vous avez peut-souvenir, le premier jour de classe David avait ces lampes sur.
Donc, essentiellement, tout ce qui va sous le capot d'un ordinateur est
fait en binaire.
Binary signifie ce que cela comme, de 0 et de 1.
Il dispose de deux valeurs que peuvent être représentées.
>> Ainsi, tout comme dans le premier jour de l'article quand David allumé une lumière
ampoule à représenter sur, ou 1, notre ordinateur comprend binaire 0 et
De 1, on ou off.
Notions de base binaire.
Chaque lieu est représenté en base deux.
Donc, vous ajoutez 2 à 0 à la 1 à 2 sur toute la hauteur.
>> Pour calculer ce que votre binaire est de décimal, vous suivez cette équation
ce genre de chose.
Si vous avez un 1 dans l'un de ces endroits, vous multipliez par quelque
fonder c'est dans, ajouter, et vous obtenez la décimale.
Voilà donc comment vous comptez à cinq en binaire.
Tout comme ce que nous faisions sur le dernière diapositive, c'est la façon dont vous le feriez
représenter de 1 à 5.
>> De même, juste comme vous pouvez ajouter et soustraire en décimal ou en base 10, ou
vraiment n'importe quelle base, sur peut ajouter et soustraire en binaire.
Exactement ce que vous attendez lorsque vous ajouter les deux jusqu'à, si elle est égale à une plus grande
de 1, vous portez un 1, en font un 0, et faire le plus de cette façon, juste
comme on peut s'y attendre avec régulière décimal ou toute autre base.
Cool.
>> Donc, comme je l'ai déjà dit, tout ce qui qui se passe sous le capot de votre ordinateur
cela se fait dans de 0 et de 1, ou binaire.
Alors, comment pouvons nous exprimons, par exemple, lettres ou des chiffres, ou des caractères?
Et la réponse à cette question est ASCII.
>> ASCII est une correspondance entre caractères que nous aurions normalement voir dans le
Langue anglaise comme A, B, C de, soulignent, tirets, et
quelque chose comme ça.
Et il mappe que pour une valeur ASCII.
Une valeur ASCII est juste un nombre qui peut être compris par votre ordinateur.
Et comme vous pouvez faire plus et soustraction avec des nombres, vous pouvez faire
avec les valeurs ASCII.
>> Donc, dans cet exemple, ce que sera présent imprimer?
Ouais, juste un espace espace espace B C D. Où ma souris aller?
Notez que vous pouvez définir un int à 65.
Et lorsque vous imprimez à l'aide que pour cent C, il va interpréter que comme une
caractère et imprimera A.
>> De même, vous pouvez déclarer comme un caractère.
Et lorsque vous imprimez à l'aide de pour cent C, il va interpréter que comme
pour cent D. Et comme vous pouvez ajouter un numéro, vous pouvez ajouter des caractères sont
valeurs ASCII, dans ce cas.
>> Donc un peu de pointeur pour tout le monde.
5, en tant que chaîne, qui ne fonctionne pas égale à fait 5.
Alors, comment pouvons-nous transformer l' 5 cordes à l'entier le 5?
Des idées?
Ouais.
>> Donc, si nous avons 5 sous forme de chaîne, nous pouvons soustraire 0.
Et ça va nous donner 5.
Et de même, si nous avons 5 comme entier, l'ajouter à la chaîne 0.
Et cela nous donne la chaîne 5.
Cool.
>> Maintenant, retour à rappeler la leçon celui où nous avons parlé des algorithmes.
Alors, comment voulons-nous réellement un ordinateur à faire des choses intéressantes?
Vous savez, juste additionner et soustraire des chiffres et des choses d'impression OUT n'est pas
que passionnant.
Habituellement, nous voulons que notre ordinateur effectuer une sorte d'algorithme.
Quelque chose d'un peu plus complexe qu'une simple arithmétique.
>> Un algorithme est juste une étape par étape ensemble de des instructions sur la façon d'effectuer
une tâche -
tout comme une recette.
Vous vous souvenez peut le premier jour de classe où David nous avait compter une chambre
des personnes et combien de personnes étaient dans la chambre.
Vous pourriez être utilisé pour le comptage un par un.
1, 2, 3, 4.
Dans ce cas, un algorithme en temps linéaire.
>> Mais David a présenté un algorithme pour vous comptez les gens dans la salle
où tout le monde se lève, vous dites que votre nombre à une autre personne, d'ajouter que
nombre, et une personne s'assied.
Et vous répétez cela.
C'est un type d'algorithme.
Nous pouvons analyser comment une efficace algorithme est basé sur il est géré temps.
Mais nous allons parler un peu plus à ce sujet plus ***.
>> Donc, tous les algorithmes peuvent aussi être écrit en pseudo-code.
Pseudocode est juste un Anglais comme syntaxe utilisée pour représenter
un langage de programmation.
Par exemple, si nous voulions demander à un utilisateur de deviner mon numéro préféré, nous
pseudocode pourrait avoir en tant que tel.
>> Inscrivez-vous pour les utilisateurs de deviner.
Si l'hypothèse est correcte, dites-leur ils sont corrects, sinon leur dire
ils ne sont pas correctes.
Et pseudo est un moyen de facilement représentant une idée ou un algorithme.
Alors maintenant, nous pourrions réellement écrire ce qui dans le langage de l'ordinateur
pourrait comprendre.
Donc, nous pourrions écrire notre pseudo et interpréter que dans le code source.
>> Jusqu'à présent, le code source doit respecter à une certaine syntaxe de
un langage de programmation.
Et jusqu'à présent, CS50, nous avons été en utilisant principalement c.
Donc, cela pourrait être le code source pour c.
Plus *** dans le cours, vous venez nuit en contact avec d'autres programmes
langues telles que PHP.
Ou si vous prenez encore d'autres classes, vous pourrait faire Java, Python, ou même OCML.
Mais dans notre c langage de programmation, ce n'est comment nous pourrions écrire le code source pour
l'algorithme de pseudocode que Je viens de décrire plus haut.
>> Alors, comment votre ordinateur fait comprendre cela?
Comme je l'ai déjà dit, il n'est vraiment comprend des zéros et des uns.
Alors, comment obtient-il de la source code pour quelque chose qui peut être
compris?
Eh bien, nous avons quelque chose appelé un compilateur.
>> Si vous vous souvenez de retour en plus de votre psets, vous aviez une sorte de programme
écrit dans un fichier de point de c.
Et puis vous tapez make.
Alors qu'est-ce faire faire?
>> Vous pouvez taper make pour compiler votre programme parce que quelqu'un -
celui qui a écrit votre jeu de p; probablement David -
créé un fichier de marque.
Et qui raconte faire savoir pour faire fonctionner votre compilateur, appelé bruit, que la volonté
puis compiler votre code source à l'objet code, qui est zéros et de uns
que votre ordinateur comprend.
Mais un peu plus ***, nous irons plus en profondeur sur les compilateurs.
>> Donc rappeler pset 0, où - oui, Vous avez une question?
>> PUBLIC: [inaudible]?
>> INTERLOCUTEUR 1: Oui.
Je pense qu'ils ont effectivement devrait être en ligne.
Ouais.
>> PUBLIC: Est-ce comme [inaudible]?
>> INTERLOCUTEUR 1: Il n'est pas.
Le sont sur cs50.net/quizzes.
>> PUBLIC: Slash quiz, slash 2013, slash 0, et il suffit de cliquer à travers
quiz 2013 et quizz 0, examiner les diapositives de la section.
>> INTERLOCUTEUR 1: Ouais, si vous voulez les gars à tirer vers le haut et regarder sur votre
propre ordinateur, c'est très bien aussi.
Le dire.
>> PUBLIC: [inaudible].
>> INTERLOCUTEUR 1: Ouais, [inaudible] est la variable muette.
Oh, oui?
>> PUBLIC: [inaudible]?
>> Intervenant 1: Non, les grèves ne sont pas à l'examen.
Désolé, sa question était, a été grèves sur l'examen.
Et il n'est pas.
Donc pset 0, les gars doivent avoir tous mis en place quelque chose en utilisant zéro.
Et nous avons appris un peu de programmation de base blocs de construction à l'aide de zéro.
>> Donc, nous allons jeter un oeil à certains de ces blocs de construction
qui composent un programme.
La première est l'expression booléenne.
Les expressions booléennes sont ceux et 0 de ou tout ce qui a
deux valeurs possibles.
Dans ce cas, vrai ou faux, allumé ou éteint, et oui ou non.
Un exemple d'une simple, très simple, programme qui utilise un booléen
expression ici.
>> Donc, pour les expressions booléennes à être utile, nous avons des opérateurs booléens.
Ce sont des opérateurs qui peuvent être utilisés de comparer certaines valeurs.
Alors que nous avons et ou non égal à, moins supérieur ou égal à, supérieur ou
égale à, et moins de ou supérieure.
Mais ces opérateurs ne sont pas très utiles si nous pouvons les combiner en
conditions.
>> Alors vous avez peut rappeler à partir de zéro et à partir de votre p définit que nous
eu conditions.
Ils sont, pour l'essentiel, comme des fourches la logique de votre programme
exécute selon que une condition est remplie.
Donc l'une des conditions que nous avions utilisé de nombreuses fois dans ce cours est le
if, else, si les conditions, et d'autre.
>> Voici un exemple de la façon dont vous pourriez l'utiliser.
Est-ce que quelqu'un sait la différence entre simplement en utilisant if tous
la descente vers if, else, si, et d'autre combiné?
Oui?
>> PUBLIC: [inaudible].
>> INTERLOCUTEUR 1: Exactement.
Donc, si je devais si tout le chemin jusqu'à ce Ainsi, même si cette condition revient
vrai, il va encore continuer tester les deux suivants.
Considérant que, dans un autre-si, un autre déclaration, si l'on retourne la valeur true,
les autres ne sont pas testés.
Vous avez des questions à ce sujet?
Cool.
>> Donc, vous utilisez un autre si-d'un autre déclaration si vous savez qu'il ne peut
être un de ces cas.
Donc, nous savons si x est inférieur à 0, il est certainement ne va pas être
supérieur à 0.
>> Ensuite, un autre bloc de construction que nous sommes appris boucles.
Nous avons trois types de boucles.
Pour les boucles, les boucles while, et faire des boucles while.
Et généralement, quand vous vous asseyez à écrire quelque chose, vous devez décider
lequel des trois vous souhaitez utiliser.
Alors, comment pouvons-nous décider lequel?
>> Nous utilisons généralement une boucle for si nous savons combien de fois nous voulons parcourir
par quelque chose ou combien de fois nous voulons effectuer une tâche.
Nous utilisons while si nous avons besoin de état d'être fidèle à continuer à courir.
Et nous utilisons le faire tout en étant très similaire à temps, mais nous voulons que notre code fonctionne à
moins une fois.
>> Donc, ne tout, tout ce qui est dans le do volonté toujours exécuter au moins une fois.
Considérant que, avec le temps, il peut ne pas fonctionner du tout si l'
condition n'est pas satisfaite.
Toute question qui?
>> Donc, la structure d'une boucle for.
Les gars, vous avez tous vu cela.
Vous l'initialiser.
Vous avez une sorte de condition.
Ainsi, par exemple, nous pourrions initialiser que pour i est égal à 0.
i est inférieur à 10.
Et i + +.
Très simple que nous avons fait.
>> Pour une boucle while, de même, vous avez d'avoir une sorte de l'initialisation,
une sorte de condition, et une sorte de mise à jour.
Ainsi, nous pouvons mettre en œuvre notre boucle aussi comme une boucle lors de l'utilisation.
Et de même avec une boucle Do While, nous pourrions avoir une initialisation,
exécuter quelque chose, le mettre à jour, et alors vérifier l'état.
>> Alors maintenant fonctions.
Nous mettons tout ensemble.
Nous pourrions écrire un peu type de fonction.
Fonction commune que vous pourriez ont vu est déjà principal.
Principale est une fonction.
Il a un type de retour, int.
Il a un nom de fonction, principal.
Et il a des arguments, argc et argv.
Alors principal est juste une fonction.
>> Autres fonctions que vous pourriez avoir utilisées, printf - printf est une fonction -
GetInt, toupper.
Mais ceux-ci se sont fait mis en œuvre pour nous par
une sorte de bibliothèque.
Si vous les gars me souviens notamment cette bibliothèque CS50.h ou l'
bibliothèque standard d'E / S.
Oui, la question?
>> PUBLIC: Est principale juste inhérent à c?
Est-il juste un peu de [inaudible]?
>> INTERLOCUTEUR 1: La question est de si principal est inhérent à c.
Et oui, toutes les fonctions avoir une fonction principale.
C'est une sorte de nécessaire pour l'ordinateur à savoir par où commencer
l'exécution du code.
>> PUBLIC: Donc, vous ne serait pas [inaudible]?
>> INTERLOCUTEUR 1: No.
D'autres questions?
Cool.
Donc, comme vous pouvez utiliser une fonction C'est écrit pour vous, vous pouvez également
écrire votre propre fonction.
C'est une fonction que quelqu'un pourrait ont écrit pour calculer le volume
d'un q, par exemple.
Il ya un type de retour ici, dans ce cas int, notre nom de la fonction q et notre
liste des paramètres.
>> Et notez que vous devez écrire les données type de paramètre que vous voulez
utiliser ou bien la fonction n'est pas savoir quel genre de
paramètre devrais-je accepter.
Donc, dans ce cas, nous voulons un entier comme notre contribution.
Alors, pourquoi aurions nous voulons utiliser les fonctions?
>> Tout d'abord, une grande pour l'organisation.
Ils aident à briser votre code en plus de morceaux organisé et faire
plus facile à lire.
Simplification.
C'est bon pour la conception.
Lorsque vous lisez un morceau de code et la fonction principale est vraiment,
très long, il pourrait être plus difficile à raisonner sur ce qui se passe.
Donc, si vous le décomposer en fonctions, il pourrait être plus facile à lire.
Et la réutilisation des capacités.
Si vous avez un morceau de code qui est d'être appelé ou exécuté plusieurs fois,
au lieu de réécrire ce code 10 fois dans votre fonction principale, vous pourriez
vouloir réutiliser.
Et puis à chaque fois que vous devez utiliser morceau de code, appeler la fonction.
>> Alors maintenant, si nous nous souvenons de retour à zéro, nous avons également parlé de quelques concepts,
dont l'un est Threading.
Le fil est le concept de multiples séquences de code
exécuter en même temps.
Donc penser à un jour où David avait vous les gars Comptez le nombre de
personnes dans la salle.
>> Essentiellement, ce qui se passait sur est tout de vous les gars étaient
l'exécution des threads séparés.
Et ces fils venaient ensemble pour obtenir une sorte de réponse.
De même, dans Scratch, quand vous avez plusieurs sprites, vous pourriez
avoir un chat et un chien.
Et ils seraient simultanément la gestion de leurs propres scripts.
C'est un exemple de filetage.
>> Et l'autre concept qui était introduit en zéro était événements.
Et les événements sont lorsque plusieurs parties du le code de communiquer les uns avec les autres.
Dans Scratch, c'est à ce moment que vous avez utilisé l' diffuser le contrôle et la Lorsque je
Recevoir des blocs.
>> Et aussi, dans le problème Set 4, nous avons vu un peu d'événements ainsi.
Les gars, vous pourriez avoir utilisé la bibliothèque Gevent.
Et il y avait une fonction waitForClick dans lequel vous attendiez
pour l'utilisateur de cliquer.
Et votre clic, dans ce cas, serait l'événement et attendre pour cliquer est votre
gestionnaire d'événements.
>> Et aussi, tout au long de l'exécution de vos psets et de travailler sur vos psets, vous
auraient pu entrer en contact avec certaines de ces commandes.
C'est ce que vous avez tapé dans votre fenêtre de terminal ou tout autre fenêtre
qui montre sur votre g modifier à, essentiellement, naviguer dans votre ordinateur.
>> Ainsi, par exemple, indique le LS contenu d'un répertoire.
Faire répertoire crée un nouveau dossier.
CD, changement de répertoire.
RM, supprimer, supprimer un fichier, ou un répertoire.
Et puis supprimer le répertoire supprime un répertoire.
>> PUBLIC: [inaudible]?
>> INTERLOCUTEUR 1: Ouais, bien sûr.
Désolé, la question était de savoir si vous suggère de mettre ce
sur la feuille de triche.
Il pourrait aider.
Si vous avez de la place, vous pouvez le mettre sur.
Il est également juste en général assez bon à retenir, car lorsque vous l'utilisez
vous voudrez peut-être juste faites-le en mémoire.
Ça vous rendre la vie beaucoup plus facile.
Ai-je répondu à votre question?
>> Alors maintenant, nous avons parlé un peu brièvement sur les bibliothèques.
Mais les deux principaux que nous avons été utilisant la mesure dans le cadre sont
I / O et CS50 standard.
Quel genre de choses sont inclus dans la bibliothèque standard E / S?
>> Oui, jusqu'à présent, nous avons utilisé printf.
En CS50, nous avons utilisé GetInt et GetString.
Et la chaîne de type de données arrive aussi être déclarés dans cette bibliothèque de CS50.
Nous parlerons un peu plus en profondeur sur comment les bibliothèques fonctionnent et comment ils
interagir avec le reste de votre code.
Mais ce sont les deux principaux que nous avoir été en contact avec la mesure dans
cours.
>> Types.
Ce sont de bonnes à rappeler combien chaque type est représenté par ou comment
nombre d'octets de chaque type requiert -
int, 4 octets; char, 1 octet.
Flotteur est de 4 octets.
Quelle est double?
>> PUBLIC: [inaudible].
>> INTERLOCUTEUR 1: Ouais, un flotteur mais doubler la taille.
Qu'en est-il de temps?
>> PUBLIC: [inaudible].
>> INTERLOCUTEUR 1: OK.
Qu'est-ce qu'un temps?
>> PUBLIC: [inaudible].
>> INTERLOCUTEUR 1: Ouais, doubler un int.
Oui.
>> PUBLIC: [inaudible].
>> INTERLOCUTEUR 1: Long [inaudible].
Et puis un long long est double.
>> PUBLIC: Non, non.
Une longue est juste un int.
Il dépend de l'architecture avant la [inaudible]
int et ont la même taille.
[Inaudible].
>> INTERLOCUTEUR 1: Alors une longue et un int sont les mêmes.
Et puis un long long est le double de la int.
Cool.
Et puis, ce qui est le dernier type?
>> PUBLIC: Pointeur.
>> INTERLOCUTEUR 1: Ouais, donc nous avons appris un peu de pointeurs.
Et indépendamment de ce qu'est un pointeur montrant - ce pourrait être une étoile char
ou un int étoiles -
c'est toujours 4 octets pour un pointeur.
Questions à ce sujet?
Oui?
>> PUBLIC: [inaudible]?
>> INTERLOCUTEUR 1: Alors un long et un int sont même dans cet appareil de CS50.
>> PUBLIC: L'appareil est complètement interchangeable.
>> INTERLOCUTEUR 1: Ouais.
Alors un long long est le double int.
>> PUBLIC: Il s'agit de la 32 bits?
>> INTERLOCUTEUR 1: 32 bits, ouais.
>> PUBLIC: Donc [inaudible]?
>> INTERLOCUTEUR 1: Oui, si ce n'est pas dites explicitement, vous
devrait assumer un peu 32.
>> PUBLIC: Il dirait quelque chose comme l'hypothèse d'une
l'architecture comme l'appareil.
Pour 64 bits, les seules choses qui changement sont longs et les pointeurs.
Ils ont tous deux [inaudible].
>> INTERLOCUTEUR 1: Oui?
>> PUBLIC: question.
Ainsi, sur l'un des questionnaires de pratique, il pose des questions sur un unsigned int.
Alors, comment cela serait-il déterminé d'un int [inaudible]?
>> INTERLOCUTEUR 1: Un non signé en est également de 4 octets.
Mais ce qui est différent d'une signature int et unsigned int?
>> PUBLIC: [inaudible].
>> INTERLOCUTEUR 1: Droite.
On peut représenter les valeurs négatives.
Mais comment fait-elle cela?
>> PUBLIC: [inaudible].
>> INTERLOCUTEUR 1: Ouais, il enregistre une bit pour représenter le signe.
La signature a un peu qui représente le signe.
Et non signé est juste tous positifs.
>> PUBLIC: OK.
Donc, vous dites que c'est une double deux fois la taille d'un flotteur?
>> INTERLOCUTEUR 1: Double est deux fois la taille d'un flotteur, oui.
>> PUBLIC: Comment fonctionne un pointeur pour un long long [inaudible]?
>> INTERLOCUTEUR 1: Donc la question est de savoir comment ne le pointeur sur un long long -
comment est-ce que quatre octets un long long de ses 8 octets.
Alors, n'oubliez pas ce qui est un pointeur, essentiellement, à la valeur de base très.
>> PUBLIC: [inaudible].
>> INTERLOCUTEUR 1: Ouais, donc un pointeur est tout simplement un emplacement de mémoire.
Donc, il n'a pas d'importance combien d'espace ce pointeur pointe.
Il suffit de 4 octets à suivre de cet emplacement de mémoire.
D'autres questions?
Cool.
>> Ainsi, la dernière chose que j'ai est la sortie standard.
Vous devez les utiliser fréquemment assez que vous vous souvenez.
Mais c'est à ce moment que nous utilisons printf, par exemple.
Et nous avons ces espaces réservés ont été appelés codes de format.
>> Donc pour cent c char, pour cent i pour int, et nous pouvons aussi utiliser pour cent d.
C'est la même chose.
Mais, en général, dans CS50 nous essayer d'utiliser pour cent i.
F pour cent pour flotteur.
Pour cent ld pour long long et pour cent s pour une chaîne.
>> De même, nous avons utilisé un peu de ces séquences d'échappement.
Par exemple, la barre oblique inverse n pour une nouvelle ligne.
C'est juste pour quand vous mettez en forme votre code pour l'impression f.
Oui?
>> PUBLIC: Quel est pour cent d pour?
>> INTERLOCUTEUR 1: Donc la question est ce qui est pour cent d pour?
Pour cent d est pour ints.
Pour cent pour cent d et i sont les mêmes.
>> PUBLIC: Quelle est la différence entre barre oblique inverse n et barre oblique inverse r?
>> INTERLOCUTEUR 1: Donc la question est quelle est la différence entre la réaction et n
jeu r?
Je pense que la barre oblique inverse est r -
>> PUBLIC: r Alors barre oblique inverse implique seulement revient au début de la ligne
sans aller à une nouvelle ligne.
Donc, si vous imprimez une barre oblique inverse et vous r revenir au début de la ligne
alors vous imprimez plus de choses, vous écrasez le truc qui est déjà sur
[Inaudible].
Va considérant que, n en fait à une nouvelle ligne et va à [inaudible].
>> INTERLOCUTEUR 1: Eh bien, d'autres questions?
Très bien.
Je vais le remettre à un Dan, qui va se poursuivre.
>> [Applaudissements]
>> DAN: Tout droitier.
Donc, je vais vous parler d'un autre grand éventail d'idées de la classe qui sont
à peu près représentatif de deux semaines et le début de trois semaines à partir de
avec la coulée, qui est juste une façon de traitement d'une valeur d'un certain type que
une valeur d'un type différent.
Donc, nous pouvons le faire avec les caractères à ints, flotteurs à ints, et
long long de doubler.
>> Toutes ces choses peuvent être utilisés comme moyens de traitement d'une certaine valeur numérique
moins char comme un autre valeur numérique.
Donc, il ya quelques problèmes avec cela, Bien sûr, ce qui arrive quand vous lancez
des choses comme flotteur à ints.
Donc, c'est un peu bizarre.
Nous avons un flotteur qui est de 1,31.
Nous multiplions par 10 000.
Et puis nous imprimons comme un int.
Qu'est-ce que cette sortie?
10.000 fois 1,31.
Donc, 13 000, c'est que la proposition?
>> PUBLIC: Je pense que c'est 10 000.
>> DAN: Je suis le multipliant par 10 000 avant je moulant.
>> PUBLIC: Oh.
Ne serait-il y avoir un 9 et certains numéros 0?
>> DAN: vous pourriez avoir quelques chiffres étranges.
Alors bon, c'est 1,3 fois 10.000.
Donc, c'est 13 000.
Et ce supplément étrange -
>> PUBLIC: 13100.
>> DAN: 13100.
Merci, Rob.
Et cette étrangeté supplémentaire -
ce 9,9 -
tout simplement parce que ce casting fini arrondi vers le bas où
il ne devrait pas avoir.
Ouais.
>> AUDIENCE: Le casting se passe après quoi d'autre?
>> DAN: Donc, parce que j'ai ce dans la presse, il fait cette multiplication avant d'
fait ce casting.
>> PUBLIC: [inaudible].
>> DAN: Je pense que ce serait jeter les premiers, ouais, ce qui serait de 10.000.
Autre chose?
Cool.
Donc, c'est 13 099.
Pourquoi cela se produit?
Imprécision.
>> Flotteurs ne sont pas parfaits.
Ils ne peuvent représenter des nombres à un certain nombre de chiffres significatifs.
Donc, si nous imprimons 8 signatures figues ce flotteur, on obtient une sorte de
laid nombre consultant.
Et c'est parce que 1.31 ne peut pas précisément être représenté par simple
des puissances de deux dans la machine.
Donc, il finit par prendre le plus proche deviner, qui finit par
étant un peu faible.
Donner un sens?
OK.
>> Maintenant, commutation sont une autre façon de faire des déclarations conditionnelles où tous
nous nous soucions est une variable unique.
Donc, dans cet exemple particulier, nous sommes obtenir un nombre entier de l'utilisateur.
Et puis nous cherchons à ce qui est entier.
Vraisemblablement, c'est le numéro entre un et quatre.
C'est ce que nous demandons.
>> Donc, vous faites un commutateur de le nom de la variable.
Ensuite, vous configurez les cas de possible valeurs qu'elle pourrait l'être.
Donc affaire, un dire qu'il est faible.
Et puis vous cassez sortir de l'état de commutation de sorte
vous ne gardez pas aller.
>> Dans le cas suivant -
donc deux cas et cas de trois -
si c'est le cas deux il tombe juste en bas de la première ligne de code qu'il considère comme avec
Troisième cas jusqu'à ce qu'il voit une pause.
Donc, la raison pour laquelle vous obtenez un cas de seule impression faible parce que je
avoir cette pause ici.
Si moi, par exemple, ignoré cette rupture - si je jetai cette échappée -
il imprimer bas, et il serait imprimer milieu, et il allait se briser.
>> Donc, les pauses sont une partie importante de changer les conditions et
ils devraient être là.
Tous les cas qui ne sont pas explicitement sont traitées par le défaut
cas dans l'interrupteur et doit être jeté.
>> PUBLIC: Donc 1, 2, 3, et 4 serait n?
>> DAN: Les valeurs qui peuvent être n.
Oui.
Ouais?
>> PUBLIC: Alors, quand vous avez que [inaudible]?
>> DAN: Vous souhaitez imprimer bas, puis il imprimer milieu, et
il allait se briser.
>> PUBLIC: Pourquoi serait-il imprimer milieu si [inaudible]?
>> DAN: Alors tout sous un cas avant une pause relève.
Donc cas une impression est le cas sous un que c'est cette copie suivante.
Ouais?
>> PUBLIC: [inaudible]?
>> DAN: Donc, ce nombre est juste un particulier valeur de cette variable
peut prendre, non?
Cela fait-il sens?
Ouais.
>> PUBLIC: [inaudible]?
>> DAN: Oui, deux cas serait imprimer milieu, puis se briser.
>> PUBLIC: [inaudible]?
>> DAN: Je pense que tout?
Quels sont les autres types de données pouvez-vous basculer?
>> PUBLIC: Vous pouvez changer sur n'importe quel type de données.
Mais cela signifie que tout ce qui dépasse caractères et ints et des trucs comme ça, parce que
si vous êtes de commutation sur un pointeur qui n'a pas vraiment de sens,
commutation des charges, s'il laissait même de vous faites cela, en raison de virgule flottante
de précision, vous ne seriez pas vraiment envie de faire cela de toute façon.
Donc, à peu près, ints juste et caractères et des trucs comme ça.
>> DAN: Ouais, c'est quand vous avez explicite valeurs que vous connaissez, je pense, peuvent être
que le passage est réellement utile.
Bon?
OK.
>> Scope est la plage qui a déclaré variables s'étend.
Donc, dans ce petit morceau de code que j'ai, il serait plein d'erreurs.
Et la raison est que je déclare ce int i dans la portée de cette boucle.
Et puis je suis en train de faire référence à ce i l'extérieur de cette boucle portée.
>> Donc, fondamentalement, vous pouvez penser à portée que tout ce que vous déclarez
avec à l'intérieur un jeu d'accolades ne existe au sein de ces accolades.
Et si vous essayez d'utiliser cette variable en dehors de ces accolades, vous aurez
obtenez une erreur du compilateur.
Ouais?
>> PUBLIC: Donc celui-ci ne fonctionne pas?
>> DAN: Cela ne fonctionne pas, oui.
Strings.
Chaîne char *.
Ils sont exactement les mêmes.
Ils ne sont que des pointeurs vers des personnages.
Et toutes les chaînes que vous avez doivent se terminer avec barre oblique inverse zéro, ce qui est juste
une convention de c.
>> Il est appelé le terminateur NULL.
Et NULL -
N majuscule, capitale U, le capital L, L majuscule -
n'est pas le même que l' Terminateur NULL.
Il s'agit d'un pointeur.
Il s'agit d'un caractère.
Ils sont très distinctes.
Rappelez-vous il.
Il sera sur le quiz, probablement.
Je n'ai pas vu le quiz.
Ouais?
>> PUBLIC: Donc NULL est, par exemple, le pointeur?
>> DAN: Oui.
>> PUBLIC: Qu'est-ce que [inaudible]?
>> DAN: Si, par exemple, malloc est appelé lorsque vous ne pas avoir suffisamment de mémoire pour obtenir
quelle que soit la taille que vous demandez, malloc retourne NULL.
C'est, en gros, chaque fois qu'une fonction est censé retourner un pointeur, vous
besoin de vérifier une valeur NULL parce NULL est une assez bonne -
c'est, en quelque sorte, la valeur des ordures.
C'est un zéro en ce qui concerne les pointeurs vont.
>> Chaque fois que vous appelez une fonction, qui renvoie un pointeur.
Vous allez vouloir vérifier pour être vous que ce pointeur n'est pas NULL
parce que NULL est très commun.
C'est en quelque sorte d'un retour des ordures.
Donc, si quelque chose ne va pas droit, il suffit de retourner la valeur NULL à la place.
>> PUBLIC: [inaudible]?
>> DAN: Oui, et c'est ce.
>> PUBLIC: [inaudible]?
>> DAN: Sort comme cela.
C'est le terminateur NULL.
Il est en minuscules N-U-L-L si vous l'épeler.
>> PUBLIC: Et je suis juste allé dos et testé.
Et si vous essayez de mettre une virgule flottante valeur dans un commutateur, il va crier à vous
dire, déclaration nécessite expression de type entier.
>> DAN: Il vous allez.
Mais oui, quelle était la question?
>> PUBLIC: [inaudible]?
>> DAN: Donc capitale N, U majuscule, le capital L, L majuscule est une chose c réelle.
Il est le pointeur NULL et la volonté seulement être traitée comme telle.
Vous ne serez jamais essayer de préciser la Caractère NULL et voir tout
autre manière que cela.
Ouais?
>> PUBLIC: Donc retour à char max ou quelque chose dans les notes, ne serait-il
incarner la même fonction comme [inaudible]?
>> PUBLIC: Alors parlez-vous retour caractères max de getchar, ou
quoi que ce soit?
>> PUBLIC: Ouais.
>> PUBLIC: Ouais, si le général terme de toutes ces choses
sont des valeurs sentinelles.
Donc, comme le retour int max de GetInt et caractères max de getchar, c'est
censé être comme, tout droit, si ces choses sont de retour à nous,
quelque chose s'est mal passé.
>> Pour les pointeurs, nous justement des cette valeur de sentinelle que tout le monde
accord sur.
Et c'est la chose que vous revenez quand les choses vont mal.
Donc caractères max est ce que nous utilisons de représenter quelque chose
comme NULL ou getchar.
>> PUBLIC: Donc, si vous getchar tester, pourriez-vous mettre NULL?
Cela ferait une différence?
>> DAN: Vous ne pourriez pas simplement vérifier NULL.
Il faudrait vérifier caractères maximum parce que le La valeur de retour de la fonction est
un caractère qui n'est pas un pointeur.
Ouais?
>> PUBLIC: Cette question demande pour la longueur de chaîne.
Est-ce que comprennent le caractère NULL?
>> DAN: Non
Et c'est effectivement la façon dont la longueur de chaîne sait d'arrêter car il passe par
votre tableau de caractères jusqu'à ce que il voit un caractère NULL.
Et puis c'est comme tout Bon, je suis fait.
>> PUBLIC: [inaudible] cinq?
>> DAN: Bonjour serait de cinq ans.
Yep.
Donc, les tableaux sont en continu des blocs de mémoire.
Ils ont un accès instantané en disant que le le nom du tableau, puis, dans bouclés
accolades, quel que soit l'indice que vous voulez aller pour, ils sont indexés à partir de zéro à
la longueur de la matrice moins 1.
>> Et elles ont été déclarées par le type de chose que vous stockez dans la
tableau, le nom du tableau, puis quelle que soit la taille de ce tableau.
Donc, c'est un tableau de caractères de longueur qui a six de ces valeurs.
Ouais?
>> PUBLIC: [inaudible]?
>> DAN: Ouais.
>> PUBLIC: [inaudible]?
>> DAN: Si vous avez ce qui se passe dans le tableau déjà fait.
Ainsi, vous pouvez spécifier cette place que, dire, char, quel que soit le nom de votre
tableau est, entre parenthèses vides est égal bouclés entretoise H virgule E virgule L virgule L virgule
Caractère O virgule NULL et accolade.
Ce serait aussi fonctionner comme une déclaration.
>> PUBLIC: [inaudible]?
>> DAN: Ensuite, vous devez avoir la taille déjà fait.
>> PUBLIC: [inaudible]?
>> DAN: Oui.
Tout droitier.
arguments de ligne de commande sont un moyen de l'obtention entrée de l'utilisateur en tant que
arguments principale.
Principal prend deux arguments.
Le nombre d'arguments qui est en cours passé le long de la ligne de commande et un
vecteur de chaîne ou un tableau de chaînes de tous les arguments.
>> Donc, si je, par exemple, appelé une fonction telle que Un point sur une espace, l'espace 2, trois,
argc serait 4.
Et le argv 0 serait un point sur.
Argv1 serait 1.
argv2 serait 2. argv3 serait 3, dans ce cas particulier.
Ouais?
>> PUBLIC: [inaudible]?
>> DAN: Le dernier élément du tableau car le tableau est argc de longueur plus
l'un des ARGB, le dernier élément est le pointeur NULL.
Il est argc plus 1.
Ainsi, dans le cas que je viens de dire, il serait argv 0 est un point sur.
argv 1 est 1. argv2 est 2. argv 3 est 3.
argv 4, qui est une plus grande que argc serait NULL.
>> Et c'est le pointeur NULL.
Oui.
Et c'est parce que la chaîne est une étoile de char est un pointeur.
Ainsi, il doit être du même type.
Ouais?
>> PUBLIC: Deux questions.
Donc un, quelle est la différence entre ce et GetString autre d'un type
dans le moteur d'utilisateur?
Et de deux, il est stocké dans votre mémoire récente?
Donc, comme, GetString serait être [inaudible]?
>> DAN: Où est-il stocké?
Je ne sais pas où il est stocké.
>> PUBLIC: Donc, en fait, vous savez comment tout fonction que vous appelez il ses arguments
sont stockées dans la pile?
Donc argc et argv sont des arguments à principale et ils sont sur la pile, ou vraiment
juste au-dessus ce que vous pensez que le début de la pile.
Ce qui était l'autre partie de la question?
>> PUBLIC: Alors, quel est le [inaudible]?
>> DAN: Ouais, c'est juste une façon différente d'obtenir des entrées de l'utilisateur.
Légèrement plus efficace et de celui-ci il est plus pratique pour les scripts parce que vous
peut juste passer des arguments à votre principal fonction plutôt que d'avoir à attendre
pour les utilisateurs, si vous n'avez pas tous les utilisateurs.
>> PUBLIC: Et oui, obtenir chaînes serait [inaudible].
Il serait stocker les choses dont vous avez besoin.
>> DAN: Ouais?
>> PUBLIC: [inaudible]?
>> DAN: Oui, argv 0 inclut toujours le slash point de l'appel de fonction.
Ouais?
>> PUBLIC: [inaudible]?
>> DAN: Oui, chacun des arguments sont terminé à caractère NULL parce qu'ils
sont des chaînes.
>> PUBLIC: [inaudible]?
>> DAN: Oui, argv argc est un pointeur NULL.
>> PUBLIC: [inaudible]?
>> DAN: Oh oui.
Ouais, désolé.
>> PUBLIC: Donc [inaudible]?
>> DAN: Donc la question est de savoir si vous avez eu l' ligne de commande slash dot un point à 1, 2,
serait le nombre de ligne de commande arguments soient deux ou serait-il trois?
>> PUBLIC: Je pense que ce n'est pas vraiment d'importance.
J'ai tendance à dire, oh, vous n'avez pas à passer les arguments de ligne de commande quand,
évidemment, vous avez appelé la fonction.
J'ai donc tendance à exclure vocalement l' fonction de la ligne de commande
arguments, même si c'est inclus dans argv.
>> DAN: Mais si elle était sur le test -
oui - et aussi si vous dites quelque chose comme égaux argc 3,
vous êtes en position sûre.
Ouais?
>> PUBLIC: [inaudible]?
>> DAN: Je pense que si au lieu d'appeler ce dans argc et argv chaîne supports
mais gardé les mêmes types et juste appelé les quelque chose de différent comme un
et b, serait-il encore travailler?
Et il serait encore travailler, vous le feriez juste -
au lieu d'utiliser argc - vous devriez utiliser a et b.
Ouais?
>> PUBLIC: [inaudible]?
>> DAN: Donc la question est GETSTRING est va stocker la mémoire dans le tas
parce GetString est char *.
Il stocke la mémoire dans le tas, car il invite maintenant malloc dans le réel
mise en oeuvre de GetString.
OK, passer.
>> Sécurité.
Donc, pour être vraiment sûr, vous comptez sur aucune un et vous permettez à personne l'accès à tout
de vos informations, c'est pourquoi chacun construit leurs propres machines,
leurs propres systèmes d'exploitation, tout leur programmes à partir de zéro, et, évidemment,
ne pas se connecter à d'autres machines par l'intermédiaire de l'Internet.
Donc, les ordinateurs ne sont pas sûrs.
Ils sont vraiment.
Nous devons faire confiance à d'autres personnes.
>> Et l'idée de sécurité, c'est que vous êtes tenter de limiter la quantité d'
confiance que vous avez besoin.
Et l'un des moyens que vous faites est par l'intermédiaire de la cryptographie.
La cryptographie est, essentiellement, nous avons secrets.
>> Parfois, nous devons passer nos secrets le long de travers, par exemple, l'Internet ou
d'autres choses.
Et nous ne voulons pas que les gens de connaître ces secrets.
Donc, nous chiffrons nos secrets dans une manière que nous espérons que personne ne peut comprendre.
>> Nous avons donc utilisé -
tout au long de cette classe -
des choses comme César chiffrement et [Inaudible], qui sont à la fois très, très
moyens précaires de chiffrer les choses.
Ils sont faciles à comprendre ce qu'ils sont et quels sont vos secrets sont.
Le monde réel utilise beaucoup plus systèmes de cryptage complexes.
Et nous n'allons pas entrer dans beaucoup plus que cela.
>> Débogage.
GDB est le meilleur.
Je vais insister sur ce nouveau.
Utilisez GDB tout le temps tous les fois que vous avez un problème.
Les commandes qui sont utiles dans GDB sont cassez, que vous passez soit une ligne
numéro, un nom de fonction, essentiellement où dans votre code, vous voulez arrêter,
et être en mesure de prendre le contrôle.
>> Imprimer prend une variable et affiche quelle que soit la variable est à ce
signaler dans votre exécution.
Se déplace Suivant votre exécution le long d'une seule étape.
Et les étapes pas à pas à l'intérieur d'une fonction dans votre exécution.
>> D'autres choses sont gérées, qui est de savoir comment vous avez fait de votre code.
Continuer prend toutes les mesures nécessaires pour obtenir au prochain point de rupture.
Et il ya beaucoup, beaucoup d'autres.
Consultez-les.
Ils sont grands.
Ouais?
>> PUBLIC: [inaudible]?
>> DAN: Oui, ce qui est un débogueur.
Ainsi, un débogueur est un programme qui permet de déboguer votre programme.
Ce n'est pas un programme qui trouve des bugs pour vous, bien que ce serait formidable.
>> Et enfin pour moi, c'est la recherche.
Ainsi, les types de recherche dont nous avons parlé sur dans cette classe sont la recherche linéaire,
qui est exactement ce que vous regardez à travers chaque élément de l'espace de recherche, un
élément à la fois, jusqu'à ce que vous trouver ce que vous cherchez ou jusqu'à ce que vous atteignez
la fin de votre espace de recherche à laquelle point vous dites que vous ne pouviez pas trouver
l'élément que vous recherchez.
Et cela prend au mieux constante de temps, qui est de 0 1 et au pire linéaire
temps, qui est de 0 n.
>> Recherche binaire, qui doit éléments sordides.
Vous allez à la moyenne de vos éléments, voir si l'élément que vous recherchez
est plus grand ou plus petit que l'élément que vous êtes au milieu.
Il lui est plus grand, vous dites que le fond de votre espace de recherche est votre
emplacement actuel, au milieu, et vous redémarrez le processus.
Si elle est plus petite, vous regardez dire que le - ouais, quoi de neuf?
>> PUBLIC: [inaudible]?
>> DAN: Oui.
Toute sorte de tri qui a été enseigné dans la classe est jeu juste pour le test.
>> [Rires]
>> DAN: Et le fait que vous n'avez pas eu de le faire pour un problème posé, il est juste
Jeu pour le test.
>> PUBLIC: Peut-on aller au-dessus comment -
>> DAN: Il sera allé plus.
>> ENCEINTE 2: Le code réel pour [Inaudible] est sur study.cs50.net.
Donc, si vous regardez le problème de la pratique dans la page de tri par fusion de
study.cs50.net, il s'agit du code pour la mise en œuvre tri par fusion.
Donc, vous n'avez pas à mettre en œuvre vous-même ce soir.
Mais assurez-vous de bien comprendre plutôt que de le mémoriser.
>> PUBLIC: [inaudible]?
>> ENCEINTE 2: La page de tri par fusion sur study.cs50.net, il existe une pratique
problème qui, si vous cliquez sur le problème, à la fin il existe un
solution, qui est la fusion la mise en œuvre de tri.
Mais assurez-vous de bien comprendre ce plutôt que de simplement mémoriser
ou en le copiant vers le bas.
>> PUBLIC: Et un parfaitement valable problème pour l'examen serait
quelque chose comme voici une liste.
Qu'est-ce que cette liste ressemble après une étape de sélections sorte ou
tri par insertion ou autre.
Une itération complète de la liste.
Donc, même si vous ne finissent pas par avoir besoin d' code pour elle, vous avez besoin de comprendre
assez pour savoir comment il va à la modification de ce tableau.
>> DAN: C'est tout pour moi.
>> [Applaudissements]
>> LUCAS: Salut tout le monde.
Mon nom est Lucas.
Je vais parler de la récursivité, tous les sortes que nous avons apprises, et une
peu de tous les pointeurs.
OK?
Alors tout d'abord, la récursivité.
Qu'est-ce que cela signifie de dire que une fonction est récursive?
>> PUBLIC: elle appelle.
>> LUCAS: OK, appelle lui-même, oui.
Donc, comme cette image, par exemple.
C'est comme l'image dans d'une image et ainsi de suite.
Ainsi, par exemple, vous pouvez avoir - comme Dan qui parlait de recherche binaire.
Une façon dont la recherche est binaire récursif, c'est le fait que vous êtes
essayer de trouver un certain nombre.
Alors vous allez au milieu.
Et puis vous vérifiez si les numéros là dans la gauche et dans la droite.
>> Et puis si vous trouvez le nombre est va sur la gauche, c'est la même chose
chose que de faire la recherche à nouveau juste à gauche de la liste.
C'est comme ça que ça sonne comme c'est récursif.
Donc, c'est pour cela que vous les gars ont récursive solution pour le tri par fusion.
>> OK, alors voici un exemple.
Alors disons que je veux choisir tous les nombres de 1 à n.
Je peux comprendre que la somme des n nombre est n + n moins 1 à 1.
Mais alors, si je regarde n moins 1 plus n moins 2 plus 1, c'est la même chose
chose que la sommation des nombres à n moins 1.
Donc je peux dire la somme d'une somme égale est égale à n plus la somme de n moins 1.
Cela fait-il sens?
>> Et je voudrais aussi avoir quelque chose d'autre appelé le cas de base, ce qui n'est que
la somme des nombres jusqu'à à zéro serait nulle.
Donc dès que je reçois au nombre zéro, je m'arrête compter.
Cela fait-il sens?
>> Alors, voici un exemple de la façon dont Je peux mettre en oeuvre.
J'ai donc cette fonction dans certains.
Cela prend un entier n.
Donc ici, je vérifie d'abord si n est moins ou égale à zéro.
Donc, si c'est inférieur ou égal à zéro, je retourner zéro, ce qui est notre cas de base.
Sinon, je peux retourner n plus la somme des nombres de
une à n moins un.
Donner un sens?
OK.
>> Alors, voici à quoi il ressemble.
Vous avez somme de 2 égaux 2 ainsi que la somme de 1.
Et certains de 1 est 1 plus le somme de 0, ce qui est égal à 0.
Donner un sens?
Donc, si on regarde la pile de votre programme, c'est à quoi il ressemble.
>> Premièrement, nous avons la fonction principale.
Et puis la fonction principale appelée somme 2.
Et puis somme 2 va dire, oh, somme 2 est égal à 2, plus la somme de un.
J'ajoute donc une somme de 1 sur la pile.
Et la somme de 1 va appeler somme de 0, ce qui va également être ajoutées
à la pile.
Puis chacun de ceux-ci qui sont sur l'autre à revenir
avant les autres peuvent continuer.
>> Ainsi, par exemple, ici, somme de 0, premier, va retourner 0.
Et puis choisissez une somme de 1.
Ensuite, une somme de 1 va revenir à une somme de 2.
Et enfin, la somme de deux va pour revenir à 3 principale.
Cela fait-il sens?
>> Il est vraiment important de comprendre comment la pile fonctionne et essayer de
voir si cela fait sens.
OK, donc le tri.
Alors pourquoi est-tri importante, tout d'abord?
Pourquoi devrions-nous nous en soucier?
N'importe qui?
Donnez-moi un exemple?
Ouais?
>> PUBLIC: [inaudible].
>> LUCAS: Ouais, OK.
Ainsi, vous pouvez effectuer une recherche plus efficace.
C'est un bon moyen.
Ainsi, par exemple, nous avons beaucoup de choses, en fait, dans nos vies que
sont triés.
Par exemple, les dictionnaires.
>> Il est très important d'avoir toutes les mots un peu d'ordre que nous
peut accéder facilement.
Voilà donc ce qu'il disait.
Vous pouvez rechercher de manière plus efficace.
Pensez à la façon dont il serait difficile d'avoir un dictionnaire dans lequel les mots sont en
un ordre aléatoire.
Vous aurez à regarder, à peu près, chaque mot jusqu'à ce que vous trouviez le
mot que vous cherchez.
>> Si vous utilisez Facebook aussi, quand vous cherchez à vos amis, vous êtes
allez voir que Facebook a mis votre ami proche est au-dessus de ceux
que vous ne parlez pas à grand-chose.
Si vous allez tout le chemin vers le bas de votre liste d'amis, vous allez voir
des personnes que vous n'avez probablement pas encore n'oubliez pas que vous êtes amis avec.
Et c'est parce que les sortes Facebook vos amis fondées sur la façon dont
fermez vous êtes pour eux.
>> Ainsi l'organisation des données.
Aussi Pokemon.
Donc, vous voyez que tous les Pokémons avoir des chiffres.
Et c'est comme un simple chemin d'accès aux données.
>> PUBLIC: Accès Pokemon.
>> LUCAS: Ouais.
>> PUBLIC: [inaudible].
>> LUCAS: Ouais.
OK, donc la sélection sorte.
Sélection tri va sélectionner le plus petite valeur d'une liste non triés chaque
temps à chaque itération.
C'est un peu comme le genre que vous faites dans votre tête quand vous essayez de
trier une liste en main.
>> Fondamentalement, il vous suffit de vous regardez pour le plus petit nombre.
Vous le mettez dans la liste triée.
Et puis vous regardez pour la prochain plus petit nombre.
Et puis vous continuez à faire que et ainsi de suite.
>> Donc, la sélection est essentiellement sorte que vous sélectionner à chaque fois la plus petite
valeur non triés.
Mettre à la fin de la trié partie de la liste.
Et continuer à le faire.
Voyons rapidement ce cela ressemble.
Alors, voici la liste triée et liste non triés.
>> Donc, pour le tri de la liste, il est initialement vide.
Et puis je vais sélectionner le plus petit nombre ici, qui est de 2.
Donc, je reçois le numéro 2 et je mets à l'avant de la liste.
Et puis je regarde pour la prochaine petite élément, qui est de 3.
Donc, je l'ai mis à la fin de la liste triée.
Et puis je continue à le faire.
Je trouve 4 et le mettre à la fin.
Trouver 5 et le mettre à la fin.
>> Et regardez comment tous ces moments que Je dis le mettre à la fin est,
essentiellement, en échangeant deux valeurs.
OK?
Et puis le dernier, vous venez avoir un élément de plus.
Donc, il est déjà trié.
>> OK, donc le tri par insertion.
Le tri par insertion, vous allez avoir aussi que chose d'avoir un tri et
une liste non triée.
La seule chose est que chaque fois que vous ajoutez un élément à la liste triée
liste, il vous suffit de choisir l'élément que est en face de la liste non triée.
Et puis vous allez trouver ce que positionner, il devrait être dans la liste triée
partie de la liste.
>> Voyons ce que cela est si cela fait plus de sens.
Donc, d'abord, par exemple, je suis en train insérer le numéro trois dans le
triés partie de la liste.
Ainsi, la liste n'a rien.
Donc, je peux juste mettre le numéro 3.
>> Maintenant, je tiens à ajouter le nombre de 5 à la partie triée de la liste.
Donc je regarde le nombre 5.
Je remarque que c'est plus grand que 3.
Donc, je sais que ce doit être après 3.
Alors, j'ai mis 3 et 5.
>> Ensuite, je veux insérer le numéro 2.
Je remarque que le numéro 2 est en fait durer alors à la fois 3 et 5.
J'ai donc fait de mettre tout le moyen au début de la liste.
Je dois donc, en quelque sorte, passer tous les éléments dans la liste triée afin que je puisse
faire de la place pour le numéro 2.
>> Puis je vois le nombre 6.
Je vois que cela devrait être après 5.
Donc, je l'ai mis là.
Et enfin, je regarde le nombre 4.
Et je remarque qu'il devrait être comprise entre 3 et 5.
Et puis je l'ai mis là et changement tous les autres éléments.
Donner un sens?
>> Bubble Sort.
Alors tri à bulles est essentiellement ce que vous êtes va faire - nous l'appelons bulle
sorte parce que vous passez par la liste - c'est en fait mieux si je montre juste
vous aimez ce -
et vous allez comparer numéros adjacents.
Et vous allez échanger leur positions si elles ne sont pas
dans le bon ordre.
>> Donc, fondamentalement, ce qui se passe à arriver, c'est ici, par exemple,
vous avez 8 et 6.
Vous savez que l'ordre de tri sera effectivement 6 et 5, non?
Donc, vous allez inverser les commandes.
Puis je vois 8 et 4 ici.
Et je fais la même chose.
J'échange nouveau.
Et enfin, 2 et 8.
Je les échanger aussi.
>> C'est ce qu'on appelle Bubble Sort car après chacune de ces itérations, en fait,
le plus grand nombre dans la liste obtient tout le chemin de la fin de la liste.
Cela fait-il sens?
Parce qu'il garde l'échangeant et le déplacer vers la droite.
>> OK, c'est donc la seconde itération.
Ce serait la même chose.
Je vais faire un échange et ensuite la dernière.
Je qu'il n'y a pas de swaps et la liste est triée.
Ainsi, dans Bubble Sort, nous gardons essentiellement en passant par la liste et échange
les choses jusqu'à ce que je remarque que je n'ai pas fait des swaps faisant cette itération, qui
signifie que la liste est déjà trié.
Donner un sens?
>> Parlons un peu sur temps de fonctionnement.
Alors que vous les gars souviens Big O, Omega, et Theta?
Ouais?
OK, ce qui est Big O, tout d'abord?
>> PUBLIC: [inaudible].
>> LUCAS: Ouais, ça s'appelle le pire des cas l'exécution, ce qui signifie simplement que c'est
combien vous vous attendez le programme à prendre afin de fonctionner.
Comme, en termes de -
dans ce cas - n.
Le nombre d'éléments dans l' liste dans le pire des cas.
Comme, dans le cas le plus défavorable possible.
>> Donc pour Bubble Trier, par exemple, Nous avons le grand O n place.
Pourquoi avons-nous cela?
Pourquoi est-bulle Trier Big O n place?
>> PUBLIC: [inaudible].
>> LUCAS: Ouais, donc le pire des cas sera que je vais devoir faire n itérations.
Donc, chacune des itérations va apporter le plus grand élément à la fin
de la liste.
Donc le pire des cas, c'est que j'ai de faire cette chose n fois.
Et pour chacun de ces moments, je dois faire n swaps parce que je dois comparer
chaque fois deux éléments.
Voilà pourquoi il est n carré parce que c'est n fois n.
>> Ensuite, la sélection sorte est également n carré parce que, pour chaque itération, je dois
regarder chaque élément dans la liste.
Et puis trouver le plus petit, ce qui signifie que je dois
regarder à travers n éléments.
Et je dois faire ce que n fois parce Je dois sélectionner tous les n éléments.
>> Un tri par insertion est également n carré parce que le pire des cas sera
être, un, je dois insérer n nombres, non?
Donc, je sais déjà que je vais d'avoir n itérations.
Mais pour chacun de ces chiffres, si j'avais regarder tous les numéros dans
la liste triée et mis tout le chemin à l'avant, ce sera n carré
car il sera n fois n nouveau.
Donner un sens?
Qu'en est-il oméga?
>> PUBLIC: [inaudible].
>> LUCAS: C'est le meilleur des cas.
Donc, c'est comme dans un grand nombre de fois pour le tri, le scénario le plus de cas est
lorsque la liste est déjà trié.
Donc, vous n'avez pas vraiment de faire quelque chose.
Bubble a Trier le meilleur scénario de n.
Avez-vous les gars savent pourquoi?
>> PUBLIC: [inaudible].
>> LUCAS: Ouais, si vous gardez une trace de si ration de données avait des swaps ou
pas, si vous avez quelque chose comme ensemble de vrai si il y avait une itération, si le
liste est déjà trié, essentiellement, ce qui va arriver, c'est que je vais
essayez de permuter chaque deux les éléments adjacents.
Je vais voir ce que il n'y a pas de swaps.
Et je viens de revenir tout de suite.
>> Cela signifie donc que je devais juste parcourir la liste une fois.
C'est donc n parce que je regarde à n éléments.
Pourquoi sélection sorte n carré?
>> Oui, même si la liste est triée, pour chaque itération de la sélection sorte, je
avoir à sélectionner l'élément minimum.
Donc, cela signifie que je dois à sa recherche à tous les éléments de la non triés
la liste et trouver le minimum pour chaque itération.
Cela fait-il sens?
>> Et l'insertion épée est n parce que dans le cas que je suis en train d'insérer la
nombres et tous les chiffres, quand je essayer de les insérer, je vois qu'ils
sont dans la bonne position.
Je n'ai pas à aller voir tous les autres numéros de la liste non triée.
Voilà pourquoi il sera n.
Donner un sens?
Et ce qui est thêta?
>> PUBLIC: [inaudible].
>> LUCAS: Qu'est-ce, désolé?
Dites-le à nouveau.
>> PUBLIC: [inaudible].
>> LUCAS: Exactement.
Donc vous pouvez voir que seule la sélection stockée dans Merge avoir thetas sorte.
Et c'est parce que vous avez seulement thêta si les deux Big O et Omega sont les mêmes.
OK.
Et enfin, le tri par fusion-dire en log n.
>> Et puis, comme Dan a dit, le tri par fusion est un peu comme de la même façon que
vous faites une recherche binaire.
Ainsi, vous obtenez la liste.
Et vous allez couper en deux.
Et puis, vous les coupez dans les petites moitiés.
Et puis, vous les fusionner.
Les gars, vous rappelez-vous que, à droite?
OK, comme il disait.
>> OK, pointeurs.
Donc, ce qui est un pointeur?
>> PUBLIC: [inaudible].
>> LUCAS: Une adresse.
OK.
Je sais que David montre un tas de vidéos de Binky et les choses pointant
de l'autre.
Mais j'aime à penser de pointeurs comme une simple adresse.
Donc, c'est une variable qui va pour stocker une adresse.
>> Donc, c'est juste cette variable spéciale c'est-à quatre octets de long.
Rappelez-vous, ce pointeur à quoi que ce soit est toujours quatre octets de long pour notre 32-bit
machine pour le cas l'appareil.
Et il vient de l'emplacement d'une variable de l'intérieur de celui-ci.
>> OK, donc il ya cette mémoire, essentiellement.
Ainsi, chaque bloc de mémoire a effectivement un étiquette, qui est l'adresse de l'
mémoire slotty.
Donc, cela signifie que je peux avoir un pointeur vers
l'une de ces adresses.
Donc, la raison pour laquelle nous allons utiliser des pointeurs est si je dois me rappeler de l'emplacement
qu 'une grandeur spécifique est une mémoire.
>> Et vous les gars me souviens que l'un de ceux cas était si j'ai une fonction
si j'ai fait vous demander de swap pour reals, j'ai effectivement
avoir à envoyer un pointeur.
Pas la variable.
Avez-vous les gars Rappelez-vous que?
La différence entre -
quel est le nom?
Appel par valeur et appelant par référence, non?
>> OK, ouais.
Alors, appelez en valeur.
Quand vous suffit d'envoyer une variable à la fonction que vous êtes juste envoyer une valeur.
Donc, vous êtes en train d'envoyer une copie de la variable.
Et votre programme s'en fout il si la même variable effectivement
fait une copie.
>> Et appelant par référence signifie que Je suis en fait l'envoi d'une copie de la
pointeur vers cette variable.
Donc, cela signifie que je suis l'envoi de la localisation de cette variable.
Donc sens que j'ai l'emplacement de l' variables, lorsque j'appelle la fonction
avec des pointeurs, je suis en mesure de réellement modifier les données qui étaient en principal.
Donner un sens?
>> Bien que, le pointeur est une copie, la pointeur a toujours l'adresse réelle de
la variable que je veux changer.
Donner un sens?
>> Ainsi, la création des pointeurs.
Rappelez-vous, le pointeur ont toujours le type que c'est pointant
puis à une étoile.
Et puis vous mettez le nom.
Alors, n'oubliez pas que chaque fois que vous avez quelque étoile, c'est comme un pointeur vers
que toute variable tapez que vous aviez.
>> Donc, ici en étoile, par exemple, il est un pointeur et un entier.
Et puis étoiles char est un pointeur étoiles de char et ainsi de suite.
Ouais?
>> PUBLIC: Que faire si nous avons un pointeur de n de star du x.
Je sais que crée un pointeur vers x.
Est-il déclarer également x un nombre entier?
>> LUCAS: OK, donc quand vous dites n star du x, vous n'êtes pas la création d'un pointeur vers une
variable x.
Vous créez un pointeur nommé x.
>> PUBLIC: [inaudible].
>> LUCAS: Alors quand je dis n star du x, je suis dire, hey, dans la mémoire, je vais
obtenir un de ces trois cases.
Et je vais vous dire que ce va être x, qui est
va être un pointeur.
Et quelque chose d'intéressant sur les pointeurs c'est que nous disent qu'ils ont
4 octets pour une machine 32 bits.
Et la raison en est que 4 octets sont 32 bits.
>> Et des machines qui sont 64 bits fait avoir des adresses des pointeurs
qui sont de 64 bits.
Donc, cela signifie juste que la taille de la les adresses dans la machine est différente.
>> Donc, Référencement et déréférencement.
Il ya deux opérateurs Vous devriez vous rappeler.
Le premier est l'esperluette.
La deuxième est la star.
Ne soyez pas confus par cette étoile et ce étoile souvenir parce que, dans
ce cas, vous avez n étoiles.
>> C'est comme toute chose ensemble.
Il n'ya pas d'espace star n.
Donc, cela signifie que c'est le type.
Rappelez-vous que, lorsque vous avez l'étoile variable, vous êtes
parler du type.
>> Lorsque vous venez d'étoile, puis le Nom de la variable, cela signifie que
vous déréférencement du pointeur, qui signifie que vous êtes à la recherche à la
pointeur, trouver l'adresse c'est montrant, d'aller à cette adresse,
et en regardant à chaque fois vous avez là.
Donc, je dis à mes étudiants que lorsque vous avez étoiles, vous devriez penser que c'est
l'abréviation de contenu.
>> Donc si vous avez un pointeur et vous faire pointeur étoiles, c'est la
le contenu du pointeur.
Alors vous allez à ce qu'il pointe vers et regarder le contenu constante.
Et l'esperluette est le même chose que l'adresse du.
>> Donc, si j'ai une variable a - comme, disons dire que j'ai fait un int est égal à 3 -
si je veux trouver l'adresse de ce une mémoire de variables, je ne peux faire
Ampersand a.
C'est donc l'adresse d'un.
Donner un sens?
>> Alors, voici un exemple.
Ce manque int b et c int.
Alors int a est égal à 3 signifie que Je vais aller à la mémoire.
Et je vais trouver un logement et mettre le numéro 3 ici.
>> Et puis int b est égal à 4.
Je vais faire la même chose.
Allez à la mémoire et mettre un certain nombre 4 dans l'une des boîtes.
Et int est égal à 5.
Trouver une autre boîte et mettre un nombre à 5.
>> Alors qu'est-ce cette ligne fait sortir? n étoiles pa égale esperluette un.
Alors tout d'abord, n pa étoiles.
Que fait-il?
>> PUBLIC: [inaudible].
>> LUCAS: Ouais, donc n pa étoiles, d'abord, déclare un pointeur appelé pa.
Et puis il est affectant la valeur de ce pointeur pour être l'adresse d'un.
Donc Ampersand un.
Alors, si je fais pb étoiles, ce qui est un pb de star?
>> Oh, désolé.
Ceci est également absente. n pb étoiles.
Je veux dire pc étoiles.
Je suis tellement désolé.
C'est la même chose.
Mais maintenant je suis bien ar la création d'un pointeur à b et un pointeur vers c.
Ouais?
>> PUBLIC: [inaudible]?
>> LUCAS: Oui.
Donc, si vous allez à la mémoire et vous allez à la boîte qui est indicatif de pa,
vous allez effectivement voir l'adresse d'un.
OK?
Ouais?
>> PUBLIC: [inaudible]?
>> LUCAS: Ouais, pointeur est une adresse.
Ne jamais oublier que.
C'est comme le plus important partie sur les pointeurs.
Il ya le stockage et l'adresse dans une certaine variable.
Autre chose?
D'autres questions?
OK.
>> Donc, et ensembles.
Rappelez-vous que quand je fais int tableau 3, fondamentalement, ce que je fais, c'est que je suis, genre
de, déclarant dans un pointeur.
Alors tableau est un peu comme un pointeur vers un endroit spécifique de la mémoire dans lequel je
alloué trois fentes pour les entiers.
Cela fait-il sens?
>> Alors, quand je ne int tableau 3, ce que je suis faire, au fond, est la création de trois
des fentes dans la mémoire.
Je trouve juste trois emplacements en mémoire.
Donc, si je le fais, alors, un réseau en étoile, il signifie essentiellement le contenu de la matrice,
ce qui signifie que j'efface le pointeur, je vais à cet endroit qu'il pointe vers,
et j'ai mis le numéro un.
>> Et puis, si je fais tableau étoiles plus 1, c'est la même chose que faire ensemble
entre parenthèses, ce qui signifie un peu je vais à la place qui lui est pointé.
Et puis le plus 1 marques me décale d'une position.
Donc, je vais à cette position, en fait, et mettre le numéro deux.
>> Et puis, enfin, quand je fais tableau plus 2, je vais là où
Le pointage au tableau à.
Et puis je passe à des blocs de mémoire.
Et puis j'ai mis le numéro trois ici.
Ouais?
>> PUBLIC: array Donc étoiles est tout simplement dire le tout premier point.
Et vous pouvez ajouter 1, juste parce que nous ne sommes que très
référençant cette première adresse.
>> LUCAS: Ouais.
Pourquoi avons-nous, par exemple, disons tableau 0, tableau 1, et tableau 2?
Je veux dire, pourquoi faites-vous 0, 1, 2, 3 au lieu de 1, 2, 3?
L'une des raisons en est un, ordinateur programmeurs préfèrent commencer
à partir de 0.
Deux, c'est parce que quand vous faites tableau 0, c'est la même chose que faire ensemble
plus de 0, ce qui signifie que je vais à cette position, et je ne
sauter des blocs de mémoire.
Donc, je ne bouge pas de blocs de mémoire.
Ouais?
>> PUBLIC: [inaudible]?
>> LUCAS: Donc elle demande ce qui est la différence entre faire
ce ou faire malloc.
L'une des différences est que int tableau 3 est de créer un
matrice dans la pile.
Et quand je fais malloc, il crée sur le tas.
Cela fait-il sens?
>> Alors, comment ne malloc réellement?
Alors pourquoi avons-nous encore besoin d'utiliser malloc?
Votre compilateur genre de chiffres sur tous les variables que vous avez déclarés.
Et il crée de l'espace pour tous d'entre eux dans la pile.
Alors toutes vos variables vont être quelque part dans la pile.
Voici donc les variables d'environnement.
>> Donc, fondamentalement, un espace pour les variables dans la mémoire est allouée à
compilation.
Donc, cela signifie que votre ordinateur dispose d' Pour connaître toutes les variables
l'avance.
Il n'a pas besoin de savoir quelle est la valeur vous allez mettre dedans.
Mais il a besoin de savoir comment la quantité de mémoire dont vous avez besoin.
>> Mais maintenant, disons que, par exemple, vous créez un tableau ou de prendre un
chaîne que vous prenez à partir de l'utilisateur.
Vous ne savez pas combien de temps la chaîne va être, par exemple.
Donc vous ne savez pas exactement combien blocs de mémoire que vous allouez, non?
>> Donc, il n'a pas vraiment de sens pour vous dites mis 100 caractères.
Et puis si l'utilisateur écrit 150?
Vous allez être vissé.
>> Donc, fondamentalement, vous ne pouvez pas être sûr de la façon dont la quantité de mémoire dont vous avez besoin pour allouer
lorsque vous compilez le programme.
Vous savez juste que le moment de l'exécution.
Donc, c'est pourquoi vous avez le tas.
Ainsi, le tas va avoir de la mémoire que vous allouer au cours de la
durée du programme en cours.
>> Donc, fondamentalement, quand vous faites malloc, ce vous faites de mémoire allouer au
l'exécution, ce qui signifie que vous êtes décider à ce moment précis que vous
devrait avoir cette mémoire.
Donc, c'est quand vous êtes attribution.
Cela fait-il sens?
>> Donc n'oubliez pas, la pile possède des variables qui sont créés sur la compilation.
Et puis le tas possède des variables qui sont créés au fur et à
avec malloc, par exemple.
>> PUBLIC: [inaudible]?
>> LUCAS: Donc GetString est vais appeler malloc.
Permettez-moi de parler de malloc, et Je vais vous expliquer GetString.
Donc malloc est la même chose comme l'allocation de mémoire.
Cela va donc à allouer mémoire sur le tas.
Et il va retourner un pointeur vers où la mémoire a été allouée à.
>> Alors, quand vous faites -
ici par exemple -
n pointeur étoiles.
Et puis pointeur est égale à malloc taille de fois pouces 10.
Je crée un pointeur.
Et puis je attribuer ce pointeur à la valeur du pointeur qui malloc
est de me donner.
>> Je demande donc à malloc pouvez-vous allouer espace pour 10 entiers.
C'est ce qu'il dit.
Et malloc me redonne un pointeur à cet endroit.
Donner un sens?
OK.
Je Et GetString est, fondamentalement, fait un appel à malloc de sorte que vous pouvez allouer
la mémoire lors de l'exécution.
>> Rappelez-vous toujours de vérifier null parce malloc va retourner null
si elle ne peut pas allouer de la mémoire.
Disons que vous demandez un ridicule quantité de mémoire.
Votre ordinateur ne va pas être en mesure d'allouer beaucoup.
>> Donc malloc va juste à retourner null.
Alors n'oubliez pas de vérifier si le pointeur que vous avez obtenu de malloc
nulle ou pas, parce que si c'est le cas, vous pourriez être le déréférencement d'un pointeur et
provoquer des défauts secondaires.
Et enfin, n'oubliez pas votre mémoire libre.
>> Malloc crée la mémoire dans le tas.
Et vous devez libérer la mémoire avant la fin du programme.
OK, c'est tout pour moi.
Désolé, Rob.
Merci.
>> [Applaudissements]
>> LUCAS: Les dernières questions Rob vient avant?
Non?
Ouais?
>> PUBLIC: Je ne vois pas celui-ci en ligne.
Avez-vous téléchargé il encore?
>> LUCAS: Je pense que Dave est Télécharger bientôt.
>> DAVE: Ça va être affiché.
>> LUCAS: Il sera en ligne.
>> PUBLIC: C'est.
>> LUCAS: C'est?
OK.
Ouais?
>> PUBLIC: [inaudible]?
>> LUCAS: Oui, vous devez libérer toutes les qui est mis en mémoire dans le tas.
>> PUBLIC: [inaudible]?
>> LUCAS: Oui.
Chaque fois que vous avez un malloc de la culture, vous devriez avoir une culture libre
après l'arrêt de cette variable.
Donc malloc et free sont toujours ensemble.
Leurs meilleurs amis.
Ouais.
Rob?
>> ROB: Je vais rapidement.
Et aussi la vidéo sera mis en place.
J'ai le micro.
>> OK, donc la semaine de cinq trucs.
La première chose que nous avons est la pile.
Donc, n'oubliez pas qu'il ya une seule pile image par appel de fonction active.
Nous verrons dans un instant.
Et rappelez-vous aussi ce qui se passe réellement dans chaque cadre de pile vont être
les variables locales de nos fonctions, les arguments qui sont passés dans notre
fonctions, avec un couple d'autres choses que vous n'avez pas vraiment
besoin de s'inquiéter.
>> Alors, voici un exemple de programme où, avis, le principal est printfing le retour
valeur de foo 4.
foo va juste retourner le 4 virgule valeur de la barre 6.
Et le bar va mettre un certain locale variable n égal à 4 fois par 6.
Et puis retour n.
>> Examinons donc à la pile à travers l'itération réelle de ce programme.
Donc, il ya le fond de notre pile.
Rappelez-vous que la pile grandit.
Donc, au fond de notre pile, nous avoir un cadre de pile pour principale.
Lorsque le programme démarre, principale va toujours être à la
fond de notre pile.
>> Et ce qui est à l'intérieur de notre frame de pile pour principal?
Ainsi, même si il n'ya pas de locaux variables aux principal, comme je l'ai dit avant,
nous avons argc et RGV prendre de l'espace l'intérieur du cadre de la pile principale.
Alors principale va maintenant appeler la fonction foo.
Et cela signifie que foo va obtenir son propre cadre de pile.
>> Alors maintenant, nous sommes à l'intérieur de la fonction foo.
Et ce qui doit aller dans le cadre de pile de foo?
Eh bien, foo a un argument n.
Et n est égal à 4 puisque c'est ce que principale passe comme argument de foo.
>> Alors maintenant foo va appeler bar.
Qu'est-ce que la barre va avoir à l'intérieur de son «cadre de pile?
Il a x égal à 4 y égal à six.
Ce n'est pas tout ce que nous allons avoir dans le cadre de pile parce bar
a également une variable locale n.
Et n nous allons définir égal à 24.
>> Alors maintenant, la barre va revenir n.
Donc bar revient à 24 la pile cadre foo.
Et parce que la barre est maintenant de retour, que signifie que nous éclater le cadre de pile
pour bar hors de la pile.
Donc, toute la mémoire que la barre avait été l'aide est maintenant de la pile.
>> Maintenant, foo va également pour revenir à 24 principale.
Alors, maintenant que foo est de retour, la mémoire que foo a été utilise dans son '
cadre de pile a également disparu.
Et maintenant, principale va appeler printf.
Donc printf est juste une autre fonction.
Lorsque nous appelons printf, il va être un autre cadre de pile pour le printf
appel de fonction.
>> Que faisons-nous passions printf?
C'est ce qui va se passer sur son cadre de pile.
À tout le moins, nous passons que pour cent i Backslash n et
l'argument 24.
Il pourrait avoir plus de ça cadre pile si printf arrive à être en utilisant une
des variables locales.
Nous ne savons pas.
>> Mais tout ce qui va dans printf de frame de pile.
Il va exécuter le printf.
Puis printf est fait.
Il sera de retour.
Enfin, le principal est fait.
Principale sera de retour.
Et puis notre programme est fait.
Ouais?
>> PUBLIC: Constatez-vous [inaudible]
arguments [inaudible]
paramètres?
>> ROB: Donc, il ya une différence subtile entre les arguments et les paramètres.
Et vraiment, en parler commun, les gens ont tendance juste mélanger tout le temps.
Mais les paramètres sont le formel nommer des choses.
>> Donc argc et argv sont les paramètres à principal.
Les arguments sont ce que vous avez réellement passer comme ces paramètres.
Donc il lorsque j'appelle foo de 4, 4 est l'argument que je suis de passage po
Et le paramètre n, à l'intérieur de foo, prend la valeur 4
depuis le 4 était l'argument.
>> PUBLIC: [inaudible]?
>> ROB: n est une variable locale à la barre.
n est toujours locale à foo, mais c'est un paramètre à foo.
Ce n'est pas une variable locale.
Ouais?
>> PUBLIC: [inaudible]?
>> ROB: foo appelle simplement bar et retour quelles que soient les déclarations de bar.
>> PUBLIC: [inaudible]?
>> ROB: Ouais, juste pour voir multiple trames de pile.
Ouais?
>> PUBLIC: Pourquoi foo appelé avant printf?
>> ROB: Pourquoi foo appelée avant printf?
J'ai donc pu, au contraire, fait quelque chose comme int x est égal foo de 4
puis imprimé x.
Mais au lieu, j'ai combiné la fonction remettre en l'argument de printf.
>> Mais notez que nous ne pouvons pas réellement exécuter l'appel à printf jusqu'à ce que nous
comprendre ce que foo de 4 est.
Donc, nous allons évaluer cela.
Et seulement une fois que c'est fait vont de revenir et d'évaluer cela.
Ouais?
>> PUBLIC: Depuis deux bar [inaudible]
valeur, pourquoi n'avons-nous pas [inaudible]?
>> ROB: Ils doivent être totalement int.
Cela n'a pas été pris sur plusieurs passes.
Donc, il devrait être int bar et int foo puisque les deux personnes
sont de retour entiers.
Void est que si ils ne vont pas pour renvoyer des valeurs réelles.
Ouais?
>> AUDIENCE: Si vous aviez une ligne au-dessus le retour, [inaudible]?
>> ROB: Une ligne au-dessus du rendement?
>> PUBLIC: Ouais.
Comme si vous n'avez printf et [inaudible], serait-il imprimer deux fois?
>> ROB: Donc, à l'intérieur de foo?
Si nous avions un printf ici?
>> PUBLIC: Ouais.
>> ROB: Donc, si nous avions le droit de printf ici, il serait imprimer une fois.
Depuis que nous appelons foo une fois à droite ici, nous allons frapper le printf.
Ensuite, nous appelons bar.
Et puis foo sera de retour.
Et c'est tout.
Nous ne rencontrons jamais printf fois.
Ouais?
>> PUBLIC: [inaudible]
printf, appeler foo parce que nous sommes les premiers appelant printf puis nous passons
les arguments.
>> ROB: Donc, en théorie, n'est pas printf, appeler foo?
Donc pas.
Juste l'ordre que c va exécuter ces choses est, avant que nous puissions
appeler une fonction, tous les arguments à la fonction doivent
être complètement évaluées.
Donc, est-ce complètement évaluée?
Oui, c'est juste une chaîne.
C'est juste une valeur.
>> Ensuite, nous avons complètement évaluer cette question.
Une fois cela fait, tout de ses arguments sont évalués.
Et maintenant, nous pouvons faire la appeler à printf.
Ouais?
>> PUBLIC: Une question.
Si vous avez une fonction de vide, doit vous avez rendement virgule?
>> ROB: Vous ne faites pas une virgule de retour si vous avez une fonction de vide.
OK.
Alors maintenant, des trucs de tas.
Donc tas est de savoir comment nous allons faire face à la gestion dynamique de la mémoire.
Et ce contraste directement avec la comparons que nous appellerions automatique
gestion de la mémoire.
>> Donc, sur la pile, vous n'avez jamais vraiment pour faire face à la façon dont les variables locales
sont poussés et sauté hors tout ces cadres de pile et tout ça.
Vous n'avez pas à vous en préoccuper.
C'est automatique.
Ainsi, le tas est manuel.
Et la [inaudible]
vient de ces fonctions malloc et free.
>> Alors, voici un autre programme.
Tout ce que nous faisons, c'est allouer de un nombre entier.
Nous stocker dans star du x.
Bien sûr, nous devons vérifier pour voir si x est nul.
Ensuite, nous allons simplement mettre ce x pointe vers 50.
Imprimer ce x pointe vers, impression x, puis libre x.
>> Alors, comment est-ce vraiment va chercher si nous regardons notre pile et le tas?
Nous allons donc commencer à nouveau.
Le fond de notre pile comme avant.
Rappelez-vous que toi tas directement s'oppose à la pile?
Donc, nous allons avoir l' haut de notre tas là-haut.
>> Ainsi, le fond de notre pile, nous avons notre cadre de pile pour principale.
Il dispose de l'espace pour argc, argv, et nous ont maintenant une variable locale x, qui
est un int étoiles.
Nous allons donc à parcourir grâce à ce programme.
La première chose que nous avons est un appel à malloc.
>> Nous faisons donc un appel à malloc.
Malloc est une fonction.
Il va y avoir un cadre de pile.
Que faisons-nous passions à malloc?
Cela va aller à l'intérieur du cadre de pile.
Nous passons la taille de n, qui est de 4.
Donc, qui est passé à malloc.
>> Qu'est-ce que malloc faire?
Il nous prend un peu d'espace sur le tas.
Nous allons donc aller au tas.
Et nous allons saisir 4 octets à partir du tas.
Donnons donc juste que une adresse arbitraire.
0x123 Juste prétendent que c'est un adresse qui est sur le tas.
>> Alors, quelle est réellement à l'intérieur de ce région de mémoire à l'adresse Ox123?
Garbage.
Donc, nous n'avons rien stockées.
Pour autant que nous le savons, il pourrait être n'importe quoi.
Vous ne devriez pas supposer que c'est zéro.
Il n'est probablement pas zéro.
>> Rendements Alors maintenant malloc.
Et que faisons-nous lorsque les rendements malloc?
Nous avons mis ce qu'il retourne.
Nous avons mis x égal à ce il est de retour.
Alors qu'est-ce qu'il revient?
Il est 0x123 retour puisque c'est la l'adresse du bloc de mémoire qui est
vient d'allouer dans le tas.
>> Donc revenir 0x123 x va maintenant être mis en égale à 0x123 qui, imagé,
nous attirons souvent que x ayant une réelle flèche pointant vers ce bloc.
Mais x est simplement stocker cette adresse.
Alors maintenant, nous devons vérifier si x est nul.
Ce n'est pas nulle.
Nous prétendons que ce malloc réussi.
>> Alors maintenant, star du x est égal à 50.
Donc étoiles se souvient que cela signifie aller à cette adresse.
Donc 0x123 Nous allons aller à cette adresse.
Donc cela nous amène là-haut.
Que faisons-nous à cette adresse?
Nous stockage 50.
>> Donc, après cette ligne, c'est ce que les choses vont ressembler.
Alors maintenant, il n'est plus ordures là-haut.
Maintenant, nous savons que 50 est dans ce notamment parce adresse
nous mettons à cela.
OK?
Alors maintenant, nous allons imprimer f.
>> Alors d'abord, nous allons imprimer star du x.
Alors, quelle est star du x?
Encore une fois, étoiles x moyens vont à l' chose que x pointe.
Donc x est de stocker 0x123 Go à cela.
Nous obtenons 50.
Donc imprimer f que.
Et cela signifie qu'il va imprimer 50.
Et puis qui retourne.
>> Et puis nous avons le deuxième printf.
Nous sommes maintenant pour cent p.
Si vous ne l'avez pas vu, c'est combien vous imprimez un pointeur.
Nous avons donc pour cent i, pour cent f, et l'ensemble de ceux déjà.
Donc pour cent p, imprimer un pointeur.
>> Alors x est un pointeur.
Donc, si nous allons imprimer x lui-même, nous imprimons ce qui est fait à l'intérieur
x, qui est donc le premier 0x123 f impression va imprimer 50.
La seconde impression f va pour imprimer 0x123 Ouais?
>> PUBLIC: Vous utilisez pour cent x pour imprimer un pointeur?
>> ROB: Alors que vous utilisez pour cent x pour imprimer un pointeur?
Ainsi, vous pouvez, mais pour cent x est juste, généralement, pour que si vous avez une
entier et que vous souhaitez imprimer comme un hexadécimal.
C'est juste la façon dont vous le faites.
>> Considérant que, pour cent d serait imprimer en décimal.
C'est là où nous obtenons pour cent d. i est juste entier.
pour cent p est spécifiquement pour les pointeurs.
>> Alors x est un pointeur.
Nous voulons utiliser pour cent p.
Mais pour cent x pourrait fonctionner.
Ouais?
>> PUBLIC: [inaudible]?
>> ROB: Ouais.
Au moins pour le présent appel - si je ne pas l'inclure ici.
Mais ces deux arguments ne sont pas nécessairement à l'intérieur de ce cadre de pile
ainsi que toutes les variables locales printf arrive à être utiliser.
Et puis le prochain appel à printf maintenant intérieur du cadre de pile printf est
pour cent p oblique n et quel que soit le La valeur de x est, ce qui est 0x123.
Ouais?
>> PUBLIC: [inaudible]?
>> ROB: Il va imprimer quelque chose qui ressemble à ceci.
>> PUBLIC: [inaudible].
>> ROB: elle imprime donc il sous forme d'adresse.
Il ressemble à une adresse.
Ouais?
>> PUBLIC: [inaudible]?
>> ROB: Pourquoi est-ce?
>> PUBLIC: [inaudible]?
>> ROB: Pourquoi est-ce pointeur de 4 octets?
Donc, il ya tout un tas de 0 est en face de cela.
Donc, c'est vraiment 0x0000000123.
Sur un système 64 bits, il y aurait tout un tas de zéros.
Ouais?
>> PUBLIC: [inaudible].
>> ROB: Donc la première printf va imprimer -
>> PUBLIC: [inaudible].
>> ROB: Oui, il va imprimer ce x pointe.
Star dit quelle est cette chose montrant.
Prenez-le.
Alors c'est quoi pointant vers?
50.
Prenez-le.
C'est ce que nous allons imprimer.
Considérant que, la prochaine, nous sommes juste l'impression x lui-même.
Qu'est-ce que l'intérieur de f?
0x123.
OK.
>> Et puis, enfin, nous avons le libre.
Que faisons-nous passer à libérer?
Nous passons x.
Cette fois j'ai effectivement affiché dans le cadre de pile.
>> Nous allons donc passer la valeur 0x123 pour libérer.
Alors maintenant gratuitement le sait, tous les droits, Je dois aller jusqu'à le tas
et sans que la mémoire.
Ce n'est plus l'aide de ce est à l'adresse 0x123.
>> Donc libre va libérer que dans le tas.
Maintenant, notre tas est de nouveau vide.
Nous n'avons pas de fuites de mémoire.
Maintenant libre sera de retour.
Notez que x est toujours 0x123.
Mais c'est maintenant la mémoire n'est pas valide.
Nous ne devrait plus déréférencer x.
Ouais?
>> PUBLIC: Est retourner 0 redondant?
>> ROB: Est RETUREN 0 redondant?
Oui.
Nous avons juste parce qu'il y nous avons un aller-retour pour l'air.
Donc, c'est comme, ouais, permet inclure le retour 0.
Ouais?
>> PUBLIC: [inaudible]?
>> ROB: Donc, après libre x, ce qui se passe si nous essayons de déréférencer le pointeur?
Il est possible que tout se passe bien.
Il est possible que nous obtenons encore 50.
>> Il est possible, également, que cette mémoire est maintenant utilisé pour autre chose.
Il s'agit donc d'un comportement non défini.
Et indéfini signifie quelque chose peut arriver.
Ouais?
>> PUBLIC: [inaudible]?
>> ROB: Non, si vous affectez x à autre chose.
Donc, si nous avons dit ici x est égal à malloc autre chose -
événement de taille malloc -
alors que le bloc d'origine de mémoire n'est pas libérée.
Et nous avons officiellement perdu.
C'est une fuite de mémoire.
Nous avons perdu toutes les références pour ce bloc de mémoire.
Donc, il n'ya aucun moyen que nous pouvons jamais libérer.
OK, donc puis retour 0 signifie fait.
>> Très bien, si débordement pile.
Quelle est l'idée ici?
Donc n'oubliez pas, tas est à la baisse.
Pile est en hausse.
Donc, ce fut l'exemple de conférence, Je pense que, lorsque principale va juste
appeler cette fonction foo, qui va de s'appeler récursivement sur et
encore.
>> Donc empiler cadres vont travailler exactement de la même.
Donc, nous allons commencer avec les principaux que le cadre de pile bas.
Puis principale va appeler foo, qui va obtenir un cadre de pile.
>> Puis foo va appeler foo nouveau, qui va se faire
un autre cadre de la pile.
Et puis encore, et encore, et encore, et encore jusqu'à ce que, finalement, nous courons
dans le tas.
Donc, c'est la façon dont nous obtenons un débordement de pile.
Et à ce stade, vous SEG faute.
Ou vous souhaitez vraiment SEG défaut avant ce point, mais ouais.
>> PUBLIC: Est-core dump l' même comme segment faute?
>> ROB: Vous verrez donc la segmentation noyau de défaut déversés.
Vous obtenez un core dump quand vous SEG faute.
Et c'est comme un dépotoir de tous les contenu de votre mémoire en cours afin
que vous pouvez essayer et identifier pourquoi vous SEG défaut.
Ouais?
>> PUBLIC: [inaudible]?
>> ROB: Donc signifie une erreur de segmentation il ya un débordement de pile.
Donc, pas nécessairement.
Signifie un défaut de segmentation que vous êtes souvenir ému d'une manière
vous ne devriez pas l'être.
Donc, une façon de ce qui se passe, c'est que lorsque vous empilez trop-plein, nous commençons à toucher
mémoire d'une manière que nous ne devrions pas l'être.
Ouais?
>> PUBLIC: [inaudible]?
>> ROB: Donc, à l'intérieur d'une boucle infinie.
Comme, c'est comme une infinie récursive boucle et ainsi nous obtenons une autre
pile encadrer chaque fois.
Mais juste à l'intérieur d'un régulier infini tout en un -
Eh bien, même pas imprimer f -
faire quelque chose.
Peu importe.
>> Nous n'allons pas à obtenir un autre cadre de la pile.
Nous allons juste garder boucle au cours de cette instruction unique.
La pile ne se développe pas.
C'est le fait que chaque récursive appel nous donne un cadre de pile.
C'est pourquoi nous obtenons un débordement de pile.
Ouais?
>> PUBLIC: Donc, si vous dites à obtenir le tout en boucle, puis [inaudible]?
>> ROB: Donc, si à l'intérieur de la boucle while il y avait un printf, vous le feriez encore
pas segmenter faute.
Je ne voulais pas compliquer les choses.
Il serait boucle.
Vous obtiendrez une seule pile encadrer pour la printf.
>> Puis printf reviendrait.
Ensuite, vous feriez encore boucle.
Vous obtiendrez une seule pile encadrer pour la printf.
Il reviendrait.
Seul cadre de pile.
Donc, vous n'obtenez pas cet infini empiler les cadres de pile.
>> PUBLIC: [inaudible]?
>> ROB: Oui.
Donc, ce débordement de pile qui se passe car aucun de ces
appels à foo sont de retour.
Donc, si nous revenons, nous n'aurions commencer à perdre des trames de pile.
Et puis, nous ne serions pas empiler trop-plein.
Et c'est pourquoi vous avez besoin d'un scénario de base pour vos fonctions personnelles.
Ouais?
>> PUBLIC: La taille et le potentiel empiler des tas de même pour
tous les programmes?
>> ROB: Environ.
Est la taille potentielle de la pile et le segment de mémoire de la même pour tous les programmes?
Environ.
Il ya une certaine randomisation où les départs pile et
où le segment de mémoire commence.
S'il vous arrive d'avoir un tas de des variables globales et les choses, vous pourriez
enlever de l'espace pour votre tas.
>> Sur un système 64 bits, vous presque disposer d'une mémoire infinie.
Il ya tellement de choses.
Entre 32 et 64 bits, qui est une différence significative.
>> Vous allez obtenir un ensemble beaucoup plus empiler et de l'espace du segment sur 64 bits
système, car il ya un peu plus adresses qu'ils peuvent utiliser.
Mais sur un système individuel, il sera être à peu près la même quantité d'empilement
et de l'espace du tas.
Très bien.
>> Donc dernière chose est la compilation.
Donc, vous devez savoir ce processus.
Il ya quatre grandes étapes.
Donc, le premier devrait être facile à retenir.
Pré-traitement.
Il a le préfixe de pré dedans.
Donc, il s'agit avant tout le reste.
>> La chose à retenir est le hachage.
Définit donc hachage et hachage comprend dans l'ensemble de ceux-ci.
Ce sont tous pré-processeur directives.
Ce sont les choses que l' pré-processeur prend en charge.
>> Alors qu'est-ce un pré-processeur faire?
C'est une chose vraiment stupide.
Tout ce qu'il est capable de sont tous ces opérations de copie et de couper et coller.
>> Donc hachage comprend norme i0 point h.
Qu'est-ce que faire?
Il est saisissant de la norme i0 point h déposer et de le coller dans le haut
où il est dit hachage comprend norme i0 point h.
>> Et tout hachage définissent que nous avons vu, ce que c'est que faire?
Son copier la valeur que le hachage défini est défini comme et le coller
partout où vous utilisez la valeur.
Ainsi, le préprocesseur vraiment texte simple basé opérations.
Il ne fait rien à puce.
Donc, tout le reste est plus compliqué.
>> Alors, maintenant que le préprocesseur est fait, nous avons en fait la compilation.
Donc, ce qui ne signifie la compilation d'?
Nous allons maintenant partir du code c code d'assemblage.
Ouais?
>> PUBLIC: [inaudible]?
>> ROB: Oui, nous avons pris cela.
Donc la compilation.
Nous allons de c à l'assemblage.
C'est donc un changement de langue réelle.
Compiler soi signifie aller de un langage de haut niveau à
un langage de niveau inférieur.
>> Et c est un langage de haut niveau par rapport à l'assemblage.
Qu'est-ce que le montage?
Ses instructions qui sont, assez beaucoup, fait de votre CPU.
Mais votre ordinateur ne fonctionne toujours pas comprendre ensemble.
Il ne comprend uns et de zéros.
Donc, la prochaine étape est l'assemblage, qui nous amène de ces instructions
votre CPU comprend et fait les traduit, à
les uns et de zéros.
>> Donc C à l'assemblage binaire.
Mais je n'ai pas encore un exécutable.
Alors, pensez à la bibliothèque de CS50.
Nous vous avons fourni un binaire pour CS50 de cette bibliothèque, qui présente GetString
et GetInt et tout ça.
>> Mais la bibliothèque CS50 -
en elle-même - n'est pas exécutable.
Il n'a pas une fonction principale.
C'est juste un tas de binaire que vous pouvez utiliser.
Donc liaison est de savoir comment nous rassemblons tous de ces différents fichiers binaires
dans un fichier exécutable réelle.
Celui que vous pouvez taper point slash un point sur.
>> Donc, c'est comme le fichier que vous écrit, - quel que soit votre programme est -
Ceaser point c.
Mais maintenant, il a été compilé jusqu'à binaire.
Donc Ceaser point o.
Et ce sont nos bibliothèques CS50 binaire.
Et ils être combinés en un seul exécutable.
Ouais?
>> PUBLIC: [inaudible]?
>> ROB: Alors d'abord comprendre, se souvenir, le hachage comprend en fait une
pré-processeur étape.
Mais ce n'est séparée.
Si vous n'utilisez pas les fonctions que sont en dehors de votre fichier unique puis,
non, vous n'avez pas besoin de lier tout puisque vous avez tout.
>> Cela dit, printf est liée po
Si jamais vous utilisez printf, c'est quelque chose qui doit être lié à
parce que vous n'avez pas écrit cela.
Et, de fait, est automatiquement printf lié po
Vous savez à la ligne de commande ou lorsque vous tapez faire, vous voir encore
tiret l CS50, qui a lien dans la bibliothèque de CS50?
Printf, et des trucs comme ça, va à lier automatiquement.
D'autres questions sur quoi que ce soit?
>> PUBLIC: [inaudible]?
>> ROB: Lier?
Nous avons tout un tas de différents fichiers binaires.
C'est l'exemple canonique que nous utilisons est une bibliothèque de CS50.
Nous avons compilé et qui vous est donné le binaire pour cette bibliothèque de CS50.
>> Vous souhaitez utiliser GetString dans votre programme.
Alors vous allez utiliser GetString.
Mais sans mon code binaire pour GetString, lorsque vous compilez votre code
vers le bas, vous ne pouvez pas réellement fonctionner votre programme parce GetString String est
pas encore complètement défini.
>> C'est seulement lorsque vous liez à ma binaire qui contient GetString que maintenant, tout
droite, je peux effectivement exécuter GetString.
Mon dossier est complet.
Et je peux exécuter ce.
Ouais?
>> PUBLIC: Ne reliant convertir le binaire exécutable à?
Donc, même si vous n'avez pas d'autres bibliothèques, ça ne serait pas encore
nécessaire de traduire la [inaudible]?
>> ROB: Donc un exécutable est encore en binaire.
C'est juste la combinaison d'un ensemble de tas de fichiers binaires.
>> PUBLIC: Merci beaucoup.
>> ROB: Pas de problème.
D'autres questions?
Sinon, nous sommes tous mis.
Très bien.
Merci.
>> [Applaudissements]
>> PUBLIC: Je vous remercie.
>> ROB: Ouais.