Advertisement
Guest User

Untitled

a guest
Mar 25th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.96 KB | None | 0 0
  1. /*
  2.  6. В файле data.dat задан двумерный массив целых чисел с различным количеством элементов в каждой строке. Элементы массива задаются через пробел. Ограничения на количество строк в массиве нет. Ввести двумерный массив из файла в массив в программе, отведя соответствующим образом память. Определить, существует ли в массиве элемент, равный среднему арифметическому элементов массива из строки, содержащей данный элемент. Если существует, то уничтожить из массива столбец с найденым элементом. Если найдено несколько элементов, то использовать только первый из них. Если элемент не найден, то матрица не изменяется. Вывести в файл data.res полученный двумерный массив.
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8.  
  9. int ** a_alloc (int *len, int hei);
  10. void a_free (int **A, int hei);
  11. void getlen (FILE *f, int *len);
  12. void gethei (FILE *f, int *hei);
  13. int to_dec (char *c);
  14. int a_read_swift (FILE *f, int *res);
  15. void a_read (FILE *f, int **A, int *len, int hei);
  16. int fun_swift (int *a, int len);
  17. int ** fun (int **A, int *A_len, int *B_len, int hei);
  18. void a_out (FILE *f, int **A, int *len, int hei);
  19.  
  20.  
  21. int ** a_alloc (int *len, int hei) {
  22.     int **A = (int**)malloc(hei * sizeof(int*));
  23.     int i;
  24.    
  25.     for (i = 0; i < hei; i++)
  26.         A[i] = (int*)malloc(len[i] * sizeof(int));
  27.    
  28.     return A;
  29. }
  30.  
  31. void a_free (int **A, int hei) {
  32.     int i;
  33.    
  34.     for (i = 0; i < hei; i++)
  35.         free(A[i]);
  36.    
  37.     free (A);
  38. }
  39.  
  40. void getlen (FILE *f, int *len) {
  41.     int i = 0;
  42.     int j = 0;
  43.     char c;
  44.     while (1) {
  45.         c = fgetc(f);
  46.         if (c == ' ' || c == '\n' || c == EOF)
  47.             i++;
  48.         if (c == '\n' || c == EOF) {
  49.             len[j++] = i;
  50.             i = 0;
  51.         }
  52.         if (c == EOF)
  53.             break;
  54.     }
  55.    
  56.     rewind(f);
  57. }
  58.  
  59. void gethei (FILE *f, int *hei) {
  60.     char c;
  61.    
  62.     *hei = 0;
  63.    
  64.     while (1) {
  65.         c = fgetc(f);
  66.         if (c == '\n' || c == EOF)
  67.             *hei += 1;
  68.         if (c == EOF)
  69.             break;
  70.     }
  71.    
  72.     rewind(f);
  73. }
  74.  
  75. int to_dec (char *c) {
  76.     char *mod;
  77.     char s[1];
  78.     int m;
  79.     int i, j;
  80.     int len = (int)strlen(c);
  81.     int res = 0;
  82.     int k = 1;
  83.    
  84.     for (i = 0; i < len; i++)
  85.         if (c[i] == 'x')
  86.             break;
  87.    
  88.     mod = (char*)malloc(strlen(c) * sizeof(char));
  89.     for (j = 0; j < strlen(c) && j < i; j++)
  90.         mod[j] = c[j];
  91.     mod = (char*)realloc(mod, i);
  92.    
  93.     m = atoi(mod);
  94.     printf("%d\n", m);
  95.    
  96.     for (j = len-1; j > i; j--) {
  97.         s[0] = c[j];
  98.         res += k * atoi(s);
  99.         k *= m;
  100.     }
  101.    
  102.     free(mod);
  103.     return res;
  104. }
  105.  
  106. int a_read_swift (FILE *f, int *res) {
  107.     char v;
  108.     char *c = (char*)malloc(256 * sizeof(char));
  109.     int i = 0;
  110.    
  111.     while (1) {
  112.         v = fgetc(f);
  113.         if (v == ' ' || v == '\n' || v == EOF)
  114.             break;
  115.         c[i++] = v;
  116.     }
  117.    
  118.     if (i == 0){
  119.         free(c);
  120.         *res = 0;
  121.         return 0;
  122.     }
  123.    
  124.     c = (char*)realloc(c, i * sizeof(char));
  125.    
  126.     *res = to_dec(c);
  127.    
  128.     free(c);
  129.    
  130.     if (v == '\n' || v == EOF)
  131.         return 1;
  132.     else return 0;
  133. }
  134.  
  135. void a_read (FILE *f, int **A, int *len, int hei) {
  136.     int i, j;
  137.    
  138.     for (i = 0; i < hei; i++)
  139.         for (j = 0; j < len[i]; j++)
  140.             if (a_read_swift(f, &A[i][j]))
  141.                 break;
  142. }
  143.  
  144. int fun_swift (int *a, int len) {
  145.     int k = 0;
  146.     int m;
  147.     int i;
  148.  
  149.     for (i = 0; i < len; i++)
  150.         k += a[i];
  151.    
  152.     if (k % len != 0)
  153.         return -1;
  154.    
  155.     m = k / len;
  156.    
  157.     for (i = 0; i < len; i++)
  158.         if (a[i] == m)
  159.             return i;
  160.    
  161.     return -1;
  162. }
  163.  
  164. int ** fun (int **A, int *A_len, int *B_len, int hei) {
  165.     int i, j, k;
  166.     int *a ;
  167.     int **B;
  168.     int max_len = 0;
  169.    
  170.     for (i = 0; i < hei; i++)
  171.         if (A_len[i] > max_len)
  172.             max_len = A_len [i];
  173.    
  174.     a = (int*)calloc(max_len, sizeof(int));
  175.    
  176.     for (i = 0; i < hei; i++) {
  177.         j = fun_swift(A[i], A_len[i]);
  178.         if (j >= 0)
  179.             a[j] = 1;
  180.     }
  181.    
  182.     for (i = 0; i < hei; i++)
  183.         B_len[i] = A_len[i];
  184.    
  185.     for (i = 0; i < max_len; i++)
  186.         for (j = 0; j < hei; j++)
  187.             if (a[i] && i < A_len[j])
  188.                 B_len[j]--;
  189.    
  190.     B = a_alloc(B_len, hei);
  191.    
  192.     for (i = 0; i < hei; i++)
  193.         for (j = 0, k = 0; j < A_len[i]; j++)
  194.             if (!a[j])
  195.                 B[i][k++] = A[i][j];
  196.    
  197.     free(a);
  198.     return B;
  199. }
  200.  
  201. void a_out (FILE *f, int **A, int *len, int hei) {
  202.     int i, j;
  203.    
  204.     for (i = 0; i < hei; i++) {
  205.         for (j = 0; j < len[i]; j++)
  206.             fprintf(f, "%d ", A[i][j]);
  207.         fprintf(f, "\n");
  208.     }
  209. }
  210.  
  211. int main(void) {
  212.     FILE *in = fopen("/Users/Alexey/Desktop/input.txt", "r");
  213.     FILE *out = fopen("/Users/Alexey/Desktop/output.txt", "w");
  214.     int **A, **B;
  215.     int *A_len, *B_len, hei;
  216.     printf("\n");
  217.    
  218.     gethei(in, &hei);
  219.     A_len = (int*)malloc(hei * sizeof(int));
  220.     B_len = (int*)malloc(hei * sizeof(int));
  221.     getlen(in, A_len);
  222.    
  223.     A = a_alloc(A_len, hei);
  224.    
  225.     a_read(in, A, A_len, hei);
  226.    
  227.     //a_out(out, A, A_len, hei);
  228.     //fprintf(out, "\n\n");
  229.    
  230.     B = fun(A, A_len, B_len, hei);
  231.    
  232.     a_out(out, B, B_len, hei);
  233.    
  234.     a_free(B, hei);
  235.     a_free(A, hei);
  236.    
  237.     free(A_len);
  238.     free(B_len);
  239.    
  240.     fclose(in);
  241.     fclose(out);
  242.     return 0;
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement