C ++数组间隔

时间:2017-11-21 21:35:25

标签: c++ arrays sorting

#include <math.h>
#include <iostream>
#include <cstdlib>
#include <stdlib.h>
#include <time.h>
#include <cstring>


double MAX(int Size,double arr[]){
int max =arr[0];
for (int i = 1; i < Size; ++i)
{
    if(fabsf(arr[i])>max) 
    max = fabsf(arr[i]);
}
return max;

}

double SUM(int Size,double arr[]){
double sum = 0;
int i = Size -Size;

do{
    i++;
    if(arr[i]>0) break;
}while(i>0);

if(i==0) return 0;

for(i=i;i<Size;i++)
    sum =sum+arr[i];    
return sum;
}






void sort(int Size,double *arr, double A, double B){
int count = 0;
int i,j;
for(i = 0;i<Size;i++){
    double tmp = *(arr+i)<0?  : *(arr+i);
    if(A<=tmp && tmp<=B){
        count ++;
    }
}

i = 0;
while(count>0){
    printf("%d",count);
    double tmp = *(arr+i)<0? : *(arr+i);
    if(A<=tmp && tmp<=B){
        for(j =i;j<Size;j++){
            *(arr+j)=*(arr+j+1);
        }
        *(arr+Size-1)=0;
        count--;
        Size--;
    }
    if(A>tmp || tmp>B){
        i++;
    }   
  }
}






int main(int argc, char** argv) {
double *arr;
int arrSize = 10;
int ifRand = 0;
double A,B,max,sum;

char test[] = "-rand";
for(int i=1;i<argc;i++)
{
    if(strcmp(test,argv[i])==0){
        ifRand = 1;
        break;
    }
}

fflush(stdin);
if(ifRand){
    srand(time(0));
    arr = new double[arrSize];
    for (int i=0; i<10; i++)
        arr[i] =(double)rand()/RAND_MAX*100-50;
    A = (double)rand()/RAND_MAX*100-50;
    B = (double)rand()/RAND_MAX*100-50;
    if(A>B){
        double tmp = A;
        A=B;
        B=tmp;
    }
}else{
    printf("\n Ievadiet masiva garumu: ");
    scanf("%d", &arrSize);
    arr = new double[arrSize];
    double elements;
    for (int i = 0; i < arrSize; i++) {
        printf("Ievadiet masiva elementu %d \n", i + 1);
        scanf("%lf", &elements);
        arr[i] = elements;
    }
    printf("Ievadiet A \n");
    scanf("%lf", &A);
    printf("Ievadiet B \n");
    scanf("%lf", &B);
}
printf("Masivs:\n");
for (int i = 0; i < arrSize; i++) {
    printf("\%.3f  ", arr[i]);
}
printf("\nA = %.3f",A);
printf("\nB = %.3f",B);

max = MAX(arrSize,arr);
sum = SUM(arrSize,arr);
sort(arrSize,arr,A,B);

printf("\nLielaka vertiba ir %.3f",max);
printf("\nSumma vertibam pec pirma pozitiva elementa ir %.3f",sum);
printf("\nMasivs pec saspiesanas:");
for (int i = 0; i < arrSize; i++) {
    printf("\%.3f  ", arr[i]);
}

return ifRand;
}

添加完整代码。

我有用户决定大小和元素值的数组,他还要决定区间A和B. A和B之间的所有数字都必须在数组前面移动,我拥有的代码是我的东西发现它被用于类似的代码,A和B之间的所有数字都将被删除,其余的数字被推到开始。

我需要的是:在5个元素{1,2,3,4,5}和区间A(2)和B(4)的数组中。结果应该看起来像{2,3,4,1,5}。

如果还有其他方法,我不需要上面的代码。它正是我发现并尝试使用的。

2 个答案:

答案 0 :(得分:1)

  

我需要的是:在5个元素的数组中{1,2,3,4,5}   和区间A(2)和B(4)。结果应该看起来像{2,3,4,1,5}。一世   如果有其他方法,不需要上面的代码。它正是我所拥有的   发现并试图使用。

您可以使用标头std::stable_partition中声明的标准算法<algorithm>

这是一个示范程序

#include <iostream>
#include <utility>
#include <iterator>
#include <algorithm>

int main()
{
    int a[] = { 1, 2, 3, 4, 5 };
    std::pair<int, int> range(2, 4);

    for (int x : a) std::cout << x << ' ';
    std::cout << std::endl;

    std::stable_partition( std::begin( a ), std::end( a ),
        [&]( const int &item ) 
        { 
            return range.first <= item && item <= range.second; 
        });

    for (int x : a) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}

程序输出

1 2 3 4 5
2 3 4 1 5

答案 1 :(得分:0)

查看http://en.cppreference.com/w/cpp/algorithm/stable_partition并按照以下方式使用它:

void sort_to_front(int Size, double *arr, double A, double B)
{
    stable_partition(arr, arr + Size, [&](double a){ return a >= A && a <= B; });
}