Консультация № 174020
06.11.2009, 21:18
0.00 руб.
0 9 2
здравствуйте помогите пожалуйста написать прогу.
В одномерном массиве ,состоящем из n вещественных элементов вычислить:
минимальный элемент массива
сумму элементов массива, расположенных между первым и последним положительными элементами. Преобразовать массив таким образом, чтобы сначала располагались все элементы, равные нулю, а потом - все остальные. нужно в приложении под windows, можно в консоли(с++)

Обсуждение

Неизвестный
06.11.2009, 22:54
общий
это ответ
Здравствуйте, Nastenka.
Программа. C++. Microsoft Visual Studio 2008.
Код:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <iomanip>

using namespace std;

// Размерность массива
const size_t Dim=20;
// Максимальное значение для авто-генерации
const double MaxValue=50.0;

// Заполняет массив случайными числами
template<size_t Dim>
void fillArray(double (&array)[Dim])
{
for(size_t i=0;i<Dim;++i)
{
// Разбавим нулевыми элементами, чтоб можно было отсортировать согласно условия
array[i]=rand()%5?(static_cast<double>(rand())/RAND_MAX-0.5)*MaxValue*2.0:0.0;
}
}

// Выводит массив
template<class Elem,class Traits,size_t Dim>
basic_ostream<Elem,Traits>& operator<<(basic_ostream<Elem,Traits>& stream,const double (&array)[Dim])
{
const ctype<Elem>& facet=use_facet<ctype<Elem> >(stream.getloc());
Elem comma=facet.widen(',');
streamsize width=stream.width();
streamsize precision=stream.precision();
for(size_t i=0;i<Dim;++i)
{
stream.width(width);
stream.precision(precision);
stream<<array[i]<<(i<Dim-1?comma:facet.widen(' '));
}
return stream;
}

// Ищет сумму по условию
template<size_t Dim>
double sum(const double (&array)[Dim])
{
double result=0.0;
// Указатели на начало и конец
const double* begin=array;
const double* end=array+Dim;
// Пропустим не положительные от начала
while(begin<end && *begin<=0.0)
{
++begin;
}
// Пропустим не положительные от конца
while(begin<--end && *end<=0.0);
// Суммируем
if(begin<end)
{
while(++begin<end)
{
result+=*begin;
}
}
return result;
}

// Ф-я предикат для сортировки
bool sortPredicate(const double& left,const double& right)
{
return left==0 && right!=0;
}

int main()
{
setlocale(LC_ALL,"russian_russia");
srand(static_cast<unsigned int>(time(0)));

// Наш массив
double array[Dim];

// Заполним массив
fillArray(array);

// Выведем его
cout<<"Исходный массив:"<<endl
<<array<<endl;

// Ищем минимальный элемент
double* minItem=min_element(array,array+Dim);
cout<<endl<<"Минимальный элемент ["<<minItem-array<<"]="<<*minItem<<endl;

// Сумма между первым и последним положительным
cout<<endl<<"Сумма между первым и последним положительным:"<<sum(array)<<endl;

// Сортируем согласно условия
sort(array,array+Dim,sortPredicate);

// Выводим, что получилось
cout<<endl<<"Массив после сортировки:"<<endl
<<array<<endl;

system("PAUSE");
return 0;
}

Пример вывода:
Код:
Исходный массив:
0,-44.763,0,0,-1.38401,17.1316,-21.5262,0,23.5496,22.6615,41.5098,40.5759,0,0,38
.2626,-36.4101,7.19169,-6.29749,0.895718,0

Минимальный элемент [1]=-44.763

Сумма между первым и последним положительным:109.517

Массив после сортировки:
0,0,0,0,0,0,0,-44.763,-1.38401,17.1316,-21.5262,23.5496,22.6615,41.5098,40.5759,
38.2626,-36.4101,7.19169,-6.29749,0.895718
давно
Академик
320937
2216
07.11.2009, 00:06
общий
07.11.2009, 12:14
это ответ
Здравствуйте, Nastenka.
Ответ в приложении.

Приложение:
// 174020
// В одномерном массиве ,состоящем из n вещественных элементов вычислить:
// минимальный элемент массива
// сумму элементов массива, расположенных между первым и последним положительными элементами.
// Преобразовать массив таким образом, чтобы сначала располагались все элементы, равные нулю,
// а потом - все остальные. нужно в приложении под windows, можно в консоли(с++)
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
const int size = 10;
double arr[size];
double sum;
double min;
int i,j;

