>> [MUZIKO ludi]
>> ZAMYLA Chan: Ĉu vi prefere ricevi $ 10 milionoj nun aux ricevi
cendoj ĉiu tago de la monato, kie ĉiu posta tago, vi ricevos
duobligi la kvanton de moneroj vi ricevis la tagon antaŭe?
En cendoj, ni tuj pruvi kial vi devus
definitive preni la monerojn.
Via tasko estas skribi pennies.c--
programo kiu unue petas la uzanto kiel multaj tagoj ne estas en la monato kaj
tiam demandas kiom da cendoj la uzanto ricevos en la unua tago.
La programo devus tiam kalkuli la kvanto kiun la uzanto havos
amasigitaj en la fino de la monato kaj montri ĝin.
>> Ni povas rompi tiun programon supren en kelkaj taskoj.
Ni bezonos instigas por multnombraj uzanto enigas -
tagojn kaj monatojn kaj cendoj en la unua tago.
Ni devas konservi trako de kiom da mono la uzanto havas kaj ĝisdatigi ĝin ĉiu
tago, duobligante la kvanto de monerojn, ke ili ricevas.
Kaj fine, ni presas siajn fina tuta, en dolaroj.
>> Ni tackle Uzanta enigo unua.
Mi tuj malfermi apples.c, mallonga programo kiu traktas
kun enigoj kaj eligoj.
Ĉe la supro tie, mi inkluzivis iujn de la bibliotekoj kiuj mi bezonas -
CS50 la biblioteko kaj normo I / O biblioteko.
Mi presi prompto uzante la printf funkcio de la
norma I / O biblioteko.
Sed la efektiva instigante de la uzanto okazas en la sekva linio kun tio
GetInt funkcio en la CS50 biblioteko.
>> GetInt akiras enigon el la uzanto kaj certigu ke la enigo estas entjero.
Do mi stoki la uzanto enigo en entjera i, subtrahi 1 de i, kaj tiam
elprinti la nova valoro se mi.
Post kompili apples.c uzante la komando "fari pomoj," Mi havas
plenumebla dosiero pomoj.
Kurante, ke, mi alportas 1.
La programo diras al mi ke Mi havas 0 pomoj forlasis.
Kaj por ke laboris kiel atendita.
>> Do ni kuros ĉi denove kaj enigo negativa 1.
Nun, havanta negativan kvanton de pomoj ne vere havas sencon, sed
la programo akceptas ĝin, ĉar negativa 1, nu, tio estas entjero.
Kaj nun la programo aŭ de la monstro ene de la programo manĝas negativan
pomo, kaj nun mi havas negativa 2 pomoj.
Hm, do tio estas unu leciono -
kvankam la GetInt funkcio kaj rilataj funkcioj, kiel GetFlow aŭ
GetString akiri la rajton datumtipo, vi devas certigi ke la enigo faras
senson por via programo.
>> En cendoj, tio ne faros nur prompto por entjero, vi devas fari
certa, ke la uzanto enigas entjero ke sencon donita la kunteksto.
Monato povas havi nur 28, 29, 30, aŭ 31 tagoj.
Ni volas senĉese demandan valida entjero.
Se ili enigo entjero ekster nia akceptita baroj, ni instigas ilin
ree kaj ree, ĝis vi doni al ni valida entjero.
>> Memori la "ripetu ĝis" bloki en Scratch?
Vi povas fari similan konstruo en C uzante "dum" buklo
aŭ "do-dum" iteracio.
La dum buklo strukturo havas kondiĉo kiuj devas plenumi por la
korpo de la ciklo de ekzekuti.
>> Ĉi tiu devus aspekti iom similaj, ĉar la kondiĉo estas ĝuste kiel la
Scratch blokoj kun la anguloj kaj iras en la krampoj
de la "dum" iteracio.
Do tiu kondiĉo kontrolos ĉu la entjero estas ene
la taŭga limojn.
Vi povas instigas la entjero uzante GetInt kaj poste ekzekuti via "dum"
buklo, ripetante la prompto kaj presi instrukcioj, dum la eniro
ne estas valida.
>> Alia maniero por certigi korekta Uzanta enigo estas per uzo de "do-dum" buklo,
kio estas tre simila al Dum buklo.
La "do-dum" buklo ekzekutas la kodo interne de la korpo karaj kaj tiam ĉekojn
ĉu la kondiĉo estas konis aŭ ne.
Ĉi tio estas utila por akiri uzanto enigo, ĉar vi scias, ke vi bezonas
instigi ilin almenaŭ unufoje.
Se la kondiĉo ne konis, la programo faros la linion post
via "do-dum" iteracio.
Se la kondiĉo estas konita kvankam, la ciklo ripetos
>> Al "do-dum" buklo por validigi uzanto enigo aspektos iu kiel ĉi tio.
Mi deklaras variablon n, GetInt, kaj tiam ripeti ĝis n estas valida.
Kaj tiu procezo, mi klarigis, uzis la entjera-datumtipo, kiu
vi uzas por la tagoj de la monato.
Sed ni scias, ke la nombro da cendoj estos amasiĝas rapide, do la celo
stoki grandaj nombroj, uzu la datumtipo LongLong, sed memoru la sama
principo de kontrolada aplikas.
>> Awesome, do iam ni havas du validajn enigoj de la uzanto -
tagoj en la monato kaj la moneroj en la unua tago -
ni povas movi sur la sekvanta parton de la programo.
La unuan tagon, la uzanto komencas kun tamen da cendoj ili specifita
kaj la kvanto de cendoj, ke ili ricevas la sekvantan tagon estas dublita.
Do tio havas sencon konservi trako de ĉi tiuj du kvantoj -
kiom da mono la uzanto havas kaj kiel da cendoj ili devos esti donita.
>> Nun, farante ion por 28 al 31 tagoj estas repetitivas, do ni uzas "por"
buklo persisti pri la tagoj en la monato, ĝisdatigante la tuta kaj centono
sumo ĉiufoje.
"Por" buklo sintakso enhavas la jena -
an inicialización, kondiĉo, kaj ĝisdatigo.
Via "por" loop estos pravalorizi variablo, kiam
unua eniras la buklo.
Se la kondiĉo estas konita, la korpo de la buklo faros.
Poste, la ĝisdatigo faros.
Se la kondiĉo estas ankoraŭ renkontis, la buklo ekzekutos kaj ĝisdatigi, kaj
ripeti, tiel longe kiel via kondiĉo taksas al vera.
>> Tie estas "por" loop kiu dividas la entjero p per 2 tota de 10-foje.
Notu ke mi deklaris la entjera p ekstere de mia "por" loop, tiel ke la
entjero povas esti atingebla ekster la "por" banto.
Post la monato pasis, estas tempo por diri al la uzanto, kiom da mono
ili jam akiris.
Per la specifo, vi devas diri al la uzanto kiom da dolaroj, ne kiom da
monerojn, ili havas.
Sed ĝis nun, vi tenis spuro de la tuta kaj la moneroj uzante LongLongs,
kiuj estas tuta nombroj.
>> Esas 100 cendoj al $ 1, do se la nombro de moneroj estas
oblo de 100, vi bezonos reprezenti decimalaj.
La duobliĝis autotype permesas vi faru tion ĉi.
Nu do kiel ni konverti el reprezenti cendoj por dolaroj?
>> Ni rigardu pi.c.
Ĉi tiu programo prenas LongLong big_pi kaj dividu ĝin per 100.000, kaj presas
la rezulton al kvin dekumaj lokoj.
Se ni volis montri kvar decimala lokoj, tiam ni povas simple anstataŭigi tiun
numeron tie.
Do ni savu, kompili pi, kaj tiam vidu la rezulton, kiun ni
atendi esti 3,1415 -
la unuaj kvin ciferoj de pi.
>> Ĝi ne estas tamen.
Kaj kial?
Nu, ĉar big_pi estas LongLong, kio estas tuta nombro, kiu ne volas
teni spuri de glitpunktaj nombroj.
La modifon mi bezonas fari estas en la divido.
Mi bezonas enjxeti al duobla tie antaŭ dividanta, ĉar duobloj ne povas teni
spuri de dekumaj lokoj.
Kaj mi tuj aldonas novan linion ĉi tie por pli bona strukturado.
>> Kaj ĉi tie ni havas -
3.1416.
Vi eble rimarkos ke ĝi presas 3.1416 anstataŭ 3,1415 kiel atendita.
Tio estas ĉar ĝi ĉirkaŭvojoj dum la divido procezo, kiel kontraŭ nur
detranĉi la valoro.
Nun vi devus povi presi la fina tuta korekte, kiu finas
la programo.
>> Gratulojn.
Mia nomo estas Zamyla.
Kaj jen estas moneroj.
>> [MUZIKO ludi]