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

Форум C++

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

 

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

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

тема: Удаления копий максимальных элементов
 
 автор: Cena   (02.01.2012 в 21:59)   письмо автору
 
 

Здраствуйте, я добавил функцию удаления копий максимальных элементов, подскажите пожалуйста, как вызвать ее в главной функции? Т.к у меня считает среднее арифметическое всех элементов, включая и простые копии максильных элементов, а мне нужно удалить копии максимальных элементов:
#include <iostream>
#include <math.h>
using namespace std;
int max(int *x, int n)
{
  int max=x[0];
  int Nmax=0, i=0;
  for(i = 0; i<n; i++)
  {
    if(max<x[i])
    {
      max=x[i];
      Nmax=i;
    }
  }
  return Nmax;
}
bool prostoe(int n)
{
  int i=0;
  bool pr;
  if(n<=2) return 0;
  for(i=2; i<n/2; i++)
  {
    if(n%i==0) return pr;
  }
}
// Удаляем копии максимальных элементов
void udal(int*x, int Nmax, int*n)
{
  int i;
  for(i=0; i<*n-1; i++)
  {
    if (x[i]==x[i-1]) 
    {
      do
      { 
        Nmax=i; 
        x[Nmax-1]=x[Nmax]; 
        Nmax++; 
      }while(Nmax<*n); 
      x[*n-1]=0;
      i--;
      realloc((int *)x,*n*sizeof(int));
    }
  }
}
int sr_arifm(int *x, int n)
{
  int s;
  int k, i;
  for(s=0, i=0, k=0; i<n; s+=x[i], i++)
  {
    if(x[i]>0)
    k++;
  }
  if(k) return s/k;
  else return 0;
}
int main ()
{
  int *x, Nmax, n,i;
  double sr;
  cout<<"n=";
  cin>>n;
  x=(int *)calloc(n,sizeof(int));
  cout<<"vvedite massiv X=";
  for(i=0; i<n; i++)
    cin>>*(x+i);
  Nmax=max(x,n);
  if(prostoe(*(x+i)))
    udal(x, i, &n);
  else i++;
    sr=sr_arifm(x, n);
  cout<<"sr="<<sr<<"\n";
  free(x);
  system("pause");
  return 0;
}

  Ответить  
 
 автор: cheops   (03.01.2012 в 11:17)   письмо автору
 
   для: Cena   (02.01.2012 в 21:59)
 

Правильно ли я понимаю, что речь идет о функции void udal(int*x, int Nmax, int*n)? Тогда вам нужно просто подставить значения в неё после Nmax=max(x,n);, x и Nmax можно передать как есть, а в случае n придется передать адрес &n (не понятно, почему решили n сделать указателем, а не обычным числом)
udal(x, Nmax, &n);

  Ответить  
 
 автор: Cena   (03.01.2012 в 14:21)   письмо автору
 
   для: cheops   (03.01.2012 в 11:17)
 

Здраствуйте, да, речь идет о функции void udal(int*x, int Nmax, int*n), я исправил udal(x, Nmax, n), после этого ввел массив, состоящий из 3 элементов, к примеру, 13, 13, 1, тоесть 13-число простое и оно максимальное среди данных чисел, также имеются копия максимального числа, среднее арифметическое должно быть(13+1)/2=7, а у меня результат 5, тоесть у меня некорректно считает среднее арифметическое, вроде, элементы повторяющиеся удаляются, где-то ошибся.
#include <iostream>
#include <malloc.h>
using namespace std;
int max(int *x, int n)
{int max=x[0];
int Nmax=0, i=0;
for(i = 0; i<n; i++)
{
if(max<x[i])
{max=x[i];
Nmax=i;}}
return Nmax;
}
bool prostoe(int n)
{
int i=0;
bool pr;
if(n<=2) return 0;
for(i=2; i<n/2; i++)
{
if(n%i==0) return pr;
}
}
// Удаляем копии максимальных элементов
int udal(int *x, int Nmax, int n) // функция, определяющая элементы массива в единственном экземпляре
{
for (int i= 0; i<n; i++)
{
for (int j = i + 1; j < n ; j++)
{
if ( x[i] == x[j] ) // если найден одинаковый элемент
{
for (int j=Nmax; Nmax<n -1; Nmax++)
{
// выполнить сдвиг всех остальных элементов массива на -1, начиная со следующего элемента, после найденного дубля
x[Nmax] = x[Nmax+1];
}
n-=1; // уменьшить размер массива на 1

if (x[i] == x[j]) // если следующий элемент - дубль
{
j--; // выполнить переход на предыдущий элемент
}
}
}
}
return n;
}
int sr_arifm(int *x, int n)
{
int s;
int k, i;
for(s=0, i=0, k=0; i<n; s+=x[i], i++)
{
if(x[i]>0)
k++;
}
if(k) return s/k;
}
int main ()
{
int *x, Nmax, n,i;
double sr;
cout<<"n=";
cin>>n;
x=new int[n];
cout<<"vvedite massiv X=";
for(i=0; i<n; i++)
cin>>*(x+i);
Nmax=max(x,n);
if(prostoe(*(x))+i)
udal(x,Nmax,n);
sr=sr_arifm(x,n);
cout<<"sr="<<sr<<"\n";
free(x);
system("pause");
}

А в функции поиска максимального элемента, правильно ли я возвращаю номер максимального элемета return Nmax; или я должен вернуть n?

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

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