Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Egorova1

.pdf
Скачиваний:
36
Добавлен:
14.02.2015
Размер:
1.67 Mб
Скачать

5 ОБРАБОТКА ТЕКСТОВОЙ ИНФОРМАЦИИ

Цель изучения данного модуля - познакомиться с возможностями Паскаля для обработки текстов (алфавитно-цифровой информации). Для обработки текстов можно использовать массив символов и специальный тип данных string (строка). Тип string предоставляет более мощные и гибкие возможности, чем массив символов, но в классическом Паскале отсутствует. В связи с этим в данном модуле рассмотрены оба способа представления текстовой информации, однако при выполнении лабораторной работы рекомендуется использовать более удобный тип string.

5.1 МАССИВЫ ЛИТЕР (МАССИВЫ СИМВОЛОВ)

Строка - это последовательность литер (символов, знаков). Литерные строки мы уже использовали в качестве аргументов операторов write и writeln.

Пример 1. Оператор writeln('How do you do !');

печатает на экране дисплея строку из 15 символов.

В Паскале строку можно представить в виде одномерного массива символов, верхняя граница которого - это длина строки.

Пример 2. Рассмотренную в примере 1 строку можно описать так: var tx : array [1..15] of char;

или

type text = array [1..15] of char; var tx : text;

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

Переменной tx можно целиком присвоить значение - строку длиной 15 символов. Это возможно уже именно для массива литер.

Пример 3. Ниже приведены примеры присваивания переменной tx, описанной в примере 2, целой строки.

tx := 'Спокойной ночи!' ;

tx := '0123456789 ' ; (* tx присваивается строка из 10 цифр и 5 пробелов *) tx := ' ' ; (* tx присваивается строка из 15 пробелов *)

tx := 'Я с"ел грушу ! ' ;

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

Вводить массив литер можно только по одному символу с помощью оператора For. Для ввода можно использовать и оператор Read, и оператор ReadLn.

После того, как элементы массива литер получили значение, массив литер может быть напечатан целиком с помощью одного оператора Write или WriteLn. Это возможно только для массива литер.

Пример 4. Ниже приведен фрагмент программы, где показан ввод массива литер tx по одному знаку и вывод целиком одним оператором writeln .

var tx : array [1..12] of char;

...

for i:=1 to 12 do read (tx[i]); writeln;

writeln(tx); (* Вывод строки текста на экран без обрамляющих апострофов *)

101

Пример 5. Безусловно, массив литер можно выводить и как обычный массив по одному знаку. Например, ниже приведен оператор, который распечатает строку tx посимвольно в обратном порядке.

for i:=12 downto 1 do write (tx[i]);

Пример 6. Имеется данное fio (смысл: фамилия и инициалы ), описанное как массив литер:

var fio : array[1..20] of char;

Впрограмме ввод значения fio можно запрограммировать следующим образом: for i:=1 to 20 do read (fio[i]);

Вэтом случае при вводе с клавиатуры надо обязательно вводить 20 символов, например: "Петров С.Н.", а затем 9 пробелов. Чтобы не вводить лишние пробелы, когда фамилия и инициалы короткие, можно условиться вводить за последним значимым символом какойнибудь специальный символ, например, '#'. Тогда ввод с клавиатуры будет содержать в

себе: "Петров В.В.#". В этом случае ввод значения fio

и определение его реальной длины

l выглядит следующим образом.

 

 

for i:=1 to 20 do fio[i]:=' '; (* Очистка массива fio

*)

l:=0;

(* Начальная длина l=0

*)

i:=1;

(* i - номер вводимого символа*)

repeat

 

 

 

read(fio[i]);

if fio[i] <> '#' then begin l:=l+1; i:=i+1;

end; until fio[i] = '#';

Замечание 1. Еще раз отметим, что вывод целиком одним оператором WriteLn или Write возможен для единственного структурированного типа - для массива литер.

Замечание 2. Предположим, имеется массив символов: var ch : array [1..N] of char;

При хранении символов в памяти ЭВМ один символ занимает одну ячейку памяти. Это невыгодно, так как ячейки памяти позволяют хранить от 2 до 4 символов (в зависимости от типа ЭВМ). В связи с этим в Паскале существуют упакованные массивы символов, позволяющие хранить символы более компактно. Описание упакованного массива:

var z : packed array [1..N] of char;

С внешней точки зрения, упакованные массивы - это обычные символьные строки, и над ними разрешены операции присваивания и сравнения (при условии совпадения типа индексов). Ввод и вывод упакованных массивов производится посимвольно, например:

