Добавлен: 15.11.2018
Просмотров: 5599
Скачиваний: 36
14. В введенной числовой матрице, состоящей из M строк и N столбцов, элементы всех строк расположить в порядке убывания.
15. Ввести целое число N. Сформировать и вывести на экран целочисленную квадратную матрицу (двухмерный массив) размерами N N.
1 2 3 ... N-2 N-1 N
2 3 4 ... N-1 N 0
3 4 5 ... N 0 0
. . . . . . . . . . . . . . . . . . . . . . . . .
N-1 N 0 ... 0 0 0
N 0 0 ... 0 0 0
16. Ввести целое число N. Сформировать и вывести на экран целочисленную квадратную матрицу (двухмерный массив) размерами N N.
N 0 0 ... 0 0
N N-1 0 ... 0 0
N N-1 N-2 ... 0 0
. . . . . . . . . . . . . . . . .
N N-1 N-2 ... 2 0
N N-1 N-2 ... 2 1
17. В введенной числовой матрице, состоящей из M строк и N столбцов, элементы столбцов, содержащих хотя бы один отрицательный элемент, расположить в порядке убывания.
18. В введенной числовой матрице, состоящей из M строк и N столбцов, переставить строки в порядке убывания количества содержащихся в них положительных элементов.
19. В введенной числовой матрице, состоящей из M строк и N столбцов, переставить строки в порядке возрастания элементов последнего столбца.
20. В введенной числовой матрице, состоящей из M строк и N столбцов, строки матрицы, не содержащие нулевых элементов, расположить в порядке убывания произведений элементов строк.
21. В введенной числовой матрице, состоящей из M строк и N столбцов, элементы столбца, содержащего максимальное количество нулевых элементов, расположить в порядке убывания.
22. В введенной целочисленной матрице, состоящей из M строк и N
столбцов, удалить строку и столбец, содержащие минимальный из наиболее часто встречающихся элементов.
23. Замените каждый элемент матрицы целых чисел размерами M N на сумму элементов его “креста”, т.е. тех элементов, которые находятся в одном с ним столбце и в одной строке.
24. Вычислить сумму элементов одномерного массива размером N, являющихся простыми числами. Простыми числами называются числа, которые не делятся нацело ни на какое число кроме 1 и самого себя, при этом 1 простым числом не является.
2.2. Строки
С помощью компьютера часто приходится обрабатывать не только числа, но и строки символов, например имена, фамилии, названия и т.д. Поэтому в Турбо Паскале имеется специальный тип String, облегчающий программирование операций над строками.
Значение стандартного типа String – последовательность символов длиной от 1 до 255.
Данные типа String, как и числовые данные, подразделяются на константы и переменные.
Строковые константы – это последовательность символов, заключенная в апострофы. Мы уже использовали строковые константы при вводе и выводе информации, например ‘Введите размер массива’, ‘Сумма элементов матрицы А =’.
Строковые константы могут быть описаны в разделе описания констант:
Const С = ’Результаты вычислений’;
St = ’Строка’;
January: String[10] = ‘Январь’; {Типизированная константа}
Описание строковых переменных имеет вид
Var имя переменной : String[N];
Здесь N – целая константа или имя целой константы (1N 255), указывающая максимальную длину строки (количество символов).
Разрешается не указывать N, в этом случае длина строки принимается максимально возможной, а именно равной 255. Например:
Var FIO : String[25];
Nazv : String;
Как и в одномерных массивах, к отдельным символам строки можно обратиться с помощью индексов в квадратных скобках: FIO[5], Nazv[8].
Над строковыми данными определены операции: присваивание, сцепление и отношение.
Присваивание последовательности символов строковым переменным осуществляется с помощью оператора присваивания.
Ввод и вывод значений строковых переменных осуществляется без апострофов с помощью стандартных процедур Read, Readln, Write, Writeln.
Если при присваивании или вводе длина строки превышает максимальную длину строковой переменной, то все лишние символы справа отбрасываются.
Операция сцепление применяется для объединения нескольких строк в одну. Для обозначения операции сцепления в Турбо Паскале используется символ ‘+’.
Например:
Var
St, St1, St2 : String;
Begin
St1:=’ Турбо ‘;
St2:=’Паскаль’;
St:=St1+St2;
Writeln(‘St=’,St);
End.
После выполнения этой программы получим St= Турбо Паскаль.
Если длина объединенной строки превысит максимально допустимую длину N, то лишние символы справа отбрасываются.
Произвольные пары строк могут сравниваться с помощью операций отношения: =, <>, <, >, <=, >= .
Приоритет каждого из операторов отношения ниже приоритета оператора сцепления.
Сравнение строк производится посимвольно слева направо до первого несовпадающего символа, и та строка считается большей, в которой первый несовпадающий символ имеет больший ASCII-код. Если такая пара не найдена, а строки совпадают до последнего символа более короткой строки, то короткая строка рассматривается как меньшая.
Две строки равны только тогда, когда они одинаковой длины и состоят из идентичных символов.
Все остальные действия над строками реализуются с помощью стандартных процедур и функций:
LENGTH (St) - функция, возвращающая текущую длину строки St.
COPY(St, I, COUNT) – функция, которая выделяет из строки St подстроку длиной COUNT, начиная с позиции I. Если I>Length(St), то результатом будет пробел.
DELETE(St, I, COUNT) – процедура, которая удаляет из строки St подстроку длиной COUNT, начинающуюся с позиции I. Результатом является новая строка St без удаленной подстроки. Параметр St может быть только переменной.
INSERT(St1, St2, I) – процедура, которая вставляет строку ST1 в строку St2, начиная с позиции I. Параметр St2 может быть только переменной.
POS(St1, St2) – функция, которая производит поиск подстроки St1 в строке St2 и возвращает номер символа в St2, с которого начинается подстрока St1. Если подстрока St1 не входит в строку St2, то результат равен нулю.
STR(X, St) – процедура, которая преобразует выражение Х целого или вещественного типа в строку St.
VAL(St, X, CODE) – процедура, преобразующая строку символов St, представляющую число, в значение целой или вещественной переменной Х, которое определяется типом этой переменной. Параметр CODE равен нулю, если преобразование прошло успешно, в противном случае он содержит номер позиции в строке St, где обнаружен ошибочный символ.
Примеры решения задач по обработке символьных данных
Пример 2.11. Ввести строку и подсчитать количество слов в ней. Слова разделяются пробелами.
Решение.
Обозначим: St – исходная строка; L – длина исходной строки; K – количество слов в строке.
Для подсчета количества слов необходимо организовать цикл. Так как после слова может стоять не один пробел, а несколько, то для определения слова используется условие (St[I]<>' ') AND (St[I+1]=' ').
Для того чтобы при подсчете количества слов учесть последнее слово, в конец введенной строки добавляется пробел: St:=St + ' ' .
Программа
Program Prim211;
Var
St : String;
I, K, L : Integer;
Begin
Writeln('Введите строку');
Readln(St);
L := Length(St);
St:=St + ' ';
K := 0;
For I:=1 To L Do
If (St[I]<>' ') AND (St[I+1]=' ') Then K:=K+1;
Writeln('Количество слов = ', K);
End.
Пример 2.12. Ввести текст длиной до 255 символов в виде строки. Если в строке четное число символов, удалить из нее все последующие вхождения первого символа, в противном случае - удалить символ, расположенный в середине строки. Напечатать новый текст.
Решение.
Обозначим: St - исходная строка; St1- первый символ строки St; L – длина исходной строки St.
Алгоритм.
Ход выполнения алгоритма зависит от длины строки.
В первом случае необходимо организовать цикл с условием, так как после удаления символов длина строки будет меняться. В этом цикле все символы строки сравниваются с первым символом строки (St[I] = St1) и при равенстве удаляются из строки St, причем в случае удаления символа параметр цикла I не меняется, так как символы, соответствующей первому, могут следовать подряд друг за другом.
Во втором случае необходимо из строки St удалить символ с номером (L div 2) +1.
Программа
Program Prim212;
Var
St : String;
St1: Char;
I,L : Integer;
Begin
Writeln('Введите строку');
Readln(St);
L:=Length(St);
St1:=St[1];
If (L Mod 2)=0
Then
Begin
I:=1;
While I<= Length(St) Do
If St[I]=St1 Then Delete(St,I,1)
Else I:=I+1;
End
Else
Delete(St,(L Div 2)+1,1);
Writeln('Новая строка');
Writeln(St);
End.
Пример 2.13. Ввести текст длиной до 255 символов. В тексте все знаки плюс, непосредственно за которыми следует цифра, заменить пробелом. Напечатать новый текст.
Решение.
Необходимо организовать цикл просмотра всех пар соседних символов. Если в очередной паре символ St[I] = ‘+’, а второй символ - цифра (т.е.’0’<=St[I+1]<=’9’), то из строки St удаляется I-й символ и вставляется символ «пробел».
Программа
Program Prim213;
Var
St : String;
I : Integer;
Begin
Writeln('Введите строку');
Readln(St);
For I:=1 To Length(St) Do
If (St[I]='+')And(St[I+1]>='0')And(St[I+1]<='9') Then
Begin
Delete(St,I,1);
Insert(' ',St,I);
End;
Writeln('Новая строка');
Writeln(St);
End.
Рассмотрим другой вариант программы этой задачи, в котором используется тип данных множество.
Program Prim213а;
Const M=[‘0’..’9’]; {константа типа множество}
Var
St : String;
I : Integer;
Begin
Writeln('Введите строку');
Readln(St);
For I:=1 To Length(St) Do
If (St[I]='+')And(St[I+1] In M) Then
Begin
Delete(St,I,1);
Insert(' ',St,I);
End;
Writeln('Новая строка');
Writeln(St);
End.
Пример 2.14. Ввести предложение длиной до 255 символов в виде строки, а затем вывести на экран сообщение о том, сколько слов в этом предложении содержат ровно три буквы "и". В качестве разделителя слов в предложении используются символы пробела.
Решение.
Возможный вариант программы.
Program Prim214;
Var
St : String;
I, K3i, Ki : Integer;
Begin
Writeln('Введите строку');
Readln(St);
K3i := 0; {количество слов с тремя буквами “и”}
Ki := 0; { количество букв и в слове}
St := St + ‘ ‘; {добавляется пробел в конец строки}
For I:=1 To Length(St) Do
If St[I]=’ ‘
Then
Begin
If Ki=3 Then
K3i:=K3i+1;
Ki:=0
End
Else
If St[I] = ‘и’ Then Ki:=Ki+1;
If K3i = 0 Then Writeln(‘Слов с тремя “и” нет ‘)
Else Writeln(‘В строке содержится ‘,K3i,’ слов с тремя буквами “и” ’);
End.
Пример 2.15. Ввести текст длиной до 254 символов в виде строки, а затем вывести его на экран, удалив из него лишние пробелы, т.е. из нескольких подряд идущих пробелов оставить только один. Выдать сообщение о количестве удаленных пробелов.
Решение.
Возможный вариант программы.
Program Prim215;
Var
St : String;
I, L : Byte;
Begin
Writeln('Введите строку');
Readln(St);
L:= Length(St);
I := 1;
While I < Length(St) Do
If (St[I] = ' ') And (St[I+1] = ' ') Then Delete(St,I,1)
Else I:=I+1;
Writeln('Новая строка');
Writeln(St);
Writeln('Количество удаленных пробелов =',L-Length(St));
End.
Пример 2.16. Во введенном тексте заменить заданную подстроку символов на другую заданную подстроку (длины двух заданных подстрок могут не совпадать). Подсчитать количество произведенных замен.
Решение.
Обозначения: St – заданная строка; NSt – новая строка; St1 – удаляемая подстрока, St2 – вставляемая подстрока; L1 – длина удаляемой подстроки; N – номер позиции, с которой начинается удаляемая подстрока St1 в строке St; К – количество замен.
Алгоритм.
Необходимо организовать цикл, в котором формировалась бы новая строка и подсчитывалось количество произведенных вставок. Так как заранее неизвестно количество вставок, этот цикл должен быть итерационным (например цикл с предусловием While). В качестве условия окончания цикла предлагается использовать значение функции Pos, которое равно нулю, если подстроки St1 нет в строке St.
Цикл WHILE требует подготовки, т. е. номер позиции первого вхождения (N:=Pos(St1,St)) подстроки St1 в строку St должен быть введен до цикла. Номера позиций следующих вхождений определяются в цикле.
На каждом шаге цикла к строке NSt добавляется подстрока, состоящая из первых (N-1) символов строки St и символов вставляемой подстроки St2, и из строки St удаляются все символы, предшествующие подстроке St1, вместе с символами этой подстроки. Здесь N – номер позиции, с которой начинается подстрока St1 в строке St.
Возможный вариант программы.
Program Prim216;
Var
St, St1, St2, NSt : String;
L1, N, K : Byte;
Begin
Writeln('Введите строку');
Readln(St);
Writeln('Введите удаляемую строку');
Readln(St1);
Writeln('Введите вставляемую строку');
Readln(St2);
L1:=Length(St1);
N:=Pos(St1,St);
Nst:='';
While N<>0 Do
Begin
K:=K+1;
NSt:=NSt + Copy(St,1,N-1)+St2;
Delete(St,1,N-1+L1);
N:=Pos(St1,St)
End;
Writeln('Новая строка');
Writeln(NSt);
Writeln('Количество произведенных замен',K);
End.
Контрольные вопросы
1. Что представляет собой значение типа String?
2. Относится ли тип String к стандартным типам?
3. Как описываются переменные строкового типа?
4. Какова максимальная длина результирующей строки при выполнении операций над строками?
5. Какие операции можно выполнять над строковыми данными?
6. Как выполняется операция сравнения строк?
7. Какие процедуры и функции используются для обработки строковых данных?
Задачи I уровня
Эти задания предназначены для приобретения навыков работы со строками.
1. Удалить из текста все цифры, подсчитав количество удаленных символов.
2. Проверить, имеется ли в заданном тексте баланс открывающихся и закрывающихся скобок.
3. Подсчитать, сколько имеется в тексте пар одинаковых букв.
4. Поменять в тексте квадратные скобки на круглые. Подсчитать количество замен.
5. Удалить в тексте символ " и подсчитать количество оставшихся символов.
6. Из текста выбрать числа и записать их в массив Х.
7. Определить, является ли текст “палиндроном”, т.е. читается ли он одинаково без учета пробелов в обоих направлениях.
8. Отредактировать текст, заменяя многоточия точкой. Найти длину измененного текста
9. В заданном тексте подсчитать количество русских букв, обозначающих гласные звуки.
10. Из заданного текста выбрать и напечатать только те символы, которые встречаются в нем один раз.
11. В заданном выражении поменять местами знаки умножения и деления.
12. Подсчитать в тексте количество знаков препинания.
13.Подсчитать в выражении количество арифметических операций.
14. Поменять в тексте круглые скобки на квадратные.
15. Проверить баланс открывающихся и закрывающихся круглых скобок.
16. Распечатать строку с наибольшим количеством букв, обозначающих гласные звуки.
17. Заменить в выражениях знаки строгого отношения (< , > ) на знаки нестрогого отношения ( , ).
18. Записать в массив Z, состоящий из четырех элементов, количество знаков сложения, вычитания, умножения и деления в заданном выражении.
19. Заключить в скобки цифры в заданном тексте.
20. Подсчитать в тексте количество запятых. Поставить в конце текста многоточие.
21. Подсчитать в тексте количество слов, начинающихся с букв, обозначающих гласные звуки.
22. Создать массив русских букв, состоящий из 10 элементов. Подсчитать в заданном тексте количество букв, входящих в созданный массив.
23. Создать массив цифр и ввести арифметическое выражение в виде строки. Подсчитать в нем количество цифр, входящих в созданный массив.