公共代码(C++的头文件写法和引入)
//本文件的名字为IntArray.h
//头文件的写法
#include <iostream>
using namespace std;
const int MAX_SIZE = 100;
//“整形数组”类:数组元素存储在一个固定大小的物理空间中,但元素的数量是可变的
class IntArray{
int counter; //数组元素计数器
int array[MAX_SIZE]; //用于存储元素的空间,所有元素紧凑地存储在此空间的前部
public:
IntArray():counter(0){
}
IntArray(int a[],int size);
int getCounter()const{
return counter;}
int *getData(){
return array;}
void show()const;
//删除所有负数,只保留非负数。删除操作不破坏剩余元素原来的相对顺序
void NonNegativeOnly();
};
void writeToFile(const char *path);
//简而言之,和正常写法一样,没什么变化
//C++的头文件的引入
#include "IntArray.h"
int main(){
int s[]={
5,-3,-4,2,-8,9,1,4,-7,8,-9,3};
IntArray arr(s,sizeof(s)/sizeof(int));
cout<<"删除前:"; arr.show();
arr.NonNegativeOnly();
cout<<"删除后:"; arr.show();
writeToFile("");
return 0;
}
简单的说,头文件的写法和cpp写法一样,就是文件的后缀改成.h而已,引入和C语言的头文件引入一样!!!
一、首先,问题引入
void IntArray::NonNegativeOnly(){
int to; //用来指定移动非负数的目标位置
for(to=0;to<counter && array[to]>=0; to++);//寻找第一个负数,其位置作为存放非负数的起点位置
if(to>=counter) return; //如果没发现任何负数,结束处理,返回
//从第一个负数的下一个位置开始在数组尾部寻找非负数,若找到,则将该处数据移动到 to 处,然后to增1
//********333********
while(to<counter){
if(array[to]<0){
//删除
for(int i=to;i<counter-1;i++)
array[i]=array[i+1];
counter--;
}
to++;
}
//********666********
counter=to; //更新counter(最后一个非负数的下一个单元的下标值正好等于非负数的个数)
}
对应现象:-4没有删除掉
而代码这样变一下:
//********333********
while(to<counter){
if(array[to]<0){
//删除
for(int i=to;i<counter-1;i++)
array[i]=array[i+1];
counter--;
}else
to++;
}
//********666********
对应现象:-4删除了
二、问题原因
- else的用法默认是最接近else的第一句(即else的用法还不太清楚)
- 进行(原计划)“删除”操作时候存在的一种现象:不管有没有都出现我都偏移(索引移到下一位),本来又负数的,已经移动到了本位置(覆盖到本位置,后面的数据在本位置),又进行了to++的移动;这样把这个数据的筛选漏掉了。所以删除不了-4这个数字。
总的来说:删除操作移动了一次,然后自带to又移动了一次;直接漏掉了要删除该负数的后面一位!!!
三、解决办法
让删除操作的移动和偏移比较的移动均衡一下;即删除了就不偏移了,没删除就偏移。
就是加上else 。