Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2016, 16:15   #1
Ronin94
Пользователь
 
Регистрация: 28.01.2015
Сообщений: 13
По умолчанию Одномерный массив

Люди помогите лабораторку добить
*********************************** *********
В одномерном массиве, состоящем из 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;
}
Ronin94 вне форума Ответить с цитированием
Старый 21.11.2016, 16:24   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
когда идет поиск минимального элемента то не учитывает что ноль тоже может быть минимальным элементом
Либо описывайте все варианты, либо откройте для себя http://en.cppreference.com/w/cpp/numeric/math/fabs и напишите один раз простое условие.

Цитата:
сам элемент превращается из вещественного в целочисленный
так вы сами написали
Код:
int min = arr[0]; //минимальный по модулю элемент
Цитата:
и еще почему то в интервале не все элементы зануляются
Вы вообще левое делаете.
1. По условию надо проверять, что элемент массива находится в интервале
2.
Код:
int i = a-1
превращает float в int
3. вы не контролируете границы
4. ...

Последний раз редактировалось p51x; 21.11.2016 в 16:28.
p51x вне форума Ответить с цитированием
Старый 21.11.2016, 17:23   #3
Ronin94
Пользователь
 
Регистрация: 28.01.2015
Сообщений: 13
По умолчанию

спасибо
Ronin94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование в VBA: двумерный массив M на N, нужно создать новый одномерный массив TheAnnihilyator Помощь студентам 1 04.06.2014 09:16
Найти одномерный массив элементы которого равны минимальным значениям в строках исходной матрицы и одномерный массив элементы... Richik123 Microsoft Office Excel 1 16.10.2013 15:45
Двумерный массив развернуть в одномерный массив по строкам[QBASIC] TrueStyle777 Помощь студентам 3 29.05.2013 21:56
Дан одномерный массив, сформировать новый массив по заданному правилу {Delphi} Nickolai47 Помощь студентам 5 16.12.2012 14:51
Одномерный массив. Q basic - Построить новый массив из элементов исходного ,которые больше P. Marishkaa Помощь студентам 2 12.01.2010 16:54