Advertisement
sashachca

задание 4

Jun 20th, 2018
374
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Octave 4.30 KB | None | 0 0
  1. function task4(M)
  2.  
  3.     % ПУНКТ 1
  4.    
  5. %  %матрица попроще:
  6. %  M = [1, 5, 3, 6;
  7. %       4, 6, 6, 4;
  8. %       5, 3, -6, 0;
  9. %       3, 6, 9, 2;
  10. %       7, -4, -9, -3];
  11.    
  12.   M = [14.547, 5.115, -7.008, 4.801, 12.169, 12.741, 13.593, 6.565, 4.095, 2.676, 1.905, 7.102, -11.009, 5.934, 5.073, 13.335;
  13.        1.655, -12.972, 14.922, -5.442, 13.799, 6.697, 6.465, 7.999, 0, -8.487, 4.964, 11.623, 11.761, 0.359, 9.008, -6.653;
  14.        12.505, 5.865, 3.844, 12.223, 10.779, 14.04, 0.877, 6.463, 3.777, 4.736, 1.466, 11.861, 12.776, 0.237, 10.583, 6.297;
  15.        14.103, 6.372, 4.909, 9.781, -7.864, 7.684, 5.256, 12.033, 0.627, 8.467, 2.571, 13.75, 5.371, 0, 1.91, 11.748;
  16.        9.109, 3.469, -11.843, 12.45, -0.536, 6.09, 7.85, 11.048, 9.831, 3.847, -10.126, 10.683, 13.973, 4.535, 6.546, 4.513];
  17.  
  18.   printf(' Входная матрица M:\n\n');
  19.   disp(M);
  20.   [n, m] = size(M);
  21.    
  22.   % I способ
  23.   sum = 0;
  24.   NUMBERS = howManyNegativesI(M, n, m);
  25.  
  26.   sum_row = rowSummation(NUMBERS);
  27.   for j = 1:m
  28.     sum += sum_row(j);
  29.   endfor
  30.   printf('\n Сумма эл-в строк где кол-во отриц. >= 2 (1 способ): %i', sum);
  31.  
  32.   % II способ
  33.   sum = 0;
  34.   NUMBERS = howManyNegativesII(M, n, m);
  35.  
  36.   sum_row = rowSummation(NUMBERS);
  37.   for j = sum_row
  38.     sum += j;
  39.   endfor
  40.   printf('\n Сумма эл-в строк где кол-во отриц. >= 2 (2 способ): %i', sum);
  41.      
  42.      
  43.   %______________________________________
  44.      
  45.     function sum_row = rowSummation(NUM) % складываем строки, удовлетворяющие нашему условию про >= 2
  46.       sum_row = 0;
  47.    
  48.       for i = 1:n
  49.         if NUM(i) <= 2
  50.           sum_row += M(i, :);
  51.         endif
  52.       endfor
  53.      
  54.     endfunction
  55.    
  56.    %______________________________________
  57.    
  58.    
  59.    
  60.    
  61.     % ПУНКТ 2
  62.  
  63.   D = []; % D будет массивом, состоящем из сумм каждой из диагоналей
  64.  
  65.   if n > m % на тот случай, если матрица не квадратная
  66.     d = m;
  67.   else
  68.     d = n; % нас интересует меньшая величина
  69.   endif
  70.  
  71.   for k = 2:d
  72.    D = diagSummation(1, k, D); % идем по параллельным диагоналям от главной на северо-восток
  73.    D = diagSummation(k, 1, D); % идем по параллельным диагоналям от главной на юго-запад
  74.   endfor
  75.  
  76.   min = D(1);
  77.   for i = D % ищем минимальный элемент среди D
  78.     if i < min
  79.       min = i;
  80.     endif
  81.   endfor
  82.  
  83.  
  84.   printf('\n\n Минимум среди сумм элеметов диагоналей (кроме главной): %i\n\n', min);
  85.    
  86.    
  87.   %______________________________________
  88.  
  89.     function D = diagSummation(i, j, D) % суммируем элементы текущей диагонали
  90.       diag = 0;
  91.    
  92.       while j <= d && i <= d
  93.         diag += M(i, j);
  94.         % спускаемся по диагонали на один индекс вправо и вниз:
  95.         i += 1;  
  96.         j += 1;
  97.       endwhile
  98.       D(end+1) = diag;
  99.  
  100.     endfunction
  101.    
  102.   %______________________________________
  103.  
  104. endfunction
  105.  
  106.  
  107. function NUMBERS = howManyNegativesI(M, n, m) % считаем количество отрицательных элементов первым способом
  108.   NUMBERS = [];
  109.   k = 0;
  110.  
  111.   for i = 1:n
  112.     for j = 1:m
  113.       if M(i, j) < 0
  114.         k += 1;
  115.       endif
  116.     endfor
  117.     NUMBERS(end+1) = k; % индекс массива NUMBERS соответствует инедксу строки матрицы M: то есть на первом месте в массиве NUMBERS стоит количество отрицательных элементов первой строки, на втором - второй строки и тд
  118.     k = 0;
  119.   endfor
  120.  
  121. endfunction
  122.  
  123.  
  124. function NUMBERS = howManyNegativesII(M, n, m) % считаем количество отрицательных элементов вторым способом
  125.   NUMBERS = [];
  126.   k = 0;
  127.  
  128.   for i = 1:n
  129.     for j = M(i, :)
  130.       if j < 0
  131.         k += 1;
  132.       endif
  133.     endfor
  134.     NUMBERS(end+1) = k;
  135.     k = 0;
  136.   endfor
  137.  
  138. endfunction
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement