Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Статические массивы(умножение матриц)





ДВУМЕРНЫЕ СТАТИЧЕСКИЕ МАССИВЫ (МАТРИЦЫ).

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

Например, данные о планетах Солнечной системы представлены следующей таблицей:

Планета Расст. до Солнца Относ. обьем Относ. масса
Меркурий 57.9 0.06 0.05
Венера 108.2 0.92 0.81
Земля 149.6 1.00 1.00
Марс 227.9 0.15 0.11
Юпитер 978.3 1345.00 318.40
Сатурн 1429.3 767.00 95.20

Их можно занести в память компьютера, используя понятие двумерного массива. Положение элемента в массиве определяется двумя индексами. Они показывают номер строки и номер столбца. Например: A[7][6], D[56][47].

Заполняется двумерный массив аналогично одномерному: с клавиатуры, с помощью оператора присваивания.

При выполнении инженерных и математических расчетов часто используются переменные более чем с двумя индексами. При решении задач на компьютере такие переменные представляются как компоненты соответственно трех-, четырехмерных массивов и т.д.

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

ЗАПОЛНЕНИЕ МАТРИЦ.

Организацию обработки элементов статического двумерного (многомерного) массива можно организовать с использованием сложноциклической структуры. Так как, например, при заполнении массива необходимо произвести обход всех элементов по строкам (i) изменяя индексы столбцов (j). Таким образом объевленный массив из N строк и M столбцов

#define n 6

#define m 8

int a[n][m];

будет организован в памяти ЭВМ следующим образом:

 

i\j       m-2 m-1
  A[0][0] A[0][1] A[0][2]     A[0][m-1]
  A[1][0] A[1][1] A[1][2]      
  A[2][0] A[2][1] A[2][2]      
      A[i][j]    
n-2            
n-1 A[n-1][0]         A[n-1][m-1]

 

Поэтому в цикле изменения i от 0 до m-1 следует изменять j от 0 до m-1, где и вводить элементы a[i][j].

 

Программа:

  1. # include
  2. # include
  3. # define n 6 // Количество строк матрицы
  4. # define m 8 // Количество столбцов матрицы
  5. int main ()
  6. {
  7. int a[n][m];
  8. clrscr ();
  9. printf ("\n Заполнение элементов матрицы A[%i][%i].",n,m);
  10. for (int i=0;i
  11. {
  12. printf ("\n Ввод %i-й строки матрицы \n",i);
  13. for (int j=0;j
  14. {
  15. printf (" a[%i][%] = ",i,j);
  16. scanf ("%i",&a[i][j]);
  17. }
  18. }
  19. printf ("\n В памяти компьютера сформирована матрица А\n");
  20. for (int i=0;i
  21. {
  22. for (int j=0;j
  23. printf ("%6i",a[i][j]);
  24. puts (" "); // Переход на новую строку
  25. }
  26. getch();
  27. }

ВЫВОД ЭЛЕМЕНТОВ ДВУМЕРНЫХ МАССИВОВ.

Вывод элементов матрица аналогичен вводу - использование сложноциклической алгоритмической структуры в Си - программе. В цикле перебора строк кроме организации цикла по перебору элементов столбцов необходимо реализовать переход на новую строку для более наглядного вывода элементов функцией puts(" ");, которая содержит \n в конце любого вывода сообщения даже без его указания. Рассмотрим пример формирования матрицы случайными числами и ее вывод.

 

Программа:

  1. # include
  2. # include
  3. # include
  4. # define n 3
  5. # define m 4
  6. int main ()
  7. {
  8. int a[n][m];
  9. clrscr ();
  10. randomize();
  11. printf ("\n Сформирована матрица A[%i][%i].",n,m);
  12. for (int i=0;i
  13. {
  14. for (int j=0;j
  15. {
  16. a[i][j]=random(21)-10;
  17. printf ("%6i",a[i][j]);
  18. }
  19. puts (" ");
  20. }
  21. getch();
  22. }

ОРГАНИЗАЦИЯ СИМВОЛЬНОГО ОДНОМЕРНОГО МАССИВА В ВИДЕ МАТРИЦЫ СИМВОЛОВ.

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

Программа:

  1. # include
  2. # include
  3. # define n 10 //Количество элементов строкового массива
  4. # define m 30 // Максимальное количество символов элемента массива при вводе
  5. int main ()
  6. {
  7. char a[n][m];
  8. clrscr ();
  9. printf ("\n Введите фамилии учеников \n");
  10. for (int i=0;i
  11. {
  12. printf ("\n %i. ",i);
  13. scanf ("%s",&a[i]);
  14. }
  15. puts (" \n");
  16. for (int i=n-1;i>=0;i--)
  17. printf ("\n %i. %s",i,a[i]);
  18. getch();
  19. }

КВАДРАТНЫЕ МАТРИЦЫ. РАБОТА С ДИАГОНАЛЬНЫМИ ЭЛЕМЕНТАМИ.

В квадратной матрице количество строк и столбцов - одинаково и равно n. Любая матрица имеет элементы главной и побочной диагонали. Диагональные элементы главной диагонали: a[0][0];a[1][1];a[2][2];….;a[n-1][n-1]. Элементами побочной диагонали являются: a[0][n-1];a[1][n-2];a[2][n-3];…;a[n-2][1];a[n-1][0].

В качестве примера рассмотрим задачу формирования квадратной матрицы порядка n случайными числами и нахождения произведения элементов главной диагонали и суммы элементов ниже побочной диагонали.

Отметим элементы главной диагонали для нахождения их произведения.

 

i\j       n-2 n-1
  A[0][0] A[0][1] A[0][2]     A[0][n-1]
  A[1][0] A[1][1] A[1][2]      
  A[2][0] A[2][1] A[2][2]      
      A[i][j]    
n-2         ...  
n-1 A[n-1][0]         A[n-1][n-1]

 

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

i\j       n-2 n-1
  A[0][0] A[0][1] A[0][2]     A[0][n-1]
  A[1][0] A[1][1] A[1][2]     ...
  A[2][0] A[2][1] A[2][2]   ... ...
      A[i][j] ... ...
n-2     ... ... ... ...
n-1 A[n-1][0] ... ... ... ... A[n-1][n-1]

 

Программа:

for (int j=(n-i);j

  1. # include
  2. # include
  3. # include
  4. # define n 5
  5. int main ()
  6. {
  7. int a[n][n];
  8. clrscr ();
  9. randomize();
  10. printf ("\n Сформирована квадратная матрица A[%i][%i].",n,n);
  11. for (int i=0;i
  12. {
  13. for (int j=0;j
  14. {
  15. a[i][j]=random(31)-15;
  16. printf ("%6i",a[i][j]);
  17. }
  18. puts (" ");
  19. }
  20. long int p=1,s=0;
  21. for (int i=0;i
  22. for (int i=1;i
  23. s+=a[i][j];

printf ("\n Произведение элементов главной диагонали: %ld",p);

printf ("\n Сумма элементов ниже побочной диагонали: %ld",s);

getch();

}

ТРАНСПОНИРОВАНИЕ МАТРИЦ.

В данном алгоритме транспонирования матрицы необходимо заменить строки матрицы ее столбцами, а столбцы - строками, т.е. вычислить b[i][j]=a[j][i], где i=1,…,n; j=1,…,m.

Программа:

  1. # include
  2. # include
  3. # include
  4. # define n 5
  5. # define m 7
  6. main ()
  7. {
  8. int a[n][m],b[m][n];
  9. clrscr ();
  10. randomize();
  11. printf ("\n Сформирована матрица A[%i][%i].\n",n,m);
  12. for (int i=0;i
  13. {
  14. for (int j=0;j
  15. {
  16. a[i][j]=random(31)-15;
  17. printf ("%6i",a[i][j]);
  18. }
  19. puts (" ");
  20. }
  21. for (i=0;i
  22. for (j=0;i
  23. b[j][i]=a[i][j];
  24. printf ("\n Получена транспонированная матрица B[%i][%i].\n",m,n);
  25. for (i=0;i
  26. {
  27. for (j=0;j
  28. printf ("%6i",b[i][j]);
  29. puts (" ");
  30. }
  31. getch();
  32. }

Транспонированную матрицу можно получить в исходном массива А. Для квадратной матрицы n*n для этого необходимо поменять местами каждый элемент верхнего треугольника с соответствующим элементом нижнего (диагональные элементы переставлять не нужно). При этом для каждой строки нужно выполнять перестановку для элементов, расположенных правее главной диагонали, с элементами соответствующего столбца, расположенными ниже главной диагонали. При перестановке используем вспомогательную переменную tmp, помещая в нее для временного хранения один из переставляемых элементов, чтобы не потерять его значение.

Программа:

  1. # include
  2. # include
  3. # include
  4. # define n 6
  5. int main ()
  6. {
  7. int a[n][n];
  8. clrscr ();
  9. randomize();
  10. printf ("\n Сформирована квадратная матрица A[%i][%i].\n",n,n);
  11. for (int i=0;i
  12. {
  13. for (int j=0;j
  14. {
  15. a[i][j]=random(61)-30;
  16. printf ("%6i",a[i][j]);
  17. }
  18. puts (" ");
  19. }
  20. for (int i=0;i<(n-1);i++)
  21. for (int j=(i+1);i
  22. {
  23. int tmp=a[i][j];
  24. a[i][j]=a[j][i];
  25. a[j][i]=tmp;
  26. }
  27. printf ("\n Транспонированная матрица.\n");
  28. for (int i=0;i
  29. {
  30. for (int j=0;j
  31. printf ("%6i",a[i][j]);
  32. puts (" ");
  33. }
  34. getch();
  35. }

Для прямоугольной матрицы алгоритм усложняется.







ЧТО ПРОИСХОДИТ ВО ВЗРОСЛОЙ ЖИЗНИ? Если вы все еще «неправильно» связаны с матерью, вы избегаете отделения и независимого взрослого существования...

ЧТО И КАК ПИСАЛИ О МОДЕ В ЖУРНАЛАХ НАЧАЛА XX ВЕКА Первый номер журнала «Аполлон» за 1909 г. начинался, по сути, с программного заявления редакции журнала...

ЧТО ПРОИСХОДИТ, КОГДА МЫ ССОРИМСЯ Не понимая различий, существующих между мужчинами и женщинами, очень легко довести дело до ссоры...

Что будет с Землей, если ось ее сместится на 6666 км? Что будет с Землей? - задался я вопросом...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.