[IERAKSTA ATSKAŅOŠANA]
[MŪZIKA TIEK ATSKAŅOTA]
DEIVIDS DŽ. MALANS: Labi, šis ir CS50.
Un šī ir 1. nedēļa, kuras laikā mēs turpinām programmēšanu, bet darām
to citā valodā, jo, atceries, ka pagājušajā reizē mēs koncentrējāmies
uz šo grafisko valodu, ko sauc par Scratch.
Taču mēs izmantojam Scratch ne tikai tāpēc, ka tas ir interesanti un
pieejams, bet arī tāpēc, ka tas ļauj mums izpētīt daudzus no šiem
jēdzieniem, proti, funkcijas un nosacījumus, Būla izteiksmes, cilpas,
mainīgos lielumus un daudz ko citu.
Pat, ja mūsdienu sintakse, kā mēs pāreju uz šo jauno valodu, ko sauc
par C, izjūtam kā mazliet noslēpumainu, varbūt mazliet biedējošu, un
jūs pilnībā nezināt visu simbolu nozīmi ārpus sintakses, saprotat, ka
idejas galu galā būs tādas pašas.
Faktiski, pārejot no tā, kas bija pagājušajā nedēļā, t.i., programmas
hello world, kas izskatījās nedaudz līdzīga šai, šonedēļ, protams, tā
izskatīsies nedaudz noslēpumaināka.
Tas izskatīsies nedaudz līdzīgs šim.
Pat tad, ja jūs nevarat precīzi atšķirt, ko šajā kodā nozīmē visi
dažādie simboli, izrādās, ka dienas beigās dators patiešām darīs to,
ko jūs sagaidāt.
Tas vienkārši teiks: hello, world uz ekrāna, tāpat kā mēs to darījām
Scratch valodā.
Tāpēc vispirms šiem marķieriem pielietosim kādu terminoloģiju.
Tātad to, ko mēs turpmāk redzēsim un rakstīsim, mēs sauksim par
pirmkodu.
Programmētāja rakstīto kodu turpmāk sauks par pirmkodu.
Nav svarīgi, vai tas ir Scratch.
Nav svarīgi, vai tas ir C.
Nav svarīgi, vai drīzumā tā būs Python valoda.
Pirmkods ir vispārīgs termins tam, ko mēs kā programmētāji rakstīsim.
Protams, izrādās, ka datori nesaprot pirmkodu.
Kā mēs to redzēsim, datori nesaprot Scratch un Puzzle Pieces vai C
kodu.
Viņi saprot tikai to, ko mēs nosaucām pagājušajā nedēļā.
KLAUSĪTĀJI: Nulles un vieninieki.
DEIVIDS DŽ. MALANS: Jā.
Tātad tas ir binārs, tikai nulles un vieninieki.
Patiesībā tā ir tikai informācija, kas izteikta binārā formā.
Patiesībā tagad tehniskais termins nullēm un vieniniekiem, ko dators
ne tikai saprot kā burtus vai ciparus, vai krāsas, vai attēlus, vai
kaut ko vairāk, bet arī zina, kā izpildīt un ko turpmāk sauks par
mašīnkodu pretstatā pirmkodam.
Cilvēki raksta pirmkodu, bet dators saprot tikai mašīnkodu.
Lai gan mēs neiedziļināsimies detaļās par to, ko tieši simbolu
modelis nozīmē, jūs redzēsiet, ka šādā nulles un vieninieku kopās būs
skaitļi.
Būs burti.
-Būs arī instrukcijas, jo datori patiešām labi veic tādas darbības
kā saskaitīšana, atņemšana, satura pārvietošanu atmiņā un ārā no tās.
Pietiek teikt, ka Mac datoru, PCs un citu datoru ražotāji ir
izlēmuši, ko noteiktas nuļļu un vieninieku kopas nozīmē arī attiecībā
uz darbībām – tātad ne tikai datus, bet arī instrukcijas.
Taču mēs nekoncentrēsimies uz šīm kopām tādā klasē kā šī.
Mēs koncentrēsimies uz augstāka līmeņa programmatūru, pieņemot, ka
mums kaut kādā veidā ir jāizvada mašīnkods.
Tādējādi izrādās, ka šī problēma, kas mums ir jāatrisina, pārejot no
pirmkoda uz mašīnkodu, faktiski iekļaujas tajā pašā paradigmā, kā
iepriekšējā reizē.
Bet šajā gadījumā ievade no vienas puses būs pirmkods.
Tas ir tas, ko mēs ideālā gadījumā rakstīsim, lai nebūtu jāraksta
nulles un vieninieki.
Tomēr mums ir kaut kādā veidā jāizvada mašīnas kods, jo tas ir tas,
ko jūsu Mac datori, personālie datori un tālruņi faktiski sapratīs.
Izrādās, ka ir īpašas programmas, kuru mērķis ir veikt tieši šo
pārveidošanu — konvertēt pirmkodu, ko mēs rakstām kāmašīnkodu, ko
atpazīst mūsu tālruņi un datori.
Un šāda veida programmu sauks par kompilatoru.
Tāpēc šodien mēs jūs iepazīstināsim ar citu veidu programmatūru.
Un tās ir dažādas.
Šeit mēs izmantosim populāru kodu, kas ļauj konvertēt no pirmkoda C
valodā uz mašīnkodu ar nullēm un vieniniekiem.
Jums tas nebija jādara, izmantojot Scratch.
Scratch pasaulē tas bija tik vienkārši kā noklikšķināt uz zaļā
karoga, jo būtībā MIT veica visu smago darbu, pārvēršot šīs grafiskās
puzles daļas par mašīnkodu.
No šodienas, kad mēs sākam mācīties programmēšanu un datorzinātni,
tagad šī prasme pāriet jūsu rokās.
Šāda veida pārveidošana ir atkarīga no jums.
Par laimi, fakts, ka šie kompilatori pastāv, nozīmē, ka mums nav
jāprogrammē mašīnkodā, kā to kādreiz darīja mūsu senči, vai nu
virtuāli, vai ar fiziskām perfokartēm, kā, piemēram, papīra lapām ar
caurumiem.
Mums ir jākoncentrējas uz tastatūru.
Šodien tas nebūs tikai jautājums par koda rakstīšanu.
Tas būs arī jautājums par laba koda rakstīšanu.
Un šī ir tāda lieta, ko jūs neapgūsit vienas dienas laikā.
Tam ir nepieciešams laiks.
Kā arī prakse.
Tāpat kā esejas rakstīšana par jebkuru tematu var aizņemt laiku, kā
arī prakse un pastāvīga atkārtošana laika gaitā.
Bet tādā programmēšanas klasē kā CS50 mēs centīsimies kopumā novērtēt
koda kvalitāti šajās trīs asīs.
Pirmkārt, vai tas ir pareizi?
Vai kods dara to, kas tam ir jādara?
Ja tā nav, kāda jēga tad, pirmkārt, bija to rakstīt?
Tāpēc ir pašsaprotami, ka vēlaties, lai jūsu rakstītais kods būtu
pareizs.
Un tas acīmredzot tā nav vienmēr.
Ikreiz, kad jūsu Mac vai PCs, vai tālrunis ir pārstājis darboties,
kāds cilvēks kaut kur ierakstīja kļūdainu kodu.
Taču koda pareizība būs pirmais un galvenais mērķis.
Subjektīvs mērķis redzēt perspektīvā ir dizaina jautājums.
Mēs to nedaudz redzējām pagājušajā nedēļā, kad es ierosināju, ka mēs
varētu labāk izstrādāt pat norauses programmas, iespējams, izmantojot
cilpas, nevis vienkārši kopējot un ievietojot vienus un tos pašus
blokus atkārtoti.
Tātad dizains ir subjektīvāks.
Tā ir vairāk kā apgūta māksla, kurā divi cilvēki var nepiekrist tam,
kura programmas versija ir labāk izstrādāta.
Nākamo nedēļu laikā mēs demonstrēsim pamatelementus un principus, lai
jūs varētu labāk izprast, vai jūsu kods ir labi izstrādāts.
Un kāpēc tas ir vērtīgi?
Jo labāk ir izstrādāts jūsu kods un ātrāk tas darbosies , jo jūs ar
kolēģiem to labāk varēsiet izmantot.
Tātad labs dizains ir laba lieta.
Tas palīdz jums dalīties ar savām idejām, tāpat kā tipiskā angļu
esejā.
Un tad, visbeidzot, mēs šonedēļ runāsim par stilu.
Un tā patiesībā ir tieši jūsu koda estētika.
Izrādās, ka datoriem bieži vien ir vienalga, cik neglīts ir jūsu
faktiskais kods, jo patiesībā lietas nav īpaši jāizceļ.
Jums nav jānumurē lappuses, kā, piemēram, esejā.
Datoram parasti ir vienalga, bet cilvēkam nav vienalga.
Skolotāja asistentam arī nav vienalga.
Nākamajā dienā jums tas būs svarīgi, kad mēģināsiet saprast, ko dara
jūsu kods.
Mēs beidzot koncentrēsimies uz stilu, jūsu rakstītā koda estētiku.
Tātad, kur mēs rakstīsim kodu?
Kur mēs kompilēsim kodu?
Šai klasei ne tikai ar C valodu, bet arī ar citām valodām, kuras
vēlāk izmantosim šajā semestrī, mēs lietosim brīvpiekļuves teksta
redaktoru, kas ir programma Visual Studio Code, AKA VS Code.
Mūsdienās tas ir ļoti populārs ne tikai attiecībā uz C, bet arī C++,
Python un Java, kā arī daudzām citām valodām.
Tas ir teksta redaktors tādā nozīmē, ka tas ļauj rediģēt tekstu.
Un tas attiecībā uz kodu ir viss.
Jūs varētu rakstīt kodu ar zīmuli uz papīra .
Ja jūs apmeklētu stundu vidusskolā, , jūs būtu varējis to pildīt kā
klases vingrinājumu vienu vai vairākas reizes.
Protams, jūs to nevarat palaist uz papīra, bet jūs noteikti varat to
uzrakstīt.
Jūs varētu izmantot kaut ko līdzīgu Microsoft Word, Notepad.exe vai
teksta rediģēšanai operētājsistēmā Mac.
Neviena no šīm programmām nav īsti paredzēta koda formatēšanai jums
vispiemērotākajā veidā, tāpat kā nav paredzēta arī tam, lai jūs
varētu kompilēt un palaist kodu.
Tātad VS Code būs rīks, ar kura palīdzību jūs varat darīt visu to un
vēl vairāk, t. i., rakstīt, kompilēt, palaist kodu.
Lai jums visiem nebūtu jācīnās ar tehniskām problēmām kursa sākumā,
instalējot šo programmatūru jūsu Mac vai PCs, mēs izmantosim uz
mākoņa bāzes balstītu VS Code versiju vietnē code.cs50. io.
Un tas būs tieši tāds pats rīks.
Mērķis ir līdz semestra beigām pārcelt jūs no šīs mākoņdatošanas
vides uz jūsu Mac un PCs, lai pat tad, ja CS50 ir vienīgā CS klase,
kuru jūs kādreiz esat apmeklējis, jūs esat vismaz kādu laiku 100%
sagatavots, lai turpinātu rakstīt kodu pēc nodarbības, izmantojot
nevis kaut ko, kas ir raksturīgs pat CS50, bet gan de facto nozares
standartu.
Tātad, kā izskatīsies šī programma VS Code neatkarīgi no tā, vai tā
būs jūsu Mac, PC vai sākotnēji jūsu pārlūkprogrammā?
Uz ekrāna būs vairāki atšķirīgi reģioni.
Šeit ir redzams tas pats kods, kuru es turpinu piedāvāt kā
vienkāršāko programmu, ko varat rakstīt C valodā.
Un kas ir šie dažādie ekrāna reģioni?
Būtībā to ir četri.
Tātad, pirmkārt, augšpusē būs izcelta viena vai vairākas cilnes,
kurās jūs ierakstīsit kodu.
Līdzīgi kā Google dokumentos vai Microsoft Word, jūs varat atvērt
cilnes ar failiem.
Līdzīgi kā VS Code vai jebkurā citā programmēšanas vidē, mūsdienās
parasti ir sava veida cilnes.
Šķiet, ka šī būs cilne, kurā būs fails, saukts hello.c.
Tas būs pirmais fails, ko mēs tūlīt rakstīsim.
Tomēr šeit būs saskarne, kuru daudzi no jums, iespējams, nezina.
To sauc par termināļa logu.
Un termināļa logs nodrošina to, ko parasti sauc par komandrindas
saskarni jeb CLI.
Un tas ir pretstatā grafiskā lietotāja saskarnei jeb GUI.
Tagad mēs katru dienu lietojam GUI savos tālruņos unPCs.
Un GUI ir burtiski grafisks — tātad izvēlnes, pogas un ikonas.
Lai mijiedarbotos ar to, jūs parasti izmantojat pirkstu vai
skārienpaliktni, peli vai kaut ko tamlīdzīgu.
Bet izrādās, ka daudzi programmētāji — viņi gan saka, ka lielākā daļa
programmētāju ar laiku dod priekšroku nevis GUI, bet CLI,
komandrindas saskarnei, kurā jūs faktiski visu darāt nedaudz
mistiski, izmantojot tikai tastatūru.
Kāpēc?
Izrādās, ka lielākajā daļā datoru ir iebūvēts vairāk funkciju, ja
vien varat tām piekļūt, izmantojot tastatūru.
Izrādās, lielākā daļa no mums spēj rakstīt ātrāk, nekā jūs varat
pārvietot peles kursoru un noklikšķināt.
Un tādējādi laika gaitā tas palielina efektivitāti.
Vai ar laiku jūs varēsiet ērti izmantot šo termināļa logu, lai, ,
piemēram, kompilētu savu kodu vai izveidotu programmu, kā arī lai to
palaistu.
Tātad sākumā jūs nebūsiet pieradis tikai divreiz noklikšķināt uz
ikonām, līdzīgi tam, kā mēs to darām reālajā pasaulē.
Jūs to darīsiet tā, kā to dara programmētājs.
Taču nav izslēgta ikonu pievienošana, klikšķināmība un vēl daudz kas
cits.
VS Code kreisajā pusē būs zināmais File Explorer — sava veida
hierarhisks koks, kā tas ir jūsu Mac vaiPC, kur jūs varat redzēt
visus sava konta failus.
Šeit, piemēram, ir redzams tikai hello.c, kuru es pēc brīža izveidošu
pats.
Un tad tālu kreisajā pusē ir tā sauktā aktivitāšu josla, un šeit jūs
vienkārši iegūstat daudz tradicionālo izvēlņu un pogu.
Tātad VS Code nodrošina gan ar GUI, gan ar CLI.
Bet tas ir CLI, termināļa logā, ekrāna apakšējā apgabalā, kurā mēs
faktiski ierakstīsim lielāko daļu komandu.
Un vispār klasē es domāju paslēpt visus grafiskos elementus, par
kuriem nav lielas intereses.
Pēc visa iepriekšminētā,ļaujiet man pāriet uz VS Code tiešsaistes
versiju.
Un es patiešām esmu tos paslēpis aktivitāšu rīkjoslā.
Es tiešām esmu paslēpis File Explorer.
Tātad redzamības labad man šeit ir patiešām liels laukums koda
rakstīšanai un ļoti liels termināļa logs apakšā.
Termināļa logā jūs redzēsiet dolāra zīmi.
Tas nenozīmē nekādu valūtu.
Šis ir tikai standarta simbols, kas šeit apzīmē ekrāna izvades
komandas.
Tātad fakts, ka šeit ir tikai dolāra zīme un kursors, galu galā
nozīmē to, ka es tur rakstīšu komandas.
Bet vispirms es patiešām izveidošu kādu kodu.
Tātad, kā es varu programmēt, izmantojot VS Code — neatkarīgi no tā,
vai tas ir manā Mac, PC vai šajā mākonī bāzētajā vidē, kas tiks
iestatīta 1. problēmu kopai, un turpināt rakstīt savu pirmo failu?
Iespējams, vienkāršākais veids ir šis.
Burtiski palaidiet komandas kodu un pēc tam tā faila nosaukumu, kuru
vēlaties izveidot.
Ievērojiet, ka es apzināti beidzu failu ar .c ar mazajiem burtiem!
Ievērojiet, ka esmu apzināti rakstījisvisu faila nosaukumu ar
mazajiem burtiem!
Un tie ir tikai nosacījumi.
Jūs varētu izmantot lielo H.
Jūs varētu izmantot lielo C.
Bet vienkārši nedariet to! Ievērojiet paraugpraksi, lai tā atbilstu
tam, ko gandrīz visi citi darītu!
Nospiežot taustiņu Enter, tiek parādīta tukša cilne, tāpat kā pirms
brīža ekrānuzņēmumā.
Un tieši šajā cilnē es tagad varu uzrakstīt savu pirmo programmu C
valodā.
Diemžēl tas nav lietotājam tik draudzīgs kā Scratch, kur jūs velciet
un nometiet pāris puzles gabalus, un lieta darīta.
Tāpēc es to darīšu atmiņai.
Bet arī tas jums ar laiku kļūs pazīstams.
Es iekļaušu kaut ko, ko sauc par stdio.h.
Iekavās ierakstīšu int main, void iekavās.
Jaunā rindā es ievietošu dažasfigūriekavas, kā mēs tās sauksim.
Tad es ierakstīšu printf un dažas apaļās iekavas, tad pēdiņās hello,
comma, world, tad atpakaļvērsto slīpsvītru, tad mazo burtu n, pēc tam
aizvērtās pēdiņas un tad semikolu pašās rindas beigās.
Tāpēc viss, ko esmu atjaunojis, ir tikai no atmiņas izveidojis pirmo
programmu.
Pēc neilga laika mēs noskaidrosim, ko lielākā programmas daļa dara.
Bet pagaidām palaidīsim to.
Un tāpat kā es pagājušajā nedēļā pirmo reizi noklikšķināju uz zaļā
karoga, apkoposim un palaidīsim šo programmu.
Ja tas būtu jūsu Mac vai PC un Google, vai Microsoft, vai kāds cits
būtu izveidojis programmatūru, šajā brīdī mēs veiktu dubultklikšķi uz
ikonas.
Bet mēs to vēl nevaram izdarīt.
Tas joprojām ir pirmkods.
Tāpēc es noklikšķināšu atpakaļ savā termināļa logā.
Ievērojiet, ka zem pirmās dolāra zīmes ir otrā, un tas nozīmē, ka tā
ir gatava komandai.
Un tagad komanda, ar kuras palīdzību padarīt šo programmu reālu,
kompilētu to no pirmkoda uz mašīnkodu, būs vienkārši darāmsun tad
programmas nosaukums, kuru vēlos izveidot.
Neliels smalkums — es apzināti izlaižu .c, jo programma, kuru vēlos
izveidot, ir hello.
Neraksti make hello.c.
Vienkārši rakstiet make hello.c.
Un šī programmas versija būtībā ir mūsu kompilators.
Tehniski runājot, tā ir programma, kas automatizē manas programmas
kompilēšanu.
Bet tā redzēs, ka esmu ierakstījis vārdu hello.c.
Tagad tā automātiski meklēs cietajā diskā esošo failu hello.c un
konvertēs to no pirmkoda C valodā uz mašīnkodu ar nullēm un
vieniniekiem.
Tātad, ja es nepieļāvu nevienu drukas kļūdu, nospiežot Enter, nekas
nenotiks.
Un tā ir laba lieta.
Gandrīz vienmēr, ja nekas netiek izvadīts uz ekrāna, jūs izdarījāt
labi.
Jūs nepieļāvāt nevienu kļūdu.
Uz tevi nekliedza.
Nav ziņojumu par kļūdām.
Tātad šī patiesībā ir laba lieta.
Kā man tagad palaist šo programmu?
Ievērojiet, ka man ir trešā dolāra zīme, kas nozīmē, ka esmu gatavs
trešajai komandai.
Un tagad es turpināšu un palaidīšu ./hello.
Tas, protams, ir nedaudz dīvaini, ka jums ir jāraksta punkta
slīpsvītra.
Pagaidām vienkārši ticiet, ka šādā veidā jūs palaižat programmu hello
savā pašreizējā mapē, pašreizējā direktorijā šajā mākonī bāzētajā
vidē.
Vēlreiz, nospiežot Enter, turiet īkšķus, lai izdotos.
Ungatavs.
Mana pati pirmā programma C valodā ir hello, world.
Un tagad ļaujiet man turpināt un atklāt iepriekš piedāvāto
pārlūkprogrammu File Explorer!
Es tikai izmantošu klaviatūras īsinājumtaustiņu, lai to atklātu.
Parasti es to turu slēgtu, jo man tiešām nav pastāvīgi jāmeklē, kādi
faili ir manā kontā.
Bet tagad jūs redzēsit File Explorer, kas pēc būtības ir līdzīgs Mac
vai PC, bet grafiski nedaudz atšķirīgs, šeit ir mans fails hello.c.
Tas ir izcelts, jo man ir atvērta šī cilne.
Bet tagad šeit ir otrs fails, ko vienkārši sauc hello.
Tāds ir manas programmas nosaukums.
Tātad, ja jūs izmantotu Mac vai PC, ideālā gadījumā jūs spiestu
dubultklikšķi.
Komandrindas vidē to nevar izdarīt.
Jums tas ir jāpalaiž šeit.
Bet tas ir viss, ko mēs esam paveikuši.
Mēs esam izveidojuši failu ar nosaukumu hello.c, un pēc tam mans
kompilators no tā izveidoja programmu.
Ļaujiet man šeit apstāties un paskatīties, vai ir kādi jautājumi, jo
tas nozīmē daudz maģisku frāžu.
Jā?
Jā.
Tātad, ja jūs pašlaik sekojat līdzi, spēlējat mājās un saņemat kādu
ziņojumu par kļūdu, daļu no šodienas es veltīšu, lai rādītu dažus no
tiem.
Pagaidām ļaujiet man tikai pateikt, ka, ja jūs izdarījāt tieši to
pašu, ko es, jūs noteikti kaut kur esat pieļāvis drukas kļūdu.
Un ievērojiet, ka tas patiešām ir standarta io-- stdio.h.
Varbūt ierakstījāt studio.h?
Labi, ļoti izplatīta kļūda, es varētu jūs izsaukt.
Tā nav studio.h.
Tas ir stdio.h — tik parasts.
Bet tās ir tieši tādas stulbas galvassāpes, kas jūs mocīs šonedēļ,
iespējams, dažas nedēļas un, iespējams, godīgi sakot, dažus gadus.
Bet ar laiku arvien vieglāk un vieglāk jūs sākat saskatīt iepriekš
pieļautās kļūdas, jo dators būs noregulēts.
Dators darīs tikai to, ko tu liksi.
Un, ja jūs sakāt, ka tas mutiski izklausās kā studio.h, dators
nezinās, kas ir fails.
PPaldies, ka tik agri kļūdījāties!
Tas notiek ļoti bieži.
KLAUSĪTĀJI: Kāpēc jums ir divi faili hello?
DEIVIDS DŽ. MALANS: Kāpēc man ir hello faili?
KLAUSĪTĀJI: Jā.
DEIVIDS DŽ. MALANS: Tad kāpēc man ir hello faili?
Viens ir tas, kuru es radīju kā cilvēku, kuru sauc par hello.c, un
tas ir attēlots šeit.
Bet tad, kad es palaidu make hello, šis process kompilēja manu
pirmkodu mašīnkodā.
Tātad šis otrais fails ar nosaukumu hello ir fails, kurā ir visas tās
nulles un vieniniekus, ko serveris faktiski saprot.
Labi, kādi jautājumi?
sveiki [nedzirdams]
DEIVIDS DŽ. MALANS: Ja jūs mēģināsiet noklikšķināt uz hello faila,
jūs redzēsiet vai nu VS Code,vai arī quote/unquote. Ja jūs gribētu to
apskatīties, tad tas neatvērsies šajā redaktorā tādēļ, ka tas ir
binārs, vai izmanto neatbalstītu teksta kodējumu.
Šajā gadījumā tas ir binārs.
Tās ir nulles un vieninieki.
Tagad jūs varētu izmantot programmatūru, lai redzētu šīs nulles un
vieniniekus.
Lielākajai daļai cilvēku tas nebūs intelektuāli izglītojošs.
Tātad VS Code vienkārši izvēlas jums to vispār nerādīt.
Izplatīta kļūda ir arī nejauši noklikšķināt uz faila, kuru nevēlaties.
Bet pirmkodu mēs patiešām varēsim rediģēt.
Labi, tātad esmu uzrakstījis šo programmu.
Šķiet, ka tas darbojas maģiski, vismaz ar nelielu piepūli, ja pareizi
nospiežat katru taustiņu.
Nu, kas tad tagad notiek?
Un kā tas darbojas?
Pirmkārt, ievērojiet, ka pat bez tā, ka es izceļu lietas vai
izvēlnes, taustiņus izvēlnēm, ievērojiet arī to, ka tas jau ir krāsu
kodēts.
Un tomēr, es noteikti neizcēlu Google Docs stilu, kur var mainīt
krāsu.
Izrādās, ka tas, ko VS Code un lielāko daļu programmēšanas vides
mūsdienās dara automātiski, ir sintakses izcelšana.
Tātad sintakses izcelšana ir tieši šī mūsdienu teksta redaktoru
funkcija, kas analizē jūsu ievadīto kodu.
Kad tas pamana noteikta veida taustiņsitienus, lietas, kas attēlo
funkcijas, nosacījumus, cilpas, vai mainīgos lielumus — daudz
pagājušās nedēļas vārdu, tas vienkārši izceļ tos visai atšķirīgi.
Galvenais, ko mēs drīz redzēsim, ir purpursarkanā krāsā.
Int, void un include ir sarkanā krāsā.
Hello, world ir zilā krāsā.
Manas iekavas ir zaļā krāsā.
Tās pilnībā atšķirsies arī atkarībā no programmētāja.
Faktiski, ja vēlaties mainīt šīs 1. problēmu kopas krāsas, to izdara
caur VS Code Settings, nospiežot attiecīgo zobrata ikonu.
Varat mainīt krāsu tēmu.
Sintakses izcelšanai nav īpašas krāsu shēmas, kā tas ir Scratch
programmā.
Tas tikai parasti katram cilvēkam ir sava izvēle.
Bet tas viss, kas šobrīd notiek, ir saistīts ar sintakses izcelšanas
jēdzienu.
Kas vēl notiks šajā kodā? Pirms es to palaidīšu, man tā ir jāuzraksta.
Tas izskatās nedaudz līdzīgs šim, ja izdzēšuvisas krāsas.
Un tad tikai diskusijas labad ļaujiet man turpināt un izkrāsot to
nedaudz līdzīgāku kā Scratch programmā.
Atcerieties, ka mūsu pirmajā Scratch programmā, kura tikai parāda uz
ekrāna hello, world , bija zaļa karoga klikšķināmā ikona, kas
izskatījās kā puzle oranžā krāsā, un zem tās purpursarkans bloks. —
Tā kā šī ir C versija, ja mēs attinam atpakaļ uz to, ko darījām
pagājušajā nedēļā, šī bija tā pati Scratch programma.
Bet tas, kas notiek tagad, ir tieši tas pats.
Tātad, ja atceraties pagājušās nedēļas vielu, un jums ir kāda
funkcija, piemēram, funkcija say purpursarkanā krāsā, kas var pieņemt
vienu vai vairākus argumentus, piemēram, ievadi, kas ietekmē to, kas
tiek parādīts uz ekrāna.
Un atceraties, ka funkcijām dažkārt var būt blakusparādības,
piemēram, ekrānā parādās runas burbulis.
Tātad pagājušajā nedēļā, kad mēs izmantojām say bloku un kreisajā
pusē palaidām argumentu hello, world , uz ekrāna parādījās vizuāls
blakusefekts - tagad runas burbulis ir rakstīts hello, world.
Un tas ir tieši tas, kas tikko notika VS Code, bet daudz, daudz
vairāk tekstuāli.
Un tagad nedaudz tuvāk aplūkosim pašu kodu.
Ļaujiet man norādīt uz ekvivalentu, kad zaļais karogs ir
noklikšķināts uz mana koda daļas, un pievērsīsimies tikai say blokam
programmā Scratch un atbilstošajai funkcijai C programmā.
Tātad, ja es gribētu to pārbaudīt un pārvērst to, ko mēs darījām
pagājušajā nedēļā ar say bloku uz programmas C, es vispirms izmantotu
funkciju printf, lai gan patiesībā tie ir balti meli.
Patiesībā tā ir funkcija printf.
Printf nozīmē formatēts.
Un tā ir tieši tā funkcija, kas ļauj formatēt tekstu uz ekrāna.
C valodā nav say funkcijas.
Ir printf funkcija. Tas, ko MIT darīja pirms vairākiem gadiem, bija
tas, , ka to, kas jau vēsturiski pastāvēja kā printf, viņi to
vienkāršoja plašākai auditorijai, tā vietā vienkārši nosaucot to par
say.
Bet ievērojiet, ka, ja es vēlos konvertēt Scratch kodu kreisajā pusē
uz C kodu, tas ir tādas pašas formas.
Tāpēc MIT tīšām izmantoja šo balto ovālu, kaut vai tāpēc, ka tas rada
ideju par iekavām.
Tātad labajā pusē, ja es vēlos nodot argumentu vai ievadi funkcijai
printf, es izmantoju atvērtās iekavas un aizvērtās iekavas.
Šajās iekavās es ierakstu visu, ko vēlos drukāt uz ekrāna — šajā
gadījumā hello, comma, world.
Bet ievērojiet, ka es apzināti atstāju vietu, jo jums ir nepieciešami
papildu taustiņsitieni C pasaulē.
Kad jūs rakstāt kādu tekstu, ko datorzinātne sauc par teksta virkni,
tādā gadījumā teksts ir jāliek dubultpēdiņās..
Dubultpēdiņas kreisajā pusē, dubultpēdiņas labajā pusē.
Ievērojiet, ka es arī šeit iekļaušu kādu nedaudz mīklainu simbolu —
atpakaļvērsto slīpsvītru n, ko es arī ievadīju un pieteicu iepriekš,
ka beigās ir vēl viens traucēklis - semikols.
Pietiek pateikt, tāpēc mēs sākam ar Scratch programmu.
Ar šo velciet un nometiet funkciju – varam sākt.
Tādā valodā, piemēram, C, printf, iekavas, dubultpēdiņas,teksts, kuru
jūs gribat, atpakaļvērstā slīpsvītra n un semikols beigās.
Šeit ir tik daudz sintaktisku darbību.
Bet galu galā tā ir tikai funkcija.
Un jūs pieradīsiet pie neērtībām, kā iekavas, pēdiņas, semikols un
tamlīdzīgi.
Taču lietas var ļoti viegli noiet greizi, un ir ļoti viegli
kļūdīties, pat ar šādām koda rindiņām.
Tāpēc ļaujiet man to izdarīt!
Ļaujiet atgriezties pie VS Code, kur man ir tieši tāds pats kods.
Ievērojiet, ka 5. rindā ir tieši šī koda rinda.
Tātad tas ir līdzvērtīgs say blokam.
Un padomāsim, kādas kļūdas es varēju pieļaut agrāk vai pat tagad, pēc
20 gadiem, kad uzzināju, kas tās vispār ir diezgan izplatītas.
Pieņemsim, ka esmu šeit aizmirsis semikolu.
Tik viegli izdarāms.
Galu galā jūs to darīsit.
Apskatīsim, kas notiek tagad, kad es atgriezīšos savā termināļa logā
un mēģināšu vēlreiz kompilēt savu kodu.
Lai viss būtu kārtībā, es notīrīšu ekrānu.
Bet tas ir tikai lekcijas dēļ, lai mēs varētu koncentrēties tikai uz
jaunāko komandu.
Bet es tagad turpināšu un vēlreiz palaidīšu make hello .
Tas nodrošinās to, ka mana programma tiks pārkompilēta.
Tas ir manuāls process.
Es nomainīju savu kodu.
Nulles un vieninieki cietajā diskā nav mainījušies.
Man tas ir jāpārkompilē, lai izvadītu jaunāko mašīnkodu.
Un tagad sākam.
Es nospiedīšu Enter un turēšu īkšķus, lai viss izdodas kā iepriekš.
Bet atkal nejauši noņemu semikolu.
Ak, mans Dievs.
Šeit ir vairāk kļūdu rindu nekā faktiskajā kodā.
Un tas prasa zināmu laiku, lai pierastu.
Programmas, kuras mēs izmantojam, ne vienmēr tika rakstītas, paturot
prātā vismazāk ērto auditoriju, bet gan profesionālus programmētājus.
Bet ar praksi, pieredzi un kļūdām jūs sāksit pamanīt modeļus arī šeit.
Tātad, lūk, ko es ierakstīju.
Make hello pēc uzvednes zīmes.
Tagad uz mani kliedz šādi: hello.c, kols, 5, kols, 29.
Nu, uz ko tas attiecas?
Es kaut kur esmu kļūdījies — 5. rindiņā, šīs rindas 29. rakstzīmē.
Parasti konkrētā rakstzīme nav tik noderīga, ja vien nevēlaties tās
izrēķināt.
5. rinda ir labs risinājums.
Tas nozīmē, ka es kaut kur 5. rindā kļūdījos.
Viss kārtībā.
Nu, kur tad ir kļūda?
Pēc izteiksmes bija paredzēts semikols.
Un šī kļūda patiesībā ir diezgan acīmredzama tagad, kad es to redzu
un saprotu, ak, pagaidiet mirklīti.
Labi, lūk, mana koda rinda.
Šeit, tā sakot, ir sava veida ASCII mākslā — teksta informācija, kas
attēlo grafiku — tas grib, lai es ieliktu zaļā krāsā semikolu šīs
rindas beigās.
Pieļauta 1 kļūda, ģenerēta standarta kļūda — tātad daži nieki.
Bet mana programma netika kompilēta.
Ja redzat šādu kļūdu, tas nozīmē, ka tā nedarbojās.
Tātad, kāds ir risinājums?
Acīmredzot risinājums ir atgriezties šeit atpakaļ un ielikt tur
semikolu.
Tagad, ja es pārkompilēju savu kodu ar make hello — es vēl
neizdzēsīšu ekrānu, vienkārši lai parādītu atšķirību, un tagad tas
vienkārši strādāja.
Tātad mēs atsākam darbību.
Labi, tomēr ļaujiet man šeit iepauzēt un pajautāt, vai ir kas
neskaidrs par to, ko es tikko izdarīju.
Sākotnēji šie kļūdu ziņojumi būs bieži.
KLAUSĪTĀJI: Vai semikols ir nepieciešams aiz katras rindas vai tikai
aiz dažām no tām?
DEIVIDS DŽ. MALANS: Tiešām labs jautājums.
Vai semikols ir nepieciešams aiz katras rindas vai tikai aiz dažām?
Izrādās, ka tikai pēc dažām.
To jūs šodien iemācīsities praksē, demonstrējot un izmantojot
piemērus.
Vispārīgi aiz katras komandrindas liek semikolu.
Un šis ir šīs koda rindas tehniskais termins.
Tas ir priekšraksts.
Un domājiet par to, jo tas ir angļu valodas teikuma koda ekvivalents.
Tātad semikols kodā ir kā punkts angļu valodā, kad esat pabeidzis šo
konkrēto domu.
Pagaidām nekur citur semikoli nav vajadzīgi.
Un mēs redzēsim piemērus, kur vēl jūs tos ievietojat.
Taču tas parasti atrodas koda rindas beigās, kas nav tīri
sintaktiska, piemēram, figūriekavas.
Vai vēl ir kādi jautājumi par to kļūdu, kuru es laboju, kur es pats
biju kļūdījies?
KLAUSĪTĀJI: [NEdzirdams]
DEIVIDS DŽ. MALANS: Pareizi.
Tātad 5. rindiņa ir tā vieta, kur kļūda ir visiespējamākā.
29. rakstzīme nozīmē, ka tajā ir 29 rakstzīmes.
Un tad patiesībā šajā gadījumā tas man sniedz norādījumus.
Kompilators ne vienmēr zinās, kā man sniegt padomu, it īpaši, ja manā
kodā ir īsts juceklis.
Taču bieži vien tas darīs visu iespējamo, lai sniegtu jums šādu
atbildi.
KLAUSĪTĀJI: Kāpēc jūs kā pirmo ievadījāt kodu hello.c?
DEIVIDS DŽ. MALANS: Kā gadījās, ka es vispirms ievadīju kodu,
atstarpi, hello.c un tagad es rakstu make hello?
Divi dažādi procesi.
Kad es ierakstīju kodu, atstarpe, hello.c, tas bija tāpēc, ka vēlējos
atvērt VS Code un izveidot jaunu failu ar nosaukumu hello.c.
Tas ir tāpat kā Mac vai PCdošanās uz sadaļu Fails, Jauns.
Lai gan fails eksistē un faktiski ir atvērts šeit — un tas tiek
automātiski saglabāts, nav nepieciešams visu laiku nospiest Command-S
vai Control-S — tagad es varu to kompilēt, izmantojot make hello
atkal un atkal.
Tātad teorētiski man nekad vairs nevajadzētu ievadīt kodu, atstarpi,
hello.c, ja vien es nevēlētos izveidot pilnīgi jaunu failu, ko sauc
tāpat.
Labi, kā tad ar šo citu sintakses daļu?
Ļaujiet man šeit nodzēst savu termināļa logu.
Varat arī nospiest Control-L, lai visu izmestu un estētiski notīrītu.
Pieņemsim, ka es izlaižu šo simbolu secību, slīpsvītru n, jo tad es
neesmu īsti pārliecināts, kāpēc tas tur ir.
Vai kāds vēlas minēt, it īpaši, ja jūs nekad iepriekš neesat
programmējis, kas varētu notikt tagad, ja es pārkompilētu un
atkārtoti palaistu šo programmas versiju?
Es atstāju semikolu, bet noņēmu slīpsvītru n.
Vai ir kāda ideja?
Labi, labi... jā?
KLAUSĪTĀJI: Vai nākamā dolāra zīme parādīsies uzreiz pēc jūsu hello,
world?
DEIVIDS DŽ. MALANS: Tā būs.
Nākamā dolāra zīme parādīsies uzreiz pēc mana hello, world.
Bet kas tev liek tā domāt?
KLAUSĪTĀJI: Tāpēc, ka slīpsvītra n rada jaunu rindiņu?
DEIVIDS DŽ. MALANS: Tieši tā.
Slīpssvītra n patiesībā ir īpaša simbolu secība, kas izveido jaunu
rindiņu.
Un tāpēc, jūsuprāt, ja es pārkompilēju šo programmu, make hello,
Enter — bez sintakses kļūdām, tāpēc šoreiz tā tika kompilēta.
Tātad jums nav nepieciešama slīpsvītra n.
Jums ir nepieciešams semikols.
Ja jums nav slīpsvītras n, skatieties, kas notiek, kad es šoreiz
izmantoju ./hello.
Patiešām, tagad es redzu hello, comma, world un pēc tam dīvainu
dolāra zīmi.
Un tā joprojām ir uzvedne.
Es joprojām varu tajā ierakstīt komandas, piemēram, clear, un viss
tiek notīrīts.
Bet tas izskatās vienkārši stulbi.
Ja es to palaistu vēlreiz šeit ar ./hello, tas vienkārši nav īpaši
lietotājam draudzīgs.
Parasti, kad esat pabeidzis programmas palaišanu, ideālā gadījumā
jums vajadzētu sakārtot lietas: pārvietot kursoru uz nākamo lietotāja
rindiņu.
Un atpakaļvērstā slīpsvītra n ir vienkārši īpašs simbols, zināms kā
atsoļa sekvence, ko C zina, lai pārvietotu kursoru uz nākamo rindiņu.
Citās valodās, arī Python, izmanto to pašu simbolu.
Piemēram, ja es šeit atgriežos atpakaļ pie koda, piemēram, es mēģinu
to darīt citādi.
Pieņemsim, ka es nelieku atpakaļvērsto slīpsvītru n.
Es vienkārši nospiežu Enter, kā to darītu parasts cilvēks Google Docs
vai Microsoft vidē.
Ļaujiet man turpināt un mēģināt kompilēt šo programmu.
Un tas, kā jūs varētu cerēt, darbosies, vai ne?
Jūs varētu cerēt, ka tas izdrukās hello, world un pēc tam tukšu
rindiņu, jo es pārvietoju kursoru uz nākamo rindiņu.
Bet nē.
Ja es tagad palaistu make hello un mēģinātu to kompilēt, C tas
nepatiktu.
Tagad man ir cita kļūda, joprojām 5. rindā, šoreiz sākot no
12. rakstzīmes — kļūda, kurai trūkst beigu pēdiņu un pēc tam dažu
citu lietu.
Un tas neizklausās labi — šoreiz liktenīga kļūda, pārāk daudz
pieļautu kļūdu, un tagad apstājas.
Tāpēc es šeit tiešām kļūdījos.
Tad kāpēc es to nevaru darīt?
Vienkārši tāpēc.
Cilvēki, kuri izstrādāja C, nolēma, ka, ja jums ir gara teksta
virkne, tai jāpaliek tajā pašā rindā.
Tā var kļūt gadīties gara.
Teksts var turpināties jaunā rindā, nenospiežot taustiņu Enter.
Bet jūs nevarat nospiest Enter, lai izveidotu jaunu rindu.
Ja jūs apzināti vēlaties jaunu rindiņu, jums patiešām ir jāizmanto šī
slīpsvītra n atsoļa rakstzīme.
Tāpēc ļaujiet man turpināt un darīt to.
Ļaujiet man to ievietot atpakaļ.
Ļaujiet man atgriezties pie sava termināļa loga.
Es vēlreiz notīrīšu ekrānu.
Ļaujiet man tagad turpināt un izsaukt make hello, lai pārkompilētos
uz šo versiju — ./hello.
Mēs joprojam darbojamies ar hello.
Labi, tāpēc tagad izskatīsim dažus citus šī koda aspektus, jo notiek
daudzkas, lai tikai liktu mums dabūt hello, worlduz ekrāna.
Šodien mēs lielākoties ignorēsim šo — int main(void) un šīs
figūriekavas.
Mēs drīz atgriezīsimies pie tā, lai noskaidrotu, kāpēc tās tur ir.
Bet pagaidām iedomājieties, ka int main(void) un šīs figūriekavas
šeit patiešām ir C ekvivalents, kad tika noklikšķināts zaļais
karodziņš.
Jums vienkārši tur to vajag.
Tādā veidā jūs iedarbināt savu programmu.
Un galvenā patiešām būs kāda īpaša funkcija, bet par to vairāk
citreiz.
Bet kāpēc man šeit ir šī koda rinda?
Pareizā rakstība patiešām ir stdio.h, STDIO punkts H.
Un šoreiz tās ir kvadrātiekavas , tāpēc tas ir nedaudz jaunums.
Tagad ir citādi un notiek atslēgvārda iekļaušana.
Ja jūs nezināt, kas kaut kas ir, tad nav nekādas vainas atbrīvoties
no tā un redzēt, kas notiek.
Tāpēc ļaujiet man izdzēst šo rindu.
Ļaujiet man atgriezties savā termināļa logā, notīrīt ekrānu un pēc
tam vēlreiz palaist make hello.
Un tagad mēģināsim kompilēt šo programmu bez šīs pirmās rindas.
Es to nesaprotu, tāpēc paskatīsimies, kas notiks.
Šeit ir vēl viena kļūda, bet redzēsim — hello.c, 5. rindiņa,
5. rakstzīme — tātad tā ir diezgan agrīna kļūda, kas netieši deklarē
bibliotēkas funkciju printf, ierakstot int un pēc tam punktu, punktu,
punktu.
Tik netieši deklarējot bibliotēkas funkciju printf - tas izklausās
ļoti noslēpumaini.
Jūs labāk sapratīsit šādas frāzes.
Bet acīmredzot man vajag iekļaut rindu include line for stdio.h.
Bet kāpēc?
Pamatojoties uz šo simptomu, kāds varētu būt jūsu instinkts attiecībā
uz to, ko pirmā koda rindiņa dara mūsu labā?
Kāpēc intuitīvi tam tur jābūt?
[NEDZIRDAMS] funkcijas.
Tas ir līdzīgi kā bibliotēkas importēšana, lai jūs varētu veikt tādas
darbības, kā, piemēram, drukāšana uz ekrāna.
Izmantojot Scratch, jums nevajadzēja darīt to attiecībā uz lielāko
puzles daļu.
Varbūt jūs atceraties, ka 0. nedēļas laikā es lietoju paplašinājuma
taustiņu (Extensions button) Scratch ekrāna apakšējā kreisajā pusē un
importēju dažas papildu puzles detaļas tekstrunas pārveidošanai, kas
atdarināja biedējošu cilvēka balsi, kas patiesībā izskanēja no kaķa
mutes.
Tas bija kā bibliotēkas pievienošana — kodu, ko uzrakstījis kāds
cits.
Tādā gadījumā tā bija trešā puse.
Bet es sev atļāvos tai piekļūt.
Tas pats šeit.
Izrādās, ka jūs patiešām nesaņemat printf automātiski C valodā.
Jums ir jāiekļauj tā sauktais galvenes fails, kas paziņo par šīs
funkcijas esamību.
Vēsturiski iemesls tam ir tikai efektivitāte.
Laikā, kad datori bija patiešām lēnāki un resursi bija ierobežoti,
jūs nevarējāt vēlēties piekļūt visai datoru funkcionalitātei.
Jums bija pieeja tikai tām funkcijām, kas jums patiešām rūp.
Mūsdienās tas ir kopēšanas/ielīmēšanas (copy/paste) solis, jo gandrīz
vienmēr vēlaties kaut ko izdrukāt uz ekrāna, vismaz rakstot šādas
programmas.
Taču šajos tā sauktajos galvenes failos ir pietiekami daudz
informācijas par visām tā sauktajām standarta I/O bibliotēkas
funkcijām.
Standarta I/O nozīmē tikai standarta ievadi un izvadi.
Un tas ir pareizi?
Jo drukāšana faktiski ir pamatizlaide.
Izrādās, ka ir arī citas funkcijas ievades iegūšanai no tastatūras —
vairāk par to būs nedaudz vēlāk.
Bet katru reizi, kad jūs vēlaties kaut ko izdrukāt uz ekrāna C
valodā, jums patiešām ir jāiekļauj šis galvenes fails jūsu koda
sākumā.
Un tas būtībā informēs kompilatoru, hei, kompilators, es vēlos
izmantot standarta I/O bibliotēkas funkcionalitāti, tostarp šajā
gadījumā printf.
Ja jūs nejauši izlaižat šo galvenes failu, programma nedarbosies, jo
tā nezinās, kas ir printf.
Tādā gadījumā tas ir kāds neatpazīts simbols.
Tagad jautājumi par šo koda rindiņu vai par to, kas ir šie galvenes
faili?
Jūs varētu vēlēties uzzināt, kādas funkcijas pastāv.
Kā jūs zināt, kādus failus jūs patiešām vēlaties iekļaut?
Izrādās, ka C ir daudzus gadus veca valoda, un tai ir bagātīga
dokumentācija.
Brīdinu , ka tā dokumentācija ne vienmēr ir lietotājam draudzīga.
Šim kursam ir pieejama C oficiālās dokumentācijas vienkāršota
versija, kas atrodama šajā URL, manual.cs50.io.
Tātad C pasaulē un arī citās valodās ir tā sauktās rokasgrāmatas
lapas.
Un tā ir tikai uz tekstu balstīta dokumentācija, kas, atklāti sakot,
parasti ir rakstīta tādā balsī, ka jums ir jābūt pieredzējušam
programmētājam, lai to saprastu.
Tātad tas, ko mēs esam darījuši šīs pašas dokumentācijas versijā, ir
tas, ka mēs esam importējuši visu oriģinālo, oficiālo dokumentāciju,
taču esam pievienojuši mazāk veiksmīgus tulkojumus angļu valodā, lai
nodrošinātu daudzas funkcijas, kuras jūs varētu izmantot klasē, kas
jums varētu palīdzēt.
Tātad šī dokumentācija jums ilgtermiņā nav nepieciešama.
Taču, lai sāktu, mēs to pārtulkosim tādā terminoloģijā, kādu
skolotāja asistents, nevis pats autors, jums palīdzētu saprast.
Piemēram, ja vēlaties uzzināt, kādas funkcijas pastāv failā stdio.h,
varat doties uz šādu URL vai meklēt to vietnē manual.cs50.io.
Tas parādīs visu šajā bibliotēkā pieejamo funkciju sarakstu un
izdrukās.
Un tad jūs varētu noklikšķināt tālāk, sasniedzot šādu URL, kas sniegs
jums visu dokumentāciju par to, kā izmantot printf.
Izrādās, jūs varat darīt pat vairāk nekā tikai izdrukāt hello, world.
Un mēs šodien notīrīsim virsmu.
Izrādās, ka dokumentācija vienmēr būs jūsu autoritatīvs avots tādiem
jautājumiem kā, piemēram, ko es varu darīt un kā es to varu izdarīt?
Tikmēr izrādās, ka CS50 ir sava bibliotēka, un tai var piekļūt,
izmantojot galvenes failu cs50.h.
Programmā C izrādās, ka izvade patiesībā ir diezgan vienkārša, kad
esat pieradis pie visām figūriekavām, apaļajām iekavām, pēdiņām un
tamlīdzīgi.
Bet ievade ir nedaudz grūtāka.
Ja esat programmējis iepriekš, Python valodas ievade nav tik
sarežģīta.
Java valodā to nav tik grūti izdarīt.
C formātā to ir grūtāk izdarīt.
Pēc pāris nedēļām mēs redzēsim, kāpēc.
Bet pirmajās pāris mācību nedēļās mēs faktiski nodrošinām jūs ar sava
veida mācību bāzi - ir vairākas funkcijas, kas ir pieminētas šajā
failā cs50.h.
Tas notiek saskaņā ar dokumentāciju, kas ir pieejama internetā (URL).
Pēc brīža mēs izmantosim dažus no tiem.
Jūs redzēsit, ka CS50 nodrošina dažas funkcijas, piemēram, get_char,
lai iegūtu vienu rakstzīmi no lietotāja tastatūras, get_int, lai
iegūtu veselu skaitli no lietotāja tastatūras, get_string, lai iegūtu
teksta secību no lietotāja tastatūras, un vairākas citas funkcijas.
arī.
Izmantosim dažas no šīm funkcijām, kā, piemēram, atkārtoti apmeklējot
otro programmu, kuru pagājušajā reizē rakstījām programmā Scratch,
kas pievieno kādu zināmu ievadi izvadei.
Tātad pirmā Scratch versija bija tikai hello, world.
Saka to pašu katru reizi, kad noklikšķināt uz zaļā karoga.
Atcerieties, ka 2. versija tomēr to darīja.
Tā lietotājam jautāja, kā tevi sauc?
Un tad tas kaut kādā veidā atdeva tam atgriešanas vērtību, kā mēs to
nosaucām.
Un tad mēs pievienojāmies hello un šim vārdam, lai uz ekrāna pateiktu
kaut ko interesantāku.
Tātad kā tas modelis izskatījās?
Tāds pats, kas iepriekš.
Mēs darbojamies funkcijā, kur funkcija ir kā mūsu algoritma koda
ieviešana.
Tas ietver vienu vai vairākus argumentus, piemēram, ko jūs galu galā
vēlaties pateikt ekrānā?
Un atgriešanas vērtība šajā gadījumā faktiski būs vērtība, kas
atgriežas.
Tātad ievades iegūšanas gadījumā mēs varam vēlreiz apsvērt šo ask
bloku, tāpat kā pagājušajā nedēļā.
Ievadīt jūs varat jbkurus vārdus angļu valodā,, ko jūs vēlaties
jautāt lietotājam.
Un tad tas atgriež vērtību.
Un tas tika nosaukts par MIT noklusējuma atbildi.
Bet mēs redzēsim programmā C, kā jūs varat saukt šīs atgriešanas
vērtības par jebko, ko vēlaties mainīgajos.
Bet tas atšķiras no blakusefekta.
Blakusefekts ir tikai kaut kas vizuāls, kas bieži notiek ekrānā, kā,
piemēram, runas burbulis vai hello, world.
Atgriešanas vērtība faktiski ir vērtība, ko jūs atgūstat atpakaļ no
funkcijas, kuru jūs varat vienreiz vai daudzreiz izmantot.
Tātad, kā pārvērst šo Scratch bloku, ko aplūkojām pagājušajā nedēļā,
uz C kodu šonedēļ?
Ja vēlaties jautāt lietotājam kaut ko, piemēram, kā viņu sauc, jūs
varat to izdarīt.
Jūs izmantojat CS50 funkciju, kas saucas get_string.
Un jūs izmantojat iekavas, lai parādītu, ka šeit ir arī ievades.
Pēc tam varat ierakstīt teikumu, kuru vēlaties jautāt lietotājam,
piemēram, quote/unquote, kā jūs sauc, ietverot pēdiņās.
Bet jums ir vajadzīgas pēdiņas C valodā.
Tāpēc turpināsim un pievienosim arī tās.
Es apzināti iekļāvu atstarpi aiz jautājuma zīmes, bet pirms
dubultpēdiņām, lai kursors pārvietotos vienu soli pāri, jo šajā
gadījumā mēs nesaņemsim īpašu runas lodziņu, kā tas bija programmā
Scratch.
Tas vienkārši atstās kursoru tur, kur tas ir, tāpēc mēs redzēsim, ka
uz ekrāna tas tikai pārvieto mirgojošo kursoru vienu atstarpi pēc
teikuma.
Labi, bet catch ir Scratch funkcija, ar kuru mēs automātiski saņemsim
atbildi no lietotāja īpašā mainīgajā, ko sauc par atbildi.
C valodā jums jābūt nedaudz precīzākam.
Programmā C, ja vēlaties atgūt atgriešanas vērtību no tādas funkcijas
kā get_string, jums ir jāizmanto vienādības zīme un pēc tam kreisajā
pusē esošā mainīgā nosaukums.
Mainīgo lielumu nosaukumu izvēle ir jūsu ziņā.
Es varētu nosaukt to par jebko — x, y, z.
Skaidrāk es to sauktu par atbildi, lai būtu līdzvērtīga tam, ko MIT
dara ar Scratch.
Bet ievērojiet, ka tas pats par sevi nenozīmē vienlīdzību.
Šajā gadījumā tā vērtību piešķir mainīgajiem.
Tātad programmā C, kad jūs izmantojat vienu vienādības zīmi, tas
nozīmē, ka labajā pusē esošo vērtību kopējiet uz vērtību kreisajā
pusē — no labās puses uz kreiso.
Ko tas mums dod?
Ja get_string ir funkcija, kas lietotājam liek parādīt iekavas, kāds
ir jūsu vārds, un tai ir atgriešanas vērtība, tas nozīmē, ka tā man
atdod kādu vērtību.
Bet tas ir atkarīgs no manis programmā C, lai kaut ko darītu ar šo
vērtību.
Tātad, ja es vēlos iekopēt šo vērtību mainīgajā, ko es varu vienreiz
vai atkārtoti izmantot, es lietoju vienādības zīmi un šīs vienādības
zīmes kreisajā pusē izgudroju jebkuru mainīgā nosaukumu, ko vēlos.
Tomēr ir zināmi noteikumi.
Ir noteiktas konvencijas.
Bet parasti, ja lietojat vienu vārdu ar visiem mazajiem burtiem, jūs
esat labā formā.
Bet C ir nedaudz pedantiskāks par to.
Un tie no jums, kas jau iepriekš ir programmējuši, iespējams, nav
pieraduši pie tā, piemēram, Python programmā, kas ir pasaule, par
kuru mēs runāsim pēc dažām nedēļām.
Jums arī jāpasaka C, kāda veida vērtību jūs glabājat.
Tātad, ja es vēlos teksta rindu no lietotāja — nevis veselu skaitli,
ne vienu rakstzīmi.
Es vēlos veselu teksta rindu, piemēram, frāzi, teikumu, nosaukumu,
šajā gadījumā man ir jāpasaka programmai C, ka šis ir stringtipa
mainīgais.
Tāpēc tā ir liekvārdība, bet pie tās jāpierod.
Un jums vienkārši jābūt precīzam.
Jūs informējat datoru, kāda veida vērtība tiek izmantota šajā
mainīgajā.
Tas ir tik tuvu tam, lai būtu pareizi, bet es esmu izlaidis kaut ko,
kas joprojām ir kaitinoši svarīgs.
Kā vēl trūkst?
KLAUSĪTĀJI: Semikols?
DEIVIDS DŽ. MALANS: Tātad semikols.
Šis ir paziņojums.
Ja vēlaties, šī ir kā pabeigta doma.
Programmā Code man tas ir neiztrūkstoši jābeidz ar semikolu.
Tā bija vairāk runāšana, bet tagad mēģināsim to izmantot manā kodā.
Ļaujiet man atgriezties pie VS Code, kur šeit ir mana koda versija 0.
Ļaujiet man turpināt un iekļaut kādu citu failu hello.c sākumā,
proti, iekļaut cs50.h tā, lai būtu piekļuve failam get_string un
visam citam, ko es varētu vēlēties.
Tagad ļaujiet man turpināt un pievienot koda rindiņu šajās
figūriekavās.
Ļaujiet man turpināt un darīt to. Atbildes rinda ir vienāda ar
get_string “kāds ir jūsu vārds”, jautājuma zīme.
Es pievienošu papildu atstarpi pirms dubultpēdiņām.
Es tiešām savu domu beigšu ar semikolu.
Un tagad ļaujiet man apzināti kļūdīties, šeit liekot punktu.
Ļaujiet man tagad mēģināt mainīt hello, world uz hello, comma,
answer. .
Tagad, kad ir dažas jaunas koda rindas, jūs varat redzēt, kur esmu
kļūdījies.
Bet tagad ļaujiet man mēģināt izveidot šo programmu.
Tik tālu viss būtu labi.
Tātad kļūdu ziņojumu nav.
Tātad tā ir laba lieta.
Ļaujiet man turpināt un palaist ./hello, un jūs redzēsit uzvedni.
Kā tevi sauc, jautājuma zīme.
Ievērojiet, ka kursors patiešām atrodas vienu atstarpi pa labi tikai
tāpēc, ka man šķita, ka izskatītos labāk, ja nelielu tukšu vietu
atstātu tur , nevisaiz jautājuma zīmes.
Ļaujiet man ierakstīt savu vārdu.
Bet pat tad, ja jūs nekad iepriekš neesat programmējis, es šeit esmu
kļūdījies.
Ko mēs redzēsim ekrānā, kad es nospiedīšu Enter?
KLAUSĪTĀJI: Sveiki, atbildiet!
Visticamāk, atbildiet sveiki.
Jo dators mani uztvers burtiski.
Un, ja es saku citēt/necitēt, sveiks, atbildiet.
Tā ir teksta rinda, kam seko jauna rinda, kas tiks izvadīta ekrānā.
Tāpēc mums ir nepieciešams kāds veids, kā pievienot atbildi šajā koda
rindā.
Tas nav tik vienkārši, kā scratch programmā, kur jūs varat izvēlēties
otru say bloku un vilkt, un nomest mainīgo tur.
Patiesībā mums ir vajadzīga jauna sintakse.
Un sākumā tas izskatīsies dīvaini, taču mūsdienās tas ir visur
programmatūrā, īpaši C un dažu citu valodu pasaulē.
Tāpēc ļaujiet man turpināt un ieteikt to atrisināt sekojoši.
Atcerieties, ka tad,kad mēs to darījām Scratch programmā, šis bija
labākais risinājums.
Mēs izmantojām say bloku, kuram šodien būs analogs printf.
Bet es izmantoju join puzles gabalu un Scratch, lai apvienotu hello,
comma, space un pēc tam cilvēka vārdu.
Tātad, kā mēs tulkojam šo kodu uz C?
Nu, tagad tas izskatīsies nedaudz citādi.
Es sākšu ar printf, ar dažām iekavām un semikolu, kas apzīmē say
bloku.
Bet kā man tagad veikt šo apvienošanos?
Šeit puzles gabali nav perfekti tulkojami.
Tas būtu veids, kā to izdarīt.
Jūs ievietojat hello, comma un pēc tam vietturi.
Šis ir tas, kas ir pazīstams kā formāta kods C valodā, īpaši printf.
Tas tikai nozīmē, ka šis ir virknes vietturis.
Turklāt virkne ir tikai teksts.
Tātad tas nozīmē, hei, dator, izdrukā hello, comma, space - un tad -
%s.
%s ir īpaši apstrādāts, lai šeit ievietotu kādu vērtību.
Labi, ko tad vēl man vēl vajag?
Šis joprojām ir teksts, tāpēc es visu iekļaušu ar dubultpēdiņām.
Es joprojām domāju iekļaut atpakaļvērsto slīpsvītru n, lai sakārtotu
lietas un pārvietotu kursoru uz nākamo rindiņu.
Tātad pēdējais solis programmā C ir kaut kā apvienot atbildi ar vārdu
hello.
Un veids, kā jūs to darāt, ir ar printf, nododot tam ne vienu vien
argumentu, ko es turpinu darīt.
Es turpinu tam nodot šo tekstarindu, ietvertu iekavās.
Es tagad pievienošu komatu un pēc tam vērtības nosaukumu, kuru vēlos,
lai printf atgrieztos un pievienotu šim %s.
Un printf ir īpaši gudrs attiecībā uz to.
Ja jums ir viens %s un viens papildu arguments aiz komata, tas
vienkārši notiek — %s tiek apvienots ar argumentu.
Ja aiz komata ir divi %s un divi mainīgie, arī tas ir pareizi.
Ja es atdalīšu tos ar komatiem, tad pievienošu pirmo mainīgo pirmajam
%s un otro mainīgo otrajam %s.
Tātad darbību secība notiek no kreisās uz labo pusi.
Ne vienmēr tas ir tik skaisti vai vienkārši kā šis, bet šādā veidā
tas tiek darīts programmā C.
Labi, ļaujiet man iepauzēt, jo šeit ir daudz simbolu.
Vai ir kādi jautājumi par šo paņēmienu?
KLAUSĪTĀJI: Kāpēc iepriekšējā sadaļā izslēdzāt slīpsvītru n?
DEIVIDS DŽ. MALANS: Jā, tiešām labs jautājums.
Kāpēc es pirms brīža izslēdzu atpakaļvērsto slīpsvītru?
Patiešām, tikai mana estētikas izjūta, ja vēlaties.
Tam nav nekāda iemesla.
Tātad, ja es atskatos uz savu kodu, jūs pilnīgi pareizi pamanāt, ka
man tur nebija slīpsvītras n.
Tas ir tikai tāpēc, ka neatkarīgi no manas stila izjūtas es gribēju,
lai vārds tiktu ierakstīts uzreiz aiz jautājuma.
Es būtu varējis pievienot atpakaļvērsto slīpsvītru n atstarpes vietā.
Tas būtu ļāvis man šeit arī ierakstīt.
Pilnīgi labi.
Vienkārši gribēju jums parādīt kaut ko citu.
Labs guvums.
KLAUSĪTĀJI: Vai varat parādīt piemēru ar diviem %s?
DEIVIDS DŽ. MALANS: Vai es varu parādīt piemēru ar diviem %s?
Protams.
Tāpēc ļaujiet man to izdarīt VS Code.
Ļaujiet man notīrīt termināļa logu, lai sakārtotu lietas.
Un ļaujiet man to izdarīt.
Tā vietā, lai izsauktu mainīgo atbildi visur, ļaujiet man vispirms to
nosaukt.
Un es uzdošu divus jautājumus.
Kāds ir tavs vārds?
Tagad ļaujiet man iestatīt pēdējo rindu kā get_string — ak, lielo
burtu lietojumam ir nozīme, tāpēc ļaujiet man labot lielo S, liekot
iekavās, kāds ir jūsu uzvārds, jautājuma zīme, semikols.
Un tagad mēs pievienosim vienu %s un otru %s.
Un tagad es nejauši pievienošu vispirms pirmo un pēdējo kā pēdējo.
Un tagad es pievērsīšos termināļa logam.
Esi sveiks—turi īkšķus, lai viss veicas labi-- ./hello.
Tas ir mans pirmais jautājums, Deivid.
Šis ir mans otrais jautājums, Malan.
Un atkal?
Sveiks, Deivid Malan.
Tātad tas vienkārši tos ievieto no kreisās uz labo pusi.
Viss, ko es darīju, bija, lai panāktu paritāti ar Scratch — un tagad
ļaujiet man turpināt un vēlreiz atsaukt šo darbību.
Es atgriezīšos, lai atbildētu šādi.
Es atgriezīšos, lai pajautātu personas vārdu.
Es izdzēsīšu pēdējā pieminējumu.
Es dzēsīšu otrā %s pieminējumu.
Un ja es tagad pārkompilēšu šo vienkāršāko versiju, es to netīšām
sabojāšu — es tā nebiju nedomājis.
Ko es izdarīju nepareizi?
KLAUSĪTĀJI: Jūs aizmirsāt vispirms mainīt 7. rindu.
DEIVIDS DŽ. MALANS: Jā, tikai iesācēju kļūdas.
Tāpēc es mainīju savu mainīgo atpakaļ uz atbildi, lai atbilstu
0. nedēļai, taču es to nemainīju šeit.
Pirmkārt es esmu lietojis nedeklarētu identifikatoru.
Tas ir nedeklarēts tādā nozīmē, ka es deklarēju answerrindiņu
iepriekš.
Es to nedeklarēju vispirms.
Tāpēc es intuitīvi vēlos tos vienkārši mainīt.
Ļaujiet man vēlreiz veidot sveicienu, ./hello, šoreiz ierakstiet
tikai manu vārdu!
Un tur tas ir - sveiks, Deivid.
Vai jums ir jautājumi par šo sintaksi ar printf?
DEIVIDS DŽ. MALANS: Ak, vietturis — es pietuvināšu — ir tikai
procenta simbols, pēc tam — s.
Tātad manā rindā ir %s, un pēc tam ir komats aiz pēdiņām, un tad
mainīgā nosaukums, kura vērtību es vēlos pievienot šim %s.
Un tagad ievērojiet, ka 7. rindiņā šajās iekavās ir tehniski divi
komati.
Un tomēr es apgalvoju, ka printf šobrīd izmanto tikai divus
argumentus.
Kāpēc tad tur ir divi komati, bet tikai divi argumenti?
Ja būtu divi komati, jūs domātu, ka ir trīs argumenti?
Tāpēc tas tiek uzskatīts kā komats [NEdzirdams].
Komats starp pēdiņām ir tikai angļu valodā.
Tas atdala hello no vārda.
Tāpēc tas patiešām ir ne tikai pēdiņās, bet arī tāpēc ka programmām,
tādām kā, piemēram, VS Code, ir tendence sintaksi izcelt nedaudz
citādi, tā, lai jums parādītos kā atšķirīgs, lai gan šajā gadījumā
tas ir nedaudz izsmalcināts - gaiši zils pret balto — bet patiešām,
tas cenšas darīt visu iespējamo.
Vai ir vēl kādi jautājumi par šo vietturi?
un vai tas nozīmētu [NEdzirdams],
vai arī būtu jāpievieno jauna rinda?
DEIVIDS DŽ. MALANS: Ā, labs jautājums.
Ja es vēlētos pievienot izsaukuma zīmi pēc vārda, vai man būtu
jāpievieno vēl viens vietturis un tā tālāk?
Patiesībā es to varētu izdarīt daudz vienkāršāk.
Es varu likt izsaukuma zīmi tieši aiz procentu zīmes.
Man nav nepieciešams papildu vietturis pats par sevi.
Ja es tagad attālināšu un palaidīšu make hello again, ./hello, un
ierakstīšu tikai savu vārdu — bez izsaukuma zīmes — tagad jūs
redzēsit labāk, hello, komats, David.
Tātad printf ir gudrs.
Tas noskaidros, kur atrodas %s, un pēc tam aizstās to.
Tagad ļaujiet man ierosināt, ka programmēšanā izplatīta lieta ir
tāda, ka, tiklīdz mēs pieņemam lēmumu par to, kā kaut ko izstrādāt,
mēs bieži iedzenam sevi stūrī un nožēlojam lēmumu.
Vai kāds var iedomāties problēmu, kas rodas, izmantojot %s kā
vietturi šajā printf virknē ?
Kas varētu noiet greizi, ja mēs izmantojam procentus šādā īpašajā
veidā?
Ja jūs burtiski vēlaties kaut kāda dīvaina iemesla dēļ ekrānā teikt:
%s vai godīgi sakot, pat tikai vienu %.
Izrādās, ka procentu zīme tiek īpaši apstrādāta printf virkņu
iekšpusē.
Tātad kāds šeit ir risinājums?
Šādām problēmām ir dažādi risinājumi.
Bet pieņemsim, ka jūs gribējāt teikt, piemēram, es saņēmu 100%.
Ļaujiet man iet uz priekšu un mainīt to pilnībā.
Tātad es saņēmu 100% jūsu testā vai vienalga.
Labi, ļaujiet man iet uz priekšu un make hello,Enter.
Labi, tātad nederīgs pārveidošanas specifikators.
Man nav ne jausmas, ko tas nozīmē, bet tas pasvītro procentu zīmi kā
problemātisku.
Nu, izrādās, ka cilvēki pirms gadiem nolēma: uh, labi, sasodīts.
Mēs jau izmantojām %.
Nu, divas procentu zīmes burtiski nozīmēs vienu %.
Tātad tagad, ja es atkārtoti palaidīšu make hello, aha, ./hello, es
saņēmu 100%.
Tātad, godīgi sakot, būs tādas lietas, kas jums ir jājautā kādam,
jums ir jāmeklē Google, jums tas ir jāpameklē dokumentācijā.
Bet šāda veida problēmām vienmēr ir risinājums.
Un, par laimi, tās nerodas tik bieži.
Ak, tikai norādu.
Citi jautājumi?
vairāki [NEDZIRDAMS]
DEIVIDS DŽ. MEILANS: Ja jums ir vairāki mainīgie, tie ir sakārtoti
secībā no kreisās uz labo.
Tātad printf analizēs pirmo teksta virkni, ko ievietojat starp
pēdiņām.
Un neatkarīgi no tā, kāds ir pirmais %, pirmais mainīgais, kas tiek
ievadīts pēc komata,tam tiek pievienots .
Un tad otrais tiek pieslēgts otrajam, trešaistrešajam un tā tālāk.
Tātad tas ir balstīts tikai no kreisās uz labo pusi.
AUDITORIJA: Šis vairāk ir precizējošs jautājums.
Ko īsti nozīmē %s?
DEIVIDS DŽ. MEILANS: Tas ir tikai vietturis.
To sauc par formāta kodu, un tas tikai sarunvalodā nozīmē
pievienojiet šeit kādu vērtību.
Un printf — cilvēki, kas pirms desmitiem gadu uzrakstīja printf,
nolēma izturēties pret %s īpaši.
Viņiem vajadzēja kādu vietturi.
Viņi nolēma, ka neviens nekad īsti nevēlēsies rakstīt %s.
Un, ja viņi to dara, viņi var vienkārši ievadīt %%s.
Tāpēc viņi nolēma ieviest printf tādā veidā, ka viņiem ir kods, kas
analizē jebkuru ienākošo tekstu, meklē %s un pēc tam kaut kādā veidā
pievieno nākamās vērtības šajā vietturī.
Un tikai... Ak, jautājums?
Atvainojiet?
AUDITORIJA: Kā būtu, ja mēs gribētu uzrakstīt savus iniciāļus vai ko
citu?
DEIVIDS Dž. MEILANS: Ak, ko darīt, ja vēlaties izmantot vienu
rakstzīmi, piemēram, iniciāļus, piemēram, DM vai DJM pirmajam,
vidējam, pēdējam, absolūti.
Un arī tā ir ideāla pāreja no jums abiem uz to, ko parasti sauc par
datu tipiem C valodā .
Izrādās, ka C valodā ne tikai virknes ir kā teksts.
Nākamo pāris nedēļu laikā mēs redzēsim precīzāk, kā virkne patiesībā
funkcionē.
Taču teksta virknes nav vienīgais, ko programmas var izvadīt.
Tās patiešām var izvadīt atsevišķas rakstzīmes, tāpat kā iniciāļus.
Tās var izvadīt arī veselus skaitļus.
Izrādās, ka printf ir dažādi formāta kodi visu veidu dažādiem datu
tipiem.
Un tikai daži no datu veidiem, ko mēs redzēsim nākamajās nedēļās, būs
šis saraksts, un jūs ievērosiet, ka tas gandrīz lieliski saskan ar
CS50 funkcijām, kuras es iepriekš izmantoju, piemēram, get_char,
get_int, get_string.
Šīs funkcijas mēs nosaucām tāpēc, ka katra no tām ir paredzēta, lai
atgrieztu jums cita veida vērtību.
Mēs jau esam izmantojuši get_string šajā piemērā.
Drīzumā redzēsim get_int un redzēsim iespējas izmantot citus.
Bet šī patiešām ir pieejamo datu veidu izvēlne, kā arī citi — punkts,
punkts, punkts — ko varat izmantot, rakstot programmu C valodā.
Tāpēc jums ir iepriekš jāizlemj, vai es vēlos saglabāt int šajā
mainīgajā vai virkni, vai, joka pēc, rakstot modīgāku kodu, attēlu,
skaņu vai videoklipu.
Tie visi var būt dažādi datu tipi, punkts, punkts, punkts.
Bet šobrīd mēs koncentrēsimies tikai uz šiem primitīviem.
Tas bija daudz.
Dosimies uz priekšu un paņemsim piecu minūšu pārtraukumu.
Vēl nav cepumu.
Bet pēc piecām minūtēm mēs atgriezīsimies un iedziļināsimies detaļās.
Šodien mūsu otrajā pārtraukumā mums būs cepumi.
Labi, esam atpakaļ.
Un tāpēc, ja mājās esat spēlējis līdzi , bet saskārāties ar grūtībām,
tas ir pilnīgi normāli.
Un tiešām, lekcijas mērķis parasti būs sniegt jums konceptuālu
priekšstatu par to, kur mēs dosimies nedēļas laikā.
Taču, izmantojot praktiskās laboratorijas un problēmu kopas, jums
patiešām būs iespēja savā tempā pārvarēt dažas no grūtībām.
Bet šodien ļaujiet man sniegt jums vēl dažus būvniecības blokus.
Un šie divi sākotnēji tulkos no Scratch.
Proti, nosacījumus, piemēram, kā tagad C valodā, ja tagad zinām, kā
mēs varam izmantot funkcijas — vismaz get_string un printf — un mēs
varam izmantot mainīgos, piemēram, virkni, ko izveidoju iepriekš, kā
es tagad varu pievienot miksam tādas lietas kā lēmumu pieņemšana un
nosacījumi?
Ar nosacījumu Scratch mums bija šāda veida sintakse kreisajā pusē.
Šeit Scratch ir norādīts, kā jūs varat izteikt, ja diviem
mainīgajiem, x un y, ir šāda saistība.
If x ir mazāks par y, sakiet ekrānā, x ir mazāks par y.
Nu, ļaujiet man to tagad pa labi iztulkot C kodā.
Tātad C valodā atbilstošais kods izskatīsies šādi, pieņemot, ka x un
y jau pastāv — vairāk par to vēlāk.
Un ievērojiet modeli, ko mēs redzēsim atkal un atkal.
Ap x un mazāk nekā y būs iekavas, tātad iekavas ap Būla izteiksmi,
atcerieties.
Būla izteiksme ir patiesa/nepatiesa, jā/nē atbilde, jautājums, ko
mēģināt uzdot, lai izlemtu, vai kaut ko darīt.
Tātad jūs tur izmantojat iekavas.
Tik līdzīgas funkcijās, kur mēs izmantojam iekavas priekš printf un
iekavas priekš get_string, un tā ir tikai dīvaina stilistiskā
neatbilstība.
Izmantojot atslēgvārdu if, kā paraugpraksi, aiz vārda if ir jāievieto
atstarpe.
Izmantojot tādu funkciju kā printf vai get_string, jums to
nevajadzētu darīt.
Darbosies abi, taču jūs atklāsiet, ka šīs ir konvencijas, kuras
lielākā daļa cilvēku stilistiski ievēro, tāpēc, izmantojot if,
lietojiet atstarpi.
Labi, tagad figūriekavās ir vieta, kurā atradīsies faktiskais kods,
kuru vēlaties izpildīt nosacīti.
Tātad ja vēlaties izdrukāt, ka x ir mazāks par y, tikai tad, ja x
patiešām ir mazāks par y, C valodā izmantojiet šo atvērto
figūriekavu, kuru līdz šim, iespējams, reti izmantojāt savā
tastatūrā, un šeit lejā - slēgto figūriekavu .
Un tās, ja tā var teikt, aptver vienu vai vairākas koda rindiņas zem
if — pēc būtības ļoti līdzīgi tam, kā oranžais bloks šeit aptver
purpursarkano puzles gabalu.
Tātad C valodā nav grafikas.
Tas viss ir teksts, lai jūs varētu uzskatīt, ka šīs figūriekavas
patiešām atspoguļo vienu un to pašu ideju.
Ņemiet vērā, ka gadījumā, ja nosacījuma if iekšpusē ir tikai viena
koda rindiņa, ja vēlaties, tad figūriekavas jums nav vajadzīgas.
Bet laba stila labad iekļaujiet tos.
Tas padarīs skaidrāku jūsu nodomu.
Iekš Scratch, ja vēlējāties izteikt šo — divi veidi, kā jūs varētu
iet, tā sakot, pa kreisi vai pa labi?
Nu, if x ir mazāks par y, es gribu teikt, x ir mazāks par y.
Else, ja es gribu teikt pretējo, x šajā gadījumā nav mazāks par y.
Tāpēc es pieņemu lēmumu, pamatojoties uz šo Būla izteiksmi.
C valodā tas ir gandrīz tas pats, taču jūs pievienojat kombinācijai
atslēgvārdu else — tātad MIT aizņēmās priekš Scratch to pašu
atslēgvārdu — un otru figūriekavu pāri, attiecīgi atvērto un
aizvērto.
Un tagad jūs varētu uzminēt, kas tajās atrodas.
Nu, jūs izdrukājat, ka x ir mazāks par y, vai izdrukājat, ka x nav
mazāks par y.
Labi, ja uz ceļa ir trīsvirzienu sazarojums?
Programmā Scratch tas faktiski kļūst nedaudz grafiski smagnēji , ja
tā var teikt.
Taču ievērojiet, ka programmā Scratch šādi mēs varam izteikt, ja x ir
mazāks par y, sakiet x ir mazāks par y.
Else if x ir lielāks par y, sakiet, ka x ir lielāks par y.
Else ifx ir vienāds ar y, tad sakiet, ka x ir vienāds ar y.
Tagad šeit ir neliela neatbilstība.
Nedaudz atpakaļ es C valodā apgalvoju, ka kādu darbību apzīmē
vienādības zīme?
AUDITORIJA: Piešķiršanu.
DEIVIDS DŽ. MEILANS: Piešķiršana no labās puses uz kreiso.
Ciktāl Scratch patiešām ir domāts bērniem, un viņi īsti nevēlējās
sarežģīt visu ar šāda veida semantiku, vienādības zīme Scratch nozīmē
vienādību.
Tomēr mums tas pēc brīža būs C valodā jānovērš .
C valodā vienādības zīme nozīmē piešķiršanu no labās uz kreiso pusi.
Scratch valodā tas burtiski nozīmē to, ko jūs varētu sagaidīt.
Labi, tulkosim šo kodu uz C.
Labajā pusē šis kods patiešām atbilstu šim.
Un jūs, iespējams, nedaudz muļķīgi redzat, kāds bija risinājums,
atšķirībā no %% risinājuma iepriekš, kad cilvēki iedzina sevi vienā
stūrī.
Jūs sakāt if, jūs sakāt else if un jūs sakāt else if, un kā mēs jau
esam atrisinājuši vienas vienādības zīmes lietošanu?
C valodā, kad vēlaties izteikt vienādību — vai lieta kreisajā pusē ir
vienāda ar lietu labajā pusē, jūs burtiski izmantojat divas
vienādības zīmes blakus vienu otrai, starp tām nav atstarpes.
Bet tagad šis kods būtu pareizs gan kreisajā, gan labajā pusē
neatkarīgi no tā, vai to attiecīgi darāt Scratch vai C.
Bet tagad mēs varam pievērsties savam kodam, jo īpaši tā dizainam.
Loģiski domājot, vai kāds var kritizēt šī koda dizainu vai nu
Scratch, vai C?
Man šķiet, ka mēs varētu darīt labāk.
Kā domā aizmugurē?
nekā ir [NEDZIRDAMI].
DEIVIDS DŽ. MEILANS: Perfekti.
Loģiski, ka ir jābūt tādam gadījumam, kurā x ir mazāks par y, vai x
ir lielāks par y, vai noslēgumā tam ir jābūt vienādam ar y.
Tādēļ kāpēc jūs tērējat manu vai datora laiku, uzdodot trešo
jautājumu?
Jums nav jājautā šis pēdējais else if, jo loģiski, kā jūs atzīmējat,
tam vajadzētu būt pašsaprotamam.
Tātad tas ir neliels uzlabojums.
Jūs, iespējams, veicat papildu darbu gadījumos, kur x ir vienāds ar y.
Tāpēc mēs varam to vienkārši uzlabot.
Un tāpat kā Scratch, jūs varētu vienkārši izmantot else bloku,
līdzīgi kā C, vai mēs varētu vienkāršot šo kodu, lai tas būtu tikai
else, kaut kāds loģisks apkopojums, kas tikai apstrādā realitāti,
kas, protams, būs galīgās situācijas vietā.
Labi, tātad mums tagad ir prasme izteikt nosacījumus ar Būla
izteiksmēm.
Tālāk kaut ko darīsim ar šo nākošo.
Tāpēc ļaujiet man atgriezties pie VS Code.
Esmu aizvēris vietni hello.c un tagad vēlos izveidot otru failu dažu
demonstrāciju labad.
Atcerieties, ka varat izveidot jaunus failus, ierakstot kodu,
atstarpi un pēc tam faila nosaukumu, kuru vēlaties izveidot.
Piemēram, es varētu ievadīt compare.c.
Es gribu uzrakstīt programmu, kas demonstrācijas labad sāks
salīdzināt dažas vērtības .
Bet pirms es to daru, ļaujiet man jums parādīt, labajā pusē atverot
File Explorer, kas pēc būtības ir līdzīgs Mac vai personālajam
datoram.
Varat uziet šeit un noklikšķināt uz ikonas, un jūs varat noklikšķināt
uz pluszīmes ikonas, un jūs iegūsit zilu lodziņu.
Un es varu ierakstīt compare.c, un es varu to šādā veidā vienkārši
manuāli izveidot .
Ievērojiet, ka cilne tiek atvērta pat tad, ja neesmu ievadījis kodu.
Tātad atkal kreisajā pusē jums ir GUI, Graphical User Interface, kaut
arī vienkāršota.
Šeit labajā pusē un apakšā ir komandrindas saskarne, taču tie ir
viens un tas pats.
Tomēr patīkami ir tas, ka, ja es aizveru šo failu nejauši, tīšām vai
kā, es varu to atkārtoti atvērt, neizveidojot jaunu, vienkārši
izpildot to pašu komandu — kods, atstarpe, compare.c.
Tātad kods ir VS Code lieta.
Tas ir vienkārši lietotājam draudzīgs īsceļš.
Bet tas ir tikai faila izveide vai esoša faila atvēršana.
Es paslēpšu File Explorer, lai šeit būtu vairāk vietas kodam.
Un ejam uz priekšu un darām šo.
Uzrakstīsim programmu, kas salīdzina divas cilvēka ievadītas
vērtības, bet šoreiz ne virknes.
Izmantosim dažus reālus veselus skaitļus.
Labi, es sākšu un augšpusē iekļaušu CS50 bibliotēkas galvenes failu —
cs50.h.
Es iekļaušu arī stdio.h.
Viens sniedz man lietotājam draudzīgu ievadi, izmantojot get_string,
get_int un tā tālāk.
Viens dod man lietotājam draudzīgu izvadi printf, izmantojot stdio.h
gadījumā.
Tagad es tikai akli ierakstīšu šo koda rindiņu, pie kuras mēs
atgriezīsimies nākamajās nedēļās.
Bet pagaidām tas ir līdzīgs tam, kad zaļais karogs noklikšķināja uz
koda programmā Scratch.
Un tagad ejam uz priekšu un darīsim šo.
Ļaujiet man iet uz priekšu un get_int no lietotāja un pajautāt
lietotājam, kas ir x, jautājuma zīme.
Es netaisos mocīties ar jaunu rindu.
Es vēlos to visu saglabāt vienā rindā, tikai estētikas dēļ.
Bet, kad es atgriežos un int, tāpat kā es atgriežu virkni, es saņemu
atgriešanās vērtību.
Tātad ja es vēlos kaut kur saglabāt get_int rezultātu, labāk to
ievietot mainīgajā.
Un es varu saukt mainīgo jebkā, kā vēlos.
Iepriekš es izmantoju atbildi, pirmo vai pēdējo.
Tagad es izmantošu x.
Bet loģiski, ka šeit joprojām ir jāizdara divas lietas, lai gan mēs
tehniski to vēl neesam izdarījuši.
Kas man vēl jādara?
AUDITORIJA: Semikolu.
DEIVIDS DŽ. MEILANS: Tātad man vajag semikolu beigās.
AUDITORIJA: Un veselu skaitli sākumā.
DEIVIDS DŽ. MEILANS: Un int sākumā.
Jums, programmētājam, sākot no šodienas, ir jāizlemj, ko jūs glabāsit
savos mainīgajos.
Un jums tas vienkārši jāpasaka datoram, lai tas zinātu.
Tagad, ievadam par tādām valodām kā Python, modernākām valodām,
izrādās, cilvēki saprata, nu, tas ir muļķīgi.
Kāpēc dators nevar vienkārši saprast, ka es tur ievietoju int?
Kāpēc man tas proaktīvi jāpasaka?
Tāpēc mūsdienās dažas valodas, piemēram, Python atbrīvosies no šīs
sintakses, atbrīvosies no semikoliem.
Bet šobrīd mēs patiešām skatāmies uz to, kā tas viss darbojās.
Labi, tātad esmu izveidojis šo vienu rindiņu, kas beidzas ar semikolu.
Ļaujiet man izveidot vēl vienu.
Un ļaujiet man iegūt otru int, What’s y, jautājuma zīme.
gandrīz identiskas, bet cerams, ka atšķirīgas lietotāja atbildes.
Un ļaujiet man vienkārši pajautāt if x ir mazāks par y, iekavās, pēc
tam figūriekavas, ļaujiet man iet uz priekšu un izdrukāt,
atvērējpēdiņas/aizvērējpēdiņas, x ir mazāks par y, reversā
slīpsvītra, n.
Un tagad kā piezīmi — šķiet, ka es rakstu ātri.
Daļa no tā ir tāpēc, ka VS Code man palīdz.
Ļaujiet man atgriezties pie šīs pirmās rindiņas ar if,nospiediet
taustiņu Enter.
Un tagad es izmantoju tikai tastatūru un rakstīšu atvērto figūriekavu.
Mūsdienās tā ir daudzu teksta redaktoru funkcija.
Tas pabeidz daļu jūsu domas.
Tikai tāpēc, lai aiztaupītu sev taustiņsitienu un lai nejauši
neaizmirstu noslēdzošo.
Tāpēc dažkārt pamanīsit, ka notiek lietas, kuras neesat ierakstījis.
Tas ir tikai VS Code vai turpmākās programmas, kuras izmantojat, lai
jums būtu noderīgas.
Es turpināšu un tagad manuāli ierakstīšu printf x ir mazāks par y,
slīpsvītra, n, aizvērējpēdiņas, semikols.
Tāpēc ļaujiet man tagad iet uz priekšu un mēģināt palaist šo, un mēs
redzēsim... paskatīsimies.
Make — not hello — bet make compare , jo šī faila nosaukums ir
compare.c, nospiežot taustiņu Enter.
Bez izvades ir labi, jo tas nozīmē, ka es neesmu pieļāvis kļūdu.
Ļaujiet man ./compare ./hello vietā, Enter.
Kas ir x?
Kā būtu ar 1?
Kas ir y?
Kā būtu ar 2?
X ir mazāks par y.
Nu, mēģināsim vēlreiz.
Un šeit es ietaupīšu arī dažus taustiņsitienus.
Ļaujiet man notīrīt ekrānu.
Tā vietā, lai pastāvīgi rakstītu ./this un ./that, varat arī izmantot
tastatūras bulttaustiņus programmā VS Code, lai ritinātu atpakaļ
laikā.
Tātad ja es vienu reizi nospiežu uz augšu, tur ir pēdējā komanda, ko
uzrakstīju.
Ja es to nospiežu divas reizes, tur ir pirmspēdējā komanda, ko
uzrakstīju .
Tāpēc dažreiz, ja redzat, ka es daru lietas ātri, tas ir tikai tāpēc,
ka es krāpjos un šādi eju caur savu vēsturi.
Labi, tomēr ļaujiet man iet uz priekšu un atkārtoti palaist
./compare, Enter.
Šoreiz apgriezīsim otrādi — 2 priekš x, 1 priekš y.
Un tagad, protams, nav izvades.
Labi, tas ir loģiski sagaidāms, jo mums šeit nebija else.
Tāpēc pievienosim to.
Else — tagad atvērsim manas figūriekavas, ļaujot VS Code vienu no tām
izveidot manā vietā — printf, atvērējpēdiņas/aizvērējpēdiņas, x nav
mazāks par y, reversā slīpsvītra, n, semikols.
Ļaujiet man turpināt un mēģināt vēlreiz — ./compare, Enter.
Atkal 2 prieš x, 1 priekš y.
Un mums vajadzētu redzēt... huh.
Kāpēc es neredzu else izvadi?
AUDITORIJA: Pārbūves laikā jūs mainījāt savu kodu.
Jums tas ir jākompilē.
Jums ir jāiegūst ieradums pārkompilēt kodu pēc tam, kad esat to
mainījis.
Jo citādi nulles un vieninieki serverī ir vecie, līdz jūs to manuāli
kompilējat.
Izlabosim to — make compare, Enter.
Nav kļūdu ziņojumu.
Tas ir labi.
./compare, 2, 1. Un tagad es saņemu atpakaļ izvadi.
Tātad x nav mazāks par y.
Kā būtu, ja es ietu un pievienotu trešo nosacījumu?
Mēs to varam darīt efektīvi vai neefektīvi.
Ļaujiet man iet uz priekšu un uzlabot šo.
Tātad else if x ir lielāks par y, teiksim burtiski, x ir lielāks par
y.
Un tagad es varētu izveidot x else if x ir vienāds, ir vienāds ar y.
Bet es domāju, ka mēs jau apgalvojām, ka tas ir nevajadzīgi
neefektīvi.
Tātad izdarīsim visaptverošu pārskatu.
Un šeit es teikšu atvērējpēdiņas/aizvērējpēdiņas, x ir vienāds ar y,
slīpsvītra, n, aizvērējpēdiņas.
Tāpēc es domāju, ka tagad ar šo kodu mēs esam atrisinājuši visus trīs
scenārijus.
Ļaujiet man iet uz priekšu un pareizi pārkompilēt — make compare,
./compare.
Un tagad 1 un 2 — ir mazāks par y.
Ļaujiet man to palaist vēlreiz.
2 un 1 — x ir lielāks par y.
Un visbeidzot, 1 un 1, un x ir vienāds ar y.
Tātad lielākoties mūsu kods kļūst garāks.
Mums ir 21 koda rindiņa, lai gan dažas no tām ekrānā ir tikai
atsevišķas rakstzīmes.
Gandrīz viss pārējais ir vienāds.
Es izmantoju CS50 bibliotēkas galvenes failu savai get_int funkcijai
, stdio.h savai funkcijai printf, un pārējā daļa ir tikai jauna
sintakse nosacījumiem.
Vai jums ir jautājumi par šo C ieviešanu tādiem pamata
salīdzinājumiem kā šis?
Kādi jautājumi?
AUDITORIJA: Tikai sintakses jautājums — vai atvērtajām iekavām ir
jābūt atsevišķā rindā?
DEIVIDS DŽ. MEILANS: Labs jautājums.
Vai atvērtajām iekavām ir jābūt atsevišķā rindā?
Iekš CS50, jā.
Jūs redzēsiet, ka iesniegšanas procesa ietvaros mēs salīdzinām jūsu
kodu ar stila rokasgrāmatu, kas nozarē ir ierasts.
Uzņēmumam ir sava stila izjūta un tam, kā vajadzētu izskatīties tā
kodam.
Un parasti uzņēmumā ir automatizēti rīki, kas palīdz sniegt
atsauksmes par kodu vai stilizē to kā tādu.
Ir alternatīvi stili, nekā tas, ko mēs izmantojam klasē.
Mēs apzināti paturam un lūdzam, lai jūs paturētu figūriekavas vienā
rindā, kaut vai tāpēc, ka tas drīzāk atgādina Scratch bloku
ieskaujošo raksturu un tikai parāda, ka tie ir līdzsvaroti, atvērti
un aizvērti.
Tomēr vēl viena izplatīta paradigma dažās valodās un ar dažiem
programmētājiem ir kaut ko līdzīgu izveidot katrā no tām.
Tātad jums ir atvērtā figūriekavatajā pašā rindā kā šeit.
Mēs to neiesakām.
Tas ir modē JavaScript pasaulē un dažās citās.
Bet, galu galā, reālajā pasaulē tas ir katra individuālā
programmētāja un/vai uzņēmuma, kurā viņš strādā, pārziņā, ko
vajadzības gadījumā izlemt šajā jautājumā.
Labi, tālāk par šiem nosacījumiem, ja mēs vēlamies darīt kaut ko, kas
varbūt ir diezgan izplatīts?
Tātad gandrīz katra programmatūra vai vietne, kuru mūsdienās
izmantojat, liek jums pieņemt noteikumus un nosacījumus, ierakstot Jā
vai Nē vai tikai Y, lai atbildētu ar Jā, un N, lai atbildētu Nē.
Tātad kā mēs varētu ieviest kaut kādu vienošanās sistēmu?
Nu, ļaujiet man to izdarīt.
Ļaujiet man izveidot jaunu programmu, trešo ar nosaukumu agree.c
Tāpēc es uzrakstīšu kodu agree.c, lai iegūtu jaunu cilni.
Es sākšu, kā vienmēr, tagad iekļaujot cs50.h.
Iekļausim stdio.h.
Un tad ļaujiet man izveidot manu int main(void) — kas atkal šodienas
mērķiem ir tikai kopēšana/ielīmēšana.
Un, ja es vienkārši vēlos iegūt Y vai N, piemēram, Jā vai Nē vietā,
mēs šeit varam izmantot vienkāršāku mainīgo.
Kā būtu tikai ar char, rakstu zīmi, vienu rakstu zīmi?
Tāpēc es varu izmantot get_char, lai pajautātu lietotājam, piemēram,
vai piekrītat, jautājuma zīme.
Bet, tāpat kā iepriekš, man tas kaut kur jāglabā.
Tātad es nevēlos virkni, jo tā ir viena rakstzīme.
Es negribu int.
Es tikai gribu char.
Un tas burtiski ir C-H-A-R.
Un tad es varu saukt šo lietu kā vien vēlos.
Tas ir ierasti, ja jums ir vienkārša programma ar tikai vienu mainīgo
un tās tips ir char, sauciet to par c.
Ja tas ir int, sauciet to par i.
Ja tā ir virkne, nosauciet to par s.
Pagaidām es to darīšu vienkārši un saukšu par c.
Un tagad es uzdošu jautājumu.
Tātad, ja c ir vienāds, ir vienāds ar, kā būtu,
atvērējpēdiņas/aizvērējpēdiņas, y, tad ļaujiet man iet uz priekšu un
izdrukāt Agreed, slīpsvītra, n, it kā viņi piekristu maniem
noteikumiem un nosacījumiem.
Citādi, paskatīsimies.
Else if rakstzīme, ir vienāds, ir vienāds,
atvērējpēdiņas/aizvērējpēdiņas, n, tad ļaujiet man iet uz priekšu un
izdrukāt, teiksim, Not agreed, it kā nebūtu,
atvērējpēdiņas/aizvērējpēdiņas.
Un atstāsim to, manuprāt, šeit tā.
Tagad jūs pamanīsit vienu neskaidrību, varbūt vienu neatbilstību.
Vai kāds vēlas to nosaukt, lai gan tas ir nedaudz nepamanāms?
Esmu kaut ko darījis nedaudz savādāk, to vēl nepaskaidrojot.
Vai jūs to redzat?
AUDITORIJA: Vienas pēdiņas.
Tātad es pēkšņi esmu izmantojis vienas pēdiņas savām atsevišķajām
rakstzīmēm un dubultpēdiņas savām faktiskajām teksta virknēm.
Tā ir nepieciešamība iekš C.
Kad strādā ar virknēm, piemēram, teksta virknēm, kāda cilvēka vārdu,
teikumu, rindkopu vai jebko vairāk nekā vienu rakstzīmi, parasti tiek
izmantotas dubultās pēdiņas.
Un patiešām, jums tas ir jādara.
Saskaroties ar tīšām atsevišķām rakstzīmēm, piemēram, kā esšeit ar y
vai n,ir jāizmanto vienas pēdiņas.
Jo tas nodrošina, ka dators zina, ka tā patiešām ir rakstzīme, nevis
virkne.
Tātad dubultpēdiņas ir paredzētas virknēm.
Vienas pēdiņas ir paredzētas rakstzīmēm.
Tā sakot, ļaujiet man turpināt un attālināt.
Ļaujiet man iet uz priekšu manā termināļa logā palaist make agree,
Enter.
Šķiet, ka darbojas labi, tāpēc ļaujiet man turpināt un izveidot
./agree.
Ļaujiet man turpināt un ievadīt y.
Te nu mēs esam.
Enter.
Huh.
Ļaujiet man mēģināt vēlreiz.
Atkārtoti palaižu ./agree.
Kā būtu ar nē?
Kāpēc tas nedara to, ko es būtu gaidījis?
AUDITORIJA: Jo jūs ievadījāt lielo Y un lielo N.
DEIVIDS DŽ. MEILANS: Jā, es tur nokrāpos, un es nospiedu Caps Lock
taustiņu tieši tad, kad sāku rakstīt ievadi.
Jo es apzināti gribēju rakstīt lielos, nevis mazos burtus, kas ir
diezgan saprotami.
Tas ir nedaudz nepatīkami, ja piespiežat lietotāju ieslēgt vai
izslēgt lielo burtu bloķēšanas taustiņu, kad nepieciešama vienkārša
atbilde.
Tā nav labākā lietotāja pieredze jeb UX.
Bet tas izdotos, ja es sadarbotos.
Ļaujiet man palaist šo vēlreiz bez lielajiem burtiem — y mazais
burts, lai apstiprinātu, ka jā.
Ak, tas nostrādāja.
n mazaiz burts priekš nē. Tas nostrādāja.
Bet kā es varu panākt, lai tas darbotos abos?
Nu, kā ar šo?
Ļaujiet man turpināt un vienkārši pievienot divas iespējas.
Tātad else if c ir vienāds, ir vienāds,
atvērējpēdiņas/aizvērējpēdiņas, lielais Y, tad arī izveidojiet printf
agreed reversā slīpsvītra, n.
Un šeit lejā, else ifc ir vienāds, ir vienāds, vienas atvērējpēdiņas,
lielais N, tad turpiniet un atkal izdrukājiet: Not agreed.
Tas, es tagad apgalvošu, ir pareizi.
Un es ļoti ātri izveidošu make agree, ./agree.
Un es izmantošu lielos burtus.
Tagad tas darbojas.
Es izmantošu lielos burtus.
Tas atkal darbojas.
Bet tas, iespējams, nav labākais dizains.
Ļaujiet man paslēpt termināļa logu un pavilkt to uz ekrāna
vienlaicīgi.
Kāpēc tas varētu nebūt labākais dizains, lai gan tas ir pareizs?
iemet šeit, piemēram, [OŠŅĀ] kaut ko
smaržo dīvaini šajā kodā.
Tas ir īsts īpašs termins.
Šeit ir koda smaka.
Kaut kas nedaudz ož.
Ko jūs domājat?
Atkal un atkal ir viena un tā pati izvade.
Es to ievadīju manuāli.
Bet godīgi sakot, es varētu arī vienkārši nokopēt un ielīmēt lielāko
daļu sava sākotnējā koda, lai to izdarītu atkal un atkal ar diviem
lielajiem burtiem.
[OŠŅĀ] tur ir kaut kāda koda smaka.
Tas nav labi izstrādāts.
Jo, ja es vēlos kaut ko tagad mainīt , tāpat kā pagājušajā nedēļā
iekš Scratch, man, iespējams, būs jāmaina kods vairākās vietās vai
arī kopēšana/ielīmēšana nekad nav laba lieta.
Un, nedod Dievs, es vēlos pievienot atbalstu priekš Jā un Nē kā
pilnus vārdus, tas tiešām būs garš.
Tātad kā mēs varam to atrisināt?
Nu, izrādās, mēs varam apvienot dažas no šīm domām.
Tāpēc ļaujiet man vispirms mēģināt uzlabot Jā.
Izrādās, ja es izdzēsīšu šo klauzulu, es varētu faktiski or lietas
kopā.
Programmā Scratch ir daži puzles gabali, ja jūs tos neatradāt, uz
kuriem burtiski ir vārds or un vārds and, kas ļauj apvienot Būla
izteiksmes.
Vai nu tas vai šis ir taisnība, vai šis un šis ir patiesība.
C valodā jūs nevarat vienkārši pateikt vārdu or.
Tā vietā izmantojiet divas vertikālas joslas.
Un vertikālās joslas kopā nozīmē or, loģiski.
Un tāpēc es varu teikt, c, ir vienāds,ir vienāds,
atvērējpēdiņas/aizvērējpēdiņas, lielais Y, Agreed.
Un tagad es varu atbrīvoties no šī koda šeit.
Un ļaujiet man iet uz priekšu un teikt, vertikālā josla divreiz, c,
vienāds ar, atvērējpēdiņas/aizvērējpēdiņas, N ar visiem lielajiem
burtiem.
Un tagad mana programma ir aptuveni par trešdaļu mazāka, kas ir labi.
Ir mazāk pārmērību.
Un, ja es atkārtoti atveru savu termināļa logu, atkārtoti palaižu
make of agree, ./agree, tagad es varu ierakstīt mazo y vai lielo Y un
to pašu ar mazajiem un lielajiem N burtiem .
Vai jums ir jautājumi par šo sintaksi, kur tagad varat apvienot domas
un vienkārši padarīt lietas kompaktākas?
Un būs arī citi šādi triki.
AUDITORIJA: Vai nav funkcija, kas vienkārši ignorē gadījumu?
DEIVIDS DŽ. MEILANS: Tiešām labs jautājums.
Vai nav kāda funkcija, kas ļauj vienkārši ignorēt gadījumu?
Īsa atbilde, ir.
Un mēs redzēsim, kā to izdarīt faktiski apmēram pēc nedēļas.
Citās valodās ir vēl vairāk veidu, kā vienkārši kanonizēt lietotāja
ievadi, izmetot visas atstarpes, pa kurām viņi varētu nejauši trāpīt,
liekot visu rakstīt ar mazajiem burtiem.
Programmā C mums būs nedaudz vairāk jāstrādā, lai to paveiktu.
Bet patiesībā jau nākamnedēļ mēs redzēsim, kā mēs to varēsim izdarīt.
Bet pagaidām mēs salīdzinām tikai šīs literālās vērtības.
AUDITORIJA: Tāpēc mēs pieņemam, ka lietotājs ievieto to, ko viņi
iesaka.
Kā jūs rīkotos, ja viņiem būtu jāievada skaitlis?
Tātad mēs pieņemam, ka šajā programmā un visās manās pēdējās
programmās cilvēks sadarbojas un, kad es jautāju viņa vārdu, viņš
ierakstīja Deivids, nevis 123, vai šajā gadījumā viņš ierakstīja
vienu rakstzīmi, nevis pilnu vārdu.
Tātad šī ir viena no funkcijām, kas bieži tiek izmantota bibliotēkā.
Tā, piemēram, ja es atkal palaižu agree un saku kaut ko līdzīgu:
sure, Enter, tas to pilnībā noraida.
Jo s, u, r, e ir rakstzīmju virkne.
Tā nav viena rakstzīme.
Tagad es varētu vienkārši pateikt kaut ko līdzīgu x, kas, protams,
nav ne y, ne n.
Bet tas to pieļauj, jo tā ir viena rakstzīme.
Taču CS50 bibliotēkā ir iebūvēti daži neparedzēti ievades atteikumi.
Tātad ja izmantojat get_int un lietotājs ievada nevis skaitli 1 vai 2
, bet cat, C-A-T, tas vienkārši procesēs viņus atkal un atkal.
Un arī šeit, ja jūs to darītu manuāli programmā C, jūs galu galā
ierakstītu tik daudz koda, lai pārbaudītu visas šīs kļūdas.
Tāpēc mēs dažas nedēļas izmantojam šos treniņriteņus , lai tikai
padarītu kodu izturīgāku.
Bet pēc dažām nedēļām mēs atņemsim brīvību.
Un jūs redzēsiet un sapratīsit, kā tas patiešām tiek darīts.
Labi, kā tad ar šo.
Tagad pāriesim uz kaut ko nedaudz līdzīgāku Scratch, burtiski,
izveidojot citu programmu, ko šeit sauc par meow-- tātad meow.c.
Mums šim nebūs nekādu audio iespēju .
Mēs paļausimies tikai uz print.
Un pieņemsim, ka es gribēju uzrakstīt programmu un redzēt, kas simulē
kaķa ņaudēšanu.
Tāpēc man pagaidām nav vajadzīga nekāda lietotāja ievade.
Tāpēc es tikai izmantošu stdio.h.
Es šeit izveidošu savu parasto int main(void).
Un tad es vienkārši iešu uz priekšu un izveidošu printf meow, reversā
slīpsvītra, n.
Un lai šis kaķis ņaud trīs reizes, piemēram, kā pagājušajā nedēļā.
Tāpēc es izveidošu meow, meow, meow.
Ikreiz, kad iezīmēsit rindas, ņemiet vērā, ka parādīsies mazi
punktiņi.
Šī ir tikai vizuāla norāde, kas ļauj noskaidrot, cik atstarpes esat
indentējuši.
VS Code, tāpat kā daudzi redaktori, automātiski indentēs kodu jūsu
vietā.
Es neesmu spiedis atstarpes taustiņu četras reizes katru reizi.
Es pat neesmu spiedis Tab.
Tomēr C valodā ir pieņemts, ka vajadzības gadījumā indentēt rindas ar
četrām atstarpēm — tātad nevis trim, nevis piecām.
Un šie punkti palīdz jums redzēt lietas tā, lai tās vienkārši
sakārtotos labā stilā.
Labi, tātad šī programma, ko es tikai tagad izvirzīšu, patiešām
darbosies.
Make meow — kas ir diezgan jauki — un tagad meow.
Tur, trīs reizes.
Pareizi.
Tas ņaud trīs reizes.
Bet, protams, tas nav labi izstrādāts.
Pagājušajā nedēļā tas nebija labi izstrādāts programmā Scratch.
Kas man būtu jādara citādāk?
AUDITORIJA: Cikls?
AUDITORIJA: Tas varētu būt cikls.
Tā ir lieliska iespēja ciklam.
Jo, ja vēlaties mainīt šo vārdu lielo burtu lietojumu vai vēlaties
mainīt skaņu, piemēram, suņa riešanu “vau” vai kaut ko citu, jums tas
ir jāmaina vienā, divās, trīs vietās.
Un tas ir vienkārši stulbi, vai ne?
Kodā ideālā gadījumā lietas jāmaina vienuviet.
Tātad kā es to varētu izdarīt?
Nu, mēs varētu ieviest ciklu, jā.
Bet mums būs vajadzīgs vēl viens būvēšanas bloks, kas mums bija
Scratch, proti, tās lietas, ko sauc par mainīgajiem.
Tāpēc atcerieties, ka mainīgais kā algebrā — x, y, zun tamlīdzīgi —
var glabāt vērtību jūsu vietā.
Un Scratch mainīgais varēja izskatīties šādi.
Jūs izmantojat šo oranžo puzles gabalu, lai noteiktu jebkura
nosaukuma mainīgo, nevis tikai x, y vai z.
Bet jūs to varētu nosaukt par kaut ko aprakstošāku, piemēram,
counter, un jūs varat iestatīt to vienādu ar kādu vērtību.
C valodā veids, kā to izdarīt, ir līdzīgs sintaksei, ko līdz šim esam
redzējuši .
Vispirms sakiet vajadzīgā mainīgā nosaukumu, vienu vienādības zīmi un
pēc tam vērtību.
Jūs vēlaties arī to inicializēt, kopējot no labās puses uz kreiso.
Tāpēc ka vienādības zīme atkal apzīmē piešķiršanu no labās uz kreiso
pusi.
Tomēr ar to nepietiek.
Iespējams, jūs jau nojaušat.
Kas, iespējams, trūkst šajā koda rindā, lai izveidotu mainīgo?
AUDITORIJA: Int.
DEIVIDS DŽ. MEILANS: Tāpēc mums ir nepieciešams int, lai dators zina,
ka tas patiešām ir int.
Un visbeidzot, arī semikolu.
Un tas tagad pabeidz domu.
Tātad tas ir nedaudz kaitinošāk nekā Scratch, taču mēs sākam šeit
redzēt modeļus.
Tātad ne katrs sintakses fragments būs jauns.
Labi, ja vēlaties palielināt skaitītāju par vienu, Scratch izmanto
darbības vārdu change, un tas nozīmē pievienot vērtību skaitītājam.
Tātad ja es vēlos palielināt esošo mainīgo, ko sauc par counter, šī
sintakse ir nedaudz interesantāka.
Izrādās, ka kods izskatās šādi, kas gandrīz šķiet paradokss.
Kā var counterbūt vienāds ar counter plus 1?
Matemātika tā nedarbojas .
Bet atkal viena vienādības zīme ir piešķiršana no labās uz kreiso
pusi.
Tas nozīmē: ņemiet neatkarīgi no skaitītāja vērtības, pievienojiet
tam 1 un kopējiet šo pašā skaitītājā vērtību no labās puses uz kreiso
.
Jums joprojām ir nepieciešams semikols, taču es apgalvoju, ka,
atjauninot esošu mainīgo, jums nav jāpiemin atslēgvārds int.
Tātad tikai tad, kad veidojat mainīgo programmā C, jūs izmantojat
vārdu string vai vārdu int, vai kādu no citiem, ko mēs galu galā
redzēsim, tikai veidojot vai inicializējot to pirmo reizi.
Pēc tam, ja vēlaties to mainīt, tas vienkārši pastāv.
Tas ir vārds, ko jūs tam iedevāt.
Dators ir pietiekami gudrs, lai vismaz atcerētos, kāda veida tas ir.
Tātad šī rinda tagad ir pabeigta. Izrādās, ka kodā, kā mēs redzēsim,
ir diezgan izplatīti apvienot lietas kopā, palielināt tos par vienu.
Tātad vienai un tai pašai idejai faktiski ir atšķirīga sintakse.
Īpašs termins šeit ir sintaktiskais cukurs.
Kodā bieži ir daudz veidu, kā veikt vienu un to pašu, lai gan dienas
beigās tie veic tieši to pašu funkciju.
Piemēram, ja pēc dažām CS50 dienām jums šķiet apnicīgi turpināt
rakstīt kādu programmu, varat to vienkāršot šādi.
Tas ir sintaktiskais cukurs.
Varat izmantot plus vienāds un tikai vienu reizi pieminēt mainīgā
nosaukumu kreisajā pusē, un tas vienkārši zina, ka tas nozīmē
iepriekšējo.
Tas ir tikai nedaudz kodolīgāks.
Arī šī ir tik ierasta lieta, lai vērtībai pievienotu 1.
Un tam nav jābūt 1.
Bet šajā gadījumā tā ir.
Bet, ja tas patiešām ir 1, varat vēl vairāk samazināt kodu; lai šo
izdarītu - counter++.
Tātad jebkurā laikā iekš C, kad redzat ++, tas nozīmē burtiski
pievienot 1 šim konkrētajam mainīgajam.
Ir arī citi veidi, kā to izdarīt citā virzienā.
Ja vēlaties no mainīgā atņemt 1, varat izmantot jebkuru no
iepriekšējās sintakses, plusa vietā izmantojot mīnusa zīmi, vai arī
varat saīsintātāk izveidot counter.
Tas ir veids, kā to darītu tipisks C programmētājs.
Labi, ja mums nav mainīgo, iesim un atrisināsim ņaudēšanu ar ciklu.
Tātad programmā Scratch mēs redzējām šādus ciklus.
Tas, protams, lika kaķim ņaudēt trīs reizes.
Kā mēs to darām programmā C?
Tagad šeit lietas koda ziņā kļūst nedaudz sarežģitākas .
bet, ja jūs saprotat katru rindiņu, mēs loģiski sekosim notiekošajam.
Tātad šeit, es apgalvoju, ir viens no veidiem, kā ieviest ciklu, kas
atkārtojas trīs reizes C valodā.
Un tas ir diezgan smieklīgi, vai ne?
Mēs pārgājām no divām ļoti vienkāršām puzles detaļām kāšis, mans
Dievs, tas ir 1, 2, 3, 4, 5, 6 koda rindiņas, kas visas ir diezgan
sarežģītas.
Tātad tas strauji saasinājās.
Bet ko dara katra rindiņa?
Un mēs redzēsim citus veidus, kā to izdarīt vienkāršāk.
Tāpēc mēs inicializējam mainīgo, ko sauc par counter to 3, tāpat kā
iepriekš.
Nu, ko tas nozīmē ciklam vai atkārtot kaut ko trīs reizes?
Tas ir tāpat kā darīt kaut ko trīs reizes un tad to izveidot, un tad
count uz leju, un tad to izdarīt , un tad count uz leju, un tad
izveidot to, līdz viss ir beidzies.
Tātad šis ir mainīgā lieluma deklarēšana, ko sauc par skaitītāju,
iestatot to vienādu ar 3.
Tad es inducēju cikluk iekš C, kas pēc būtības ir līdzīgs 3
atkārtojumam, bet jums ir jāveic vairāk matemātikas pašam.
Tātad es uzdodu jautājumu iekavās, kamēr count ir lielāks par 0, ko
es vēlos darīt?
Atbilstoši indentācijai figūriekavās es gribu vienreiz ņaudēt.
Un, lai būtu skaidrs, ko dara šī pēdējā koda rindiņa?
Ja counter sākas ar trīs, tas padara to par 2, no tā atņemot 1.
Kas tad notiek?
Pēc cikla būtības, tāpat kā Scratch, tas zina, kā iet uz priekšu un
atpakaļ.
lai gan iekš Scratch ir jauka, skaista bultiņa, bet šeit tās nav, C
zina, ka tas ir jādara atkal un atkal, un atkal, pastāvīgi uzdodot šo
jautājumu un beigās atjauninot šo vērtību.
Tātad ja es izceļu tikai dažus no šiem soļiem, mainīgais sākas ar 3.
Un patiesībā ļaujiet man vienkāršot 2.
Iepriekš es apgalvoju, ka, izmantojot atsevišķus mainīgos, cilvēki
ļoti bieži to sauc tikai par i int vietā vai c, lai apzīmētu char,
vai s kā string, ja vien jums nav vairāku mainīgo.
Tāpēc ļaujiet man samazināt kodu.
Un tas jau liek tam izskatīties nedaudz panesamāk.
Ļaujiet man to vēl vairāk samazināt, pievienot vēl vienu soli.
Tātad tagad šis kods ir tik stingrs un kodolīgs, cik šobrīd iespējams.
Kas tad īsti šeit notiks?
Nu, tiek izpildīta pirmā koda rinda, kas inicializē i uz 3.
Tad mēs pārbaudām stāvokli.
Kamēr i ir lielāks par 0, vai i ir lielāks par 0?
Nu, uz maniem trim pirkstiem - acīmredzot .
Tāpēc mēs izdrukājam meow uz ekrāna.
Tad mēs atņemam 1 no i, un tagad mums ir 2 kā i vērtība.
Pēc tam kods atgriežas atpakaļ stāvoklī.
Un ievērojiet, nosacījums ir iekavās.
Tā ir vēl viena Būla izteiksme.
Tātad cikli var izmantot Būla izteiksmes, tāpat kā nosacījumi lēmumu
pieņemšanai izmanto Būla izteiksmes.
Tomēr cikls izlemj nevis to, vai darīt to vai citu, bet gan to, vai
darīt to pašu vēlreiz, atkal un atkal.
Un, kad tas atzīmē kodu vienu rindiņu pēc otras, tas galu galā
samazināsies līdz 1, tad 0 un pēc tam apstāsies.
Izsakoties citā veidā — šeit bija dažas iestrādnes — pieņemsim, ka šī
bumba šeit ir jūsu mainīgais, un jūs to inicializējat uz 3 ar trim
stresa bumbiņām, varat kaut ko izveidot trīs reizes, vai ne?
Ja es vēlos izdalīt trīs stresa bumbas, šeit ir jūsu iespēja iegūt
bezmaksas stresa bumbas, neatbildot uz jautājumiem.
Labi, ejam.
Tātad mēs sākam, atņemot 1 no mana mainīgā.
Man paliek divi.
Ak Dievs.
Labi, nesakiet Sandersam.
[RŪC] Ak, es atvainojos.
Ak.
[SMIEKLI]
Labi, tas beidzās slikti.
Atvainojos.
Taču tagad izglītojošais aspekts ir tāds, ka mans mainīgais ir
samazinājies, lai tikai būtu — es vairs tik tālu nemetīšu.
Es to nevaru izdarīt.
Labi, lūk.
Un viena pēdējā atņemšana.
Un tagad mūsu mainīgais ir atstāts tukšs.
Tātad mums tur bija trīs stresa bumbas, un tas ir viss mainīgais.
Tā ir sava veida krātuve.
Tas faktiski, protams, ir ieviests datora atmiņā.
Bet metaforiski, tā tiešām ir tikai bļoda ar dažām vērtībām.
Un katru reizi, kad jūs or, šajā gadījumā, atņemat, jūs vienkārši
maināt šī mainīgā vērtību.
Un tad kods, tikmēr, protams, iekavās, tikai pārbauda, vai bļoda ir
tukša?
Vai bļoda ir tukša?
Tas ir, vai i ir lielāks par 0 vai nē?
Vai jums ir jautājumi par to, kā mēs esam ieviesuši cilpas šādā veidā?
Un pēc nodarbības esmu jums parādā stresa bumbu.
Jautājumi par cikliem?
Labi, izrādās, ka tas ir neglīti.
Un tas patiešām sāk atņemt programmēšanas jautrību, kad jums ir
jāizraksta šī darbību secība.
Tātad izrādās, ka ir citi veidi, kā to izdarīt.
Bet vispirms loģiski paskatīsimies, kā citādi jūs to varētu izteikt,
jo ir nedaudz dīvaini, ka mēs turpinām lietot nulli.
Tātad vēl viens veids, kā to izdarīt, būtu apgriezt loģiku.
Jūs varētu pilnīgi sākt ar savu mainīgo, nosaukt to par i vienāds ar
1.
Un tad jūs varētu uzdot jautājumu, vai i ir mazāks vai vienāds ar 3?
Un ievērojiet šeit mazliet jaunu sintaksi.
Jūsu parastajā tastatūrā ir skaitlis, kas ir mazāks par vai
vienādības zīme vai lielāks par vai vienādības zīme, kā jūs rakstītu
matemātikas stundā ar 1 pār otru.
Un tā iekš C, jūs izmantojat divas rakstzīmes, mazāk nekā, kam seko
vienādības zīme vai, ja nepieciešams, lielāks par, kam seko
vienādības zīme.
Un tas loģiski ietver šo ideju.
Tāpēc ievērojiet, ka es mainu savus jautājumus.
Es inicializēju i uz 1, un tad es to palielināšu līdz 2 un pēc tam 3.
Bet, tā kā es izveidoju mazāks par vai vienāds ar, tas joprojām būs
no 1, 2, 3.
Tātad arī tas darbojas.
Līdzīgi mēs to varētu izdarīt vēl citā veidā.
Mēs varētu inicializēt i uz 0, un tad mēs varētu teikt, labi, i ir
mazāks par 3, un turpināt to palielināt.
Un es parādīju, ka šī pēdējā forma patiesībā ir viskanoniskākā.
Viscilvēciskāk varētu būt domāt no 1 līdz 3.
Visvairāk stresa bumbai līdzīgi varētu būt domāt no 3 līdz 0, skaitot
uz leju.
Kad jums paliek ērti skaitīt no 0, visbiežāklielākajai daļai
programmētāju sintakse, vienmēr ir sākt skaitīt no 0 un skaitīt līdz
mazākajai vērtībai, līdz kurai skaitāt.
Tātad kāpēc būtu nepareizi šeit mainīt to uz mazāku vai vienādu ar 3?
Kas notiktu, ja es mainītu mazāk nekā uz mazāku vai vienādu ar?
AUDITORIJA: Tas ņaudēs tikai divas reizes.
DEIVIDS DŽ. MEILANS: Jā, tas ņaudēs papildus — ceturto reizi,
patiesībā, kopumā, vai ne?
Jo jūs sāksit ar 0, tad 1, tad 2, tad 3.
Un mazāks par vai vienāds ar 3 — piedodiet — 3 dos jums ceturto reizi.
Tāpēc mēs patiešām vēlamies būt tikai par vienu mazāks.
Labi, tagad, kad mums ir šīs iespējas, ļaujiet man sniegt jums vienu
citu.
Un šim ir nepieciešams nedaudz vairāk pierašanas, bet tas, iespējams,
ir visizplatītākais veids, kā to rakstīt.
Ļaujiet man turpināt un ierosināt mums to īstenot šādi.
Ļaujiet man atgriezties pie sava koda šeit.
Ļaujiet man iedziļināties manos vairākos printfs, galu galā,
atbrīvojoties no visiem, izņemot vienu.
Un ieviesīsim to kodā.
Tātad izveidosim int i get 0, kā būtu tad, kamēr i ir mazāks par 3,
tad ejam uz priekšu un sakām printf, atvērējpēdiņas/aizvērējpēdiņas,
meow-- meow-- meow, reversā slīpsvītra, n.
Un tad mums ir jāizveido i mīnus mīnuss vai plus plus?
AUDITORIJA: Vēl vairāk.
DEIVIDS DŽ. MEILANS: Tātad plus plus, jo mēs sākam no 0 un ejam uz
augšu, bet ne līdz 3.
Ļaujiet man tagad iet uz priekšu un make meow pēc termināļa
notīrīšanas, ./meow, un tas joprojām ir tikpat pareizi.
Bet tas ir nedaudz vairāk — tas ir nedaudz labāk izstrādāts.
Jo tagad, ja es vēlos to mainīt, piemēram, no 3 līdz 30 reizēm, es to
varu tur mainīt.
Es varu pārkompilēt savu kodu.
Es varu izveidot ./meow, un darīts.
Man tas nav jākopē un jāielīmē vēl 27 reizes, lai iegūtu šo efektu.
Un es pat varu mainīt vārdu, mainot to tikai vienā vietā.
Bet izrādās, ka ir arī citi veidi, kā to izdarīt.
Un ļaujiet man iepazīstināt jūs arī ar to, ko sauc par for ciklu.
Tātad ja vēlaties kaut ko atkārtot trīs reizes, varat izmantot while
ciklu pieeju, ko mēs tikko redzējām, vai arī varat izdarīt šo .
Un tas prasa nedaudz vairāk pierašanas, bet tas kaut kā apvieno vienā
rindā visu to pašu loģiku.
Tāpēc ievērojiet, ka mums šeit ir atslēgvārds.
Un for šajā gadījumā ir tikai prievārds, kas parasti nozīmē, ka šeit
ir cikls.
Iekavās ir ne tikai Būla izteiksme.
Un šeit lietas kļūst mazliet dīvainas.
Ir trīs lietas — pa kreisi no semikola, divu semikolu vidū un pa labi
no semikola.
Šis patiešām ir vienīgais konteksts, kurā mēs redzēsim semikolus, un
tas ir dīvaini.
Parasti tas ir bijis rindas beigās.
Tagad tie ir divi no tiem līnijas vidū, taču šis ir veids, kā cilvēki
pirms gadiem nolēma to darīt.
Tātad ko tas dara?
Gandrīz tas pats.
Tas inicializēs mainīgo, ko sauc par i, uz 0.
Pēc tam tas tiks pārbaudīts.
Ja tas ir mazāks par 3, tas darīs visu, kas ir figūriekavās, un,
visbeidzot, palielinās i un atkārtos.
Tātad tikai izceļot tos pēc kārtas, sākumā i tiek inicializēts uz 0,
tāpat kā iepriekš.
Pēc tam šis nosacījums tiek pārbaudīts.
Šī ir Būla izteiksme.
Jā vai nē, patiesa vai nepatiesa būs tā atbilde.
Un, ja i ir mazāks par 3, kam tam vajadzētu būt, ja tas sākas ar 0,
tad mēs turpināsim un izdrukāsim meow.
Tad i tiks palielināts.
Tātad tas sākas ar 0.
Tagad tas iet uz 1.
Tajā brīdī Būla izteiksme tiek pārbaudīta vēlreiz.
Tātad jūs nemaināt i atpakaļ uz 0.
Šis pirmais solis notiek tikai vienu reizi.
Bet tagad jūs atkārtojat šos trīs citus svarīgākos punktus.
Es pārbaudu, vai i ir mazāks par 3.
Tas ir.
Tātad es izdrukāju meow.
Tad tas palielinās i.
Es pārbaudu, vai i, tagad 2, ir mazāks par 3.
Es izdrukāju meow.
i tiek palielināts.
Tagad pārbaudu.
Vai i ir mazāks par 3?
Nē, tā nav, jo 3 nav mazāks par 3.
Un tā visa lieta apstājas.
Un jebkurš kods, kas atrodas zem šīs figūriekavas, ja tāds ir, tā
vietā sāk izpildītiet.
Tāpat kā Scratch, jūs izlaužaties no cikla un puzles gabali tiek
aptverti.
Vai jums ir jautājumi par šo alternatīvo ciklu sintaksi, tas ir, par
for ciklu?
AUDITORIJA: Vai varat vēlreiz paskaidrot, kāpēc tas neatgriežas uz 0?
DEIVIDS DŽ. MEILANS: Atvainojiet, sakiet vēlreiz?
AUDITORIJA: Vai varat vēlreiz paskaidrot, kāpēc tas netiek
atiestatīts uz 0?
Vai varu vēlreiz paskaidrot, kāpēc tas netiek atiestatīts uz 0?
Godīgi sakot, tikai tāpēc.
Tā bija viņu izvēlētā sintakse.
Šī pirmā daļa pirms pirmā semikola tiek izpildīta tikai vienreiz
tikai tāpēc.
Tā tas ir veidots.
Viss pārējais ciklos atkal un atkal.
Un šī ir tikai alternatīva sintakse nedaudz vairāk koda rindu
izmantošanai.
Tas bija kā sešas koda rindiņas, izmantojot while ciklu.
Loģiski, ka tas ir viens un tas pats.
Programmētāji, kad viņi sāk pierast, parasti dod priekšroku tam, jo
tas tikai kodolīgāk izsaka visas jūsu domas.
Tas ir viss.
AUDITORIJA: Tas bija mans jautājums.
DEIVIDS Dž. MEILANS: Labi.
Iestrādāsim to manā meow piemērā.
Ļaujiet man atgriezties pie koda šeit.
Un ņemiet vērā, ka, ja es izceļu visas šīs līnijas, es domāju, ka mēs
varam to saīsināt.
Ļaujiet man atbrīvoties no tiem un tā vietā izveidot for int i ir
vienāds ar 0.
Un es saku vienāds ar.
Lielākā daļa programmētāju teiktu gets.
Tātad int i gets 0 nozīmē piešķiršanu — vārds get.
Tagad es izveidošu i ir mazāks par 3 i++.
Tagad šeit es izveidošu savu printf, atvērējpēdiņas/aizvērējpēdiņas,
meow, reversā slīpsvītra, n.
Un tāpēc tas patiešām ir nedaudz ciešāks.
Es domāju, divas no līnijām ir tikai figūriekavas.
Tagad tiešām ir tikai divas sulīgas koda rindas.
Ļaujiet man iet uz priekšu un izveidot meow, ./meow.
Un atkal mēs atgriežamies biznesā ar trim no tiem tikai drukājot .
Labi, ir vēl viena struktūra, kuru mums vajadzētu izpētīt tikai
tāpēc, ka tā dažreiz ir noderīga.
Šis bija forever bloks.
Un tas būtu mazliet dīvaini iekš Scratch vienkārši pateikt meow
forever vai vismaz bez gaidīšanas.
Bet iekš Scratch patiešām ir forever bloks, kas nozīmē, ka uz visiem
laikiem rīkojieties šādi.
Un es domāju, ka pagājušajā nedēļā mutiski piedāvāju vismaz vienu
piemēru, kur tas ir noderīgi.
Mūžīgi ņaudēt, nedaudz kaitinoši.
Bet vai varat iedomāties bieži sastopamus gadījumus, kad jūs varētu
vēlēties rakstīt kodu vai izmantot programmu, kas darbojas mūžīgi?
AUDITORIJA: Mūzikas atskaņošana visas spēles laikā.
DEIVIDS DŽ. MEILANS: Jā, spēlē mūziku.
Tāpat kā Spotify atskaņošanas sarakstos, tikai atkārtošana atkal un
atkal būtu sava veida cikls.
AUDITORIJA: Sadursmju pārbaude.
DEIVIDS DŽ. MEILANS: Pārbauda sadursmes programmā Scratch, lai
redzētu, vai kaut kas neatlec no sienas vai cita spraita.
AUDITORIJA: Ak, tiek pārbaudīta ievade.
DEIVIDS DŽ. MEILANS: Pārbauda ievadi.
Jā, get_string būtībā vienkārši gaida, kad es ierakstīšu kādu ievadi,
līdz to izdarīšu.
AUDITORIJA: Pārbauda laiku.
DEIVIDS DŽ. MEILANS: Pārbauda laiku un faktiski uztur cilvēka laiku
kā sienas pulkstenis.
Aiz tevis?
Vai tas ir tas pats?
AUDITORIJA: Es gribēju teikt, ka pārbauda laiku.
DEIVIDS DŽ. MEILANS: Labi, pārbauda laiku.
Un vēl vienu?
Atklāj arī taustiņu nospiešanu.
Tāpat kā Scratch, tikai gaida, kad notiks kāds notikums, tāpat kā
tālrunī vai pārlūkprogrammā.
Tāpēc ir tik daudz piemēru, kur jūs varētu vēlēties kaut ko darīt
mūžīgi — tikai tāpēc, lai redzētu atbilstošo C būvniecības bloku.
Tas ir nedaudz dīvaini, bet tas, iespējams, ir kanoniskākais veids,
kā to izdarīt iekš C.
Ja vēlaties uz visiem laikiem drukāt meow — tas būtu nedaudz traki,
jo tas burtiski drukātu un uz visiem laikiem pārņemtu jūsu datora
drukāšanu, jūs to darītu šādi.
Nu, kamēr cikls iekavās sagaida Būla izteiksmi, un Būla izteiksme
atkal ir jā/nē, patiess/nepatiess jautājums.
Bet, ja vēlaties, lai atbilde uz šo jautājumu vienmēr būtu jā — vai
tiešām, vienmēr patiesa, izrādās C valodā un daudzās valodās
vienkārši sakiet patiess, jo patiesība — TRUE — nekad maģiski
nemainīsies uz nepatiesību.
Es domāju, tas ir tikai īpašs vārds programmēšanas valodā.
Tātad sakot while true tas tikai nozīmē, ka vienmēr rīkojieties šādi.
Vēl viena izplatīta paradigma, pirms patiesība un nepatiesība kļuva
ikdienišķa, būtu nepieciešams tā vietā darīt — mainīt while 1.
Jūs varat redzēt tiešsaistes piemēros un tekstos un tamlīdzīgi, ka
while 1 patiesībā ir tas pats.
Jebkura vērtība, kas ir 0, datorā parasti tiek interpretēta kā
nepatiesa.
Jebkura vērtība, kas ir 1, vai jebkura cita vērtība, kas nav nulle,
parasti tiek interpretēta kā patiesa.
Un tāpēc arī tam būtu tāda pati ietekme, sakot while true vai while 1.
Vispārīgi runājot, lai gan patiesība mūsdienās, iespējams, ir nedaudz
skaidrāka.
Tagad mūžīga ņaudēšana nav laba lieta.
Bet pieņemsim, ka es to izdarīju ar nolūku vai nejauši.
Nu, pamēģināsim šo.
Šeit es iedziļināšos savā kodā.
Es atbrīvošos no for cikla un nomainīšu savu while ciklu uz, kā būtu,
true.
Un šajā gadījumā mēs to paturēsim — darīsim tā.
Make meow, Enter.
Un jūs redzēsit, iek izmantots nedeklarēts identifikators True.”
Tas faktiski norāda uz manis jau minēto, ka vecais veids bija 0 un 1.
Mūsdienās var teikt True vai False.
Bet True un False paši par sevi ir īpaši vārdi, kas jums jāiekļauj.
Un izrādās, ja vēlaties izmantot īpašas Būla vērtības, piemēram, šo,
ir vēl viens galvenā datne, ko mēs neesam redzējuši,kuru sauc
stdbool, kas būtībā izveido Trueu un False kā atslēgvārdus.
Alternatīvi, CS50 ietver to pašu datni.
Tāpēc CS50 biežāk to var redzēt šādi.
Tagad, ja es notīru savu termināļa logu un ievadu make meow, pēc tam
./meow un nospiežu taustiņu Enter, diemžēl tas nav labākais, ko darīt
bezgalīgi, kad atrodaties mākonī, izmantojot pārlūkprogrammu.
Šī patiešām ir pārlūkprogramma, šeit tikai pilnekrāna režīmā.
Tas nozīmē, ka es internetā sūtu uz savu datoru miljoniem meows.
Tātad tas kaut kad notiks ar jums, iespējams, ne ar meow.
Bet jūs zaudēsit kontroli pār termināļa logu.
Tāpēc, ka jūs sapināties.
Un jums ir bezgalīgs cikls.
Jūs īsti to negribējāt.
Vai varbūt jūs to gribējāt.
Jums bija interese redzēt, kas notiks.
Ko jūs darāt?
Kad ņaudēšana beidzas?
Kādas iespējas mums šeit ir?
Control-C būs jūsu draugs.
Dažreiz jums bieži to nākas lietot mākoņa vidē.
Bet atcelšanas taustiņš Control-C pārtrauks programmu, kas darbojas.
Un es apsolu, ka gandrīz visi no jums kādā brīdī nejauši izveidos
bezgalīgu ciklu, ja jūsu aprēķins ir nedaudz neatbilstošs.
Ja rodas šaubas, noklikšķiniet termināļa logā un nospiediet
Control-C-- dažreiz vairākas reizes-- un tas patiešām atcels visu,
kas tur notiek.
Šajā gadījumā es to varētu būt iecerējis.
Bet dažreiz tas patiesībā nav paredzēts.
Labi, tātad mēs jau kādu laiku esam uzskatījuši par pašsaprotamu visu
šo grafisko lietotāja saskarni un, patiešām, komandas, kuras es
rakstu, un pogas, uz kurām es noklikšķinu.
Un ļaujiet man tikai sniegt jums labāku priekšstatu par to, ko mēs
visu laiku izmantojam zem pārsega, proti, operētājsistēmu ar
nosaukumu Linux.
Tāpēc es, protams, verbāli atsaucos uz Mac datoriem un personālajiem
datoriem, jo gandrīz visi no mums savā galddatorā vai klēpjdatorā
izmanto operētājsistēmu macOS vai Windows.
Taču ir daudz citu operētājsistēmu, un vienu no populārākajām sauc
Linux.
Un Linux mūsdienās ļoti bieži izmanto serveros — uzņēmumos, kas
mitina e-pastu, uzņēmumos, kas mitina vietnes vai lietotnes, plašākā
nozīmē.
Dažiem datorzinātniekiem vai datorzinātņu studentiem bieži patīk
lielīties, ka viņi izmanto Linux tikai tāpēc, ka tāds ir.
Bet patiesībā tā ir tikai alternatīva macOS vai Windows, kas
nodrošina gan GLS, ja vēlaties, gan arī komandrindas vidi.
Interesants fakts — operētājsistēmām Windows un macOS ir termināļa
logi vai tiem līdzvērtīgi elementi.
Un galu galā varat to izmantot savā Mac vai personālajā datorā, lai
atrisinātu kādu problēmu.
Taču Linux kopā ar citām operētājsistēmām patiešām ir pazīstama ar
savu komandrindas vidi, kuru es atkal nošķīru no GLS kā komandrindas
saskarni jeb KS.
Un tas patiesībā attiecas uz termināļa logu.
Tātad, ja es šeit atgriezīšos pie VS Code un, starpcitu, ļaujiet
manaizvērt cilni un pilnībā koncentrēties uz termināļa logu, šis
termināļa logs patiesībā ir tikai jūsu komandrindas saskarne ar jūsu
pašu serveri mākonī.
Industrijas noslēpums šeit ir tāds, ka jums katram būs savs
konteiners mākonī, kas ir kā jūsu dators, kas darbojas kaut kur
internetā ar jūsu lietotājvārdu un paroli, kuram jums ir piekļuve, un
savu cieto disku, ja vēlaties, jūsu mājas mapi, kurā ir visi jūsu
nodarbību faili.
Un tas ir pieejams tikai jums, ja vien neesat iespējojis tā
kopīgošanu tiešraidē.
Tātad, kad jūs šeit ierakstāt komandas, šķiet, ka jūs tās rakstāt,
protams, savā Mac vai personālajā datorā.
Bet tie faktiski tiek nosūtīti caur pārlūkprogrammu uz kādu serveri
mākonī, kurā jūs patiešām kontrolējat savu kontu.
Tātad izrādās, ka ir arī citas komandas, kuras ir vērts zināt.
Un mēs šodien jums parādīsim tikai dažas no tām.
Un tuvāko nedēļu laikā jums būs iespējas paspēlēties arī ar citām.
Bet šīs ir dažas no pamatiem.
Un tās visas ir neticami kodolīgi, jo, protams, attiecībā uz lietām,
ko rakstāt komandrindā, cilvēki parasti nav vēlējušies rakstīt garas
komandas.
Tātad daudzas no tām šeit ir saīsinājumi.
Tātad, iespējams, visizplatītākā, ar ko es sākšu vispirms, ir ls —
mazais burts l un mazais s, kas kodolīgi apzīmē terminu angļu valodā
list - saraksts.
Tātad, ja es tagad dodos uz savu termināļa logu, kur līdz šim esmu
ierakstījis tikai kodu, kas ir VS koda lieta, lai veiktu datņu
atvēršanu, un make, kas aktivizē mana koda kompilāciju. Kā būtu, ja
es tagad ierakstītu ls?
Šeit tiks uzskaitītas visas datnes manā pašreizējā mapē--, manā
cietajā diskā mākonī, ja vēlaties.
Tātad, ja es nospiedīšu Enter, jūs redzēsit veselu virkni rezultātu.
Tagad tiem ir arī krāsu kods.
Baltās šeit beidzas ar .c.
Tās ir pirmkoda datnes, kuras es šodien rakstīju nodarbības laikā —
agree.c, compare.c, hello.c un meow.c.
Un jūs, iespējams, nojaušat, ka tās zaļās, kuru beigās parasti ir
zvaigznīte, lai apzīmētu, ka tās ir īpašas, ko apzīmē?
Viena no četrāmm pārējām.
Auditorija: Mašīnas kods?
DEIVIDS J. Malans: Jā, mašīnas kods.
Tātad tās ir manas faktiskās programmas, kurām ir identisks
nosaukums, atskaitot paplašinājumu .c.
Un zvaigznīte nozīmē, ka tie ir izpildāmi.
Tas ir macOS vai Windows pasaulē, jūs veiktu dubultklikšķi.
Bet komandrindas vidē tas nozīmē, ka, lai palaistu kodu jūs ievadāt
./ un tad nosaukumu bez zvaigznītes.
Tātad, ja es atveru savu datņu pārlūkprogrammu un es šeit nospiežu
Command-B savā datorā kā īsinājumtaustiņu, jūs redzēsit tieši to
pašu.
Tātad ls ir komandrindas saskarne datņu uzskaitīšanai jūsu kontā.
Bet šeit, tā kā es izmantoju VS Code vai jebkuru tamlīdzīgu
programmu, man ir arī grafiskā lietotāja saskarne.
Tātad tās ir tikai divas dažādas vietas, kur būt.
Varat izmantot visu, kas jums patīk.
Bet laika gaitā jūs, protams, pieradīsiet un kļūsiet prasmīgāki,
izmantojot tikai termināļa logu.
Nu, kas vēl ir šajā sarakstā?
Nu, pārtraukumā es redzēju, ka, piemēram, vismaz viens no jums bija
izveidojis datni ar nosaukumu hello, nevis hello.c.
Tātad jūs bijāt situācijā, kad to izdarījāt nejauši un nospiedāt
Enter.
Un tad jūs turpinājāt un ierakstījāt visu savu kodu šādi.
Un tad termināļa logā jūs mēģinājāt ievadīt make hello, Enter..
Un tas tagad faktiski neko nedeva.
Es nevaru,es spiežu, es mēģinu izpildīt komandu.
Man tika liegta atļauja, tāpat kā vismaz vienam no jums.
Tātad, kāpēc tā?
Nu, veiksim tikai ātru pārbaudi.
Ja es izpildu ls, tagad es redzu hello, bet hello blakus nav
zvaigznītes, kas nozīmē, ka tas nav izpildāms.
Tas ir mans kods.
Nu, ievērojiet, ka manas cilnes augšdaļa apstiprina, ak, es salaidu
dēlī.
Es savu datni nenosaucu par hello.c, kam tā vienkārši ir jābūt.
Tad ko darīt?
Nu, jūs varētu ļoti nemākulīgi nokopēt šo, izveidot jaunu datni,
ielīmēt to.
Vai nē, nē, nē.
Mēs zinām, kā tagad šeit pārdēvēt lietas, jo tā ir viena no mūsu
iespējām.
Ļaujiet man to izdarīt.
Ļaujiet man ievadīt mv, kas apzīmē angļu vārdu move - pārvietot,
hello un tad hello.c un nospiest taustiņu Enter.
Jūs redzēsit, ka cilne tiks aizvērta, jo Hello vairs nepastāv.
Bet, ja es tagad ierakstīšu ls, jūs redzēsiet, ah, tur ir hello.c.
Un, ja es tagad atveru šo datni, tad tur ir viss mans kods.
Un tagad, ja es izpildu make hello make hello - tagad es saņemu
izpildāmu datni, kura ir atjaunota..
Tātad mv, tā ir ne tikai komanda pārdēvēšanai, bet izrādās, galu galā
arī datņu pārvietošanai.
Varat arī izveidot direktorijas vai mapes.
Piemēram, ja es vēlreiz atveru VS Code un pieņemsim, ka virzu kursoru
šeit un noklikšķinu nevis uz plusa datnes ikonas, bet gan uz plusa
mapes, es varu izveidot mapi ar nosaukumu, piemēram, pset1 1.
problēmu kopai nodarbībā.
Tagad jūs redzēsit, ka tas ir tukšs, jo visas citas manas datnes
atrodas mana konta noklusējuma mapē.
Bet es varētu tur ieiet arī šādi.
Un es varētu noklikšķināt uz File, un tagad es varu izveidot jaunu
datni ar nosaukumu mario.c, kas, piemēram, ir viena no pirmajām
problēmām.
Bet tagad jūs pamanīsit, ka mario.c atrodas mapē pset1.
Tātad, ja es attālināšu un termināļa logā ierakstīšu ls, es nekur
neredzēšu mario.c.
Bet es redzu mapi pset1.
Un tā ir gaiši zilā krāsā, kam seko slīpsvītra, kas jums nav jāievada.
Tas tikai norāda, ka tā ir mape.
Tagad es vizuāli redzu augšējā kreisajā stūrī, ka pwet1 satur mario.c.
Bet, ja es mēģinu izpildīt, piemēram, make mario šeit, nevar atrast
datni mario.
Šķiet, ka tā vienkārši neeksistē.
Un tas ir tāpēc, ka atrodaties nepareizajā direktorijā.
Tātad komandrindas saskarnē tas nav tik vienkārši, kā vienkārši
noklikšķināt uz mapes, un re, tā tiek atvērta.
Jums ir jāmaina direktorija vai mape.
Un cd būs tā komanda.
Tātad, ja es vēlos faktiski mainīt uz šo direktoriju, es varu
izpildīt cd, atstarpe, pset1, Enter.
Un tagad jūs redzēsit manas tūlītējās izmaiņas.
Un šis ir tikai viens no izplatītākajiem vadlīniju punktiem, taču tas
nav vienīgais.
Tagad man joprojām ir dolāra zīme, kas norāda, kur es varu rakstīt
komandas.
Bet pirms tās es pastāvīgi redzu atgādinājumu, kurā mapē esmu.
Un mēs to ievadījām apzināti, kā to dara daudzi Linux lietotāji, lai
atgādinātu sev, kur viņi atrodas, jo atšķirībā no macOS vai Windows,
kur jums ir jauks, liels logs, kas norāda, kur jūs atrodaties,
komandrindā jums ir vajadzīgi tekstuāli atgādinājumi.
Bet tagad, ja es ierakstu ls un nospiežu Enter, kas man būtu jāredz?
Auditorija: Mario.c DEIVIDS J. Malans: Jā, mario.c.
Un tagad, ja es vēlos to atvērt — ja vēlos to faktiski kompilēt, es
varu palaist make mario šajā direktorijā, tiklīdz esmu ierakstījis
visu kodu.
Varat būt droši, ka problēmu kopās un laboratorijas darbos mēs
gandrīz vienmēr — protams, pirmajās mācību nedēļās — jums dosim tieši
tādas komandas, kuras jāievada.
Tā kā daudziem no jums tas ir jaunums, iespējams, jūs nejauši
ierakstīsit nepareizās komandas.
Nekas sevišķš.
Vienkārši atcerieties, ka jums ir dažādi veidi, kā atrisināt šīs
problēmas.
Jums ir grafiskā datņu pārlūkprogramma, kurai vajadzētu šķist nedaudz
pazīstamākai.
Bet ar laiku jūs sāksit zināt un, godīgi sakot, iespējams, dot
priekšroku šādām komandām — tātad cd direktorijas maiņai, cp datnes
kopēšanai, ls sarakstam, mkdir direktorijas izveidei — izveidojiet
jaunu mapi komandrindā, nevis ar pogu — mv pārvietošanai vai
pārdēvēšanai, rm — AUDITORIJA: Dzēšanai.
DEIVIDS J. Malans: Dzēst.
Tāpēc esiet uzmanīgi ar to.
Rmdir, dzēst direktoriju.
Un ir vēl desmitiem, simtiem citu komandu.
Daudzas no tām jums nebūs vajadzīgas, taču laika gaitā mēs sāksim
iedziļināties vairāk.
Bet galu galā šī komandrindas saskarne būs jaudīgāks mehānisms,
jaudīgāks mehānisms un galu galā efektīvāks mehānisms koda
rakstīšanai, komandu izpildei, problēmu risināšanai, datu
vispārīgākai analīzei, lai gan ņemiet vērā, ka būs īslaicīgas
grūtības tikai tāpēc, ka tas, iespējams, ir tik jauns daudziem no
jums.
Tā sakot, mums vēl ir jāatrisina dažas problēmas, taču mēs šodien
solījām cepumus.
Tāpēc iesim un paņemsim 10 minūšu pārtraukumu.
Cepumi tagad tiek pasniegti transeptā.
Un mēs atgriezīsimies šeit pēc 10.
Un līdz šim katrs no C koda piemēriem, ko esam veikuši, ir
izstrādāts, lai parādītu vienu konkrētu tēmu.
Bet mēs domājām, ka mēģināsim spert soli atpakaļ un atrisināt
vispārīgāku problēmu un sniegt jums priekšstatu par to, kad tiek
dota, piemēram, problēmu kopa vai tikai programmēšanas problēma
vispārīgāk, ar ko jūs vispār sākat un kā jūs to darāt, kā pieejat
tam, kad nav skaidrs, kāda ir vingrinājuma jēga.
Tātad, viena no manām iecienītākajām spēlēm no pagājušā gada ir šī
“Super Mario Brothers”, kas kopš tā laika ir izlaista tik daudzos
dažādos veidos.
Bet šajā oriģinālajā divdimensiju sānu ritināšanas spēlē bija daudz
tādu mākslas darbu kā šis.
Tā, piemēram, šeit augšā debesīs bija četras jautājuma zīmes.
Un mēs atklāsim, ka sākotnēji C un daudzās programmēšanas valodās ir
daudz vieglāk, daudz pieejamāk tekstuāli koncentrēties uz melnbaltām
interaktīvām programmām, nevis uz pilnvērtīgu grafiku un tamlīdzīgi,
bet vairāk par grafiskāka akustiskā tipa programmām drīzumā.
Bet pagaidām ļaujiet man pāriet un ierosināt, lai mēs mēģinātu
vienkārši ieviest ASCII art — atkal ASCII, kas ir kods, kas vismaz
angļu valodā apvieno ciparus ar burtiem šo četru jautājuma zīmju
debesīs teksta versijā..
Tāpēc ļaujiet man pāriet uz VS Code.
Es izveidošu savu mario.c versiju, kas atšķirsies no 1. problēmu
kopas.
Patiešām, 1. problēmu kopā jums būs jāizveido kaut kas līdzīgs šim,
lai gan ar tēmturi ASCII art, nevis grafika.
Un mario.c es vispirms vēlos atrisināt šo vienkāršo problēmu.
Tātad tas viss ir saistīts ar izlaidi.
Tāpēc es iekļaušu stdio.h, lai varētu izmantot printf.
Es izpildīšu savu int main(void) — vairāk par to, kāpēc mēs
turpināsim to darīt arī turpmākajās nedēļās.
Un es tikai sākotnēji izdarīšu kaut ko vienkāršu, piemēram, 1, 2, 3,
4, reversā slīpsvītra n.
Šis ir aptuveni vienkāršākais veids, kā es varu ievietot četras
jautājuma zīmes debesīs, piemēram, šīs šeit, izmantojot šādu tīru
tekstu.
Tāpēc ļaujiet man izpildīt make mario, ./mario un lūk.
Mums ir šīs četras jautājuma zīmes.
Bet mēs, protams, esam redzējuši, ka ir labāki veidi, kā to izdarīt.
Un, ja vēlaties to vispārināt, lai tur būtu piecas jautājuma zīmes,
sešas, 60 dažādas jautājuma zīmes, cikls vienmēr ir bijis atbilde,
lai mēs neatkārtotos.
Tāpēc, iespējams, man vajadzētu to pārrakstīt nedaudz elastīgāk un
pateikt kaut ko līdzīgu šim, for in i get 0, i mazāks par 4, i++.
Un tad for cikla iekšpusē es varu izveidot tikai vienu jautājuma
zīmi, bet es nedomāju, ka tas, ko es tikko izdarīju, ir pareizi.
Vai kāds jau ir pamanījis estētisko kļūdu?
Jā, kāpēc tas ir nepareizi, ja es vēlos izdrukāt to pašu?
teica, lai to izmantotu [nav saklausāms].
Tāpēc es nedomāju, ka pēc katras jautājuma zīmes es vēlos reverso
slīpsvītru n, jo mērķis atkal ir šī jautājuma zīmju rinda debesīs.
Tātad, ja es tagad to pārkompilēšu, make mario, ./mario, labi, tas ir
gandrīz gatavs.
Bet tagad man ir tāda regresija, kur dolāra zīme neatrodas uz savas
līnijas.
Tāpēc es domāju, ka man ir vajadzīga jauna rindiņa, bet es nedomāju,
ka es to vēlos šeit, jo tas nebeigsies labi.
Kurā vietā es to gribu?
Ir instinkts?
Jā, tātad ārpus for cikla.
Tik tiešām, es varu vienkārši doties zem 8. rindas un virs 9. rindas,
izveidojot jaunu.
Un tagad ir pilnīgi pieņemami vienkārši izdrukāt jaunu šādu rindiņu.
Ar to nekas cits nav jādrukā.
Tas patiešām ir simbols pats par sevi.
Tāpēc izpildīsim make mario pēdējo reizi, ./mario.
Labi, tagad mēs esam uz pareizajām sliedēm.
Ko darīt, ja mēs vēlētos izveidot kādu citu ainu no “Mario”,
piemēram, šo šeit, kur ir daudz vertikālu šķēršļu, piemēram, šie
ķieģeļi?
Ja es tagad vēlētos izdrukāt trīs ķieģeļu kolonnu — un es izmantošu
tām atsauces, nevis kaut ko grafisku, tad es domāju, ka tas ir
gandrīz gatavs, vai ne?
Es domāju, ka tagad varu — tas ir gandrīz varbūt nedaudz vieglāk.
Es varu atgriezties šeit, nomainīt jautājuma zīmi uz kaut ko tādu,
kas vairāk izskatās pēc ķieģeļa, piemēram, šo numura zīmi.
Un es domāju, ka tagad es vēlos jaunas rindiņas simbolu, jo, kad es
tagad izpildu make mario, ./mario, labi, tur ir mana četru zīmju
siena.
Ak, bet pagaidiet.
Es negribēju četras.
Es gribēju būt konsekvents tikai ar šo konkrēto ainu, tāpēc es gribu
tikai trīs.
Tāpēc es joprojām varu to mainīt vienā vietā.
Un šeit atkal ir šī paradigma.
Pat neatkarīgi no tā, vai izmantojat 4 vai 3, ja esat pieraduši
skaitīt no 0, jūs turpināsiet līdz vērtībai, līdz kurai vēlaties
skaitīt, bet ne tālāk.
Tāpēc es tur izmantoju mazāks nekā, nevis mazāks vai vienāds ar.
Tātad šī būtu parastā paradigma, lai gan jūs to varētu skaitīt tā, kā
mēs to redzējām iepriekš dažādos veidos.
Bet ko tad, ja lietas eskalējas vēl vienu līmeni tālāk?
Un, kad atrodaties “Super Mario Brothers” pazemes versijā,tur ir
daudz šo pazemes šķēršļu, tostarp tādi ķieģeļu režģi kā šis.
Un ļaujiet man pieņemt, ka, ja jūs to sagriežat, tas ir aptuveni
3 x 3 ķieģeļu režģis, kurā visi skaisti savienojas, lai iegūtu tikai
vienu lielu, lielu ķieģeli, piemēram, šo.
Tātad, ja es vēlos izdrukāt 3 x 3 režģi, tagad lietas kļūst nedaudz
interesantākas, jo līdz šim esmu drukājis vai nu vienu rindu
horizontāli vai vienu kolonnu vertikāli.
Bet mēs īsti neesam redzējuši nevienu kodu, kurā es drukāju vai
dzīvoju divās dažādās dimensijās, kā tas ir paredzēts spēlē.
Bet ļaujiet man ierosināt, ko mēs varētu darīt.
Ļaujiet man pateikt: labi, pieņemsim, ka es vēlos izdrukāt ķieģeļu
režģi 3 x 3.
Tas tiešām tā ir, ka es gribu izdrukāt, ko, trīs ķieģeļu rindas.
Režģis ir trīs rindas.
Tātad, ja es pieņemu augsta līmeņa ideju un reducēju to uz kaut ko
nedaudz vienkāršāku, kā to izdarīt?
Nu, ļaujiet man uz brīdi atbrīvoties no printf, kā es to darīju.
Un ļaujiet man tikai precizēt, ka šis for loop, lai gan tas vēl
nedara neko lietderīgu, kaut ko darīs noteiktas reizes saskaņā ar
dizainu?
Labi, trīs reizes.
Šis cikls ir gatavs.
Tas kaut ko darīs trīs reizes, vienkārši izmantojot i, lai veiktu
skaitīšanu.
Labi, ja es tagad gribu izdrukāt trīs ķieģeļu rindu vienā rindā, tas
ir diezgan līdzīgi tam, ko mēs darījām iepriekš, kad es tikai gribēju
izdrukāt četras jautājuma zīmes debesīs.
Tāpēc mēs tur esam redzējuši risinājumu.
Un es uzdrošinos teikt, ka mēs varam iekļaut vienu otrā.
Tātad, ja es vēlos izdrukāt ķieģeļu rindu, es varētu to izdarīt,
forin i get 0 i mazāks nekā 3 i++, un tad šī iekšējā cikla iekšpusē,
ja vēlaties, ļaujiet man izdrukāt vienu šādu ķieģeli.
Un tad man nepatīk, kur tas virzās, bet es domāju, ka esmu paņēmis
divas idejas un apvienojis tās.
Bet kas šobrīd varētu būt problemātisks 5. un 7. rindā?
Kas te varētu būt slikts?
Jā, aizmugurē?
Auditorija: Jūs izmantojāt to pašu veselo skaitli i.
DEIVIDS J. Malans: Jā, es izmantoju to pašu veselo skaitli i, kas,
manuprāt, varētu mani ievest nepatikšanās.
Ja es mēģinu šeit saskaitīt trīs lietas, bet pēc tam nolaupu šo
mainīgo un izmantoju to cikla iekšpusē, man šķiet, ka man vajadzētu
izvairīties no šīs nosaukumu sadursmes.
Un kāda ir laba i alternatīva?
Programmētājs, ja šādā veidā iekļauj ciklus, diezgan bieži izmantotu
j.
Jūs noteikti varētu to mainīt uz rindām un kolonnām, ja vēlaties
aprakstošākus mainīgos.
Bet i un j ir diezgan kanoniski.
Tāpēc es turpināšu un darīšu šādi, j++, nevis i++ visur.
Un ļaujiet man mēģināt to apkopot.
Tātad make mario, Enter, ./mario.
Labi, tātad šeit ir dažas lietas nepareizi.
Šis nav 3 x 3 režģis.
Bet, ja jūs saskaitāt šīs lietas, cik daudz es tiešām vismaz
izdrukāju?
Jūs droši vien varat tikai loģiski uzminēt.
Auditorija: deviņas.
DEIVIDS J. Malans: Jā, tur ir deviņas numura zīmes.
Diemžēl tie visi atrodas vienā līnijā, nevis trīs dažādās līnijās.
Tātad, kur es varu to loģiski labot?
Es noteikti izdrukāju visus ķieģeļus.
Tie vienkārši nav pareizajos līmeņos.
Auditorija: Ja pirmajā ciklā ievietosiet jaunu rindiņu, jūs iegūsit
trīs atsevišķas rindas.
Tāpēc ievietojiet jaunu rindiņu pēc pirmā cikla, šī iekšējā cikla, ja
vēlaties, iekļautā cikla, ja vēlaties.
Tāpēc ļaujiet man šeit izdrukāt tikai reverso slīpsvītru n.
Un ko šis dara?
Es domāju, ka tas to atrisinās, vienkārši pārvietojot kursoru uz
nākamo rindiņu pēc vienas rindas pabeigšanas.
Ļaujiet man izpildīt make mario, Enter, ./mario, un tagad mēs esam uz
pareizajām sliedēm.
Tātad šī ir ļoti vienkāršota šīs pašas grafikas versija, taču es
tagad izmantoju divas dažādas idejas — vai drīzāk to pašu ideju divas
reizes.
Es izmantoju vienu ciklu, lai kontrolētu kursora virzību rindu pa
rindai, pa rindai.
Bet tad šajā ciklā es eju no kreisās uz labo pusi, punkts, punkts,
punkts, punkts, punkts, izdrukājot katru no šiem individuālajiem
ķieģeļiem šādi.
Tagad šeit joprojām ir neliela nevīžība.
Ja es vēlos, lai tas vienmēr būtu kvadrāts tikai tāpēc, ka tas tā
izskatās spēlē, es varētu to mainīt uz kvadrātu 4 x 4, rīkojoties
šādi, vai 5 x 5 režģi, rīkojoties šādi.
Kāpēc šis, iespējams, nav labākais dizains, lai turpinātu mainīt
skaitļus, kad vēlos mainīt izmēru?
Kur tas varētu noiet greizi?
Auditorija: ja tas ir kvadrāts, [NESAKLAUSĀMS]
Ja tas vienmēr būs kvadrāts un augstums būs vienāds ar platumu, es
tikai radu šeit liekas problēmas, vai ne?
Beigās es salaidīšu visu dēlī.
Es mainīšu vienu, bet ne otru.
Tad tas būs taisnstūris, nevis kārtīgs kvadrāts.
Tāpēc man, iespējams, tas būtu jārisina nedaudz savādāk.
Tāpēc ļaujiet man izdarīt tā.
Manas main funkcijas augšdaļā ļaujiet man iet uz priekšu un dot sev
mainīgo, ko sauc par varbūt n, lai norādītu vajadzīgo ķieģeļu skaitu
horizontāli un vertikāli.
Un es tikai inicializēšu to uz 3 sākotnēji.
Un tā vietā, lai šeit liktu 3, es burtiski izmantošu n.
Bet es to darīšu abās vietās, lai tagad, ja es kādreiz vēlēšos to
mainīt un mainīt uz 4, 5 vai kaut ko citu, es esmu sagatavojies.
Tas ir labāk izstrādāts, jo ir mazāka kļūdu iespējamība.
Bet es tehniski tomēr varētu kaut kā visu salaist dēlī.
Es varētu tehniski nejauši uzrakstīt koda rindiņu, piemēram, n++, vai
vienkārši mainīt šī mainīgā vērtību, lai gan es nevēlos, lai tas
jebkad mainītos.
Un varbūt tas ir tāpēc, ka esmu slikts programmētājs, es
kopēju/ielīmēju nepareizi, es strādāju ar kādu, kurš nezina, ko
apzīmē n, es varu pasargāt sevi un savu kodu no tādām cilvēciskām
kļūdām, dodoties šeit uz rindu. 5.
Un tā vietā, lai deklarētu vienkāršu mainīgo, kā mēs to darījām
Scratch, es varu vēl vairāk nostiprināt savu kodu, tā sakot,
deklarējot to kā konstanti, izmantojot atslēgvārdu const.
Tātad šī ir tikai C un dažu citu valodu funkcija, kas aizsargā jūs no
sevis, proaktīvi sakot, ka n ir konstante, konkrēti skaitlis 5 vai
iepriekš skaitlis 3.
Jūs nevarat nejauši ierakstīt kodu citur, kas to mainītu.
Dators parādīs kļūdu un uztvers šo kļūdu.
Tātad tas ir tikai veids, kā programmēt nedaudz vairāk piesardzīgāk.
Dažās valodās tas ir pieejams.
Dažās valodās tā nav.
Bet kopumā tā ir laba prakse.
Tas padara jūsu kodu labāk izstrādātu, jo tas ir tikpat neaizsargāts
pret jūsu, kolēģu vai jebkura cita koda izmantotāja kļūdām.
Tāpēc ļaujiet man mainīt to atpakaļ uz 3, lai tā būtu mūsu
noklusējuma vērtība.
Bet tagad abās vietās lietoju n.
Un, ja es izpildu make mario, ./mario, mēs esam atpakaļ tur, kur
sākotnēji sākām.
Bet kods ir nedaudz labāk izstrādāts.
Un ļaujiet man arī to atzīmēt.
Visu šo laiku esmu minējis, ka pareizība ir svarīga.
Dizains ir svarīgs.
Ir arī šis stila jautājums.
Es ļoti apzināti rakstīju skaistu kodu, ne tikai sintakses izcelšana,
kas ir automātiska.
Bet ievērojiet, ka es turpinu visur skaisti ielikt atkāpi.
Ikreiz, kad man ir figūriekavas, piemēram, 4. un 14. rindā, atkāpe ir
vienā līmenī.
Kad man ir papildu figūriekavas 7. un 13. rindā, arī viss ir labi
izlīdzināts.
Tehniski runājot, datoram nerūp šāda veida atstarpes, ja tā var teikt.
Un jūs patiešām varētu radīt haosu ar šādām lietām, jo jums ir
dīvaina stila izjūta vai vienkārši esat nedaudz pavirši.
Bet patiesībā šis kods joprojām ir pareizs.
Ja es to pārkompilēju — ļaujiet man atvērt savu termināļa logu — make
mario, nav kļūdu, ./mario, tas darbojas lieliski.
Bet jūs varat iedomāties, cik kaitinoši to tagad ir lasīt pasniedzēja
asistetam, protams, bet noteikti jums nākamajā dienā, noteikti
kolēģim, kuram ir jālasa jūsu kods.
Tas ir vienkārši slikts stils.
Tas joprojām darbojas, un tas ir labi izstrādāts, jo jūs rakstāt kodu
aizsardzības nolūkā, jūs izmantojat konstanti.
Bet, mans dievs, stils ir šausmīgs.
Tagad jūs bieži ievērosit, ka ir pieejami rīki, kas var palīdzēt
formatēt kodu tā, lai tas atbilstu kursiem vai uzņēmuma stilam.
Bet šī ir muskuļu atmiņa, kuru arī jūs vēlēsieties attīstīt laika
gaitā.
Izmantojiet šos VS koda ieteikumus, jo tas jūsu vietā izvada koda
rindas, jo tas mēģina formatēt jūsu kodu lasāmā veidā.
Un, ak, mans dievs, ja un kad jūsu kodā ir kļūdas un lietām pat nav
vienāda lieluma atkāpe , jūs, cilvēks, nevarēsit apzināties, kas un
kur notiek.
Jūs tikai padarāt problēmu sev grūtāku.
Tāpēc arī izveidojiet šo ieradumu, izpaužot labu stilu.
Labi, ļaujiet man ierosināt, ka mēs nevēlamies tikai 3 x 3 režģi.
Mēs vēlamies, lai tas būtu nedaudz dinamiskāks.
Tātad, pieņemsim, ka mēs attālinājāmies no konstantes, lai izmantotu
tikai veselu skaitli, ko sauc par n.
Un jautāsim lietotājam šī režģa izmēru, uzvedinot ar get_int, kā mēs
to darījām iepriekš.
Un es to glabāšu šeit, n.
Un tad es varu turpināt un, dinamiskāk, palaist make mario, lai to
apkopotu — ups.
Ak, es nejauši salaidu visu dēlī.
Ko tas man liek darīt, kaut arī noslēpumaini?
Auditorija: jāiekļauj datne cs50.h.
DEIVIDS J. Malans: Jā, es aizmirsu iekļaut augšpusē CS50 galvenes
datni.
Un tāpēc tas nezina, ka get_int patiesībā ir derīgs.
Tātad tas ir vienkārši labojams.
Es tikai došos šeit un iekļaušu cs50.h.
Tagad es notīrīšu savu termināli un atkārtošu make mario.
Tagad viss ir labi... ./mario.
Un tagad ievērojiet, ka man tiek prasīts norādīt izmēru.
Tātad, ja es ierakstu 3, tas ir tāds pats kā iepriekš.
Ja es ierakstu 10, tas ir vēl lielāks, bet tagad tas viss notiek
automātiski.
Bet ir dažas lietas, kuras mēs nekonstatējam.
Piemēram, pieņemsim, ka es ierakstu kaķis.
Nu, to apstrādā funkcija get_int, kā es apgalvoju iepriekš.
Tā ir viena no bibliotēkas izmantošanas funkcijām.
Jums nav jāsaskaras ar kļūdainu ievadi.
Bet mēs izstrādājām tikai funkciju get_int, lai iegūtu veselu skaitli.
Mēs nezinām, vai vēlaties, lai tas būtu pozitīvs, negatīvs, nulle vai
kāda to kombinācija.
Un ir dīvaini ļaut lietotājam ievadīt negatīvu 1 režģa izmēram vai
negatīvu 3 režģa izmēram.
Un patiešām, jūsu kods neko nedara, tāpēc vismaz tas neavārē.
Bet tas ir stulbi, vai ne?
Būtu jauki piespiest lietotāju norādīt, ja viņš vēlas, lai režģis
mums sniegtu pozitīvu vērtību.
Tātad, kā mēs to varētu izdarīt?
Nu, es varētu uziet šeit un teikt, piemēram, ja n ir mazāks par 1 —
tātad, ja tas ir 0 vai negatīvs, ko es negribu, ko es varu darīt?
Nu, es varētu teikt, labi, vēlreiz dodiet lietotājam izmēra uzvedni .
Un tagad ievērojiet, es vairs nedeklarēju n, jo, tiklīdz tas pastāv,
jums nav vēlreiz jāpiemin datu tips.
Mēs to minējām iepriekš.
Bet tas ir kaut kā stulbi.
Jo tagad, kad esat devis lietotājam otru iespēju, labi, tagad es
varbūt darīšu tā — labi, ja šī n versija ir mazāka par 1, tad ejam un
uzvedināsim lietotāju trešo reizi.
Es domāju, jūs varat redzēt, kur tas muļķīgi virzās.
Tas nevar būt pareizais risinājums, lai atkal un atkal rekursīvi
rakstītu vienu un to pašu.
Kur tas apstātos?
Jums vajadzētu dot viņiem ierobežotu skaitu iespēju vai vienkārši
sajaukt savu kodu.
Tātad, kas šeit būtu intuitīvi labāks risinājums?
Aauditorija: while cikls.
DEIVIDS J. Malans: Jā, tātad kaut kāds cikls.
Mēs esam redzējuši while ciklu.
Mēs esam redzējuši for ciklu, tāpēc varbūt kāds no tiem.
Tāpēc ļaujiet man izmēģināt šo.
Ļaujiet man izdzēst šo nekārtību un atgriezties pie pirmā jautājuma.
Tātad, lai gan n ir mazāks par 1 — tātad, lai gan skaitlis nav tas,
ko mēs vēlamies, šoreiz liksim lietotājam vēlreiz norādīt izmēru.
Tagad arī šeit, tas ir labāk, jo tie ir tikai divi informācijas
pieprasījumi.
Taču skaidrs, ka 6. un 9. rinda ir gandrīz identiskas, izņemot int.
Un, ja es ieeju un mainu izmēru, ja es pievienoju šo, ja es mainu
formulējumu šeit, nomainu to uz citu valodu, man tas ir jāmaina divās
vietās.
Tas ir slikti.
Kopēt/ielīmēt, slikti.
Tātad, kas varētu būt labāks?
Izrādās, ka C ir cita paradigma, ko varat izmantot, lai apietu šo
problēmu, šo koda dublēšanos.
Būtu daudz patīkamāk, ja es tikai vienu reizi uzrakstītu kodu.
Un es to varu izdarīt, izmantojot trešā veida ciklu, ko sauc par do
while ciklu.
Tātad izrādās, ka C valodā varat to izdarīt.
Ja vēlaties iegūt tāda mainīgā kā n vērtību, vispirms vienkārši
izveidojiet mainīgo bez sākotnējās vērtības.
Tātad int n semikols nozīmē, ka mēs nezinām, kāda tā vērtība ir, jā.
Bet viss kārtībā..
Galu galā mēs tam pievienosim vērtību.
Tad es teikšu šo, do, burtiski.
Es atvēršu savas figūriekavas.
Un ko es gribu izdarīt?
Es vēlos n piešķirt get_int atgriezto vērtību, liekot lietotājam
norādīt izmēru.
Nu, kad jūs vēlaties to darīt?
Es vēlos to darīt, kamēr n ir mazāks par 1.
Un šis kods tagad sasniedz tieši to pašu mērķi, bet nekad man
neatkārtojoties.
Nu, ievērojiet šajās koda rindās tagad, es burtiski saku 6. rindā,
dodiet man mainīgo, ko sauc par n tipa veselu skaitli.
Sākotnēji tam nav vērtības, bet tas ir labi.
Jūs to varat izdarīt.
7. rindā ir teikts, rīkojieties šādi.
Ko jūs gribat darīt?
get_int, liekot lietotājam ievadīt vārda lielumu, un vienkārši glabāt
šo vērtību n.
Bet, tā kā C kods darbojas no augšas uz leju, no kreisās uz labo
pusi, tagad ir saprātīgi 11. rindā uzdot šo jautājumu. Labi, vai
pašreizējā n vērtība, kas noteikti tika iegūta 8. rindā, ir mazāka
par 1?
Un, ja lietotājs nesadarbojās — viņš ierakstīja 0 vai negatīvu 1 vai
negatīvu 3 — kas notiks?
Tas atgriezīsies šeit un atkārtos, atkārtos, atkārtos visu do while
cikla ietvaros.
Tātad do while cikls C valodā… kas nav kaut kas tāds, kas ir citās
valodās.
Python, ja jūs to zināt, nav do while cikla.
Tas, iespējams, ir tīrākais veids, kā to panākt, lai gan ir nedaudz
dīvaini, ka jums ir jādeklarē savs mainīgais, jāizveido mainīgais
augšpusē un pēc tam tas jāpārbauda zemāk.
Bet citādi tas ir līdzīgs while ciklam.
Tas tikai maina secību, kādā jūs uzdodat jautājumu.
Vai ir kādi jautājumi par šo konstrukciju?
Un do while, kopumā ir ļoti noderīgs, ja vēlaties saņemt informāciju
no lietotāja un pārliecināties, ka tā atbilst noteiktām prasībām.
Nu labi, tagad mums ir šis pamatelementspēc šī starplaika.
Kā es varu tīrīt šo kodu?
Un tad nobeigumā apskatīsim lietas, kuras mūsu kods nevar izdarīt vai
nevar darīt ļoti labi vai pareizi.
Ļaujiet man ierosināt, ka Mario galīgajā versijā ļaujiet man
vienkārši pievienot dažus komentārus.
Izrādās, ka kodā C var definēt to, ko sauc par komentāriem, kas ir
tikai piezīmes sev.
Daži no jums tos atklāja programmā Scratch.
Te ir mazas dzeltenas līmlapiņas, kuras varat izmantot, lai
pievienotu citātus vai paskaidrojumus.
C valodā ir daži veidi, kā rakstīt komentārus.
Un vispār komentāri ir piezīmes jums pašiem, jūsu pasniedzēja
asistentam, jūsu kolēģim par to, ko jūsu kods dara un kāpēc vai kā.
Tā ir neliela paskaidrojoša piezīme angļu valodā vai jebkurā citā
valodā, kas varētu būt jūsu cilvēku valoda.
Piemēram, ko es varētu darīt, ieviešot šo mario versiju, es vispirms
varētu sev uzdot šādu jautājumu - es varētu vispirms veikt sev
līdzīgu piezīmi jaunā rindā virs šī pirmā koda bloka, Iegūst režģa
izmēru.
Tā ir tikai paskaidrojoša piezīme īsā angļu valodā, kas parasti
izskaidro nākamās sešas rindas, nākamo koda daļu vai bloku, ja
vēlaties.
Būtu nedaudz pārmērīgi komentēt katru rindiņu.
Kādā brīdī programmētājam vajadzētu zināt, ko dara atsevišķas koda
rindas.
Taču ir patīkami apskatīt šo komentāru 6. rindiņā, kas sākas ar divām
slīpsvītrām, un sintakses izcelšanas fukcija to iekrāso pelēku..
Tā nav loģika.
Tā ir tikai piezīme sev.
Tas parasti sniedz man nelielu špikeri par to, kas būtu jādara šādām
koda rindām un/vai kāpēc.
Un tad šeit lejā ir otrs koda bloks, kas ir virkne līniju.
Bet kopā šis tikai, ko, izdrukā ķieģeļu režģi.
Un tāpēc tas ir vēl viens mans komentārs, kas tikai padara to nedaudz
saprotamāku, ko dara šīs aptuveni 20 koda rindiņas, pievienojot tam
dažus paskaidrojumus angļu valodā.
Bet tagad, kad man tie ir, vai nebūtu jauki, ja es varētu abstrahēt
šīs funkcionalitātes daļas, šo izmēru noteikšanu un režģa drukāšanu?
Citiem vārdiem sakot, pieņemsim, ka nezināt, ar ko sākt šajā problēmā.
Un aktuālā problēma bija burtiski ieviest programmu, kas izdrukā
dažāda izmēra ķieģeļu režģi — 3, 4, 5 vai vienalga, ko cilvēks
ievada.
Ja jums patiešām nav ne jausmas, ar ko sākt, komentāri patiesībā ir
labs veids, kā sākt, jo komentāri var būt kaut kas aptuvens tam, ko
mēs saucam par pagājušās nedēļas pseidokodu.
Pseidokods ir īss formulējums angļu valodā, kas ļauj saprast jūsu
domu, piemēram, meklējot kaut ko tālruņu katalogā, tāpat kā
iepriekšējā reizē.
Tātad, ja jūs īsti nezināt, ar ko sākt, jūs varētu darīt kaut ko
līdzīgu šim.
Piemēram, es varētu vienkārši pateikt: Iegūt režģa izmēru kā pirmo
soli un pēc tam kā otro soli Drukāt ķieģeļu režģi.
Un tas ir viss manai programmai tiktāl.
Tagad tas ir izteikts pseidokodā.
Man tur ir daži lieli vietturi.
Man vēl ir darbs darāms.
Bet vismaz man komentāros ir augsta līmeņa problēmas risinājums.
Un tagad es pat varu iet tik tālu.
Es varētu teikt, labi, pieņemsim, ka jau pastāv funkcija, ko sauc par
lieluma iegūšanas funkciju.
Es varētu darīt kaut ko līdzīgu šim.
Es varētu ievadīt int n vienāds ar get_size.
Un tagad man tikai šobrīd ir jāpieņem, ka pastāv kāda abstrakcija ar
nosaukumu get_size.
Tādas nav.
Tāda nav iekļauta CS50 bibliotēkā.
Bet es to varētu izdomāt, varu derēt.
Kā citādi es varētu rīkoties?
Pagaidām pieņemsim, ka ir arī funkcija print_grid, kas vienkārši
izdrukā n izmēra režģi.
Tātad arī šeit ir abstrakcija.
Šīs puzles detaļas neeksistē.
Šīs funkcijas vēl nepastāv.
Bet C, tāpat kā Scratch, es varu izveidot savas funkcijas.
Kā es to daru?
Ļaujiet man iet uz leju tālāk datnē.
Un saskaņā ar vispārpieņemto, jūs parasti vēlaties atstāt galveno
datnes augšdaļā.
Jo tā ir galvenā funkcija, un tieši tā ir vieta, kur cilvēka acs
skatīsies, lai redzētu, ko dara kāda koda datne.
Es vēlos izveidot savu funkciju ar nosaukumu get_size, kuras mērķis
dzīvē ir iegūt lietotāja vēlamo izmēru.
Es vēlos, lai šī funkcija atgrieztu veselu skaitli.
Un sintakse, lai to izdarītu, ir šī, pareizi, līdzīgi mainīgajam,
datu tips, ko šī funkcija atgriež.
Man nav vajadzīga šī funkcija, lai saņemtu ievades datus.
Un tāpēc es izmantošu jaunu atslēgvārdu, ko mēs faktiski izmantojām
līdz šim — vairāk par to citreiz — vienkārši saukts par void -
tukšums, kas tikai nozīmē, ka šī funkcija get_size neprasa nekādus
ievades datus.
Tam ir izvade.
Tas izvada int.
Un šī ir tikai dīvainā secība, kādā jūs to rakstāt.
Iekavās ierakstiet izvades formātu, funkcijas nosaukumu un pēc tam
ievades datus, ja tādi ir.
Un tagad es varu ieviest get_size.
Bet es jau esmu ieviesis get_size.
Vai vismaz tagad šajā stāsta punktā es vismaz konkrēti zinu, ko darīt.
Un es varētu izdomāt, iespējams, ar dažiem izmēģinājumiem un kļūdām,
labi, ja es deklarēju mainīgo un izpildu sekojošo n ir vienāds ar
get_int, liekot lietotājam norādīt izmēru, un es turpinu to darīt,
kamēr n ir mazāks par 1, kad koda bloks ir pabeigts, šeit ir jauns C
atslēgvārds, ar kuru varat atgriezt šo vērtību n.
Tāpēc es turpinu atsaukties uz šīm vērtībām, kuras dažas funkcijas
atgriež kā atgriešanas vērtības.
C valodā burtiski ir atslēgvārds, ko sauc par return - atgriezt, kas
atgriezīs jebkuru funkciju, kas izmanto attiecīgo funkciju.
Īsumā, starp 15. un 21. rindiņu tagad ir kods, kas ir identisks mūsu
iepriekšējam risinājumam, kas no lietotāja iegūst pozitīvu vērtību n.
Tā ir 1, 2 vai lielāka.
Tā nav 0 vai tā nav mazāka par 1.
Un, tiklīdz mēs iegūstam šo vērtību, mēs to atdodam kā atgriešanās
vērtību.
Ievērojiet, kā es izmantoju šo funkciju 7. rindā.
Tāpat kā ar get_int, tāpat kā ar get_string, es izsaucu funkciju —
šajā gadījumā nekā nav iekavās.
Bet tad es izmantoju piešķiršanas operatoru, lai iekopētu tā
atgriešanās vērtību savā mainīgajā n.
Un tāpēc tagad man ir funkcija, kas agrāk nepastāvēja, ko sauca
get_size, kas iegūst pozitīvu veselu skaitli neatkarīgi ne no kā.
Un tagad režģim, kā to izdarīt?
Kā izgudrot funkciju ar nosaukumu print_grid, kas izmanto vienu
argumentu, skaitli un izdrukā šāda izmēra režģi?
Nu, iesim šeit lejā.
Es uzrakstīšu šīs funkcijas nosaukumu print_grid.
Šai funkcijai ir tikai jādrukā.
Tam ir blakusefekts, kā mēs turpinām teikt.
Tāpēc es tikai teikšu, ka tam nav atgrieztās vērtības.
Tas vienkārši ir tukšs.
Tam pašam nav izvades, kā tādas.
Tā ir tikai estētiska blakusparādība.
Bet tas prasa argumentu.
Arguments ir ievade, un tā sintakse valodā C ir izmantotās ievades
veida nosaukšana un mainīgā lieluma nosaukums.
Un es to varētu saukt par jebko, ko vēlos.
Es to saukšu par size.
Es to varētu saukt par n.
Un ir pieņemami izmantot vienu un to pašu mainīgo dažādās funkcijās,
bet es to nosaukšu par size, lai tas būtu atšķirīgs.
Un tad šajā funkcijā es vienkārši nokopēšu no atmiņas to pašu kodu,
kas bija iepriekš.
for int i get 0,i mazāks par size-- 3–- vietā i++, šī iekšpusē, for
int j get 0, j ir mazāks par size j++, un tā iekšpusē izdrukājiet ar
printf vienu numura zīmi, izdrukājiet ārā pēc šī cikla vienu jaunu
rindiņu, un viss.
Tagad es to izdarīju ātri, protams.
Bet tas ir tas pats kods, ko rakstīju iepriekš.
Taču tagad, tāpat kā ar Scratch, ļaujiet man vairākas reizes
patvaļīgi nospiest taustiņu Enter, lai kodu pārvietotu ārpus
redzesloka un prāta.
Tagad man ir abstrakcijas.
Man ir puzles gabali, kas tagad pastāv, ko sauc par get_size un
print_grid, pie kuru sintakses ir jāpierod, bet tagad tie vienkārši
pastāv.
Izņemot to, ka man ir jāizdara viena lieta.
Tā kā C ir nedaudz naiva, ja mēģinu tagad ievadīt make mario un
nospiest taustiņu Enter, funkcijas get_size netiešā deklarācija ir
nederīga.
Un mēs to esam redzējuši iepriekš, kad nebiju pievienojis datni.
Kad es nebiju iekļāvis CS50 bibliotēku, get_int nedarbojās.
Bet par to šeit nav runa, jo tas nav no bibliotēkas.
Es tikko šo izdomāju.
C jūs uztver burtiski.
Un, ja šīs funkcijas definējat datnes apakšā, tās nepastāv 7. vai 10.
rindā.
Tāpēc es varētu izdarīt šo.
Es varētu, labi, labi, ļaujiet man to visu izcelt, izgriezt
starpliktuvē un ielīmēt to šeit.
Tas atrisinātu problēmu.
Es varētu vienkārši pārvietot visas šīs funkcijas savas datnes
augšdaļā.
Tas ir kaitinoši, jo tagad main ir datnes apakšā.
Lai to atrastu, būs nepieciešams ilgāks laiks.
Tas nav veiksmīgs risinājums.
Tāpēc ļaujiet man to novietot atpakaļ tur, kur tas bija apakšā.
Šī ir vienīgā reize CS50 un patiešām C programmēšanā, kur
kopēšana/ielīmēšana ir saprātīgs risinājums.
Ja nokopējat un ielīmējat katras funkcijas pirmo koda rindiņu un pēc
tam pabeidzat to ar semikolu, varat paķircināt kompilatoru, datnes
augšdaļā dodot tam pietiekamu mājienu, ka šīs funkcijas neeksistē,
pirms tās parādās tālāk kodā..
Bet šeit ir mājiens, ka tie būs.
Tādā veidā jūs varat pārliecināt kompilatoru jums uzticēties.
Tāpēc šīs citas funkcijas joprojām var būt zemāk datnē, zem main.
Bet tagad, kad es gatavoju mario... ak, sasodīts.
Ak, es teicu drukāt, nevis printf.
Mana vaina - printf.
Tātad, ja es izpildu make mario, ./mario, tagad varu ierakstīt 3, un
mēs atkal esam uz pareizajām sliedēm.
Tātad tas bija ļoti grūts veids, kā rast daudz sarežģītāku risinājumu.
Bet šis risinājums savā ziņā ir labāk izstrādāts.
Jo tagad, īpaši bez komentāriem, es domāju, paskatieties, cik īss ir
mans kods.
Mana main funkcija burtiski ir divas koda rindiņas.
Nu, es iekļāvu svarīgākās lietas savās funkcijās.
Un tagad, it īpaši, ja es strādāju ar kolēģiem vai citiem, jūs varētu
iedomāties lielu programmu sadalīt mazākās daļās, lai dažādi cilvēki
izstrādā dažādas daļas, ja vien jūs visi iepriekš vienojaties par to,
kas patiesībā ir šīs ievades un izvades.
Labi, tāpēc tagad apsvērsim, ko datori var darīt labi un ne tik labi.
C patiešām matemātiski atbalsta veselu virkni operatoru, ar kuriem
mēs varam veikt saskaitīšanu, atņemšanu, reizināšanu, dalīšanu un pat
aprēķināt atlikumu, dalot vienu skaitli ar citu.
Patiesībā, kāpēc, lai mēs neizmantotu tos ļoti vienkāršā programmā un
neizgatavotu paši savu kalkulatoru?
Tāpēc ļaujiet man pāriet uz VS Code.
Ļaujiet man iet uz priekšu un izveidot jaunu datni ar nosaukumu
calculator.c.
Un šajā datnē, turpināsim un vispirms iekļausim dažas tagad
pazīstamas galvenes datnes — cs50.h, kā arī stdio.h.
Turpināsim un deklarēsim int main(void).
Un tad iekš main darīsim kaut ko salīdzinoši vienkāršu.
Deklarēsim int un nosauksim to par x un iestatīsim to vienādu ar get
int atgriezto vērtību, aicinot lietotāju ievadīt x vērtību.
Tad iedosim sev otru mainīgo.
Mēs to sauksim, teiksim, par y.
Iestatiet vērtību, kas vienāda ar cita izsaukuma get_int atgriezto
vērtību, šoreiz pieprasot lietotājam norādīt šo vērtību y.
Un tad vienkārši turpināsim pašās beigās un izdrukāsim, teiksim, x
plus y summu, ļoti vienkāršs kalkulators.
Tāpēc es izmantošu printf, atver pēdiņas/aizver pēdiņas, %i veselam
skaitlim, reverso slīpsvītru n, lai dotu man jauno rindu.
Tad es turpināšu un izpildīšu x plus y, lai patiešām izdrukātu summu.
Ļaujiet man tagad doties uz savu termināļa logu.
Ļaujiet man izpildīt make calculator, lai apkopotu kodu.
Nav kļūdas ziņojumu, tas ir labi.
Ļaujiet man izpildīt ./calculator.
Un darīsim kaut ko līdzīgu 2 plus 2, kam, protams, vajadzētu būt
vienādam ar 4.
Un tas ir.
Bet izrādās, ka dažreiz būs ierobežojumi, ar kuriem mēs saskarsimies.
Un ļaujiet man šeit kļūt nedaudz ambiciozākam.
Ļaujiet man notīrīt termināļa logu.
Un ļaujiet man vēlreiz palaist kalkulatoru.
Un šoreiz pieņemsim, ak, x ir 2 miljardi, un ierakstīsim to pašu y.
Un, protams, tagad atbildei 2 miljardi plus 2 miljardi, protams,
vajadzētu būt 4 miljardiem.
Un tomēr tā nav.
Interesantā kārtā, mēs redzam šeit negatīvu skaitli, kas liek domāt,
ka plus operators nedarbojas tik labi, kā mēs varētu vēlēties.
Tātad, kāpēc tas tā patiesībā varētu būt?
Nu, izrādās, ka jūsu datora iekšpusē, protams, ir atmiņa vai
operatīvā atmiņa, brīvpiekļuves atmiņa.
Un atkarībā no datora izmēra un datora tipa tas var izskatīties
līdzīgs šim — neliela shēmas plate ar šiem melnajiem moduļiem, kas
faktiski satur visus datora atmiņas baitus.
Diemžēl jums un man ir tikai ierobežots šīs atmiņas daudzums mūsu
datoros, kas nozīmē, lai cik tālu mēs vēlētos aizskaitīt, galu galā
būs ierobežojumi attiecībā uz to, cik tālu mēs varam aizskaitīt, jo
mums ir tikai ierobežots daudzums atmiņas.
Mums nav bezgalīgi daudz nulles un vieninieku, ar kuriem spēlēties.
Galu galā mums nākas būt ierobežotiem.
Tātad, kāda ir šī ietekme?
Izrādās, ka datori parasti izmanto pat 32 bitus nullēs vai
vieniniekus, lai attēlotu kaut ko līdzīgu veselam skaitlim vai C,
int.
Piemēram, mazākais skaitlis, ko mēs varētu attēlot, izmantojot
32 veselus skaitļus, protams, izmantojot 32 bitus, būtu nulle —
32 nulles,kā piemēram, šeit.
Un lielākais skaitlis, ko mēs varētu attēlot, ir visas šīs nulles
nomainot pret vieniniekiem, kas šajā gadījumā ideālā variantā mums
dotu skaitli, kas kopā ir aptuveni 4 miljardi.
Tas faktiski ir maksimāli 4 294 967 295, ja visus 32 bitus iestatāt
uz vieniniekiem un pēc tam veicat faktisko aprēķinu.
Āķis ir tajā, ka mēs, cilvēki un datori, arī dažreiz vēlamies un mums
ir jāspēj attēlot negatīvus skaitļus.
Tātad, ja vēlaties attēlot negatīvus skaitļus, kā arī pozitīvos
skaitļus ar 0, jūs nevarat vienkārši sākt skaitīt ar 0 un sasniegt
aptuveni 4 miljardus.
Jums ir jāsadala starpība un, iespējams, jāpiešķir puse no nullēm un
vieniniekiem negatīviem skaitļiem, bet aptuveni otra puse -
pozitīviem skaitļiem.
Tātad faktiski, ja izmantojat pat 32 bitus, lielākais skaitlis, kuru
dators varētu saskaitīt, noteikti tādā programmā kā šī C valoda,
izmantojot int, būtu aptuveni 2 miljardi.
Tas ir 2 147 483 647.
Bet medaļas otra puse ir tāda, ka mēs varētu arī tagad, izmantojot
dažādus bitu modeļus, attēlot negatīvus skaitļus, līdz pat aptuveni
negatīviem 2 miljardiem.
Bet, protams, tas nozīmē, ka, ja mums ir tikai ierobežots bitu skaits
un mēs varam skaitīt tikai tik daudz, kādā brīdī mums, tā sakot,
beigsies biti.
Citiem vārdiem sakot, mēs sastopamies ar to, ko parasti sauc par
veselu skaitļu pārpildi, kad vēlaties izmantot vairāk bitu, nekā jums
ir pieejams.
Un rezultātā jūs pārpildat pieejamo vietu.
Ko tas patiesībā nozīmē realitātē?
Pieņemsim, ka jums ir tikai trīs biti, bet es iekrāsošu ceturto bitu
pelēku, lai norādītu, kur mēs galu galā vēlamies ievietot papildu
bitu.
Ja tas, protams, ir 0, nedēļā 0 diskusiju, tas ir 1, 2, 3, 4, 5, 6, 7.
Tātad ideālā gadījumā binārajā formātā, ja vēlaties šai vērtībai 7
pievienot vēl vienu, jums būs matemātiski jāpārnes 1, un ideālā
gadījumā tas dotu 1000.
Bet, ja jums nav četru bitu un jūsu dators ir tikai tik sarežģīts,
lai tajā būtu trīs biti, pat ne 32, bet trīs, tas nozīmē, ka tas
faktiski sastāda nevis 1000, bet gan 000.
Šeit vienkārši nav vietas, kur glabāt ceturto bitu, ko esmu šeit
iekrāsojis pelēkā krāsā, proti, jūsu veselais skaitlis var tikt
pārpildīts.
Un, tiklīdz jūs sasniedzat 7, nākamais skaitlis, pievienojot 1,
faktiski būs 0 vai vēl ļaunāk, kā mēs šeit redzējām manā kodā,
negatīva vērtība.
Tātad, ko mēs varētu darīt, lai novērstu šāda veida bažas?
Nu, C ir ne tikai veseli skaitļi vai inti.
Tai ir arī lielie veselie skaitļi, kas, kā norāda nosaukums, ir tikai
lielāki veseli skaitļi, kas nozīmē, ka tiem ir pieejami vairāk bitu.
Tāpēc ļaujiet man atgriezties pie sava koda šeit.
Es notīrīšu termināļa logu.
Un ļaujiet man iet uz priekšu un mainīt savus veselos skaitļus uz
burtiski lielajiem šeit,lielajiem šeit.
Man būs jāmaina sava funkcija CS50 bibliotēkā, lai tā nebūtu get_int,
bet gan get_long.
Un tā patiešām ir vēl viena funkcija, kuru mēs nodrošinām bibliotēkā.
Ļaujiet man mainīt arī šo get_int uz get_long.
Es nemainīšu savus mainīgo nosaukumus, taču man ir jāveic vēl viena
izmaiņa.
Izrādās, ka printf atbalsta arī citu formātu kodus - tātad ne tikai
%i veseliem skaitļiem vai %s simbolu virknēm, bet arī, piemēram, %li
long - lielam veselam skaitlim, kā arī % f peldošā komata vērtībām ar
decimāldaļām .
Tā sakot, ejam uz priekšu un mainīsim manu printf rindiņu, lai tā
būtu nevis %i, bet gan %li.
Tagad ļaujiet man iet uz priekšu un vēlreiz izpildīt make
calculator — tagad nav redzamu kļūdu — ./calculator.
Un 2 plus 2 joprojām ir vienāds ar 4 tāpat kā iepriekš.
Bet tagad, ja es vēlreiz izmantoju kalkulatoru un ievadum vēlreiz 2
miljardus, kā arī 2 miljardus y, iepriekš mēs pārpildījām vesela
skaitļa lielumu un ieguvām dīvainu negatīvu skaitli, jo modelis tika
nepareizi interpretēts, tā teikt, kā negatīvs.
Bet lielais, tā vietā, lai izmantotu 32 bitus, parasti izmanto 64
bitus, kas nozīmē, ka mums ir vairāk nekā pietiekami daudz rezerves
bitu, ko izmantot, ja mēs pievienojam 2 miljardi plus 2 miljardi.
Un tagad faktiski mēs saņemam pareizo atbildi — 4 miljardi, kas
ietilpst lielā veselā skaitļa izmērā.
Tātad, lielais var aizskaitīt diezgan tālu..
Un patiesībā tas var sasniegt pat 9 kvintiljonus.
Un tas mums dos daudz garāku ieskriešanās joslu .
Bet, protams, arī tas galu galā būs ierobežots.
Tātad, ja jums ir skaitļi, kuriem ir jābūt lielākiem, jums joprojām
var būt problēmas.
Tagad ir vēl viena problēma, ar kuru mēs varētu arī saskarties.
Un mēs to varam redzēt pat šī vienkāršā kalkulatora kontekstā.
Datori arī cieš no potenciāli tā sauktās noapaļošanas, jo īpaši tad,
ja veicat aprēķinus, izmantojot peldošā komata vērtības, proti,
skaitļus ar decimāldaļām, jūs varat nejauši, neapzināti noapaļot
vērtību, tas nozīmē, ka tiek zaudēts viss pēc komata.
Tātad patiesībā ļaujiet man atgriezties pie VS Code šeit.
Es notīrīšu savu termināļa logu.
Un joprojām izmantosim lielus veselus skaitļus, bet ejam uz priekšu
un šeit saskaitīšanas vietā izmantosim dalīšanu.
Tāpēc ļaujiet man mainīt šo plus uz dalīšanas operatoru.
Ļaujiet man iet uz priekšu un pārkompilēt kodu šeit, izmantojot make
calculator.
Ļaujiet man iet uz priekšu un palaist ./calculator, un ļaujiet man
turpināt ievadot, piemēram, x ir 1 un y ir 3.
Un mēs redzēsim,ka… pagaidiet nedaudz.
Es uzzināju, ka 1 dalīts ar 3 vajadzētu būt 1/3.
Bet peldošā komata vērtībā tam vajadzētu būt 0,33333, varbūt ar
nelielu līniju virs tās, kā pamatskolā, bet patiesībā bezgalīgs
trijnieku skaits.
Un tomēr šķiet, ka esam pazaudējuši vismaz vienu no šiem trim pēc
komata, jo atbilde šeit atgriežas kā tikai 0.
Tātad, kāpēc tas tā varētu būt?
Ja es zinu, ka diviem veseliem skaitļiem, dalot vienu ar otru, man
būtu jādod daļa, peldošā komata vērtību ar decimālzīmi, es nevaru
turpināt lietot veselus skaitļus vai pat, šajā gadījumā, lielos
veselos skaitļus, kuri neatbalsta decimālkomata lietojumu.
Ļaujiet man nomainīt šo formāta kodu no %li uz %f, kas atkal
apzīmēpeldošā komata vērtību, nevis lielu veselu skaitli vai pat
veselu skaitli.
Un ļaujiet man turpināt un definēt, iespējams, trešo mainīgo, z, kā
skaitli ar peldošo komatu.
Tāpēc es došu sev mainīgo z, kas vienāds ar x dalīts ar y.
Un tagad tā vietā, lai drukātu x dalītu ar y, izdrukāsim z.
Tāpēc tagad es darbojos peldošā komata vērtību pasaulē, jo es
proaktīvi domāju, ka liels vesels skaitlis vai vesels skaitlis, kas
dalīts ar citu šādu vērtību, ja tam ir paredzēts daļskaitlis, ir
jāglabā peldošā komata vērtībā, kaut kas ar komatu.
Ļaujiet man šeit doties uz savu termināļa logu un atkārtoti palaist
make calculator — šķiet, ka darbojas labi — ./calculator, un vēlreiz
izpildīsim 1 dalīts ar 3.
Un joprojām šeit mēs redzam visas nulles.
Tātad mēs redzam vismaz decimālkomatu, tātad esam panākuši zināmu
progresu, pateicoties %f un skaitlim ar peldošo komatu.
Bet šķiet, ka mēs jau esam noapaļojuši vērtību 1, kas dalīta ar 3.
Tātad, kā mēs patiesībā varam apiet šo problēmu?
Ja jūs, programmētājs, zināt, ka jums ir darīšana ar pasauli, kas
jums dos peldošā komata vērtības ar decimālzīmēm, jums, iespējams,
būs jāizmanto tā sauktā funkcija, kas pazīstama kā tipa pārveidošana,
proti, viena datu tipa pārveidošana citā, skaidri pasakot
kompilatoram, ka vēlaties to darīt.
Tagad, kā to izdarīt?
Nu, atgriezīsimies pie mana koda šeit.
Un, ja problēma būtībā ir tāda, ka C joprojām uzskata x un y kā
veselus skaitļus — vai tehniski, kā lielos bez komata — un dala vienu
ar otru, tāpēc tajā nav vietas, tā sakot, skaitļiem aiz
decimālkomata, kāpēc es to nelaboju?
Ļaujiet man, izmantojot nedaudz jaunu sintaksi ar iekavām, norādīt,
ka es vēlos proaktīvi pārvērst x no lielā uz peldošo.
Ļaujiet man proaktīvi norādīt, ka vēlos arī y pārvērst no lielā uz
peldošo.
Un tagad ļaujiet man turpināt un ticēt, ka nz vajadzētu būt
rezultātam, dalot nevis lielo veselo ar lielo veselo vai veselo ar
veselo, bet gan peldošo ar peldošo.
Ļaujiet man notīrīt termināļa logu, palaist make calculator vēlreiz —
šķiet, ka tas darbojas labi — ./calculator.
Un tagad 1, 3 un, cerams, tagad mēs tiešām redzēsim, ka mans kods ir
izvadījis 0.333333.
Un es domāju, ka, ja mēs turpinātu rādīt vairāk skaitļu pēc komata,
mēs teorētiski redzētu tik daudz šo trijnieku, cik mēs vēlētos.
Bet joprojām ir vēl viens āķis.
Un jo īpaši, ja mēs šādā veidā manipulējam ar skaitļiem datorā,
izmantojot ierobežotu atmiņas apjomu, vēl viens izaicinājums, ar kuru
mēs varētu saskarties — ne tikai veselu skaitļu pārpilde, bet arī
noapaļošana — tā ir peldošā komata neprecizitāte.
Tāpat kā mēs nevaram attēlot tik lielu veselu skaitli, cik mēs
vēlamies, izmantojot tikai int vai long, jo būs augšējā robeža, tāpat
ir noteikta robeža tam, cik precīzi var būt mūsu skaitļi.
Un tiešām, atgriezīsimies šeit pie VS Code.
Es vēlreiz notīrīšu savu termināļa logu.
Un šoreiz ļaujiet man izmantot nedaudz maz ticamu sintaksi, lai
norādītu, ka es nevēlos redzēt noklusējuma skaitļu skaitu aiz komata,
ko %f mums piešķir automātiski.
Turpināsimun parādīsim man 20 skaitļus aiz komata.
Un dīvainā sintakse šim nolūkam ir nevis %f, bet %.20, lai norādītu,
ka es vēlos redzēt 20 ciparus, nevis noklusējuma skaitu.
Ļaujiet man vēlreiz palaist make calculator.
Ļaujiet man vēlreiz izpildīt ./calculator.
Un ievadīsim 1, ievadīsim3.
Un tagad tā ir vēl dīvaināka, vai ne?
Pamatskolā jūs, iespējams, uzzinājāt, ka 1 dalīts ar 3, protams, ir
1/3.
Bet tam vajadzētu būt 0,33333 bezgalīgi daudz reižu vai uz papīra ar
nelielu strīpiņu virs tā.
Bet dators šeit veic dīvainu tuvinājumu.
Tā ir vesela virkne 3 un tad 4326744079590.
Nu, tas, kas patiesībā notiek zem pārsega, atkal ir šī peldošā komata
neprecizitātes problēma.
Ja jums ir tikai ierobežots skaits bitu un, ierobežots atmiņas
apjoms, dators patiešām var būt tik precīzs tikai intuitīvi.
Līdzvērtīgi dators ir izlēmis kādā veidā attēlot peldošā komata
vērtības.
Taču āķis ir tāds, pamatskolas matemātika: ir bezgalīgs skaitļu
skaits un bezgalīgs skaits peldošā komata vērtību, jo, ja vēlaties,
varat turpināt pievienot arvien vairāk un vairāk ciparu.
Tātad dators, ņemot vērā veidu, kā tas ievieš šīs peldošā komata
vērtības, būtībā sniedz mums vistuvāko tuvinājumu.
Tagad, kā mēs varam uzlabot situāciju?
Nu, ir viena alternatīva.
Tā vietā, lai izmantotu peldošo, es varu izmantot kaut ko, ko sauc
par dubultās precizitātes decimāldaļu, kas, kā norāda nosaukums,
izmanto divreiz vairāk bitu nekā peldošais.
Tātad parasti 32 vietā tas izmantos 64.
Un tā ir gluži kā atšķirība starp lielo veselo un veselo, kas mums
deva vairāk bitu.
Bet šajā gadījumā tas tiks izmantots lielākai precizitātei.
Turpināsim un pārveidosim x tipu uz dubulto.
Pārveidosim y uz dubulto.
Turpināsimun, izmantosim to pašu formāta kodu - %.20f joprojām ir
piemērots dubultajiem.
Ļaujiet man izpildīt make calculator.
Un tagad ļaujiet man ievadīt 1 dalīts ar 3.
Un mums joprojām daļēji ir šīs neprecizitātes.
Un to ir vēl vairāk, ja mēs aplūkojam vairāk nekā tikai 20 ciparus.
Bet tagad mums ir vairāk trijnieku aiz komata.
Tātad tas ir vismaz vairāk, un vairāk, un vairāk precīzs, bet tas nav
ideāls.
Bet tas ir vismaz precīzāks.
Tāpēc šāda veida problēmas būs jāpatur prātā ikreiz, kad darāt kaut
ko skaitliski, zinātniski, vismaz ar C valodu, kurā jūs saskaraties
ar šiem reālās pasaules aparatūras un valodas ierobežojumiem.
Tātad, vēlāk semestrī, mēs pāriesim uz valodu, ko sauc par Python.
Un tas faktiski atrisinās vismaz vienu no šīm problēmām, vienkārši
automātiski piešķirot mums vairāk bitu, tā sakot, tik cik mums tie ir
nepieciešami, vismaz veseliem skaitļiem.
Bet pat jautājums par peldošā komata neprecizitāti paliks.
Tagad, cik reālas ir šīs problēmas?
1999. gadā mēs to sajutām, kad pasaule pirms šī saprata, ka datoru un
programmatūras ieviešana tajos, glabājot mehānismus, izmantojot tikai
divus ciparus, varētu nebūt bijusi labākā ideja.
Piemēram, tā vietā, lai glabātu 1999. gadu, lai attēlotu 1999. gadu,
daudziem datoriem vietas un izmaksu dēļ bija ieradums ekonomēti un
izmantot tikai divus ciparus, lai sekotu līdzi gadam.
Problēma ir tāda, ka, ja sistēmas netika atjauninātas līdz
1999. gadam, lai atbalstītu 2000., 2001. gadu un tā tālāk, ir tāda,
ka, tāpat kā iepriekš ar veselu skaitļu pārpildīšanu, daži datori
savā atmiņā gadam var pievienot 1, 99.gads.
Tam vajadzētu būt 2000. gadam, bet, ja viņi izmanto tikai divus
ciparus, lai attēlotu gadus, viņi varētu sajaukt gadu — kā dažās
sistēmās tas ļoti iespējams varētu būt — tā vietā, liekot 1900. gadu,
burtiski sperot lielu soli atpakaļ, tā teikt.
Tātad jūs varētu domāt, ka šāda veida problēma ir aiz muguras, jo
īpaši tāpēc, ka mēs vēl jo vairāk saprotam koda un skaitļošanas
ierobežojumus.
Bet patiesībā mēs atkal saskarsimies ar šāda veida problēmu jau pēc
dažiem gadiem.
2038. gada 19. janvārī mums šobrīd lielākajā daļā datoru būs
beigušies biti, lai sekotu līdzi laikam.
Izrādās, ka pirms gadiem cilvēki nolēma izmantot 32 bitu veselu
skaitli, lai izsekotu, cik sekundes laika gaitā ir pagājušas.
Viņi izvēlējās zināmā mērā patvaļīgu datumu pagātnē — 1970. gada
1. janvāri — un tikai sāka skaitīt sekundes no šī brīža.
Tātad, ja dators saglabā noteiktu sekunžu skaitu, tas norāda datoram,
cik sekundes ir pagājušas kopš konkrētā datuma, 1970. gada
1. janvāra.
Diemžēl, izmantojot 32 bitu veselu skaitli, kā mēs redzējām, jūs
varat skaitīt tikai tik tālu, un tad jūs pārpildat šī mainīgā
lielumu.
Un tāpēc, iespējams, ja mēs līdz 2038. gada 19. janvārim netiksim tam
priekšā kā cilvēki, sabiedrība, kā datorzinātnieki, šis bits varētu
apgāzties, tādējādi pārpildot šo veselo skaitļu lielumu, atgriežot
mūs skaitļošanas ziņā 1901. gada 13. decembrī.
Ar to vēlos teikt, ka ar visām šīm skaitļošanas iespējām un kodiem
nāk pienākums pa īstam uzrakstīt pareizo kodu.
Nākamnedēļ mēs mazliet atkārtosim.
Bet pagaidām šī bija 1. nedēļa, un novēlam veiksmi ar 1. problēmu
kopu.
[APLAUSI]