Студопедия Главная Случайная страница Обратная связь

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

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





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

При работе с матрицами обе указанные особенности массивов языка Си создают по крайней мере неудобства. Во-первых, при обращении к элементу матрицы нужно указывать два индекса – номер строки и номер столбца элемента матрицы. Во-вторых, нумерацию строк и столбцов матрицы принято начинать с 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; просмотров: 587. Нарушение авторских прав; Мы поможем в написании вашей работы!




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


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


Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...


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

Функциональные обязанности медсестры отделения реанимации · Медсестра отделения реанимации обязана осуществлять лечебно-профилактический и гигиенический уход за пациентами...

Определение трудоемкости работ и затрат машинного времени На основании ведомости объемов работ по объекту и норм времени ГЭСН составляется ведомость подсчёта трудоёмкости, затрат машинного времени, потребности в конструкциях, изделиях и материалах (табл...

Гидравлический расчёт трубопроводов Пример 3.4. Вентиляционная труба d=0,1м (100 мм) имеет длину l=100 м. Определить давление, которое должен развивать вентилятор, если расход воздуха, подаваемый по трубе, . Давление на выходе . Местных сопротивлений по пути не имеется. Температура...

Мелоксикам (Мовалис) Групповая принадлежность · Нестероидное противовоспалительное средство, преимущественно селективный обратимый ингибитор циклооксигеназы (ЦОГ-2)...

Менадиона натрия бисульфит (Викасол) Групповая принадлежность •Синтетический аналог витамина K, жирорастворимый, коагулянт...

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

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