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

Главная Форумы Программирование Программирование на С++ Уроки по С++ для чайников Использование указателей в качестве аргументов функций

Помечено: ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 7 мес., 4 нед. назад.

  • Автор
    Сообщения
  • #3714

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

    Задача:

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

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

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

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

    • float sr_arifm(int *x, int n) — вычисляет среднее арифметическое массива x из n элементов:
    • bool prostoe(int n) — проверяет, является ли целое n простым, результат логическое значение true, если число простое, и false в противном случае
    • 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, то выполняется сортировка по возрастанию, иначе по убыванию.

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

    #inclue <cstdlib>
    #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;
    }

Для ответа в этой теме необходимо авторизоваться.