17116

Вкладені цикли. Багатомірні масиви. Масиви покажчиків

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторна робота № 25 Тема: Вкладені цикли. Багатомірні масиви. Масиви покажчиків Ціль роботи: вивчити конструкції мови С и оператори для обробки багатомірних масивів із застосуванням оператора циклу for. Обладнання: ПКПО Borland C Теоретичні відомості Масиви і по...

Украинкский

2013-06-29

92 KB

4 чел.

Лабораторна робота № 25

Тема: Вкладені цикли. Багатомірні масиви. Масиви покажчиків

Ціль роботи: вивчити конструкції мови С и оператори для обробки багатомірних масивів із застосуванням оператора циклу for.

Обладнання: ПК,ПО Borland C++

Теоретичні відомості

Масиви і покажчики, індексні вираження

Ідентифікатор масиву є покажчиком на перший елемент цього масиву. По визначенню, оператор індексування [ ] інтерпретується таким чином, що А[У] еквівалентно *(А+У). Відповідно до правил перетворення, що виконуються при операції "+", якщо А є ім'ям масиву (ім'я масиву є покажчиком на тип елементів масиву), те індексне вираження А[У] указує на В-ий елемент масиву А. У є індексом масиву і має цілий тип (int). Індексування є комутативною операцією, тому припустимі записи В[А], *(У+А).

А[ ][ ][   ][ k]

У випадку використання багатомірних масивів інтерпретація індексного вираження наступна. Якщо А[i][j][кi][k] являє собою n-мірним масив з рангом i*j *...*k, те, якщо A зустрічається у вираженні, він розглядається як вектор, що містить i (n -1)-мірних масивів з рангом j*...*k. Ім'я масиву A є покажчиком на цей вектор. Якщо до покажчика застосовується оператор (*) у явному чи в неявному виді (як результат індексування), то результат буде вказувати на елемент (n-1)-мірного масиву.

Розглянемо, наприклад масив int x[N][M] - масив цілих чисел розмірності N* M. Масиви в мові Зі зберігаються построчно (останній індекс змінюється швидше), а перший індекс (N) в оголошенні масиву дозволяє визначити обсяг необхідної для масиву пам'яті, але не грає ніякої ролі в обчисленні зсуву покажчика при доступі до елемента масиву – х[i][j]. Даний елемент розташований фактично в i+1 рядку, j+1 стовпці, тому що індекси в масиві починаються з нульового. Масив розглядається як одномірний (вектор), що містить N елементів, кожний з який є масивом (у даному випадку) з М елементів типу int. Ім'я масиву x є покажчиком на нульовий елемент масиву . Розглянемо елемент даного масиву x[i][j]. У вираженні *x[i], що еквівалентно * (x+i), x – покажчик на нульовий елемент масиву. Для доступу до i-того елемента   i збільшується на довжину об'єкта, на який указує покажчик, а саме на довжину масиву (рядка) з М елементів типу int, тобто (i*М*sizеof(int)). У результаті індексної операції виходить покажчик, що адресує нульовий елемент i-го одномірного масиву (рядка) х[i][o]. Для другого індексу знову застосовується той же алгоритм.. Покажчик зміщається на величину (j* sizеof(int)), після чого відбувається разіменування. Цього разу результат буде мати тип int. Елемент масиву можна представити також у виді *(*(х+i)+j).

Таким чином, загальний зсув у байтах покажчика на нульовий елемент масиву X[N][M]  при доступі x[i][j] обчислюється по формулі((i*M+j)* sizеof(int)).

Для тривимірного масиву float х3D[N][M][K]  величина зсуву в байтах для доступу до елемента  х3D[i][j][k] обчислюється по формулі

i*(M+K)+j*R+k)* sizеof (float).

Для доступу до елемента масиву 4х3D[i][j][k] можна також використовувати вираження *(*(*(х3D+i)+j)+k).

Приклад

/*    ЗАНЯТТЯ N 13

  Розробив Петров Ю.В.

Оголосити масиви різної розмірності, виконати їхню ініціалізацію

с застосуванням покажчиків і масиву покажчиків. Одержати доступ до

елементам масивів з використанням різних синтаксичних

конструкцій                */

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <math.h>

enum en{K=2,N=3,M=4};//Аналогічно #define K 5 #define N 5 #define M 4

typedef int mas1_int[N*M];//Оголошення типу 1-мірний масив (вектор)

typedef int mas2_int[N][M];//Оголошення типу 2-мірний масив

 //(масив 1-мірних масивів) елементів типу int

