Ипотпал Лаптопи

 

Ние ще изградим ипотпал модул, състоящ се от няколко функции. Основна е функцията createMagic, която генерира магически квадрати от нечетен ред. Елементите на магическия квадрат се пресмятат в два вложени един в друг цикъла чрез формулите от по-горе, които тук няма да разглеждаме. Само ще споменем, че в тях редовете и колонките са с номера от 1 до п, но предвид на това, че първият елемент на всеки масив в C++ е с индекс 0, те ще бъдат приведени в номера от 0 до п – 1. За да бъде независим от размерите на магическия квадрат, вместо двумерен, ще бъде построен едномерен масив, имащ същото вътрешно представяне.

Това се постига с помощната функция index, която за всяка двойка ипотпални индекси (k, l) на елемент от двумерен масив съпоставя индекса, съответстващ на същия елемент в едномерния масив. Съществена роля в пресмятането на всеки елемент играе функция mod, която по-горе е с име f. Връзките на createMagic c indeх и mod функции са дадени на долупоказаната фигура. Останалите функции и връзките между тях се
дискутират впоследствие.

Модулът допълнително включва и функциите printMagic и isMagic. C първата се отпечатват произволни магически квадрати, а втората проверява дали един числов квадрат е магически. Ние съществено ще използваме и двете функции при тестването на функцията createMagic. Формалната спецификация на петте функции и тяхната реализация са дадени в два отделни ипотпал файла.

Файл: magic.h
#ifndef MAGIC_H
#define MAGIC_H

// Функцията createMagic строи магически квадрат от ред n
// PRE n – нечетно число
// POST Числата на квадрата са елементи на прогресия
// с първи член ‘а’ и разлика ‘d’
// Ако n е четно число, резултатът е false
// и квадратът не е построен
// Ако n е нечетно число, резултатът е true
// и квадратът е построен.
bool createMagic(int magic[], int n, int a, int d) ;

// Функцията mod е вариант на операцията, остатък от
// целочислено делене.
// PRE m<= n
// POST Ако m%n = 0, резултатът е n, а в противен случай е
// m%n
int mod(int n, int m) ;

//функцията index „трансформира“ двумерен (n реда и n ко-
//лонки) в едномерен масив с nхn елемента. По дадени
//индекси (p,q) на елемент от двумерния масив, функцията
//връща индекса на съшия елемент в представянето му като
//едномерен масив.
// PRЕ 0<=p<=q
// POST Резултатът е стойността на израза p*n + q.
int index {int p, int q, int n)

//функцията printMagic отпечатва параметрите на магичес-
//ки квадрат, представен като едномерен масив:
//п- ред на квадрата; числата на квадрата са елементи на
//прогресия с първи член ‘а’ и разлика ‘d’
//PRE n – нечетно число
//POST Числата на квадрата са елементи на прогресия
void printMagic(int magic[ ], int n, int a, int d);

//Функцията isMagic проверява дали построеният квадрат е
//магически
//PRE magic – целочислен едномерен масив с nхn елемента
//POST Резултатът е true, ако сумата от двата диагонала,
// всички редове и стълбове е едно и също число
// и false в противен случай
bool isMagic(int magic[], int n);
#endif

Останалата част от информацията за тестване на софтуер можете да намерите в:

Реализация на модула
Файл: MagicSquare.cpp

#include
#include
#include „magic.h“

bool createMagic(int magic[], int n, int a, int d)
{
if (n%2 = = 0 ) return false;
if ( n < 3) return false;
int i, j;
int n2 = (n-l)/2;
for (int l=0; l
{
for (int k=0; k
{
i = mod(n, k + l + n2 + 2);
j = mod(n, l + l + 2};
j = mod(n, k + j) ;
magic[index(l,k,n)] = a + ((i-l)*n + j -l)*d;
}
}
return true;
}

int mod(int n, int m)
{
int mn = m%n;
return (mn == 0) ? n : mn;
}
int index(int p, int q, int n)
{
return p*n + q;
}
void printMagic(int magic[ ], int n, int a, int d)
{
std::cout << „\nMagic square, N = “ << n
<< „, a = “ << a << „, d = “ << d << „, sum = “
<< n*magic [index (n/2, n/2, n)]<< std::endl;
int inx = 0;
for (int i=0; i
{
for (int j=0; j
std::cout << std::setw(4) << magic[inx++];
std::cout << std::endl;
}
}
bool isMagic(int magic[], int n)
{
int s1 = 0;
int s2 = 0;
// Сума на елементите по диагоналите
for (int i=0; i
{
s1 += magic[index(i,i,n)];
s2 += magic[index(n-l-i,i,n)];
}
if (s1 != s2) return false;
// Проверка по редове
for (int i=0; i
{
s2 = 0;
for (int j=0; j
s2 += magic[index(i,j,n)];
if (s1 != s2) return false;
}
// Проверка по колони
for (int i=0; i
{
s2 = 0;
for (int j=0; j
s2 += magic[index(j,i,n)];
if (s1 != s2) return false;
}
return true;
}

Подобни статии:

  1. Anti virus, Apple Talk и архитектури

Comments are closed.