var STRN : packed array [1..6] of char;

for i:=1 to 6 do read ( STRN[i] );

(* ввод строки *)

for i:=1 to 6 do write( STRN[i] );

(* вывод строки *)

5.2ТИП ДАННЫХ STRING

5.2.1Строковые переменные и константы

Массив литер позволяет работать со строками строго фиксированной длины, но часто длину строки заранее определить невозможно. Поэтому в Паскале предусмотрен специальный тип данных String. Переменная типа string (говорят: "строковая переменная") может принимать символьные значения переменной длины.

Пример 1. Примеры описания строковых переменных: var longln : string[200];

102

city : string[30] ; a : string;

name : string[255];

Каждая строковая переменная имеет атрибут длины - целое число без знака в диапазоне от 0 до 255, которое указывается за ключевым словом String в квадратных скобках. Этот атрибут определяет максимально возможную длину строковой переменной. Если в описании не указан атрибут длины, то по умолчанию он равен 255. В примере 1 переменная longln может иметь длину от 0 до 200 символов, city - от 0 до 30, а - от 0 до

255.

Пример 2. Примеры операторов присваивания для переменной а, описанной выше:

a:='Иван' ; (*

a - строка из 4 знаков

*)

a:=' ' ;

(*

a - строка из одного знака пробела *)

a:='' ;

(*

a - пустая строка, не содержит литер *)

Строковые

переменные могут быть

напечатаны с помощью единственного

оператора Write или WriteLn. Для ввода строковой переменной целиком необходимо использовать оператор ReadLn, а не Read.

Пример 3. Ниже приведен фрагмент программы для ввода и печати последовательности строк, пока не будет обнаружена строка 'stop'.

repeat

readln (Ln); writeln(Ln); until Ln = 'stop';

В Паскале существуют константы типа String - строковые, или символические, константы.

Пример 4. Примеры определения строковых констант в разделе Const: const title = 'сумма выплаты' ;

alphavit ='abcde' ;

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

Замечание. Со строковыми данными можно работать как с обычными массивами, то есть посимвольно. Например, печать строки по одному знаку:

var b:string;

...

for i=1 to 5 do write(b[i]);

5.2.2 Сравнение строк

Две строки можно сравнить, используя логические операции отношения

' = ', ' <> ', ' > ', ' < ', ' >= ', ' <= '.

Строки сравниваются слева направо с учетом ASCII-кодировки символов. Если одна строка меньше другой по длине, то недостающие символы короткой строки заполняются значением 0 ( не знаком '0', а знаком, ASCII-код которого равен 0). Таким образом считается, что отсутствующие символы в более короткой строке меньше любого действительного символа в более длиной строке. Например, строка 'xs' больше, чем 'x'. Сначала сравниваются самые левые символы; если они равны, то в сравнение вовлекаются следующие символы и т.д.

Пример 1. Приведенные ниже логические соотношения верны, т. е. дают результат true. 'tommy' > 'harry'

'france' = 'france' 'rock' <> 'pops' 'king' < 'kingdom' '300' < '32'

103

'Паскаль' > 'Turbo Pascal'

Пример 2.

(* Задание Написать программу, которая читает список строк, а затем печатает их в

упорядоченном по алфавиту виде.

Замечание: среди вводимых строк не должно быть пустых. Алгоритм

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

не остается строк для печати.

 

 

Программа

 

*)

program upor (i,o);

 

 

 

const size=10;

(* Количество строк текста

*)

var c,i:integer;

(* Индексы

*)

j:0..size;

(* Номер выводимой строки *)

line:array[1..size] of string;

(* Массив строк *)

begin

 

 

 

(* Чтение списка строк

*)

 

writeln('Введите ',size,' строк текста. ');

writeln('При каждом вводе задается значение одной строки.'); for i:=1 to size do readln(line[i]);

(* Упорядочивание и печать строк *) writeln;

for i:=1 to size do begin

j:=0;repeat j:=j+1 until line[j]<>''; for c:=j+1 to size do

if (line[c]<line[j])and(line[c]<>'') then j:=c; writeln(line[j]);

line[j]:='';

end;

writeln('end');

end.

5.2.3 Стандартные подпрограммы для обработки строк

Напомним, что в Паскале различают два вида подпрограмм (ПП):

1)ПП - функции,

2)ПП - процедуры.

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

Например: Y:=sin(x);

Здесь sin - имя стандартной функции,

x - входной параметр, или аргумент, для которого выполняется функция. Процедуры могут выдавать один или более результатов через список параметров,

могут вообще не выдавать явного результата в виде значения переменной, а производить какое-то действие, например, очистку экрана. Обращение к процедуре - это самостоятельный оператор, например:

clrscr;

readln(a,b);

Здесь a,b - это переменные, через которые процедура readln выдает результаты

104

своей работы.

Рассмотрим следующие стандартные ПП обработки строк:

1)функции length, concat, pos, copy, UpCase;

2)процедуры delete, insert, str, val.

А. Length

Функция Length использует в качестве аргумента строку и определяет в ней количество символов. Тип результата - integer.

Пример 1. Печать посимвольно содержимого строковой переменной Own: var Own : string;

M

for i:=1 to length(Own) do write(Own[i]);

Пример 2. Определение длины строки и запись длины в переменную n: var Own : string;

n : integer;

M n:=length(Own);

Замечание. Фактически строка st из N знаков: var st:string[N];

представляет собой массив из (N+1)-знаков: var st1:array[0..N] of char.

Нулевой символ предназначен для указания используемого количества символов строки и может изменяться от символа с кодом 0 до символа с кодом N. Таким образом, значение ord(st[0]) - это текущая длина строки, тo есть ord(st[0]) дает такой же результат,

что и Length(st). B. Сoncat

Функция Сoncat использует в качестве аргумента список строк и сцепляет их; тип результата - String. Конкатенация, или сцепление, двух строк - это строка, которая получена после приписывания к символам первой строки всех символов второй строки.

Пример 1. Приведенная ниже последовательность операторов иллюстрирует работу

функции Concat.

 

 

numbers:=соncat('123','456','789');

 

writeln(numbers);

(* На печати - 123456789

*)

sent:=concat(sent,'.');

(* Добавление точки в конец строки sent *)

Замечание. Над данными типа String может выполняться единственная операция - конкатенация, которая обозначается знаком '+'.

Пример 2. В приведенных ниже операторах используется операция конкатенации '+'.

numbers:='123'+'456'+'789'; (* Операторы дадут тот же результат,

*)

sent:=sent+'.';

(* что и в предыдущем примере 1

*)

С. Pos

Функция Pos использует в качестве аргументов две строки и определяет, содержится ли первая строка во второй. Если ответ положителен, то функция возвращает целое число, показывающее номер самой левой позиции образа первой строки во второй строке; иначе функция возвращает 0. Таким образом, тип результата - integer.

Пример. Ниже приведены операторы присваивания, в которых целым переменным x, y, z, q присваивается результат выполнения функции pos. Слева от операторов в виде комментариев указано, какое значение получит каждая переменная.

x := pos('p','apple');

(*

x=2

*)

y := pos('e','helen');

(*

y=2

*)

z := pos('Cемен','Горбунков Семен Семенович'); (* z=11 *)

q := pos('ss','sentenses'); (*

q=0

*)

D. Copy

Функция Copy использует три аргумента - строку и два целых числа:

105

сорy (st,i,j),

где st - строка, i,j - числа типа integer.

 

 

Результат: подстрока длиной j

символов, которая входит в строку

st, начиная с

i-той

позиции.

 

 

 

 

Пример 1.

 

 

 

 

s := copy('turbo',1,3); (* s='tur' *)

 

 

Замечание. Пусть х - текущая длина строки st. Тогда:

 

 

а) если i > x, то результат - пустая строка:

 

 

б) если i+j > x, то результат - последние символы строки st, начиная c i-той позиции;

 

в) если i< 1 или i >255, то будет ошибка при выполнении функции copy.

 

 

Пример 2. Даны следующие описания строковых переменных:

 

 

var fam: string[18];

(* фамилия *)

 

 

im : string[12];

(* имя

*)

 

 

ot : string[12];

(* отчество *)

 

 

Получить строку f со следующей структурой:

 

 

<Фамилия> <1-я буква имени>.<1-я буква отчества>.

 

 

Данную задачу решает следующий оператор:

 

 

f := concat(fam, ' ', copy(im,1,1), '.', copy(ot,1,1), '.');

 

 

E. Delete

 

 

 

 

Процедура Delete - обратная по отношению к функции Copy. При обращении в виде:

delete(st,i,j); —

из строки st удаляется подстрока длиной

j, начиная с

i-той

позиции. Если i >255, будет ошибка.

Пример 1. Пусть имеем следующее присваивание для строковой переменной name:

name:='abcdefg';

 

 

