Решение практических задач на Паскале. Выпуск 2


Этот выпуск посвящен конкурентной борьбе

Есть хорошая рассылка "Программирование на Паскале", код подписки на которую здесь помещен не будет :))

В ней было приведено оригинальное решение задачи Подсчет числа различных букв в слове.

И несомненно, большим достоинством рассылки является то, что там есть ссылка на прекрасно написанные уроки по Паскалю.

Надеюсь, что автору рассылки (Юрию Викторовичу Климант) после моей рекламы теперь не следует обижаться на нас :)) , но я предложу свой более простой в понимании алгоритм и его реализацию

Идея моего решения заключается в использовании массива, каждый элемент которого с номером, равным коду символа, содержит число таких символов в строке. В Паскале максимальная длина строки равна 255, так что достаточно объявить массив байт. После заполнения массива можно делать с содержащейся в нем информацией все, что угодно

Итак, другое решение задачи "Подсчитать число различных букв в строке":

program Simbols;
const
  Str: String = 'Это АнАлизируемая Строка, содержащая символы. UnderstanD?';
  min = 32;
  max = 255;

var
  Symbols : array [min..max] of byte;
  count, i: Byte;

BEGIN
{Сначала обнулим элементы массива на всякий случай}
  WriteLn(#13,Str);
  for i:=min to max do Symbols[i] := 0;
  
{Теперь увеличим на 1 содержимое каждой ячейки массива с номером, равным
 коду символа}
  for i:=1 to length(str) do
    inc(Symbols[ord(Str[i])]);
    
{Остается пересчитать ненулевые элементы массива, а заодно
 и выведем их на экран}
  Count:=0;
  for i:=min to max do
   if Symbols[i] <> 0 then
   begin
     inc(Count);
     Write(chr(i))
   end;
  if Count = 0 then
  WriteLn('В строке нет символов - пустая')
  Else
  Writeln(#13#10'Число использованных символов = ',Count);

{Теперь определим число использованных БУКВ. Различие в том, что
 буква "А", например, она и в Африке "А", независимо от того, 
 заглавная (прописная) она или строчная}
 
  Count:=0;
  for i:=min to max do
   if Symbols[i] <> 0 then
   begin
    case i of
    
     {Расстояние между строчной и прописной буквами 
      в кодировке OEM для всех английских букв, а для 
      русских - только в диапазоне от "а" до "п" равно 32}
     ord('a')..ord('z'), ord('а')..ord('п'):
       if Symbols[i-32] = 0 then inc(Count);
       
     {Для русских букв в диапазоне от "р" до "я" 
      расстояние до соответствующих прописных равно 80}
     ord('р')..ord('я'):if Symbols[i-80] = 0 then inc(Count);
     ELSE inc(Count)
    end;
   end;

  if Count = 0 then
  WriteLn('В строке нет букв - пустая')
  Else
  Writeln(#13#10'Число использованных букв = ',Count);
END.
Мне кажется, что решение простое и в более подробном описании не нуждается. Хотя ... пишите

Вопросы и предложения присылайте Борису

Hosted by uCoz