Слайд 1Разработка программного проекта для заполнения квадратной матрицы порядка n, числами,
заданными функцией F(n) при ее разных значениях.
Исполнитель: Иванов Станислав Андреевич,
гр. ПИ-1-17
Слайд 2Постановка задачи
Разработать проект, который заполняет квадратную матрицу порядка n числами,
заданными функцией F(n), записывая их в нее «по спирали» a)
по часовой стрелке, б) против часовой стрелки.
Под функцией F будем понимать функцию, в качестве параметра которой передается текущий заполняемый порядковый номер элемента матрицы. В функции происходят определенные вычисления и возвращаемое из неё число записывается в матрицу.
После заполнения матрицы, её необходимо вывести на экран.
Слайд 3Математическое описание задачи
Для проверки правильности работы разработанных алгоритмов проверим заполненные
матрицы порядка 5 с заданными вручную (тестовая функция при этом
будет иметь вид f(n)=n).
При обходе по часовой стрелке требуется сравнить полученную матрицу с матрицей:
double t1[5][5] = {{1,2,3,4,5},
{16,17,18,19,6},
{15,24,25,20,7},
{14,23,22,21,8},
{13,12,11,10,9}};
При обходе против часовой стрелки требуется сравнить полученную матрицу с матрицей:
double t2[5][5] = {{1,16,15,14,13},
{2,17,24,23,12},
{3,18,25,22,11},
{4,19,20,21,10},
{5,6,7,8,9} };
Слайд 4Приёмы алгоритмизации задачи
Для заполнения квадратной матрицы порядка n значениями функции
F по спирали по часовой стрелке воспользуемся следующим алгоритмом:
повторяем по
числу витков – k (текущий номер витка), число которых равно (n+1)/2
заполняем верхнюю часть витка, индексы для каждого витка следующие: по y – значение постоянное и равно k (нумерация начинается с 0), по x – значения меняются в интервале [k;n-k)
заполняем правую часть витка, индексы для каждого витка следующие: по x – значение постоянное и равно n-1-k, по y – значения меняются в интервале [k+1;n-k)
заполняем нижнюю часть витка, индексы для каждого витка следующие: по y – значение постоянное и равно n-1-k, по x – значения меняются в интервале [n-2-k; k]
заполняем левую часть витка, индексы для каждого витка следующие: по x – значение постоянное и равно k, по y – значения меняются в интервале [n-2-k; k)
Слайд 5Приёмы алгоритмизации задачи
Для заполнения квадратной матрицы порядка n значениями функции
F по спирали против часовой стрелки воспользуемся следующим алгоритмом:
повторяем по
числу витков – k (текущий номер витка), число которых равно (n+1)/2
заполняем левую часть витка, индексы для каждого витка следующие: по x – значение постоянное и равно k (нумерация начинается с 0), по y – значения меняются в интервале [k;n-k)
заполняем нижнюю часть витка, индексы для каждого витка следующие: по y – значение постоянное и равно n-1-k, по x – значения меняются в интервале [k+1;n-k)
заполняем правую часть витка, индексы для каждого витка следующие: по x – значение постоянное и равно n-1-k, по y – значения меняются в интервале [n-2-k; k]
заполняем верхнюю часть витка, индексы для каждого витка следующие: по y – значение постоянное и равно k, по x – значения меняются в интервале [n-2-k; k)
Как видно из описанных выше алгоритмов их можно объединить в один. Введя параметр – направление заполнения матрицы и в зависимости от него меняя индексы x и y.
Слайд 6Список разрабатываемых функций
void get_pos(int &coord_y,int &coord_x, int x, int y,
DIR dir) – в зависимости от направления заполнения матрицы, по
разному выполняет присваивание параметрам coord_y и coord_x, переданные значения x и y.
void fill_mas_clockwise(int **mas,func f,int n, DIR dir) – заполняет двумерный массив порядка n числами, полученными из функции f, спиралью по направлению dir.
void print(int **mas,int n) – вывод на экран матрицы порядка n. С помощью функции потокового вывода [3].
int F(int n) – функция расчета элемента матрицы, в зависимости от порядкого номера элемента n.
int test_func (int n) – функция расчета элемента матрицы, в зависимости от порядкого номера элемента n (для функции test).
int test() – функция проводит тесты корректности алгоритмов, если тестирование успешно, то возвращается 1, иначе 0.
Слайд 7Блок-схема главной программы
Ход соответствующей программы
Выводы:
1. Код главной программы имеет
линейную структуру, значит, разработанный проект удовлетворяет требованиям структурного подхода.
2. Программа
выводит на экран 2 матрицы порядка n, заполненных по спирали на основании функции F. Первая матрица – обход по часовой стрелке, вторая – против.
int main()
int n;
cout<<"Введите порядок матрицы: ";
cin>>n;
for(int i=0; i mas[i]=new int[n];
fill_mas_clockwise(mas,&F,n,CLOCK);
print(mas,n);
fill_mas_clockwise(mas,&F,n,ANTICLOCK;
print(mas,n);
for(int i=0; i delete[] mas[i];
delete[] mas;
system("pause");
return 0;
}
Слайд 8Результаты тестирования программы
Как видно программа запустилась без сообщений об ошибках.
Это означает, что функция test() завершилась успешно. То есть сгенерированная
спиральные матрицы порядка 1 и 5 оказалась равными заданным вручную матрицам.
Также видно, что для введенного порядка 3 результат также верен.
Вывод: Результаты расчётов по программе полностью воспроизводят контрольный пример, следовательно программа работает верно и может быть применена для массовых расчётов.
Слайд 9Заключение
В данной работе была создана программа, позволяющая заполнять квадратную матрицу
порядка n числами, заданными функцией F(n), записывая их в нее
«по спирали» a) по часовой стрелке, б) против часовой стрелки.
Перед началом процесса программирования, на этапе алгоритмизации были словесно описаны шаги алгоритма, которые в дальнейшем были представлены в виде блок-схем.
После этого был осуществлен процесс программирования, т.е. запись алгоритма решаемой задачи на конкретном языке программирования, в данной работе язык программирования был С++.
В конечном итоге, была произведена отладка и тестирование написанной программы на основе контрольных примеров.
Все поставленные задачи были выполнены, соответственно цель работы была достигнута.