- •Общая функциональная схема эвм
- •Языки программирования
- •Этапы решения задач на эвм
- •Понятие алгоритма и его свойства
- •Типы алгоритмов
- •Ос эвм. Понятие о файловой системе
- •Команды ms dos
- •Программирование на языке паскаль
- •Структура программы на языке паскаль
- •Описание данных
- •1. Константы
- •2. Переменные
- •Комментарии
- •Операторы языка паскаль
- •Операторы обработки данных
- •1. Операторы ввода
- •2. Операторы вывода
- •3. Вычисление по формулам. Оператор присваивания
- •Линейные программы
- •Управляющие операторы
- •1. Разветвляющиеся алгоритмы. Оператор if (если)
- •2. Пример разветвляющейся программы
- •3. Оператор case
- •Циклические алгоритмы и программы
- •1. Общая схема цикла
- •2. Циклы со счетчиком
- •3. Итерационные циклы
- •3.1. Оператор цикла с пост-условием
- •3.2. Оператор цикла с пред-условием
- •Tипы данных, используемых в паскале
- •1.Представление данных в эвм
- •2. Стандартные функции Паскаля и Турбо Паскаля
- •3. Булевские переменные и выражения
- •4.Функции для работы с символами
- •5. Массивы
- •Примеры программ обработки массивов
- •Особенности алгоритмов и программ с накапливанием
- •Алгоритм нахождения минимума и максимума
- •Задача сортировки
- •Обработка многомерных массивов
- •Итерационные циклы
- •Типовые алгоритмы с итерационными циклами
- •1. Приближенное вычисление функций
- •2. Решение уравнений приближенными методами
- •2.1. Метод Ньютона
- •Программы обработки строк символов (текстов)
- •1. Простейшие алгоритмы и программы обработки строк
- •Типовые программы обработки строк
- •Задача 1 выделения слов из текста (слова разделены одним пробелом)
- •Задача 2 выделения слов из текста (слова разделены несколькими пробелами)
- •Алгоритмы поиска
- •Алгоритм линейного поиска
- •Библиографический список
- •Содержание
Программы обработки строк символов (текстов)
Тексты (символьная информация) – это анкеты, справочники, библиотеки и т.д. К задачам их обработки относятся задачи редактирования, разработки трансляторов с языков программирования и др.
Они сводятся к поиску некоторых символов или строк в соответствующих текстах, подсчету количества их вхождений и корректировке некоторых мест текста.
Для работы с символьной информацией в стандартном Паскале используются уже известные нам данные символьного типа: CHAR. Причем одна переменная такого типа представляет собой всего один символ.
В Турбо Паскале есть данные строкового типа (String).
Символы в ЭВМ представляются двоичными кодами длиной 1 байт. Поэтому отношение вида SIM1 < SIM2 имеет смысл. Причем, оно эквивалентно отношению: ORD(SIM1) < ORD(SIM2).
1. Простейшие алгоритмы и программы обработки строк
В Турбо Паскале, как отмечалось выше, используются данные строкового типа - string. В дальнейшем мы будем предполагать, что алгоритмы и программы написаны для Турбо Паскаля.
Пример определения переменных строкового типа:
VAR
str: string;
line: string[80];
После слова string может указываться длина строки (максимальная). Если длина не указана, то считается, что она переменная и определяется числом символов, записанных на место переменной типа String при вводе или присваивании. Это число хранится в нулевом байте соответствующей переменной.
Наиболее распространенные операции и функции обработки строк в Турбо Паскале приведены ниже.
1. Объединение строк – операция, изображаемая символом + .
Пример.
Пусть переменные s1, s2 и s3 имеют тип string. Тогда в результате выполнения операции:
s3 := s1 + s2;
получим строку s3, являющуюся объединением строк s1 и s2.
Если, например, s1 имела значение 'СамГТУ,', а s2 – значение 'ФАИТ', то s3 получит значение 'СамГТУ, ФАИТ'.
2. Функция Copy (исходная_строка, нач_индекс, длина) – выделение подстроки заданной "длины" из "исходной строки", начиная с символа, определенного "начальным индексом".
Если параметр "длина" больше остатка строки, то выделяется остаток , если параметр "нач_индекс" превышает длину строки, то - пустая строка.
Пример.
. . . . . .
s1:= 'СамГТУ';
s2:= Copy(s1,4,3); {Результат: s2 получит значение 'ГТУ'}
3. Процедура Delete(исх_строка, номер, длина) – удаляет подстроку заданной "длины" из "исходной строки", начиная с заданного "номера":
Пример.
. . . . .
S:= 'СамГТУ, ФАИТ';
Delete(S,4,5); {Результат: S получит новое значение 'СамФАИТ'}
. . . . .
4. Функция Length(строка) – возвращает длину строки (количество символов в ней).
5. Функция POS(подстрока, строка) – возвращает номер символа, начиная с которого "подстрока" встречается в "строке" (если не встречается, то функция возвращает ноль).
Пример.
. . . .
N := Pos('ра', 'Абракадабра'); {N получит значение 3}
M := Pos('Ра', 'Абракадабра'); {M получит значение 0}
Пример1.
Ввести в ЭВМ предложение длиной не более 80 символов и подсчитать количество слов в нем и количество букв "A".
Aлгоритм
1. Количество слов =0; кол.а=0.
2.1. Ввести предложение.
2.2. n=Длина предложения.
2.3. Для номера символа (i) от 1 до n
2.3.1. Если символ =' ', то
кол.сл. =кол.сл.+1
Иначе
Если символ ='а', то
кол.a= кол.а +1
3. Вывести кол.сл. и кол.а.
4. Закончить.
Программа для этого алгоритма будет иметь вид:
ROGRAM Predl;
VAR
Pr String;
i,n,ks,kA:INTEGER;
BEGIN
KS:=0; {п.1}
KA:=0;
{ п.2.1 }
Write('Введите предложение');
Readln(Pr);
{ п.2.2 }
n:=Length(Pr); {Длина предложения}
{ п.2.3 }
For i:=1 to n do
IF Pr[i]=' ' THEN
KS:= KS +1
ELSE
IF Pr[i]='a' THEN
ka:= ka +1;
ks:=ks+1; {если в предложении нет пробела}
{ п.3 }
WRITELN('Количество слов в предложении равно ',KS,
'количество букв а - ',ka);
End.
Пример 2.
Ввести в ЭВМ строку символов. Количество символов в строке (n <40). Отпечатать, какие символы в ней встречаются (каждый по одному разу) и сколько их.
Пример.
ABBCA -> ABC
Решение ее сводится к следующему. Каждый элемент последовательности сравнивается со всеми остальными, находящимися после него. Если данный элемент имеет номер i, то следующий – i+1 и до конца. При этом i изменяется от 1 до n-1. В процессе сравнений ищется уникальный элемент:
Если i-й элемент не равен ни одному из последующих, то он уникальный и его нужно отпечатать.
Для примера:
АВВСА Þ ВСА
Алгоритм
1. Вввести строку символов.
2. Положить кол. символов=0
3. Для i от 1 до n-1
Найти и отпечатать символы.
4. Вывести кол. символов.
5. Закончить.
Уточняем
1. Вввести строку символов.
2. Положить кол. символов=0
3. Для i от 1 до n-1
3.1. Положить количество совпадений (k)=0
3.2. Для j от i+1 до n
Если сим.i=сим.j, то
k=k+1
3.3. Если k=0, то
кол.сим.=кол.сим.+1 и
печать симi.
4. Отпечатать кол. символов.
5. Закончить.
Следует отметить, что алгоритм применим не только к строкам (массивам символов), но и к данным любого типа (например, массивам чисел).
Программа для этого алгоритма будет иметь вид:
Program Unicum;
var
s:string;
n,i,j,k,kols:integer;
begin
{п.1}
writeln('Введите строку');
readln(s);
n:=length(s);
{п.2}
kols:=0;
{п.3}
writeln('Символы строки без повтров ');
for i:=1 to n-1 do
begin
{п.3.1}
k:=0;
{п.3.2}
for j:=i+1 to n do
if s[i]=s[j] then k:=k+1;
{п.3.3}
if k=0 then
begin
kols:=kols+1;
write(s[i]:2);
end;
end;
{п.4}
writeln('Количество различных символов в строке - ',kols);
readln;
end.
Пример 3.
Сформировать массив из символов, встречающихся в тексте (вариант задачи примера 2).
Алгоритм
1. Ввести исходную строку.
2. Кол.символов в новой последовательности =0.
3. Для номера символов в исходной последовательности(i) от 1 до n
Проверить, есть ли этот символ в новой последовательности и,
если его нет, то – записать нее.
4. Вывести новую последовательность.
5. Закончить.
Уточнение п.3
3.1. Признак (колич. совпадений)=0
3.2. Для номера нового символа(j) от 1 до кол.нов.сим.
Если нов.сим.[j]=ст.сим.[i], то признак =j
3.3. Eсли признак = 0, то кол.нов.сим.=кол.нов.сим.+1
нов.cим.[кол.нов.сим.] = ст.сим.[i]
Обозначим:
старый сим. => S
кол.ст.сим. => N
Признак => JN
новый сим. => NS
кол.нов.сим. => KS
Программа для этого алгоритма будет иметь вид:
program PSK;
Const
n=20;
Var
S:String;
NS:String;
I,J,KS,JN:Integer;
Begin
{п.1 }
writeln('Введите строку');
readln(s);
n:=length(s);
{п.2}
Ks:=0;
{п.3}
For I:= 1 to n do
Begin
{п.3.1}
JN:=0;
{п.3.2}
for J:=1 to KS do
If Ns[j]=s[i] then
Jn:=J;
{п.3.3}
If Jn=0 then
Begin
Ks:=Ks+1;
Ns[ks]:=s[i];
end;
end;
{п.4}
Writeln('Результат');
For i:= 1 to Ks do
Write(NS[i]);
End.
Пример 4.
(продолжение примера 3).
Подсчитать, сколько раз каждый символ встречается в исходном тексте.
В алгоритм Примера 3 вместо п.5 (Закончить) добавляем:
5. Подсчет количества вхождений каждого символа в исходный массив.
Уточняем
5.1. Для j от 1 до kols
5.2. Кол.=0
5.3. Для i от 1 до n
Если нов.сим.[j]=ст.сим.[i], то
кол.=кол+1
5.4. Вывести кол.
Фрагмент программы после ввода исходного массива:
{Ввод S}
ks := 0; {п.2}
{п.3}
For j := 1 to n do
Begin
jn := 0; {п.3.1}
{п.3.2}
For j := 1 to ks do
If Ns[j] = S[i] then
jn := j;
{п.3.4}
If jn = 0 then
begin
ks := ks + 1;
ns[ks] := s[i];
end;
end;
{п. 4}
writeln('Символы строки без повторов ');
For i := 1 to ks do
write(ns[i]);
{Подсчет количества вхождений символов п. 5.1}
For j := 1 to ks do
begin
kol := 0; {п. 5.2}
{п. 5.3}
For i := 1 to n do
If ns[j] = s[i] then
kol := kol + 1;
{п. 5.4}
writeln('Количество букв : ',ns[j],' равно ',kol);
end;
Пример 5.
Дана последовательность из n символов латинского алфавита n<30. Расположить их по алфавиту.
Воспользуемся тем, что символы 'A' – 'Z' имеют коды, значения которых возрастают от 'А' до 'Z'. При этом для решения задачи можно применять алгоритм сортировки "пузырьком".
Program Sorts;
var
s:string;
sr:char;
n,i,k:integer;
BEGIN
writeln('введите строку');
readln(s);
n:=length(s);
for k:=1 to n-1 do
for i:=1 to n-k do
if s[i]>s[i+1]then
begin
sr:=s[i];
s[i]:=s[i+1];
s[i+1]:=sr;
end;
writeln('результат');
writeln(s);
END.
