daily pastebin goal
78%
SHARE
TWEET

Untitled

a guest Feb 13th, 2018 66 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5.  
  6. typedef struct
  7. {
  8.     size_t capacity;
  9.     size_t size;
  10.     int* data;
  11. }vector;
  12.  
  13. typedef struct
  14. {
  15.     size_t size;
  16.     vector** rows;
  17. }matrix;
  18.  
  19. vector* vec_new()
  20. {
  21.     vector* vec = (vector*)malloc(sizeof(vector));
  22.     vec->size = 0;
  23.     vec->capacity = 5;
  24.     vec->data = (int*)malloc(vec->capacity * sizeof(int));
  25.  
  26.     return vec;
  27. }
  28.  
  29. void vec_insert(vector* vec, int a)
  30. {
  31.     if (vec->size == vec->capacity) {
  32.         vec->capacity = vec->capacity * 2;
  33.         vec->data = (int*)realloc(vec->data, vec->capacity * sizeof(int));
  34.     }
  35.  
  36.     vec->data[vec->size] = a;
  37.     vec->size++;
  38. }
  39.  
  40. void vec_free(vector* vec)
  41. {
  42.     free(vec->data);
  43.     free(vec);
  44. }
  45.  
  46. void vec_print(vector* vec)
  47. {
  48.     for (int i = 0; i < vec->size; i++) {
  49.         printf("[%d] %d\n", i, vec->data[i]);
  50.     }
  51. }
  52.  
  53. matrix* matrix_new(int row_count)
  54. {
  55.     matrix* m = (matrix*)malloc(sizeof(matrix));
  56.     m->rows = (vector**)malloc(row_count * sizeof(vector*));
  57.     m->size = row_count;
  58.     return m;
  59. }
  60.  
  61. void matrix_print(matrix* m)
  62. {
  63.     for (int i = 0; i < m->size; i++) {
  64.         printf("[%d] ", i);
  65.         vector* row = m->rows[i];
  66.  
  67.         for (int j = 0; j < row->size; j++) {
  68.             printf("%d ", row->data[j]);
  69.         }
  70.         printf("\n");
  71.     }
  72. }
  73.  
  74. void matrix_free(matrix* m)
  75. {
  76.     for(int i = 0; i < m->size; i++) {
  77.         vec_free(m->rows[i]);
  78.     }
  79.     free(m->rows);
  80.     free(m);
  81. }
  82.  
  83.  
  84. vector* row_get()
  85. {
  86.     char a[100];
  87.     if (fgets(a, 100, stdin) == NULL) {
  88.         return NULL;
  89.     }
  90.  
  91.     vector* v = vec_new();
  92.     char *p = strtok(a, " \t");
  93.     while (p != NULL)
  94.     {
  95.         if (p[strlen(p)-1] == '\n') {
  96.             p[strlen(p)-1] = '\0';
  97.         }
  98.         int num = atoi(p);
  99.         if (num != 0 || strcmp(p, "0") == 0) {
  100.             vec_insert(v, num);
  101.         }
  102.         p = strtok(NULL, " \t");
  103.     }
  104.  
  105.     return v;
  106. }
  107.  
  108. float row_avg(vector* v)
  109. {
  110.     int avg = 0;
  111.     for (int i = 0; i < v->size; i++) {
  112.         avg += v->data[i];
  113.     }
  114.  
  115.     return avg / v->size;
  116. }
  117.  
  118. int row_max(vector *v)
  119. {
  120.     int max = v->data[0];
  121.     for (int i = 0; i < v->size; i++) {
  122.         if (v->data[i] > max) {
  123.             max = v->data[i];
  124.         }
  125.     }
  126.  
  127.     return max;
  128. }
  129.  
  130.  
  131. int main()
  132. {
  133.     int count = 0;
  134.     char num[5];
  135.     printf("Введите количество строк: ");
  136.     fgets(num, 5, stdin);
  137.     count = atoi(num);
  138.     if (count <= 0) {
  139.         return 1;
  140.     }
  141.  
  142.     matrix* m = matrix_new(count);
  143.  
  144.     for (int i = 0; i < count; i++)
  145.     {
  146.         printf("Введите %d строку: ", i+1);
  147.         vector* v = row_get();
  148.         if (v) {
  149.             m->rows[i] = v;
  150.         }
  151.     }
  152.  
  153.     //bi = s1 - s2, где s1 - сумма четных, а s2 - сумма нечетных элементов
  154.  
  155.     vector* res = vec_new();
  156.  
  157.     for (int i = 0; i < count; i++)
  158.     {
  159.         vector* v = m->rows[i];
  160.         int even_sum = 0;
  161.         int uneven_sum = 0;
  162.  
  163.         for (int j = 0; j < v->size; j++)
  164.         {
  165.             if (v->data[j] % 2 == 0) {
  166.                 even_sum += v->data[j];
  167.             } else {
  168.                 uneven_sum += v->data[j];
  169.             }
  170.         }
  171.  
  172.         vec_insert(res, even_sum - uneven_sum);
  173.     }
  174.  
  175.     printf("Исходная матрица: \n");
  176.     matrix_print(m);
  177.     printf("---------------------------\nРезультирующий вектор: \n");
  178.     vec_print(res);
  179.  
  180.     vec_free(res);
  181.     matrix_free(m);
  182. }
RAW Paste Data
Top