[Powered by Google Translate] DAVID J. MALAN: Très bien, c'est CS50 et c'est la
la fin de la semaine 1, les cartes sont en étude ainsi et le nombre total de
camarades de classe que vous avez cette année est de 745.
Et nous sommes tellement heureux d'avoir un si grand nombre d'entre vous au cours
ce semestre, mais même si ce cours est si grand,
se rendre compte que ce sont ces choses comme des déjeuners vendredi, comme
les heures de bureau, 15 personne sections, et ainsi de suite que les
sont vraiment destinées à créer ce plus intime
environnement.
Ainsi, même si nous pouvons recueillir une ou deux fois par semaine, ici à
Sanders, sachez que beaucoup de votre expérience dans ce cours
va très bien être pratique sur les côtés de vos camarades de classe
et le personnel enseignant.
>> Alors nous y voilà, Automne 2012.
Ainsi, rappelons que la dernière fois nous avons fini sur une note de
imprécision, parle de la représentation des nombres.
Et nous avons regardé l'un des échecs qui ont eu lieu, dans le
monde réel, quand il est venu à l'incompréhension
comment les ordinateurs fonctionnent.
Eh bien, aujourd'hui, nous nous pencherons sur un autre de ces idées
ainsi que de continuer notre discussion sur le client CS50
et C et ce que cela signifie vraiment au programme.
Mais d'abord, juste un couple des annonces tourbillon.
>> Les articles commencent ce dimanche, et la première semaine est toujours un
peu d'avance rapide, parce que nous avons juste eu à
vos formulaires section.
Nous faisons la même chose, maintenant, avec les boursiers d'enseignement, maintenant
qu'ils connaissent leurs horaires, de sorte que nous visons, par
Samedi matin, pour assurer le suivi avec vous avec votre section
missions et TF.
Sachez que ils vont commencer le lendemain, dimanche
ou le lundi ou le mardi.
Et puis, nous allons tenir compte des changements de section qui se présentent
dans les jours à venir.
Les heures de bureau, en attendant, sont, encore une fois, ce soir, à 20 heures 11, en
Annenberg, ainsi que demain soir.
Même si les ensembles de problèmes sont généralement dus les jeudis
à midi, réalisez que vous avez jusqu'à cinq jours de retard à dépenser,
par conséquent, la disponibilité des heures de bureau le jeudi si
vous encaissez un de ces jours de retard et, par conséquent, présenter
quelque chose le vendredi.
Permettez-moi de suggérer que Scratch est l'un des plus amusant, parmi les
plus faibles séries de problèmes clés.
Et je voudrais accrocher ces jours de retard, de façon stratégique, juste
plus tard dans le semestre quand la vie commence à obtenir de la manière
avec midterms et d'autres classes.
1 Set problème, quant à lui, sera affiché sur le cours de
site ce vendredi, comme ce sera au pied du cours
grâce à la vidéo, qui sera filmé à 2:30 h le vendredi
puis mis en ligne dès le lendemain.
>> Nous avons donc pris fin lundi.
Je veux - en fait, une note ici.
Parce que les classes - parce que Sanders ne prêtent pas exactement
lui-même occasionnel Q & A dans les deux sens terriblement bien, nous sommes
va essayer quelque chose de nouveau cette année, lequel
si vous n'êtes pas à l'aise de votre main ou que vous venez de
préfèrent ne pas lever la main dans une salle comme ça,
nous allons avoir quelques-uns des compagnons d'enseignement et AR
effectifs cs50.net/discuss cours de lecture.
Donc, si vous avez une question, parce que j'étais complètement
sait pas quelque chose ou si vous êtes curieux au sujet de certains
sujet, essayez de poster sur la liste.
L'étiqueter avec une étiquette de conférence, et nous ferons de notre mieux
aujourd'hui et la semaine prochaine - nous allons essayer cela - pour aligner
soit par voie électronique, en ligne, ou si elle se sent comme nous le devrions
vraiment répondre en masse, l'un des compagnons d'enseignement ou de
CA va lever la main et demander
anonyme en votre nom.
Donc, nous allons opter pour cette solution et voir comment cela fonctionne.
Mais, par tous les moyens, continuer à lever les mains que vous le souhaitez.
>> Donc, la dernière fois que nous a révélé que 10% ou un dixième n'est pas, en
fait, 0,1, comme vous avez appris il ya plusieurs années.
C'est en fait, une valeur comme ça.
Mais ce n'est pas tout à fait vrai, pas vrai?
Nous venons d'avoir cette contrainte dans les ordinateurs grâce à quoi, si vous
seulement une quantité limitée de mémoire, RAM ou plus
spécifiquement bits, eh bien, il n'y a qu'un nombre fini
des choses que vous pouvez représenter.
Par exemple, si nous avons le nombre zéro, et nous voulons
représenter en binaire, en utilisant huit bits, où un bit,
encore une fois, est un zéro ou un, nous pourrions
le représenter comme 00000000.
Et c'est un peu inutilement verbeux.
Tout comme dans le système décimal dans le monde réel,
généralement, si vous voulez écrire le nombre 123, nous
les humains n'ont probablement pas écrire 00000123 même si,
fonctionnellement, c'est exactement le même nombre.
Nous venons de déposer des zéros, pour ainsi dire.
>> En binaire, nous pouvons faire la même chose.
Binaire et zéro, zéro et zéro binaire est juste.
Vous avez seulement besoin d'un seul bit.
Mais encore une fois, l'unité la plus commune de mesure dans le monde
de l'informatique est l'octet, huit bits.
Tout simplement parce que un bit, assez inutile.
Huit bits, pas très utiles, mais au moins c'est plus
utile qu'une seule unité de mesure.
Donc, avec huit bits, nous allons représentent généralement binaire.
Nous avons donc ici les chiffres de zéro, un, deux, et puis, comme
Nate a fait dans notre vidéo mercredi dernier, nous pouvons continuer
compter jusqu'à sept, de huit.
Et puis, si l'on utilise les bits de plus en plus, nous
peut compter jusqu'à l'infini.
Mais si vous avez seulement un nombre fini de ces bits, comme c'est
le cas dans tout système informatique, ou même des missiles
système, eh bien, en effet, vous avez seulement une
quantité finie de précision.
Donc, si vous voulez représenter le nombre comme 0,1, ainsi, le
ordinateur doit choisir.
Et si elle ne dispose que d'un nombre fini de chiffres, il peut
représentent, il peut se rapprocher de 0,1 pour vous, mais il ne peut pas
nécessairement vous donner exactement la valeur que vous souhaitez.
Et ce n'est que l'un des défis de l'informatique,
sous le capot, heureusement.
>> Alors que nous allons plus loin dans le semestre, ce niveau inférieur
détails deviennent beaucoup moins intéressant, mais certainement l'
application de ces idées peuvent avoir un monde très réel
ramifications.
L'un est un amusant petit.
Combien d'entre vous avez vu le film étonnant espace de bureau?
Si vous n'avez pas, c'est votre non-officiel
devoirs pour la semaine.
Mais en l'espace de bureau, les boursiers dans ce film se
avantage de précisément cette idée, mais en fait ils ont volé
partir d'un autre film que vous pourriez avoir
vu, même des années avant.
Alors laissez-moi vous donner quelques secondes de cette bande-annonce de
ce film incroyable et c'est très bien
académique pertinente.
>> [JOUE MOVIE]
En fait, je suis d'être promu.
Je peux programmer un virus qui va déchirer ce que
placer beaucoup de temps.
Eh bien, comment ça marche?
Chaque fois qu'il ya une transaction bancaire où l'intérêt est
calculée, il ya des milliers par jour, l'ordinateur se retrouve
avec ces fractions de cent.
Mais je ne vais pas faire quelque chose d'illégal.
Illégal? Samir, c'est l'Amérique.
Vous devez le jure devant Dieu.
Si personne ne sait à ce sujet mais nous, tout va bien? Aucun membre de la famille, pas de
copines, personne.
[Inaudible].
Ne vous inquiétez pas, mec, je ne dirai rien non plus.
[FILM FIN]
>> Très bien, alors peut-être que j'ai trouvé ce film mieux que la plupart
les gens d'ici, mais en tout cas, le virus qui ils étaient
essayant de créer -
et dans les films, à tout moment qu'ils allaient appeler quelque chose d'un virus,
ce n'est généralement pas réellement un virus.
C'est juste un programme que quelqu'un a écrit pour faire quelque chose.
Et dans ce cas, les gars étaient en train d'écrire un programme
qui ont profité de leur société appelée Innotech
système informatique, grâce à quoi les ordinateurs, aussi, même si elle
qui concerne l'argent, ne peuvent pas nécessairement
représentent de l'argent avec précision.
Donc, même si vous avez 0,10 $ dans votre compte bancaire,
0,10, ainsi, l'ordinateur peut effectivement penser que vous avez
ce cents nombreux dans votre compte bancaire.
Et donc ce que ces gars-là qui aspirent à faire - et ils
volé l'idée, il s'avère de Superman III, où
Richard Pryor fait la même chose - ils étaient essentiellement
l'écriture de programmes qui aspirent à prendre tous les fuite
numéros, toutes les minuscules, minuscules, minuscules fractions de
penny, et siphonner ceux hors de sorte que les humains juste
pensée, oh, c'est seulement 0,10 $, mais tous ceux
numéros de suivi éventuellement s'accumuler.
Ainsi, une merveilleuse idée et ça s'est retourné contre hilarante dans ce
film en particulier.
>> Mais dans le monde réel, aussi, il ya beaucoup plus en ce qui concerne
implications de ces sortes de choses.
Et l'une des raisons pour plonger dans le domaine de l'informatique
la science est, encore une fois, son applicabilité ne pas l'
sciences de l'ingénieur seul, mais juste pour
d'autres domaines aussi.
Il s'agit donc d'un aspect moins enjoué sur ce qui peut aller mal, mais
c'est aussi l'ouverture des yeux tout à fait, je pense que, quand il s'agit de
comprendre exactement comment omniprésente des technologies telles que
ordinateurs et la programmation ou de nos jours,
sous la forme d'un logiciel.
Donc ce clip suivant est à peu près six minutes, continue
où nous nous sommes quittés la dernière fois, mais qui nous permet de regarder un peu
plus en profondeur à celle de ces questions.
Permettez-moi de passer directement à l'endroit où nous nous sommes quittés,
qui était juste ici.
Et nous avons une partie de deux, pendant environ six minutes ici.
>> [JEU VIDEO]
En proie à la technologie moderne des fusées.
En 1991, avec le début de la première guerre du Golfe, le Patriot
missile a connu le même genre de
problème de conversion de nombre.
Et, par conséquent, 20 personnes, 20 soldats américains ont été tués
et environ 100 autres blessés, lorsque la Patriot Act, qui devait
pour se protéger contre les Scud entrants,
n'a pas réussi à tirer un missile.
>> Quand l'Irak a envahi le Koweït et l'Amérique a lancé un désert
Tempête au début de 1991, batteries de missiles Patriot ont été
déployés pour protéger l'Arabie saoudite et en Israël du irakienne
Attaques de missiles Scud.
Le Patriot est un américain à moyenne portée sol-air système,
fabriqué par la société Raytheon.
La taille de l'intercepteur Patriot lui-même, il s'agit de
environ 20 pieds de long et pèse environ 2.000 livres.
Et il porte une ogive d'environ - je pense que c'est à peu près
150 livres.
Et l'ogive lui-même est un explosif puissant qui a
des fragments autour de lui.
Le boîtier de l'ogive est conçu pour fonctionner comme des chevrotines.
Les missiles sont effectuées quatre par conteneur et sont
transporté par un semi-remorque.
>> Le Patriot système anti-missile remonte au moins à
20 ans.
Il a été initialement conçu comme un missile de défense aérienne à
abattre les avions ennemis, dans la première guerre du Golfe.
Lorsque la guerre est arrivée, l'armée a voulu l'utiliser pour tirer
Scud vers le bas, et non pas les avions.
L'armée de l'air irakienne n'était pas tant d'un problème, mais l'armée
s'inquiétait de Scuds.
Et alors ils ont essayé de mettre à niveau le Patriot.
Intercepter un missile ennemi se déplaçant à Mach 5 allait
être assez difficile.
Mais quand le Patriot a été transporté en service, l'Armée
n'était pas au courant d'une modification irakienne qui ont fait leur
Scuds presque impossible à atteindre.
>> Ce qui s'est passé est le Scud qui étaient
venir en étaient instables.
Ils ont été vacillant.
La raison en était que les Irakiens, afin d'obtenir 600
kilomètres à l'extérieur d'un missile large de 300 kilomètres, a pris
poids de l'ogive avant et
fait l'ogive briquet.
Alors maintenant, le Patriot essaie de venir à la Scud, et la plupart des
l'époque, la grande majorité du temps, il serait
juste voler par le Scud.
Une fois que les gestionnaires de réseau Patriot réalisé le Patriot
a raté sa cible, ils exploser l'ogive Patriot.
Pour éviter les pertes possibles, il a été autorisé
à tomber par terre.
C'est ce que la plupart des gens ont vu, comme des boules de feu de gros dans le ciel,
et mal compris l'interception de communications d'ogives Scud.
>> Bien que, dans le ciel nocturne, les Patriots semblent être
Scud a réussi à détruire, à Dhahran, il n'y aurait pas
erreur sur ses performances.
Là, le système radar Patriot perdu la trace d'un
entrant Scud et jamais lancé en raison
d'une faille logicielle.
C'était les Israéliens qui le premier a découvert que la plus
le système était élevé, plus l'écart de temps est devenu,
en raison d'une horloge incorporée dans l'ordinateur du système.
Environ deux semaines avant la tragédie de Dhahran, l'
Israéliens signalés au ministère de la Défense que le
système a été une perte de temps.
Après environ huit heures de course, ils ont remarqué que le
système devenait nettement moins précis.
Le ministère de la Défense a répondu en disant tout
les batteries Patriot de ne pas laisser les systèmes
pendant une longue période.
Ils n'ont jamais dit ce que fut longtemps - 8 heures, 10
heures, 1000 heures.
Personne ne savait.
>> La batterie Patriot stationnés à la caserne à Dhahran
et son horloge interne défectueuse avait été sur plus de 100 heures sur
Dans la nuit du 25 Février.
Il suivies temps avec une précision d'environ un dixième de seconde.
Maintenant, un dixième de la seconde est un nombre intéressant parce
il ne peut pas être exprimé en binaire, exactement, ce qui signifie
il ne peut pas être exprimé exactement l'une quelconque
moderne numérique ordinateur.
C'est difficile à croire.
Mais l'utiliser comme un exemple.
>> Prenons le nombre d'un tiers.
Un tiers ne peut pas être exprimée en décimal, exactement.
Un tiers est de 0,333 passait à l'infini.
Il n'y a aucun moyen de le faire avec une précision absolue en décimal.
C'est exactement le même genre de problème qui s'est produit dans
le Patriot.
Plus le système a fonctionné, pire le temps est devenu l'erreur.
Après 100 heures de fonctionnement, l'erreur dans le temps n'est
environ un tiers de seconde.
Mais en termes de ciblage d'un missile se déplaçant à Mach 5,
il a provoqué une erreur de suivi de plus de 600 mètres.
Ce serait une erreur fatale pour les soldats à Dhahran.
>> Ce qui s'est passé est un lancement Scud a été détectée par l'alerte précoce
satellites et ils savaient que le Scud était venue dans leur
direction générale.
Ils ne savaient pas d'où ça venait.
Il appartient maintenant à la composante radar de la Patriot
système, la défense de Dhahran, de localiser et de suivre le
missile ennemi entrant.
Le radar était très intelligent.
Vous serait effectivement suivre la position du Scud, puis
prédire où il serait sans doute la prochaine fois que l'
radar envoyé une impulsion en sortie.
Cela s'appelait la porte en distance.
Puis, une fois que le Patriot décide temps a passé pour aller
sauvegarder et vérifier l'emplacement suivant pour cette détectée
objet, il remonte.
Alors, quand il est retourné à la mauvaise place, il voit alors pas
s'opposer, et il décide qu'il n'y a pas d'objet.
Il s'agissait d'une fausse détection et laisse tomber la piste.
>> Le Scud entrant disparu de l'écran radar.
Et quelques secondes plus tard, il a percuté la caserne. Le Scud
28 et tué était le dernier tiré pendant
la première guerre du Golfe.
Malheureusement, le logiciel mis à jour est arrivé à Dhahran
le jour suivant.
Et la faille du logiciel avait été fixé, la fermeture d'un chapitre dans
l'histoire mouvementée du missile Patriot.
PATRIOT est en fait un acronyme pour "Tracking multiéléments
Intercepter la cible. "
>> D'accord, donc un résultat beaucoup plus triste de ne pas tout à fait
la compréhension de ce monde.
Et les plats à emporter, vraiment, dans le film, c'est que la solution
il a été redémarrez votre système de défense antimissile
chaque fois dans un tout.
Et à nouveau, l'un des objectifs de ce cours, certainement
à une échelle plus modeste que ces applications, est de
tout le monde vraiment ouvert les yeux à exactement comment vous allez
machines à fabriquer faire ce que vous voulez faire et comment vous allez
à faire cela correctement, tandis que le long de la façon dont il fait
ainsi, élégante, et ainsi de suite.
Et aujourd'hui, nous allons plonger dans un peu plus de ceci, mais
de sorte que nous n'avons pas aller trop vite, en particulier pour ceux qui sont moins
confortable, mais aussi pour que nous puissions conserver l'intérêt des
ceux qui sont plus à l'aise, nous allons juste commencer rapidement avec un peu
de récapitulation de certaines de ces idées.
Et encore une fois, demandez à l'écart, en personne ou en ligne, si vous avez
des questions afin que nous puissions garder tout le monde sur la même page.
>> Ainsi, l'appareil CS50, quick step arrière, est
ce qui, dans vos propres mots?
Ce n'est pas grave si vous n'avez aucune idée de ce que ces mots peuvent être encore.
[Inaudible]
Ok, donc une interface universelle pour -
que nous pouvons tous partager.
Tout à fait.
Donc, on pourrait, par exemple, vous dira d'aller dans une certaine
site web, télécharger ce logiciel pour Mac OS.
Télécharger gratuitement ce logiciel pour Windows, configurer dans
de cette façon et que.
Mais la réalité est alors nous nous heurtons à d'innombrables techniques
appuyer les questions.
Et aussi ces jours-ci, une grande partie de ce qui se fait côté serveur,
dans le monde de l'informatique, en particulier quand il s'agit de
le développement web et les applications Web, est en fait
fait très souvent sur les ordinateurs Unix ou Linux, par opposition à
Mac ou PC Windows.
>> Ainsi, parmi les bons côtés, puis, à l'aide de ce qu'on appelle le
CS50 Appliance est que nous aurons tous le même environnement.
Donc tout le monde est sur la même page, peu importe le matériel dont vous
venue sur le campus, mais aussi avec les barboteurs seront exactement
le même environnement que vous allez utiliser pour
semestre de fin ainsi pour le développement web, et aussi dans l'
avenir pour les applications du monde réel de celui-ci.
Ainsi, plus concrètement, l'appliance CS50 est une pièce exempte de
un logiciel qui vous permet de lancer un autre système d'exploitation,
Linux, dans ce cas, sur votre propre ordinateur, dans une fenêtre.
Maintenant, vous ne pouvez pas télécharger de l'appareil.
Vous avez besoin d'un programme avec lequel jouer ou courir l'appareil.
Et ce morceau de logiciel est généralement connu comme un
hyperviseur.
Hyperviseurs se présentent sous la forme de produits tels que VMware,
Virtual Box, Parallels.
Toutes sortes de sociétés rendre les logiciels, libres et
commerciale, de même.
Ce que vous verrez dans un problème Set 1 sont des instructions sur la façon de
obtenir un logiciel gratuit avec lequel
exécuter l'appliance CS50.
Et une fois que vous le faites, vous aurez, dans une fenêtre sur votre Mac ou PC,
un environnement de bureau qui ressemble tout à fait comme ça, où
il a un menu Démarrer-comme la chose dans le
en bas à gauche.
Il dispose d'un dossier d'accueil, ou d'un répertoire d'accueil, en haut à gauche
là, une poubelle, et ainsi de suite.
Donc, nous allons démêler les détails nécessaires que nous allons.
>> Mais maintenant, nous allons commencer à plonger dans C.
Donc C est ce langage de programmation, dans le même esprit de
Scratch, mais beaucoup moins graphique, mais, ironiquement, loin
plus puissant une fois que vous avertis avec elle.
Donc, en C, on écrit des programmes en écrivant du code source, ce qui est
cette syntaxe anglaise, similaire aux chaussettes
démonstration que nous avons fait la dernière fois qui vous permet de
vous exprimer avec assez de précision, si
arcanely, à l'ordinateur.
>> Alors, quel genre de logiciel ne produit que vous avez réellement besoin
d'écrire des programmes dans un langage comme C, basée sur notre
conversation, le lundi?
[Inaudible]
OK, vous avez juste besoin d'un éditeur de texte.
Vous n'avez pas besoin d'un logiciel spécial
en soi d'écrire des programmes.
Vous avez juste besoin d'un éditeur de texte comme le Bloc-notes, sous Windows,
TextEdit sur Mac, ou quelque chose qui s'appelle gedit, dans le monde de
Linux, que nous allons utiliser ici.
Et c'est tout, pour écrire les programmes.
>> Mais l'écriture n'est que la moitié de l'équation.
Vous devez ensuite pour les faire fonctionner.
Mais pour exécuter des programmes -
vous ne pouvez pas exécuter du code source.
Vous avez au lieu de faire ce qu'il faut en premier?
Ouais.
DAVID J. MALAN: Vous devez vous
le compiler.
Et quelqu'un d'autre, la compilation du code source signifie -
[Inaudible]
DAVID J. MALAN: Exactement.
Le traduire en zéros et de uns.
Parce que chacun de nous, de nos jours, ont des ordinateurs qui ont UC,
dont presque tous sont fabriqués par une société appelée Intel, et
Intel Inside, signifie qu'il ya ceci à l'intérieur de votre cerveau
informatique, connu sous le nom de la CPU.
Et l'une des choses que ce que le cerveau fait est, il sait
comment comprendre les modèles de zéros et de uns.
Il sait ce motif de bits représente une addition, ce qui
modèle représente soustractions, ce modèle de
bits représentent l'impression, et la création d'un son audible.
>> Donc en bref, le processeur, couplé avec le système d'exploitation,
qui est une partie de logiciel qui s'exécute sur le processeur,
pour ainsi dire.
Ensemble, ces deux éléments savez comment faire fonctionner des programmes qui
nous, les humains écrire.
>> Donc, si je vais dans l'appliance CS50 ici, j'ai besoin d'ouvrir
un éditeur de texte et je ne peux accéder à cette
dans un couple des manières.
Je peux soit aller dans le menu, la programmation,
et puis je peux choisir -
nope, pas ce menu.
Je peux aller Accessoires / gedit ici pour ouvrir
mon éditeur de texte peu.
Ou, plus simplement, je peux cliquer sur cette petite icône en bas
coin supérieur gauche.
Et maintenant, je reçois cet environnement ici.
C'est assez penser à un éditeur de texte simple, avec juste
une ou deux différences.
Dans la partie supérieure, où se trouve le curseur clignote maintenant, c'est là que
Je peux commencer à écrire mon code.
Dans le fond est cette chose appelée la fenêtre du terminal.
Et ce genre de choses que je peux faire dans ce
dite fenêtre de terminal?
[Inaudible]
>> Ok, donc je vais exécuter des commandes.
Et certaines des commandes que nous avons rencontrés le lundi étaient un peu
cryptiques au début, mais ls pour la liste, cd pour changer de répertoire,
rm pour supprimer.
Donc, c'est une sorte de façon vieille école de navigation de votre
ordinateur, en utilisant uniquement le clavier et commandes textuelles,
et non pas, en général, à l'aide d'une souris.
Mais nous allons voir, d'ici peu, ce nous donne en fait une
peu plus de puissance et un peu plus de précision avec lequel
nous exprimer.
Et puis là-bas, à gauche, nous allons juste pour voir,
que nous commençons logiciel d'écriture, un petit résumé de l'
programme que nous avons écrit en haut à gauche.
Mais nous allons voir que de nouveau avant longtemps.
>> Alors, faisons quelque chose d'assez simple ici.
Permettez-moi d'abord aller de l'avant et aller dans Fichier, Enregistrer, et je suis juste
allez cliquer sur jharvard ici, plus à gauche, et
jharvard est, encore une fois, le nom de mon dossier, mon
fichiers personnels, moi, maintenant étant John Harvard, comme vous tous,
sera bientôt John Harvard dans cet environnement.
Il a un répertoire d'accueil, Mes documents et ainsi de suite,
que je veux sauver, maintenant, ce fichier po
Donc, je vais l'appeler hello.c. Ensuite, je vais aller
l'avant et cliquez sur Enregistrer, et maintenant que j'ai ici est un onglet
appelé hello.c, tellement comme un autre type d'éditeur.
>> Alors maintenant, laissez-moi aller de l'avant et commencer à écrire un programme.
int main (void).
Et puis je viens de faire la dernière fois, printf, pour l'impression formatés,
(«Bonjour, monde!"
);.
Presque complète.
Mais il me manque quelques détails.
Ce qui manque à ce programme que j'ai vraiment besoin d'
il fait de compiler?
Ouais.
[Inaudible]?
>> DAVID J. MALAN: Ouais, donc j'ai besoin d'inclure la norme
I / O bibliothèque.
Donc, cela doit aller au-delà principal, donc je vais juste
faire de la place pour lui là-bas.
Et je vais faire # include.
Et remarquez les chevrons là.
Et en passant, gedit est un utilisateur peu favorable, si
parfois un peu confus, en ce qu'elle tente d'aider votre
yeux remarqué ce qui s'aligne avec quoi.
Donc, le fait que mon curseur se trouve juste à côté de cet angle
support, remarquez comment il est soulignant l'angle autre
support de plus celui-ci.
Et c'est juste pour attirer mon attention sur le fait que je
une symétrie.
Et la symétrie dans la programmation est généralement une bonne chose.
De même, si je déplace mon curseur à la fin, remarquez comment le
accolades ligne pour montrer que, oui, j'ai un processus ouvert
et un système fermé, pour ainsi dire.
>> Très bien, et je peux faire autre chose.
Il n'est pas strictement nécessaire, mais les bonnes pratiques, de dire
retourner 0.
Et 0 retour fait quoi pour nous ici?
Ou signifie quoi?
[Inaudible]
DAVID J. MALAN: Mais tout va bien.
Et franchement, il est difficile pour beaucoup de se tromper dans un
programmer ce court.
Donc, je vais être super-explicite que tout va bien.
I, l'être humain, quand je lance ce programme, sera probablement jamais
voir que 0.
En règle générale, ces chiffres qui sont retournés à partir de principal
seulement élever leurs têtes pour les humains quand
quelque chose va mal.
Et vous obtenez un peu de pop up disant erreur système, un,
deux, trois, ou quel que soit le nombre, c'est que
a effectivement été retourné.
Donc, tout chose ne va pas avec ça?
[Inaudible]
>> DAVID J. MALAN: Donc, ce n'est pas tant une erreur fonctionnelle
mais une esthétique.
Je devrais probablement mettre dans un caractère de nouvelle ligne là à l'
fin de cette chaîne afin que nous fait déplacer le curseur vers
la ligne suivante, et le programme va chercher un peu plus joli.
>> Alors maintenant, laissez-moi descendre dans la fenêtre de terminal
et, Save money
Et cette chose ici, ça s'appelle l'invite.
Il vient de me rappeler qui je suis, jharvard @ appareil, où
appareil est le nom de l'ordinateur que je suis sur.
Entre parenthèses est ce tilde, le symbole tilde, qui
représente quoi?
PUBLIC: répertoire d'accueil.
DAVID J. MALAN: répertoire d'accueil.
Donc c'est juste une notation abrégée pour dire que vous êtes dans
votre dossier personnel où tous vos fichiers vont par défaut.
Alors maintenant, ici, je peux taper ls pour la liste.
Et la seule chose que je vois ici en ce moment est hello.c.
Et c'est bien parce que je viens d'écrire cela.
>> Alors laissez-moi aller de l'avant et ne font bonjour.
Et notez que je ne suis pas taper make hello.c.
Au lieu de cela, je suis seulement en tapant le nom de base du fichier, bonjour.
Et de faire, comme nous l'avons vu lundi, sera juste en déduire que je veux
le fichier. c.
Alors maintenant, j'ai tapé font bonjour.
Maintenant, je vois cette commande assez longue et continuera
voir encore et encore.
Mais pour être clair, clang, le mot qui vient de paraître,
c'est le compilateur actuel.
Assurez est juste un utilitaire de compilation.
C'est juste un programme plus convivial qui me sauve, dans le
long terme, d'avoir à taper incroyablement fastidieux à long
commandes comme celle-là.
Ainsi, vous pouvez exécuter manuellement Clang.
Vous pouvez taper tout cela manuellement.
Obtient juste très ennuyeux.
Et ainsi de faire est tout simplement un programme qui simplifie notre vie et
exécute des commandes plus complexes pour nous.
>> Bon, alors maintenant quel fichier dois-je avoir
dans mon répertoire courant?
Pas seulement hello.c, mais aussi bonjour.
Donc, si je veux courir bonjour, rappeler que je dis point slash,
où les moyens dot aller dans le dossier en cours, où que vous soyez
sont, puis exécutez le programme appelé bonjour, et bien, maintenant,
J'ai Bonjour tout le monde.
Tout droit, des questions sur le flux de travail ou la syntaxe d'
ce que nous venons de faire?
>> Très bien, nous allons donc prendre les choses d'un cran encore.
Donc, ce n'était vraiment pas terrible juste écrire un programme qui ne
dit jamais bonjour, monde.
Nous avons donc changé, le lundi, de dire bonjour, David.
C'est un peu plus personnelle, mais tout aussi codé en dur comme le
première version.
Donc, pas tout à fait convaincante.
Mais il existe, en C, en plus des fonctions certainement
d'impression, les fonctions qui vous permettent d'obtenir les commentaires de l'utilisateur.
Et la façon dont nous l'avons fait, l'autre jour, était la suivante.
Avant que je fait imprimer quelque chose, je suis arrivé
quelque chose de l'utilisateur.
Permettez-moi de faire cela à nouveau.
>> String s, où s est juste un nom arbitraire, ici, pour un
chaîne, est égal à GetString.
Donc, ce qui a été GetString?
Il obtient évidemment une chaîne, basée sur son nom.
Mais qu'est-ce, plus techniquement?
Il s'agit d'une fonction.
Donc, c'est une fonction qui ne vient pas avec C en soi.
CS50 personnel a écrit cela.
Et donc pour l'utiliser, vous ne pouvez pas inclure stdio.h,
Vous devez également inclure quoi?
Ouais.
Donc cs50.h, qui est juste un fichier que nous avons écrit il ya quelques années.
Nous l'avons installé sur l'appareil pour vous à côté
tous les fichiers standard.
Et si dans ces premières semaines de la classe, nous allons utiliser
cela juste pour simplifier le processus de faire très basique
des choses comme entrée de l'utilisateur obtenir.
Parce que, comme nous le verrons dans quelques semaines, saisie de l'utilisateur obtenir dans un
langage comme C est en fait étonnamment complexe,
en particulier parce que vous ne savez pas à l'avance, en général, comment
beaucoup de choses que l'utilisateur va taper po
Et quand vous ne savez pas combien de données vous attendre, vous ne
savoir combien de mémoire à allouer.
Et si vous avez réellement un utilisateur contradictoire qui essaie
de pirater votre système, planter votre ordinateur, eh bien,
généralement la première méthode d'attaque est, comme je l'ai fait
Lundi, saisir une séquence tout au long de caractères aléatoires,
appuyez sur Entrée, et voir ce qui se casse.
Parce que généralement, en cas de rupture du programme, qui fait allusion à
une faille de sécurité, potentiellement.
Il fait allusion certainement à vous, le programmeur, ayant fait un
erreur, mais plus dangereusement, vous auriez pu faire un
erreur liée à la sécurité, et en général, nous verrons que
c'est comme ça que les machines sont compromises à ce jour, à la fois
dans le monde du web et des programmes à l'
ligne de commande, comme ceci.
>> Très bien.
Ainsi, la chaîne s est égal à GetString.
Ainsi, plus concrètement maintenant, qu'est-ce que la ligne 6 faire ici?
Ainsi, la fonction sur la droite obtient chaîne,
prend combien d'arguments?
D'accord.
Donc, aucun.
Un peu de raison vérifier.
Un argument, encore une fois, c'est juste une entrée à une fonction pour modifier
son comportement par défaut en quelque sorte.
Mais dans ce cas, je ne veux pas de modifier
le comportement des GetString.
Je voulais juste avoir une chaîne.
Alors, j'ai mis rien dans les parenthèses, puis j'ai mis un
virgule demarking la fin de la ligne de code.
Maintenant, le signe égal ne signifie pas l'égalité, en tant que tel.
Cela signifie que l'affectation, ce qui signifie mettre ce que devient
émise à l'intérieur de tout ce qui est à droite sur la gauche.
>> Ainsi, sur la gauche, nous disons que nous avons déclaré un
chaîne appelée s.
Et plus précisément, nous avons alloué la mémoire interne de
que nous allons mettre les bits qui représente une séquence de
caractères.
Mais aujourd'hui, nous avons alloué
ou déclaré une chaîne.
Très bien.
Alors maintenant, une fois que j'ai fait cela, je veux brancher la valeur de
s, et non pas la valeur de David.
Donc, ce n'est pas bien pourquoi?
Donc, c'est juste littéralement l'art codé en dur.
C'est-à-dire "bonjour, s", ce qui n'est pas ce que je veux.
Donc, je peux le faire.
Le signe pour cent est un espace réservé, mais maintenant j'ai besoin de
imprimer passer dans un second argument.
Rappelons que les arguments des fonctions sont séparées par
virgules, de sorte que la prochaine virgule ici j'ai mis après cette s la lettre.
Et dans ce contexte, aujourd'hui, s est la variable, et printf,
lors de la réception de ces deux entrées -
la chaîne du côté gauche et le nom de la variable sur la droite -
il sera brancher ce dernier dans l'ancien pour nous, et
Il suffit d'imprimer une chaîne contenant belle belle
que ce soit que nous avons tapé po
>> Donc, nous allons essayer.
Aller de l'avant et un zoom arrière, arrière
à ma fenêtre de terminal.
Zoomer en bas ici.
Retapez faire bonjour.
Clang semble avoir été relancé.
Je vais taper. / Bonjour, Entrée.
Rien ne semble être encore le cas, mais c'est à cette invite
que je peux taper quelque chose comme Nate, Enter, et maintenant nous avons
Bonjour, Nate.
Et je peux le refaire avec Rob, et ainsi de suite.
Donc, j'espère que maintenant ce programme se comporte comme j'ai l'intention.
>> Maintenant, tout ce qui n'est pas facile à utiliser.
Je n'ai aucune idée de ce qui est attendu de moi.
Ainsi, nous pouvons certainement nettoyer tout ça un peu.
Permettez-moi de revenir ici, et au lieu de simplement plonger et
demandant à l'utilisateur une chaîne, permettez-moi de dire explicitement l'
l'utilisateur ce que j'attends.
Donc printf ("Entrez une chaîne:"
);
Donc pas de variables ici.
Pas de signes de pourcentage.
Juste une simple phrase en anglais.
Permettez-moi maintenant aller au fond ici et relancer mon programme.
Mais rien ne semble avoir changé.
Pourquoi?
Je dois le recompiler.
Donc, erreur facile à faire.
Mais il faut non seulement enregistrer le fichier, mais
recompiler le programme.
Et si je ré-exécutez make bonjour, maintenant Clang s'exécute.
Maintenant, je peux courir. / Bonjour. Et maintenant je vois "Entrez une chaîne:".
D'accord.
Maintenant c'est un peu plus convivial.
Nate, Entrée, bonjour, Nate.
>> Eh bien, nous allons essayer encore et commencer à penser
sur les cas marginaux.
Ainsi, tout comme dans Scratch, vous êtes encouragé ou sont en cours
encouragée dans la spécification de type de réfléchir à ce qui pourrait aller
mal si vous ne prévoyez pas tout ce que l'utilisateur peut faire.
Bugs, par conséquent, pourrait s'ensuivre.
Alors entrez une chaîne -
ce qui est un cas coin ici?
Qu'est-ce qu'un scénario I, le programmeur, peut-être pas
prévu?
Ouais.
D'accord.
Alors que faire si je tape dans un certain nombre comme ça?
Très bien.
Donc, il fonctionne toujours.
Fait aucun sens grammaticalement.
Mais au moins, le programme fonctionne.
>> Ce qui est une autre affaire coin?
Quelque chose que je ne m'attendais pas.
Ouais?
D'accord.
Donc, nous pourrions faire quelque chose comme un nombre vraiment, vraiment grand.
Donc, nous allons faire ici.
Permettez-moi de faire un zoom arrière pour une seconde, permettez-moi de souligner.
Impossible de copier et coller ici.
Très bien.
Donc je ne peux pas copier et coller dans cette fenêtre de terminal, donc nous allons
il suffit de simuler.
Permettez-moi de faire un zoom arrière, allons conclure.
Je ne vais pas le faire trop longtemps, car il ne sera pas
rompre effectivement dans ce programme.
Mais c'est possible.
Entrée.
Mais il n'a pas fait.
Très bien.
Mais c'est un cas authentique coin.
Et la seule raison qui se comportent correctement, de sorte à
parler, c'est parce que l'GetString CS50 fonction est en fait
conçue sous le capot, comme nous le verrons dans quelques semaines,
pour allouer automatiquement RAM de plus en plus, de plus en plus
mémoire du système d'exploitation, quand il se rend compte, wow,
vous avez vraiment tapé dans quelque chose d'assez longue.
Maintenant, c'est un peu un mensonge.
Si l'on fait une pause pendant un bon moment et j'ai tapé dans
quelque chose comme 5 milliards de caractères au clavier
ici, ou vraiment touché copier-coller un peu, nous avons très probablement
pourrait entraîner un plantage du programme.
Juste un peu plus difficile à simuler avec un fini
laps de temps.
>> Ce qui est une autre affaire coin, nous pourrions essayer?
Ouais?
Ouais.
Alors pourquoi ne pas nous répondons rien?
Donc, nous avons à prendre des mesures, parce que sinon,
le programme va rester là toute la journée à clignoter.
Mais si je viens de taper Entrée -
OK, maintenant, semble toujours mal.
Ne s'est pas écrasé, mais peut-être il ya maintenant une possibilité de
commencer à mettre en œuvre un programme plus rigoureux
qui vérifie en fait.
Et si la chaîne, la phrase, le mot que je
a tapé dans longueur 0, eh bien, j'aurais peut-être crier à l'
utilisateur, ou lui dire d'entrer une chaîne à nouveau, de sorte que
nous obtenons réellement ce qui ressemble à un comportement correct et pas
juste une surveillance complète de ma part.
>> Question à l'arrière?
Nombre décimal.
Donc, nous pourrions essayer ça aussi.
1,10000005.
On dirait que ça va juste travailler réellement bien.
Et qui est réellement prévu.
Même si nous aurions pu tapé ce nombre là-bas, ou d'un
plus grand nombre précédemment, se rendre compte que quand on frappe utilisateur
d'entrée et nous utilisons la fonction GetString, ne
importe si ce que je tape ressemble à un numéro.
Rappelons que selon ASCII, tout sur votre
clavier a une valeur numérique qui peut être mis en correspondance avec un
caractère, un char.
Donc dans ce cas, même si je pourrais taper un numéro, le
ordinateur va penser que c'est, pour ainsi dire, comme une chaîne -
quelque chose qui ressemble à un certain nombre, mais il est
pas réellement un certain nombre.
Mais c'est en réalité un enchaînement parfait, parce que maintenant nous pouvons
fait la transition vers l'écriture de programmes qui
utiliser d'autres types de données.
>> Donc, en plus d'utiliser les caractères, ou plutôt, en plus de l'aide de chaînes,
se rendre compte que nous avons d'autres types de données dans C ainsi que dans
d'autres langues.
Un char, comme son nom l'indique, est un caractère unique.
Un flotteur est une valeur à virgule flottante, et c'est juste une fantaisie
façon de dire un nombre réel - quelque chose qui a un nombre décimal
sert à rien avec des nombres à gauche et / ou droite.
Un int est un entier, qui est juste un nombre comme 123.
Et maintenant, plus intéressant encore sont des choses comme double.
Qu'avons-nous dit une chambre double était la dernière fois?
C'est 64, à droite.
Ainsi, alors que généralement un flotteur est 32-bit -
il est donc aussi longtemps dans la mémoire, il utilise 32 zéros et de uns aux
représentent des valeurs - un double est littéralement deux fois, ce qui
signifie que vous pouvez représenter des chiffres plus élevés, ou
vous pouvez représenter des chiffres plus précis.
Ainsi, vous pouvez avoir plus de chiffres après la virgule, mais
comme le gars dit dans la vidéo, même quelque chose de simple
conceptuellement comme 1/3 ne peut pas être représenté précisément par une
ordinateur, parce que finalement vous n'avez plus de bits, et
donc vous ne pouvez faire .33333333 tant de fois, à
quel point vous avez juste à dire que je suis sorti de la représentation
l'espace, je dois juste l'appeler un jour et de le représenter
quelque peu imprécise comme ça.
Et un long long -
nom stupide, mais c'est parce qu'il ya un type de données connue sous le nom
longtemps dans C qui est souvent coïncidence 32 bits, tout comme un
int est de 32 bits, mais un long long est
généralement 64 bits.
Donc, cela signifie juste que vous pouvez représenter plus
nombreux que cela.
>> Très bien.
Donc, si nous voulons réellement commencer à représenter les choses, nous
peut-être besoin de plus de formes sophistiquées et
c'est pourquoi nous avons chaîne.
Ainsi, dans la bibliothèque CS50, ce fichier s'appelle cs50.h, nous avons
effectivement déclaré un type de données, pour ainsi dire, appelée chaîne,
mais chaîne n'existe pas réellement.
Il s'agit, encore une fois, une de ces couches que nous allons éplucher
de retour dans une semaine ou deux et jetez-le, et fait
regarder sous le capot ce qui est en fait une chaîne, et
comment il est représenté.
Nous allons aussi examiner les valeurs booléennes.
>> Donc, ce qui était un bool dans le contexte de Scratch?
Il est vrai ou faux.
Donc, c'est juste une valeur qui est vrai ou faux, allumé ou éteint, 1 ou
0, mais vous voulez voir dans le monde.
Donc, en C, grâce à la bibliothèque CS50, qui à son tour
comprend une autre bibliothèque sous le capot, nous avons
l'accès à un type de données que l'on appelle bool, qui sera
littéralement nous permettent d'assigner les valeurs true ou false pour
choses dans un programme.
>> Donc, nous allons aller de l'avant ici et d'écrire un petit programme qui
fait quelque chose impliquant des nombres à la place.
Permettez-moi de revenir sur l'Appliance CS50, laissez-moi aller de l'avant et
créer un nouveau fichier appelé ici -
disons juste quelque chose de simple, comme math.c.
Très bien.
Et maintenant, allez jusqu'au sommet de mon programme, je suis
va faire l'habituel -
# Include, de sorte que je peux utiliser
printf, int main (void) -
nous y reviendrons, par la suite, ce qui signifie int
ici, ce qui signifie que nul ici, mais pour l'instant, sachez simplement que
vous devez lancer des programmes de ce genre.
Maintenant, je vais aller de l'avant et de dire quelque chose d'un peu
différente - printf ("Donnez-moi un nombre:"
);.
Alors je vais faire int n = getInt, car il
Il s'avère que getInt est une autre fonction dans la bibliothèque CS50
en plus GetString.
Et maintenant, je vais faire quelque chose de stupide, comme "merci
pour l'% d ", pour l'entier décimal, puis par des virgules n, et
elle renvoie 0.
Encore une fois, retourne 0 n'a rien à voir avec le nombre, je suis
demandant à l'utilisateur.
Signifie seulement à la fin que tous, sans doute, est bien.
>> Alors laissez-moi descendre dans la fenêtre du terminal ici.
Permettez-moi de saisir rendre les mathématiques, entrez.
Et quelque chose qui ne va pas.
Faire des mathématiques n'a pas fonctionné.
Voici le premier de nos messages d'erreur.
Pourquoi?
Un peu cryptique, mais -
Ouais.
Donc cs50.h.
Encore une fois, surtout au début, vous allez écrire votre premier
programme pour pset 1 dans les sections, dans les heures de bureau, et
franchement, ça va être écrasante parfois ce que ces choses
sont en train de dire.
Mais vous vous rendrez compte très vite ils commencent à tomber
dans des seaux où celui-ci signifie que vous avez laissé une
de l'# includes dans la partie supérieure du dossier.
Et Clang, le compilateur, désire vous informer du présent
dire, assez fantaisiste, déclaration implicite de
getInt fonction est invalide.
>> Très bien.
Alors qu'est-ce que ça veut dire?
Cela signifie simplement que vous avez implicitement déclaré dans getInt
le sens que vous n'avez pas explicitement déclarée.
Pour déclarer explicitement int, il faut apprendre à
Clang qu'il existe.
Et la solution très simple pour cela est de l'enseigner par
y compris cette autre fichier, cs50.h, à
le haut de votre fichier.
Parce que littéralement, ce # include ne s'agit-il dit Clang
à peu près à aller trouver le fichier appelé cs50.h, copie,
collez automatiquement dans le haut de mon programme pour moi,
puis de convertir le code source de zéros et de uns.
Mais ce serait évidemment très fastidieux si nous, les humains ont
d'aller copier et de coller ces fichiers volumineux tout le temps,
si # include fait juste tout ce qui automatiquement sans
troubler mon code avec quelqu'un d'autre bibliothèque.
Et une bibliothèque est juste un autre fichier contenant des fonctions et
d'autres choses que quelqu'un d'autre a écrit, que nous sommes
levier pour notre propre bien.
>> Très bien.
Essayons encore une fois.
Faire des mathématiques.
Entrée.
Bon.
Donc, cela semble avoir fonctionné.
Alors laissez-moi courir mathématiques;. / Math.
Saisissez me donne un certain nombre, 123.
Merci pour le 123.
Maintenant, nous allons essayer une autre affaire coin.
Une chaîne est très généreux, car une
chaîne peut être n'importe quoi.
Peut ressembler à numéros, ressemblent
caractères, ressemblent à des mots.
Mais un int est un entier.
Alors maintenant, si je suis difficile à l'utilisateur, et il est dit «Donnez-moi
un certain nombre, «et si je tente de faire quelque chose comme 0,1?
Eh bien, c'est un nombre, et il est compatible avec la
grammaire que j'ai utilisé ici, mais sous le capot, je suis d'
Bien sûr, utiliser la fonction getInt.
>> Alors voyons voir ce qui se passe.
Entrez, réessayez.
Très bien.
Laissez-moi être difficile et appuyez simplement de nouveau sur Entrée.
Entrez, entrez.
Alors maintenant, il semble que getInt est un peu plus
puissant que GetString.
Nous, le personnel, mis en œuvre de telle manière que, si nous remarquons
vous n'avez pas donné un int - et un int est un nombre décimal
zéros contenant, ceux, deux, trois, quatre, cinq, six,
sept, huit, ou de neuf.
Et c'est tout.
Pas de chiffres après la virgule, pas de personnages, pas de ponctuation.
Il semble que nous devons coopérer.
Je vais donc essayer quatre, cinq, six, et ça me passe au travers.
Alors, vraiment, d'être ici anale, je devrais probablement dire «Donnez-moi
un nombre entier ", afin de transmettre à l'utilisateur
exactement ce que j'ai l'intention.
>> Maintenant, nous allons réfléchir sous le capot.
Nous n'allons pas voir comment cs50.h est mis en œuvre aujourd'hui,
cette bibliothèque.
Mais si elle n'arrête pas de dire recommencer, recommencer, recommencer, ce que la programmation
construire sans doute suis-je utiliser sous le capot d'
mettre en œuvre ce?
Il suffit donc d'une boucle, non?
L'une des idées les plus simples que nous avons vu sur Scratch.
The Forever construire, la répétition de la construction.
On peut supposer que, dans ce programme, sous le capot, même
mais il est écrit en C et se raye pas, c'est faire
quelque chose qui s'appelle équivalent à jamais si l'utilisateur n'a pas
tapé dans un entier, disons relance, relance, relance, relance, de sorte
puis enfin, quand nous recevons un nombre entier, alors vous
sortir de cette boucle.
>> Alors quelles sont les autres fonctions peuvent nous utilisons ici dans la bibliothèque du CS50?
Eh bien, en quelque sorte les plus évidents, du moins sur la base du
les types de données que nous connaissons maintenant exister.
Nous avons mis en GetString, getInt, mais tout au long du
premières semaines de la durée, vous pouvez également utiliser GetFloat et
GetDouble et GetLongLong afin d'obtenir précisément le
les types de données que vous souhaitez.
Parce que le détail clé ici est que, contrairement à certaines langues,
comme Python et Ruby, où vous n'avez pas nécessairement besoin d'
déclarer le type de données d'une variable -
vous n'avez pas à indiquer à l'ordinateur ce genre de choses
vous allez mettre dans la variable -
en C, vous devez être toujours aussi précis.
Donc, si vous voulez une variable appelée n, un morceau de stockage
que, dans ce cas, se trouve être de 32 bits par convention, vous
doivent indiquer à l'ordinateur que ces bits sont
allez stocker un certain nombre -
pas un personnage, pas une chaîne, pas un char.
Et cela répond à la question que nous efficacement
rencontré la semaine dernière.
Si nous utilisons les zéros et les numéros de celles à ne représentent pas seulement
chiffres, mais tant et B et Cs, comment dans le monde est un
l'ordinateur va savoir que ce modèle de bits réellement
représente le nombre 65, par opposition à la représentation du
lettre A, qui coïncide, selon
ASCII, rappeler, était équivalent à 65?
>> Ainsi, ces types de données fournissent un contexte à l'ordinateur, de sorte
qu'il sait si ces bits doit être interprété comme une
int ou comme une chaîne.
Toutes les questions, alors, à ce sujet?
Ouais?
DAVID J. MALAN: Bonne question.
Si nous prenons sur stdio.h, nous enregistrer le fichier -
laissez-moi aller à la fenêtre de terminal et exécutez make mathématiques, zoom
et entrer -
maintenant je reçois une erreur différente, parce que je suis implicitement
déclarant ce qui fonctionne maintenant?
Printf.
Alors maintenant, j'ai créé un nouveau problème, dont la solution est
essentiellement les mêmes.
J'ai besoin de remettre ça.
PUBLIC: [Inaudible]
DAVID J. MALAN: Oh.
Donc, si je sors -
Ok, ouais.
Donc, si je retire l'inclusion E / S standard bibliothèque jusqu'à
ici, puis vous dites que si je me débarrasser de printf, obtenir
débarrasser de printf?
Oui.
Cela devrait fonctionner, parce que je ne suis plus toute aide - oups.
Que je viens de mentir?
Oh, d'accord.
Cela ne fonctionnera pas à cause d'une nouvelle erreur, nous avons introduit.
Et celui-ci est un peu plus explicite.
>> Quel est le problème?
Inutilisés n variables.
Donc, cette erreur est le résultat de notre avoir configuré l'
appareil à être particulièrement pédants, pour vraiment crier à
vous pour chaque erreur possible, même si c'est un peu
une erreur non fatale comme cela - est-ce vraiment un grand
face que je attribuer un int, mettez un numéro en elle, puis
seulement n'a rien fait avec elle?
Donc, fonctionnellement, non.
Cela ne va pas à briser le programme.
C'est juste un peu stupide, non?
Il n'y a pas de valeur pour avoir demandé ce nombre, stockée
dans une variable, si vous n'allez jamais à faire quoi que ce soit
avec elle, que ce soit l'imprimer ou l'enregistrer.
Donc dans ce cas, Clang est de reconnaître que beaucoup, et
c'est dire inutilisés n variables.
>> Ainsi, nous pouvons résoudre ce problème si nous voulons vraiment.
Mais encore une fois, ce n'est pas une bonne programmation maintenant.
Alors seulement je pouvais le faire -
descendre ici, laissez-moi éclaircir l'écran, rendre les mathématiques.
Qui fonctionne.
Maintenant, je peux lancer mon programme de mathématiques, prend en entrée -
eh bien, c'était mauvais.
Prend en entrée, et c'est tout ce qu'il fait, dans ce cas.
>> Donc en fait, essayons un cas autre coin que nous
ne pas penser plus tôt.
Dans ce cas - là, nous allons revenir à celui qui est un
peu plus convivial.
Permettez-moi de revenir ici et exécutez make à nouveau les mathématiques.
Oups, qu'ai-je fait de mal?
Vous avez à faire reculer plus loin.
D'accord.
Maintenant, nous sommes de retour à l'état initial, où tous les
on l'espère bien.
Et maintenant, si je n'ai mathématiques, 123 semble fonctionner.
Mais ce n'est pas vraiment une preuve effective, de dire simplement
ok, ça marche.
789, qui fonctionne.
Temps de se soumettre.
Parce qu'il ya quelques cas rares d'autres ici.
Une chaîne n'a pas vraiment nous donner beaucoup de peine en tapant un
beaucoup de caractères.
Mais que faire si je tape dans tout cela?
Frapper le numéro 1 grand-chose, beaucoup ici -
Tout va bien, ça devient un peu ennuyeux, alors je vais
arrêter ici, et je vais appuyez sur Entrée.
>> Qu'est-ce qui s'est passé?
Donc, cela peut effectivement être expliquée.
Ainsi at-il le prendre comme binaire?
Une bonne pensée, mais non, ce n'est pas le fait qu'il a pris
sous forme binaire, car en effet, c'était juste une sorte de
coïncidence.
Nous pouvons le faire à nouveau.
Il n'y a donc pas de 2 dans le système binaire, c'est
probablement assez de toute façon.
Entrée.
Donc, ce n'était pas le problème.
Quoi d'autre?
Exactement.
>> Alors, pensez à revenir à ce que un int est en réalité.
Il est 32 bits qui, collectivement, sont interprétés
comme un nombre.
Si vous avez 32 bits, cela signifie que chacun des bits peuvent être
un 0 ou un 1., 0 ou un 1
Donc, cela signifie qu'il ya deux possibilités pour ce bit,
deux possibilités pour cela, deux possibilités pour ce
peu - si c'est 2 fois 2 fois -
de sorte que les 2 à la puissance 32 est le nombre total d'
permutations de zéros et de uns, si vous avez 32
espaces réservés zéros ou de uns, en face de vous.
Donc, si j'ai 2 au 32, mathématiquement, c'est quoi?
Donc, c'est beaucoup.
Il est 4 milliards de dollars, donner ou prendre.
Et 4 milliards ne semble pas être ce qui a été imprimé ici.
En fait, cela ressemble plus près de 2 milliards d'euros.
Mais ce n'est pas une coïncidence.
Le fait que l'ordinateur a mal interprété mon très grand nombre,
ma séquence énorme de celles et puis ma séquence énorme de groupes de deux,
que près de 2 milliards de dollars, est expliqué comment?
Il ya un plafond sur le int.
Il ya une certainement une valeur maximale que vous pouvez représenter.
Mais il est généralement de 4 milliards d'euros, non?
Si 2 au 32 est d'environ 4 milliards de dollars, qui semble comme
c'est le plus grand nombre.
Donc, pas un reste, mais une bonne pensée.
Les nombres négatifs.
Donc, si vous avez 4 milliards choses possibles que vous pouvez
représentent ces diverses permutations de 32 0 et
1s, eh bien, il va de soi que nous, les humains pourraient vouloir
représentent non seulement des nombres entiers positifs
mais entiers négatifs.
Et en effet, c'est l'hypothèse que C fait.
Donc, avec 32 bits, vous pouvez représenter à peu près négatif 2
milliards sur toute la hauteur de positif 2 milliards d'euros.
Et dans ce cas, ce que nous sommes vraiment voir est juste
la frange de la capacité de notre entier, et nous avons donc
de parler, débordait d'un entier.
Nous avons essayé de caser plus de bits en elle que peut réellement s'adapter.
Ainsi, le résultat final est que nous avons essentiellement tous les bits à 1.
Nous avons basculé l'ensemble de nos morceaux sur, nous avons essayé de représenter
le plus grand nombre possible, mais ce n'est clairement pas près d'
assez grand pour représenter les deux choses que je viens de tapé po
Ouais?
PUBLIC: [Inaudible]
>> DAVID J. MALAN: Bonne question.
Pourquoi ne pouvons-nous pas simplement représenter que négative
signer en tant que juste un personnage?
Donc, nous ne pouvions absolument, et nous pourrions ensuite enregistrer
un bit supplémentaire.
Mais vous allez encore avoir à représenter ce tableau de bord, et
qui va vous coûter au moins quelque chose,
sans doute un peu.
Alors oui, nous pourrions avoir 32 bits utilisés pour notre nombre, mais maintenant
nous avons besoin d'un autre bit utilisé pour notre tableau de bord
symbole, le signe moins.
Alors maintenant, nous avons 33 valeurs binaires, que nous pourrions faire, mais il est
tout simplement pas la façon dont c'est fait.
Nous avons fait appel d'un jugement année, il ya 32 bits est une sorte de
unité de mesure ici.
Nous allons donc utiliser l'un de ces bits efficacement à
représentent la négativité et 31 bits pour représenter le nombre.
D'autres questions?
Très bien.
C'est beaucoup.
Pourquoi ne pas aller de l'avant et de prendre notre pause de cinq minutes ici?
>> Très bien.
Encore une fois, de ne pas trop insister sur les applications des mathématiques
de la programmation, nous allons simplement arracher ce seul exemple
avant de passer à d'autres constructions, juste parce qu'il
allons illustrer quelques points habituels d'achoppement sur certains
les bases quand il s'agit de l'écriture de programmes.
Dans ce cas, faites expressions arithmétiques qui ont une certaine
pertinence intéressant de la syntaxe.
>> Donc, c'est juste une formule avec laquelle nous pouvons convertir
températures de Fahrenheit à Celsius.
Si vous ne me souviens pas, c'est juste la formule.
Donc, si nous brancher Fahrenheit valeur de 32 degrés, ce qui est
gel, qui va être 32 moins 32 est 0, et en effet,
0 à Celsius est également congélation.
Ainsi, la santé mentale vérification rapide là-bas - c'est la formule familière.
Permettez-moi de passer à l'appareil, cependant, et commencer à
écrit un programme appelé, comme, f2c; "Fahrenheit
Celsius point c ".
Et au sommet ici, je vais commencer avec # include
stdio.h, et je vais faire int main (void), et
encore une fois, nous reviendrons à l'avenir à ce que signifie int
là et ce vide signifie qu'il.
Et maintenant, laissez-moi aller de l'avant et mettre en œuvre un programme qui
fait essentiellement cette conversion pour nous.
>> Donc, printf, disons, de la température en degrés Fahrenheit.
Et puis, laissez-moi aller de l'avant et obtenir la valeur de l'utilisateur.
Quelle valeur dois-je obtenir de l'utilisateur, si je veux
qu'ils me donnent une température en degrés Fahrenheit?
Ouais?
Que proposeriez-vous?
Ouais.
Donc flotteur se sent assez raisonnable.
Nous avons, encore une fois, que quelques options que
nous avons vu jusqu'à présent.
Nous avons des choses comme char, double, float, int, long terme,
bool, string.
Donc, de ce nombre, flotteur se sent assez raisonnable.
Nous pourrions utiliser un double, à droite, parce que si nous voulons vraiment
représentent la température d'un être humain -
98,60000 -
nous pourrions utiliser 64 bits pour le faire, mais il se sent comme
exagéré pour la température.
Alors allons-y avec flotteur.
Maintenant, j'ai besoin d'une variable.
Juste pour garder les choses simples, je vais l'appeler f, mais je
pourrait tout aussi bien l'appeler température,
mais est soit très bien.
Donc flotter f = GetFloat.
Dès que j'ai maintenant décidé d'utiliser GetFloat, cependant, je
besoin de faire une correction.
Ouais.
Nous avons donc besoin de # include , sinon le compilateur est
va nous crier dessus.
Maintenant que j'ai un flotteur, laissez-moi aller de l'avant et de faire le
conversion.
>> Alors d'abord, permettez-moi de prendre l'habitude ici de
commenter mon code.
Encore une fois, un commentaire est juste une notation à l'être humain qui est
ne fait pas partie du programme en soi, mais l'un, vous aide
comprendre ce que vous avez fait le lendemain matin, ou le prochain
mois, il permet à votre adjoint à l'enseignement comprendre ce que vous avez fait
ou ce que vous aviez l'intention de le faire, il est donc
pratique généralement très bon.
Tous les quelques lignes de code, écrire un commentaire
vous-même ou votre collègue.
Donc ici, je vais dire: «Demander à l'utilisateur pour la température."
Ne doit pas être une phrase complète, juste une courte phrase.
Mais l'idée derrière commenter en C, c'est que chacun de vos
commentaires devraient vous donner les moyens - ou, disons, un TF ou un collègue -
de parcourir votre programme et de savoir exactement ce qu'il fait, en ne
tant la lecture du code, mais en lisant les commentaires, ce qui
doit être concise et claire.
Très bien, alors maintenant laissez-moi aller de l'avant et de dire: «Autre
Fahrenheit en Celsius. "Alors, je vais aller de l'avant et de faire,
disons, float c.
Nous vous tiendrons Celsius comme une valeur à virgule flottante.
>> Et permettez-moi de prendre un coup de couteau à la présente.
La formule est, encore une fois, ici.
Comme 9.5 fois F de moins 32.
Alors allons-y.
Donc, 5 divisé par 9, moins -
oups, je l'ai déjà foiré.
Fois.
Donc, 9.5 fois moins F 32.
Donc F moins 32, point-virgule.
Et maintenant, ici-bas, je vais aller de l'avant
et dire, imprimez résultat.
Et cette partie est facile. Printf.
Comment dois-je faire imprimer ce?
Eh bien, je pourrais dire "Ce nombre en degrés Celsius est:% f \ n",
juste pour quelques esthétique.
Et puis, quelle est la valeur que je veux brancher ici comme le printf
Le deuxième argument?
D'accord.
Il suffit donc de c.
Nous allons donc commencer avec cela et puis il suffit de retourner 0.
Encore une fois, cela n'a rien à voir avec les mathématiques.
Cela signifie simplement que tout va bien.
>> Maintenant, est-ce correct, ce programme?
Très bien.
Donc j'ai fait quelques erreurs.
Même si vous n'avez aucune idée de ce que la programmation est, vous pouvez trier
de retour à l'école primaire en déduire ce que l'
erreurs ici peut-être.
Quel est l'un des premiers?
PUBLIC: [Inaudible]
DAVID J. MALAN: Ouais.
Donc, il nous manque des parenthèses.
C'était délibéré que j'ai fait entre parenthèses dans le discours
glisser ici, car il ya en fait cette notion d'ordre
des opérations, ou de préséance, par lequel certaines opérations -
multiplication -
ont plus contraignant, ont une priorité plus élevée, que les choses
comme l'addition ou la soustraction.
Donc, nous avons fait cela pendant des années juste pour préciser exactement
quelle opération mathématique doit être fait en premier.
Donc, je devrais sans doute imiter exactement cela.
Sinon, l'ordinateur est sans doute va essayer de faire
quelque chose comme fracture 5 par 9, puis multipliez F, puis soustraire
32 à partir de l'ensemble.
Ce qui n'est pas, en fait, ce que nous voulons faire.
Donc, nous allons parenthèses.
Ajoutons entre parenthèses mes ici, les parenthèses ici.
Mettons cela ici.
Ici, je viens de remarquer une autre erreur que j'ai faite le long du chemin.
Ouais?
PUBLIC: [Inaudible]
>> DAVID J. MALAN: Ah.
Bon.
Donc, nous avons effectivement le même entier
question de la division d'avant.
Je corriger cela, nous allons voir ce que le symptôme est.
Mais nous allons devoir corriger une
autre erreur ici.
Ouais?
PUBLIC: [Inaudible]
DAVID J. MALAN: Oui.
Donc, j'ai fait erreur stupide, mais extrêmement important.
L'ordinateur ne va pas tout simplement fermer les yeux et laisser
m'utiliser F majuscule, quand j'ai effectivement déclaré la variable
comme un f minuscule ici, à la ligne 8.
J'ai donc besoin de corriger la ligne 11 mon capitalisation, ce qui a
l'heure était un F majuscule par erreur.
Qu'en est-il ici?
Si tel est minuscule aussi?
Il devrait être, mais c'est une coïncidence.
Que f% n'a rien à voir avec la variable.
Donc, juste pour être super clair ici, laissez-moi aller de l'avant et
renommer ce, en bref, "la température". Permettez-moi de renommer
cette "température". Permettez-moi de ne pas renommer ce.
Parce que, encore une fois, f% signifie globalement, "flottant valeur du point."
N'a rien à voir avec ma variable.
Mais «température» dans tous les sens est un peu verbeux,
donc je vais retourner dans mon minuscule «f» s.
>> Maintenant, laissez-moi aller de l'avant vers le bas de ma fenêtre ici.
Assurez-f2c -
qui était, encore une fois, le nom arbitraire que je
a donné à ce fichier.
Semble avoir compilé.
Permettez-moi de lancer f2c.
Entrée.
Température en degrés Fahrenheit - faisons une tâche facile.
32.
OK, c'est exact.
Mais, si je fais maintenant 212 pour bouillante -
putain.
Très bien.
Donc, clairement pas corriger, si votre tente TF
au moins deux valeurs.
Alors, quel est le problème ici?
Eh bien, vous avez déjà mis le doigt sur la nature du problème.
Mais pourquoi est-ce le cas?
Là-haut, quand je fais le calcul de 5 divisé par 9.
Donc, théoriquement, c'est tout à fait correct.
Totalement compatible avec la formule.
Mais les ordinateurs ne font précisément ce que vous
leur dire de faire.
Et ce que nous disent efficacement l'ordinateur est ici
diviser l'entier 5 par le 9 entier
et me donner le résultat.
Le problème est, cependant, si vous n'avez division à l'aide de données
types, la sortie est du même type que les entrées de données.
Et si les deux entrées sont deux entiers, la sortie va
d'être un int.
Et ainsi de 5 divisé par 9 est quelque chose de point.
Mais quel est l'entier le plus proche pour signaler quelque chose?
Donc, c'est en fait 0.
Donc, comme nous en avons discuté, lundi, tout ce qui suit la virgule
point de est tronqué.
Il obtient juste jeté.
Donc, c'est une erreur complète, parce que je pourrais tout aussi bien
multiplier par 0 tout ici.
>> Maintenant, je peux résoudre ce problème dans un couple des manières.
Je pourrais le faire.
5,0 divisé par 9,0.
Techniquement, je n'ai même pas besoin de le faire.
Il ne suffit pas de faire juste l'un des numéros un flotteur -
ou double - en mettant la virgule ici.
Parce que ce qui se passe maintenant, c'est quand on divise un entier par
un flotteur ou un double, l'ordinateur va réaliser
oh, un de ceux qui est plus précis.
Permettez-moi de pécher par excès de vous donner plus de précision que
vous aviez l'intention.
Donc, il va convertir le résultat -
elle retourne le résultat sous forme de valeur à virgule flottante ainsi.
Alors que cela fonctionnerait.
Ce serait travailler.
Et il ya un autre mécanisme que nous allons voir dans
plus en détail la semaine prochaine.
Vous pouvez réellement, en tant que programmeur, indiquer à l'ordinateur
à traiter réellement un type de données que
s'il s'agissait d'une autre.
>> Donc, je pouvais le faire.
Entre parenthèses, je peux dire quelque chose comme (float), ouvert
parenthèse, parenthèse ouvrante.
Et c'est ce qu'on appelle "casting". Encore une fois, plus
sur la semaine prochaine.
Mais ce n'est que le moyen de programmation de dire
l'ordinateur, ouais je sais 9 est un entier ou un long.
Je sais que ce n'est pas une valeur en virgule flottante.
Mais le traiter comme tel en tout cas.
Donc, pour jeter un type de données des moyens pour convertir
de l'un à l'autre.
Franchement, c'est un peu moche, donc je propose que nous aller
sauvegarder à la proposition initiale de la conversion de tout
ces choses à virgule flottante manuellement.
Parce que maintenant c'est juste super clair ce qui se passe, et
ce n'est pas tout ce qui distrait.
>> Donc, nous allons maintenant retourner dans ma fenêtre de terminal.
Assurez-f2c.
Laissez-moi aller de l'avant et de lancer ça.
Et, soit dit en passant, on s'ennuie tapant ces commandes
encore et encore, se rendre compte que les ordinateurs, comme Linux ici,
ont tendance à être très intelligent.
Et si je frappe le haut, on peut passer par toute mon histoire d'
commandes, Haut et Bas.
Donc, dans ce cas-ci, je peux simplement aller jusqu'à lancer make f2c.
Je me fais engueuler parce que je viens de faire ce que il ya une seconde.
Il est déjà à jour.
Alors maintenant, je peux courir f2c nouveau.
Essayons 32, Fahrenheit.
Maintenant, essayons de 212 degrés Fahrenheit.
>> Ouf.
Semble fonctionner.
Maintenant, c'est bon, mais il se sent un peu arbitraire
Je montrant six chiffres après la virgule.
Pas vrai?
Si vous êtes la personne la météo à la télévision, vous êtes une sorte de crétin
si vous lisez la température à
ce degré de précision.
Donc, nous allons simplifier cela.
Donc, nous allons effectivement aller ici, à mon printf.
Et ouais, je tiens à flotter.
Mais je veux maintenant spécifier la précision.
Et je vais être un peu succinct.
Je vais vous dire, donnez-moi un point après la virgule.
Ainsi, plutôt que de dire f%, je vais dire% .1 f.
Et cela signifie juste me donner une position
après la virgule.
Très bien.
Essayons encore une fois.
Permettez-moi de ré-exécuter l'après compilation.
Et maintenant, je tape 32, et je serai de retour d'un
valeur plus succinct.
Et je peux taper, désormais, 212, et obtenir un plus succincte
valeur aussi bien.
Et il ya d'autres choses que vous pouvez faire avec printf.
Vous pouvez réellement spécifier la largeur du nombre doit être.
Si vous voulez un rembourrage sur elle, de sorte que vous pouvez d'ores-align ou
gauche aligner l'ensemble de vos numéros ou
essayez de choses du centre.
Alors rends compte qu'il ya des petits trucs que vous pouvez faire là-bas.
Mais ils se résument à des codes de format,
comme nous avons là-bas.
>> Donc, en termes de cette question de préséance.
Il s'agit d'un tableau très ennuyeux de passer par méthodiquement.
Mais se rendre compte que les auteurs de C ont mis au point le
règles qui spécifient les opérateurs ont une plus grande
priorité, la puissance plus contraignant que d'autres.
Ainsi, alors que l'école primaire, nous avons généralement savais que c'était
multiplication et la division, puis addition et la soustraction,
puis quelques autres trucs.
Dans un monde de la programmation, il ya une grande
longue liste de choses.
Et ce n'est pas quelque chose d'intéressant mémoriser maintenant.
Vous s'acclimater à elle avant longtemps.
Mais tout comme à l'école primaire, entre parenthèses généralement résoudre
les questions de préséance, en faisant super clair à l'
ordinateur et humaine aussi bien ce qui est prévu.
Considérons donc ce juste une feuille de triche peu là.
Mais la plupart de ces détails que nous n'arriverons pas à un certain temps.
>> Très bien.
Maintenant, nous allons mettre en place et de s'éloigner de ces petites bête
exemples mathématiques.
Toujours utiliser les mêmes principes, mais commencer
nous exprimer un peu plus comme Scratch.
Ainsi, dans Scratch, nous avons eu ces expressions booléennes.
Et en anglais, une expression booléenne, c'est quoi?
Vrai ou faux.
C'est quelque chose qui renvoie true ou false.
1 ou 0.
Sous ou hors tension.
Tout ce que vous voulez l'appeler.
Maintenant dans Scratch, les pièces du puzzle ressemblait à ceci.
Et c'est la combinaison, sur le fond là-bas, de trois
des pièces de puzzle.
Un concert -
quelque chose qui n'a vierge et vierge.
Et puis deux expressions booléennes à l'intérieur de celui-ci.
Ainsi, vous pouvez imbriquer des expressions booléennes pour obtenir plus d'
compliqué expressions booléennes.
Par exemple, si c'est samedi, et il est agréable
temps, puis aller à l'extérieur.
Ou quelque chose d'arbitraire comme ça.
Ainsi, vous pouvez rejoindre les expressions booléennes pour arriver à un
valeur plus grande vérité, dont la réponse est basée
sur les plus petites.
>> Maintenant, en C, heureusement, cette application est
en fait assez simple.
Parenthèses aider à clarifier les choses ici.
&& C'est ce que signifie «et». C'est comme ça que
nous allons convertir ces blocs à partir de zéro à C.
Et pour les conditions que nous avons vu dans Scratch, sur la main gauche
côté là, je peux même les empiler en C. Si x est inférieur
à y, puis le faire.
Sinon, si x est supérieur à y, puis le faire.
Sinon logiquement, ils doivent être égaux, disent
qu'ils sont égaux.
Ainsi, nous pouvons maintenant commencer à construire ces choses.
>> Alors, faisons un exemple.
Permettez-moi d'ouvrir un fichier qui se trouve sur le site Web du cours qui
J'ai écrit à l'avance.
C'est ce qu'on appelle nonswitch.c.
Et nous verrons pourquoi dans un instant.
Donc, dans ce fichier - nonswitch.c--
d'abord prendre conscience qu'il ya un tas de
commentaires au début.
C'est juste expliquer le nom du fichier, ce qu'il
t, et ainsi de suite.
Et il démontre apparemment l'utilisation de booléen ET-tion -
conjoindre deux expressions.
>> Donc, nous allons voir comment fonctionne ce programme.
Je inclure mes deux fichiers, cs50.h et stdio.h.
Si je défiler vers le bas, maintenant, pour le programme, c'est un peu plus
que nous avons écrit précédemment, mais assez lisible.
J'ai donc d'abord imprimer à l'utilisateur, à la ligne 18,
«Donnez-moi un entier compris entre 1 et 10." Si
Il ya tout ici.
Maintenant, je reçois l'entier.
Mais n'oubliez pas que getInt - assez simple.
Il va juste pour obtenir un int.
Il va s'assurer qu'il ne obtenir un int et non pas un
chaîne ou un flotteur.
Mais ça ne va pas faire n'importe quel type de vérifications de limites.
Il ne va pas filtrer les numéros se situer entre un
certaine plage.
Nous devons donc mettre en place nous-mêmes.
Ainsi, tout comme dans Scratch, où je pouvais faire une conjonction de
deux expressions, je peux le faire en C comme suit.
Si n est supérieur ou égal à 1, et n est inférieur à et
ou égal à 3, je vais très arbitrairement arrêté que
nombre à un petit nombre.
Juste pour le plaisir d'une déclaration.
Sinon, si n est compris entre 4 et 6, print "Vous avez choisi un support
nombre. "Sinon, si n est compris entre 7 et 10, print" Vous avez choisi une
grand nombre. "else print" Vous choisissez un numéro non valide. "
Parce que logiquement, qui suit si nous avons
épuisé notre gamme.
>> Donc sais que ce n'est pas tout à fait la façon dont nous écrivons supérieur ou
égale à une classe de mathématiques.
Pas vrai?
En général, vous le dessiner comme ça, avec la ligne en dessous.
Mais il n'existe aucune clef sur mon clavier.
Ainsi, le symbole C pour exprimer supérieure ou
est égal à deux caractères, et le symbole de moins de
ou est égale à deux caractères de même.
Très bien.
Donc, si je lance ce programme, vous pouvez probablement le deviner ce que c'est
va faire.
Si je vais de l'avant et faire nonswitch, Entrée.
Et puis exécutez nonswitch.
Donnez-moi un chiffre entre 1 et 10.
Je vais lui donner 11.
J'ai pris un nombre non valide.
Je vais essayer le numéro 3.
J'ai choisi un petit nombre.
Donc, il ya assez simple.
>> Que faire si je veux changer le comportement de ce programme et
faire quelque chose d'un peu différent à la place?
Permettez-moi aller de l'avant et de dire ceci.
Permettez-moi de vous débarrasser de tout cela.
Et laissez-moi vous dire if (n == 42).
Et puis je vais aller de l'avant et de dire print "Vous avez choisi le
bonne réponse. "Sinon, nous allons aller de l'avant et de dire,
printf ("Vous avez choisi le
mauvaise réponse »);. Okay.
Juste parce que.
>> Maintenant, quelques points nous pouvons faire ici.
D'abord, je n'ai pas taper le symbole que vous pensez est le
plus raisonnable.
Lorsque je veux vérifier l'égalité, s'avère que vous n'utilisez pas le
signe égal.
Vous utilisez plutôt le signe égal égale.
Et pourquoi cela pourrait-il être, juste intuitivement?
Ouais.
PUBLIC: [Inaudible]
DAVID J. MALAN: C'est exact.
Le signe égal est déjà utilisé pour l'affectation.
Quelqu'un n'a pas vraiment y réfléchir.
Et maintenant, quand il s'agit de tests de l'égalité, nous devons
être plus explicite, et dire égal à égal.
Une erreur très commune est de le faire.
Et si, dans les heures de bureau ou la semaine prochaine ou parfois dans le
cours des deux prochaines semaines, vous faire quelque chose comme ça, et puis
lutter avec elle pendant 10 à 20 minutes à essayer de comprendre
ce que le bug est foutu, sachez que vous êtes un de ceux
gens qui ont fait cette erreur.
Donc, super facile à faire.
Mais l'objectif est maintenant de parer à cette erreur.
Cela pourrait évaluer, parce que ce qui est-ce vraiment dire?
Si n obtient 42.
Donc, les gens utilisent des verbes, verbalement, pour exprimer la
notion d'affectation est "reçoit". Donc, si n obtient 42.
Cela signifie donc que 42 à assigner n.
Maintenant, j'ai une expression booléenne entre parenthèses,
à l'intérieur de cette condition, la valeur de ce qui est 42.
Pas vrai?
Parce que si vous l'évaluer à partir de l'intérieur dehors, le total
réponse, maintenant, est de 42.
>> Donc, si je vous pose la question, "si (42),« ce qui est
que dit vraiment?
Eh bien, les expressions booléennes ne peut être vraie ou fausse.
1 ou 0.
Sous ou hors tension.
Donc, il semble que nous avons un cas coin ici, où tout d'un
Soudain, je dis "si (42)". Ce n'est pas une valeur booléenne.
Alors que les ordinateurs font, cependant, est qu'il confond pour l'essentiel
tout ce qui n'est pas égale à 0 est interprétée comme étant vrai.
1.
Sur.
Ils sont tous fonctionnellement équivalents.
Seule la valeur 0, ou le mot-clé faux, comme nous allons
finalement le voir, est faux.
Ainsi, «si (42)" serait en fait vrai, car il est non-nul.
Donc, pour être plus précis ici, une valeur booléenne n'est vraiment pas si
bien vraie ou fausse, mais pour ce
cas, si la valeur 0 ou différent de zéro.
Alors faux ou pas faux.
Et cela nous permet d'englober autant plus
possibilités dans l'expression entre parenthèses.
Il nous faut donc, bien que très prudemment, dis -
if (n == 42).
Tout simplement parce que nous avons besoin de spécifier un test d'égalité,
pas une affectation d'une valeur.
>> Que vaut la peine de noter ici?
Ces accolades sont en fait pas nécessaire.
Je les ai fait juste pour être tatillon ici.
Mais quand vous avez une condition qui ne dispose que d'une seule ligne de
code, par souci de commodité, les programmeurs n'ont pas besoin d'utiliser
les accolades.
Il suffit juste tiret, pour des raisons esthétiques, et
puis rédigez votre ligne de code.
Ce n'est que lorsque vous voulez écrire deux lignes de code - pour
Par exemple, else printf ("Bye!"). Si vous voulez faire
que, ce n'est rompu.
Vous pouvez mettre en retrait tout ce que vous voulez, mais le fait que vous avez
tapé deux lignes de code sans utiliser des accolades
moyen que ce programme fonctionne pas correctement ou pourrait
même pas compiler correctement.
Donc pour l'instant, pour être honnête, je pense que la meilleure habitude est simplement
utiliser les accolades, et vous verrez qu'ils font
super clair ce qui se passe.
>> Par ailleurs, en aparté - surtout si vous êtes parmi ceux qui utilisent
les livres recommandés ou des ressources en ligne -
réaliser qu'il ya cette notion de style dans
programmation.
Et certaines personnes préfèrent mettre l'accolade
ici sur une ligne.
Certaines personnes préfèrent faire des choses ridicules,
comme les mettre ici.
Il n'ya pas de mauvaise réponse quand il s'agit de
style, mais c'est faux.
Mais certaines personnes le font.
[RIRES]
DAVID J. MALAN: Je mentionne cela maintenant, simplement parce que
vous lisez sur les choses dans les livres ou sur Internet, vous allez obtenir
différents messages de différents professeurs et
différents auteurs.
Et juste réaliser que, fonctionnellement, ils sont
généralement équivalent, mais être cohérent.
Donc, dans ce cas, nous allons normaliser le bouclés
accolades queue ici sur la gauche.
>> Très bien.
Alors allons-y maintenant et exécuter cette commande, et voir ce qui se passe
avec ce programme.
Assurez-nonswitch.
Ensuite, exécutez nonswitch.
Donnez-moi un entier compris entre 0 et - ce n'est donc pas pertinente
plus, mais je vais juste dire arbitrairement 42.
Et j'ai pris la bonne réponse.
Eh bien maintenant, nous allons effectivement prendre cela dans une direction différente.
Il s'avère qu'il ya une autre syntaxe que nous
pouvez utiliser dans un programme.
Voici une nouvelle pièce de la syntaxe qui est fonctionnellement le même,
mais simplement introduit une autre façon de nous exprimer.
Donc, c'est ce qu'on appelle un "switch". Et un
instruction switch fonctionne comme suit.
Il faut, entre parenthèses, une valeur que vous souhaitez
"Switch" sur.
Vous voulez à se comporter différemment en fonction de sa valeur.
Si ce moyen de commutation sur la valeur de n.
Et qu'est-ce que cela signifie?
Eh bien, si n est 1, 2 ou 3, aller de l'avant et d'imprimer "Vous
pris un grand nombre "et puis se briser.
La raison de la rupture, c'est que la façon dont fonctionne est que C
dès qu'il trouve un cas qui correspond, il commence à exécuter
l'ensemble du code en dessous.
Donc, si j'ai une ligne de code, comme je le fais ici, à la ligne 27, il
est exécuté.
Si je ajouter une autre ligne ici, il est exécuté.
Une autre ligne ici, il est exécuté.
Le programme ne s'arrête que l'exécution de ce qui est en dessous de la
instruction case applicable lorsque j'ai explicitement
dire «casser». Si mal.
Droit, dans ce cas, à la suite.
Cas n ° 4, 5 ou 6, de même, va
d'imprimer un message.
Dans ce cas, le nombre moyen terme.
Pause.
Cas n ° 7, 8, 9, 10, ça va imprimer "Vous avez choisi un grand
nombre. "Break.
Et puis il ya littéralement un mot clé appelé "default"
C'est effectivement comme le "else" construire.
Ainsi, une nouvelle syntaxe, mais intellectuellement,
rien du tout nouveau ici.
C'est un peu comme le Scratch.
Si, d'autre si, d'autre si, sorte de bloc.
>> Donc, c'est la version de commutation de ce programme.
Mais remarquez que nous l'avons fait avec les chiffres ici.
Permettez-moi d'ouvrir une deuxième version, juste pour montrer
quelque chose d'un peu plus concret.
Nous avons donc ici les grades à la place.
Il s'avère que vous pouvez utiliser des commutateurs non seulement sur des entiers, mais
caractères.
Pas dans tous les types de données, mais au moins sur les personnages.
Donc, ici, nous pourrions faire quelque chose comme si la valeur de C qui
l'utilisateur a tapé, à la ligne 19, en utilisant la fonction GetChar,
est la capitale de A ou minuscules a, il faut bien l'interpréter comme une année,
et dire ils ont choisi une note excellente.
Et le long de l'instruction switch, avons-nous d'autres
cas de «B» et «C», et ainsi de suite.
Mais nous allons maintenant compléter une autre chose.
Et encore une fois, une sorte de volant à travers
certains de ces exemples.
Mais c'est vraiment pour que nous puissions les appliquer, maintenant -
ou bien, il suffit de les traduire maintenant -
à C.
>> Alors laissez-moi aller de l'avant et de le faire.
Je vais ouvrir un nouveau fichier.
Et je vais faire include.
Et puis je vais faire int main (void).
Permettez-moi de sauvegarder ce fichier en tant que loop.c.
À titre d'exemple.
Et je vais aller de l'avant et faire ce qui suit.
Je veux écrire un programme très fastidieux.
Donc, 10.
Faisons-le.
9.
Très bien.
Dès que vous commencez à faire cela dans la programmation, vous êtes
probablement fait quelque chose de mal.
Mais nous allons commencer par là de toute façon.
Oops.
En fait, c'est faux.
7.
6.
5.
4.
Rien ne va se passer quand on arrive à 0.
3.
2.
1.
D'accord.
0.
Supprimer.
>> Très bien.
Donc, retour à 0.
Ainsi, ce programme va évidemment de faire ce qu'il est très
dit péniblement que ça va le faire.
Il va imprimer tous ceux
valeurs, de haut en bas.
Permettez-moi de faire faire des boucles.
Et puis - oups.
Assurez-boucle.
J'étais dans le mauvais répertoire.
Et maintenant, permettez-moi de fonctionner en boucle.
Entrée.
Woohoo.
Très agréable.
Nice, programme long.
>> D'accord, mais maintenant nous allons faire mieux.
Tout comme dans Scratch, quand vous avez commencé à l'aide d'une boucle
construire, au lieu de simplement copier et coller l'ensemble de la
pièces de puzzle, laissez-moi vous présenter cette chose.
Donc, en C, il existe diverses structures de boucle,
dont l'un ressemble à ceci.
Une boucle "for" a trois choses, séparés par deux points-virgules.
Et puis, à l'intérieur du corps de la boucle, pour ainsi dire - l'
l'intérieur des trucs des accolades -
nous pouvons faire quelque chose encore et encore.
Donc ce que j'ai ici sur l'écran, c'est
littéralement juste un commentaire.
Le / / signifie ici est un commentaire.
Ce n'est pas un code.
C'est juste description en anglais, pour moi, l'être humain.
>> Initialisations Donc, les conditions et les mises à jour.
Eh bien, nous allons voir comment cela fonctionne.
Cela me permet de réécrire ce programme comme suit.
Pour -
donc voici ma boucle -
int i -
voici une variable appelée "i" -
est initialisé à 10.
Donc, il est de mon initialisation.
Je veux faire cette boucle tant que "i" est supérieur ou
égal à 0.
Et à chaque itération de cette boucle, je veux
pour i do -.
Nous avons donc vu + + le lundi.
- Est à l'opposé.
Il décrémente la valeur de 1.
A l'intérieur de cette boucle, je veux vraiment faire quelque chose.
Donc je vais dire quelque chose comme printf.
Je ne veux pas dire 10 maintenant, parce que c'est évidemment tout
aller à la même valeur.
Qu'est-ce que je veux imprimer à la place, sans doute?
Ouais.
Donc, «i». D% Donc, i.
>> Donc, je vais voler une de ces idées à partir plus tôt -
cette substitution pour les codes de format -
et puis ici-bas, au fond, je vais retourner 0, tout
pour faire bonne mesure.
Mais maintenant, j'ai un programme plus concis.
Ce n'est que quelques lignes, et non pas il ya 10 ou 11 lignes.
Permettez-moi aller à mon invite ici-bas.
Remake boucle.
Exécutez à nouveau la boucle.
Et il semble être le même.
Maintenant, le programme n'est pas plus intéressant.
Mais maintenant, je peux taper quelque chose comme ça.
Je peux changer ce paramètre sur 100.
Je peux ensuite recompiler mon programme.
Et puis je peux ré-exécuter mon programme.
Et maintenant, il va super vite sur les ordinateurs d'aujourd'hui.
Mais là, j'ai -
et en fait, mon tampon de la ne
même aller aussi loin.
Nous y voilà.
Ainsi, nous l'avons tous 100.
Mais il est facile de faire des erreurs ici.
Quel va être le comportement attendu si je
accidentellement le faire?
Alors il se sent comme infinie.
Donc, nous allons voir si l'ordinateur se comporte.
>> Alors laissez-moi aller de l'avant et de faire la boucle.
Et permettez-moi de fonctionner en boucle.
Donc, revenons à ce que dans un instant.
Nous allons laisser cette manche.
Parce que faut-il compter jusqu'à, au minimum?
Probablement au moins 2 milliards de dollars, si nous avons que le nombre de bits, et
nous utilisons des valeurs positives.
Donc, nous allons revenir ici.
En plus de ces types de boucles, nous avons ce qu'on appelle alors
boucles. Ainsi, tout comme dans Scratch, vous aviez toujours
blocs, et vous avez eu des blocs de répétition.
De même, en C, il suffit de d'autres façons
de vous exprimer.
Vous avez donc cette notion d'une boucle while qui vous permet de
exprimez-vous un peu différemment.
Et puis vous avez quelque chose qui s'appelle une boucle do-while,
qui fonctionne un peu différemment.
Et nous allons taquiner les différencier au fil du temps.
>> Mais nous allons jeter un oeil à ce dernier ici.
Si nous allons dans -
toujours en cours.
Il est assez infinie.
Alors laissez-moi aller en positif, et de montrer comment nous pouvons effectivement
régissent entrée de l'utilisateur un peu plus efficacement.
C'est un programme assez court.
Et nous avons ici, en principal, un int n déclaration.
Alors, donnez-moi une variable appelée n. Maintenant, je me suis littéralement dire
«Faire». Et puis j'ai ouvert bouclés
accolade, accolade proche.
Et puis, remarquez, juste après cela, elle dit tout n
est inférieur à 1.
Donc noter que ces lignes -
19 à 24 -
composer collectivement une boucle do-while.
Et encore une fois, une nouvelle syntaxe, pas une idée nouvelle.
C'est juste une autre façon de boucle, syntaxiquement.
Alors qu'est-ce que cela fait?
Procédez comme suit tandis que n est inférieur à 1.
Alors qu'est-ce que je veux faire?
J'exige que vous me donnez un entier positif.
Ensuite, j'ai fait essayer d'obtenir un nombre entier de l'utilisateur.
Mais en termes de l'ordre des opérations ici, parce que le
tant que la condition est ici-bas, je suis ensuite aller vérifier, est n
moins de 1?
Donc, supposons que l'utilisateur -
après avoir exigé de cette façon -
types de la valeur 0.
Cette condition sera vraie ou fausse?
Eh bien, il va vraiment être vrai.
Parce que n est 0, et 0 est inférieur à 1.
Alors qu'est-ce que cela implique?
Le faire de nouveau.
Ce n'est qu'une fois cette condition est évaluée à false.
Si je tape dans 42.
Bien non, 42 n'est pas inférieur à 1.
Par conséquent, cette boucle est faite d'exécution.
Et donc à ce stade, le programme va dire, merci pour
le 42, dans ce cas.
Maintenant que vous avez cette façon de s'exprimer -
Nous ne devrions pas attendre que cela se termine.
Ça va prendre un certain temps.
A suivre la prochaine fois, peut-être.
>> Mais maintenant, vous avez la possibilité de nous l'espérons pour comprendre un
peu d'humour geek.
Toutes mes excuses.
Ce n'est pas représentatif de l'humour dans l'informatique
monde, mais il est mignon.
[RIRES] Faisons fin sur cette note.
Et nous allons vous voir lundi.
[Applaudissements]