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.Для чого використовується зазначений індекс?


 

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

3317. Изготовление скрин-фильма 2.3 MB
  Изготовление скрин-фильма Скрин-фильм – это видеофильм, созданный на основе книжных иллюстраций к небольшим рассказам, сказкам, стихотворениям и сопровождаемый фонограммой, записанной с микрофона или скачанной из сети Интернет. Т.е. это видео и...
3318. Расчет плазмотрона и определение его характеристик 203.5 KB
  Пояснительная записка к курсовой работе: 24 с., 4 рис., 1 таблица, 5 источников. Объект исследования – электродуговой плазмотрон постоянного тока косвенного действия. Цель работы – определение основных характеристик плазмотрона. Метод иссл...
3319. Чрезвычайные ситуации в мирное и военное время. 1.17 MB
  Краткая характеристика чрезвычайных ситуаций мирного и военного времени Введение. Понятие о хирургии, травмах.  Чрезвычайные ситуации мирного времени.  Возможные аварии, катастрофы и стихийные бедствия в г. Воронеже и области...
3320. Техника и технология транспорта в туризме 163 KB
  Введение Учебная дисциплина рассматривает вопросы, связанные с техникой и технологией использования различных видов транспорта в туризме, технико-экономические и технико-эксплуатационные показатели различных видов туристского транспорта и порядок их...
3321. Военно-промышленный комплекс СССР в 1920–1950-е годы: темпы экономического роста, структура, организация производства и управление 2.25 MB
  Предлагаемая читателю книга – первая в отечественной литературе научная монография, посвященная истории формирования советского военно-промышленного комплекса – наиболее динамично развивавшейся совокупности видов промышленного производства...
3322. Программное обеспечение автоматизированных систем. Разработка приложений баз данных 628 KB
  В пособии изложены общие сведения о реляционных СУБД и их практическом применении на примере СУБД Oracle 8 с описанием элементов программирования в её среде. Приведены задания для выполнения лабораторных работ по дисциплине «Организация баз данных»....
3323. Бухгалтерские информационные системы 231 KB
  Причины и тенденции автоматизации учета на предприятии Причины Бухгалтерский учет является самым сложным и трудоемким процессом учета, поэтому использование компьютерных технологий при обработке информации просто необходимо. Современные информаци...
3324. Авиационные радиопеленгаторы 10.45 MB
  В данном пособии рассмотрено назначение, принцип работы и основные технические данные приводных радиостанций, современных бортовых радиокомпасов АРК-15М, АРК-22, АРК-25, АРК-УД и наземных радиопеленгаторов. В пособии даны сведения по факторам, влияю...
3325. Разработка бизнес-плана для предприятий автосервиса 534.5 KB
  Методическое пособие рекомендуется для выполнения курсовой работы по дисциплине «Экономика отрасли» и самостоятельного изучения студентов среднего профессионального образования по специальности 1705 «Техническое обслуживание и ремонт автомобильного...