Форум программистов, компьютерный форум CyberForum.ru

Перестановка элементов массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
cook
0 / 0 / 0
Регистрация: 02.10.2010
Сообщений: 25
02.10.2010, 17:12     Перестановка элементов массива #1
Преобразовать одномерный массив ,состоящий из n вещественных элементов таким образом,чтобы сначала располагались все элементы,целая часть которых лежит в интервале [a,b],а потом все остальные.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrishaIrinaChe
 Аватар для IrishaIrinaChe
28 / 28 / 1
Регистрация: 23.09.2010
Сообщений: 200
02.10.2010, 19:13     Перестановка элементов массива #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
37
38
39
40
41
42
43
44
45
46
47
48
#include<iostream.h>
#include<stdio.h>
#include<math.h>
#include<conio.h>
 
int main()
{
 double *ar;
 double *ar_z;  //запасной, дабы с его помощью порядок менять
 int n;
 int i;  
 int a,b;
 cout<<"Vvedite chislo elementov massiva\n";
 cin>>n;
 ar=new [n];  //создали
 ar_z=new [n];
 cout<<"Vvedite promejutok ";
 cin>>a;
 cin>>b;
 
 int j=0,k=(n-1);
 int a1,b1;
 
 if(a>=b) {b1=a;a1=b;}
 else {b1=b;a1=a;}
 
 for(i=0;i<n;i++)
{
  if(((a1<=(fdiv(ar[i])))&&((fdiv(ar[i]))<=b1))||((a1<=(fdiv(ar[i])))&&((fdiv(ar[i]))<b1))
                                                  ||((a1<(fdiv(ar[i])))&&((fdiv(ar[i]))<=b1))||((a1<(fdiv(ar[i])))&&((fdiv(ar[i]))<b1)))
  {
    ar_z[j]=ar[i];
    j++;
  }
  else
  {
   ar_z[k]=ar[i];
   k--;
  }
 }
for(i=0;i<n;i++)
 ar[i]=ar_z[i];
cout<<"Rezultat ";
for(i=0;i<n;i++)
 cout<<ar[i];
getch();
return 0;
}
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
02.10.2010, 20:10     Перестановка элементов массива #3
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
#include <iostream>
#include <vector>
#include <cmath>
 
int main()
{
    std::vector<float> arr;
    std::vector<float> newarr;
    int start_interval = 2;
    int end_interval = 4;
 
    arr.push_back(1.0);
    arr.push_back(2.4);
    arr.push_back(3.2);
    arr.push_back(4.0);
    arr.push_back(3.5);
    arr.push_back(6.8);
    arr.push_back(7.1);
 
    for ( int i = 0; i < arr.size(); ++i)
        if ( floor(arr[i]) >= start_interval  && floor(arr[i]) <= end_interval )
            newarr.push_back(arr[i]);
 
    for ( int i = 0; i < newarr.size(); ++i)
        std::cout << newarr[i] <<"  ";
 
    return 0;
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
02.10.2010, 21:13     Перестановка элементов массива #4
cook,
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
#include <algorithm>
#include <iostream>
#include <iterator>
#include <functional>
#include <cmath>
 
struct IsInInterval : std::unary_function<bool, double>
{
  IsInInterval(int a, int b)
  : a(a)
  , b(b) {
  }
  
  bool operator()(double n) const {
    return std::floor(n) >= a && std::floor(n) <= b;
  }
  
  int a;
  int b;
};
 
int main() {  
        double      arr[] = { 1.3, 2.3, 5.6, 7.8, 5.3, 9.0 };
  const std::size_t size = sizeof(arr) / sizeof(arr[0]);
  
  const int a = 2;
  const int b = 6;
 
  std::stable_partition(arr, arr + size, IsInInterval(a, b));
 
  std::copy(arr, arr + size, std::ostream_iterator<double>(std::cout, " "));
 
  return 0;
}
Результат: http://liveworkspace.org/code/951040...5b505fd6579583
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
02.10.2010, 21:37     Перестановка элементов массива #5
То же, но с использованием boost::bind:
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
#include <algorithm>
#include <iostream>
#include <iterator>
#include <cmath>
#include <boost/bind.hpp>
 
int IntegerPart(double n) {
  return std::floor(n);
}
 
int main() {  
        double      arr[] = { 1.3, 2.3, 5.6, 7.8, 5.3, 9.0 };
  const std::size_t size = sizeof(arr) / sizeof(arr[0]);
  
  const int a = 2;
  const int b = 6;
 
  std::stable_partition(arr, arr + size, 
    boost::bind(IntegerPart, _1) >= a && boost::bind(IntegerPart, _1) <= b);
 
  std::copy(arr, arr + size, std::ostream_iterator<double>(std::cout, " "));
 
  return 0;
}
Результат: http://liveworkspace.org/code/200a87...ed65eff12449c8
Yandex
Объявления
02.10.2010, 21:37     Перестановка элементов массива
Ответ Создать тему
Опции темы

Текущее время: 00:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru