Среда, 13 Ноября 2024, 11:32

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос-Ответ (C++)
KornivalДата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1
The Witcher
Сейчас нет на сайте
Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь.

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
GudleifrДата: Понедельник, 15 Июня 2015, 21:49 | Сообщение # 1441
почти ветеран
Сейчас нет на сайте
Первые две ошибки:
Цитата innovation ()
while(x[e] != '.')
e++;

Перед этим e не обнуляется.

Цитата innovation ()
if(e == 0)
{
while(x[1] == '0')
{
e--;
...

Если e равно нулю, уменьшать его...

Вообще же, не надо пытаться подбирать операции наугад.
Опишите алгоритм словами потихоньку исполняйте.

Добавлено (15 июня 2015, 21:49)
---------------------------------------------
Все-таки, требуется уточнение задачи.
На входе, я понимаю, три строки: S1 (возможный минус и возможные нули), S2 (целая часть, до точки), S3 (дробная часть, за точкой). На выходе: S4 (целая часть мантиссы, возможно, знак), S5 (дробная часть мантиссы), S6 (порядок, возможно знак). Если обозначить длину строки Si как Li, то, Вы написали, L5=2. Дальше - непонятно, L4=1+знак (стандартно) или L4=L2+L3-2+знак (без потери точности)?
Т.е преобразовать 1234.56789 надо в 1.23E3 или в 1234567.89E-3?


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Понедельник, 15 Июня 2015, 22:00
innovationДата: Понедельник, 15 Июня 2015, 22:02 | Сообщение # 1442
участник
Сейчас нет на сайте
Gudleifr,
Цитата
Т.е преобразовать 1234.56789 надо в 1.23E3 или в 1234567.89E-3?

Первый вариант)


Какой самый живучий паразит? Бактерия? Вирус? Кишечный глист? Идея. Она живучая и крайне заразная; стоит идее завладеть мозгом, избавиться от нее практически невозможно. Я имею виду сформировавшуюся идею, полностью осознанную, поселившуюся в голове.
GudleifrДата: Вторник, 16 Июня 2015, 09:48 | Сообщение # 1443
почти ветеран
Сейчас нет на сайте
innovation, давайте рассуждать.
0. Конечно, вызов scanf() и printf() решит проблему разом, но нам это не интересно (разве что, для проверки).

double d;
scanf("%lf",&d);
printf("%.2e\n",d);

1. Очевидно, основная часть программы должна состоять из ЧТЕНИЯ (получения S1, S2, S3), ПОЛУЧЕНИЯ (четырех значащих цифр, пусть, массив C), ОКРУГЛЕНИЯ (до 3-х цифр), ПЕЧАТИ (3-х цифр) и печати ПОРЯДКА (S6).
2. ЧТЕНИЕ и ПОЛУЧЕНИЕ нужно совместить, иначе получиться лишний проход. Не было бы ОКРУГЛЕНИЯ, можно было бы и ПЕЧАТЬ сюда же сунуть, но округлять мы должны задом наперед. Если же рассматривать это упражнение задачей про регулярные выражения, то ЧТЕНИЕ можно сделать отдельно и с выпендрежем, но ПОЛУЧЕНИЕ от этого легче не станет.
3. Возможные подводные камни: число может быть расположено целиком в S2 (и S3 даже читать будет не надо), или наоборот - целиком в S3 (да еще с ведущими нулями после точки), и, даже, S2 и S3 могут полностью отсутствовать (число 0). Может, даже, нам вместо числа какой-нибудь мусор подсунут. Округление тоже может вызвать проблемы, например, 9.995 должно превратиться в 1.00e+01.
4. Поэтому мы сначала все тщательно обнуляем и производим ЧТЕНИЕ1

char c[4] = {'0', '0', '0', '0'};
int n6 = 0;

char s1[2] = {0, 0};
if (*x == '-') s1[0] = *x++;
while (*x == '0') x++ ;

Теперь наша задача усложняется, мы не знаем, что нас ждет в строке. Может, даже, она уже кончилась.
ЧТЕНИЕ2:

while (*x >= '0' && *x <= '9') if (n6 < 4) c[n6++] = *x++; else x++, n6++;

Проверяем, от чего мы умерли.

5. Строка кончилась (*x == 0, S3 отсутствует), в массиве c первые 4 (или меньше, нам плевать) цифры, n6 - число считанных цифр. Как из n6 получить порядок? Если ничего не считалось, то он так и остается 0 (правильно), но, если что-то считалось, то он на 1 меньше числа считанных цифр (1 = 1.00e+00, 12 = 1.20e+01...).

if (n6) n6--;

Всяко, больше ничего в этом случае делать не надо, можно идти к ОКРУГЛЕНИЮ.

6. Другой вариант - мы уперлись в десятичную точку. Тут, как и в (5) возможны два варианта: что-то успелось считаться (n6 > 0) или нет.
В первом случае остается считать остаток:

*x++; /* пропускаем точку */
i = n6--; /* т.к. порядок больше меняться не будет, то нам понадобится новый счетчик */
while (*x >= '0' && *x <= '9' && i < 4) c[i++] = *x++;

Переходим к ОКРУГЛЕНИЮ.

7. В случае же, если до точки были только нули (n6 == 0, S2 отсутствует), то все немного сложнее:

*x++; /* пропускаем точку */
n6 = -1;
while (*x == '0') x++, n6--; /* число нулей будет на единицу меньше порядка (со знаком минус) */
i = 0;
while (*x >= '0' && *x <= '9' && i < 4) c[i++] = *x++;

Идем ... Нет, ОКРУГЛЯТЬ рано. Т.к. тут два цикла, есть вероятность, что первый сработал, а второй нет (S2 отсутствует, а S3 - из одних нулей).

if (!i) n6 = 0;

Все.

(Видите, сколько проверок нам пришлось зафигачить. И кто даст гарантию, что мы учли все? Поэтому, в случаях, аналогичных ЧИТАТЬ, и используют регулярные выражения).

8. Наконец, последний вариант: мы где-то упираемся в какую-то неправильную литеру. Плевать. Приравниваем это концу строки.
Проверять на этот случай надо только в конце (4), переходя к (5) в случае (*x != '.').
В (6) и (7) цикл сам остановится.

9. Надеюсь if-ы Вы сами расставите.
Проверить временный результат можно так

printf ("%c.%c%c%ce%d\n",c[0], c[1], c[2], c[3], n6);

10. Ничего не проверял, возможны опечатки.
Пока нашел и исправил три.
Особенно проверьте правильность расчета порядка.

11. Об ОКРУГЛЕНИИ и ПОРЯДКЕ, если будет нужно, в следующий раз.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Вторник, 16 Июня 2015, 11:19
innovationДата: Вторник, 16 Июня 2015, 11:45 | Сообщение # 1444
участник
Сейчас нет на сайте
Gudleifr, спасибо за столь хорошее объяснение решения задачи.

Какой самый живучий паразит? Бактерия? Вирус? Кишечный глист? Идея. Она живучая и крайне заразная; стоит идее завладеть мозгом, избавиться от нее практически невозможно. Я имею виду сформировавшуюся идею, полностью осознанную, поселившуюся в голове.
VampalДата: Вторник, 16 Июня 2015, 15:02 | Сообщение # 1445
был не раз
Сейчас нет на сайте
Товарищи, кто знает о GOAP?
Скачал по одной из ссылок GPGOAP. Но как его подсоединить и как пользоваться? (Надеюсь, здесь это не будет оффтопом)


Сообщение отредактировал Vampal - Вторник, 16 Июня 2015, 16:04
PoidetLiДата: Среда, 17 Июня 2015, 09:16 | Сообщение # 1446
участник
Сейчас нет на сайте
Цитата Vampal ()
Товарищи, кто знает о GOAP?
Скачал по одной из ссылок GPGOAP. Но как его подсоединить и как пользоваться? (Надеюсь, здесь это не будет оффтопом)

GPGOAP это проект, просто берёшь и качаешь его и потом создаёшь консольный проект и туда засовываешь файлы


в еюдуго прсхлуренц
http://gcup.ru/forum/9-44187-1 мой Project 96
VampalДата: Среда, 17 Июня 2015, 20:07 | Сообщение # 1447
был не раз
Сейчас нет на сайте
Цитата PoidetLi ()
просто берёшь и качаешь его и потом создаёшь консольный проект и туда засовываешь файлы

Ну это и так знаю. Я про то, как использовать алгоритм нахождения решения задачи и как все это дело присоеденить к своему проекту

Добавлено (17 июня 2015, 20:07)
---------------------------------------------
К стати, снова проблемс... При компиляции выдает ошибку: .\main.c -- multiple definition of `main'
Как я понял "многократное использование "main". Погуглил, но что-то не нашел более-менее адекватного решения проблемы

GudleifrДата: Среда, 17 Июня 2015, 20:43 | Сообщение # 1448
почти ветеран
Сейчас нет на сайте
Цитата Vampal ()
не нашел более-менее адекватного решения проблемы
Надо читать инструкцию. Предположения можно строить любые. Например:
1. Надо переставить "точку входа в проект" на main из пакета. И писать только те функции, которые можно;
2. Перенести main из пакета в проект и править по потребности;
или
3. Удалить из пакета main-заглушку...


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
VampalДата: Четверг, 18 Июня 2015, 18:50 | Сообщение # 1449
был не раз
Сейчас нет на сайте
Gudleifr, Скачать VS 2010, попробую скомпилировать там.
GudleifrДата: Четверг, 18 Июня 2015, 19:15 | Сообщение # 1450
почти ветеран
Сейчас нет на сайте
Vampal, не думаю, что поможет.
Наверное проще, понять, зачем нужен main().
А, заодно,- что такое простейшие системы логического вывода (ведь они так просты, что специализированные супер-пупер рассуждалки - PROLOG, PLANNER - так и не прижились). Все очень просто!


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
OpenGOOДата: Четверг, 18 Июня 2015, 19:36 | Сообщение # 1451
почти ветеран
Сейчас нет на сайте
Вся либа это два исходника (astar.c goap.c) и два заголовочные файла (astar.h goap.h). Надо просто их добавить в проект. Там даже написано что нужно сделать
gcc -std=c99 astar.c goap.c main.c В main.c это пример программы которую можно взять за основу. Отсутсвие документации заменят доступ к исходникам.


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
GudleifrДата: Четверг, 18 Июня 2015, 19:43 | Сообщение # 1452
почти ветеран
Сейчас нет на сайте
OpenGOO, спасибо. Вот видите, Vampal, проще было посмотреть, чем предположения строить.

Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
VampalДата: Четверг, 18 Июня 2015, 19:49 | Сообщение # 1453
был не раз
Сейчас нет на сайте
Gudleifr, Ну это я отлично понимаю, что все по своей сути просто. А за ссылочку спасибо, почитаю!
OpenGOO, Я в DevC++ в параметрах компилятора этот текст и добавляю.


P.S. Сейчас перевожу эту самую инструкцию. Если что, сюда кинуть?


Сообщение отредактировал Vampal - Четверг, 18 Июня 2015, 20:09
pelmenkaДата: Четверг, 18 Июня 2015, 20:33 | Сообщение # 1454
Драгоценный Тунеядец
Сейчас нет на сайте
Vampal, мне почему-то кажется, что тебе надо создать проект и добавить в него необходимые файлы. Тогда DevC++ сам будет их включать в компиляцию.

Сталина в каждый дом!
VampalДата: Четверг, 18 Июня 2015, 20:41 | Сообщение # 1455
был не раз
Сейчас нет на сайте
pelmenka, Я уже пробовал но мне пишет: gcc.exe [Error] cannot specify -o with -c, -S or -E with multiple files
GudleifrДата: Четверг, 18 Июня 2015, 20:56 | Сообщение # 1456
почти ветеран
Сейчас нет на сайте
Цитата Vampal ()
cannot specify -o with -c, -S or -E with multiple files

Ключ -o указывает имя результирующего исполняемого файла; остальные - не допускают его создания, останавливая компиляцию на половине, т.е. налицо противоречие. Надо искать в Вашем обезьяннике место, где они все устанавливаются.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
VampalДата: Четверг, 18 Июня 2015, 21:26 | Сообщение # 1457
был не раз
Сейчас нет на сайте
Gudleifr, То бишь, что мне нужно сделать?
GudleifrДата: Четверг, 18 Июня 2015, 21:33 | Сообщение # 1458
почти ветеран
Сейчас нет на сайте
Цитата Vampal ()
что мне нужно сделать?
Выяснить, кто вызывает gcc с ключами -o (это, вероятно, обезьянник делает автоматом - как назвали проект, он и прописывает) и -c, -S или -E (сборка "не до конца"). Может, обезьянник неправильно понимает -std=c99? Попробуйте выкинуть. Кстати, странно, что обезьянник требует прописывать имена всех компилируемых файлов (обычно они сами помнят файлы проекта).


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Четверг, 18 Июня 2015, 21:46
VampalДата: Четверг, 18 Июня 2015, 22:15 | Сообщение # 1459
был не раз
Сейчас нет на сайте
Gudleifr, В общем попробую завтра скачать другой компилятор и последовать вашим советам. (У нас в Тюмени уже 0.15. Спать охота! :))
GudleifrДата: Четверг, 18 Июня 2015, 22:22 | Сообщение # 1460
почти ветеран
Сейчас нет на сайте
Vampal, тут дело не в компиляторе. Найдите любого C-программиста и пусть он прогонит эту лабуду у себя.
У меня получилось следующее:
Код
User@comp /mnt/CRAZY/GPGOAP-master
$ gcc -std=c99 astar.c goap.c main.c

User@comp /mnt/CRAZY/GPGOAP-master
$ ./a.exe
scout:
   armedwithgun==1
   enemyvisible:=1
approach:
   enemyvisible==1
   nearenemy:=1
aim:
   enemyvisible==1
   weaponloaded==1
   enemylinedup:=1
shoot:
   enemylinedup==1
   enemyalive:=0
load:
   armedwithgun==1
   weaponloaded:=1
detonatebomb:
   nearenemy==1
   armedwithbomb==1
   enemyalive:=0
   alive:=0
flee:
   enemyvisible==1
   nearenemy:=0

$
                        ARMEDWITHGUN,enemyvisible,nearenemy,weaponloaded,enemylin
edup,ENEMYALIVE,ARMEDWITHBOMB,ALIVE,
0: scout               ARMEDWITHGUN,ENEMYVISIBLE,nearenemy,weaponloaded,enemylin
edup,ENEMYALIVE,ARMEDWITHBOMB,ALIVE,
1: load                ARMEDWITHGUN,ENEMYVISIBLE,nearenemy,WEAPONLOADED,enemylin
edup,ENEMYALIVE,ARMEDWITHBOMB,ALIVE,
2: aim                 ARMEDWITHGUN,ENEMYVISIBLE,nearenemy,WEAPONLOADED,ENEMYLIN
EDUP,ENEMYALIVE,ARMEDWITHBOMB,ALIVE,
3: shoot               ARMEDWITHGUN,ENEMYVISIBLE,nearenemy,WEAPONLOADED,ENEMYLIN
EDUP,enemyalive,ARMEDWITHBOMB,ALIVE,

User@comp /mnt/CRAZY/GPGOAP-master
$


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Четверг, 18 Июня 2015, 22:27
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг