>> [Jouer de la musique]
>> DAVID J Malan: Très bien, bienvenue à CS50.
C'est le début de la deuxième semaine.
Un mot d'un de nos amis sur le campus -
Si vous êtes intéressé, peut-être, que ce soit maintenant ou dans un avenir à long terme
même, une fois de plus confortable, de l'enseignement les élèves de collège un peu
quelque chose à propos de l'informatique, faire tête à cette URL.
Ils sont dans le besoin particulier en ce moment de enseignants, surtout si vous avez
eu une certaine exposition à l'informatique.
>> Donc, rappelons que la dernière fois, nous avons introduit quelques types de données en C, et
vous avez peut-être commencé à obtenir votre mains sales avec ces jusqu'ici
dans un problème posé.
Et nous avons eu un chevalier.
Donc, en termes un peu techniques, ce qui est un char comme vous le savez aujourd'hui?
>> Donc, c'est un personnage, mais nous allons être plus précis maintenant.
Qu'entendons-nous par caractère ou personne Char?
Un caractère non numérique -
donc pas nécessairement.
Il s'avère que les nombres pairs, même la ponctuation et les lettres sont
représentée avec ces données type connu comme un chevalier.
Donc ce n'est pas nécessairement alphabétique.
Ouais?
>> C'est donc un caractère ASCII.
Donc, si vous repensez à la semaine zéro, lorsque nous avons eu notre octet de bénévoles
venir et soit tenir leurs mains ou pas tout, ils représentaient bits.
Mais collectivement comme un groupe de huit, ils représentaient un octet.
Et nous avons introduit la notion de ASCII à cette conférence, qui est tout simplement un
cartographie entre chiffres et lettres.
Et utilise ASCII, comme ces humains implicites, huit bits
pour représenter un caractère.
>> Donc, en conséquence, s'il huit bits peuvent chaque prise sur une des deux valeurs -
zéro ou un -
cela veut dire qu'il y avait deux possibilités pour cette personne -
zéro ou un -
deux pour cette personne, deux pour cette personne, deux pour celui-ci.
Ainsi, un total de deux fois deux fois deux fois deux fois deux -
si deux le huitième au total.
Il ya donc un nombre total de caractères 256 possibles que vous pouvez
représenter avec huit bits.
>> Maintenant, ceux d'entre vous qui parlent asiatique langues pourraient savoir qu'il ya plus
personnages dans le monde que juste Au fur et B et Cs et Ds.
Et en effet, ASCII ne suffit pas pour beaucoup de langues du monde.
Mais plus à ce sujet une autre fois.
Pour l'instant, sachez que dans C si vous voulez pour représenter une lettre, un morceau de
ponctuation, ou tout simplement quelque chose de caractère dans la nature, nous utilisons un chevalier.
Et c'est un octet ou huit bits.
>> Que diriez-vous d'un int?
Eh bien, un int est un entier.
Combien de bits, si vous vous souvenez, est un nombre entier généralement?
rappel de quelqu'un?
Donc, c'est généralement 32.
Cela dépend en fait sur l'ordinateur que vous utilisez.
Mais dans l'appareil, et dans beaucoup de ordinateurs, il est 32 bits ou quatre
octets - huit fois quatre.
Et ints sont juste utilisés pour le stockage numéros, soit négatives,
positif, ou nul.
>> Et si vous avez 32 bits et vous ne soucient de nombres positifs, peut
quelqu'un stade combien possible entiers d'un ordinateur peut représenter de
zéro sur place?
Donc, il serait deux à la 32, qui est environ quatre milliards de dollars.
Ainsi, ces puissances de deux vont être des thèmes récurrents dans l'informatique.
Comme nous le verrons, ils sont tout à fait commode de travailler avec, même si ce n'est pas assez
facile de faire le calcul dans sa tête.
>> Donc, nous allons dire environ quatre milliards de dollars.
Maintenant, un long long -
vous pouvez genre de supposition.
C'est plus qu'un int.
Combien de bits?
Donc, 64 bits ou huit octets.
Cela signifie simplement que vous pouvez représenter même des chiffres plus élevés, plus positive ou
nombres négatifs plus importants.
>> Et que diriez-vous flotter?
C'est un point flottant la valeur de 32 bits.
Ceci est juste un nombre réel, quelque chose avec un point décimal.
Mais si vous avez besoin de plus d'endroits à la place après la virgule ou si vous voulez
représenter un plus grand nombre avec une certaine fraction après, vous pouvez utiliser un
double, qui est de 64 bits.
>> Mais il ya un intéressant emporter ici.
Donc, si ints sont limitées par 32 bits et même de longs longs sont limitées par 64
morceaux, ce genre de se poser la question, Que faire si vous voulez vraiment compter
supérieur à 4 milliards d'euros pour un int?
Eh bien, il suffit d'utiliser un long long.
Mais que faire si vous voulez compter supérieur de deux à la 64e, donner ou prendre?
>> Maintenant, c'est un chiffre énorme.
Mais finalement, vous pourriez effectivement préoccuper de ce genre de valeurs,
surtout si vous utilisez une base de données et de commencer à recueillir des tas
et beaucoup de données et d'attribuer uniques numéros à chaque morceau de ces données.
Donc, nous sorte de avons un problème.
Et de même, avec virgule flottante valeurs - flotteurs ou doubles -
si vous avez seulement un nombre fini de morceaux, combien le nombre total pourrait vous
éventuellement représenter?
>> Eh bien, c'est moins clair lorsque vous impliquer une virgule.
Mais c'est sûrement fini.
Si vous avez un nombre fini de bits, un nombre fini de l'homme, un fini
nombre d'ampoules, vous pouvez sûrement ne représentent qu'un nombre fini de
valeurs à virgule flottante.
Mais combien de nombres réels sont leurs dans le monde?
Il ya un infini.
C'est donc ce genre de problème parce que nous n'ont pas une quantité infinie d'
mémoire RAM ou à l'intérieur de nos ordinateurs.
Donc certaines choses difficiles peuvent se produire.
>> Allons donc de l'avant et essayer d'exprimer cela ici.
Permettez-moi d'aller de l'avant et d'ouvrir gedit.
Je vais aller de l'avant et enregistrer un fichier appelé «floats0.c" juste pour être
compatible avec un exemple qui est disponible en ligne, si vous le souhaitez.
Et je vais aller de l'avant et définir comme suit: -
Je vais aller de l'avant et de dire, int void main, comme nous le faisons souvent.
>> Et puis, dans ce programme, je vais me déclare un flotteur, donc un 32-bit
variable appelée f, arbitrairement.
Et puis je vais y entreposer Je ne sais pas, un dixième, donc 0,1.
Je vais donc exprimer que comme un divisé par 10, ce qui est parfaitement
légitime C.
>> Et puis sur la deuxième ligne, j'ai simplement souhaitez imprimer cette valeur.
Donc, rappelons que nous pouvons utiliser le familier printf.
Nous ne voulons pas utiliser% i pour un int.
Nous voulons utiliser% f pour un flotteur.
Et puis je vais faire backslash n, Fermer citation, virgule, f, point-virgule.
>> Alors, voici mon programme.
Il ya déjà un bug.
Est-ce que quelqu'un pour qui cette cliqué veulent déjà faire remarquer au moins
un bug que j'ai fait?
Ouais?
Ouais.
J'ai oublié "# include" à l' haut, ils symptôme dont si j'essaie de
compiler cela va être que le compilateur va me crier dessus,
disant symbole indéfini ou quelque chose à cet effet.
Il ne comprend pas quelque chose printf.
>> Donc, je vais faire "# include ", Enregistrez le fichier.
Et maintenant il est en meilleure forme.
Mais je vais aussi faire remarquer sur un nouveau détail aujourd'hui.
En plus de spécifier lieu titulaires comme% f% i% s, vous pouvez
influencer le comportement parfois de cet espace réservé.
Par exemple, dans le cas d'un flottant valeur du point, si je ne veux
pour afficher une décimale après la période, je peux réellement faire 0.1f.
Donc, en d'autres termes, je me sépare de la f et le signe pour cent à 0,1, juste
printf dire, vous pourriez avoir un ensemble tas de chiffres après la virgule
signaler pour moi.
Mais je ne veux voir l'un d'eux.
>> Donc, je vais aller de l'avant maintenant et économisez ce programme, allez dans mon terminal
fenêtre, et je vais aller de l'avant et tapez make flotteur 0, entrez.
Je vois que la ligne quelque peu énigmatique que va commencer à faire plus de sens que nous
taquiner à part cette semaine et la suivante.
Maintenant, je vais aller de l'avant et exécuter zéro du flotteur.
Et, bon sang.
>> Donc, il ya un autre bug ici pour une raison.
Je suis sûr que d'un dixième, ou un divisé par 10, n'est pas 0.0.
Peut-être que je ne suis pas à la recherche à suffisamment de chiffres.
Alors pourquoi je ne dis pas deux .2 de voir deux décimales au lieu d'un seul.
Permettez-moi de revenir à ma fenêtre de terminal ici et a frappé une couple de fois pour
voir mon histoire.
Ne faire flotter à nouveau à zéro, puis à nouveau.
Et maintenant entrer.
>> Et maintenant, je suis sûr que c'est faux.
Et je pouvais faire trois et quatre, et je suis va probablement continuer à voir des zéros.
Alors, où est le bug?
Une divisé par 10 devrait être de 0,1.
Quelqu'un veut prendre un coup de couteau à ce la question fondamentale est?
Ouais?
Ils sont tous deux des entiers.
Alors quoi?
Donc, avec un divisé par 10, c'est ce que je fais en arithmétique.
Et je reçois 0.1.
>> Ouais.
Et c'est bien cette question.
Lorsque vous prenez un entier dans un ordinateur et vous le divisez par un autre entier,
l'ordinateur par défaut va supposons que vous souhaitiez un entier.
Le problème cependant, bien sûr, est 0.1 qui n'est pas un nombre entier.
Il s'agit d'un nombre réel.
Et donc ce que l'ordinateur fait par défaut est qu'il se contente de jeter
tout après la virgule.
Il n'a pas arrondir vers le bas ou vers le haut en soi.
Il se contente de jeter tout après la virgule.
Et maintenant que fait sens.
Parce que maintenant, nous sommes clairement laissé à zéro.
>> Mais attendez une minute.
Je ne vois pas un zéro int.
Je suis en train de voir 0.00.
Alors, comment puis-je concilier cela maintenant?
Si l'on divise par 10 est égal à zéro, mais je suis voir 0.00, où est-il obtenir
reconverti en un nombre réel?
Ouais.
Exactement.
>> Donc, ici, dans la ligne de cinq ans, quand j'ai fait magasin qui 0.1, qui est ensuite
tronqué à zéro, à l'intérieur d'un flotteur, c'est effectivement l'équivalent de
stockant pas comme un int mais, en effet, comme un flotteur.
Par ailleurs, je puis en utilisant printf imprimer explicitement ce nombre à deux
décimales même si peut-être pas vraiment une.
>> Donc, ce genre de suce, non?
Apparemment, vous ne pouvez pas faire des maths, au moins à ce niveau de
précision, dans un ordinateur.
Mais il ya sûrement une solution.
Quelle est la solution la plus simple que nous pourrions peut-être faire, même intuitivement juste ici pour
résoudre ce problème?
Ouais?
Tournez les entiers en -
ouais.
Même si je ne suis pas tout à fait sûr de ce que c'est se passe réellement ici, si elle
a fondamentalement à voir avec ces deux étant ints, eh bien, pourquoi ne pas
faire que 10.0, ce qui en fait 1.0 réenregistrer le fichier.
Permettez-moi de revenir vers le bas et recompiler.
Permettez-moi maintenant RERUN.
Et là -
maintenant, j'ai mon dixième comme représenté 0,10.
>> Très bien.
Donc, ce n'est pas mauvais.
Et permettez-moi de souligner une autre façon nous aurions pu résoudre cela.
Permettez-moi de réellement roule dans le temps au moment où nous avons eu ce que l'un
il ya un dixième moment.
Et permettez-moi d'aller de l'avant et de réenregistrer ce fichier comme un nom de fichier différent, il suffit d'
avoir un peu de contrôle.
C'était donc la version ci.
Et maintenant, laissez-moi aller de l'avant et faire une version plus.
Nous appelons cette version deux zéro indexées.
>> Et je vais faire à la place cela - vous savez quoi?
Ajout de point zéro fonctionne dans ce cas.
Mais si l'on devait une variable.
Censé 10 étaient une variable.
En d'autres termes, supposons que je ne pouvais pas juste coder en dur .0 à la fin
de cette expression arithmétique.
Eh bien, je peux faire quelque chose entre parenthèses appelé prépondérante.
Je peux lancer ce nombre entier de 10 à un flotteur, et je peux lancer cet entier un à un
flotter, aussi bien.
Ensuite, le calcul qui va être fait effectivement 1,0 divisé par 10,0,
le résultat de ce qui va en f comme avant.
Donc, si je recompile ce que la fabrication de flotteurs 2, et flotte maintenant 2, j'obtiens la même
répondre ainsi.
>> Donc, c'est un exemple assez artificiel, pour résoudre ce problème
par l'introduction de la coulée.
Mais en général, casting va être une chose puissante, en particulier pour
problème réglé deux dans le temps d'une semaine, lorsque vous voulez convertir un type de données à
autre que à la fin de la journée sont représentés de la même manière.
A la fin de la journée, chaque chose dont nous avons parlé jusqu'ici est
ints seulement sous la hotte.
Ou si c'est trop bas niveau pour vous, ils sont juste des nombres
sous la hotte.
Même les personnages, encore une fois, rappellent à partir de la semaine zéro, sont des nombres
sous la hotte.
>> C'est-à-dire, nous pouvons convertir entre différents types de nombres si
ils sont juste bits.
Nous pouvons convertir entre les numéros et des lettres si elles sont tout simplement
bits, et vice versa.
Et casting de cette façon est un mécanisme dans la programmation qui vous permet de force
modifier un type de données à l'autre.
Malheureusement, ce n'est pas aussi simple que j'aurais aimé.
>> Je vais retourner dans flotteurs 1, ce qui était le plus simple, plus
simple avec une 0,0 ajoutée à chacun.
Et tout comme une remise à niveau rapide, laissez-moi aller de l'avant et de recompiler
cela, assurez-flotteurs 2 -
désolé, c'est fabriquer des flotteurs 1.
Et maintenant nous allons courir flotteurs 1.
Et dans le fond, notez que je reçois en effet 0.1.
Donc, le problème est résolu.
>> Mais pas encore.
Je vais maintenant avoir un peu curieux, et je vais retourner dans mon
printf et Dites, vous savez quoi?
Je tiens à confirmer que cette C'est vraiment un dixième.
Et je vais vouloir voir cette à, disons, cinq décimales.
Ce n'est pas un problème.
J'ai changer les deux à cinq, Je recompiler avec faire.
Je le relancer en tant que flotte 1.
Vous cherchez plutôt bien.
Mes vérifications de cohérence pourrait s'arrêter là, mais Je suis un peu plus aventureux.
Je vais changer de 0,5 à 0,10.
Je veux voir 10 chiffres après la décimale.
>> Et je vais aller de l'avant et de recompiler cette flotte et relancez 1.
J'ai un peu de regret après avoir testé ce plus loin parce que mes calculs sont pas
corriger plus, il semble.
Mais attendez une minute, peut-être c'est juste un coup de chance.
Peut-être que l'ordinateur agit un peu étrange.
Permettez-moi d'aller de l'avant et faire 20 points décimaux et me rassurer que je sais
comment faire des mathématiques.
Je sais comment programmer.
Faire flotteurs 1, recompiler, et bon sang.
C'est vraiment, vraiment obtenir loin de la marque.
>> Alors qu'est-ce qui se passe ici?
Intuitivement, fondée sur nos hypothèses plus tôt au sujet de la taille des types de données,
ce qui doit se passer ici sous le capot?
Ouais?
Exactement.
Si vous voulez autant de précision et c'est un diable de beaucoup de précision -
20 chiffres après la virgule.
Vous ne pouvez pas représenter une nombre arbitraire sauf si vous avez un
nombre quelconque de bits.
Mais nous ne le faisons pas.
Pour un flotteur, nous ne disposons que de 32 bits.
>> Donc, si 32 bits ne peut être permutées dans un manière - tout comme nos hommes sur, étape
mains haut ou le bas - en un nombre fini d' façons, il n'y a qu'un nombre fini
des nombres réels que vous pouvez représenter avec ces bits.
Et si l'ordinateur finalement va avoir à
commencer à couper les coins.
L'ordinateur peut cacher ces détails chez nous pour un peu de temps.
Mais si nous commençons à piquer les numéros et en regardant plus en plus loin à l'
numéros de fuite dans le nombre entier, puis nous commençons à voir que c'est
l'approximation de la réalité idée d'un dixième.
>> Et il s'avère que, tragiquement, il ya un nombre infini de nombres
nous ne pouvons pas représenter précisément dans un l'ordinateur, au moins avec un fini
nombre de bits, un ensemble fini quantité de RAM.
Maintenant, malheureusement, parfois a des conséquences dans le monde réel.
Si les gens ne se rendent pas tout à fait ce ou sorte de prendre pour acquis le fait
que leur ordinateur va juste faire ce que ils disent qu'il faut faire et ne pas faire
comprendre ces sous-jacente détails de représentation -
qui, franchement, dans certaines langues sont cachées à l'utilisateur, contrairement au C -
quelques mauvaises choses peuvent arriver.
>> Et ce que je pensais que nous ferions est de prendre un peu de recul.
Et c'est sur un vidéo de huit minutes.
Il a été diffusé il ya quelques années, et il donne aperçu réellement ce qui peut aller
mal lorsque vous sous-apprécier ces sortes de détails dans la très bien trop
monde réel.
Si nous pouvions éteindre les lumières pendant quelques minutes.
>> INTERLOCUTEUR 1: Nous revenons maintenant à l'ingénierie
catastrophes sur Modern Marvels.
>> Informatique -
nous avons tous appris à accepter l' problèmes souvent frustrantes
qui vont avec.
Bugs, des virus et des pépins logiciels sont de petits prix à payer pour la
commodité.
Mais dans la haute technologie et à haute vitesse militaire et programme spatial
applications, le plus petit problème peut être agrandie en cas de catastrophe.
>> Le 4 Juin 1996, des scientifiques prêts à lancer une fusée sans pilote Ariane 5.
Il transportait satellites scientifiques conçu pour établir précisément comment
le champ magnétique de la Terre interagit avec des vents solaires.
La fusée a été construit pour l'Union européenne Agence spatiale et décollé de son
installation sur la côte de la Guyane française.
>> JACK Ganssle: à environ 37 secondes dans le vol, ils ont d'abord remarqué
quelque chose n'allait pas.
Les buses sont pivotantes en d'une manière qu'ils devraient vraiment pas.
Environ 40 secondes après le vol, clairement le véhicule était en difficulté.
Et c'est quand ils ont fait une décision de la détruire.
L'agent de sécurité de la gamme, avec courage énormes, appuyé sur la touche
fait exploser la fusée avant de pouvoir devenir un danger pour la sécurité publique.
>> INTERLOCUTEUR 1: Ce fut le voyage inaugural d'Ariane 5, et sa destruction
a eu lieu en raison d'un défaut intégré dans le logiciel de la fusée.
>> JACK Ganssle: Le problème de l'Ariane c'est qu'il y avait un certain nombre
qui a exigé 64 bits à exprimer.
Et ils voulaient convertir pour un nombre de 16 bits.
Ils ont supposé que le nombre n'a jamais été va être très important, que la plupart des
ces chiffres dans le 64 bits nombre sont des zéros.
Ils avaient tort.
>> INTERLOCUTEUR 1: L'incapacité d'un logiciel programme pour accepter le type de
nombre généré par un autre était à l'origine de la défaillance.
Le développement de logiciels est devenu un très partie coûteuse des nouvelles technologies.
La fusée Ariane 4 avait été très succès, tant du logiciel
créé car il était aussi utilisé dans le lanceur Ariane 5.
>> PHILIP COYLE: Le problème de base était que l'Ariane 5 a été plus rapide,
accélérée plus rapidement.
Et le logiciel n'avait pas comptabilisées pour cela.
>> INTERLOCUTEUR 1: La destruction de la fusée a été un énorme désastre financier,
tout en raison d'une erreur de logiciel minutes.
Mais ce n'était pas la première fois des données problèmes de conversion avaient souffert moderne
la technologie des fusées.
>> JACK Ganssle: En 1991, avec le début de la première guerre du Golfe, le Patriot
missile a connu une sorte similaire d'un problème de conversion de nombres.
En conséquence, 28 soldats américains ont été tuées et environ 100 autres blessés
lorsque le Patriot, qui devait pour se protéger contre les Scud entrants,
pas réussi à tirer un missile.
>> INTERLOCUTEUR 1: Quand l'Irak a envahi le Koweït et Amérique lancé Desert Storm en
Début 1991, les batteries de missiles Patriot ont été déployés pour protéger l'Arabie saoudite
et en Israël du Scud irakien attaques de missiles.
Le Patriot est un américain à moyenne portée système sol-air fabriqué par
la société Raytheon.
>> THEODORE Postol: La taille du Patriot intercepteur lui-même est à peu près
20 pieds de long.
Et il pèse environ 2000 livres.
Et il porte une ogive d'environ -
Je pense que c'est environ 150 livres.
Et l'ogive est en soi un explosif puissant qui a
fragments autour d'elle.
L'enveloppe de la tête militaire est conçue d'agir comme chevrotine.
>> INTERLOCUTEUR 1: Les missiles sont réalisées quatre par conteneur et sont transportés
par un semi-remorque.
>> PHILIP COYLE: The Patriot anti-missile système revient à
les moins de 20 ans.
Il a été initialement conçu comme une défense antimissile air
abattre des avions ennemis.
Dans la première guerre du Golfe, lorsque que la guerre est venu, l'armée voulait l'utiliser
pour abattre des missiles Scud, pas des avions.
L'armée de l'air irakienne n'était pas tant d'un problème.
Mais l'armée était inquiet de Scud.
Et alors ils ont essayé de mettre à niveau le Patriot.
>> ENCEINTE 1: Intercepter un missile ennemi voyager à mach cinq était
va être assez difficile.
Mais quand le Patriot a été précipité dans publique, l'armée n'était pas au courant d'une
Modification irakien qui a fait leur Scud presque impossible à atteindre.
>> THEODORE Postol: Qu'est-il arrivé est le Scud qui étaient
venir en étaient instables.
Ils ont été vacillant.
La raison en était que les Irakiens, en Afin d'obtenir 600 km sur un
Missile de 300 kilomètres de portée, a pris poids de l'ogive avant.
Ils ont fait l'ogive léger.
Alors maintenant, le Patriot essaie à venir à la Scud.
Et la plupart du temps, l'écrasante plupart du temps, il serait tout simplement
voler par le Scud.
>> INTERLOCUTEUR 1: Une fois que le système Patriot les opérateurs ont réalisé le Patriot raté
sa cible, ils exploser les Patriots ogive pour éviter tout risque
victimes si elle a été autorisée à tomber sur le sol.
>> THEODORE Postol: C'est ce que la plupart les gens ont vu que de grandes boules de feu dans le ciel
et incompris comme intercepte d'ogives Scud.
>> INTERLOCUTEUR 1: Bien que dans le ciel __gVirt_NP_NN_NNPS<__ nuit Patriots semblaient être avec succès
détruire les Scud, à Dhahran il pourrait se méprenne pas sur sa
rendement.
Là, le système radar du Patriot perdu suivi d'un Scud entrant et jamais
lancé en raison d'un défaut de logiciel.
>> C'était les Israéliens qui découvrit le premier que plus le système
était sur, plus la différence de temps est devenue due à une horloge
intégré dans l'ordinateur du système.
>> JACK Ganssle: Environ deux semaines avant la tragédie à Dhahran, les Israéliens
rapporté au ministère de la Défense que le système était en train de perdre du temps.
Après environ huit heures de course, ils ont remarqué que le système est
devenir nettement moins précis.
Le ministère de la Défense a répondu par dire toutes les batteries de Patriot
de ne pas laisser les systèmes pendant une longue période.
Ils n'ont jamais dit ce qui fut longtemps.
Huit heures?
10 heures?
1000 heures?
Personne ne savait.
>> INTERLOCUTEUR 1: La batterie de Patriot stationnés à la caserne à Dhahran
et son horloge interne défectueuse avait été sur plus de 100 heures dans la nuit du
25 février.
>> JACK Ganssle: Il suivies temps à une précision de l'ordre d'un dixième de seconde.
Maintenant, un dixième de seconde est une nombre intéressant car il ne peut pas être
exprimé en binaire exactement, ce qui signifie il ne peut pas être exprimée exactement dans
n'importe quel ordinateur numérique moderne.
C'est difficile à croire, mais l'utiliser comme un exemple.
Prenons le numéro un tiers.
Un tiers ne peut pas être exprimée en décimal exactement.
Un tiers est 0,333 va sur l'infini.
Il n'ya aucun moyen de le faire avec précision absolue en décimal.
C'est exactement le même genre de problème ce qui s'est passé dans le Patriot.
Plus le système a fonctionné, l' pire l'erreur de temps est devenu.
>> INTERLOCUTEUR 1: Après 100 heures de fonctionnement, l'erreur dans le temps était seulement
environ un tiers de seconde.
Mais en termes de ciblage d'un missile voyager à mach cinq ans, il a donné lieu à
un tracking error de plus de 600 mètres.
Ce serait une erreur fatale pour les soldats à Dhahran.
>> THEODORE Postol: Ce qui s'est passé est une Scud lancement a été détecté au début
Les satellites d'alerte.
Et ils savaient que le Scud venait dans leur direction générale.
Ils ne savaient pas d'où ça venait.
>> INTERLOCUTEUR 1: Il appartient maintenant au radar composant du système Patriot
défendre Dhahran pour localiser et conserver suivi du missile ennemi entrant.
>> JACK Ganssle: Le radar était très intelligent.
Il serait effectivement suivre la position de le Scud, puis de prédire où il
serait probablement la prochaine fois le radar envoie une impulsion sur.
Qui a été appelé la porte de la gamme.
>> THEODORE Postol: Puis, une fois le Patriot décide de suffisamment de temps s'est écoulé pour aller
sauvegarder et vérifier l'emplacement suivant pour cet objet détecté, il remonte.
Alors, quand il est retourné à la mauvaise place, il voit alors pas d'objet.
Et il décide qu'il n'y a pas un objet, c'était une fausse détection, et
gouttes de la piste.
>> INTERLOCUTEUR 1: Le Scud entrant disparu à partir de l'écran radar, et
secondes plus tard, il a claqué dans les casernes.
Le Scud a tué 28 et était le dernier tiré lors de la première guerre du Golfe.
Tragiquement, le logiciel mis à jour est arrivé à Dhahran le lendemain.
La faille du logiciel avait été fixé, la fermeture d'un chapitre dans le trouble
histoire du missile Patriot.
>> Patriot est en fait un acronyme pour progressive de suivi Array
Intercepter la cible.
>> DAVID J Malan: D'accord, donc une exemple donne à réfléchir, pour être sûr.
Et heureusement, ces niveau inférieur les bugs ne sont pas quelque chose que nous allons
ont généralement pour apprécier, certainement pas avec certains de nos
plus tôt des programmes.
Au contraire, la plupart des bugs que vous aurez rencontre sera logique dans la nature,
syntaxique dans laquelle la nature Code ne fonctionne tout simplement pas juste.
Et vous le savez assez rapide.
>> Mais surtout quand on arrive à la fin du semestre, il va
devenir de plus en plus de la possibilité d' réfléchir sérieusement sur la conception
de vos programmes et le sous-jacents représentation
là aussi, des données.
Par exemple, nous allons présenter MySQL, qui est un moteur de base de données populaire
que vous pouvez utiliser avec les sites Web de stocker les données sur l'extrémité arrière.
Et vous devrez commencer à décider à la fin du semestre, non seulement ce
types de données le long de ces lignes à utiliser mais exactement combien de bits à utiliser,
si oui ou non vous voulez stocker des dates que les dates et heures que les temps, et aussi
des choses comme la taille que vous voulez le ID unique de faire pour, par exemple, les utilisateurs
dans votre base de données.
>> En fait, si certains d'entre vous ont eu Facebook représente un certain temps,
et vous savez comment obtenir l'accès à votre ID utilisateur -
ce qui montre parfois dans votre l'URL du profil, sauf si vous avez choisi une
surnom de l'URL, ou si vous avez Graph API utilisé Facebook, l'
API disposition du public par lequel vous peut demander à Facebook de données brutes -
vous pouvez voir ce que votre ID numérique est.
Et il ya quelques années, essentiellement Facebook dû changer d'utiliser
l'équivalent de ints à l'utilisation à long longtemps, car au fil du temps que les utilisateurs viennent
et va créer beaucoup de comptes et faux comptes, même ils très facilement
étaient en mesure d'épuiser quelque chose comme un 4 milliards de valeur possible comme un int.
>> Donc plus sur ce genre de questions sur la route, aussi bien.
D'accord, donc ça a été prépondérante.
C'était imprécision.
Un couple d'annonces rapides.
Alors sections commencent officiellement prochain Dimanche, lundi, mardi.
Vous entendrez par email plus tard cette semaine quant à l'affectation de la section.
Et vous aurez également ici à ce moment-là comment changer votre section si votre
calendrier a changé ou votre niveau de confort a maintenant changé.
Pendant ce temps P-set et un pirate celui-ci sont en raison de ce jeudi avec la possibilité d'
prolonger ce délai par le spécifications au vendredi
d'une manière classique.
>> Sachez que comprenait le problème cahier des charges fixes sont des instructions sur la
comment utiliser l'appareil CS50, faites, ainsi que des outils spécifiques CS50
comme style des années 50, qui peut vous fournir avec les informations de manière dynamique sur l'
qualité de votre style de code et aussi vérifier 50, qui peut vous fournir avec
rétroaction dynamique à votre L'exactitude de code.
Pardonnons à ceux qui nous travaillons encore sur quelques petits défauts avec chèque de 50.
Quelques-uns de vos camarades de classe qui ne commencent autour de quatre heures le vendredi soir quand
le spec monta ont remarqué depuis lors quelques bugs qui nous travaillons
à travers, et des excuses pour n'importe qui a connu des frustrations inutiles.
La faute en est à moi.
Mais nous suivrons sur le CS50 discuter quand ce n'est pas résolue.
>> Ainsi, un mot sur les résultats eux-mêmes.
Donc, ça va être une semaine ou deux avant de vous commencer à obtenir des commentaires sur ensembles de problèmes
parce que vous n'avez pas encore un adjoint à l'enseignement.
Et même alors, nous allons commencer à évaluer le problème C met devant nous
revenir en arrière et évaluer zéro si que vous obtenez plus pertinents
informations plus rapidement.
Mais, en général par le syllabus, CS50 ensembles de problèmes sont évalués sur la
après quatre axes -
la portée, la justesse, la conception et le style.
>> Portée va être un certain nombre typiquement entre zéro et cinq qui
saisit combien la pièce qui vous peu hors.
En général, vous voulez que ce soit cinq ans.
Vous au moins tout essayé.
Et remarquez que c'est un facteur multiplicatif de sorte que, ce faisant seulement une partie de l'
problème posé n'est pas la meilleure stratégie.
>> Pendant ce temps, plus évidente est l' importance de la décision correcte -
tout est correct avec votre programme respecter le cahier des charges?
Elle est pondérée délibérément plus fortement que les deux autres axes par un
facteur de trois, parce que nous reconnaissons qui généralement vous allez passer une
beaucoup plus de temps à courir vers le bas quelques bugs, l'obtention de votre code fonctionne, alors vous
sont en retrait et en choisissant les noms de variables appropriées et les
analogue, qui est à l'autre extrémité du spectre de section.
>> Cela ne veut pas dire que le style n'est pas importante, et nous prêchons plus
temps à la fois dans des conférences et dans les sections.
Le style se rapporte à l'esthétique de votre code.
Avez-vous choisi porte bien son nom des variables qui sont courtes, mais un peu
descriptif?
Votre code est indenté comme vous l'avez vu dans conférence et d'une manière compatible
avec style des années 50?
>> Enfin conception est bonne là au milieu.
Le design est la plus dure à mettre un Doigt sur parce que c'est beaucoup plus
subjective.
Mais c'est peut-être le plus important de les trois axes en termes de pédagogie
valeur au fil du temps et que ce sera la possibilité pour l'enseignement compatriotes à
vous fournissez des informations qualitatives.
En effet, CS50, même si nous avons ces formules et les scores, à la fin
de la journée, ils sont très délibérément très petits seaux - des valeurs de point
entre zéro et trois et zéro et cinq.
Nous ne cherchons pas à tracer des lignes très grossiers entre les séries de problèmes ou entre
étudiants, mais plutôt se concentrer autant que nous pouvons le qualitatif, longhand
informations, soit dactylographiés ou verbale votre compagnon d'enseignement particulier,
vous aurez la chance de connaître assez bien.
>> Mais en général, ce sont les poids que les différents axes auront.
Pendant ce temps, aussi, c'est important de garder à l'esprit que vous ne devriez pas supposer qu'une
trois sur cinq est de 60% et donc à peu près défaut.
Trois est délibérément destinée à être sorte de milieu de la route bien.
Si vous obtenez trois, à l' début du semestre, c'est
en effet censé être une bonne endroit pour commencer.
Si vous obtenez deux, foires, il ya certainement du travail à payer un peu
une plus grande attention, afin de profiter des sections et des heures de bureau.
>> Si vous obtenez quatre pattes et Fives, tant mieux.
Mais vraiment, nous espérons voir des trajectoires parmi les étudiants - très
individualisée par élève, mais à partir le semestre ici dans une sorte de
les deux à la gamme de trois mais se terminant ici dans la gamme quatre à cinq.
C'est ce que nous cherchons vraiment.
Et nous gardons à l'esprit que le delta vous exposez entre la semaine et de la semaine zéro
12 quand je fais grades.
Il n'a pas d'importance pour nous absolument comment vous juste au début si votre
trajectoire est en effet vers le haut et fort.
>> Intégrité en milieu scolaire - alors laissez-moi mettre mon plus de voix grave pour un instant.
Donc, ce cours a la particularité d' envoyer plus d'étudiants que toute autre
dans l'histoire à la carte annonce, je crois.
Nous avons en quelque sorte perdu le compte à cette point de combien de fois cela arrive.
Et ce n'est pas parce que les étudiants dans 50 sont pas plus malhonnête que leur
camarades d'ailleurs.
Mais réalisons aussi que nous sommes très bons à détecter ce genre de chose.
>> Et c'est l'avantage qu'un classe d'informatique a en nous
pouvons et nous ne comparer l'ensemble des élèves problème définit par paire contre tous
d'autre part, non seulement cette année mais toutes les années antérieures.
Nous avons la capacité, comme les étudiants en la classe, de Google et de trouver le code
sur des sites comme github et des forums de discussion.
Il n'y a absolument solutions aux CS50 de p-fixe flottant autour de là.
Mais si vous pouvez les trouver, nous pouvons les trouver.
Et tout cela est très automatisé et facile et triste pour nous de trouver.
>> Mais je tiens à souligner, aussi, que l' politique d'intégrité académique de cours est
très censé être très à l'opposé de cet esprit.
En effet, cette année, nous avons reformulé les choses dans le programme d'être présent, dot
dot dot, avec plus de détails dans le programme.
Mais le thème principal dans le cadre est vraiment raisonnable.
Nous reconnaissons qu'il existe une importante quantité d'pédagogique
valeur en collaborant, dans une certaine mesure, avec ses camarades de classe, par lequel vous
deux ou trois vous ou vous êtes plus debout sur un tableau blanc
tableau blanc, pour ainsi parler, vos idées -
écrivant pseudo en images, Diagramming ce devrait être le cas Mario
vous deviez écrire le premier en pseudo-code.
Quel devrait être l'algorithme glouton -
comment doit-elle se comporter par problème établit un?
>> Et ainsi se rendre compte que le comportement que nous encourageons est très
beaucoup le long de ces lignes.
Et dans le programme, vous verrez une tas de balles en vertu d'un
catégorie raisonnable et non raisonnable catégorie qui nous aide à aider
vous envelopper votre esprit autour d'où nous ne tirons cette ligne.
Et en général, une règle décent de pouce c'est que si vous avez du mal à résoudre
quelques bugs et votre ami ou un camarade de classe est assis à côté de vous, il est
raisonnable pour vous de lui montrer votre code et dites, hé, pouvez-vous aider
moi à comprendre ce qui ne va pas ici?
>> Nous n'avons pas embrasser typiquement du côté opposé.
Ce n'est pas une réponse adaptée à votre ami ou un camarade de classe ici pour dire, oh,
il suffit de regarder la mienne et la figure sortir de là.
C'est en quelque sorte déraisonnable.
Mais avoir quelqu'un d'autre, un autre cerveau, une autre paire d'yeux regardent
votre écran ou de regarder votre code et dire, êtes-vous sûr que vous voulez
d'avoir une boucle ici?
Ou êtes-vous sûr que vous voulez qui virgule ici?
Ou oh, ce message d'erreur signifie cela.
Ce sont très raisonnables et comportements encouragés.
>> Les cas auxquels je faisais allusion faire bouillir plus tôt vers le bas au moment où les élèves sont
tard dans la nuit à faire un mauvais jugement décisions et emailing leur code pour
quelqu'un d'autre ou tout simplement en disant: ici, c'est dans Dropbox ou
Googler tard dans la nuit.
Et je voudrais donc encourager et vous prie, si vous n'avez ceux inévitable
des moments de stress, vous êtes cogner contre la date limite, vous n'avez pas de fin
jour puisque c'est déjà vendredi à ce que Point, envoyez-les têtes des cours ou
moi-même directement.
Dis, écoute, je suis à mon point de rupture ici.
Ayons une conversation et comprendre.
Le recours à l'Internet ou un autre pas comportement raisonnable n'est jamais le
solution, et trop de votre camarades de classe ne sont plus ici sur
campus à cause de ce manque de jugement.
Mais il est très facile de contourner cette ligne.
>> Et voici une petite photo pour remonter le moral vous contre Reddit sorte que maintenant
tout sera OK.
>> Ainsi, un bref récapitulatif, puis, de l'endroit où nous nous sommes quittés.
Donc, la semaine dernière, rappelons que nous introduisons conditions, pas dans Scratch
mais en C cette fois.
Et il y avait une nouvelle syntaxe mais vraiment aucune idée nouvelle en soi.
Nous avons eu des expressions booléennes que nous pourrions ou forment ensemble avec deux colonnes
bars ou et avec deux esperluette, en disant que tant la gauche
et le droit doit être vrai Pour ce faire exécuter.
Puis nous avons eu commutateurs, que nous regardions à brièvement, mais je propose sont vraiment
juste une syntaxe différente pour atteindre l' même genre de but si vous savez à l'
avancer ce que vos affaires vont être.
>> Nous avons examiné les boucles.
Une boucle est peut-être le plus commun, ou au moins l'une des personnes qui
atteindre typiquement pour instinctivement.
Même si elle semble un peu cryptique, vous verrez de nombreux exemples de cette
avant longtemps, comme vous l'avez déjà en fin de semaine dernière.
Alors que les boucles peuvent même réaliser la même chose.
Mais si vous voulez faire toute incrémentation ou la mise à jour de
Les valeurs des variables, vous devez faire manuellement plus que l'
boucle for permet avant.
Et puis il ya la boucle do-while, qui nous permet de faire quelque chose à
moins une fois pendant que quelque chose le reste est vrai.
Et ce qui est particulièrement bon pour des programmes ou des jeux où vous voulez
pour inviter l'utilisateur à quelque chose au moins une fois.
Et puis si il ou elle ne coopère pas, vous voudrez peut-être faire
encore et encore.
>> Avec les variables, quant à lui, nous avions des lignes de ce type de code, ce qui pourrait
être deux lignes.
Vous pouvez déclarer un int appelé compteur, point-virgule.
Ou vous pouvez simplement déclarer et définir, pour ainsi dire.
Lui donner une valeur à la fois.
>> Et puis enfin, nous avons parlé sur les fonctions.
Et ce fut un bel exemple dans ce sens qu'elle illustre
deux types de fonctions.
L'un est GetString (), qui, encore une fois, reçoit une chaîne de caractères à partir de l'utilisateur.
Mais GetString () est assez intéressant, pour autant que nous l'avons utilisé,
parce que nous avons toujours utilisé avec quelque chose sur le côté gauche de l'
signe égal.
C'est-à-dire que GetString () renvoie une valeur.
Elle renvoie, bien sûr, d'une chaîne.
Et puis sur le côté gauche, nous sommes simplement sauver cette chaîne à l'intérieur d'un
variable appelée nom.
>> Ceci est différent, dans un sens, à partir de printf printf parce que, au moins dans notre
utilisation ici, ne renvoie rien.
En aparté, elle ne retourne quelque chose.
Nous ne soucions pas ce que c'est.
Mais il a ce qui est appelé un effet secondaire.
Et qu'est-ce que l'effet de côté dans chaque cas que nous avons vu jusqu'à présent?
Qu'est-ce que printf faire?
Elle imprime quelque chose à l'écran, affichages texte ou des nombres ou quelque chose
sur l'écran.
Et c'est justement considéré comme un effet secondaire parce que ce n'est pas vraiment remise
de nouveau à moi.
Ce n'est pas une réponse à l'intérieur de une boîte noire que je peux ensuite
atteindre dans et saisir.
Il est juste de le faire sur son propre, beaucoup comme Colton a été branché sur cette
boîte noire de la semaine dernière, et il a en quelque sorte magiquement tirait sur la carte
sans moi réellement impliqué.
Ce serait un effet secondaire.
Mais si j'ai dû remonter dans le ici et dire, oh, voici la chaîne
à partir de l'utilisateur, qui serait une valeur de retour.
>> Et jusqu'à présent, nous avons seulement des fonctions utilisées que les autres ont écrit.
Mais nous pouvons réellement faire ces sortes de choses nous-mêmes.
Donc, je vais aller dans le CS50 appareil en marche.
Permettez-moi de conclure sur l'onglet que nous a ouvert il ya un instant.
Et permettez-moi d'aller de l'avant et créer un nouveau fichier.
Et je vais aller de l'avant et appeler cela un positive.c.
Donc, je veux faire quelque chose avec nombres positifs ici.
Donc, je vais aller de l'avant et faire int -
désolé -
# Include.
Ne faisons pas la même erreur comme avant.
Int main (void), ouvert bouclés accolade, accolade fermée.
>> Et maintenant, je veux faire ce qui suit.
Je veux écrire un programme qui insiste sur le fait que l'utilisateur donne
moi un entier positif.
Il n'y a donc pas de fonction GetPositiveInt dans la bibliothèque CS50.
Il ya seulement getInt ().
Mais ce n'est pas grave parce que j'ai l' constructions avec laquelle je peux imposer une
peu plus de contrainte sur cette valeur.
Je pouvais faire quelque chose comme ça.
>> Alors int n -
et si vous tapez le long, juste réaliser Je vais revenir en arrière et
changer certaines choses dans un instant -
si int n est égal à getInt ().
Et cela va mettre une partie intérieure de n int.
Et laissez-moi être un plus descriptive.
Permettez-moi de dire quelque chose comme j'exige que vous me donnez un entier positif.
>> Très bien.
Alors, juste un peu d'instructions.
Et maintenant, que puis-je faire?
Eh bien, je sais déjà de mon simples conditions ou des branches, comme je
avait Scratch, je pourrais dire quelque chose que si n est inférieur ou égal à
zéro, alors je veux faire quelque chose aiment, ce n'est pas positif.
Et puis je pourrais faire -
OK, mais je veux vraiment que int.
Je ne pouvais donc aller ici et je ne pouvais genre de cette copie et cette tiret.
Et puis, sur OK.
Donc, si n est inférieur ou égal à zéro le faire.
>> Maintenant, si l'utilisateur ne pas coopérer?
Eh bien, je vais Emprunter ici.
Et puis je vais ici et ici et ici.
Donc, ce n'est clairement pas la solution, non?
Parce qu'il n'y a pas de fin en vue.
Si je veux exiger que l'utilisateur donne moi un entier positif, je peux
réellement obtenir le int.
Je peux alors vérifier que int.
Mais alors je veux vérifier encore et vérifier de nouveau et vérifier de nouveau.
Alors, évidemment, ce qui est le mieux construire à l'aide ici?
D'accord, donc une sorte de boucle.
>> Donc, je vais vous débarrasser la quasi-totalité de cette.
Et je veux obtenir cette int au moins une fois.
Alors je vais dire faire -
et je reviendrai à la tandis que dans un instant -
Maintenant, quoi faire?
Je vais faire int n obtient getInt ().
OK.
Donc, c'est très bon.
Et maintenant, combien de fois Je veux faire ça?
>> Permettez-moi de l'intérieur de la boucle printf donc je ne peux demander encore et encore,
si besoin est.
Et ce que je veux ce tout état de le faire?
Je veux continuer à faire ça tout ce qui est le cas?
Ouais.
N est inférieur ou égal à zéro.
Donc, déjà, nous avons considérablement nettoyé ce code vers le haut.
Nous avons emprunté un très simple construire - la boucle do-while.
J'ai volé quelques lignes importantes de code que j'ai commencé à copier
coller, ce qui n'était pas sage.
Et maintenant je vais coller réellement il ici et faites-le une fois.
>> Et maintenant, qu'est-ce que je veux faire à la fin de ce programme?
Je vais juste dire quelque chose de simple tiens, merci pour le - et
Je ferai% i pour int -
barre oblique inverse n, virgule, puis fiche n, point-virgule.
>> Très bien.
Voyons donc ce qui se passe maintenant quand je lance ce programme.
Je vais aller de l'avant et ne faites positive.
Merde.
Quelques erreurs.
Permettez-moi de revenir en arrière jusqu'à la première.
Ne pas travailler à travers eux vers l'arrière.
Travailler à travers eux, de haut en bas de peur qu'ils cascade et seulement
Qu'une chose soit fausse.
Déclaration implicite de getInt fonction ().
Ouais.
Donc ce n'était pas assez.
J'ai un peu fait la même erreur, mais un peu différent cette fois.
J'ai besoin de non seulement comprendre mais stdio.h également cs50.h, qui comprend l'
dites déclarations d'obtenir int, qui enseigner l'appareil, ou enseigne
C quoi getInt () est.
>> Permettez-moi de réenregistrer.
Je vais ignorer les autres erreurs parce que je vais espérer qu'ils sont
en quelque sorte liés à l'erreur J'ai déjà fixé.
Alors laissez-moi aller de l'avant et de recompiler à rendre positif, Entrée.
Merde.
Trois erreurs, encore.
Permettez-moi de remonter jusqu'à la première.
N variables inutilisées.
Nous n'avons pas vu cela avant.
Et cela, aussi, est un peu énigmatique.
C'est la sortie du compilateur.
Et qu'est-ce que la ligne en surbrillance là - positive.c :9:13 -
n'est pas peu dire, il est dit sur la ligne neuf positive.c, au caractère 13,
13ème colonne, vous avez fait cette erreur.
>> Et en particulier, il est révélateur me utilisé n variable.
Voyons donc -
ligne de neuf.
J'utilise n dans le sens où Je lui donnant une valeur.
Mais ce que le compilateur n'aime pas, c'est que je ne suis pas apparemment l'utiliser.
Mais attendez une minute, je m'en sers.
Dans la ligne 11, je m'en sers ici.
Mais si je fais défiler un niveau plus bas à positive.c :11 -
donc à la ligne 11, caractère 12, le compilateur me dit, l'utilisation de
non déclaré identifiant n.
>> Alors moyens non déclarés j'ai pas spécifiée en tant que
variable avec un type de données.
Mais attendez une minute.
J'ai fait exactement ce que en ligne neuf.
Donc, quelqu'un est vraiment confus ici.
C'est moi ou le compilateur car en ligne neuf, encore une fois, je déclarer une
int n, et je lui attribuant le valeur de getInt () retourne.
Ensuite, je suis en utilisant cette variable n de la ligne 11 et de vérifier si sa valeur est inférieure
supérieure ou égale à zéro.
Mais ce n'est apparemment mauvais et cassé pourquoi?
Dites-le à nouveau?
>> Ah, je dois déclarer n avant entrer dans la boucle.
Mais pourquoi?
Je veux dire, nous avons juste proposé il ya un peu plus que c'est bien de déclarer des variables
sur une seule ligne, puis leur attribuer une certaine valeur.
Une variable globale - Revenons à cette idée dans un instant.
Pourquoi voulez-vous me mettre à l'extérieur de la boucle?
Il est.
Exactement.
>> Ainsi, quoique quelque peu contre-intuitif, Permettez-moi de résumer.
Lorsque vous déclarez n intérieur du bloc faire là-bas -
spécifiquement l'intérieur d' ces accolades -
cette variable n est ce qui est appelé un champ -
rien à voir avec notre système de notation dans le bien sûr - mais a une portée qui est
limité à ces accolades.
En d'autres termes, typiquement si vous déclarez une variable à l'intérieur d'un ensemble de
accolades, cette variable existe uniquement à l'intérieur de ces accolades.
Alors que par la seule logique, même si J'ai déclaré n en ligne neuf, il
disparaît essentiellement de portée, disparaisse de la mémoire, pour ainsi dire,
au moment où j'ai touché la ligne 11.
Parce que la ligne 11 est, malheureusement, en dehors de ces accolades.
>> Donc, je ne peux malheureusement pas résoudre ce problème en revenir à ce que je faisais avant.
Vous pourriez d'abord le faire.
Mais que faites-vous pas maintenant faire cyclique?
Vous n'êtes évidemment pas se l'int cyclique.
Ainsi, nous pouvons quitter le getInt (), et nous devrait quitter le getInt () à l'intérieur du
boucle parce que c'est ce que nous voulons harceler l'utilisateur pour encore et encore.
Mais il ne suffit pas d'aller jusqu'à la ligne, disons, six.
Int n, point-virgule.
Ne pas lui donner encore une valeur, car vous n'avez pas besoin pour l'instant d'.
>> Mais maintenant, ici-bas, avis - ce Ce serait une erreur très facile.
Je ne veux pas occulter mon précédent déclaration de n.
Je veux utiliser le n que existe réellement.
Et donc maintenant à la ligne 10, J'attribue une valeur n.
Mais, dans la sixième ligne, je déclare n.
Et puis-je ou puis-je pas utiliser la ligne 12 maintenant?
Je peux parce que, entre lesquelles bouclés accolades est n déclaré aujourd'hui?
La seule ici en ligne de cinq ans.
Pour un ici sur la ligne 14.
Donc, si je zoome aujourd'hui sur, enregistrez ce fichier, allez sauvegarder en et lancez make positive, il
compilé cette fois.
Donc, c'est déjà un progrès.
Slash. . / Positif, Entrée.
>> J'exige que vous me donnez un nombre entier positif.
Négatif 1.
Négatif 2.
Négatif 3.
Zéro.
One.
Et merci pour l'un est ce qui est maintenant imprimé.
>> Permettez-moi d'essayer quelque chose d'autre, par curiosité.
On me dit d'entrer un entier.
Mais que faire si je tape plutôt dans l'agneau?
Donc, vous voyez maintenant un autre message -
réessayez.
Mais nulle part dans mon code ai-je écrit réessayer.
Alors, où, sans doute, est-ce retry invite venant, diriez-vous?
Oui, à partir de getInt () lui-même.
Donc, une des choses personnel de CS50 ne pour vous, au moins dans les quelques premiers
semaines, c'est que nous avons écrit une certaine quantité de contrôle d'erreur pour faire en sorte que si
vous appelez getInt (), vous aurez au moins récupérer un int de l'utilisateur.
Vous n'obtiendrez pas une chaîne.
Vous n'obtiendrez pas un chevalier.
Vous ne serez pas obtenir quelque chose d'autre tout à fait.
Vous obtiendrez un int.
>> Maintenant, il ne serait pas positive.
Il pourrait ne pas être négatif.
Nous ne donnons aucune garantie à ce sujet.
Mais nous allons harceler l'utilisateur de relance, tentative, recommencez jusqu'à ce qu'il ou elle fait
coopère.
De même, si je fais 1,23, ce n'est pas un int.
Mais si je ne tape dans, disons, 50 ans, qui me donne une valeur que je voulais.
>> Très bien.
Donc pas mal.
Vous avez des questions sur ce que nous venons de faire?
Les plats à emporter clé étant, pour être clair, pas tellement la boucle, que nous avons vu
avant, même si nous n'avons pas vraiment utilisée, mais la question de la portée, où
variables peuvent uniquement être ne peuvent être utilisés au sein de certains portée spécifiée.
>> Très bien, permettez-moi d'aborder la suggestion vous avez fait plus tôt, celle d'un
variable globale.
En aparté, il s'avère que l'autre solution à ce problème, mais
typiquement une solution erronée ou une solution mal conçue, est de
déclarer votre variable que ce qui est appelé une variable globale.
Maintenant, je suis une sorte de violer ma définition de portée, car il ya
ni d'accolades tout en haut et en bas d'un fichier.
Mais l'implication de cette c'est que maintenant dans la quatrième ligne,
n est une variable globale.
Et comme son nom l'indique, il est seulement accessible partout.
>> Scratch a fait ces derniers.
Si vous avez utilisé une variable, vous pouvez vous rappeler vous aviez à choisir si c'est pour
sprite ou pour tous les sprites.
Eh bien, tous les sprites est juste la plus claire façon de dire mondiale.
Ouais?
Ah, bonne question.
>> Donc rappeler que dans la toute première version de mon code, quand j'ai tort
n déclarées et définies dans la ligne neuf -
J'ai déclaré comme une variable et je lui ai donné une valeur à
l'opérateur d'affectation -
cela m'a donné deux erreurs.
Premièrement, le fait que n n'a pas été utilisé, et deux, que, dans la ligne 11
Ce n'était pas déclarée.
Donc, le premier que je n'ai pas adresse à l'époque.
Il n'est pas strictement une erreur de déclarer une variable mais ne pas l'utiliser.
Mais l'une des choses que nous avons faites dans l'appareil CS50, délibérément,
pédagogiquement, c'est que nous avons coudés l' attentes du compilateur à faire
vous que vous faites des choses pas seulement correctement mais vraiment correctement.
>> Parce que si vous déclarer une variable comme n et ne jamais l'utiliser, ou de l'utiliser
correctement, alors ce fait-il là?
Il sert vraiment à rien.
Et il est très facile au fil du temps, si vous ne configurez votre propre ordinateur en
Ainsi, pour avoir juste le code qui a petits restes ici, restes là-bas.
Et puis des mois plus tard, vous regardez en arrière et vous êtes comme, pourquoi est-ce la ligne de
Code là?
Et s'il n'y a aucune bonne raison, il ne vous ou vos collègues bénéficieront pas
sur la route du devoir trébucher alors.
>> Soit dit en passant, où est qui vient?
Eh bien, rappelons que chaque fois que nous compilons programme, toutes ces choses est
en cours d'impression.
Donc, nous allons revenir à cela.
Mais encore une fois, faire est un utilitaire qui automatise le processus de compilation par
l'exécution du compilateur réelle appelé clang.
Cette chose, nous voyons finalement, a à voir avec le débogage avec une spéciale
programme appelé le débogueur.
Cela a à voir avec l'optimisation de la Code - plus à ce sujet à l'avenir.
Std = c99 -
cela signifie simplement utiliser la version 1999 de C. C a été encore plus longtemps que
, mais ils ont fait quelques belles changements 10 Plus il ya des années.
>> Et voici ceux qui sont pertinents.
Nous disons faire tout ce qui précédemment aurait été un avertissement
une erreur empêchant l'étudiant de la compilation.
Et des moyens murales font que pour un tas de choses, pas
uniquement liée à des variables.
Et puis, permettez-moi de défilement pour l'extrémité de cette ligne.
Et cela aussi, nous finirons revenir.
C'est évidemment le nom de le fichier Je compile.
Cela rappelle le nom du fichier Je suis sortie comme son nom l'
de mon programme exécutable.
Cela signifie-lcs50 il suffit d'utiliser le CS50 bibliothèque, et les zéros et de uns que les
le personnel a écrit et compilé plus tôt cette année, d'intégrer
eux dans mon programme.
>> Et quelqu'un sait ce-lm est?
C'est la bibliothèque de mathématiques, ce qui est juste là, même si vous êtes
ne pas faire de mathématiques.
C'est juste automatiquement fournie nous en faire.
>> Eh bien, permettez-moi de faire un autre exemple ici par l'ouverture d'un nouveau fichier.
Et laissez-moi à sauver celui-ci comme string.c.
Il s'avère que nous parlons de données types aujourd'hui, il ya encore plus
passe sous le capot que nous avons vu jusqu'à présent.
Permettez-moi de faire rapidement un programme rapide.
Inclure stdio.h.
Et je vais garder.
Et vous le savez, ne me laisse pas faire l' même erreur encore et encore.
Inclure cs50.h.
Et permettez-moi d'aller de l'avant maintenant et faire int main (void).
>> Et maintenant, je veux simplement faire un programme qui fait cela - de déclarer une chaîne
appelé s et obtenir une chaîne à partir de l'utilisateur.
Et laissez-moi faire un peu instructions ici -
s'il vous plaît donnez-moi une corde - si l'utilisateur sait ce qu'il faut faire.
Et puis, ici-bas ce, Je veux faire ce qui suit -
pour int i obtient zéro.
Encore une fois, les informaticiens en général commencer à compter à zéro, mais nous ne pouvions
faire qu'un si nous voulions vraiment.
Maintenant, je vais faire i est inférieur que la longueur de la chaîne de l'art.
Alors strlen -
S-T-R-L-E-N -
encore une fois, c'est concis, car il est plus facile à taper, même si c'est un
peu cryptique.
>> C'est une fonction que nous n'avons pas utilisé avant, mais ne littéralement que -
revenez me voir un nombre qui représente la longueur de la chaîne
que l'utilisateur a tapé.
Si ils ont tapé dans bonjour, il reviendrait cinq parce qu'il ya cinq
lettres Bonjour.
Ensuite, à chaque itération de cette boucle, i plus plus.
Encore une fois, une norme construire même si vous n'êtes pas encore trop à l'aise ou
familier avec elle encore.
>> Mais maintenant, à chaque itération de cette boucle, Remarquez ce que je vais faire.
Je veux aller de l'avant et d'imprimer un caractère unique -
si c% backslash n sur une nouvelle ligne.
Et puis, vous savez ce que je veux faire?
Quel que soit le mot que l'utilisateur tape dans, comme bonjour, je veux imprimer
H-E-L-L-S, un caractère par ligne.
En d'autres termes, je veux arriver à la caractères individuels d'une chaîne de caractères,
où jusqu'à présent une chaîne vient eu une séquence de caractères.
>> Et il s'avère que je peux faire s, le support i, fermer la parenthèse, fermez
parenthèse, point-virgule.
Et je dois faire autre chose.
C'est dans un fichier appelé que strlen est déclarée.
Donc, si je veux utiliser cette fonction, Je dois dire que le compilateur,
s'attendre à utiliser.
Maintenant, laissez-moi aller de l'avant et faire le programme appelé chaîne.
Dot, slash, string.
>> S'il vous plaît donnez-moi une corde.
Je vais aller de l'avant et taper.
Bonjour, tout en majuscules, Entrée.
Et maintenant, remarque J'ai imprimé ce un caractère après l'autre.
Ainsi, le nouveau détail ici, c'est que d'une chaîne, à la fin de la journée, ne peuvent être
accès par le biais de son individu caractères en introduisant le carré
la notation crochets.
Et c'est parce que d'une chaîne sous le capot est en effet une séquence de
caractères.
Mais ce qui est propre à leur sujet est dans la mémoire vive de votre ordinateur -
Mac, PC, quel qu'il soit - ils sont littéralement dos à dos à dos -
H-E-L-L-O -
au niveau individuel, adjacent octets dans la mémoire.
>> Donc, si vous voulez obtenir à la huitième tels octet, qui, dans cette boucle serait
support de zéro, un support, un support à deux, support de trois, quatre patte -
ce n'est nulle indexés jusqu'à cinq -
qui va imprimer H-E-L-L-O sur sa propre ligne.
>> Maintenant, comme un teaser, permettez-moi de vous montrer l' sortes de choses vous finirez par être
capable de comprendre, au moins avec un peu étroite à la recherche.
D'une part, ce que nous avons inclus dans aujourd'hui exemples, si vous le souhaitez, est en fait
l'une des toutes premières évasions pour l'iPhone.
Signifie jailbreaking craquer le téléphone de sorte que vous pouvez réellement utiliser sur un
transporteur ou installation différent votre propre logiciel.
Et vous remarquerez cela semble complètement énigmatique, le plus probable.
Mais regardez ça.
L'iPhone a été apparemment craqué avec une boucle, une condition if, un autre
état, un tas de fonctions nous n'avons pas vu.
>> Et encore une fois, vous n'aurez pas à première vue, probablement
comprendre comment cela fonctionne.
Mais tout ce que nous prenons sorte d' pour acquis dans notre vie moderne
tend effectivement à réduire voire à une certaine de ces principes fondamentaux que nous avons été
regarder.
Permettez-moi d'aller de l'avant et ouvre une autre programme, holloway.c.
Donc, cela aussi, c'est quelque chose que vous ne devrait pas connaître vraiment.
Même qu'aucun membre du personnel ou je pouvais probablement comprendre cela en consultant d'
parce que c'était le code de quelqu'un qui a été soumis à ce qui est
historiquement connu comme un occulté C concours, où vous écrivez un programme
qui compile et s'exécute mais il est sacrément cryptique aucun humain ne peut comprendre ce que
ça va faire jusqu'à ce que ils réellement l'exécuter.
>> Donc, en effet, si vous regardez ce code, je vois un interrupteur.
Je vois principale.
Je vois ces crochets impliquant une sorte de tableau.
Quelqu'un veut-il deviner ce ce programme fait
t-il si je n'ai Holloway?
Oui.
OK.
Bien fait.
Alors que le personnel et je ne peux pas comprendre ce que ces choses font.
>> Et maintenant, enfin, permettez-moi d'aller de l'avant et d'ouvrir un autre programme.
Celui-ci -
encore une fois, nous ferons le code source disponible en ligne - celui-ci est juste
sorte de joli à regarder.
Tout ce qu'ils ont fait est de frapper l' barre d'espace tout à fait un peu.
Mais c'est vrai code.
Donc, si vous pensez que c'est assez, si nous effectivement exécuter ce à l'invite,
finalement, vous verrez comment nous pourrait faire des choses comme ça.
>> Donc, nous allons vous laisser sur cette note et rendez-vous le mercredi.
>> [Jouer de la musique]
>> ENCEINTE 2: Lors de la prochaine CS50, les fonds fiduciaires en scène une mutinerie.
>> Intervenant 3: Il est là.
Sortez-le!
>> [Jouer de la musique]