Паскаль / Методические разработки Turbo Pascal
Изучить принципы работы с одно — и двумерными массивами на языке Pascal.
2 Задачи работы
Научиться основным алгоритмам решения задач с использованием массивов на языке Pascal.
3 Порядок выполнения работы
3.1 В среде программирования Turbo Pascal составить и отладить программу решения следующей задачи тему « Одномерные массивы »:
Задан массив из 8 действительных чисел вида а 1 , а 2 , а 3 ,…, а 8 . Вывести на экран в одну строку все элементы массива и выполнить задание в соответствии с указанным преподавателем вариантом приложения А .
3.2 Получить численные результаты и провести их анализ .
3.3 Составить и отладить программу решения следующей задачи на тему « Двумерные массивы »:
Задан целочисленный двумерный массив размера 3 х 4. Вывести на экран массив в виде матрицы , состоящей из трех строк и четырех столбцов , и выполнить задание в соответствии с указанным преподавателем вариантом приложения В .
3.4 Проанализировать полученные результаты .
3.5 Составить отчет о проделанной работе .
4 Отчет о проделанной работе должен содержать
— название и цель работы ;
— номер и условие своего варианта ;
— полученные численные результаты ;
— анализ численных результатов ;
— ответы на контрольные вопросы пункта 7 в соответствии с указаниями преподавателя .
5 Теоретические положения
5.1 Общие сведения о массивах
Массивом называется совокупность элементов одинакового типа . Число элементов в массиве называется размерностью массива ; каждый элемент массива задается своим порядковым номером в массиве – так называемым индексом .
Примером массива может являться список фамилий студентов одной группы , где каждый студент однозначно определяется своим порядковым номером в списке ( индексом в массиве ).
Для создания типа массивов в языке Pascal используются служебные слова TYPE и ARRAY, позволяющие создать пользовательский тип данных « Массив ». Каждому типу массивов присваивается собственное имя ; элементы , относящиеся к данному массиву , описываются в операторе VAR как переменные его типа .
Ввод и вывод элементов массива осуществляется в циклах . Индексы элементов массивов записываются в квадратных скобках .
5.2 Одномерные массивы
Массивы , элементы которых однозначно определяются одним индексом , называются одномерными . В виде одномерного массива можно представить , например , урожайности различных полей одного хозяйства , где
первому полю соответствует первое значение урожайности , второму полю – второе и т . д .; показатели успеваемости различных групп одного курса по определенному предмету , где каждой из групп соответствует свое значение среднего балла по результатам экзамена и др .
Язык Pascal допускает описание в программах одномерных массивов в следующем виде : TYPE < Имя _ типа _ массива >=ARRAY [< Диапазон _ индексов >] OF < Тип >,
где TYPE — служебное слово , используемое для создания пользовательского типа данных ; ARRAY … OF — служебные слова для описания массивов (“ Массив … из ”);
< Имя _ типа _ массива > — задаваемое пользователем имя типа массива ( требования к именам типов совпадают с требованиями к именам переменных ); < Диапазон _ индексов > – диапазон изменения индексов массива . В качестве данного диапазона может
выступить любой порядковый тип , кроме LONGINT. Чаще всего используют тип — диапазон , в котором задают границы изменения индексов ;
< Тип > — тип элементов массива , например , REAL, INTEGER, CHAR и др . Примеры описания типа массивов :
TYPE М =ARRAY [1..10] OF INTEGER; TYPE AR=ARRAY [0..15] OF REAL; TYPE V Т =ARRAY [-5..5] OF SINGLE;
TYPE GRUP=ARRAY [1..27] OF STRING[10].
Переменные , относящиеся к тому или иному типу массивов , должны быть соответственно объявлены в разделе описания переменных .
Например : VAR REZ:M; VAR P:AR; VAR A:V Т ;
Можно также описать переменную как непосредственно имеющую тип массива , например : VAR REZ:ARRAY [1..10] OF INTEGER.
При обращении к элементам массива в тексте программы обязательно требуется указывать их порядковый номер в массиве , например , REZ[1], POLE[0], A[5], STUD[i] ( где i принадлежит диапазону изменения индексов массива ).
Одномерные массивы , диапазон индексов которых начинается с 1, также иногда называются векторами . Например , если задан вектор V из 5 чисел (3, 0, 5, -7, 8), то второй элемент вектора равен 0 ( т . е . V[2]=0), пятый элемент вектора равен 8 ( т . е . V[5]=8) и т . д .
5.3 Примеры основных типов задач с использованием одномерных массивов
К стандартным типам задач на использование одномерных массивов относятся , прежде всего , задачи :
— нахождения суммы ( произведения ) элементов массива ; — определения наибольшего ( наименьшего ) элемента в массиве ;
— нахождения количества элементов массива , удовлетворяющих определенным условиям ; — упорядочения массива в порядке возрастания ( убывания ) элементов .
Рассмотрим перечисленные типы задач на следующих примерах .
5.3.1 Нахождение суммы элементов массива
Пусть известно , что в автопарке , имеющем 18 машин марки КАМАЗ , каждый из КАМАЗов перевез за день определенный объем груза . Определить суммарный объем перевозок грузов за день .
При решении задачи будем использовать тип массива KAMAZ для описания всех КАМАЗов автопарка ; переменную Р [i] для описания объема груза , перевезенной i- ой машиной за день (i меняется от 1 до 18). Текст программы может иметь при этом следующий вид :
Type KAMAZ =array[1..18] of real; Var i:integer;
For i:=1 to 18 do Begin
Writeln (‘ Введите объем перевозок ’, i, ‘– й машины , т ’); Readln (p[i]);
Writeln (‘ Суммарный объем перевозок S=’,S:8:2,’ т ’);
Накопление суммы в данном примере будет проводиться по шагам , при вводе для очередной машины значения объема перевозок сумма будет увеличиваться на данную величину .
Аналогично реализуется и алгоритм нахождения произведения элементов массива ( с заменой начального значения суммы S:=0 на начальное значение произведения S:=1, и с заменой операции сложения элементов массива «+» на операцию умножения «*»).
5.3.2 Нахождение наибольшего элемента в массиве
Известна среднемесячная зарплата всех 16 сотрудников одного отдела . Найти величину наибольшей среднемесячной зарплаты в отделе .
Для описания списка зарплат сотрудников воспользуемся типом массива ZARPL, для задания зарплаты каждого из сотрудников – переменной SOTR.
Текст программы к приведенному примеру : Program pr2;
Type ZARPL=array[1..16] of real; Var i:integer;
sotr:ZARPL; Max: real;
For i:=1 to 16 do Begin
Writeln (‘ Введите зарплату ’, i,’ – го сотрудника , руб .’); Readln(sotr[i]);
For i:=2 to 16 do if max<sotr[i] then max:=sotr[i]; Writeln(‘ Наибольшая зарплата =’,max:10:2,’ руб .’); End.
В данной программе реализован следующий алгоритм . В начальный момент предполагается , что наибольшей является зарплата первого из сотрудников . Далее величина этой зарплаты сравнивается с зарплатами остальных сотрудников , и , если найдется зарплата , большая , чем предполагаемый максимум , то переменной Мах присваивается это значение .
Аналогично может быть найден и наименьший элемент в массиве . Для этого достаточно заменить в изложенной программе условие max<sotr[i] на условие min>sotr[i], где i меняется от 1 до 1 до 16, min – переменная типа REAL.
5.3.3 Нахождение количества элементов массива, удовлетворяющих некоторому условию
Известны результаты экзамена 22 студентов одной группы по информатике . Определить , сколько студентов сдали экзамен на 4 и 5.
Один из вариантов решения поставленной задачи имеет следующий вид : Program pr3;
Type INF=array[1..22] of integer; Var stud:INF;
for i:=1 to 22 do begin
1: writeln(‘ Введите оценку ’,i,’- го студента ’); readln(stud[i]);
if (stud[i]<1) or (stud[i]>5) then goto 1; if stud[i]>3 then p:=p+1;
writeln(‘ На 4 и 5 сдали экзамен ’,p:2,’ студентов ’); end.
В данной программе для обозначения списка оценок по информатике использовался тип массива INF, для обозначения оценок конкретных студентов – переменная stud. Программа предусматривает проверку корректности вводимых данных : при попытке ввода несуществующей по пятибалльной системе оценки ,
программа повторяет ее ввод . Для этого используется оператор перехода GOTO, где имя метки , к которой осуществляется переход ( в данном случае 1), описывается в разделе описания меток LABEL.
5.3.4 Сортировка массива по возрастанию
Известны результаты соревнования 9 участников по стрельбе . Расположить данные результаты в порядке возрастания набранных при стрельбе очков .
Алгоритм решения данной задачи является наиболее сложным из приведенных выше примеров и требует использования вложенных циклов .
Один из способов сортировки массивов заключается в следующем . Сначала первый элемент массива в цикле сравнивается по очереди со всеми оставшимися элементами . Если очередной элемент массива меньше по величине , чем первый , то эти элементы переставляются местами . Сравнение продолжается далее уже для обновленного первого элемента . В результате окончания данного цикла будет найден и установлен на первое место самый наименьший элемент массива . Далее продолжается аналогичный процесс уже для оставшихся элементов массива , т . е . второй элемент сравнивается со всеми остальными и , при необходимости , переставляется с ними местами . После определения и установки второго элемента массива , данный процесс продолжается для третьего элемента , четвертого элемента и т . д . Алгоритм завершается , когда сравниваются и упорядочиваются предпоследний и последний из оставшихся элементов массива . Программа реализации изложенного алгоритма может иметь следующий вид :
Type STREL=array[1..9]of integer; Var rez:strel;
For i:=1 to 9 do begin
writeln(‘ Введите результаты ’,i,’- го участника ’); readln(rez[i]);
for i:=1 to 8 do for j:=i+1 to 9 do if rez[i]>rez[j] then begin
writeln(‘ Отсортированные по возрастанию результаты :’); for i:=1 to 9 do write (rez[i]:5,’ ‘);
Здесь STREL – тип массива результатов стрельбы участников , rez[i] – переменная для описания результатов i- го участника (i меняется от 1 до 9). Вспомогательная переменная s используется при перестановке местами элементов массива .
5.4 Двумерные массивы
Массив , для задания элементов которого требуется использовать два индекса , называется двумерным . Примеры двумерных массивов : места в зрительном зале театра , где каждое место характеризуется номером ряда и номером кресла в ряду ; таблица результатов спортивного чемпионата , где все команды характеризуется результатом игры с каждым из соперников и др .
Двумерные массивы , в которых диапазоны индексов начинаются с 1, также называются иногда матрицами . Размерность каждой матрицы определяется как MxN, где М – число строк в матрице , N – число столбцов . Например , задана матрица А размерностью 3 х 4.
Здесь элемент A[2,1]=5, A[1,2]=-7, A[3,2]=5, A[3,3]=-8. Первый индекс элемента двумерного массива задает номер строки матрицы , в которой расположен элемент , второй индекс – номер столбца .
Если число строк матрицы равняется числу столбцов , то матрицы данного типа называются квадратными . Элементы квадратной матрицы вида B[1,1], B[2,2], B[3,3]… составляют главную диагональ матрицы . Иногда вводят понятие побочной диагонали квадратной матрицы для элементов вида B[1,N], B[2,N-1], B[3,N-2]…B[N,1], где N – число строк ( столбцов ) матрицы .
Описание типов двумерных массивов в языке Pascal осуществляется аналогично описанию типов одномерных массивов с добавлением диапазона изменения второго индекса .
TYPE MATR=[1..4,1..5] OF INTEGER; TYPE B=[2..9,0..6] OF REAL;
TYPE C=ARRAY[-1..4,-1..4] OF CHAR.
Также допускается указание имени другого типа массива в качестве типа элементов массива , например :
TYPE VEC=ARRAY[1..4] OF REAL; MAS=ARRAY[1..5] OF VEC.
В результате приведенного выше описания тип массива MAS будет объявлен как тип двумерного массива , первый индекс которого будет меняться от 1 до 5, а второй индекс – от 1 до 4, т . е . размерность массива составит 5 х 4 элементов .
При вводе и выводе элементов двумерных массивов используются вложенные циклы , в которых внешний оператор цикла , как правило , задает изменение строк массива , внутренний оператор цикла – изменение столбцов .
5.5 Примеры задач с использованием двумерных массивов При решении задач на использование двумерных массивов применяются , как правило , те же алгоритмы , что
и при работе с одномерными массивами . Проиллюстрируем это на конкретных примерах .
5.5.1 Нахождение наибольшего элемента в заданной строке матрицы
Пусть задана матрица А из действительных чисел размера 3 х 4. Найти наибольший элемент во второй строке данной матрицы .
Приведем программу решения задачи в виде :
Type Matr=array[1..3,1..4] of real; Var max:real;
for i:=1 to 3 do for j:=1 to 4 do begin
writeln(‘ Введите элемент а [‘,i,’,’,j,’]’); readln(a[i,j]);
max:=a[2,1]; for j:=2 to 4 do
if max<a[2,j] then max:=a[2,j];
writeln(‘ Наибольший элемент второй строки =’,max:8:2); end.
Данная программа представляет собой реализацию алгоритма нахождения наибольшего элемента вектора , полученного путем фиксирования одного из индексов двумерного массива .
5.5.2 Нахождение элементов массива, удовлетворяющих определенному условию
Известны результаты 5 студентов по итогам экзаменов по химии и информатике . Найти фамилии студентов , сдавших оба экзамена на отлично .
Для решения поставленной задачи может быть использована следующая программа : program Sessia;
type PR=array [1..5,1..2]of integer; Fam=array[1..5]of string[10];
var r:pr; st:fam; i,j:integer;
for i:=1 to 5 do begin
writeln(‘ Введите фамилию ‘,i,’- го студента ‘); readln(st[i]);
writeln(‘ Введите оценку данного студента по химии ( от 2 до 5)’); readln(r[i,1]);
writeln(‘ Введите оценку данного студента по информатике ( от 2 до 5)’); readln(r[i,2]);
if (r[i,1]=5) and (r[i,2]=5) then writeln(‘ Студент — отличник — ‘,st[i]); end.
В данной программе для хранения фамилий студентов используется одномерный строковый массив st типа Fam, для хранения оценок студентов – двумерный целочисленный массив r типа PR, причем первый столбец матрицы r используется для хранения результатов экзамена по химии , второй столбец – экзамена по информатике . Если у некоторого студента оценки за оба экзамена составили 5 баллов , то его фамилия будет выведена на экран с сообщением « Студент — отличник ».
5.5.3 Нахождение сумм элементов строк матрицы
Рассмотрим задачу нахождение сумм элементов строк матрицы на примере задачи подсчета итогов футбольного чемпионата .
Пусть задана таблица результатов игр 5 команд футбольного чемпионата размера 5 х 5. На диагонали таблицы стоят значения 0, другие элементы таблицы равны 0, 1 или 2, где 0 баллов соответствует проигрышу команды в игре , 1 балл – ничьей , 2 балла – выигрышу . Определить сумму баллов каждой команды по результатам чемпионата .
Легко заметить , что для построения матрицы R результатов игр достаточно ввести лишь стоящую выше ( или ниже ) главной диагонали половину матрицы , т . к . результаты остальных игр могут быть рассчитаны из известного соотношения : если , например , первая команда обыграла вторую , то элемент R[1,2]=2, а элемент R[2,1]=2-R[1,2]=0; аналогично , если вторая команда сыграла в ничью с третьей , то R[2,3]=1, R[3,2]=2- R[2,3]=1. Таким образом , нетрудно получить вид взаимосвязи элементов матрицы : R[i,j]+R[j,i]=2, где i и j меняются от 1 до 5 ( кроме элементов главной диагонали ). На главной диагонали матрицы R по условию задачи всегда стоят числа 0.
Перейдем к написанию программы решения поставленной задачи . Program foot;
Type tab=array[1..5,1..5] of integer; Var r:tab;
for j:=i+1 to 5 do begin
writeln (‘ Введите результат игры ‘,i,’– й команды с ’,j,’ – й : 0, 1 или 2 балла ’); readln(r[i,j]);
for j:=1 to i-1 do r[i,j]:=2-r[j,i];
for i:=1 to 5 do begin
for j:=1 to 5 do write(r[i,j]:4); writeln;
for j:=1 to 5 do s:=s+r[i,j];
writeln(i,‘- ая команда набрала ’,s:3,’ очков ’); end;
6 Методические рекомендации к выполнению работы
6.1 При выполнении задания воспользоваться алгоритмами решения стандартных задач по теме « Одномерные массивы », изложенными в п .5.3.1-5.3.4.
6.2 Провести численные расчеты для вектора (4, 7, -9, 5, 1, -5, 10, 7). Проанализировать правильность полученных результатов .
6.3 При решении задачи воспользоваться примерами программ в п .5.5.1-5.5.3 и алгоритмами п .5.3.1-5.3.4.
Пример вывода на экран двумерного массива в виде матрицы размерности 3 х 4 приводится в следующем фрагменте программы :
for i:=1 to 3 do begin
for j:=1 to 4 do write( а [i,j]:5); writeln;
Проанализировать полученные результаты .
7 Контрольные вопросы
7.1 Что понимают под массивом данных ?
7.2 Что называют размерностью массива ?
7.3 Что понимают под индексом элемента массива ?
7.4 Какой массив называется одномерным ?
7.5 Приведите примеры одномерных массивов .
7.6 Как описываются одномерные массивы на языке PASCAL?
7.7 Как задается диапазон изменения индексов массива ?
7.8 Как обозначаются индексы массивов на языке PASCAL?
7.9 Какие стандартные алгоритмы по работе с одномерными массивами Вы знаете ?
7.10 Поясните понятия двумерного массива , матрицы .
7.11 Что обозначают индексы матрицы ?
7.12 Сколько элементов в матрице из 7 строк и 9 столбцов ?
7.13 Дайте понятие квадратной матрицы , диагоналей квадратной матрицы .
7.14 Приведите пример описания двумерных массивов на языке PASCAL.
7.15 Поясните порядок использования вложенных циклов при вводе элементов двумерного массива .
1. Фаронов В . В . Турбо Паскаль 7.0. Начальный курс . – М .: Нолидж . – 2000. – 576 с .
2. Зуев Е . А . Система программирования Turbo Pascal. – М .: Радио и связь . – 1992. – 288 с .
3. Рубенкинг Н . Турбо Паскаль для Windows. – М .: Мир . — 1994. – 535 с .
4. Информатика . Базовый курс / Под ред . С . В . Симоновича – СПб : Питер .- 2000. – С .560 — 611.
Приложение А Варианты заданий на тему «Одномерные массивы»
1) Найти среднее арифметическое всех элементов массива .
2) Найти наименьший элемент в массиве .
3) Найти количество положительных элементов массива .
4) Найти количество отрицательных элементов массива .
5) Определить , сколько раз встречается число 7 среди элементов массива .
6) Определить , сколько элементов массива меньше , чем число 6.
7) Определить , сколько элементов массива больше , чем число 3.
8) Найти сумму всех неотрицательных элементов массива .
9) Найти наименьшее из чисел а 1 , 2 а 2 , 3 а 3 ,…, 8 а 8 .
10) Найти наибольшее из чисел 2 а 1 , 3 а 2 , 4 а 3 ,…, 9 а 8 .
11) Найти сумму а 1 +2 а 2 +3 а 3 +…+8 а 8 .
12) Найти наименьший по модулю элемент массива .
13) Найти разность между наибольшим и наименьшим элементами массива .
14) Отсортировать массив в порядке убывания элементов .
15) Найти произведение отрицательных элементов массива .
16) Найти сумму всех элементов массива , имеющих четные индексы .
17) Найти наибольший из элементов массива , имеющих нечетные индексы .
18) Найти среднее арифметическое всех положительных элементов массива .
19) Найти среднее арифметическое всех отрицательных элементов массива .
20) Найти сумму элементов массива , превышающих число 5.
Приложение В Варианты заданий на тему «Двумерные массивы»
1) Найти наибольший элемент в третьем столбце матрицы .
2) Найти сумму всех элементов матрицы .
3) Найти сумму всех положительных элементов матрицы .
4) Найти наименьший элемент в первой строке матрицы .
5) Найти среднее арифметическое значение элементов второго столбца матрицы .
6) Найти произведение элементов третьего столбца матрицы .
7) Найти сумму элементов первой и третьей строк матрицы .
8) Определить , сколько раз встречается число 5 среди элементов всей матрицы .
9) Определить , сколько раз встречается число 1 среди элементов третьей строки матрицы .
10) Найти количество отрицательных элементов в матрице .
11) Найти количество отрицательных элементов в первой строке матрицы .
12) Найти количество неотрицательных элементов во втором столбце матрицы .
13) Найти сумму элементов второй строки матрицы .
14) Найти наибольший элемент в матрице .
15) Найти наименьший элемент в матрице .
16) Найти наименьший по модулю элемент в первой строке матрицы .
17) Найти среднее арифметическое значение всех отрицательных элементов матрицы .
18) Определить , сколько элементов матрицы превышает число 2.
19) Расположить все элементы матрицы в строку в порядке возрастания .
20) Расположить все элементы матрицы в строку в порядке убывания .
Методические указания к лабораторной работе
Использование строковых переменных в среде программирования Pascal
Научиться принципам работы со строковыми переменными в среде программирования Pascal .
2 Задачи работы
Изучить приемы решения задач с использованием строковых переменных .
3 Порядок выполнения работы
3.1 В среде программирования Turbo Pascal составить и отладить программу решения следующей задачи :
Задан список студентов из 7 фамилий . Распечатать данный список в столбец и выполнить задание в соответствии с указанным преподавателем вариантом приложения А .
3.2 Провести анализ результатов работы программы .
3.3 Составить отчет о проделанной работе .
4 Отчет о проделанной работе должен содержать
— название и цель работы ;
— номер и условие своего варианта ;
— полученные при расчетах результаты ;
— анализ полученных результатов ;
— ответы на контрольные вопросы пункта 6 в соответствии с указаниями преподавателя .
5 Теоретические положения
5.1 Описание переменных строкового типа
Для обработки текстов в среде программирования Turbo Pascal используется тип STRING ( строка ). Количество символов в строке — переменной задается объявлением типа STRING[N] , где значение N может быть любой константой порядкового типа , не превышающей 255.
Объявление типа STRING[N] указывает , что число символов в строке — переменной может изменяться в диапазоне от 1 до N . Если при описании типа количество символов в строке не указано , то по умолчанию длина строки принимается максимально возможной , т . е . 255 символов .
Строка в Turbo Pascal трактуется как цепочка символов . К любому символу в строке можно обратиться так же , как к элементу символьного массива типа ARRAY [1..N] OF CHAR . Над символами строки можно осуществлять необходимые действия и , тем самым , изменять содержание строки , ее длину и т . д .
Пример : program pr1; var st:string[6];
i:integer; begin st:=’ primer ‘; for i:=1 to 6 do write(st[i], ‘ ‘); end.
В результате работы данной программы на экран будут распечатаны следующие значения : p r i m e r
Таким образом , первым символом st[1] в переменной st является буква p , вторым символом st[2] является r , третьим – i и т . д .
К строкам можно применять операцию сцепления , например : program pr2;
var st:string[3]; begin
В результате работы предложенной выше программы переменной st будет присвоено значение ’abc’. Допускается сравнение строковых переменных . Операции отношений =, <>, >, <, >=,<= выполняются над двумя строками посимвольно , слева направо , с учетом внутренней кодировки символов .
Примеры сравнения строковых переменных с результатом « Истина »: ‘A’ < ‘B’
‘Turbo Pascal’ > ‘Turbo’ ‘2’ > ’1’
5.2 Процедуры и функции по работе со строками
Действия над строками реализуются в Turbo Pascal с помощью следующих встроенных процедур и функций . 5.2.1 Функция Concat(S1[,S2,…,SN]): string – сцепляет ( объединяет ) строки S1, S2,…, SN . Параметры , указанные в квадратных скобках , не являются обязательными .
Массивы и их организация. Типы данных в массиве. Диапазон индекса. Одномерные массивы примеры.
Массив есть упорядоченный набор переменных одинакового типа. Каждая отдельная величина называется компонентой массива. Тип компонент может быть любым, принятым в языке Паскаль, кроме файлового типа. Тип компонент называется базовым типом. Каждая компонента может быть явно обозначена с помощью имени переменной-массива, за которым в квадратных скобках следует индекс. Их тип называется типом индекса. Время, требуемое для доступа любой компоненты, не зависит от значения индекса. Поэтому о массивах можно говорить как об объектах, структура которых допускает случайный (или прямой) доступ.
Переменная массивового типа описывается в разделе описания переменных в следующей форме:
<идентификатор>: array[<тип индекса>] of <тип компонент>
Чаще всего в качестве типа индекса употребляется интервальный тип. Например, одномерный массив среднемесячных температур опишется так:
T: array[1..12] of real;
Описание массива определяет, во-первых, размещение массива в памяти, во-вторых, правила его дальнейшего употребления в программе. Последовательные элементы массива располагаются в последовательных ячейках памяти (T[1], T[2] и т.д.), причем значения индекса не должны выходить из диапазона 1. 12. В качестве индекса может употребляться любое выражение соответствующего типа.
В качестве индекса может быть использовано выражение. Тип индексов может быть только интервальным или перечисляемым. Действительный и целый типы недопустимы. Индексы интервального типа, для которого ба- зовым является целый тип, могут принимать отрицательные, нулевое и положительные значения.
В операторной части программы один массив может быть присвоен другому, если их типы идентичны.
Для ввода или вывода массива в список ввода или вывода помещается переменная с индексом, а операторы ввода или вывода выполняются в цикле.
Размерность массива. Самый простой способ упорядочения –это линейное. Любой элемент массива определяется его номером-индексом элемента. Т.к. индекс в данном случае один, то массивы с таким способом упорядочивания называются одномерными. В двумерных массивах данные располагаются не в одну линию, а в несколько: в таком случае необходимо задавать два индекса: номер строки и номер столбца.
Размер массива то диапазон изменения каждого индекса. Индексы могут быть не только целыми числами, но и величинами любого порядкового типа: символами, величинами перечисляемых чисел.
Массивом называется совокупность данных, выполняющих аналогичные функции, и обозначаемая одним именем. Если за каждым элементом массива закреплен только один его порядковый номер, то такой массив называется линейным, или одномерным.
28)
. В математике часто используют многомерные массивы, т.е. массивы массивов. Особенно широкое распространение получили двумерные массивы. Такие массивы условно можно изобразить в виде таблицы. С информацией, представленной в виде таблицы, мы очень часто встречаемся в различных областях знаний — экономике, статистике, математике физике, химии и т.д.
Каждый элемент таблицы имеет два индекса, значения которых позволяют указать местоположение элемента (его координаты).
Первый индекс — это номер строки, который изменяется только с переходом на следующую строку; второй индекс _ номер столбца. При решении экономических, статистических задач очень часто информация заносится в таблицы, в информатике каждая таблица это тоже двумерный массив.
Про матрицу, имеющую m строк и n столбцов, говорят, что она имеет размер m*n.
Перемещаться по таблице мы можем, двигаясь по строке в этом случае индекс строки изменяется медленнее, чем индекс столбца, и, соответственно, по столбцу (индекс столбца будет изменяться медленнее, чем индекс строки).
При решении задач с использованием двумерных массивов во всех случаях (кроме некоторых частных) организуются вложенные циклы.
Перемещение по строке:
For i:=l to m do —> внешний цикл, изменяется номер строки
For j:=l to n do —> внутренний цикл, изменяется номер столбца
Перемещение по столбцу:
For j:=l to n do —> внешний цикл, изменяется номер столбца
For i:=l to m do —> внутренний цикл, изменяется номер строки
Создать такой массив не сложнее, чем одномерный. Вот пример:
Mas: Array[1..5, 1..5] of Integer;
Здесь создается двухмерный массив, размером в 5 строк и 5 столбцов. Сначала указывается количество строк, после — через запятую — количество столбцов.
Двумерный массив в Паскале трактуется как одномерный массив, тип элементов которого также является массивом (массив массивов). Положение элементов в двумерных массивах Паскаля описывается двумя индексами. Их можно представить в виде прямоугольной таблицы или матрицы.
Рассмотрим двумерный массив Паскаля размерностью 3*3, то есть в ней будет три строки, а в каждой строке по три элемента:
Каждый элемент имеет свой номер, как у одномерных массивов, но сейчас номер уже состоит из двух чисел – номера строки, в которой находится элемент, и номера столбца. Таким образом, номер элементопределяется пересечением строки и столбца. Например, a 21 – это элемент, стоящий во второй строке и в первом столбце.
Для заполнения, обработки и вывода элементов двумерного массива используется структура вложенного цикла с параметром.
Как задается диапазон изменения индексов массива
Если работа программы связана с хранением и обработкой большого количества однотипных переменных, для их представления в программе можно использовать массивы.
Например, пусть программа пользователя выполняет некоторые действия над последовательностью целых чисел, насчитывающей сто элементов i1, i2, . i100 которые требуется сохранить до конца ее работы. Вместо того чтобы описывать указанные переменные сто раз, можно один раз объявить целочисленную переменную i , состоящую из ста элементов, — массив.
Массив представляет собой совокупность данных одного типа с общим для всех элементов именем.
Элементы массива пронумерованы, и обратиться к каждому из них можно по номеру (или нескольким номерам — например, для элемента таблицы задается номер строки и столбца). Номера элементов массива иначе называются индексами, а сами элементы массива — переменными с индексами (индексированными переменными).
Обратите внимание — данные в массивах сохраняются, как и в случае использования обычных неиндексированных переменных, только до конца работы программы. Для их долговременного хранения программа должна записать данные в файл.
•тип — общий тип всех элементов массива;
•размерность (ранг) — количество индексов массива;
•диапазон изменения индекса (индексов) — определяет количество элементов в массиве.
Вектор (одномерный массив) — это пример массива, в котором элементы нумеруются одним индексом.
Если в массиве хранится таблица значений (матрица), то такой массив называется двумерным, его элементы нумеруются двумя индексами — номером строки и столбца соответственно. Массивы еще большей размерности (трехмерные, четырехмерные и т. д.) на практике встречаются довольно редко.
В качестве номера (индекса) элемента массива, в общем случае, используется выражение порядкового типа. Наиболее часто индекс — это целая константа или переменная типа integer , реже — типа char или boolean .
При обращении к элементу массива индекс указывается в квадратных скобках после имени массива. Например, а[3], Ь[1,2] . Однако использование элементов массива в качестве обычных переменных не дает существенной выгоды. Массивы ценны тем, что их индексы сами могут быть переменными или выражениями, обеспечивая доступ не к одному, а к последовательности элементов. Обработка массивов производится при изменении индексов элементов.
Например, в случае использования выражения следующие переменные удобно применять для просмотра в цикле элементов массива:
• a[i] — всех элементов;
• a[2*i] — элементов, стоящих на четных местах;
• a[2*i-i] — элементов, стоящих на нечетных местах.
 предыдущая         меню        вверх         следующая
Большая Энциклопедия Нефти и Газа
Иногда нужно знать диапазон изменения индексов массива . Значением примитивной функции PROTOTYPE является прототип, использованный при создании массива. Значением параметра функции PROTOTYPE должен быть массив, ее результат — цепочка-прототип. [2]
Для нее характерно равномерное отображение значений ключа на весь диапазон изменения индексов , поэтому ее кладут в основу большинства преобразований ключей. Кроме того, при N, равном степени двух, эта функция эффективно вычисляется. Однако если ключ представляет собой последовательность букв, то именно от такой функции и следует отказаться. Дело в том, что в этом случае допущение о равновероятности всех ключей ошибочно. [3]
Как показывают экспериментальные исследования выхлопных газов ГПА различных типов, диапазон изменения индекса концентрации составляет в среднем от 0 6 до 3 0 в зависимости от эмиссионной характеристики камеры сгорания, технического состояния агрегатов и наработки с начала эксплуатации и после капитального ремонта. [4]
В языках программирования — синтаксическая конструкция, определяющая нижнюю и верхнюю границы диапазона изменения индекса массива . [5]
Объявление массива компонентов ничем не отличается от объявления обычного массива — указывается имя массива, диапазон изменения индекса и тип элементов массива. [7]
Описатель CONTROLLED используется при динамическом распределении памяти, например для размещения в памяти массивов, у которых диапазоны изменения индексов не определены в момент входа в блок, а вычисляются в процессе выполнения блока. [8]
В паспорте ОСВ задается либо число команд в ОСВ, либо длина ОСВ в байтах, а также диапазоны изменения индексов элементов векторов при циклической организации выполнения команд ОСВ. [9]
Элементарные инфиксные и префиксные операторы могут применяться к операндам, являющимся массивами, и давать в результате массивы с тем ограничением, что эти массивы должны быть идентичны по числу размерностей и диапазонам изменения индексов . Типы элементов массивов могут различаться при условии, что могут быть выполнены соответствующие преобразования типа. Например, если А и В — два массива с идентичными размерностями и диапазонами изменения индексов, то A — f — В дает в результате массив той же размерности, каждый элемент которого является суммой соответствующих элементов А и В. [10]
В PL / 1, в отличие от фортрана II и IV, индексы могут принимать не только положительные значения, но и нулевые и отрицательные; поэтому в атрибуте размерности PL / I характеристика диапазона изменения индекса для каждой из размерностей массива может задаваться и с помощью граничной пары. [11]
Параметром функции ARRAY является цепочка, образованная двумя цепочками PROTOTYPE ( A), между которыми стоит запятая. Таким образом, в новом массиве диапазон изменения индексов для обоих измерений одинаков. [12]
Динамическое моделирование большинства структур языка Алгол осуществляется относительно просто и во многих случаях позволяет прямо использовать возможности аппаратуры. Массивы хранятся последовательно с неполным дескриптором, который необходим для динамического определения диапазона изменения индексов , однако описание типа и числа размерностей массива позволяет компилировать формулы доступа в последовательности выполняемых команд. Описания также позволяют применять специфические в отношении типов операции, которые обычно прямо обеспечиваются аппаратурой, за исключением нескольких случаев, упомянутых в предыдущем разделе. Основные области, требующие динамического программного моделирования, — это среда ссылок, параметры, передаваемые по имени, и ввод-вывод. [13]
Перед тем, как новому вектору будет выделена память, будут найдены значения выражений / К и М для определения диапазона изменения индексов нового вектора и количества необходимой памяти. [14]
В таких языках, как Алгол и ПЛ / I, требования к декларациям данных ослаблены в тех случаях, когда при небольшой потере в эффективности выполнения можно получить значительный выигрыш в гибкости. Хранение и обработку массивов можно организовать наиболее эффективно при наличии в декларациях массивов полной информации о типе, числе размерностей и диапазоне изменения индекса для каждой размерности, как это делается, например, в Фортране. Однако от такой полной фиксации структуры массива сильно страдает гибкость. Например, программист, пишущий на Фортране, часто вынужден определять массивы в расчете на наихудшие входные данные, отводя под них гораздо больше памяти, чем может в действительности понадобиться. Другой крайностью являются массивы АПЛ, вообще не требующие деклараций; они могут создаваться динамически, когда понадобятся, и могут быть переформированы в любой момент. Это соглашение дает большую гибкость, но поскольку приходится непрерывно проверять дескриптор, выполнение программы замедляется. Алгол представляет собой золотую середину между этими двумя крайностями. В программе на Алголе необходимо описать тип и число размерностей массива, но не обязательно задавать размер массива или диапазоны изменения индексов. Зная тип массива и число размерностей, компилятор Алгола способен скомпилировать весьма эффективные последовательности команд для обработки массива. Во время выполнения программы должны существовать простые дескрипторы, задающие диапазон изменения индекса для каждой раз мерности; дескриптор должен проверяться и обрабатываться каждый раз, когда происходит обработка массива. Потеря в скорости при таком подходе незначительна, зато программист получает важное средство — массивы, у которых размеры и диапазоны изменения индексов могут определяться динамически во время выполнения программы. Язык ПЛ / I, в частности, содержит многочисленные примеры средств, предусмотренных специально для достижения разумного баланса между противоречивыми требованиями эффективности выполнения и гибкости. [15]
Паскаль / Методические разработки Turbo Pascal
Изучить принципы работы с одно — и двумерными массивами на языке Pascal.
2 Задачи работы
Научиться основным алгоритмам решения задач с использованием массивов на языке Pascal.
3 Порядок выполнения работы
3.1 В среде программирования Turbo Pascal составить и отладить программу решения следующей задачи тему « Одномерные массивы »:
Задан массив из 8 действительных чисел вида а 1 , а 2 , а 3 ,…, а 8 . Вывести на экран в одну строку все элементы массива и выполнить задание в соответствии с указанным преподавателем вариантом приложения А .
3.2 Получить численные результаты и провести их анализ .
3.3 Составить и отладить программу решения следующей задачи на тему « Двумерные массивы »:
Задан целочисленный двумерный массив размера 3 х 4. Вывести на экран массив в виде матрицы , состоящей из трех строк и четырех столбцов , и выполнить задание в соответствии с указанным преподавателем вариантом приложения В .
3.4 Проанализировать полученные результаты .
3.5 Составить отчет о проделанной работе .
4 Отчет о проделанной работе должен содержать
— название и цель работы ;
— номер и условие своего варианта ;
— полученные численные результаты ;
— анализ численных результатов ;
— ответы на контрольные вопросы пункта 7 в соответствии с указаниями преподавателя .
5 Теоретические положения
5.1 Общие сведения о массивах
Массивом называется совокупность элементов одинакового типа . Число элементов в массиве называется размерностью массива ; каждый элемент массива задается своим порядковым номером в массиве – так называемым индексом .
Примером массива может являться список фамилий студентов одной группы , где каждый студент однозначно определяется своим порядковым номером в списке ( индексом в массиве ).
Для создания типа массивов в языке Pascal используются служебные слова TYPE и ARRAY, позволяющие создать пользовательский тип данных « Массив ». Каждому типу массивов присваивается собственное имя ; элементы , относящиеся к данному массиву , описываются в операторе VAR как переменные его типа .
Ввод и вывод элементов массива осуществляется в циклах . Индексы элементов массивов записываются в квадратных скобках .
5.2 Одномерные массивы
Массивы , элементы которых однозначно определяются одним индексом , называются одномерными . В виде одномерного массива можно представить , например , урожайности различных полей одного хозяйства , где
первому полю соответствует первое значение урожайности , второму полю – второе и т . д .; показатели успеваемости различных групп одного курса по определенному предмету , где каждой из групп соответствует свое значение среднего балла по результатам экзамена и др .
Язык Pascal допускает описание в программах одномерных массивов в следующем виде : TYPE < Имя _ типа _ массива >=ARRAY [< Диапазон _ индексов >] OF < Тип >,
где TYPE — служебное слово , используемое для создания пользовательского типа данных ; ARRAY … OF — служебные слова для описания массивов (“ Массив … из ”);
< Имя _ типа _ массива > — задаваемое пользователем имя типа массива ( требования к именам типов совпадают с требованиями к именам переменных ); < Диапазон _ индексов > – диапазон изменения индексов массива . В качестве данного диапазона может
выступить любой порядковый тип , кроме LONGINT. Чаще всего используют тип — диапазон , в котором задают границы изменения индексов ;
< Тип > — тип элементов массива , например , REAL, INTEGER, CHAR и др . Примеры описания типа массивов :
TYPE М =ARRAY [1..10] OF INTEGER; TYPE AR=ARRAY [0..15] OF REAL; TYPE V Т =ARRAY [-5..5] OF SINGLE;
TYPE GRUP=ARRAY [1..27] OF STRING[10].
Переменные , относящиеся к тому или иному типу массивов , должны быть соответственно объявлены в разделе описания переменных .
Например : VAR REZ:M; VAR P:AR; VAR A:V Т ;
Можно также описать переменную как непосредственно имеющую тип массива , например : VAR REZ:ARRAY [1..10] OF INTEGER.
При обращении к элементам массива в тексте программы обязательно требуется указывать их порядковый номер в массиве , например , REZ[1], POLE[0], A[5], STUD[i] ( где i принадлежит диапазону изменения индексов массива ).
Одномерные массивы , диапазон индексов которых начинается с 1, также иногда называются векторами . Например , если задан вектор V из 5 чисел (3, 0, 5, -7, 8), то второй элемент вектора равен 0 ( т . е . V[2]=0), пятый элемент вектора равен 8 ( т . е . V[5]=8) и т . д .
5.3 Примеры основных типов задач с использованием одномерных массивов
К стандартным типам задач на использование одномерных массивов относятся , прежде всего , задачи :
— нахождения суммы ( произведения ) элементов массива ; — определения наибольшего ( наименьшего ) элемента в массиве ;
— нахождения количества элементов массива , удовлетворяющих определенным условиям ; — упорядочения массива в порядке возрастания ( убывания ) элементов .
Рассмотрим перечисленные типы задач на следующих примерах .
5.3.1 Нахождение суммы элементов массива
Пусть известно , что в автопарке , имеющем 18 машин марки КАМАЗ , каждый из КАМАЗов перевез за день определенный объем груза . Определить суммарный объем перевозок грузов за день .
При решении задачи будем использовать тип массива KAMAZ для описания всех КАМАЗов автопарка ; переменную Р [i] для описания объема груза , перевезенной i- ой машиной за день (i меняется от 1 до 18). Текст программы может иметь при этом следующий вид :
Type KAMAZ =array[1..18] of real; Var i:integer;
For i:=1 to 18 do Begin
Writeln (‘ Введите объем перевозок ’, i, ‘– й машины , т ’); Readln (p[i]);
Writeln (‘ Суммарный объем перевозок S=’,S:8:2,’ т ’);
Накопление суммы в данном примере будет проводиться по шагам , при вводе для очередной машины значения объема перевозок сумма будет увеличиваться на данную величину .
Аналогично реализуется и алгоритм нахождения произведения элементов массива ( с заменой начального значения суммы S:=0 на начальное значение произведения S:=1, и с заменой операции сложения элементов массива «+» на операцию умножения «*»).
5.3.2 Нахождение наибольшего элемента в массиве
Известна среднемесячная зарплата всех 16 сотрудников одного отдела . Найти величину наибольшей среднемесячной зарплаты в отделе .
Для описания списка зарплат сотрудников воспользуемся типом массива ZARPL, для задания зарплаты каждого из сотрудников – переменной SOTR.
Текст программы к приведенному примеру : Program pr2;
Type ZARPL=array[1..16] of real; Var i:integer;
sotr:ZARPL; Max: real;
For i:=1 to 16 do Begin
Writeln (‘ Введите зарплату ’, i,’ – го сотрудника , руб .’); Readln(sotr[i]);
For i:=2 to 16 do if max<sotr[i] then max:=sotr[i]; Writeln(‘ Наибольшая зарплата =’,max:10:2,’ руб .’); End.
В данной программе реализован следующий алгоритм . В начальный момент предполагается , что наибольшей является зарплата первого из сотрудников . Далее величина этой зарплаты сравнивается с зарплатами остальных сотрудников , и , если найдется зарплата , большая , чем предполагаемый максимум , то переменной Мах присваивается это значение .
Аналогично может быть найден и наименьший элемент в массиве . Для этого достаточно заменить в изложенной программе условие max<sotr[i] на условие min>sotr[i], где i меняется от 1 до 1 до 16, min – переменная типа REAL.
5.3.3 Нахождение количества элементов массива, удовлетворяющих некоторому условию
Известны результаты экзамена 22 студентов одной группы по информатике . Определить , сколько студентов сдали экзамен на 4 и 5.
Один из вариантов решения поставленной задачи имеет следующий вид : Program pr3;
Type INF=array[1..22] of integer; Var stud:INF;
for i:=1 to 22 do begin
1: writeln(‘ Введите оценку ’,i,’- го студента ’); readln(stud[i]);
if (stud[i]<1) or (stud[i]>5) then goto 1; if stud[i]>3 then p:=p+1;
writeln(‘ На 4 и 5 сдали экзамен ’,p:2,’ студентов ’); end.
В данной программе для обозначения списка оценок по информатике использовался тип массива INF, для обозначения оценок конкретных студентов – переменная stud. Программа предусматривает проверку корректности вводимых данных : при попытке ввода несуществующей по пятибалльной системе оценки ,
программа повторяет ее ввод . Для этого используется оператор перехода GOTO, где имя метки , к которой осуществляется переход ( в данном случае 1), описывается в разделе описания меток LABEL.
5.3.4 Сортировка массива по возрастанию
Известны результаты соревнования 9 участников по стрельбе . Расположить данные результаты в порядке возрастания набранных при стрельбе очков .
Алгоритм решения данной задачи является наиболее сложным из приведенных выше примеров и требует использования вложенных циклов .
Один из способов сортировки массивов заключается в следующем . Сначала первый элемент массива в цикле сравнивается по очереди со всеми оставшимися элементами . Если очередной элемент массива меньше по величине , чем первый , то эти элементы переставляются местами . Сравнение продолжается далее уже для обновленного первого элемента . В результате окончания данного цикла будет найден и установлен на первое место самый наименьший элемент массива . Далее продолжается аналогичный процесс уже для оставшихся элементов массива , т . е . второй элемент сравнивается со всеми остальными и , при необходимости , переставляется с ними местами . После определения и установки второго элемента массива , данный процесс продолжается для третьего элемента , четвертого элемента и т . д . Алгоритм завершается , когда сравниваются и упорядочиваются предпоследний и последний из оставшихся элементов массива . Программа реализации изложенного алгоритма может иметь следующий вид :
Type STREL=array[1..9]of integer; Var rez:strel;
For i:=1 to 9 do begin
writeln(‘ Введите результаты ’,i,’- го участника ’); readln(rez[i]);
for i:=1 to 8 do for j:=i+1 to 9 do if rez[i]>rez[j] then begin
writeln(‘ Отсортированные по возрастанию результаты :’); for i:=1 to 9 do write (rez[i]:5,’ ‘);
Здесь STREL – тип массива результатов стрельбы участников , rez[i] – переменная для описания результатов i- го участника (i меняется от 1 до 9). Вспомогательная переменная s используется при перестановке местами элементов массива .
5.4 Двумерные массивы
Массив , для задания элементов которого требуется использовать два индекса , называется двумерным . Примеры двумерных массивов : места в зрительном зале театра , где каждое место характеризуется номером ряда и номером кресла в ряду ; таблица результатов спортивного чемпионата , где все команды характеризуется результатом игры с каждым из соперников и др .
Двумерные массивы , в которых диапазоны индексов начинаются с 1, также называются иногда матрицами . Размерность каждой матрицы определяется как MxN, где М – число строк в матрице , N – число столбцов . Например , задана матрица А размерностью 3 х 4.
Здесь элемент A[2,1]=5, A[1,2]=-7, A[3,2]=5, A[3,3]=-8. Первый индекс элемента двумерного массива задает номер строки матрицы , в которой расположен элемент , второй индекс – номер столбца .
Если число строк матрицы равняется числу столбцов , то матрицы данного типа называются квадратными . Элементы квадратной матрицы вида B[1,1], B[2,2], B[3,3]… составляют главную диагональ матрицы . Иногда вводят понятие побочной диагонали квадратной матрицы для элементов вида B[1,N], B[2,N-1], B[3,N-2]…B[N,1], где N – число строк ( столбцов ) матрицы .
Описание типов двумерных массивов в языке Pascal осуществляется аналогично описанию типов одномерных массивов с добавлением диапазона изменения второго индекса .
TYPE MATR=[1..4,1..5] OF INTEGER; TYPE B=[2..9,0..6] OF REAL;
TYPE C=ARRAY[-1..4,-1..4] OF CHAR.
Также допускается указание имени другого типа массива в качестве типа элементов массива , например :
TYPE VEC=ARRAY[1..4] OF REAL; MAS=ARRAY[1..5] OF VEC.
В результате приведенного выше описания тип массива MAS будет объявлен как тип двумерного массива , первый индекс которого будет меняться от 1 до 5, а второй индекс – от 1 до 4, т . е . размерность массива составит 5 х 4 элементов .
При вводе и выводе элементов двумерных массивов используются вложенные циклы , в которых внешний оператор цикла , как правило , задает изменение строк массива , внутренний оператор цикла – изменение столбцов .
5.5 Примеры задач с использованием двумерных массивов При решении задач на использование двумерных массивов применяются , как правило , те же алгоритмы , что
и при работе с одномерными массивами . Проиллюстрируем это на конкретных примерах .
5.5.1 Нахождение наибольшего элемента в заданной строке матрицы
Пусть задана матрица А из действительных чисел размера 3 х 4. Найти наибольший элемент во второй строке данной матрицы .
Приведем программу решения задачи в виде :
Type Matr=array[1..3,1..4] of real; Var max:real;
for i:=1 to 3 do for j:=1 to 4 do begin
writeln(‘ Введите элемент а [‘,i,’,’,j,’]’); readln(a[i,j]);
max:=a[2,1]; for j:=2 to 4 do
if max<a[2,j] then max:=a[2,j];
writeln(‘ Наибольший элемент второй строки =’,max:8:2); end.
Данная программа представляет собой реализацию алгоритма нахождения наибольшего элемента вектора , полученного путем фиксирования одного из индексов двумерного массива .
5.5.2 Нахождение элементов массива, удовлетворяющих определенному условию
Известны результаты 5 студентов по итогам экзаменов по химии и информатике . Найти фамилии студентов , сдавших оба экзамена на отлично .
Для решения поставленной задачи может быть использована следующая программа : program Sessia;
type PR=array [1..5,1..2]of integer; Fam=array[1..5]of string[10];
var r:pr; st:fam; i,j:integer;
for i:=1 to 5 do begin
writeln(‘ Введите фамилию ‘,i,’- го студента ‘); readln(st[i]);
writeln(‘ Введите оценку данного студента по химии ( от 2 до 5)’); readln(r[i,1]);
writeln(‘ Введите оценку данного студента по информатике ( от 2 до 5)’); readln(r[i,2]);
if (r[i,1]=5) and (r[i,2]=5) then writeln(‘ Студент — отличник — ‘,st[i]); end.
В данной программе для хранения фамилий студентов используется одномерный строковый массив st типа Fam, для хранения оценок студентов – двумерный целочисленный массив r типа PR, причем первый столбец матрицы r используется для хранения результатов экзамена по химии , второй столбец – экзамена по информатике . Если у некоторого студента оценки за оба экзамена составили 5 баллов , то его фамилия будет выведена на экран с сообщением « Студент — отличник ».
5.5.3 Нахождение сумм элементов строк матрицы
Рассмотрим задачу нахождение сумм элементов строк матрицы на примере задачи подсчета итогов футбольного чемпионата .
Пусть задана таблица результатов игр 5 команд футбольного чемпионата размера 5 х 5. На диагонали таблицы стоят значения 0, другие элементы таблицы равны 0, 1 или 2, где 0 баллов соответствует проигрышу команды в игре , 1 балл – ничьей , 2 балла – выигрышу . Определить сумму баллов каждой команды по результатам чемпионата .
Легко заметить , что для построения матрицы R результатов игр достаточно ввести лишь стоящую выше ( или ниже ) главной диагонали половину матрицы , т . к . результаты остальных игр могут быть рассчитаны из известного соотношения : если , например , первая команда обыграла вторую , то элемент R[1,2]=2, а элемент R[2,1]=2-R[1,2]=0; аналогично , если вторая команда сыграла в ничью с третьей , то R[2,3]=1, R[3,2]=2- R[2,3]=1. Таким образом , нетрудно получить вид взаимосвязи элементов матрицы : R[i,j]+R[j,i]=2, где i и j меняются от 1 до 5 ( кроме элементов главной диагонали ). На главной диагонали матрицы R по условию задачи всегда стоят числа 0.
Перейдем к написанию программы решения поставленной задачи . Program foot;
Type tab=array[1..5,1..5] of integer; Var r:tab;
for j:=i+1 to 5 do begin
writeln (‘ Введите результат игры ‘,i,’– й команды с ’,j,’ – й : 0, 1 или 2 балла ’); readln(r[i,j]);
for j:=1 to i-1 do r[i,j]:=2-r[j,i];
for i:=1 to 5 do begin
for j:=1 to 5 do write(r[i,j]:4); writeln;
for j:=1 to 5 do s:=s+r[i,j];
writeln(i,‘- ая команда набрала ’,s:3,’ очков ’); end;
6 Методические рекомендации к выполнению работы
6.1 При выполнении задания воспользоваться алгоритмами решения стандартных задач по теме « Одномерные массивы », изложенными в п .5.3.1-5.3.4.
6.2 Провести численные расчеты для вектора (4, 7, -9, 5, 1, -5, 10, 7). Проанализировать правильность полученных результатов .
6.3 При решении задачи воспользоваться примерами программ в п .5.5.1-5.5.3 и алгоритмами п .5.3.1-5.3.4.
Пример вывода на экран двумерного массива в виде матрицы размерности 3 х 4 приводится в следующем фрагменте программы :
for i:=1 to 3 do begin
for j:=1 to 4 do write( а [i,j]:5); writeln;
Проанализировать полученные результаты .
7 Контрольные вопросы
7.1 Что понимают под массивом данных ?
7.2 Что называют размерностью массива ?
7.3 Что понимают под индексом элемента массива ?
7.4 Какой массив называется одномерным ?
7.5 Приведите примеры одномерных массивов .
7.6 Как описываются одномерные массивы на языке PASCAL?
7.7 Как задается диапазон изменения индексов массива ?
7.8 Как обозначаются индексы массивов на языке PASCAL?
7.9 Какие стандартные алгоритмы по работе с одномерными массивами Вы знаете ?
7.10 Поясните понятия двумерного массива , матрицы .
7.11 Что обозначают индексы матрицы ?
7.12 Сколько элементов в матрице из 7 строк и 9 столбцов ?
7.13 Дайте понятие квадратной матрицы , диагоналей квадратной матрицы .
7.14 Приведите пример описания двумерных массивов на языке PASCAL.
7.15 Поясните порядок использования вложенных циклов при вводе элементов двумерного массива .
1. Фаронов В . В . Турбо Паскаль 7.0. Начальный курс . – М .: Нолидж . – 2000. – 576 с .
2. Зуев Е . А . Система программирования Turbo Pascal. – М .: Радио и связь . – 1992. – 288 с .
3. Рубенкинг Н . Турбо Паскаль для Windows. – М .: Мир . — 1994. – 535 с .
4. Информатика . Базовый курс / Под ред . С . В . Симоновича – СПб : Питер .- 2000. – С .560 — 611.
Приложение А Варианты заданий на тему «Одномерные массивы»
1) Найти среднее арифметическое всех элементов массива .
2) Найти наименьший элемент в массиве .
3) Найти количество положительных элементов массива .
4) Найти количество отрицательных элементов массива .
5) Определить , сколько раз встречается число 7 среди элементов массива .
6) Определить , сколько элементов массива меньше , чем число 6.
7) Определить , сколько элементов массива больше , чем число 3.
8) Найти сумму всех неотрицательных элементов массива .
9) Найти наименьшее из чисел а 1 , 2 а 2 , 3 а 3 ,…, 8 а 8 .
10) Найти наибольшее из чисел 2 а 1 , 3 а 2 , 4 а 3 ,…, 9 а 8 .
11) Найти сумму а 1 +2 а 2 +3 а 3 +…+8 а 8 .
12) Найти наименьший по модулю элемент массива .
13) Найти разность между наибольшим и наименьшим элементами массива .
14) Отсортировать массив в порядке убывания элементов .
15) Найти произведение отрицательных элементов массива .
16) Найти сумму всех элементов массива , имеющих четные индексы .
17) Найти наибольший из элементов массива , имеющих нечетные индексы .
18) Найти среднее арифметическое всех положительных элементов массива .
19) Найти среднее арифметическое всех отрицательных элементов массива .
20) Найти сумму элементов массива , превышающих число 5.
Приложение В Варианты заданий на тему «Двумерные массивы»
1) Найти наибольший элемент в третьем столбце матрицы .
2) Найти сумму всех элементов матрицы .
3) Найти сумму всех положительных элементов матрицы .
4) Найти наименьший элемент в первой строке матрицы .
5) Найти среднее арифметическое значение элементов второго столбца матрицы .
6) Найти произведение элементов третьего столбца матрицы .
7) Найти сумму элементов первой и третьей строк матрицы .
8) Определить , сколько раз встречается число 5 среди элементов всей матрицы .
9) Определить , сколько раз встречается число 1 среди элементов третьей строки матрицы .
10) Найти количество отрицательных элементов в матрице .
11) Найти количество отрицательных элементов в первой строке матрицы .
12) Найти количество неотрицательных элементов во втором столбце матрицы .
13) Найти сумму элементов второй строки матрицы .
14) Найти наибольший элемент в матрице .
15) Найти наименьший элемент в матрице .
16) Найти наименьший по модулю элемент в первой строке матрицы .
17) Найти среднее арифметическое значение всех отрицательных элементов матрицы .
18) Определить , сколько элементов матрицы превышает число 2.
19) Расположить все элементы матрицы в строку в порядке возрастания .
20) Расположить все элементы матрицы в строку в порядке убывания .
Методические указания к лабораторной работе
Использование строковых переменных в среде программирования Pascal
Научиться принципам работы со строковыми переменными в среде программирования Pascal .
2 Задачи работы
Изучить приемы решения задач с использованием строковых переменных .
3 Порядок выполнения работы
3.1 В среде программирования Turbo Pascal составить и отладить программу решения следующей задачи :
Задан список студентов из 7 фамилий . Распечатать данный список в столбец и выполнить задание в соответствии с указанным преподавателем вариантом приложения А .
3.2 Провести анализ результатов работы программы .
3.3 Составить отчет о проделанной работе .
4 Отчет о проделанной работе должен содержать
— название и цель работы ;
— номер и условие своего варианта ;
— полученные при расчетах результаты ;
— анализ полученных результатов ;
— ответы на контрольные вопросы пункта 6 в соответствии с указаниями преподавателя .
5 Теоретические положения
5.1 Описание переменных строкового типа
Для обработки текстов в среде программирования Turbo Pascal используется тип STRING ( строка ). Количество символов в строке — переменной задается объявлением типа STRING[N] , где значение N может быть любой константой порядкового типа , не превышающей 255.
Объявление типа STRING[N] указывает , что число символов в строке — переменной может изменяться в диапазоне от 1 до N . Если при описании типа количество символов в строке не указано , то по умолчанию длина строки принимается максимально возможной , т . е . 255 символов .
Строка в Turbo Pascal трактуется как цепочка символов . К любому символу в строке можно обратиться так же , как к элементу символьного массива типа ARRAY [1..N] OF CHAR . Над символами строки можно осуществлять необходимые действия и , тем самым , изменять содержание строки , ее длину и т . д .
Пример : program pr1; var st:string[6];
i:integer; begin st:=’ primer ‘; for i:=1 to 6 do write(st[i], ‘ ‘); end.
В результате работы данной программы на экран будут распечатаны следующие значения : p r i m e r
Таким образом , первым символом st[1] в переменной st является буква p , вторым символом st[2] является r , третьим – i и т . д .
К строкам можно применять операцию сцепления , например : program pr2;
var st:string[3]; begin
В результате работы предложенной выше программы переменной st будет присвоено значение ’abc’. Допускается сравнение строковых переменных . Операции отношений =, <>, >, <, >=,<= выполняются над двумя строками посимвольно , слева направо , с учетом внутренней кодировки символов .
Примеры сравнения строковых переменных с результатом « Истина »: ‘A’ < ‘B’
‘Turbo Pascal’ > ‘Turbo’ ‘2’ > ’1’
5.2 Процедуры и функции по работе со строками
Действия над строками реализуются в Turbo Pascal с помощью следующих встроенных процедур и функций . 5.2.1 Функция Concat(S1[,S2,…,SN]): string – сцепляет ( объединяет ) строки S1, S2,…, SN . Параметры , указанные в квадратных скобках , не являются обязательными .
Как задается диапазон изменения индексов массива
Если работа программы связана с хранением и обработкой большого количества однотипных переменных, для их представления в программе можно использовать массивы.
Например, пусть программа пользователя выполняет некоторые действия над последовательностью целых чисел, насчитывающей сто элементов i1, i2, . i100 которые требуется сохранить до конца ее работы. Вместо того чтобы описывать указанные переменные сто раз, можно один раз объявить целочисленную переменную i , состоящую из ста элементов, — массив.
Массив представляет собой совокупность данных одного типа с общим для всех элементов именем.
Элементы массива пронумерованы, и обратиться к каждому из них можно по номеру (или нескольким номерам — например, для элемента таблицы задается номер строки и столбца). Номера элементов массива иначе называются индексами, а сами элементы массива — переменными с индексами (индексированными переменными).
Обратите внимание — данные в массивах сохраняются, как и в случае использования обычных неиндексированных переменных, только до конца работы программы. Для их долговременного хранения программа должна записать данные в файл.
•тип — общий тип всех элементов массива;
•размерность (ранг) — количество индексов массива;
•диапазон изменения индекса (индексов) — определяет количество элементов в массиве.
Вектор (одномерный массив) — это пример массива, в котором элементы нумеруются одним индексом.
Если в массиве хранится таблица значений (матрица), то такой массив называется двумерным, его элементы нумеруются двумя индексами — номером строки и столбца соответственно. Массивы еще большей размерности (трехмерные, четырехмерные и т. д.) на практике встречаются довольно редко.
В качестве номера (индекса) элемента массива, в общем случае, используется выражение порядкового типа. Наиболее часто индекс — это целая константа или переменная типа integer , реже — типа char или boolean .
При обращении к элементу массива индекс указывается в квадратных скобках после имени массива. Например, а[3], Ь[1,2] . Однако использование элементов массива в качестве обычных переменных не дает существенной выгоды. Массивы ценны тем, что их индексы сами могут быть переменными или выражениями, обеспечивая доступ не к одному, а к последовательности элементов. Обработка массивов производится при изменении индексов элементов.
Например, в случае использования выражения следующие переменные удобно применять для просмотра в цикле элементов массива:
• a[i] — всех элементов;
• a[2*i] — элементов, стоящих на четных местах;
• a[2*i-i] — элементов, стоящих на нечетных местах.
 предыдущая         меню        вверх         следующая
