2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3  След.
 
 
Сообщение19.03.2007, 23:22 
незванный гость писал(а):
Вы будете долго смеяться, но я бы настойчиво рекомендовал посмотреть на результат еще более простого кода:
Код:
while(!cin.eof())
{
  char c;
  cin >> c;
  cout << с;
}

Нет у меня субъективной уверенности, что будет выведен входной текст. Ну нетути.

Скорее всего не будет. Необходимо переоткрыть cin и cout в бинарном режиме, что не всегда корректно сказывается на работе программы/системы.
См. например
http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.13
И решение проблемы для Win32:
http://lists.cs.uiuc.edu/pipermail/llvm ... 06015.html

Вообще-то, тут уже необходимо оговаривать платформу, под которую пишется программа и компилятор. Что-то я сомневаюсь, что преподаватель задал задачу на такие дебри, не объяснив, что делать. Или он давал конкретный код для открытия потоков в бинарном режиме, либо как-то в задании обговаривается диапазон входных данных, или.... много или в общем.

А вот тут
Цитата:
Впрочем, утверждение, что «таблица свыше нам дана, // замена счастию она» не всегда верно: надо уметь и построить таблицу…

право, построить таблицу по объективным природным законам, красиво записать тот или иной алгоритм - это одно. Придумывать не-табличный алгоритм для перевода одной человеческой придумки в другую (причем сложившихся, вероятно, исторически, а, значит - мало связанных логикой) - неинтересно.

 
 
 
 
Сообщение20.03.2007, 00:04 
Аватара пользователя
:evil:
e2e4 писал(а):
Придумывать не-табличный алгоритм для перевода одной человеческой придумки в другую (причем сложившихся, вероятно, исторически, а, значит - мало связанных логикой) - неинтересно.

Вот тут Вы очень интересно заблуждаетесь. UTF-8 был специально разработан для эффективного преобразования Unicode в цепочки переменной длины с весьма хорошими свойствами, а Latin-1 намеренно сделана совпадающей с диапазоном 0-0xFF Unicode.

Примеры хороших свойств:
* текст можно сканировать вперед и назад;
* отношение порядка и идентичности сохраняются;
* в тексте возможен поиск в прямом и обратном направлении (включая регулярные выражения).

Более того, придумывать алгорифм негде. Алгорифм сей часть стандарта Unicode, причем старая. Придумывать можно только способ написания кода программы.

e2e4 писал(а):
Скорее всего не будет.
Я имел в виду другие эффекты, не зависящие от платформы. Но моя цель была, в первую очередь, обратить внимание antoshka1303 на нетривиальность этих операторов.

 
 
 
 
Сообщение20.03.2007, 10:06 
Незванный гость, мы опять пришли к тому, что по-разному воспринимаем некоторые вещи, и по-разному подходим к решению задачь. Каюсь, до сих пор не ответил вам в теме про цену ОС, но там примерно то же самое. Мой подход: будь перекодировка хоть 100 раз логична, время, потраченное на вникание в эту логику, будет больше, чем время для копи-паст таблицы в программу. Более того, я два раза подчеркнул, что не знаю, что такое UTF-8 и latin-1. Да, вчера полазил по инету минут 10, почитал - вроде специально сделано так, чтобы транслировались друг в друга хорошо. Ну и что? :). Переписывать одно и то же каждому программисту? Да, студенту, может, и стоило бы вникнуть, для кругозора. Но на практике важен результат и кол-во затраченного времени.
Вам же интересно разобраться. Что-ж, у каждого свои приоритеты. Но для себя я бы предпочел разбираться в чем-то более интересном.

незванный гость писал(а):
Я имел в виду другие эффекты, не зависящие от платформы.

А вот тут я в тупике. Не могу сообразить ничего, кроме текстового и бинарного режимов открытия потоков. Поясните?

 
 
 
 
Сообщение20.03.2007, 19:23 
Аватара пользователя
незваный гость писал(а):
И еще: я не исключаю, что Вас ловят на особенностях оператора <<. Как себя поведет Ваша программа, если ей встретятся два пробела подряд? Пробел и пара табуляций?.. Что произойдет, если встретится \0 во входном потоке?


извините за вопрос, но в чем проблема пробельных символов? они разве не в диапазоне 0x00 0xff? :?

и еще - символ с кодом \0 воспринимается как конец ввода, тут все вроде бы чисто

 
 
 
 
