? 發問時間: 電腦與網際網路程式設計 · 1 0 年前

fortran 去除重複資料點

請教一下各位先進,問題已爬過各大論壇以及GOOGLE了。

如果我有一個二維XY點資料test.txt.其檔案內容大致如下,

X---- Y

0----0.64

0----0.63 !重複

1----0.64

2----0.67

2----0.68 !重複

3----0.64

0----0.64

1----0.64

1----0.67 !重複

2----0.68

3----0.64

3----0.63 !重複

由於資料過於龐大所以需要用fortran來作運算處理,

請問該怎樣才可以將檔案內重複的點資料刪除,

可以提供相關的指令嗎?或是幫我看一下程式

(附上我的程式無毒已掃過) 謝謝

http://www.badongo.com/file/14561764

已更新項目:

Jacob Lee最後結果希望變成

X---- Y

0----0.64

1----0.64

2----0.67

3----0.64

0----0.64

1----0.64

2----0.68

3----0.64

判斷重複-->刪除重複--->繼續排列

亦可用C語言來寫!!我在自己讀進FORTRAN~

麻煩你的幫忙了!!!謝謝

2 個已更新項目:

Jacob Lee大大~

不會有缺號~會一直重複循環90次~

謝謝你的幫忙!!!

3 個已更新項目:

再補充一下!

不會有缺號~會一直循環90次~

要同時刪除X所對應的Y數據!!

還有重複數的次數最多只有兩次!!

謝謝~真是麻煩了!!

1 個解答

評分
  • 1 0 年前
    最佳解答

    看不懂你重覆的定義耶!不管是

     (x, y) 完全一樣?

     y 一樣

     x 一樣

    都不對!

    這個版面會 ForTran 的人不多

    個人 ForTran 也已20年沒寫,

    手邊也沒 Compiler

    只看得懂它在做什麼

    沒辦法 找錯/寫新的

    C 也可?

    還是有演算法就可以?

    2009-04-21 17:35:55 補充:

    所以,它應該是

    0

    1

    2

    3

    但有可能會有同號的在中間,要刪除,對吧?

    那,會有缺號的嗎?

    2009-04-21 22:32:46 補充:

    我寫了一個,看看是不是你要的。

    它會

     把重覆的,加上列號,印到標準輸出;

     把正確的,輸出到另一個檔。

    輸入檔的檔名可

     由參數給

     執行後輸入

    若檔案不存在,會要求輸入

    輸出檔主檔名為輸入檔加上四位數序號

    為了到 Linux 不要改太多,

    我盡量不用 M$ 專用的東西。

    #include <io.h>

    #include <stdio.h>

    #include <stdlib.h>

    #include <string.h>

    int main(int argc, char *argv[])

    { FILE *fpR, *fpW[2];

    char buf[FILENAME_MAX<<1], *ptr;

    int b, i, line, x, xp;

    if (argc >= 2)

    { i = strlen(strncpy(buf, argv[1], FILENAME_MAX));

    goto OPEN;

    }

    do

    { printf("Please enter the input filename: ");

    i = (int) strlen(fgets(buf, FILENAME_MAX, stdin));

    buf[--i] = '\0';

    OPEN:

    fpR = fopen(buf, "r");

    } while (fpR == NULL);

    ptr = buf + i;

    while (ptr>buf && *--ptr != '.');

    if (ptr != buf)

    { line = i - (ptr-buf);

    memmove(ptr + 4, ptr, line+1);

    } else

    line = 0,

    ptr = buf + i;

    i = 0;

    do

    { sprintf(ptr, "%04d", i);

    if (line)

    ptr[4] = '.';

    fpW[1] = fopen(buf, "r");

    if (fpW[1] != NULL)

    fclose(fpW[1]), ++i;

    } while (fpW[1] != NULL && i<10000);

    if (i == 1000)

    { fprintf(stderr, "No available filename to use.\n");

    exit(1);

    }

    fpW[0] = fopen(buf, "w");

    fpW[1] = stdout;

    xp = 3; i = 0;

    while (fscanf(fpR, "%d", &x) == 1)

    { fgets(buf, FILENAME_MAX<<1, fpR);

    b = x == xp;

    if (b)

    fprintf(fpW[1], "Line%5d ", i);

    fprintf(fpW[b], "%d%s", x, buf);

    xp = x; ++i;

    }

    fclose(fpW[1]);

    fclose(fpR);

    system("pause");

    return 0;

    }

    若你不會 compile,可以下載

    http://jacob_grace.250free.com/DAT/X_Y.zip

    若下載版不能跑,你還要下載

    http://www.microsoft.com/downloads/details.aspx?fa...

    2009-04-21 22:33:44 補充:

    #include <io.h>

    那列可以不用!

    我本來用了 M$ 專用的東西,後來不用,忘了刪。

    2009-04-21 22:36:23 補充:

    有段 code 沒 copy 到,

    若在 linux 應該會 comple 不過!

    #ifndef FILE_MAX

    #define FILE_MAX 260

    #endif

    如果你 compile 不過,把它放到 main 前面去

    2009-04-22 06:43:59 補充:

    最後的

    fclose(fpW[1]);

    是錯的!

    fclose(fpW[0]);

    才對

    2009-04-22 07:54:05 補充:

    都改好了,包括你要的新功能。

    下載處一樣,而且裡面有原始程式。

    沒詳細測,〝大概〞沒問題,你試用看看。

    2009-04-22 07:57:46 補充:

    不好意思,沒看到〝會有重覆兩次的〞!

    那可能會有錯!

    我再改一下

    2009-04-22 08:45:02 補充:

    我看了我的程式,並做了實驗,重覆兩次沒有問題,輸出正確。

    你用用看。

還有問題?馬上發問,尋求解答。