Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

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

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

ü Внимание! Механизмы передачи входных и выходных массивов аналогичны.

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

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

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

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

ü Внимание! Если размер выходного массива совпадает с одним из параметров входного, то указывать его не требуется.

В рассматриваемом примере используются два входных двумерных (a, b) и два выходных одномерных (ssa, ssb) массива. Исходя из условий задачи, предполагаем хранение выходных массивов. Следовательно, в основной функции должны быть описаны четыре массива (a, b, ssa, ssb). Элементы входных будут определены вводом значений в этой же (основной) функции, выходных – после соответствующих обращений к подпрограмме.

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

Методика хранения многомерных массивов (разд. «Программирование вложенных циклов») позволяет рассчитывать адрес каждого элемента через начальный адрес массива путем увеличения его на сумму произведений размеров увеличенных элементов на длину ячейки для хранения каждого из них.

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

Так, при необходимости передачи в дополнительную функцию двумерного массива A(mхn) с максимально требуемым размером 10х15, фрагмент обращения имеет вид

float a[10][15];

...

func(a[0], m, n, 15);

...

а заголовок дополнительной функции запишется, например, следующим образом

void func(float *z, int k, int p, int t)

при этом обращение к текущему элементу zij имеет вид

*(z + i * t + j)

 

Составим таблицу идентификации переменных алгоритма и создаваемой программы (табл. 6.4).

Таблица 6.4

Обозначение в алгоритме   m n t s i j aij bij
Обозначение в программе   m n t s i j a[i][j] b[i][j]

 

Окончание табл. 6.4

  ssai ssbi mp tp k p ss d sszd zij
  ssa[i] ssb[i] mp tp k p ss d ssz[d] z[i][j]

 

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

sum_str(a, m, n, 15, ssa, &mp); и sum_str(b, t, s, 7, ssb, &tp);

где m, n, t, s – фактические используемые размеры, а 15 и 7 – фактические максимальные размеры по второму измерению массивов A и B.

Заголовок дополнительной функции преобразуется к виду

void sum_str(float *z, int k, int p, int pmax, float *ssz, int *d)

где k и p – формальные используемые размеры, а pmax – формальный максимальный размер по второму измерению массива Z.

Универсальные размеры массивов зададим с помощью подстановочной директивы define, что позволит модифицировать увеличенные размеры массивов в одном месте – заголовке программы.

 

Программа решения примера 6.4

#include <stdio.h> /* stdio.h - файл с прототипами функций ввода-вывода */

#include <conio.h> /* conio.h - файл с прототипом функций getch(), clrscr()*/

 

#define M 10

#define N 15

#define T 9

#define S 7

 

void sum_str(float* z, int k, int p, int pmax, float *ssz, int *d);

 

main() /* заголовок головной функции */

{

float ap, bp, a[M][N], b[T][S], ssa[M], ssb[T]; /* описатели массивов */

int i, j, n, m, t, s, mp, tp; /* и переменных */

clrscr();

printf("\n Введите значения m, n, t, s: ");

scanf("%d%d%d%d", &m, &n, &t, &s);

printf("\n m=%d n=%d \n t=%d s=%d \n", m, n, t, s);

printf(" Введите построчно массив A(%d*%d):\n", m, n);

for(i = 0; i < m; i++) /* заголовок внешнего цикла ввода a[i][j]*/

for(j = 0; j < n; j++) /* заголовок внутреннего цикла ввода a[i][j]*/

scanf("%f", a[0] + i * N + j);

printf("\n Массив A\n");

for(i = 0; i < m; i++) /* заголовок внешнего цикла вывода a[i][j]*/

{

for(j = 0; j < n; j++) /* заголовок внутреннего цикла вывода a[i][j]*/

printf(" %6.2f", a[i][j]);

printf("\n");

}

printf(" Введите построчно массив B(%d*%d):\n", t, s);

for(i = 0; i < t; i++) /* заголовок внешнего цикла ввода b[i][j]*/

for(j = 0; j < s; j++) /* заголовок внутреннего цикла ввода b[i][j]*/

scanf("%f", b[0] + i * S + j);

printf("\n Массив B\n");

for(i = 0; i < t; i++) /* заголовок внешнего цикла вывода b[i][j]*/

{

for(j = 0; j < s; j++) /* заголовок внутреннего цикла вывода b[i][j]*/

printf(" %6.2f", b[i][j]);

printf("\n");

}

sum_str(a[0], m, n, N, ssa, &mp);

printf("\n\n Массив SSA\n");

for(i = 0; i < mp; i++) /* заголовок цикла вывода ssa[ i ] */

printf(" %.2f",ssa[i]);

printf("\n"); /* перевод курсора в начало следующей строки */

sum_str(b[0], t, s, S, ssb, &tp);

printf("\n\n Массив SSB\n");

for(i = 0; i < tp; i++) /* заголовок цикла вывода ssb[ i ] */

printf(" %.2f",ssb[i]);

printf("\n"); /* перевод курсора в начало следующей строки */

getch();

}

 

void sum_str(float *z, int k, int p, int pmax, float *ssz, int *d)

{

int i, j; /* описание локальных */

float ss; /* переменных */

*d = 0;

for(i = 0; i < k; i++) /* заголовок внешнего цикла ввода a[i][j]*/

{

ss = 0;

for(j = 0; j < p; j++) /* заголовок внутреннего цикла ввода a[i][j]*/

{

ss = ss + *(z + i * pmax + j);

printf("\n %2d %2d %6.2f %8.2f", i, j, *(z + i * pmax + j), ss);

}

if(ss >= 0)

{

ssz[*d] = ss;

*d=*d + 1;

}

}

}

 

3 4 2 3

8.53 9.3 5.7 -3.5

46 -32.1 28.5 -52.6

4.7 56 65 -7.2

1.6 7.3 15

4.2 -10.18 12

 

Вопросы для контроля

 

1. Какой алгоритм называют основным, а какой – дополнительным?

2. Что выносится в дополнительный алгоритм?

3. Какова структура обращения к дополнительному алгоритму?

4. Какие параметры называют фактическими?

5. Что такое формальные параметры?

6. Какова схема взаимодействия головного алгоритма с дополнительными?

7. Чем головная программа отличается от подпрограммы?

8. На какие типы делятся подпрограммы?

9. Что такое функция?

10. Что такое вызов функции?

11. Для чего нужен прототип функции?

12. Какова структура программы с подпрограммами?

13. Какова структура определения функции?

14. Какова структура вызова функции?

15. Для чего нужен оператор return?

16. Как осуществляется передача массивов в функцию?

17. Что такое указатель?

18. Какова структура описания указателя?

19. Для чего нужны операции взятия адреса и разадресации?

20. Чем отличаются входные параметры от выходных?

21. Каков механизм передачи в функцию выходных параметров?

22. Чем отличается передача параметров по значению от передачи по адресу?

22. Почему при составлении индексного выражения используют размеры, указанные в операторе описания массива?

 

 

<== предыдущая лекция | следующая лекция ==>
Составление алгоритма решения. Анализ показывает, что решение задачи требует многократного вычисления суммы элементов каждой строки двумерных массивов A и B | Определение значения символьной строки
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 294; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.061 сек.