Урок 20. Описание массива
В предыдущем уроке мы ввели понятие структурированных данных.
Изучение данных структурированного типа начнем с регулярного типа данных — массивов.
Название регулярный тип массивы получили за то, что в них объединены однотипные элементы, упорядоченные (урегулированные) по индексам, определяющим положение каждого элемента в массиве.
Массив — структурированный тип данных, состоящий из фиксированного числа однотипных элементов, объединённых одним именем, где каждый элемент имеет свой номер (индекс).
Когда возникает необходимость использовать массивы?
Рассмотрим следующую задачу: ввести с клавиатуры 30 целых чисел и вычислить их сумму, при этом каждое из чисел сохранить в памяти для последующей обработки.
Мы будем вынуждены ввести 30 имен переменных, что, естественно, очень неудобно. Как быть?
В этом случае лучше организовать массив. Имя у всех элементов будет общее. Чтобы получить доступ к элементу, достаточно будет указать имя массива и его порядковый номер.
И так, массивы будем использовать тогда, когда нужно обработать большой объем однотипной информации, которую необходимо сохранить в памяти для последующей обработки.
Определим еще несколько понятий, связанных с массивами.
Элемент массива — отдельная переменная, входящая в массив.
Размерность массива — количество индексов, по которым определяется положение элемента в массиве.
Индексы элемента массива — совокупность номеров, определяющих его местоположение в массиве.
Чтобы лучше понять, что такое размерность массива, сравним их с таблицами.
Одномерный массив сравним с таблицей, состоящей из одной строки. Для определения положения элемента в строке достаточно знать порядковый номер ячейки, в которой находится элемент. Поэтому в одномерном массиве один индекс — порядковый номер элемента.
Двумерный массив — прямоугольная таблица. Для определения положения элемента в прямоугольной таблице нужно знать порядковый номер строки и столбца, на пересечении которых находится ячейка. Поэтому в двумерном массиве — два индекса, номер строки и номер столбца.
И так, потребность использовать массив возникает всякий раз, когда при решении задачи приходится иметь дело с большим, но конечным количеством однотипных данных, которые необходимо хранить в памяти.
Переходим к изучению массивов.
Описание массива
Прежде чем использовать массив в программе, его необходимо предварительно описать. Описать массив — значит выделить в памяти место, достаточное для хранения всех его элементов. Для этого надо указать имя массива и длину массива — количество элементов в нем. В большинстве случаев при задании размеров массива используются диапазоны изменения значений индекса.
При описании массива используется зарезервированное слово array (массив), указываются диапазон изменения для индексов и тип компонентов массива.
Способ 1. Описание массива с определением типа.
Способ 2. Описание массива без определения типа.
Двумерный массив описывается так же, как и одномерный. Различие состоит в том, что вы должны указать диапазон для двух индексов массива — положение каждого элемента массива A[i, j] определяется номером строки и номером столбца.
Например, описание двумерного массива натуральных чисел размера N x М может быть задано следующей строкой:
Вернемся к нашей задаче. У нас 30 целых чисел, выделим для них 30 ячеек, объединим их общим именем А.
№ | A | Имя А — это общее имя для всех элементов. Элементы массива — это числа, их 30 |
1 | 25 | |
2 | 64 | |
3 | 27 | |
… | … | |
29 | 53 | |
30 | 89 |
Опишем одномерный массив из 30 целых чисел для этой задачи следующим образом:
Напомним, что раздел типов начинается со служебного слова type, после этого идет имя нового типа и его описание. Между именем типа и его описанием ставится знак «равно» (в разделе переменных между именем переменной и её описанием ставится двоеточие).
myarray — это имя нового типа;
array — служебное слово (в переводе с английского означает «массив», «набор»);
[1..30] — в квадратных скобках указывается номер первого элемента, затем, после двух точек, номер последнего элемента массива, в этом примере первый элемент имеет номер 1, а последний — номер 30;
Of — служебное слово (в переводе с английского — «из»);
Integer — тип всех элементов массива.
Так как каждый элемент имеет свой номер, то к каждому элементу можно обращаться непосредственно. Для того чтобы получить доступ к i-му элементу этого массива, необходимо записать: A[i] — сначала имя массива, а в квадратных скобках указывается номер элемента, к которому обращаемся, — i.
Например, обращаемся к первому элементу массива А — А[1], а к пятому — А[5].
Тот же самый массив может быть задан и при определении соответствующей переменной:
Особенность языка Паскаль
Особенностью языка Паскаль является то, что число элементов массива фиксируется при описании и в процессе выполнения программы не меняется. Это считается недостатком языка, так как не во всех программах можно заранее предсказать необходимый размер массива (который может определяться в зависимости от тех или иных условий, возникающих в процессе исполнения).
Для решения этой проблемы используют прием, позволяющий имитировать работу с массивами переменной длины, который заключается в следующем: в разделе описания предварительно определяют возможное максимальное значение размера массива, а затем в программе запрашивают текущее значение размера и используют это значение далее при заполнении и обработке массива.
На следующем уроке мы рассмотрим основные алгоритмы, которые используются при обработке данных, хранящихся в массиве.
Массивы. Одномерные массивы
Массив – это именованная группа однотипных данных, хранящихся в последовательных ячейках памяти . Значения, которые образуют массив, называются элементами массива. Каждая ячейка содержит элемент массива. Элементы нумеруются по порядку, но необязательно начиная с единицы. Порядковый номер элемента массива называется индексом этого элемента.
Все элементы определенного массива имеют один и тот же тип. У разных массивов типы данных могут различаться. Например, один массив может состоять из чисел типа Integer, а другой – из чисел типа Real.
Значение( )
;
Если , то
.
Массив, хранящий линейную таблицу, называется одномерным массивом. Тип элементов массива называется его базовым типом.
Способы описания одномерных массивов
Массив можно описать разными способами:
1. В разделе описания переменных
Var <имя массива>: Array [<тип индекса>] of <тип элементов>;
Тип индекса – порядковый тип кроме Integer. Часто используют интервальный тип (указывают допустимый диапазон значений). При указании диапазона начальный индекс не должен превышать конечный. Если индекс массива может приобретать все допустимые значения определенного перечислимого типа, то при описании массива возможно задание имени типа вместо границ изменения индекса. При этом границами индекса будут первое и последнее значения в описании типа индекса. Границы изменения индексов могут задаваться с помощью ранее объявленных констант. Тип элементов массива может быть любым. Число элементов массива фиксируется при описании и в процессе выполнения программы не меняется.
2. В разделе описания типов
Type <имя типа> = Array [<тип индекса>] of <тип элементов>;
Var <имя массива>: <имя типа>;
3. В разделе констант (задание типизированной константы)
Const <имя массива>: Array [<тип индекса>] of <тип элементов> = (<список элементов>);
Пример. Способы описания массивов.
Способы задания одномерных массивов
1. Задание значений элементов с клавиатуры;
2. Задание с помощью генератора случайных чисел;
3. Чтение из файла;
4. Заполнение массива, элементы которого связаны некоторой закономерностью.
Ввод, вывод элементов одномерного массива
Заполнение и вывод массива можно выполнять только поэлементно с использованием циклов: сначала присвоить значение первому элементу, затем второму и т. д.; аналогично происходит вывод на экран – сначала вывод первого элемента, затем второго и т. д.
Пример ввода массива:
В этом случае ввод будет осуществляться с подсказкой о номере элемента, который необходимо ввести пользователю.
Вывод массивов также осуществляется с помощью циклического оператора.
Пример вывода массива:
Пример. Написать программу заполнения одномерного массива с помощью генератора случайных чисел. Вывести значения на экран.
Действия над массивами
Действия над массивом, как единым целым допустимы лишь в 2-х случаях:
— присваивание значений одного массива другому;
— операции отношения «равно», «не равно».
В обоих случаях массивы должны иметь одинаковые типы индексов и элементов.
Пример: Var P, Q: array[1..100] of real;
При выполнении операции присваивания P:=Q, все элементы массива Р станут равны соответствующим элементам массива Q.
Аналогично производится и сравнение массивов. Результатом сравнения массивов будет «истина» в том случае, если все элементы массива P равняются элементам массива Q.
Если нужно поменять местами значение двух каких-либо строк массива, то это делается через третью переменную того же типа: