2016-12-15 1 views
0

У меня есть задача, когда мне нужно прочитать информацию из текстового файла, в котором есть координаты (x и y), и мне нужно подсчитать, сколько параллельных строк I может создать из этих координат. Я не совсем уверен, как это сделать. Я попробовал написать свой собственный код с помощью друга.Написание кода для поиска параллельных линий между координатами (с использованием C)

Программа открывает текстовый файл, но застревает в: f = getLines(file); часть, поэтому я предоставляю полный код. , ,

(The code)

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#define FILE_PATH "D:\\Task5\\Task5.txt" 

//============================== STRUCTURES 

typedef struct { 
    char* lines; 
    int size; 
} FileLines; 

typedef struct { 
    int x; 
    int y; 
} Point; 

typedef struct { 
    Point p1; 
    Point p2; 
    int slope; 
} Line; 

//============================== PROTOTYPES 
FILE* getFile(); 
FileLines getLines(FILE* file); 
Point *getPointsFromFileLines(FileLines file); 
Point getPointFromString(char* string); 
Line *getAllLines(Point* coords,int size); 
int countParralelLines(Line* lines, int size); 
//============================== FUNCTIONS 

FILE* getFile() {        // 
    FILE* file; 
    file = fopen(FILE_PATH,"r"); 
    if (file == NULL) 
    { 
     printf("Failed to open file \n"); 
     exit(EXIT_FAILURE); 
    } 
    else 
     printf("File opened for reading \n"); 
    return file; 
} 

FileLines getLines(FILE *file) { 
    char c; 
    FileLines f = {0,0}; 
    int fileSize = sizeof(f.lines)/sizeof(f.lines[0]); 
    char *line = 0; 
    int size = sizeof(line)/sizeof(line[0]); 

    while(!feof(file)) { 
     while(c != '\n'){ 
      c = getc(file); 
      line = realloc(line, ++size); 
      line[size-1] = c; 
     } 
     f.lines = realloc(f.lines, ++fileSize); 
     f.lines[fileSize-1] = *line; 
    } 
    return f; 
} 

Point *getPointsFromFileLines(FileLines file) { 
    Point* p = 0; 
    int i; 
    int size = (sizeof(p)/sizeof(p[0])); 
    for(i = 0; i < file.size; i++) { 
     p = realloc(p, (size*(i+1))); 
     getPointFromString((char *)file.lines[i]); 
    } 
    return p; 
} 

Point getPointFromString(char* string) { 
    Point p = {0,0}; 
    while(*string != '\n') { // 
     if(*string == 'x') { 
      do { 
       if(isdigit(*string)) 
        break; 
       string++; 
      } while(*string); // 
      p.x = (int) strtol(string, &string, 10); 

     } 
     if(*string == 'y') { // 
      do { 
       if(isdigit(*string)) 
        break; 
       string++; 
      } while(*string); // 
      p.y = (int) strtol(string, &string, 10); 
     } 
    } 
    return p; 
} 

Line *getAllLines(Point* coords,int size) { 
    int number_of_lines = factorial(size); 
    Line l[number_of_lines]; 
    int i, j; 
    for(i = 0; i < number_of_lines; i++) { 
     for(j = i; j < number_of_lines; j++) { 
      l[j].p1 = coords[i]; 
      l[j].p2 = coords[j+1]; 
     } 
    } 
    return l; 
} 

int factorial(unsigned int i) { 
    if(i <= 1) 
     return 1; 
    return (i + factorial(i-1)); 
} 

int countParralelLines(Line* lines,int size) { 
    int count; 
    int i, j; 
    for(i = 0; i < size; i++) { 
     for(j = 0; j < size; i++) { 
      if(i==j) continue; 
      if(lines[i].slope == lines[j].slope) 
       count++; 
     } 
    } 
    return count; 
} 

//============================== MAIN PART 

int main() 
{ 
    FileLines f = {0,0}; 
    FILE *file; 

    file = getFile(); 

    printf("1 \n"); 

    f = getLines(file); 

    printf("2 \n"); 

    Point *coords = 0; 
    coords = getPointsFromFileLines(f); 

    printf("3 \n"); 

    int size = sizeof(coords)/sizeof(coords[0]); 
    int possible_lines = factorial(size); 
    Line lines[possible_lines]; 
    memcpy(lines, getAllLines(coords, size), (sizeof(lines)*sizeof(lines[0]))); 

    printf("4 \n"); 

    int count = countParralelLines(lines, possible_lines); 
    printf("count: %i", count); 

    return 0; 
} 

Для решения этой задачи я должен использовать "структуры, указатели и динамическую память".

текстовых файлов (Task5.txt) Содержание:

x: 10, y: 15 
x: 8, y: -5 
x: 85, y: 156 
x: 46, y: 67 
+0

Добро пожаловать в StackOverflow: пожалуйста, прочитайте это: [Как спросить] (http://stackoverflow.com/help/how-to-ask). –

+0

* «Кажется, что это не работает». * Извините, но это не является достаточным описанием проблемы. Также не просто ссылку на код, прочитайте о том, как предоставить [mcve]. – user694733

+0

1) 'sizeof (f.lines)/sizeof (f.lines [0])' и 'sizeof (line)/sizeof (строка [0])' и т. Д. Неверны. – BLUEPIXY

ответ

0

образец точек считывания из файла.
как этот

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

typedef struct { 
    int x; 
    int y; 
} Point; 

Point *getPointsFromFile(FILE *fp, size_t *n){ 
    int x, y; 
    Point *p = NULL; 
    size_t size = 0; 
    while(2 == fscanf(fp, " x : %d , y : %d", &x, &y)){ 
     Point *temp = realloc(p, ++size * sizeof(*p)); 
     if(!temp){ 
      perror("realloc at getPointsFromFile"); 
      free(p); 
      exit(EXIT_FAILURE); 
     } 
     p = temp; 
     p[size-1] = (Point){ .x = x, .y = y}; 
    } 
    //rewind(fp); 
    *n = size; 
    return p; 
} 

int main(void){ 
    FILE *fp = fopen("Task5.txt", "r"); 
    size_t n = 0; 
    Point *points = getPointsFromFile(fp, &n); 
    fclose(fp); 
    for(size_t i = 0; i < n; ++i) 
     printf("(%d, %d)\n", points[i].x, points[i].y); 
    free(points); 
    return 0; 
} 
+0

[DEMO] (http://ideone.com/wXQd14) – BLUEPIXY