Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Работа с элементами переменной строкового типа



 

 

Переменная строкового типа (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] получаем гистограмму в виде:

 

1 3. 5

2 4. 1

3 3. 7

4 3. 2

 

 

Практическое задание 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; Просмотров: 353; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.038 с.)
Главная | Случайная страница | Обратная связь