Attachment '2.c'

Download

   1 #include <stdio.h>
   2 #include <stdlib.h>
   3 
   4 int *x=NULL; // мой массив (подлежит расширению по необходимости)
   5 int size_x=0; // текущая емкость массива
   6 int count_x=0; // занятая емкость массива (count <= size)
   7 int step_x=2;
   8 
   9 int *y=NULL; // мой массив (подлежит расширению по необходимости)
  10 int size_y=0; // текущая емкость массива
  11 int count_y=0; // занятая емкость массива (count <= size)
  12 int step_y=2;
  13 
  14 void append_x( int k )
  15 {
  16 
  17 
  18     // если в массиве не осталось пустого места
  19     // (в частности, в начале, когда массив вообще нулевой длины)
  20     if( size_x == 0)
  21     {
  22         x = malloc( 1 * sizeof(int));
  23         size_x = 1;
  24     }
  25     if( count_x == size_x )
  26     {
  27         /*
  28         // 8<----------8<----------------8<-------------------------------
  29         new_a = malloc( (size + step) * sizeof(int) );
  30         if( new_a == NULL )
  31         {
  32             return; // выходим и ничего не делаем.
  33             // собственно говоря, ничего другого в этой функции
  34             // и не поделаешь.
  35         }
  36 
  37         // переписываем заполненный фрагмент массива в новое,
  38         // увеличенное место памяти.
  39         for( j = 0; j < count; j ++ )
  40         {
  41             new_a[j] = a[j];
  42         }
  43         free(a);
  44         a = new_a; // текущий массив будет увеличенного размера
  45         // 8<----------8<----------------8<-------------------------------
  46         * */
  47 
  48         x = realloc( x, (size_x * step_x) * sizeof(int) );
  49         printf( " -- произведено увеличение емкости с %d до %d элементов\n",
  50                 size_x, size_x*step_x);
  51         size_x = size_x * step_x;
  52     }
  53 
  54     // в этой точке гарантируется, что в массиве есть свободное место, т.е.
  55     // count < size, и можно выполнить очередное присваивание в a[count].
  56 
  57     x[count_x] = k;
  58     count_x ++;
  59 
  60 }
  61 
  62 void append_y( int k )
  63 {
  64 
  65 
  66     // если в массиве не осталось пустого места
  67     // (в частности, в начале, когда массив вообще нулевой длины)
  68     if( size_y == 0)
  69     {
  70         y = malloc( 1 * sizeof(int));
  71         size_y = 1;
  72     }
  73     if( count_y == size_y )
  74     {
  75         /*
  76         // 8<----------8<----------------8<-------------------------------
  77         new_a = malloc( (size + step) * sizeof(int) );
  78         if( new_a == NULL )
  79         {
  80             return; // выходим и ничего не делаем.
  81             // собственно говоря, ничего другого в этой функции
  82             // и не поделаешь.
  83         }
  84 
  85         // переписываем заполненный фрагмент массива в новое,
  86         // увеличенное место памяти.
  87         for( j = 0; j < count; j ++ )
  88         {
  89             new_a[j] = a[j];
  90         }
  91         free(a);
  92         a = new_a; // текущий массив будет увеличенного размера
  93         // 8<----------8<----------------8<-------------------------------
  94         * */
  95 
  96         y = realloc( y, (size_y * step_y) * sizeof(int) );
  97         printf( " -- произведено увеличение емкости с %d до %d элементов\n",
  98                size_y, size_y*step_y);
  99         size_y = size_y * step_y;
 100     }
 101 
 102     // в этой точке гарантируется, что в массиве есть свободное место, т.е.
 103     // count < size, и можно выполнить очередное присваивание в a[count].
 104 
 105     y[count_y] = k;
 106     count_y ++;
 107 
 108 }
 109 
 110 int distance( int i, int j )
 111 {
 112     return (x[i] - x[j])*(x[i] - x[j]) +
 113            (y[i] - y[j])*(y[i] - y[j]);
 114 }
 115 
 116 int main ()
 117 {
 118     int x, y;
 119     int i, j;
 120     int min_i, min_j;
 121     int dist_ij, dist_min;
 122 
 123     // enter points
 124     scanf("%d", &x );
 125     scanf("%d", &y );
 126     while( ! ((x==0) && (y==0)) )
 127     {
 128         append_x(x);
 129         append_y(y);
 130         scanf("%d", &x );
 131         scanf("%d", &y );
 132     }
 133 
 134     // compute minimum
 135     dist_min = distance(0, 1);
 136     min_i = 0;
 137     min_j = 1;
 138     for( i = 0; i < count_x; i++ )
 139     {
 140         for( j = i + 1; j < count_x; j++ )
 141         {
 142             dist_ij = distance(i, j);
 143             if (dist_ij < dist_min)
 144             {
 145                 dist_min = dist_ij;
 146                 min_i = i;
 147                 min_j = j;
 148             }
 149         }
 150 
 151     }
 152 
 153     // print result
 154     printf( "closest points are: %d and %d, square of distance is %d \n",
 155              min_i + 1, min_j + 1, dist_min );
 156     return 0;
 157 }

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.

You are not allowed to attach a file to this page.