C++. Использование указателей в качестве аргументов функции

В C++ указатели можно использовать в качестве аргументов функций. Так, если в роли параметра функции выступает массив, то в функцию передается указатель на его первый элемент. Получается автоматическая передача массива в функцию, используя его адрес. В результате, вызываемые функции могут изменять значения элементов в исходных массивах и возвращать их в главную функцию. Информация о количестве элементов массива должна передаваться через отдельный параметр.

Задача

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

Решение

Понятно, что алгоритм решения этой задачи без применения функции будет очень громоздким. Разобьем задачу на подзадачи:

  • вычисление среднего арифметического элементов массива;
  • определение простого числа;
  • удаления элемента из массива;
  • упорядочивание массива;

Прототипы функций, которые предназначены для решения подзадач, могут выглядеть так:

  • float sr_arifm(int *x, int n) — вычисляет среднее арифметическое массива x из n элементов (рис. ниже)

Функции в указателях. Kvodo.ru

  • bool prostoe(int n) — проверяет, является ли целое n простым, результат логическое значение true, если число простое, и false в противном случае (рис. ниже);

Функции в указателях. Kvodo.ru

  • void udal(int *x, int m, int*n) — удаляет элемент с номером m в массиве x из n элементов (рис. ниже)

Указатели

  • void upor(int *x, int N, bool pr=true) — сортирует массив x из n элементов по возрастанию или по убыванию, направление сортировки зависит от значения параметра pr, если pr=true, то выполняется сортировка по возрастанию, иначе по убыванию.

Вот так будет выглядеть текст программы:

#include "stdafx.h"
#include <iostream>
using namespace std;
//функция вычисления среднего значения
float sr_arifm(int *x, int n)
{
int i; float s=0;
for (i=0; i<n; s+=x[i], i++);
if (n>0) return (s/n);
else return 0;
}
//функция для определения простого числа
bool prostoe(int n)
{
bool pr; int i;
for (pr=true, i=2; i<=n/2; i++)
if (n%i==0) {pr=false; break;}
return (pr);
}
//функция удаления элемента из массива
void udal (int *x, int m, int *n)
{
int i;
for (i=m; i<*n-1; *(x+i)=*(x+i+1), i++);
-*n;
realloc((int *)x, *n*sizeof(int));
}
//функция сортировки массива
void upor(int *x, int n, bool pr=true)
{
int i, j, b;
if (pr)
{
for (j=1; j<=n-1; i++)
for(i=0; i<=n-1-j; i++)
if (*(x+i)>*(x+i+1))
{
b=*(x+i);
*(x+i)=*(x+i+1);
*(x+i+1)=b;
}
}
else for (j=1; j<=n-1; j++)
for(i=0; i<=n-1-j; i++)
if (*(x+i)<*(x+i+1))
{
b=*(x+i);
*(x+i)=*(x+i+1);
*(x+i+1)=b;
}
}

int main()
{
int *a, n, i; float sr;
cout<<"n="; cin>>n; //вывод рзмерности массива
a=(int *)calloc(n, sizeof(int)); //выделение памяти
cout<<"Vvedite massiv A \n";
for (i=0; i<n; i++) //ввод массива
cin>>*(a+i);
sr=sr_arifm(a, n); //вычисление среднего арифметического
cout<<"sr="<<sr<<"\n"; //вывод среднего арифметического
for (i=0; i<n;)
{
if (prostoe(*(a+i))&& *(a+i)<sr) //если число простое и меньше среднего
udal (a, i, &n); //удалить его из массива
else i++; //иначе перейти к следующему элементу
}
cout<<"Massiv A \n"; //вывод модифицированного массива
for (i=0; i<n; i++) cout<<*(a+i)<<"\t";
cout<<"\n";
upor (a, n); //сортировка массива
cout<<"Upor massiv A \n"; //вывод упорядоченного массива
for (i=0; i<n; i++) cout<<*(a+i)<<"\t";
cout<<"\n";
free(a); //освобождение памяти
system("pause");
return 0;
}

 

Рейтинг
( 1 оценка, среднее 2 из 5 )
Загрузка ...