Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: [C++] Зацените поделие  (Прочитано 1622 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн [DarkNet]Alpha

  • Автор темы
  • Активист
  • *
  • Сообщений: 987
  • Эмоциональный эльдар
    • Просмотр профиля
    • EBM-радио
[C++] Зацените поделие
« : 15 Февраля 2011, 00:47:52 »
Планируется программа для тестирования. Вот что есть на данный момент.
Если найдёте ошибки/глупости/индийский код, прошу указать.

(Нажмите, чтобы показать/скрыть)

(Нажмите, чтобы показать/скрыть)

Оффлайн scsiman

  • Активист
  • *
  • Сообщений: 344
    • Просмотр профиля
Re: [C++] Зацените поделие
« Ответ #1 : 15 Февраля 2011, 10:48:11 »
Общие замечания:
1. "Шифрование" XOR'ом -- не шифрование, ломается учеником 1-го класса. Если нет сил на pgp/gpg, то хотя бы "шифруйте" rar'ом без сжатия. На первое время.
2. В данном софте ценность кода исчезающе мала по сравнению с ценностью файла вопросов-ответов и, самого важного -- пар "вопрос -- правильный ответ". Поэтому основные усилия должны быть брошены на обеспечение его взломоустойчивости.
3. Целостность файла лучше проверять по CRC, например, md5.

Навскидку как-то так.
Dell Studio XPS 16, Ubuntu 16.04 LTS (Home).
HP nx6110, Ubuntu 8.04 LTS => 10.04 LTS (Home).

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: [C++] Зацените поделие
« Ответ #2 : 15 Февраля 2011, 13:51:24 »
Во-первых, откомментируйте программу получше, а то через полгода вам будет в ней разобраться настолько трудно, что легче написать заново.

Во-вторых,  обязательно ли хранить вопросы, ответы и оценки в таком xml-подобном виде? А потом так странно проверять файл на целостность? Кстати, лишний раз вызывается countTags.

Ну, и по мелочи:
 с отступами вы перестарались, ИМХО.
 язык-то — натуральный Си, а вовсе не Плюсы!
 для fgets может быть больше места заготовить? И кстати надо проверять, не слишком ли длинное имя файла ввёл пользователь. (Если последний символ в строке '\n', то весь ввод уместился, а иначе — часть не влезла. Здесь есть особый случай, если не влез как раз завершающий конец строки)
Делюсь знаниями, но их у меня мало!

Оффлайн [DarkNet]Alpha

  • Автор темы
  • Активист
  • *
  • Сообщений: 987
  • Эмоциональный эльдар
    • Просмотр профиля
    • EBM-радио
Re: [C++] Зацените поделие
« Ответ #3 : 15 Февраля 2011, 14:15:43 »
Спасибо, товарищи.

scsiman
Шифрование потом переделаю, это эксперименты.
Спасибо за советы по его улучшению.

Inkblack
С++ будет, когда я это в QT заверну...
Отступы здесь выглядят так, а в редакторе таб равен 4 пробелам, потому нормально.
А в каком файле будет лучше хранить? Теги - единственное, что пришло в голову.
Насчёт fgets спасибо, поправлю.

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: [C++] Зацените поделие
« Ответ #4 : 15 Февраля 2011, 15:09:00 »
Вот такой файл тоже пойдёт:

<q>Question 1</q>
<q>Question 2</q>
<q>Question 3</q>
<q>Question 4</q>
<a>Answer 1</a>
<a>Answer 2</a>
<a>Answer 3</a>
<a>Answer 4</a>
<m>10</m>
<m>10</m>
<m>10</m>
<m>10</m>

И такой:

   <a>Answer 1</a>
   <m>10</m>
   <q>Question 1</q>
   <m>20</m>
   <q>Question 2</q>
   <a>Answer 2</a>
   <m>30</m>
   <a>Answer 3</a>
   <a>Answer 4</a>
   <m>40</m>
   <q>Question 3</q>
   <q>Question 4</q>


Слишком свободный формат для входных данных не есть хорошо.
Может, лучше по-старинке,
1 Вопрос1 Ответ1 Оценка1
2 Вопрос2 Ответ2 Оценка2
3 Вопрос3 Ответ3 Оценка3
4 Вопрос4 Ответ4 Оценка4

Да, еще! Разве нельзя узнать размер файла без fseek и rewind? Не содержится ли она сразу в *pFile? Сам просто не помню.
Делюсь знаниями, но их у меня мало!

Оффлайн RazrFalcon

  • O_o
  • Старожил
  • *
  • Сообщений: 3129
  • Zombie Mod
    • Просмотр профиля
    • Я на GitHub
Re: [C++] Зацените поделие
« Ответ #5 : 15 Февраля 2011, 15:27:47 »
Как по мне - слишком растянутый код. Я люблю по компактней - читается лучше.

//////////////////////
//  File functions  //
//////////////////////
на
//File functions
if (!pBuf)
break;
на
if (!pBuf) break;
char answer[255]; // сюда будет писаться ответКоментить лучше строкой выше. Потом будут проблемы с редактированием.

Мои ИМХО.
Gentoo + KDE, Official Windows Hater
Хотите помочь нашей вики: https://help.ubuntu.ru/wiki/fixme

Оффлайн tremor

  • Участник
  • *
  • Сообщений: 212
  • Промышляю локальными сетями
    • Просмотр профиля
    • Компьютерные сети в Екатеринбурге
Re: [C++] Зацените поделие
« Ответ #6 : 15 Февраля 2011, 20:06:38 »
я тоже за простой формат входных данных. смысл в этих тегах, если можно ориентироваться в файле без них. столбцы-колонки - классика ))

