有关二维数组插入新的数据的问题

时间:2008-05-13 19:42:18   来源:论坛整理  作者:  编辑:chinaitzhe
现有二维数组,共两列。第一列应该从0-99,现在第一列中缺少很多数据。希望把缺少的数据补上,同时与他相对的第二列中的数据补为0。示例有下列数据块:
data 1
51, 156
52, 253
53, 560
54, 389
55, 587
57, 328
58, 198
59, 44
60, 29
61, 25
62, 50
63, 83
64, 67
65, 215
66, 233
67, 277
68, 267
70, 143
71, 93
72, 31
73, 42
74, 49
75, 42
76, 84
77, 231
78, 169
79, 216
80, 229
81, 336
82, 158
85, 80
86, 30
89, 30
90, 36
91, 152
92, 50
93, 67
94, 28
data 2
51, 163
52, 258
53, 596
54, 425
55, 479
57, 343
58, 202
59, 40
61, 25
62, 52
63, 87
64, 68
65, 239
66, 237
67, 290
68, 242
70, 153
71, 99
72, 34
73, 36
74, 55
75, 47
76, 85
77, 229
78, 177
79, 224
80, 234
81, 356
82, 168
85, 82
86, 33
89, 34
90, 36
91, 151
92, 53
93, 61
94, 27
95, 26
补全后第一列从0-99,补充的第一列相对的第二列为0。文本文件中有很多段这样的数据都需要补充。请高手出招啊!
网友回复:补全之后的数据仍然需要存放到数组里吗?建议再开一个数组,把原数组的东西一个一个往里拷,连续则拷,不连续则补。
网友回复:开一个新数组 初始化为第一列0~99,第2列都0,然后在把原有数据通过第一列数值拷贝过去
网友回复:这个就行

引用 1 楼 csdn5211 的回复:
补全之后的数据仍然需要存放到数组里吗?建议再开一个数组,把原数组的东西一个一个往里拷,连续则拷,不连续则补。

网友回复:文本文件?
读出来,清空文件,不需修改的原样写入,数组补完后写入
数组补充方法见1楼
网友回复:打开一个新的文件,打开存放数据的文件,读取里面的内容,假如发现当前的数据的第一列不大于当前的记数值(计数器从0至99),则写入当前记数值,并将第二列设为0,当碰到段分隔符时,则重置计数器,然后重复上述过程,直至原来的数据文件被读完.
网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





#define LINE 100

#define ROW  2

typedef int ARRAY_LINE_ROW[LINE][ROW];    



int main()

{



    int i;

    ARRAY_LINE_ROW ArrayDst;

// 已知ArrarSrc[LINE1][2],这是缺失不齐的数组            

    ...

    for(i = 0; i<LINE; i  )

    {

        ArrayDst[i][0] = i;

        ArrayDst[i][1] = 0;



    }    

    for(i = 0; i<LINE1; i  )

    {

        ArrayDst[ArrarSrc[i][0]][1] = ArrarSrc[i][1];

    }

    ...

    return 0;

}




网友回复:这种情况,不推荐用数组, 最好用链表来处理,一次性读入这一段数据,然后在链表中进行插入,这样速度快,因为多次的插入操作链表比数组操作快很多.
网友回复:那个
data 1
data 2

也是文本里的东西吗?
网友回复:
引用 7 楼 Inhibitory 的回复:
这种情况,不推荐用数组, 最好用链表来处理,一次性读入这一段数据,然后在链表中进行插入,这样速度快,因为多次的插入操作链表比数组操作快很多.


这个题目的非凡性,决定了用数组更方便,难道你不觉得?
网友回复:直接声明一个int a[2][100];

初始化 a[0][0...99]=0...99 ; a[1][0...99]=0;
然后读文件 第一个数做下标 第二个数做数组元素的值,完全不用考虑缺失的部分


我觉得这样的效率是最高的 因为没有涉及到数据的移动 而且也很好实现
总体来看这个问题 还是数组比链表好用
网友回复:文件数据是二维数组,程序内部表示未必也要二维数组,根据你的要求,一维数组正合适。

C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



#include <stdio.h>



#define DATARANGE 100



void main(void){

  FILE * pf;

  int data[DATARANGE];

  int i,i2;



  if(NULL == (pf = fopen(...))){...}



  memset(data, 0, sizeof(data));

  while(!feof(pf)){

    fscanf(pf,"%d, %d\n",&i, &i2);

    if(i < 0 || i >= DATARANGE){...}

    data[i] = i2;

  }



// Output

  for(i = 0;i < DATARANGE;i  )

    printf("%d, %d\n",i,data[i]);

}


网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





//文件读取,注重去掉文件结尾最后一个回车,

#include <stdlib.h>

#include <string.h>



int main()

