Очень было приятно, когда на наши e-mail после выпуска рассылки №5 начали приходить многочисленные письма с ответами на домашнее задание,
а от особо умных и внимательных читателей указания на ошибки.
Все должны были заметить ошибку, которая была допущена в прошлом выпуске. Но заметили это единицы.
Хочется попросить вас внимательней читать рассылку и более критично относиться ко всей литературе, которую вы читаете, включая нашу рассылку.
ОШИБКА:
Операция "включения" битов. Вместо логического "И" там надо ставить логическое "ИЛИ" или мы ничего не получим в приведённом примере, кроме нулей.
№3 из домашнего задания - подумать, как "выключаются" биты. На этот вопрос нам прислали огромное кол-во разных вариантов.
Самым универсальным является такой:
1001001001
and
1111111110
---------
1001001000
Как видите, после выполнения такого трюка был выключен последний бит.
Всё в домашнем задании должно быть ясно. Но всё-таки я приведу решения некоторых из них. №4 и №7.
№4 by v()v@#[CPM]
uses crt;
var
x,x1:real;
a,b,c:real;
d:real;
begin
clrscr;
writeln('Made by v()v@#. KIEV,UKRAINE,2004'); {понты}
writeln('Enter a,b and c (ax^2+bx+c=0)');
write('a=');
readln(a); {читаем а,...}
write('b=');
readln(b); {...b и...}
write('c=');
readln(c); {...с.}
if a=0 then begin {если а=0, то у нас уравнение вида bх+c=0}
if b=0 then begin {если и b равно нулю, то у нас уравнение вида с=0}
if c=0 then writeln('X is R') {если и с равно нулю, то равенство получается при любых значениях Х}
else writeln('Бред'); {если а=0, b=0, с не равно нулю, то у нас получается что-то типа 3=0, а это бред.}
end
else begin {если b не равно 0, то решаем уравнение вида bх+c=0 и выводим корень}
x:=(-c)/b;
writeln('X = ',x);
end;
end
else begin {если не повезло и все коэффициенты не равны нулю, решаем уравнение, а для этого...}
d:=b*b-4*a*c; {...находим дискриминант.}
if d<0 then writeln('X is empty, because d<0') {...если он меньше нуля, то корней ур-ие не имеет.}
else begin
x:=((-b)-sqrt(d))/2*a;
x1:=((-b)+sqrt(d))/2*a;
writeln('x1 = ',x);
writeln('x2 = ',x1);
end;
end;
readkey;
end.
№7 by lemyx
program n7;
uses crt;
var hour, min : byte; {chasy i minuty}
begin
clrscr;
write('Vvedite vremya : hh mm',#13#10,'hour=');
readln(hour);
if hour > 23 then begin
clrscr;
writeln('Chasy dolzhny byt'' v predelah ot 0 do 23');
end
Else begin
write('minute=');
readln(min);
if min > 59 then begin
writeln('Minuty dolzhny byt'' v predelah ot 0 do 59');
end
else begin
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);
end;
end;
readln;
end.
Теперь начнём рассматривать совершенно новую фишку в программировании - циклы. Сегодня мы рассмотрим первый из них. Это цикл с заданным количеством
повторений. Но то, что я только что написал, наверное не вызвало у вас никаких эмоций, а некоторые даже не поняли того, о чём
я писал.
Представим такую ситуацию: вам надо вывести своё имя посередине экрана 25 раз сверху вниз. Вам сразу захотелось написать что-то типа
...
gotoxy(38,1);
write('v()v@#');
gotoxy(38,2);
write('v()v@#');
gotoxy(38,3);
write('v()v@#');
gotoxy(38,4);
write('v()v@#');
...
И так 25 раз. Но можно сделать это намного проще, ведь существуют циклы. В этом выпуске мы рассмотрим первый из них - цикл с заданным количеством повторений.
Он имеет такой синтаксис.
for [переменная_счётчик]:=[начальное_значение] to [конечное_значение] do
begin
куча операций. но если действие одно, не надо ставить бєгин и єнд.
end;
Теперь напишем предложенную программу с использованием цикла.
uses crt; {традиция}
var
i:byte; {переменная под счётчик. так как делаем всего 25 повторений, хватит байта}
begin
clrscr;
for i:=1 to 25 do
begin
gotoxy(38,i);
write('v()v@#');
end;
readkey;
end.
Такое решение, по-моему, намного проще и красивее. Теперь давайте подробнее рассмотрим эту программу.
Я опускаю объяснение "традиционных" строк типа очистки экрана. Начнём со строки for i:=1 to 25 do. Это заголовок цикла.
Тут мы говорим программе делать 25 повторений действий между begin и end;. А там у нас стоят аж 2 действия. Первое-
gotoxy(38,i); - переместить курсор в указанную позицию. У вас возникнет вопрос о букве i на месте указания координаты
относительно оси (у). Дело в том, что в цикле от нас "скрыто" одно очень интересное действие: inc(i);, что аналогично i:=i+1;.
Что же получается? Мы присваиваем начальное значение переменной i, после чего выполняются ещё две операции.
После этого у нас на мониторе что-то типа
v()v@#
После этого цикл пойдёт выполняться по второму кругу. Выполнится также inc(i);, что сделает i=2. И запись gotoxy(38,i);
станет эквивалентной такой gotoxy(38,2);. На экране будет:
v()v@#
v()v@#
И так цикл буде выполняться, пока i не станет равно 25. После последнего выполнения цикла программа будет выполняться дальше. В
нашем случае перейдёт на команду readkey;.
Теперь для закрепим выученное и напишем великую программу с кодовым названием "таблица умножения"
uses crt;
var
a,i:byte; {а под число, на которое будем генерировать таблицу, і под счётчик цикла}
begin
clrscr;
writeln('vvedite chislo ot 1 do 10');
readln(a);
for i:=1 to 10 do {таблица у нас показывает результат умножения числа на каждое от 1 до 10, поэтому в цикле 10 шагов}
writeln(a,'*',i,'=',a*i); {(1)}
readkey;
end.
Всё должно быть понятно, вот только строчку с пометкой (1) я попытаюсь вам разъяснить подоходчивей.
writeln(a,'*',i,'=',a*i);
Строка выводит на экран число, которое мы ввели (например, 4), потом знак "*", потом то значение, которое в данный момент "лежит" в переменной
i, потом знак "=", а потом результат умножения введённого числа на переменную-счётчик.
Таким образом после первого выполнения на экране будет:
vvedite chislo ot 1 do 10
5
5*1=5
После второго:
vvedite chislo ot 1 do 10
5
5*1=5
5*2=10
И так далее, пока не выполнится 10 действий. На экране будет:
vvedite chislo ot 1 do 10
5
5*1=5
5*2=10
5*3=15
5*4=20
5*5=25
5*6=30
5*7=35
5*8=40
5*9=45
5*10=50
На этом заканчиваю свою писанину.
ДОМАШНЕЕ ЗАДАНИЕ
1) Разобраться с материалом
2) Разобрать программу. Ниже код.
uses crt;
var
y:byte;
begin
clrscr;
for y:=1 to 25 do begin
gotoxy(round(y*3),y);
write('VOVAN');
textcolor(y);
end;
readkey;
end.
3) Написать программу, аналогичную данной, только чтоб выводила по антидиагонали
4) Написать программу вывода треугольника Паскаля до 9-го ряда.
Выглядит примерно так:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
Корявая она у меня получилась, но это исправимо.
Если не получится сделать треугольник, то хоть вывод энного ряда сделайте.
Все ответы просьба слать на мыло.
Вот они все пишут да пишут(но пишут интересно:) - а красоты то нету.
Вот я(Ustas[CPM]) и взялся за дизайн. Но это только начало. Ждите сайт. Если есть
жалобы и пожелания - на моё мыло: Ustas1715@yandex.ru