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>
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.