0 / 0 / 0
Регистрация: 12.11.2017
Сообщений: 72
1

Сжать массив, удалив из него все элементы, величина которых находится в интервале [a,b]

14.11.2017, 19:10. Показов 4734. Ответов 14
Метки нет (Все метки)

В одномерном массиве из N вещественных элементов, вычислить:
• номер минимального по модулю элемента массива;
• сумму модулей элементов массива, расположенных после первого отрицательного элемента.
Сжать массив, удалив из него все элементы, величина которых находится в интервале [a,b]. Освободившиеся в конце массива элементы заполнить нулями.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2017, 19:10
Ответы с готовыми решениями:

Сжать массив, удалив из него все элементы, величина которых находится на интервале [а,b]
1) В одномерном массиве, который состоит из N действительных элементов, вычислить: - минимальный...

Сжать массив, удалив из него все элементы, величина которых находится в интервале [a, b]
что то не получается. помогите пожалуйста. Сжать массив, удалив из него все элементы, величина...

Сжать массив, удалив из него все элементы, величина которых находится в интервале [a,b]
Сжать массив, удалив из него все элементы, величина которых находится в интервале . Освободившийся...

Сжать массив, удалив из него все элементы, величина которых находится в интервале
В одномерном массиве, состоящем из n вещественных элементов, вычислить: Сжать массив, удалив из...

14
836 / 639 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
15.11.2017, 08:01 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
 
auto array_remove(auto it, auto ie, auto cmp){
    while((it != ie) && !cmp(*it))
        ++it;
    
    auto p = it;
    for(; it != ie; ++it){
        if(!cmp(*it))
            *p++ = *it;
    }
 
    while(p != ie)
        *p++ = 0;
    return p;
}
 
int main(void){
    double arr[] = { 5.9, 1., 2., 3., 4., 5., 6., 7., 8., 9., 4.5 };
    double a = 3., b = 7.;
 
    array_remove(std::begin(arr), std::end(arr), [a,b] (const auto& v){ return ((a <= v) && (v <= b)); });
    for(const auto& v : arr)
        std::cout << v << ' ';
    std::cout << std::endl;
 
    //...
 
    float farr[] = { 0.45f, 0.1f, 0.7f, 0.2f, 0.4f, 5.1f, 0.32f };
    float fa = 0.2f, fb = 0.5f;
 
    array_remove(std::begin(farr), std::end(farr), [fa,fb] (const auto& v){ return ((fa <= v) && (v <= fb)); });
    for(const auto& v : farr)
        std::cout << v << ' ';
    return 0;
}
0
0 / 0 / 0
Регистрация: 12.11.2017
Сообщений: 72
15.11.2017, 09:12  [ТС] 3
Спасибо!Но,если возможно,напишите максимально просто(более простые команды),буду благодарен^_^.
0
1500 / 964 / 811
Регистрация: 30.04.2016
Сообщений: 3,334
15.11.2017, 11:46 4
FlyPetty, здравствуйте! Мне удалось сжать массив используя метод сдвига. Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <bits/stdc++.h>
 
using namespace std;
 
void DeleteElement(double* X, int j, int size)
{
    for (int i = j; i < size - 1; i++)
    {
        X[i] = X[i+1];
    }
}
 
