Форум программистов, компьютерный форум CyberForum.ru

Скормить С код С++ компилятору? - C++

Восстановить пароль Регистрация
 
_Ivana
2189 / 1394 / 124
Регистрация: 01.03.2013
Сообщений: 4,148
Записей в блоге: 2
01.03.2013, 20:11     Скормить С код С++ компилятору? #1
Здравствуйте. Ради интереса я решал следующую задачку:
Кликните здесь для просмотра всего текста
Выражения языка L записываются по обычным правилам и строятся с помощью знаков арифметических действий +, –, *, / и круглых скобок. Операнды обозначаются буквами латинского алфавита. Операнды разделяются нулём или более пробелов.
Выражения функционального языка F записываются только с помощью функций ADD(x,y) – сложение; SUB(x,y) – вычитание; MUL(x,y) – умножение; DIV(x,y) – деление, где x и y – выражения языка F. Ни в языке L, ни в языке F одноместные операции не предусмотрены.
Дана строка длиной до 80 символов, содержащая правильное выражение языка L. Получить запись этого выражения на языке F. Операнды должны идти в том же порядке, что и во входном выражении. Лишних скобок не выводите.
Пример входных данных:
a + (b-c)/(c*d)
Пример выходных данных:
ADD(a,DIV(SUB(b,c),MUL(c,d)))

Я её решил, написал несколько алгоритмов на разных языках, в т.ч. на С. Но мне же захотелось отправить решение, а на том сайте компилятор С не предлагается - есть пара С++, но я с ним не работал. Прочитав немного интернета, я таки подключил iostream и получил/отправил данные через cin|cout. То есть, я воткнул между получением и отправкой свой С код, и это у меня работало на http://liveworkspace.org . Когда же отправлял это решение на сайт с задачей, раз 30 не мог добиться вердикта "Решено верно". Впоследствии оказалось, что входящая строка содержала '\r\n', а я ориентировался на завершающий 0. Решил другую задачку, также на С, пока не удалось добиться положительного вердикта сайта. Дело в том, что сайт не пишет ни входных ни выходных данных, то есть я даже не могу понять где у меня ошибка Плюс я не знаю традиций С++, особенностей класса string и т.д. Собственно, вопрос - имеет ли смысл мне продолжать писать код на С а потом пытаться скармливать его С++ компилятору? Или это изначально порочная затея и мне стоит поискать сайты, которые публикуют интересные задачи и принимают решения именно на С?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITishnik
7 / 7 / 0
Регистрация: 07.01.2013
Сообщений: 75
01.03.2013, 20:53     Скормить С код С++ компилятору? #2
Цитата Сообщение от _Ivana Посмотреть сообщение
писать код на С а потом пытаться скармливать его С++
кажется это какое то издевательство над компилятором
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
01.03.2013, 20:57     Скормить С код С++ компилятору? #3
С++ компилятор должен съедать код на чистых сях без извращений.
Если у вас что-то не компилится - выкладывайте код.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.03.2013, 21:17     Скормить С код С++ компилятору? #4
diagon, не факт, вот чисто сишный код http://liveworkspace.org/code/2FIUye, но С++ его не скомпилит.

Добавлено через 3 минуты
Цитата Сообщение от _Ivana Посмотреть сообщение
Собственно, вопрос - имеет ли смысл мне продолжать писать код на С а потом пытаться скармливать его С++ компилятору?
Если код написан на том Си, который подмножество С++, то С++ компилятор его скомпилит без изменений. Я даже думаю зря ты заморачивался с <iostream> и пр.
iifat
2179 / 1332 / 96
Регистрация: 05.06.2011
Сообщений: 3,690
01.03.2013, 21:28     Скормить С код С++ компилятору? #5
Таки в любом случае, имхо, стоит поставить себе кой-нить ++ для отладки. В принципе, ++ должен брать если не любую, то уж почти любую программу. \r\n, про которые ты пишешь -- это вовсе не особенность ++, это формат текстовых файлов.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
01.03.2013, 21:31     Скормить С код С++ компилятору? #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
С++ его не скомпилит.
так
Цитата Сообщение от diagon Посмотреть сообщение
без извращений
же

В си есть около полусотни фич, которые не скомпилятся на плюсах, но они очень редко встречаются.
Самые распространненые - неявное приведение void* к T*, правило неявного int и void main().
Kastaneda
01.03.2013, 21:33
  #7

Не по теме:

Цитата Сообщение от diagon Посмотреть сообщение
так
Цитата Сообщение от diagon
без извращений
же
Ну как бы да, но этот синтаксис вроде как K&R проповедуют (как говорят, я так и не прочитал эту книгу), поэтому хз - извращение или нет.

Байт
 Аватар для Байт
13988 / 8819 / 1230
Регистрация: 24.12.2010
Сообщений: 15,975
01.03.2013, 22:52     Скормить С код С++ компилятору? #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
я так и не прочитал эту книгу
А вот тут я вам завидую. Попробуйте, прочитайте. Конечно, ничего особо нового вы там не найдете. Все давным давно обсосано и даже переврано. Но попробуйте себя поставить на место древнего программера, замученного Алголами, Фортранами, Коболами и Пиэлями... Это был - взрыв. Основная идея, как я ее понял - мы хотим сделать так, чтоб нам было хорошо. Надеемся, что хорошо будет и вам.
Только там в конце есть "задачник" (во всяком случае в том первом переводе на ru, который мне попался). Вот его можете не читать. Это просто ребята резвились. Сами не могли понять, что ж за штуку они напридумывали. И от избытка молодой энергии фокусничали.
Светлой памяти Деннису Ричи.
Доброго здоровья Кернигану

Добавлено через 31 минуту
http://ru.wikipedia.org/wiki/%D0%A0%...BD%D0%B8%D1%81
Kastaneda
01.03.2013, 22:55
  #9

Не по теме:

Цитата Сообщение от Байт Посмотреть сообщение
http://ru.wikipedia.org/wiki/%D0%A0%...BD%D0%B8%D1%81
Байт, да как бы я знаю, кто такой Д.Ритчи)

Байт
 Аватар для Байт
13988 / 8819 / 1230
Регистрация: 24.12.2010
Сообщений: 15,975
01.03.2013, 23:03     Скормить С код С++ компилятору? #10
Цитата Сообщение от Kastaneda Посмотреть сообщение
да как бы я знаю, кто такой Д.Ритчи
Прошу прощения за пропущенную букву "т". Это, безусловно, невежливо с моей стороны.
_Ivana
2189 / 1394 / 124
Регистрация: 01.03.2013
Сообщений: 4,148
Записей в блоге: 2
01.03.2013, 23:30  [ТС]     Скормить С код С++ компилятору? #11
Спасибо за ответы. Вот вы говорите, что таки можно на С, и даже без iostream и cin/cout. Вторая задачка (очень простая, хотя оценена почему-то выше первой) http://atpp.vstu.edu.ru/cgi-bin/arh_...s.pl?id_prb=39, там сказано
Исходные данные
Строка печатных символов, длина не превышает 100000 символов.
Я не знаю, но подозреваю что в С++ можно завести string и он будет неограниченной длины, будет иметь методы конца и т.д. В С мне остается только нарезать массив char на 100001 и заполнить его как-то из входного потока (может и без iostream). Причем надо именно заполнить весь - алгоритм не довольствуется последовательным перебором входного потока. Просто я немного стесняюсь объявлять такие массивы, тем более что пишу в АВР студии и там еще надо найти камень, у которого хватит ОЗУ. Но там я для проверки заполняю массивы. А как только я получил данные в понятном мне виде (массив а не стринг), дальше у меня вопросов нет, точнее они появляются только при выводе. Что, неужели прокатит подлинковка стандартной С-шной stdio и вместо cout >> c можно написать printf(c)? И забыть про плюсовость вообще?
С++ компилятора на компе нет, пользуюсь http://liveworkspace.org
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.03.2013, 23:40     Скормить С код С++ компилятору? #12
ну 100000 символов это грубо говоря 100 Мб, почему бы не выделить (динамически) ?

Цитата Сообщение от _Ivana Посмотреть сообщение
С++ компилятора на компе нет, пользуюсь http://liveworkspace.org
там Linux и g++, характеристики машины думаю нормальные, так что можно и там эксперементировать.
_Ivana
2189 / 1394 / 124
Регистрация: 01.03.2013
Сообщений: 4,148
Записей в блоге: 2
02.03.2013, 01:19  [ТС]     Скормить С код С++ компилятору? #13
Попробовал, действительно прожевывает stdio с его printf и getchar - почему я не догадался сразу? И не надо обращаться к плюсам, остаемся в рамках С. Правда, есть момент - решения ранжируются по времени выполнения и по объему слинкованного файла, а это зависит от используемых библиотек. Сишные получились медленнее плюсовых, хотя и немного поменьше... Нет счастья в стандартных библиотеках

ЗЫ и раз уж отредактировали стартовый пост и выложили задачу (хотя она не принципиальна), то пользуясь случаем выражу сожаление - зря решения не ранжируются по ОЗУ - в этой задаче предел задан в 65536 КБ, а я в С уложился в 200 Байт на все вообще (и на стек в том числе).
iifat
2179 / 1332 / 96
Регистрация: 05.06.2011
Сообщений: 3,690
02.03.2013, 04:21     Скормить С код С++ компилятору? #14
Во-первых, таки напоминаю: ограничение по памяти 10000, так что никаких, как я понимаю, массивов на 100000 тебе не светит.
Во-вторых, никакого преимущества по скорости ++ перед Цэ не имеет и иметь не может в принципе. Он может отставать непринципиально, ненамного и т.п. -- но вызов метода объекта таки в разы медленнее вызова функи, а прочее одинаково.
В-третьих, это что за голый Цэ без ++? Такое ещё делают?

Добавлено через 7 минут
Виноват, не 10000, а 10000К, так что памяти хватит. Не знаю точно, умеет ли ++овый string расти самостоятельно, но таки никто не мешает тебе написать то же самое на Цэ.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
02.03.2013, 12:13     Скормить С код С++ компилятору? #15
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от iifat Посмотреть сообщение
но вызов метода объекта таки в разы медленнее вызова функи
Ahaha tell me moar.
_Ivana
2189 / 1394 / 124
Регистрация: 01.03.2013
Сообщений: 4,148
Записей в блоге: 2
02.03.2013, 14:54  [ТС]     Скормить С код С++ компилятору? #16
Провел тест - специально сделал ошибку в тексте скачанной программы лидера (только не приводящую к ошибке компиляции, а только к неправильному ответу) - и отправил его от своего имени на сайт :-) Казалось бы, зачем? У меня возникли сомнения, и я их подтвердил. Код с ошибочным результатом не помещается в список решений, зато помимо сообщения об ошибке выдается и время выполнения и размер файла. Так вот, сейчас код лидера имеет показатели: время 0.0014 сек, память 218 КБ. А на момент когда этот код занял первое место (01.03.2011), было: 0.0016 сек / 122 КБ. В коде стоит
Код
#include <iostream>
#include <string>
Я полагаю, что с того времени обновилась и существенно выросла одна или обе библиотеки и немножко убыстрилось железо сервера. Получается, что если сейчас использовать стандартные библиотеки, то нереально превзойти лидера в принципе. Кстати, лучший мой код (с include <iostream>) имеет показатели 0.0013 сек / 214 КБ (видно на странице статистики по задаче), и капельку, но превосходит настоящие (на текущий момент) лидерские. Если я применяю stdio, то получаю 0.0018 сек / 174 КБ.

По-хорошему, надо бы выдрать из iostream или stdio нужные функции, обрезать их по максимуму только для работы с файлами и поместить прямо в код, ничего не прилинковывая, и выкладывать такие решения. Или найти и сразу прилинковать старую короткую версию iostream. Вот на такие мысли навел меня результат моего нехитрого теста...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2013, 14:24     Скормить С код С++ компилятору?
Еще ссылки по теме:

Что-то компилятору не нравится. Ввод-вывод C++
Создание *.dll: для чего нужен компилятору параметр -DBUILD_DLL? (использую MinGW) C++
Создание программы, которая будет обращаться к компилятору C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
07.03.2013, 14:24     Скормить С код С++ компилятору? #17
Цитата Сообщение от iifat Посмотреть сообщение
но вызов метода объекта таки в разы медленнее вызова функи
Метод от функции отличается только с точки зрения языка. Вызов метода foo.bar(moo); в итоге развернётся в вызов функции mangled_name_of_bar(&foo, moo);, так что никакого отставания по скорости не будет.
Yandex
Объявления
07.03.2013, 14:24     Скормить С код С++ компилятору?
Ответ Создать тему
Опции темы

Текущее время: 23:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru