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


 

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

26076. Материальная выгода. Налогообложение материальной выгоды 37.5 KB
  Налогообложение материальной выгоды В последнее время широкое распространение получила продажа товаров населению в кредит. И мало кто из покупателей подозревает что в такой ситуации у него может появиться доход называемый материальной выгодой. Статьей 212 НК РФ установлены особенности исчисления доходов получаемых в виде материальной выгоды. Экономия на процентах и материальная выгода Это один из наиболее часто встречающихся видов материальной выгоды.
26077. Отчетность крестьянских (фермерских) хозяйств и других предприятиях малого бизнеса 39 KB
  При составлении бухгалтерской отчетности необходимо руководствоваться Законом РФ О бухгалтерском учете и отчетности и постановлением Минфина РФ от 07. Бухгалтерская отчетность малого предприятия Закон № 209ФЗ пунктом 3 статьи 7 предусматривает упрощенный порядок составления субъектами малого и среднего предпринимательства статистической отчетности.2003 № 67н О формах бухгалтерской отчетности организаций далее Приказ № 67н. Согласно пункту 2 статьи 13 Закона № 129ФЗ бухгалтерская отчетность организаций имеющих статус субъектов малого...
26078. Бухгалтерский и налоговый учет амортизации основных средств 39 KB
  Амортизационные отчисления это денежное выражение размера амортизации которое должно соответствовать степени износа основных фондов. Норма амортизации это установленный размер амортизационных отчислений за определенный период времени по конкретному виду основных средств выраженных как правило в процентах к балансовой стоимости. Объектами для начисления амортизации являются объекты основных средств находящиеся в организации на праве собственности хозяйственного ведения оперативного управления.
26079. Бюджетная система РФ‚ её структура и принципы функционирования 35.5 KB
  Согласно БК РФ все действующие на территории Российской Федерации бюджеты представляют в совокупности определенную систему которая называется бюджетной системой которая состоит из бюджетов трех уровней: первый уровень федеральный бюджет и бюджеты государственных внебюджетных фондов; второй уровень бюджеты субъектов Российской Федерации и бюджеты территориальных государственных внебюджетных фондов; третий уровень местные бюджеты ст. Правовая форма бюджетов всех уровней описывается в статье 11. Бюджет субъекта Российской Федерации и...
26080. Оформление результатов аудиторской проверки 49 KB
  В акте аудиторской проверки с достаточной подробностью и доказательностью однако без включения малосущественных деталей аудиторы сообщают клиенту о проделанной работе о ее основных направлениях и о том какие из этих направлений подвергнуты сплошной проверке а какие выборочной. Акт аудиторской проверки является строго конфиденциальным документом с содержанием которого аудиторы не вправе без согласия на это клиента знакомить третьих лиц за исключением случаев предусмотренных действующим законодательством выявление хищений...
26081. Горизонтальный, вертикальный и трендовый анализ баланса 28 KB
  Изменение удельного веса отдельных статей позволяет отслеживать и прогнозировать структурные изменения в составе активов и их источников покрытия. Анализ динамики валюты баланса структуры активов и пассивов организации позволяет сделать ряд важных выводов необходимых как для осуществления текущей финансовохозяйственной деятельности так и для принятия управленческих решений на перспективу. Исследование изменения структуры активов организации позволяет получить важную информацию. Так увеличение доли оборотных средств в имуществе может...
26082. Государственная поддержка малых форм хозяйствования в аграрном секторе 33 KB
  Малые формы хозяйствования на селе без поддержки государства и без собственного внутригруппового взаимодействия не всегда способны успешно противостоять в конкурентной борьбе крупному капиталу отстаивать свои экономические политические и социальные интересы поэтому формирование системы государственной поддержки малых форм хозяйствования на селе является одним из ключевых моментов в решении задач агропродовольственной политики. Главным принципом государственной поддержки малых форм хозяйствования является создание экономических и правовых...
26083. Государственное регулирование экономики: необходимость, сущность, объекты, цели, методы 31 KB
  Особая роль государства в развитии аграрной сферы объективно обусловлена рядом причин. Таким образом активная аграрная политика государства является необходимым условием нормального развития сельского хозяйства в любой стране. Из этой главной двуединой задачи государства в области сельского хозяйства вытекает целый ряд более конкретных задач которые также носят долговременный стратегический характер: содействие научнотехническому прогрессу и росту эффективности производства в сельском хозяйстве; поддержание эквивалентности в...
26084. Органы управления финансами в Российской Федерации 64.5 KB
  Депутаты обеих палат Федерального Собрания Российской Федерации рассматривающие и утверждающие проект закона о федеральном бюджете и отчете о его исполнении другие финансовые и связанные с ними законодательные акты правительственные программы могут обладая правом законодательной инициативы вносить на рассмотрение проекты финансовых законодательных актов поправки в действующее законодательство. Государственная Дума заслушивает отчет Правительства Российской Федерации об исполнении федерального бюджета. Государственная Дума и Совет...