68650

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

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

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

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

Русский

2014-09-24

77 KB

2 чел.

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

Тема: Использование функций для работы с массивами

Цель занятия:

  •  Совершенствование навыков разработки программ в среде программирования MS Visual C++
  •  Совершенствование навыков описания и использования функций в программах
  •  Получение начальных навыков в использовании функций для работы с массивами

Время на выполнение работы: 2 часа

Учебные вопросы:

  1.  Изучение процедуры передачи массива в функцию
  2.  Изучение процедуры возвращения массива из функции

Подготовка к выполнению работы:

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

Материалы для подготовки к занятию:

  1.  Конспект лекций
  2.  [1] стр. 78-80.


ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

На прошедших занятиях подробно рассматривались вопросы использования массивов для решения прикладных задач. Было отмечено, что массивы являются первым шагом к группировке данных. Массивы группируют однотипные данные. На лекции по функциям было показано, что использование механизма функций позволяет сделать программы более эффективными и читаемыми. Так же известно, что в функцию можно передать множество параметров, но, при этом, каждый параметр должен быть объявлен самостоятельно. Здесь возникает одна из кажущихся, на первый  взгляд, трудностей. Ведь элементов в массиве могут быть сотни, и представляется нереальным (хотя и теоретически возможным) описать при передаче в функцию каждый элемент массива.

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

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

int PositivSum(int *a, int n);

int main(int argc, char* argv[])

{

const int N=10;

int Arr1[N], Arr2[N];

int sum1=0,sum2=0;

randomize();

cout<<”\nПервый массив:\n”;

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

       {

       Arr1[i]=rand()%100-50;

       cout<<Arr1[i]<<"  ";

       }

cout<<”\nВторой массив:\n”;

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

       {

       Arr2[i]=rand()%100-50;

       cout<<Arr2[i]<<"  ";

       }

sum1=PositivSum(Arr1,N);

sum2=PositivSum(Arr2,N);

cout<<"\nСумма положительных элементов

                     первого массива: "<<sum1;

cout<<"\nСумма положительных элементов второго массива: "<<sum2;

if (sum1==sum2) cout<<"\nСуммы равны!";

   else if (sum1>sum2) cout<<"\nПервая сумма больше";

        else cout<<"\nВторая сумма больше";

return 0;

}

//-----------------------------------------------------

int PositivSum(int *a, int n)

{

int sum=0;

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

       if (a[i]>0) sum+=a[i];

return sum;

}  

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

int PositivSum(int *a, int n);

можно записать:

int PositivSum(int a[], int n);

что тоже говорит о том, что в качестве параметра передается имя массива, то есть адрес начала массива.

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

...

int PositivSum(int *a, int n);

int* InputData(const int n);

int main(int argc, char* argv[])

{

const int N=10;

int sum1=0,sum2=0;

int *Arr1, *Arr2;

Arr1=InputData();

Arr2=InputData();

...

_getch();

return 0;

}

//-----------------------------------------------------

int* InputData(const int n)

{

int a[n];

cout<<”\nМассив:\n”;

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

       {

       a[i]=rand()%100-50;

       cout<<a[i]<<"  ";

       }

_getch();

return a;

}

...

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

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

Вместо 

int a[n] 

требуется 

int *a=new int[n];.

В этом случае при выходе из функции динамическая память не теряется и программа будет работать правильно. Но для того, чтобы она работала корректно, необходимо перед завершением функции main() освободить динамическую память:

 delete []Arr1;

 delete []Arr2;

 

ПРОГРАММА  РАБОТЫ

 Реализовать с использованием механизма функций в соответствии с номером по журналу и номером варианта:

Вариант 1

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  •  сумму отрицательных элементов массива;
  •  произведение элементов массива, расположенных между максимальным и минимальным элементами.

Вариант 2

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  •  сумму положительных элементов массива;
  •  произведение элементов массива, расположенных между максимальным по модулю и минимальным по модулю элементами.

Вариант 3

В одномерном массиве, состоящем из n целых элементов, вычислить:

  •  сумму элементов массива, расположенных между первым и последним нулевыми элементами.
  •  Преобразовать массив таким образом, чтобы сначала располагались все положительные элементы, а потом – все отрицательные (элементы, равные 0, считать положительными).

Вариант 4

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  •  сумму элементов массива с нечетными номерами;
  •  Сжать массив, удалив из него все элементы, модуль которых не превышает 1. Освободившиеся в конце массива элементы заполнить нулями.


Вариант 5

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  •  максимальный элемент массива;
  •  сумму элементов массива, расположенных до последнего положительного элемента.

Вариант 6

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  •  минимальный элемент массива;
  •  сумму элементов массива, расположенных между первым и последним положительными элементами.

Вариант 7