// формирование массива
for (i=0; i<size; i++)
{
cout << "arr[" << i << "]=";
cin >> arr[i];
}

// эхо-печать массива
cout << "Введенный массив" << endl;
for (i=0; i<size; i++)
{
cout << i << " " << setprecision(3) << arr[i] << endl;
}

// поиск минимального элемента
for (i=0, min=arr[0]; i<size; i++)
if (arr[i]<min)
min = arr[i];

// поиск первого положительного элемента
for (i=0; i<size && arr[i]<=0; i++)
;
sum = 0; // если нет вообще положительных элементов

//поиск последнего положительного элемента
if ((i<size-2) && (arr[i]>0)) // а есть ли смысл?
{
for (j=size-1; j>=0 && arr[j]<=0; j--)
;
if ((arr[j]>0) && (--j>i))
while (j>i)
{
// сумма элементов между первым и последним положительным
sum+=arr[j--];
}
}

for (i=j=size-1; i>=0;--i)
{
if (arr[i]!=0)
{
if (i!=j)
arr[j]=arr[i];
--j;
}
}
for (i=0;i<=j;i++) // заполним начало нулями
arr[i]=0;

// печать нового массива
cout << endl;
cout << "Новый массив" << endl;
for (i=0; i<size; i++)
{
cout << i << " " << setprecision(3) << arr[i] << endl;
}
cout << "Минимальный элемент =" << setprecision(3) << min << endl;
cout << "Сумма между первым и последним положительными элементами = ";
cout << setprecision(3);
cout << sum << endl;
return 0;
}// 174020
// В одномерном массиве ,состоящем из n вещественных элементов вычислить:
// минимальный элемент массива
// сумму элементов массива, расположенных между первым и последним положительными элементами.
// Преобразовать массив таким образом, чтобы сначала располагались все элементы, равные нулю,
// а потом - все остальные. нужно в приложении под windows, можно в консоли(с++)
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
const int size = 10;
double arr[size];
double sum;
double min;
int i,j;

// формирование массива
for (i=0; i<size; i++)
{
cout << "arr[" << i << "]=";
cin >> arr[i];
}

// эхо-печать массива
cout << "Введенный массив" << endl;
for (i=0; i<size; i++)
{
cout << i << " " << setprecision(3) << arr[i] << endl;
}

// поиск минимального элемента
for (i=0, min=arr[0]; i<size; i++)
if (arr[i]<min)
min = arr[i];

// поиск первого положительного элемента
for (i=0; i<size && arr[i]<=0; i++)
;
sum = 0; // если нет вообще положительных элементов

//поиск последнего положительного элемента
if ((i<size-2) && (arr[i]>0)) // а есть ли смысл?
{
for (j=size-1; j>=0 && arr[j]<=0; j--)
;
if ((arr[j]>0) && (--j>i))
while (j>i)
{
// сумма элементов между первым и последним положительным
sum+=arr[j--];
}
}

for (i=j=size-1; i>=0;--i)
{
if (arr[i]!=0)
{
if (i!=j)
arr[j]=arr[i];
--j;
}
}
for (i=0;i<=j;i++) // заполним начало нулями
arr[i]=0;

// печать нового массива
cout << endl;
cout << "Новый массив" << endl;
for (i=0; i<size; i++)
{
cout << i << " " << setprecision(3) << arr[i] << endl;
}
cout << "Минимальный элемент =" << setprecision(3) << min << endl;
cout << "Сумма между первым и последним положительными элементами = ";
cout << setprecision(3);
cout << sum << endl;
return 0;
}// 174020
// В одномерном массиве ,состоящем из n вещественных элементов вычислить:
// минимальный элемент массива
// сумму элементов массива, расположенных между первым и последним положительными элементами.
// Преобразовать массив таким образом, чтобы сначала располагались все элементы, равные нулю,
// а потом - все остальные. нужно в приложении под windows, можно в консоли(с++)
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
const int size = 10;
double arr[size];
double sum;
double min;
int i,j;

// формирование массива
for (i=0; i<size; i++)
{
cout << "arr[" << i << "]=";
cin >> arr[i];
}

// эхо-печать массива
cout << "Введенный массив" << endl;
for (i=0; i<size; i++)
{
cout << i << " " << setprecision(3) << arr[i] << endl;
}

// поиск минимального элемента
for (i=0, min=arr[0]; i<size; i++)
if (arr[i]<min)
min = arr[i];

// поиск первого положительного элемента
for (i=0; i<size && arr[i]<=0; i++)
;
sum = 0; // если нет вообще положительных элементов