Оффлайн [DarkNet]Alpha

  • Автор темы
  • Активист
  • *
  • Сообщений: 987
  • Эмоциональный эльдар
    • Просмотр профиля
    • EBM-радио
Re: [C++] Зацените поделие
« Ответ #7 : 15 Февраля 2011, 20:47:44 »
Может, лучше по-старинке,
1 Вопрос1 Ответ1 Оценка1
2 Вопрос2 Ответ2 Оценка2
3 Вопрос3 Ответ3 Оценка3
4 Вопрос4 Ответ4 Оценка4

Да, еще! Разве нельзя узнать размер файла без fseek и rewind? Не содержится ли она сразу в *pFile? Сам просто не помню.

А как прикажете вопрос от ответа отделять?
Размер файла узнать может и можно, но я не знаю, как по-другому.

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: [C++] Зацените поделие
« Ответ #8 : 15 Февраля 2011, 21:18:02 »
В этом примере вопрос от ответа отделяется символом '\t'.
Можно еще так:

"Первый вопрос"       "Первый ответ"      10
"2-й вопрос"               "2-й ответ"             10
"Третий вопрос"         "3-й ответ"             10
"4-й вопрос"               "Четвертый ответ" 10

— пробелами.

А вот существенный момент еще один:

Пользователь может напечатать ответ так:

answer 1
Answer1
Answer 1
Answer   1
ANSWER 1
...

А программа посчитает правильным только один вариант.
Вы действительно имеете это в виду?



У меня возникла идея. Сохраните промежуточные варианты, потом на их основе и на основе обсуждений в этой  теме можно будет сделать How-To для начинающих программистов. А то смотрите, какой Ужос творится в соседних темах.
« Последнее редактирование: 15 Февраля 2011, 21:31:08 от inkblack »
Делюсь знаниями, но их у меня мало!

Оффлайн Красноглазый

  • Активист
  • *
  • Сообщений: 702
    • Просмотр профиля
Re: [C++] Зацените поделие
« Ответ #9 : 15 Февраля 2011, 22:13:50 »
Не совсем понятно для чего такое тестирование. Если нужно указать ответ без предоставления вариантов, то оценить правильность ответа может только человек. Сравнение заглавных/прописных букв в ответе - минимальные проблемы. Труднее с синонимами и перестановками слов без потери смысла. А еще знаки препинания, меняющие смысл (казнить нельзя помиловать).
Если ответ предусматривает выбор из предоставленных вариантов - то где у вас в формате хранить варианты?
Кстати, если уж использовать xml теги, то файл имеет смысл оформлять по всем правилам. Единственный корневой тег, все остальные - вложенные с одинаковой структурой.
Это позволит пользоваться стандартной библиотекой разбора xml.
Например
(Нажмите, чтобы показать/скрыть)
С шифрованием сильно напрягаться тоже не стоит. Надежным может быть только ключ на защищенном носителе, все остальное ломается достаточно просто после анализа программы. Я для таких случаев использую два ключа, один зашитый в программу, второй хранящийся в отдельном файле. Информация шифруется на совместном ключе этих двух (алгоритм Диффи-Хеллмана). Более простой вариант - шифрование на псевдослучайной последовательности (например LFSR).
« Последнее редактирование: 15 Февраля 2011, 22:19:21 от Красноглазый »

Оффлайн [DarkNet]Alpha

  • Автор темы
  • Активист
  • *
  • Сообщений: 987
  • Эмоциональный эльдар
    • Просмотр профиля
    • EBM-радио
Re: [C++] Зацените поделие
« Ответ #10 : 27 Февраля 2011, 01:35:37 »
Переписал программу.
Выпилил мутотню с массивом строк, заменил структурой.
Переписал заполнение массива, код в том месте немного упростился.
Допишу - выложу.

Оффлайн S_F_H

  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Re: [C++] Зацените поделие
« Ответ #11 : 27 Февраля 2011, 12:38:30 »
помоему доступ к файлу проще через freopen осуществлять...

Оффлайн aliftin

  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Re: [C++] Зацените поделие
« Ответ #12 : 27 Февраля 2011, 15:01:40 »
Когда я писал вопросы для программы тестирования, то выглядели они так:
# Вопрос
- Не правильный ответ
- Не правильный ответ
+ Правильный ответ
- Не правильный ответ

Я написал несколько скриптов, используя sed и awk, и обработал огромную кучу вопросов за два вечера. Вопросы разделялись двойным "\n". Мне кажется такой формат куда удобней, чем нагромождение чего xml-подобного.
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

Оффлайн S_F_H

  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Re: [C++] Зацените поделие
« Ответ #13 : 27 Февраля 2011, 17:08:16 »
Почему вообще не подключить какуюнить БД? вон сколько реализаций SQL-серваков под Linux/

Оффлайн [DarkNet]Alpha

  • Автор темы
  • Активист
  • *
  • Сообщений: 987
  • Эмоциональный эльдар
    • Просмотр профиля
    • EBM-радио
Re: [C++] Зацените поделие
« Ответ #14 : 28 Февраля 2011, 23:16:31 »
БД - это сильно. И не очень нужно.

Вот изменённый код.
(Нажмите, чтобы показать/скрыть)

 

Страница сгенерирована за 0.099 секунд. Запросов: 25.