int main()
{
    int N, p;
    double a, b;
    cout << "Enter a number of array elements:" << "\n";
    cout << "N = ";
    cin >> N;
    double* arr = new double[N];
    cout << "Enter an array:" << "\n";
    for (int i = 0; i < N; i++)
    {
        cin >> arr[i];
    }
    cout << "Enter a range:" << "\n";
    cout << "a = ";
    cin >> a;
    cout << "b = ";
    cin >> b;
    p = 0;
    for (int i = N; i--;)
    {
        if (arr[i] >= a && arr[i] <= b)
        {
            DeleteElement(arr, i, N);
            p++;
        }
    }
    cout << "The array after removal:" << "\n";
    for (int i = 0; i < N; i++)
    {
        if (i < N - p)
            cout << arr[i] << " ";
        else
            cout << 0 << " ";
    }
    cout << "\n";
    delete [] arr;
    cin.get();
    return 0;
}
P.S. Если вам нужен более простой вариант, то вместо массива можно использовать вектор, так как у него есть встроенная функция удаления элементов.
1
0 / 0 / 0
Регистрация: 12.11.2017
Сообщений: 72
15.11.2017, 18:44  [ТС] 5
Вот уже понятнее),спасибо! Скажите,а чем в этой программе можно заменить cin.get ,а то мы у вузе до такого еще не дошли,буду благодарен)
0
1500 / 964 / 811
Регистрация: 30.04.2016
Сообщений: 3,334
15.11.2017, 18:55 6
Цитата Сообщение от FlyPetty Посмотреть сообщение
Скажите,а чем в этой программе можно заменить cin.get ,а то мы у вузе до такого еще не дошли
FlyPetty,
C++
1
cin.get();
- это задержка экрана консоли. Можно заменить на
C++
1
system("pause");
1
0 / 0 / 0
Регистрация: 12.11.2017
Сообщений: 72
16.11.2017, 13:53  [ТС] 7
Цитата Сообщение от Fixer_84 Посмотреть сообщение
include <bits/stdc++.h>
Это какая библиотека?
И еще,если тебе не сложно,напиши,какие последовательные действия выполняет программа.
0
1500 / 964 / 811
Регистрация: 30.04.2016
Сообщений: 3,334
16.11.2017, 14:23 8
FlyPetty, здравствуйте! Данная библиотека обычно используется на олимпиадах по программированию, чтобы не тратить время на подключение отдельных библиотек. Она просто подключает все необходимые библиотеки автоматически. Вот код программы с комментариями:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <bits/stdc++.h>
 
using namespace std;
 
void DeleteElement(double* X, int j, int size) //Функция удаления элемента (j - позиция (индекс) удаляемого элемента)
{
    for (int i = j; i < size - 1; i++) 
    {
        X[i] = X[i+1]; //Сдвигаем элементы влево
    }
}
 
int main()
{
    int N, p;
    double a, b;
    cout << "Enter a number of array elements:" << "\n";
    cout << "N = ";
    cin >> N; //Вводим размерность массива
    double* arr = new double[N]; //Объявляем двумерный динамический массив
    cout << "Enter an array:" << "\n";
    for (int i = 0; i < N; i++)
    {
        cin >> arr[i]; //Вводим элементы массива
    }
    cout << "Enter a range:" << "\n";
    cout << "a = ";
    cin >> a; //Вводим левую границу диапазона
    cout << "b = ";
    cin >> b; //Вводим правую границу диапазона
    p = 0;
    for (int i = N; i--;) //Двигаемся по массиву справа налево
    {
        if (arr[i] >= a && arr[i] <= b)
        {
            DeleteElement(arr, i, N); //Удаляем элемент, который находится в заданном диапазоне (с позиции i)
            p++; //Подсчитываем количество удаленных элементов
        }
    }
    cout << "The array after removal:" << "\n";
    for (int i = 0; i < N; i++)
    {
        if (i < N - p)
            cout << arr[i] << " "; //Выводим массив после удаления
        else
            cout << 0 << " "; //Заполняем оставшуюся часть массива нулями
    }
    cout << "\n";
    delete [] arr; //Освобождаем память, выделенную под массив
    cin.get(); //Задержка экрана консоли
    return 0;
}
0
0 / 0 / 0
Регистрация: 12.11.2017
Сообщений: 72
16.11.2017, 15:25  [ТС] 9
А для чего мы сдвигаем элементы влево? и еще зачем двумерный динамический массив ,если нужен одномерный или так и нужно?
0
1500 / 964 / 811
Регистрация: 30.04.2016
Сообщений: 3,334
16.11.2017, 15:52 10
FlyPetty, Я ошибся с этим комментарием, торопился. Конечно, массив одномерный. А сдигаем элементы, чтобы имитировать удаление элемента с заданной позиции. Попробуйте посдвигать элементы какого-либо небольшого массива на листе бумаги с заданной позиции и, затем, уменьшить размерность массива на единицу - получите массив с удаленным элементом.
0
0 / 0 / 0
Регистрация: 12.11.2017
Сообщений: 72
20.11.2017, 16:21  [ТС] 11
Здравствуйте! Я вас еще потревожу.Для чего мы вводим здесь void?
Цитата Сообщение от Fixer_84 Посмотреть сообщение
void DeleteElement
И что значит p=0 ?
0
1500 / 964 / 811
Регистрация: 30.04.2016
Сообщений: 3,334
20.11.2017, 16:32 12
FlyPetty, здравствуйте. Функция имеет тип данных void когда не возвращает какого-либо значения (здесь мы просто удаляем элемент и инструкция return не нужна). Переменная p = 0 - это начальное значение счетчика удаляемых элементов, который увеличивается на 1 после каждого удаления (если есть элементы, которые нужно удалить).
1
Диссидент
Эксперт C
26856 / 16758 / 3675
Регистрация: 24.12.2010
Сообщений: 37,524
20.11.2017, 17:17 13
Fixer_84, в строке 34 arr[i] лежит вне массива. (при первом проходе цикла)
1
0 / 0 / 0
Регистрация: 23.03.2018
Сообщений: 4
06.04.2018, 14:10 14
Вот, я немного переделал, но не могу понять почему в конце, когда сжимает массив, не все элементы которые находятся в пределах [a,b] превращаются в 0
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <math.h>
#include <cstdlib>
#include <ctime>
using namespace std;
 
