Одномерный массив

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Ronin94
Сообщения: 8
Зарегистрирован: 23 апр 2015, 22:43

21 ноя 2016, 13:23

Люди помогите лабораторку добить
********************************************
В одномерном массиве, состоящем из 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;
}
Skwoogey
Сообщения: 63
Зарегистрирован: 11 янв 2016, 02:25

21 ноя 2016, 22:09

Первое: Есть функция abs() Берет модуль от числа. Должна упростить тебе жизнь.

Второе: 0 не учитывает, так как стоит строгое условие "<" или ">". Надо "<=" или ">=".


В этом нету смысла, так как мы туда все равно потом запишем верхние элементы. Можно сразу двигать.

Код: Выделить всё

    for (int i = a-1;i <= b-1;i++)
    {
        arr[i] = 0;
    }
Честно говоря, я понял задание иначе. Надо идти по массиву и если значение ячейки лежит между а и б, то двигать массив. Например, а = 3, б = 5. Удаляться будут элементы, значения которых лежат в интервале [3;5].

Код: Выделить всё

// а теперь сдвигаем элементы влево, если слева 0 и на их место пишем 0
Это в корне не верно. У нас может быть ячейка с нулем изначально. После работы алгоритма ее не будет, что неверно. Эту часть лучше переработать сначала. Определись, в чем чуть задания, после посмотрим

Как-то так. Придет Ромео, подправит и дополнит меня.
Ответить