数据的选择错误01

 

=============================================================================================

20130618_第一次修改                         ccb_warlock

=============================================================================================

今天在审阅排序的函数时因为一时大意,发现了一个数据选择错误。由于其现实意义,特别再这篇文章中进行记录。


    具体错误发生在直接排序的函数部分,源码部分如下。
源码部分:

#include<iostream>
using namespace std;

class sort
{
int data[100];
int length;
int number;
public:
sort()
{
length=0;
number=0;
}
sort(int d[],int len)
{
for(int i=1;i<=len;i++)//在构造函数中完成数组输入按位序排列,空出data[0]的空间
data[i]=d[i-1];
length=len;
number=0;
}

void insert()
{
for(int i=2;i<=length;i++)
{
data[0]=data[i];
for(int j=i-1; (j>=0) && (data[0]
              data[j+1]=data[j];
data[j+1]=data[0];
}
}
       
        void output()
{
for(int i=1;i<=length;i++)
cout<<data[i]<<"   ";
}
};

int main()
{
int d[]={9,8,10,7,4,5,6};
sort s1(d,7);

s1.insert();
s1.output();
}

    当时读到data[0]
数据的选择错误01

    从函数处理我们知道我们选择的直接排序是根据从小到大的顺序进行排列,但是现在这个数组的排列明显出现了偏差。

    由于自己的经验还不够,刚看了几遍还是没看出错误的原因,只能用最笨的方法,使用vc++自带的程序调试功能一步步做。


    通过构造函数sort()处理之后,没有错误,我们是按照初始顺序进行的输入操作。
数据的选择错误01

好,我们继续做直接插入函数处理部分,

先做i=2时,没有出现问题,因为8<9,完成交换操作。
数据的选择错误01

数据的选择错误01


继续i=3时的调试,由于10>9,所以直接退出for循环。

继续i=4时的调试。
数据的选择错误01

数据的选择错误01

直接退出了循环,这下我明白了,原来每次进行比较都是用会被j进行修改的原来位序i的数组位置里的数据来进行判断,但是每次进行判断data[i]<10?答案当然是逻辑假,直接退出for循环,直接进行后面的位序操作,就会出现9,8,7,4,5,6,10这样的数据序列。

    找到原因之后,自我反省,当初通过data[0]来保留位序为i的数据就是为了便于与前面的数据进行比较,并保留当前i指向位序的值,方便最后的插入操作,而我却只根据循环中是否有data[i]来改变其中的值,忽略了我们在函数中是通过j间接找到位序i的方法并进行的修改操作。
  
    当然,这篇文章介绍的错误不是什么很有深度的错误,但是作为初学者的我还是由此想到自己在数据选择方面的错误,与数据选择的判断错误。这次错误是很好的经验,当然将来我也会注意程序的一些细节问题。





即使有一天在技术上我已经是个能手,请记住自己应有的责任和保持一个真诚交流、始终渴望追求技术的心。                                                                     ----------ccb_warlock
posted @ 2013-06-18 19:47  粽先生  阅读(185)  评论(0编辑  收藏  举报