Обучаюсь С. Есть такая вот программа, у меня проблема с пониманием, прошу помочь мне описать её алгоритм, принцип работы. 
 Code
#include <stdio.h> 
 #include <stdlib.h> 
 #include <string.h> 
 #include <math.h> 
     
     
 /********************************************************************/ 
 #define MAX_LINE_SIZE           1024 
 #define LINES_DEF_SIZE          256 
 #define MAX_DIFF                        0.0001 
     
     
 /********************************************************************/ 
 typedef struct { 
          double x, y; 
          int flag; 
 } point_flag_t; 
     
 typedef struct { 
          int size, max_size; 
          char **lines; 
 } objects_t; 
     
 #define objects_size(arg_pobj)                  ((arg_pobj)->size) 
 #define objects_line(arg_pobj,arg_i)    ((arg_pobj)->lines[(arg_i)])
Добавлено (20.04.10, 09:40)
---------------------------------------------
Code
/********************************************************************/ 
 void do_process( const char *in_name, const char *out_name ); 
   
 int read_objects_file( objects_t *pobj, const char *name ); 
 void free_objects( objects_t *pobj ); 
   
 int parse_x_y( const char *buf, double *px, double *py ); 
   
   
 /********************************************************************/ 
 int main( int argc, char *argv[] ) { 
   
 argc--; argv++; 
   
 if ( argc != 2 ) { 
         fprintf( stderr, "Usage: search in.txt out.txt" ); 
         exit( 2 ) ; 
 } 
   
 do_process( argv[0], argv[1] ); 
 return 0; 
   
 } /* main() */ 
   
   
 /********************************************************************/ 
 void do_process( const char *in_name, const char *out_name ) { 
   
 int i, j; 
 int errcode; 
   
 int line_size; 
 char *line; 
   
 int obj_size; 
 objects_t obj; 
   
 double x, y; 
 point_flag_t *ppoint= NULL; 
 FILE *fout= NULL;
Добавлено (20.04.10, 09:41)
---------------------------------------------
Code
/* Read */ 
 if ( read_objects_file( &obj, in_name ) ) { goto err_read; } 
   
 /* Check */ 
 obj_size= objects_size( &obj ); 
 if ( obj_size == 0 ) { goto err_no_obj; } 
   
 /* Allocate points */ 
 ppoint= (point_flag_t*)malloc( obj_size*sizeof(point_flag_t) ); 
 if ( ppoint == NULL ) { goto err_nomem; } 
   
 /* Parse x,y and setup point */ 
 for ( i= 0; i<obj_size; i++ ) { 
         if ( parse_x_y( objects_line( &obj, i ), &x, &y ) ) { goto err_format; } 
         ppoint[i].x= x; ppoint[i].y= y; 
         ppoint[i].flag= 0; 
 } 
   
 /* Compare loop */ 
 for ( i= 0; i<obj_size; i++ ) { 
         for ( j= i+1; j<obj_size; j++ ) { 
                 if ( fabs( ppoint[i].x-ppoint[j].x )<=MAX_DIFF && 
                         fabs( ppoint[i].y-ppoint[j].y )<=MAX_DIFF ) { 
                         ppoint[i].flag= ppoint[j].flag= 1; 
                         /* printf( "near %d %d\n", i, j ); */ 
                         break; 
                 } 
         } 
 } 
   
 /* Create out */ 
 fout= fopen( out_name, "wb" ); 
 if ( fout == NULL ) { goto err_create; }
Добавлено (20.04.10, 09:41)
---------------------------------------------
Code
/* Write out loop */ 
 for ( i= 0; i<obj_size; i++ ) { 
         if ( !ppoint[i].flag ) { continue; } 
   
         line= objects_line( &obj, i ); 
         line_size= strlen( line ); 
         errcode= fprintf( fout, "%s\n", line ); 
         if ( line_size+1 != errcode ) { goto err_write; } 
   
 } 
   
 /* Close out */ 
 if ( fclose( fout ) ) { goto err_close; } 
 fout= NULL; 
   
 /* Free ppoint */ 
 free( ppoint ); ppoint= NULL; 
   
 return; 
   
   
 /* Processing errors */ 
 err_read: 
 fprintf( stderr, "Error reading file\n" ); 
 goto err_all; 
   
 err_no_obj: 
 fprintf( stderr, "No objects\n" ); 
 goto err_all; 
   
 err_nomem: 
 fprintf( stderr, "No memory\n" ); 
 goto err_all; 
   
 err_format: 
 fprintf( stderr, "Invalid format\n" ); 
 goto err_all; 
   
 err_create: 
 fprintf( stderr, "Error creating file\n" ); 
 goto err_all; 
   
 err_write: 
 fprintf( stderr, "Error writing file\n" ); 
 goto err_all; 
   
 err_close: 
 fprintf( stderr, "Error closing file\n" ); 
 goto err_all; 
   
 err_all: 
 exit( 1 ); 
   
 } /* do_process() */
