|
|
|
| Здраствуйте, подскажите пожалуйста, а с помощью функций, которые я написал в программе, можно ли составить правильную программу ? | |
|
|
|
|
|
|
|
для: Cena
(29.12.2011 в 01:17)
| | Можно, только их нужно оформить подобающим образом, для начала вынести за пределы функции main(). | |
|
|
|
|
|
|
|
для: cheops
(29.12.2011 в 03:17)
| | Подскажите пожалуйста, у меня после ввода массива не считает среднне арифметическое значение, не понимаю что потерял? И как удалить копии максимальных лементов, не удаляя сам максимальный элемент? | |
|
|
|
|
|
|
|
для: Cena
(29.12.2011 в 18:21)
| | А программа сейчас как выглядит (также как выше или в ней есть какие-то изменения)? | |
|
|
|
|
|
|
|
для: 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;
} |
| |
|
|
|
|
|
|
|
для: Cena
(29.12.2011 в 19:43)
| | 1. Так тут я вижу две функции для подсчета среднего арифметического, какая из них не срабатывает?
>И я немного не понял с функцией удаления, а где она в программе задействована?
2. А что за функция удаления? Имеется в виду delete или что-то другое? | |
|
|
|
|
|
|
|
для: 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));
}
Мне просто непонятно, как ее правильно использовать в программе? | |
|
|
|
|
|
|
|
для: Cena
(29.12.2011 в 22:15)
| | Т.е. значения нужно физически из памяти удалять? Если да, то использование realloc() в отношении выделенной при помощи new() памяти - это плохая идея. Тут либо C++ механизм выделения памяти, либо чистый C - их лучше не мешать. | |
|
|
|
|
967 Кб |
|
|
для: cheops
(29.12.2011 в 22:34)
| | Да, удалить физически из памяти.Мне просто нужно составить программу с помощью этой лекции: | |
|
|
|
|
|
|
|
для: Cena
(29.12.2011 в 23:11)
| | Ясно, тогда от new и delete нужно избавляться, завтра постараюсь представить такой вариант. | |
|
|
|
|
|
|
|
для: cheops
(29.12.2011 в 23:32)
| | Спасибо большое. | |
|
|
|
|
|
|
|
для: 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;} | |
|
|
|