非负筛选器
请修改编辑器中的代码,完成以下功能:实现 IntArray 类的成员函数,删除数组中所有的负数,只保留非负数,且保留下来的元素相对顺序不变,同时把元素个数 counter 更新为剩下的非负数个数。 删除要在原数组上完成(不另开数组):先找到第一个负数的位置作为写入位置,再从它后面开始扫描,遇到非负数就搬到写入位置并把写入位置后移一格。 本题测试数据为 {3, -5, 2, -1, 0, -7, 8},程序不需要输入。 输出示例: Before: 3 -5 2 -1 0 -7 8 After: 3 2 0 8
#include "IntArray.h"
#include <iostream>
using namespace std;
IntArray::IntArray(int a[],int size):counter(size){
for(int i=0;i<counter;i++) array[i]=a[i];
}
void IntArray::show() const {
for(int i=0;i<counter;i++) cout<<array[i]<<' ';
cout << endl;
}
// 删除所有负数,只保留非负数。删除操作不破坏剩余元素原来的相对顺序
void IntArray::NonNegativeOnly(){
int to; // 用来指定移动非负数的目标位置
for(to=0; to<counter && array[to]>=0; to++); // 寻找第一个负数,其位置作为存放非负数的起点位置
if(to >= counter) return; // 如果没发现任何负数,结束处理,返回
// 从第一个负数的下一个位置开始在数组尾部寻找非负数
// 若找到,则将该处数据移动到 to 处,然后 to++
//********333********
//********666********
counter = to; // 更新 counter(非负数的个数)
}
int main() {
int arr[] = {3, -5, 2, -1, 0, -7, 8};
IntArray ia(arr, 7);
cout << "Before:\n";
ia.show();
ia.NonNegativeOnly();
cout << "After:\n";
ia.show();
return 0;
}
控制台
调试终端
