[Powered by Google Translate] [Walkthrough - Set Problem 4] [Zamyla Chan - Universiteti i Harvardit] [Kjo është CS50. - CS50.TV] Dakord. Hello, të gjithë, dhe të mirëpritur të walkthrough 4. Sot pset ynë është Mjekësinë Ligjore. Mjekësinë ligjore është një pset vërtetë zbavitëse që përfshin trajtimin me fotografi bitmap për të zbuluar që kanë kryer një krim. Atëherë ne jemi duke shkuar për të resize disa fotografi bitmap, atëherë ne jemi gjithashtu do të merret me një pjesë të vërtetë zbavitëse quajtur Recover, në të cilën ne jemi dorëzuar në thelb një kartë memorie në të cilën dikush ka fshirë aksidentalisht të gjitha dosjet e tyre, dhe ne jemi duke kërkuar të shërohen ato fotografi. Por së pari, para se të merrni në pset, unë me të vërtetë vetëm dua të përgëzoj të gjithë. Ne jemi gati në midpoint e këtij kursi. Quiz 0 është pas nesh, dhe ne jemi në pset4, kështu që në thelb, ne jemi në gjysmë të rrugës. Ne kemi bërë një rrugë të gjatë në qoftë se ju shikoni prapa në psets tuaja, pset0 dhe pset1, kështu përgëzoj veten për këtë, dhe ne jemi duke shkuar për të marrë në disa gjëra me të vërtetë zbavitëse. Pra Toolbox tonë për këtë pset, përsëri, në vend që të konkurrojnë sudo yum-y përditësim, ne jemi në gjendje për të drejtuar vetëm update50 nëse ju jeni në versionin 17,3 dhe më lart i pajisjes. Pra, të jetë i sigurt për të kandiduar update50 - kjo është një shumë më e lehtë, një disa karaktere më pak - për t'u siguruar që ju jeni në versionin e fundit të pajisjes. Sidomos është e rëndësishme për update50 kur ne fillojmë duke përdorur CS50 kontroll. Pra, sigurohuni që ju të bëni këtë. Për të gjitha pjesët për këtë pset, ne jemi duke shkuar për të merret me fotografi inputeve dhe outputeve, të paraqesë I / O. Ne jemi duke shkuar për të shkuar mbi një shumë të programeve që merren me vargjeve duke treguar fotografi dhe gjëra si kjo, kështu që ne duam të sigurohemi që ne jemi me të vërtetë të njohur dhe të rehatshme që kanë të bëjnë me atë se si për hyrje dhe dalje në fotografi. Në kodin e shpërndarjes për këtë pset është një file i quajtur copy.c, dhe kjo është ajo që ne jemi duke shkuar për të gjetur do të jetë me të vërtetë të dobishme për ne sepse ne jemi duke shkuar për të përfundojë në të vërtetë kopjimi file copy.c dhe vetëm duke ndryshuar atë pak që të jetë në gjendje për të arritur para 2 pjesë të caktuar të problemit. Dhe kështu atëherë si e përmenda më parë, kemi të bëjmë me bitmaps si jpegs. Pra, me të vërtetë të kuptuarit e strukturës se si ato fotografi janë të organizuar, se si ne mund të vërtetë përkthehet 0s dhe 1s në structs dhe gjërat që ne në fakt mund të kuptojnë dhe interpretojnë dhe të redaktoni, që do të jetë me të vërtetë e rëndësishme, kështu që të shkojnë në JPEG dhe fotografi bitmap dhe të kuptuarit e strukturës së atyre. Pset4, si zakonisht, fillon me një pjesë të pyetjeve. Ata do të merren me dosjen e I / O dhe për të marrë ju për të mësuar se. Atëherë pjesë 1 është film detektiv, në të cilën jeni dhënë një skedar bitmap që duket lloj si pika të kuqe të gjithë. Dhe pastaj në thelb ajo që ne jemi duke shkuar për të bërë është të marrë këtë skedar dhe vetëm redaktoj atë pak në një version që ne mund të lexohet. Në thelb, një herë ne fund, ne do të kemi të njëjtën kartelë, përveç ne do të jetë në gjendje për të parë mesazhin e fshehur fshehur nga të gjitha ato pika të kuqe. Pastaj Resize është një program që, duke marrë parasysh një skedar dhe iu dha pastaj emrin e dosjes se rezultatet dhe pastaj jepet një numër, si edhe, vërtetë do të resize atë bitmap deri në atë vlerë integer. Pastaj së fundi, ne kemi pset shërohen. Ne jemi të dhënë një kartë memorie dhe pastaj duhet të mbulojë të gjitha fotot që janë fshirë aksidentalisht, por, si ne do të mësoni, nuk fshihet në të vërtetë dhe të hiqen nga dosja; ne vetëm lloj i humbur, ku ata ishin në fotografi, por ne jemi duke shkuar për të rimarrë atë. Madhe. Pra, të shkojnë në dosjen e I / O në mënyrë specifike, këto janë një listë e tërë e funksioneve që ju do të jetë duke përdorur. Ju keni parë tashmë një pak bazat e fopen, fread dhe fwrite, por ne do të shohim më tej në disa dosje I / O funksione të tilla si fputc, në të cilën ju shkruani vetëm një karakter në një kohë, të fseek, ku ju lloj i lëvizur treguesin e pozicionit fotografisë përpara dhe prapa, dhe pastaj disa të tjerë. Por ne do të shkojmë në atë pak më vonë gjatë pset. Pra, së pari, vetëm për të marrë në dosjen e I / O para se të shkojmë në pset, për të hapur një skedë, për shembull, çfarë ju duhet të bëni është vendosur në të vërtetë një tregues për këtë dosje. Pra, ne kemi një tregues * file. Në këtë rast, unë jam duke e quajtur atë një në treguesin për shkak se do të jetë infile im. Dhe kështu që unë jam duke shkuar për të përdorur Funksioni fopen dhe pastaj emrin e dosjes dhe pastaj mënyra në të cilën unë jam duke shkuar për të që kanë të bëjnë me dosjen. Kështu që nuk ka "r" në këtë rast për të lexuar, "w" për shkrim, dhe pastaj "a" për të bashkëngjitur. Për shembull, kur ju jeni që kanë të bëjnë me një infile dhe të gjithë ju doni të bëni është të lexoni copa dhe bytes depozituara atje, atëherë ju jeni me siguri do të dëshironi të përdorni si "R" regjimin tuaj. Kur doni të shkruani në fakt, lloj i bërë një skedë të re, atëherë ajo që ne jemi duke shkuar për të bërë është që ne jemi duke shkuar për të hapur skedarin e ri dhe përdorimin e "w" mode për të shkruar. Pra, atëherë kur ju jeni në të vërtetë lexuar në fotografi, struktura është si më poshtë. Së pari ju përfshijnë treguesin në struct që do të përmbajë bytes që ju jeni duke lexuar. Kështu që do të jetë lokacioni fundi i bytes që ju jeni duke lexuar. Ju jeni pastaj do të tregojë madhësinë, si thelb sa bytes programi juaj ka për të lexuar në të file, madhësia thelb një element është, dhe pastaj ju jeni do të përcaktojë se sa elementet që ju dëshironi të lexoni. Dhe pastaj në fund, ju duhet të dini se ku ju jeni duke lexuar nga, kështu që do të jetë në treguesin tuaj. Unë ngjyra-koduar këto, sepse fread është gjithashtu shumë e ngjashme me fwrite, përveç ju doni të bëni të sigurtë që ju përdorni rendin e duhur, sigurohuni që ju jeni në të vërtetë me shkrim ose lexim nga dosja e duhur. Prandaj, ashtu si më parë, në qoftë se ne kemi përmasat e elementit si dhe numrin e elementeve, atëherë ne mund të luajnë rreth këtu pak. Thuaj: Unë kam një struct qen dhe kështu atëherë unë dua të lexoj dy qentë në një kohë. Ajo që unë mund të bëni është të thonë se madhësia e një element do të jetë madhësia e një qen dhe unë jam duke shkuar për të lexuar në fakt dy prej tyre. Nga ana tjetër, ajo që unë mund të bëni është të thonë se unë jam vetëm duke shkuar për të lexuar një element dhe se një element do të jetë madhësia e dy qenve. Pra, kjo është analoge si ju mund të lloj të luajnë rreth me madhësi dhe numër në varësi të çfarë është më intuitive për ju. Dakord. Kështu që tani ne kemi marrë për dosjet shkrim. Kur ju dëshironi të shkruani një skedar, argumenti i parë është në fakt ajo ku ju jeni duke lexuar nga. Pra, kjo është në thelb të dhënat që ju jeni duke shkuar për të shkruar në skedar, cila është tregues jashtë në fund. Kështu që kur ju jeni që kanë të bëjnë me pset, sigurohuni që ju të mos merrni hutuar. Ndoshta kanë anën përkufizimet krah. Ju mund të tërheqë përkufizimet në manualin duke shtypur njeri dhe pastaj fwrite, për shembull, në terminal, ose ju mund të referohen përsëri në këtë rrëshqitje dhe sigurohuni që ju jeni duke përdorur një të drejtë. Pra, përsëri, për fwrite, kur ju keni një skedar që ju dëshironi të shkruani në, që do të jetë argumenti i fundit dhe se do të jetë një tregues për këtë dosje. Kështu, pra, kjo është se si të merremi me shkrim ndoshta bytes disa në një kohë, por thonë se ju doni të shkruani vetëm në vetëm një karakter të vetëm. Siç do të shohim më vonë në këtë shembull, në bitmaps ne do të duhet të përdorin atë. Kjo është kur ne mund të përdorim fputc, në thelb vetëm vënë një karakter në një kohë, Chr, në treguesin e file, dhe kjo është tregues tonë atje. Kështu atëherë sa herë që ne kërkojmë ose shkruani në një skedar, file është mbajtja e ku jemi. Pra, kjo është një lloj i kursorit, pozicioni fotografi tregues. Dhe kështu sa herë kemi shkruar apo lexuar përsëri në një skedar, fotografi në të vërtetë kujton se ku është, dhe kështu ajo vazhdon nga ku kursori është. Kjo mund të jetë e dobishme kur ju doni të, të themi, lexohet në një sasi të caktuar për të bërë diçka dhe pastaj lexoni në shumën e mëposhtme, por ndonjëherë ne mund të dëshironi të shkoni mbrapa ose në të vërtetë të fillojë nga një vlerë reference të caktuar. Pra, atëherë funksioni fseek, atë që nuk është na lejon për të lëvizur kursorin në një skedë të caktuar një numër i caktuar bytes. Dhe pastaj çfarë ne duhet të bëjmë është të përcaktojë se ku vlera e referencës është. Pra, ose ajo lëviz përpara ose prapa nga ku kursori është aktualisht, ose ne mund të specifikojë se ajo duhet të lëvizin vetëm në nga fillimi i dosjes ose nga fundi i dosjes. Dhe kështu që ju mund të kalojë në vlera negative apo pozitive me shumën, dhe që do lloj lëvizur kursorin ose përpara ose prapa. Para se të marrim në psets tjera, ndonjë pyetje në dosjen e I / O? Rregull. Siç kemi marrë në shembuj të tjerë, të ndjehen të lirë për të ndaluar mua për pyetje. Pra, në roman policor, ju jeni të dorëzuar një fotografi bitmap të ngjashëm me këtë të kuqe në rrëshqitje, dhe kjo duket si ky - një bandë e pika të kuqe - dhe ju vërtetë nuk e di se çfarë është shkruar. Nëse ju hedh një sy, ju mund të jetë në gjendje për të parë një ngjyrë kaltërosh të vogël brenda mes. Në thelb, kjo është ajo ku teksti është ruajtur. Nuk ishte një vrasje që ka ndodhur, dhe ne kemi nevojë për të gjetur se kush e bëri atë. Në mënyrë që të bëni këtë, ne kemi nevojë për lloj të kthyer këtë imazh në një format të lexueshëm. Në qoftë se ju djema ndonjëherë hasur këtë, ndonjëherë nuk do të jetë kits pak ku ju do të keni një xham zmadhues me një film të kuqe. Dikush? Po. Pra, ju do të jetë diçka si kjo duar, ju do të keni një xham zmadhues me filmin e kuqe mbi të, ju do të vënë atë mbi imazhin, dhe ju do të jetë në gjendje për të parë mesazhin e fshehur aty. Ne nuk kemi një xham zmadhues me film të kuqe, kështu që në vend që ne jemi duke shkuar për lloj të krijoni tonë në këtë pset. Dhe kështu përdoruesit do të input roman policor, atëherë çelës,. Bmp, kështu që është infile, që është mesazhi kuqe dot, dhe pastaj ata janë duke thënë verdict.bmp do të jetë outfile tonë. Pra, kjo do të krijojë një imazh të ri bitmap ngjashëm me çelës një përveç në një format të lexueshëm, ku ne mund të shohim mesazhin fshehur. Që ne jemi duke shkuar për të që kanë të bëjnë me manipulimin e redaktimi dhe bitmaps e disa lloj, ne jemi duke shkuar për të llojit të pikiatë në në strukturën e këtyre dosjeve bitmap. Ne shkuam mbi këto pak pak në leksion, por le të shohim në to disa më shumë. Bitmaps janë në thelb vetëm një marrëveshje e bytes ku ne kemi specifikuar cilat bytes thotë ajo. Kështu që këtu është lloj i si një hartë e imazhit bitmap duke thënë se ajo fillon me disa fotografi header, fillon me disa informacione në atje. Ju shihni se në rreth 14 numrin e bajt madhësia është treguar e imazhit bitmap, dhe kjo vazhdon. Por pastaj ajo që ne jemi të interesuar të vërtetë këtu ka filluar rreth numrit byte 54. Ne kemi këto treshe RGB. Se çka do të bëni është të përmbajë pixels aktuale, vlerat e ngjyra. Gjithçka më lart se në kokë është një informacion korrespondon me madhësinë e imazhit, gjerësia e imazhit, dhe lartësi. Kur shkojmë në mbushje më vonë, ne do të shohim se pse madhësia e imazhit mund të jenë të ndryshme se sa gjerësi apo lartësi. Kështu, pra, për të përfaqësuar këto - këto imazhe bitmap janë sekuenca të bytes - çfarë ne mund të bëjmë është të them në rregull, unë jam duke shkuar për të kujtuar se në indeksin e 14, kjo është ajo ku madhësia është, për shembull, por ajo që ne jemi duke shkuar për të bërë më të lehtë për të bërë këtë është encapsulate atë në një struct. Dhe kështu që ne kemi dy structs bërë për ne, një BITMAPFILEHEADER dhe një BITMAPINFOHEADER, dhe kështu sa herë që ne lexojmë për këtë dosje, nga default ajo do të shkojnë në mënyrë që, dhe kështu në mënyrë që ajo gjithashtu do të plotësojë në variabla të tilla si biWidth dhe biSize. Dhe pastaj në fund, çdo pixel është e përfaqësuar nga tre bytes. I pari është shuma e blu në pixel, e dyta është shuma e gjelbër, dhe më në fund, shuma e kuqe, ku 0 është në thelb asnjë jeshile blu apo të kuqe ose jo nuk ka dhe pastaj ff është vlera maksimale. Këto janë vlerat hexadecimal. Prandaj, nëse kemi ff0000, atëherë që korrespondon me shumën maksimale të kaltër dhe pastaj nuk ka dhe nuk gjelbër e kuqe, kështu atëherë kjo do të na japë një pixel blu. Pastaj në qoftë se ne kemi të gjithë e FF të gjithë bordit, atëherë kjo do të thotë se ne kemi një pixel bardhë. Kjo është lloj i kundërt ndaj zakonisht kur themi RGB. Është e vërtetë do BGR. Pra, nëse ne shikojmë në të vërtetë një shembull i një imazhi bitmap - më lejoni të tërhequr një deri këtu. Kjo është një vend i vogël pak. Unë jam zooming në, dhe ne mund të shohim se është pixelated. Ajo duket si blloqe me ngjyrë. Ju keni blloqe të bardhë dhe pastaj blloqe të kuqe. Nëse ju të luajnë në Paint Microsoft, për shembull, ju mund të bëni diçka si kjo nga pikturë sheshet në thelb vetëm të caktuara në një mënyrë të veçantë. Pra, atëherë çfarë kjo përkthehet në të bitmap është si vijon. Këtu ne kemi parë pixels të bardhë, që të gjithë janë të 6 F, dhe pastaj kemi pixels kuqe, treguar nga 0000ff. Dhe kështu sekuencë e bytes që ne kemi tregon se si imazhi bitmap do të shikojnë. Pra, ajo që unë kam bërë këtu është shkruar vetëm nga të gjitha ato bytes ngjyrë dhe pastaj në të kuqe kështu që ju mund të lloj të shohim, nëse ju hedh një sy pak, se si lloj i tregon një fytyrë smiley. Mënyra se si bitmap images puna është unë parashikojnë atë në thelb si një rrjet. Dhe kështu nga default, çdo rresht i rrjetit duhet të jetë një shumëfish i 4 bytes. Nëse ne shikojmë në një imazh bitmap, ju jeni të mbushur në çdo vlerë. Për shembull, ju mund të keni një të kuqe këtu, një gjelbër këtu, një blu ketu, por ju duhet të bëni të sigurtë që imazhi është plotësuar me një shumëfish i katër bytes. Pra, nëse unë dua imazhin tim për të qenë tre blloqe të gjerë, atëherë unë do të duhet për të vënë një vlerë bosh në të fundit për ta bërë atë një shumëfish i katër. Pra, atëherë unë do të shtoja në diçka që ne jemi quajtur mbushje. Unë jam vetëm duke shkuar për të treguar se atje me një x. Tani thonë se ne duam një imazh që është 7 pixel gjatë, për shembull. Ne kanë 1, 2, 3, 4, 5, 6, 7, dhe të gjitha që është e mbushur me ngjyra në. Mënyra se imazhet bitmap punojnë është se ne kemi nevojë për një 8. Drejtë tani ne kanë 1, 2, 3, 4, 5, 6, 7. Ne kemi nevojë për 8 hapësira për imazhin bitmap për të lexuar saktë. Pra, atëherë ajo që ne duhet të bëni është të shtoni në vetëm një grimë e mbushje për të siguruar se të gjitha widths janë uniforme dhe se të gjitha widths janë një shumëfish i 4. Dhe kështu që unë më parë tregoi, mbushje si një x ose një linjë squiggly, por në imazhet bitmap aktuale mbushje është treguar nga një hexadecimal 0. Kështu që do të jetë një karakter të vetëm, 0. Çfarë mund të vijnë në volitshëm është komanda xXD. Çfarë ajo nuk është në të vërtetë ju tregon se, si të ngjashme me atë që kam bërë para me smiley kur unë të shtypura në të vërtetë se çfarë do të jetë çdo ngjyrë për pixel dhe pastaj ngjyra-koduar atë, kur ju drejtuar xXD me komandat e mëposhtme, atëherë ajo do të vërtetë të shtypura nga çfarë ngjyrat janë për ato pixels. Çfarë ju duhet të bëni është mbi këtu unë të tregojë, si-ve 54 thotë se unë jam duke shkuar për të filluar në 54 byte sepse para se ju kujtohet nëse ne shikojmë prapa në hartën e bitmaps, kjo është e gjitha informatat header dhe gjëra si kjo. Por ajo që ne me të vërtetë kujdeset për piksele është aktuale që tregojnë ngjyra. Pra, duke shtuar në atë flamur, 54-s, atëherë ne jemi në gjendje për të parë vlerat e ngjyra. Dhe mos u shqetësoni për flamujt komplikuara dhe gjëra si kjo. Në spekulim caktuar problem, ju do të keni udhëzime se si të përdorin xXD për të shfaqur pixels. Pra, nëse ju shihni këtu, kjo lloj duket si një kuti jeshile, këtë gjë e vogël. Unë kam ngjyra-koduar 00ff00 si thelb thënë asnjë blu, një shumë të gjelbër, dhe jo të kuqe. Kështu që korrespondon me të gjelbër. Siç e shihni këtu, ne shohim një drejtkëndësh gjelbër. Kjo drejtkëndësh gjelbër është vetëm 3 pixels i gjerë, kështu që atëherë ajo që ne duhet të bëjmë për të siguruar se imazhi është një shumëfish i gjerë është 4 shtoni në mbushje shtesë. Dhe kështu, atëherë kjo është se si ju shihni këto 0s këtu. Kjo në fakt do të jetë rezultat i pset tuaj Resize, thelb bitmap marrjen e vogël dhe pastaj zgjerimit atë nga 4. Dhe kështu që ajo që ne shohim është se në fakt ky imazh është 12 pixels i gjerë, por 12 është një shumëfish i 4, dhe kështu që ne fakt nuk shoh ndonjë 0s në fund, sepse ne nuk kemi nevojë të shtoni ndonjë sepse është e mbushur plotësisht. Ajo nuk ka ndonjë vend më shumë. Rregull. Çdo pyetje në lidhje me mbushje? Rregull. Cool. Siç e kam përmendur më parë, bitmaps janë vetëm një sekuencë e bytes. Dhe kështu që ajo që ne kemi nevojë është në vend të të mbajnë gjurmët e pikërisht numër i cili i bajt korrespondon me një element të veçantë, ne fakt kemi krijuar një struct për të përfaqësuar atë. Kështu që ajo që ne kemi është një struct RGBTRIPLE. Kurdo që ju keni një shembull të një Triple RGB, sepse kjo është një lloj të përcaktojë strukturën, atëherë ju mund të hyni në ndryshore rgbtBlue, Ngjashëm variablat e gjelbra dhe të kuqe, të cilat do të tregojnë se sa blu,, jeshile, dhe e kuqe respektivisht, ju keni. Pra, nëse ne kemi vendosur për të 0 blu ndryshueshme, set gjelbër për FF, cila është vlera maksimale ju mund të keni, dhe pastaj ndryshueshme kuqe të vendosur në 0, atëherë çfarë ngjyre do të këtë të veçantë RGB trefishtë përfaqësojnë? >> [Student] Green. Gjelbër. Saktësisht. Ajo do të jetë e dobishme të dinë se sa herë që ju keni një shembull të një Triple RGB, ju në fakt mund të hyni në sasinë e ngjyrës - blu, jeshile, e kuqe - veç e veç. Tani që ne kemi biseduar për strukturën e kësaj, le të marrin një vështrim në dosjen e PKM. Këto janë structs bëra për ju. Këtu kemi një struct BITMAPFILEHEADER. Me interes është madhësia. Më vonë, ne kemi header info, e cila ka disa gjëra më shumë që janë interesante për ne, përkatësisht madhësi, gjerësia, dhe lartësi. Si ne do të shkojnë në më vonë, kur ju lexoni për dosjen, ajo automatikisht lexon për shkak se ne kemi vendosur që të jetë e njëjtë. Pra biSize do të përmbajë bytes drejtë që korrespondojnë me madhësinë aktuale të imazhit. Dhe pastaj këtu, së fundi, siç kemi biseduar rreth, ne kemi struct RGBTRIPLE typedef. Ne kemi një rgbtBlue, Green, dhe të kuqe lidhur me të. Madhe. Rregull. Tani që ne e kuptojmë bitmaps pak, të kuptojnë se ne kemi një header fotografi dhe një header info lidhur me atë dhe pastaj pas kësaj, ne kemi sende interesante e ngjyrave, dhe ato ngjyra janë të përfaqësuara nga structs RGBTRIPLE, dhe ata, nga ana tjetër, kemi tri vlerat që lidhen me blu, jeshile, dhe të kuqe. Deri tani, ne mund të lloj të mendojnë në lidhje me Recover pak. Më vjen keq. Mendoni për roman policor. Kur kemi dosjen tonë çelës, atëherë ajo që ne duam të bëjmë është lexuar në atë pixel nga pixel dhe pastaj të ndryshojë disi ato piksele në mënyrë që ne mund të prodhimit atë në një format të lexueshëm. Dhe kështu atë të prodhimit, ne jemi duke shkuar për të shkruar piksel nga pixel në dosjen verdict.bmp. Kjo është lloj i një shumë për të bërë. Ne e kuptojmë se. Kështu që ajo që ne kemi bërë është që ne kemi dhënë në të vërtetë me ju copy.c. Çfarë copy.c nuk është vetëm e bën një kopje e saktë e një fotografi bitmap të caktuar dhe pastaj rezultatet atë. Pra, kjo tashmë hap skedarin për ju, lexon në piksel nga pixel, dhe pastaj shkruan atë në në një file output. Le të marrin një vështrim në atë. Kjo është siguruar përdorimin e duhur, marrjen e filenames këtu. Çfarë kjo nuk është ajo vendos dosjen input të jetë ajo që ne kemi kaluar në në infile këtu, e cila është e dyta tonë command-line argument. Kontrollon për të siguruar që ne të mund të hapur dosjen. Kontrolle për të siguruar që ne mund të bëjë një outfile të ri këtu. Atëherë çfarë e bën këtë këtu, vetëm ajo në thelb fillon leximin në të dosjes bitmap nga fillimi. Fillimi, siç e dimë, përmban BITMAPFILEHEADER, dhe kështu ato sekuenca e copa do të drejtpërdrejtë të plotësoni në BITMAPFILEHEADER. Pra, ajo që ne kemi këtu është thënë se BF BITMAPFILEHEADER - kjo është e ndryshueshme tonë të ri të tipit BITMAPFILEHEADER - ne jemi duke shkuar për të vënë brenda BF atë që lexohet nga në treguesin, e cila është infile tonë. Sa nuk kemi lexuar? Ne lexojmë në sa bytes ne duhet të përmbajë BITMAPFILEHEADER tërë. Në mënyrë të ngjashme, kjo është ajo që ne bëjmë për header info. Pra, ne jemi duke vazhduar së bashku dosjen tonë në infile, dhe ne jemi duke lexuar ato copa dhe bytes, dhe ne jemi mbylljen e tyre direkt në në këto raste e variablave që ne jemi duke bërë. Këtu ne jemi vetëm duke u siguruar se është një bitmap bitmap. Tani ne kemi një outfile, apo jo? Pra, si ajo qëndron, kur kemi krijuar atë, kjo është në thelb bosh. Pra, ne duhet të thelb të krijuar një bitmap të ri nga e para. Çfarë bëjmë ne është që ne duhet të bëni të sigurtë që ne kopje skedar në kokë dhe header info ashtu si infile ka. Çfarë bëjmë ne është që ne të shkruani - dhe mos harroni se bf është e ndryshueshme BITMAPFILEHEADER e tipit, kështu që ajo që ne bëjmë është që ne vetëm përdorni atë përmbajtje për të shkruar në outfile. Ja, mbaj mend kemi biseduar për mbushje, se sa është e rëndësishme për të siguruar që shuma e piksele që ne kemi është shumëfish i 4. Kjo është një formulë shumë e dobishme për të llogaritur se sa mbushje keni jepet gjerësia e dosjen tuaj. Unë dua që ju djema për të kujtuar se në copy.c ne kemi një formulë për llogaritjen mbushje. Mirë? Pra, të gjithë kujtojmë se. Madhe. Pra, atëherë çfarë copy.c bën tjetër është ajo pohon mbi të gjitha scanlines. Ajo shkon përmes rreshtave të parë dhe pastaj ruan çdo trefishtë që lexon dhe pastaj shkruan atë në outfile. Pra, atëherë këtu ne jemi duke lexuar vetëm një RGB trefishtë në një kohë dhe pastaj duke se Triple njëjta në outfile. Pjesë e ndërlikuar është se mbushje nuk është një trefishtë RGB, dhe kështu që ne nuk mund të lexojnë vetëm atë sasi e mbushje treshe RGB. Ajo që ne duhet të bëni është në fakt vetëm të lëvizë treguesin e pozicionit tonë file, lëvizin kursorin tonë, për llojin e kaloni mbi gjithë mbushje të ashtu që ne të jemi në radhën e ardhshme. Dhe pastaj çfarë kjo nuk është një kopje ju tregon se si ju mund të dëshironi të shtoni mbushje. Pra, ne kemi llogaritur se sa shumë kemi nevojë për mbushje, kështu që do të thotë se ne kemi nevojë për numrin mbushje të 0s. Çfarë kjo nuk është një për lak që i vë numrin mbushje të 0s në outfile tonë. Dhe pastaj në fund, ju mbyllni dy fotografi. Ju mbyllni infile si dhe outfile. Pra, kjo është se si punon copy.c, dhe kjo do të jetë goxha e dobishme. Në vend të vetëm të vërtetë të drejtpërdrejtë kopjimi dhe pasting atë ose thjesht duke kërkuar në atë dhe shtypni në çdo gjë që ju dëshironi, ju mund të duan vetëm për të ekzekutuar këtë komandë në terminal, CP copy.c whodunit.c, e cila do të krijojë një skedë të re, whodunit.c, që përmban përmbajtjen e saktë të njëjtën si kopje bën. Pra, atëherë çfarë mund të bëjmë është të përdorin atë si një kornizë mbi të cilën të ndërtojmë dhe të redaktoni për dosjen tonë roman policor. Këto janë tonë për-dos për të bërë për roman policor, por ajo që e bën copy.c është në të vërtetë kujdeset për shumicën e tyre për ne. Pra, të gjithë ne duhet të bëni tjetër është ndryshuar pixels si të nevojshme që në fakt të bërë fotografi i lexueshëm. Mos harroni se për një pixel dhënë trefishtë, kështu që për një variabël të tipit të caktuar të RGBTRIPLE, ju mund të hyni blu, vlerat e gjelbër dhe të kuqe. Kjo do të jetë në dispozicion, sepse në qoftë se ju mund të hyni ato, që do të thotë që ju mund të kontrolloni ato, dhe që do të thotë se ju gjithashtu mund të ndryshoni ato. Kështu që kur u ngjitëm përsëri te kuqe shembullin tonë xham zmadhues, në thelb, se ishte duke vepruar si një lloj filtri për ne. Kështu që ajo që ne duam të bëjmë është që ne duam për të filtruar të gjitha treshe që po vijnë in Ka disa mënyra të ndryshme për ta bërë këtë. Në thelb, ju mund të keni çfarëdo lloj filtri që ju dëshironi. Ndoshta ju doni të ndryshoni të gjitha piksele kuqe apo ndoshta ju doni të ndryshoni një pixel ngjyra të ndryshme në një ngjyrë të ndryshme. Kjo është deri tek ju. Mos harroni se ju mund të kontrolloni se çfarë ngjyra pixel është dhe pastaj ju mund të ndryshojë atë që ju jeni duke kaluar nëpër. Rregull. Pra, kjo është roman policor. Pasi ju drejtuar roman policor, ju do të dini se kush është fajtori i krimit ishte. Tani ne jemi duke shkuar për të shkuar në Resize. Ne jemi duke shkuar për të ende të merret me bitmaps. Ajo që ne jemi duke shkuar për të bërë është që ne do të kemi një bitmap input dhe pastaj ne do të kalojë në një numër dhe pastaj të merrni një bitmap outfile ku kjo është në thelb infile tonë shkallëzuar nga n. Thuaj fotografi ime ishte vetëm një piksel të mëdha. Pastaj në qoftë se n ime ishte 3, shkallë me 3, atëherë unë do të përsëris atë pixel n numrin e herë, kështu 3 herë, dhe pastaj edhe atë shkallë poshtë 3 herë si. Kështu që ju shihni unë jam shkallë atë vertikalisht, si dhe horizontalisht. Dhe atëherë këtu është një shembull. Nëse keni n = 2, ju shihni se pixel parë blu ka përsëritur dy herë horizontalisht dhe vertikalisht sa dy herë. Dhe pastaj që vazhdon më, dhe kështu ju keni një shkallë të drejtpërdrejtë të imazhit tuaj origjinal nga dy. Prandaj, nëse ne do të hollësi pseudokod për këtë, ne duam të hapur dosjen. Dhe pastaj duke e ditur se në qoftë se ne të kthehemi këtu, ne shohim se gjerësia për outfile do të jenë të ndryshme se sa gjerësia për infile. Çfarë do të thotë kjo? Kjo do të thotë se informacioni ynë titulli do të ndryshojë. Dhe kështu ajo që ne do të dëshironi të bëni është të update info header, duke e ditur se kur lexojmë në dosjet nëse jeni që veprojnë në kuadër copy.c, ne tashmë kemi një ndryshore që tregon se çfarë është madhësia dhe gjëra të tilla si se. Pra, një herë ju keni se çfarë ju mund të dëshironi të bëni është të ndryshojë ato variablave të caktuara. Mos harroni, nëse ju keni një struct, si ju hyni variablave brenda se. Ju përdorni operatorin dot, apo jo? Pra, atëherë duke përdorur se, ju e dini që ju do të duhet për të ndryshuar header info. Kështu që këtu është vetëm një listë me elementet aktuale që do të jetë ndryshuar në dosjen tuaj. Madhësia e skedës do të jetë ndryshuar, imazhin, si dhe gjerësinë dhe lartësinë. Pra pastaj do të kthehet në hartën e bitmaps, shikoni në nëse kjo është header file apo header info që përmban këtë informacion dhe pastaj të ndryshojë sipas nevojës. Përsëri, thonë krah copy.c resize.c. Kjo do të thotë se resize.c tani përmban gjithçka që përmbante brenda kopje sepse kopje na ofron një mënyrë për të lexuar në çdo piksel nga pixel scanline. Me përjashtim tani, në vend të vetëm duke ndryshuar vlerat si ne e bëmë në roman policor, ajo që ne duam të bëjmë është që ne duam të shkruani në pixel shumta për aq kohë sa n ynë është më i madh se 1. Atëherë çfarë ne duam të bëjmë është që ne duam të zgjas atë horizontalisht nga n, si zgjas atë vertikalisht nga n. Si mund ta bëjmë këtë? Thuaj n juaj është 2 dhe ju e keni këtë infile dhënë. Kursori juaj do të fillojë në një të parë, dhe atë që ju doni të bëni nëse n është 2, ju doni të shtypura në 2 e atyre. Kështu që ju të shtypura në 2 e atyre. Pastaj kursori juaj do të shkojë në piksel të ardhshëm, i cili është një i kuq, dhe ajo do të shtypura nga 2 e atyre të kuqe, bashkëngjitur atë mbi atë që është bërë më parë. Atëherë kursori do të shkojë në piksel të ardhshëm dhe për të nxjerrë në 2 e atyre. Nëse ju shikoni përsëri në kuadrin copy.c, çfarë e bën këtë të drejtë këtu është ajo krijon një shembull të ri të një Triple RGB, një variabël të ri të quajtur trefishtë. Dhe këtu kur ai lexon në të, ajo lexon nga RGBTRIPLE 1 infile dhe ruan atë në brendësi të kësaj variable trefishtë. Pra, atëherë ju në fakt kanë një ndryshore që përfaqëson atë pixel veçantë. Atëherë kur ju shkruani, çka ju mund të dëshironi të bëni është të mbyll deklaratën fwrite në një për lak që shkruan atë në outfile tuaj si shumë herë të jetë e nevojshme. Kjo është mjaft e thjeshtë. Vetëm në thelb përsërisin procesin e të shkruarit n numrin e herë për atë shkallë horizontalisht. Por pastaj ne duhet të kujtojmë se mbushje ynë do të ndryshojë. Më parë, thonë se kemi pasur diçka e gjatësi 3. Atëherë ne do të shtoni vetëm në sa mbushje? Vetëm një shumë për të bërë atë një shumëfish i 4. Por thonë se ne jemi shkallë këtë imazh të veçantë nga n = 2. Kështu atëherë sa piksele blu do të kemi në fund? Ne do të kemi 6. 1, 2, 3, 4, 5, 6. Dakord. 6 nuk është një shumëfish i 4. Çfarë është shumëfish më të afërt e 4? Kjo do të jetë 8. Pra, ne jemi të vërtetë do të ketë 2 karaktere të mbushje atje. A ka dikush kujtohet nëse ne kemi një formulë për të llogaritur mbushje dhe se ku mund të jetë? [Përgjigja e padëgjueshme Studenti] >> Yeah, copy.c. Drejtë. Nuk është një formulë për të llogaritur në copy.c se sa mbushje keni dhënë një gjerësi të veçantë të imazhit bitmap. Pra, atëherë kjo do të jetë e dobishme kur ju duhet të shtoni në një sasi të caktuar të mbushje që në fakt kuptoj se sa mbushje keni nevojë të shtoni. Por një shënim, megjithatë, është se ju doni të bëni të sigurtë që ju jeni duke përdorur madhësinë e duhur. Vetëm të jenë të kujdesshëm sepse ju jeni në thelb do të merret me dy imazhe bitmap. Ju dëshironi të bëni të sigurtë që ju jeni duke përdorur një të drejtë. Kur ju jeni duke llogaritur mbushje për outfile, ju doni të përdorni gjerësinë e outfile dhe jo gjerësia e një mëparshme. Madhe. Kjo lloj kujdeset që shtrihen një imazh bitmap tërë horizontalisht. Por ajo që ne duam të bëjmë është në të vërtetë ajo shtrihet vertikalisht si. Kjo do të jetë pak e komplikuar sepse kur kemi mbaruar kopjimi një rresht dhe të shkruarit atë rresht, kursori ynë do të jetë në fund. Pra, nëse ne lexojmë përsëri, atëherë ajo është vetëm do të lexoni në për të vijë e ardhshëm. Kështu që ajo që ne duam të bëjmë është lloj i gjejnë ndonjë mënyrë e kopjimit ato rreshta përsëri ose vetëm të marrë atë lloj rresht dhe pastaj rishkrimin atë përsëri. Si unë lloj alluded, ka disa mënyra të ndryshme për ta bërë këtë. Çfarë ju mund të bëni është që ju jeni duke kaluar nëpër dhe nëpërmjet leximit të veçantë scanline dhe ndryshuar atë si të domosdoshme, atëherë lloj dyqan të gjitha ato piksele në një rrjet. Pastaj më vonë ju e dini që ju do të duhet për të shtypur në dukje se koleksion përsëri, dhe kështu ju mund të përdorni vetëm atë grup për të bërë këtë. Një tjetër mënyrë për të bërë atë që është që ju mund të kopjoni poshtë një rresht, kuptoni se ju duhet të kopjoni këtë përsëri, kështu që në fakt të lëvizur kursorin, dhe që do të jetë duke përdorur metodën fseek. Ju mund të lëvizin kursorin tuaj të gjithë rrugën prapa dhe pastaj të përsëritur procesin kopje përsëri. Pra, nëse numri ynë është n shkallë, atëherë sa herë do të na duhet të kthehemi dhe rishkruaj një linjë? >> [Student] n - 1. Po >>, perfekt. n - 1. Ne e kemi bërë atë një herë tashmë, kështu që atëherë ne do të duan të përsërisin procesin e kthim prapa n - 1 sasia e kohës. Rregull. Kështu që nuk keni funksionin tuaj resize. Tani ne mund të merrni për një pjesë të vërtetë zbavitëse, pset my favorite, e cila është Recover. Në vend të bitmaps, në këtë kohë ne jemi që kanë të bëjnë me JPEGs. Ne nuk jeni dhënë në të vërtetë vetëm një skedar të JPEGs, ne jemi duke i dhënë në thelb një kartë të papërpunuara format e kujtesës. Dhe kështu që kjo përmban një grimë e info mbeturinave dhe vlerave në fillim, dhe pastaj ajo fillon dhe ai ka një bandë e dosjeve JPEG. Megjithatë, ne jemi të dorëzuar një kartë, ku ne kemi fshihen fotot; thelb, ne kemi harruar se ku fotot janë të vendosura brenda kartë. Kështu, pra, detyra jonë është që të shërohen në të kalojnë nëpër këtë format kartën dhe për të gjetur ato fotografi përsëri. Për fat të mirë, struktura e dosjeve JPEG dhe fotografi kartë është pak e dobishme. Kjo padyshim mund të ketë qenë pak e komplikuar në qoftë se nuk ishin në këtë format të veçantë. Çdo skedar JPEG në fakt fillon me dy sekuenca të mundshme, të listuara më sipër. Në thelb, kur ju keni një fotografi të re JPEG, ajo fillon me ose sekuenca ffd8 ffe0 apo një tjetër, ffd8 ffe1. Një tjetër gjë e dobishme të dini është se jpegs janë ruajtur pranë njëri tjetrit. Pra, sa herë që një file JPEG mbaron, e tjera e fillon. Pra, nuk ka ndonjë lloj i vlerave në mes atje. Pasi që ju goditi fillimin e një JPEG, në qoftë se ju keni qenë tashmë lexuar një JPEG, ju e dini se ju keni goditur në fund të një të kaluar dhe fillimin e një tjetër. Për këtë lloj të kujtoj, kam bërë një skematik. Një tjetër gjë rreth JPEGs është se ne mund të lexoni ato në sekuencat e 512 bytes në një kohë, të ngjashme me fillimin e kartës. Ne nuk duhet të jenë të kontrolluar çdo bajt vetme, sepse kjo do të thith. Pra, në vend, atë që ne mund të bëjmë është në fakt vetëm lexuar në 512 bytes në një kohë dhe pastaj, në vend të kontrolluar në mes atyre në ato feta vogël pak, Ne vetëm mund të shikoni fillimin e 512 bytes. Në thelb, në këtë foto, ajo që ju shikoni është në fillim të kartelës, ju keni vlera që nuk janë me të vërtetë të rëndësishme për JPEGs aktuale vetë. Por pastaj ajo që unë kam është një yll që tregon një nga dy sekuencat e filluar për një JPEG. Pra, sa herë që ju të shihni një yll, ju e dini se ju keni një file JPEG. Dhe pastaj çdo fotografi JPEG do të jetë një shumëfish i 512 bytes por jo domosdoshmërisht të shumta të njëjtën. Mënyrë që ju të dini se ju keni goditur një tjetër JPEG është në qoftë se ju goditi një tjetër yll, një tjetër rend fillimin e bytes. Atëherë çfarë keni këtu është që ju keni fotografi JPEG kuqe vazhdueshëm derisa ju goditi një yll, e cila është treguar nga një ngjyrë të re. Ju vazhdoni dhe pastaj ju goditi një tjetër yll, ju goditi një tjetër JPEG, ju vazhdoni gjithë rrugën deri në fund. Ju jeni në foto e fundit këtu, një trëndafili. Ju shkoni deri në fund derisa ju goditi fundin e karakterit file. Kjo do të jetë me të vërtetë të dobishme. Një takeaways disa kryesore këtu: File karta nuk ka filluar me një JPEG, por një herë në JPEG fillon, të gjitha janë të ruajtura JPEGs krah për krah me njëri-tjetrin. Disa pseudokod për Recover. Së pari, ne jemi duke shkuar për të hapur dosjen tonë kartë, dhe që do të jetë duke përdorur skedarin tonë I / O funksionet. Ne jemi duke shkuar për të përsëritur procesin e mëposhtëm derisa kemi arritur në fund të file. Ne jemi duke shkuar për të lexuar 512 bytes në një kohë. Dhe çfarë kam thënë këtu është që ne jemi duke shkuar për të ruajtur atë në një tampon, Pra, në thelb të mbajë në të atyre 512 bytes derisa ne e dimë saktësisht se çfarë të bëjë me ta. Atëherë çfarë ne duam të bëjmë është që ne duam të kontrolloni nëse ne kemi goditur një yll apo jo. Nëse ne kemi goditur një yll, në qoftë se ne kemi goditur një nga sekuencat filluar, atëherë ne e dimë se kemi goditur një skedë të re JPEG. Ajo që ne do të dëshironi të bëni është që ne jemi duke shkuar për të duan për të krijuar një skedë të re në directory tonë pset4 të vazhdojë të bëjë atë file. Por gjithashtu, në qoftë se ne kemi bërë tashmë një JPEG para, atëherë ne duam të përfundojë këtë dosje dhe të shtyjë atë në dosje pset4, ku ne do të kemi se dosja ruhen, sepse nëse ne nuk e specifikon se ne kemi përfunduar se file JPEG, atëherë ne do të në thelb kanë një sasi të pacaktuar. The jpegs kurrë nuk do të përfundojë. Pra, ne duam të sigurohemi se kur ne jemi duke lexuar në një skedar JPEG dhe me shkrim se, ne duam të mbyllur në mënyrë specifike se në mënyrë për të hapur një tjetër. Ne do të dëshironi të shikoni disa gjëra. Ne duam të kontrolloni nëse ne jemi në fillim të një JPEG ri me tampon tonë dhe nëse ne tashmë kanë gjetur një JPEG parë sepse kjo do të ndryshojë procesin e tuaj pak. Pra, atëherë pasi ju shkoni nëpër gjithë rrugës dhe ju goditi në fund të dosjes, atëherë çfarë ju do të dëshironi të bëni është që ju do të duan për të mbyllur të gjitha dosjet që janë aktualisht të hapur. Kjo ndoshta do të jetë i fundit JPEG fotografi që ju keni, si dhe dosjen kartë që ju keni qenë që kanë të bëjnë me të. Pengesa e fundit që ne kemi nevojë për të trajtuar është se si të bëjë në fakt një skedar JPEG dhe se si në fakt shtyjnë atë në dosje. Pset kërkon që çdo JPEG që ju të gjeni të jetë në format e mëposhtme, ku e keni numrin e. muri. Numri, edhe nëse është 0, ne e quajmë atë 000.jpg. Kurdo që ju të gjeni një JPEG në programin tuaj, ju jeni do të duan për të përmendur atë në mënyrë që ajo është gjetur. Çfarë do të thotë kjo? Ne kemi nevojë për lloj të mbajnë gjurmët e sa ne kemi gjetur dhe çfarë numri i secilës JPEG duhet të jetë. Këtu ne jemi duke shkuar për të përfituar të funksionit sprintf. Ngjashëm me printf, të cilat vetëm lloj i shtyp një vlerë jashtë në terminal, sprintf shtyp file jashtë në dosje. Dhe kështu kjo çfarë do të bëni nëse kam pasur sprintf titullin,, dhe pastaj string atje, ajo do të shtypura nga 2.jpg. Duke supozuar se unë kam mbyllur dosjet e mia të saktë, që do të përmbajë skedar që unë kam qenë i shkruar jashtë. Por një gjë është se kodi që kam këtu nuk mjaft të kënaqur atë pset kërkon. The pset kërkon që të dytë skedar JPEG duhet të jetë emëruar në vend të vetëm 002 2. Pra, kur ju të shtypura nga emri, pastaj ndoshta ju mund të dëshironi të ndryshojë placeholder pak. A ka dikush kujtohet se si ne të lejojë hapësira shtesë, kur kemi shkruar diçka? Po. >> [Student] Ju vënë një shenjë në mes të 3 për qind dhe 2. Po >>, perfekt. Ju do të vënë një 3 në këtë rast, sepse ne duam hapësirë ​​për 3. 3d% ndoshta do të ju jap 002.jpg vend të 2. Argumenti i parë në funksion sprintf është në fakt një koleksion char, që ne dinim më parë, si vargjet. Ata vullneti, lloj shumë si një magazinim të përkohshëm, vetëm dyqan string rezultate. Ju nuk do të vërtetë të merret me këtë, por ju duhet të përfshijë atë. Duke e ditur se çdo emër file ka numrin, e cila merr tre karaktere, dhe pastaj. jpg, sa kohë duhet të jetë ky grup? Hidhe një numër. Sa karaktere në titull, në emër? Pra, ka 3 hashtags, periudhë, jpg. >> [Student] 7. 7 >>. Jo mjaft. Ne do të duan 8 sepse ne duam që të lejojë për terminator null si. Së fundi, vetëm për të nxjerrë nga proces që ju do të jetë bërë për të shërohen, ju keni disa informata fillimi. Ju vazhdojë derisa ju të gjeni fillimin e një file JPEG, dhe që mund të jetë ose një nga dy sekuenca filluar. Ju mbani në leximin. Çdo plagë këtu përfaqëson 512 bytes. Ju mbani në leximin, të mbajtur në lexim derisa ju hasni një tjetër rend duke filluar. Pasi të keni atë, ju përfundojë JPEG aktuale - në këtë rast, kjo është një e kuqe, kështu që ju doni që të përfundojë atë. Ju dëshironi që të sprintf emrin e që në dosjen tuaj pset4, pastaj ju doni të hapur një JPEG ri dhe pastaj të mbani në leximin derisa ju hasni ardhshëm. Mbani në leximin, të mbajtur në lexim, dhe pastaj në fund, përfundimisht, ju do të jeni për të arritur në fund të dosjes, dhe kështu ju do të dëshironi të mbyllni JPEG fundit që keni qenë duke punuar me të, sprintf se në dosjen tuaj pset4, dhe pastaj të shohim në të gjitha fotografitë që ju keni marrë. Këto fotografi janë në të vërtetë fotografitë e CS50 stafit, dhe kështu që kjo është vendi ku argëtim bonus pjesa e pset vjen në është se ju jeni të konkurrojnë në seksionet tuaj për të gjetur TFS në foto dhe të marrin fotografi me ta për të provuar se ju keni bërë pset dhe kështu ju mund të shihni të cilat anëtarët e stafit janë në foto. Pra, atëherë ju të marrë fotografi me stafin. Ndonjëherë ju do të keni për t'i ndjekur ato. Ndoshta disa prej tyre do të përpiqen për të drejtuar larg nga ju. Ju të marrë fotografi me ta. Kjo është në vazhdim. Kjo nuk është për shkak kur pset është për shkak. Afati do të shpallet në spekulim. Pastaj së bashku me seksionin tuaj, cilado seksion merr fotot më të me shumicën e anëtarëve të stafit do të fitojë një çmim mjaft të awesome. Kjo është lloj i nxitje për të marrë pset4 tuaj mbaruar sa më shpejt të jetë e mundur sepse atëherë ju mund të merrni poshtë për të biznesit gjueti poshtë të gjitha CS50 anëtarëve të stafit të ndryshme. Kjo nuk është e detyrueshme, edhe pse, kështu që sapo ju të merrni fotot, atëherë ju jeni të përfunduar me pset4. Dhe unë jam i mbaruar me 4 walkthrough, kështu që ju falenderoj të gjithë për të ardhur. Good luck me Mjekësinë Ligjore. [Duartrokitje] [CS50.TV]