//поиск последнего положительного элемента
if ((i<size-2) && (arr[i]>0)) // а есть ли смысл?
{
for (j=size-1; j>=0 && arr[j]<=0; j--)
;
if ((arr[j]>0) && (--j>i))
while (j>i)
{
// сумма элементов между первым и последним положительным
sum+=arr[j--];
}
}

for (i=j=size-1; i>=0;--i)
{
if (arr[i]!=0)
{
if (i!=j)
arr[j]=arr[i];
--j;
}
}
for (i=0;i<=j;i++) // заполним начало нулями
arr[i]=0;

// печать нового массива
cout << endl;
cout << "Новый массив" << endl;
for (i=0; i<size; i++)
{
cout << i << " " << setprecision(3) << arr[i] << endl;
}
cout << "Минимальный элемент =" << setprecision(3) << min << endl;
cout << "Сумма между первым и последним положительными элементами = ";
cout << setprecision(3);
cout << sum << endl;
return 0;
}
Неизвестный
07.11.2009, 07:48
общий
Модераторы:
Добрый день! Прошу внести изменения в приложение к ответу. Причина: устранение ошибки "индекс вне диапазона" (обнаружил Micren).
...
if ((i<size-2) && (arr[i]>0)) // а есть ли смысл?
...
вместо
...
if (arr[i]>0) // а есть ли смысл?
...
Неизвестный
07.11.2009, 07:49
общий
Micren:
Спасибо за помощь!
Неизвестный
07.11.2009, 10:51
общий
Модераторы:
Уважаемые модераторы! Прошу внести изменения в ответ.
1. Изменить тело цикла на
...
if (arr[i]!=0)
{
if (i!=j)
arr[j]=arr[i];
j--;
}
...
вместо
...
if ((arr[i]!=0)&&(i!=j))
{
arr[j--]=arr[i];
}
...
Причина: устранение ошибки в вычислении новой позиции ненулевого элемента
2. Удалить строку (отладочная печать)
...
cout << "i=" << i << endl;
...
3. Удалить строку (отладочная печать)
...
cout << "j=" << j << endl;
...
Неизвестный
07.11.2009, 11:12
общий
Внесены исправления
Код:

// 174020
// В одномерном массиве ,состоящем из n вещественных элементов вычислить:
// минимальный элемент массива
// сумму элементов массива, расположенных между первым и последним положительными элементами.
// Преобразовать массив таким образом, чтобы сначала располагались все элементы, равные нулю,
// а потом - все остальные. нужно в приложении под windows, можно в консоли(с++)
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
const int size = 10;
double arr[size];
double sum;
double min;
int i,j;

// формирование массива
for (i=0; i<size; i++)
{
cout << "arr[" << i << "]=";
cin >> arr[i];
}

// эхо-печать массива
cout << "Введенный массив" << endl;
for (i=0; i<size; i++)
{
cout << i << " " << setprecision(3) << arr[i] << endl;
}

// поиск минимального элемента
for (i=0, min=arr[0]; i<size; i++)
if (arr[i]<min)
min = arr[i];

// поиск первого положительного элемента
for (i=0; i<size && arr[i]<=0; i++)
;
sum = 0; // если нет вообще положительных элементов

//поиск последнего положительного элемента
if ((i<size-2) && (arr[i]>0)) // а есть ли смысл?
{
for (j=size-1; j>=0 && arr[j]<=0; j--)
;
if ((arr[j]>0) && (--j>i))
while (j>i)
{
// сумма элементов между первым и последним положительным
sum+=arr[j--];
}
}

for (i=j=size-1; i>=0;--i)
{
if (arr[i]!=0)
{
if (i!=j)
arr[j]=arr[i];
--j;
}
}
for (i=0;i<=j;i++) // заполним начало нулями
arr[i]=0;

// печать нового массива
cout << endl;
cout << "Новый массив" << endl;
for (i=0; i<size; i++)
{
cout << i << " " << setprecision(3) << arr[i] << endl;
}
cout << "Минимальный элемент =" << setprecision(3) << min << endl;
cout << "Сумма между первым и последним положительными элементами = ";
cout << setprecision(3);
cout << sum << endl;
return 0;
}
Неизвестный
07.11.2009, 11:35
общий
Micren:
Уже два спасибо :)
давно
Мастер-Эксперт
425
4118
07.11.2009, 12:15
общий
leonid59:
Это всё, больше не будет исправлений?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
07.11.2009, 12:25
общий
sir Henry:
Обнаружится еще ошибка - попрошу снять ответ.
Форма ответа