Сообщение20.03.2007, 19:35 
Аватара пользователя
:evil:
Во-первых, нет. \0 — это законный символ в тексте файла. Кто Вам сказал, что это конец ввода? Преподаватель?

Во-вторых, Вы попробуйте все-таки использовать компьютер для тестирования. Я не утверждаю, что проблема с пробелами есть. Я утверждаю, что она может быть. Я предложил Вам конкретные тесты. Они проходят?

 
 
 
 
Сообщение20.03.2007, 19:57 
Аватара пользователя
незваный гость, вы так не серчайте: я тестирую , тестирую.
с пробельными символами , кстати, не проходит - они не печатаются

Добавлено спустя 9 минут 4 секунды:

незваный гость писал(а):
:evil:
Во-первых, нет. \0 — это законный символ в тексте файла. Кто Вам сказал, что это конец ввода? Преподаватель?

Во-вторых, Вы попробуйте все-таки использовать компьютер для тестирования. Я не утверждаю, что проблема с пробелами есть. Я утверждаю, что она может быть. Я предложил Вам конкретные тесты. Они проходят?


в задании написано, что данные со стандартного потока ввода. Впрочем, \0 там все равно может возникнуть, наверно :?

 
 
 
 
Сообщение20.03.2007, 21:44 
Аватара пользователя
:evil:
antoshka1303 писал(а):
я тестирую , тестирую

Очень хорошо. Это значит, мы на правильном пути.
antoshka1303 писал(а):
с пробельными символами , кстати, не проходит - они не печатаются

Это тоже хорошо. Это тоже значит, что мы на правильном пути. Естественно, что если «пробелы не печатаются», то многие тесты не пройдут. :) Теперь осталось выяснить, они не печатаются или не вводятся, и почему? Я рекомендую заглянуть в руководство по стандартной библиотеке.

antoshka1303 писал(а):
Впрочем, \0 там все равно может возникнуть, наверно

С клавиатуры Вы его вряд ли введете. Но существует такая вещь, как перенаправление ввода-вывода. Иначе бы Вашему преподу делать робота – стукача по клавиатуре.

 
 
 
 
Сообщение20.03.2007, 23:00 
Цитата:
с пробельными символами , кстати, не проходит - они не печатаются

Ребят, да вы что??
Код:
cout<<"   ";

не выводит три пробела???

 
 
 
 
Сообщение21.03.2007, 00:20 
Аватара пользователя
e2e4 писал(а):
Цитата:
с пробельными символами , кстати, не проходит - они не печатаются

Ребят, да вы что??
Код:
cout<<"   ";

не выводит три пробела???


в контексте данной задачи - не печатаются

а вообще конечно печатаются

 
 
 
 
Сообщение21.03.2007, 01:50 
Аватара пользователя
:evil:
Простите, это не риторический и не раздраженный вопрос: Вас учили выполнять программу по шагам? Если нет, уточните, пожалуйста, какой средой разработки Вы пользуетесь (Visual Studio, gdb,…). Я постараюсь найти средства интерактивной отладки.

 
 
 
 
Сообщение21.03.2007, 11:11 
antoshka1303, раз
Код:
cout<<"   ";

работает, а
Код:
cin>>c;
cout<<c;

"Съедает пробелы", значит дело не в cout :). Правда, тут необходимо еще понимать, что " " является const char *, а c - просто char, и
cout::operator<<(const char *) и cout::operator<<(char) имеют право по-разному работать, но дело тут не в этом.

Спасибо незванному гостю за указание на эту тонкость работы потоков в/в в си++. Теперь необходимо понять, в чем причина, и как ее устранить.

Вам вообще скоро свою работу сдавать? Время-то еще на то, чтобы потренероваться в отладке есть? Вы учитесь на программиста?

Добавлено спустя 29 минут 49 секунд:

Да, и еще, раз уж возникла такая тема:
- Символ '\0' есть признак конца строки в некотором соглашении, принятом во множестве стандартных функций языка си, да, и наверное, множества других языков. Существует еще масса способов расположить в памяти строку, причем так, чтобы можно было четко сказать, где ее конец. Например, в начале строки добавить информацию о ее длине в байтах. В си++ вы вольны создавать свои типы данных, в т.ч. и собственные строковые типы, и работать с ними, как вам заблагорассудится. При этом ваши строки необязательно будут оканчиваться на '\0'.
Символ '\0' закономерно может возникнуть в файле, а, следовательно, и в потоке ввода-вывода.
- Признак конца ввода строки уже является независимым от языка, и способа представления в нем строк, а является зависимым от программной платформы (ОС). Например, в DOS было принято заканчивать строки символами CR (0x0D)/LF(0x0A) (возврат каретки/перевод строки - аналогия с печатной машинкой). Символ '\n' в компиляторе под DOS производит именно эту комбинацию в стандартный вывод. Однако, в *nix используется только один из этих двух символов для обозначения конца строки (какой - я не помню). Соответственно, компилятор под *nix будет генерировать только один байт в конце каждой строки. Боюсь, что и cin не будет класть в вашу переменную данный байты, хотя они и входят в UTF-8 и latin-1. Она их будет интерпретировать по-своему. Поэтому, вам все же необходимо открыть поток в бинарном режиме, или не использовать cout::operator<<() и cout::operator>>(), а воспользоваться другими функциями потоков в stl. Хотя, если задание было на << и >>...
- Признак конца файла также является системно-зависимым. Обычно, ОС сама говорит вашему потоку, или ваш поток опрашивает ОС на предмет конца файла. И только вызвав cin.eof(), вы можете корректно в си++ проверить конец файла. Никаких спец. символов в конце файла, как правило, нет.

 
 
 
 
Сообщение21.03.2007, 12:30 
Аватара пользователя
времени еще немного, но есть.
Среда разработки - ОС Mandriva , текстовый редактор, терминал. С gdb пока на Вы.

 
 
 
 
Сообщение21.03.2007, 16:35 
Почему бы вам не использовать какую-нибудь среду разработки с интегрированным отладчиком, тот же Borland Builder? Там очень просто произвести пошаговую отладку вашего алгоритма.

 
 
 
 
Сообщение21.03.2007, 19:12 
Аватара пользователя
:evil:
antoshka1303 писал(а):
С gdb пока на Вы.

Срочно переходите на «ты». Если понадобится, поставьте ему бутылку, но переходите сегодня же! :wink:

Я поставлю у себя сегодня чуть попозже. Будем разбираться вместе…

~~~~~~~~~~~~~~~~~~

Я, пожалуй, дам Вам еще один совет. Один из основных принципов тестирования и отладки — divide et impera. Как правило, программа состоит из частей:
Код:
foo(); bar()
Если она не работает, возможны три варианта: 1) не работает foo(), 2) не работает bar(), и 3) foo() и bar() работают, но их интерфейс не согласован. Поэтому первая часть тестирования состоит в разделении этих вариантов. Далее, уже зная, что именно не работает, мы можем разрулить эту ситуацию.

Как это соотносится с пошаговым отладчиком? Он позволяет во время теста исследовать обстановку в точке между foo() и bar(), и определить: а) отработала ли foo() правильно? и б) являются ли ее результаты правильным входом для bar()?

Это не единственное полезное свойство пошагового отладчика: он позволяет посмотреть, по какой ветке идет исполнение программы, и многое другое… Есть и недостатки: существенно изменяются временные характеристики исполнения, что важно в многопроцессной среде. В частности, почти невозможно отлаживать в условиях «соревнования» процессов.

 
 
 
 
Сообщение21.03.2007, 19:49 
[quote=незванный гость]
...
Если она не работает, возможны три варианта: 1) не работает foo(), 2) не работает bar(), и 3) foo() и bar() работают, но их интерфейс не согласован.
[/quote]
Я сильно поумничаю, если скажу, что еще как минимум существует возможность переполнения стека при очередном вызове bar(), что не очень-то отловишь отладчиком, а еще - то, что современные программы, как правило, состоят из нескольких частей (потоков, процессов), работающих асинхронно друг от друга (прерывания, разделение задачь на уровне ОС)? :). И многопоточная ("многопроцессораная") среда для вашей задачи - скорее правило, чем исключение.
Почему-то мне не всегда удается свести задачу отладки к простому "разделяй и властвуй", хотя это оч. и оч. сильный метод.
Отлоадка - в такой же (если не в большей) степени процесс творческий, как и написание кода.

P.S. чего-то quote не работает. Надо бы отладить ;)

P.P.S. antoshka1303 - как у вас там прогресс? Интересно все-таки, столько написали уже - а есть ли продвижение? :).

 
 
 [ Сообщений: 36 ]  На страницу Пред.  1, 2, 3  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group