КаталогИндекс раздела
НазадОглавлениеВперед


Лабораторная работа ╧9

Работа с матрицами

1. Цель работы

     Целью лабораторной работы является получение практических навыков в работе с матрицами в языке C.

2. Темы для предварительной проработки

3. Задания для выполнения

     Создать квадратную матрицу целых чисел размером 9х9. В индивидуальных заданиях указано, какую обработку матрицы требуется выполнить.

     Если по условию задания матрицу следует заполнить случайными числами, рекомендуем выбирать эти числа из диапазона 0 - 99. Если по условию задания в матрицу следует записать ЛП - линейную последовательность чисел, имеется в виду последовательность: 1, 2, 3, ...

4. Варианты индивидуальных заданий

 1        2        3        4        5        6        7        8        9       10      
11       12       13       14       15       16       17       18       19       20      
21       22       23       24       25       26       27       28       29       30      

5. Пример решения задачи (вариант 30)

5.1. Разработка алгоритма решения.

     Если ми обозначим размерность матрицы как S, номер строки как L, а номер столбца как R, и (имея в виду, что реализация алгоритма будет выполнена на языке С) договоримся, что нумерация строк и столбцов будет начинаться с 0, то можно определить, что в строке с номером L ненулевые элементы в верхней части матрицы лежат на столбцах с номерами R1=L < R < R2=S-L, а в нижней - R1=S-L-1 < R < R2=L. Следовательно, алгоритм может состоять из перебора матрицы строка за строкой с определением для каждого элемента, удовлетворяют ли его индексы вышеприведенным условиям. Если да - элементу присваивается следующее значение из ЛП, если нет - 0.

     Но можно несколько упростить алгоритм, обойдя вычисления граничных значений для каждого элемента и необходимости определения, в верхнюю или нижнюю часть матрицы ми попадаем. Обратим внимание на то, что для первой строки (L=0) R1=1, R2=S-2. Для каждой следующей строки R1 увеличивается на 1, а R2 уменьшается на 1. Когда мы пересекаем середину матрицы, то направление модификации изменяется на противоположное: теперь для каждой следующей строки R1 уменьшается на 1, а R2 увеличивается на 1. Признаком пересечения середины может быть условие R1 > R2, оно выполняется в момент пересечения. Схема последнего алгоритма показана на рисунке.

     Вместе с описанными выше переменными R1 и R2, которые получают начальные значения для первой строки матрицы, ми вводим переменную dd с начальным значением 1 - это то значение, которое будет модифицировать R1 и R2 для каждой следующей строки, и переменную k - в которой будет значение текущего члена ЛП, начальное значение - 1 (блок 2). Далее организуются вложенные циклы. Во внешнем цикле перебираются строки (блок 3), а во внутреннем - столбцы матрицы (блок 4). В каждой итерации внутреннего цикла номер столбца R сравнивается с граничными значениями R1, R2 (блоки 5,6). Если он лежит в пределах от R1 до R2, то текущему члену матрицы присваивается значение k - текущего члена ЛП, а затем k увеличивается на 1 (блок 7). Если нет, текущему члену присваивается значение 0 (блок 8).

     После выхода из внутреннего цикла модифицируются граничные значения: R1 увеличивается на dd, а R2 уменьшается на dd (блок 9). Напомним, что начальное значение dd=1. Когда выполняется условие R1 > R2 (блок 10) мы присваиваем dd значение -1, далее модификация границ будет соответствовать правилам для нижней части матрицы.

     После выхода из внешнего цикла, который начался в блоке 3, вновь организуются вложенные цикли перебора строк (блок 12) и столбцов (блок 13). В каждой итерации внутреннего цикла выводится значение одного элемента матрицы (блок 14), после выхода из внутреннего цикла начинается новая строка вывода (блок 15).

5.2. Определение переменных программы

     Для реализации алгоритма нам будут нужны такие переменные.

     Матрица представляется в памяти как 2-мерний массив (должен быть размещен в статической памяти):

    int Ar[S][S];

     Переменные для представления текущих номеров строки (l) и столбца (r):

    short l, r;  

     Переменные для представления граничных номеров столбцов:

    short r1,r2;

     Переменная - модификатор граничных номеров:

    short dd;

     Переменная - текущий член ЛП:

    short k;

     Всем скалярным переменным назначаем тип short, т.к. их значения никак не могут выходить из диапазона -128 - 128.

5.3. Разработка текста программы

     Текст программы начинаемо с включения файла stdio.h и определения макроконстанты S - размера матрицы (хотя по условию задания можно было бы использовать просто константу 9 в тексте программы, определение размера через макроконстанту более соответствует стилю программирования на языке C).

     Массив-матрицу Ar объявляем до открытия тела главной функции, что обеспечивает его размещение в статической памяти.

     Открываем тело главной функции и объявляем переменные в соответствии с п.5.2. Присваиваем переменным r1, r2, dd, k начальные значения (это можно было сделать и при их объявлении). Открываем цикл перебора строк с изменением l от 0 до S-1 и цикл перебора столбцов с изменением r от 0 до S-1. Внутренний цикл состоит из одного условного оператора, так что нет необходимости брать его тело в операторные скобки. Тело внешнего цикла берется в скобки.

     В условном операторе проверяем сразу оба условия (блоки 5 и 6). Поскольку для выхода за пределы должно выполняться хотя бы одно из них, они соединены операцией "ИЛИ".

     При выполнении условия значение k записывается в элемент массив с индексами [l,r] и сразу же увеличивается. При невыполнении - в элемент массива записывается 0.

     После выхода из внутреннего цикла, но еще в теле внешнего модифицируются значения r1 и r2. Потом условным оператором проверяется условие r1>r2 и, если он выполняется знак модификатора dd меняется на противоположный.

     Потом открываются два цикла для вывода. В каждой итерации внутреннего цикла выводится значение одного элемента массива. Формат вывода обеспечивает вывод положительного числа из 2 цифр и пробела перед ним. После каждого выхода из внутреннего цикла выводится символ перехода на новую строку. Таким образом, матрица будет выведена в наглядном представлении. Полный текст программы приведен ниже.

/*****************************************************/
/*              Лабораторная работа ╧9               */
/*                 Работа с матрицами                */
/*           Пример выполнения. Вариант ╧30.         */
/*****************************************************/
#include <stdio.h>
#define S 9
int Ar[S][S]; /* матрица */
int main(void) {
 short l, r;  /* текущие индексы */
 short r1,r2; /* граничные номера столбцов */
 short dd;    /* модификатор граничных номеров */
 short k;     /* текущий член ЛП */
  /* начальные значения переменных */
  r1=1; r2=S-2; dd=1; k=1;
  for (l=0; l<S; l++) {  /* перебор строк */
    for (r=0; r<S; r++)  /* перебор столбцов */
      /* условие ненулевого значения */
      if ((r<r1)||(r>r2)) Ar[l][r]=0;
      else Ar[l][r]=k++;
      /* конец перебора строк */
    /* модификация границ */
    r1+=dd; r2-=dd;
    /* уловие перехода в нижнюю часть */
    if (r1>r2) dd=-dd;
    } /* конец перебора столбцов */
  /* вывод матрицы */
  for (l=0; l<S; l++) {
    for (r=0; r<S; r++) {
      printf("%3d",Ar[l][r]);
      }
    printf("\n");
    }
  return 0;
}

5.4. Отладка программы

     Форма вывода результатов программы столь наглядна, что по результатам можно убедиться в правильном функционировании программы или - при неправильном функционировании - можно делать выводы о том, у реализации какой именно ветви алгоритма сделана ошибка. При наличии ошибок можно в отладке программы также использовать средства пошаговой отладки, при чем следует контролировать текущие индексы граничные номера и текущее значение модификатора. Наиболее вероятные ошибки - неправильное определение граничных номеров или неправильное определение момента перехода в нижнюю часть матрицы.

5.5. Результаты работы программы

Результат работы программы приведен ниже:
  0  1  2  3  4  5  6  7  0
  0  0  8  9 10 11 12  0  0
  0  0  0 13 14 15  0  0  0
  0  0  0  0 16  0  0  0  0
  0  0  0  0  0  0  0  0  0
  0  0  0  0 17  0  0  0  0
  0  0  0 18 19 20  0  0  0
  0  0 21 22 23 24 25  0  0
  0 26 27 28 29 30 31 32  0

5.6. Выводы

     При выполнении лабораторной работы изучены вопросы:


КаталогИндекс раздела
НазадОглавлениеВперед