Песни о Паскале | страница 156



Примечание. Если говорить точнее, лучше остановиться на числе, которое составляет корень квадратный из числа N, в данном случае это 5. Но для упрощения задачи мы будем обрабатывать больше чисел – половину ряда.

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


>1-й отсев чисел, кратных 2:

>1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

>2-й отсев чисел, кратных 3:

>1 2 3 * 5 * 7 * 9 * 11 * 13 * 15 * 17 * 19 *

>Результат – простые числа:

>1 2 3 * 5 * 7 * * * 11 * 13 * * * 17 * 19 *


А если бы Эратосфен жил в наше время? Стал бы он царапать на песке? Конечно, нет, – на что ж тогда компьютеры? Программа «P_38_4» находит все простые числа, не превышающие 255, – роль песка исполняет множество чисел.


>program P_38_4; { Решето Эратосфена }

>var Simples : set of byte; { множество чисел }

>n, m : integer;

>F : text;

>begin

>Assign(F, 'P_38_4.out'); Rewrite(F);

>Simples:= [2..255]; { Сначала множество полное }

>{ Цикл вычеркивания составных чисел }

>for n:=2 to (255 div 2) do begin

>      { если число ещё не вычеркнуто }

>      if n in Simples then

>      { проверяем на кратность ему все последующие }

>      for m:=2*n to 255 do

>      { если остаток(m/n) равен нулю, то m – составное }

>      if (m mod n)=0

>      { и его надо вычеркнуть из множества}

>      then Simples:= Simples – [m];

>end;

>{ Распечатка множества простых чисел }

>for n:=2 to 255 do if n in Simples then Writeln(F,n);

>Close(F); Readln;

>end.


Мелочь, а приятно

Одну из первых своих программ мы снабдили разумом попугая, научив повторять имя пользователя. После ввода имени в переменную S программа печатала.


>      Writeln (’Здравствуй, ’+ S);


Сделаем её чуть умнее, научив отличать мальчиков от девочек. По крайней мере, для русских имен. Русские женские имена оканчиваются на буквы «а» или «я» (Анна, Светлана, Мария и так далее), чего не скажешь о мужских. Последнюю букву имени можно «выдернуть» в символьную переменную C таким оператором.


>      C:= S[Length(S)];


И теперь приветствовать пользователя можно так:


>      if (C=’А’) or (C=’а’) or (C=’Я’) or (C=’я’)

>      then Writeln (’Здравствуй, девочка ’+ S)

>      else Writeln (’Здравствуй, мальчик ’+ S);


Здесь проверяется совпадение переменной C с буквами верхнего и нижнего регистров, поскольку нельзя предсказать, в каком регистре будет введено имя. Условный оператор выглядит громоздко, но, призвав на помощь множество, мы упростим его.