使用C确定相等的差异

时间:2014-07-19 19:44:13

标签: c arrays file sorting input

我是C的新手,一般编程。我正在尝试用C编写一个代码,该代码从名为' data.txt'的文件中读取数字列表(格式为100.000000,200.000000,30000.000002等)。然后它计算列表中所有可能数字之间的所有可能差异。该列表使得多个数字组可能出现相同的差异。

例如,让我们假设" data.txt"包含以下数字列表:

100.000000
200.000000
300.000000
400.000000
500.000000

在此列表中,100的差异发生在:(200-100),(300-200),(400-300),(500-400)。同样,差异200发生在:(300-100)。 (400-200),(500-300)等。

代码需要识别这种相等的差异并打印相等的差异,以及它们相等的组。

我写的代码是:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(){
    clock_t start, end; 
    double time_used;
    /*To measure execution time */
    start = clock();
    FILE* fp = fopen("data.txt", "r");
    FILE* fu = fopen("output.txt","w");
    FILE* fx = fopen("diffdata.txt","w");
    int i,j,k,b;
    int counter=0;
    double a,MAX=0,MIN=0,temp;
    double *arr=malloc(100000*sizeof(double));

    //arr[10000],brr[10000],diff[10000],

    for(i = 0; fscanf(fp, "%lf", &a) == 1; i++) 
    {
        if( i == 10000 ) {
            printf("File content too large\n");
            fclose(fp);
            return 1;
        }
        *(arr+i) = a;
    }

    double *arr2=malloc((i*i)*sizeof(double));
    double *brr=malloc((i*i)*sizeof(double));
    double *diff=malloc((i*i)*sizeof(double));

    for(j=0;j<i-1;j++) {
        for(k=j+1;k<i;k++) {
            if((*(arr+j))<(*(arr+k))) {
                temp=*(arr+k);
                *(arr+k)=*(arr+j);
                *(arr+j)=temp;
            }
        }
    }


    for(j=0;j<i-1;j++) {
        for(k=j+1;k<i;k++) {
            fprintf(fx,"%lf - %lf = %lf\n",*(arr+j),*(arr+k),((*(arr+j))-(*(arr+k))));
            *(arr2+counter) = *(arr+j);
            *(brr+counter) = *(arr+k);
            *(diff+counter) = (*(arr+j)) - (*(arr+k));
            counter++;
        }
    }

    fclose(fx);
    i=counter;
    printf("\n counter is %d \n", counter);
    fx = fopen("diffdata.txt","r");

    /*while(counter>i)
      {
      fscanf(fx,"%lf - %lf = %lf\n", (arr+i),(brr+i),(diff+i));
      i++;
      }
     */

    fprintf(fu,"DIFFERENCE Groups\n");
    for(j=0;j<counter;j++) {
        if(MAX<(*(diff+j))) {
            MAX=*(diff+j);
        }
        if(MIN>*(diff+j)) {
            MIN=*(diff+j);
        }
    }
    a = MIN;
    //printf("\n%lf min \n", a);
    while(a<=MAX) {
        b=0;
        for(k=0;k<i;k++) {
            if(*(diff+k)==a) {
                b++;                                     
            }
        }
        if(b!=0) {
            fprintf(fu,"%lf:\n",a);
            b=0;
            for(k=0;k<i;k++) {
                if(*(diff+k)==a) {
                    b++;
                    fprintf(fu,"\tGroup %d : %lf -         %lf\n",b,*(arr2+k),*(brr+k));                                                         
                }
            }              
        }       
        a=a+1.000000;
    }                              

    end = clock();
    time_used = ((double) (end - start)) / CLOCKS_PER_SEC;

    printf("\nThe time taken  is %f seconds.\n", time_used);

    return 0;
}

问题是,我的代码只检测积分差异,并忽略小数差异。

例如,如果我的&#34; data.txt&#34; file有以下输入数字列表:

100.000000
100.500000
200.000000
200.500000

然后是必需的&#34; output.txt&#34;文件仅包含组(200-100)和(200.5000000-100.500000)

的差异100

但缺少0.500000(100.5000000 - 100.000000)和(200.5000000 - 200.0000000)的差异!

我不知道为什么。任何人都可以帮助我吗?

0 个答案:

没有答案