[Mūzikas atskaņošanai] ROB BODEN: Nu labi. Tātad, pirmā lieta, pirmkārt, video no pazīstama seja. [VIDEO PLAYBACK] -Labi. Tas ir CS50, un tas ir sākums nedēļas trīs. Piedod, ka es varētu būt ar tevi šodien, bet ļaujiet man iepazīstināt CS50 pašas Rob Boden. [END VIDEO PLAYBACK] [Aplausiem un ovācijām] ROB BODEN: in filmogrāfiju ka video ir fantastiska. Labi. Tātad, pirmkārt, tur ir vēl viens pusdienas. Tas ir rīt 01:15. Nav pusdienās šo piektdien. Tas ir ar Quora. Un Tommy šeit nav vēl, bet viens no cilvēki tur ir bijušais vadītājs CF, Tommy MCWILLIAM. Tāpēc viņš ir jautri puisis. Jums ir jānāk. Labi. Tāpēc pagājušajā nedēļā, mēs sākām pārrāvuma intervālu par to, virkne patiešām ir. Mēs esam pazīstami kopš gada sākuma, kas tas ir rakstzīmju secība. Bet pagājušajā nedēļā, mēs delved vērā faktu, ka tas, kas ir patiešām secība rakstzīmes, labi, mums tagad ir bloki rakstzīmes. Un mēs zinām, ka string, tas ir masīvs rakstzīmju, pašās beigās, mums ir šo īpašo null baitu, šis slīpsvītru 0, kas norāda beigas string. Un tā virkne ir masīvs rakstzīmes, bet mēs varam būt vairāk nekā tikai masīvs rakstzīmes, mēs varam būt masīvs jebkuru veida lieta, mēs gribam. Tātad, ja jūs atceraties no pagājušajā nedēļā, Vecumu programma, kas David ieviesta tiešām ātri. Tātad pirmā lieta, ko mēs gatavojamies darīt, ir pieprasīt no lietotāja par skaitlim, cilvēku skaits telpā. Pēc tam, kad mēs esam šo skaitli, mēs esam paziņojot masīvs. Pamanīt šo kronšteins sintaksi. Jūs gatavojas, lai pierastu pie tā. Tāpēc mēs esam paziņojot masīvs integers sauc par vecumu, un ir n veseli skaitļi šajā masīvā. Tāpēc šis modelis tieši šeit, šī 4 int i ir 0, i ir mazāks nekā n, i plus plus, kas ir arī būs modelis ka jums ir ļoti pieraduši. Tāpēc, ka tas ir diezgan daudz, cik jūs esat vienmēr būs atkārtot vairāk bloki. Tāpēc atcerieties, ka n ir garums mūsu masīvs. Un tāpēc šeit mēs atkārtoti lūdz par gadu vecuma persona, es telpā. Pēc tam, mēs ejam uz leju, un kāda patvaļīga iemesls, mēs pēc tam izdrukāt, cik veci viņi dodas lai gadu no tagad. Un darbojas šo programmu, pieņemsim veikt vecumu, dot Slash vecumu. Tātad cilvēku skaits telpā, pieņemsim, ka tur ir trīs. Un teikt, pirmais cilvēks, ir 13, Nākamais ir 26, un pēdējais ir 30. Tātad tas būs atkārtot pa šiem trim cilvēki, izdrukāt 14, 27, un 31. Tātad, atcerieties, ka tad, kad mēs paziņojam masīvs lieluma n, tad indeksiem, kas masīvs, masīvs ir vērtības un indeksiem 0, 1, 2, galam līdz n mīnus 1. Tātad, kad mēs teicām, ka bija trīs cilvēki telpā, un mēs ieliekam šeit Pirmo atkārtojumu caur šo cilpa, i būs 0. Tātad indekss 0. Mēs piešķirot pirmo vecumu lietotājs ievada. Tad nākamo, mēs ievadot Otrais n lietotājs ievada, un pie diviem, pēdējā n. Tāpēc paziņojums, ka masīva izmēru Trīs nav neko in indeksu trīs. Tas nav derīgs. Labi. Tātad, atgriežoties šeit. Tāpēc tagad, ka mēs esam nodarbojas ar masīviem, mums jau ir zināma. Tagad mēs esam gatavojas pāriet uz komandu argumentus, kas drīzumā būs diezgan attiecas uz šo problēmu kopumu. Tātad līdz šim, kad jūs esat pasludināja savu galveno funkciju, mēs esam teica int galvenais anulēts. Tāpēc spēkā neesošu tikai nozīmē, ka mums nav iet jebkurš argumenti, lai šo funkciju. Tagad mēs ejam, lai redzētu, ka main var veikt dažus argumentus. Šeit mēs tos saucam int argc un stīgu ARGV iekavās. Iekavas, atkal, norādot ka mums ir darīšana ar masīviem. Tātad šeit, stīgu ARGV kronšteini, mēs esam nodarbojas ar masīvu stīgas. Tā argc, kas notiek, lai norādītu cik argumenti mēs esam nodots šai programmai. Un saprast, ko tas nozīmē, pieņemsim aizveriet to. OK. Tātad līdz šim, mēs esam palaist katru programma, piemēram, dot slīpsvītra vecumu. Mēs varam arī pie komandrindas, garām caurlaide argumentus, tādējādi termins, komanda argumentus. Tātad pirmais arguments, hello pasaule. Tātad šeit, argc būtu trīs. Tas ir skaits no argumentiem pie komandrindas. Argc vienmēr ir vismaz 1, jo dot slash vecumu, sevi, skaitās kā viens no komandrindas argumentus. Tad Par ir pirmais. Ja dot slash vecumi ir 0., Tad sveiki, ir pirmais, un pasaule ir Otrajā komandrindas arguments. Tāpēc string argv, mēs ejam, lai redzētu, satur virknes, dot slīpsvītru vecumā, sveiki, un pasaule. Un, Dāvida lūguma, mēs ejam atskaņot video ievieš to. [VIDEO PLAYBACK] -Līdz šim programmās mēs esam rakstīts, mēs esam deklarēt Galvenais, kā int galvenais neesošu. Un visu šo laiku, ka par spēkā neesošu ir vienkārši ir norādot, ka Programmā neuzņemas nekādu atbildību komandrindas argumentus. Citiem vārdiem sakot, ja lietotājs palaiž programmu, viņš vai viņa var sniegt komandu argumentus, rakstot papildu vārdus vai frāzes, pēc tam, kad programma ir nosaukt uzvednē. Nu, ja jūs vēlaties, lai jūsu programmu, lai veikt komandrindas argumentus, vienu vai vairāk šādu vārdu, mums ir nepieciešams, lai aizstātu par spēkā neesošu ar pāris argumentiem. Tāpēc pieņemsim darīt. Iekļaut CS50.h. Ietver standarta io.h. Int galvenais. Un tagad, tā vietā, lai par spēkā neesošu, es esmu gatavojas norādīt int sauc argc, un masīvs virknes sauc par argv. Tagad, argc un argv ir vienkārši konvencijām. Mēs varētu būt sauc šie argumenti lielākā daļa kaut ko mēs gribam. Bet kas ir svarīgi ir tas, ka argc ir int, jo pēc definīcijas, tas ir gatavojas satur argumentu skaits, vārdu skaits kopumā, ka lietotājs ir ievadījis pie viņa vai viņas ātri. argv, tikmēr, arguments vektors ir būs tiešām ir masīvs glabāšanai visiem vārdiem, ka lietotājs ir drukāti pie viņa vai viņas ātri. Let 's pāriet uz kaut ko darīt tagad ar vienu vai vairākiem no šiem komandrindas argumentus. Jo īpaši, iesim uz priekšu un izdrukāt neatkarīgi no vārda lietotājs veidi Pēc programmas nosaukuma Kad tiek jautāts. Atvērt kronšteins. Aizvērt kronšteins. Printf procenti s slīpsvītru un komatu. Un tagad man ir nepieciešams, lai pastāstītu printf kāda vērtība plug vērā, ka vietturī. Es gribu pirmo vārdu, ka lietotājs ir drukāti pēc programmas nosaukuma, un tāpēc es esmu gatavojas, lai precizētu argv kronšteins 1, close iekavas, semikols. Tagad, kāpēc kronšteins 1 un ne kronšteins 0? Nu, izrādās, automātiski saglabāti in ARGV 0 būs programmas faktiskā nosaukuma. Tātad pirmais vārds, ka lietotājs Pēc programmas nosaukums ir, konvencija, būs uzglabā ARGV 1. Pieņemsim tagad apkopo un palaist šo programmu. Padarīt ARGV 0, dot slash ARGV 0. Un tagad vārdu, piemēram, sveiki. Enter. Un tur mums ir tā, sveiki. [END VIDEO PLAYBACK] ROB BODEN: Nu labi. Aizveriet to. Tātad, ņemot apskatīt šo programmu, mēs vienkārši ieviesti, lai mums, labi, tikai parādīt, ja mēs drukāt argv 0, pārliecinieties, tagad kas tas ir, argv 0, dot slīpsvītra argv 0. Tā, kā plānots, tas izdrukāšana Programmas nosaukums, jo argv 0 ir vienmēr būs Programmas nosaukums. Bet pieņemsim kaut ko darīt mazliet interesantāku. Tātad problēmu kopumu, jūs būsiet ieviesti, lai šo funkciju, atoi. Tātad, ko mēs izmantojam atoi atrast? Kas notiek, lai pārvērstu string līdz veselam skaitlim. Tātad, ja es iet virkni, viens divi trīs, līdz atoi, kas būs pārveidot ka veselam skaitlim, viens divi trīs. Tātad, mēs ejam, lai pārvērstu pirmais komandrindas arguments līdz veselam skaitlim, un tad tikai drukāt šo skaitli. Tātad būtībā, mēs esam veida reimplementing getint, tikai skaitlis ir jāievada vismaz komandu line vietā ar programmas interaktīvi. Tātad, veicot ARGV 0, pieņemsim do tas ir šeit, un aizveriet to. Tā darbojas ARGV 0, un pieņemsim ievadiet vesels skaitlis, kas ir viens divi trīs četri viens divi. Tā tas būs drukāt vesels skaitlis, kas ir viens divi trīs četri viens divi. Ir dažas nianses, lai atoi ka tas būs pārtraukt rūpējas par neko aiz derīgu ciparu raksturs, bet tas nav svarīgi. Tātad, ko jūs domājat, ka notiek ja es to izdarītu? Segmentāciju vaina. Tātad, kāpēc ir tā, ka? Ja paskatās atpakaļ uz mūsu programmu, mēs esam pārveidojot ARGV 1, pirmo argumentu pēc programmas nosaukuma, līdz veselam skaitlim. Bet nav arguments nodots pēc programmas nosaukuma. Tātad šeit mēs redzam, ka tas ir buggy programma, jo, ja mēs mēģināt palaist to bez jebkādiem argumentiem, tas būs tikai crash. Tātad vēl viens kopīgs raksts jūs redzēsiet ir kaut kas līdzīgs, ja argc ir mazāks nekā divi, norādot, ka nebija vismaz programmas nosaukumu un Pirmais arguments, tad mēs kaut ko darīt piemēram printf, nav pietiekami komandrindas argumentus. Tas droši vien nav labs, lai drukātu, tas ir iespējams, kaut kas, piemēram, jāievada vesels skaitlis pie komandrindas. Es ņemšu tikai beigās tur. Un pēc tam atgriezties 1. Tāpēc atcerieties, ka beigās mūsu programma, ja mēs atgriežamies 0, ka veida norāda panākumus. Un galvenais arī automātiski atgriež 0, ja jums nav. Tāpēc šeit mēs esam noskaņošana 1, lai norādītu ka tas nav panākumu. Un jūs varat atgriezties, ko vien vēlaties, tikai, 0 norāda panākumus, un kaut kas cits norāda neveiksmes. Tā ļauj vadīt šo versiju lietām. Tāpēc tagad, ja mēs neievadiet komandrindu arguments, tas būs pareizi pateikt mums, nepietiek komandrindas. Nav pabeidzis teikumu. Cits, ja mēs tiešām iet to par vienu, tā var pabeigt programmu. Tātad, tas ir, kā jūs varētu izmantot argc in lai apstiprinātu skaitu komandrindas argumentus, ka faktiski pagājis. Tāpēc pieņemsim šo programmu nedaudz vairāk sarežģīta, un apskatīt otrajā atkārtojuma lietas. Tāpēc tagad, mēs esam ne tikai drukāšanas Pirmais komandrindas argumentu. Lūk, mēs, atkārtojot no int i līdztiesīgu 0, i ir mazāks nekā argc, i plus plus, un poligrāfijas argv, indekss i. Tātad šis modelis, atkal, tas ir tas pats modelis kā iepriekš, izņemot vietā sasaukšanas mainīgo n, mēs izmantojam argc. Tātad šis ir atkārtojot katrā indekss masīvā, un drukāšanas katrs elements šajā masīvā. Un tā, kad mēs palaist šo programmu, labi, Man nav ievadiet jebkuru komandrindas argumentus, tāpēc tas tikai izdrukas programmas nosaukums. Ja es ievadiet ķekars lietas, tas būs drukāt vienu, katrs savā rindā. OK. Tātad, pieņemsim šo vienu soli tālāk. Un tā vietā, drukāšanas katru argumentu savā rindā, pieņemsim drukāt katru raksturu katra argumenta savā rindā. Tāpēc atcerieties, ka argv ir masīvs stīgas. Tātad, kas ir string, bet masīvs rakstzīmes? Tātad tas nozīmē, ka argv ir patiešām masīvs masīva rakstzīmes. Tātad, ņemot izmantot to, pieņemsim ignorēt šo tagad. Pieņemsim tikai apsvērt virkni ARGV 0. Tātad, ja mēs gribam, lai katru raksturu argv 0 savā rindā, tad es gribu darīt modeli, mēs esam pieraduši, i ir mazāks par garumu masīva, kas šeit ir strlen un, kas ir nav tas, ko es gribu darīt, stīgu s vienāds argv 0. So i ir mazāks par garums mūsu masīva, kas šajā gadījumā ir masīvs rakstzīmju, i plus plus. Un tā, kā mēs to redzējām pagājušajā nedēļā, tas ir ideāls ja mēs virzāmies, ka strlen ārpus stāvokļa, jo n būs pievienojot strlen no s katru reizi, kad mēs ejam caur cilpu, un tas ir nebūs mainās. Tāpēc mēs, kas to ir vienāda ar n pār šeit. OK. Tāpēc tagad mēs esam atkārtojot vairāk katrs indekss masīvā. Un tā, ja mēs vēlamies, lai drukātu katras raksturu šajā masīvs, procenti c ir karogu mēs vēlamies izmantot rakstzīmēm. Un tagad kronšteins i būs string, indekss raksturs i, tādēļ, ja string bija sveiki. tad s 0 būs h, s bracket 1 būs e, un tā tālāk. Tāpēc tagad mēs vēlamies apvienot šīs divas lietas. Mēs vēlamies, lai izdrukātu katru rakstzīmi Katras komandrindas argumentu. Tāpēc mēs esam nāksies ligzdotu uz cilpas. Un parasti, pirmais counter ir i, nākamais būs j, n būs strlen par ARGV I ir mazāks nekā n, i plus plus. Un tagad, nevis drukas ARGV i, lai argv kronšteins i gatavojas indeksu - kas būs i-th komandrindas arguments, argv i, j gatavojas būt JTH raksturs i-th arguments. Es atbrīvoties no šo up šeit un tagad jo mēs ielieciet to ka cilpa. Tā ir līdzvērtīga String s līdztiesīgu argv i, un pēc tam s bracket j. Nu, mums nav nepieciešams deklarēt šis mainīgais s. Tā vietā, mēs vienkārši apvienot šos divi par to, kas mums bija, ARGV i, j. SPEAKER 1: [nedzirdama]. ROB BODEN: Labs zvanu. Tāpēc tas ir bojāts. Ja es tiešām skrēja, mēs būtu ir sapratuši šo. Tāpēc counter Man rūp šajā īpaši cilpa ir j, iterator. Tātad jūs esat uzskriet problēmas, iespējams, bezgalīga cilpa, ja mēs nebija noteikts, ka. Tieši tāpēc mēs arī runājam par debugging šodien. OK. Tā ļauj palaist šo programmu. Un pieņemsim faktiski papildināt atsevišķu printf tepat, ka būs tikai drukāt cita līnija, jo tas nozīmē, ka tad, kad mēs palaist programmu, tur būs tukšs līnija starp katru raksturu katrs komandrindas arguments. Nu, mēs redzēsim, ko tas nozīmē. Oop. Ieguva dažas bug. Kļūda netieši paziņojot bibliotēkas funkciju strlen. Tā iet atpakaļ uz mūsu programmu, es aizmirsa hash iekļaut string.h. Tāpēc string.h būs header failu, kas apliecina, funkciju strlen. Labi, tas apkopo. Tagad, pieņemsim palaist to. Tā tikai to. Tas notiek, lai izdrukāt mūsu programmas nosaukums, hello world. Tas notiek, drukāt katru lieta, katrs raksturu, savā rindā. OK. Tāpēc pieņemsim faktiski izmantot šo vienu soli tālāk. Un tā vietā, lai izmantotu string.h, pieņemsim domāt par to, kā mēs gribētu ieviest mūsu pašu strlen funkciju. Tāpēc es uzreiz dotu funkcija paraksts. Tā ļauj zvanīt my_strlen, un tas ir gatavojas veikt virkni kā argumentu, un mēs sagaidām, lai atgrieztos garums šīs virknes. Tātad, kur ir tas puisis? Jā. OK. Līdz ar to atcerēties no iepriekšējās slaida, ka bija arī no pagājušajā nedēļā, ka masīvs rakstzīmes, labi, stīgu, tāpēc pieņemsim, ka tas ir mūsu virkne s. Tātad, ja s ir virkne, hello, tad, H-E-L-L-O, atmiņā, kas notiek, lai būt, un tad tas slīpsvītru 0 raksturs. Tātad, kā mēs varam iegūt garumu s? Nu, triks meklē to pretreakcijas 0 raksturu, šo null terminatoru. Tāpēc algoritms Gatavojas būs kaut kas līdzīgs daži pietiekami rakstzīmes, ka - pieņemsim ir šī roka ir daži skaitītājs, sauksim šo int garumu. Tātad, sākot ar vairāk nekā šeit, mēs esam gatavojas atkārtot pār mūsu virkni. Tātad pirmais simbols, tas ir H, un tas nav atpakaļ slash 0, tāpēc garums ir 1. Pārietu uz nākamo rakstura E, un tas nav slīpsvītru 0. Garums ir 2. L, 3. L, 4. O, 5. Un visbeidzot, mēs sasniedzam slīpsvītru 0, un tā, ka līdzekļi, arī, šī virkne ir beigusies. Tāpēc pieņemsim atgriezties 5. Tā faktiski īsteno, ka, pirmkārt, mans n garums ir vienāds ar 0, manas labās rokas. Un mēs esam gatavojas atkārtot - SPEAKER 1: [dzirdams] ROB BODEN: Ak, šaut. Labs zvanu. Boom. Tātad n garums ir vienāds ar 0. Tāpēc tagad, bet S garums nav vienlīdzīgu un pēc tam, reversā slīpsvītra 0. Līdz ar to atcerēties, šo slīpsvītru 0, tas ir faktiskais raksturs, un tas liecina par beigām virkni. Tāpat kā, arī, reversā slīpsvītra n ir faktiskais raksturs. Slīpsvītru 0 gatavojas, lai norādītu beigas mūsu virkni. Es nevēlos, lai kas tur. Un, lai gan s indeksētas ar garumā nav vienāds ar null terminatoru, tad mēs esam tikai gatavojas pieauguma garumu. Tātad, beigās mūsu programmas garums ir beidzot gatavojas būt 5 šajā gadījumā. Un mēs vienkārši atgriezties garumu. OK. Tāpēc tagad noteikti šeit, man nav do my_strlen. Pieņemsim apkopot to, lai pārliecinātos, viss norit raiti. Es biju dara 2? Vai arī bija tas, ka 1? Tas būtu jādara. Labi. Tātad šī ir argv 2. Darbojas kā paredzēts, lai gan bija tas, ka man to darīja? Jā. OK. Šī versija lietas nebija printf jaunā līnija pēc, bet tas nav nekādas atšķirības. OK. Tā strādāja kā gaidīts. Tagad mēs pat varam apvienot šo vienu soli turklāt, ja paziņojums šeit, labi, pirmkārt, mēs esam satveršanas strlen par ARGV i, un tad mēs esam atkārtojot vairāk katrs simbols šajā virknē. Tā vietā, lai to dara, kas notiks, ja mēs vienkārši apvienot šo loģiku gaida līdz brīdim, kad mēs hit slīpsvītru 0 tiesības uz to, lai cilpa? Tāpēc atkārtot, kamēr argv i, j dara nav vienāds slīpsvītru 0. Tā ļauj palaist to pirmo reizi. Labi. Tātad šeit, šis nosacījums saka - pieņemsim skaidrs, ka. Tāpēc tagad, lai tas būtu mūsu argv. Tātad, kad es tikko bija šo programmu iepriekš, argv ir masīvs stīgas. Un tā, ja es palaist to ar dot slash ARGV 2, sveiki pasaule, tad argv pati par sevi ir garums 3, lai ARGV nulle, sveiki, un pasaule. Un iekšpusē katru no šiem indeksiem ir, pats masīvs, ja tas būs dot, tas būs slīpsvītra, es nezinu ja tas ir pareizais virziens, es nedomāju, ka tas bija. -R-V domuzīme, nepieciešams vairāk vietas. Pieņemsim sagriež šajā masīvā. A-R-V dash 0, un pēc tam slīpsvītra 0. Un tad nekārtība būs sveiki. Teiksim, H-E slīpsvītru 0. Un, visbeidzot, W-O slīpsvītru 0. Tā algoritms, ko mēs tikko rakstīja, ligzdotu cilpas, ko viņi darot, mums vispirms ir cīnītos i un tad j. Tas būtu vieglāk ar kodu uz ekrāns, Iesim atpakaļ uz to. OK. Tāpēc paziņojums, ka man ir iterator, kas ir atkārtojot virs katras komandas line arguments. Un j ir iterator atkārtojot katrā rakstura, ka komandrindas arguments. Tātad, ko tas visdziļākais printf dara ir, mēs esam printf ARGV 0 0, printf argv 0 1 printf argv 0 2, 0 3, 0 4, 0 5, 0 6, bet tagad, argv 0 7 gatavojas vienāds slīpsvītru 0. Tad mēs izietu ka cilpa, un tagad es vairākkārt uzsvērts, līdz 1. Un tagad mēs esam gatavojas drukāt argv 1 0, argv 1 1 - labi, tagad, jo es samazināt sveiki sakot, argv 1 2 atkal būs slīpsvītru 0. Un tā, solis i un turpināt, un tā tālāk, kamēr mēs izdrukāt visus pasaulē, un tie ir trīs komandrindas argumenti, un mēs izietu no attālākajos cilpa, un pabeigtu mūsu programmu. OK. Tāpēc pieņemsim atgriezties šeit. Tātad, jūs iegūsiet daži familiaritāte ar komandrindas argumentus par šo Īpaša problēma noteikti. Tagad, debugging. Tātad, jūs, iespējams, jau bija jādara daži atkļūdošana ar savu iepriekšējo problēma noteikti. Un viens ļoti vienkāršs veids, debugging, pirmkārt, aplūkosim buggy programmu. Nu, ejot caur šo programmu, mēs spēsim pieprasīt no lietotāja skaitlis, greifers šo skaitlim, un pēc tam, patvaļīgi, mums ir kamēr cilpa, kas ir tikai gatavojas Samazināt i, kamēr tas ir vienāds ar 10. Pieņemsim tikai pieņemu, es esmu ienāk skaitlis, kas lielāks par 10. Tāpēc Samazināt es līdz tā ir vienāda ar 10. Un tad mums ir vēl viens kamēr cilpa ka, lai gan i nav vienāds ar 0, mēs gatavojas Samazināt i ar 3. Tātad, ja jūs redzat nodomu bug šeit, tas ir, ka tas būs Samazināt I ir 10, un pēc tam tas vienlaikus cilpa decrement i no 10 līdz 7, līdz 4, ar 1, negatīvu 2 līdz 5 negatīvs, un tā tālāk, negatīvu bezgalībai, jo es būs patiesībā nekad nav vienāds ar 0. Un tad beigās šīs programmas mums ir foo funkciju, kas ir notiek, drukāt, ka i. Tāpēc tas ir īss un niecīgs programma un kļūda ir acīmredzama, it īpaši pēc tam, kad es tikko sacīja kāda kļūda bija. Bet nodoms šeit ir labi, tas varētu tiešām izskatās daži no jūsu risinājumi no mantkārīgs no pēdējās problēma noteikti, un varbūt jums ir daži bezgalīga cilpa savu programmu, un jums nav ne jausmas to, kas izraisa to. Tāpēc ļoti noderīga debugging paņēmiens ir vienkārši pievienot printfs pa visu kodu. Tātad, šeit es gribu printf ārpus Pirmais kamēr cilpa. Un šeit es gribu printf, un es ņemšu tikai drukāt i. Es pat darīt vispirms, kamēr cilpa, i. Ārpuses, otrais kamēr cilpa. Vēlreiz, drukāt iekšā no šejienes, vērtību i. Un pieņemsim palaist šo. Tāpēc dot slash atkļūdošanas. Ievadiet skaitli. Darīsim 13. Un uzplaukums. Mēs redzam, ka mums ir bezgalīgs looping iekšpusē otrā kamēr cilpa. Tātad tagad mēs zinām, kas bug ir. Bet printf atkļūdošana ir pilnīgi liels, bet tad, kad jūsu programmas nokļūt garāks un sarežģītāks, ir sarežģītākus risinājumus kļūst lietas strādā. Tā ļauj noņemt visus šos printfs. Un pieņemsim, pārliecinieties, ka man nebija pārtraukums neko. OK. Tāpēc programma, mēs ejam ieviest sauc GDB, GNU Debugger. Nu, patiesībā, pieņemsim noņemiet Debug otrkārt, un padarīt atkļūdot vēlreiz. Nu, patiesībā, pirmkārt, laba mācība komandrindas argumentus. Ievērojiet, ka šī šķindēt komanda, kas ir apkopojot viss tiek nodots pie komandrindas, šie komandrindas argumentus. Tātad, kā tieši jūs būs izmantojot komandrindas argumentus, kā mēs agrāk, un kā jūs ar PSET 2, kas ir kā šķindēt izmanto tos. Tā ievēroju, ka šī pirmā karogu, domuzīme ggdb3, ko tas saka ir, šķindēt, Jums vajadzētu apkopot šo failu ar nodoms, ka mēs galu galā nepieciešams, lai atkļūdot to. Tik ilgi, kamēr jums ir, ka karogu, tad mēs varam GDB debug. Un tas būs atvērt GNU Debugger. Tāpēc ir daudz komandu kas jums ir nepieciešams, lai pierastu pie. Pirmais, ka jūs, iespējams, Nekavējoties nepieciešams, ir Run. Tātad, kas ir Run gatavojas darīt? Tas notiek, lai sāktu savu programmu. Tā darbojas, sākot programmu, programmu jautā mums veselam skaitlim, 13. Un tad tas ir bezgalīgs looping kā gaidāms, izņemot es izņemta printfs, tāpēc mums nav pat redzēt, ka. Iziet normāli. Oh. Tas ir iespējams, ka tas ietīts viss otrādi, atpakaļ - ignorējot to. Pieņemsim, ka nav izejas normāli. Tur ir sarežģīti atbildēt uz šo. Tāpēc tagad, tas nav ļoti noderīgs. Tik vienkārši darbojas mūsu programma iekšpusē tas atkļūdotājs nepalīdz mums nevienā veidā, jo mēs varētu būt tikko veikts dot slash atkļūdot no ārpuses gdb. Tātad viena komanda, kas Jūs, iespējams, - un es atmest šo. Control-d vai atmest, gan darbu. Tātad, pieņemsim sākt to atkal. Vēl viena komanda, ka jūs, iespējams, uzreiz gribu pierast ir Break. Tāpēc mēs pauze pie galvenā tagad, un tad es paskaidrošu, ka. Nu, šeit mēs redzam, mēs noteikti pārtraukumpunkts šajā rindā debug.c. Tātad, kas pārtraukums nozīmē ir tā, ka tad, kad es tipa palaist, programma būs turpina darboties līdz Es hit pārtraukumpunkts. Tātad, kad es hit palaist, programma sākas, un tad tas salūst, tiklīdz tā ienāk galvenā funkcija. Break galvenais būs kaut Jūs diezgan bieži darīt. Un tagad, lai jūs iepazīstināt ar dažiem vairāk komandu. Ievērojiet, šeit, ka tas ir saprotams, mēs pārtrauca at line 11, kas printf, ievadiet skaitli. Tāpēc komanda Next būs kā mēs ejam uz nākamo rindiņu kodu. Tas notiek, lai ļautu mums soli izmantojot mūsu programmu pozīcijai. Līdz ar to nākamajā. Tagad līnija 12, mēs ejam lai iegūtu skaitlim. Nākamais. Un, ja jūs vienkārši hit Enter vēlreiz, tas būs pārtaisīt pēdējā lieta, jūs. Tāpēc man nav nepieciešams ierakstīt blakus katru reizi. Tātad ievadīt vesels skaitlis, 13. Tāpēc tagad, līnija 14, bet man ir lielāka nekā 10, un es darīšu tālāk. Un mēs redzam, mēs ejam, lai Samazināt i. Tāpēc mēs esam gatavojas samazinājums ir i vēlreiz. Tāpēc tagad, vēl viens lietderīgs komanda Print. Tāpēc Print gatavojas izdrukāt mainīgā vērtība. Pieņemsim izcelt vērtību mainīgā i. Pieņemsim drukāt i. Tas notiek, lai saka, man ir 11. Tagad mēs Next vēlreiz, i ir lielāka par 10. Tāpēc man ir vēl lielāka nekā 10, jo tas ir 11. i mīnus mīnus. Pieņemsim drukāt es atkal. Kā jau bija gaidāms, tas ir 10. Tāpēc tagad, blakus. Tas dodas atpakaļ uz stāvokli, i ir lielāks par 10, bet tagad i ir 10, tāpēc tas nav lielāks par 10, tāpēc mēs sagaidām tas izkrist kamēr cilpa. Un tagad mēs esam zem šīs līnijas kodu. Un citu komandu sarakstā, ir tikai gatavojas lai parādītu iepriekšējo un nākamo pāris rindiņas kodu, kas Gadījumā, ja jūs pazaudējis sevi. Tātad mēs vienkārši pameta to, kamēr cilpa, un tagad mēs esam nonākuši šajā kamēr cilpa, 18 līnija. Tāpēc, kamēr i nav vienāds ar 0. Un nākamais, i ir vienāds ar i mīnus 3, un mēs paziņojums, tas būs tikai glabāt notiek. Un mēs varam drukāt i. Katra komanda veida ir īsceļus. Tāpēc p ir īss Print. Tātad, mēs varam p i. Tikai glabāt saimniecībā n, vai saglabāt darot Tālāk. Drukāt es atkal. Jūs redzat tagad tas ir negatīvs 167. Tāpēc tas iet uz visiem laikiem, bet ne patiešām uz visiem laikiem, jo ​​jūs vienkārši redzēja, ka faktiski beigsies kādā brīdī. Tāpēc, ka sāk GDB. Bet pieņemsim darīt vēl viena lieta gdb. Uh, atkļūdot. Tātad, šajā konkrētajā gadījumā bezgalīga cilpa gadījās būt iekšpusē galvenā funkcija. Un tagad, tikai pieņemt, ka, ka es esmu gatavojas pārvietot bezgalīgu cilpu uz foo funkcija. Tikai atceraties, ka beigās šis programma, labi, tas bija sākotnēji zvanot foo, kas bija tikko gatavojas drukāt i. Bet tagad mēs esam aicinot foo, kas ir gatavojas Samazināt i, līdz tas ir 0, un tad izdrukāt šo mainīgo. OK. Saglabājiet to. Veikt debug. Un tagad, gdb atkļūdošanas. OK. Tātad, ja es tikai palaist, tad es neesmu gatavojas faktiski jāspēj soli pa manu Programma line-by-line. Tāpēc pieņemsim pārtraukumu galvenais, un pēc tam ierakstiet palaist. Tā iet caur to, printf, ievadiet ir vesels skaitlis, iegūtu vesels skaitlis, 13. Tāpēc mēs esam gatavojas glabāt decrementing līdz i ir lielāka par 10. Tad mēs ejam, lai izkrist pa kamēr cilpa, un saņemt uz līnijas - pieņemsim atveriet to atsevišķā logā. Tāpēc mēs dzēsta, kamēr man vairs nebija lielāka par 10, un pēc tam, mēs sauc funkciju, foo. Tātad, kas ir noticis, tiklīdz es hit funkcija foo, labi, es sauc foo, un tad man vairs nebija kontrole pār gdb. Tā, tiklīdz es hit Tālāk šajā līnijā, viss turpinājās līdz tas notika, kad programma iziet, kad - pieņemu, ka nepastāvēja galā. Tu redzēji to pauzes mazliet though. Tātad, kāpēc es zaudēt kontroli pār programma šajā brīdī? Nu, kad es tipa nākamais, kas iet uz burtiskā nākamais rindā kodu, kas veiks. Tātad, pēc līnijas 21, nākamais rindā kodu kas veiks ir līnija 22, kas, izejot no galvenā. Tāpēc es nevēlos, lai tikai iet uz nākamo līniju kodu. Es gribu iet uz funkciju, foo, un tad arī soli pa šīs rindiņas kodu. Tāpēc, ka mums ir alternatīva. Pieņemsim atmest vēlreiz. Break galvenais. Uh, 1, nākamais, nākamais, 13, blakus, nākamais, nākamais, uzmanīgi, pirms mēs hit līniju foo. OK. Tāpēc tagad, mēs esam rindā 21, kur mēs saucam foo. Mēs negribam rakstīt nākamo, jo tas vienkārši izsauktu funkciju foo, un iet uz nākamo līniju kodu. Ko mēs vēlamies izmantot, ir solis. Tātad tur ir atšķirība starp Step un Next, kur solis soļi darboties, un Next iet pār funkciju. Tas tikai izpilda visus ar funkciju un tur notiek. Tāpēc Step gatavojas mūs uz funkciju, foo. Un mēs redzam šeit, tagad mēs esam atpakaļ Tas savukārt cilpa, kas ir teorētiski gatavojas turpināt mūžīgi. Un, ja jūs hit rīcībai gadījumos, kad nav pat funkcija, lai izsauktu, tad tas ir identisks Next. Tāpēc tas ir tikai tad, kad jūs esat ar līniju, kas zvana funkciju šo soli gatavojas atšķirties no Next. Tā solis dos mums šeit. Soli, soli, soli, soli, soli, soli, un Mēs vienkārši bezgalīga cilpa uz visiem laikiem. Lai jūs varētu pierast, ka jūsu veids, kā noteikt bezgalīgas cilpas, ir vienkārši turot šo Enter taustiņu redzēt, kur Jums ir iestrēdzis. Ir labāki veidi, kā darīt, bet tagad, tas ir pilnīgi pietiekami. Un stilistiski, lai atbilstu stilu 50, es būtu darījis. OK. Tātad viens pēdējais komandu ieviest. Nu, pieņemsim GDB debug collas Tā vietā, lai sadalītu par galveno, ja es zināt foo funkcija ir arī problēma, tad es varētu būt tikai teica, pārtraukumu foo vietā. Pieņemsim, ka es pārtraukumu gan galvenais un foo. Tātad jūs varat iestatīt tik daudz kontrolpunkti kā jūs vēlaties. Kad es tipa palaist, tas būs apstāties pie - ooh, pieņemsim recompile, jo Es mainījušies lietas. Jūs redzat šo līniju, brīdinājuma, avots fails ir jaunāks par izpildāmā. Tātad tas nozīmē, ka es devos šeit un maina tos, lai atbilstu stilu 50, bet man nebija recompile programmu. Tāpēc GDB man liek apzināties, ka. Es atmest, veikt atkļūdot atkal, hit gdb debug. OK. Tāpēc tagad, atpakaļ uz to, ko es daru. Break galvenais, break foo. Tagad, ja man palaist programmu, tāpēc tas ir turpinās līdz brīdim, kad hits pārtraukumpunkts. Kas pārtraukumpunkts notiek būt pirmā at main. Tagad, nevis darīt nākamo, nākamais, nākamais, nākamais, nākamais, līdz brīdim, kad es hit foo, es var ierakstīt arī turpmāk, kas turpināsies līdz jūs hit nākamo koncentrācija. Man ir, lai ievadītu skaitlim pirmās. Turpināt turpināsies līdz I hit Nākamais kontrolpunkts, kas ir tas, ka funkcija foo. Tāpēc Run darbosies līdz jūs hit robežvērtība, bet jums ir tikai rakstīt palaist, kad jūs sākat programmu, un pēc tam, No tā laika, tas ir jāturpina. Ja es tikko bija pauze galveno un tad skrēja, tas būs pārtraukums galvenais, un pēc tam turpināt. Jo man nav lūzuma punkts, foo, ievadiet vesels skaitlis, tad tagad es esmu nebūs pārtraukumu foo. Tas ir tikai gatavojas bezgalīgs cilpa, kamēr šis. OK. Tātad tas ir Intro gdb. Jums vajadzētu sākt to Jūsu problēmu kopas. Tas var būt ļoti noderīga noteikt bugs. Ja jūs tiešām tikai, line-by-line, go ar savu kodu, un salīdzināt to, kas ir patiesībā notiek ar to, ko jūs sagaidāt varētu notikt, tad tas ir diezgan grūti palaist garām savas kļūdas. OK. Tāpēc pagājušajā nedēļā Dāvids uzaudzis šajā noslēpums atslēgas kriptogrāfiju stuff Pirmo reizi, kad mēs negribam paroles vienkārši glabāt uz mūsu Datoru kādā teksta failu, kur kāds var nākt atkal un tikko atveriet to un lasīt tos. Ideālā gadījumā tās būtu šifrēti kaut kādā veidā. Un Problēma Set 2, jums būs darīšana ar vienu metodi šifrēšanu, vai, labi, divas metodes, bet tie nav tik liela. Ja jūs hacker izdevums, tu esi arī būs darīšana ar atšifrēšanas dažas lietas. Tātad jautājums tagad ir labi, pat tad, ja mums ir spēcīgākā šifrēšanas algoritms pasaulē, ja jūs izvēlaties Īpaši slikts paroli, tad tas nepalīdzēs jums ļoti daudz, jo cilvēki joprojām būs iespēja, lai skaitlis tas. Pat tad, ja redzot šifrētu virkni un tas izskatās kā haoss atkritumu tas nozīmē, ka nekas viņiem, ja viņi joprojām ir tikai nepieciešams, lai mēģinātu dažas paroles skaitlis tas, tad jūs nav ļoti droša. Tātad, skatoties video, kas padara šo jautājumu. [VIDEO PLAYBACK] -Ķivere, tu velns. Kas notiek? Ko jūs darāt, lai manu meitu? -Ļaujiet man iepazīstināt izcili jauni plastikas ķirurgs, Dr Phillip Schlotkin, lielākais deguns darba cilvēks visā Visumā, un Beverly Hills. -Jūsu Augstība. -Nose darbu? Es nesaprotu. Viņa jau bija deguns darbu. Tas bija salds sešpadsmit klāt. -Nē. Tas nav tas, ko tu domā. Tas ir daudz, daudz sliktāk. Ja tu nedod man kombināciju gaisa vairogs, Dr Schlotkin būs dot savu meitu atpakaļ savu veco degunu. -Nē. Kur Jūs ieguvāt, ka? -Labi. Es jums saku. Es jums saku. Nē, tētis. Nē, tu nedrīksti. -Tu labi, mana mīļā. Es garām savu jauno degunu. Bet es ne viņam pateikt kombināciju, vienalga ko. -Ļoti labi. Dr Schlotkin, vai jūsu vissliktākais. -Mans prieks. [TOOLS TIEK uzasināti] -Nē. Gaidīt. Gaidīt. Es jums saku. Es jums saku. -Es zināju, ka tas varētu strādāt. Labi. Dodiet to man. -Kombinācija ir viens. -One. -One. -Two. -Two. -Two. -Trīs. -Trīs. -Trīs. -Four. -Four. -Four. -Five. -Five. -Five. -Tātad kombinācija ir viens, diviem, trim, četriem, pieciem. Tas ir stulbākais kombinācija Es kādreiz dzirdējis manā dzīvē. Tas ir sava veida lieta idiots būtu viņa bagāžu. -Paldies, Jūsu Augstība. -Ko jūs darījāt? -Es izslēgts sienas. -Nē jums nav. Jūs izslēgts visu filmu. -Man ir nospiests nepareizs pogas. -Nu, ielieciet to atpakaļ. Ielieciet filmu atpakaļ. -Jā, kungs. Jā, kungs. -Iesim, Arnold. Nāc, Gretchen. Protams, jūs zināt, es ņemšu vēl ir rēķinu par to. [END VIDEO PLAYBACK] ROB BODEN: Nu labi. Tāpēc tagad, ka mēs jau runājam par drošības dažos veidos, jauki maz filmu plakātu, tāpēc nesen dienas, šie jautājumi ar VDI uzraudzīt visu. Tas var būt grūti justies kā jūs ir dažas privātās dzīves veida, kas tiešsaistes pasaulē, lai gan es nevaru pateikt jūs visvairāk detaļas prizmu. Tātad, ejot tālāk PRISM, mēs nebrauksim , runā par to, ka tagad padomājiet par jūsu klēpjdators. Tātad šeit, es vēlos, lai pārslēgtos uz manu faktisko kontu, ar manu maz pingvīns. Tāpēc man ir parole komplektu, un ka parole ir kāds es gribu, lai to. Bet jāatceras, ka tas, ko es esmu piesakoties ar, tāpēc šī login ātru, ir dažas programmas. Tas ir sava programma, kas ir raksta kāda persona. Un tā, ka cilvēks, ja tie īpaši ļaunprātīga, tie varētu jau teicu, viss ir labi, tādēļ, ja parole ka man ir jāievada, ir vienāds ar manu faktisko parole, vai arī tas ir vienāds kādu īpašu paroli - Deivids ir laba, vai kaut kas - Tad ļaujiet viņiem iekšā Tāpēc ļaunprātīgs programmētājs varētu būt piekļuvi visiem jūsu Mac vai Logi, vai neko. Tāpēc, ka nav daudz bažas, jo, Es domāju, tas ir login programma kas ir piegādāta ar OS X, simtiem un tūkstošiem cilvēku ir pārskatīja šo kodu. Un tā, ja savu kodu kaut kur, jūs teikt, ja šī virkne vienāds vienāds Deivids ir laba, reģistrācija, tad kāds ir būs, piemēram, pagaidiet. Tas nav pareizi. Tas nedrīkst būt šeit. Tātad tas ir viens veids, kā mēs iegūtu lietas būt veida droša. Bet domāju par to pat programmām kas jums rakstīt. Pieņemsim, ka jūs wrote pieteikšanās programmu. Tāpēc šī pieteikšanās programma, kas jūs rakstījāt, Tātad, protams, jums ir labs programmētājs. Jūs neesat gatavojas nodot jebkādu ļaunprātīgu ja x ir vienāds vienāds Deivids ir laba savu kodu. Bet šī programma, ko jūs izmantot, lai apkopotu šo programmu? Kaut ko līdzīgu šķindēt. Tātad, ko tad, ja persona, kas noticis ar rakstīt šķindēt īpašs cased šķindēt kaut kas līdzīgs, ja es esmu apkopojot login programmu, tad ievadiet šo kodu uz pieteikšanās programmā, kas saka, ja x vienāds vienāds Deivids ir laba? Tāpēc ne gluži vēl, bet mums ir tas pats izdot šeit, kur šķindēt, labi, tūkstošiem, ja ne desmitiem tūkstošu cilvēki, paskatījos šķindēt, ir paskatījās tās koda rindiņas, un teica, labi, tur nekas slikts šeit. Acīmredzot, neviens dara kaut šis ļaunprātīga. Bet kas šķindēt sevi, piemēram, Ko darīt, ja es apkopot šķindēt? Ko darīt, ja man ir dažas kompilators, kas apkopo šķindēt kas ievieto uz šķindēt šis īpašais banalizēt, kas saka, labi, kad es apkopot šķindēt, tad izpildāmā man vajadzētu īpaši meklēt iekšpusē pieteikšanās programmas un ievietojiet Šī parole, vienāds vienāds Deivs ir laba? Tāpēc atcerieties, ka jūsu sastādītājs pati ir jāapkopo kādā brīdī. Tātad, ja tas, ko jūs izvēlaties, lai apkopotu šķindēt ar, pats par sevi nav ļaunprātīgs, tad jūs varētu būt ieskrūvē visu ceļu uz leju līniju. Tāpēc šeit mēs esam Ken Thompson un Dennis Ritchie. Tātad šis ir ikonu foto. Dennis Ritchie ir labajā pusē. Viņš ir galvenais - diezgan daudz rakstīja C. Tātad jūs varat pateicos viņam par šīs klases. Ken Thomson ir pa kreisi. Divi no tiem būtībā rakstīja UNIX. Nu, tie bija galvenie atbalstītāji UNIX. Bija daži citi. Tātad Ken Thompson, kādā brīdī, viņš uzvar Tjūringa balvu. Un Tjūringa balvu, es vienmēr esmu dzirdējis tas atsauce šādā veidā, tas ir Nobela balva datorzinātnēs. Tāpēc pie Tjūringa balvu, viņš ir dot savu pieņemšanas runu. Un viņš dod šo ļoti slaveno runu tagad sauc Pārdomas par uzticoties Uzticība, ko mēs esam saistīti Lai no kursa mājas lapā. Un šo runu, viņš saka, labi, tāpēc es uzrakstīju UNIX, un tagad visi Jūs cilvēki izmanto UNIX. Tagad, atcerieties, šodien, ka Linux ir tiešs pēctecis UNIX. OS X tieši izmanto UNIX. Windows nav tik daudz, bet daudz Ideju tika ņemti no UNIX. Lai viņš iet uz augšu uz skatuves un saka: labi, es uzrakstīju UNIX. Un tikai, lai jūs guys zināt, es esmu var pieteikties uz katru viens vienu no jūsu datoriem. Tā kā man kādu no šiem īpašajiem ja x vienāds vienāds Ken Thomson ir laba, tad es esmu atļauts pieteikties. Tātad cilvēki ir līdzīgi, labi, Kā tu to darīt? Mēs paskatījās pieteikšanās programmas un nekas tur ir. Viņš, piemēram, labi, es modificēts kompilators pieteikties pieteikšanās programmā lai pieteikšanās programma tagad būs ka x ir vienāds vienāds Ken Thompson ir laba. Un viņi saka, labi, tas nav taisnība. Mēs esam meklē kompilatoru, un kompilators nav neviena līnijas kodu, piemēram, ka. Viņš, piemēram, OK, bet tas, ko jūs esat Sastādot kompilators ar? Un viņi domā, un viņš, tāpat kā, labi, Es esmu tas, kurš tev kompilators jūs izmantojat, lai apkopotu kompilatoru, lai Jums ir apkopot kompilators, kas pati par sevi ir ļaunprātīga, un būs pauze pieteikšanās programmu. Tātad būtībā, tajā brīdī, tur ir nav veids, kā jūs varētu apskatīt avota kods pieteikšanās programmas lai redzētu, kas ir nepareizi. Jūs pat nevarēja ieskatīties pirmkods kompilators lai redzētu, kas ir nepareizi. Jums būtu nepieciešams, lai apskatīt mašīnas kods, faktiskais bināro no jāapkopo kompilators, lai redzētu, pagaidiet, tie rindas kods nedrīkst būt šeit. Bet Ken Thompson paņēma to vienu soli tālāk un teica, labi, ka ir šīs īpašās programmas, kas faktiski palīdzētu jums lasīt bināro programmu, un tāpēc, ja kāds izmanto šo programmu, lai lasīt bināro, viņi varētu redzēt šos koda rindiņas. Viņš modificēts šīm programmām teikt, visiem labi, ja jūs meklējat pie kompilatoru, neparāda ne šis konkrētais kopa bināro. Tā, tad jums ir nepieciešams pieņemt, ka soli tālāk, un būtībā, kas varētu būt veikti vairāki līmeņi inDirection, un kādā brīdī, neviens patiesībā būs pārbaudīt. Tātad stāsts morāles ir, jūs esat nebūs rakstiski Šķindēt šajā klasē. Jūs esat būs izmantojot kāpelēt Šķindēt daudz šajā klasē. Attiecībā uz visiem jūs zināt, šķindēt ir ļaunprātīga programma, kas ir sabotaging katru viena programma esat kādreiz apkopoti. Un atstāt jums, ka ļoti draudošs ņemiet vērā, redzēt jūs trešdien. [Aplausi] SPEAKER 2: Nākamajā CS50. SPEAKER 3: Vai jūs uzdrošinās teikt, ka. Jūs varat darīt. Jūs esat izdarījuši, pirms, jūs varat darīt Šodien, jūs rīt var izdarīt. Jūs esat bijis darot gadiem. Tikai iet tur un darīt to. Jūs varat darīt. [Mūzikas atskaņošanai]