int main (){
    int i, j, n, A[n], min=A[0], imin=0, sum=0, flag=0, a, b, c;
    cin>>n>>a>>b;
    srand(time(NULL));
    for (i=0; i<n; i++){
        A[i]=rand()% 200 - 100;
        cout<<A[i]<<"\t";
    }
    cout<<endl;
    for (i=0; i<n; i++){
        if (fabs(A[i])<min){
            min=fabs(A[i]);
            imin=i;
        }
    }
    cout<<imin<<endl;
    for (i=0; i<n; i++){
        if (A[i]<0){
            c=i;
            flag=1;
            break;
        }
    }
    if (flag == 1){
    for (i=c+1; i<n; i++){
        sum=fabs(A[i])+fabs(A[i]);
        }
    }
    cout<<"sum="<<sum<<endl;
    A[n]=0;
    for (i=0; i<n; i++){
        if (A[i]>=a && A[i]<=b){
            for(j=i; j<n; j++){
                A[j]=A[j+1];
            }  
        }
    }
    for (i=0; i<n; i++){
        cout<<A[i]<<"\t";
    }    
return 0;
}
0
1500 / 964 / 811
Регистрация: 30.04.2016
Сообщений: 3,334
06.04.2018, 17:25 15
Байт, здравствуйте! Да, я на эту свою ошибку внимание обратил

C++
1
2
3
4
5
6
7
8
for (int i = N - 1; i--;) //Двигаемся по массиву справа налево
    {
        if (arr[i] >= a && arr[i] <= b)
        {
            DeleteElement(arr, i, N); //Удаляем элемент, который находится в заданном диапазоне (с позиции i)
            p++; //Подсчитываем количество удаленных элементов
        }
    }
P.S. Вот только теперь говорят я неправильно элемент удаляю, так как просто сдвигаю элементы. Как вы думайте, будет лучше если я просто запишу все кроме 34 строки в новый массив? Я слышал, что эту проблему можно решить так (я имею ввиду правильное удаление из массива), хотя, наверное, проще просто использовать вектор. Но ведь многие говорят, что нужен именно массив...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2018, 17:25
Помогаю со студенческими работами здесь

Сжать массив, удалив из него все элементы, величина которых находится в заданном интервале
Помогите дописать код, чтобы сжать массив, удалив из него все элементы, величина которых находится...

Сжать массив, удалив из него все элементы, величина которых находится в заданном интервале
Сжать одномерный массив, удалив из него все элементы, величина которых находится в интервале ....

Сжать заданный массив, удалив из него все элементы, величина которых находится в указанном интервале
#include &lt;cstdlib&gt; #include &lt;iomanip&gt; #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace...

Сжать массив, удалив из него все элементы, модуль которых находится в интервале [a,b]
Сжать массив, удалив из него все элементы, модуль которых находится в интервале . Освободившиеся в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru