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

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


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

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

Чемпионы рейтинга экспертов в этой рассылке

_Ayl_
Статус: Студент
Рейтинг: 1436
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 1431
∙ повысить рейтинг »
Micren
Статус: Бакалавр
Рейтинг: 1272
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / C/C++

Номер выпуска:1453
Дата выхода:22.12.2009, 19:00
Администратор рассылки:Dr_Andrew, Старший модератор
Подписчиков / экспертов:679 / 181
Вопросов / ответов:7 / 10
IRC-канал по теме:#C

Вопрос № 175360: Здравствуйте, уважаемые эксперты. Как вычислить сумму цифр в ОЧЕНЬ большом числе. (такие числа, где сумма цифр больше, чем 127). Например, long double number = 958745123658999; // способ: sum+=number%10; number/10 и так пока nu...


Вопрос № 175366: Здравствуйте, уважаемые эксперты. Как так получается, что тип данных int может принимать значения больше, чем 65535? вот например в этом цикле: int i; for(i=1; ;i<1000000) … Спасибо....
Вопрос № 175371: Здравствуйте эксперты, подскажите пожалуйста, как отловить события выхода из программы (моей) в Microsoft Visual C++ чтобы сделать что-нить. Мне надо чтобы модальное окно появилось перед выходом. Выводить его умею, но не знаю как отловить выход из п...
Вопрос № 175374: Здравствуйте эксперты, подскажите пожалуйста, надо чтобы когда в CEdit вводят значения они отображались звездочками, а самому как-то знать что там вводят. Пишу в Visual C++...
Вопрос № 175377: Здравствуйте эксперты, подскажите пожалуйста, надо чтобы когда в CEdit вводят значения, надо контролировать то что вводят, и корректировать то что вводят, то есть подменять вводимое значение. Пишу в Visual C++...
Вопрос № 175379: Уважаемы эксперты! Помогите, пожалуйста Создать абстрактный класс CVerhicle. На его основе реализовать классы CPlane, CCar и CShip. Классы должны иметь возможност...
Вопрос № 175381: Вычислить сумму бесконечного ряда: S=1+2/2!+3/3!+4/4!........ 1. Для указанного количества членов ряда 2. С заданной точностью (точность и количество членов ряда вводятся клавиатуры) ...

Вопрос № 175360:

Здравствуйте, уважаемые эксперты.

Как вычислить сумму цифр в ОЧЕНЬ большом числе. (такие числа, где сумма цифр больше, чем 127).
Например,
long double number = 958745123658999; // способ: sum+=number%10; number/10 и так пока number>0.
Но ведь я не могу пользоваться оператором % для long double . Как же тогда?

Спасибо.

Отправлен: 16.12.2009, 19:01
Вопрос задал: Иванов Андрей Владимирович, 5-й класс
Всего ответов: 3
Страница вопроса »


Отвечает Evgenijm, 10-й класс :
Здравствуйте, Иванов Андрей Владимирович.

Функция взятия остатка выглядит так: a % b = a - int(a / b) * b

Т.е. числа делим, дробный остаток выкидываем, умножаем обратно. Получается, что и искомый остаток выброшен. Отнимаем результат от первоначального числа - получаем остаток.

Если важна скорость, лучше вырезать из числа большие десятичные блоки-"цифры" (100, 1000, миллиард), приводить их в int или char и обрабатывать оператором %. Деление длинных и особенно дробных чисел выполняется заметно медленнее.

