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

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

06.06.2018, 07:25. Показов 1722. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <math.h>
 
using namespace std;
 
int main()
{  
    float a[50];
    int nmin=0;
    float n;
    float s=0, min;
    
    cout << "n=";
    cin >> n;
    
    srand(time(NULL));
    
    for(int i=0; i <= n; i++)
    {
        a[i] = (rand()%120 - rand()%120)*0.1;
        cout<<setw(4)<<a[i]<<endl;
        
    }
        
        min=a[0];
        for(int i=0; i<=n; i++)
        if (fabs(a[i])<min) //сравниваем по модулю
        { 
            min=a[i]; //сохраняем элемент
            nmin=i;  //сохраняем номер
        } 
        cout << "nmin=" << nmin <<"\t"<< "min= " << min << endl; //выводит номер элемента и сам элемент
        for(int i=0; i<=n; i++)
        if (a[i]<0 ) //ищем отрицательный
        { 
            min=a[i];  //сохраняем элемент
            nmin=i;  //сохраняем номер
        }
            
        nmin++;
        for (int i=nmin; i<=n; i++)
        s +=a[i]; 
        cout<<"s="<<s<<endl;
}
Не могу сжать массив, удалив из него все элементы, величина которых находится в интервале [а,b]. Освободившиеся в конце массива элементы заполнить нулями.
Может кто подскажет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2018, 07:25
Ответы с готовыми решениями:

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

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

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

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

6
642 / 444 / 224
Регистрация: 10.06.2016
Сообщений: 2,039
06.06.2018, 08:33 2
sPerson, где у вас в коде интервал [a,b]?
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
05.09.2018, 20:53 3
Цитата Сообщение от sPerson Посмотреть сообщение
Сжать заданный массив, удалив из него все элементы, величина которых находится в указанном интервале
sPerson, здравствуйте. Элементы из заданного интервала можно удалить используя, например, вектор:

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
53
54
55
56
57
58
59
60
61
62
/*
Дата и время написания программы:
 
05.09.2018
20:25
 
Условие задачи:
 
Сжать заданный массив, удалив из него все элементы, величина которых находится в указанном интервале [a, b];
 
Алгоритм:
 
1. Вводим размерность массива (вектора).
2. Объявляем вектор (одномерный вещественный динамический массив) размером n.
3. Вводим элементы вектора.
4. Вводим границы интервала [a, b].
4. Для удаления элементов используем функцию erase() из библиотеки STL.
5. Выводим элементы получившегося вектора на экран.
 
Решение:
*/
 
#include <iostream>
#include <vector>  
 
    using namespace std;
     
int main() { 
    int n; //Объявляем целочисленную переменную (размерность вектора)
    double a, b;
    cout << "Enter an array size:\n";
    cout << "n = ";
    cin >> n; //Вводим количество элементов вектора
    vector<double> arr(n); //Объявляем вектор вещественного типа и размера n (создаем переменную типа вектор)
    cout << "Enter an array:\n";
    for (int i = 0; i < arr.size(); i++) {
        cin >> arr[i]; //Вводим элементы вектора
    }
    cout << "Enter a left interval boundary:\n";
    cout << "a = ";
    cin >> a; //Вводим левую границу интервала
    cout << "Enter a right interval boundary:\n";
    cout << "b = ";
    cin >> b; //Вводим правую границу интервала
    for (int i = arr.size() - 1; i >= 0; i--) { //Пробегаем циклом по вектору
        if (arr[i] >= a && arr[i] <= b) { //Если элементы вектора принадлежат интервалу [a, b]
            arr.erase(arr.begin() + i); //Удаляем элементы, принадлежащие интервалу [a, b]
        }
    }
    cout << "Output of the program:\n";
    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i] << " "; //Выводим элементы вектора после удаления
    }
    //Можно выводить еще так:
    /*
    for (double val : arr) {
        cout << val << " "; //Выводим элементы вектора после удаления (в стиле for_each, нужен подключенный стандарт C++11)
    }
    */
    system("pause"); //Функция задержки экрана консоли
    return 0; //Функция main() возвратила ноль при успешном выполнении программы (то есть, в коде выше ошибок не было)
}
P.S. Если вариант с вектором не подходит, то можно использовать дополнительный массив и просто записать туда элементы, которые не попадают в указанный интервал. Или без дополнительного массива, используя метод сдвига (то есть, удалять каждый элемент с помощью сдвига). Но, на мой взгляд, вариант с вектором самый простой, хотя не самый быстрый. Если нужна скорость, можно создать список на основе структуры и указателя. Вот.
0
672 / 475 / 215
Регистрация: 06.09.2013
Сообщений: 1,306
05.09.2018, 21:01 4
Fixer_84, обменивай в векторе удаляемый элемент с последним, выполняя pop_back, так за линейное время все удаляется без дополнительной памяти
1
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
05.09.2018, 21:41 5
Цитата Сообщение от sPerson Посмотреть сообщение
Может кто подскажет.
В учебных целях (очевидно, как у вас), без векторов и прочей мути удаление делается сдвигом "хвоста" массива влево и занулением последнего элемента
C++
1
2
for(int j=i+1;j<n;j++) a[i-1]=a[i];
a[n-1]=0;
где i - индекс удаляемого элемента.
К тому же вот так for(int i=0; i <= n; i++) делать не надо, в С++ индексация идёт с нуля, поэтому должно быть i<n.
1
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
05.09.2018, 22:18 6
woldemas, спасибо за подсказку и новый полученный опыт. Написал программу по вашему алгоритму, но еще потребовалась сортировка вектора в конце для правильной организации порядка следования элементов (при таком удалении он может нарушится). Еще требовалось заполнить оставшееся место нулями в конце. Я и это доделал. Вот код:

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
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
Дата и время написания программы:
 
