|
Постройте таблицу значений функции |
Массивы
Занятие 2. Двумерные массивы
У двумерного массива имеется два индекса:
– номер строки,
– номер столбца.
Индексация двумерного массива представлена на рис. 6.4.
Для использования двумерного массива в программе необходимо:
- Объявить массив в функции main():
тип_данных имя_массива [количество строк][количество столбцов]; double a[5][9]; // двумерный массив из 5 строк, 9 столбцов
- Проинициализировать массив;
- Провести вычисления, исследования.
Способы инициализации двумерного массива
представлены в таблице 6.4. Обратим внимание на то, что числа
и
известны заранее и в программе фигурировать не будут.
| Часть блок-схемы | Часть программы |
|---|---|
| 1. из файла: |
double a[n][m];
int i,j;
fstream file;
file.open("1.txt", ios::in);
for(i=0; i<n; i=i+1){
for(j=0; j<m; j=j+1){
file>>a[i][j];
}
}
file.close(); |
2. по заданной формуле :
|
double a[n][m];
int i,j;
for(i=0; i<n; i=i+1){
for(j=0; j<m; j=j+1){
a[i][j]=f(i,j);
}
} |
Примечание. Двумерный массив также можно проинициализировать и заранее определенными числами, и с клавиатуры. Но данные способы неудобны для двумерных массивов, т.к. они содержат слишком много элементов.
Вывод двумерного массива на экран представлен в табл. 6.5.
| Часть блок-схемы | Часть программы |
|---|---|
for(i=0; i<n; i=i+1){
for(j=0; j<m; j=j+1){
cout<<setw(6)<<a[i][j];
}
cout<<endl;
} |
Принципы нахождения таких величин, как сумма, произведение, минимальное, максимальное значение, представлены в табл. 6.6.
| Часть блок-схемы | Часть программы |
|---|---|
| 1. нахождение суммы: |
s=0;
for(i=0; i<n; i=i+1){
for(j=0; j<m; j=j+1){
s=s+a[i][j];
}
}
cout<<"s="<<s<<endl; |
| 2. нахождение произведения: |
p=1;
for(i=0; i<n; i=i+1){
for(j=0; j<m; j=j+1){
p=p*a[i][j];
}
}
cout<<"p="<<p<<endl; |
| 3. нахождение среднего арифметического и количества элементов: |
s=0, k=0;
for(i=0; i<n; i=i+1){
for(j=0; j<m; j=j+1){
s=s+a[i][j];
k=k+1;
}
}
s=s/k;
cout<<"s="<<s<<endl;
cout<<"k="<<k<<endl; |
| 4. нахождение максимального элемента: |
max=-10E10;
imax=0; jmax=0;
for(i=0; i<n; i=i+1){
for(j=0; j<m; j=j+1){
if(a[i][j]>max){
max=a[i][j];
imax=i;
jmax=j;
}
}
}
cout<<"max="<<max<<endl;
cout<<"imax="<<imax<<endl;
cout<<"jmax="<<jmax<<endl; |
| 5. нахождение минимального элемента: |
min=10E10;
imin=0; jmin=0;
for(i=0; i<n; i=i+1){
for(j=0; j<m; j=j+1){
if(a[i][j]<min){
min=a[i][j];
imin=i;
jmin=j;
}
}
}
cout<<"min="<<min<<endl;
cout<<"imin="<<imin<<endl;
cout<<"jmin="<<jmin<<endl;
|
6. поменять элементы и местами:
|
tmp=a[i1][j1]; a[i1][j1]=a[i2][j2]; a[i2][j2]=tmp; |
7. поменять местами строки и :
|
for(j=0; j<m; j=j+1){
tmp=a[i1][j];
a[i1][j]=a[i2][j];
a[i2][j]=tmp;
} |
8. поменять местами столбцы и :
|
for(i=0; i<n; i=i+1){
tmp=a[i][j1];
a[i][j1]=a[i][j2];
a[i][j2]=tmp;
} |
9. вычисление формулы :
|
s=0;
for(i=0; i<n; i=i+1){
s=s+f(a[i][j],i,j);
}
cout<<"s="<<s<<endl; |
Условия для исследования квадратной матрицы (количество строк и столбцов совпадает):
- для элементов на главной диагонали:
; - для элементов над главной диагональю:
; - для элементов под главной диагональю:
; - для элементов на побочной диагонали:
; - для элементов над побочной диагональю:
; - для элементов под побочной диагональю:
.
Примечание. Если требуется определить, например, сумму элементов, находящихся над главной диагональю, то задаем двумерный цикл по
и в теле цикла ставим дополнительное условие "
"
Пример 3. Массив
задан формулой
. Найти сумму элементов во второй строке, поменять местами первую и третью строки, найти произведение по формуле
.
Решение. Данную задачу можно разбить на несколько этапов:
- задать массив по формуле и вывести его на экран;
- найти сумму элементов во второй строке и вывести ее на экран;
- поменять местами первую и третью строки;
- вывести на экран измененный массив;
- найти произведение по формуле и вывести его на экран.
Каждый указанный этап решается с помощью циклов. Все циклы целесообразно использовать с предусловием (в программе – оператор for). На первом этапе следует организовать двумерный цикл по
, по
, т.к. необходимо задать значениями и вывести на экран весь массив. На втором этапе перед циклом необходимо задать
, а в теле цикла по
насчитывать значение
. Индекс
задаем как 1, что соответствует второй строке. Следует отметить, что нельзя считать сумму по какой-то определенной строке (столбце, диагонали) внутри двумерного цикла, т.к. в этом случае
будет больше в разы (зависит от количества строк/столбцов).На третьем этапе индексы строк берем
– для первой строки,
– для третьей строки. Замена строк организуется в одномерном цикле по
. На четвертом этапе матрица а должна быть отображена на экране. Нам требуется показать, что замена строк выполнена верно.На пятом этапе перед циклом следует задать
, а в теле цикла насчитывать произведение. Цикл организуем одномерный по
от 0 до 2 включительно, т.к. согласно формуле изменяется только
.
Блок-схема для примера 3 приведена на рис. 6.5.
Код программы (Visual Studio) с оператором for:
// proga29.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double a[6][8];
double S, tmp, P;
int i, j;
cout<<"Massiv a:"<<endl;
for(i=0; i<6; i=i+1){
for(j=0; j<8; j=j+1){
a[i][j]=3.0*i-5.0*j;
cout<<setw(5)<<a[i][j];
}
cout<<endl;
}
S=0;
for(j=0; j<8; j=j+1){
S=S+a[1][j];
}
cout<<"S="<<S<<endl;
for(j=0; j<8; j=j+1){
tmp=a[0][j];
a[0][j]=a[2][j];
a[2][j]=tmp;
}
for(i=0; i<6; i=i+1){
for(j=0; j<8; j=j+1){
cout<<setw(5)<<a[i][j];
}
cout<<endl;
}
P=1;
for(i=0; i<=2; i=i+1){
P=P*(a[i][1]-a[i][0]);
}
cout<<"P="<<P<<endl;
return 0;
}Результат выполнения программы:
Краткие итоги
Самыми распространенными видами массивов являются одномерные и двумерные массивы. Статические массивы легко задавать и использовать в программе. Циклы делают работу с массивами удобной и доступной.
Вопросы
- Что такое массив?
- Перечислите виды массивов.
- Что такое индекс?
- Как добиться отображения массива на экране в виде ровной таблицы?
Упражнения
- Одномерный массив
задать в программе. Найти максимальный из отрицательных элементов и поменять его местами с последним. - Одномерный массив
задать с клавиатуры. Найти сумму отрицательных, количество положительных и произведение ненулевых элементов. - Одномерный массив
задать числами. Найти среднее арифметическое элементов, удовлетворяющих условию
. - Одномерный массив
задать по формуле
. Найти количество элементов, удовлетворяющих условию
, минимальный элемент. - Матрицу
задать по формуле
. Найти новый одномерный массив
из произведений элементов каждой строки матрицы
. Найти максимальный элемент среди положительных элементов матрицы
. Заменить третий элемент в первой строке матрицы
на найденный максимальный элемент. - Матрицу
задать по формуле
. Найти сумму положительных элементов над главной диагональю матрицы. Найти максимальный элемент среди отрицательных элементов 4-ой строки. Заменить найденный максимальный элемент значением суммы. - Матрицу
задать по формуле
. Поменять местами первую и последнюю строки матрицы. Подсчитать
для элементов каждой строки матрицы по формуле:
, где
– номер строки.


:






и
местами:
и
:
и
:
:


при
с шагом 0,5. Определите наименьшее значение функции и значение
, при котором оно достигается.