Письменные числа меньше прочитанных из файла - PullRequest
0 голосов
/ 13 января 2020

Итак, у меня есть эта программа, которая читает два столбца целых чисел из файла и сохраняет их в 2-мерном массиве, а затем сокращает массив в соответствии с первым столбцом. Эти цифры могут появляться несколько раз. Вот почему мне нужен другой, который хранит номера индивидуально. Числа могут существовать слева и справа от столбца. Проблема заключается в том, что числа, хранящиеся в этом массиве, меньше, чем числа в файле (он печатает 6110 чисел, а отдельные числа - 7115)

Файл выглядит следующим образом:

1381    5026
1381    5323
1381    6347
1383    1384
1383    1389
1383    2963
1383    4179
1384    56
1384    762
1384    1049
1384    1154

Код выглядит так:

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

int mapdoublesize(int** map,int nodes){
    int* new_array=malloc(nodes*2*sizeof(int));
    if(new_array==NULL){
        printf("Error allocating memory\n");
        abort();
    }

    for(int i=0;i<nodes;i++){
        new_array[i]=(*map)[i];
    }
    nodes*=2;
    free(*map);
    *map=new_array;
    return nodes;
}

typedef struct {
    int start;
    int end;   
} path;

int cmp(const void *a,const void *b){
    int l=((path*)a)->start;
    int r=((path*)b)->start;

    if(l>r)
        return 1;
    if(l<r)
        return -1;
    if(l==r)
        return 0;
}

int doublesize(path** array,int n){
    path* new_array=malloc(n*2*sizeof(path));
    if(new_array==NULL){
        printf("Error allocating memory\n");
        abort();
    }

    for(int i=0;i<n;i++){
        new_array[i]=(*array)[i];
    }
    free(*array);
    *array=new_array;
    n*=2;
    return n;

}


int main()
{
    int maxsize=10;
    int test;
    path* array=malloc(maxsize*sizeof(path));
    if(array==NULL) {
        printf("Error allocating memory\n");
        abort();
    }


    FILE* fd=fopen("Test.txt","r");
    if(fd==NULL) {
        printf("Error opening file\n");
        abort();
    }
    char buff[200];
    int counter=0;

    char c;
while(fgets(buff,200,fd)) {

        c=buff[0];
        if(c=='#') {
            continue;
        }
    sscanf(buff,"%d%d",&array[counter].start,&array[counter].end);
        counter++;
        if(counter==maxsize){
           maxsize=doublesize(&array,maxsize); 
    }

    }
    maxsize=counter;
    qsort(&array[0],maxsize,sizeof(path),cmp);


    counter = 0;
int nodes = 10;
int *map = malloc(nodes * sizeof(int));
if (map == NULL) {
    printf("Error allocating memory\n");
}   
int i;
for(i=0;i<maxsize;i++){
    if(map[counter-1]==array[i].start)
        continue;
        map[counter]=array[i].start;
        counter++;
        if(counter==nodes){
          nodes=mapdoublesize(&map,nodes);
        }
}
int j;
for(i=0;i<maxsize;i++){
    for(j=0;j<counter;j++){
        if(map[j]==array[i].end);
            break;
    }
    if(j!=counter)
        continue;
    map[counter]=array[i].end;
    counter++;
    if(counter==nodes)
        nodes=mapdoublesize(&map,nodes);
}

nodes=counter;
for(i=0;i<nodes;i++){
    printf("%d\n",map[i]);
}
printf("%d\n",nodes);   
    fclose(fd);
    free(array);
    return 0;
}

1 Ответ

3 голосов
/ 13 января 2020

У вас есть потенциальная проблема в этой l oop строке 112 вашего кода, предложение if содержит точку с запятой, что делает его бесполезным:

for(i=0; i<maxsize; i++){
    for(j=0; j<counter; j++){
        if(map[j]==array[i].end); // <-- this if has a semicolon rendering the if useless
            break;
    }
    if(j != counter)
        continue;
    map[counter]=array[i].end;
    counter++;
    if(counter==nodes)
        nodes=mapdoublesize(&map,nodes);
}

Возможно, это не единственная проблема. После этого исправления ваш код не считает и не сохраняет повторяющиеся числа.

...