Рады вас видеть 8)
За окном пасмурно (не только за Windows'овским), поэтому мы решили выпустить
этот выпуск.
Домашнее задание:
Единственная прога, код которой я считаю нужным напечатать - последняя, где
надо было вывести треугольник Паскаля. Вот как её "забабахал" Lemyx
uses crt;
var i,j,k,s,n : integer;
{ i - номер текущего ряда
j - номер текущего элемента ряда i
k - коэффициент, который ищем
n - нужное количество строк
}
begin
clrscr;
write('Введите n - количество строк (1<n<16) : ');
readln(n);
GotoXY(35,1);
Write(1);
for i:=2 to n do begin
GotoXY((16-i)*2,i);
k:=1;
s :=i-1;
write(k:5);
for j:=1 to i-1 do begin
k:=round(s*k/j);
dec(s);
write(k:5)
end;
end;
readln
end.
Сейчас мы рассмотрим ещё пару циклов: цикл с пред- и пост- условием (While
& Repeat). Кодовые названия - "Пока", "Повтор". Эти 2 цикла позволяют делать
то, что не под силу Forу. В чём их принципиальное отличие от него? Ну, во-первых,
никакого заданного количества повторений. Во-вторых, с их помощью (особенно
While) можно классно организовать бесконечный цикл, что позволяет улучшить защиту
от ДУРАКА, что не может не радовать.
Рассмотрим первый из них - Repeat. Почему Repeat? Потому что так нам хочется.
Он нам больше нравится. Итак, его синтаксис:
Repeat
.....
until [условие_выхода];
Цикл выполняется до тех пор, пока не выполнится условие выхода. Также, он
в любом случае выполнится один раз. Ещё одно его преимущество - отсутствие традиционных
begin ... end;. Это обусловлено наличием собственных операторных скобок.
Пример.
...
repeat
Writeln('v()v@# and MedL');
until keypressed;
...
Что мы написали, и что это за keypressed;? Мы написали, что строчка должна
выводится до тех пор, пока не нажмут кнопку.
Пример 2.
uses crt;
var
i:byte;
str:string[15];
begin
clrscr;
str:='v()v@# and MedL';
randomize;
Repeat
gotoxy(35,12);
for i:=1 to 15 do begin
write(str[i]);
delay(1024);
textcolor(random(15));
end;
until keypressed;
end.
Эта прога иллюстрирует использование одного цикла в теле другого. В любой
более-менее приличной программе мы можем встретить очень сложные конструкции
из циклов.
Работа проги:
Начало ясно. Там объявляем кучу переменных. Строку на 15 букв, счетчик для For'а.
randomize; - этому мы посвятим целый абзац.
Random(х) - генератор случайных чисел. Х - число, которое определяет интервал,
в котором будут находится случайные числа 0..х. Если вы напишите что-то типа
...
for i:=1 to 4 do begin
writeln(random(9999));
end;
...
А потом запустите эту прогу несколько раз, вы увидите, что у вас генерируется
одна и та же строка. У меня генерируется такая: "0 313 8609 2025".
В природе существует только один настоящий генератор случайных чисел - женская
логика. Но никто не может создать программы, которая эмулировала этот процесс.
Но люди потрудились и создали генератор "случайных" чисел, случайность которых
зависит от текущего времени и пр. Чтобы его включить, надо написать randomize;
где-то в начале проги. Потом вызывать ф-ию random(х), которая возвращает уже
случайное число.
У нас в программе случайным образом подбирается цвет каждой буквы строки.
Дальше строка write(str[i]); пишет букву строки с номером i. В нашем случае,
если i=3, то строка write(str[i]); выведет на экран ')'. В нашей программе выводится
буква, изменяется цвет текста, печатается следующая. Потом всё начинается сначала.
Получается "переливающаяся" строка.
Так как данный цикл завершается в случае выполнения условия, мы можем "гонять"
его бесконечно, если поставим условие, которое никогда не выполнится. Например,
1=3 или просто false.
Но вы спросите: "Какой в этом смысл?". Например, нам надо организовать защиту
от дурака. Мы пишем что-то типа:
...
repeat
write('Введите 100');
readln(x);
if x=100 then break;
until false;
...
Тут всё ясно. Просьба 'Введите 100' будет выводиться на экран до тех пор,
пока пользователь не введёт 100. Оператор break; - "тормоза" нашего цикла. Он
прерывает цикл.
Теперь рассмотрим другой цикл - While. Синтаксис:
while [условие] do
begin
...
end;
Цикл выполняется до тех пор, пока выполняется условие. Оба цикла не имеют
"привычки" самостоятельно, не спрашивая нас, изменять какую-то переменную. Этот
цикл очень похож на repeat; Чтоб сделать бесконечный цикл стоит только написать
while true, а для "тормозов" - break.
Пример.
uses crt;
var x:word;
begin
clrscr;
repeat
write('Введите число: ');
readln(x);
while x<>0 do begin
write(x mod 10);
x:=x div 10;
end;
writeln;
writeln('Вы хотите повторить действие? 1 - да');
readln(x);
until not(x=1);
readkey;
end.
Программа пишет число, обратное данному (аналогично написанной раньше). Но на
этот раз мы не ограничены тремя знаками, но ограничены типом word; Защиту от
дурака пишите сами. Принцип работы: до тех пор, пока от числа ничего не останется,
пишем последнюю цифру и отсекаем её.
Домашнее задание:
1) Написать прогу, которая вычисляет сумму цифр числа, введённого с клавиатуры.
2) Написать прогу, которая раскладывает число на простые множители.
3) Написать прогу, которая вычисляет значения ф-ии у(х)=х^2+2x+22 и выводит
их на экран для х от -10 до 10 с шагом 1.
4) Вычислить n! для n, введённого с клавиатуры (защита от дурака обязательна).
5) Написать программу, вычисляющую результат возведения заданного числа в заданную
степень. Значения степеней - от 2 до 9. Снабдить программу запросом на повторный
ввод, расчёт.
6) Написать программу, которая заполняет экран "змейкой", от краёв до центра.
Получится что-то типа воронки. Рисунок:
1) aaaa 2)aaaa 3) aaaa 4)aaaa 5) aaaa
a a a a aaaa
a aaaa aaaa aaaa
На этом всё. Ответы шлите на ящик. Вопросы тоже туда.
Во-первых, спасибо за предложения дельные и не очень. Извиняйте, если что
не так. Стараемся в меру сил и возможностей. Сами понимаете, что это только
рассылка и денег нам за нее не платят:).Прошу обращаться с вопросами, жалобами
и предложениями ПО ДИЗАЙНУ на моё мыло.