Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Farionova_Fortran

.pdf
Скачиваний:
18
Добавлен:
15.02.2015
Размер:
2.71 Mб
Скачать

Тема3. Базоваяуправляющаяконструкция"цикл" ...

жить условие на элемент ряда, нужно определить зависимость, покоторой он вычисляется. Очевидно, что в данном случае элемент равен

1

 

, где k – номер элемента в ряде. Если воспользоваться циклом

 

 

 

 

k 2 + 1

 

 

 

do

while, то условие выхода из цикла будет

1

 

> 0,001. В теле

k 2 + 1

 

цикла производятся суммирование элементов и подсчет порядкового номерасуммируемогоэлемента, равногоколичеству повторенийцикла:

Program

row_summa

Integer

:: k=1

! номер элемента ряда

Real ::

sum=0,

slag

!sum -сумма ряда

!slag – значение текущего єлемента

Slag=1.0/(k*k+1) ! первый элемент ряда

Do while (slag > 0.001) ! проверка условия выхо-

да из цикла

Sum = sum + slag ! накапливаем сумму

K = k+1 ! считаем номер следующего элемента

ряда

Slag = 1.0/(k*k+1) ! вычисляем значение следующего элемента ряда

enddo

print '(a, f9.6)', 'summa=', sum

print '(a, i4)', 'kol-vo elementov=', k

print '(a, f9.6)', 'poslednee slagaemoe=', slag end

Последовательно, начиная с k = 1 вычисляется и проверяется каждый элемент ряда. Если элемент больше значения 0,001, то он добавляется в переменную sum. Если нет, то происходит выход из цикла и в переменной sum будет находиться искомая сумма.

Результат:

Summa = 1.044941 kol-vo elementov= 32

poslednee slagaemoe= 0.000976

32

Тема 4. Работа с массивами

4.1. Определение массива и его характеристик

Все данные (константы или переменные), которые были рассмотрены в предыдущих темах для реализации вычислительных процессов решения задач, назывались простыми или скалярными. Любая константа или переменная скалярного типа может принимать одно единственное значение, которое хранится в ячейке памяти с ее именем.

Этобывает неочень удобно, когда взадачах приходится иметьдело

снабором однотипных величин. В таком случае в практике программированияпринятоиспользоватьсоставные, илиструктурные, типыданных, к которым относятся массивы. Массив можно представить как "большую" переменную, состоящуюизнесколькихячеек. Ячейкиназываются элементами массива. Каждый элемент имеет одинаковый тип, но может хранить разные значения. Все элементы имеют одно имя – имя массива, но отличаются номерами.

Массив – это сложная структура данных, которая имеет одно имя, состоит из последовательности конечного количества однородных скалярныхэлементов, каждыйэлементимеетсвойуникальныйпорядковый номер в массиве.

Схематично массив Х (рис. 4.1) можно изобразить как последовательность элементов, каждый из которых имеет имя, совпадающее

сименем массива, и порядковый номер (индекс), определяющий положение элемента по отношению к началу массива.

 

 

 

 

 

 

 

 

 

х(1)

х(2)

х(3)

х(4)

х(5)

х(6)

х(7)

х(8)

х(9)

Рис. 4.1. РасположениеэлементовмассивавпамятиЭВМ

Индексами массива могут быть только целые числа. Все элементы массива должны иметь одинаковый тип данных.

Характеристики массива:

1)имя массива;

2)тип массива;

3)число измерений (ранг) массива – допускается от 1 до 7;

33

Тема4. Работасмассивами

4)размерность (протяженность) – неотрицательное число, указывающеенаколичествовозможныхзначенийиндексаповыбранномуизмерению, например число строк или столбцов матрицы;

5)диапазон значений индекса – задается указанием нижней и верхнейгранициндекса; когданижняяграницаопущена, верхняяграницасовпадает с размерностью;

6)форма массива – это перечисление или вектор всех размерностей, характеризующий порядок размещения элементов в памяти;

