Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Snold
0 / 0 / 0
Регистрация: 04.06.2015
Сообщений: 9
#1

Преобразование массива, чтобы сначала располагались все элементы, целая часть которых лежит в интервале [a,b] - C++

06.06.2015, 23:52. Просмотров 738. Ответов 5
Метки нет (Все метки)

Помогите пожалуйста. Нужно преобразовать массив таким образом, чтобы сначала располагались все элементы, целая часть которых лежит в интервале [a,b], а потом - все остальные. При a=2, b=5 не пойму почему выводится 3,5,-3, а потом уже 2
Преобразование массива, чтобы сначала располагались все элементы, целая часть которых лежит в интервале [a,b]
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
#include <iostream>
#include <math.h>
using namespace std;
void qs(float* d, int n);
void read(float* d,const int n);
float task_one (float* d,const int n);
float task_two (float* d,const int n);
int main()
    {
    int n;
    cin >> n;
    float *a = new float[n];
    read (a,n);
    cout << task_one(a,n)<< " " << task_two(a,n) << endl;
    qs(a,n);
    for (int i=0; i<n; i++) cout << a[i] << " ";
    system("pause");
    return 0;
    }
void qs(float* d, int n)
{
    int i=0, n2=0;
    float a,b,c;
    cin >> a >> b;
    while (i<n)
    {
        if (fabs(d[i])>=a && fabs(d[i])<=b && i!=n2) 
        {
            for (int j=i; j>n2; j--) 
            {
                c = d[j]; d[j] = d[j-1]; d[j-1] = c; 
            }
            n2++;
        }
        else i++;
    }
}
void read(float* d,const int n)
{
    for (int i = 0; i<n; i++)
    {
        cin >> d[i];
    }
}
float task_one (float* d,const int n)
{
    int max_i=0;
    for (int i=0; i<n; i++) 
    {  
        if (fabs(d[i])>fabs(d[max_i])) max_i=i;
    }
    return max_i+1;
}
float task_two (float* d,const int n)
{
    int OnePositive=n;
    float sum=0; 
    for (int i=0; i<n; i++) 
    {  
        if (d[i]>0 && OnePositive == n)  OnePositive=i;
    }
    for ( i=OnePositive+1; i<n; i++) sum+=d[i];
    return sum;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2015, 23:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразование массива, чтобы сначала располагались все элементы, целая часть которых лежит в интервале [a,b] (C++):

Преобразовать массив, чтобы сначала располагались все элементы, целая часть которых лежит в интервале - C++
С одномерным массивом, состоящим из n вещественных элементов, выполнить следующее: Преобразовать массив таким образом, чтобы сначала...

Преобразовать массив таким образом, чтобы сначала располагались все элементы, целая часть которых не превышает 1, а потом все остальные - C++
привет всем) никак не могу придумать влгоритм для куска задачи: преобразовать массив таким образом, чтобы сначала располагались все...

Преобразовать массив: сначала расположить все элементы, целая часть которых не превышает 1, потом - остальные - C++
Преобразовать массив таким образом, чтобы сначала располагались все элементы, целая часть которых не превышает 1, а потом — все...

Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает 1 - C++
В одномерном массиве, состоящей из n вещественных элементов, вычислить: 1) номер минимального элемента массива; 2) сумму элементов...

Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает 1 - C++
В одномерном массиве, состоящей из n вещественных элементов, вычислить: 1) номер минимального элемента массива; 2) сумму элементов...

Переставить элементы массива так, чтобы сначала располагались все нули, затем все двойки и, наконец, все единицы - C++
Добрый день ! У меня к вам просьба. Помогите решить задачу по с++ начинающему чайнику. :wall: Задача. В массиве A(N) каждый...

5
mr_mczakenberg
65 / 65 / 31
Регистрация: 10.04.2015
Сообщений: 281
07.06.2015, 11:46 #2
В qs() я до сих пор не понял, почему оно считывало двойку, учитывая что она была в a[0], а a[0] в цикле пропускалось по условию i!=n2... даже после пошагового дебага она каким-то образом появлялась, мистика)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void qs(float* d, int n)
{
    int i=0;
    int a,b,c;
    int pos=0;
    cin >> a >> b;
    while (i<n)
    {
        if (d[i]>=a && d[i]<=b ) 
        {
           c = d[i];
           d[i] = d[pos];
           d[pos]=c;
           pos++;
           i++;
        }
        else i++;
    }
}
И в task_two в последнем цикле
C++
1
for ( int i=OnePositive+1; i<n; i++) sum+=d[i];
1
ValeryS
Модератор
6744 / 5153 / 492
Регистрация: 14.02.2011
Сообщений: 17,320
07.06.2015, 11:52 #3
Цитата Сообщение от Snold Посмотреть сообщение
а потом уже 2
потому что нет такого числа как 2.0, есть какой нибудь 1.9999
посему строгое сравнения и не срабатывают для сравнения необходима какая то дельта например 0.0001
тогда в данном случае,может выглядеть так
C++
1
 if (fabs(d[i])>=(a-0.0001) && fabs(d[i])<=(b+0.0001) && i!=n2)
0
Snold
0 / 0 / 0
Регистрация: 04.06.2015
Сообщений: 9
07.06.2015, 13:56  [ТС] #4
Идея понятна, но все равно ни в какую "2" не хочет выводиться перед
0
mr_mczakenberg
65 / 65 / 31
Регистрация: 10.04.2015
Сообщений: 281
07.06.2015, 15:31 #5
Цитата Сообщение от Snold Посмотреть сообщение
Идея понятна, но все равно ни в какую "2" не хочет выводиться перед
Очень даже выводится:
(см.скрин)
код в qs() поменяйте.
0
Миниатюры
Преобразование массива, чтобы сначала располагались все элементы, целая часть которых лежит в интервале [a,b]  
Snold
0 / 0 / 0
Регистрация: 04.06.2015
Сообщений: 9
07.06.2015, 16:50  [ТС] #6
Спасибо, не то сделал чуть- чуть.

Добавлено через 9 минут
Только теперь другой вопрос появился
http://gyazo.com/df3c4c270e319106e4e1b04df143dbf9
теперь получается так, а как сделать, чтобы после чисел попадающих на a,b выводились все с начала массива. Т.е., если входные данные 10 2 -1 3 5 0 -6 1 0 8 -3 2 5, то мы получаем 9 7 2 3 5 -3 -1 0 -6 1 0 8

Добавлено через 23 минуты
если же добавить в тот же цикл еще условие i!=pos, то все верно, кроме той же 2, которая уезжает в самый конец

Добавлено через 13 минут
либо, если мы оставляем так, то -1 уезжает в конец
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
66
67
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
void qs(float* d, int n);
void read(float* d,const int n);
float task_one (float* d,const int n);
float task_two (float* d,const int n);
int main()
    {
    int n;
    cin >> n;
    float *a = new float[n];
    read (a,n);
    cout << task_one(a,n) << " " << task_two(a,n) << endl;
    qs(a,n);
    for (int i=0; i<n; i++) cout << a[i] << " ";
    system("pause");
    return 0;
    }
void qs(float* d, int n)
{
    int i=0;
    int a,b,c;
    int pos=0;
    cin >> a >> b;
    while (i<n)
    {
        if (fabs(d[i])>=a && fabs(d[i])<=b ) 
        {
           c = d[i];
           d[i] = d[pos];
           d[pos]=c;
           pos++;
           i++;
        }
        else i++;
    }
}
void read(float* d,const int n)
{
    for ( int i = 0; i<n; i++)
    {
        cin >> d[i];
    }
}
float task_one (float* d,const int n)
{
    int max_i=0;
    for (int i=0; i<n; i++) 
    {  
        if ((fabs(d[i]))>(fabs(d[max_i]))) max_i=i;
    }
    return max_i+1;
}
float task_two (float* d,const int n)
{
    int i;
    int OnePositive=n;
    int sum=0; 
    for (int i=0; i<n; i++) 
    {  
        if (d[i]>0 && OnePositive == n)  OnePositive=i;
    }
    for (int i=OnePositive+1; i<n; i++) sum+=d[i];
    return sum;
}
0
07.06.2015, 16:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2015, 16:50
Привет! Вот еще темы с ответами:

Преобразовать массив, чтобы сначала располагались все положительные элементы, а потом все отрицательные - C++
Добрый день, в поиске ничего подходящего не нашлось. Нет времени уже самому подробно вникать, нужна помощь :( Задание: ...

Преобразовать массив, чтобы сначала располагались все положительные элементы, а потом — все отрицательные - C++
Здравствуйте, мне срочно нужна помощь:В одномерном массиве, состоящем из n целых элементов, вычислить: 1) произведение элементов массива...

Преобразовать массив, чтобы сначала располагались все положительные элементы, а потом – все отрицательные - C++
Здравствуйте. Помогите, пожалуйста, разобраться с указанным заданием. Первые два пункта, вроде, получились, а вот последний (сортировка)...

Преобразовать массив, чтобы сначала располагались все положительные элементы, а потом все отрицательные - C++
Помогите исправить ошибку, пожалуйста. Тут 3 задания в одном, ошибка в третьем. Задача 3: Из общего задания: &quot;Примечание 1: если в задании...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.