Организация программ вложенной циклической структуры
Пример. Найти следующую сумму
Var i, n: integer;
x, sum: real;
Begin
writeln('Input N: ');
read(n);
sum := 0;
for i := 1 to n do
begin
x := 1/(2*i-1);
if (i mod 2 = 0) then x := -1*x;
sum := sum + x;
end; {for}
writeln('The summ is ', sum:0:6);
readln;
readln
End.
В данном примере нам встретилась программа с вложенной циклической структурой, т. е. когда цикл вызывается в цикле.
Внешний цикл определяет количество проходов цикла, а внутренний цикл на каждом четном шаге внешнего цикла считает выражение, стоящее в задании под знаком сумма – x := 1/(2*i-1).
Лекция 8. Массивы (2 часа)
Описание одномерных массивов
Массив - это упорядоченная совокупность однотипных данных. Каждому элементу массива соответствует один или несколько индексов, определяющих положение элемента в массиве. Индексы образуют упорядоченные последовательности. Тип индекса определяет его допустимые значения. В качестве типа индекса может быть указан любой порядковый тип (boolean, char, integer, перечисляемый тип, а также диапазоны этих типов), кроме типа longint и его производных.
В зависимости от количества типов индексов различают: одномерные, тку мерные, трехмерные н n-мерные массивы. Двумерные массивы обычно называют матрицами, считая первый индекс - номером строки, а второй -номером столбца.
Тип элементов массива любой допустимый в Borland Pascal тип (в том числе и массив), кроме файла.
Объявление переменных типа массив выполняется двумя способами:
- в операторе объявления переменных, например:
Var a: array [1..10] of integer;{массив из 10 целых чисел}
b: array [byte] of char; {массив из 256 символов, индекс элемента массива изменяется от 0 до 255}
с: аггау ['A'.. 'C', -5..-1] of byte;{матрица из 9 чисел}
d: array ['A'.. 'C'] of array [-5..-3] of byte; {матрица из 9 чисел, по структуре эквивалентная предыдущей}
- с предварительным объявлением типа, например:
Туре mas=аггау[1..10] of integer; {объявляем тип}
Var a:mas; {объявляем переменную}
Максимальный размер массива
Ограничения на количество индексов в Borland Pascal нет, однако суммарная длина массива не должна превышать 65537 байт.
Присваивание массивов
Над массивом в целом определена единственная операция - операция присваивания.
Присваивание массивовзаключается в копировании элементов одного массива в другой. Эту операцию можно выполнять только над массивами одного типа.
Массивы считаются совпадающими по типу, если они объявлены через запятую в одной строке, например:
Var a, b: array [boolean] of real;
... a:=b;...
или, если вначале объявлен тип массива, а затем массивы этого типа:
Type mas: array [boolean] of real;
Const a:mas = (3.6,-5.1);
Var b:mas;
... b:=a;...
Программирование типовых алгоритмов: заполнение массива по закону, вычисление суммы и произведения элементов массива, поиск элементов массива, нахождение максимального и минимального элемента в массиве
Значения элементов массива в программе можно определить тремя способами. Во-первых, массив может быть инициализирован с использованием типизированных констант или просто присваиванием значений элементам. Во-вторых, элементы массива могут быть введены с клавиатуры или из файла. В-третьих, элементы массива могут быть определены в программе:
а) с использованием датчика случайных чисел;
б) заданным образом, в том числе, и скопированы из другого массива.
Для объявления инициализированных массивов в Borland Pascal используют типизированные констапты. При этом соответствующие значения указывают в скобках через запятую. Значения элементов многомерных массивов перечисляют в порядке возрастания индексов справа налево, заключая в скобки каждый подмассив. Для матриц такой порядок соответствует построчному указанию значений. Например:
Const a: array[1..5]of real = (0,-3.6,7.8,3.789,5.0);
b: array [Boolean, 1..5] of real = ((0,-3.6,7.8,3.789,5.0), (6.1,0,-4.56,8.9,3.0)); {массив будет инициализирован следующим образом:
bfalse,1=0,bfalse,3=7.8, … btrue,1=6/1, т.д.}
c: array [1..3,0..l,-2..1] of byte = (((3,6,9,6),(0,4,3,9)),
((5,7,3.1),(45,8,0,2)),
((5,9,2,3),(1,5,8,4)));…
Работа с массивом, как правило, сводится к действиям над его элементами. Для обращения к конкретному элементу массива необходимо указать имя массива и значения индексов элемента в квадратных скобках через запятую, например:
Var a: array[char,boolean] of real; {объявляем матрицу}
... a['A',true]:=5.1;... {присваиваем значение элементу аА,true}
Значения индексов можно указать непосредственно литералом, например, а[3], или косвенно,указав идентификатор переменной, которая содержит значение индекса, например, a[i].
Косвенное задание индексов позволяет реализовывать последовательную обработку элементов массивов. Причем, поскольку интервал изменения индекса определен при объявлении массива, для этого обычно применяют циклы с заданным количеством повторений. Параметр же цикла используют в качестве переменной косвенной адресации массива, например:
Var а:аrraу[1..6] of integer;
... for i:=l to 6 do a[i]:=i; ... {при i=1 а1 присваивается 1, при i=2 a2 присваивается 2, при i=3 a3 присваивается 3 и т.д.}
Количество переменных, необходимых для косвенной адресации массивов, совпадает с размерностью массива. Так, для работы с матрицами используют две переменные, хранящие индексы: одну для хранения номеров строк, а вторую - номеров столбцов.
Из многомерных массивов допускается выделять подмиссивы, отбрасывая индексы, записанные справа, и оставляя индексы, определяющие данный подмассив так, из матрицы можно выделить строку, но нельзя столбец, например:
type mas=array[boolean] of real; {массив из двух вещественных чисел}
Const
a: array [l..2] of mas = ((3.6,-5.1),
(7.0,-1.2)); {матрица из четырех вещественных чисел}
Var b:mas;
Begin b:=a[l];...{a массив b скопирована первая строка матрицы а}
Ввод-вывод массивов выполняют поэлементно, используя циклы с заданным числом повторений, например:
Var a: array [1..5J of real;
Begin
for i:= l to 5 do Read(a[i]); (осуществляем ввод массива}
Readln; {очищаем буфер ввода, чтобы далее значения вводились со следующей строки}
Значения элементов массива вводят в порядке обращения к ним из цикла. Эти значения могут сдаваться в одной строке через пробел или с нажитием клавиши Enter после ввода одного или нескольких чисел.
При выполнении операций ввода-вывода матриц и массивов большой размерности целесообразно вводить и выводить значения построчно. Например:
Var a: array[l..5, 1..7] of real; {матрица а из 5 строк по 7 элементов}
Begin
for i:=l to 5 do {цикл ввода строк массива: a1, a2, a3, a4, a5}
begin for j:=l to 7 do {цикл ввода элементов i-й строки:}
Read(a[i,j]); {аi,1, ai,2, ai,3, ai,4, ai,5, ai,6, ai,7}
ReadLn; {очищаем буфер ввода}
end; ...
Пример: Разработать программу определения максимального элемента массива А(5) и его номера.
Вначале элементы массива необходимо ввести. Для выполнения этой операции используем цикл с заданным числом повторений.
Поиск максимального элемента выполним следующим образом. Запомним в качестве максимального, т. е. запишем в amax первый элемент и зафиксируем в imax его номер. Затем будем последовательно просматривать элементы массива, сравнивая их со значением, хранящимся в аmах. Если очередной элемент больше значения в аmах, то сохраняем его в качестве максимального в аmах и запоминаем его номер в imax. Дпя организации последовачелыюго просмотра используем цикл с заданным числом повторений, изменяя переменную цикла от 2 до 5, так как первый элемент мы уже учли. Просмотрев все элементы массива, найдем максимальный элемент и его номер. После этого необходимо вывести па экран исходный массив, максимальный элемент и его номер. Поскольку операции ввода-вывода массивов выполняют однотипно, на схеме алгоритма соответствующих циклов, так же как и запросов на ввод данных, обычно не показывают. Вместо этого в схему вставляют блок операции ввода/вывода, в котором указано имя массива и количество элементов, участвующих в операции.
Ниже приведем текст программы.
Var a: array [1..5] of real;
amax: real;
r, imax:byte;
Begin
{зanpoc на ввод массива}
WriteLn ('Введите 5 чисел:');
{ввод элементов массива}
for i:=1 to 5 do Readl(a[i]);
ReadLn;
{поиск максимального эмемента}
amax: =a[1]; imax:=1;
for i:=2 to 5 do
if a[i]>amax then
begin
amax: =a[i]; imax:=i;
end;
{вывод массива}
WrtteLn('Исходные данные:');
for i:= 1 to 5 do Write(a[i];5:2);
WrileLn;
{вывод результата}
WrtteLn('Максимальный элемент равен ', аmаx:5:2,', его напер равен ', imax);
End.
Пример. Разработать программу вычисления сумм элементов строк матрицы А(4.5). Полученные суммы записать в новый массив В.
Итак, нам задана матрица, имеющая 4 строки и 5 столбцов. Требуется сформировать одномерный массив В из четырех элементов, который будет содержать суммы элемента строк. Распечатать результат лучше так, чтобы суммы были выведены после соответствующей строки матрицы.
Программа должна начинаться с ввода матрицы. Основной цикл программы цикл по строкам. Переменная цикла i в нем будем изменяться oт 1 до 4. Для каждой i-й строки в этом цикле должно выполняться суммирование элементов. Суммирование будем осуществлять методом накопления, для чего перед суммированием обнулим соответствующий i-й элемент массива В, а затем в цикле выполним добавление элементов строки. После завершения цикла суммирования эту строку и ее сумму можно сразу выводить.
Var А: array [1..4,1..5] of real;
B: array [1..4] of real;
i,j:byfe;
Begin
WriteLn ('Введите матрицу построчно:');
for i:=l to 4 do {вводим матрицу}
begin
for j:=1 to 5 do Read(A[i,j])
ReadLn;
end;
Writeln('Результаты: ');
for i:=1 to 4 do {для каждой строки}
begin
B[i]:= 0; {обнуляем накапливаемую сумму}
for j:=l to 5 do B[i]:=B[i]+A[i,j]; {суммируем элементы строки}
for j:=1 to 5 do Write(A[i,j]:7:2); {выводим cтроку}
WriteLn('Сумма равна ',B[i];7:2); {выводим сумму}
end;
end.
Лекция 9. Матрицы (2 часа)
Дата добавления: 2015-12-01; просмотров: 775;