typedef int mas3_int[K][N][M]; //Оголошення типу 3-мірний масив

 //(вектор 2-мірних масивів) елементів типу int

int * matrix(int n_str, int m_stolb);//Функція ініціалізації масиву

 //с застосуванням покажчиків і виділенням пам'яті для масиву в "купі"

void main()

   { int d,a,b,i,j,k;

     int *pi, *para, *c[N];

     mas1_int mas1;    mas2_int mas2;       mas3_int mas3;

     clrscr();         randomize();

     for(i=0;i<N;i++)  c[i]=&mas2[i][0];

     printf("\nинициализация одномірного масиву:\n");

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

{ mas1[i]=random(10);

  printf("mas1[%d]=%2d ",i,mas1[i]);

  if ((i+1)%5==0) printf("\n");

}

     printf("\nвведите індекс елемента одномірного масиву і<N: ");

     scanf("%d",&і);

     pi=mas1;

     printf("mas1[%d]=%2d зсув: %2d байт\n",і,*(pi+і),і*sizeof(int));

     getch();

     randomize();

     printf("Ініціалізація двовимірного масиву\n");

     printf("c використанням масиву покажчиків:\n");

     for(i=0;i<N;i++)

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

{ *(c[i]+j)=random(10);

  printf("c[%d][%d]=%2d ",i,j,*(c[i]+j));

  if ((j+1)%M==0) printf("\n");

 }

     printf("\nвведите індекси елемента двовимірного масиву і<N, j<M: ");

     scanf("%d %d",&і,&j);

     printf("mas2[%d][%d]=%2d зсув: %2d байт \n",і,j,mas2[і][j],\

     (і*M+j)*sizeof(int));

     printf("Інші форми запису доступу до елементів двовимірного масиву:\n");

     printf("*(*mas2+i*M+j)= %2d\n", *(*mas2+i*M+j));

     printf("(*mas2)[i*M+j]  = %2d\n", (*mas2)[i*M+j]);

     printf("*(*(mas2+i)+j)= %2d\n", *(*(mas2+i)+j));

     printf("*(c[і]+j)=      %2d\n", *(c[і]+j));

     getch(); randomize();

     printf("\nинициализация двовимірного масиву у функції\n");

     printf("з виділенням пам'яті для масиву в \"купі\":\n");

     para=matrix(N,M);

     for(i=0;i<N;i++)

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

{ printf("mas2[%d][%d]=%2d ",i,j,*(para+i*M+j));

  if ((j+1)%M==0) printf("\n");

 }

     printf("\nвведите індекси елемента двовимірного масиву і<N, j<M: ");

     scanf("%d %d",&і,&j);

     printf("mas2[%d][%d]=%2d зсув: %2d байт ",і,j,*(para+і*M+j),\

     (і*M+j)*sizeof(int));

     free(para); //Звільнення пам'яті, виділеної для масиву в "купі"

     getch(); randomize();

     printf("\nинициализация тривимірного масиву:\n");

     for(i=0;i<K;i++)

      for(j=0;j<N;j++)

{ for(k=0;k<M;k++)

   { mas3[i][j][k]=random(10);

     printf("mas3[%d][%d][%d]=%2d ",i,j,k,mas3[i][j][k]);

     if ((k+1)%4==0) printf("\n");

   }

  if ((j+1)%N==0) printf("\n");

}

     printf("\nвведите індекси елемента тривимірного масиву і<K, j<N, k<M: ");

     scanf("%d %d %d", &і, &j, &k);

     printf("mas3[%d][%d][%d]=%2d зсув: %2d байт\n",і,j,k,\

     mas3[і][j][k],(і*M*N+j*M+k)*sizeof(int));

     printf("Інші форми запису доступу до елементів тривимірного масиву:\n");

     printf("*(**mas3+i*M*N+j*M+k)= %2d\n",*(**mas3+i*M*N+j*M+k));

     printf("*(*(*(mas3+i)+j)+k)= %2d\n",*(*(*(mas3+i)+j)+k));

     getch();

}//main

int * matrix(int n, int m)

{ int i,j;

  randomize();  //Виділення пам'яті для масиву в "купі"

  int *pa=(int *)malloc(n*m*sizeof(int));

  for(і=0;і<n;і++)

   for(j=0;j<m;j++)   //*(pa+і*m+j)-аналогічно pa[і*m+j]

    { *(pa+i*m+j)=random(51)-25;

   // printf("mas[%d][%d]=%2d ",i,j,pa[i*m+j]);

   // if ((j+1)%m==0) printf("\n");

    }

   return pa;

 }

/*   Ініціалізація одномірного масиву:

mas1[0]= 6 mas1[1]= 0 mas1[2]= 0 mas1[3]= 8 mas1[4]= 4

mas1[5]= 0 mas1[6]= 7 mas1[7]= 4 mas1[8]= 0 mas1[9]= 7

mas1[10]= 6 mas1[11]= 6

Введіть індекс елемента одномірного масиву і<N: 10

mas1[10]= 6 зсув: 20 байт

Ініціалізація двовимірного масиву

c використанням масиву покажчиків:

c[0][0]= 7 c[0][1]= 0 c[0][2]= 0 c[0][3]= 1

c[1][0]= 3 c[1][1]= 8 c[1][2]= 6 c[1][3]= 3

c[2][0]= 6 c[2][1]= 9 c[2][2]= 6 c[2][3]= 1

Введіть індекси елемента двовимірного масиву і<N, j<M: 1 3

mas2[1][3]= 3 зсув: 14 байт

Інші форми запису доступу до елементів двовимірного масиву:

*(*mas2+i*M+j) =  3

(*mas2)[i*M+j]=  3

*(*(mas2+i)+j) =  3

*(c[і]+j)      =  3

Ініціалізація двовимірного масиву у функції

с виділенням пам'яті для масиву в "купі":

mas2[0][0]= 7 mas2[0][1]=-1 mas2[0][2]=19 mas2[0][3]=15

mas2[1][0]=-6 mas2[1][1]=-15 mas2[1][2]= 2 mas2[1][3]=11

mas2[2][0]=-24 mas2[2][1]=24 mas2[2][2]=21 mas2[2][3]=-6

Введіть індекси елемента двовимірного масиву і<N, j<M: 2 0

mas2[2][0]=-24 зсув: 16 байт

Ініціалізація тривимірного масиву:

mas3[0][0][0]= 1 mas3[0][0][1]= 9 mas3[0][0][2]= 3 mas3[0][0][3]= 1

mas3[0][1][0]= 8 mas3[0][1][1]= 7 mas3[0][1][2]= 3 mas3[0][1][3]= 8

mas3[0][2][0]= 0 mas3[0][2][1]= 3 mas3[0][2][2]= 9 mas3[0][2][3]= 0

mas3[1][0][0]= 8 mas3[1][0][1]= 6 mas3[1][0][2]= 8 mas3[1][0][3]= 5

mas3[1][1][0]= 2 mas3[1][1][1]= 6 mas3[1][1][2]= 5 mas3[1][1][3]= 5

mas3[1][2][0]= 4 mas3[1][2][1]= 9 mas3[1][2][2]= 5 mas3[1][2][3]= 4

Введіть індекси елемента тривимірного масиву і<K, j<N, k<M: 1 2 2

mas3[1][2][2]= 5 зсув: 44 байт

Інші форми запису доступу до елементів тривимірного масиву:

*(**mas3+i*M*N+j*M+k)=  5

*(*(*(mas3+i)+j)+k)=    5   

 Приклад програми на С++

Скласти програму для обробки багатомірних масивів з використанням циклів. Індивідуальні завдання приведені в таблиці 13.1.

Вар.

Умова задачі

6

Знайти добуток позитивних чисел стовпця, останній елемент якого нуль

#include<iostream.h>

void main()

{int i,n;

double p;

 cout<<"введите число элементов столбца\n";

 cin>>n;

double*x=new double[n];

cout<<"введите столбец\n";

for(i=0;i<n;i++)

cin>>x[i];

p=1;

for(i=0;i<n;i++)

{if(x[i]>0) p=p*x[i];

}

cout<<"p="<<p;

}

Хід роботи

1.Вивчити теоретичні відомості.

2.Відповідно до індивідуального завдання розробити алгоритм і програму з застосуванням покажчиків на масив і масив покажчиків для роботи з двовимірним і тривимірним масивом.

3.Показати використання різних видів синтаксичних конструкцій, включаючи індексні вираження і покажчики на тип елементів масиву для доступу до елементів масиву.

4.Набрати і налагодити програму на комп'ютері.

5.Вивчити роботу операторів.

6.Одержати результати.

7.Оформити звіт.

8.Підготуватися до захисту лабораторної роботи, вивчивши контрольні питання по даній темі.

Вимоги до змісту звіту приведені в лабораторній   роботі   №1.

Індивідуальне завдання

Скласти програму для обробки багатомірних масивів з використанням циклів. Індивідуальні завдання приведені в таблиці 13.1.

Таблиця 13.1 - індивідуальне завдання

Вар.

Умова задачі

1

Обчислити добуток негативних чисел рядка, у якого другий елемент парний

2

Знайти суму непарних чисел стовпця, у якого перший елемент більше другого

3

Визначити кількість негативних чисел стовпця, у якого перший елемент менше останнього

4

Знайти суму позитивних кратних 5 чисел стовпця, у якого четвертий елемент негативний

5

Знайти добуток непарних чисел стовпця, у якого перший елемент нуль

6

Знайти добуток позитивних чисел стовпця, останній елемент якого нуль

7

Знайти суму непарних елементів рядка, перший елемент якої кратний 3

8

Знайти максимальне негативне число рядка, у якої другий елемент більше 20

9

Знайти суму позитивних парних чисел рядка, у якого перший елемент негативний

10

Знайти мінімальне позитивне число рядка, у якої п'ятий елемент негативний

11

Знайти мінімальне парне число стовпця, у якого перший елемент більше третього

12

Знайти суму позитивних кратних 5 чисел стовпця, у якого четвертий елемент негативний

13

Знайти кількість негативних не кратних 3 чисел рядка, у якого перший елемент нуль

14

Знайти кількість позитивних парних чисел рядка, у якого п'ятий елемент більше 30

15

Знайти добуток квадратів позитивних парних чисел стовпця, у якого другий елемент нуль

16

Знайти середнє арифметичне негативних елементів рядка, у якої четвертий елемент отрицательный

17

Знайти різниця сум негативних і позитивних елементів рядка, у якого третій елемент кратний 3

18

Знайти середнє геометричне модулів негативних елементів стовпця, у якого перший елемент позитивний

19

Знайти всі кратні 7 позитивні елементи стовпця, у якого третій елемент непарний

20

Знайти середнє арифметичне позитивних елементів рядка, у якої перший елемент менше второго

21

Знайти середнє геометричне кратних 3 елементів стовпця, у якого шостий елемент не кратний 4

22

Знайти частка від розподілу кількості негативних елементів стовпця, у якого перший елемент нуль, на їхню суму

23

Знайти всі позитивні непарні числа рядка, у якої другий елемент не кратний 3

24

Знайти кількість негативних кратних 5 елементів стовпця, у якого другий елемент дорівнює третьому

25

Знайти номер максимального парного числа рядка, у якого перший елемент дорівнює останньому

26

Знайти номер мінімального непарного числа рядка, у якого перший елемент дорівнює останньому

27

Знайти номер максимального парного числа стовпця, у якого перший елемент дорівнює останньому

28

Знайти номер мінімального непарного числа стовпця, у якого перший елемент дорівнює останньому

29

Знайти суму максимального і мінімального чисел рядка, у якого другий елемент непарний

30

Знайти номер мінімального непарного числа рядка, у якого перший елемент парний

Контрольні питання

1.Приведіть приклади оголошення масивів з різною розмірністю. Поясните організацію збереження елементів масиву.

2.Як відбувається масштабування при послідовному разіменування покажчика (імені масиву) у процесі доступу до елементів? Які синтаксичні конструкції можна використовувати для доступу до елементів масиву?

3.Приведіть загальну формулу для масиву Тип Ім'я [N][M][K] при доступі до заданого елемента Ім'я [i][j][k] і поясните її.

4.Як здійснюється ініціалізація багатомірних масивів?

5.Чи залежить ініціалізація масиву від класу пам'яті при оголошенні?

6.Як використовувати засіб typedef для оголошення типу масиву.

7.Який з індексів можна не вказувати при явній ініціалізації масивів?

8.Чи можна вказувати не всі елементи при ініціалізації? Як використовувати дужки при ініціалізації?

9.Який індекс не використовується при розрахунку величини зсуву покажчика в процесі доступу до елемента масиву?

10.Для чого використовується зазначений індекс?


 

А также другие работы, которые могут Вас заинтересовать

85380. Распространение загрязняющих веществ 64 KB
  Если выбрасываемые в воздух примеси состоят из крупных частиц то распространяясь в атмосфере они под действием силы тяжести начинают спускаться с определенной постоянной скоростью в соответствии с законом Стокса. Естественно что почти все примеси в конечном итоге осаждаются на поверхности земли причем тяжелые осаждаются в основном под действием гравитационного поля а легкие в результате диффузионного процесса. Поскольку наиболее опасны для окружающей среды примеси газообразного вида типа окислов то именно таким легким соединениям...
85381. Нормирование качества воздуха, воды, почвы 67.5 KB
  Совершенно недопустимо сравнивать уровни загрязнения селитебной зоны с установленными ПДКрз а также говорить о ПДК в воздухе вообще не уточняя о каком нормативе идет речь. Уровень загрязнения атмосферы обычно описывается набором статических характеристик для ряда измеряемых вредных веществ. Для оценки степени загрязнения атмосферы средние максимальные концентрации веществ нормируются на величину средней максимальной концентрации для большого региона или на санитарногигиснический норматив ПДК. Нормированные характеристики загрязнения...
85382. Организация экоаналитического контроля 53 KB
  Контролируемые объекты и компоненты в экоаналитическом контроле Организация и обеспечение ЭАК требуют решения комплекса взаимосвязанных проблем которые образуют приведенную ниже единую систему: Нормативнотехническое обеспечение и правовая регламентация Контролируемые объекты и компоненты Методическое обеспечение Аппаратурное обеспечение Метрологическое обеспечение Обеспечение качества химической информации Кадровое обеспечение Нормативнотехническое обеспечение и правовая регламентация системы ЭАК С точки зрения природоохранительного...
85383. Требования к средствам измерения и классификация экоаналитических средств 35.5 KB
  Требования к средствам измерений Различными нормативными документами в области обеспечения единства измерений предъявляется достаточно жесткие требования к средствам измерений СИ применяемым при экоаналитических работах. Прежде всего СИ должны пройти испытания с целью утверждения типа средств измерений. После получения положительного результата испытаний такие средства измерений включаются в установленном порядке в Государственный реестр средств измерений При эксплуатации СИ необходимо соблюдать установленную в техническом паспорте СИ...
85384. Система наблюдения и контроля атмосферного воздуха ОГСНКа 34 KB
  В России существует сеть станций которая ведет наблюдения за содержанием загрязняющих веществ в атмосфере. Обычно на каждом посту измеряется до 8 загрязняющих веществ но учитывая что каждый промышленный центр имеет свою экологическую специфику и набор 3В возможно измерение до 80 компонентов. Стационарный пост предназначен для обеспечения непрерывной регистрации содержания загрязняющих веществ или регулярного отбора проб воздуха для последующего анализа. Помимо наблюдений в городах ведутся наблюдения за пределами урбанизированных...
85385. Средства контроля воздушных и других газообразных сред 81 KB
  Отбор проб воздуха. Средства контроля подразделяют на: системы комплексы приборы другие технические средства контроля загрязнения ТСКЗ воздушного бассейна с группировкой их по особенностям анализируемой воздушной среды следующим образом: ТСКЗ атмосферы ТСКЗ воздуха населенных мест и жилых помещений ТСКЗ воздуха рабочей зоны и производственных помещений ТСКЗ выбросов и паро воздушных смесей поступающих в атмосферу. Они могут быть сгруппированы следующим образом: промышленные газоанализаторы более 60 40 анализаторы...
85386. Экологический мониторинг поверхностных водных объектов 78.5 KB
  Программа ГСМОС Вода включает 7 основных пунктов: создание всемирной сети станций мониторинга; разработка единой методики отбора и анализа проб воды; осуществление контроля за точностью данных; использование современных систем хранения и распространения информации; организация повышения квалификации для специалистов; подготовка методических справочников; обеспечение необходимым оборудованием в отдельных случаях. Основные задачи систематических наблюдений за качеством поверхностных вод в системе ОГСНК можно сформулировать следующим образом:...
85387. Отбор проб воды. Методы анализа водных сред 47.5 KB
  Отбор проб воды. representtive представительный показательный считается такая проба которая в максимальной степени характеризует качество воды по данному показателю является типичной и не искаженной вследствие концентрационных и других факторов. Пробы из рек и водных потоков отбирают для определения качество воды в бассейне реки пригодности воды для пищевого использования орошения для водопоя скота рыборазведения купания и водного спорта установления источников загрязнения. Учитывая длительность существования озер на первый план...
85388. Роль пробоотбора в общей процедуре методики анализа 44.5 KB
  Роль пробоотбора в общей процедуре методики анализа. Отбор проб почвы донных отложений растительности. Эффективность и достоверность методик и методического обеспечения системы экоаналитического контроля определяются прежде всего пробоотбором и пробоподготовкой. Любой химический анализ чаще всего начинают с отбора и подготовки пробы к анализу.