Ответ отправил: Evgenijm, 10-й класс
Ответ отправлен: 16.12.2009, 20:53

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257817 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Ashotn, 8-й класс :
    Здравствуйте, Иванов Андрей Владимирович.

    Надо превратить число в строку с помощью 64-битного варианта itoa. Посчитать сумму цифр становится элементарно, Ватсон.

    Приложение:

    -----
    Я ни от чего, ни от кого не завишу.

    Ответ отправил: Ashotn, 8-й класс
    Ответ отправлен: 17.12.2009, 20:12

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257866 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Micren, Бакалавр :
    Здравствуйте, Иванов Андрей Владимирович.
    Отвечаю на Ваш конкретный вопрос из мини форума:

    © Цитата: Иванов Андрей Владимирович
    Конкретно задача:
    найти минимальное натуральное число с суммой цифр 123, которое делится на 1237.

    Программа. С++. MS VS 2008.
    Код:
    #include <iostream>
    #include <iomanip>
    #include <vector>
    #include <sstream>
    #include <algorithm>
    #include <functional>
    #include <locale>
    #include <st dexcept>
    #include <Windows.h>

    using namespace std;

    const unsigned int SUM=123; // Сумма чисел
    const unsigned int DIV=1237; // Делитель
    const unsigned int COUNT=20; // Желаемое их количество

    class Application
    {
    public:
    // Конструктор
    Application(unsigned int sum, unsigned int div);
    // Решает задачу
    void Run(unsigned int count=1);
    private:
    typedef unsigned char item_type;
    typedef vector<item_type> digits_type;
    typedef digits_type::const_iterator citer_type;
    typedef digits_type::const_reverse_iterator criter_type;
    typedef digits_type::reverse_iterator riter_type;
    digits_type digits;
    unsigned int sum;
    unsigned int div;
    // Перестановка
    bool nextPermutation(void);
    // Берет остаток
    unsigned int getModulo(void) const;
    template<class Ty>
    class converter
    {
    public:
    converter(void);
    Ty operator()(Ty ch) const;
    private:
    Ty corr ection;
    };
    static class performanceCountersHelper
    {
    public:
    performanceCountersHelper(void);
    LARGE_INTEGER getCounter(void) const;
    double calcTime(LARGE_INTEGER start, LARGE_INTEGER stop) const;
    private:
    LARGE_INTEGER freq;
    public:
    double calcTime(LARGE_INTEGER start) const;
    };
    };

    int main()
    {
    try
    {
    locale::global(locale(""));
    Application app(SUM,DIV);
    app.Run(COUNT);
    }
    catch(exception& ex)
    {
    cout<<ex.what()<<endl;
    }
    system("PAUSE");
    return 0;
    }

    // Конструктор
    Application::Application(unsigned int sum, unsigned int div)
    : sum(sum)
    , div(div)
    {
    if(div&sum)
    {
    while(sum)
    {
    item_type digit=sum>9?9:sum;
    digits.insert(digits.begin(),digit);
    sum-=digit;
    }
    }
    else
    {
    throw invalid_argument("Параметры не могут иметь значение 0");
    }
    }

    // Решает задачу
    void Application::Run(unsigned int count)
    {
    performanceCountersHelper perfCounters;
    LARGE_INTEGER start=perfCounters.getCounter();
    while(true)
    {
    do
    {
    if(!getModulo())
    {
    transform(digits.begin(),digits.end(),ostream_iterator<item_type>(cout),converter<unsigned char>());
    cout<<" ("<<fixed<<showpoint<<setprecision(3)<<perfCounters.calcTime(start)<<" сек.)"<<endl;
    if(!--count)
    {
    cout<<"Общее время выполнения: "<<fixed<<showpoint<<setprecision(3)<<perfCounters.calcTime(start)<<" сек."<<endl;
    return;
    }
    }
    }
    while(nextPermutation());
    digits.insert(digits.begin(),0);
    nextPermutation();
    }
    }

    // Перестановка
    bool Application::nextPermutation(void)
    {
    criter_type endIt=digits.rend();
    riter_t ype decIt=digits.rbegin();
    while(decIt!=endIt)
    {
    if(*decIt>0)
    {
    break;
    }
    ++decIt;
    }
    if(decIt= =endIt)
    {
    return false;
    }
    riter_type incIt=decIt;
    while(++incIt!=endIt)
    {
    if(*incIt<9)
    {
    break;
    }
    }
    if(incIt==endIt)
    {
    return false;
    }
    ++*incIt;
    --*decIt;
    if((incIt-decIt)>1)
    {
    sort(digits.rbegin(),incIt,greater<item_type>());
    }
    return true;
    }

    // Берет остаток
    unsigned int Application::getModulo(void) const
    {
    unsigned long result=0;
    for(citer_type it=digits.begin(),end=digits.end();it!=end;++it)
    {
    result=(result*10+*it)%div;
    }
    return result%div;
    }

    template<typename Ty>
    Application::converter<Ty>::converter(void)
    {
    const ctype<Ty>& facet=use_facet<ctype<Ty> >(locale(""));
    correction=facet.widen('0');
    }

    template<typename Ty>
    inline Ty Application::converter<Ty>::operator()(Ty ch) const
    {
    return ch+correction;
    }

    Applicat ion::performanceCountersHelper::performanceCountersHelper(void)
    {
    if(!QueryPerformanceFrequency(&freq))
    {
    freq.QuadPart=0;
    };
    }

    LARGE_INTEGER Application::performanceCountersHelper::getCounter(void) const
    {
    LARGE_INTEGER result;
    if(!QueryPerformanceCounter(&result))
    {
    result.QuadPart=0;
    }
    return result;
    }

    double Application::performanceCountersHelper::calcTime(LARGE_INTEGER start, LARGE_INTEGER stop) const
    {
    double result=0.0;
    if(freq.QuadPart)
    {
    result=static_cast<double>(stop.QuadPart-start.QuadPart)/freq.QuadPart;
    }
    return result;
    }

    double Application::performanceCountersHelper::calcTime(LARGE_INTEGER start) const
    {
    LARGE_INTEGER counter;
    QueryPerformanceCounter(&counter);
    return calcTime(start,counter);
    }

    Вывод программы:
    Код:
    199789999899999 (0.002 сек.)
    199897989999999 (0.004 сек.)
    199997999998998 (0.007 сек.)
    289989899889999 (0.010 сек.)
    298999999999779 (0.013 сек.)
    299799998898999 (0.016 сек.)
    299986999899999 (0.019 сек.)
    299989898999997 (0.021 сек.)
    369898899999999 (0.024 сек.)
    369999989899998 (0.026 сек.)
    379899899899899 (0.028 сек.)
    388989999999798 (0.032 сек.)
    389997999999987 (0.035 сек.)
    389999898888999 (0.037 сек.)
    397979999889999 (0.040 сек.)
    398599999999899 (0.043 сек.)
    398889899979999 (0.046 сек.)
    398989988989899 (0.049 сек.)
    399799989998979 (0.051 сек.)
    399888997999989 (0.054 сек.)
    Общее время выполнения: 0.057 сек.

    Ответ отправил: Micren, Бакалавр
    Ответ отправлен: 20.12.2009, 02:21

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257946 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 175366:

    Здравствуйте, уважаемые эксперты.

    Как так получается, что тип данных int может принимать значения больше, чем 65535?
    вот например в этом цикле:
    int i; for(i=1; ;i<1000000) …

    Спасибо.

    Отправлен: 16.12.2009, 20:46
    Вопрос задал: Иванов Андрей Владимирович, 5-й класс
    Всего ответов: 1
    Страница вопроса »


    Отвечает Verena, Профессионал :
    Здравствуйте, Иванов Андрей Владимирович.
    Вообще, размер типа int может зависеть от используемого компилятора. Но обычно в С++ используется int32, он имеет диапазон от –2,147,483,648 до 2,147,483,647, например, так в Visual Studio.
    Можете посмотреть в MSDN. В других средах возможно использование по умолчанию int16.
    .

    -----
    Эта история - не для истории, понимаешь?

    Ответ отправил: Verena, Профессионал
    Ответ отправлен: 16.12.2009, 21:05

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257818 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 175371:

    Здравствуйте эксперты, подскажите пожалуйста, как отловить события выхода из программы (моей) в Microsoft Visual C++ чтобы сделать что-нить. Мне надо чтобы модальное окно появилось перед выходом. Выводить его умею, но не знаю как отловить выход из программы

    Отправлен: 17.12.2009, 05:01
    Вопрос задал: Tribak, Студент
    Всего ответов: 1
    Страница вопроса »


    Отвечает Сандров Алекс, Студент :
    Здравствуйте, Tribak.

    Если приложение оконное. Если главное окно является диалогом, то надо ловить WM_COMMAND, где wParam = IDCANCEL(а так же IDOK, и проверить реакцию окна на Enter и Esc), там высвечивать что-нибудь такое:
    if(IDYES == MessageBox(..., "Confirm", "Exit?", MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL)
    EndDialog(wParam);

    А если главное окно не диалог, то WM_CLOSE отлавливать и в нём делать тоже самое.

    Если это MFC, то тогда надо отлавливать у окна событие OnClose (в визарде его найти можно)

    Ответ отправил: Сандров Алекс, Студент
    Ответ отправлен: 17.12.2009, 06:05

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257832 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 175374:

    Здравствуйте эксперты, подскажите пожалуйста, надо чтобы когда в CEdit вводят значения они отображались звездочками, а самому как-то знать что там вводят. Пишу в Visual C++

    Отправлен: 17.12.2009, 06:46
    Вопрос задал: Tribak, Студент
    Всего ответов: 1
    Страница вопроса »


    Отвечает Сандров Алекс, Студент :
    Здравствуйте, Tribak.

    Для этого надо задать стиль CEdit-у: ES_PASSWORD

    SetWindowLong(m_Edit.m_hWnd, GWL_STYLE, m_Edit.GetStyle()|ES_PASSWORD);

    И тогда оно само будет рисовать звёздочки.

    Ответ отправил: Сандров Алекс, Студент
    Ответ отправлен: 17.12.2009, 06:07

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257833 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 175377:

    Здравствуйте эксперты, подскажите пожалуйста, надо чтобы когда в CEdit вводят значения, надо контролировать то что вводят, и корректировать то что вводят, то есть подменять вводимое значение. Пишу в Visual C++

    Отправлен: 17.12.2009, 07:31
    Вопрос задал: Tribak, Студент
    Всего ответов: 1
    Страница вопроса »


    Отвечает Сандров Алекс, Студент :
    Здравствуйте, Tribak.

    Контроль ввода данных в окна класса EDIT можно делать через оконное сообщение WM_COMMAND окна-родителя.
    Когда какие-то события происходят в EDIT-окне, оно посылает нотификации родителю, про них можно почитать в msdn, их идентификаторы начинаются на EN_

    Нам в данном случае нужно событие EN_UPDATE.
    Заводим основному окну через визард обработчик OnCommand(WPARAM wParam, LPARAM lParam)

    Кода мы что-то меняем в EDIT, прилетает сообщение в OnCommand с такими параметрами:
    wParam состоит из идентификатора нашего EDIT-а и события (EN_UPDATE)
    lParam содержит хэндл EDIT-а

    то есть
    Код:
    BOOL CMainWnd::OnCommand(WPARAM wParam, LPARAM lParam) 
    {
    int wmId, wmEvent;
    wmId = LOWORD(wParam);
    w mEvent = HIWORD(wParam);
    // ----
    switch(LOWORD(wmId))
    {
    case IDC_EDIT:
    if(EN_UPDATE == wmEvent)
    {
    // тут читаем из нашего EDIT-а правим текст и, если нужно, пишем его обратно.
    }
    break;
    //...
    }


    Тут важный момент: когда мы здесь что-то поправили и вписали в EDIT (через SetWindowText, например) событие EN_UPDATE опять сгенерится - значение же поменялось. Поэтому важно перед тем, как менять текст в EDIT-е, ОБЯЗАТЕЛЬНО проверить, а надо ли это делать. Иначе программа уйдёт в вечный цикл, даже если писать в EDIT тоже самое, что там и было.

    Ответ отправил: Сандров Алекс, Студент
    Ответ отправлен: 17.12.2009, 06:22

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257834 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 175379:

    Уважаемы эксперты! Помогите, пожалуйста
    Создать абстрактный класс CVerhicle. На его основе реализовать классы CPlane, CCar и CShip. Классы должны иметь возможность задавать и получать координаты, параметры средств передвижения (цена, скорость, год выпуска). Для самолета должна быть определена высота, для самолета и корабля - количество пассажиров. Для корабля - порт приписки. Написать программу, создающую список объектов этих классов в динамической памяти. Программа должна содержать меню.

    Программу нужно написать на С++ for Dos, т. е. без графических оболочек. Просто я не умею писать абстрактные классы, да ещё и динамические переменные тут же((. Надеюсь разобраться сам во всем после того, как увижу код. Заранее буду очень признателе н и благодарен!

    Отправлен: 17.12.2009, 12:29
    Вопрос задал: S K A L T , Посетитель
    Всего ответов: 1
    Страница вопроса »


    Отвечает Ashotn, 8-й класс :
    Здравствуйте, S K A L T .

    Сначала немного теории. Классы имеют члены-переменные и члены методы. Если какой-либо метод класса описан, а не определен, такой класс называется абстрактным. CVehicle (средство передвижения) должен быть абстрактным, так как есть разные средства передвижения, и передвигаются они по-разному. Оставить метод неопределенным - значит определить его =0. Программа создает список объектов и вызывает метод move для всех элементов. При этом реализация этого метода разная в разных классах. Если хотите, можете вызывать методы get/set, а в методе выводить значения параметров.

    Приложение:

    -----
    Я ни от чего, ни от кого не завишу.

    Ответ отправил: Ashotn, 8-й класс
    Ответ отправлен: 20.12.2009, 12:54

    Оценка ответа: 5
    Комментарий к оценке:
    ПРошу ответить мне в личку. Хотелось бы всё таки разобратся с проблемой((

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257958 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 175381:

    Вычислить сумму бесконечного ряда: S=1+2/2!+3/3!+4/4!........
    1. Для указанного количества членов ряда
    2. С заданной точностью
    (точность и количество членов ряда вводятся клавиатуры)

    Отправлен: 17.12.2009, 14:31
    Вопрос задал: Никонова Анастасия Сергеевна, Посетитель
    Всего ответов: 2
    Страница вопроса »


    Отвечает Dr_Andrew, Старший модератор :
    Здравствуйте, Никонова Анастасия Сергеевна!
    Ответ сформирован на основе сообщений из мини-форума вопроса.

    Ashotn:

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

    _Ayl_

    Общий член ряда - n/n! = 1/(n-1)!
    Если вычислен n-й член ряда, то следующий определяется так: an+1 = an/n

    То есть цикл должен выглядеть так:
    S = 1;
    for (i = 1; i < N; i++) {
    a /= i;
    S += a;
    }

    В цикле именно меньше, т.к. первый элемент был учтен на присваивании S=1.

    lamed:

    В Вашем коде есть ряд ошибок: как определе ния типов, так и алгоритмические. Прежде всего, операция деления 1/a, где a- целое число, дает 0, за исключением a=1. Конечно, у Вас ряд вещественных членов. Не меняя Ваш подход, я внес исправления. Они окружены строчками комментариев.

    Код lamed в приложении.

    Приложение:

    Ответ отправил: Dr_Andrew, Старший модератор
    Ответ отправлен: 21.12.2009, 06:38
    Казахстан, Алма-Ата
    Организация: Казахский научный центр карантинных и зоонозных инфекций
    Адрес сайта: Медицинские программы для Linux
    ICQ # 256452186

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257988 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Ashotn, 8-й класс :
    Здравствуйте, Никонова Анастасия Сергеевна.

    При каждой итерации нужно значение n!. Но с предыдущей итерации известно значение (n-1)!. Используем рекурсивную формулу. Внутренний цикл производит вычисления, которых можно было избежать.

    Приложение:

    -----
    Я ни от чего, ни от кого не завишу.

    Ответ отправил: Ashotn, 8-й класс
    Ответ отправлен: 21.12.2009, 11:52

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257993 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

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

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.12 от 30.11.2009

    В избранное