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


 

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

50127. Методи послідовного пошуку екстремуму у критеріальному моделюванні 630.34 KB
  Крім того, критеріальний метод має важливе методологічне значення в процесі дослідження. Він надає техніко-економічному аналізу оптимальних рішень узагальнювальний характер і дозволяє більш раціонально використовувати вихідну інформацію...
50128. Визначення горизонтальної й вертикальної складових індукції магнітного поля Землі за допомогою земного індуктора 176 KB
  Визначення горизонтальної й вертикальної складових індукції магнітного поля Землі за допомогою земного індуктора. Вертикальну площину в якій лежить вектор а отже й вісь магнітної стрілки називають площиною магнітного меридіану. Прилад під'єднаний до затискачів мілівеберметр або балістичний гальванометр можна проградуювати так щоб він безпосередньо показував зміну магнітного потоку який пронизує витки індуктора. Нехай вісь індуктора орієнтована горизонтально в площині магнітного меридіана площина витків теж горизонтальна.
50129. Исследование процессов накопления и релаксации заряда в диэлектрических материалах 1.32 MB
  Определение постоянной времени RCцепи. Даже если цепь не содержит конденсаторов всегда присутствует электрическая емкость изоляции и в ней возникают токи смещения обусловленные изменением электрического поля во времени. В цепях постоянного тока распределение электрических зарядов на проводниках и токов на участках цепи стационарно то есть неизменно во времени. Если на какомто участке цепи происходят изменения силы тока или напряжения то другие участки цепи могут почувствовать эти изменения только через некоторое время которое по...
50130. Определение коэффициента термического расширения (объемного) жидкости 116 KB
  Цель работы: 1 измерить изменение объема воды при нагреве ее от 0 С до 90 С; 2 определить показатель коэффициента термического расширения. Особенный интерес представляет поведение воды в диапазоне температур 0 10 С. В данной работе исследуется изменение объема воды в диапазоне температур от 0 С до 40 90 С максимальная температура ограничена длиной измерительной трубки. Для проведения измерений в интервале 0 20 С термостат в начале работы заполняется смесью льда и воды что обеспечивает начальную температуру 0 С.
50131. ОПРЕДЕЛЕНИЕ ПОКАЗАТЕЛЯ ПРЕЛОМЛЕНИЯ ПЛОСКОПАРАЛЛЕЛЬНОЙ ПЛАСТИНЫ С ПОМОЩЬЮ МИКРОСКОПА 160 KB
  Углы падения отражения и преломления отсчитываются от нормали к границе раздела двух сред ON. Направления этих лучей определяются следующими законами геометрической оптики: луч падающий АО луч отраженный ОВ луч преломленный ОД и нормальON восстановленная в точке падения О лежат в одной плоскости; угол отражения NOB численно равен углу падения ON; синус угла падения i относится к синусу угла преломления r как скоростьсвета в первой среде υ1 относится к скорости света во второй среде υ2. 1 Последний закон в оптике известен как...
50132. Тактика гри у футболі. Індивідуальні, групові і командні дії в нападі і захисті 27.5 KB
  Індивідуальні групові і командні дії в нападі і захисті. Система гри - це основний спосіб гри команди який визначає особливості розташування і пересування гравців у захисті і нападі для досягнення успіху в матчі. Гра в захисті й нападі вимагає від гравців оперативного розвязання ігрових ситуацій використання різноманітних тактичних засобів. Тактика гри у футбол реалізується в індивідуальних групових і командних діях у нападі й захисті.
50134. ВЕРОЯТНОСТНО-ЭКОНОМИЧЕСКИЙ МЕТОД РАСЧЕТА СТАЛЬНЫХ КОНСТРУКЦИЙ 172.5 KB
  Принципиальное отличие этого метода от заложенного в нормы метода расчета по предельным состояниям состоит в том что в расчет вводится не нормативные или расчетные значения нагрузок и прочностных свойств конструкционных материалов а СТАТИСТИЧЕСКИЕ ХАРАКТЕРИСТИКИ их распределений СРЕДНИЕ ЗНАЧЕНИЯ И КОЭФФИЦИЕНТЫ ВАРИАЦИИ. Коэффициент надежности по ответственности не используется. Таблица 1 Статистические характеристики давления ВЕТРА Ветровой район Среднее значение давления ветра кПа кг м2 Коэффициенты вариации Vf k = qo I II III IV...
50135. ОПРЕДЕЛЕНИЕ ОТНОШЕНИЯ ТЕПЛОЕМКОСТЕЙ ГАЗА МЕТОДОМ КЛЕМАНА-ДЕЗОРМА 92.5 KB
  Основные теоретические положения к данной работе основополагающие утверждения: формулы схематические рисунки: Введение Первый закон термодинамики утверждает что количество теплоты DQ сообщенное газу расходуется на изменение внутренней энергии газа DU и на работу А совершаемую газом: DQ = DU . Теплоемкостью газа называется величина равная количеству теплоты необходимой для нагревания данной массы газа на один кельвин. T0...