![]() |
Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Работа с элементами переменной строкового типа
Переменная строкового типа (String) может рассматриваться как массив элементов символьного типа (Char). Например, если в программе определены переменные S: string; C: char; и задано S: ='Москва', то S[1]='М', S[2]='о' и т. д. и возможно присвоение, например: C: = S[1]; Таким образом строка может рассматриваться как линейный массив символов. Элементы массива, составляющие строку можно переставлять местами и получать новые слова, например:
for i: = 1 to N div 2 do begin C: = S[i]; S[i]: = S[N-i+1]; S[N-i+1]: = C end; Writeln(S); { исходное слово выведется справа налево: " авксоМ" } Здесь N: = ord(S[0]); - число символов в переменной " S" хранится в переменной S[0]. Функция " ord" преобразует символьный тип в целый. N div 2 - количество перестановок для слова из " N" символов. В переменной " C" запоминается значение i-го элемента, который меняется с элементом, симметричным относительно середины строки.
Можно производить поиск и замену заданного символа в строке, например:
for i: =1 to N do if S[i]='_' then writeln('найден символ пробел'); for i: =1 to N do if S[i]='/' then S[i]: ='\'; {замена символа " /" на " \" }
Заменяя или переставляя символы в строке по определенной схеме (закону) можно зашифровать строку. Для дешифровки используется, как правило, схема обратной перестановки или замены символов. Например:
for i: =1 to N do S[i]: = chr(ord(S[i])+2); {преобразование исходных символов в символы с кодом большим на две единицы} Напомним, что все используемые в MS-DOS символы имеют ASCII коды от 0 до 255. Здесь удобно также использовать функции Pred(C); и Succ(C);
Практическое задание N 1. 22
1. Зашифровать введенную с клавиатуры строку, заменой исходных символов на символы с кодом большим на три единицы. Провести дешифровку. 2. Зашифровать введенную с клавиатуры строку, заменой символов на символы с кодом меньшим на две единицы. Провести дешифровку.
3. Зашифровать введенную с клавиатуры строку, поменяв местами первый символ со вторым, третий с четвертым и т. д. Провести дешифровку. 4. Зашифровать введенную с клавиатуры строку, поменяв местами первый символ с третьим, второй с четвертым и т. д. Провести дешифровку.
Примечание к п. п. 1-4: Выводить на экран шифрованную и дешифрованную строки.
5. Найти и заменить символ в строке введенной с клавиатуры с подтверждением каждой замены. Программа должна запрашивать заменяемый и заменяющий символы, например: заменить i-ый символ " ф" на " Ф" в введенной строке? Вывести преобразованную строку на экран. 6. Определить и вывести на экран номера позиций и количество повторений заданного символа (или его кода) в строке, введенной с клавиатуры.
Двумерные массивы
Массивы, рассмотренные выше, имеют элементы, упорядоченные по одному индексу и называются одномерными массивами или векторами. Массив может быть двумерным, трехмерным и т. д. Двумерные массивы имеют элементы, упорядоченные по двум индексам и часто называются матрицами. В Турбо-Паскале при описании многомерного массива диапазоны изменения индексов перечисляются через запятые, например: Var A: array[1..30, 1..7] of byte;
Рассмотрим пример работы с двумерными массивами. Обозначим массивом оценки учеников класса по нескольким предметам. Каждая оценка является значением элемента массива оценок " A" и имеет порядковый номер (два индекса). Поставим в соответствие первому индексу номер фамилии в списке учеников, а второму - номер предмета, по которому получена оценка. Тогда двумерный массив оценок можно представить в виде таблицы: каждый элемент a[i, j] находится на пересечении I-ой строки и J-го столбца. Исходные данные могут быть представлены в виде таблицы оценок:
Годовые оценки по предметам:
1 2 3 4 5 6 N Фамилия Предмет физика химия алгебра геометрия история биология
1. Иванов 4 5 3 4 5 5 2. Петров 4 5 4 3 4 4 3. Сидоров 5 5 3 4 5 4 .......................... 30. Якупов 4 3 4 5 4 5
Можно создать одномерные массивы фамилий " S" учеников класса и наименований предметов " P" . Значением элемента массива " Р" будет наименование предмета, а индексом - порядковый номер предмета, например: 1 - физика, 2 - химия, 3 - алгебра, 4 - геометрия, 5 - история, 6 - биология. Приведенная выше таблица может быть представлена в виде набора элементов ( число строк = N, число столбцов = M ):
Номер Номер столбца " J": 1 2 3 4... J... M
" I" Массив S Массив P: P[1] P[2] P[3] P[4]... P[J]... P[M] 1 S[1] a[1, 1] a[1, 2] a[1, 3] a[1, 4]... a[1, j]... a[n, m] 2 S[2] Массив A: a[2, 1] a[2, 2] a[2, 3] a[2, 4]... a[2, j]... a[2, m] 3 S[3] a[3, 1] a[3, 2] a[3, 3] a[3, 4]... a[3, j]... a[3, m] 4 S[4] a[4, 1] a[4, 2] a[4, 3] a[4, 4]... a[4, j]... a[4, m] .............................. I S[I] a[i, 1] a[i, 2] a [i, 3] a [i, 4]... a[i, j]... a[i, m] .............................. N S[N] a[n, 1] a[n, 2] a[n, 3] a[n, 4]... a[n, j ]... a[n, m]
Массив оценок можно задать с использованием функции Random, например:
for i: = 1 to N do for j: = 1 to M do A[i, j]: = random(4)+2;
Для вывода наименований предметов ( " шапка" таблицы ) можно использовать операторы: Writeln; Write('Фамилия\\Предметы: |'); For i: = 1 to M do write(P[i]: 9, '_ |');
Для вывода элементов массива " A" на экран удобно использовать вложенный цикл: for i: = 1 to N do begin writeln; write(S[i]: 19, '_ |'; for j: = 1 to M do write(A[i, j]: 7, ' _ _ |') end;
Для расчета массива " SS" - сумм " M" элементов в каждой из " N" строк массива " A" (NxM) можно применить операторы:
for i: = 1 to N do begin SS[i]: = 0; for j: = 1 to M do SS[i]: = SS[i] + A[i, j] end;
Здесь для каждого индекса " i" от 1 до N происходит суммирование элементов A[i, j] по индексу " j" от 1 до M.
При модификации массива " A" изменяется расположение данных в исходном массиве, например, в случае вставки данных из линейного массива " B" в колонку с номером " M1" необходимо сдвинуть данные в колонках J > = M1 используя операторы: for i: = 1 to N do begin for j: =M+1 downto M1+1 do A[i, j]: =A[i, j-1]; A[i, M1]: =B[i] end;
Если порядковый номер предмета изменится, то необходимо изменить расположение оценок в массиве " A", например, перестановку колонок с оценками по физике и химии можно сделать операторами:
for j: = 1 to N do begin a1: =A[1, j]; A[1, j]: =A[2, j]; A[2, j]: =a1 end;
Примечание: при модификации массива " A" не забудьте соответственно изменять расположение данных в сопутствующих массивах, например, " P" или " S".
При создании новых массивов согласно некоторым условиям выбираются данные из элементов исходного массива. Например, для создания массива " В" из четных столбцов массива " A" можно использовать операторы:
for j: = 1 to M do If (j Mod 2) = 0 then for i: = 1 to N do B[i, j Div 2]: = A[i, j];
Для создания массива " В", состоящего из строк массива " A", удовлетворяющих условию A[i, 1] > C, где C - заданное число, можно использовать операторы:
k: = 0; for i: = 1 to N do If A[i, 1] > C then begin k: = k + 1; for j: = 1 to M do B[k, j]: = A[i, j] end; Для сравнения значений элементов массива удобно строить столбиковые диаграммы (гистограммы). Например, для вывода " N" значений положительных элементов массива " SS" в виде горизонтальной гистограммы можно использовать операторы:
k: = 30/S_max; { k - нормирующий масштабный коэффициент } { S_max - наибольший элемент массива " SS" } for i: =1 to N do begin writeln; { переход к новому столбику } yg: =round(k*SS[i]); { yg - длина столбика гистограммы } for j: =1 to yg do write(#220); { вывод символа '_' с кодом 220 } end;
Добавив операторы вывода порядкового номера и значений SS[ i] получаем гистограмму в виде:
Практическое задание N 1. 23
1. Рассчитать средний балл по шести предметам для каждого из десяти учащихся. Массивы наименований предметов и фамилий учащихся задать в программе. Массив оценок " A" задать с использованием функции Random. Вывести на экран таблицу: Фамилии (по вертикали), предметы (по горизонтали), все оценки, а также колонку со средними значениями оценок каждого учащегося. Вывести фамилии учеников и наибольшим и наименьшим средним баллом. 2. Исходя из данных массива " A" п. 1, создать массивы " B", " C", " D", содержащие число пятерок, четверок и троек соответственно, полученных каждым учеником по всем шести предметам. Вывести на экран таблицу: фамилии, предметы, оценки с колонками данных массивов " B", " C", " D".
Примечание к п. п. 1- 2: Вывести гистограммы с указанием фамилии ученика и его среднего балла, либо число троек полученных по всем предметам.
3. Модифицировать массив. Исходные данные п. 1. Вставить в список учащихся новую фамилию ученика с номером 5. Фамилию и оценки ученика ввести оператором Read. Убрать из таблицы предмет с номером два. Вывести на экран исходную и новую таблицы - фамилии, предметы, массив оценок. 4. К заданию п. 1. Создать два массива оценок учеников с четными и нечетными номерами. Вывести на экран таблицы - массивы оценок для каждой группы с указанием предметов и фамилий учащихся. 5. К заданию п. 1. Создать и вывести на экран три таблицы фамилий учеников со средним баллом: от 3-х до 4-х (не включая 4), от 4-х до 5-ти и 5 (отличников) с указанием всех оценок и среднего балла. 6. К заданию п. 1. Создать и вывести на экран таблицу фамилий десяти учеников, имеющих пятерки по шести, пяти, и т. д. предметам в порядке убывания. Для этого создать линейный массив " B" - число пятерок у каждого ученика. Создание нового массива фамилий " S1" можно проводить используя циклы: k: =0; for i: =1 to 10 do for o: =6 downto 0 do if B[i]=o then k: =k+1; S1[k]: =S[i];
|
Последнее изменение этой страницы: 2017-03-17; Просмотров: 376; Нарушение авторского права страницы