C 数组间隔

C++ array interval

本文关键字:数组      更新时间:2023-10-16

请参阅下面的完整代码:

#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}。

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

我需要的是:在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

请查看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; });
}