Добавлено (20.04.10, 09:42)
---------------------------------------------
Code
/********************************************************************/ 
 int read_objects_file( objects_t *pobj, const char *name ) { 
   
 int buf_size, max_size; 
 char buf[MAX_LINE_SIZE], *line, **lines; 
 FILE *fin= NULL; 
   
   
 /* Init */ 
 pobj->size= 0; pobj->max_size= 0; 
 pobj->lines= NULL; 
   
 /* Open */ 
 fin= fopen( name, "r" ); 
 if ( fin == NULL ) { goto err_read; } 
   
 /* Loop */ 
 for ( ; ; ) { 
          
         /* Read line */ 
         if ( fgets( buf, sizeof(buf), fin ) == NULL ) { 
                 if ( feof( fin ) ) { break; } 
                 goto err_read; 
         } 
         buf_size= strlen( buf ); 
         if ( buf_size>0 && buf[buf_size-1] == '\n' ) { buf[--buf_size]= '\0'; } 
   
         /* Check space and realloc */ 
         if ( pobj->size >= pobj->max_size ) { 
   
                 max_size= (pobj->max_size!=0) ? 2*pobj->max_size : LINES_DEF_SIZE; 
                 lines= (char**)realloc( pobj->lines, max_size*sizeof(char*) ); 
                 if ( lines == NULL ) { goto err_nomem; } 
                          
                 pobj->max_size= max_size; pobj->lines= lines; 
   
         }
Добавлено (20.04.10, 09:42)
---------------------------------------------
Code
/* Store */ 
         line= malloc( buf_size+1 ); 
         if ( line == NULL ) { goto err_nomem; } 
         memcpy( line, buf, buf_size+1 ); 
         pobj->lines[pobj->size]= line; pobj->size++; 
   
 } 
   
 /* Close */ 
 if ( fclose( fin ) ) { goto err_close; } 
 fin= NULL; 
   
 /* Return */ 
 return 0; 
   
   
 /* Processing errors */ 
 err_read: 
 err_close: 
 err_nomem: 
 return 1; 
   
 } /* read_objects_file() */ 
   
   
 /********************************************************************/ 
 void free_objects( objects_t *pobj ) { 
   
 int i; 
   
   
 for ( i= 0; i<pobj->size; i++ ) { 
         if ( pobj->lines[i] != NULL ) { free( pobj->lines[i] ); } 
 } 
 free( pobj->lines ); 
   
 pobj->size= pobj->max_size= 0; 
 pobj->lines= NULL; 
          
 } /* free_objects() */ 
   
  
Добавлено (20.04.10, 09:42)
---------------------------------------------
Code
/********************************************************************/ 
 int parse_x_y( const char *buf, double *px, double *py ) { 
   
 int buf_size; 
 char *endptr; 
   
   
 /* Check line */         
 buf_size= strlen( buf ); 
 if ( buf_size != 408 ) { return 1; } 
   
 *px= strtod( &buf[238], &endptr ); 
 if ( *px == 0.0 ) { 
         if ( &buf[238] == endptr ) { return 1; } 
 } 
   
 *py= strtod( &buf[252], &endptr ); 
 if ( *py == 0.0 ) { 
         if ( &buf[252] == endptr ) { return 1; } 
 } 
   
 return 0; 
   
 } /* parse_x_y() */ 
  
Добавлено (20.04.10, 10:02)
---------------------------------------------
Заданием программы было считать данные с текстового файла, эти данные содержат координаты для каждого определённого объекта, затем посредством сравнения данных между собой нужно было найти те данные, координаты X и Y которых были практическими схожими, допускалось различие в 0.0001 между X-ми и Y-ми. В итог мы должны получить список схожих значений. после отсеивания. Сама программа рабочая
Добавлено (20.04.10, 10:03)
---------------------------------------------
Вот сюда ещё залил на всякий http://www.megaupload.com/?d=I3YOYJE6