home *** CD-ROM | disk | FTP | other *** search
/ Flop Magazin 33 / Flop_Magazin_33_1995_01_Raster_cs_Side_A.atr / kursc5.cap < prev    next >
Text File  |  2023-02-26  |  14KB  |  1 lines

  1. ¢    Kurs programov*n)  "C"  '*st 5.¢ ------------------------------------¢¢  ù=37,»=92,²=123,å=91,ñ=93,ó=39¢Θ definice znaku procenta, obr*cen[ho lom)tka, lev[ slo(en[ z*vorky, lev[ a prav[ lomen[ z*vorky, apostrofu.¢¢¢¢  Hned v ]vodu mus)m upozornit na z*va(nou chybu ve vysv%tlen) 'innosti p@)kazu "while" v minul[m pokra'ov*n).¢  Z*vislost pr+b%hu cyklu na podm)nce je p@esn% opa'n*, ne( jsem ji popsal. Opakov*n) p@)kaz+ uveden`ch za WHILE se prov*d), dokud plat) @)d)c) podm)nka. Program se "zacykl)" pokud platit nep@estane.¢  Nev)m, jak jsem mohl napsat &patn[ vysv%tlen), p@esto(e jsem si nejd@)ve v n%kolika p@)ru'k*ch p@e'etl, (e pr*v% t)m se li&) "C" od PASCALu, pak jsem zkou&el kontroln) progr*mky, no a pak jsem to stejn% zvrtal. Mohl bych sice tvrdit, (e jsem to ud%lal z*m%rn% &patn%, aby si na to program*to@i p@i&li sami, ale to bych kecal.¢¢¢   Opakov*n) a prohlubov*n) poznatk+ I.¢¢  Nejprve shrnu p@)kazy pro n*siln[ zm%ny pr+b%hu programu:¢¢  "break" - opou&t) cyklus, jen ten, v n%m( byl pou(it`.¢¢  "continue" - sk*'e na konec cyklu, v n%m( je pou(it`, zp+sob) tedy jeho nov` pr+b%h ╱pokud nejsou jin[ podm)nky pro jeho ukon'en)$ bez vykon*n) n*sleduj)c)ch p@)kaz+.¢¢  "return" - ukon'uje funkci, ve kter[ je pou(it` a m+(e vracet n%jakou hodnotu. Jej) typ je z*visl` na typu funkce.¢¢  "exit" - ukon') cel` program. V na&em "C" asi v+bec nen) a podle u'ebnice se pou()v* m*lo.¢¢  "goto" - je to tady, i C['ko m* p@)kaz skoku. Doposud jsem to tajil, proto(e je to p@i strukturovan[m programov*n) fuj. Sk*'e na n*v%&t), kter[ se nemus) p@edem definovat, ale jen v r*mci jedn[ funkce. V seznamu p@)kaz+ pro na&e C chyb).¢¢  V`pis programu pro zopakov*n) d@)v%j&)ch poznatk+ obsahuje 3 p@)klady z m[ nov[ u'ebnice jazyka "C", kter[ se mi zal)bily. Program m* ')st zad*van[ znaky z kl*vesnice, vypisovat je na obrazovku, mezeru a tabul*tor nahradit "ohr*dkou" a ukon'it 'innost po stisku p)smene Q.¢  Prvn) @e&en) je odstra&uj)c). P@)kaz continue je um)st%n` do p@)kazu switch, co( m+(e znesnadnit pochopen) programu. Zp+sobuje toti( skok na konec smy'ky while, proto(e switch nen) cyklem. Tak[ by zde bylo lep&) pou(it) do while, aby se prvn) 'ten) vstupu nemuselo prov*d%t zvl*&④ p@ed cyklem.¢  Druh[ @e&en) m* zapracovan[ testov*n) ukon'ovac)ho znaku hned v podm)nce cyklu. T@et) @e&en) je zkr*cen) druh[ho, ale po ]spo@e ji( nen) program tak p@ehledn`.¢¢  pozn*mka: v na&em syst[mu zad*v*n) dat z kl*vesnice nen) z@ejm% mo(n[ p@edat holou jednu mezeru. K z*m%n% dojde a( po naps*n) mezery n*sledovan[ n%jak`m jin`m znakem, kter` v&ak ji( nen) p@e'ten spr*vn%. Jak jsme si ji( v&imli d@)ve, funkce getchar╱$ bere spr*vn% jen jeden znak n*sledovan` stiskem RETURN, kter` se ch*pe jako druh` zadan` znak. Znak tabul*toru se nap)&e stiskem kl*ves ESC a TAB. Pou(it* prom%nn* je typu int, ale ]pln% shodn% program pracuje i s typem char. Pokud je jen jednoznakov*, rozd)ly se n%jak zvl*&④ neprojevuj). Ned*vno m% to hrozn% potr*pilo na ST, ne( mi program za'al chodit. ╱s pomoc) Jirky$¢¢¢   ②e&en) ]lohy v`po'tu faktori*lu I.¢¢  Jako obvykle jsem se sna(il vy@e&it zadanou ]lohu z rubriky "Hlavolamy" pomoc) jazyka "C". Vzdal jsem p+vodn) ]mysl vytvo@it algoritmicky shodn` program s Honzov`m origin*lem, proto(e obsahuje funkci logaritmu, kter* v na&em celo')seln[m C['ku chyb). Zkusil jsem sice i matematicku knihovnu, kter* umo(uje v`po'ty s desetinnou te'kou, ale zavrhl jsem jej) styl pr*ce. Mysl)m si, (e je natolik odli&n` od pou()v*n) funkc) "C" na velk`ch po')ta')ch, (e snad nem* smysl se jej u'it.¢  P@ipom)n*m, (e na&e C['ko nepova(uji za prost@edek pro tvorbu prima program+, ale p@esto nem+(e b`t na&kodu se v n%m pocvi'it. Z*kladn) p@)kazy jsou toti( nejen shodn[ s velk`mi C['ky, ale podobn[ jsou i t%m v jin`ch strukturovan`ch jazyk+, jako je PASCAL, n%jak* datab*se a pro n*s TURBOBASIC. I v n%m je mo(n[ ps*t programy bez jedin[ instrukce GOTO ╱!$ a m)t je tak nejen program*torsky "'ist[", ale i naprosto nez*visl[ na ')slov*n) @*dk+.¢  Proto(e p)&u tento kurs sp)&e pro programov*n) ne( jako v`uku jazyka, rozeberu ]lohu s faktori*lem nejprve principieln%. To pro ty, kte@) stejn% jako j* moc nepochopili Honzovy z*hadn[ v`po'etn) postupy. Zejm[na m% zar*(elo pou(it) algoritmu pro ur'en) d[lky  ')sla. Asi mi st@edo&kolsk* matematika vypadla ]pln% z hlavy, pamatuji si jen, (e s')t*n)m algoritm+ ')sel se prov*d) jejich n*soben) ale jinak nic. Pozd%ji mi to Honza vysv%tlil a nic na tom vlastn% nen). Pomoc) triku s logaritmy odhadl i vhodnou velikost dimenzov*n) pam%④ov[ho prostoru na nejvy&&) mo(n` v`sledek. Funguje to ov&em u logaritmu des)tkov[ho, nikoliv p@irozen[ho. ¢¢  Honzou zadan* ]loha p@edepisuje v`po'et faktori*lu ')sla s ]plnou p@esnost) - na v&echny platn[ ')slice. ╱ə*dn[ zaokrouhlov*n).$ Prvn) p@ek*(kou je pou()van* p@esnost dan[ho po')ta'e. Na n%jak`ch sto platn`ch ')sel asi nebude b%(n% po')tat (*dn`. Jde ov&em o p@esnost ji( naprogramovan`ch matematick`ch rutin zabudovan`ch v opera'n)m syst[mu. Po')ta' v principu nem* p@esnost omezenou nijak - v(dy④ jeho procesor um) se')st nebo ode')st dva bajty, pop@)pad% rotov*n)m bit+ n*sobit a d%lit dv%ma.¢  Pro vy@e&en) ]lohy je nutn[ napsat vlastn) n*sobic) rutinu. Je lhostejn[, jak` programovac) prost@edek se pou(ije proto(e je pot@eba skute'n% m*lo funkc).¢  Algoritmus n*soben) v)cecifern[ho ')sla znaj) jist% v&ichni 'ten*@i ze z*kladn) &koly. Jednodu&e se n*sob) jednotliv[ ')slice od nejmen&)ho @*du po nejvy&&). P@i ka(d[m ]konu se v`sledek rozd%l) na p@enos do vy&&)ho @*du a z+statek, kter` se dosad) na m)sto pr*v% n*soben[ ')slice. Z+statkem je ')slice nejni(&)ho @*du, v&echno ostatn) je p@enos do vy&&)ho @*du, kter` se p@ed dal&)m n*soben)m p@i'te k n*sleduj)c) ')slici v po@ad).¢  P@i ru'n)m n*soben) na pap)@e se u v)cecifern[ho n*sobitele prov*d) postupn[ n*soben) jeho jednotliv`mi ')slicemi a vznikl[ v`sledky se nakonec se'tou. Proto(e zadan* ]loha p@ipou&t) nejv%t&) zadanou hodnotu 100, nebude p@i pou(it) po')ta'e takov` rozklad nutn`, proto(e p@esnost matematick`ch rutin v OS posta'). Po')ta' si hrav% zapamatuje i dvojcifern[ p@enosy do vy&&)ch @*d+.¢  P@esnost v`po'tu, 'ili po'et platn`ch ')slic je teoreticky neomezen*. Praktick`m omezen)m je velikost opera'n) pam%ti, kter` siln* povaha m+(e obej)t pou()v*n)m pam%ti vn%j&), nap@)klad na disket%. Toti( na kazet% by virtu*ln) pam%t asi vytvo@it ne&lo. Jsem r*d, (e si Honza na n*s nevymyslel po')t*n) s takov`mi maxi')sli, proto(e by to byla d%sn* d@ina. Uva(ujme tak[, (e p@i v%t&)ch hodnot*ch n*sobitel+ by se musely i tyto  rozkl*dat jako p@i v`po'tech ru'n)ch z d+vodu limitovan[ p@esnosti matematick`ch rutin. ╱Brr !$¢  V&echno co pot@ebujeme pro p@eveden) algoritmu do programovac)ho jazyka je v%d%t, co je to faktori*l - posloupnost 'initel+, postupn% je n*sobit mezi sebou rozlo(en`m zp+sobem po jednotliv`ch ')slic)ch, p@i tom spr*vn% rozd%lovat meziv`sledky na p@enos a zbytek. To p@i n*soben) z hlavy d%l*me prakticky bez po')t*n) odd%len)m posledn) ')slice. Programov% se meziv`sledek rozd%l) jednodu&e pomoc) celo')seln[ho d%len) deseti a funkc) d%len) modulo, kter* d*v* zbytek operace. Ten samoz@ejm% p@i pod%len) deseti je rovn` nejni(&) platn[ ')slici.¢  Ve zdrojov[m textu @e&en) ]lohy je pou(ito n%kolik novinek. Pro vstup ')sla poslou() funkce gets╱$, kter* m* povinn` argument jm[no @et%zcov[ prom%nn[, do n)( na'te text zadan` z kl*vesnice. Je skute'n% dobr[, jak se p)&e v p@)ru'ce, prom%nnou nep@eplnit. Jinak se programu zbort) za sou'asn[ho vyd*v*n) nep@)jemn`ch zvuk+. ╱tento pr+vodn) efekt neb`v* 'ast`$¢  Obsah @et%zce lze p@ev[st na ')slo pon%kud zaml(en% popsanou funkc) val╱$ pokud je vzhledem k obsahu p@evod mo(n`. Funguje ale asi jen do trojcifern[ho ')sla, co( je divn[, ale v na&) ]loze posta'uj)c).¢  Posledn) novou funkc) je clear╱$, op%t nejasn% popsan*, z@ejm% ale skute'n% nuluje @et%zec, jinak by uveden` chybn` algoritmus musel vypo')t*vat nespr*vn[ v`sledky. Matematick* funkce d%len) modulo m* jako oper*tor znak procenta, ale to nen) nic zv*&tn)ho.¢  Pro ulo(en) v`sledku je stejn% jako v @e&en) od Honzy pou(it` znakov` @et%zec. Je mnohem ]sporn%j&) ne( ')seln[ pole, proto(e na ka(dou ')slici je t@eba jen jeden bajt. Proto by m%l b`t i rychlej&). A nakonec je snad i pr*ce s n)m jednodu&&), pokud program*tor v) jak na to . V u'ebnic)ch jazyka se ve spojitosti s pou()v*n)m @et%zc+ hovo@) o ukazatel)ch, speci*ln)ch funkc)ch pro pln%n) @et%zc+ a jejich porovn*v*n) a dal&)ch hr+z*ch, kter[ jeden m+(e zkou&et dva dny a ono stejn% nic nechod). Na&t%st) jsem se po porad% s kolegou Jirkou dozv%d%l jednoduchou pravdu o nakl*d*n) s chary. Nap@)klad "string" m+(e b`t jm[no prom%nn[ typu char deklarovan[ t@eba na d[lku 100 znak+ a pod n)m se s n) pracuje skute'n% jako s @et%zcem. Ale v`raz stringånñ adresuje p@)mo prvek @et%zce "n" a nakl*d* se s n)m jako s jednobajtov`m ')slem, pop@)pad% znakovou konstantou.¢  Obsahuje-li nap@)klad prom%nn* txt posloupnost znak+ 123, potom:¢¢  printf╱"ùs",txt$; vytiskne  123¢  printf╱"ùc",txtå1ñ$; vytiskne  2¢  printf╱"ùd",txtå1ñ$; vytiskne  50¢¢  Index 1 ukazuje na druh` prvek pole kter`m je znak 2 vyti&t%n` jako znakov* konstanta c, nebo jako ')slo 50, kter[ je ASCII vyj*d@en)m tohoto znaku a je to skute'n` obsah dan[ho bajtu @et%zce.¢   Pozn*mka:¢ Z*pis  printf╱"ùs",txtå1ñ$; je chybn`, pokud jej pou(it` p@eklada' v+bec zkompiluje, zp+sob) tisk nesmysl+¢¢  Cel` v`po'et faktori*lu je v programu odd%len do samostatn[ funkce faktorial╱$, hlavn) main╱$ slou() jen pro mo(nost op%tn[ho vyvol*n) v`po'tu nebo ukon'en) cel[ho programu. Nijak jsem se s n) nep*ral, je se&it* narychlo a nic zaj)mav[ho na n) nen).¢  Vlastn) v`po'et za')n* vstupem ')sla pro v`po'et faktori*lu. Je @e&en cyklem do while, kter` je vhodn%j&) ne( while. Pokud zadan[ ')slo nele() v intervalu 1 - 100 vrac) se zp%t na zad*n) ')sla. Pro zad*v*n) se pou(ije ta sama prom%nn* jako pro pozd%j&) v`po'et, nen) d+vod, aby tomu bylo jinak. ⇨)slo je p@evedeno do prom%nn[ typu int a @et%zec je p@ipraven pro v`po'et. Nejprve je cel` vynulov*n a potom je na nultou pozici nachyst*na jedni'ka jako v`sledek 1! a z*klad pro dal&) n*soben). Do prom%nn[ i je zad*na tak[ jedni'ka jako aktu*ln) d[lka v`sledku a sou'asn% slou() jako ukazatel na prvn) volnou pozici @et%zce.¢  Pou()v*n) prom%nn[ i m% p%kn% vypeklo. Jednodu&&) by byl algoritmus, kter` by postupn% proj)(d%l v&echny pozice @et%zce, p@e'etl bajt, p@ipo')tal p@enos, rozd%lil v`sledek, ulo(il bajt a tak d*l. Jen(e tak by se zbyte'n% po')talo i s neobsazen`mi byty a proto pou()v*m hl)d*n) d[lky v`sledku pro ka(d` pr+b%h.¢  Pr+b%hy se samoz@ejm% opakuj) a( do hodnoty zadan[ho ')sla v'etn%, p@i'em( se n*sobitel zv%t&uje o jedni'ku.¢  Vlastn) n*soben) je rozd%leno do dvou '*st). V prvn) se prov*d) n*soben) p@edchoz)ho v`sledku ')slo po ')sle beze zm%ny prom%nn[ i, v druh[ se p@)padn` vznikl` p@enos rozpo')t* na nov[ nejvy&&) pozice v`sledku za sou'asn[ inkrementace i. Proto(e p@enos m+(e b`t logicky nejv`&e dvoum)stn`, proto z*v%re'n` cyklus prob%hne nejv)ce dvakr*t.¢  Zd* se mi to b`t jednoduch[, ale n%kde m*m chybu. Pro vy&&) hodnoty n! algoritmus po')tal chybn[ v`sledky, na co( jsem p@i&el srovn*n)m s Honzov`m programem. Po "um%l[m" zv%t&en) d[lky v`sledku, co( samo o sob% nem+(e v`po'et zm%nit jsou-li byty @et%zce skute'n% vynulovan[, po')t* v`sledky dob@e. Zato do velikosti 17! p@id*v* jednu a( dv% nuly do nejvy&&)ch @*d+, co( je vada sp)&e estetick*.¢  Proto(e po posledn)m v`po'tu se p@id* jedna pozice nav)c, je po skon'en) cyklu ode'tena. P@edt)m je ale podm)nkou testov*no, jestli k p@id*n) skute'n% do&lo, jinak p@i zad*n) 1! by vy&el nulov` v`sledek.¢  Po dvou dnech zkoum*n) programu, kdy jsem ji( nebyl schopn` ')st @*dky a jen si hore'n% opakoval: "To mus) chodit !" jsem dal&) pr*ci vzdal. Mo(n* n%kdo z v*s na chybu p@ijde a po&le upraven[ @e&en), t@eba v Turbobasicu, to je u( jedno. Nem*m na mysli prost[ odmaz*n) nejvy&&)ch neplatn`ch nul, ale zabr*n)t v+bec jejich vzniku.¢  Tisk v`sledku je uskute'n%n ')slo po ')sle. Bylo by mo(n[ tisknout p@)mo @et%zec, ale a( po ]prav%. Nyn) obsahuje ')sla v kdu BCD jak p)&e Honza, kter[ se mus) p@ev[st na ASCII hodnoty. Jinak by se tiskly nesmysly a( do prvn)ho v`skytu ')sla nula. Proto(e v t[to tabulce jsou ')seln[ znaky kdovan[ ve vzestupn[ @ad%, provede se konverze jednodu&e p@i')t*n)m kdu ')slice nula. Ani nemus)me zn*t jej) kd zpam%ti nebo pracn% hledat tabulku, ╱m*m doma chaos$ n`br( pou(ijeme znakovou konstantu, asi takto:¢  våiñ = våiñ ⇩ ó0ó¢Pak by se je&t% musel v`sledek v @et%zci zrcadlov% oto'it, jinak by byl vlastn% psan` zprava doleva.¢  Ve sv[m programu jsem z*v%re'nou ]pravu vynechal, proto(e v zad*n) ]lohy byl jen tisk v`sledku na monitor a s vlastn)m @e&en)m faktori*lu nesouvis). Chyst*m ale na p@)&t% jako p@)klad pr*ce s @et%zci p%knou ]lo(ku z p@)ru'ky uv*d%n[ v rubrice RECENZE.¢  Zm)n%nou mo(nost ode')t*n) znakov[ konstanty nula bych pou(il v p@)pad% po(adavku vstupu ')sla z kl*vesnice del&)ho ne( t@i m)sta. P@ijal bych je jako @et%zec op%t funkc) gets╱$ a provedl konverzi jednotliv`ch ')slic. Jinou mo(nost v p@)ru'ce nevid)m.¢  P@i odla⇦ov*n) mi d%lal program z*sadn) chybu p@i vno@en) funkc) gets╱$ a val╱$ do sebe. Podle pou'ek to m* libovoln% j)t, ale ne&lo to.¢  Dal&) moje chyby byly nez*visl[ na pou(it[m jazyce - pokusy o pr*ci s nedeklarovan`mi prom%nn`mi. Ze za'*tku jsem tak[ psal algoritmus po')taj)c) ]pln% n%co jin[ho, to mi p@ipom%lo b%(nou pou'ku z program*torsk`ch p@)ru'ek : "Dob@e si promyslet @e&en) ]lohy". Samoz@ejm% ji p@i 'ten) jinak pova(uji za zbyte'nou a p@ehl)()m ji.¢¢                       -ZB-¢