Скачиваний:
65
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

13.10. Управление терминалом

Упражнение 13.61. Напишите функции включения и выключения режима эхо-отображения набираемых на клавиатуре символов.

uses linux,crt;

const ECHO=8;

var

t:termios;

s,ms:string;

c:char;

begin

writeln('Для включения эхо введите on, для выключения эхо введите off');

readln(s);

tcgetattr(0,t);

writeln(t.c_lflag);

if s='on' then

begin

t.c_lflag:=t.c_lflag or ECHO;

end;

if s='off' then

begin

t.c_lflag:=t.c_lflag and not ECHO;

end;

tcsetattr(0,tcsanow,t);

readln(ms);

writeln(ms);

end.

13.11. Дата и время

Упражнение 13.62. Составьте аналог команды date.

ses crt,dos;

var y,h,d,dw,ch,m,s,ms:word;

BEGIN

getdate(y,h,d,dw);

case dw of

1:write('Пн');

2:write('Вт');

3:write('Ср');

4:write('Чт');

5:write('Пт');

6:write('Сбт');

7:write('Вс');

end;

write(' ');

case h of

1:write('Янв');

2:write('Фев');

3:write('Мар');

4:write('Апр');

5:write('Май');

6:write('Июн');

7:write('Июл');

8:write('Авг');

9:write('Сен');

10:write('Окт');

11:write('Ноя');

12:write('Дек');

end;

write(' ');

write(d,' ');

gettime(ch,m,s,ms);

write(ch,':',m,':',s,':',ms,' ',y);

readln;

END.

Упражнение 13.63. Составьте аналог команды cal.

uses crt,dos;

procedure cl(year,mes,pol_1:word);

var arr:array [0..7,1..7] of string[2];

i,j,kdm,n:byte;

v:boolean;

kd,k:word;

s:string[2];

begin

v:=false;

for i:=0 to 7 do

for j:=1 to 7 do

arr[i,j]:=' ';

if ((year mod 4=0)and(year mod 100<>0))or((year mod 4=0)and(year mod 100=0)and(year mod 400=0))

then v:=true

else if (year mod 100=0)and(year mod 400<>0)then v:=false;

case mes of

1:begin writeln('Янв');

kdm:=31;

kd:=0;

end;

2:begin writeln('Фев');

kd:=31;

if v then kdm:=29 else kdm:=28;

end;

3:begin writeln('Мар');

kdm:=31;

if v then kd:=60 else kd:=59;

end;

4:begin writeln('Апр');

kdm:=30;

if v then kd:=91 else kd:=90;

end;

5:begin writeln('Май');

kdm:=31;

if v then kd:=121 else kd:=120;

end;

6:begin writeln('Июн');

kdm:=30;

if v then kd:=152 else kd:=151;

end;

7:begin writeln('Июл');

kdm:=31;

if v then kd:=182 else kd:=181;

end;

8:begin writeln('Авг');

kdm:=31;

if v then kd:=213 else kd:=212;

end;

9:begin writeln('Сен');

kdm:=30;

if v then kd:=244 else kd:=243;

end;

10:begin writeln('Окт');

kdm:=31;

if v then kd:=274 else kd:=273;

end;

11:begin writeln('Ноя');

kdm:=30;

if v then kd:=305 else kd:=304;

end;

12:begin writeln('Дек');

kdm:=31;

if v then kd:=335 else kd:=334;

end;

end;

arr[0,1]:='ПН';

arr[0,2]:='ВТ';

arr[0,3]:='СР';

arr[0,4]:='ЧТ';

arr[0,5]:='ПТ';

arr[0,6]:='СБ';

arr[0,7]:='ВС';

pol_1:=(pol_1+kd) mod 7;

k:=pol_1+1;

n:=1;

for j:=k to 7 do

begin

str(n,s);

arr[1,j]:=s;

n:=n+1;

end;

for i:=2 to 7 do

for j:=1 to 7 do

begin

if n<=kdm then begin //n:=n+1;

str(n,s);

n:=n+1;

end

else s:=' ';

arr[i,j]:=s;

end;

for i:=0 to 7 do

begin

for j:=1 to 7 do

write(arr[i,j]:2,' ');

writeln;

end;

end;

var

y,m,mm,d,dw:word;

kvy,kd:longint;

err:integer;

ii,jj,x1,x2,y1,y2:byte;

begin

m:=0;

if paramcount=0 then getdate(y,m,d,dw);

if paramcount=1 then val(paramstr(1),y,err);

if paramcount=2 then begin

val(paramstr(1),y,err);

val(paramstr(2),m,err);

end;

if err<>0 then begin

writeln('error');

exit;

end;

kvy:=((y-1) div 4)-((y-1) div 100)+((y-1) div 400);