7)число элементов – это произведение размерностей массива;

8)объем памяти, занимаемой массивом, равен памяти, приходящейся на один элемент, помноженной на число элементов; ограничивается лишь объемом доступной памяти компьютера.

Память под массив выделяется несколькими способами: статически, динамически, динамически автоматически – массив с переменной размерностью в подпрограмме.

Для статического массива все характеристики известны уже при компиляции. Память под статический массив рассчитывается по описанию массива и выделяется при запуске программы.

Для динамического [allocatable] массива при запуске программы известен только ранг, а размерности не известны и память под него не выделяется. Когда размерности станут известны, будет подсчитан

ивыделеннеобходимыйобъемпамятиприисполненииспециальногоопе-

ратора allocate.

Массив с переменной размерностью спрятан в процедуре, где для него допускается вместо констант указывать размерность переменной целого типа. Память под массив известна или не известна, но она выделяется в вызывающей программе, массив передается в подпрограмму

вкачестве параметра вместе со своими размерностями, что создает возможность перераспределения памяти.

Будем рассматривать только статические массивы. Массив может иметь нулевой размер.

4.2. Описание массива

Все массивы в программе должны быть объявлены, и размерность определяется в объявлении (описании). При описании массива необходимоуказатьеготип, размерностьидиапазонизмененияиндексов. Раз-

34

4.2. Описание массива

мерность массива – это количество измерений. Бывают одномерные (векторы), двухмерные (матрицы или таблицы) и многомерные массивы. Элементы массива имеют те же типы, что и обычные переменные. Описание массива имеет вид

name(d1,d2,...,dn),

где name – имя массива; d1,d2,...,dn – диапазон изменения индексов; n – размерность массива. При этом di имеют вид (n1:n2) (n1 – нижняя, а n2 – верхняя границы изменения индексов). Размерность массива n не может превышать 7. В случае, если n1 равно 1, т. е. нумерацияэлементовмассиваначинаетсяс1, применяетсяупрощенная форма задания di – (n), где n – количество переменных в массиве.

Примеры

1. Описание массива на рис. 4.1 можно представить следующим образом:

real x(9)

или

real, dimension (9):: х

Это означает, что создан массив с именем Х, элементы которого вещественного типа и нумеруются от 1 до 9.

2. Real a(0:100),b(3,3),c(-2:4)

Описываются три действительных массива: a, b и c.

В массиве a число элементов 101: a0, a1, ..., a100. Массив b является

матрицей, состоящейиз9 элементов: b1,1, b2,1, b3,1, b1,2, b2,2, b3,2, b1,3, b2,3, b3,3. В памяти двухмерные массивы хранятся по столбцам. Массив c

состоит из семи элементов: c–2, c–1, c0, c1, c2, c3, c4.

Обращение к элементу массива производится по имени массива, за которым следуют в круглых скобках индексы, разделенные запятыми.

Например:

X(1)=5

Нужно различать индекс элемента массива и значение элемента массива. В примере индекс элемента 1, а значение элемента 5.

K=4

X(k) = 7 ! Четвертому элементу массива присвоено значение 7.

35

Тема4. Работасмассивами

Массив может иметь нулевой размер, если при объявлении первый индекспревосходитпоследний.

При описании размер массива рекомендуется задавать в виде констант, что в дальнейшем даст возможность использовать циклы для обработки элементов:

Integer, parameter :: n=9

Real, dimension (1:n):: x,y

4.3. Одномерные массивы

Примером одномерного массива может служить шеренга солдат, которые упорядочены по росту; кроме того, у каждого солдата в шеренге есть свой порядковый номер в расчете. В математике примером одномерного массива может служить вектор Х = {x1, x2, ..., xn}. Здесь Х – имя массива; xі – компоненты (элементы) массива, і = 1, 2, …, п – индексы или номера элементов массива. Значение индексного множества одномерного массива равно 1.

Конструктор массива служит для его инициализации, т. е. присваиваниязначенийвмоментописания:

INTEGER:: a(7)=(/1,2,3,4,5,6,7/)

Схематично целочисленный массив А представлен на рис. 4.2.

1

5

2

3

4

8

7

а(1)

а(2)

а(3)

а(4)

а(5)

а(6)

а(7)

Рис. 4.2. РасположениеэлементовмассиваАвпамятиЭВМ

Так как индексы массива следуют по порядку, то при работе с ними удобно использовать циклы, особенно цикл с параметром, где параметр цикла можно использовать в качестве обозначения индекса элемента массива.

Ввод/вывод одномерного массива

Ввод/вывод элементов одномерного массива можно осуществлять, как показано в табл. 4.1.

Полный массив – имя переменной (или именованная константа), которая является массивом. Появление полного массива в выполняе-

36

4.3. Одномерныемассивы

мом операторе специфицирует выполнение операции со всеми элементами массива.

Например:

Integer a(5)

 

A=7

! всем элементам массива присваивается 7

A=a-2 ! всем элементам массива присваивается 5

Таблица4.1. Способыввода/выводаэлементоводномерногомассива

 

 

 

Фрагмент программы

Описание способа

ввода/вывода массива

 

 

read *,a

 

Ввод всех элементов массива с клавиату-

 

 

ры (согласно его описанию)

read*,(a(i),i=1,n)

Ввод элементов массива с клавиатуры с но-

 

 

мерами 1, …, n с неявным использова-

 

 

нием циклического списка

do i=1,n

 

Ввод элементов массива с клавиатуры

read*,a(i)

с использованием циклической структу-

end do

 

ры

do i=1,n

 

Ввод элементов массива с использовани-

а(i)=5*i**2-i

ем циклической структуры по расчетной

end do

 

формуле

a(1)=2

 

Ввод элементов массива с помощью опе-

a(4)=6

 

ратора присваивания (наименее эффек-

a(2)=-3

 

тивный способ)

print *,a

 

Вывод всех элементов массива (согласно

 

 

его описанию)

write(*,*),(a(i),i=1,n)

Вывод элементов массива с номерами

 

 

1 … n с неявным использованием цикли-

 

 

ческого списка

write(*,’(100(f5.2))’),

Форматный вывод элементов массива

(a(i),i=1,n)

с номерами 1 … n с неявным использова-

 

 

нием циклического списка n< = 100

1. do i=1,n

Вывод значений элементов массива с но-

print*,a(i)

мерами 1 … n

end do

 

 

1. do i=1,n !.

Форматный вывод элементов с указани-

print ’(a,i2,a,f5.2)’,

ем номера выводимого элемента и его

’a(’,I,’)=’,a(i)

значения

end do

 

 

37

Тема4. Работасмассивами

4.4. Примеры решения задач с использованием одномерных массивов

Рассмотрим использование одномерных массивов на примере программытабулированияфункции y = x наотрезке[–2; 2] сшагомh = 0,5:

Program tab

Integer, parameter :: k=100 Real, dimension(1:k):: x, y real h, a, b

integer i,n

Write(*,'(a,$)'),'Введите начало промежутка a=' Read(*,*),a

Write(*,'(a,$)'),'Введите конец промежутка b=' Read(*,*),b

Write(*,'(a,$)'),'Введите шаг h=' Read(*,*),h

X(1)=a

n= (b-a)/h+1 do i=1, n

If (x(i)>=0) then Y(i)=sqrt(x(i))

Write(*,'(a,i1,a,f5.2,a,i1,a,f4.2)'),'x(',I,')=',x(i),'

y(',I,')=',y(i) Else

Write(*,'(a,i1,a,f5.2,a)'),'x(',I,')=',x(i),' Y

не существует' X(i)=x(i)+h; Endif

enddo read*

End Program tab

38

4.4. Примеры решения задач с использованием одномерных массивов

Результат работы программы:

