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

Форум C++

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

 

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

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

тема: После ввода массива не считает среднне арифметическое значение
 
 автор: Cena   (29.12.2011 в 01:17)   письмо автору
 
 

Здраствуйте, подскажите пожалуйста, а с помощью функций, которые я написал в программе, можно ли составить правильную программу ?

  Ответить  
 
 автор: cheops   (29.12.2011 в 03:17)   письмо автору
 
   для: Cena   (29.12.2011 в 01:17)
 

Можно, только их нужно оформить подобающим образом, для начала вынести за пределы функции main().

  Ответить  
 
 автор: Cena   (29.12.2011 в 18:21)   письмо автору
 
   для: cheops   (29.12.2011 в 03:17)
 

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

  Ответить  
 
 автор: cheops   (29.12.2011 в 19:08)   письмо автору
 
   для: Cena   (29.12.2011 в 18:21)
 

А программа сейчас как выглядит (также как выше или в ней есть какие-то изменения)?

  Ответить  
 
 автор: Cena   (29.12.2011 в 19:43)   письмо автору
 
   для: cheops   (29.12.2011 в 19:08)
 

Я чуть-чуть изменил в проверке на простое число for(i=2; i<n/2; i++), и, вроде, все так же осталось.И
я немного не понял с функцией удаления, а где она в программе задействована?
#include <stdio.h>
#include <iostream>
using namespace std;

// Прототипы функций
bool prostoe(int n);
int max(int *a, int n);
void fullfill_array(int *a, int n);
// Два варианта среднего арифметического: с исключением
// максимального значения и без него
int sr_arifm(int *a, int n, int max);
int sr_arifm(int *a, int n);
// Главная функция
int main(void)
{
  // Объявляем переменные
  int *X, *Z, s;
  int N, K, i, Nmax, Kmax, k;
  // Формируем и заполняем первый массив
  cout << "perviu massiv= ";
  cin>>N;
  X=new int[N];
  fullfill_array(X, N);
  // Формируем и заполняем второй массив
  cout<<"vtoroi massiv = ";
  cin>>K;
  Z=new int[K];
  fullfill_array(Z,K);
  // Ищем максимальный элемент первого массива
  Nmax=max(X,N);
  // В зависимости от того является ли максимальное
  // значение простым числом, выводим результат
  if(prostoe(X[Nmax]))
  {
    // Максимальное значение является простым числом
    cout << "Среднее арифметическое первого массива = "
         << sr_arifm(X, N, X[Nmax])
         << endl;
  }
  else
  {
    // Максимальное значение не является простым числом
    cout << "Среднее арифметическое первого массива = "
         << sr_arifm(X, N)
         << endl;
  }
  // Ищем максимальный элемент второго массива
  Kmax=max(Z,K);
  // В зависимости от того является ли максимальное
  // значение простым числом, выводим результат
  if(prostoe(Z[K]))
  {
    // Максимальное значение является простым числом
    cout << "Среднее арифметическое первого массива = "
         << sr_arifm(Z, K, Z[Kmax])
         << endl;
  }
  else
  {
    // Максимальное значение не является простым числом
    cout << "Среднее арифметическое первого массива = "
         << sr_arifm(Z, K)
         << endl;
  }
  delete []X;
  delete []Z;
  system("PAUSE");
  return 0;
}
// Является ли число простым
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;
  }
  return 0;
}
// Заполняем элементы массива
void fullfill_array(int *a, int n)
{
  int i;
  for(i=0; i<n; i++)
  {
    cout<<"MASSIV X/"<<i+1<<"=";
    cin>>a[i];
  }
}
// Ищем максимальный элемент массива
int max(int *a, int n)
{
  int max=a[0];
  int Nmax=0, i=0;
  for(i = 0; i<n; i++)
  {
    if(max<a[i])
    {
      max=a[i];
      Nmax=i;
    }
  }
  return Nmax;
}
// Среднее арифметическое положительных чисел
int sr_arifm(int *a, int n, int max)
{
  int k;
  int s, i;
  for(i=0, k=0, s=0; i<n; s+=a[i], i++)
  {
    if(a[i] > 0 && max==a[i])
    k++;
  }
  if(k) return s/k;
    else return 0;
}
// Среднее арифметическое положительных чисел
int sr_arifm(int *a, int n)
{
  int s;
  int k, i;
  for(s=0, i=0, k=0; i<n; s+=a[i], i++)
  {
  if(a[i]>0)
  k++;}
  if(k) return s/k;
  else return 0;
}

  Ответить  
 
 автор: cheops   (29.12.2011 в 21:44)   письмо автору
 
   для: Cena   (29.12.2011 в 19:43)
 

1. Так тут я вижу две функции для подсчета среднего арифметического, какая из них не срабатывает?

>И я немного не понял с функцией удаления, а где она в программе задействована?
2. А что за функция удаления? Имеется в виду delete или что-то другое?

  Ответить  
 
 автор: Cena   (29.12.2011 в 22:15)   письмо автору
 
   для: cheops   (29.12.2011 в 21:44)
 

delete [ ]- освобождение динамичиской памяти массива, а я имею ввиду функция, которая удаляет копии максимальных простых и само максимальное простое значение:
// функция удаления
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));
}
Мне просто непонятно, как ее правильно использовать в программе?

  Ответить  
 
 автор: cheops   (29.12.2011 в 22:34)   письмо автору
 
   для: Cena   (29.12.2011 в 22:15)
 

Т.е. значения нужно физически из памяти удалять? Если да, то использование realloc() в отношении выделенной при помощи new() памяти - это плохая идея. Тут либо C++ механизм выделения памяти, либо чистый C - их лучше не мешать.

  Ответить  
 
 автор: Cena   (29.12.2011 в 23:11)   письмо автору
967 Кб
 
   для: cheops   (29.12.2011 в 22:34)
 

Да, удалить физически из памяти.Мне просто нужно составить программу с помощью этой лекции:

  Ответить  
 
 автор: cheops   (29.12.2011 в 23:32)   письмо автору
 
   для: Cena   (29.12.2011 в 23:11)
 

Ясно, тогда от new и delete нужно избавляться, завтра постараюсь представить такой вариант.

  Ответить  
 
 автор: Cena   (29.12.2011 в 23:40)   письмо автору
 
   для: cheops   (29.12.2011 в 23:32)
 

Спасибо большое.

  Ответить  
 
 автор: Cena   (30.12.2011 в 21:01)   письмо автору
 
   для: Cena   (29.12.2011 в 23:40)
 

Здраствуйте, я добавил функцию удаления копий максимальных элементов, подскажите пожалуйста, как вызвать ее в главной функции? Т.к у меня считает среднее арифметическое всех элементов, включая и простые копии максильных элементов, а мне нужно удалить копии максимальных элементов:
#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;}

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

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