Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2010, 01:14   #1
KEIego
Пользователь
 
Регистрация: 24.09.2010
Сообщений: 22
Восклицание Магический квадрат (через производный класс)

Здравствуйте!
Знаю, что на форуме неоднократно рассматривалась проблема разработки программы для построения магического квадрата, но то, в чем я не могу разобраться, я здесь не нашла.
Необходимо разработать программу для построения магического квадрата любого нечетного порадка из последовательных натуральных числе по специальному методу. При этом нужно реализовать базовый класс квадратной матрицы и класс магического квадрата, производный от базового. Преподаватель дал план написания, не могу разобраться с тем, почему компилятор ругается (в 47 строке). Затрудняюсь с самим выводом через два аргумента len и tab[row][col]. Что нужно писать в printf ("%...", len, tab[row][col])? Видимо, я не совсем понимаю суть введенного цикла в int Magic::maxlen(), а именно, что он меняет в квадратной матрице, которую мы до этого заполнили нулями. В закомментированном отрывке void Magic::magodd() организую алгоритм построения, это по силам.
Вот то, что удалось написать:
Код:
#include <stdio.h>
#include <stdlib.h>
class Matrix
{
   protected:
      unsigned **tab; //указатель на двумерный массив беззнаковых чисел, содержащий матрицу магического квадрата
      int row; //строки матрицы
      int col; //столбцы матрицы
   public:
      Matrix (int, int); //создаю конструктор класса Matrix
      ~Matrix(); //создаю деструктор Matrix
};
Matrix::Matrix (int r, int c) 
{
   int i;
   row = r;
   col = c;
   tab = new unsigned*[row]; //Распределаю память под 1-мерный массив на беззнаковые целые размером row по адресу tab
   for (i = 0; i < row; i++)
      tab[i] = new unsigned[row];
}
//Уничтожаю объекты класса Matrix с помощью деструктора
Matrix::~Matrix() 
{
   int i;
   for (i = 0; i < row; i++)
   delete[]tab[i];
   delete[]tab;
}
//Создание класса, производного от Martix
class Magic:public Matrix
   {
      int degree; //порядок матрицы магического квадрата      
      public:
         Magic (int); //конструктор класса Magic
         //~Magic();
         void magodd(); //формирую магический квадрат нечетного порядка
         void print(); //вывод магического квадрата
   };
int maxlen();
Magic::Magic(int n):Matrix(n, n)
{
   degree = n;
   for (row = 0; row < degree; row++)
      for (col = 0; col < degree; col++)
         tab[row][col] = 0;
   int Magic::maxlen()
   {
      int val = degree*degree;
      int len = 0;
      while (val>0)
      {
         val/=10;
         len++;
      }
   return len;
   }
}
void Magic::magodd()
{
   /*int a;
   tab[row-1][col] = a;
   a == 1;*/
}
void Magic::print()
{
   int len = maxlen();     
   for (row = 0; row < degree; row++)
   {
      for (col = 0; col < degree; col++)
      printf ("%...", len, tab[row][col]);
         //printf ("%d\t",tab[row][col]);
         printf("\n");
   }
}
int main (int argc, char *argv[])
{
   if (argc >2)
   printf ("\nUncorrect input data.\n");
   else
   {
      Magic mag(atoi(argv[1]));    
      mag.magodd();
      mag.print();
      return 0;
   }
}
KEIego вне форума Ответить с цитированием
Старый 23.10.2010, 02:31   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Код:
int maxlen();
Magic::Magic(int n):Matrix(n, n)
{
   degree = n;
   for (row = 0; row < degree; row++)
      for (col = 0; col < degree; col++)
         tab[row][col] = 0;
   int Magic::maxlen()
   {
      int val = degree*degree;
      int len = 0;
      while (val>0)
      {
         val/=10;
         len++;
      }
   return len;
   }
}
Вы определяете функцию внутри функции? Это вы зря. Вынесли бы ее нормально в класс.
Кстати, первая строчка вообще, скорее всего, лишняя.
Ну а с помощью printf два числа можно вывести, например, так:
Код:
printf ("%d\t%d\n", len, tab[row][col]);
Если, конечно, это то, что вам надо.
Если вам надо вывести число tab[row][col] шириной не менее len символов, то это будет выглядеть так:
Код:
printf ("%*d\t", len, tab[row][col]);
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 23.10.2010, 19:29   #3
KEIego
Пользователь
 
Регистрация: 24.09.2010
Сообщений: 22
По умолчанию

спасибо большое! теперь все понятно!
KEIego вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
магический квадрат Irk-O Помощь студентам 3 11.10.2010 13:00
[C++] Указатель на производный класс в базовом Student_IT Общие вопросы C/C++ 3 06.06.2010 07:06
Магический квадрат Arman Tokanov Помощь студентам 7 27.10.2009 15:42
Магический квадрат Гаджи Помощь студентам 5 24.10.2009 09:46
Магический квадрат Anarx Паскаль, Turbo Pascal, PascalABC.NET 2 18.12.2008 13:07