crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Программа для создания кроссвордов, Обсуждение программы и кода
xwicked
  опции профиля:
сообщение 2.8.2011, 14:50
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 2.8.2011
Из: Старый Оскол
Пользователь №: 2781

Спасибо сказали: 0 раз(а)




Репутация:   0  




Здравствуйте! Есть одна программа для создания кроссвордов. Она состоит из двух частей: создание и отгадывание.

Прошу её код хорошо покритиковать. Для остальных, чтобы могли посмотреть на её работу, дам ссылки на бинарники 32-бит: создание, отгадывание. Qt-4.5.3.

Проекты OpenSource под GPLv2. Ссылки на SourceForge.net - создание, отгадывание.
Это мой первый код на C++(Qt). Жду комментариев :)

Добавлю небольшое описание: Сетка кроссворда представлена обычной таблицей TableCrosswordEdit(QTableWidget), слова загружаются в список слов ListWord(QStringList), толкования(вопросы) находятся в списке вопросов ListQuestions(QListWidget).

Структура файла - динамическая. Когда писал программы на Delphi - использовал статику - расходовалось лишнее дисковое пространство .
XWC: Пароль, количество строк, количество столбцов, ширина(высота) ячейки таблицы, шрифт, структура таблицы(w + 1(x) - белая ячейка, b + 1( c ) - чёрная), строка с данными CrosswordData(QString).
      ... if(file.open(QIODevice::WriteOnly))
                         {
                             QBrush BrushBlack = QBrush(Qt::black, Qt::SolidPattern);
                             QDataStream sfile(&file);
                             QChar sdata;
                             ushort idata;
      
                                 if(State == false) sfile << strPassword;
      
                             sfile << TableCrosswordEdit->rowCount();
                             sfile << TableCrosswordEdit->columnCount();
                             sfile << TableCrosswordEdit->rowHeight(0);
                             sfile << TableCrosswordEdit->font();
      
                                 for(int i = 0; i < TableCrosswordEdit->rowCount(); i++)
                                     for(int j = 0; j < TableCrosswordEdit->columnCount(); j++)
                                         {
                                                 if(TableCrosswordEdit->item(i,j)->background() == BrushBlack)
                                                     {
                                                         sdata = 'b';
                                                         idata = sdata.unicode() + 1;
                                                         sfile << idata;
                                                     }
                                                 else
                                                     {
                                                         sdata = 'w';
                                                         idata = sdata.unicode() + 1;
                                                         sfile << idata;
                                                     }
      
                                             sdata = 0;
                                         }
      
                                 if(State == false) CrosswordToData(2);
                                 if(State == false) sfile << CrosswordData;
      
                             file.close();
      
                                 if(State == false) SaveStateCross = true;
                                 else SaveStateTemplate = true;
                         } ...

CrosswordData: цикл по количеству слов(q, QChar(номер слова), QChar(координата строки в сетке), QChar(координата столбца в сетке), направление слова в сетке), цикл по количеству слов(W, QChar(номер слова), QChar(длина слова), само слово), цикл по количеству вопросов(Q, QChar(номер вопроса), QChar(длина вопроса), сам вопрос).
      ...
                             for(int i = 0; i < ListWord.count(); i++)
                                 {
                                     CrosswordData.append(QChar('W'));
                                     CrosswordData.append(QChar(ushort(i)));
                                     CurrentString.clear();
                                     CurrentString.append(ListWord.at(i));
                                     CrosswordData.append(QChar(ushort(CurrentString.length())));
                                     CrosswordData.append(ListWord.at(i));
                                 }
      
                             for(int i = 0; i < ListQuestions->count(); i++)
                                 {
                                     CrosswordData.append(QChar('Q'));
                                     CrosswordData.append(QChar(ushort(i)));
                                     CrosswordData.append(QChar(ushort(ListQuestions->item(i)->text().length())));
                                     CrosswordData.append(ListQuestions->item(i)->text());
                                 } ...

Шаблон кроссворда(XWTPL) таже структура, но без пароля и без CrosswordData.

Состояние сохранения(tmpcross): цикл по количеству слов(W, QChar(номер слова), QChar(длина слова), само слово).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Алексей1153
  опции профиля:
сообщение 23.8.2011, 9:03
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


xwicked, громоздкость ? Да ерунда. Имена неосновных узлов можно задавать покороче. Всё остальное хорошо сожмётся архиватором