В одномерном массиве, состоящем из n целых элементов, вычислить:

  •  номер максимального элемента массива;
  •  Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в нечетных позициях, а во второй половине – элементы, стоявшие в четных позициях.

Вариант 8

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  •  сумму элементов массива, расположенных между первым и вторым отрицательными элементами.
  •  Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает 1, а потом – все остальные.

Вариант 9

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  •  максимальный по модулю элемент массива;
  •  Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.

Вариант 10

В одномерном массиве, состоящем из n целых элементов, вычислить:

  •  минимальный по модулю элемент массива;
  •  сумму модулей элементов массива, расположенных после первого элемента, равного нулю.

Вариант 11

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  •  номер минимального по модулю элемента массива;
  •  сумму модулей элементов массива, расположенных после первого отрицательного элемента.

Вариант 12

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  •  номер максимального по модулю элемента массива;
  •  сумму элементов массива, расположенных после первого положительного элемента.

Вариант 13

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  •  количество элементов массива, лежащих в диапазоне от А до В;
  •  сумму элементов массива, расположенных после максимального элемента.

Вариант 14

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  •  количество элементов массива, равных 0;
  •  сумму элементов массива, расположенных после минимального элемента.

Вариант 15

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  •  количество элементов массива, больших С;
  •  Преобразовать массив таким образом, чтобы сначала располагались все отрицательные элементы, а потом — все положительные (элементы, равные 0, считать положительными).


 

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

36465. Трансформация социально-политических отношений в рамках индустриальной цивилизации 46.5 KB
  Средоточием политической власти является государство опирающееся на систему правовых норм органы власти и управления армию аппарат идеологического воздействия на свою экономическую силу. когда впервые по приговору парламента был казнен король как символ абсолютной власти. Восстановившаяся после власти Кромвеля монархия получила чисто представительские полномочия. Провозглашение императором Наполеона восстановившего ряд признаков абсолютной власти имело иную социальную подоплеку: это была форма диктатуры победившей буржуазии.
36467. Утверждение капитализма в России 53.5 KB
  промышленный переворот в России начался позднее чем в Западной Европе только в 30 – 40е гг. Витте один из крупнейших преобразователей в истории России занимал пост министра финансов с 1892 по 1903 гг. Открытие России иностранным капиталом произошло в 50е гг.
36468. Мировые войны и кризис индустриального общества 46.5 KB
  германские войска в конечном счете потерпели тяжелое поражение и правительство Германии обратилось к США с предложением о перемирии. Но еще до подписания перемирия в Германии началась революция. Этот кризис способствовал обострению внутриполитической ситуации в Германии Италии и Испании что привело к возникновению в этих странах фашистских партий захвативших власть в 192030 гг.
36470. Основные прогнозируемые характеристики постиндустриальной цивилизации 31 KB
  Человек: Произойдут изменения в численности населения. 2 Благодаря планированию семьи повышается образовательный уровень и рост уровня жизни темпы роста населения стабилизируются. Сократится разрыв между странами а в обществе сильно вырастит доля пожилого населения но и в этом случае нагрузка на ресурсы будет чрезмерной. В этом случае стабилизация численности населения позволит вкладывать больше средств в производство и улучшения качества жизни.
36471. Глобальные риски в рамках перехода к постиндустриальной цивилизации 31.5 KB
  Эти проблемы ресурсноэкономические 2 демографические 3мирохозяйственные проявляются через кризисы в том числе в области здравоохранения образования культуры в растущей преступности что позволяет многим ученым говорить о глобальном кризисе цивилизации.Среди ученых нет единства во взглядах на перспективы современной цивилизации на ее способность решить угрожающие ей противоречия. Опираясь на исторический опыт многие из них справедливо полагают что возможен вариант гибели современной цивилизации В качестве основы для столь...
36472. Древняя Греция 36.5 KB
  – ранняя Греция возникают общества разделенные на классы Архаическим периодом в истории Греции обычно называют VIII – VI вв. По мнению некоторых исследователей это время наиболее интенсивного развития античного общества. Действительно в течение трех столетий были сделаны многие важнейшие открытия определившие характер технической основы античного общества развились те социальноэкономические и политические явления которые придали античному обществу определенную специфику по сравнению с другими рабовладельческими обществами:...
36473. Древний Египет 29 KB
  групп перед властью Моноотраслевая экономика всегда ведет к жесткой политической системе с одним центром силы Главное достижение – появление профессиональной армии Межгосударственная дипломатия – появление письменных договоров мир на вечные времена Единое централизованное государство – главное в политике Духовная жизнь Агрокультурный календарь Развитие государства и налоговой базы обеспечение финансовой системы государства а затем и бюрократической появление письменности Наука эмпирическая – путем наблюдения теоретическая...