Введите начало промежутка a=-2 Введите начало промежутка b=2 Введите шаг h=0.5

X(1)=-2.00 Y не существует

X(2)=-1.50 Y не существует

X(3)=-1.00 Y не существует

X(4)=-0.50 Y не существует

X(5)= 0.00 y(5)=0.00 X(6)= 0.50 y(6)=0.71 X(7)= 1.00 y(7)=1.00 X(8)= 1.50 y(8)=1.22 X(9)= 2.00 y(9)=1.41

Часто решаемые задачи с массивами – нахождение суммы или произведения элементов массива. Особенностью таких расчетов является то, что вводятся специальные переменные:

сумматор (в случае нахождения суммы элементов массива), где

инакапливается сумма, первоначально сумматор обнуляется:

Program summa_massiva

INTEGER:: a(7)=(/1,2,3,4,5,6,7/) Integer k, s

S=0 ! переменная накапливающая сумму

Do k=1,7 S=s+a(k)

Enddo

Print '(a,i2)', 'Vsego = ', s read*

End Program summa_massiva

Результат работы программы:

Vsego =28

накопитель произведения (в случае нахождения произведения элементовмассива), первоначальноезначениекоторогопринимаетсяравным1:

39

Тема4. Работасмассивами

Program proizv_massiva

INTEGER:: a(7)=(/1,2,3,4,5,6,7/) Integer k, p

p=1 ! переменная накапливающая произведение

Do k=1,7 p=p*a(k) Enddo

Print '(a,i5)', 'Vsego = ', p read*

End Program proizv_massiva

Результат работы программы:

Vsego = 5040

Прирешениизадачвозникаетситуация, когданужновыполнитьдействия не со всеми элементами массива, а только с удовлетворяющими определенномуусловию.

Пусть требуется найти произведение элементов массива, кратных 5. Еслиодночислократнодругому, это значит, чтоостатокотделения первогочисланавтороеравен0. Например, 10 кратно5 илиmod(10, 5) =

= 0:

Program proizv_kratnost

INTEGER:: a(7)=(/1,10,3,4,5,6,15/) Integer k, p

p=1 ! переменная, накапливающая произведение

Do k=1,7

If (mod(a(k),5)==0) then

p=p*a(k) ! произведение выполняется, только если !условие истинно

endif Enddo

Print '(a,i5)', 'Vsego = ', p read*

End Program proizv_kratnost

Среди значений массива есть только три числа, удовлетворяющих этомуусловию: a(2) = 10, a(5) = 5, a(7) = 15, т. е. имеем10 × 5 × 15 = 750.

Результат работы программы:

Vsego = 750

40

4.4. Примеры решения задач с использованием одномерных массивов

Условия могут накладываться не только на значение элемента, но и на значение индекса.

Есть два массива целых чисел a и b размером 5. Сформировать массив С такого же размера, в котором элементы с четными индексами равны соответствующим элементам массива a, а нечетные – массива b (как показано на рис. 4.3).

а(1)

а(2)

а(3)

а(4)

а(5)

 

 

 

 

 

 

 

с(1)

с(2)

с(3)

с(4)

с(5)

 

 

 

 

 

 

 

 

b(1)

b(2)

b(3)

b(4)

b(5)

Рис. 4.3. УсловиеформированияэлементовмассиваС

Четным называется значение, кратное 2, т. е. mod(число, 2)= =0, и нечетным, если mod(число, 2)= =1.

Представим программную реализацию формирования массива С:

Program massivС

Integer, parameter :: k=5

INTEGER:: a(k)=(/1,2,3,4,5/), b(k)=(/6,7,8,9,10/) Integer c(k)

Integer I Do i=1,K

If (mod(I,2)==0) then C(i)=b(i)

Else C(i)=a(i) Endif Enddo

Print *, 'Elementi massiva C: ', c read*

End Program massivС

Результат работы программы:

Elementi massiva C 1 7 3 9 5

41

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]