|
|
|
| Даны два целочисленных массива X(n) и Z(k). В каждом массиве найти максимальный элемент массива, и если это число простое - удалить все элементы, равные максимальному значению. Определить среднее арифметическое положительных элементов массива после удаления. | |
|
|
|
|
|
|
|
для: 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 (если это, конечно, допускается). | |
|
|
|
|
|
|
|
для: 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;
} |
Но компаилятор ругается, там где идет поиск простых чисел ,я чуть-чуть не разобрался, программа для меня емкостная и ошибки допустил. | |
|
|
|
|
|
|
|
для: Cena
(03.12.2011 в 16:07)
| | А у вас определение функций (prostoe(), udal(), sr_arifm()) внутри главной функции - так нельзя, они должны быть за пределами main(). Либо до main(), либо после. Причем в последнем случае нужны прототипы перед main(), чтобы компилятор знал, сколько и какие параметры у вызываемой функции до тех пор, пока он еще не добрался до самой функции. | |
|
|
|
|