который выполнится с больш ей вероятностью или является
самым легким в вычислении.
Н а п р и м е р , м ы з н а е м , ч т о в и с х о д н ы х д а н н ы х д л я п е р в о й
з а д а ч и
х= 3 в б о л ь ш и н с т в е с л у ч а е в . Т о г д а л у ч ш е п р о в е р и т ь
э т о т в а р и а н т п е р в ы м ( с м о т р и т е п е р в ы й с о в е т ) . Т о ч н о т а к ж е
с л е д у е т к о м п о н о в а т ь у с л о в и я ( т о ж е к а с а е т с я п р е д ы д у щ е г о
с о в е т а ) , е с л и у в а с « у м н ы й » к о м п и л я т о р .
Совет
шестой.
И спользуйте ф ункции
MIN
и
мах
вместо
условных операторов.
О ч е н ь ч а с т о в п р о г р а м м а х в с т р е ч а ю т с я с и т у а ц и и , к о г д а
н е о б х о д и м о ,
ч т о б ы з н а ч е н и е н е к о т о р о й
п е р е м е н н о й б ы л о
н е м е н ь ш е 0 ( и л и н е б о л ь ш е н е к о т о р о г о з н а ч е н и я ) . О б ы ч н о
з а п и с ы в а ю т т а к :
if х<0 then х: =0;
Г о р а з д о п р о щ
е и с п о л ь з о в а т ь ф у н к ц и ю
max:
х:=max(х,0);
К а з а л о с ь , м ы н и ч е г о н е в ы и г р ы в а е м . З а т о
if х<0 thenх: = 0;
if х>100 then х:=100;
м о ж н о з а п и с а т ь т а к :
х:=min(max(х,0),100);
Совет седьмой. И спользуйте деление вместо условных
операторов.
П р е д п о л о ж и м , у в а с е с т ь п е р е м е н н а я , к о т о р а я п о с т о я н н о
у в е л и ч и в а е т с я
н а
1
и , д о с т и г а я
м а к с и м а л ь н о г о з н а ч е н и я ,
с б р а с ы в а е т с я в 0 . М
н о г и е д е л а ю т э т о т а к :
if x<Max then х:=х+1 else х: =0;
О
т э т о г о о п е р а т о р а i f
м о ж н о и з б а в и т ь с я :
х:=(х+1) mod Мах;
г д е
mod
— в з я т и е о с т а т к а о т д е л е н и я . А з а ч е м , с п р о с и т е
в ы .
Н о д о п у с т и м ,
в ы н е з н а е т е ,
н а
к а к о е з н а ч е н и е б у д е т
у в е л и ч и в а т ь с я
х.
М
о ж е т , д а ж е и н а о т р и ц а т е л ь н о е , т о е с т ь
х
б у д е т
у м е н ь ш а т ь с я .
К а к
з а п и с а т ь
э т о
у с л о в н ы м и
о п е р а т о р а м и ?
х: =х+ increment;
if x>=Max then x: =increment-l else
if x<0 then x: =Max+increment+l;
П о п р о б у й т е - к а р а з о б р а т ь с я ! С в ы ч и с л е н и е м о с т а т к а в с е
г о р а з д о п р о щ е :
х: = (х+increment+Max) mod Max;
В о о б щ е , з а д а ч а н е т а к а я у ж и п р о с т а я . А е с л и у ч е с т ь , ч т о
з н а ч е н и е п р и р а щ е н и я м о ж е т б ы т ь и б о л ь ш е м а к с и м а л ь н о г о
з н а ч е н и я х , т у т у ж е м о ж н о и г о л о в у с л о м а т ь .
Совет восьмой. Не используйте флаги, сразу устанавливайте
данные.
Е с л и в ы у с т а н а в л и в а е т е ф л а г т о л ь к о д л я т о г о , ч т о б ы п о з ж е
в ы б р а т ь о д н о и з д в у х ч и с е л , т о л у ч ш е с р а з у у с т а н о в и т ь с а м о
т а к о е ч и с л о . Э т о д е л а е т н е н у ж н о й п о в т о р н у ю п р о в е р к у ф л а г а .
З а ч е м п р о в е р я т ь ч т о - т о е щ е р а з , е с л и м ы у ж е э т о д е л а л и ?
К п р и м е р у , у в а с е с т ь д в е с е т е в ы е к а р т ы . Е д и н с т в е н н о е ,
ч е м о н и
о т л и ч а ю т с я , э т о
н о м е р а
п о р т о в
в в о д а / в ы в о д а .
Е с т е с т в е н н о з а п и с а т ь т а к о й к о д :
var
device: integer; (1 - первая карта, 2 — вторая}
procedure ByteOut (b:byte);
var
port:integer;
begin
if device=l then port: =$2658 else port: =$3254;
out(port,b);
end;
var
device:integer; {номер порта}
procedure ByteOut (b: byte) ;
begin
out(device,b);
end;
device: =$2658; // первая карта
ByteOut ($34) ;
device: =$3254; // вторая карта
ByteOut($ff);
О
д н а к о н е у д о б н о и с п о л ь з о в а т ь н о м е р а
п о р т о в к а ж д ы й
р а з , п о э т о м у о б ъ я в и м к о н с т а н т ы :
const Cardl=$2658;
const Card2=$3254;
device:=Cardl; // первая карта
ByteOut($34) ;
device: =Card2 ; // вторая карта
ByteOut($ff) ;
Совет девятый. H e используйте флаги, сразу устанавливайте
функцию.
Т а к о й
п р и е м
н а з ы в а е т с я
векторизацией.
Э т о т
с о в е т
п о л н о с т ь ю а н а л о г и ч е н п р е д ы д у щ е м у . Е с л и в ы у с т а н а в л и в а е т е
ф л а г т о л ь к о д л я
п о с л е д у ю щ е г о в ы б о р а о д н о й и з ф у н к ц и й ,
л у ч ш е с р а з у з а п и с а т ь а д р е с с а м о й ф у н к ц и и .
К п р и м е р у , к о д д л я п е ч а т и с и м в о л а н а п р и н т е р е о т л и ч а е т с я
о т т о г о , к о т о р ы й в ы в о д и т е г о н а э к р а н . В п л о х о й п р о г р а м м е
м о ж н о б ы л о б ы н а п и с а т ь :
procedure WriteChar(с:char;device: integer {0-
экран,1-принтер});
begin
if device :=0 then begin
{вывод на экран}
end else begin
{печать на принтере}
end;
procedure WriteStr (s: string;device: integer) ;
var
i:integer;
begin
for i:=l to Length(s) do
WriteChar(s[i].device);
end;
Э т о п л о х о п о т о м у , ч т о р е ш е н и е п р и н и м а е т с я к а ж д ы й р а з ,
к о г д а п е ч а т а е т с я с и м в о л . А п р и п е ч а т и с т р о к и р е ш е н и е б у д е т
п р и н и м а т ь с я д л я к а ж д о г о с и м в о л а в с т р о к е .
П р е д п о ч т и т е л ь н е е
и с п о л ь з о в а т ь
в е к т о р и з о в а н н о е
и с п о л н е н и е . Н а п р и м е р :
type
TProc=procedure(с:char);
var
WriteChar:TProc;
device:=l; //первая карта
ByteOut($34);
device: =2; // вторая карта
ByteOut($ff);
procedure Print (c:char); / / печать на принтере
begin
{код для принтера}
end;
П е р е м е н н а я d e v i c e с о д е р ж и т н о м е р к а р т ы , с к о т о р о й м ы
в д а н н ы й м о м е н т р а б о т а е м .
Н е д о с т а т о к т а к о г о
п о д х о д а
в
т о м , ч т о п р и п о с ы л к е к а ж д о г о б а й т а п р о и з в о д и т с я п р о в е р к а
н о м е р а
к а р т ы .
П о ч е м у
п р я м о
н е з а п и с а т ь в
п е р е м е н н у ю
н о м е р с о о т в е т с т в у ю щ е г о п о р т а ?
procedure Scr(c:char); // вывод на экран
begin
{код для экрана}
end;
№ 7/334 14 февраля-21 февраля 2005
предыдущая страница 40 Мой Компьютер 2005 07 читать онлайн следующая страница 42 Мой Компьютер 2005 07 читать онлайн Домой Выключить/включить текст