Пятница, 26.04.2024, 13:39
Информатика и математика в Плесской школе
Приветствую Вас Гость | RSS
Меню сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа

Обработка строк

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

Перед изучением данной темы советую скачать и изучить презентацию "Строки в Паскале" опубликованную на "Учительском портале" http://www.uchportal.ru/load/18-1-0-28452 

 
Задачи, решаемые без использования циклов.

Данные задачи можно рассматривать как частный случай линейных и ветвящихся алгоритмов. 
Задание А. Составить программу подсчитывающую количество букв в слове.
PROGRAM  n1;
VAR  S : STRING;
BEGIN
          Write(’введите слово’) ;  Readln(S);  
          Writeln(’слово состоит из ’, Length (S) ,’букв. ’);  
END.

Задание В. Дана строка символов. Вывести на экран ее первый и последний символ.
program n2;
Uses crt;
var s:string;
begin
 clrscr;
 Write('Введи строку  ');Readln(s);
 Writeln('На первом месте  -',s[1]);
 Writeln('На последнем месте -',s[length(s)]);
end.

Если рассматривать строку как массив символов то первый элемент выводится как s[1], а последний как s[length(s)] – элемент с номером совпадающим с длинной строки S.


Задание С. Сравнить длину двух строк введенных с клавиатуры.
Uses crt;
var a,b:string;
       m,n:Integer;
Begin
 Clrscr;
 Writeln('ВВеди первую строку ');Readln(a);
 Writeln('ВВеди вторую строку ');Readln(b);
 m:=Length(a);
 n:=Length(b);
 if (m=n) then writeln('Строки  равны');
 if (m>n) then writeln('Первая больше');
 if (m<n) then writeln('Вторая больше');
End.

В этой программе длины строк присваиваются целочисленным переменным. Которые сравниваются между собой.

 

Задача С. Составить программу осуществляющую вырезку из слова ИНФОРМАТИКА букв так,  что бы из них получилось слово ТОРТ.
Способ 1. Решаем с использованием функции COPY.
Program n3_1;
Uses crt;
var a,b,c,d:string;
Begin
       Clrscr;
            a:='информатика';
            b:='';
            c:=copy(a,8,1);
            d:=copy(a,4,2);
            b:=c+d+c;
           writeln(b);
End.

Способ 2. Решаем как массив символов. По моему проще и наглядней.

Program n3_2;
Uses crt;
var a,b:string;
Begin
       Clrscr;
            a:=‘информатика';
            b:=a[8]+a[4]+a[5]+a[8];
           writeln(b);
End.


Подсчет чего либо в строке

    Эти задачи наиболее просты по алгоритмическому исполнению. Необходимо организовать цикл, от первой буквы до последней, внутри которого нужно поместить одно или несколько ветвлений для выполнения условия задачи.
    Задание А. Дана строка символов. Определить сколько раз в ней встречается буква А (русская).
Program n4;
Uses Crt;
Var s:string;
    i,k:integer;
begin
 ClrScr;
 Write('ВВеди строку '); readln(s);
 k:=0;
 for i:=1 to length(s) do if (s[i]='А') then k:=k+1;
 writeln('Буква А встречается = ', k:8,' раз');
end.

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

Program n5;
Uses Crt;
Var s:string;
    i,k,m:integer;
begin
 ClrScr;
 Write('ВВеди строку '); readln(s);
 k:=0;
 m:=0;
 for i:=1 to length(s) do begin
                          if (s[i]=')') then k:=k+1;
                          if (s[i]='(') then m:=m+1;
                          end;
 if (k=m) then  writeln(' Кол - во скобок совпадает ')
          else  writeln(' Кол - во скобок НЕ совпадает ');
end.

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


Задание С. Дана строка символов, содержащая знаки препинания. Подсчитать какие и сколько знаков препинания содержит строка.
Program n6;
Uses Crt;
Var s,s1:string;
    i,j,k:integer;
begin
 ClrScr;
 Write('ВВеди строку '); readln(s);
 s1:=',.;:"!?-';
 for i:=1 to length(s1) do begin
   k:=0;
   for j:=1 to length(s) do if (s[j]=s1[i]) then k:=k+1;
   if (k<>0) then writeln(s1[i],' - ',k:5,' раз');
   end;
end.

Эти задачи можно решать, используя один цикл и внутри него разместить несколько условий. Но более правильно будет использовать вложенные циклы.

Изменение строки

Задачи на изменение строки можно решать как обработку массива символов. Усложнение задач идет за счет усложнения алгоритма. Наиболее простые задачи, в которых нужно преобразовать строку целиком или изменить один повторяющийся символ.
Задание А. Дана строка символов. Заменить в ней все буквы А на букву О.
Program n7;
Uses Crt;
Var s:string;
    i:integer;
begin
 ClrScr;
 Write('ВВеди строку '); readln(s);
 for i:=1 to length(s) do if (s[i]='A') then s[i]:='O';
 writeln(s);
end.

    К следующей  группе можно отнести задачи, когда из строки необходимо, что ни будь удалить. Основная сложность для учащихся заключается в том, что при удалении символа длинна строки изменяется, и это приходится учитывать при составлении программы. Я обычно предлагаю способ с использованием дополнительной переменной. Когда строка разбирается по буквам и собирается в нужном порядке в другой переменной. Мне кажется, что такой алгоритм более простой и понятный.
    Задание В. Удалить из строки, введенной с клавиатуры все буквы А (латинские, заглавные).
Program n8;
Uses Crt;
var a,b:String;
      i:integer;
begin
 ClrScr;
  Write('ВВеди строку = ');readln(a);
  b:='';
  for i:=1 to length(a) do
   if (a[i]<>'A') then b:=b+a[i];
  a:=b;
  writeln(a);
end.

Наиболее сложными являются  задачи, где происходит существенное преобразование строки. В этих задачах часто приходится осуществлять преобразование типов, из строки в число и обратно. Поэтому здесь без специальных функций не обойтись. Кроме того, можно использовать задачи связанные с другими разделами информатики. Я привожу пример, в котором, прежде чем решить задачу нужно вспомнить, как переводятся целые положительные двоичные числа в десятичную систему счисления.
Задание С. Дана строка, изображающая двоичную запись целого положительного числа. Вывести строку изображающую десятичную запись того же числа.
Program n9;
Uses Crt;
var a:String;
      i,k,code,s,r:integer;
begin
 ClrScr;
  Write('ВВеди строку = ');readln(a);
  S:=0; r:=1;
  for i:= length(a) downTo 1 do begin
    val(a[i],k,code);
    S:=S+k*r;
    r:=r*2;
  end;
  Str(S,a);
 Writeln(a);
end.

Способы решения задач с дополнительной переменной и без

    Какой способ решения выбрать  всегда остается за программистом.  Поэтому я стараюсь показать несколько способов решения одной и той же задачи. Показанные ниже примеры иллюстрируют способ решения задач с использованием дополнительной переменной и без.
    Задача  Составить программу удаляющую «лишние» пробелы между словами, то есть слова должны быть разделены одним пробелом.  Решение основано на применении функции DELETE.  Перебираются символы, и если находится пара пробелов стоящих рядом, один из них удаляется. Изменения вносятся в исходную строку.
program n6_1;
Uses crt;
  var s: string;
    i, n: integer;
begin
  readln(s);
  i := 1;
  while i < length(s) do
    begin
      if (s[i] = ' ') and (s[i + 1] = ' ')
        then begin
               delete(s, i, 1);
               i:=i-1;
             end;
      i:=i+1;
    end;
    writeln(s);
end.

Можно то же самое решить  с использованием дополнительной переменной. Перебираются символы исходной строки и переносятся в новую переменную, за исключением пробела, перед которым уже есть пробел.  
program n6_2;
Uses crt;
var s,s1:string;
   i,n,k:integer;
begin
writeln('Введи строку');readln(s);
s1:=s[1];
   for i:=2 to length(s) do
     if (s[i]<>' ') or (s[i-1]<>' ') then s1:=s1+s[i];
s:=s1;
writeln(s);
End.

    .
    Задача. Составить программу переворачивающую строку, все символы которой идут в обратном порядке относительно исходной.   Идея решения без дополнительной переменной заключается в обмене символов относительно середины строки.
program n7_1;
Uses crt;
var s: string;
    i: integer;
    tmp: char;
begin
   readln(s);
   for i := 1 to length(s) div 2 do
      begin
        tmp := s[i];
        s[i] := s[length(s) - i + 1];
        s[length(s) - i + 1] := tmp;
      end;
     writeln(s)
end.

    И тоже самое с использованием дополнительной переменной.  Суть решения в следующем символы исходной строки в обратном порядке добавляются в новую строку. А затем исходная строка заменяется вновь сформированной.
program n7_2;
Uses crt;
var s, s1: string;
    i, p: integer;
begin
  readln(s);
  p := length(s);
  s1 := '';
  for i := p downto 1 do s1 := s1 + s[i];
s:=s1;
writeln(s);
end.

Поиск
Календарь
«  Апрель 2024  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930
Архив записей
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Учительский портал
    Copyright MyCorp © 2024