Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 928
от 06.12.2007, 21:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 480, Экспертов: 60
В номере:Вопросов: 10, Ответов: 13


Вопрос № 111792: Дано натуральное число N. Определить количество цифр в числе N....
Вопрос № 111796: Даны натуральное число N, действительные числа A1, …, AN. Заменить в последовательности A1, …, AN единицей числа, равные или превосходящие единицу, а нулем числа, меньшие единицы. Получить (1+R)/(1+S), где R – сумма всех членов последовательности, ме...
Вопрос № 111798: Дана строка символов. Группы символов, разделенные пробелами (одним или несколькими) и не содержащие пробелы внутри себя, будем называть словами. Подсчитать количество букв а в последнем слове строки....
Вопрос № 111801: Дан файл координат точек на плоскости. Переписать в файл G все точки, попадающие в окружность радиуса R и с координатами центра X,Y....
Вопрос № 111810: Здравствуйте. Помогите найти ошибку в программе. Функция Compare() некорректно работает, а почему не пойму. Вывожу специально следующие переменные на экран: cout << " " << c << " " << arr[i]; ...
Вопрос № 111862: Уважаемые эксперты! Я буду очень благодарен если вы решите мне такую задачу: В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1) количество элементов массива, лежащих в диапазоне от А до В; 2) сумму элементов м...
Вопрос № 111874: Здраствуйте ! У меня возникла проблемка с типами даных ! double Ys; Ys=0.3+1.5*(-0.2); cout <<"....."<<Ys<<endl; Должно вывести .....0 , но выводит .....-5.55112e-017 Ребята помогите ! А в...
Вопрос № 111875: Здраствуйте ! У меня возникла проблемка с типами даных ! double Ys; Ys=0.3+1.5*(-0.2); cout <<"....."<<Ys<<endl; Должно вывести .....0 , но выводит .....-5.55112e-017 Ребята помогите ! А во...
Вопрос № 111901: Проблемы с созданием UDF для Firebird1.0 на C++Builder6. В общем нужна функция округления до заданного числа знаков. В стандартной поставке Firebird есть похожая функция в fbudf.dll - round, но ее регистрация в БД такая: declare...
Вопрос № 111910: Здравствуйте! Я только начал изучать С++ Builder 2006. Немогу обьявить переменные типов TFileStream, TButton, и тд... И как можно в С++ Builder динамически создать TPanel?...

Вопрос № 111.792
Дано натуральное число N. Определить количество цифр в числе N.
Отправлен: 30.11.2007, 21:57
Вопрос задал: Геннадьев Александр Юрьевич (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: SiRuS
Здравствуйте, Геннадьев Александр Юрьевич!
Рабочий код в приложении. N - число. summ - кол-во цифр в числе.
Остаёться только ввод и вывод сделать ;)

Приложение:

Ответ отправил: SiRuS (статус: 4-ый класс)
Ответ отправлен: 30.11.2007, 22:31

Отвечает: Архипов Александр Леонидович
Здравствуйте, Геннадьев Александр Юрьевич!
Решение предыдущего эксперта просто и элегантно, но если необходимо подсчитать количество цифр в числе без учёта их повторения, то см. приложение.

Приложение:

Ответ отправил: Архипов Александр Леонидович (статус: Студент)
Ответ отправлен: 01.12.2007, 10:33

Отвечает: Djec
Здравствуйте, Геннадьев Александр Юрьевич!
Вот еще одна реализация задачи с вводом исходного числа:

Приложение:

---------
"Если ты что-то делаешь, делай это хорошо. если же ты не можешь или не хочешь делать хорошо, лчуше совсем не делай" © Л.Н.Толстой"

Ответ отправил: Djec (статус: 5-ый класс)
Ответ отправлен: 01.12.2007, 13:50


Вопрос № 111.796
Даны натуральное число N, действительные числа A1, …, AN. Заменить в последовательности A1, …, AN единицей числа, равные или превосходящие единицу, а нулем числа, меньшие единицы. Получить (1+R)/(1+S), где R – сумма всех членов последовательности, меньших единицы, S – сумма всех членов последовательности, равных или превосходящих единицу.
Отправлен: 30.11.2007, 22:23
Вопрос задал: Геннадьев Александр Юрьевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лясин Александр Владимирович
Здравствуйте, Геннадьев Александр Юрьевич!
см. приложение

Приложение:

Ответ отправил: Лясин Александр Владимирович (статус: 2-ой класс)
Ответ отправлен: 01.12.2007, 11:34


Вопрос № 111.798
Дана строка символов. Группы символов, разделенные пробелами (одним или несколькими) и не содержащие пробелы внутри себя, будем называть словами. Подсчитать количество букв а в последнем слове строки.
Отправлен: 30.11.2007, 22:31
Вопрос задал: Геннадьев Александр Юрьевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Boriss
Здравствуйте, Геннадьев Александр Юрьевич!
В следующий раз отмечайте, в чем пишите программу, С-то они разные
Я написал в Turbo C 2.0 (классическом, так сказать)
Код в приложении. Если что не понятно, спрашивайте.
--
ЗЫ: Я использовал string.h, но можно обойтись и без него

Приложение:

---------
Вывод - то место в тексте, где вы устали думать

Ответ отправил: Boriss (статус: Профессор)
Россия, Саранск
Организация: mte
WWW: Программирование на Паскале
----
Ответ отправлен: 04.12.2007, 13:30


Вопрос № 111.801
Дан файл координат точек на плоскости. Переписать в файл G все точки, попадающие в окружность радиуса R и с координатами центра X,Y.
Отправлен: 30.11.2007, 22:34
Вопрос задал: Геннадьев Александр Юрьевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Терсков Сергей
Здравствуйте, Геннадьев Александр Юрьевич!
Принцип простой, достаточно вспомнить уравнение окружности:

x^2 + y^2 = r^2

Поэтому точки попадающие внутрь окружности должны соответствовать условию вида:

(x1 - x)^2 + (y1 - y)^2 < r^2

Отсюда и вся программа. Подробнее в приложении...

Приложение:

Ответ отправил: Терсков Сергей (статус: Практикант)
Ответ отправлен: 04.12.2007, 02:27


Вопрос № 111.810
Здравствуйте.
Помогите найти ошибку в программе. Функция Compare() некорректно работает, а почему не пойму. Вывожу специально следующие переменные на экран:
cout << " " << c << " " << arr[i];
if(arr[i] == c)
count++;
на экран выводятся одинаковые числа, а переменная count всё равно не увеличивается. Может быть они всё же не равны? Тогда почему на экран выводятся одинаковые числа?
И как решить данную проблему?

Приложение:

Отправлен: 01.12.2007, 01:44
Вопрос задал: kaifolom (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Воробьёв Алексей Викторович
Здравствуйте, kaifolom!

С числами с плавающей запятой надо работать очень аккуратно.
Стандарт утверждает конкретно, что равенство двух чисел с плавающей запятой ГАРАНТИРУЕТСЯ только тогжа, когда эти числа получены по одному алгоритму.
Обратите внимание, что это не означает, что числа полученные разными алгоритмами не могут быть равны, но для этого нет никакой гарантии.
Тот факт, что при выводе числа показывают одинаковые значения всего лишь говоритЮ что числа равны после округления до какого-то знака, но это вовсе не означает, что числа действительно равны, что Вы и наблюдаете.
Поэтому, при работе с числами с плавающей запятой нужно проверять, что число отличаются не больше, чем на приемлемую ошибку.
Что-то типа:
if(fabs(a-b) < epsilon)
{
++count;
}
Ответ отправил: Воробьёв Алексей Викторович (статус: Практикант)
Ответ отправлен: 01.12.2007, 02:35
Оценка за ответ: 5
Комментарий оценки:
Спасибо, разобрался. Ошибка была где-то "посередине", т.е. алгоритм и особенности работы с числами с плавающей запятой приводили к зацикливанию программы.

Отвечает: Лясин Александр Владимирович
Здравствуйте, kaifolom!
В ф-ии Compare значение sz никогда не будет равно count, ф-я всегда будет возвращать 0.
А алгоритм можно легко проверить, задав в массиве константные значения типа 0.1f и проверить с такой же константой 0.1f к примеру. Тогда будет определённо видно - либо это погрешность, либо ошибка алгоритма
Ответ отправил: Лясин Александр Владимирович (статус: 2-ой класс)
Ответ отправлен: 01.12.2007, 15:29
Оценка за ответ: 3
Комментарий оценки:
Если бы я спрашивал алгоритм по обнаружению ошибок, за ваш ответ можно было бы смело ставить пятёрку. Но вопрос был более конкретизирован - отсюда и оценка.


Вопрос № 111.862
Уважаемые эксперты! Я буду очень благодарен если вы решите мне такую задачу:

В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) количество элементов массива, лежащих в диапазоне от А до В;
2) сумму элементов массива, расположенных после максимального элемента.

Приложение:

Отправлен: 01.12.2007, 15:34
Вопрос задал: Маховский Вадим Анатольевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Djec
Здравствуйте, Маховский Вадим Анатольевич!
В приложение решение:

Приложение:

---------
"Если ты что-то делаешь, делай это хорошо. если же ты не можешь или не хочешь делать хорошо, лчуше совсем не делай" © Л.Н.Толстой"

Ответ отправил: Djec (статус: 5-ый класс)
Ответ отправлен: 01.12.2007, 17:42
Оценка за ответ: 4
Комментарий оценки:
Большое спасибо! Конечно громоздко (для меня) и разбираться придёться долго, но что бы я без вас делал. Ещё раз спасибо.


Вопрос № 111.874
Здраствуйте !
У меня возникла проблемка с типами даных !

double Ys;
Ys=0.3+1.5*(-0.2); cout <<"....."<<Ys<<endl;
Должно вывести .....0 , но выводит .....-5.55112e-017
Ребята помогите !
А вобще у меня код:
Y[w1][w1]=X[w1][w1]+liamda*(X[w1][w1]-Xo[w1][w1]);
параметр X[w1][w1] - может быть как целым так и дробным,
но все наверно портит параметр liamda, который должен быть типа
double.
Отправлен: 01.12.2007, 16:38
Вопрос задал: Nikolas Franchsko Matrilotti (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Хватов Сергей
Здравствуйте, Nikolas Franchsko Matrilotti!

Непонятно для вас здесь только то, что плавающая арифметика представляется в компьютерах достаточно неадекватно.

Более того, компьютеры считают в двоичной системе, поэтому даже такое красивое число 0.1 точно быть представлено не может. Вот ошибки и нагорают. Хотя странно - порядок результата на i386 должен быть около -35. Похоже ещё компилятор нагадил: сосчитал константное выражение со слишком малой точностью (а он обязан сосчитать его заранее на этапе компиляции)

Увеличение точности помогает мало. Поэтому финансовая информация всегда считается в целых числах. Советую и вам до последней возможности пользоваться целыми, а данные для этого нужным образом масштабировать.
Ответ отправил: Хватов Сергей (статус: Студент)
Ответ отправлен: 01.12.2007, 17:23


Вопрос № 111.875
Здраствуйте !
У меня возникла проблемка с типами даных !

double Ys;
Ys=0.3+1.5*(-0.2); cout <<"....."<<Ys<<endl;
Должно вывести .....0 , но выводит .....-5.55112e-017
Ребята помогите !
А вобще у меня код:
Y[w1][w1]=X[w1][w1]+liamda*(X[w1][w1]-Xo[w1][w1]);
параметр X[w1][w1] - может быть как целым так и дробным,
но все наверно портит параметр liamda, который должен быть типа
double.
Отправлен: 01.12.2007, 16:39
Вопрос задал: Nikolas Franchsko Matrilotti (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Воробьёв Алексей Викторович
Здравствуйте, Nikolas Franchsko Matrilotti!

Это корректный ответ. Вы должны хорошо понимать, что согласно стандарту представления чисел с плавающей запятой, равенство двух таких чисел гарантируется ТОЛЬКО если эти числа получены одинаковым путём.
Это не означает, что равенства не будет в других случаях, но оно не гарантируется, что Вы и наблюдаете.
При работе с числами с плавающей запаятой надо проверять не на равенство, а на то, что разница лежит в пределах ошибки.
Что-то типа fabs(a-b)
Ответ отправил: Воробьёв Алексей Викторович (статус: Практикант)
Ответ отправлен: 01.12.2007, 18:12


Вопрос № 111.901
Проблемы с созданием UDF для Firebird1.0 на C++Builder6.
В общем нужна функция округления до заданного числа знаков.
В стандартной поставке Firebird есть похожая функция в fbudf.dll - round, но
ее регистрация в БД такая:

declare external function Round
int by descriptor, int by descriptor
returns parameter 2
entry_point 'round' module_name 'fbudf';

А мне нужен параметр double передавать..

В общем, решил сам написать UDF

Текст dll:
============================
#include <vcl.h>
#include <windows.h>
#include <Math.hpp>
//---------------------------------------------------------------------------
#pragma hdrstop
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
__declspec(dllexport) double roundTo(double aValue, int digit)
{
return RoundTo(aValue, digit);
}
//---------------------------------------------------------------------------
============================
Готовую fbudf.dll ложу в папку UDF сервера

Регистрирую ее в БД так:

declare external function F_ROUNDTO
double precision, integer
returns double precision by value
entry_point 'roundTo' module_name 'ar_fbUdf';

============================
Когда пытаюсь использовать,
select f_roundto(12.6, 2) from rdb$database

почему-то она не находится, выдает мне:
Invalid token.
invalid request BLR at offset 59.
function F_ROUNDTO is not defined.
module name or entrypoint could not be found.

Что самое интересное. У меня есть подобная функция в dll, написанная на Delphi -
тут все нормально проходит. А нужно именно на C++Builder.

В С++ сигнатура функции включает и параметы - думал из-за этого не находится функция
в dll-ке. Пытался регистрирова следующим образом
declare external function F_ROUNDTO
double precision, integer
returns double precision by value
entry_point 'roundTo(double,int)' module_name 'ar_fbUdf';

Все равно не помагает, выдается то же самое
..
function F_ROUNDTO is not defined.
module name or entrypoint could not be found.
..

Подскажите, в чем ошибка?
Отправлен: 01.12.2007, 19:59
Вопрос задал: Igor_ (статус: 4-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Ross
Здравствуйте, Igor_!

Попробуйте экспортировать функцию так:
extern "C"
__declspec(dllexport) double roundTo(double aValue, int digit)
{
return RoundTo(aValue, digit);
}

Это не позволит компилятору использовать искажение имен (name mangling)
---------
Доступно только то, что видимо (c) Б. Керниган
Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 02.12.2007, 14:18
Оценка за ответ: 5
Комментарий оценки:
Спасибо. Это как раз то, что нужно.


Вопрос № 111.910
Здравствуйте! Я только начал изучать С++ Builder 2006. Немогу обьявить переменные типов TFileStream, TButton, и тд...
И как можно в С++ Builder динамически создать TPanel?
Отправлен: 01.12.2007, 20:45
Вопрос задал: Зощенко Алексей (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Лясин Александр Владимирович
Здравствуйте, Зощенко Алексей!
С++ Builder использует в основно библиотеку визуальных компонентов (компонент) - vcl, которая не предусматривает статическое размещение в памяти объектов. Практически все компоненты этой библиотеки можно создавать только динамически. Вы можете объявлять только указатели на перечисленные вами типы и создавать объекты когда вам потребуется с помощью new:
TButton *btnOk=new TButton(Form1) // например так
то же самое можно сказать и про TPanel

int в AnsiString -
int number=0;
AnsiString snum=IntToStr(number);

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

ещё способ - почитайте про методы Drag & Drop. Это первое что на память пришло, конкретней не могу уточнить, работаю не в win
Ответ отправил: Лясин Александр Владимирович (статус: 2-ой класс)
Ответ отправлен: 02.12.2007, 08:29
Оценка за ответ: 4


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.65 от 04.12.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное