68650

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

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

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

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

Русский

2014-09-24

77 KB

3 чел.

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


 

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

45633. PR-консалтинг в кризисных ситуациях 27.5 KB
  Подход к организации с т. Свойство эмерджентности несовпадение целей организации с целями входящих в нее частей. Кризисный PR специальная коммуникационная технология направленная на сохранение паблицитного капитала организации или персоны который разрушается вследствие реального или нереального кризиса. Далее информационное использование кризиса на благо организации.
45634. Кризисный PR 34.5 KB
  В PR-сопровождение входит комплекс исследований стартовой ситуации разработка стратегии кампания в СМИ работа с элитами достижение лояльности органов власти юридическое сопровождение. Информационные войны Конкуренция на рынке между бизнес-структурами зачастую приводит к кампаниям в СМИ с целью дискредитации конкурента в глазах потребителей или делового сообщества. Мы специализируемся на выстраивании линии защиты в информационном поле проведении медийных кампаний по возвышению имиджа или репозиционированию клиента блокировании действий...
45635. Деловые переговоры как форма PR-деятельности 33.5 KB
  При проведении переговоров важно какую стратегию вы выберете: 1 стратегия выигрыша я выигрываю всегда в любой ситуации такому человеку можно как проиграть так и выиграть выигрыш проигрыш выи. Часто такая стратегия краткосрочна сиюминутна. Стратегия выигрышпроигрыш Этот подход означает: Будет так как решу я. Стратегия выигрышпроигрыш жесткая стратегия ведения переговоров с явно выраженным стремлением одной стороны добиться преимуществ за счет интересов другой.
45636. Деловая переписка в деятельности ПР-специалиста. Техника составления различных типов деловой корреспонденции 28.5 KB
  Избегать длинных слов ненужных повторов короткие предл. мин слов и т. Слова упак.логика посколькипостольки а не тогда; если что; позитивность нельзя использовать отрицательные слова и частицы найти синоним позитивн.