********************************************
В одномерном массиве, состоящем из n вещественных элементов,
вычислить:
− номер минимального по модулю элемента массива;
− сумму модулей элементов массива, расположенных после первого
отрицательного элемента.
Сжать массив, удалив из него все элементы, величина которых находится в
интервале [a,b]. Освободившиеся в конце массива элементы заполнить нулями.
********************************************
проблема заключается в следующем: когда идет поиск минимального элемента то не учитывает что ноль тоже может быть минимальным элементом, а сам элемент превращается из вещественного в целочисленный. и еще почему то в интервале не все элементы зануляются
Текст программы:
Код: Выделить всё
#include <iostream> // поток
#include <time.h> //случайные числа
using namespace std;
int search(float arr[], int n) // поиск минимального элемента
{
int numbermin = 0;//номер минимального по модулю элемента
int min = arr[0]; //минимальный по модулю элемент
// загоняет в большой цикл
if(arr[0]>0)
{
min = arr[0];
numbermin = 0;
}
else
{
min = -arr[0];
numbermin = 0;
}
for(int i=1;i<n;i++)
{
if(arr[i]<0&&-arr[i]<min)
{
min = -arr[i];
numbermin = i;
}
else if(arr[i]>0&&arr[i]<min)
{
min=arr[i];
numbermin = i;
}
}
return(numbermin);//возвращаем значение
}
int summod(float arr[], int n) // поиск суммы
{
int sum = 0; // тут будет храниться сумма
for (int i=0; i<n; i++)
{
if (arr[i] < 0) // если первый элемент меньше 0, то начинаем считать
{
for (int j=i+1;j<n;j++) // т.к. после то прибавляем единицу
{
sum += abs(arr[j]); // тут мы считаем суммы по модулю
}
return(sum);
}
}
return(sum);
}
void compression(float a, float b, float arr[], int n) // сжимаем массив
{
// удаляем элементы, заменой их на нули
for (int i = a-1;i <= b-1;i++)
{
arr[i] = 0;
}
// выводим полученный после замены на нули
cout<<"\nМассив после замены удаления элементов = ";
for (int i=0;i<n;i++)
{
cout<<" "<<arr[i];
}
cout<<endl;
// а теперь сдвигаем элементы влево, если слева 0 и на их место пишем 0
for (int i=0;i<n-1;i++) // большой внешний цикл
{
for (int j=0;j<n-1-i;j++) // маленький внутренний отвечающий за перестановку элементов "рядом стоящих"
{
if (arr[j] == 0) // элемент равен 0?
{
arr[j] = arr[j+1]; // Да, сдвигаем влево
arr[j+1] = 0; // обнуляем тот, что справо
}
}
}
// выводим итоговый
cout<<"\nМассив после сдвига =";
for (int i=0;i<n;i++)
{
cout<<" "<<arr[i];
}
}
// головная программа
int main(void)
{
srand(time(NULL)); // начальный rand
setlocale(LC_ALL, "rus"); // русский текст
// объявление переменных
int n; //размер массива
cout<<"Введите размер массива: ";
cin>>n;
float *arr=new float[n];
float a,b;
// выводим и заполняем массив
cout<<"Исходный массив = ";
for (int i = 0; i<n; i++)
{
arr[i]=(3-(rand()%10)*0.3);
cout<<" "<<arr[i];
}
// вывод
cout<<endl;
cout<<"\nНомер минимального элемента по модулю = "<<search(arr,n)+1<<endl;//вызываем функцию search
cout<<"\nСумма модулей элементов массива, \n"<<"расположенных после первого отрицательного элемента = "<<summod(arr,n)<<endl;
cout<<"\nВведите предел a = "; cin>>a;
cout<<"Введите предел b = "; cin>>b;
compression(a,b,arr,n);
cout<<endl;
delete [] arr;
cin.get();
cin.get();
return 0;
}