[Powered by Google Translate] [Tutorial - Joc Problema 2] [Zamyla Chan - Harvard University] [Aquesta és CS50. CS50.TV] Està bé. Hola a tots i benvinguts a Tutorial 2. En primer lloc, vull felicitar a vostè per acabar conjunt de processadors 1. Sé que podria haver estat una mica difícil per a alguns de vostès, podria haver estat el seu primer programa d'ordinador que vostè va escriure, però recorda que al final d'això, quan un mira cap enrere al final del semestre, podràs veure pset 1 i que dirà, "Hey, jo podria haver fet que en 5 minuts". Així que coneix i confia que a finals d'aquest sempre trobaràs un conjunt de processadors molt simples. Però per ara és una gran fita, i felicitats per aconseguir que es facin. Ara, també una nota ràpida abans d'entrar a la carn del tutorial. Només vull fer una nota ràpida que a vegades no tenen temps suficient durant les visites guiades per anar a través de totes les formes possibles de fer el conjunt de problemes i en comptes només potser centrar-se en 1 o 2 tipus d'implementacions, maneres que vostè pot fer això. Però això no vol dir que està prohibit fer d'una altra manera. Sovint, com ocorre amb la informàtica, moltes maneres de fer les coses, i pel que definitivament no dubti en utilitzar un tipus diferent de solució del que va poder haver presentat. [Pset 2: Crypto - Zamyla Chan - zamyla@cs50.net] [Pset2 - 0. Una secció de preguntes - 1. César - 2. Vigenère] Està bé. Així problema 2: Crypto és una diversió. Un cop més, amb cada conjunt de processadors vostè començarà amb una secció de preguntes que portarà a terme en les seves seccions amb el seu company d'ensenyament assignat. No anirem a través d'aquests sobre el tutorial, però sens dubte l'ajudarà a completar el conjunt de processadors. Així que la primera part del conjunt problema és César. I així, en César algú li passi una tecla amb un nombre enter, i vostè xifrar una cadena de text que li proporcionen i tornar una mica encriptat. Si algú va veure una història d'Nadal, hi ha un exemple d'això allà. Llavors la segona part del conjunt de problemes és Vigenère, que és una tècnica de codificació més avançada. Així que anem a xifrar un text, excepte que en lloc de només un únic sencer, estem realment va a codificar amb una paraula clau que l'usuari ens proporcionarà. Bé, la primera eina en la caixa d'eines d'avui és en realitat estarà actualitzant l'aparell. Al tauler de discussió veuríem coses com: "Per què no funciona?" "Per què no se sotmet 50 treball?" i moltes vegades la solució és realment només per actualitzar el dispositiu. Així que si vostè acaba d'executar en una finestra de terminal en el seu aparell sudo yum-i - això és una bandera dient que sí, actualitzar tot - actualització, a continuació, l'aparell s'actualitzarà si cal. I no està de més si ja són a la versió més recent del dispositiu. A continuació, s'acaba de dir no hi ha actualitzacions noves disponibles i vostè pot seguir treballant al llarg. Però això és bo per a executar fins i tot cada vegada que obri l'aparell perquè estem encara molt - de vegades, si entrem en un error - reparar en l'aparell. Així que assegura't que tens la versió més recent del dispositiu actualitzar i executar que hi ha. Està bé. Així que ja que estem tractant amb lletres i canviant, xifrat coses, anem a voler realment a convertir-se en el millor amic de la nostra taula ASCII. N'hi ha nombrosos en línia, si vostè troba. Potser fins i tot fer el seu propi. Bàsicament, amb cada lletra i cada nombre i el caràcter de cada hi ha un nombre associat amb ells, i el que és bo per veure els seus valors ASCII juntament amb la carta actual. Que sens dubte l'ajudarà en el conjunt de problemes. Una cosa que realment em va ajudar en aquest conjunt de problemes era realment imprimir, i com jo estava passant, en realitat es basarà en ella, escriure: "Si això ha d'anar cap allà, llavors ..." Tipus de dibuixar sobre ella i marcar cap amunt, es converteixen en millors amics amb la seva taula ASCII. Llavors tenim alguna eina més a la nostra disposició. Aquesta vegada, en lloc de realment preguntar a l'usuari per tots els seus aportacions farem una combinació. Nosaltres anem a sol · licitar alguna entrada, però també utilitzarem només els arguments de línia de comandes. Així que quan s'executi el seu programa, en general li diuen. / Hola, per exemple, si el seu programa era hello.c. Però aquesta vegada, en comptes de dir això, es pot posar en paraules, arguments després. Així que farem servir tot el que passi a nosaltres com les seves aportacions, així, així d'anar més enllà de simplement preguntar completament, sinó també amb arguments de línia de comandes. I després entrarem a una matriu i cadenes, que estarem usant molt també. Això és només un exemple d'una taula ASCII mini. Com ja he dit, cada lletra correspon a un nombre, i així familiaritzar-se amb això. Això serà molt útil. I després, quan vam començar a fer algunes ASCIIMath tracta dels nombres - sumar, restar ells - llavors definitivament bo per referir-se a aquesta taula. Així que aquí està un exemple d'un xifrat César - una cosa que vostè va poder haver jugat. És només una roda. Essencialment, hi ha un alfabet exterior i llavors hi ha un alfabet interior. Així que aquí és un exemple de la xifra de Cèsar, però amb una tecla de 0. Essencialment, A està alineat amb A, B està alineat amb B, tot el camí fins Z. Però després diuen que volíem una clau de 3, per exemple. Després es gira la roda interior de manera que ara s'alinea amb una D, etc I això és bàsicament el que farem. No tenim una roda, però el que farem és fer que el nostre programa Aquest tipus de canvi de l'alfabet juntament amb nosaltres una certa quantitat de nombres. Així que com he dit abans, estarem tractant amb arguments de línia de comandes així com aconseguir un nombre enter. Així que la forma que l'usuari executi el programa de César és dient. / Caesar i després d'introduir un nombre després d'això. I aquest nombre representa la clau, el canvi, Quantes vegades estaràs girant la roda interior del seu sistema de xifrat César. I pel que veig aquí un exemple. Si entrem en les lletres de l'A a la L en el nostre sistema de xifrat César, llavors ho faria a través de l'entrada D O perquè és cada lletra desplaçat més de 3 vegades, igual que l'exemple de la roda que et vaig mostrar. Així que si has introduït, per exemple, tracta CS50! llavors també seria moure totes les cartes. I això és una cosa important en tant César i Vigenère és que passarem per alt les cartes no ho són. Així que tots els espais, personatges, etc, nombres, anem a mantenir igual. Només canviarem les lletres en aquest cas. Així que com veus a la roda, només tenim les cartes de què disposem, de manera que només vol canviar les lletres i xifrar les lletres. Així que el primer que ha de fer, hem vist que l'ús de Cèsar al problema 2 César és executar i escrigui un nombre quan s'executa al terminal. Així que el que hem de fer és aconseguir d'alguna manera que la clau i accedir-hi. I pel que volem veure d'alguna manera serà l'argument de línia d'ordres segona. La primera d'elles serà. / César, i la propera serà el número clau. Així que abans de tenir int main (void) per iniciar els nostres programes en C. Anem a pelar una capa una mica i veure realment que en comptes de passar en buit a la nostra funció principal en realitat estem tractant amb dos paràmetres. Tenim un int argc trucada i després una matriu de cadenes anomenat argv. Així argc és un nombre enter, i representa el nombre d'arguments passats al teu programa. I llavors argv és en realitat la llista dels arguments passats. Tots els arguments són cadenes, i així argv representa una matriu, una llista de cadenes. Anem a parlar sobre les matrius una mica. Les matrius són essencialment una estructura de dades nova. Tenim sencers, hem dobles, comptem amb cordes, i ara tenim les matrius. Les matrius són estructures de dades que poden emmagatzemar diversos valors del mateix tipus, tan essencialment, una llista de qualsevol tipus que desitgi. Bàsicament, si vostè vol una llista de nombres enters, tot en una variable, a continuació, ha de crear una nova variable que és de tipus array int. Així que les matrius són zero indexada, el que significa que el primer element de la matriu està en l'índex 0. Si la matriu és de longitud 4, com en aquest exemple, llavors l'últim element seria en l'índex 3, que és 4 - 1. Així que per crear la matriu, vostè faria alguna cosa com això. Diguem que vostè volia una doble filera. Això s'aplica a qualsevol tipus de tipus de dades, però. Així que dius que vols una doble filera. Diguem que vostè vol dir bústia. Igual que vostè podria inicialitzar qualsevol altra doble, et diria doble i després el nom, però aquest cop posem els claudàtors, i després el nombre no serà la longitud de la matriu. Tingueu en compte que en les matrius mai podem canviar la longitud, pel que sempre cal definir i triar quantes caixes, quants valors de la matriu es va a celebrar. Així que per establir diferents valors a la matriu, vostè va a utilitzar aquesta sintaxi següent, com es veu a la diapositiva. Té 0 Índex de bústia s'estableix en 1,2, Índex de bústia 1 set a 2,4, etc Així que ara que hem revisat arrays una mica, anem a tornar a argc i argv. Sabem que argv és ara una matriu de cadenes. Així, quan un usuari passa - diuen que estan executant un programa - que diuen. / hola David Malan, el que el programa farà per vostè ja és en realitat arribar al argc i argv són. Així que vostè no s'ha de preocupar per això. Argc en aquest cas seria de 3 ja que considera tres paraules diferents separades per espais. I així, llavors la matriu, en aquest cas, el primer índex seria. / Hello, la següent David, la Malan. Algú veu de seguida quina és la relació entre argv,  la matriu i argc és? Si. Anem a arribar a això en un exemple a args.c. A veure si podem treure profit de la relació entre la 2. Aquí pot trobar que en l'aparell l'aplicació per defecte per obrir arxius. c és de vegades Emacs. Però volem tractar amb gedit, així que el que vostè pot fer és fer clic dret sobre l'arxiu de C, hagi de Propietats, Obrir amb i, a continuació, escolliu gedit, en Selecciona per defecte, i ara el seu programa d'obrir gedit en lloc de Emacs. Perfecte. Així que aquí tinc un programa que vull imprimir cada argument de la línia d'ordres. Així que el que l'usuari introdueix, vull essencialment tornar de nou a ells en una nova línia. Llavors, què és una estructura que podem usar per iterar sobre alguna cosa - cosa que probablement usat en conjunt de processadors 1? Si vols anar a través d'un nombre establert de les coses? >> [Estudiant] Per bucle. Per bucle. Exactament. Així que anem a començar amb el bucle for. Tenim per int i = 0. Anem a començar amb una variable d'inicialització estàndard. Vaig a sortir de la condició d'un conjunt i després dir i + +, farem les coses allà. Està bé. Així que pensant en tornar a argv, si argv és la llista d'arguments passats al programa i argc és el nombre d'arguments al programa, llavors això vol dir que argc és essencialment la longitud de argv, dret, perquè no hi haurà tants arguments com el valor de argc. Així que si volem iterar sobre cada element de argv, anem a voler cada vegada que accedir a la variable en argv en l'índex donat. Que es pot representar amb aquest, oi? Aquesta variable representa aquí la cadena en particular, en aquest cas perquè és una matriu de cadenes - la cadena en particular en aquest índex donat. El que volem fer, en aquest cas volem imprimir, així que anem a dir printf. I ara argv és una cadena, de manera que volem indicar un marcador de posició allà. Volem una nova línia només perquè es vegi bé. Així que aquí tenim un bucle per. No tenim la malaltia encara. Així que comença a 0, i després cada vegada que es va a imprimir la cadena donada en aquest índex determinat de la matriu. Per això, quan volem deixar d'imprimir els elements de la matriu? Quan hem acabat, oi? Quan hem arribat al final de la matriu. Així que no desitja excedir més enllà de la longitud de la matriu, i ja sabem que no és necessari en realitat activament esbrinar quina és la longitud de argv és perquè ha donat a nosaltres, i el que és això? Argc. Exactament. Per això volem fer aquest nombre argc procés de vegades. No estic al directori correcte. Està bé. Ara farem args. No hi ha errors, la qual cosa és genial. Així que anem a executar args. Què és això tornarà a nosaltres? És només voleu imprimir de nou. "S'introdueixen arguments al programa, jo ho donaré a vostè." Així que diguem que volem dir args llavors foo bar. Així que el que s'imprimeix de nou a nosaltres. ¿D'acord? Així que és un exemple de com es pot utilitzar argc i argv sabent que argc representa la longitud de argv. Assegureu-vos que vostè no ho fa mai amb accés matrius d'un més enllà de la longitud de la matriu C perquè definitivament cridar a vostè. Vostè aconseguirà una cosa que es diu un error de segmentació, que mai és divertit, bàsicament dient que està tractant d'accedir a alguna cosa que no existeix, no li pertany a vostè. Així que segur, i sobretot amb el zero indexació, no vull - Com per exemple, si tenim una matriu de longitud 4, que l'índex de matriu de 4 no existeix, perquè comencem a 0, en l'índex zero. Es convertirà en una segona naturalesa igual que per als bucles quan comencem a 0. Així que tingues-ho en compte. Vostè no desitja tenir accés sempre que l'índex d'un array que està més enllà del seu abast. Així que podem veure ara com podem tipus d'accés els arguments de línia de comandes que es passen polz Però com va veure la cadena, el argv és en realitat una matriu de cadenes. Així que no és en realitat un enter encara, però en Cèsar volem tractar amb nombres enters. Per sort, hi ha una funció creada per nosaltres perquè en realitat es pot convertir una cadena a un enter. També aquí no estem tractant amb l'entrada de l'usuari en el que els està incitant per a l'entrada de la clau aquí, així que en realitat no pot reprompt i dir: "Oh, em donarà un altre nombre enter, per exemple, si no és vàlid." Però encara necessita verificar l'ús correcte. En César només se'ls permet passar a un nombre, i el que han d'executar. / César i després t'han de donar un nombre. Així argc ha de ser un nombre determinat. Quin nombre que seria si han de passar el. / Cèsar i després una tecla? Quin és argc? >> [Estudiant] 2. >> Dos. Exactament. Així que vostè vol assegurar-se que argc és 2. En cas contrari, bàsicament es neguen a executar el programa. En main és una funció que diu int main, així llavors sempre en 0 bon retorn pràctica al final d'un programa reeixit. Així que si, per exemple, et donen tres arguments de la línia d'ordres en lloc de 2 o et donen 1, per exemple, llavors el que vaig a fer és que vostè voldrà comprovar que i després tornar una dient, no, no puc seguir amb aquest programa. [Estudiant] No pot haver un espai en el text. >> Perdó? [Estudiant] No pot haver un espai en el text que està tractant de xifrar. Ah! Pel que fa al text que estem tractant de xifrar, que en realitat ve després quan donem aquest text. Així que ara només estem acceptant com a arguments de la comanda el nombre real, el canvi real per al xifrat de Cèsar. [Estudiant] Per què necessita 2 en lloc de només 1 argc? Definitivament hi ha un nombre. Dret. La raó per la qual necessitem per argc 2 en comptes de 1 és perquè quan s'executa un programa i diuen. / Cèsar o. / hola, que realment compta com un argument de línia d'ordres. Així que ja ocupa 1 i així llavors estem introduint un extra. Així que en realitat està introduint una cadena en l'argument de la línia d'ordres. El que vull fer, per Cèsar ens volen fer front a un nombre enter, perquè pugui utilitzar aquesta funció atoi. I en el fons, es passa a una cadena i després se li tornarà un enter si és possible fer aquesta cadena en un enter. Ara recordo quan ens enfrontem a coses printf o GetString, així, que inclouen les biblioteques que són específics per a nosaltres. Així que al principi vam començar amb un estàndard de hash tag d'E / S,. H, una cosa així. Bé, atoi no està dins d'una d'aquestes biblioteques, així que el que has de fer és que hem d'incloure la biblioteca de dret per a això. Així recordar de nou a Tutorial 1, on em vaig referir a la funció manual. Escrius home del teu terminal i després seguit pel nom d'una funció. I perquè, veureu la llista completa del seu ús, sinó que també el portarà fins a quin biblioteca que pertany. Així que ho deixo a vostè per utilitzar la funció manual amb atoi i esbrinar en quina biblioteca s'ha d'incloure per poder utilitzar la funció atoi. Així que tenim la clau i ara es tracta d'obtenir el text sense format, i de manera que realment serà la entrada de l'usuari en què suggeriran. Ens topem amb getInt i GetFloat, i així, en la mateixa línia estarem tractant amb GetString. Però en aquest cas no és necessari fer cap acord while o while per comprovar. GetString sens dubte ens donarà una cadena, i anem a xifrar que l'usuari ens dóna. Així que vostè pot assumir que totes aquestes cadenes d'usuari introduïts són els correctes. Gran. Així que una vegada que tens la clau i un cop que tens el text, ara el que queda és que cal xifrar el text en clar. Només per cobrir ràpidament en argot, el text pla és el que l'usuari li dóna, i el text xifrat és el de tornar-hi. Així cadenes, per ser capaç d'anar a través de realitat lletra per lletra perquè hem de canviar cada lletra, entenem que les cadenes, si és que tipus de pelar la capa, veiem que només són realment una llista de caràcters. Una ve després de l'altra. I així podem tractar les cadenes com arrays, ja que són conjunts de caràcters. Així que vostè té una cadena anomenada text, i dins d'aquest text variable s'emmagatzema Això és CS50. A continuació, el text en l'índex 0 seria una T majúscula, índex 1 seria h, etc I a continuació, amb les matrius, en l'exemple argc a args.c, vam veure que havíem de recórrer en iteració una matriu i pel que va haver de recórrer des i = 0 fins i és menor que la longitud. Així que necessitem alguna manera d'esbrinar el que la durada de la nostra cadena és si anem a iterar sobre ella. Per sort, un cop més, hi ha una funció allà per a nosaltres, encara que més tard en CS50 que sens dubte serà capaç d'aplicar i fer la seva pròpia funció que pot calcular la longitud d'una cadena. Però per ara utilitzarem longitud de la cadena, de manera que strlen. Es passa d'una cadena, i després se li retornarà un enter que representa la longitud de la cadena. Vegem un exemple de com podria ser capaç de repetir cada caràcter en una cadena i fer alguna cosa amb això. El que volem fer és iterar sobre cada caràcter de la cadena, i el que volem fer és que imprimim de nou cada caràcter 1 per 1 excepte afegir alguna cosa al seu costat. Així que anem a començar amb el bucle for. Int i = 0. Anem a deixar espai per a la condició. Volem recórrer fins arribar al final de la cadena, no? Llavors, ¿quina funció ens dóna la longitud de la corda? [Resposta dels estudiants inaudible] Aquesta és la longitud dels arguments de línia de comandes. No obstant això, per a una cadena que voleu utilitzar una funció que ens dóna la longitud de la cadena. Així que aquesta és la longitud de cadena. I llavors vostè ha de passar una cadena a la mateixa. Cal saber quina cadena s'ha de calcular la longitud d'. Així que en aquest cas estem tractant amb la cadena s. Gran. Així que el que volem fer, anem a printf. Ara, volem tractar amb els personatges. Volem imprimir cada caràcter individual. Quan vostè vol que imprimeixi un flotador, s'utilitza com a marcador de posició% f. Amb un int que faria servir% d. I així, de la mateixa manera, amb un caràcter% c s'utilitza per dir que em vaig a imprimir un caràcter que està emmagatzemat a l'interior d'una variable. Així que tenim això, i anem a afegir un punt i un espai per a això. Quin personatge estem utilitzant? Utilitzarem qualsevol naturalesa que som a la cadena. Així que estarem usant alguna cosa amb una corda, però volem estar accedint al caràcter cert allà. Així que si una cadena és només una matriu, llavors, com accedir als elements de les matrius? Comptem amb els claudàtors, i després posem l'índex d'allà. Així que tenim entre claudàtors. El nostre índex en aquest cas, només puc utilitzar. Exactament. Així que aquí estem dient que anem a imprimir un caràcter seguit d'un punt i un espai, i que personatge serà la lletra i en la nostra cadena s. Jo només vaig a salvar d'això. Bé. Ara em vaig a córrer longitud de la cadena. Així que vam tenir una cadena anomenada OMG, i ara s'ha emfatitzat encara més. De la mateixa manera, diguem que realment vol aconseguir una cadena de l'usuari. Com podem fer això? Abans, com hem arribat un int? Vam dir getInt, oi? Però això no és int, així que anem a GetString. Fem longitud de la cadena. Aquí no s'ha introduït el seu sistema específic. Així que no ho sé. Vaig a publicar el meu nom en l'aquí i llavors jo puc fer una d'aquestes coses on puc assignar una paraula per a cada lletra o alguna cosa per l'estil. Cool. Així que aquesta és la longitud de cadena. Així que estem de tornada a César. Tenim algunes eines sobre com iterar sobre una seqüència, com accedir a cada element individual. Així que ara podem tornar al programa. Com he esmentat abans, a la taula ASCII, el seu millor amic, veuràs els nombres que estan associats amb cada lletra. Així que aquí dir que el nostre text en clar és que estic marejat! A continuació, cada un d'aquests caràcters es tindrà un nombre i el valor ASCII associat amb ell, fins i tot l'apòstrof, fins i tot l'espai, fins i tot el signe d'exclamació, pel que vostè vol mantenir això en ment. Així que dir que la nostra clau que l'usuari inclòs en el seu argument de línia d'ordres és 6. Això vol dir que per a la primera lletra, que és, que està representat per 73, desitja tornar a qualsevol lletra està representada pel valor ASCII de 73 + 6. En aquest cas seria 79. Ara volem anar al següent caràcter. Així que el següent en l'índex 1 del text clar seria l'apòstrof. Però recordeu que només vol xifrar les lletres. Així que volem assegurar-nos que l'apòstrof en realitat segueix sent la mateixa, que no canviem de 39-45 el que és. Volem mantenir-lo com un apòstrof. Per això volem recordar a xifrar només les lletres perquè volem que tots els altres símbols de romandre sense canvis en el nostre programa. Una altra cosa que volem és preservar la capitalització. Així que quan vostè té una lletra majúscula, ha de romandre com una majúscula. Lowercases ha de romandre en minúscula. Així que algunes funcions útils per poder fer front a només lletres de xifrat mantenir i preservar la capitalització de les coses són les funcions islower isalpha, isupper,. I aquestes són funcions que retornen un valor booleà. Bàsicament, vertader o fals. És aquesta una majúscula? És aquesta alfanumèric? És aquesta una carta, essencialment. Així que aquí estan 3 exemples de com es pot utilitzar aquesta funció. Bàsicament, es pot comprovar si el valor retornat per la funció és veritable o falsa sobre la base d'aquesta entrada. O fer alguna cosa no xifrar o xifrar o assegureu-vos que es tracta de majúscules, etc [Estudiant] Pots explicar aquells una mica més i com s'utilitzen? >> Sí, segur. Així que si mirem cap enrere, aquí tenim una R majúscula, no? Així que sabem que serà O + 6 perquè és O. Però volem assegurar-nos que la O serà una capital d'O Així que, bàsicament, que és una espècie d'anar a canviar la nostra entrada. Així que si es tracta de majúscules o no vol canviar el tipus de forma de lluitar amb això. Així que si fem servir la funció isupper en aquest índex en particular, així isupper ("I"), que retorna veritable per a nosaltres, així que sabem que és superior. Així que sobre la base que, més tard anirem en una fórmula que s'utilitzarà per canviar les coses de César, Així que, bàsicament, serà una fórmula lleugerament diferent si es tracta de majúscules en contraposició a minúscules. Té sentit? Si. No es preocupi. He parlat una mica sobre com afegir 6 a una carta, que no acaba de tenir sentit excepte quan ens tipus d'entendre que aquests personatges són una mica intercanviable amb nombres enters. El que fem nosaltres és una mena de càsting d'ús implícit. Anirem a llançar una mica més endavant d'on es pren un valor i el converteixes en un tipus diferent del que originalment era. No obstant això, amb aquest conjunt de processadors que serem capaços d'utilitzar indistintament tipus de caràcters i els seus corresponents valors sencers. Així que si vostè simplement revestir un caràcter amb només les cometes simples, llavors vostè serà capaç de treballar amb ella amb nombres enters, que tracta com un enter. Així que la C majúscula es refereix a 67. F minúscules es refereix a 102. De nou, si vostè vol saber aquests valors, mira al teu taula ASCII. Així que entrarem en alguns exemples de com podria ser capaç de restar i sumar, com vostè pot realment treballar amb aquests personatges, els utilitzen de manera intercanviable. Jo dic que ASCIIMath es va a calcular l'addició d'un caràcter en un enter i tot seguit, mostra el caràcter resultant així com el valor ASCII resultant. Així que aquí estic dient - ens tornarem acord amb aquesta última part - però en el fons, estic dient que l'usuari ha de dir ASCIIMath executar juntament amb una clau, i jo dic que aquesta clau serà el nombre amb el que afegirem a aquest personatge. Així que aquí adonar que ja que estic demanant una clau, ja que estic demanant que m'estan donant una cosa, Només vull acceptar. / ASCIIMath i una clau. Així que vaig a exigir que argc és igual a 2. Si no és així, llavors em vaig a tornar una i el programa es tancarà. Així que estic dient la clau no serà l'argument de línia d'ordres en primer lloc, que serà la segona, i com pot veure aquí, Em convertir això en un nombre sencer. Llavors em vaig a posar a un personatge que es r. Observeu que el tipus de la variable CHR és en realitat un enter. La manera com sóc capaç d'utilitzar r com un enter és per tancar amb aquestes cometes simples. Així que tornem al nostre estat de printf en què tenim un marcador per un caràcter i llavors un marcador de posició per a un nombre enter, el caràcter es representa per la CDH, i el sencer és la clau. I llavors anem a afegir en conseqüència els 2 junts. Així que anem a afegir r + sigui quina sigui la clau és, i després anem a imprimir el resultat d'això. Així que farem ASCIIMath. És fins ara, així que anem a executar ASCIIMath. Oh, però mira, no fa res, perquè en realitat no ens donen una clau. Així que quan un acaba de tornar, la nostra funció principal, que acaba de tornar de nou a nosaltres. Així que anem a passar a una tecla. Que algú em doni un nombre. >> [Estudiant] 4. 4. Bé. Així r augmentar en 4 ens donarà v, que es correspon amb el valor ASCII de 118. Llavors és com que té sentit que - En realitat, et puc preguntar, què creu vostè que el valor ASCII de r és si r + 4 és 118? Llavors sí, r és 114. Així que si ens fixem en la taula ASCII i després, per descomptat, vostè veurà que r està representada per 114. Així que ara que sabem que podem sumar enters a caràcters, això sembla bastant simple. Només anem a iterar sobre una cadena com vam veure en l'exemple anterior. Anem a comprovar si es tracta d'una carta. Si és així, llavors ho canviarem pel que la clau és. Bastant simple, excepte quan s'arriba a agradar això, es veu que z, representat per 122, llavors li donaria un caràcter diferent. En realitat vol quedar al nostre alfabet, no? Així que hem de buscar la manera de tipus d'embolicar al voltant. En arribar a zed i desitja augmentar en un cert nombre, no vull entrar en més enllà de la secció alfabet ASCII; voleu ajustar de nou tot el camí fins A. Però tingui en compte que vostè està preservant el cas. Així que sabent que les lletres no poden convertir-se en símbols igual que els símbols no estaran canviant. En l'últim conjunt de processadors que definitivament no era necessari, però l'opció era implementar el seu pset cobdiciós amb la funció mòdul. Però ara estem en realitat va a haver d'utilitzar el mòdul, així que anem a anar sobre això una mica. Bàsicament, quan es té x mòdul i, que li dóna la resta de dividir x per i. Aquests són alguns exemples. Tenim un 27% 15. Bàsicament, quan es resta 15 del 27 tantes vegades com sigui possible sense arribar negatiu llavors vostè aconsegueix 12 sobres. Així que això és una mica com en el context de les matemàtiques, però com podem realment utilitzar això? Això serà útil per al nostre wrapover. Per això, anem a dir li vaig demanar a tots que es divideixen en 3 grups. De vegades ho fa en grup i alguna cosa per l'estil. Diguem que jo vaig dir: "Bé, jo vull que tots es divideix en 3". Com podria fer això? [Resposta dels estudiants inaudible] Sí, exactament. Compti. Bé. Farem això en realitat. Vols començar? [Estudiants comptant] 1, 2, 3, 4. Però recorda ... >> [Estudiant] Oh, ho sento. Aquest és un punt molt bo. Vas dir 4, però en realitat vull que diguis 1 perquè només volem 3 grups. Llavors, com - No, això és un exemple molt bo, perquè llavors, com pot vostè dir 1? Quina és la relació entre el 4 i 1? Bé, mod 3 4 1. Així que si vostè continua, vostè seria 2. Així disposem de 1, 2, 3, 1, 2. Un cop més, vostè és en realitat la 5 ª persona. Com saps que dir 2 en lloc de 5? Vostè diu mod 3 5 2. Vull veure quants grups de 3 es queda, llavors quin ordre sóc jo I llavors si continuem per tota l'habitació, llavors veuríem que en realitat sempre estem aplicant la funció mod a nosaltres mateixos comptar tipus de descompte. Aquest és un tipus més d'exemple tangible de com pot utilitzar mòdul perquè estic segur que la majoria de nosaltres hem passat per aquest procés on hem tingut que compte. Qualsevol pregunta sobre mòdul? Serà molt important entendre els conceptes d'aquesta, per la qual cosa pot mirar vostès entenen. [Estudiant] Si no hi ha resta, se li donarà el nombre real? Si un dels 3 primer d'ells ho havia fet, hauria donat el que realment eren, o l'hi han donat [inaudible] >> Això és una bona pregunta. Quan no hi ha resta per al mòdul - així que vostè té 6 mod 3 - que en realitat et retorna 0. Anem a parlar d'això una mica més tard. Ah, sí, per exemple, la 3 ª persona - 3 mod 3 és realment 0, però ella va dir 3. Així que és una mena de captura interna, per exemple, com bé, si el mod és 0, llavors jo seré la 3 ª persona. Però entrarem en una mena de com podem voler tractar amb el que 0 és tard. Així que ara que d'alguna manera tenen una forma de fer un mapa el zed a la lletra correcta. Així que ara que hem arribat a través d'aquests exemples, quin tipus de veure com Cèsar podria funcionar. Vostè veu els dos alfabets i després els veus canviant. Així que anem a tractar d'expressar que en termes de la fórmula. Aquesta fórmula es dóna realment a vostè en l'especificació, però bé anem a mirar a través del que significa cada variable. El nostre resultat final serà el text xifrat. Així que això ens diu que el caràcter d'ordre i del text xifrat va a correspondre al caràcter i-èsim del text pla. Això té sentit, perquè volem estar sempre alineant aquestes coses. Així que serà el caràcter d'ordre i del text xifrat k plus, que és la nostra clau - que té sentit - i llavors tenim aquest mod 26. Recorda quan vam tenir la zed nosaltres no volem entrar en el personatge, així que volia mod i el tipus d'embolcall al voltant de l'alfabet. Després de zed anirà a, b, c, d, fins que va arribar al nombre correcte. Així que sabem que zed, si + 6, ens donaria f zed perquè després ve a, b, c, d, e, f. Així que recordarem que sabem del cert que zed + 6 ens donarà f. En valors ASCII, z és de 122 i F 102. Així que hem de trobar alguna manera de fer que la nostra fórmula Cèsar ens donen 102 després de prendre en 122. Així que si només s'aplica aquesta fórmula, el% ('z' + 6) 26, que en realitat li dóna 24 perquè 122 + 6 és de 128, 128 26% li dóna 24 restants. Però això no vol dir realment f. Això definitivament no és 102. Això no és també la sisena lletra de l'alfabet. Així que, òbviament, hem de tenir alguna manera d'ajustar això una mica. En termes de l'alfabet corrent, sabem que z és la lletra 26 i F és la sisena. Però estem en ciències de la computació, per la qual cosa anem a índex a 0. Així que en lloc de z és el nombre 26, direm que és el número 25 perquè a és 0. Així que ara anem a aplicar aquesta fórmula. Tenim z representat per 25 + 6, el que li dóna 31. I 31 mod 26 li dóna 5 com una resta. Això és perfecte, perquè sabem que f és la cinquena lletra de l'alfabet. Però encara no és f, oi? Encara no és 102. Així que per aquest conjunt de processadors, el desafiament serà tractar d'esbrinar la relació entre la conversió entre aquests valors ASCII i l'índex alfabètic. Essencialment, el que vostè vol fer, vol començar amb els valors ASCII, però llavors vostè vol traduir d'alguna manera que en un índex alfabètic després calcular quina lletra ha de ser - bàsicament, el que el seu índex alfabètic és del caràcter de xifrat - després traduir això als valors ASCII. Així que si vostè fuet del seu taula ASCII, a continuació, tractar de trobar relacions entre, per exemple, 102 i 5 o el 122 i 25. Hem rebut la clau dels arguments de línia de comandes, hem rebut el text en clar, ho hem xifrat. Ara tot el que queda per fer és imprimir-lo. Podríem fer això un parell de maneres diferents. El que podem fer és imprimir en realitat a mesura que avancem. En iterar sobre els caràcters de la cadena, podríem simplement imprimir només en aquell moment quan el calculem. Com a alternativa, també es pot emmagatzemar en una matriu i tenen una sèrie de caràcters i al final iterar sobre aquesta matriu sencera i imprimir-lo. Així que tens un parell d'opcions per a això. I recorda que% c serà el marcador de posició per a la impressió d'un caràcter. Així que tenim Cèsar, i ara passem a Vigenère, que és molt similar a Cèsar, però només una mica més complex. Per tant, bàsicament amb Vigenère és que estarà passant en una paraula clau. Així que en lloc d'un nombre, tindrem una cadena, i pel que va actua com a paraula clau. Llavors, com sempre, arribarà l'avís d'una cadena de l'usuari i després xifrar i després donar-los l'esquena text xifrat. Així que com he dit, és molt similar a la de César, però en lloc de canviar per un cert nombre, el nombre és en realitat canviarà cada vegada d'un personatge a un altre. Representar que el nombre real de canviar, és representat per les lletres del teclat. Així que si s'introdueix en un canvi d'una, per exemple, a continuació, que correspondria a un canvi de 0. Així que és de nou per tornar a l'índex alfabètic. Quin podria ser útil si veient que en realitat estem tractant amb valors ASCII així com les lletres, així com l'índex alfabètic, potser trobar o fer la seva pròpia taula ASCII que mostra l'índex alfabètic de 0 a 25, az, i els valors ASCII de manera que vostè pot veure el tipus de relació i esbossar i tractar de trobar alguns patrons. De la mateixa manera, si vostè estava canviant en la instància determinada per f - i això és o bé f minúscula o majúscula - a continuació, que correspondria a 5. Estem bé fins ara? La fórmula de Vigenère és una mica diferent. Bàsicament, es veu que és igual que Cèsar, però en lloc de k tenim k sol índex j. Tingueu en compte que no estem usant i perquè en essència, la longitud de la paraula clau no és necessàriament la longitud del nostre text xifrat. Aquest serà una mica més clar quan veiem un exemple que tinc una mica més endavant. Bàsicament, si executa el programa amb una paraula clau de ohai, llavors això vol dir que cada vegada, ohai serà el teu torn. Així que depenent de quina posició està en la paraula clau, que canviarà el seu caràcter determinat text xifrat en aquesta quantitat. Un cop més, com Cèsar, volem assegurar-nos de preservar la capitalització de les coses i nosaltres només lletres xifrar i no caràcters o espais. Així que mirar cap enrere a Cèsar en les funcions que vostè va poder haver utilitzat, la manera com vostè decideix com canviar les coses, i aplicar això al seu programa aquí. Així que anem a mapejar això. Comptem amb un text clar que hem rebut per part de l'usuari de GetString En dir això ... CS50 és! Llavors tenim una paraula clau de ohai. Els 4 primers caràcters són bastant simples. Sabem que T serà desplaçat per O, llavors h serà desplaçat per h, i serà desplaçat per una. Aquí veiem que a representa 0, així, el valor final és en realitat la mateixa lletra que abans. Llavors s és desplaçat per i. Però llavors vostè té aquests períodes aquí. No volem que per xifrar, de manera que llavors no ho canvio per res i només imprimir el període sense canvis. [Estudiant] No entenc com saps que aquesta es desplaça per - D'on et - >> Oh, ho sento. A la part superior es veu que aquí la línia d'ordres ohai argument aquí, que serà la paraula clau. Així que, bàsicament, estàs amb bicicleta a través dels personatges de la paraula clau. [Estudiant] Així que o es desplaçarà el mateix - Així O correspon a un cert nombre en l'alfabet. [Estudiant] Dret. Però, d'on vas treure la part de CS50? Oh. Això està en GetString on vostè és com, "Dóna'm una cadena a codificar." [Estudiant] Ells et donaran aquest argument per canviar per i llavors us preguntarà la seva primera cadena. Sí >>. Així que quan s'executa el programa, s'inclouran la paraula clau en els seus arguments de línia d'ordres quan s'executa. Després, un cop que hagi comprovat que en realitat han donat una i no més, ni menys, llavors vostè va a sol · licitar una cadena, per exemple: "Dóna'm una cadena." Així que aquí és on en aquest cas s'ha donat aquesta ... CS50 és! Així que vas a utilitzar i l'ús que ohai i iterar. Recordeu que aquí ens saltem sobre l'encriptació dels períodes, però pel que fa a la nostra posició per ohai, el següent que fem servir o. En aquest cas és una mica més difícil de veure perquè és 4, així que seguirem una mica. Només queda't amb mi aquí. Llavors tenim i i s, que després es tradueixen per O i H, respectivament. Llavors tenim un espai, i així llavors sabem que no anem a xifrar els espais. Però cal notar que, en lloc d'anar a una en aquest lloc aquí, estem xifrant per un - no sé si es pot veure que - aquí mateix. Així que no és com si en realitat predeterminat, per exemple, o va aquí, h va aquí, una va aquí, em va aquí, o, h, a., i, o, h, a, i No facis això. Només canviar la seva posició en la paraula clau quan vostè sap que vostè està realment va a xifrar una lletra real. Té aquesta mena de sentit? Bé. Així que només alguns recordatoris. Vostè vol assegurar-se que només avançar a la següent lletra de la paraula clau si el personatge en el seu text pla és una lletra. Així que dir que estem al o. Ens adonem que el següent caràcter, l'índex i del text pla, és un nombre, per exemple. Llavors no avancem j, l'índex de paraules clau, fins a arribar una altra carta. Un cop més, vostè també vol assegurar-se que vostè envoltant al principi de la paraula clau quan ets al final de la mateixa. Si vostè veu aquí estem en i, el següent ha de ser o. Així que vostè vol trobar la manera de poder envoltant al principi de la paraula clau cada vegada que s'arriba al final. I de nou, quin tipus d'operador és útil en aquest cas per embolicar al voltant? Igual que en el recompte d'exemple. [Estudiant] El signe de percentatge. >> Sí, el signe de percentatge, que és mòdul. Així mòdul serà molt útil aquí quan voleu ajustar l'índex en el seu ohai. I només una pista ràpida: Intenta pensar d'embolicar sobre la paraula clau una mica com la de comptar, on si hi ha 3 grups, la persona quart, el nombre que va dir va ser 4 mod 3, que va ser d'1. Així que tractar de pensar-hi d'aquesta manera. Com es va veure en la fórmula, sempre que tinguis i després ci pi però després kj, vostè voldrà assegurar-se que vostè mantingui un registre de les persones. No cal que ho digui jo, no cal dir-j, però pot mirar el seguiment de la posició que vostè està en text pla en la seva així com la posició que vostè està en la seva paraula clau perquè aquests no són necessàriament serà el mateix. No només la paraula clau - que podria ser una longitud completament diferent del seu text clar. A més, el seu text clar, hi ha números i caràcters, pel que no va a coincidir perfectament junts. Sí [Estudiant] Hi ha una funció per alternar majúscules i minúscules? Es pot canviar una a majúscula? >> Sí, definitivament ho és. Vostè pot comprovar fora - Crec que és ToUpper, tota paraula 1. Però quan vostè està tractant de xifrar les coses i utilitzar el text, el millor és bàsicament tenir causes diferents. Si es tracta d'una majúscula, llavors vostè vol canviar per aquest perquè en la fórmula, quan un mira cap enrere com hem de tipus de govern indistintament entre la forma d'ASCII que representa els nombres i el mateix índex alfabètic, que vol assegurar-se que hi haurà algun tipus de patró que s'utilitzarà. Una altra nota en el patró, en realitat. Vostè serà sens dubte tractar amb nombres. Intenta no utilitzar nombres màgics, que és un exemple d'estil. Així que dius que vols alguna cosa cada canvi de temps per gust - Bé, per toc, un altre spoiler és quan vostè estarà canviant alguna cosa per cert, tracta de no representa que per un nombre real sinó més aviat tractar de veure si es pot utilitzar el valor ASCII, quin tipus de tenir més sentit. Una altra nota: Com que estem tractant amb fórmules, tot i que la seva TF se sap quin tipus de patró que podria estar usant, millor en la seva classe de comentaris d'explicar la lògica, com, "Estic fent servir aquest patró perquè ..." i la classe d'explicar el patró de manera succinta en els seus comentaris. [Aquest tutorial va ser 2] Si no hi ha altres preguntes, llavors em quedaré aquí una mica. Bona sort amb el seu conjunt de processadors 2: Crypto i gràcies per venir. [Estudiant] Gràcies. Gràcies >>. [Intro Mitjans Offline]