05.09.2018
21:30
 
Условие задачи:
 
Сжать заданный массив, удалив из него все элементы, величина которых находится в указанном интервале [a, b];
Освободившиеся в конце массива элементы заполнить нулями.
 
Алгоритм:
 
1. Вводим размерность массива (вектора).
2. Объявляем вектор (одномерный вещественный динамический массив) размером n.
3. Вводим элементы вектора.
4. Вводим границы интервала [a, b].
5. Для удаления элементов обмениваем текущий элемент из [a, b] c последним, а затем вызываем функцию pop_back() для удаления элемента с конца 
6. Сортируем получившийся вектор.
7. Выводим элементы получившегося вектора на экран.
 
Решение:
*/
 
#include <iostream>
#include <vector>
#include <algorithm>   
 
    using namespace std;
     
int main() { 
    int n; //Объявляем целочисленную переменную (размерность вектора)
    double a, b;
    cout << "Enter an array size:\n";
    cout << "n = ";
    cin >> n; //Вводим количество элементов вектора
    vector<double> arr(n); //Объявляем вектор вещественного типа и размера n (создаем переменную типа вектор)
    cout << "Enter an array:\n";
    for (int i = 0; i < arr.size(); i++) {
        cin >> arr[i]; //Вводим элементы вектора
    }
    cout << "Enter a left interval boundary:\n";
    cout << "a = ";
    cin >> a; //Вводим левую границу интервала
    cout << "Enter a right interval boundary:\n";
    cout << "b = ";
    cin >> b; //Вводим правую границу интервала
    for (int i = arr.size() - 1; i >= 0; i--) { //Пробегаем циклом по вектору
        if (arr[i] >= a && arr[i] <= b) { //Если элементы вектора принадлежат интервалу [a, b]
            if (i < arr.size() - 1) swap(arr[i], arr.back()); //Обмениваем местами текущий найденный элемент с последним
            arr.pop_back(); //Удаляем последний элемент
        }
    }
    sort(arr.begin(), arr.end()); //Сортируем элементы для организации правильного порядка при выводе
    cout << "Output of the program:\n";
    for (int i = 0; i < n; i++) {
        if (i < arr.size()) {
             cout << arr[i] << " "; //Выводим элементы вектора после удаления
        } else {
            cout << 0 << " "; //Заполняем оставшееся место нулями
        }
    }
    system("pause"); //Функция задержки экрана консоли
    return 0; //Функция main() возвратила ноль при успешном выполнении программы (то есть, в коде выше ошибок не было)
}
Добавлено через 29 минут
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
В учебных целях (очевидно, как у вас), без векторов и прочей мути удаление делается сдвигом "хвоста" массива влево и занулением последнего элемента
Сделал через сдвиг. Как вариант:

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
53
54
55
56
57
58
59
60
61
62
63
64
/*
Дата и время написания программы:
 
05.09.2018
21:58
 
Условие задачи:
 
Сжать заданный массив, удалив из него все элементы, величина которых находится в указанном интервале [a, b];
Освободившиеся в конце массива элементы заполнить нулями.
 
Алгоритм:
 
1. Вводим размерность массива.
2. Объявляем одномерный вещественный динамический массив размером n.
3. Вводим элементы массива.
4. Вводим границы интервала [a, b].
5. Для удаления элементов сдвигаем элементы и обнуляем последний элемент. 
6. Выводим получившийся массив на экран.
 
Решение:
*/
 
#include <iostream>   
 
    using namespace std;
    
double del(double* arr, int index, int size) { //Функция удаления элемента по заданному индексу
    for (int i = index; i < size - 1; i++) {
        arr[i] = arr[i+1];
    }
    arr[size-1] = 0;
}
     
int main() { 
    int n; //Объявляем целочисленную переменную (размерность массива)
    double a, b;
    cout << "Enter an array size:\n";
    cout << "n = ";
    cin >> n; //Вводим количество элементов массива
    double* arr = new double[n]; //Объявляем динамический массив вещественного типа и размера n
    cout << "Enter an array:\n";
    for (int i = 0; i < n; i++) {
        cin >> arr[i]; //Вводим элементы массива
    }
    cout << "Enter a left interval boundary:\n";
    cout << "a = ";
    cin >> a; //Вводим левую границу интервала
    cout << "Enter a right interval boundary:\n";
    cout << "b = ";
    cin >> b; //Вводим правую границу интервала
    for (int i = n - 1; i >= 0; i--) {
        if (arr[i] >= a && arr[i] <= b) { //Если элемент из интервала [a, b]
            del(arr, i, n); //Удаляем элемент, если он принадлежит интервалу [a, b]   
        }
    }
    cout << "Output of the program:\n";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " "; //Выводим элементы массива после удаления
    }
    delete [] arr; //Освобождаем память, выделенную под массив
    system("pause"); //Функция задержки экрана консоли
    return 0; //Функция main() возвратила ноль при успешном выполнении программы (то есть, в коде выше ошибок не было)
}
0
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
05.09.2018, 22:20 7
Ой, у меня очепятка, конечно же
C++
1
2
for(int j=i+1;j<n;j++) a[j-1]=a[j];
a[n-1]=0;
0
05.09.2018, 22:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2018, 22:20
Помогаю со студенческими работами здесь

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

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

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

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


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

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

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