Форум: Форум C++Разное
Новые темы: 00
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подсчитать среднее арифметическое массива, без максимальных элементов
 
 автор: Cena   (03.12.2011 в 14:14)   письмо автору
 
 

Даны два целочисленных массива X(n) и Z(k). В каждом массиве найти максимальный элемент массива, и если это число простое - удалить все элементы, равные максимальному значению. Определить среднее арифметическое положительных элементов массива после удаления.

  Ответить  
 
 автор: cheops   (03.12.2011 в 15:03)   письмо автору
 
   для: Cena   (03.12.2011 в 14:14)
 

Можно поступить следующим образом
#include <stdio.h>
#include <iostream>
using namespace std;

// Прототипы функций
int is_prime_number(int number);
int max_element(int *arr, int number);
void fullfill_array(int *arr, int number);
// Два варианта среднего арифметического: с исключением
// максимального значения и без него
int arithmetic_mean(int *arr, int number, int max);
int arithmetic_mean(int *arr, int number);
// Главная функция
int main(void)
{
  // Объявляем переменные
  int *fstarr, *sndarr, result;
  int fstn, sndn, i, maxfst, maxsnd, count;

  // Формируем и заполняем первый массив
  cout << "Количество элементов в первом массиве = ";
  cin >> fstn;
  fstarr = new int[fstn];
  fullfill_array(fstarr, fstn);
  // Формируем и заполняем второй массив
  cout << "Количество элементов во втором массиве = ";
  cin >> sndn;
  sndarr = new int[sndn];
  fullfill_array(sndarr, sndn);

  // Ищем максимальный элемент первого массива
  maxfst = max_element(fstarr, fstn);
  // В зависимости от того является ли максимальное
  // значение простым числом, выводим результат
  if(is_prime_number(fstarr[maxfst]))
  {
    // Максимальное значение является простым числом
    cout << "Среднее арифметическое первого массива = "
         << arithmetic_mean(fstarr, fstn, fstarr[maxfst])
         << endl;
  }
  else
  {
    // Максимальное значение не является простым числом
    cout << "Среднее арифметическое первого массива = "
         << arithmetic_mean(fstarr, fstn)
         << endl;
  }
  // Ищем максимальный элемент второго массива
  maxsnd = max_element(sndarr, sndn);
  // В зависимости от того является ли максимальное
  // значение простым числом, выводим результат
  if(is_prime_number(sndarr[maxsnd]))
  {
    // Максимальное значение является простым числом
    cout << "Среднее арифметическое первого массива = "
         << arithmetic_mean(sndarr, sndn, sndarr[maxsnd])
         << endl;
  }
  else
  {
    // Максимальное значение не является простым числом
    cout << "Среднее арифметическое первого массива = "
         << arithmetic_mean(fstarr, fstn)
         << endl;
  }

  // Освобождаем динамически выделенную память
  delete [] fstarr;
  delete [] sndarr;

  // Остановка перед закрытием окна
  system("PAUSE");
  return 0;
}
// Является ли число простым
int is_prime_number(int number)
{
  int i = 0;
  if(number <= 2) return 1;
  for(i = 2; i < number; i++)
  {
    if(!(number % i)) return 0;
  }
  return 1;
}
// Заполняем элементы массива
void fullfill_array(int *arr, int number)
{
  int i;
  for(i = 0; i < number; i++)
  {
     cout << "MASSIV X/" << i + 1 << " = ";
     cin >> arr[i];
  }
}
// Ищем максимальный элемент массива
int max_element(int *arr, int number)
{
  int max = arr[0];
  int Nmax = 0, i = 0;
  for(i = 0; i < number; i++)
  {
    if(max < arr[i])
    {
      max = arr[i];
      Nmax = i;
    }
  }
  return Nmax;
}
// Среднее арифметическое положительных чисел
int arithmetic_mean(int *arr, int number, int max)
{
  int result = 0;
  int count = 0, i = 0;
  for(i = 0; i < number; i++)
  {
    if(arr[i] > 0 && max != arr[i])
    {
      result += arr[i];
      count++;
    }
  }
  if(count) return result / count;
  else return 0;
}
// Среднее арифметическое положительных чисел
int arithmetic_mean(int *arr, int number)
{
  int result = 0;
  int count = 0, i = 0;
  for(i = 0; i < number; i++)
  {
    if(arr[i] > 0)
    {
      result += arr[i];
      count++;
    }
  }
  if(count) return result / count;
  else return 0;
}
Тут правда элементы физически не удаляются, они просто игнорируются... если нужно удаление, то лучше использовать STL (если это, конечно, допускается).

  Ответить  
 
 автор: Cena   (03.12.2011 в 16:07)   письмо автору
 
   для: cheops   (03.12.2011 в 15:03)
 

Здраствуйте, спасибо за помощь, а вот так поступить можно:
#include <iostream>
#include <math.h>
#include <malloc.h>
using namespace std;
int main()
{
  int i, Nmax, max, m, N, K, sr, Kmax;
  int *X;
  int *Z;
  cout<<"N="<<N<<"\t Z="<<Z<<"\n";
  X=new int[N];
  Z=new int[K];
  for(i=0; i<N; i++)
    for(i=0; i<K; i++)
    {
      cout<<"MASSIV^"<<i+1<<"\n";
      cin>>X[i];
      cin>>Z[i];
      //поиск максимального элемента
      max=X[0];
      Nmax-0;
      max=Z[0];
      Kmax=0;
      for(i=1; i<N; i++)
      {
        if(max>X[i])
        {
          max=X[i];
          Nmax=i;
        }
      }
      for(i=1; i<K; i++)
      {
        if(max>X[i]);
        {
          max=X[i];
          Kmax=i;
        }
      }
      //ищем простые числа
      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));
  }
  float sr_arifm(int*X, int N)
  {
    int i;
    float s=0, sr;
    for(i=0; i<N; s+=X[i], i++)
    if(N>0)
    return (sr=s/N);
    else return 0;
  }
  float sr_arifm(int*Z, int K)
  {
    int i;
    float s=o,sr;
    for(i=0; i<K; s+=Z[i], i++)
    if(K>0) return (sr=s/K);
    else return 0;
  }
  cout<<"sr Z="<<sr Z<<"\t sr X="<<sr X<<"\n";
  return 0;
}

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

  Ответить  
 
 автор: cheops   (03.12.2011 в 18:24)   письмо автору
 
   для: Cena   (03.12.2011 в 16:07)
 

А у вас определение функций (prostoe(), udal(), sr_arifm()) внутри главной функции - так нельзя, они должны быть за пределами main(). Либо до main(), либо после. Причем в последнем случае нужны прототипы перед main(), чтобы компилятор знал, сколько и какие параметры у вызываемой функции до тех пор, пока он еще не добрался до самой функции.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования