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

Pascal с нуля by [CPM]

  Все выпуски  

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


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

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


by MedL[CPM] and v()v@#[CPM]


BEGIN

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

Сегодня рассказ пойдет про условие, проверку и ветвление.
Но сначала ответы на задачи прошлого выпуска (не на все конечно). Первая программа, которая находит площадь треугольника по трём сторонам. Решение нашего подписчика Вадима, который прислал ответы почти на все задачи прошлого выпуска.
uses crt;
var a,b,c:longint; {a,b,c - переменные для хранения длин сторон}
p:real; {p - переменная для хранения полупериметра треугольника}
begin {официальное начало программы}
clrscr; {очистка экрана}
writeln('Введите стороны : ');
readln(a,b,c); {забираем значения длин сторон}
p:=(a+b+c)/2; {находим полупериметр}
writeln('Площадь треугольника: ',sqrt(p*(p-a)*(p-b)*(p-c))); {находим площадь по формуле великого Герона}
readln; {ждём нажатия клавиши и ...}
end. {...выходим}


Во второй задаче всё очень просто - окружность не имеет объёма.

№3 by Вадим: uses crt;
type
chislo=1..999; {число трехзначное, делаем свой тип}
var
x:chislo; {делаем переменную своего типа}
begin
clrscr; {чистим}
write('Вводите число: ');
readln(x); {читаем число}
write(x mod 10); {получаем остаток от деления на 10 и выводим на экран на экране последняя цифра числа}
write((x mod 10) div 10); {х мод 10 - две первые цифры числа последняя отсекается. Было 345, стало 34. Остаток от деления на 10 - получим четвёрку и выведем её на экран.}
write(x div 100); {целая часть от деления на 100. 345/100=3.45. Так как пользуемся оператором див, получаем только 3 и выводим её на экран.}
readln;
end.


Четвёртое - там всё легко, только вместо модуля подставить abs();

№5 by v()v@#[CPM]

Вспоминать физику мы будем ещё не один раз.
uses crt;
const g=10; {константа. Ускорение свободного падения.}
var
v0:word; {начальная скорость}
alfa:real; {угол}
begin
clrscr;
writeln('Programm by v()v@n'); {понты}
write('Введите начальную скорость: ');
readln(v0); {читаем значение начальной скорости}
write('Введите угол (в градусах) ');
readln(alfa); {читаем угол}
writeln('Максимальная высота = ', sqr(v0*sin(alfa*pi/180))/(2*g):0:3); {выводим максимальную скорость, при чём с точностью до трёх знаков.}
readkey;
end.


С домашним заданием разобрались.

Очень много писем приходит с просьбой дать ссылку на архив подписки. http://subscribe.ru/archive/comp.soft.prog.pascalcpm - тут находится архив.
Теперь перейдём непосредственно к нашей теме.
Давайте представим, что вам надо написать прогу, которая будет исчислять корни линейного уравнения. Общий вид такого уравнения: A*X+B=C, где A, B, C - некоторые числа.
Решение его выглядит очень просто:
X=(C-B)/A;
Однако есть одна маленькая проблема - а если переменная A равна нулю?? Тогда мы сразу же получаем уравнение B=C, которое выполняется только при равенстве этих двух переменных. Значит, нужно проверить A=0. Поставить проверку, и разветвить решение на две части в Паскале помогает операция If. Выглядеть в теле проги она будет так:
If [условие] then [что нужно выполнить]
Else [выполнение, если условие не выполняется]
Пример: Uses crt;
Var
Pass: integer;
Begin
Clrscr;
Write('Введите Пароль ');
readln(Pass);
If pass=0 then write('Hello world') {если ввели ноль (пароль у нас такой), то приветствуем мир, а...}
Else write('incorrect password'); {...если ввели не ноль, то выведем сообщение о некорpектности пароля}
Readkey;
End.


Заметьте, между словами If и Else команды пишутся без точки с запятой (;).
При выполнении условия можно выполнять не только одно действие, а несколько, или столько, сколько вы запишете, поставив после Then слово Begin, а перед Else слово End (без (;)). Также несколько действий будут выполнятся при невыполнении условия, если написать Begin после слова Else и слово End; после последней команды. Но!! При этом между Begin и End в обоих случаях у команд должны быть точки с запятой.
Пример:
Uses crt;
Var
A: integer;
Begin
Clrscr;
Writeln('Введите A'); readln(A),
If А=0 then
Begin
Writeln('Hello world');
write('I love this world!!');
end
Else
Begin
Writeln('No!!');
write('Нажмите CTRL+ALT+DEL. Потом будет поздно');
readkey;
asm
mov ax,13h
int 10h
db 0c4,0c4,0
end;
end;
Readkey;
End.


Если вводят правильный пароль, выводим сообщении о любви к миру, а если пароль не правильный, то наказываем юзера (наказание работает на WinNT).

В случае с линейным уравнением при А=0 следует еще одна проверка: В=С.
Запишем программу, которая будет решать линейное уравнение: Uses crt;
Var
A, B, C, X: real;
Begin
Clrscr;
Writeln('input A, B, C');
readln( A, B, C);
If А=0 then
if B=C then write('X is R')
else write('X pustoe mnozhestvo')
Else
begin
X:=(C-B)/A;
write("X = ", X);
end;
Readkey;
End.


Допустим, что у вас сложилась ситуация, когда переменная принимает много значений, многие из которых вам надо проверить. Например, возьмём ту же программу-пароль, но проверять мы будем несколько значений и выводить соответственно разные сообщения. Кстати, чуть не забыл. Фишка, которая проверяет несколько значений имеет кодовое название кейс (Case). Имеет такой общий вид:

Case name of
значение: 1 действие;
значение2:
begin
куча действий
end;
else begin
куча действий, если ниодно условие не удовлетворяется
если действие одно, то бегин и енд можно не ставить
end;
end;

Прога: uses crt; {традиция :)}
var
pass:word;
begin
clrscr;
Write('Введите пароль (если знаете): ');
readln(pass);
case pass of
1: writeln('Hello, how are you?');
2:
begin
writeln('You is the best');
Writeln('Hello world!');
end;
3: writeln('asdfgqwerty');
else writeln('Привет, хакер');
end;
readkey;
end.


Принцип такой: если вводят 1, 2 или 3, выводится сообщение или несколько, а если что-нибудь другое, то выводится строка, которая приветствует хакера.

А сейчас будет то, чего все так ждали - булевская логика (конфликтует с женской(ИМХО)).
Как? Вы даже не знаете что это такое? Сейчас всё будет.

В 1847 году вышла книга под названием "The Mathematical Analysis of Logic", написанная ирландским математиком Джорджем Булем (1815-1864). Он написал про абсолютно новую алгебраическую систему, которую в последствии назвали Булевская логика. Суть её заключалась в том, что в ней нет чисел. Есть только правда и ложь. Правда обозначается единицей (1), а ложь нулем (0),

Наиболее простые и используемые выражения булевской логики - NOT, AND, OR, XOR.
Начнем по порядку:
1) NOT
Логическое НЕТ. Суть выражения - "перевернуть" правду в ложь. Или наоборот. Выражение использует только одну переменную (в примере таблицы - X). Таблица, показывающая принцип работы NOT выглядит так:

X NOT_X
0 1
1 0

2) AND
Представьте, что вам задали вопрос: "Сейчас обеденный перерыв и банк не работает??"
В данном случаи предложение состоит из двух частей, которые объедены словом "и". Отличие AND, OR, XOR от NOT заключается в том, что эти выражения используют две переменные. Если хоть один ответ на любую часть вопроса отрицательный, тогда ответ на весь вопрос будет отрицательный. А отрицательный ответ - ложь, тоесть 0.
Обозначим ответ на вопрос "Сейчас обеденный перерыв" переменной X, а ответ на вопрос "банк не работает" Y. Тогда в виде таблицы выражение будет выглядить так:

