Хотелось бы поздравить всех вас с наступлением нового месяца весны, апреля.
Как и каждый месяц, апрель начинается с первого числа, но не в каждом месяце
первое число такое весёлое. В этот день люди прикалываются над другими людьми,
особенно над ДУРАКАМИ. В нашем же программерском деле дураки - это те, кто пользуется
нашими прогами. Ведь именно они вводят недопустимые значения в той или иной
ситуации, а потом пишут, что у нас проги не работают корректно. Наша задача
- всячески пресекать некорректные действия дураков. Поэтому этот выпуск я решил
посвятить "Защите от ДУРАКА".
Принцип работы этой штуковины хорошо показывать на конкретных примерах. В борьбе
с этими плохими людьми у нас пока что только три оружия - проверка, цикл, лом.
Применяя эти фишки, и максимально ограничивая пользователя в его действиях можно
достичь желаемого результата.
Рассмотрим принцип работы "защиты", основанной на проверках. Как пример возьмём
программу, которая рассчитывает площадь треугольника по трём сторонам. Её код
до модернизации выглядит так:
На первый взгляд прога написана очень красиво, но если присмотреться, можно
заметить некоторые недостатки. Во-первых, умный человек понимает, что когда
его просят ввести длины сторон, никаких отрицательных чисел и быть не должно,
но ведь есть и наш почитаемый ДУРАК, который возьмёт и введёт отрицательные
значения длин сторон треугольника. Во-вторых, из курса геометрии мы знаем, что
длина стороны треугольника не должна превышать сумму длин двух других, но ДУРАК
ради потехи вводит абсолютно случайные значения и ему глубоко плевать на геометрию.
Учитывая вышесказанное, садимся и модернизируем код проги. Для этого после строки,
которая помечена {6}, пишем ещё одну примерно такого содержания
if ((a>0)and(b>0)and(c>0)and(a+b>c)and(a+c>b)and(b+c>a)) then
begin
А после {8} пишем end;.
Вот мы и написали примитивную защиту от дурака. Принцип её действия в том, что
когда Дурак вводит что-нибудь не то, программа просто завершается. Вру. Программа
не завершается, а ждёт нажатия кнопки, а потом завершается. Вот и пригодилась
нам Булевская логика. Но это не всё.
Я считаю, что дурака следует проучить за его тупость. Для этого рассмотрим ещё
несколько процедур из модуля CRT.
Парочка WhereX и WhereY - возвращают координаты курсора по оси Х и У соответственно.
Процедура ClrEOL - Чистит строчку с текущей позиции курсора до конца строки.
Положение курсора не меняется.
Процедура Delay(x) - Задержка. Тут х - время задержки (в миллисекундах).
После усвоения этих знаний вы можете подшутить над Дураком, ведь сейчас 1 апреля.
Убираем end; после {8} и пишем там такой код.
end
else begin
writeLn('format c:');
for a:=1 to 100 do begin
GotoXY(1,WhereY);
ClrEOL;
write(a,'%');
Delay(10000);
end;
writeln;
writeln('С 1 апреля');
end;
end;
После этого код будет выглядеть так: uses crt;
var a,b,c:longint;
p:real;
begin clrscr;
writeln('Введите стороны : ');
readln(a,b,c);
if ((a>0)and(b>0)and(c>0)and(a+b>c)and(a+c>b)and(b+c>a)) then
begin
p:=(a+b+c)/2;
writeln('Площадь треугольника: ',sqrt(p*(p-a)*(p-b)*(p-c)));
end
else begin
writeln('format c:');
for a:=1 to 100 do begin
gotoxy(1,wherey);
clreol;
write(a,'%');
delay(10000);
end;
writeln;
writeln('С 1 апреля');
end;
readkey;
end.
Это уже на что-то похоже. Дальше вы можете сами модернизировать эту программу.
Теперь разберёмся с циклом. Сейчас мы знаем только один - for.
Запускаем Паскаль и пишем: uses crt;
var hour, min,i : byte; {chasy i minuty}
begin
clrscr;
write('Vvedite vremya : hh mm',#13#10,'hour=');
readln(hour);
for i:=1 to 2 do begin
if hour>23 then begin
clrscr;
writeln('Chasy dolzhny byt'' v predelah ot 0 do 23');
write('Vvedite zanovo: hour=');
readln(hour);
dec(i); {i=i-1}
end;
end;
write('minute=');
readln(min);
for i:=1 to 2 do begin
if min>59 then begin
writeln('Minuty dolzhny byt'' v predelah ot 0 do 59');
write('Vvedite zanovo: min=');
readln(min);
dec(i);
end;
end;
writeln('Vvedennoe vremya: ',hour,':',min);
{podschet vremeni na minutu bol'she}
inc(min);
if min=60 then begin
writeln('Nastupil novyi chas');
min:=0;
inc(hour);
if hour=24 then begin
writeln('Nastupil noviy den');
hour := 0;
end
end;
{vivodim novoe vremya}
writeln('Novoe vremya: ',hour,':',min);
readln;
end.
Вы, наверное, помните, что в цикле for есть скрытое действие. В нашем случае
- inc(i);, Мы же в своём примере при вводе недопустимых значениях часов и минут
делаем действие, которое компенсирует inc(i); - dec(i). Получается, что цикл
выполняется до тех пор, пока не будет введено допустимое значение. Вот и вся
защита. Если не один из вышерассмотренных приёмов не действует, то используйте
ЛОМ. Домашнее задание - прицепить защиту от дурака ко всем своим программам
и прислать их мне на мыло. Вопросы слать
тоже туда.
С этого дня в нашей рассылке будет выходить и мой дизайнерский абзац. Были
проведены значительные переработки дизайна, во внимание также брались ваши пожелания.
Надеюсь я их удовлетворил:). Прошу обращаться с вопросами, жалобами и предложениями
ПО ДИЗАЙНУ на моё мыло.