C++的头文件写法和引入,删除元素

公共代码(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删除了
在这里插入图片描述

二、问题原因

  1. else的用法默认是最接近else的第一句(即else的用法还不太清楚)
  2. 进行(原计划)“删除”操作时候存在的一种现象:不管有没有都出现我都偏移(索引移到下一位),本来又负数的,已经移动到了本位置(覆盖到本位置,后面的数据在本位置),又进行了to++的移动;这样把这个数据的筛选漏掉了。所以删除不了-4这个数字。
    总的来说:删除操作移动了一次,然后自带to又移动了一次;直接漏掉了要删除该负数的后面一位!!!

三、解决办法

让删除操作的移动和偏移比较的移动均衡一下;即删除了就不偏移了,没删除就偏移。
就是加上else 。

猜你喜欢

转载自blog.csdn.net/weixin_44763594/article/details/123742591