X Y X_AND_Y
0 0 0
0 1 0
1 0 0
1 1 1

Пример система 5 < X < 4, будет выглядеть как (X<4)AND(X>-5)

3) OR
OR в переводе с английского ИЛИ. Возьмем предыдущий пример. Логическое ИЛИ означает, что если хотя бы одно условие имеет утвердительный ответ, тогда ответ на весь вопрос утвердительный.

X Y X_OR_Y
0 0 0
0 1 1
1 0 1
1 1 1

Пример: объединение X<3, X>5, будет выглядеть как (X<3)OR(X>5)

4) XOR
XOR - логическое исключение (или, как его еще называют, сложение по модулю 2). Отличается он от логического ИЛИ только тем, что проверяет, имеется ли утвердительный ответ на два вопроса, и если да, присваивает всему выражению 0, то есть ложь. В таблице это выглядит так:

X Y X_XOR_Y
0 0 0
0 1 1
1 0 1
1 1 0

Пример, описанный при ХOR можно записать так (X>3)XOR(X<5). В этом случае правда получится при выполнении только одного условия. Аналогично (Х<3) or (X>5).
Сложные условия
Иногда придется писать сложные условия, которые не обходятся каким то одним выражением. Такие "комби" пишутся довольно просто. Например, чтоб получить правду только при двух отрицательных ответах, при переменной Х нужно написать всего лишь:
NOT(X_OR_Y)
Сначала "разбираем" первый OR, а потом берем обратное значение.
К сожалению таких легких примеров бывает не так уж много. Можно увидеть "паровоз" с пол экрана, который кажется нерешаемым, пока не напишешь таблицу. Таблицы для них пишутся точно так же, как решается арифметические уравнения - сначала открываются скобки в середине, а потом наружные.

Пример: NOT(((X OR Y) AND (X XOR Y)) OR ((NOT X) XOR (NOT Y)) XOR (NOT Y))
Если раскладывать это выражение с внутренних скобок до последнего NOT, то у вас должно получится в любом случае ложь.
Не обязательно должно быть только две переменные Х и Y. Могут появляться еще множество других.

Пример: Z_AND_NOT(X_XOR_Y)
X Y Z Z_AND_NOT(X_XOR_Y)
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 0
1 0 0 0
1 0 1 0
1 1 0 0
1 1 1 1

Также в булевской логике разрешены операции типа:
100001010
and
000000001
---------
100001011
Операция "включает" биты.
Домашние задание
1) Написать таблицу для выражения NOT((Y XOR X) OR ( NOT( X AND Y))).
2) Подумать и с помощью булевской логики записать выражение NOT((Y XOR X) OR ( NOT( X AND Y))) вторым способом.
3) Подумать как "выключаются" биты.
4) Написать программу решение квадратного уравнения.
5) Написать программу, которая вычисляет x в уравнении типа sqrt(ax+b)\c=e. a,b,c,e - с клавиатуры.
6) Программа, которая рассчитывает общую ёмкость двух параллельно соединённых конденсаторов. Кто не сможет сам сделать формулу, пишите на ящик. с1 и с2 - с клавиатуры.
7) С повышенной сложностью. Вводят время в формате чч мм. Вывести время через минуту. Учесть, что минут 60, а не 61. Если наступает следующий час, то написать, что он наступает. Если через минуту новый день, то вывеси сообщение о наступлении нового дня.

END.


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

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

Тоже Пишет>>>MedL[CPM]

Собирается писать>>>@mor[CPM]

Вот они все пишут да пишут(но пишут интересно:) - а красоты  то нету.
Вот я(Ustas[CPM]) и взялся за дизайн. Но это только начало. Ждите сайт. Если есть 
жалобы и пожелания - на моё мыло: Ustas1715@yandex.ru

 




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


В избранное