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, считать положительными).


 

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

29149. Залог (понятие, виды) 26 KB
  Залог кредитор по обеспеченному залогом обязательству залогодержатель имеет право в случае неисполнения должником этого обязательства получить удовлетворение из стоимости заложенного имущества преимущественно перед другими кредиторами лица которому принадлежит это имущество залогодателя. Возникает залог в силу: Закона Договора. Виды залога: 1 ипотека – залог земельных участков предприятий зданий сооружений квартир и другой недвижимости. 2 твердый залог – это залог по которому предмет залога остается у залогодателя с наложением...
29151. Основные права и обязанности сторон при залоге 30.5 KB
  Права залогодателя: требовать досрочного прекращения залога если залогодержатель не застраховал не принял мер необходимых для сохранности; требовать возмещения убытков причиненных утратой или повреждением предмета залога переданного залогодержателю; отказаться от предмета залога и потребовать возмещения за его утрату; заменять предмет залога с согласия залогодержателя; пользоваться предметом залога в соответствии с его назначением в том числе извлекать из него плоды и доходы; с согласия залогодержателя распоряжаться предметом...
29152. Обращение взыскания на заложенное имущество 25 KB
  По общему правилу требования залогодержателя удовлетворяются из стоимости заложенного недвижимого имущества по решению суда. Без обращения в суд это можно сделать на основании нотариально удостоверенного соглашения залогодержателя с залогодателем заключенного после возникновения оснований для обращения взыскания на предмет залога. В отличие от этого за счет заложенного движимого имущества требования залогодержателя обычно удовлетворяются по решению суда лишь если иное не предусмотрено соглашением залогодателя с залогодержателем.
29153. Реализация заложенного имущества 26.5 KB
  Реализация заложенного имущества. Реализация продажа заложенного имущества на которое обращено взыскание осуществляется в порядке установленном законом об ипотеке или законом о залоге если иное не предусмотрено законом. Если сумма вырученная при реализации заложенного имущества недостаточна для покрытия требования залогодержателя он имеет право при отсутствии иного указания в законе или договоре получить недостающую сумму из прочего имущества должника не пользуясь преимуществом основанным на залоге. Если сумма вырученная при...
29154. Прекращение залога 25 KB
  Залог – способ обеспечения обязательства при котором кредитор залогодержатель приобретает право в случае неисполнения должником обязательства получить удовлетворение за счет заложенного имущества. Залог прекращается: 1 с прекращением обеспеченного залогом обязательства; 2 по требованию залогодателя; 3 в случае гибели заложенной вещи или прекращения заложенного права если залогодатель не воспользовался правом; 4 в случае реализации продажи заложенного имущества в целях удовлетворения требований залогодержателя. При прекращении залога...
29155. Поручительство 25.5 KB
  По договору поручительства поручитель обязывается перед кредитором другого лица отвечать за исполнение последним его обязательства полностью или в части. Договор поручительства может быть заключен также для обеспечения обязательства которое возникнет в будущем. Договор поручительства должен быть совершен в письменной форме. Несоблюдение письменной формы влечет недействительность договора поручительства.
29156. Прекращение поручительства 25.5 KB
  Поручительство поручитель обязывается перед кредитором другого лица отвечать за исполнение последним его обязательства полностью или в части. Поручительство прекращается с прекращением обеспеченного им обязательства в случае изменения этого обязательства влекущего увеличение ответственности или иные неблагоприятные последствия для поручителя без согласия последнего с переводом на другое лицо долга по обеспеченному поручительством обязательству если поручитель не дал кредитору согласия отвечать за нового должника. если кредитор в...
29157. Банковская гарантия 27 KB
  В силу банковской гарантии банк иная кредитная или страховая организация гарант дают по просьбе другого лица принципала письменное обязательство уплатить кредитору принципала бенефициару в соответствии с условиями даваемого гарантом обязательства денежную сумму по представлении бенефициаром письменного требования о ее уплате. По получении требования бенефициара гарант должен без промедления уведомить об этом принципала и рассмотреть приложенные к требованию документы. Решив отказать в удовлетворении требования гарант обязан немедленно...