Песни о Паскале | страница 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 с буквами верхнего и нижнего регистров, поскольку нельзя предсказать, в каком регистре будет введено имя. Условный оператор выглядит громоздко, но, призвав на помощь множество, мы упростим его.