Тогда в результате выполнения оператора delete(name,3,2);

из строки name удалятся 3-ий

и 4-ый символы, то есть, например, оператор writeln(name);

распечатает строку 'abefg'.

Действие оператора delete можно смоделировать с помощью функций concat и copy.

Пример 2. В предыдущем примере 1 оператор delete

можно заменить следующей

последовательностью:

concat (copy(name,1,2), copy(name,5,length(name)-4));

F. Insert

 

 

Процедура Insert вставляет одну строку внутрь другой:

 

insert (st1,st2,i);

где st1, st2 - строки , i - число типа integer.

Процедура вставляет st1 в st2, начиная с i-той позиции. Данный оператор эквивалентен последовательности concat (copy(st2,1,i-1), st1, copy(st2,i,length(st2)-(i-1))) .

G. Str

Процедура Str преобразует численное значение в строковое представление. Процедура имеет целочисленный или вещественный аргумент и выдает в качестве результата строку - 2-й параметр. Например, оператор

str(120,line); — устанавливает строку line равной '120'.

После первого аргумента может указываться формат, аналогично формату в операторе

Write. H. Val

Процедура Val преобразует строковое значение в его численное представление: val(st,x,code); — преобразует строку st в величину целого или вещественного

типа и помещает результат в х. Строка st не должна содержать пробелов в начале и в конце. Переменная сode - целая. Если во время преобразования ошибки не обнаружено, то code=0, иначе сode содержит номер позиции первого ошибочного символа, а значение х не определено.

I. UpCase

Функция UpCase (ch:char):char преобразует строчную букву в прописную. Аргумент ch

ирезультат - типа char. Функция в состоянии обрабатывать только латинский алфавит.

5.3УПРАВЛЯЮЩИЕ СИМВОЛЫ В СТРОКАХ

106

Итак, строка - это последовательность символов, заключенная в одиночные кавычки. Строка совместима по типу с массивом элементов типа char той же длины и со всеми переменными типа string.

Как известно, каждому символу, допустимому в Паскале, соответствует по системе кодирования ASCII индивидуальный числовой код от 0 до 255. Символы с кодами от 0 до 127 представляют основную таблицу кодов ASCII. Эта часть идентична на всех IBMсовместимых компьютерах. Коды с символами от 128 до 255 представляют национальную часть.

Обычно значения символов задаются в одиночных апострофах, например: ch:='a'; a:='3'. Но первые 32 символа ASCII являются управляющими, и для большинства из них не существует соответствующей клавиши. Для того, чтобы включать управляющие символы

встроки, существует два способа задания этих символов:

1)#C , где C принадлежит 0..255, то есть C - код любого ASCII-символа, например: k:=#65; (символ 'A'), s:=#10 (клавиша <Enter>);

2)^C , где C - специальный символ, соответствующий требуемому управляющему символу; эта запись возможно только для символов с кодам 0..31.

Примеры. #10 - перевод строки LF,

#$A - перевод строки LF (код задан 16-ричной константой),

#27

- клавиша [Esc],

#$1B - клавиша [Esc],

^[

- клавиша [Esc],

#7

- звуковой сигнал Bell,

^G

- звуковой сигнал Bell (комбинация клавиш [Ctrl-L]).

Управляющие символы можно включать в строку, записывая их без разделителей. Пример включения управляющих символов в текстовую строку:

'Система готова ! '^G^G^G 'Вводите: '

При выводе такой строки пользователь увидит текст: Система готова ! Вводите:

и услышит длинный звуковой сигнал, вызванный ^G^G^G.

5.4 ЛАБОРАТОРНАЯ РАБОТА #5 "МАССИВЫ И СТРОКИ"

Цель лабораторной работы "Массивы и строки" - закрепить навыки работы с массивами, полученные в предыдущем модуле 4, а также получить практический опыт написания программ по обработке текстовой информации.

Задание к лабораторной работе включает в себя две следующие задачи.

1.Разработать программу по обработке полинома. Напомним, что полином задается своей степенью и массивом коэффициентов, поэтому это, по сути, задача по обработке одномерных массивов. Образец выполнения работы см. в модуле 4 (пример 16 в п.4.3.3). Вариант конкретного задания следует выбрать из списка заданий в п.5.4.1.

2.Разработать программу по обработке символьных данных (строк). Точную формулировку условия и вариант конкретного задания см. в п.5.4.2.

5.4.1 Одномерные массивы. Обработка полиномов

ЗАДАНИЕ. Написать программу обработки полинома по одному из нижеследующих заданий.

ПОЯСНЕНИЕ. Полином задается степенью n и массивом из (n+1) коэффициентов: a[0],a[1],..a[n]. Предусмотреть, чтобы при вводе полинома программа поясняла, с какого коэффициента - a[0] или a[n] - следует начинать ввод; аналогично и при выводе.

107

N1.

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

Например:

 

 

4x3+3x2+x+1 2x2+1

 

 

 

 

 

 

4x3+0x2+2x

2x+1,5

частное

 

 

 

 

 

 

 

3x2 - x+1

 

 

 

 

 

 

 

3x2+0x+1,5

 

 

N2.

 

 

 

 

 

-x - 0,5остаток

 

 

 

 

 

 

 

 

 

 

Pn (x) = an xn + an 1xn 1+Ka1x + a0,

Найти полином -

частное от деления полинома

n 10,

на

x2 + x +1.

 

 

 

 

 

N3.

 

 

 

 

 

 

 

 

Pn (x) = an xn + an 1xn 1+Ka1x + a0,

Найти полином -

частное от деления полинома

1 n 8, на (x + c).

 

 

 

 

 

 

N4.

 

 

 

 

 

 

 

 

Pn (x) = an xn + an 1xn 1+Ka1x + a0,

Найти полином -

частное от деления полинома

2 n 10,

 

на

dx2 , где d - произвольное число, d0.

 

N5.

 

 

 

 

 

 

 

 

Pn (x) = an xn + an 1xn 1+Ka1x + a0,

Найти полином -

частное от деления полинома

1 n 10,

 

на 2x.

 

 

 

 

 

 

 

N6.

 

 

 

 

 

 

 

 

 

 

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn , n 8.

 

Получить полином

Fn+3(x) = (x3 + 0,5) Pn (x) и умножить его на 3,5x3,

т.е. получить

3,5x3 F

3

(x).

 

 

 

 

 

 

 

 

n +

 

 

 

 

 

 

 

 

 

N7.

 

 

 

 

 

 

 

 

 

 

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn , n 10.

 

Получить полином

Hn+2 (x) = (x2 + c) Pn (x) и умножить его на (ax2 +b),

т.е. получить

(ax2 +b) Hn +2 (x).

 

 

 

 

 

 

 

N8.

 

 

 

 

 

 

 

 

 

 

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn , n 8.

 

Получить полином Qm (x) = Pn (x) + x Pn (x) +(x +b2 ) Pn (x), где b - произвольное число.

N9.

 

 

 

 

 

 

 

 

 

 

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn , n 8.

 

Получить полином Qm (x) = Pn (x) + x Pn (x) + x2 Pn (x).

 

N10.

 

 

 

 

 

 

 

 

 

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn , 2 n 10

 

Получить полином

(

)

, т.е. получить вторую производную от исходного полинома.

Pn′′

x

N11.

 

 

 

 

 

 

 

 

 

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn , n 8 Получить полином Pn(x).

108

N12.

 

 

 

Получить полином Pn +1(x), если Pn+1(x) = Pn (x)dx, а Pn (x) -

задан и имеет вид

Pn (x) = c0 + c1x + c2 x2 +K+cn xn , n 8.

 

 

N13.

 

 

 

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn ,

n 8.

 

Получить полином (x2 + c) Pn (x).

 

 

 

N14.

 

 

 

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn ,

n 10

 

Получить полином (x2 0,5) Pn (x).

 

 

N15.

 

 

 

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn ,

n 8.

 

Получить полином Pn (x) + x2 Pn (x).

 

 

N16.

 

 

 

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn ,

n 12

 

Получить полином x3 Pn (x).

 

 

 

N17.

 

 

 

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn ,

n 7

 

Получить полином x Pn (x).

 

 

 

N18.

 

 

 

Даны полиномы

 

 

 

Pn (x) = a0 + a1x + a2 x2 +K+an xn ,

Pm(x) = b0 +b1x +b2 x2 +K+bmxm ,

m n 10.

Получить полином Pn (x) d Pm (x), где d - произвольное число.

 

N19.

 

 

 

Даны полиномы

 

 

 

Pn (x) = a0 + a1x + a2 x2 +K+an xn ,

Pm(x) = b0 +b1x +b2 x2 +K+bmxm ,

0 m n 10.

Получить полином Pn (x) + Pm (x),

где d - произвольное число.

 

N20.

 

 

 

Из заданного полинома Pn (x) = a0 + a1x + a2 x2 +K+an xn , n 15, сформировать два:

Pk (x) = a0 + a2 x2 + a4 x4 +K, Pm (x) = a1 + a3x + a5x2 + a7 x3K.

N21.

 

 

 

 

 

 

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn , n 15

 

 

 

Получить

полином,

коэффициенты

которого

определяются

по

формуле

bk = a2k , k = 0,1,2,K. N22.

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn .

Создать два полинома: коэффициенты первого - это коэффициенты исходного полинома с чётными номерами, коэффициенты второго - с нечётными.

N23.

Получить полином, Pn (x) = 1 + 2x + 4x2 +8x3K заданной степени n.

N24.

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn , n 10.

Получить полином, коэффициенты которого равны чётным коэффициентам исходного. N25.

109

Дан полином Pn (x) = a0 + a1x + a2 x2 +K+an xn ,

 

 

n 10.

 

 

 

 

 

x = −t.

 

 

 

 

 

Получить полином, сделав в исходном замену переменной вида

 

 

 

 

 

 

N26.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

P

(x)

= a

 

 

+ a x + a

 

x2 +K+ a

 

xn

Получить полином,

 

 

сделав

 

в исходном полиноме

0

2

n

 

 

 

 

 

 

x = 2y.

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

1

 

 

 

замену переменной вида

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N27.

 

 

 

 

 

Pn (x) = a0 + a1x + a2 x2 +K+an xn ,

 

 

 

 

 

 

 

 

 

 

 

Из заданного полинома

 

 

n 10,

получить полином,

взяв за его коэффициенты

коэффициенты Pn (x)

при нечётных степенях.

 

 

 

 

 

N28.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Написать программу для вычисления произведения двух полиномов.

 

 

 

 

 

Дано:

P

 

 

(x)= a

0

+ a x + a

2

x2 +K+ a

n

xn ,

 

a

n

0, n 10,

 

 

 

 

 

 

 

n

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

G

s

(x)= b +b x +b x2 +K+b

xs , b

s

0, s 10

 

 

 

 

 

 

 

 

 

 

 

0

 

1

 

2

 

 

 

s

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Получить:

H

n+s

(x)= P (x) G

s

(x)= d

0

+ d

x +K+ d

n+s

xn+s ,

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

где

 

di = ak

bl ,

i = 0,1,2, K, n + s,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k +l =i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Pn (x)

и Gs (x),

то есть di - это результат перемножения тех коэффициентов полиномов

сумма индексов которых равна i, и сложение всех таких произведений.

 

 

 

 

 

Пример.

P

 

 

(x)= a

 

+ a x + a

 

x2 =1+3x +5x2 ,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Дано:

 

 

0

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

G1

(x)= b0 +b1 x = 2 + 6x.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Получим:

H3 (x)= d0

+ d1 x + d2 x2 + d3 x3

= 2 +12x + 28x2

 

+30x3 ;

 

 

 

 

 

 

d0

 

= a0 b0

= 2;

d1

= a0 b1 + a1 b0

= 6 + 6 =12;

 

 

 

 

 

 

 

d2

= a1b1 + a2b0

=18 +10 = 28;

 

 

d3

= a2b1 = 5 6 = 30.

 

 

 

 

 

5.4.2 Обработка текстовой информации. Работа со строками

ЗАДАНИЕ. Выполнить на ЭВМ программу обработки символьных данных (текста) в соответствии с одним из указанных ниже вариантов.

ПОЯСНЕНИЕ. Текст - это строка типа string. Фактически текст - это набор слов, разделенных пробелами и знаками препинания (при окончательной постановке задачи программист должен указать все допустимые для его программы знаки-разделители). Слова состоят из букв английского и/или русского алфавита и цифр (некоторые специальные случаи оговариваются отдельно). В некоторых заданиях указано, что различие прописных и строчных букв во внимание не принимать. Это значит, что, например, слова "Anna" и "anna" - одинаковы.

N1.

Дан текст. Определить в нем наиболее часто встречающийся символ; затем определить все слова, в которых доля этого символа максимальна.

Пример. Текст: "Veni, scripsi, vixi" ("Пришел, написал, прожил"). Наиболее часто встречающийся символ - "i". Слова, в которых доля этого символа максимальна: "vixi" (0.5).

N2.

Дан текст. Определить в нем все слова, в которых доля заданного символа максимальна.

Пример. Текст: "Veni, vidi, vici" ("Пришел, увидел, победил"). Символ: "i". Результат: слова "vidi", "vici", доля символа i равна 0.5.

110

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]