>> [Jouer de la musique]
>> ENCEINTE 1: Ceci est CS50 et ceci est le début de la deuxième semaine.
Donc, nous allons plonger dans quelque chose qui est bogué, pour ainsi dire.
Donc, ici est CS50 IDE et je l'ai tiré vers le haut à l'avance ce screen-- sacrément
ce.
Alerte spoil.
Bien.
Je l'ai tiré vers le haut cet écran ici, qui a un programme très simple.
Si nous défiler vers le bas, la plupart de ce est commente juste,
mais ici, dans les lignes 13 à travers 17 Nous avons un programme.
>> Il est syntaxiquement valide, qui signifie que si Je compile, il va compiler et exécuter,
mais il est buggy.
Ce programme prétend dans les commentaires là-haut qu'il doit imprimer 10 étoiles,
mais il ne le fait pas.
Et sur la base de votre expérience, ou être bientôt expérience avec C,
pouvez-vous discerner logiquement pourquoi cela est, en fait, Buggy?
Ouais?
PUBLIC: Il va de zéro à 10.
Voilà 11 itérations.
ENCEINTE 1: Ouais.
Donc, il va de zéro et à travers égal à 10,
ce qui bien sûr est de 11 itérations.
Donc, ça va impression, en effet, 11 étoiles.
Ainsi, la convention de l'informatique dans la plupart des langages de programmation
est, en effet, juste pour commencer à compter à zéro,
mais compter jusqu'à, mais pas par le la valeur que vous vous souciez vraiment de.
>> Maintenant, cela est une chose que prend un peu de temps pour s'y habituer
et même Scratch, conçu comme il est pour les non programmeurs ou non ordinateur
scientifiques et pour les enfants en grande partie, est conçue pour avoir
vous commencez à compter généralement à un.
Et cela est très bien.
Vous ne pouvez absolument commencer à compter à une si cela est plus confortable.
Et compter jusqu'à 10 et à travers, mais vous vous rendrez compte en particulier cette semaine
et au-delà pour que tout le beaucoup de choses dans la programmation
Supposons que 0 est la première chiffres avec lesquels vous comptez,
que vous allez trouver plus facilement juste pour entrer dans cette habitude de départ
et en comptant à partir de zéro jusqu'à la valeur vous vous souciez de ce moment de la
obtenir aller.
>> Donc, ce qui est fixe.
Nous avons changé le inférieur ou est égal à un peu moins de.
Jetons un oeil à un deuxième exemple ici.
>> Donc, ce programme soutient aussi dans son commente là-haut qu'il doit imprimer
dix étoiles, mais il ne le fait pas.
Quel est le bug ici?
>> Donc, what-- et désolé, soyons clairs.
10 étoiles.
Un par ligne, mais il ne le fait pas.
Donc, en fait, laissez-moi aller de l'avant et compile celui-ci car il est un peu moins
claire, fondée sur cette description.
Laissez-moi aller dans notre répertoire source.
Assurez-poussette un slash dot, un Buggy.
OK, je vois 11 étoiles, qui est toujours problématique,
mais ils sont aussi en une seule ligne.
Quel est le problème ici?
Ouais.
AUDIENCE: [inaudible].
ENCEINTE 1: Ouais.
Donc, c'est une subtilité que vous pouvez souviens-moi faire une brève mention de.
Même si tout semble jolie, et il est bien en retrait,
et ce genre de Scratch regarde comme en ce que la ligne 16 et 17 sont,
En effet, en retrait sous que pour la boucle.
Voilà immatériel.
L'ordinateur ne fonctionne pas savoir ou voir l'espace blanc.
L'espace blanc est juste pour nous, les humains, stylistiquement.
L'ordinateur ne savoir quand vous avez accolades, ce qui serait, en effet,
résoudre ce problème.
>> Donc, si nous sommes allés effectivement et explicitement mis dans ces accolades
ce serait résoudre ce problème en qu'il soit clair pour le compilateur
que je veux réellement à exécuter deux lignes de code à nouveau,
et de nouveau, et de nouveau.
Mais quelle est l'explication fondamentale?
Droit?
Nous ne devons pas strictement Accolades tout le temps,
même si elle est probablement le meilleur pratique pour entrer dans cette habitude de toute façon
même si elle ajoute deux caractères de votre code. pourquoi?
>> AUDIENCE: [inaudible]?
ENCEINTE 1: Ouais alors que ce une autre solution tout à fait.
Droit?
Surtout si, à première vue vous ne faites pas vraiment apprécier ce qui se passe.
Eh bien, nous pourrions certainement il suffit de faire deux choses à la fois
et juste éviter complètement le problème.
Et cela est très bien, mais maintenant, pour les besoins d'aujourd'hui, ce qui
est l'explication pour le bug?
Pourquoi toutes ces étoiles étaient sur une ligne?
Ouais?
>> PUBLIC: Il semble que si vous avez une ligne de code,
vous pouvez le faire sans ceux-ci.
ENCEINTE 1: Exactement.
Ceci est juste une convention humaine.
Les gens se rendent compte qu'il est un peu ennuyeux ou pénible
d'avoir à mettre tous les accolades du temps, si tout ce que vous voulez faire
est d'exécuter une ligne de code.
Donc, les humains ont décidé certains Il ya le temps que ça va.
Si vous voulez mettre la totalité de votre boucle juste que sur une ligne de ce type,
qui est bien avec le single virgule à la fin.
Mais vous ne pouvez faire un tel ligne sans les accolades.
>> Ainsi, lorsque guide de style de CS50 comme on va vous indiquer,
vous verrez que, généralement, il est bonne habitude
pour entrer dans ce jusqu'à ce que vous êtes égarement très à l'aise
à partir de ces types de conventions et de faire votre propre chose.
Tant que vous êtes auto cohérente.
Et nous parlerons plus le style un peu plus tard aujourd'hui.
>> Alors, permettez-moi d'ouvrir jusqu'à un autre programme.
Bien sûr, nous devrions fixer ce 10 ainsi.
Permettez-moi d'aller de l'avant et écrire une vraie programme rapide que je vais appeler,
disons, boucle dot C. Ainsi, la boucle dot C. Et dans la boucle C point je vais devoir,
inclure les E / S standard dot H int void main.
Et maintenant, nous allons juste faire, en effet, une boucle.
Donc, 4 int Je obtient zéro.
I est inférieur à, disons, 50.
Je plus, plus.
Et puis ici de laisser aller de l'avant et ne imprimer F.
Et puis je veux imprimer I et une nouvelle ligne, point-virgule.
>> Et cela devrait imprimer toutes les numéros de zéro à 50?
Quelques-uns hoche la tête.
Quelques nos.
Quel est le bug déjà?
Quelle est l'erreur facile, je fait?
Ouais.
>> AUDIENCE: [inaudible].
ENCEINTE 1: Ouais.
Ainsi, même si il semble comme cela est ce que je veux,
rappelle que I est également juste un caractère ASCII.
>> Donc, si je vous dis, print "I."
Il est littéralement aller I. imprimer Donc, si je
vouloir plug-in un espace réservé valeur En fait, je dois faire ceci
puis brancher le valeur de I dynamiquement.
Sinon, je vais juste obtenir 50 I est sur l'écran.
>> Alors, laissez-moi aller de l'avant et faire de cette boucle, exécuter,
et, en effet, nous avons tous le chemin à travers 49.
Et si je fais défiler en arrière, je vois le nombre zéro au début.
>> Eh bien, si je sorte de bousiller?
Que faire si je fais cela?
Tout simplement parce que je ne pense pas.
Quel est ce programme.
Une fois re compilé et exécuté, va faire logiquement?
>> AUDIENCE: Rien.
>> ENCEINTE 1: Rien.
Pourquoi donc?
>> AUDIENCE: Je est conçu pour zéro.
Ainsi, la condition est fausse.
ENCEINTE 1: Oui, exactement.
Tout le code est correct, syntaxiquement.
Cela va compiler, ce code sera exécuté, mais il est pas
va faire quelque chose d'utile parce que je l'initialise I à zéro.
Nous vérifions ensuite, est que je supérieure à 50?
De toute évidence, non, il ne l'est pas.
Ainsi la boucle exécute jamais du tout.
>> Que faire si nous faisons quelque chose un peu plus téméraire?
Donc, si nous faisons comme int Je obtient zéro.
Et maintenant, permettez-moi utilise le tout boucle, ce qui était une autre condition.
Et tandis que je dis, alors que I est supérieur à ou égal à zéro, puis ici je
aller de l'avant et enregistrez le fichier, faire boucle.
Et je suis sur le point de l'exécuter.
Que vais-je voir cette temps avec une boucle while?
Ouais.
>> PUBLIC: Une boucle infinie?
>> ENCEINTE 1: Une boucle infinie?
Oui, et pourquoi?
AUDIENCE: Parce qu'il est toujours zéro.
ENCEINTE 1: Ouais.
Donc, je est initialisé à zéro.
Bien sûr, je reste toujours supérieure supérieure ou égale à 0 à la suite.
Donc, je vais juste voir cette infiniment.
Et maintenant, cela est arrivé une fois ou deux fois pour les têtes de cours.
Qu'advient-il lorsque vous avoir une boucle infinie?
>> AUDIENCE: Contrôle C.
ENCEINTE 1: Ouais.
Donc contrôle C finira par répondre.
Malheureusement, nous avons imprimé sur des millions et des millions de zéros déjà
et si l'ordinateur possède genre d'devancé de moi.
Donc, il va ignorer moi un peu.
Mais si vous appuyez simplement sur quelques-uns de contrôle C fois sur votre clavier Mac ou PC,
Finalement, il devrait, en effet, mettre fin.
Et si non, nous allons vous montrer quelques techniques avant longtemps où vous
peut effectivement tuer force programmes, un peu comme dans Windows et Mac OS,
si besoin est.
Mais nous allons essayer quelque chose d'autre.
Disons fait incrémenter I. Est ce toujours va être infini?
Permettez-moi de courir cette.
Et maintenant vous pouvez sorte de voir ce qui se passe.
Cela, aussi, est une boucle infinie.
Mais cela est un peu une question piège.
Est ce que cela va imprimer les numéros pour toujours?
>> AUDIENCE: Non
ENCEINTE 1: No.
Pourquoi?
Je entendu des nos ici.
Someone-- Ouais.
AUDIENCE: Vous ne disposez pas de suffisamment bits pour garder passe vraiment.
ENCEINTE 1: Très bien.
Donc, je ne ai pas assez bits pour continuer.
Donc, ce qui va se passer?
Il va juste pour arrêter?
>> Public: À un certain point il arrêtera the--
ENCEINTE 1: Il va fermer le bas de la boucle, mais pourquoi?
Qu'est-ce qui va se passer à la fin de ses frontières?
Ouais?
PUBLIC: Il fera un cycle Retour aux nombres négatifs.
ENCEINTE 1: Pour les nombres négatifs, ou si nous étions simplement traiter positif,
zéro au moins.
Donc, oui, absolument.
Rappelons que nous avons vu la dernière fois que si vous incrémenter vos morceaux une fois de trop,
et vous y Fore débordement la capacité de votre int
ou quel que soit le type de données est, vous êtes aller à enrouler autour, sans doute,
deux nombres négatifs.
Ou si vous avez indiquez que votre gamme ne devrait être positif,
que vous pouvez faire, mais nous avons pas encore vu que,
vous pourriez vous retrouver au moins revenir à zéro.
Bien que, en fait oui.
Dans ce cas, négative numéros, dans ce cas,
la boucle est prêt à se terminer parce que je ne suis pas, en fait,
Plus grand ou égal à zéro si elle est négative.
>> Donc, malheureusement, comment à long aurions-nous attendre?
Actuellement, nous sommes à ce qui, de 2 millions à la rigueur?
Nous sommes comme des 2 milliards, nous allons devoir attendre
jusqu'à ce que nous pouvons réellement voir ce symptôme.
Mais nous pouvons le voir un peu plus vite, maybe-- nous allons voir si nous pouvons interrompre.
Allons.
Même les menus apparaissent lentement.
Bien.
Donc, nous allons revenir à ce que avant longtemps.
Il est une bonne time-- damn it, les chiots.
>> Il est un bon moment pour certaines annonces.
Donc, si vous aimeriez de se livrer à YHack,
qui est un événement étant parrainé par nos amis de Yale.
Et, en effet, quelques-uns des cours de TF à Yale sont impliqués avec cela.
YHack est une organisation internationale pirater-o-thon organisé par et détenus
à Yale, réunissant 1500 comme tous les pirates et les créations d'esprit
dans le monde.
Si cela présente un intérêt, jetez un oeil ici.
Si cela est trop brièvement sur le écran, jetez un oeil à des diapositives d'aujourd'hui
pour l'URL pour yhack.org.
Donc, aussi quelques annonces rapides.
Donc, officiellement sections vont commencer la semaine prochaine à la fois ici et à New Haven.
Gardez à l'esprit que vous allez recevoir un e-mail plus tard ce week-end le plus probable.
Cela prend beaucoup de temps pour CS50 de l'article,
compte tenu de toutes les personnes dans le classe et tout le monde à se déplacer.
Et tous les Fellows enseignement » horaires sont également toujours solidification,
mais restez à l'écoute pour un email et si besoin être, vous pouvez ré-section, il après.
>> Study.cs50.net.
Donc, même si vous êtes un participant constant au niveau des sections, se rendre compte que la quasi-totalité
des ressources que nous utilisons dans les sections sont accessibles au public au CS50
Étudier à l'adresse ici.
Donc, si vous voulez jamais souhaitez ré examen matériau de la section, ou de lire l'avenir,
ou vous ne pouvez pas faire quelque semaine, réaliser que les diapositives de l'échantillon,
et les problèmes, et les définitions, et plus sont tous là aussi.
>> Les heures de bureau reprennent aujourd'hui, et demain, et le mercredi,
et jeudi vérifier le cours de site web pour l'horaire.
>> Et aussi, en train de lancer aujourd'hui est CS50 Discutez.
Donc, si et quand vous avez des questions pour l'autre ou pour le personnel de la formation,
et sont généralement de travail sur un certain ensemble de problème,
réalisez que vous ne le faites pas nécessairement se tourner vers l'homme que vous prochaine.
Si il n'y a personne là-bas, vous pouvez tendre la main à nous et camarades de classe
Discutez en ligne via CS50.
Donc, ceci est une discussion Conseil pour le cours,
et de réaliser que ce est peut-être le meilleur
point de départ quand vous avez des questions quand à l'extérieur des heures de bureau
en particulier.
>> Repas vont commencer cette semaine aussi.
A Fire and Ice [Inaudible] à New Haven.
Jetez un oeil sur le parcours de site Web afin de confirmer votre présence.
Premier arrivé, premier servi pour cela.
Si vous ne recevez pas cette semaine nous allons faire ces plus chaque vendredi
pendant la durée.
>> OK, et maintenant un mot sur le classement.
D'autant plus que nous entrons problème en créer un, qui est sorti cette semaine,
et le problème réglé deux et par la suite.
Comment allons-nous évaluer P ensembles et évaluer la qualité de celui-ci?
Ainsi, il est quatre axes que nous utilisons dans CS50, et ils sont ces quatre ici.
>> Portée, qui capte sur un numérique base juste combien de l'ensemble de P
avez-vous abordé.
Ça correspond à peu près effort, et il est notre façon de capturer
avez-vous essayé la moitié de la P fixer, tous de l'ensemble de P.
Ceci est une tâche facile pour obtenir parfaite scores sur si vous le faites, en effet,
essayer tous les aspects de l'ensemble de P.
Alors garde cela en tête.
>> Exactitude est exactement cela.
Est-ce que votre travail de code que le cahier des charges et que la solution de l'échantillon des états-majors
suggérer que votre code devrait, en fait, travailler.
Vérifiez 50, si vous ne l'avez pas rencontré, il pourtant, est en P mis une spécification
et sera généralement vous donner réponses oui / non
quant à savoir si votre code est correct.
Au moins autant que nous allons Pour évaluer ce basée sur les tests
que nous courons dans ce programme.
>> Le design est beaucoup plus subjective.
Voici comment bien écrit est votre code.
Et ceci est quelque chose qui vous obtiendrez de meilleurs au fil du temps,
et il est quelque chose que nous allons fournir une rétroaction plus qualitative sur.
Et par la conception que je pourrais dire avant longtemps vous
pourraient être tentés dans certains P mettre à faire quelque chose loopingly,
mais peut-être d'avoir trois, ou quatre, ou cinq boucles de devant imbriqués ou tout imbriqué
boucles.
Ce général devrait commencer à faire vous grincer des dents
et serait généralement mauvaise conception considérée.
Et vous allez commencer à voir en classe et hors de la classe de bonnes façons de faire les choses,
mauvaises façons de faire les choses qui pourraient tous être correct, mais pas
nécessairement bien conçu.
Comme rédiger une dissertation.
Vous pourriez être en mesure de mettre des mots sur une page qui sont grammaticalement correcte,
mais l'essai ou de la thèse qu'ils sont en est juste
complètement incohérente ou pas convaincant.
Et ce pourrait être l'analogique dans la monde écrite de bonne ou mauvaise conception.
>> Et de style, aussi, est assez subjective.
Mais au moins, nous nous attendons à la cohérence.
Voilà comment est jolie votre code.
Les choses sont bien en retrait?
Sont vos variables bien nommés / Sont tous de vos parenthèses et accolades
alignés comme ils devraient l'être?
Nous avons un guide de style que CS50 le jeu de problème vous pointer.
Ceux sont plus à l'aise bienvenue à écarter de ce que
tant que vous êtes auto cohérente.
Et cela, aussi, est une leçon nous renforçons dans la section.
Donc, si tout cela était un peu rapide, réaliser l'ensemble de P et sections
ira plus en profondeur avant longtemps.
>> Mais en général, nous avons très peu de seaux pour CS50.
Scores sont généralement sur une échelle de un à trois, ou un à cinq.
Nous sommes literally-- et je ne pouvons pas dire ce suffisant dans la première semaine.
Trois est bonne.
Donc, même si, oui, trois de cinq normalement, mathématiquement,
pourrait être un 60 pour cent ou comme un D moins.
Trois est, en fait, bon.
Et, en fait, nous nous attendons la plupart des élèves de la classe
pour commencer le terme autour deux par deux, et trois, et quatre pattes.
Probablement pas tant de Fives.
Pas trop chers.
Mais en général, à commencer dans le point idéal de la courbe
de sorte que le temps progresse, il ya effectivement la place pour,
et les possibilités de progression supérieure.
Alors, s'il vous plaît ne pas assimiler trois avec 60%.
Il est beaucoup plus abstrait que cela.
La formule avec laquelle nous calculons grades est la pondération suivante.
Exactitude vaut le plus.
Conception vaut un peu moins.
Style vaut un peu moins.
Et ce qui est généralement capte la quantité de temps
qui va dans l'obtention de chaque de ces axes juste.
Le style est super facile, devrait être super rapide,
mais il est une habitude facile pour obtenir paresseux à ce sujet.
Exactitude pourrait prendre vous la plupart du temps.
Pourchassant certains pourraient bug prendre cette heure supplémentaire ou plus,
et ainsi, le score en fin de compte que capture.
Et donc, maintenant un mot plus grave.
Depuis CS50 a la distinction, pour le meilleur
ou pour le pire, d'être peut-être mieux au courant
avec les questions de académique l'honnêteté que la plupart tout autre cours.
Et en effet, il est à ma connaissance que nous envoyons plus d'étudiants, malheureusement,
à des fins disciplinaires chaque année à la suite. Ainsi,
dans l'intérêt de la pleine la divulgation, parlons brièvement
à propos de ce qui se passe dans le CS50, et ce que vous peut faire, et ce que vous pouvez être conscient de.
>> Donc, ici, depuis 2007, lorsque Je hérité du cours,
est le nombre de cas de la Commission Ad.
Conseil annonce est la discipline de Harvard corps, ou maintenant l'honneur avocat,
auquel cas sont renvoyés lorsque étudiants font quelque chose que le cours de
syllabus estime déraisonnable.
Il n'y a pas motif réel ici, je dirais.
Il fluctue au cours de la mais généralement années
ceci est le nombre de cas qui sont visés.
Le nombre d'étudiants qui sont impliqués?
Il varie aussi.
Typiquement, l'année dernière pour Ainsi, 29 étudiants à Harvard
Ad Condamné étaient, pour ainsi dire.
29 d'entre eux les étudiants actuels, Deux d'entre eux étudiants antérieurs,
qui ont été collaborer d'une certaine façon perverse.
Et puis en termes de pourcentage, il est généralement d'environ 3%
de la classe qui, malheureusement, rend ce genre de décisions.
>> Ainsi, l'an dernier, il était de 3,5% du corps étudiant de CS50
qui était Ad Condamné, pour ainsi dire.
>> Alors, qu'est-ce que tout cela signifie?
Et que faisons-nous en réalité?
>> Donc, pour la divulgation complète, nous absolument, comme les informaticiens,
avoir des outils logiciels à notre disposition et il est très facile pour nous, en toute équité,
camarades de classe de ce que d'autres qui ne sont pas croisement de ces lignes à traverser comparer
chaque présentation cette année contre tout la soumission pour les huit dernières années.
Software fait cela.
Et finalement, il est yeux humains qui décident
ou de ne pas renvoyer une certaine Pour plus d'importance arbitrage,
mais le logiciel contribue certainement.
Et cela, franchement, pourquoi est ce que je pense nous avons un si grand nombre dans CS50.
Il est pas parce CS50 étudiants ou CS plus
sont généralement pas moins honnête que tous les autres étudiants,
il est juste que nous avons le des outils et des techniques
qui profite de cette première passe.
>> Mais nous faisons garder un oeil sur toutes ces choses
ainsi, à nouveau, dans l'intérêt de reconnaissant le travail qui est mis
dans une super-majorité de la classe.
Et la politique de cours sur l'honnêteté académique,
même si elle est un tas de paragraphes de long avec un tas de balles
qui sont, espérons tout à fait lisible, il vraiment ne se résument à être raisonnable.
Et la meilleure règle empirique selon laquelle nous offrons au sein du syllabus
est présent, l'essence de tous les travaux que vous
soumettre à ce cours doit être la vôtre.
Et en effet, dans presque tous ceux cas visés par des mesures disciplinaires
il était à cause de quelque tard un étudiant nuit généralement tourné son code
plus pure et simple à un camarade de classe, qui a ensuite adopté
dans son intégralité ou de manière significative de celui-ci.
>> Mais vraiment, cela est OK.
Et en effet, au bureau heures, les bouts de papier
vous avez été remis si vous êtes venu par le bureau heures la semaine dernière encourage autant.
Vous avez absolument saluée et encouragée
pour discuter des ensembles de problèmes avec leurs camarades.
Pour aider les uns les autres quand achoppement.
Mais en général, la règle de base devrait être ceci, "lorsque vous demandez de l'aide,
vous pouvez montrer votre code à d'autres, mais vous ne pouvez pas voir le leur ».
Donc, en d'autres termes, si je suis aux prises avec un certain ensemble de P
et je suis assis là, dans le salle à manger, ou dans la bibliothèque,
ou en classe en essayant de trouver quelque faute,
Je peux certainement montrer mon code sur mon écran
à la personne assise à côté pour moi, certainement le personnel,
mais aussi un camarade de classe.
Mais si la solution qui mon camarade de classe offre est, oh,
ici juste jeter un oeil à ce que Je l'ai fait, qui traverse la ligne.
>> Et je oserais dire que ce général une chose raisonnable pour la plupart des gens
de repérer très facilement la ligne de.
Et ainsi, voir le programme pour plus de détails.
Et maintenant l'un des plus aspects controversés
CS50 de programme que je pensais parlerait dans la conclusion ici
est la clause dite de regret.
Donc, voici les petits caractères.
Mais en général, nous avons vu au cours des 8 dernières années et plus
que, en effet, presque tous de CS50 les cas de malhonnêteté intellectuelle
ont été le résultat d'un peu pauvre faire tard dans la nuit décision.
Le résultat du stress, le résultat du manque d'alimentation, le manque de sommeil,
trop nombreux ensembles P, trop nombreux les délais, trop d'engagements.
Stress construire dans un 02:00, 03:00 AM, 04h00, avec une échéance imminente.
La plupart des étudiants dans ces cas venons de faire de mauvaises décisions
qu'ils pourraient très bien regretter le lendemain matin sinon minutes plus tard,
mais jusqu'à l'année dernière il n'y avait pas soupape de décharge que ces étudiants pourrait
ouvrir effectivement jusqu'à fait face à la problème de front, sans crainte d'être
démarré à partir d'un collège tout à fait.
>> Et, en effet, nous avons introduit cette clause de regret de l'année dernière,
qui dit que si, dans les 72 heures, trois jours,
de franchir une certaine ligne prescrite dans le syllabus
vous venez de l'avant à l'un des cours de têtes et nous aurons une discussion à ce sujet.
Il ya encore quelques résultat, contrairement à ce qui est
été rapportés au contraire.
Il ya encore du résultat qui est une action par le cours,
la réduction à zéro en général un ensemble de P ou de prendre une autre action,
Mais nous allons, en effet, gérer nous-mêmes et non
la renvoyer plus élevés ont été le résultat pourrait être beaucoup plus grave.
Et, en effet, de partager ce qui est arrivé l'année dernière, dans les huit ans, et maintenant
neuf ans, de l'enseignement de ce cours et après bricoler avec différents boutons,
tourner divers cadrans sur le passé plusieurs années sur l'honnêteté intellectuelle,
et de voir par les données pas apparents impact, même des discours comme celui-ci,
ce fut de loin la meilleure chose nous avons introduit pédagogique
en huit ans le long ces lignes dans CS50.
>> 19 étudiants se sont présentés en vertu de cette clause de l'année dernière.
Nous avons pris aucune action pour sept de ces étudiants,
déterminer qu'ils étaient inutilement inquiets.
Ils avaient pas, en fait, franchi une ligne, mais il
était une bonne conversation d'avoir tout de même.
Nous nous sommes concentrés 11 des scores qui ont été soumis.
Et dans un cas, nous avons demandé une étudiant de faire un problème posé.
Mais plus convaincant, honnêtement, avec ces 19 chats,
qui était beaucoup plus que je devrait avoir, chacune d'entre elles
10 minutes à peut-être une heure de temps, aussi apporté
à la lumière d'un certain nombre de questions concernant les problèmes familiaux, problèmes de ami,
problèmes de santé mentale puis que nous nous sommes engagés,
avec la bénédiction, résident de l'étudiant Dean, ou entre amis, ou tout autre numéro
des ressources de soutien.
Alors que ce fut de loin l'un des meilleures utilisations de notre temps
et l'un des meilleurs interventions.
>> Cela dit, il avait pas entrée sur le taux de détection
de la malhonnêteté intellectuelle de manière plus générale.
Et je ose dire, ce sous-ensemble des étudiants de dernière année
est un groupe démographique qui nous auparavant jamais identifiés avant
et n'a jamais connecté auparavant.
Et donc, ce sont merveilleuses histoires de réussite
même si elles ont été portées à la lumière en moins de circonstances optimales.
Alors, gardez cela à l'esprit que vous faites, peut-être,
une certaine mauvaise décision vous tard dans la nuit,
qu'il ya recours si longtemps que l'étudiant dans cette situation
posséder et se présenter afin que nous puissions avoir ce genre de discussion et de traiter avec elle
d'une manière qui est de l'éducation, puis nous pouvons mettre ça derrière nous le lendemain.
>> Alors sans plus tarder, prendre la bord au large de cette conversation,
la raison les chiots sont en place est- juste pour briser la glace pour un moment.
Et malheureusement, ils sont tous de sommeil, mais ce qui était censé arriver ici
était tout le monde était censé de crainte et de type de détendre
après cette très lourde conversation.
Mais apparemment je mets les chiots dormir.
Mais si vous allez à CS50 de Chiots site de Slash,
vous pouvez les regarder toute la journée.
Peut-être en particulier 02:00, ou 3h00, ou 4h00 dans la nuit
pour voir un peu de soulagement du stress il.
Voilà donc slash chiots.
Bien.
Était-ce pas amusant?
D'ACCORD.
Donc, retour à une certaine ordinateur la science, si vous le permettez.
>> Donc, rappeler que la dernière fois que nous avons commencé la recherche non seulement au principal, qui
était la fonction par défaut, lorsque la drapeau vert cliqué équivalent,
mais nous avons également commencé brièvement écrit certains de nos propres fonctions.
Et jusqu'à présent aucune de ces fonctions ont été particulièrement grand ou de viande.
Vous aurez dans celles plus grande fonctions probablement, P set 2, 3 P fixé,
P définitivement réglé 4 et au-delà.
En ce moment la plupart de vos programmes, sinon la totalité d'entre eux, certainement pour P
ensemble 1 peut être fait entièrement en principal.
Si votre programme est seulement cinq lignes, 10 lignes,
même 20 lignes de long, parfaitement raisonnable pour écrire
tout en principal et de ne pas trop compliquer votre code, mais ce que nous faisons aujourd'hui
et au-delà est aussi d'essayer de introduire quelques bonnes techniques de conception
de sorte que votre code devient plus compliqué et que les problèmes
vous voulez résoudre devenir plus difficile et plus intéressant que vous avez, en quelque sorte,
les outils dans votre boîte à outils avec laquelle de concevoir de bonnes solutions à ceux-ci.
>> Donc, nous allons jeter un coup d'œil en arrière à ce programme de ma semaine dernière, qui
était fonctions zéro point C. Et remarquer que, tout simplement,
il ressemble à ceci avec deux fonctions, principale et le nom d'impression.
Et repensant ou peut-être l'ingénierie inverse aujourd'hui,
ce qui était la motivation pour l'introduction une fonction dans la ligne 28 appelée,
Nom d'impression?
Ou était-ce ce un exemple de dans termes d'un principe ou à emporter,
si vous voulez bien.
Quelques murmures.
Quoi?
>> Ouais décomposition si fonctionnelle est une sorte de fantaisie façon de dire,
décomposer votre programme en ses parties constituantes
et ensuite utiliser ces pièces à assembler un ensemble.
Alors, qui est trop juste genre d'une bouchée déjà,
mais cela est peut-être même un Le meilleur exemple de quelque chose
juste appelé abstraction.
Droit?
Abstraction va être l'un des thèmes récurrents dans CS50
et aussi la science informatique plus généralement, car il est
une technique avec laquelle vous pouvez résoudre problèmes plus efficacement parce que vous
peut écrire des solutions plus intuitivement et de façon que les échelles
et est compréhensible par d'autres personnes.
Qu'est-ce que je veux dire par là?
>> Donc, il est sans doute beaucoup plus lisible à regarder un programme comme celui-ci,
super court si elle est.
Quand vous voyez la ligne 22 qu'il ya une fonction appelée, le nom d'impression.
Ce nom seul dit ce qu'il fait.
Cette fonction prend apparemment entrée entre ses parenthèses,
et fait apparemment quelque chose, imprime sans doute le nom.
Et donc, même si nous absolument pourrait avoir
fait ce que nous avons fait il ya une semaine, qui était juste profiter de cette ligne de code,
Débarrassez-vous de cela, et obtenir débarrasser de tout cela ensemble,
nous sorte de couche d'abstraction la notion de l'impression d'un nom.
Je ne me soucie pas si vous utilisez l'impression def.
Je ne se soucient pas si vous avez un S pour cent et une barre oblique inverse N. Ces
des détails incroyablement arcanes.
Ce que je ne me soucie comme un programmateur imprime un nom.
Et donc, quelle meilleure façon de le faire que par appel d'une fonction, le nom d'impression?
Et donc, qui était l'une des motivations pour faire quelque chose comme ça.
Faire le code plus lisible, plus réutilisables, et aussi l'auto descriptive.
Maintenant, nous allons jeter un coup d'oeil un autre exemple,
qui est une des fonctions, que nous avions ici.
>> Ainsi, celui-ci est peut-être encore plus convaincant, car, dans ce cas,
Je ne veux pas simplement obtenir un int.
Je veux obtenir un int positif.
Et il se trouve pour obtenir un résultat positif int vous avez à faire un tas de démarches.
Droit?
Il est pas une simple ligne appeler comme le nom d'impression était,
qui est certes moins convaincante.
>> Pour obtenir un int positif, logically-- permettez-moi de faire défiler vers le bas pour cacher cela.
Qu'avez-vous à faire?
Comme tous les outils que nous avoir au moment sont
des choses comme impression def de Standard Bibliothèque et également de la bibliothèque de CS50
nous avons Obtenez Int, et obtenir Float, Obtenez Long Long, Get String,
mais le seul, Germane, est dès maintenant Obtenez Int.
Donc, si le seul outil dont vous disposez dans votre boîte à outils est Recevez Int,
comment allons-nous mettre en œuvre elle pour obtenir int positif?
>> AUDIENCE: Créer un journal et vérifier si l'entrée qu'ils donnaient
était positif ou non.
>> ENCEINTE 1: Parfait.
Exactement.
Un autre outil que nous avons dans notre boîte à outils à partir d'une ou deux semaines
est juste la construction de boucle.
Et donc, oui, si nous utilisons un certain temps boucle, ou une boucle Do While, ou un avant
boucle, nous pourrions probablement vous en sortir l'un de ceux dans une certaine forme.
Nous pouvons mettre en œuvre la notion de GET int positif en utilisant simplement Obtenez Int,
puis juste continuer à l'appeler encore et garder harceler l'utilisateur
jusqu'à ce qu'il ou elle fait nous donne ce que nous voulons.
>> Et maintenant, cette abstraction du processus
d'obtenir un int positif dans une fonction appelée
Obtenez positive Int est un peu plus convaincant, car regarder ce.
Ce sont comme des 10 plus lignes de code que
sont impliqués dans l'obtention d'un int positif, et je ne me soucie pas vraiment comment vous le faites.
Tout ce que je fous est que vous peut le faire, et je l'ai
tous ces détails cachés derrière un fonction appelée Obtenir positive int qui,
en effet, a cette boucle Do While.
>> Et voir la semaine dernière pour la syntaxe là, mais il déclare simplement N,
et il imprime le instruction à l'utilisateur.
Il appelle Obtenez Int, puis il vérifie cette condition encore, et encore,
et encore jusqu'à ce que l'utilisateur coopère.
>> Alors maintenant, quelques vérifications de bonne santé.
Pour ceux qui connaissent peut-être avec un peu de programmation,
pourquoi est-N a déclaré, pourquoi dois-je créer N en dehors de la boucle Do While?
Pourquoi est-il sur la ligne 29 et non comme sur 33, par exemple.
>> AUDIENCE: Parce que quand vous déclarer l'extérieur, il genre
de plus, la plus grande scope--
>> ENCEINTE 1: Bon.
>> AUDIENCE: --et si vous déclarez à l'intérieur de la boucle, [inaudible]
car il ne sait pas à ce sujet.
ENCEINTE 1: Exactement.
Si je peux simplify-- il est une question de portée.
Et la portée se réfère au contexte dans une variable qui existe ou est utilisable.
Et la belle règle de base est que généralement lorsque vous déclarez ou créez
une variable, vous pouvez utiliser uniquement à l'intérieur de la plus proche embrassant accolades.
donc, qu'est-ce que ça veut dire?
Si je, à la place, d'annuler cette et aller avec quelque chose qui se sent un peu plus simple.
Droit?
>> Ligne 32 semble juste plus propre pour moi maintenant.
Je fais les deux choses à une fois et puis assigner
la main droite à la main gauche.
Le problème repose maintenant sur cette définition de portée
est que N peut être utilisé en traits 31 et 32 ​​à l'intérieur de cette boucle,
mais où, par définition que ne peut-il être utilisé?
Conformément quoi?
Ouais.
>> AUDIENCE: 35.
>> ENCEINTE 1: 35.
Certainement pas 35.
Et aussi où d'autre?
AUDIENCE: 34.
ENCEINTE 1: Même 34 est problématique car elle est
en dehors des accolades.
Et donc en fait, nous allons voir ce qui se passe.
Droit?
Cela peut sembler un peu intuitive ou ne pourrait pas,
mais nous allons voir ce que les compilateur doit dire quand
nous allons dans le répertoire source d'aujourd'hui.
Faire fonctionner un.
Oh mon Dieu.
Eh bien, je enfin terminé que, par la manière.
Bien.
Et quel est le problème ici?
Très mystérieux à regarder.
Mais voici ce que je typed-- faire fonctionner un.
Voilà ce que font induit, qui est en fait
utilisant le cliquetis du compilateur avec certains de ces drapeaux
que nous verrons à nouveau avant longtemps.
Et encore, toujours regarder à la première erreur,
car il pourrait juste avoir une cascade effet de sens sur les autres lignes.
>> Donc, ce que cela signifie est que le problème est dans la fonction 1.c.
Il est sur la ligne 32.
Et il est à la colonne, ou de caractère, 13.
Ainsi, lorsque votre éditeur de texte qui peut vous aider à identifier où est le problème.
Donc, si je fais défiler jusqu'à, ce qui est la ligne 32?
Voilà en effet celui- qui est déjà mis en évidence
droit ici-- utilisé variable n.
Mais il est pas utilisé.
Je l'utilise.
Mais le compilateur est confus, parce elle existe seulement à l'intérieur de ce périmètre.
Et donc je ne peux pas l'utiliser ici.
Je ne peux pas l'utiliser ici.
Le compilateur et, par conséquent, ne se soucie même pas que je vais essayer.
Il semble être utilisé dans sa portée réelle.
>> Donc, nous pouvons élargir la portée en faisant exactement ce que nous avons commencé avec-- int n.
Et même si elle ne le fait pas regarder aussi élégant, peut-être,
et nous prenons une ligne supplémentaire ici, il est maintenant portée partout.
Essayons donc de nouveau.
Donc, faire fonctionner un.
Agréable.
Et maintenant, si je si je cours fonction l'un, nous allons lui donner négative 10,
négatif de 1, 0, 1, et il fonctionne bien.
>> Donc, il ya une autre solution ici.
Tu sais quoi?
Que faire si je suis vraiment aux prises avec cela?
Je ne sais pas où le n est censé aller.
Tu sais quoi?
Je vais mettre tout le chemin au sommet de mon dossier ici.
Que serait-ce faire, pensez-vous?
Ouais?
>> AUDIENCE: [inaudible].
ENCEINTE 1: Ouais.
Donc, je l'ai fait mondiale, pour ainsi dire.
Si vous avez une variable qui est à l'extérieur l'ensemble de vos fonctions qui est autorisé,
et le code devrait compiler, et n va maintenant être accessible non seulement dans get
int positif, mais aussi en ce qui main-- est un peu inquiétant parce qu'il ya
déjà un n dans le principal, donc plus sur ce en seulement moment--
mais cela serait considéré comme une mauvaise conception.
Bien.
Si vous avez recours à quelque chose comme, oh, je vais
il suffit de mettre en place ici parce que le code semble compiler
est généralement pas la meilleure pratique.
Plutôt que vous voulez choisir la portée la plus étroite possible
pour vos variables, ce qui signifierait aller avec notre conception initiale, qui
est ici.
>> Maintenant, en passant, si vous avez eu un nom de variable de manière identique ici,
le chemin c gérerait this-- si cela ne se fera pas trop often--
est que cela est encore parfaitement bien ici.
Mais cette définition de n dans la ligne 22 fera de l'ombre d'une planète.
Alors celui-ci travaillera au sein principal, et celui mondiale
sera effectivement appliquer lorsque vous êtes dans obtenir int positif mais plus sur ce
une autre fois, mais juste pour ceux qui sont curieux.
>> Donc en bref, nous fixons cette ici.
Maintenant, nous allons démêler deux autres pièces avant que nous regardons une dernière ligne de code
dans ce programme.
Obtenez int positif.
Sur le côté gauche de sa parole est la parole int.
Qu'est-ce que cela signifie pensez-vous?
Jusqu'à présent, nous avons surtout vu nulle.
Ouais?
>> PUBLIC: Il est le type de variable qui vous parlez.
>> ENCEINTE 1: Ouais Il est le type de, laissez-moi pas dire variables, mais le type de valeur
que je suis de retour pour demander.
Et en effet, que ce intuitive ici, je l'espère.
Droit?
Si vous voulez obtenir un int positif, qu'est-ce que vous
veulent la function-- comme notre bénévoles de la semaine dernière
de vous restituer un morceau de papier avec un int sur elle?
Et donc nous avons spécifié que le type dit de cette fonction de retour
est d'obtenir int positif.
Si nous ne voulons pas qu'il retourner quelque chose, vous dites non avenu.
Si vous souhaitez qu'elle retourne une chaîne, vous dites chaîne.
Si vous souhaitez qu'elle retourne un flotteur, vous dites flotteur.
Mais le seul qui applique ici logiquement, parce que je suis en utilisant get int,
même si je suis le limitant à des valeurs positives, est de retourner un int.
>> Donc, à l'inverse, ce que cela signifie qu'il ya un vide entre parenthèses?
Qu'est-ce que les parenthèses généralement définir?
Ouais?
>> PUBLIC: Il signifie que la fonction de pas réellement l'obtenir.
>> ENCEINTE 1: Il signifie que la fonction de pas vraiment obtenir ce que?
>> PUBLIC: Une entrée.
>> ENCEINTE 1: Une entrée, que ce soit.
Donc, en effet, si la parenthèse ici vous spécifiez vide,
cela signifie juste que je ne veux pas d'entrée.
Je vais régler le problème moi-même.
Et en effet, vous ne devez pas dire obtenir quelque chose int positif.
Vous venez de dire, obtenez int positif, et que fonction se déclenche et faire sa chose.
>> Mais il ya eu un petit truc que je l'ai été jouer ici tout ce temps
pour vous assurer que ce code se compile.
Notez que int-- obtenir positif int void-- est sur la ligne 27.
Mais pour une raison apparemment bizarre il est aussi ici à la ligne 16.
Et pour faire bonne mesure, je vais répéter cela, il est donc parfaitement identique.
Et je l'ai dit prototype un petit commentaire d'une seule ligne.
Qu'est-ce qui se passe si je supprime cela, et relancez maintenant faire fonction 1, entrez.
Oups.
Attendez une minute.
Où est mon onglet?
Hein?
Etre prêt.
Faire fonction 1.
Nous y voilà.
D'ACCORD.
Avait pas enregistré correctement.
Donc, je pense qu'il ya un peu bug là où je ne suis pas
voir le nom de l'onglet pour le moment.
Donc ce qui se passe ici?
Déclaration implicite de fonction obtenir int positif est invalide dans C99.
Donc confondre à nouveau.
Donc, ce qui est indicatif de ce?
Eh bien, il se trouve que C est assez stupide.
Eh bien, il est de la programmation la langue, ou plutôt le compilateur est.
Il ne sait ce que vous avez enseigné, et il est seulement
va savoir quelque chose si vous avez enseigné auparavant.
En d'autres termes, principale en ce moment, je suis
essayez d'appeler une fonction appelé obtenir int positif.
Mais le compilateur ne va pas de remarquer que reçoivent int positif
existe jusqu'à ce que la ligne 26.
Et donc ce que le compilateur fait est juste erreurs dès qu'il obtient à la ligne 17,
disant déclaration implicite d'obtenir int positif, ce qui
est juste une façon élégante de dire, je ne sais pas savoir ce que se int positif est encore.
>> D'autres langages comme Java et Python et Ruby pourraient regarder vers l'avenir.
C ne fait pas.
Et la façon dont nous fixons ceci est l'une des deux façons.
Soit l'un, si le problème est que rendre int positif n'a pas été vu avant,
Eh bien, permettez-moi de passer à la partie supérieure.
Ce serait résoudre ce problème.
Mais en général, il est meilleure technique considérée
de mettre votre fonction principale à la très haut de sorte que l'homme lisant votre code
sait ce que fait le programme, parce principale ne soit pas enfoui tout
le chemin en bas ou au milieu.
Il est tout en haut.
Donc, qui ne se sent pas l'idéal.
Et vous pouvez réellement obtenir dans des situations où
si les appels d'une fonction un autre, qui en appelle un autre,
vous pouvez entrer dans une question où ni peut aller au-dessus de l'autre, logiquement.
Il est tout simplement pas possible.
>> Et si le chemin du travail contourner cela est de simplement prendre
La signature de la fonction, ainsi speak-- la première ligne où il est declared--
et il suffit de copier, coller à la top, mais pas avec braces-- bouclés
juste avec un point-virgule.
Il est comme un petit indice de ce qui est à venir.
Et en fait, tout ce temps, lorsque nous ont vu des choses comme io.h norme
cs50.h et, de même, dans les points h fichiers sont là d'autres prototypes.
Et nous verrons que, avant longtemps.
>> Donc en bref, quand vous avez un programme dans un fichier avec plusieurs fonctions
Outre principale, vous avez presque toujours envie de les déclarer
simplement par le biais de leur première ligne, suivi d'un point-virgule,
tout en haut du fichier.
Ce fut beaucoup à la fois.
Des questions?
Bien.
>> Donc, passons à autre chose alors à quelque chose comme la toux.
Oh.
Comment raccord.
Bien.
Toux.
Voici donc un c mise en œuvre d'un programme
nous avons fait l'autre jour dans Scratch que très simplement juste
dit la toux, la toux, la toux.
Bien.
Et quelqu'un a dit que quelques-uns il ya jours qu'il ya
une façon de nettoyer ce code jusqu'à déjà.
Bien?
Dès que vous copiez et coller probablement une mauvaise conception.
Au moins une fois nous arrivons à quatre ou cinq ou 20 toux, il se sent une mauvaise pratique.
Nous gardons juste copier, coller.
Quelle est la solution la plus évidente au nettoyage de ce programme en place?
>> AUDIENCE: Boucle.
>> ENCEINTE 1: Ouais.
Il faut donc utiliser une boucle.
Et nous pouvons utiliser une boucle pour un tout boucle, un certain nombre d'approches.
Et en effet, voilà ce que nous faisons en version un ici.
Je suis à la place réécrit dans la version de l'un cough.c
pour être juste la toux dans une boucle pour.
Très bien, mais il ya un maintenant l'occasion de genre de début
pour concevoir ce un peu plus comme la leçon que nous a enseigné il ya un instant,
qui est this-- supposer que je voulais pour créer une fonction appelée toux,
nous allons examiner pendant un moment ce que ça va ressembler.
Donc, si je veux quelque chose à tousser, je dois juste
à utiliser print f intérieur de la fonction.
Et en effet je suis.
Et en fait, tout cela temps, chaque fois que vous êtes
imprimer quelque chose à l'écran, un programmeur
exigerait qu'un effet secondaire.
Ça m'a pas remettre Retour quelqu'un une valeur.
Il me prend des mesures qui pourrait être visuellement évident.
Mais cette fonction toux, faut-il revenir quoi que ce soit sur la base de sa première ligne?
Non, parce que son type de retour est nulle, ce qui signifie tout simplement
ça ne me remettant rien en retour.
Il pourrait faire quelque chose visuellement, mais ça ne me tendant
sauvegarder un morceau de papier comme la semaine dernière.
>> Est-il besoin d'aucune entrée?
Non.
Et il est donc nulle ici aussi.
Donc, cela aussi est une sorte de over-engineering ce problème.
Droit?
Je me suis fait le programme plus complexe, plus de lignes de code,
Je ne l'ai pas fait tout plus fonctionnel, mais ce
serait un tremplin, peut-être, pour une large
cadre avec le code plus complexe.
Mais qu'est-ce à ce sujet?
Qu'ai-je done-- simplement en regardant ce sans regarder le commentaire
au sommet de l'file-- ce que possède Je suis fondamentalement en fait ici avec ma toux
mise en œuvre qui est différent?
Ouais, dans le dos?
>> AUDIENCE: Faire en sorte que vous pouvez ont un caractère éteindre.
ENCEINTE 1: Ouais.
Donc, cela se sent plutôt agréable.
Droit?
Il est comme l'ajout d'une fonctionnalité à votre programme ou votre fonction, dans ce cas.
Il revient toujours rien.
Il pourrait avoir un effet visuel latéral, parce qu'il appelle impression f.
Mais maintenant, je suis paramétrée la fonction,
signifie que je suis spécifiées qui sont prises entrée de type int et l'appeler n,
mais je ne pouvais l'appeler ce que je veux.
En fait, il pourrait simplement être fois pour être encore plus explicite.
Et puis je ne pouvais tout simplement changer cette sélection ici.
Mais le fait est que cela est la façon dont je créer une fonction qui prend entrée.
Et si vous vous souvenez de retournement peut-être par le biais d'une ligne
des visites virtuelles, la quatrième et dernier exemple de la toux,
vous remarquerez ici, je avez généralisées mon code type de further-- abstraite
davantage.
Comme la toux et éternuement, les deux sont à propos de quelque chose à dire ou faire
une sorte de bruit.
Sauvegarder serait le bloc de Scratch correspondant.
Et si ce que je faisais dans cette version, que nous ne pouvons tout simplement au regard,
est la toux est juste comme disant, [TOUX], toux, et en attendant, éternuements
comme dire, [ACHOO].
Et donc je l'ai généralisé la mise en œuvre de ceux
maintenant la mise en œuvre cette fonction générique,
dire, ce qui est intéressant pour les besoins d'aujourd'hui
seulement parce qu'il reste n'a pas de type de retour.
Mais combien entrées-t-il?
AUDIENCE: Deux.
ENCEINTE 1: Deux.
Et donc si vous voulez prendre deux arguments,
il suffit de les séparer par une virgule.
Et si vous voulez, puis appeler cette fonction,
remarquerez que vous venez appeler disons, entre guillemets,
pour le premier argument, commune n, pour le second argument.
Encore une fois, nous venons de le blocs de construction afin que nous puissions effectivement
mettre en œuvre certaines de nos propres fonctions.
Bien.
Vous avez des questions à ce sujet?
>> Alors maintenant, nous allons décoller une couche si.
Et l'objectif, à terme, est le problème de l'ensemble de la semaine prochaine
va être sur cryptogrophy-- l'art de brouiller l'information.
Et plus particulièrement, les informations vous fera cryptage ou le décryptage
va être du texte.
Et si ce genre d'invitations La question aujourd'hui comme bien,
ce qui se passe sous le capot avec du texte ASCII au-delà de la semaine zéro,
et comment pouvons-nous réellement commencer à manipuler?
Donc, voici le nom de Zamyla.
Et dans le texte, qui pourrait être saisi dans comme la fonction de chaîne de get.
Et à partir de maintenant, quand vous voyez un chaîne comme this-- Z-A-M-Y-L-A-
commencer à penser comme si, à chaque de ces caractères est dans une boîte de son
propre.
Et en effet, dans une semaine ou deux est temps, chacune de ces boîtes
va représenter très précisément un bloc de memory-- une bouchée de mémoire.
Donc, chacun de ces lettres, finalement, représentera 8 bits.
Et nous allons réellement voir ce qui se passe sur sous le capot dans mon ordinateur.
>> Mais pour ne pas il suffit juste à regarder Zamyla
dans cette optique, de sorte que chacun des ces lettres est dans sa propre boîte.
Et bien assez dans C nous pouvons accéder à chacune de ces boîtes directement.
Donc, si vous voulez obtenir la première lettre de son nom, super facile en C.
Si vous voulez obtenir la dernière lettre, super facile ainsi
avec un morceau de nouvelle syntaxe.
>> Donc, je vais aller de l'avant dans CS50 IDE et d'ouvrir la chaîne zéro point C.
Et dans cet exemple ici, il ya un couple de nouvelles choses qui se passent.
Donc, en première ligne 19, nous avons vu cette chaîne de get before--.
Ainsi, tout comme un test de cohérence rapide, si quelqu'un pouvait offrir verbalement
l'explication d'un profane de ce qui se passe sur la ligne 19.
Comme à peu traduire en Anglais qu'un colocataire pas dans CS50
pourrait comprendre.
Ouais.
>> AUDIENCE: Avoir l'utilisateur une entrée chaîne et de le stocker dans un s variable.
ENCEINTE 1: Bon.
Avoir l'entrée de l'utilisateur une chaîne et de le stocker dans un s variable.
C'est génial.
Donc, sur la droite côté, nous appelons chaîne de get.
Qui renvoie une valeur qui n'a pas été affecté
de droite à gauche côté dans une variable appelée s qui est
conçu pour stocker une chaîne de caractères.
Exactement.
>> Donc maintenant aligner 22, par le commentaire à la ligne 21,
imprime évidemment cette chaîne un caractère par ligne.
Mais comment?
Alors tout d'abord, on initialise I 0.
Et puis comment arrivons-nous à la fin du nom de Zamyla?
De plus, à la fin de Le nom de Zamyla, je pouvais
tapez manuellement dans le dernier caractère de son nom en quelque sorte, ou le numéro de celui-ci.
Droit?
Si nous revenons ici-- Z-A-M-L-- Y-L-A- pour que je puisse saisir.
Quel est l'indice de La dernière lettre de Zamyla?
Si cela est 0-- parler comme un programmer-- 0, 1, 2, 3, 4, 5,
Je heard-- tellement en effet, la dernière lettre au nom de Zamyla est le sixième,
mais si nous comptons de 0, ça va être le numéro 5.
Donc, gardez cela à l'esprit ici.
>> Il se trouve qu'il ya une fonction dans C appelle strlen, et retour dans la journée
et à ce jour encore, beaucoup de programmeurs
choisir de synchroniser les noms pour leur fonctions qui sonnent comme les mots
ils essaient de dire.
Donc strlen est longueur de la chaîne.
Et donc ce qui serait longueur de la chaîne S retour lorsque Zamyla est l'entrée?
>> AUDIENCE: Cinq.
>> ENCEINTE 1: Z-A-M-Y-L. Six.
Droit?
Quelle est la longueur du nom de Zamyla?
Droit?
Et en réalité, six lettres.
Droit?
Et qu'est-ce que cela signifie pour notre boucle?
Nous allons aller de 0 jusqu'à six, qui
va nous donner cinq itérations.
Que faisons-nous à chaque itération?
Eh bien, pour cent C, quelqu'un deviné l'autre jour,
signifie un espace réservé pour quoi?
>> AUDIENCE: Char.
ENCEINTE 1: Juste un caractère.
Donc, un seul character-- pas plusieurs personnages comme une chaîne.
Et puis voici la nouvelle ligne que nous avons l'impression de.
Et puis voici la nouvelle syntaxe.
Si vous voulez imprimer le i-ème caractère de la chaîne S, pour ainsi dire,
vous pouvez tout simplement dire que le nom de la chaîne S,
puis ouvrez crochet, et puis fermé crochet, avec un i
le milieu.
Et il est plutôt agréable dans ce il ressemble un peu à un carré
tout comme les carrés dans lesquels Zamyla de personnages existent sur cette photo il.
>> Donc, si je lance ce fait maintenant, nous allons voir ce qui se passe.
Assurez-chaîne 0 point barre oblique chaîne 0, et puis je suis
aller à taper le nom de Zamyla.
Il n'y a pas rapide, parce que je ne l'ai pas utiliser print f, mais ça va.
Je sais exactement quoi faire.
Et en effet, il imprime Le nom de Zamyla, un par ligne.
>> Maintenant, nous allons être un peu téméraire.
Supposons que je ne sais pas à propos de strlen et je pensais,
tout droit, personne ne va avoir un nommer comme plus grand que 50 caractères.
Allons de l'avant et de recompiler et relancez-le, puis tapez Zamyla
de nouveau.
Logiquement, ce qui est le programme va essayer d'imprimer?
Z-A-M-Y-L-A alors comme 45 inconnus octets de mémoire.
Et en effet, nous reviendrons à cette idée de la mémoire.
Mais tout logiquement, si Le nom de Zamyla est cette longue,
comme par l'image ici, ce que nous disons
est de garder l'impression, l'impression garder, garder l'impression, l'impression de garder, garder l'impression,
tout le chemin à caractère 50e, qui qui sait ce qui va se passer.
Prenons donc effectivement un regard.
Disons type dans Zamyla.
Intéressant.
Nous avons eu de la chance.
Juste un tas d'espace blanc.
Oh.
Il ya un caractère funky.
Il ressemble un peu à une question bizarre y marquer, mais il est le nom de Zamyla.
Mettons-nous vraiment téméraire.
Que diriez-vous nous imprimons sur 500 blocs dans l'inconnu?
Allons de l'avant et faire de cette ainsi, puis ré-exécuter.
De et laisser plein écran, parce que nous avons besoin de voir plus d'espace.
Zamyla.
Vous avez encore la chance.
>> Oserons-nous obtenons plus téméraire?
Soyons plus téméraire.
50.000 caractères.
Ceci est très certainement pas une bonne idée.
Bien.
Assurez-chaîne 0.
Ce sera notre dernière démonstration.
Zamyla.
Ugh.
D'ACCORD.
Donc, ma mémoire est vraiment vide maintenant, qui est en fait assez pratique.
Ce que je veux essayer d'obtenir to-- tout droit.
Et maintenant, je vais juste pour obtenir téméraire.
500.000.
Make-- disons plein écran il.
Entrez.
Zamyla.
Nous y voilà.
Je ne sais pas ce que cela est, mais il sonne mal.
Bien.
Et en fait, bientôt, si vous êtes parmi quelques privilégiés dans les heures de bureau
et définir un problème, vous pourrait très bien rencontrer ce.
Segmentation fault ne fait avoir un sens bien défini.
Cela signifie une sorte d'erreur relatif à un segment de mémoire.
Et en termes simples, cela signifie que nous touchions
memory-- nous avons utilisé la RAM dans mon ordinateur que je ne devrais pas avoir eu accès à.
Et qui est ce qui est à la fois puissant et également dangereux
C est à propos que vous avez réellement avoir un accès sans entrave
à l'intégralité de la mémoire de votre programme ou octets ou RAM, plus précisément.
>> Ainsi, même si le nom de Zamyla est seulement six caractères,
Je peux encore aller partout en mémoire que je veux.
Et en passant, si vous avez jamais lu quelque article
au fil des ans au sujet de certains ou un programme serveur
se fissuré ou piraté qui est profité de quelque chose
appelé un débordement de tampon exploiter que nous allons effectivement
parler dans quelques semaines, que ce généralement référence à tromper en quelque sorte
un ordinateur en allant bien au- au-delà des limites de la mémoire
qu'il devrait avoir, et trouver quelque chose de juteux
en ce qu 'un memory-- mot de passe, peut-être, d'une manière
de contourner certains numéro de série vérifier, ou plus généralement en mesure
pour tromper l'ordinateur exécute code qui n'a pas été prévu.
Mais revenons à la réalité pour un instant
où ce programme était mis en œuvre avec strlen,
et d'introduire une chose ici.
Quoi de neuf chez ces trois premières lignes?
>> Alors chaîne dot h.
Il se trouve qu'il ya cette bibliothèque appelée Chaîne Dot H, ou la Bibliothèque String,
dont le fichier d'en-tête, pour ainsi dire, est une chaîne dot h qui me donne
l'accès à cette fonction strlen.
Si je laisse de côté que le compilateur est va me crier dessus dans une certaine forme.
Mais vous savez quoi?
Maintenant, nous allons vraiment nuancée.
Dans la ligne 22, il ya quelque chose de gentil de inefficient-- mal conçu,
arguably-- de cette ligne de code.
Pensez à la façon dont pour en boucle sont mises en œuvre
et quelles mesures cela se reproduise et et de nouveau again-- l'initialisation,
l'état, le code qui est exécuté, alors l'incrément
ou le changement, alors la condition, puis le code, alors le changement, puis
l'état, le code, puis le changement, et ainsi de suite.
Donc, ce que pourrait être un peu inquiétante ou mal fait ici?
Ouais, en bleu.
AUDIENCE: strlen est appelé de nombreuses fois.
ENCEINTE 1: Ouais.
Alors que l'on appelle strlen à plusieurs reprises, mais ce qui est
la longueur du nom de l'Zamyla la première exécution de la boucle?
>> AUDIENCE: Six.
>> ENCEINTE 1: Six.
Eh bien, ce qui est la longueur de son nom la deuxième fois le code exécute?
>> AUDIENCE: Six.
>> ENCEINTE 1: Très bien.
Il est toujours de six.
Droit?
Le nom de Zarla n'a pas changé, même si je suis à la recherche
à une partie seulement des lettres dans son nom.
Et le fait que je suis efficace posant cette question, ce qui est
la longueur de Zamyla, quelle est la longueur de Zamyla, quelle est la longueur de Zamyla,
six fois séparés, ou sept même, est tout simplement stupide,
parce que ce immuable cette réponse.
Et donc ce que je pouvais effectivement faire est this-- dans une seule chaîne
Je ai un peu mieux version ici.
There-- chaîne whoops-- deux, je dois un peu mieux la version dans laquelle
Je fais this-- au lieu de simplement i initialisation à 0, je aussi avec une virgule
déclarer une seconde variable appelée n-- je ne dois dire int nouveau.
Je ne devrais pas, en fait.
Mais je dis n.
Et puis je l'initialise à n l'strlen de n, de sorte que maintenant
combien de fois ne strlen se exécuté au total?
Juste une fois.
Et donc ce que nous entendons plus tôt sur une meilleure conception.
En fait, une fois que votre code est correct, revenir en arrière et de penser à travers,
Je suis en utilisant aussi peu mémoire ou que quelques secondes
ou millisecondes de temps d'ordinateur que possible de mettre en œuvre un certain problème?
Et je vais faire défiler et juste parler
qu'il ya cette mention null dans cette version,
mais nous allons revenir à ce que avant longtemps.
Parce que pour l'instant, nous allons jeter un coup d'oeil à où cela va nous mener.
Donc, une, il se trouve que maintenant que nous avons la capacité
à regarder des caractères individuels, nous pouvons tirer parti quelque chose
de la semaine 0 qui était très obscur et sorte de inintéressante à l'époque.
Mais maintenant, et surtout quand on obtenir à la cryptographie dans une semaine,
ça va être assez puissant.
Il se trouve que certains les ints et chars de données
et les caractères et les cordes et autre things-- certains d'entre eux
peut être très facilement converti en un autre.
>> Par exemple, lorsque nous avons parlé à propos de ASCII certain temps ago-- voici
les lettres majuscules A par M, point, point,
dot-- nous avons dit qu'il ya une cartographie entre ces lettres et de chiffres.
Et en fait, il est vrai pour les lettres minuscules ainsi.
Minuscules est un 97, le capital est un 65.
Et il ya un certain nombre en ASCII, qui est juste cette cartographie
système pour l'ensemble de ces autres lettres.
donc, qu'est-ce que ça veut dire?
Eh bien, je vais aller de l'avant et ouvert jusqu'à réel rapidement quelque chose appelé
ASCII 0, qui est plus de commentaires.
Et de nouveau en ligne vous pouvez toujours coup d'oeil à travers les commentaires.
>> Et jetez un oeil ce cela va faire.
Donc, il a une fonction principale.
Je l'ai codé en dur les chiffres juste pour maintenant, parce que je sais ce que je fais.
Je sais ce que je veux voir ici.
Et je l'ai initialisé I 65.
Et je compte jusqu'à à 26 lettres au total.
Et qu'est-ce que je vais imprimer une ligne à la fois
si vous pouvez interpréter Cela met en évidence la ligne?
Ce qui est imprimé?
Ouais.
>> AUDIENCE: Allez-vous d'imprimer la lettre
correspond à la carte de la valeur de lettre et valeur entière?
ENCEINTE 1: Exactement.
Je vais imprimer la lettre correspondant à la valeur de nombre entier,
et vice versa, comme suit.
Eh bien cela, quelqu'un a dit plus tôt, est juste un espace réservé pour un caractère.
Il est encore.
Ceci, bien sûr, est un espace réservé pour un int-- pas une nouvelle ligne.
Et maintenant remarquer, ma première valeur Je brancher l'appareil pour que l'espace réservé
est pas seulement I. Je dis, entre parenthèses, char I,
dont le charbon est entre parenthèses dire le compilateur, je traiter
pas comme ce qu'il est, qui est un nombre.
Traitez-le comme un vrai caractère.
Considérant que la deuxième valeur Je branchant in-- I-- devrait juste être un nombre.
>> Donc, si je compile cette program-- si cela est faire ASCII 0,
point barre ASCII 0-- je reçois juste ce petit tableau pratique que
me montre tous les possibles mappings sans avoir à penser qu'il
à travers ou le découvrir par moi-même.
Et je suis aussi imprimer, remarquer les lettres minuscules,
parce que quelques lignes plus tard, je imprimer également sur cette cartographie
ainsi, ce qui est juste pour dire qu'une fois que vous comprenez
ce qui se passe en dessous le capot, pouvez-vous
convertira automatiquement en arrière.
Et en fait, si l'un de vous jamais fait cela à l'école primaire
ou entendu parler de quelqu'un prenant mythiquement une note
et il passe à son ou son ami dans la classe,
mais vous l'brouillés par lettres comme A devient B,
et B devient C, ou quelque chose plus compliqué que cela, eh bien,
comment voulez-vous aller sur la mise en œuvre que comme un gamin?
Eh bien, vous savez juste genre de A devient B, B devient C,
mais mathématiquement, ce qui a été fait cet enfant?
Que faisiez-vous en ajoutant à chaque lettre?
En effet, 1.
>> Ainsi, lorsque vous changez de A à B, qui est un peu comme changer 65-66,
ce qui signifie que mathématiquement il suffit d'ajouter 1.
Et si vous étiez à mettre en œuvre que peu de technique trompeuse
pour votre professeur dans le code, vous pourrait faire exactement ce que vient
en ajoutant une seule lettre ensemble.
Donc, avant longtemps, nous sommes allons voir comment nous
peut profiter de ce réellement scramble véritablement et unscramble
information.
En attendant, sachez que nous avons commencé d'introduire un couple d'autres bibliothèques
ici-- la chaîne un aujourd'hui.
Et un site très utile nous espérons que vous trouverez
est appelé reference.cs50.net, qui le personnel enseignant ont mis en place,
de sorte que si vous voulez regarder comment fonctionne strlen,
vous pouvez commencer à taper le nom de la fonction,
il cliquez strlen, puis une explication moins à l'aise
va apparaître.
Ou si vous voulez le fonctionnaire Explication basé sur Linux,
vous pouvez cliquer plus confortable en haut à droite, et il
présentera la même information, mais en termes plus complexes.
Voilà une ressource utile pour savent réellement ce que tout fait.
>> La prochaine fois que nous allons jetez un oeil à l'Ovomaltine
en plus, et nous présenter dans le monde de la cryptographie.
Avant cela, nous verrons vous plus tard cette semaine.
Et maintenant, Colton Ogden.
On se voit mercredi.
>> [Jouer de la musique]
>> ENCEINTE 1: Qu'est-ce que la [BIP] faites-vous?
>> ENCEINTE 1: Je mange mon dessert?
Comment mangez-vous?
Avec vos mains?
>> [Jouer de la musique]