2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3  След.
 
 
Сообщение19.03.2007, 23:22 


21/03/06
1545
Москва
незванный гость писал(а):
Вы будете долго смеяться, но я бы настойчиво рекомендовал посмотреть на результат еще более простого кода:
Код:
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 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
e2e4 писал(а):
Придумывать не-табличный алгоритм для перевода одной человеческой придумки в другую (причем сложившихся, вероятно, исторически, а, значит - мало связанных логикой) - неинтересно.

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

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

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

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

 Профиль  
                  
 
 
Сообщение20.03.2007, 10:06 


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

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

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

 Профиль  
                  
 
 
Сообщение20.03.2007, 19:23 
Аватара пользователя


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


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

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

 Профиль  
                  
 
 
Сообщение20.03.2007, 19:35 
Заслуженный участник
Аватара пользователя


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

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

 Профиль  
                  
 
 
Сообщение20.03.2007, 19:57 
Аватара пользователя


24/10/05
400
незваный гость, вы так не серчайте: я тестирую , тестирую.
с пробельными символами , кстати, не проходит - они не печатаются

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

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

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


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

 Профиль  
                  
 
 
Сообщение20.03.2007, 21:44 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
antoshka1303 писал(а):
я тестирую , тестирую

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

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

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

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

 Профиль  
                  
 
 
Сообщение20.03.2007, 23:00 


21/03/06
1545
Москва
Цитата:
с пробельными символами , кстати, не проходит - они не печатаются

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

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

 Профиль  
                  
 
 
Сообщение21.03.2007, 00:20 
Аватара пользователя


24/10/05
400
e2e4 писал(а):
Цитата:
с пробельными символами , кстати, не проходит - они не печатаются

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

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


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

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

 Профиль  
                  
 
 
Сообщение21.03.2007, 01:50 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Простите, это не риторический и не раздраженный вопрос: Вас учили выполнять программу по шагам? Если нет, уточните, пожалуйста, какой средой разработки Вы пользуетесь (Visual Studio, gdb,…). Я постараюсь найти средства интерактивной отладки.

 Профиль  
                  
 
 
Сообщение21.03.2007, 11:11 


21/03/06
1545
Москва
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 
Аватара пользователя


24/10/05
400
времени еще немного, но есть.
Среда разработки - ОС Mandriva , текстовый редактор, терминал. С gdb пока на Вы.

 Профиль  
                  
 
 
Сообщение21.03.2007, 16:35 


21/03/06
1545
Москва
Почему бы вам не использовать какую-нибудь среду разработки с интегрированным отладчиком, тот же Borland Builder? Там очень просто произвести пошаговую отладку вашего алгоритма.

 Профиль  
                  
 
 
Сообщение21.03.2007, 19:12 
Заслуженный участник
Аватара пользователя


17/10/05
3709
: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 


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

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group