Консультация № 178769
31.05.2010, 01:31
0.00 руб.
0 5 2
Уважаемые эксперты, помогите написать программу:
Сформировать динамический одномерный или двумерный массив, выполнить:
Удалить элемент равный среднему арифметическому элементов массива.
У меня нелепо написанная прога, не могу чехлы отбить как правильно записать ср. арифметическое и соединить его с динамическим массивом, удалить элемент вроде ж delete()?

Приложение:
#include <iostream.h>
#include <math.h>
void Array(int[], int);
int srAr(int[],int);
void main()
{
int N, k;
cout<<"Vvedite el N\n";
cin>>N;
int *x=new int[N];
Array(x,N)
srAr(a[i], k)
if(k!=0)
cout<<k<<endl;
}
void Array(int a[],int size);
{
cout<<"Vv el\n";
for (int i=0; i<n; i++)
{
cin>>a[i]
cout<<endl;
}
}
int srAr(int a[], int k);
{
int S=0, k=0;
for (int i=0; i<n; i++)
{
S=S+a[i];
k=S/n;
a[i]=k;
return k;
}
}

Обсуждение

Неизвестный
01.06.2010, 15:07
общий
это ответ
Здравствуйте, Колотин Валерий Анатолиевич.
В Вашей программе много ошибок. Во-первых, Вы постоянно пытаетесь использовать какие-то загадочные переменные, которые даже не объявлены. Если Вы передаёте в функцию размерность массива size, то и в цикле использовать надо именно эту переменную. В функции вычисления среднего у Вас все действия в цикле, который только один раз и выполнится, учитывая, что Вы в него return вложили. Удаление элемента из массива происходит путём сдвига элементов, которые расположены после него, на одну позицию назад. Например, удалим 3 из массива 1 3 4 5. Для этого поместим 4 на место 3, а 5 на место 4, в результате получится массив 1 4 5, а размерность его надо уменьшить на 1. Через delete удалять будем уже весь массив в конце программы, чтобы освободить память. Разумеется, можно уменьшить размер выделенной памяти во время удаления элемента: для этого надо выделить память под массив N-1, переписать туда все элементы прежнего массива, кроме удаляемого, а потом удалить старый массив.
Первый вариант и Ваша исправленная програма в приложении.
Удачи!

Приложение:
#include <iostream.h>

void Array (double[], int);
double srAr (double[],int);
void DelAi (double[],int&,double); //удаление: массив, размерность, среднее

void main()
{
int N;
cout<<"Vvedite el N\n";
cin>>N;
double *x = new double[N];
Array(x,N);
DelAi (x, N, srAr(x, N));
cout << "Result: ";
for (int i=0; i<N; i++) //вывод результата
cout << x[i] << " ";
delete [] x; //освобождение памяти
}
void Array(double a[],int size)
{
cout<<"Vv el\n";
for (int i=0; i<size; i++) //надо использовать переменную size, а не какое-то неизвестное n
{
cin>>a[i];
cout<<endl;
}
}

double srAr(double a[], int size) //сюда надо передавать размер, а не какое-то загадочное k
{
double S=0;
for (int i=0; i<size; i++)
{
S=S+a[i]; //в цикле надо производить только суммирование
}
double k = S/size;
return k;
}

void DelAi (double a[], int &size, double sr) //функция удаления
{
for (int i=0; i<size; i++) { //идём по массиву
if (a[i]==sr) { //если попадается элемент, равный среднему
for (int j=i; j<size-1; j++) //удаляем
a[j]=a[j+1];
i--; //возвращаемся к элементу
size--; //уменьшаем количество
}
}
}
5
Неизвестный
01.06.2010, 16:02
общий
это ответ
Здравствуйте, Колотин Валерий Анатолиевич.

Для динамического массива лучше использовать тип данных vector.
Мой вариант:

Средний элемент вычисляется без дробной части.
Если элемент из введенного массива равен этому среднему, то он удаляется. Иначе, массив не меняется.

Код программы. Проверено в GCC 4.5

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
int size;
cout << "Enter array size: ";
cin >> size;

vector <int> numbers(size);
int temp;

// Filling array with numbers:
for(int i=0; i<size; i++)
{
cout << "Enter " << i+1 << " number: ";
cin >> temp;
numbers[i] = temp;
}

int sum = 0;
// Finding average value:
for(int i=0; i<size; i++)
sum += numbers[i];

int average = sum / size;

// Deleting average number:
for(int i=0; i<size; i++)
if(numbers[i] == average)
{
numbers.erase(numbers.begin()+i);
break;
}

// Printing result array:
for(int i=0; i<numbers.size(); i++)
cout << numbers[i] << " ";

return 0;
}
4
Неизвестный
01.06.2010, 16:05
общий
Не понравился способ, предложенный Verena, поэтому решил написать свой вариант.
Библиотеки <cstdlib> и <ctime> можно убрать.
Неизвестный
01.06.2010, 17:48
общий
сем большое спасибо!
Неизвестный
01.06.2010, 22:11
общий
Иванов Андрей Владимирович:
Помещайте, пожалуйста, код в приложение или хотя бы под тег.
Форма ответа