kd:=365*(y-1-kvy)+366*kvy;{kol dney do jen year}

dw:=kd mod 7;

gotoxy(1,1);

mm:=0;

y1:=1;

if m=0 then for ii:=0 to 2 do

begin

y2:=y1+10;

x1:=1;

for jj:=0 to 3 do

begin

x2:=x1+20;

mm:=mm+1;

window(x1,y1,x2,y2);

cl(y,mm,dw);

x1:=x1+24;

end;

y1:=y1+10;

end;

if (m>0)and (m<=12) then cl(y,m,dw);

if y<0 then exit;

window(1,31,25,32);

writeln;

end.

Упражнение 13.64. Напишите функцию, переводящую год, месяц, день, часы, минуты и секунды в число секунд, прошедшее до указанного момента с 00 часов 00 минут 00 секунд 1 Января 1970 года.

uses sysutils;

var

s1,s2,s3,s4,s5,s6:integer;

rezult:real;

function kol_days_y(y,m,d:integer):longint;

var i,god,sum:integer;

begin

sum:=0;

{Подсчет дней при прошедших годах}

god:=1970;

repeat

if y=god then begin break;end;

if (god mod 400<>0)and((god mod 4) =0)and((god mod 100)<>0)then sum:=sum+366 else

sum:=sum+365;

god:=god+1;

until god>y;

{Подсчет дней при определенном количестве месяцев}

god:=1;

repeat

if god=m then begin break;end;

case god of

1,3,5,7,8,10,12:begin sum:=sum+31;end;

4,6,9,11:sum:=sum+30;

2:begin

if ((y mod 4) =0)and((y mod 100)<>0)then sum:=sum+29 else

sum:=sum+28;

end;

end;

god:=god+1;

until god>m;

kol_days_y:=sum+d-1;{Начало дней не с нуля, поэтому и -1}

end;

begin

if paramcount<>6 then

begin

writeln('Введите правильно дату и время. Например: 2004 2 20 12 45 55');

halt(1);

end else

begin

s1:=strtoint(paramstr(1));

s2:=strtoint(paramstr(2));

s3:=strtoint(paramstr(3));

s4:=strtoint(paramstr(4));

s5:=strtoint(paramstr(5));

s6:=strtoint(paramstr(6));

if (s1<0)or(s2<0)or(s3<0)or(s4<0)or(s5<0)or(s6<0)then

begin

writeln('Введите положительные значения');

halt(1);

end;

if (s2<1)or(s2>12)then

begin

writeln('Введите существующий месяц');

halt(1);

end;

if (s3<1)or(s3>31)then

begin

writeln('Введите существующий день');

halt(1);

end;

if (s4<0)or(s4>23)then

begin

writeln('Введите существующее количество часов');

halt(1);

end;

if (s5<0)or(s5>59)then

begin

writeln('Введите существующее количество минут');

halt(1);

end;

if (s6<0)or(s6>59)then

begin

writeln('Введите существующее количество секунд');

halt(1);

end;

end;

case s2 of

2:begin

if ((s1 mod 4)=0)and((s1 mod 4)=0)then

begin

if s3>29 then begin

writeln('В высокосном году в феврале не более 29 дней');

halt(1);

end;

end

else

if s3>28 then

begin

writeln('В феврале в невысокосном году не более 28 дней');

halt(1);

end;

end;

4,6,9,11: if s3>30 then

begin

writeln('В ',s2,' месяце не может быть больше 30 дней');

halt(1);

end;

end;

if s1<=1969 then

begin

writeln('Время назад не идет');

halt(1);

end;

writeln('Количество секунд прошедшее до указаного момента = ');

writeln(' = ',kol_days_y(s1,s2,s3)*24*3600+s4*3600+s5*60+s6,'c.');

end.

Упражнение 13.65. Напишите "часы", выдающие текущее время каждые 3 секунды.

uses dos,crt,sysutils,linux;

var

Hour , Min , Sec , HSec : word ;

procedure handler(sig:longint);cdecl;

begin

end;

procedure sleep(count:integer);

var

old:signalhandler;

begin

old:=signal(SIGALRM,@handler);

alarm(count);

pause;

signal(SIGALRM,old);

alarm(0);

end;

function L0 (w : word ) : string;

var

s : string;

begin

Str( w , s );

if w<10 then

L0 := '0'+ s

else

L0 := s ;

end ;

var

s:string;

i:integer;

begin

WriteLn ( 'По системным часам, через каждые 3 секунды') ;

repeat

GetTime ( Hour , Min , Sec , HSec ) ;

s := L0 (Hour ) + ' : ' + L0 ( Min ) + ' : ' + L0 ( Sec ) ;

write(s);

sleep(3);

for i:=1 to length(s) do

write(#8);

until keypressed;

end.

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal