Вопрос-Ответ (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 |
|
| |
|