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


 

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

8010. Зміст освіти в національній школі 22.64 KB
  Зміст освіти в національній школі. Наукові основи визначення змісту освіти та шляхи його вдосконалення відповідно до Законів України Про освіту, Про загальну середню освіту У Законах України Про освіту, Про загальну середню освіту, у Національ...
8011. Характеристика навчальних планів, програм і підручників національної школи 21.08 KB
  Характеристика навчальних планів, програм і підручників національної школи Основним джерелом змісту освіти на державному рівні є такі документи: навчальний план школи, освітні стандарти, предметні програми, підручники. Шкільні навчальні плани. У шкі...
8012. Зміст освіти зарубіжної школи 15.94 KB
  Зміст освіти зарубіжної школи Проблема змісту навчання є однією зі стрижневих у теорії та практиці навчання в зарубіжній педагогіці. Уявлення про зміст освіти в зарубіжних школах дає середньостатистичне співвідношення предметів у навчальному плані. ...
8013. Педагогический коллектив в школе. Аттестация педагогических кадров 31 KB
  Педагогический коллектив в школе. Аттестация педагогических кадров. Цель аттестации - создание эффективной системы дифференцированной оценки и оплаты труда работников образования, стимулирование их профессионального роста, непрерывн...
8014. Аттестация педагогических кадров 45.5 KB
  Аттестация педагогических кадров Профессионализм педагога - решающий фактор обеспечения качества образования. АПК стимулирует рост педагога как профессионала, повышает продуктивность педагогического труда. Готов ли сегодняшний учитель раб...
8015. Управление современной школой 37.5 KB
  Управление современной школой Управление школой - научно обоснованные действия администрации и педагогов, направленные на рациональное использование времени и сил преподавателей и учащихся в учебно-воспитательном процессе с целью углубленного и...
8016. Психология компьютерных игр 16.94 KB
  Психология компьютерных игр. Понятие игры в современной психологии. Классификация компьютерных игр. Психологические особенности компьютерных игр. Психологические последствия игровой компьютерной деятельности. Шиллер. Игра связана с духовной сущность...
8017. Завантаження операційної системи (ОС) 1.58 MB
  Тема роботи: Завантаження операційної системи (ОС) Мета роботи: Вивчити механізм завантаження операційної системи Windows, можливі варіанти завантаження ОС. Тип комп’ютера Настільній ПК Ім’я комп’ютера 51f1ddfeb154437. Ім’я робоч...
8018. Файл boot.ini. Системне програмування 828 KB
  Тема роботи: Файл boot.ini Мета роботи: Вивчити структуру файлу boot.ini, призначення його параметрів, навчитись редагувати даний файл Характеристика робочого місця (заповнюється обовязково): Тип компютера Настільній ПК Ім’я комп