Минусы двоичных форматов:
1. громоздкость самого формата. Давай, сохрани туда вектор или мапу :) Опупеешь.
2. Непереносимость и трудность переходов между версиями. Байт влево , байт вправо - расстрел на месте. Также нужно постоянно помнить и трястись над тем, чтобы (см п1) содержимое структур можно было бы побайтово копировать, а также чтобы не менялся порядок сохранения данных
3. за счёт чего увеличение ? Например, я сохраняю XML "вручную" (мне так показалось удобнее), а парсю готовым классом с открытыми исходниками. Ну добавит это всё от силы пару килобайт в модуль.

ЗАТО

- забудешь про пункт 2
- экономия кучи нервов и времени
- вложенность: можно для каждого класса определить функцию, которая дописывает в поток кусочек с XML-узлом класса.
- отладка. Попробуешь - поймёшь. Видно визуально, правится прямо в студии (ну это я про себя - у меня студия), она и UTF8 понимает, и форматирование расставит.
- непринуждённая расширяемость. Добавляй, что хочешь, удаляй, что хочешь.

лично я раньше сохранял в двоичные файлы, но когда узнал про XML - теперь никогда такой хренью не страдаю )))

xwicked, ох, а как весело поддерживать программы, где программист вовсю сохранял структурированные данные в двоичные файлы... Я вот сейчас такой проект веду. Как внезапно начинало рушиться - а поразбираешься, вот она, причина. Поменял местами переменные в структуре, а он, гат такой, в двоичные файлы любит записывать, в результате записывается указатель (и читается тоже). Не поленился, потратил два дня на переделывание в XML - теперь полёт нормальный )

Ещё один интересный момент: как думаешь, что сохранится в файл, если запишешь туда переменную типа B ?

Раскрывающийся текст
struct A
{
    int a;

    A():a(0x00)
    {
    }

    A(int a):a(a)
    {
    }

    virtual ~A()
    {
    }
};

struct B:A
{
    A a2;
    int b;

    B():a2(0x11),b(0x22)
    {
    }
};


B b;
int i=sizeof(b); //сколько ?
void* p=&b;      //что там ?


Сообщение отредактировал Алексей1153 - 23.8.2011, 9:04
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xwicked
  опции профиля:
сообщение 23.8.2011, 10:15
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 2.8.2011
Из: Старый Оскол
Пользователь №: 2781

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 23.8.2011, 10:03) *
xwicked, громоздкость ? Да ерунда. Имена неосновных узлов можно задавать покороче. Всё остальное хорошо сожмётся архиватором

Минусы двоичных форматов:
1. громоздкость самого формата. Давай, сохрани туда вектор или мапу :) Опупеешь.
2. Непереносимость и трудность переходов между версиями. Байт влево , байт вправо - расстрел на месте. Также нужно постоянно помнить и трястись над тем, чтобы (см п1) содержимое структур можно было бы побайтово копировать, а также чтобы не менялся порядок сохранения данных
3. за счёт чего увеличение ? Например, я сохраняю XML "вручную" (мне так показалось удобнее), а парсю готовым классом с открытыми исходниками. Ну добавит это всё от силы пару килобайт в модуль. ...
Вы немножко не осведомлены в вопросе даваемого Вами совета:
1
Цитата
# Размер XML-документа существенно больше бинарного представления тех же данных. В грубых оценках величину этого фактора принимают за 1 порядок (в 10 раз).
# Размер XML-документа существенно больше, чем документа в альтернативных текстовых форматах передачи данных (например JSON[4], YAML, Protocol Buffers) и особенно в форматах данных, оптимизированных для конкретного случая использования.
# Избыточность XML может повлиять на эффективность приложения. Возрастает стоимость хранения, обработки и передачи данных.
# XML содержит метаданные (об именах полей, классов, вложенности структур), и одновременно XML позиционируется как язык взаимодействия открытых систем. При передаче между системами большого количества объектов одного типа (одной структуры), передавать метаданные повторно нет смысла, хотя они содержатся в каждом экземпляре XML описания.
# Для большого количества задач не нужна вся мощь синтаксиса XML и можно использовать значительно более простые и производительные решения.

Ссылка на Википедию. Не привожу статьи из журналов, где многие думают о пересмотре стандарта XML и как от него отказываются.
2. Это если речь идёт о структурах и о стандартном C++. Я же сохраняю типы QStringList, QFont и подобные, их сможет загрузить только Qt, который изначально переносимый.
3. Вручную это делать глупо, когда есть интерфейсы DOM и SAX. Увеличение за счёт добавление библиотеки QtXml + библиотека для сжатия этого XML.

ЗЫ: Всё просто :)

Сообщение отредактировал xwicked - 23.8.2011, 10:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- xwicked   Программа для создания кроссвордов   2.8.2011, 14:50
- - ViGOur   у нас на сайте, есть раздел исходники, можешь доба...   2.8.2011, 15:43
|- - xwicked   Цитата(ViGOur @ 2.8.2011, 16:43) у нас на...   2.8.2011, 18:17
- - xwicked   Продолжаем знакомиться с исходником. Профессиональ...   4.8.2011, 16:40
- - xwicked   Следующая версия программы - 0.1.5. Исходный код +...   6.8.2011, 12:08
- - registr   Попробуй рассказать об игре на http://www.gamedev....   7.8.2011, 11:26
|- - xwicked   Цитата(registr @ 7.8.2011, 12:26) Попробу...   7.8.2011, 21:01
- - xwicked   А вот и новая версия 0.1.7. Изучаем исходный код +...   15.8.2011, 6:26
- - xwicked   Если у кого-нибудь будет желание свою изменённую в...   17.8.2011, 21:33
- - xwicked   Продолжение: 0.1.8. Исходник + сборки. Изменения:...   18.8.2011, 21:03
- - xwicked   Здравствуйте! Хочу порадовать Вас тем, что я ...   21.8.2011, 19:57
- - xwicked   Следующая версия = 0.2.0. Исходный код + сборки: ...   22.8.2011, 17:12
- - Алексей1153   xwicked, ЦитатаСтруктура файла - динамическая. ...   23.8.2011, 6:36
|- - xwicked   Цитата(Алексей1153 @ 23.8.2011, 7:36) ......   23.8.2011, 8:25
- - Алексей1153   xwicked, громоздкость ? Да ерунда. Имена неосновны...   23.8.2011, 9:03
|- - xwicked   Цитата(Алексей1153 @ 23.8.2011, 10:03) xw...   23.8.2011, 10:15
- - Litkevich Yuriy   Цитата(Алексей1153 @ 23.8.2011, 12:03) 1....   23.8.2011, 9:42
- - Алексей1153   Цитатаэто элементарно, по сравнению с XML сравнимо...   23.8.2011, 9:46
- - Алексей1153   xwicked, я прекрасно осведомлён о содержимом и уст...   23.8.2011, 11:15
|- - xwicked   Цитата(Алексей1153 @ 23.8.2011, 12:08) .....   23.8.2011, 11:20
- - Алексей1153   xwicked, осторожно! Кроссворды тебя погубят   23.8.2011, 11:28
- - xwicked   Программа доведена до стабильности. Релиз 0.2.1. И...   25.8.2011, 18:19
- - xwicked   А в новой версии 0.2.2 я реализовал импорт кроссво...   3.9.2011, 22:53
- - xwicked   Здравствуйте! Цитата- Добавлена возможность по...   8.11.2011, 1:39
|- - Sokoloff   Цитата(xwicked @ 8.11.2011, 2:39) Появила...   29.11.2011, 12:05
- - xwicked   В версии 0.2.8 я добавил функции горизонтального и...   26.11.2011, 23:55
- - Алексей1153   ЦитатаНо... я не смог быстро придумать функцию обр...   28.11.2011, 6:12
- - xwicked   Цитата(Sokoloff @ 29.11.2011, 12:05) ... ...   1.12.2011, 5:52
- - xwicked   Следующая версия программы 0.2.9. В ней я походу в...   28.1.2012, 16:04
- - xwicked   Здравствуйте! Как я избавился от переполнения ...   8.2.2012, 22:48
- - Алексей1153   можно немного встряну )) предлагаю более ООП вари...   9.2.2012, 7:37
|- - xwicked   Цитата(Алексей1153 @ 9.2.2012, 8:37) можн...   9.2.2012, 15:34
- - Алексей1153   >>Насчёт остального мне пока квалификации не...   9.2.2012, 19:52
|- - xwicked   Цитата(Алексей1153 @ 9.2.2012, 20:52) ......   9.2.2012, 21:52
- - Алексей1153   свич - это великолепная штука, когда нужно выбрать...   10.2.2012, 6:45
- - xwicked   Оптимизация констант: enum eTypeCrossword {TYPE_PD...   11.6.2012, 16:14
- - xwicked   Все изменения:Цитата- Добавлена возможность создат...   6.5.2013, 21:36


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 13:01