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

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

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





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

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

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

ПРОФЕССИОНАЛЬНОЕ САМОВОСПИТАНИЕ И САМООБРАЗОВАНИЕ ПЕДАГОГА Воспитывать сегодня подрастающее поколение на со­временном уровне требований общества нельзя без по­стоянного обновления и обогащения своего профессио­нального педагогического потенциала...

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

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

Ученые, внесшие большой вклад в развитие науки биологии Краткая история развития биологии. Чарльз Дарвин (1809 -1882)- основной труд « О происхождении видов путем естественного отбора или Сохранение благоприятствующих пород в борьбе за жизнь»...

Этапы трансляции и их характеристика Трансляция (от лат. translatio — перевод) — процесс синтеза белка из аминокислот на матрице информационной (матричной) РНК (иРНК...

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