Циклы. Инициализация массива размерности n случайными целыми положительными значениями от 0 до 32767, страница 6

static long A[n]={10, 7, 2, 19};

unsigned maxnum =0, num2;

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

{num2=NUM(A[i]);   //передача функции элемента массива                                            

if (num2 > maxnum)   maxnum=num2;   //нахождение максимума

}

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

if (NUM(A[i]) ==maxnum)  cout << A[i] << “ “;

getch();

return 0;

}

unsigned NUM(int a)      //функция находит количество единиц                                          //в двоичном представлении целого числа

{ unsigned num=0;

while (a)

{num+=a%2;

a /=2;

}

return num;

}

Массив как возвращаемое значение

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

#include <iostream.h>                          

int *fusion (int n, int* a, int m, int*b);

main()

{const int n=5;

const int m=4;

static int  c[n]={1, 3, 5, 7, 9};

static int d[m]= {0, 2, 4, 5};

int *h;                               //указатель на массив с результатом

h= fusion (n, c, m, d);    // вызов функции fusion слияния двух массивов  for (int i=0; i<n+m; i++)   //вывод результирующего массива

cout << "   " << h[i];

cout << endl;

delete [] h;                         //освобождение памяти, занимаемой массивом с результатом

return 0;

}

int*fusion (intn, int* a, intm, int*b)

{int *x=newint[n+m];  //выделение памяти под массив с результатом

int ia=0, ib=0, ix=0;

while (ia<n && ib<m)    //цикл до конца одного из массивов

if (a[ia] > b[ib] )  x[ix++] = b[ib++];

else x[ix++]= a[ia++];

if (ia >=n)                 // массив a[ ] переписан

while (ib<m) x[ix++]=b[ib++];

else                           //переписан массив b[ ]

while (ia<n) x[ix++]=a[ia++];

return (x);

}

Пример функции, формирующей ссылку как результат своей работы.

Функция определяет ссылку на элемент массива с максимальным значением:

#include <iostream.h>

int& rmax(int n, int d[]) ;

void main ()

{ const int n=4;

static int x[ ] = { 10, 20, 30, 14};

cout << “\n rmax(n, x) = ” << rmax(n, x);    //определение максимального элемента

cout << endl;

rmax(n, x) = 0;             // «левосторонний »вызов функции позволяет занести 0 в x[2],                                            //являющийся максимальным элементом массива

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

cout << “   x[” << i << “] = ”  <<x[i];

cout << endl;

}

int& rmax(int n, int d[])

{ int im=0;

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

im=d[im] >d[i] ? im : i;

return d[im];

}

Результат работы программы:

rmax(n, x) = 30

x[0] = 10   x[1] = 20   x[2] = 0   x[3] = 14

Второй вызов функции находится в левой части оператора присваивания, что было бы совершенно недопустимо для С.

Проверка значений массива на упорядоченность (по возрастанию)

#include <iostream.h>

bool proverka (double*, int) ;

void vvod_array  (double*, int );

const int n=5;

main ()

{static double  X[n];

vvod_array  (X, n);                           //вызов функции ввода элементов массива

cout << proverka(X, n) << endl;

return 0;

}

voidvvod_array  (double *array, intk)    //функция ввода элементов массива

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

cin >> array[i];

}

bool proverka (double *X, int n)

{bool t= X[0] < X[1];

for (int i=2; i<n; i++)

{t=t && (X[i-1] < X[i]);

if ( !t) break ;

}

return t ;

}

Нахождение среднего значения элементов массива

//1. доступ к элементам массива по индексу

#include <stdio.h>              

#include <stdlib.h>