Egorova1
.pdf5 ОБРАБОТКА ТЕКСТОВОЙ ИНФОРМАЦИИ
Цель изучения данного модуля - познакомиться с возможностями Паскаля для обработки текстов (алфавитно-цифровой информации). Для обработки текстов можно использовать массив символов и специальный тип данных 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 - произвольное число, d≠0. |
|
||||||
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