[Powered by Google Translate] DAVID J. MALAN: Très bien, c'est CS50, et c'est la
début de la deuxième semaine.
Merci.
Commençons ici par un appel téléphonique.
Je suis sur le point de composer 617-BUG-CS50.
CS50: C'est CS50.
Pour Garçon Shuttle, appuyez sur 1.
Pour recommencer, appuyez sur 9.
DAVID J. MALAN: Alors il a dit pour le garçon Shuttle, appuyez sur 1.
Nous allons donc d'appuyer sur 1.
CS50: Quelle est votre origine?
Pour le quad, appuyez sur 1.
Mather, appuyez sur 2.
Boylston, appuyez sur 3.
Lamont, appuyez sur 4.
Mem Hall, appuyez sur 5.
Pour recommencer, appuyez sur 0.
DAVID J. MALAN: Nous allons appuyez sur 1 pour le quad.
CS50: navette Suivant quitte à l'instant même à PM 1:10, et
puis à 13 heures 20, 1:30 PM, 1:40 PM.
C'est CS50.
>> DAVID J. MALAN: Donc, c'est la voix du CS50.
Et c'est un exemple du genre de projets finaux, pour
Par exemple, vous pouvez mordre vers
la fin du semestre.
Par exemple, que shuttleboy.cs50.net existe -
en fait un projet que j'ai commencé à écrire après avoir pris CS51
quand j'étais étudiant de premier cycle.
Et l'inspiration ici était à l'époque, on n'avait rien
les horaires imprimés navette, et il n'y avait pas de
notion de regarder les choses en ligne.
Et donc je sorte de colombe dans un week-end, versé par l'
imprimer le calendrier, et l'ai porté à un programme informatique.
À l'époque, le programme informatique qui est arrivé à écrire
en C. Et vous avez réellement couru par Boy navette tapant à une
invite clignote comme nous l'avons fait jusqu'à présent.
Mais au fil des ans, il a évolué en un instant
messagerie bot.
Il a évolué plus récemment dans ce site, dans un
SMS-outil, ainsi que dans l'outil basée sur la voix.
Et c'est faire allusion à des tas de choses que vous pouvez
faire vous-même à la fin du semestre.
>> Par exemple, là-bas, la version SMS de Boy navette arrive
à opérer comme suit.
Si, sur votre téléphone portable, vous envoyez un message texte à 41411 et
puis envoyez le sboy symbole spécial, pour le garçon de navette,
suivi par A et B, où A est une origine et B est un
destination -
par exemple, l'espace Boylston Quad -
ce que vous devriez retrouver en quelques secondes est un texte
message de Boy navette vous dire exactement quand le
prochaines années navettes sont, de ce point A va que
point B.
Et ceci est un exemple plus général de ce qui est connu comme
à l'aide d'une API.
>> Ainsi, par exemple, voir ici est juste shuttleboy.cs50.net, l'
réelle sur le Web incarnation de cette.
Mais les données qui souligne ceci et d'autres applications qui CS50
a développé sommes tous exposés à tout le monde ici sous la forme
d'API, les interfaces de programmation d'applications.
Et c'est juste une façon élégante de dire que les gens que nous aimons le
l'Internet et d'autres ont passé un certain temps à la création
logiciels que vous pouvez utiliser pour récupérer des données à partir de nous et
puis construire vos propres applications sur le dessus
de cet ensemble de données.
Ainsi, par exemple, cette page API navette Boy ici, ce qui
se trouve être dans le mode CS50, essentiellement des documents
comment vous pouvez suivre pour demander CS50 serveurs de données.
Par exemple, si vous êtes familier avec les fichiers CSV, comma
valeurs séparées, ce sont juste une sorte de rapide et sale
Excel-comme les fichiers.
Ainsi, vous pouvez demander Boy navette pour l'ensemble des données sur l'ensemble de la
maisons et leurs coordonnées GPS, et vous obtiendrez
dos, pour l'essentiel, une feuille de calcul comme celle que
Vous pouvez alors lire dans un programme de votre choix, puis
générer des résultats, comme Boy navette elle-même
arrive à faire.
Pour les plus familiers, les représentations de données les plus modernes
comprennent JSON, JavaScript Object Notation.
Quelque chose va revenir vers vous pour
la fin du semestre.
>> Mais encore une fois, ce n'est qu'un de plusieurs API propre CS50 l'.
Et la chose la plus intéressante est, de nos jours, Facebook et
Twitter et Google et à peu près tous les sites Web populaires sur
il a une sorte d'API, ce qui signifie que si vous lisez le
documentation sur leur site, vous vous inscrivez à un
compte, vous pouvez alors commencer à écrire des logiciels sur le dessus de
tous les outils ou les données de cette société il fournit.
Et si l'un de nos compagnons d'enseignement propres quelques années en arrière
a écrit une version Mac de ce.
Ainsi, au lien intitulé Mac ici en haut à gauche, vous pouvez réellement
télécharger un widget Mac OS qui tourne sur votre Mac pour faire le
même genre de choses.
Donc, il s'agit de construire au-dessus des ensembles de données comme celles-ci.
Mais plus à ce sujet vers la fin du semestre.
>> , Donc nous plonger dans réel rapide à un bug, juste pour obtenir genre de
choses réchauffé aujourd'hui, et je pense revenir sur certains des
les choses, nous avons examiné la semaine dernière.
En particulier, laissez-moi aller de l'avant et tirer vers le haut, par exemple,
cet exemple ici.
Buggy1.c, il est disponible sur le site Web du cours si vous aviez
tiens à le télécharger et à fouiller autour de vous.
Mais nous allons zoomer ici à ce programme assez court, et juste
un résumé ultra-rapide de certains des blocs de construction de base que les
nous voulons vraiment juste de commencer à prendre pour acquis.
>> Donc la substance bleue, aux lignes 1 à 9, ne sont que
questions faciles.
Donc, ce ne sont que des commentaires.
Ils n'ont pas de signification fonctionnelle.
Mais ils sont des commentaires dans le sens où ils sont des notes que
Je, humaine, faite à moi-même ainsi que dans la conférence et après
conférence, je peux réellement me souviens que ce programme
fait sans avoir à lire ligne par ligne et
recréer l'histoire dans mon esprit.
Par ailleurs, si je remettre ce programme à quelqu'un d'autre comme
vous, c'est beaucoup plus clair pour vous, parce que des commentaires de ce genre,
ce que le programme est en train de faire, ou du moins ce que l'
programme est censé faire.
Que ce soit ou non c'est bon c'est autre chose.
Maintenant, en C, avec commentaires sur plusieurs lignes, rappelons que sur la ligne
on est ici le symbole de la magie, / *.
Cela signifie ici est le début d'un commentaire.
Et rien d'autre ne compte jusqu'à ce que vous atteignez la fin de terminaison,
qui est * /, c'est le contraire.
Donc, le fait que j'ai 80-quelques étoiles bizarres ici de
de gauche à droite est vraiment juste un détail esthétique.
Il n'a pas de signification fonctionnelle.
>> Maintenant, que diriez-vous la ligne 11?
Qu'est-ce que faire en termes simples?
Qu'est-ce que c'est?
PUBLIC: Comprend la norme.
DAVID J. MALAN: OK, très bien.
Ainsi, il inclut la bibliothèque stdio.h.
Alors qu'est-ce que ça veut dire?
Eh bien, dans ce fichier, stdio.h, ya tout un tas d'
déclarations de fonctions -
c'est-à-code que quelqu'un d'autre a écrit.
Et un parfait exemple d'une fonction qui est déclarée dans
stdio.h est -
qui favori en ce moment?
Donc, printf, l'une des plus courantes à utiliser, certainement
dès le début, à partir de cette bibliothèque est là.
Si j'exclus cette ligne de code, Clang va crier
à me parler en utilisant un symbole non déclaré.
Quelque chose non déclarés est probablement le mot-clé, parce
nous n'avons pas informé le compilateur ce qui semble printf
comme si nous ne comprennent cette ligne.
Et plus terre à terre, vraiment, ce que veut dire, c'est la ligne
ouvrir ce fichier, stdio.h, partout où il se trouve sur le serveur de
disque dur ou un disque dur de l'appareil, et de copier-coller l'
juste là dans mon dossier, sans que je
avoir à le faire manuellement.
>> Maintenant, une fois que nous recevons ici au menu principal, avant longtemps, nous allons commencer
taquiner à part ce que int et ce vide est.
Mais pour l'instant, regardons les trois lignes
dans les 15 à 17 ans.
Cette là je revendique comme buggy.
Ligne 7 dans mes commentaires dit "Si Affichera 10
astérisques, mais n'a pas. "Pourquoi cela ne s'imprime pas, en fait,
Ces 10 étoiles?
PUBLIC: [Inaudible].
DAVID J. MALAN: Exactement.
Donc, remarquez que nous commençons à compter à partir de 0.
Et c'est effectivement une convention dans la programmation et
l'informatique, plus généralement, de commencer à compter
de 0 au lieu de 1.
Et c'est vraiment découle simplement du fait que, pour
Par exemple, lorsque nous avons eu huit personnes sur la scène, lorsque
personne ne levait la main, ils étaient
tous les zéros de manière efficace.
Et donc c'est juste une sorte de convention ordinateur afin,
Par conséquent, à compter à partir de 0.
Si c'est le nombre le plus bas vous pouvez représenter en binaire.
>> Donc, ici, nous avons commencé i initialiser à 0.
Nous avons mis i égal à 0.
Mais ensuite, j'ai fait cette erreur ici, en disant i est inférieur ou
égale à 10.
Mais si vous pensez que par le biais, si je commence à 0 et puis je m'en vais
jusqu'à 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, je vais en fait
imprimer 11 étoiles à l'écran, parce que je suis allé jusqu'à
à et égale à 10.
Donc, la solution facile ici, c'est alors qu'est-ce?
PUBLIC: [Inaudible].
DAVID J. MALAN: il suffit de changer à moins de.
Si vous voulez vraiment, vous pouvez le faire.
Mais en général, qui est mal vu.
Et ainsi de commencer à compter à partir de 0 est juste quelque chose, vous devriez
généralement s'habituer.
Maintenant, qu'en est-il de cette construction entière en elle-même?
Ces 15 lignes demarks une boucle for.
Donc, c'est pas une fonction.
C'est juste une déclaration.
Il s'agit d'une construction de boucle, comme nous l'avons vu dans Scratch.
Et il comporte trois parties.
Notez qu'il ya la première partie de
la gauche de la virgule.
Il ya la partie centrale entre les deux points-virgules.
Et puis il ya la partie droite vers la droite
le point-virgule seconde.
Maintenant, le premier d'entre eux fait quoi?
PUBLIC: [Inaudible].
DAVID J. MALAN: Là-bas?
Ouais?
PUBLIC: Initialisation.
>> DAVID J. MALAN: Initialisation.
Alors qu'est-ce que cela signifie?
Nous avons déclaré une variable appelée i.
Il est de type int, parce que j'ai spécifié int i.
Et je suis i initialiser à la valeur de 0.
Alors, quel est ce vraiment dire?
Il a effectivement dit à l'ordinateur hey, me donner assez
mémoire, assez de RAM, pour s'adapter à un certain nombre, et ensuite mettre le
numéro 0 dans ce morceau de RAM.
Et en passant, quelle est la taille d'un int en général, au moins à l'intérieur
de l'appareil?
PUBLIC: 32 bits.
DAVID J. MALAN: 32 bits.
Cela signifie donc que me donner 32 bits, autrement connu comme 4 octets,
et mettre la valeur 0 dans ce qui est assez facile, car
il faut simplement mettre tous les bits à 0.
>> Alors maintenant, la deuxième partie ici est la condition.
Et la condition, comme son nom l'indique, est ce qui est vérifié
encore et encore et encore quant à savoir si c'est vrai ou faux.
Donc, c'est juste que font les lignes de code suivantes -
à savoir la ligne 16, parce que c'est le seul retrait
dessous -
tant que i est inférieur à 10.
Et après chaque itération de cette boucle, faire le
incrémentation, qui dans ce cas est i + +.
Maintenant, il ne doit pas être i + +.
Il pourrait être i -.
Mais si je faisais ça, ce qui va le comportement
d'être de ce programme?
PUBLIC: Il va y avoir une boucle infinie.
DAVID J. MALAN: Il va y avoir une sorte de boucle infinie,
sauf si nous sommes chanceux au bout de 2 milliards ou négative.
Peut-être que les choses vont s'enrouler autour, juste par nature du fini
nombre de bits que nous avons attribués pour un int.
Mais il va certainement réitérer beaucoup plus que 10 et
certainement plus de 11 fois ici.
>> Et maintenant, juste en passant, sachez que i + + et i -
sont vraiment juste du sucre syntaxique.
C'est juste notation abrégée pour ce qui est d'un peu plus
explicitement écrite comme suit:
i = i + 1.
Qui est identique à i + +.
C'est en quelque sorte plus joli de dire i + +.
Il est plus succinct, plus lisible.
Et la plupart des gens le faire à la place.
Mais ce n'est identiques fonctionnellement à
ce que nous venons de voir.
Donc, en résumé, la solution miracle ici est juste de dire que j'ai une itération
de 0 sur toute la hauteur de moins de 10.
Et puis nous allons en effet avoir 10 étoiles.
>> Donc, nous allons essayer.
Permettez-moi d'ouvrir le terminal vers le bas.
Laissez-moi aller dans le répertoire que ce n'est po
Et je vais le compiler manuellement avec Clang pour le moment.
Et je vais le compiler comme buggy1.c, Entrée.
Et maintenant buggy1, pourquoi y at-il aucun fichier ou répertoire
appelé buggy1?
PUBLIC: [Inaudible].
DAVID J. MALAN: Ouais.
Donc, il est effectivement appelé a.out.
Alors souvenez si vous lancez simplement Clang, où Clang est le
compilateur, et que vous ne spécifiez pas le nom que vous souhaitez
donner à votre programme, il va par défaut au format a.out.
Donc, en effet, si je fais ls -
oops.
Et je didn't - la question noire et blanc quelques-uns des
vous avez été confronté a été corrigé.
Mais laissez-moi faire.
Là, nous avons a.out sur le côté gauche là-bas.
Donc, nous avons à exécuter a.out au lieu de buggy1.
>> Alors laissez-moi aller de l'avant et de le faire.
. / A.out, Entrée.
Et je ne semble pas avoir fait quoi?
PUBLIC: Enregistrer.
DAVID J. MALAN: Sauvegarder mes fichiers.
Alors qui est facilement résolu en appuyant sur S de contrôle, ou d'aller à
Fichier, Enregistrer, comme dans la plupart des programmes.
Permettez-moi de descendre ici, effacer l'écran, exécutez-le à nouveau.
Et il ya encore un bug.
Donc ce qui se passe -
PUBLIC: Vous n'avez pas compiler.
DAVID J. MALAN: Ah, bon.
Je n'ai pas le compiler.
Comme une idiote, je regarde le code pour voir ce qui ne va pas.
Buggy1.c clang Donc, maintenant a.out.
Et ouf, sauvé.
>> Ainsi, il semble un peu laid parce qu'il n'y a pas de nouvelle ligne
n'importe où dans le programme.
Mais encore une fois, c'est juste un détail esthétique.
Et au moins si l'on compte ceux sur, nous devrions
maintenant voir 10 ces étoiles.
Eh bien, que dire de cette deuxième warm-up par exemple?
Donc, en buggy2, je prétends que cette version aussi, vous imprimez
10 étoiles, une par ligne.
Alors cette fois, j'ai un caractère de nouvelle ligne, juste pour faire
les choses un peu plus joli.
Mais au lieu que je reçois est le suivant.
Alors laissez-moi faire buggy2.c clang, Entrée.
Maintenant, il est à nouveau appelé a.out.
Entrée.
Je ne vois qu'une nouvelle ligne, seule la dernière ligne nouvelle
déplace mon prompt à la ligne suivante.
Et pourtant clairement que j'ai été l'impression *, puis une nouvelle ligne,
*, Puis une nouvelle ligne.
Mais quel est le bug ici?
Ouais?
PUBLIC: [Inaudible].
>> DAVID J. MALAN: Exactement.
Donc, contrairement à certains langages, comme Python, où l'indentation
a effectivement signification fonctionnelle, dans un
langage comme le C -
comme nous le verrons, PHP, JavaScript -
l'indentation est vraiment juste pour le bénéfice des humains.
Donc, le fait que je suis en retrait lignes 16 et 17 ressemble beaucoup,
mais il n'a pas de signification fonctionnelle ici.
Si je veux les deux lignes à exécuter dans le cadre de l'd'
boucle, alors je dois les enfermer dans des accolades en faisant cela.
Vous ne pouvez couper ce coin et omettre les accolades si
ce qui est le cas?
PUBLIC: Une seule ligne.
DAVID J. MALAN: Une seule ligne.
Donc, c'est juste une sorte de tri agréable de détail syntaxe afin de
vous ne perdez pas de temps à écrire trois lignes, dont deux sont
accolades, juste pour écrire une seule ligne de code.
Mais si vous avez deux ou plusieurs lignes, nous
en effet besoin de faire cela.
>> Alors maintenant, laissez-moi sauver ce.
Permettez-moi aller de l'avant et relancer Clang.
Alors laissez-moi relancer a.out, et maintenant je reçois les un par ligne.
Maintenant, a.out est de nouveau genre d'un nom stupide pour un programme.
Comment puis-je savoir Clang réellement me donner un nom de fichier
c'est plus convivial, comme buggy2 lui-même?
Un peu plus clairement?
PUBLIC: [Inaudible].
DAVID J. MALAN: OK, pour que je puisse prendre la très
conviviale raccourci et il suffit d'écrire buggy2 faire.
Je ne le précise pas. C dans ce cas, et appuyez sur Entrée.
Et ce qui rend le fait est qu'il compile buggy2.c pour moi par
Clang demandant de le faire.
Plus précisément, il appelle Clang, il fonctionne Clang en utilisant de façon plus
de ligne de commande arguments ou des commutateurs que je réellement besoin.
Avec le temps, nous allons revenir à ce que l'ensemble de ces différents
énigmatiques expressions trait d'union signifie.
Mais pour l'instant, c'est juste de me sauver la peine de
avoir à se rappeler et d'avoir à taper tous ceux
diverses expressions trait d'union.
Et la hausse de celui-ci est finalement
que maintenant je dois buggy2.
Si je veux le faire manuellement, cependant, je
peuvent au contraire faire -
clang-o buggy2 puis buggy2.c.
Et cela même me donner un fichier appelé buggy2.
>> Donc en bref, c'est le compilateur Clang.
Assurez est juste un outil convivial que nous allons utiliser plus
en plus, car il commence tout juste à
simplifier les choses pour nous.
Et nous retourner 0, enfin.
Pour l'instant, parce que, mais nous allons commencer taquiner cette partie
aujourd'hui et mercredi.
Toutes les questions sur tout cela?
Ouais?
PUBLIC: [Inaudible]
ls entre guillemets là-bas?
DAVID J. MALAN: OK.
Quand je ls typées entre guillemets, qui me font un peu de magie
dans les coulisses pour corriger un bug.
J'ai oublié, comme nous avons dit beaucoup d'entre vous sur le
forums de discussion, à faire -
nous allons le faire maintenant - sudo yum-y appliance50 mise à jour.
Oups, que ce n'est orthographié.
Ainsi, l'appareil est comme un système d'exploitation.
Il fonctionne ce système d'exploitation appelé Fedora.
Et maintenant, à cause de ma connexion Internet est lente, j'ai
vraiment arrosé.
Il faut donc lancer yum update sudo, comme nous vous disons de faire dans le
problème posé, est essentiellement envie de courir mises à jour automatiques
sous Mac OS ou Windows.
Et la raison de l'exécution de ce dès le début de la
ensemble de problèmes parce que quand nous avons créé l'appareil, je
foiré, et j'ai accidentellement fait tous vos programmes regardent
noir sur un écran noir, ce qui explique pourquoi vous ne les voyant pas
par défaut.
Mais la dernière version de l'appareil corrige cela.
Et je vais arranger ça pendant la pause une fois que j'ai Internet
connectivité.
>> Ainsi, les devis simplement cache mon erreur, très discrètement,
apparemment.
D'autres questions?
Oui?
PUBLIC: Où va faire venir?
[Inaudible]
DAVID J. MALAN: Bonne question.
Où faire venir?
Il s'agit d'un programme Linux qui existe depuis de nombreuses années, à long
avant CS50.
Et il est livré avec un système d'exploitation comme Fedora.
Il ne vient pas de la bibliothèque CS50.
En fait, les seules choses qui viennent de la bibliothèque CS50
à ce jour, que nous avons vu, sont GetString, getInt, tous
Obtenez les fonctions, et la chaîne de mots, et dans une certaine
mesure, le mot bool.
Mais nous allons taquiner qu'en dehors quand nous plonger dans le CS50
appareil lui-même.
>> Alors oui, encore une question ici.
PUBLIC: Quand vous dites faire et puis buggy, comment le
ordinateur sait [inaudible]?
DAVID J. MALAN: Bonne question.
Alors, quand vous venez de lancer make buggy1 ou faire buggy2, comment
ne faire connaître?
Donc, par défaut, si vous tapez make buggy1, assurez-regards pour un
fichier appelé buggy1.c.
Et puis il exécute les commandes appropriées Clang,
annulant ainsi le fichier de sortie par défaut appelé a.out.
En fait, si on regarde ce que font, ce qui -
nous allons quitter ce.
Si nous regardons ce que font faisait en réalité, faire buggy2,
il est déjà à jour.
Alors laissez-moi retirer la commande rm, le
programme que j'ai écrit auparavant.
Taper Y-E-S pour confirmer que je veux l'enlever.
Si je fais maintenant faire, notez que dans cette très longue ligne,
il ya cette dernière chose ici,-o buggy2.
Toutes les marque ne fait que passer cet argument, pour ainsi dire, à
Clang, de sorte que je n'ai pas à le taper moi-même.
>> D'accord, donc un couple rapide administrative
annonces.
Donc, pour les sections, qui a débuté officiellement prochain
Dimanche, vous aurez toujours besoin d'apporter, si
vous en avez un, un ordinateur portable.
Si vous ne disposez pas d'un ordinateur portable, ne toucher à moi par
tomber moi un email.
Et nous allons trouver un workflow.
Qu'est-ce généralement que vous trouverez dans la section est qu'ils font partie
conceptuel, une partie pratique.
Nous allons utiliser la section spécifiquement de questions, une partie de
problème posé de la semaine, de marcher à travers une partie de la
matériel conceptuel de conférence.
Et c'est tout dans le jeu problématique actuelle.
Et nous allons également plonger dans certaines activités mains sur, parfois
qui devront être soumis, parfois de
qui ne sera pas.
Par exemple, cette première semaine, ils sont faits comme un
exercice d'échauffement.
Et vous verrez que ces problèmes sont vraiment juste cela.
Ils sont censés être assez petite, mais pas nécessairement
programmes trivial d'écrire, qui ne sont pas nécessairement
intéressantes en elles-mêmes, mais sont de bonnes occasions pour
pratiquer avec la syntaxe, avec de nouvelles fonctions, dans le confort d'un
section où vous avez un peu de vos camarades de classe présentent comme
ainsi que votre carte de TF.
>> Et ce que nous ferons au cours du temps est d'utiliser un outil appelé CS50 espaces,
où au lieu de simplement utiliser l'appareil CS50, vous aurez
allez plutôt vers une page Web dans un navigateur, où vous pourrez
écrire du code dans une fenêtre du navigateur pendant section.
Et puis, si vous optez, votre adjoint à l'enseignement peut alors montrer
quoi que ce soit que vous tapez sur votre écran dans votre navigateur
fenêtre à l'avant de la classe, que ce soit anonyme ou
publiquement, afin qu'il ou elle peut alors traverser avec
tes camarades de classe que vous avez bien fait, ce que vous n'avez pas bien.
Et encore une fois, rassurez-vous tout cela peut être bien anonymisée.
Mais ce sera une belle occasion pour beaucoup plus
l'interactivité que quelque chose comme exposé le permet.
>> En attendant, nous aurons ces choses appelées super-
sections, qui sont facultatives, mais sont ouverts à tout le monde dans
la classe, de sorte que vous pouvez le faire plus collectivement pour
problème défini un.
Voici l'horaire.
Ceci est également affiché sur la page d'accueil de cs50.net.
Notez qu'il y aura un pirate spécifique
un après-midi de demain.
Et nous allons filmer un aujourd'hui et un demain et après les
en ligne dans les 24 heures.
Donc, si vous ne pouvez pas faire de l'une de ces fois, ne vous inquiétez pas.
Et encore une fois, le calendrier est en ligne maintenant sur cs50.net.
>> Pour ce qui est de lui-même la coupe, vous devriez avoir obtenu un
courriel vous demandant d'aller à l'accueil du cours pour trouver
sur votre article.
Si la vie a changé et vous avez besoin de changer votre section,
pas un problème.
Retour à la même URL, cs50.net/section, singulier,
et vous remplirez le formulaire de similaire afin que vous puissiez
puis indiquer vos préférences.
Et nous allons suivre jusqu'à la fin de semaine à ce que nous pouvons
accueillir.
La semaine dernière, rappelons que nous avons proposé d'utiliser CS50 discuter,
outil de discussion du cours, dans la conférence.
Donc, nous avons eu 40 questions qui ont été posées et
réponse au cours de conférences.
Ainsi, il semble bien fonctionner, donc nous allons continuer
essayez de le faire.
Si, au cours de conférence, vous ne vous sentez à l'aise élevage
votre main, pas un problème.
Aller à la cs50.net/discuss, y poster, et l'un de nos enseignements
boursiers, soit y répondre par voie électronique ou augmenter leur
main sur votre compte anonyme pour demander, selon
de la nature de la cause.
Et en termes de rétroaction, généralement psets sera
retour dans une semaine.
Parce que ça prend un peu de temps pour les sections d'atteindre
équilibre, le pset abord, 0 et 1, sera un peu
retardé les choses se calment.
Mais restez à l'écoute pour que, dans les semaines à venir.
>> Très bien, alors permettez-moi de mettre mon sérieux
la voix pendant un moment.
Donc, il s'agit en fait d'un climat intéressant de
d'avoir cette discussion, ce avec tous les autres
passe sur le campus qui y est associée.
Mais CS50 a certainement eu son histoire particulière de cette
sujet, dans la mesure où chaque année, ce parcours, pour beaucoup
ans, Ad-conseils à peu près 3% de la classe.
Cette année la plus récente, 2011, Ad-CS50 embarqué 35 élèves.
Ce n'est pas, je pense, à cause du manque de clarté.
N'oublie pas que dans syllabus du cours, il ya une page d'
déclaration expliquant où les lignes sont.
Cette déclaration est répété sur chacun des
problème se couche sur la première page.
>> Donc je mentionne cela aujourd'hui vraiment juste pour faire
les gens conscients de cela.
Et nous avons essayé différentes choses.
Et ce que je pensais que nous ferions aujourd'hui est tout simplement prendre un moment pour
effectivement regarder quelques-uns des cas antérieurs qui ont été soulevées.
Plutôt que de garder ces secrets que sales petits, en fait
souligner que les élèves ont fait et comment nous avons détecté
il et vraiment ce que la motivation est primordiale pour
même d'avoir cette conversation.
Donc, avec cela dit, la ligne est essentiellement présent -
par le programme, vous êtes les bienvenus, vous êtes encouragés à
parler avec ses camarades de classe.
C'est tout le but d'avoir ces collaborative
les heures de bureau en Annenberg et d'encourager les gens à l'
projet final de travailler ensemble.
Mais la ligne est tracée lorsque vient le temps de réellement écrire
votre solution finale.
S'exprimant en anglais, tout à fait bien, parlant en pseudo-code,
tout à fait bien.
Emailing un camarade de classe de votre pset, les laisser regarder par-dessus
l'écran, comme les mains continuez à taper,
sur la ligne aussi bien.
Ne se tourner vers le programme pour les lignes particulières.
>> Mais juste pour brosser un tableau de la façon dont cela est malheureusement un
réalité, se rendre compte que il ya des sites là-bas qui
des solutions de cette classe et de nombreux autres classes.
Le fait que vous ou quelque 3% d'entre vous savent que cela existe
signifie que nous savons que cela existe.
Le fait qu'il existe des sites comme celui-ci où vous
pouvez payer quelqu'un pour réellement faire vos ensembles de problèmes - ce n'était
un cas réel qui a été soulevée l'an dernier.
Il s'agit d'un site Web appelé odesk.com.
Et Tim était le nom de la personne ici qui a été affiché sur
ce site et demandé à quelqu'un de faire son pset 7 en
ce cas particulier.
Eh bien, odesk.com Google est très faisable, et nous aussi nous sommes
très bon à googler.
Ici aussi, il ya des sites - et celui-ci est plutôt
atroce, franchement.
[RIRES]
DAVID J. MALAN: La chose drôle au sujet de ce site est si
vous lisez la page À propos, ils parlent de leur entreprise
service à la clientèle de la culture et comment est leur principale
priorité, afin de s'assurer que vos missions se
tourné dans le temps.
>> Mais en toute sincérité, encore une fois, le fait que ces sites
existent, nous nous rendons compte, aussi, sont conscients de
ces types de sites.
Et pour vous donner une idée de ce que cette forme générale,
prend, nous n'avons généralement pas de grands scandales où les gens
collaborent à n'importe quel type de grande échelle, mais plutôt
ce sont ces moments de fin de soirée de faiblesse, où vous avez tant
beaucoup à faire, c'est 04h00, vous êtes épuisé, et vous
pensez à vous-même, eh bien, laissez-moi juste jeter un oeil à mon
colocataire ou un code de mon ami ou similaire.
Et les manifestations de cette malheureusement impliquer des étudiants
A quelque chose comme ceci soumettre et de soumettre l'élève B
quelque chose comme ça, qui certainement, dans un ordinateur
classe de science, est remarquablement facile pour les informaticiens
à détecter avec un logiciel.
Ceci est un autre paradigme commun, où vous avez sorte d'
travaille aux côtés de quelqu'un, peut-être parler dans
Anglais, très bien, pseudo-code.
Mais alors vient le temps de soumettre effectivement, et les psets
juste obtenir échangées via e-mail ou Dropbox ou similaire.
Mais dans une tentative de le rendre moins évident que ce n'est
ce qui s'est passé, alors c'est ce qui est présenté.
Cela aussi ne se déclenche pas en place bien écrit des pièces de
logiciel comme nous devons effectivement détecter
ces sortes de choses.
Et en effet, ce que nous faisons est un logiciel qui compare l'exécution de tous les
cette année mémoires contre tous passé l'année
mémoires, contre tout ce qu'on a trouvé sur le
Internet, contre tous les sites d'emploi là-bas.
Tout cela est très automatisé.
Et si nous le faisons vraiment, en toute équité idéal pour les 97% qui
travaillent vraiment leurs ânes off dans ce domaine et dans d'autres
les classes et les mettre dans tous ces efforts afin que le travail
ils finissent par présenter leur est propre.
Et je peux continuer pendant des siècles.
>> Ce ne sont que quelques cas l'an dernier.
Quelques étudiants ont soumis ces fichiers de manière identique pour pset 2,
pset 3, pset 4, pset 5, pset 6, pset 9.
Dans ce cas, ce n'était quiz 0 et l'année dernière, où deux
élèves soumis à l'identique cette phrase parmi tant d'autres
d'autres, «La demande de type -" dot, dot, dot.
Ainsi, même dans une classe de 600 en sommes-nous détecter ce
sur des questionnaires soumis.
Donc, en résumé, ce - franchement, je déteste avoir ce genre de
conversation - mais c'est vraiment un effort délibéré
cette année pour essayer de faire baisser ce nombre.
Parce que même si on dit ce genre de choses tous les
année, je pense que la réalité d'avoir appesanti sur elle pour quelques-uns
Il reste secondes que d'habitude et fait simplement remarquer
que ce qui peut sembler être, hein, pas une grosse affaire, au moins
repense à ce moment particulier, à la fois en toute équité pour
vous-même et à vos camarades de classe ici.
Donc si jamais vous avez des questions sur l'endroit où la ligne
est, s'il vous plaît juste tendre la main, à moi personnellement.
Mais la réponse est toujours, complètement stressé à l'
dernière minute, l'argent dans un jour de retard.
Ou si c'est une question de ne pas avoir de jours de retard,
Honnêtement, envoyez-moi personnellement.
Nous allons trouver quelque chose.
S'il vous plaît ne mettez pas votre temps ici à Harvard en danger.
>> Maintenant, je pense que nous devrions alléger l'atmosphère, donc je
inclus ce que la diapositive suivante.
[RIRES]
DAVID J. MALAN: Ce site est super.
En fait, je suis un peu distrait.
Il ya celui-ci.
Et puis celui-ci était incroyable.
Bon, alors pensez à ce chaton tard dans la nuit lors d'
ces décisions.
Bon, revenons donc à des trucs plus fun et moins graves, comme
conditions.
>> D'accord, donc nous avons parlé brièvement à ce sujet.
C'est quelque chose qui est probablement assez familier de
le monde de Scratch.
Et dans le monde de Scratch, nous avons ce besoin parfois d'
aller faire les fourches de la route.
Soit faire ceci ou cela ou cette autre chose ici.
Et quand nous voulons le faire, nous pouvons utiliser, en C maintenant, si ce
else.
Et puis ici, nous avons des expressions booléennes.
Par exemple, les expressions booléennes ici, nous pouvons OU
leur ensemble, dans le sens que nous avons cette condition OU
à cette condition.
Nous pouvons et nous leur ensemble, dans le sens que nous voulons
vérifier cette condition et à cette condition.
Et ici nous avons une instruction switch maintenant, ce qui n'est pas le cas
syntaxiquement similaire à ce genre de conditions, mais il
nous permet de faire l'équivalent de if, else if, else if, else
si, et analogues par simple énumération cas par cas
par au cas par cas.
Donc, nous avons vu ceux dernière fois.
Et puis nous avons commencé à toucher à des choses comme les boucles.
Nous avons vu l'un de ces tout à l'heure.
Mais il ya ces autres constructions en boucle.
>> Par exemple, celui-là.
Ainsi, alors que (condition), faire cette chose encore et encore.
Donc, fondamentalement, ce qui semble être différente entre cette
boucle for et cette boucle while ici?
Cette boucle for et cette boucle while.
Ouais?
Qu'est-ce que c'est?
PUBLIC: [Inaudible].
DAVID J. MALAN: Bon.
Ainsi, alors que dans la condition de la boucle pour, il ya clairement
syntaxe plus.
Il ya cette initialisation, il ya cette mise à jour.
Dans une boucle while, il ya juste cette condition.
Il semble donc que c'est un peu rogné par rapport à l'd'
boucle, ce qui signifie que si nous voulons avoir des variables et nous voulons
d'avoir incrémentation, nous avons à
faire cette chose nous-mêmes.
>> Alors laissez-moi aller de l'avant et d'ouvrir gedit.
Permettez-moi de passer à l'appareil.
Et nous allons juste faire un petit exemple que peu
distingue une d'entre elles à partir de l'autre.
Et dans le fond de mon esprit ici, je dois dire une chose.
J'ai spécifiquement mentionné le nom de Tim.
Tim était effectivement quelqu'un que l'élève a essayé de trouver à faire
leurs devoirs pour eux.
Nous n'avions pas de Tim dans cette section particulière.
Donc réaliser, de peur que je l'ai révélée un étudiant, ce n'était pas un étudiant.
Il s'agissait d'une personne prise au hasard sur Internet faire les choses
l'année dernière par procuration.
Ainsi, nous constatons que, trop.
Donc dans ce cas là, laissez-moi aller de l'avant et
ouvrir un nouveau fichier.
Fichier, Nouveau.
Cela me donne un onglet ici.
Permettez-moi aller de l'avant et de l'enregistrer en tant loop.c.
Laisse-moi aller, puis cliquez sur Enregistrer.
Et puis ici, nous allons aller de l'avant et commencer à écrire
# Include.
Permettez-moi de zoom avant
Maintenant, nous ferons int main (void).
Maintenant, laissez-moi aller de l'avant et de faire for (int i = 0; i <
oh, 10; i + +).
Et maintenant, je vais aller de l'avant et ne imprimer la star que je
fait plus tôt.
Et puis à la fin de ce programme, nous allons juste
imprimer une nouvelle ligne, juste pour que mon prompt
ne regarde pas tout désordre.
retourner 0.
Semblent syntaxiquement correct?
Jusqu'ici.
Alors voyons voir.
>> Permettez-moi de faire un zoom arrière, aller dans ma fenêtre de terminal.
Et laissez-moi aller de l'avant et d'exécuter la boucle, parce que j'ai appelé cette
loop.c. chose
Donc, assurez-boucle.
Semble compiler OK.
Permettez-moi de fonctionner en boucle, et maintenant sur Entrée.
Et il semble avoir imprimé 10 étoiles.
Alors disons simplement convertir cela en une boucle while et voir ce que
sortes de questions que nous trébucher.
Ainsi, au lieu de cela, laissez-moi aller ici et de dire tout i est
moins de 10 -
permettez-moi de vous débarrasser de la boucle for.
OK, alors nous avons un couple de problèmes déjà.
Ainsi, la condition est la même, mais je suis évidemment à côté de la
l'initialisation.
Il me manque l'incrémentation.
Alors, que devez le compilateur probablement me dire quand j'essaie d'
compiler ce programme?
Ouais?
PUBLIC: [Inaudible].
>> DAVID J. MALAN: Bon.
Donc, il va dire quelque chose comme non déclaré - dans ce
cas, la variable i.
Et en effet, l'utilisation d'identificateur non déclaré i.
Et si cela est en contraste avec des langages comme PHP et
Python et Ruby, avec laquelle certains d'entre vous connaissent peut-être,
où vous pouvez juste une sorte de début à l'aide des variables
bon gré mal gré et ne pas avoir à vous soucier de les déclarer
explicitement toujours.
En C et dans des langages comme Java et C + +, vous devez être
Super explicite.
Et si vous voulez une variable appelée i, vous avez à me dire
quel type de variable, il est.
Donc, nous allons devoir résoudre ce problème comme suit.
Je vais devoir aller ici et tapez int i; par conséquent,
J'ai déclaré une variable appelée i.
Maintenant, j'ai sauté une étape.
J'ai évidemment pas initialisé, mais nous allons voir si cela au
Au arrêt Clang marques plaindre.
Permettez-moi de refaire ce programme.
>> Très bien, maintenant c'est juste se plaindre
pour une raison différente.
"La variable 'i' n'est pas initialisé quand il est utilisé ici." D'accord, alors
c'est assez explicite.
Initialisé signifie simplement le définissant comme égal à une valeur.
Et nous n'avons pas fait cela, mais laissez-moi est égal à 0.
Maintenant, nous allons essayer encore et relancer Clang.
Compilé pour le moment.
Et je suis sur le point de le faire fonctionner.
Mais gros ancienne boucle infinie, parce que j'ai fait l'
l'initialisation, j'ai fait la condition, mais je n'ai jamais fait
tout type d'incrémentation.
Alors, comment puis-je faire l'incrémentation?
Eh bien, dans une boucle while, on dirait que je vais devoir
de le faire à l'intérieur de la boucle, car tout comme la première
semaine exemples de constructions de boucles faisant, comme avec
les chaussettes et avec l'auto-comptage, nous avons dû faire
quelque chose de tout à la fin, comme revenir à la ligne suivante.
Que faire si je aller de l'avant et de le faire i + + ici?
Disons même pas compiler ce.
Attrape-moi déjà.
Qu'est-ce qui ne va pas ici?
PUBLIC: [Inaudible].
>> DAVID J. MALAN: Donc ce n'est certainement pas int.
C'est i.
Et les accolades, comme avant,
indentation n'est pas suffisant.
Alors maintenant, j'ai cette construction.
Ainsi, alors que i est inférieur à 10, imprimez une étoile,
puis incrémenter i.
Et la façon dont un alors que les travaux de boucle est que dès que vous appuyez sur la
bas de la boucle, qui dans ce cas ressemble à la ligne 10,
il va revenir à la ligne 6, à quel point la
état sera vérifié à nouveau.
Et si i est encore inférieur à 10, nous ferons lignes 8 et
puis 9, puis nous allons frapper 10, et de revenir à 6, encore et
à plusieurs reprises et à nouveau, tant que i est inférieur à 10.
Nous allons donc relancer faire ici.
>> Ok, nous avons compilé correct.
Permettez-moi de ré-exécuter la boucle.
Et maintenant, il semble effectivement au travail.
Donc avantages et des inconvénients ici?
Eh bien, jusqu'à présent, il s'agit en fait pas un ensemble de plo -
si mignon.
Bon, ça a été un - ah, que c'était un accident.
Très bien, nous allons donc revenir à la boucle for.
Donc pour les boucles sont bien car ils sont super explicite.
Et même si elles sont un peu maladroit d'écrire, c'est
très puissant et il vous permet de faire
plusieurs choses à la fois.
Alors que les boucles ne semble pas avoir une énorme quantité de juste valeur
encore, car il se sent comme nous avons juste à faire plus de travail.
Nous devons mettre l'initialisation ici, l'
mettre à jour ici-bas, et nous devons nous rappeler de faire tout cela.
Nous allons donc voir dans le temps qui fait prêter boucles while
eux-mêmes à peine différents contextes, différentes données
structures telles que les listes et les tables de hachage, les choses nous allons arriver à
mi-semestre.
Mais pour l'instant, de savoir qu'il ya ce troisième type connu sous le nom de do-
boucle while.
Et nous avons vu brièvement.
Et cela pourrait être utile super avec pset 1.
Chaque fois que vous voulez faire quelque chose, puis vérifier si
l'utilisateur a coopéré, et s'ils le faisaient pas, le faire à nouveau, un do-
boucle while se prête à ce genre de logique.
Parce que l'ordre de haut en bas ici l'indique,
ne signifie littéralement ce faire.
Et cela encore et encore, ce pourrait-il être?
Peut-être que cela signifie getInt appelant ou GetString puis
vérifiant la valeur de getInt ou GetString puis crier
à l'utilisateur si elles n'ont pas coopéré en leur demandant
encore et encore et encore.
Lorsque vous voulez faire quelque chose une fois,
puis vérifier certaines conditions.
>> Donc, nous allons essayer.
Permettez-moi de réellement changer cela maintenant à une boucle do-while.
Et je vais aller de l'avant et faire ce qui suit.
Donc, procédez comme suit.
Faisons int i = getInt (), mais nous allons d'abord indiquer à l'utilisateur
ce qu'il faut faire.
Donc un peu différent cette fois.
«Donnez-moi un int".
Donc je vais utiliser printf pour cela.
Et maintenant, je vais descendre ici, et je vais le faire
tandis que i est, disons, plus grand que -
Voyons, i est, disons, moins de 0, ou i est
supérieur à 10.
En d'autres termes, je veux un nombre de 1 à 9, juste
arbitrairement.
Donc, je suis en utilisant une expression booléenne ici pour combiné
faire en sorte que i est inférieur à 0 ou supérieur à 10, dans lequel
cas, je vais faire cette boucle ici.
Encore une fois, cela -
tandis que i est inférieur à 0 ou i est supérieur à 10.
>> Alors maintenant, nous allons aller de l'avant et de le faire une fois que nous avons fait.
Disons simplement faire un test de cohérence rapide.
printf ("Merci, i est% d", i).
Ainsi, ce programme simple demande à l'utilisateur un int,
fait en sorte que c'est au sein de certains intervalle de 1 à 9 inclusivement,
puis grâce à l'utilisateur en leur rappelant ce qu'ils viennent
tapé, tout comme un test de cohérence peu.
Mais nous allons voir si cela fonctionne comme prévu.
Laissez-moi aller tête baissée ici et ré-exécutez make boucle.
Hmm.
"L'utilisation de identificateur non déclaré" i "". C'est étrange.
Je croyais que nous avons décidé que.
Même symptôme, mais un code différent.
Ouais?
PUBLIC: [inaudible] à l'intérieur les deux, nous devons
[Inaudible].
>> DAVID J. MALAN: Exactement.
C'est ce qui conduit en fait nous un sujet connu comme portée.
Il s'avère que C, encore une fois, il faut vraiment que vous littéralement.
Et si vous faites quelque chose comme ça où vous déclarez un int
et lui assigner une certaine valeur, mais vous le faites à l'intérieur d'un
paire d'accolades, ce que C fait est qu'il suppose que vous
que veulent ces 32 bits connus sous le nom i d'exister au sein de la
contexte de ces accolades, dans le cadre de lignes
6 à 9. Alors i est déclarée, et il se voit attribuer un
valeur de la ligne 8, mais dès que vous sortez de
ligne 9 ci-après l'accolade, i n'est plus en
portée, pour ainsi dire.
S-C-O-P-E. Il n'est plus dans le bon contexte.
Alors maintenant, il n'ya pas de i, donc c'est comme si nous n'avions pas encore
elle a déclaré tout.
>> Alors qu'est-ce qu'un correctif, quelque chose comme ça, si le
raison en est que i est déclarée entre les accolades, ce qui
est apparemment mal?
Ici?
PUBLIC: [Inaudible].
DAVID J. MALAN: Ouais.
Ainsi, nous pouvons l'initialiser à l'extérieur.
Alors laissez-moi aller de l'avant et supprimer les parties déclaration par laquelle
Je précise le type, et laissez-moi faire ici.
Donc, à la ligne 5, il dit maintenant «Donnez-moi un int." Appelez-i.
Avis à la ligne 9, je ne veux pas faire cela, parce que je
déjà les 32 bits.
Je ne veux pas demander à l'ordinateur d'un
différents bits de 32.
Je veux utiliser ces 32 mêmes bits.
Et maintenant, parce que j'ai est déclaré à la ligne 5, il est toujours légitime
de l'utiliser dans la ligne 11 et la ligne 12.
>> Je vais donc essayer de recompiler et de voir ce
si Clang arrête de crier.
faire boucle.
Alors maintenant, il est "implicit declaration of function
«GetInt 'n'est pas valide dans C99." Qu'est-ce que c'est?
Ouais?
PUBLIC: [Inaudible].
DAVID J. MALAN: Ouais.
Alors, maintenant que je suis en train utilisant getInt, ce n'est pas quelque chose
qui vient juste de C. Cela vient de CS50.
Il nous faut donc voir ici.
Et permettez-moi de revenir à l'invite de bas
ici et relancez faire.
Bon, finalement.
Maintenant, nous avons décidé que l'erreur et d'autres.
Permettez-moi maintenant de fonctionner en boucle et de voir ce qui se passe.
«Donnez-moi un int." Je vais lui donner 11.
Je vais lui donner -1.
Je vais lui donner foo.
Je vais lui donner 5.
Et maintenant il fonctionne bien.
Mais l'invite a changé pour une raison ici.
Pourquoi at-il dit réessayer un de ces moments, mais donnez-moi un
int les trois autres fois?
Pourquoi est-ce un comportement différent?
PUBLIC: Gave une chaîne.
DAVID J. MALAN: Pardon?
PUBLIC: Vous avez donné une chaîne.
DAVID J. MALAN: Ouais.
Alors nous lui avons donné une chaîne dans cette troisième tentative,
quand j'ai tapé foo.
Foo est une chaîne.
Ce n'est évidemment pas un int.
Et la façon dont CS50 a mis en place getInt est que nous
ne vérifient pas si quelque chose est inférieure à 0 ou supérieure à 10
pour vous, car comment peut-on savoir à l'avance quel type de
int que vous voulez?
Mais nous pouvons au minimum vérifier pour vous, ne l'utilisateur au moins
tapez un nombre entier?
Et s'ils le faisaient pas, nous crions à l'utilisateur en tapant "retry" sur
l'écran.
>> Alors maintenant, nous avons un programme qui boucle. D'accord.
Maintenant, lequel des deux est le meilleur type de construction?
C'est donc là que les choses commencent à devenir un peu désordonné, l'
fait que vous devez vous rappeler de déclarer une variable ici
si vous voulez l'utiliser à l'intérieur de certains
accolades et à l'extérieur.
Mais même si cela semble un peu obscur au premier abord
coup d'œil, juste encore une fois, n'oubliez pas la simple logique.
Pour utiliser quoi que ce soit en C, qu'il s'agisse d'une fonction ou d'
c'est une variable, vous devez le comprendre, si c'est une fonction
dans une bibliothèque, ou si vous devez le déclarer.
Mais maintenant, vous devez être conscient supplémentaire du fait que
vous êtes le déclarant dans le cadre de droite.
Vous n'êtes pas le mettre trop serré à l'intérieur des parenthèses.
>> Permettez-moi donc fait reculer.
Si nous revenons à notre exemple du début, et je vais
pour revenir à int, int i = 0; i <10; i + +, et je
faire printf étoiles, comme celui-ci, puis paren près, et maintenant
printf i est maintenant -
selon la même logique, ce qui se passera lorsque je tente de
compiler ce programme?
PUBLIC: identificateur non valide.
DAVID J. MALAN: Donc, c'est un autre identifiant non valide,
identificateur non déclaré.
Maintenant, la raison pour laquelle c'est un peu différent.
Il ya évidemment ni d'accolades ici, mais le même
idée, la même histoire de la portée s'applique.
Si vous avez déclaré une variable comme i à l'intérieur d'un
pour la boucle, même si vous n'avez pas explicitement écrit le bouclés
accolades, pensez à eux mentalement d'être encore là, dans lequel
cas i est valide seulement à l'intérieur de la boucle for.
Elle n'est pas valable une fois que vous obtenez à la ligne suivante, qui
ce cas est maintenant de 10.
Alors seulement quelques questions de portée, etc.
Tout droit, des questions?
>> D'accord, c'est un peu un programme trivial peu,
l'impression de quelques petites étoiles.
Mais attendons de voir si vous vous souvenez de cette chanson ici.
C'est une chanson incroyablement ennuyeux que les enfants chantaient sur
l'autobus scolaire, etc.
Mais ce qui est bien, c'est que c'est a cette cyclicité,
où il est "99 bouteilles de bière sur le mur,
99 bouteilles de bière.
Prenez-en un en bas, passez-le autour de 98 bouteilles de bière sur le
mur. "Et puis la chanson reprend le 97, puis 96, puis
95, puis 94, tout le chemin jusqu'à 0 si vous avez réellement obtenu que
la mesure sur le bus.
Donc, c'est un beau programme pour trier d'engin, parce que mon
Dieu, si vous pouviez mettre en œuvre ce avec quelques-uns
lignes de code, vous pouvez cracher les paroles entières à cette
chanson assez rapidement.
Mais en cours de route, nous pouvons commencer à démêler maintenant une certaine
de ces constructions de base en boucle et maintenant aussi
introduire des fonctions que nous nous écrire, retourner des valeurs
que l'on passe autour.
Mais d'abord, pourquoi ne pas aller de l'avant et de prendre notre de cinq minutes
casser ici?
Et quand nous reviendrons, nous allons chanter cette chanson.
>> Très bien, alors nous sommes de retour.
Et quand je dis que nous allons maintenant chanter cette chanson, je veux dire
programme, non pas verbalement.
Nous avons donc ici beer1.c, qui est une mise en œuvre de cette
chanson en particulier.
Et juste pour être clair, pour ceux peu familiers avec ce
cette chose ressemble, laissez-moi aller de l'avant
et de faire beer1, Entrée.
Permettez-moi maintenant de fonctionner beer1, et ce que nous allons voir - combien de bouteilles
de la bière seront-ils?
Je vais taper 99, comme le dit la chanson.
Entrée.
Et maintenant, si nous défiler -
oops - si nous défiler tout cela, nous verrons que
cela ne fait chanter toute la chanson.
Attendez une minute.
Ma barre de défilement est un peu foiré.
Profitons de la plus grande fenêtre.
Donc beer1, 99, voilà.
Nous avons donc ici toute la chanson, chantée beaucoup plus rapide par le
ordinateur que ça aurait pu être par nous.
Donc remarquer, cependant, la nature cyclique ici.
Il dit 99, puis 99, puis "on prendre vers le bas, passer
autour ", puis 98.
Et maintenant, il répète encore et encore.
>> Donc, c'est en fait une occasion parfaite pour une sorte de
boucle construire.
Notez que je suis une sorte de couper un coin ici.
Remarquez que je dis "98 bouteilles de bière sur le mur,
97 bouteilles de bière sur le mur », et que c'était tellement
que lorsque nous arriverons à une bouteille de bière, je n'ai pas
à vous soucier de la grammaire anglaise.
Mais on peut aussi résoudre ce problème avec un peu d'un si
condition, peut-être.
Si ce nombre est singulier, allez-y et dites "bouteille",
sinon, si c'est pluriel, dire "bouteilles".
Mais pour l'instant, je suis complètement couper ce coin.
Voyons donc ce que nous avons ici.
Donc, nous avons quelques commentaires au début.
J'inclus ces deux bibliothèques,
nous avons souvent eu.
Et maintenant, permettez-moi de faire défiler vers le bas pour le premier
lignes réelles de code.
Ligne 17 démarre principale.
Ligne 21 et 20 a combien de bouteilles de bière seront-ils?
Et puis j'appelle getInt.
Et maintenant, j'ai un peu un test de cohérence.
>> Il s'agit donc d'une convention que nous allons maintenant commencer à adopter pour
plus rigoureusement vérifier les entrées de l'utilisateur.
Parfois, vous n'avez tout simplement pas envie de les inviter à nouveau
et encore et encore.
Si l'utilisateur vis et ne coopère pas bien.
Quitter et n'ont tout simplement pas traiter avec eux.
Et c'est ce que je fais ici.
Si n est inférieur à 1, je vais hurler à l'utilisateur,
"Désolé, ça n'a aucun sens." Et puis je vais
arbitrairement retourner 1.
Encore une fois, c'est juste une convention pour s'y habituer.
Pour l'instant, prendre sur la foi.
Mais jusqu'à présent, nous avons toujours été de retourner 0, car
nous l'avons dit en renvoyant 0 représente quoi?
PUBLIC: Succès.
DAVID J. MALAN: Succès, c'est tout.
Alors, maintenant que nous commençons enfin à penser
non-succès -
en d'autres termes, les cas de coin, les conditions d'erreur -
maintenant j'ai un approvisionnement infini, ou au moins 4 milliards
choses possibles qui peuvent aller mal dans mes programmes.
Et je peux commencer leur attribuant des numéros individuels.
Or, généralement, il suffit de juste retour
autre que 0.
Donc, nous allons tout simplement renvoyer 1 pour le moment.
Mais la raison du retour 1 est que dès que vous revenez
1, devinez ce qui arrive au reste du programme?
Il s'arrête.
C'est tout.
Donc, le fait que je retourne 1 est efficace
court-circuitant l'exécution de ce programme afin que
rien en dessous de la ligne 27 continuera à exécuter.
Dès le retour principaux, c'est tout.
>> D'accord, donc si l'utilisateur ne coopérer et nous arrivons à la ligne 30
car ils ont tapé dans un certain nombre légitime, voici mon
mise en œuvre de cette chanson.
J'ai donc d'abord imprimer un caractère de nouvelle ligne, juste pour
esthétique.
J'ai maintenant une boucle for.
Et remarquez que je fais les choses un peu
d'une direction différente.
Je n'ai pas à faire moins que, je n'ai pas à le faire + +.
Je peux dire à la place d'initialiser une variable i, réglez-le égal à
n, le nombre l'utilisateur a tapé, puis procédez comme suit, afin
longtemps que i est supérieur à 0, alors i -
une fois que vous avez terminé une itération de cette boucle.
Ainsi, nous pouvons compter à rebours à l'aide d'une boucle for ainsi.
Maintenant, c'est la semaine à peu près une étoffe maintenant, avec printf.
Donc impression "bouteilles de bière% d sur le mur." Imprimer "% d
bouteilles de bière. "" Prenez vers le bas, le faire circuler. "Imprimer
"% D bouteilles de bière sur le mur." Donc, c'est toujours d%, mais
constater que l'argument de printf est en mutation.
Après la virgule, i have, parce que je veux dire 99.
Après cette virgule, i have, parce que je veux dire 99.
Après cette virgule, i have - 1, parce que je veux dire 98 en
cette première itération, et ainsi de suite.
Et maintenant, ici-bas, j'ai juste une remarque stupide petite.
Et puis la ligne 42, je retourne 0 par convention, ce qui signifie que
tout va bien.
>> Alors, que si je fait une gaffe?
Ce qui pourrait une erreur commune ici être?
Eh bien, si j'ai accidentellement dit bien, je ne veux compter
à 0, je veux 0 bouteilles de bière sur le mur?
Alors je dis, i est supérieur ou égal à 0.
Quel va être le symptôme que je vois maintenant si je recompiler
beer1 et l'exécuter?
PUBLIC: Négatif.
DAVID J. MALAN: Ouais, ça va être négatif.
Il s'agit d'une erreur off-by-one, incroyablement
erreur commune à faire.
Nous allons effectivement revenir à la fenêtre de terminal et de le faire
ici, afin que nous puissions voir plusieurs à la fois.
Entrez, 99 bouteilles de bière.
Fermer, mais nous sommes allés un tant soit peu trop loin.
Nous avons chanté la chanson trop bas, de sorte que nous avons maintenant atteint le
nombre négatif.
Donc, il ne fonctionne pas vraiment.
>> D'accord, donc on peut facilement résoudre ce problème en revenant à l'
comme il l'était autrefois.
Mais quelles sont les possibilités maintenant pour
amélioration?
Eh bien, permettez-moi d'ouvrir beer2.c et descendez ici et prendre un
regardez cette version.
Quelle est la première chose qui vous saute au visage comme différent
dans cette version ici?
PUBLIC: [Inaudible].
DAVID J. MALAN: Ouais, donc pas plus de i, parce qu'il est survenu à
moi, vous savez quoi, je vais demander à l'utilisateur pour n, et puis je suis
la mise i égal à n, et puis je suis i changer, mais je ne suis jamais
n nouveau contact.
Donc, ce que le diable a été le point de vous allouer 32 autres
je viens de bits appelée pour que je puisse avoir une variable différente?
Donc dans ce cas, j'ai en quelque sorte reconnu que nécessaire
caractéristique de conception.
Et je vais maintenant vous dire tout n est supérieur à 0, passez
avance et imprimer la même chanson, en passant un n printf comme le
Le deuxième argument, et n - 1 comme second argument ici.
Et puis, à chaque itération de cette boucle, aller de l'avant et juste
décrémenter n elle-même.
Maintenant, fonctionnellement, ce programme
va être identiques.
Si je tape en 99, n commence à 99.
Je décrémentation, décrémentation, décrémentation, décrémentation.
Je vais faire tout le chemin vers le bas pour "Une bouteille de bière sur
le mur, une bouteille de bière.
Prenez-en un en bas, le faire circuler.
0 bouteilles de bière sur le mur. "La fin, parce que je n'ai
obtenir le bon état.
Il est supérieur à 0.
Je n'ai pas fait cette erreur.
>> Donc, ce qui est mieux, version simple ou version deux?
Donc, j'ai entendu un tas de murmures pour deux.
Pourquoi deux?
Qu'est-ce que c'est?
PUBLIC: [Inaudible].
DAVID J. MALAN: Oh, d'accord.
Donc, il ne sera pas descendre en dessous de 0, mais rappelez-vous, dans une version, l'
version originale correcte n'a pas descendre en dessous de 0 soit.
Alors rappelez-vous que c'est la bonne version.
Nous allons donc au moins de comparer les deux versions correctes.
Ce qui est un argument en faveur de la version
deux étant, mmm, mieux?
Ouais?
PUBLIC: Il utilise moins d'espace.
DAVID J. MALAN: D'accord, donc il utilise moins d'espace, non?
Alors que d'une version 32 bits utilisé pour n, et puis un autre
32 bits pour i.
Version utilise seulement deux 32 bits pour n, de sorte que
semble être un plus.
D'autres pensées?
Quelqu'un veut-il plaider en faveur de celui-ci?
Ouais?
PUBLIC: Vous devez utiliser la ligne de code supplémentaire pour n -.
>> DAVID J. MALAN: D'accord, bien sûr.
Alors que c'est juste.
Donc, ce que, au moins pour moi -
Je veux dire, cela se sent effectivement un peu désordonnée, le fait que
Je ne peux pas trier de résumer toute ma logique dans un
belle ligne, la boucle for, comme la boucle for peut.
Ici, je sorte de devoir virer sur ce n -
à la fin de la boucle, car
il est logiquement nécessaire.
Mais il sorte de frotte-moi le mauvais sens, tout simplement parce qu'il
semble distincte de la logique de place ici, même si,
encore une fois, c'est nécessaire.
D'autres pensées?
Ouais?
PUBLIC: [Inaudible].
>> DAVID J. MALAN: Ouais.
Alors que faire si vous avez la place, à la fin de la chanson, a voulu
imprimer à nouveau le nom de la chanson?
Comme "Merci d'avoir joué 99 bouteilles de bière", ou quelque chose
bête comme ça?
Mais le fait est, que vous vouliez accéder à la valeur d'origine.
Le fait que vous avez muté ou modifié n sur chaque
itération et donc ont détruit sa valeur initiale
Cela signifie que vous ne pouvez pas le faire à la fin.
Maintenant, sans doute, nous avons clairement ne pas vouloir faire
que dans ce programme.
Alors, qui s'en soucie?
Mais c'est un point très valable.
Et pour être honnête, il n'y a vraiment personne
bonne réponse ici.
Ils sont tous deux également correctes.
Je pourrais être convaincu de toute façon.
Je dirai que, de manière générale, c'est un bon principe, si vous
demandé à l'utilisateur pour une certaine valeur et vous avez stocké dans une variable
comme n, juste une sorte de principe sur, c'est probablement une bonne
pour maintenir cette tendance.
Et toutes les données que vous voulez muter encore et encore, tout simplement
offrez-vous une copie de cette variable, juste pour que vous
avoir accès à l'original.
Vous dépensez plus de 32 bits, mais la réalité est la suivante
ordinateur, comme, deux gigaoctets de mémoire vive de nos jours,
et nous chicaner sur 32 bits?
Vraiment pas une grosse affaire.
Et même sur cet appareil ici, avec un demi-concert ou d'un
gigaoctet de RAM, 32 bits contre 64 bits,
pas une grosse affaire.
Certes, aujourd'hui, ça va être beaucoup dépassés par la taille
du programme lui-même, qui va être plusieurs centaines de
kilo-octets, voire quelques mégaoctets, ces jours-ci.
>> Ainsi, les préoccupations raisonnables, pas une seule bonne réponse.
Mais au moins, ce sont les pensées qui devraient commencer à
passer par votre esprit?
Parce que dans pset 0, même si nous avons vraiment ne devrait
exactitude, ou tout au moins déclinant les divers bugs que
vous pourriez avoir rencontré, alors que nous avançons, le design est
va être un autre aspect important, à la fois d'écrire du code
et également notre évaluation de code.
Et si au moins réfléchir à ce genre de choses.
Et juste parce que quelque chose fonctionne ne veut pas dire que c'est bon,
ne signifie pas qu'il est bien conçu.
Et c'est l'une des choses les boursiers d'enseignement et de
ensembles de problèmes nous aidera à taquiner partie au fil du temps.
>> Eh bien, qu'en est-il, disons, cette version ici?
Permettez-moi de faire quelque chose de sexy ici dans un instant.
D'abord laissez moi vous débarrasser de cela.
Et maintenant, nous allons résoudre ce problème grammatical.
Donc, dans cette version, je tiens à corriger la grammaire de sorte que,
plutôt que de simplement dire s entre parenthèses, comme "bouteille"
ou "bouteilles" -
Je ne veux pas couper ce coin -
Je veux aussi dynamique imprimer le mot "bouteilles"
ou "bouteille", utilisant ainsi des espaces réservés ci% s aujourd'hui.
J'ai donc besoin de vérifier ce qui est conditionnellement la valeur de i.
Et si c'est 1, je veux dire "bouteille", et si c'est quelque chose
d'autre, je veux dire "bouteilles". Donc, nous allons essayer de le faire.
Donc, si i == 1, alors laissez-moi aller de l'avant et de déclarer -
J'ai besoin d'une chaîne de caractères, alors laissez-moi faire la chaîne s1, parce que c'est la
première chaîne Je me soucie de ce moment.
Je vais dire "bouteille". Et puis, voyons, string
s2 - et je vais vous expliquer où je vais dans un instant -
"Bouteilles". Ainsi, rappelons que, dans cette chanson, nous devons être en mesure
d'imprimer des choses, deux mots différents potentiellement.
Donc, si nous regardons en arrière ici, vous remarquerez que lorsque nous arriverons à
cet exemple ici ", deux bouteilles de bière sur le mur,
deux bouteilles de bière, une seule prise vers le bas, le faire circuler », je veux
cette quatrième ligne de dire maintenant "une bouteille de bière sur la
mur ". J'ai donc besoin de décider, ce que je veux dire" bouteilles "ou
"Bouteille"? Donc je vais dire arbitrairement, tous les droits,
Je vais maintenant déclarer une variable appelée s1, string
un, qui va se brancher ici et ici aussi,
parce que ces mots sont toujours identiques, simplement en raison de la
nature de la chanson.
Et je vais appeler s2 n'importe quel mot je veux
éventuellement apparaître ici.
Maintenant, littéralement, 99 fois sur 100, ça va être la
même dans ces deux cas, car 3 est pluriel, 2 est
pluriel, 4 est pluriel.
Mais dans ce cas coin, où nous arrivons à 2, puis 1, ou
même 1 puis 0, j'ai besoin de cette logique.
Je dois donc passer un peu de temps dans mon code par rapport à ce droit.
Donc, si je fais cela, si i == 1, alors s1 égal à "bouteille"
et s2 égal à "bouteilles", parce que ce sera pour 1
bouteille, et ce sera pour 0 bouteilles.
Et c'est ici, qu'est-ce que cela représente?
Juste pour être clair.
C'est juste un commentaire.
Donc, le fait que vous pouvez avoir une seule ligne signifie commentaires que vous
peuvent commenter votre code comme ceci, mais une autre commune
paradigme, aussi, c'est que si vous avez une phrase super-court qui
vous voulez vous mettre et c'est juste plus lisible pour mettre
il droit à la fin de la ligne de code, vous pouvez
absolument faire quelque chose comme ça.
>> Alors maintenant, que si je fais ça? Sinon, si i n'est pas égal à 1.
Donc Bang est égale à -
point d'exclamation est connu comme "bang".
Donc Bang = 1.
Donc, si i n'est pas égal à 1, que dois-je plutôt envie de faire?
Eh bien, le premier mot que je veux être quoi?
Alors chaîne 1 devrait être «bouteilles» des bouteilles multiples,
puis ce sera au pluriel "bouteilles" ainsi, pour l'instant.
Et nous verrons si cela devient réellement nous
où nous voulons aller.
Alors maintenant, si je descendez ici, vous remarquerez que je suis brancher
pas seulement moi, mais s1.
Je suis brancher i et s1.
Puis ici, je suis moins 1, qui est la même que
avant, mais s2.
En d'autres termes, je veux le mot anglais pour évoluer en fonction
Dans cette logique.
Maintenant, il ya déjà des problèmes dans ce code.
Ce qui est brisé déjà hors de la porte ici?
Ouais?
PUBLIC: [Inaudible].
>> DAVID J. MALAN: Exactement.
Donc je l'ai déjà violé la leçon de portée.
J'ai donc déclaré s1 et s2, mais je l'ai fait à l'intérieur de
accolades, ce qui signifie oui, ce code va travailler jusqu'à
jusqu'à ce que la ligne 42, mais dès que j'ai touché la ligne 43, devinez quoi pas
n'existe plus?
Eh bien, devinez ce qui est plus dans le domaine - ni s1 ou s2.
Nous devons donc résoudre ce problème.
Permettez-moi donc de supprimer les déclarations.
Et je vais laisser les noms de variables et de supprimer ce ici
et supprimer les voir ici.
Et dans quel sens devrait-je vraiment déclarer ces choses?
PUBLIC: [Inaudible].
DAVID J. MALAN: Ouais, alors, probablement,
juste ici, 33-ish.
Ainsi, la chaîne s1 et s2 chaîne.
Et il se trouve, je peux le faire.
Si vous êtes déclarer deux variables de même type,
vous pouvez effectivement il suffit d'utiliser une virgule et faire en C. Toutes les
Bon, maintenant j'ai deux variables -
s1 et s2.
Je leur attribuant des valeurs dans ces
conditions ici, ou ici.
Et puis je les utiliser en bas.
Dans quelle mesure est-ce maintenant d'aller travailler?
>> Eh bien, c'est encore un peu buggé, mais il faut au moins voir
dans quelle mesure nous avons obtenu.
Alors laissez-moi aller de l'avant et de faire beer3.
Est-ce beer3?
Yep, c'est beer3.
Et maintenant, laissez-moi aller de l'avant et exécutez beer3.
399 99.
Nous pouvons probablement passer plupart d'entre eux.
Et ici, regardez ça.
"Une bouteille de bière sur le mur, une bouteille de bière, de prendre
un vers le bas, le faire circuler, 0 bouteilles de bière sur le mur. "
Mais je attirer votre attention sur seulement la moitié de la solution.
Type de foiré ici.
Il semble donc que les cas marginaux se posent lorsque i est égal à ce
deux valeurs?
PUBLIC: 2, 1.
DAVID J. MALAN: 2 et 1.
Ce n'est pas 1, et non 1.
C'est vraiment juste ces deux dernières strophes de cette chanson.
Alors qu'est-ce que je veux faire à la place?
Donc, il me semble avoir pris le cas où si i est à 1 ==,
puis le premier mot est "bouteille", mais le deuxième mot
est "bouteilles". Mais ici, je veux changer cela soit == 2.
Et si c'est le cas, qu'est-ce que je veux que le
premier mot de l'être?
PUBLIC: "Bottles".
DAVID J. MALAN: "Bottles", si pour deux bouteilles.
Et puis ce mot ici, devrait être -
PUBLIC: "Bouteille".
DAVID J. MALAN: "Bouteille", au singulier.
>> Très bien, nous allons effectuer un zoom arrière, revenir ici, ré-exécutez make,
re-run beer3, tapez 99 fois.
Ok, "Segmentation fault (core dumped)".
Qu'ai-je fait de mal?
PUBLIC: Vous n'avez pas une valeur [inaudible].
DAVID J. MALAN: Ah, très bon point.
D'accord, alors quel est le problème ici?
Donc, faute de segmentation, et nous allons en fait voir
ce à quelques reprises à l'avenir, délibérément.
Mais pour l'instant, qu'est-ce que cela signifie réellement?
Une erreur de segmentation signifie presque toujours que vous avez
en quelque sorte tenté d'accéder à la mémoire, RAM dans votre ordinateur,
que vous ne possédez pas, que vous n'avez pas fait la demande
le système d'exploitation pour.
Donc dans ce cas, notez ce que j'ai fait, ce qui est
vicié dans ma logique.
J'ai assigné s1 et s2 une valeur si i est égal à 1.
J'ai aussi fait que si i est égal à 2.
Mais je ne l'ai pas fait dans le nombre infini d'autres
possibilités -
en particulier, 3 ou 4 ou un point, point, point, 99.
Alors un correctif pour ce pourrait être simplement de let
souffrez d'une maladie autre.
Et laissez-moi aller ici et dire s1 est égal à -
quel serait-il ici?
PUBLIC: [Inaudible].
>> DAVID J. MALAN: «Bouteilles», parce que dans le cas le plus courant,
c'est juste la même chose.
Donc égale entre guillemets, "bouteilles". Donc, pour le pluriel
bouteilles, puis ici, pour les bouteilles pluriel.
Bon, alors maintenant je voudrais revenir à ma fenêtre de terminal,
recompiler, il re-courir.
99.
Ouf.
Et nous allons faire un rapide test de cohérence.
Techniquement, nous avions envie de lire toutes les questions pour s'assurer
qu'ils sont corrects, mais penchons-nous sur
moins les coupables connus.
3 bouteilles, 2 bouteilles, 2 bouteilles, 1
bouteille, 1 bouteille, 0 bouteilles.
Nous semblons avoir au moins il fixé pour l'instant.
Mais le hic, c'est que ce dieu terrible gâchis ce n'est
juste pour résoudre un stupide
un caractère détail grammatical.
Il ya donc une sorte de raison que je coupe ce coin
plus tôt, car il est juste complètement ennuyeux d'avoir à
écrire ce code beaucoup.
Mais il s'avère qu'il ya des moyens un peu plus élégants de
exprimer exactement la même chose.
Et nous pouvons le faire comme suit.
>> Permettez-moi de le laisser sur l'écran pendant un moment et
introduire quelque chose de connu comme un opérateur ternaire.
Il s'agit d'une sorte de one-liner qui est juste destinée à faire de notre
vit un peu plus sexy, comme promis.
Et je vais faire ce qui suit.
Donne-moi une chaîne appelée s1, et laissez-moi
céder comme suit.
(I == 1)?
"Bouteille", sinon "bouteilles". String s2 obtient (i == 2)?
"Bouteille", sinon "bouteilles".
Alors, quelle est donc la différence?
Ces deux lignes de code, selon moi, peut
remplacer tout ce gâchis.
Alors je l'appelle un gâchis, juste parce qu'il sorte de frotte-moi le
le mauvais sens que c'est autant de lignes de code.
Pas tort.
Ce n'est pas une mauvaise conception.
Comme, c'est tout à fait correct et parfaitement bien.
Mais codage devient fastidieux si vous avez de vous exprimer de manière
damner précisément encore et encore et encore avec un simple
tel scénario.
Donc C a quelques raccourcis, comme celui-ci.
Donc, c'est essentiellement à dire déclarer une chaîne appelée s1 et
l'attribuer soit cette valeur ou cette valeur si i est == -
désolé, je dois dire que c'est plus clair.
Déclarer une variable s1, lui attribuer cette valeur si cela est vrai.
Sinon, affectez-lui cette valeur.
Donc, en d'autres termes, il s'agit d'une sorte de façon d'une ligne de
dire si d'autre que de faire un travail en cours de route.
Donc, si i est 1, alors allez-y et appelez cette "bouteille". Et
alors cette chose, appelez-le "bouteilles". Pendant ce temps, s2, la
deuxième mot que nous avons besoin de définir, si i est égal à 2, nous allons
s2 mis à "bouteille". Dans le cas contraire, réglez-le sur "bouteilles". Et qu'est-ce
cela signifie maintenant est que je peux passer par ceci et supprimer tous
ces lignes de code.
Et quand je dis, un peu ridicule, que c'est maintenant
sexy, c'est plus sexy dans le genre de sens stylistique.
Le fait que fonctionnellement, ce code va effectivement
faire exactement la même chose.
Et même si cela peut paraître un peu obscur au premier abord
coup d'oeil, parce que nous n'avons pas vu cette construction avant, je serais
soutiennent que c'est en fin de compte va être d'autant plus
lisible et donc beaucoup plus facile pour nous, les humains pour trier des
comprendre, parce que maintenant vous pouvez simplement lire l'
Code sur une seule ligne.
C'est toujours dans le même esprit à un si l', lorsque cela est
condition et c'est ce qui est le cas dans le présent et
c'est ce qui est à l'intérieur du monde.
Mais nous ne pouvons le faire juste beaucoup plus élégamment.
>> Et si je reviens à mon terminal, après avoir supprimé tous
de ces lignes et de les remplacer par tout les deux,
recompilation, ré-exécuter des bouteilles de bière avec 99, vous remarquerez que mon
la grammaire est, en fait, toujours correct.
Encore une fois, quelque chose pour commencer.
2 bouteilles de bière, 1 bouteille de bière.
On dirait bien.
Ouais.
Voilà donc une solution beaucoup plus succinct.
Donc, cela, aussi, que vous devenez plus à l'aise avec C, pas
nécessairement avec le pset première ou même la deuxième, mais
se rendre compte que ces constructions peuvent nous permettre de faire des choses jamais
plus d'élégance.
Maintenant, nous allons faire autre chose ici.
Permettez-moi aller de l'avant et d'ouvrir return1.c.
Maintenant, nous allons commencer à résoudre un autre problème d'une manière qui
nous permet d'écrire du code plus sophistiqué.
>> Alors, voici un programme simple petit dont le but dans la vie
est d'incrémenter les valeurs.
Et en fait, prenons un peu de recul.
Permettez-moi de le faire manuellement.
Permettez-moi de faire inclure et int main (void).
Et laissez-moi appeler cette increment.c.
Et qu'est-ce que je veux faire?
Je vais aller de l'avant et dire quelque chose comme -
allons-nous appeler les numéros de la même -
x int.
Donc x int obtient 2; printf x est% d, nouvelle ligne, x.
Alors que je tape vite, mais genre de choses maintenant familier.
Alors je vais faire x + +.
Ensuite, je vais imprimer cette même phrase.
Et puis je vais retourner 0 juste pour quitter le programme.
D'accord, c'est un programme qui
incrémente un numéro.
C'est allons d'abord initialiser quelque chose à 2, puis c'est
aller à l'incrémenter et l'imprimer à nouveau.
>> Nous allons donc lancer incrément, programme incroyablement simple.
Mais supposons maintenant que je veux cube de la valeur, il ne faut
quelque chose de quelque peu arbitraire.
Et j'ai vraiment envie de faire x obtient le cube de celle-ci.
Donc je pourrais utiliser ce qu'on appelle la fonction pow, mais je ne
sais vraiment pas où c'est le moment.
Donc je vais faire de cette façon à l'ancienne.
x fois, cela équivaut à x fois x fois x.
Donc, je suis cubage la valeur, en le multipliant par lui-même à nouveau
et encore et encore, afin que nous ayons le pouvoir
de 3 dans ce cas.
Alors maintenant, les chiffres que je doit imprimer doit être, comme nous le verrons
ici - incrément faire, il s'agit en fait pas vraiment incrémenter
plus, mais nous allons laisser le nom seul -
2 puis 8.
Maintenant, nous avons les prémices de l'occasion pour le raffinement
ici, où cette chose de cubage de la multiplication d'un nombre
par lui-même par lui-même par lui-même se sent comme ce pourrait bien être
utile de disposer d'une fonction, un peu comme quelqu'un a décidé
ans - vous savez, un peu utile si l'un de nous s'assoit
printf et écrit afin que le reste du monde peut l'utiliser,
pourquoi ne pas s'asseoir et d'écrire une fonction appelée cube
que le fait de cubage pour nous, nous n'avons pas manuellement
mettre en œuvre la notion de cubage des valeurs ici?
>> Ainsi, un exemple simple, mais il faut aller de l'avant et de l'utiliser est comme un
possibilité d'écrire notre propre fonction.
Donc, jusqu'à présent, nous avons seulement utilisé principale, et nous avons utilisé d'autres
fonctions des gens, mais nous n'avons pas écrit le nôtre.
Alors on y va.
Je vais aller de l'avant et écrire une fonction appelée cube.
Et je vais devoir prendre une entrée.
Donc, son entrée va être un entier.
Et qu'est-ce qu'il va faire?
Il va déclarer int sortie = entrée fois entrée
entrée fois.
Et puis ça va revenir cette sortie.
Et puis je dois être plus précis maintenant.
Cette fonction va retourner un int.
Donc ici, alors est de savoir comment vous pouvez écrire vos propres fonctions.
Vous devez d'abord décider ce qui est le nom de votre
fonction va être.
Et généralement, quelque chose explicative est bon, donc je vais
appeler cube.
Ensuite, vous devez spécifier ce que ça va revenir, ce qui est
sa production va être.
Et nous n'avons pas beaucoup d'options encore.
Int, char, float, bool, string.
Pour l'instant, je vais rester avec un int, parce que je le veux
pour retourner un entier.
Ensuite, vous devez spécifier les entrées, le cas échéant, sont.
Et si cube prend un argument, prend quelque chose entre
parenthèses, vous devez donner cet argument un nom, afin que
vous pouvez appeler ce quelque chose que vous avez mise en œuvre ou l'écriture
cette fonction et vous devez lui donner un type qui, dans ce
cas va être int.
Donc en bref, le cube est une fonction qui prend un entier
en entrée et renvoie un entier comme résultat.
>> Alors, que faut-il faire avec cette entrée?
Eh bien, à la ligne 14, je déclare une variable appelée sortie, et je
attribuez-lui la valeur, entrée entrée entrée fois fois.
Et puis je reviens de sortie.
Alors, comment puis-je utiliser ce alors?
Que dois-je changer ces caractères en surbrillance sur la ligne
7 à être, pensez-vous?
PUBLIC: [Inaudible].
DAVID J. MALAN: Ouais, donc cube de x.
Si x est une variable, ce qui signifie qu'il possède une certaine valeur.
Heureusement, il est de type integer.
Et parce que x est un entier, cela signifie que je peux le passer dans le cube.
Et même si je suis remplaçant la valeur de x avec la valeur
de x cube, comme cela a été le cas jusqu'à présent, chaque fois que vous
ont signe égal et une ligne de code, les trucs sur le droit
est exécuté et obtient ensuite affecté à la
valeur sur la gauche.
Ainsi, l'ordre des opérations est que nous le voudrions.
Donc ça marche?
Eh bien, laissez-moi descendre ici.
Permettez-moi d'ouvrir ma fenêtre de terminal.
Permettez-moi de ne faire incrément, Entrée.
"Déclaration implicite de" cube "fonction n'est pas disponible dans
C99. "Soit dit en passant, C99 se réfère à la langue C tel qu'il était
définie en 1999, qui était une mise à jour sur la version de
1989, qui est une mise à jour sur l'original.
Donc, c'est tout ce que cela signifie.
>> Alors qu'est-ce que ça veut dire "déclaration implicite de
"cube" fonction n'est pas disponible? "C'est juste ici.
C'est là, dans la ligne 12.
PUBLIC: [Inaudible].
DAVID J. MALAN: Qu'est-ce que c'est?
PUBLIC: Ce n'est pas avant.
DAVID J. MALAN: Ce n'est pas avant.
Donc, c'est la seule chose.
C est un peu stupide, ou compilateurs C sont un peu stupide.
Ils ont vraiment seulement faire ce que vous leur dites de faire.
Et eux, en particulier, que lire votre code de haut en bas,
de gauche à droite.
Donc, si le compilateur, Clang, est la lecture de votre code, ligne 1, il
Chiffres sur la façon de procéder.
Oh, voici principale.
Bon, je vais aller de l'avant et de déclarer une variable x.
Permettez-moi d'imprimer quelque chose.
Ligne 7, ce que le diable est cube?
Ce n'est pas déclarée dans stdio.h.
Il ne vient pas avec C. Je n'ai aucune idée de ce qu'il faut faire.
Et si Clang renfloue juste et quitte avec ce message d'erreur.
Ainsi, nous pouvons résoudre ce problème dans un couple des manières.
Nous pouvons apprendre à Clang ce cube est en déplaçant simplement où l'
déclaration.
Alors j'ai coupé et collé au sommet principal.
Se rendent compte maintenant que juste parce principal n'est plus d'abord, il est
toujours exécuté par défaut.
Principale est le principal.
C'est le nom de la fonction par défaut.
Il n'a pas d'importance où il est dans un fichier.
Mais au moins maintenant Clang a vu cube avant de l'utiliser.
Donc, nous allons voir si Clang est plus heureux maintenant.
Assurez-incrémentation, il ne compiler ce moment.
>> Permettez-moi de lancer incrément.
Et en effet, il semble fonctionner.
Maintenant, vous pouvez trouver des scénarios où finalement
il n'est pas possible de mettre toutes les fonctions
au-dessus de toute autre fonction.
Vous êtes coincé dans cette boucle infinie dans la réalité,
où ce gars veut être ici, mais ce
homme a besoin d'être là.
Donc, cela ne fonctionne pas toujours.
Donc, heureusement, C a une solution plus élégante.
Je vais mettre ce là où il était, tout simplement parce que je
préfèrent, comme une question de principe, que le principal toujours
en haut, parce que c'est juste agréable de voir ce que ce programme
fait par défaut.
Et ce que je vais faire ici est de déclarer ce qu'on appelle
un prototype.
Je vais re-déclarer ma fonction cube par littéralement
copier-coller.
En fait, ce n'est pas littéralement.
Donc littéralement copier-coller la ligne 15
au-dessus de la ligne 6.
Il n'a pas d'importance ce que cette ligne se termine sur.
Il se trouve sur la ligne 4.
Mais il ne faut être avant la partie principale.
Mais la différence.
Ligne 4 se termine par un point-virgule, ce qui signifie bon,
Clang, prendre mon mot pour lui qu'il existe une fonction
appelé cube qui prend un int et renvoie un int.
Mais je ne vais pas vous dire ce que c'est le moment.
Il suffit de savoir que je vous promets de vous raconter la suite.
Et en effet, maintenant, il est normal que cela est en bas.
>> Donc, ce qui est généralement mieux, car alors au sommet de
votre dossier, il vous suffit de débiter, à tir rapide, une ligne
chacun, quels sont les noms de vos fonctions, quelle est leur
entrées, quelles sont leurs sorties sont.
Et pour être plus clair, des moyens d'entrée généralement argument ou
paramètre, synonymes.
Des moyens de sortie de valeur de retour, ce qu'il fait
la main vers moi.
Donc dans ce cas là, le cube a été déclarée en haut, mais
défini, autrement dit en oeuvre, à la partie inférieure.
Alors maintenant, nous allons revenir ici et relancer cette.
Alors maintenant, laissez-moi aller de l'avant et de faire exécuter à nouveau, relancez l'incrément.
Et il semble maintenant fonctionner très bien.
Alors maintenant, nous pouvons aller de l'avant et prendre en compte quelque chose comme la
par exemple de la bière dans cette quatrième version.
Permettez-moi de faire défiler vers le bas ici.
Et remarquez que je sorte de cette leçon a pris à cœur en ce moment.
Le fait que je chantais la même strophe encore et
encore et encore, la ligne même refrain dans la chanson, a estimé
Comme pourquoi n'ai-je pas sur des facteurs qui dans une fonction?
Et en effet, cela devrait être une des motivations.
Outre le fait que quelqu'un d'autre dans le monde voudrez peut-être
d'utiliser une fonction cube -
c'est une bonne raison de tenir compte quelque chose et rédigez votre
propre fonction personnalisée -
s'il ya un morceau de code dans votre programme qui fait juste
point de vue conceptuel, que vous souhaitez sorte de lui donner une
nom - comme dans ce cas, chorus -
alors vous pouvez même écrire que comme une fonction distincte.
Vous n'avez pas besoin de tout écrire en principal si elle vient
sent plus propre de le séparer et de lui donner un nom.
>> Donc dans ce cas là, vous remarquerez que j'ai un commentaire sommet
cette fonction qui chante à peu près le
nombre de bouteilles spécifiées.
Notez ici que je n'ai pas besoin d'appeler ces
choses entrée et de sortie.
En fait, cette fois, je viens d'appeler mon entrée b pour bouteille.
Et remarquez ici, nulle suggère quoi?
Ce refrain -
PUBLIC: N'est-il pas revenir.
DAVID J. MALAN: Ne renvoie pas de valeur.
Et en effet, les fonctions n'ont pas à retourner des valeurs.
Ils peuvent juste faire quelque chose.
Ils peuvent avoir ce qu'on appelle des effets secondaires, qui, dans ce
cas est juste un tas d'imprimer sur l'écran.
Donc remarquerez que ce code ici, je me suis littéralement juste volé
l'exemple précédent.
La seule différence est la place de i à l'aide de mon
variable, je suis maintenant en utilisant b comme ma variable.
J'ai donc b ici-bas, je n'ai b ici-bas, j'ai b
moins 1 ici-bas.
Mais le code est exactement le même.
Mais juste pour vous montrer maintenant comment nous pouvons l'utiliser, laissez-moi aller
l'avant et de changer réellement que cela soit une boucle for.
for (int i = n; i> n; i -).
>> Donc, j'ai volé que de notre exemple précédent.
Auparavant, c'est dans la ligne 37 que j'aurais commencé
chanter cette chanson ennuyeux.
Mais à la place, je vais maintenant appeler chœur de i.
Terminé.
Alors maintenant, à chaque itération de cette boucle, j'appelle cet autre
fonction, chorus, qu'il m'est arrivé d'écrire.
Il n'a pas été écrit par quelqu'un d'autre d'années.
Mais chœur, quant à lui, utilise printf pour imprimer
sur ces quatre lignes.
Mais le fait que je vais appeler refrain encore et encore dans un
boucle signifie que je vais avoir, à la fin, le
exacte même chanson que j'ai à ce jour.
Donc en bref, maintenant, si je repense à mon code, même si
ce qui équivaut fonctionnellement, vous remarquerez que c'est
commence à être encore plus lisible.
Je ne sais pas exactement comment getInt
est mis en œuvre.
Franchement, je ne sais pas comment chorus est mis en œuvre.
Mais il n'a pas d'importance pour moi.
Je ne m'inquiète pas, parce que maintenant je peux presque, comme un être humain, lisez
ce fond de haut en.
Et parce que les fonctions sont nommés en fonction de ce qu'ils
faire, mon code est plus lisible.
Et comme nos programmes obtiennent beaucoup plus complexe -
d'ici la fin du semestre, vous devrez écrire des centaines de lignes
du code dans les langages comme PHP et JavaScript et autres -
vous verrez que c'est tellement plus facile que de garder une trace de
ce que vous avez fait.
Et quand vous commencer à collaborer avec des amis ou
partenaires ou collègues, vous serez capable d'écrire beaucoup plus
des programmes massifs en commençant à exercer ces principes de base
blocs de construction.
>> Donc, avec cela dit, pourquoi ne pas l'appeler un jour?
Et nous allons vous voir mercredi.
[Applaudissements]