Студопедия — Моделирование многомерных массивов
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Моделирование многомерных массивов






Основным понятием в языке Си является одномерный массив, а возможности формирования многомерных массивов (особенно с переменными размерами) весьма ограничены. Напомним, что нумерация элементов массивов в языке Си начинается с нуля, т.е. для обращения к начальному (первому) элементу массива требуется нулевое значение индекса.

При работе с матрицами обе указанные особенности массивов языка Си создают по крайней мере неудобства. Во-первых, при обращении к элементу матрицы нужно указывать два индекса – номер строки и номер столбца элемента матрицы. Во-вторых, нумерацию строк и столбцов матрицы принято начинать с 1.

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

 

Рассмотрим следующую программу:

Пример 10.17

#define N 4 /* Число строк матрицы */

#define M 5 /* Число столбцов матрицы */

#define A(i, j) x[M*(i-l) + (j-1)]

#include < stdio.h>

void main ()

{ /* Определение одномерного массива */

double x[N*M];

int i, j, k;

for (k = 0; k < N*M; k++)

x[k]=k;

for (i = l; i < = N; i++) /* Перебор строк */

{ printf (“\n Строка %d: ”, i);

/* Перебор элементов строки */

for (j = l; j < = M; j++)

printf< ” %6.1f”, A(i, j));

}}

 

Строка 1 0.0 1.0 2.0 3.0 4.0
Строка 2 5.0 6.0 7.0 8.0 9.0
Строка 3 10.0 11.0 12.0 13.0 14.0
Строка 4 15.0 16.0 17.0 18.0 19.0

 

Рис. 10.2. Результат выполнения программы

 

В программе определен одномерный массив х[ ], количество элементов в котором зависит от значений препроцессорных идентификаторов N и М.

Значения элементам массива х[ ] присваиваются в цикле с параметром k. Далее для доступа к элементам того же массива х[ ] используются макровызовы вида A(i, j), причем i изменяется от 1 до N, а переменная j изменяется во внутреннем цикле от 1 до М. Переменная i соответствует номеру строки матрицы, а переменная j играет роль второго индекса, т.е. указывает номер столбца. При таком подходе программист оперирует с достаточно естественными обозначениями A(i, j) элементов матрицы, причем нумерация столбцов и строк начинается с 1, как и предполагается в матричном исчислении.

В тексте программы за счет макрорасширений в процессе препроцессорной обработки выполняются замены параметризованных обозначений A(i, j) на x[5*(i-l)+(j-1)], и далее действия выполняются над элементами одномерного массива х[ ]. Но этих преобразований не видно и можно считать, что идет работа с традиционными обозначениями матричных элементов. Использованный в программе оператор (вызов функции)

printf (“% 6.lf”, A (i, j));

после макроподстановок будет иметь вид

printf (“% 6.lf”, x[5*(i-l) + (j-l)]);

 

На рис. 10.3 приведена иллюстративная схема одномерного массива х[ ] и виртуальной (существующей только в воображении программиста, использующего макроопределения) матрицы для рассмотренной программы.

Одномерный массив х[20]:

 

                   
0.0 1.0 2.0 3.0 4.0 5.0 …. 16.0 17.0 18.0 19.0
М=5 …. М=5
                         

 

j-й столбец

 

 

             
  0.0 1.0 2.0 3.0 4.0 Матрица А
i-я строкастрока 5.0 6.0 7.0 8.0 9.0 С
  10.0 11.0 12.0 13.0 14.0 Размерами
 
  15.0 16.0 17.0 18.0 19.0 4x5

 

А (1, 1) соответствует х[5*(1-1)+(1-1)] = = х[0]

А (1, 2) соответствует х[5*(1-1)+(2-1)] = = х[1]

А (2, 1) соответствует х[5*(2-1)+(1-1)] = = х[5]

А (3, 4) соответствует х[5*(3-1)+(4-1)] = = х[13]

Рис. 10.3. Имитация матрицы с помощью макроопределения и одномерного массива

 







Дата добавления: 2014-11-10; просмотров: 570. Нарушение авторских прав; Мы поможем в написании вашей работы!



Шрифт зодчего Шрифт зодчего состоит из прописных (заглавных), строчных букв и цифр...

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

Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...

Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

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

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

Деятельность сестер милосердия общин Красного Креста ярко проявилась в период Тритоны – интервалы, в которых содержится три тона. К тритонам относятся увеличенная кварта (ув.4) и уменьшенная квинта (ум.5). Их можно построить на ступенях натурального и гармонического мажора и минора.  ...

Машины и механизмы для нарезки овощей В зависимости от назначения овощерезательные машины подразделяются на две группы: машины для нарезки сырых и вареных овощей...

Классификация и основные элементы конструкций теплового оборудования Многообразие способов тепловой обработки продуктов предопределяет широкую номенклатуру тепловых аппаратов...

Именные части речи, их общие и отличительные признаки Именные части речи в русском языке — это имя существительное, имя прилагательное, имя числительное, местоимение...

Studopedia.info - Студопедия - 2014-2024 год . (0.012 сек.) русская версия | украинская версия