Вопрос № 103177: Здраствуйте, уважаемые эксперты.
Пожалуйста, объясните принцип перевода числа в число прописью, например 4 - четыре и т.д. ....
Предложенный алгоритм http://www.netcode.ru/cpp/?artID=53 выдает ошибку компиляции...Вопрос № 103197: Здраствуйте, Уважаемы Эксперты.
Помогите пожулуйста с написанием функции, которая считает контрольную сумму exe файла. Причём эта функция находиться в самом exe файле.
И как записать эталонное значение контрольной суммы в самой программ...Вопрос № 103252: Здравствуйте. Почему то не корректно работает библиотека string. Если пытаюсь вывести переменную:
string str = “Hello world”;
cout<<str;
на экран ничего не выводится. Если же выводить отдельно элементы cout<<str[1]; то все выв...
Вопрос № 103.177
Здраствуйте, уважаемые эксперты.
Пожалуйста, объясните принцип перевода числа в число прописью, например 4 - четыре и т.д. ....
Предложенный алгоритм http://www.netcode.ru/cpp/?artID=53 выдает ошибку компиляции
Перевод числа из записи цифрами в запись прописью можно осуществить следую следующему алгоритму:
1. Выделить тройки цифр - числа до тысячи, тысячи, миллионы и т.д.
2. Каждую тройку разбить на сотни и десятки. Сотни, если есть, заменить на соотв. строку.
3. Отдельно разобрать случай 0-9 и 11-19. Для 20+ разбить на десятки и единицы.
4. Собрать из прописных предствалений отдельных троек полное число.
И, конечно, следует учитывать изменение окончаний у тысяч, миллионов и т.д.
В приложении код из предложенного алгоритма, переписанный с использованием стандартной библиотеки.
Приложение:
--------- нет ничего невозможного
Ответ отправил: Aristos (статус: 6-ой класс)
Ответ отправлен: 24.09.2007, 16:59
Вопрос № 103.197
Здраствуйте, Уважаемы Эксперты.
Помогите пожулуйста с написанием функции, которая считает контрольную сумму exe файла. Причём эта функция находиться в самом exe файле.
И как записать эталонное значение контрольной суммы в самой программе? Проблема в том, что когда подсчитана контрольная сумма и мы записываем её в листинг программы и снова компилируем, контрольная сумма уже будет другой.
Может я что-то понимаю неправильно.
Заранее спасибо.
Приложение:
Отправлен: 24.09.2007, 11:05
Вопрос задал: MARTALEX (статус: 4-ый класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Aristos
Здравствуйте, MARTALEX!
Дело в том, что все константы (в частности контрольная сумма) попадают в exe файл. Кроме того, в заголовок exe файла может входить одним из полей контрольная сумма, считаемая компилятором. Из-за этого не получится простым образом задать контрольную сумму в тексте программы.
Я не знаю, как без внешнего изменения программы (в hex-редакторе) решить проблемму с контрольной суммой. Поэтому подскажу следующий способ.
Основная идея состоит в том, чтобы при посчёте контрольной суммы для файла пропустить байты в которых содержится запись самой суммы. Добавим в файл заранее известную "метку", например текст "1234567800000000" (первые 8 байт будем использовать для поиска, в оставшуюся (нули), запишем в hex-редакторе контрольную сумму). С большой вероятностью подобная последовательность байт в файле больше не встретится. Будем считывать данные из файла порциями по 16 байт и сравнивать первые 8 с первыми байтами
метки. Если не равно, то используем байты для расчета контрольной суммы.
После запуска открываем файл в hex-редакторе, находим метку и заменяем нули на значение контрольной суммы.
При запуске приложения, в строке будет содержаться "подправленная" метка с контрольной суммой. В приложении примерный код, с упрощенной функцией подсчета crc.
ps: Необходимо предусмотеть механизм получения от программы подсчитанной контрольной суммы. Например, если проверка не удалась её можно выводить на печать.
pps: так же необходимо задать выравнивание (кратноть адреса в файле) метки в файле. В компиляторе MS VC это делается с помощью инструкции __devlspec(align(n)).
Приложение:
--------- нет ничего невозможного
Ответ отправил: Aristos (статус: 6-ой класс)
Ответ отправлен: 24.09.2007, 14:27 Оценка за ответ: 5 Комментарий оценки: Ваши слова: "Основная идея состоит в том, чтобы при подсчете контрольной суммы для файла пропустить байты в которых содержится запись самой суммы.", натолкнули меня на мысли. Спасибо большое, вы мне очень помогли.
Вопрос № 103.252
Здравствуйте. Почему то не корректно работает библиотека string. Если пытаюсь вывести переменную:
string str = “Hello world”;
cout<<str;
на экран ничего не выводится. Если же выводить отдельно элементы cout<<str[1]; то все выводится нормально. Так же не получается передавать в качестве аргумента функции инициализации файла.
ofstream infile(str);
выдает ошибку:
Could not find a match for 'ifstream::ifstream(std::basic_string<char,std::string_char_traits<char>,std::allocator<char>>)'
Кроме того при подключение библиотеки постоянно висят несколько предупреждений:
Warn : string.h(549,3):Functions containing for are not expanded inline.
Использую Borland C++ version 5.02;
Посоветуйте пожалуйста как можно решить проблему.
Возможно дело в "особенностях" реализации стандартной библиотеки, идущей в комплекте с BC++. Для конеретно этих случаев - используйте функцию string::c_str(), которая возвращает указатель на хранимую строку:
string str = "Hello world";
cout<<str.c_str();
и
ostream ofile(str.c_str());
--------- нет ничего невозможного
Ответ отправил: Aristos (статус: 6-ой класс)
Ответ отправлен: 24.09.2007, 22:15 Оценка за ответ: 5 Комментарий оценки: Спасибо за совет. Теперь все работает.
Отвечает: Dr_Andrew
Здравствуйте, Angelkaworu!
Суть Вашей проблемы становится очевидной при взгляде на версию компилятора: Borland C++ version 5.02. Дедушка довольно древний, а Вы пытаетесь заставить его обработать класс библиотеки STL диалекта Standard C++. Если Вы не имеете возможности использовать что-то поновее, то Вам придётся забыть о STL и классе string и программировать в строки в старом стиле, как массивы символов (см. код 1).
В целом, могу лишь присоединиться к предложению сменить компилятор. Хотя я не работаю под Windows, но в своё время переносил свои программы под эту ОС и "прикручивал" библиотеку Qt к различным компиляторам от Borland. Бесплатный консольный Borland C++ Compiler 5.5 крайне не рекомендую, т.к. он хоть и работает с STL, но крайне плохо. Код, который без проблем компилировался-выполнялся в Linux на g++ и в Windows на MS Visual Studio, в BCC и в Borland C++ Builder 5.0 вылетал с ошибками. Но, вроде, по отзывам,
в новой версии компилятора это исправлено. Так что попробуйте Borland Turbo C++ Explorer, тем более, что он официально бесплатен и доступен для скачивания (не путать с Turbo C++ 3.0 - древним предком Borland C++ 5.02!).
В нём Вы можете воспользоваться классами библиотеки STL и программировать в "новом" стиле (см. код 2).
Кстати: не стоит смешивать "французский с нижегородским" (разные диалекты C++):
1. Заголовочный файл conio.h содержит функции (в частности, getch()), являющиеся творчеством компании Inprise / Borland и не имеющие к стандартному C++ никакого отношения. Стоит помнить, что исходный текст, содержащий заголовочном файле conio.h будет компилироваться только компиляторами от "дяди Бормана", но никак не другими, т.е. утрачивается основное преимущество C++ - переносимость.
2. Конструкция main(void) характерна для Си, но не для C++. В последнем достаточно main().
Приложение:
Ответ отправил: Dr_Andrew (статус: 1-ый класс)
Ответ отправлен: 24.09.2007, 23:25 Оценка за ответ: 5 Комментарий оценки: Спасибо за развернутый ответ. Проблему уже решил. Но все равно попробую скачать Turbo C++ Explorer.
Отвечает: Dutka M.M.
Здравствуйте, Angelkaworu!
Кинься етого string
вспомни о char[] и всё будет хорошо:)
Ответ отправил: Dutka M.M. (статус: 1-ый класс)
Ответ отправлен: 25.09.2007, 00:49 Оценка за ответ: 4