{

    int buffer[2][100];

    for(int i = 0; i<2; i  )

        for(int j=0; j<100; j  )

            buffer[i][j] = 0;    



    int rowCount=0, colCount=0;

    char cInput[20];

    FILE* pFile=fopen("input.txt", "r");

        

    fgets(cInput, 20, pFile);    //跳过第一个data

    while (!feof(pFile))

    {

        fgets(cInput, 20, pFile);

    

        if(cInput[0]=='d')

            rowCount  ;

        else

        {

            char *p=strtok (cInput,", ");

            int index=atoi(p);

            p=strtok(NULL," ");

            int number=atoi(p);



            buffer[rowCount][index]=number;

        }        

    }

    for(int i = 0; i<2; i  )

    {

        for(int j=0; j<100; j  )

        {

            printf("M",buffer[i][j]);

        }    

        printf("\n");

    }

    fclose(pFile);

}


网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

   0   0   0   0   0   0   0   0   0   0   0 156 253 560 389 587   0 328 198  44

  29  25  50  83  67 215 233 277 267   0 143  93  31  42  49  42  84 231 169 216

 229 336 158   0   0  80  30   0   0  30  36 152  50  67  28   0   0   0   0   0



   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

   0   0   0   0   0   0   0   0   0   0   0 163 258 596 425 479   0 343 202  40

   0  25  52  87  68 239 237 290 242   0 153  99  34  36  55  47  85 229 177 224

 234 356 168   0   0  82  33   0   0  34  36 151  53  61  27  26   0   0   0   0



请按任意键继续. . .


网友回复:照着刚才的算法编了一个,测试过没有问题
你最好保证文件的格式正确 一组数据中间用逗号分开,不同组数据在不同的行

C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



#include <stdio.h>



int main()

{

    int i=0;

    int temp1,temp2;

    int a[2][100]={0};

    FILE *p;



    //初始化数组

    for(i=0; i<100; i  )

    {

        a[0][i]=i;

        a[1][i]=0;

    }



    //读文件

    if((p=fopen("a.txt","r")) == NULL) 

        return 0;

    printf("原文件内容\n");

    while(!feof(p))

    {

        fscanf(p,"%d,%d", &temp1, &temp2);

        a[1][temp1]=temp2;

        printf("%d  %d \n",temp1,temp1);

    }

    fclose(p);



    //查看结果

    printf("修改后内容\n");

    for(i=0; i<100; i  )    

        printf("%d  %d \n",a[0][i],a[1][i]);



    return 0;

}


网友回复:还有
你的一个数据干什么用的啊,假如只是0-99的常数 用一维数据就行了,前一个数可以用数组下标表示
网友回复:有一个新的想法,先定义一个int arrya[100][1]的数组

1. 第二维全部初始化为0(即array[i][0] = 0)
2. 从文件中读取一行数据(得到两个数字a, b), 然后赋值array[a][0] = b. 直到读取完一段数据块 Data n
3. 把这个数组中的值写入新的文件
4. 重复1到4直到文件结束.

这种做法的省去了插入数组元素要移动的大量操作, 改为直接为数组的元素赋值.
局限性也是显而易见的, 第一维不能重复, 但看楼上给出的数据, 应该满足要求.
但优点是简单易懂, 操作方便.

网友回复:呵呵, 失误失误, 直接定义数组为int array[100]就行了, int array[100][1]太别扭了.
修改array[a] = b;
网友回复:
引用 9 楼 Treazy 的回复:
引用 7 楼 Inhibitory 的回复:
这种情况,不推荐用数组, 最好用链表来处理,一次性读入这一段数据,然后在链表中进行插入,这样速度快,因为多次的插入操作链表比数组操作快很多.


这个题目的非凡性,决定了用数组更方便,难道你不觉得?


开始没仔细看题目, 只看到了大量的插入操作, 就想当然尔使用链表比数组更合适.
确实是数组更好.
网友回复:谢谢大家了。这是个二维数组,第一维是质量数,第二维是对应的丰度值。data1,data2都是文本文件中的数据块,每段数据是不同的时间采集出来的。而且这个文本文件还有很多段这样的数据。所以不能单用一维。这些数据补齐后,还要用这些数据作出图形,就是很多个二维平面在不同时间轴的叠加。也就是三维图了。还想问问各位,针对这些数据有什么好的作图软件呢?主要是做完图后还要进行波峰提取,小波分析这样的处理。再次多谢了!
网友回复:14楼的兄弟,我的数据格式就是这样按列存的。原文件不是这样的,这是经过提取后的数据。我给大家看得是冰山一角的数据,这样的数据共380段。每段的第一维,是从0-499的,需要按顺序添加好多的缺失数据,第二列缺失的数据就按0来处理的。我把原文件的前两段贴出来,大家指点一下,看有没有什么更好的提取办法。
NAME: ¦SC301 ¦CN1 ¦MP1-MODN:105(0.0) ¦AM5484 ¦PC47 ¦SN27 ¦WD1.2 ¦TA2.6 ¦TR1138.3 ¦FR299-302 ¦RT4.9961 ¦MN0.091 ¦RA0.0739 ¦IS67280 ¦MO20: 105 120 53 54 81 57 106 52 80 67 68 66 77 79 58 65 78 82 91 103 ¦EW0-6 ¦FG0.845 ¦TN7.649 ¦OR2 ¦NT0
RE
0 41949 12647 12685
NUM PEAKS: 73
(51,156 )(52,253 )(53,560 )(54,389 )(55,587 )
(57,328 )(58,198 )(63,83 )(64,67 )(65,215 )
(66,233 )(67,277 )(68,267 )(70,143 )(71,93 )
(76,84 )(77,231 )(78,169 )(79,216 )(80,229 )
(81,336 )(82,158 )(90,36 )(91,152 )(103,143 )
(104,81 )(105,999 )(106,269 )(120,618 )(121,70 )
(59,44 N0.3)(60,29 N0.4)(61,25 N0.4)(62,50 N0.3)(72,31 N0.4)
(73,42 N0.4)(74,49 N0.3)(75,42 N0.3)(85,80 N0.3)(86,30 N0.4)
(89,30 N0.4)(92,50 N0.3)(93,67 N0.3)(94,28 N0.4)(102,38 N0.3)
(107,45 N0.3)(110,37 N0.4)(115,41 N0.4)(117,44 N0.4)(118,21 N0.4)
(119,60 N0.3)(156,24 N0.4)(250,13 N0.5)(251,19 N0.4)(266,22 N0.4)
(267,21 N0.4)(268,16 N0.5)(281,48 N0.3)(282,30 N0.4)(283,43 N0.3)
(284,17 N0.4)(328,16 N0.5)(341,34 N0.4)(342,14 N0.5)(344,13 N0.5)
(356,53 N0.3)(357,30 N0.4)(368,13 N0.5)(393,19 N0.5)(430,24 N0.4)
(431,15 N0.5)(476,16 N0.5)(490,17 N0.5)

NAME: ¦SC301 ¦CN2 ¦MP2-MODN:105(0.0)-56 ¦AM5421 ¦PC47 ¦SN27 ¦WD1.2 ¦TA2.6 ¦TR1138.3 ¦FR299-302 ¦RT4.9961 ¦MN0.092 ¦RA0.0746 ¦IS67885 ¦MO20: 105 120 53 54 81 57 106 52 80 67 68 66 77 79 58 65 78 82 91 103 ¦EW0-6 ¦FG0.840 ¦TN7.807 ¦OR1 ¦NT0
RE
0 42326 12760 12799
NUM PEAKS: 82
(51,163 )(52,258 )(53,596 )(54,425 )(55,479 )
(57,343 )(58,202 )(63,87 )(64,68 )(65,239 )
(66,237 )(67,290 )(68,242 )(70,153 )(71,99 )
(76,85 )(77,229 )(78,177 )(79,224 )(80,234 )
(81,356 )(82,168 )(90,36 )(91,151 )(103,143 )
(104,84 )(105,999 )(106,273 )(120,626 )(121,76 )
(356,57 )(59,40 N0.4)(61,25 N0.5)(62,52 N0.3)(72,34 N0.4)
(73,36 N0.4)(74,55 N0.3)(75,47 N0.3)(85,82 N0.3)(86,33 N0.4)
(89,34 N0.4)(92,53 N0.3)(93,61 N0.3)(94,27 N0.4)(95,26 N0.5)
(102,39 N0.3)(107,42 N0.4)(108,13 N0.5)(110,29 N0.5)(115,50 N0.3)
(117,48 N0.3)(118,24 N0.4)(119,59 N0.3)(128,11 N0.5)(207,23 N0.5)
(221,20 N0.4)(250,14 N0.5)(251,21 N0.4)(255,14 N0.5)(257,13 N0.5)
(266,24 N0.4)(267,25 N0.4)(281,48 N0.3)(282,29 N0.4)(283,47 N0.3)
(295,11 N0.5)(298,11 N0.5)(326,12 N0.5)(341,38 N0.4)(344,13 N0.5)
(345,11 N0.5)(357,30 N0.4)(358,12 N0.5)(368,14 N0.5)(370,12 N0.5)
(379,13 N0.5)(393,22 N0.4)(424,11 N0.5)(430,27 N0.4)(476,18 N0.4)
(490,19 N0.4)(492,11 N0.5)
每段数据以NAME开头,括号中第一个是质量数,采集时丰度为0的质量数就没有记录,现在就是需要添加这部分数据。质量数从0-499的;括号中第二个是丰度;括号中的N0没意义,提取时不要它。共有这样的380段数据。请大家出招啊!谢谢了!
网友回复:大家帮忙啊!
网友回复:16楼的高手再说具体点好吗?还没有用过链表。多谢了!
网友回复:补全后第一列从0-99,补充的第一列相对的第二列为0。文本文件中有很多段这样的数据都需要补充。请高手出招啊!


硬没看懂,唉,我水平太差了。
网友回复:直接赋值就行了呀,似乎不是很麻烦吧
网友回复:这么做的目的是什么呢?

最根本的办法是修改写文件时的程序,直接把等于0的那部分也写进去
网友回复:谢谢各位,补齐数据的问题已经解决了。现在是用这堆数据把图作出来,就是不同时间段二维数据的叠加,也就是三维数据了。用什么软件好些呢?对后续处理也方便呢?
关键字:二维,数组,插入,数据,问题,

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面