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

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

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





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

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




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


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


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


Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

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

РЕВМАТИЧЕСКИЕ БОЛЕЗНИ Ревматические болезни(или диффузные болезни соединительно ткани(ДБСТ))— это группа заболеваний, характеризующихся первичным системным поражением соединительной ткани в связи с нарушением иммунного гомеостаза...

Решение Постоянные издержки (FC) не зависят от изменения объёма производства, существуют постоянно...

Вопрос. Отличие деятельности человека от поведения животных главные отличия деятельности человека от активности животных сводятся к следующему: 1...

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

Психолого-педагогическая характеристика студенческой группы   Характеристика группы составляется по 407 группе очного отделения зооинженерного факультета, бакалавриата по направлению «Биология» РГАУ-МСХА имени К...

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