Программирование магических квадратов 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Программирование магических квадратов



Для программирования магических квадратов удобно использовать парадигму инкапсуляции объектно-ориентированного программирования, сосредоточив "магические" структуры данных и методы их обработки в отдельном классе Magic. В класс Magic рекомендуется включить следующие приватные (privat) компоненты - данные:

unsigned degree - порядок квадрата;

unsigned basic, differ - начальный элемент и разность арифметической прогрессии натуральных чисел, заполняющих магический квадрат;

unsigned **tab - указатель на двумерный массив беззнаковых целых чисел, который должен содержать матрицу магического квадрата.

Для обработки приватных данных в классе Magic целесообразно предусмотреть следующие общедоступные (public) компонентные методы:

void magodd() - формирует магический квадрат нечетного порядка;

void mageven2() - составляет магический квадрат четного порядка, у которого порядок является экспонентой 2;

int chksum() - вычисляет контрольные суммы элементов столбцов, строк и главных диагоналей квадрата, возвращая величину константы квадрата или 0, если квадрат не является магическим;

void print() - отображает матрицу и константу магического квадрата в потоке стандартного вывода;

void magbuild() - вызывает метод составления, соответствующий порядку магического квадрата.

Для инициализации компонент-данных в классе Magic следует предусмотреть конструктор. Конструктор класса Magic должен иметь возможность принимать 3 аргумента, определяющих порядок, начальный элемент и разность арифметической прогрессии элементов магического квадрата. При декларации конструктора рекомендуется указать значения аргументов по умолчанию:

Пример 1

class Magic {

// некоторый код

Public:

Magic(unsigned=3, unsigned=1, unsigned=1);

// некоторый код

};

Это позволит для создания объектов класса Magic использовать вызов конструктора в сокращенном формате; с одним, двумя или без аргументов. Например, следующий вызов конструктора:

Magic loshoo;

является корректным для составления магического квадрата ло-шу, где приватные компоненты-данные degree, basic, differ по умолчанию инициализируются величинами 3, 1, 1, соответственно. Кроме инициализации целочисленных компонент-данных конструктору класса Magic желательно поручить динамическое распределение памяти, необходимое для хранения 2-мерного массива элементов магического квадрата tab. Для динамического распределения памяти под 2-мерный массив рекомендуется использовать следующую 2-х этапную схему:

1. распределить память под 1-мерный массив указателей на беззнаковые целые размером degree по адресу tab используя оператор new:

tab=new unsigned *(degree);

2. под каждый указатель полученного массива указателей распределить одномерный массив беззнаковых целых из degree элементов, используя оператор new в цикле:

for (int i=0; i<degree;i++)

tab[i]=new unsigned(degree);

Рассмотренный способ формирования 2-мерного массива позволит обращаться к любому j-му элементу i-й строки в компонентных методах класса Magic традиционным образом tab[i][j]. Вызов компонентных методов составления магического квадрата может быть реализован в теле конструктора класса Magic, а обращение к компонентному методу отображения результатов целесообразно организовать в основной функции программы magic.

После завершения требуемой обработки и отображения результатов объекты класса Magic должны быть уничтожены с помощью деструктора ~Magic(). Деструктор класса Magic должен освободить память, динамически распределенную конструктором по адресу tab для хранения 2-мерного массива элементов магического квадрата. Рекомендуется освобождать память по схеме обратной ее распределению, используя оператор delete:

1. освободить память, распределенную под degree одномерных массивов беззнаковых целых (из degree элементов каждый) по адресам от tab[0] до tab[degree-1]:

for (int i=0; i<degree; i++)

delete [degree](tab[i]);

2. освободить память, распределенную под 1-мерный массив указателей на беззнаковые целые, состоящий из degree указателей по адресу tab:

delete [degree]tab;

Обычно деструктор вызывается неявно при завершении работы с объектом класса, например, после выхода из блока, где объект был определен. При необходимости явного вызова деструктора в обращении к нему должно быть специфицировано имя класса, которому он принадлежит:

Magic mag(4);

mag.Magic::~Magic();

В соответствии с принципами структурного программирования следует разместить декларацию класса Magic в отдельном заголовочном h-файле. Исходный код компонентных методов класса Magic и основной функции main() программы magic, которая оперирует ими, рекомендуется разместить в 2-х отдельных файлах. Для успеха трансляции в каждый из них нужно включить заголовочный файл класса Magic, используя директиву include.

Поиск числовых палиндромов

Описание алгоритма

Построение алгоритма основано на том, что легче проверить свойство быть палиндромом, чем свойство быть квадратом. Поэтому целесообразно сначала вычислять квадрат числа, а затем проверять, является ли десятичное представление квадрата числа палиндромом. С учетом этого обстоятельства наиболее абстрактный проект алгоритма можно построить следующим образом:

· Задать предельное значение счетчика чисел (100).

· Обнулить счетчик чисел.

· Выполнять цикл

o { Увеличить значение счетчика на 1.

o Возвести значение счетчика в квадрат.

o Представить значение квадрата счетчика в форме строки цифр и получить копию этой строки.

o Реверсировать копию строки цифр, представляющей квадрат счетчика чисел.

o Если прямое и инверсное представления строки квадрата счетчика эквивалентны, то печать палиндрома и значения счетчика.

o } пока счетчик меньше предельного значения.

Структуры данных

Исходя из анализа алгоритма решения данной задачи целесообразно объявить следующие переменные:

· count — счетчик целых чисел;

· limit — предельное значение счетчика;

· square — квадрат счетчика целых чисел;

· direct — десятичное представление квадрата счетчика;

· inverse — инверсное десятичное представление квадрата счетчика.

По логике работы алгоритма переменные count, limit и square должны принимать неотрицательные целые значения. Поэтому они должны иметь тип unsigned int. Поскольку предельное значение счетчика постоянно, объявление переменной limit можно дополнить модификатором const.

Для хранения прямого и инверсного представлений квадрата счетчика можно зарезервировать 2 массива символов размером по 6 байт. Такая размерность массивов обеспечивает хранение максимального значения символического представления квадрата счетчика (10000), длиной 5 байт плюс символ ’\0’, который обозначает конец информационной части символьной строки. Размерность массивов может быть задана директивой препроцессора define.


 

Приложение 2. Лабораторные работы



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 28; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.138.144 (0.009 с.)