home *** CD-ROM | disk | FTP | other *** search
/ Flop Magazin 37 / Flop_Magazin_37_1995_05_Raster_cs_Side_A.atr / kursc8.cap < prev    next >
Text File  |  2023-02-26  |  16KB  |  1 lines

  1.        KURS jazyka C -  8.'*st¢¢  Celou n*pl tohoto pokra'ov*n) kursu tvo@) popis @e&en) zadan[ ]lohy od za'*tku a( po funk'n) program. ②e&en) vych*z) p@ev*(n% z dosud prob)ran`ch znalost) s minimem uveden`ch novinek.¢¢      Co jsou to "NERVY"?¢¢  Je to netypick* po'etn) ]loha uveden* v nov[m 'asopise "K@)(ovk*@sk` TV magaz)n" vy&l[m v prosinci 1995. Upozornila m% na ni moje spolupracovnice z pr*ce Ji@inka, kter* r*da lu&t) k@)(ovky.¢  Po prozkoum*n) pravidel jsem do&el k z*v%ru, (e se nejedn* o (*dnou h*danku 'i hlavolam, ale o pracnou po'etn) d@inu se zji&④ov*n)m v`sledku. V+bec si nemysl)m, (e by bylo mo(n[ odvodit si n%jak[ rovnice, 'i jin[ urychluj)c) matematick[ @e&en).¢  Zato se mi ]loha zd* velmi vhodn* ke strojov[mu @e&en), vlastn% bych @ekl, (e p@)mo k@i') po naprogramov*n). Kdy( jsem si uv%domil p@)le(itost prakticky se pocvi'it v C['ku a mo(n* z)skat i funk'n) program na mal[ ATARI, pustil jsem se do toho.¢¢       Pravidla hry NERVY¢¢  Jako v`choz) data pro v`po'et jsou zadan[ dv% tabulky hodnot. Prvn) p@edstavuje matici ')sel 10✓10, obsahuj)c) hodnoty v rozsahu 50 a( 150. Ka(d* polo(ka je graficky ztv*rn%na jako m%&ec s korunami. Druh* tabulka obsahuje 200 desetim)stn`ch ')sel a 200 dev)tim)stn`ch. Tyto se naz`vaj) rodn* ')sla.¢  K v`po'tu ka(d` pou(ije sv[ vlastn) rodn[ ')slo ╱R⇨$ nebo 'len+ sv[ rodiny. U dev)tim)stn`ch ')sel se dopln) jako des*t* ')slice nula, kter* se m+(e um)stit na za'*tek, na sedmou pozici, nebo na konec.¢  V matici m%&c+ se vyb)raj) hodnoty tak, (e um)st%n) ')slice v ')sle uva(ov*no od lev[ho okraje odpov)d* @*dek podle ')slov*n) shora dol+, vlastn) hodnota ')slice ud*v* sloupec, 'ili polohu m%&ce na @*dku. T)mto zp+sobem je ur'eno celkem deset m%&c+, jejich( obsah se prost% se'te.¢  Jako druh[ R⇨ pro v`po'et se vybere z tabulky p@ipraven`ch doplkov`ch podle jednoduch[ho pravidla kdo m* vlastn) ')slo dev)tim)stn[, vyb)r* z desetim)stn`ch a naopak. ⇨)slo je t@eba vybrat tak, aby byl sou'et z)skan`ch m%&c+ co nejv%t&), ale nesm) se vz)t stejn` m%&ec, jako pro vlastn) R⇨. To je trochu matouc), proto vyj*d@)m podm)nku matematicky. Dvojice rodn`ch ')sel - vlastn) a doplkov[ z tabulky - nesm) m)t na stejn[ pozici stejnou ')slici.¢  Mo(n* v`hra ╱po vylosov*n)$ je d*na sou'tem m%&c+ ze sv[ho R⇨ a doplkov[ho. Podle hodnot uveden`ch v m%&c)ch m+(e b`t nejm[n% 1000 K' a nejv)ce 3000 K'. Nic moc za 600 matematick`ch operac).¢¢      P@)prava @e&en) ]lohy.¢¢  Vstupn) data jsou ulo(ena ve dvou zvl*&tn)ch souborech. To umo(uje nez*visle aktualizovat obsah m%&c+ nebo R⇨. Jako pot@ebn[ funkce programu jsem uva(oval mimo vlastn)ho v`po'tu mo(nost vytvo@it oba datov[ soubory a editovat jejich obsah.¢  Rodn* ')sla je vhodn[ ulo(it jako @et%zce, proto(e operace prob)haj) s jednotliv`mi ciframi, mimo-to desetim)stn[ ')slo je trochu velk[ pro zpracov*n), alespo pro mal` po')ta'.¢  Vlastn) '*stky v m%&c)ch sice d*vaj) malou v`hru, ale jdou v pohod% zpracovat jako integer.¢  Pro ukl*d*n) a 'ten) dat jsem vyzkou&el form*tovan[ 'ten) a z*pis funkcemi fprinf╱$ a fscanf╱$. Li&) se od zat)m zn*m[ funkce tisku na obrazovku printf╱$ t)m, (e p@ed form*tovac) @et%zec je p@id*n ukazatel na soubor odd%len` od @et%zce '*rkou. Hodnota ukazatele se z)sk* otev@en)m souboru fopen╱$ 'i copen╱$.¢  Funkce maj) zaj)mavou vlastnost, (e ')slo p@ev*d) do souboru na @et%zec. D*le u @et%zce neulo() jeho koncov` znak, tak(e data se "nalep) na sebe" a funkce 'ten) se v nich pak ani nevyzn*. Proto je vhodn[ za ka(d`m ulo(en`m @et%zcem nebo ')slem poslat je&t% znak konce @*dku. V u'ebnici nen) na toto v`razn% upozorn%no, ale praktick` p@)klad v n) uveden[ obsahoval.¢¢  Cel` trik vypad* takto:¢  fprintf╱pt,"⑦s\n",string$;¢¢  Zp%tn[ na'ten):¢  fscanf╱pt,"⑦s",string$;¢¢   Data jsou pak v souborech ulo(ena jako @et%zce ukon'ovan[ RETURN, 'ili ka(d[ ')slo je samostatn` odstavec. Proto odpadla nutnost vym`&let n%jak` po@izova' dat na R⇨, proto(e je lep&) pou()t textov` editor v re(imu ASCII. To znamen* u ⇨apka nepsat do textu (*dn[ @)d)c) kdy, u TEXTWRITERu prov[st export jako ASCII.¢  Ono opsat 400 desetim)stn`ch ')sel je pr*ce na 2.5 a( 3 hodiny, proto je vhodn[ prov*d%t po krat&)ch 'asov`ch ]sec)ch ul*d*n) na n%jakou disketu. Taky je na m)st% mo(nost editace p@eklep+ a v+bec chyb, prost% to, co um) i nejjednodu&&) textov[ editory.¢  V programu jsem ponechal po@izova' dat matice, proto(e opsat 100 ')sel na jeden z*tah a bez chyb nen) takov* hr+za.¢¢        Popis 16-ti bitov[ verze¢¢  Program jsem za'al vytv*@et na ATARI MEGA STE proto(e je to pohodln%j&) pr*ce, to v*m nebudu nic nalh*vat. Origin*ln) v`pis je v textu NERVYST.C, u n%ho( byl proveden p@i p@enosu p@evod odli&n`ch kd+ konce @*dku a tabul*toru. Po zp%tn[ konverzi by m%l b`t op%t schopn` kompilace na ST nebo i PC. Prohl[dnout si jej m+(ete Hypertextem, kde bude tro&i'ku zlobit 'e&tina Kamenick`ch, nebo l[pe TEXTWRITEREM, kter` m* krom% Kamen)k+ i 80 znak+ na @*dek.¢  Na za'*tku jsou provedeny deklarace glob*ln)ch prom%nn`ch, kter[ jsou vyu()v*ny r+zn`mi funkcemi. Jsou to dvojrozm%rn* pole na datov[ prom%nn[ a pointery na soubory. Tyto jsou p@ipraveny dva, jeden na soubor MATICE.DAT s m%&ci, druh` na CISLA.DAT s rodn`mi ')sly. Proto(e soubory uzav)r*m ihned po p@e'ten) ╱z*pisu$, sta'il by vlastn% jen jeden.¢  Glob*ln) jsou tak[ definovan[ textov[ konstanty slou()c) jako ti&t%n[ zpr*vy. P+vodn) v%t&) mno(stv) bylo zmen&eno na pouh[ dv%.¢  D*le n*sleduj) vlastn) funkce programu poskl*dan[ opa'n%. Hlavn) funkce main╱$ je tedy a( na konci. Kompil*tor ╱preprocesor$ je toti( jednopr+chodov` a proto je dobr[, aby v okam(iku kdy naraz) na vol*n) n%jak[ funkce, ji( z p@edchoz)ho textu znal jej) definici, a tak mohl zkontrolovat spr*vnost p@ed*van`ch a p@eb)ran`ch parametr+.¢   Prvn) a nejkrat&) funkce pauza╱$ 'ek* prost% na stisk mezern)ku. P@ed vlastn) kontrolou stisknut[ kl*vesy prob%hne vy'i&t%n) z*sobn)ku kl*vesnice, kter` m+(e na ST b`t zna'n% protivn` ne(*douc)m obsahem.¢  Pou(ita je funkce kbhit╱$ a getch╱$. Prvn) zji&④uje, jestli je mo(n[ p@evz)t n%jak` znak, druh* jej p@evezme. Na rozd)l od ji( zn*m[ getchar╱$ nepot@ebuje ne(*douc) potvrzen) stiskem RETURN. Cel` proces je uzav@en do nekone'n[ smy'ky while╱1$, u n)( v`raz 1 znamen* nep@etr(it% spln%nou podm)nku. K opu&t%n) funkce n*siln`m zp+sobem poslou() @)kaz break.¢  Tento zp+sob 'ten) z kl*vesnice je vyu()v*n i v jin`ch funkc)ch.¢  Vlastn) funkce main╱$ je tak[ velmi kr*tk*. Slou() vlastn% jen pro spu&t%n) programu a pro posledn) potvrzen) p@ed jeho opu&t%n)m.¢  Funkce edit╱$ provede na sv[m za'*tku na'ten) dat ze soubor+ MATICE.DAT a CISLA.DAT, v p@)pad% n%jak[ho probl[mu je vyps*no varovn[ hl*&en). Ne]sp%ch nezp+sob) ukon'en) programu. Pokud p@)'inou byla chyb%j)c) disketa v mechanice, je mo(n[ vyvolat nov[ 'ten) n*vratem do main╱$ ╱volba Q$ a op%tovn`m vol*n)m edit╱$. Pov&im%te si zp+sobu p@ed*v*n) zpr*vy o stavu 'ten) funkci edit╱$ z volan`ch prov*d%c)ch funkc). Tyto jsou definov*ny jako funkce vracej)c) integer, vlastn) hodnota je p@ed*na p@)kazem return.¢  D*le n*sleduje v`b%r z menu koncipovan[ho hodn% primitivn%. Je to z d+vodu rychl[ho vytvo@en) programu, kter` je vlastn% jen pomocnou utilitou, a tak[ pro mo(nost p@enosu programu na jin[ syst[my.¢  V nab)dce jsou 4 prov*d%c) mo(nosti a d*le n*vratu do main╱$. Nejd+le(it%j&) je samoz@ejm% prvn) volba k v`po'tu v`sledku. Druh* volba slou() k vytvo@en) matice m%&c+, p@i'em( zp+sob) p@eps*n) ji( existuj)c)ho souboru. Samoz@ejm% p@ed touto destruktivn) akc) vyd* varovn[ hl*&en). ╱M+(ete h*dat,co se stalo s moj) opsanou matic) v dob%, kdy varov*n) s mo(nost) n*vratu nebylo v programu je&t% zapracov*no.$¢  T@et) nab)dka nebude cht)t ')st z kl*vesnice 400 rodn`ch ')sel, n`br( vyp)&e zpr*vu, aby si u(ivatel poslou(il textov`m editorem.¢  ⇨vtrt* volba vyp)&e obsah m%&c+ na obrazovku. Ne'ekejte ale, (e bude graficky m%&ce vykreslovat, jako origin*ln) pramen. V textu naleznete p@)slu&nou volanou funkci pod n*zvem oprav╱$, kter` poch*z) z doby, kdy jsem si myslel, (e budu muset n%jakou mo(nost editace dat do programu zapracovat.¢  Kontroln) v`pis R⇨ zde chyb). Vzhledem k po'tu ')sel je to asi zbyte'n[. Mal* kontrola se prov*d) hned po jejich na'ten) vyps*n)m posledn) polo(ky pro srovn*n) s origin*ln)m pramenem.¢  Vstupn) data jsou organizov*na ve v)cerozm%rn`ch pol)ch. Matice hodnot m%&c+ je dvojrozm%rn* integer, pole rodn`ch ')sel je t@)rozm%rn[ pole char+. Prvn) rozm%r ud*v* 200 ')sel, druh` rozm%r rozli&uje '*st dev)tim)stn`ch ')sel od desetim)stn`ch, 'ili m* hodnotu 2, t@et) rozm%r uskladuje vlastn) d[lku R⇨ a m* tedy rozm%r 11. To proto, (e se jedn* o maxim*ln% deseti prvkov[ @et%zce, k nim( je pot@eba p@idat jako jeden*ct` prvek nulov` bajt. ╱J)m se p@i @et%zcov`ch operac)ch pozn*v* konec @et%zce$ Z hlediska na&eho ch*p*n) jsou ')sla ╱p@eveden* na @et%zce$ ulo(ena ve dvojrozm%rn[m poli, z n%ho( si vyb)r*me pr*v% (*dan[ polo(ky. T@et) d[lkov` index je trvale nastaven na nulu, ')m( ukazuje na prvn) ╱nult`$ prvek @et%zce. Jeho konec si @et%zcov[ funkce ji( sami poznaj) podle nulov[ho bajtu. Ten je v textu reprezentov*n v`razem ó»0ó.¢  K vlastn)mu v`b%ru prvk+ z matic nem*m mnoho co @)ci. Prohl[dnut)m v`pisu zjist)te, (e je pou(ita kombinace adresov[ho oper*toru א a index+ v hranat`ch z*vork*ch. R*d bych problematiku jasn% vysv%tlil, ale s*m to zat)m nech*pu. M+j funk'n) z*pis nen) v`sledkem studia u'ebnice, ale nes'etn`ch pokus+.¢  Zm)n)m se alespo o pr*ci s vlastn)mi indexy. Je dobr[ si uv%domit, kter` je kter` a matice plnit stejnou konvenc), jako je ')st. Jinak je mo(n[ dosp%t p@i v`po'tech k pozoruhodn`m v`sledk+m.¢  Pot[, co jsem se tvrd% do index+ zamotal, p@epsal jsem zau()van[ n*zvy i a y na matematick[ x a y. X p@edstavuje vodorovnou osu, 'ili index sloupce, Y svislou osu, nebo-li index @*dku. Takov[ sjednocen) v`razn% uleh') pr*ci. Je tak[ dobr[ p@i pln%n) nebo 'ten) matice po @*dc)ch pou()t X-sovou prom%nnou do vnit@n) smy'ky for╱$, kter* je vlo(en* do smy'ky se sou@adnic) Y.¢  P@i zcela bezmy&lenkovit[m postupu naps*n) nejprve x, a do druh[, tedy vno@en[ smy'ky y, jak se stalo m%, dojde k nesmysln[mu zp@eh*zen) hodnot v matici. Navenek se to neprojev), proto(e nedojde k opu&t%n) oblasti pam%ti vyhra(en[ pro matici.¢  Hodn% by se toho dalo zm%nit na funkci kalk╱$, v n)( doch*z) k vlastn)mu v`po'tu. Podle zadan`ch podm)nek jde z ka(d[ho dev)tim)stn[ho ')sla vytvo@it t@i desetim)stn*, a to jak z vlastn)ch, nebo doplkov`ch. Tuto skute'nost @e&)m v programu dvoj)m z*pisem, mysl)m dosti k@e'ovit`m. Proto berte pros)m uveden` p@)klad jako u(it) p@)kaz+ jazyka C, nikoliv spr*vn[ algoritmizace probl[mu.¢¢        Popis 8-mi bitov[ verze¢¢   P@evod na mal` po')ta' m% st*l n%kolik dn) dal&) d@iny, ale to hlavn% pro moje dosavadn) mal[ zku&enosti s t)mto jazykem. Ostatn%, mysl)te si n%kdy tak[, (e C['ko vymyslel n%jak` zatrpkl` program*tor jako trest na sv[ kolegy ?¢  Rozhodn% m+(u @)ci, (e prov*d%c) '*st funguje naprosto beze zm%ny. Hlavn% d)ky kompil*toru XCC, kter` umo(uje i v)cerozm%rn[ pole. Tyto by &lo zase p@epo')tat na jednorozm%rn[, ale to by bylo d%sn[!¢  V z*sad% jsem musel n%kter[ funkce nahradit a n%kter[ p@ejmenovat. Pointery na soubory se zm%nily na oby'ejn[ integer prom%nn[. U definic) funkc) bylo nutn[ vymazat slov)'ko void, kter[ znamen* pr*zdno, 'ili bez parametr+. U funkc) vracej)c)ch ')slo kopil*tor v`raz int uzn*val, ale nevy(adoval.¢  Chyb%j)c) funkce kbhit╱$, getch╱$ a scanf╱$ jsem nahradil 'ten)m @et%zce gets╱$. V&echny vstupy z menu a n*vrat z funkce pauza╱$ se mus) sice nyn) potvrzovat stiskem RETURN, ale m*m alespo jistotu, (e buffer kl*vesnice je vypr*zdn%n` ]pln% do'ista.¢  Zru&il jsem sled p@)kaz+ pro zji&④ov*n) d[lky souboru. Mysl)m, (e n%co takov[ho nen) na mal[m syst[mu mo(n[, proto(e nejde nastavit ukazov*tko na konec souboru ╱nebo kamkoliv jinam$ bez nutnosti postupn% na')tat v&echny p@edchoz) sektory. Adres*@ov* tabulka ╱FAT$ vy&&)ch syst[m+ bude asi hodn% dokonalej&).¢  Form*tovan[ 'ten) @et%zce ze souboru jsem nahradil narychlo sp)chnutou funkc) int cgets╱pt,s$. P@ed*vaj) se j) dva parametry. Prvn)m je ukazatel na soubor, prost% ')slo vr*cen[ funkc) copen╱$. Druh`m je pointer na adresu pole char+, ╱@et%zce$ kter[ funkce napln) p@e'ten`m @et%zcem. Vlastn) 'ten) se prov*d) po jednotliv`ch bajtech, je tedy hrozn% pomal[. Nic lep&)ho ale nem*m moment*ln% po ruce.¢  Konec 'ten[ho @et%zce se testuje p@e'ten)m znaku s nulovou ASCII hodnotou, m)sto n%j je ale nutn[ ulo(it jako posledn) prvek znak ó»nó, 'ili EOL. To byla jedna z m`ch v`razn`ch chyb p@i tvorb% t[to funkce. Po ]sp%&n[m na'ten) @et%zce vrac) funkce pomoc) return jedni'ku, p@i chyb% nulu.¢  Druh` kopanec jsem d%lal p@i vol*n) funkce. Z pomaten) mysli jsem p@ipsal p@ed pointer na soubor adresov` oper*tor, tedy jsem psal cgets╱אmat,s$; m)sto cgets╱mat,s$;, jak m%lo b`t spr*vn%. P@ed*val jsem tak adresu ukazatele a ne jeho hodnotu. Kupodivu matice m%&c+ &la z nezn*m`ch d+vod+ tak na')st, zat)mco soubor R⇨ spr*vn% odm)tal spolupr*ci. Inu, to jsou zvl*&tn) v%ci.¢  Po ]prav% textu z+stal je&t% jeden probl[m, a to v jeho nadm%rn[ d[lce. Nejsem u( na&t%st) tak hloup`, abych si myslel jako d@)v, (e del&) program nejde zkompilovat. Prost% se text mus) rozd%lit na v)ce '*st), samostatn% zkompilovat a pot[ slinkovat dohromady.¢  Probl[mem z+staly glob*ln) prom%nn[. P@i nep@)tomnosti jejich deklarace v n%kter`ch modulech kompil*tor odm)tal spolupr*ci, p@i jejich uveden) ve v&ech se d%ly ](asn[ v%ci. Program z*ludn% 'ten* data zapisoval do oblast) vlastn)ho DOSu, tak(e tento se v lep&)m p@)pad% ]pln% zhroutil, nebo v hor&)m vykazoval necivilizovan[ chov*n). Z adres*@e vypisoval n*hodn% jen n%kter[ polo(ky, u soubor+ hl*sil chybu 164, p@i pokusu z*pisu matice m%&c+ tot*ln% zlikvidoval cel` disk s rozepsanou nez*lohovanou 8-mi bitovou verz) programu NERVY. ╱p@)zna'n` n*zev$¢  Jako posledn) mo(nost z+stala u'ebnice a ejhle! Ke jm[n+m prom%nn`ch deklarovan`ch ve v)ce modulech se krom% prvn)ho v`skytu p@ip)&e slov)'ko extern. Chvilka nap%t) a na monitoru se objevuj) v`sledky podobn[ t%m z 16-ti bitov[ verze. Jen co jsem p@estal @v*t:"U( to chod)!!", v%noval jsem se srovn*n) s MEGOU STE na 16 MHz. Mrousek p@)jemn% p@ekvapil. V`sledky sice z MEGy vypadnou hned po stisku RETURN, ale tisk alespo prvn)ho v`po'tu na mal[m ATARI dr() krok.¢  Rozd%len) programu do jednotliv`ch '*st), kter[ mi nejprve @*dn% zkomplikovalo (ivot, jsem ocenil p@i dodate'n`ch ]prav*ch tisk+ na obrazovku. Sta'ilo toti( kompilovat jen pr*v% upravovanou '*st programu, ')m( se n%co uspo@ilo.¢¢      Vlastn) v`sledek programu¢¢  Tisk kone'n[ho v`sledku nen) dota(en` a( do konce. Program neprov*d) sou'et v`t%(ku ze sv[ho R⇨ a z doplkov[ho. V p@)pad% zad*n) sv[ho dev)tim)stn[ho ')sla se vytisknou v&echny t@i mo(n[ v`po'ty a u(ivatel si s*m mus) vybrat ten nejv`hodn%j&).¢¢      U(ite'nost programu¢¢  V tomto p@)pad% se jedn* o pom%rn% diskutabiln) n*m%t. Jako p@)klad do kursu programov*n) se hod) dob@e, proto(e prov*d) jednoduch[ operace. S praktick`m vyu(it)m to bude hor&).¢  Odhaduji, (e &ikovn` program*tor by napsal funk'n) program mo(n* i za hodinu. ╱nikoliv 2 t`dny$ Ops*n) dat se d* zvl*dnout za 2.5 hodiny. Vzhledem k velmi nejist[ v`h@e pr+m%rn% 2100 korun jde o dost velkou d@inu, alespo ve srovn*n) s jin`mi sout%(emi. Ov&em ve srovn*n) s bl*zny, kte@) ]lohu @e&) ru'n%, mus) j)t nutn% o velik[ plus.¢  K zad*n) bylo poznamen*no, (e se ]loha bude opakovat s jin`mi vstupn)mi daty. Pokud budou m)t stejn` tvar, bude mo(n[ pou()t shodn` program a t)m z+stane jen pr*ce s jejich opisov*n)m.¢¢  Pozn*mka: P@i p@enosu datov`ch soubor+ z ST na 800XE se provedla pouze zn*m* konverze CR⇩LF ╱13 a 10$ na RETURN ╱155$.¢