Отправляет email-рассылки с помощью сервиса Sendsay

Pascal с нуля by [CPM]

  Все выпуски  

Pascal с нуля by [CPM] Выпуск №7


Информационный Канал Subscribe.Ru

Рассылка "Pascal с нуля" by [CPM]. Выпуск №7


.:.::BEGIN::.:...

Автор: v()v@#[CPM] mailto: vovanc@bigmir.net

Доброе время суток, уважаемые подписчики!!

Хотелось бы поздравить всех вас с наступлением нового месяца весны, апреля. Как и каждый месяц, апрель начинается с первого числа, но не в каждом месяце первое число такое весёлое. В этот день люди прикалываются над другими людьми, особенно над ДУРАКАМИ. В нашем же программерском деле дураки - это те, кто пользуется нашими прогами. Ведь именно они вводят недопустимые значения в той или иной ситуации, а потом пишут, что у нас проги не работают корректно. Наша задача - всячески пресекать некорректные действия дураков. Поэтому этот выпуск я решил посвятить "Защите от ДУРАКА".

Принцип работы этой штуковины хорошо показывать на конкретных примерах. В борьбе с этими плохими людьми у нас пока что только три оружия - проверка, цикл, лом. Применяя эти фишки, и максимально ограничивая пользователя в его действиях можно достичь желаемого результата.

Рассмотрим принцип работы "защиты", основанной на проверках. Как пример возьмём программу, которая рассчитывает площадь треугольника по трём сторонам. Её код до модернизации выглядит так:

{1}uses crt;
{2}var a,b,c:longint;
{3} p:real;
{4}begin clrscr;
{5}writeln('Введите стороны : ');
{6}readln(a,b,c);
{7}p:=(a+b+c)/2;
{8}writeln('Площадь треугольника: ',sqrt(p*(p-a)*(p-b)*(p-c)));
{9}readkey;
{10}end.


На первый взгляд прога написана очень красиво, но если присмотреться, можно заметить некоторые недостатки. Во-первых, умный человек понимает, что когда его просят ввести длины сторон, никаких отрицательных чисел и быть не должно, но ведь есть и наш почитаемый ДУРАК, который возьмёт и введёт отрицательные значения длин сторон треугольника. Во-вторых, из курса геометрии мы знаем, что длина стороны треугольника не должна превышать сумму длин двух других, но ДУРАК ради потехи вводит абсолютно случайные значения и ему глубоко плевать на геометрию. Учитывая вышесказанное, садимся и модернизируем код проги. Для этого после строки, которая помечена {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). Получается, что цикл выполняется до тех пор, пока не будет введено допустимое значение. Вот и вся защита. Если не один из вышерассмотренных приёмов не действует, то используйте ЛОМ. Домашнее задание - прицепить защиту от дурака ко всем своим программам и прислать их мне на мыло. Вопросы слать тоже туда.

.:.::END::.:...


Дизайнерское слово Ustasа

Автор: Ustas[CPM] mailto: Ustas1715@yandex.ru

Приветствую Вас!

С этого дня в нашей рассылке будет выходить и мой дизайнерский абзац. Были проведены значительные переработки дизайна, во внимание также брались ваши пожелания. Надеюсь я их удовлетворил:). Прошу обращаться с вопросами, жалобами и предложениями ПО ДИЗАЙНУ на моё мыло.


Наша команда [CPM]:

Дизайн,верстка и юзабилити >>> Ustas[CPM]

Пишет >>> v()v@#[CPM] ICQ:88880172

Тоже Пишет >>> MedL[CPM]ICQ:88883515 
Ждёт вдохновения >>> @mor[CPM]  

 

 



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное