ROB BOWDEN: Salut, je suis Rob Bowden, et parlons quiz0. Donc, première question. Telle est la question où vous avez besoin pour coder le numéro 127 dans les ampoules binaires. Si vous vouliez, vous pourriez faire la conversion régulière de bi-- ou, de décimal à binaire. Mais que va probablement de prendre beaucoup de temps. Je veux dire, vous pouvez comprendre que, OK, 1 est là, 2 est là, 4 est là, 8 est là. Moyen plus facile, est de 128 127 moins un. Cette ampoule de gauche est le 128-bit. Donc 127 est vraiment juste tout des autres ampoules, depuis que la gauche est ampoule moins 1. Voilà pour cette question. Première question. Donc, avec 3 bits, vous pouvez représenter 8 valeurs distinctes. Pourquoi, alors, est de 7 le plus grand non-négatif entier décimal vous pouvez représenter? Eh bien, si nous ne pouvons représenter 8 valeurs distinctes, alors ce que nous allons être représente 0 à 7. 0 prend l'une des valeurs. Deuxième question. Avec n bits, combien distinct valeurs peuvent vous représenter? Ainsi, avec n bits, vous avez 2 valeurs possibles pour chaque bit. Nous avons donc deux valeurs possibles pour le premier bit, deux valeurs possibles pour le deuxième, 2 possible pour le troisième. Et qui est 2 fois 2 fois 2, et en fin de compte la réponse est de 2 à n. La troisième question. Quel est 0x50 en binaire? Alors rappelez-vous que hexadécimal a une très conversion simple en binaire. Donc, ici, nous avons juste besoin de regarder le 5 et le 0 de façon indépendante. Donc, ce qui est 5 en binaire? 0101, qui est le bit 1 et le 4 bits. Ce qui est 0 en binaire? Pas difficile. 0000. Il suffit donc de les mettre ensemble, et qui est le numéro complet en binaire. 01010000. Et si vous vouliez vous pourriez décoller que de gauche à zéro. Il est hors de propos. Alors encore, ce qui est 0x50 en décimal? Si vous voulez, vous could-- si vous êtes plus à l'aise avec le binaire, vous pourriez prendre cette réponse binaire et convertir en décimal. Ou nous pourrions rappeler que hexadécimal. Alors que 0 est dans le 0-ème place, et la figure 5 est dans le 16 à la première place. Donc, ici, nous avons 5 fois 16 à la première, plus 0 fois 16 à zéro, 80 est. Et si vous regardiez à la titre de la question, il était CS 80, qui était une sorte de allusion à la réponse à ce problème. Question de cinq ans. Nous avons ce script de zéro, ce qui est répéter 4 fois le beurre d'arachide gelée. Alors, comment pouvons-nous maintenant le code que dans C? Eh bien, nous avons ici-- la partie en gras est la seule partie que vous aviez à mettre en œuvre. Nous avons donc une boucle de 4 qui tourne en boucle 4 fois, ing printf beurre d'arachide gelée, avec la nouvelle ligne que le problème demande. Question six, un autre problème de Scratch. Nous voyons que nous sommes dans une boucle infinie. Nous disons la variable i et puis incrémenter i de 1. Maintenant, nous voulons le faire en C. Il ya de multiples façons nous aurions pu faire cela. Ici nous est arrivé de coder la toujours comme une boucle while (true). Donc, nous déclarons la variable i, juste comme nous avons eu la variable i dans Scratch. Déclarez la variable i, et pour toujours while (true), nous disons que la variable i. Donc printf% i-- ou vous auriez pu utiliser% d. Nous disons que la variable, et puis incrémenter, i ++. Question sept. Maintenant, nous voulons faire quelque chose de très similaire Mario point c de problème en créer un. Nous voulons imprimer ces hashtags, nous voulons imprimer un cinq par trois rectangle de ces valeurs de hachage. Alors, comment allons-nous faire cela? Eh bien, nous vous donnons un ensemble tas de code, et vous venez de avoir à remplir la fonction de la grille d'impression. Alors qu'est-ce PrintGrid ressemble? Eh bien, vous êtes passé le la largeur et la hauteur. Nous avons donc un extérieur 4 boucle, qui tourne en boucle sur toutes les lignes de ce grille que nous voulons imprimer. Ensuite, nous avons le 4 boucle inter-imbriquée, qui est l'impression sur chaque colonne. Donc, pour chaque ligne, nous imprimons pour chaque colonne, une seule table de hachage. Puis à la fin de la ligne que nous imprimons une seule nouvelle ligne pour aller à la ligne suivante. Et voilà pour l'ensemble de la grille. Question huit. Une fonction comme PrintGrid est dit avoir un effet secondaire, mais pas un retour valeur. Expliquer la distinction. Donc, ce compte sur vous souvenir ce un effet secondaire est. Eh bien, un retour value-- nous savons PrintGrid ne avoir une valeur de retour, depuis ici il est dit nulle. Donc, tout ce qui retourne void ne vraiment rien retourne pas. Alors, quel est l'effet secondaire? Eh bien, un effet secondaire est tout ce qui persiste sorte de après la fin de la fonction qui était non seulement retourné, et il n'a pas été seulement des entrées. Ainsi, par exemple, nous pourrions changer une variable globale. Ce serait un effet secondaire. Dans ce cas particulier, un effet très important de côté est l'impression à l'écran. Ce qui est un effet secondaire qui a PrintGrid. Nous imprimons ces choses à l'écran. Et vous pouvez penser que comme un effet secondaire, depuis que ya quelque chose qui persiste après la fin de cette fonction. Voilà quelque chose en dehors du champ d'application de cette fonction qui en fin de compte est modifiée, la contenu de l'écran. Question neuf. Considérons le programme ci-dessous, dans laquelle les numéros de ligne ont été ajoutées pour l'intérêt de la discussion. Donc, dans ce programme, nous sommes juste appelant GetString, stocker Dans cette variable s, puis imprimer cette variable s. D'accord. Donc expliquer pourquoi une ligne est présent. #include CS50 point h. Pourquoi devons-nous #include CS50 point h? Bien que nous appelons la Fonction GetString, et GetString est définie dans la bibliothèque de CS50. Donc, si nous ne disposions pas #include CS50 point h, nous obtiendrions cette déclaration implicite de l'erreur de la fonction de GetString du compilateur. Donc, nous devons inclure le library-- nous devons inclure le fichier d'en-tête, ou bien le compilateur ne sera pas reconnaître que GetString existe. Expliquez pourquoi la deuxième ligne est présent. Alors norme io point h. Il est exactement le même que le problème précédent, sauf qu'au lieu de traiter avec GetString, nous parlons printf. Donc, si nous ne disions pas que nous devons d'inclure norme io point h, alors nous ne serions pas en mesure d'utiliser la fonction printf, parce que le compilateur serait pas au courant. Pourquoi-- quelle est la signification de plein droit dans la ligne quatre? Nous avons donc ici int main (void). Cela juste dire que nous ne reçoivent pas une ligne de commande arguments de main. Rappelez-vous que nous pourrions dire int principaux int argc parenthèses chaîne de argv. Donc, ici, nous disons simplement vide à nous dire sont ignorant les arguments de ligne de commande. Expliquer, par rapport à la mémoire, exactement ce GetString en ligne six retours. GetString revient un bloc de mémoire, un tableau de caractères. Il est vraiment un retour pointeur sur le premier caractère. Rappelez-vous qu'une chaîne est une étoile char. Donc, s est un pointeur vers le premier caractère quelle que soit la chaîne est que l'utilisateur a entré au clavier. Et que la mémoire arrive à être malloced, de sorte que la mémoire est dans le tas. Question 13. Considérons le programme ci-dessous. Donc, tout ce programme est fait printf est-ing 1 divisé par 10. Donc, lors de la compilation et exécuté, ce programme sorties 0.0, même si 1 divisé par 10 est de 0,1. Alors, pourquoi est-il 0.0? Eh bien, cela est parce que de division entier. Ainsi, la figure 1 est un nombre entier, la figure 10 est un nombre entier. Donc 1 divisé par 10, tout est traité comme des entiers, et en C, quand nous faisons la division entière, on tronque tout point décimal. Donc 1 divisé par 10 est 0, et puis nous essayons d'imprimer que comme un flotteur, de sorte zéro imprimé comme un flotteur est 0.0. Et voilà pourquoi nous obtenons 0.0. Considérons le programme ci-dessous. Nous l'impression maintenant de 0,1. Donc, pas de division entière, nous sommes juste l'impression de 0,1, mais nous imprimer à 28 décimales. Et nous obtenons ce 0.1000, tout un tas de zéros, 5 5 5, bla bla bla. Donc la question est de savoir pourquoi il ne imprimer que, au lieu de 0,1 exactement? Donc, la raison est ici maintenant virgule flottante imprécision. Rappelez-vous qu'un flotteur est à seulement 32 bits. Nous ne pouvons donc représenter un nombre fini de valeurs à virgule flottante avec ceux 32 bits. Eh bien il ya finalement infiniment de nombreuses valeurs à virgule flottante, et il ya une infinité de flottant les valeurs de point de entre 0 et 1, et nous sommes évidemment en mesure de représenter encore plus de valeurs que cela. Donc, nous devons faire des sacrifices pour être en mesure de représenter la plupart des valeurs. Ainsi, une valeur comme 0.1, apparemment nous ne pouvons pas représenter exactement ce que. Ainsi, au lieu de représenter 0,1 nous faisons le mieux que nous pouvons représenter cette 0.100000 5 5 5. Et qui est assez proche, mais pour un grand nombre d'applications vous avez à vous soucier de Point imprécision flottant, parce que nous ne pouvons pas représenter tous les points flottant exactement. Question 15. Considérons le code ci-dessous. Nous sommes en train d'imprimer 1 plus 1. Il n'y a donc pas de truc ici. 1 plus 1 évalue à 2, et puis nous l'impression que. Cette affiche seulement 2. Question 16. Maintenant, nous sommes l'impression du caractère 1 plus le caractère 1. Alors, pourquoi ne pas ce imprimer la même chose? Eh bien le caractère 1 plus le caractère 1, le personnage a une valeur ASCII 49. Donc, ce qui est vraiment dit, plus de 49 49, et finalement cela va imprimer 98. Donc, ce ne pas imprimer 2. Question 17. Compléter la mise en œuvre impair de dessous de telle manière que la fonction renvoie vrai si n est impair et faux si n est pair. Ceci est un grand dessein pour l'opérateur mod. Donc, nous prenons notre argument n, si n mod 2 est égal à 1, et cela signifie que n divise par 2 avait un solde. Si n divisé par 2 eu un reste, que signifie que n est impair, alors nous retourner vrai. Sinon nous retournons faux. Vous pouvez aussi avez fait n mod 2 égaux zéro, return false, sinon retourne vrai. Considérons la fonction récursive ci-dessous. Donc, si n est inférieur ou égale à 1, renvoie 1, d'autre retour n fois f de n moins 1. Alors, quelle est cette fonction? Eh bien, ceci est juste le fonction factorielle. Ceci est bien représenté comme factorielle de n. Donc, la question 19 maintenant, nous voulons prendre cette fonction récursive. Nous voulons qu'il soit itératif. Alors, comment faisons-nous cela? Eh bien pour le personnel solution, et encore, il est de multiples façons vous auriez pu faire que, nous commençons avec ce produit int est égal à 1. Et tout au long de cette pour la boucle, nous allons à multiplier produit en fin de compte à finir avec le factoriel complet. Donc, pour int i est égal à 2, i est inférieur ou égal à n, i ++. Vous pourriez vous demander pourquoi i est égal à 2. Eh bien, rappelez-vous que nous avons ici à assurez-vous que notre scénario de base est correcte. Donc, si n est inférieur ou égal à 1, nous sommes juste de retour 1. Donc, ici, nous commençons à i est égal à 2. Eh bien, si je devais 1, puis the-- ou si n étaient 1, puis la boucle ne serait pas exécuter du tout. Et si nous irions retour de produit, qui est de 1. De même, si n était rien de moins que 1-- si elle était 0, 1 négatif, whatever-- nous serions encore connus 1, qui est exactement ce que le Version récursive fait. Maintenant, si n est supérieur à 1, alors nous allons à faire au moins un itération de cette boucle. Donc, disons que n est 5, alors nous sommes va faire des temps de produit est égal à 2. Alors maintenant, est produit 2. Maintenant, nous allons faire temps de produits est égal à trois. Maintenant, il est 6. fois du produit est égal à 4, il est maintenant 24. fois du produit est égal à 5, il est maintenant de 120. Alors en fin de compte, nous sommes de retour 120, qui est correctement 5 factorielle. Question 20. Ceci est celle où vous devez remplir dans ce tableau avec un algorithme donné, tout ce que nous avons vu, que répond à ces parcours algorithmique fois ces des temps d'exécution asymptotique. Alors, quel est un algorithme qui est l'oméga de 1, mais grand O de n? Il pourrait donc y être infiniment beaucoup de réponses ici. Celui que nous avons vu probablement plus est souvent juste une recherche linéaire. Donc, dans le meilleur des cas scénario, l'article nous sommes cherche est à la au début de la liste et donc en oméga de 1 étapes, la première chose que nous vérifions, nous revenons juste immédiatement que nous avons trouvé l'article. Dans le pire des cas, l'article se trouve à la fin, ou l'article est pas dans la liste du tout. Nous devons donc rechercher la liste entière, tout n éléments, et qui est pourquoi il est o n. Alors maintenant, il est quelque chose qui est à la fois oméga de n log n, et grand O de n log n. Eh bien la chose la plus pertinente nous avons vu ici est le tri par fusion. Donc, le tri par fusion, rappelez-vous, Theta est en fin de compte de n log n, où thêta est défini si les deux oméga et grand O sont les mêmes. Les deux n log n. Qu'est-ce quelque chose qui est oméga de n, et n au carré de O? Eh bien, encore une fois il ya plusieurs réponses possibles. Ici nous nous trouvons à dire tri à bulles. Le tri par insertion serait également travailler ici. Rappelez-vous que tri à bulles où a que l'optimisation, si vous êtes en mesure d'obtenir toute la liste sans avoir à faire des swaps, alors, eh bien, nous pouvons retourner immédiatement que la liste a été triée pour commencer. Ainsi, dans le meilleur des cas, il est juste oméga de n. Si il est pas seulement un bien liste pour commencer à trier, puis nous avons O n carré swaps. Et enfin, nous avons sorte sélection pour n au carré, à la fois grand et oméga O. Question 21. Qu'est-ce débordement d'entier? Eh bien encore une fois, même à l'heure, nous avons seulement un nombre fini de bits pour représenter un nombre entier, Alors peut-être 32 bits. Disons que nous avons un entier signé. Puis, en fin de compte le plus élevé nombre positif, nous pouvons représenter 2 est au 31 moins 1. Donc ce qui arrive si nous essayons de puis incrémenter que entier? Eh bien, nous allons aller de 2 à 31 moins 1, tout en bas de négatif 2 à la 31. Donc, ce débordement d'entier est quand vous gardez l'incrémentation, et, finalement, vous ne pouvez pas obtenir de plus et il vient enveloppe tout le chemin du retour autour d'une valeur négative. Qu'en est-il un débordement de tampon? Ainsi, un tampon overflow-- rappelez-vous ce qu'est un tampon est. Il est juste un morceau de mémoire. Quelque chose comme un tableau est un tampon. Ainsi, un débordement de tampon est quand vous essayez d'accéder à la mémoire au-delà de la fin de ce tableau. Donc si vous avez un tableau de taille 5 et vous tenter d'accéder support de tableau 5 ou 6 étrier ou support 7, ou quoi que ce soit au-delà de la fin, ou même quoi que ce soit support de tableau below-- négatif 1-- tous ceux qui sont les débordements de tampon. Vous touchez mémoire dans de mauvaises manières. Question 23. Donc, dans ce dont vous avez besoin à mettre en oeuvre strlen. Et nous vous disons que vous pouvez Supposons s ne sera pas nulle, de sorte que vous ne devez pas faire un chèque pour nulle. Et il ya de multiples façons vous auriez pu faire cela. Ici, nous prenons juste le simple. Nous commençons avec un compteur, n. n est égal à comptent le nombre de caractères y sont. Nous commençons donc à 0, puis nous parcourir la liste entière. Est de support 0 égale à la caractère de terminaison nulle? Rappelez-vous que nous recherchons le caractère de terminaison null pour déterminer combien de temps notre chaîne est. Cela va mettre fin à toute chaîne concernée. Il en est de s support 0 égal à la terminaison nulle? Si il est pas, alors nous allons regarder de support 1, de support 2. Nous continuons jusqu'à ce que nous trouver la terminaison nulle. Une fois que nous l'avons trouvé, alors n contient la longueur totale de la chaîne, et nous ne pouvons tout simplement le retourner. Question 24. Donc ceci est celui où vous avoir à faire le compromis. Donc, une chose est bonne dans un manière, mais en quoi est-ce mauvais? Donc, ici, fusionner tend sorte à être plus rapide que tri à bulles. Cela dit that-- bien, il sont multiples réponses ici. Mais le principal est que la bulle sorte est l'oméga de n pour une liste triée. Rappelez-vous que la table nous venons de le voir plus tôt. Donc bulle trie oméga de n, le meilleur scénario est qu'il est capable d'aller un peu plus la liste une fois, déterminer hey cette chose est déjà triés, et retour. Tri par fusion, peu importe ce que vous le faites, est l'oméga de n log n. Donc, pour la liste triée, bulle Trier va être plus rapide. Maintenant, qu'en est-il des listes chaînées? Ainsi, une liste chaînée peut grandir et rétrécir à adapter autant d'éléments que nécessaire. Cela dit si that-- généralement la comparaison directe va être un lien la liste avec un tableau. Ainsi, même si les tableaux ne peuvent facilement grandir et rétrécir à adapter autant d'éléments au besoin, une liste chaînée par rapport à une une de array-- tableau a accès aléatoire. Nous pouvons en tout indice élément particulier de la matrice. Donc, pour une liste chaînée, nous ne pouvons pas suffit d'aller sur le cinquième élément, il faut parcourir depuis le début jusqu'à ce que nous arrivons à la cinquième élément. Et cela va nous empêcher de faire quelque chose comme la recherche binaire. Parlant de recherche binaire, binaire de recherche tend à être plus rapide que la recherche linéaire. Cela dit that-- si, une chose possible est que vous ne pouvez pas faire binaire rechercher sur les listes chaînées, vous ne pouvez le faire sur des tableaux. Mais sans doute plus important encore, vous ne pouvez pas faire une recherche binaire sur un tableau qui ne sont pas triées. Upfront vous pourriez avoir besoin pour trier le tableau, et alors seulement, peut vous faites une recherche binaire. Donc, si votre truc est pas triés pour commencer, puis recherche linéaire peut être plus rapide. Question 27. Ainsi, considérer le programme ci-dessous, qui sera dans la diapositive suivante. Et cela est celui où nous sommes allez vouloir indiquer explicitement les valeurs de certaines variables. Alors regardons cela. Donc, une seule ligne. Nous avons int x est égal à 1. Voilà la seule chose qui est arrivé. Donc, à la ligne une, nous voyons dans notre table, que y, a, b, et sont tous tmp noirci. Alors, quelle est x? Eh bien, nous venons de mettre ce égal à 1. Et puis la deuxième ligne, eh bien, on voit que y a la valeur 2, et la table est déjà rempli pour nous. Ainsi, x est 1 et y est égal à 2. Maintenant, la troisième ligne, nous sommes maintenant à l'intérieur de la fonction d'échange. Qu'avons-nous passons à échanger? Nous avons passé esperluette x pour un, et esperluette y pour b. Lorsque le problème plus tôt déclaré que l'adresse de x est 0x10, et l'adresse de y est 0x14. Ainsi, a et b sont égaux à 0x10 0x14 et, respectivement. Maintenant, à la ligne de trois, ce sont X et Y? Eh bien, rien n'a changé sur X et Y à ce point. Même si elles sont l'intérieur d'un cadre de pile principale, ils ont toujours le même valeurs qu'ils ont fait avant. Nous avons modifié aucun mémoire. Ainsi, x est 1, y est égal à 2. Bien. Alors maintenant, nous l'avons dit int tmp égale à jouer un. Ainsi, à la quatrième ligne, tout est la même, sauf pour tmp. Nous avons pas changé les valeurs de quoi que ce soit sauf pour tmp. Nous sommes en train de tmp égale à jouer un. Quel est l'étoile un? Eh bien, un des points de X, donc étoile à va à l'égalité de x, qui est de 1. Donc, tout est copié vers le bas, et tmp est mis à 1. Maintenant, la ligne suivante. Star une égale étoiles b. Ainsi, en ligne five-- bien encore tout, est la même quel que soit l'exception étoiles est un. Quel est l'étoile un? Eh bien, nous venons de dire est une étoile x. Nous allons donc changer x à l'égalité étoiles b. Quel est l'étoile b? y. b des points à y. Donc étoiles b est y. Donc, nous posant x égal à y, et tout le reste est le même. Ainsi, nous voyons dans la rangée suivante que x est maintenant 2, et le reste est juste copié vers le bas. Maintenant, dans la ligne suivante, étoile b est égale à tmp. Eh bien, nous venons de dire étoile b est y, si nous mettons en y égale à tmp. Tout le reste est le même, donc tout est copié vers le bas. Nous mettons en y égal au TMP, qui est une, et tout le reste est le même. Maintenant, enfin, la septième ligne. Nous sommes de retour dans la fonction principale. Nous sommes après swap est terminé. Nous avons perdu un, b, et tmp, mais finalement nous ne sont pas modifier les valeurs de quoi que ce soit à ce point, nous copions tout x et y descendre. Et l'on voit que x et y sont maintenant 2 et 1 au lieu de 1 et 2. Le swap a exécuté avec succès. Question 28. Supposons que vous rencontrez les messages d'erreur ci-dessous aux heures de bureau l'année prochaine, un CA ou TF. Conseiller sur la façon de fixer chacune de ces erreurs. Donc référence définie à GetString. Pourquoi pourriez-vous voir cela? Eh bien, si un élève utilise GetString dans leur code, ils ont bien compris hachage CS50 point h à inclure la bibliothèque CS50. Eh bien, qu'est-ce qu'ils besoin de corriger cette erreur? Ils ont besoin de faire un lcs50 de bord à la ligne de commande quand ils compilation. Donc, si ils ne passent pas clang tiret lcs50, ils sont ne va pas avoir la réelle code qui implémente GetString. Question 29. Déclarant implicitement fonction strlen bibliothèque. Eh bien maintenant, ils ne l'ont pas fait le bon hachage inclure. Dans ce cas particulier, le fichier d'en-tête ils ont besoin de comprendre est une chaîne point h, et comprenant le string point h, maintenant la student-- maintenant le compilateur a accès à la déclarations de strlen, et il sait que votre code utilise correctement strlen. Question 30. Plus de conversions pour cent que des arguments de données. Alors qu'est-ce? Eh bien se rappeler que ceux-ci pour cent signs-- comment elles sont pertinentes à printf. Ainsi, dans printf nous pourrions percent-- nous pourrions imprimer quelque chose comme pour cent i Backslash n. Ou nous pourrions imprimer comme pour cent i, espace, pour cent i, l'espace, pour cent i. Ainsi, pour chacune de celles signes de pourcentage, nous avons besoin passer une variable à la fin de printf. Donc, si nous disons parenthèse printf pour cent i Backslash n proches parenthèse, bien, nous disons que nous sommes va imprimer un nombre entier, mais nous ne transmettons pas printf un nombre entier de fait imprimer. Donc, ici plus pour cent conversions que les arguments de données? Cela disant que nous avons tout un tas de pourcentages, et nous ne disposons pas assez de variables pour réellement combler ces pourcentages. Et puis définitivement, à la question 31, certainement perdu 40 octets dans un des blocs. Donc, cela est une erreur Valgrind. Cela revient à dire que quelque part dans votre code, vous avez une allocation qui est de 40 octets grand pour vous malloced 40 octets, et vous ne le libéra. Très probablement, vous avez juste besoin de trouver une fuite de mémoire, et de trouver où vous devez libérer ce bloc de mémoire. Et la question 32, écriture invalide de taille 4. Encore une fois cela est une erreur Valgrind. Cela ne doit pas faire avec des fuites de mémoire maintenant. Ceci est, plus likely-- Je veux dire, il est une sorte de droit de mémoire non valide. Et plus probable que ce soit une certaine sorte de dépassement de mémoire tampon. Où vous avez un tableau, peut-être un tableau d'entiers, et nous allons dire qu'il est de taille 5, et vous essayer de toucher tableau 5 support. Donc, si vous essayez d'écrire pour que valeur, qui est pas un morceau de mémoire que vous avez réellement l'accès à, et si vous allez obtenir cette erreur, disant écriture invalide de taille 4. Valgrind va reconnaître que vous êtes en essayant de toucher la mémoire de façon inappropriée. Et voilà pour quiz0. Je suis Rob Bowden, et ceci est CS50.