"Нет четкой грани между богами и людьми:
одни переходят в других."
Фрэнк Герберт. Мессия Дюны.
Доброе время суток, уважаемые подписчики !!!
Как всегда начинаем наш выпуск с решения домашнего задания.
uses crt; {традиционное начало}
const n=10; {кол-во элементов массива}
var
a:array[1..n] of integer; {массив}
ch:char;
max,min:integer; {максимум и минимум}
neg,poz,i,chet,nechet:byte; {кол-во отрицательных, положительных и пр.
э-ов массива.}
begin {официальное начало}
textbackground(red); {тут делаем рамку. она у нас красная}
clrscr; {красим красным}
window(2,2,79,24); {ограничиваем рабочую область, создавая рамку,
толщиной 1 символ
синтаксис: window(x,y,x1,y1); - ограничить рабочую область окном.
координаты верхнего левого угла - х,у. Нижнего правого - х1,у1.}
textbackground(white);
textcolor(blue); {синий цвет шрифта}
clrscr; {красим белым}
randomize; {запускаем генератор случайных чисел}
Writeln('Желаете ввести массив вручную(1) или пусть вводит комп(2)?');
repeat
ch:=readkey;
until (ch='1') or (ch='2'); {ждём, пока юзверь не нажмёт 1 или 2}
case ch of
'1': {если нажал 1, то просим ввести каждый элемент}
for i:=1 to n do begin write('Введите ', i, ' элемент: ');
readln(a[i]);
end;
'2': {если 2, то...}
begin
Write('enter max: ');
readln(max); {просим ввести максимум...}
write('enter min: ');
readln(min); {и минимум}
if max<min then halt(1); {если над нами
пытались приколоться - завершаем прогу.}
for i:=1 to n do a[i]:=random(max-min)+min;
{заполняем массив случайными числами в указаном интервале.}
end;
else halt(1); {- на всякий случай.}
end;
for i:=1 to n do begin
if a[i]<0 then textcolor(red);
if a[i]>0 then textcolor(green);
if a[i]=0 then textcolor(blue);
write(a[i], ' ');
end;
writeln;
{выводим массив (с цветами)}
for i:=1 to n do begin
if odd(a[i]) then inc(nechet)
else inc(chet);
if a[i]<0 then begin a[i]:=-a[i]; inc(neg); end;
if a[i]>0 then
begin
inc(poz);
if odd(a[i]) then a[i]:=-a[i]
else a[i]:=a[i] div 2;
end;
end;
for i:=1 to n do begin
if a[i]<0 then textcolor(red);
if a[i]>0 then textcolor(green);
if a[i]=0 then textcolor(blue);
write(a[i], ' ');
end;
textcolor(blue);
writeln;
writeln('Кол-во положительных ',poz);
writeln;
writeln('Кол-во отрицательных ',neg);
writeln;
writeln('Кол-во чётных ',chet);
writeln;
writeln('Кол-во нечётных ',nechet);
readkey;
end.
"Правда страдает от слишком пристального рассмотрения"
Фрэнк Герберт. Мессия Дюны.
Теперь будем дальше рассматривать работу с массивами.
В этом выпуске будут рассмотрены основные методы сортировки массивов.
1) Сортировка выбором.
Задача: отсортировать массив.
Знания: первым должен стоять самый маленький элемент, вторым - самый маленький из
оставшихся...; нахождение минимума; перестановка элементов массива.
Осуществление:
1) Ищем минимум.
2) Меняем с первым элементом.
3) Ищем минимум из оставшихся.
4) Меняем местом со вторым.
5) ... сравниваем два последних элемента. При необходимости меняем местами.
Задача понятна, знания получены при прочтении прошлых выпусков, план составлен. Осталось только
открыть Паскаль и набить там следующий код.
uses crt;
const n=10; {кол-во элементов массива}
var
a:array[1..n] of integer; {массив}
i:byte; {счетчик 1}
j:byte; {счетчик 2}
temp:integer; {временная переменная(для того,
чтобы менять эл-ты местами)}
min:byte; {номер минимального эл-та}
{======================================}
begin
clrscr;
randomize;
for i:=1 to n do a[i]:=random(9999);
{заполняем случайными числами}
for i:=1 to n do write(a[i]:5);
{выводим на экран}
writeln;
for j:=1 to n-1 do
{первый цикл. нам не нужно делать его n раз, ведь когда мы достигаем
последнего эл-та, мы его сравниваем только с самим собой}
begin
min:=j; {каждый раз допускаем,
что первый (из оставшихся) элемент массива - минимальный}
for i:=j to n do begin
{ищем минимум среди всех элементов, кроме отсортированных}
if a[i]<a[min] then {если
находим минимум...}
min:=i; {присваиваем его номер соответствующей
переменной}
end;
temp:=a[min];
a[min]:=a[j];
a[j]:=temp; {меняем местами}
end;
for i:=1 to n do write(a[i]:5); {выводим отсортированный массив}
writeln;
readkey;
end.
На первый взгляд это сложно, но если сесть и во всём разобраться - всё становится
понятно. Советую все программы набирать самостоятельно, своими руками. Так вы
быстрее запоминаете новые операторы, функции, более глубоко понимаете принцип программирования.
У вас обязательно начнут появляться вопросы, на которые вы будете пытаться найти ответы,
совершенствуя себя. Новым же подписчикам совет - просмотреть предыдущие выпуски рассылки или
дальше будет сложнее разобраться с новым материалом.
2) Сортировка "пузырьком"
Задача та же.
Осуществление:
1) Сравниваем 2 соседних элемента.
2) В случае необходимости меняем их местами
3) Действие выполняем, пока массив не будет полностью отсортирован, т.е. ни один из
элементов не будет поменян местами с соседним.
Код:
uses crt;
const n=10; {кол-во элементов массива}
var
a:array[1..n] of integer; {массив}
flag:boolean; {флаг для определения изменений}
i:byte; {переменная под счётчик}
begin
clrscr; {чистим экран}
randomize; {включаем генератор случайных чисел}
for i:=1 to n do a[i]:=random(9999);
{заполняем массив случайными числами}
for i:=1 to n do write(a[i], ' ');
{выводим его на экран}
writeln;
repeat {1111}
flag:=true;
{на этом этапе мы ещё ничего не меняли}
for i:=1 to n-1 do begin
{будем повторять сравнение соседних элементов}
if a[i]>a[i+1] then begin {если предыдущий элемент больше последующего}
flag:=false;
{ставим флаг, что сейчас будем менять, это гарантирует, что мы ещё
не выходим из цикла 1111}
a[i]:=a[i]+a[i+1];
a[i+1]:=a[i]-a[i+1];
a[i]:=a[i]-a[i+1]; {меняем местами}
end;
end;
until flag; {все это делаем до тех пор, пока все не отсортируем}
for i:=1 to n do write(a[i],' ');
{выводим отсортированный массив}
writeln;
readkey;
end.