Массивы в качестве аргументов функций.




Решение.

Пусть функция DigitN(K,N) уже есть. тогда обращение к ней можно использовать там, где допустимы объекты целого типа (функция DigitN(K,N) целого типа. т.е. она возвращает значение целого типа, например, int)

можно так:

int i;

i= DigitN(34,4);

или так:

double b;

b= DigitN(34,4)/2+10;

или так:

cout << DigitN(25,1);

и т.д.

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

 

#include <iostream>

using namespace std;

 

int DigitN(int, int);

 

int main () {

int k1,k2,k3,k4,k5;

k1=342;

k2=7;

k3=57764;

k4=9872;

k5=22222;

cout << DigitN(k1,1) << endl;

cout << DigitN(k2,2) << endl;

cout << DigitN(k3,3) << endl;

cout << DigitN(k4,4) << endl;

cout << DigitN(k5,5) << endl;

return 0;

}

int DigitN(int k, int n){

cout << "Внутри DigitN: k = " << k << " n = " << n << endl;

return 0;

}

 

Теперь можно приступить к программированию функции. Разумеется, необходимо прежде составить алгоритм!

int DigitN(int k, int n){

int s;

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

if (k==0) return -1;

s=k%10;

k/=10;

}

return s;

}


Массивы

До сих пор мы составляли алгоритмы, в которых объем хранимой информации был невелик. Количество переменных, которые мы использовали, не превышало десятка. А как быть, если необходимо работать с сотней, тысячей чисел или значений другого типа.

Если с группой величин одинакового типа требуется выполнять однообразные действия, им дают одно имя, а различают по порядковому номеру (индексу). Это позволяет компактно записывать множество операций с помощью циклов.

Конечная именованная последовательность однотипных величин называется массивом.

Перед использованием массив необходимо объявить.

int a[25];

a – массив из 25 элементов типа int.

Как и в случае обычных переменных, объявление массива начинается с указания типа данных, после чего следует имя массива и пара квадратных скобок, заключающих константное выражение, которое определяет размер массива. Внутри квадратных скобок может стоять только константа, но не имя переменной, чтобы компилятор точно знал, какой объем памяти резервировать. Таким образом, размер массива должен быть известен заранее и не может быть изменен в ходе выполнения программы.

В С++ нумерация элементов массива начинается с нуля. Поэтому массив a состоит из элементов:

a[0], a[1], a[2], …,a[24]

Объявляя массив, можно сразу его инициализировать (присвоить начальные значения его элементам).

double b[5]={3.0, 23.25, 4.3, 5, 12};

или так:

int c[]={23,3,14,5,12,1,2}; //массив из семи элементов

Но такой способ инициализации удобен только для небольших массивов. Большие массивы инициализируют в процессе выполнения программы — путем записи данных в массив.

 

Чтобы получить значение, хранящееся в простой переменной, достаточно обратиться к этой переменной по имени. Элементы массива отдельных имен не имеют. К ним обращаются, используя имя массива, после которого в квадратных скобках указывают индекс элемента.

 

Отдельные элементы массива m, объявленного как

T m[size]

могут использоваться там, где допустимо использование объектов типа T.

Например:

int a[5]={1,2,3,4,5};

int b;

a[0]=400;

b=a[3]+a[4]*5;

int i=4;

a[i]=100;

a[i-2]=200;

 

Если для всех элементов массива необходимо проделать однотипные действия, используют конструкцию цикла.

 

Ниже приведен пример заполнения массива квадратами целых чисел и вывода их на экран.

int m[25];

for (int i=0; i<25; i++){

m[i]=i*i;

}

for (int i=0; i<25; i++){

cout << m[i] << " ";

}

 

Если теперь нам понадобится изменить размерность массива с 25, скажем, на 50. Нам придется менять приведенную выше программу в трех местах.

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

const int size_m = 25;

int m[size_m];

for (int i=0; i<size_m; i++){

m[i]=i*i;

}

for (int i=0; i<size_m; i++){

cout << m[i] << " ";

}

Важное замечание!

Компилятор С++ никак не контролирует ситуацию выхода за границы массива! Этот контроль возложен на программиста!

Следующий фрагмент программы ошибки компилятора не вызовет:

int m[ 5 ];

for (int i=0; i< 10; i++){

m[i]=i*i;

}

for (int i=0; i< 10; i++){

cout << m[i] << " ";

}

Но вывод программы будет некорректен. А при ее выполнении могут быть непроизвольно изменены значения других переменных, и выполнение программы может завершиться крахом из-за того, что в ней есть обращения за пределы массива

 

Массивы в качестве аргументов функций.

Как и другие переменные, массивы могут передаваться функциям в качестве аргументов.

НО! Если в качестве аргумента функции используется массив, то в функцию будет передаваться адрес первого элемента массива. Из этого следует, что присваивание элементу массива, являющегося аргументом, изменяет значение элемента самого массива. Другими словами, массивы отличаются от других типов тем, что их нельзя передать по значению. Массивы всегда передаются по ссылке.

Размер массива неизвестен в вызываемой функции. Приходится передавать его через дополнительный аргумент.

 

В следующем примере функция sumArray вычисляет сумму элементов массива.

#include <iostream>

using namespace std;

 

int sumArray(int[], int);

 

int main () {

const int size_m = 5;

int m[size_m];

for (int i=0; i<size_m; i++){

m[i]=i;

}

for (int i=0; i<size_m; i++){

cout << m[i] << " ";

}

cout << "\nСумма = " << sumArray(m, size_m) << "\n";

return 0;}

 

int sumArray(int arr[], int n){

int s=0;

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

s+=arr[i];

}

return s;

}

 

Следующий пример демонстрирует, что аргумент-массив всегда передается по ссылке.

#include <iostream>

using namespace std;

 

void squareArray(int arr[], int n){

for (int i=0; i<n; i++) arr[i]=arr[i]*arr[i];

}

 

int main () {

const int size_m = 5;

int m[size_m];

for (int i=0; i<size_m; i++){

m[i]=i;

}

cout << "Начальный массив: \n";

for (int i=0; i<size_m; i++){

cout << m[i] << " ";

}

squareArray(m, size_m);

cout << "\nКонечный массив: \n";

for (int i=0; i<size_m; i++){

cout << m[i] << " ";

}

return 0;

}

 


Задачи.

1. Задать целочисленный массив длины n, заполнив его случайными целыми числами из интервала [-15; 5]. Подсчитать кол-во положительных чисел в нем.

2. Дан целочисленный массив длины n. Найти сумму элементов массива.

3. Дан массив из нулей и единиц длины n. Подсчитать кол-во нулей.

4. Дан массив из n целых чисел. Найти сумму чисел, стоящих на четных местах.

5. Дан массив из n целых чисел. Подсчитать кол-во четных чисел в нем.

6. Сформировать массив из 50 элементов: 1, 3, 5, … 49, 50, 48, 46, … 2.

7. Целое число М задано массивом своих двоичных цифр. Напечатать массив двоичных цифр числа М+1.

8. Дан целочисленный массив длины n. Определить, образуют ли элементы этого массива неубывающую последовательность.

9. Дан целочисленный массив длины n. Найти сумму элементов массива, предшествующих первому отрицательному элементу

10. Дано 100 целых чисел. Распечатать их в обратном порядке по 10 чисел в строке.

11. Дано 100 целых чисел. Напечатать сначала все отрицательные из них, а затем все остальные.

12. По заданным вещественным числам n, a0, a1, … an, t вычислить значение многочлена
anxn + an-1xn-1 + … + a1x + a0 и его производной в точке t.

13. Дан целочисленный массив длины n. Расположить его элементы в обратном порядке;

14. Дан целочисленный массив длины n. Сдвинуть его элементы циклически на одну позицию влево.

15. Дан целочисленный массив длины n и целое число x. Выяснить, встречается ли x среди элементов массива.

16. Дан целочисленный массив длины n и целое число x. Выяснить, сколько элементов массива имеют значение равное x.

17. Дан целочисленный массив длины n. Найти максимальный и минимальный элементы и их индексы.

18. Дан целочисленный массив длины n. Найти максимальный и минимальный по модулю элементы.

19. Дан целочисленный массив длины n. Найти наименьший положительный элемент.

20. Дан целочисленный массив длины n. Найти наибольший отрицательный элемент.

21. Дан целочисленный массив длины n. Найти второе по величине число.

22. Дан целочисленный массив длины n. Упорядочить его элементы по возрастанию.

23. Дан целочисленный упорядоченный массив длины n и целое число x. Выяснить, встречается ли x среди элементов массива.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: