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

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


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

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

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

Лысков Игорь Витальевич
Статус: Младший модератор
Рейтинг: 273
∙ повысить рейтинг >>
Micren
Статус: Практикант
Рейтинг: 271
∙ повысить рейтинг >>
_Ayl_
Статус: 4-й класс
Рейтинг: 182
∙ повысить рейтинг >>

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

Выпуск № 1323 от 05.06.2009, 00:35
Администратор рассылки: Dr_Andrew, Младший модератор
В рассылке: подписчиков - 626, экспертов - 142
В номере: вопросов - 3, ответов - 5

Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
оценить выпуск >>

Вопрос № 168549: Помогите пожалуйста написать программу! Задание: Два выпуклых многоугольника заданы на плоскости перечислением координат вершин в порядке обхода границы. Определить площади многоугольников и проверить лежит ли один из них строго внутри другого....


Вопрос № 168568: Здраствуйте, подскажите как обединить char* и int в одну строку, т.е. к примеру есть:
Код:
Вопрос № 168578: Расположите числа на простые множетели. Составить программу, которая выдает разложение данного целого числа N на просты множетели например: 128=2*2*2*2*2*2*2 17- простое число ...


Вопрос № 168549:

Помогите пожалуйста написать программу!
Задание: Два выпуклых многоугольника заданы на плоскости перечислением координат вершин в порядке обхода границы. Определить площади многоугольников и проверить лежит ли один из них строго внутри другого.

Отправлен: 30.05.2009, 10:23
Вопрос задал: Azarov88, Посетитель
Всего ответов: 1
Страница вопроса >>


Отвечает Micren, Практикант :
Здравствуйте, Azarov88.
Программа:
Код:

#include <locale>
#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

// Класс-точка
class point
{
public:
point(double x=0,double y=0);
double x() const;
double y() const;
private:
double _x,_y;
};

// Класс-многоугольник
class polygon
{
public:
// Конструктор
polygon(const point& start,const point& end);
polygon(std::vector<point> points);
// Площадь
double square() const;
// Если многоугольник-аргумент находится внутри
bool contain(const polygon& p) const;
private:
// Класс-сторона используется внутри класса. Можно и без него обойтись
class si de
{
public:
side(point p1,point p2);
const point& p1() const;
const point& p2() const;
private:
point _p1,_p2;
};
// Площадь треугольника
double square(point p1,point p2,point p3) const;
// Возвращает положительное значение, если p лежит слева от вектора side и отрицательное если наоборот
double pointposition(side v,point p) const;
typedef std::vector<point> points;
typedef points::const_iterator cit;
points _points;
};

int main()
{
locale::global(locale("russian_russia.866"));
// Массивы точек для каждого многоугольника
point firstPoints[4]={point(0,0),point(10,0),point(10,10),point(0,10)};
point secondPoints[3]={point(0,0),point(5,0),point(5,5)};
// Многоугольники
polygon first(firstPoints[0],firstPoints[sizeof(firstPoints)/sizeof(point)]);
polygon second(secondPoints[0],secondPoints[sizeof(secondPoints)/sizeof(point)]);

wcout<<L"fir st.square():"<<first.square()<<endl;
wcout<<L"second.square():"<<second.square()<<endl;
wcout<<L"first.contain(second):"<<boolalpha<<first.contain(second)<<endl;
wcout<<L"second.contain(first):"<<boolalpha<<second.contain(first)<<endl;
system("PAUSE");
return 0;
}

point::point( double x/*=0*/,double y/*=0*/ )
:_x(x)
,_y(y)
{
}

inline double point::x() const
{
return _x;
}

inline double point::y() const
{
return _y;
}

polygon::polygon( const point& start,const point& end )
{
_points=points(&start,&end);
}

polygon::polygon( std::vector<point> points ) :_points(points)
{

}
// Площадь многоугольника вычисляется как сумма площадей треугольников в него входящих
double polygon::square() const
{
if(_points.size()>2)
{
cit first=_points.begin();
cit second=first+1;
cit third=second+1;
double res=0;
do
{
res+=square(*first,*second,*third);
++second;++third;
} while (third!=_points.end());
return res;
}
else
{
throw L"Это не многоугольник";
}
}

double polygon::square( point p1,point p2,point p3 ) const
{
return abs((p2.x()-p1.x())*(p3.y()-p1.y())-(p3.x()-p1.x())*(p2.y()-p1.y()))/2.0;
}

bool polygon::contain( const polygon& p ) const
{
if(_points.size()>2 && p._points.size()>2)
{
cit first=_points.begin();
cit second=first+1;
double sign=0;
do
{
for(cit it=p._points.begin();it!=p._points.end();++it)
{
double pos=pointposition(side(*first,*second),*it);
if(!sign)
{
sign=pos;
}
else
{
if(sign*pos<0)
{
return false;
}
}
}
++second;
if(second==_points.end())
{
second=_points.begin();
}
} while (++first!=_points.end());
return true;
}
else
{
throw L"Требуется два многоугольника";
}
}

double polygon::pointposition( side v,point p ) const
{
return (v.p2().x()-v.p1().x())*(p.y()-v.p1().y()) - (p.x()-v.p1().x())*(v.p2().y()-v.p1().y());
}

polygon::side::side( point p1,point p2 )
:_p1(p1)
,_p2(p2)
{
}

inline const point& polygon::side::p1() const
{
return _p1;
}

inline const point& polygon::side::p2() const
{
return _p2;
}

Пример работы:
Код:

first.square():100
second.square():12.5
first.contain(second):true
second.contain(fir st):false
По просьбе автора
-----
∙ Отредактировал: Victor Pyrlik, Модератор
∙ Дата редактирования: 30.05.2009, 16:25 (время московское)

Ответ отправил: Micren, Практикант
Ответ отправлен: 30.05.2009, 13:16

Оценка ответа: 5

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



    Вопрос № 168568:

    Здраствуйте, подскажите как обединить char* и int в одну строку, т.е. к примеру есть:

    Код:

    char* rez1 = "Rezultat: ";
    int rez = 8

    как получит такую строку: char* "Rezultat: 8"? т.е. просто обединить. Желательно кусок кода :)
    Заранее спасибо.

    Отправлен: 30.05.2009, 17:25
    Вопрос задал: Станислав, 1-й класс
    Всего ответов: 3
    Страница вопроса >>


    Отвечает AMV007, 2-й класс :
    Здравствуйте, Станислав.
    ну например :
    char test[255];
    memset(test,0,sizeof(test));
    char* rez1 = "Rezultat: ";
    int rez = 8;
    sprintf(test,"%s %d", rez1, rez);
    в test будет то, что вы хотите
    -----
    Работать, работать и еще раз работать (да не, шутка :) )

    Ответ отправил: AMV007, 2-й класс
    Ответ отправлен: 30.05.2009, 20:26

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


    Отвечает Navnav, 3-й класс :
    Здравствуйте, Станислав.

    #include <iostream.h>

    void main()
    {
    char* rez1 = "Rezultat: ";
    int rez = 8;
    cout << rez1 << rez << endl;
    }

    Оператор cout является стандартным потоком вывода.
    Поток – свойство, отражающее перемещение данных от источника к приемнику.
    Стандартный поток вывода направлен на экран, а поток ввода направлен с клавиатуры.
    Операция << -- это операция вставки в поток.
    Она копирует содержимое переменной, стоящей справа от нее в поток, стоящий слева.

    Ответ отправил: Navnav, 3-й класс
    Ответ отправлен: 30.05.2009, 21:48

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


    Отвечает Micren, Практикант :
    Здравствуйте, Станислав.
    Суть в том, что без дополнительных ухищрений, таких как дополнительное выделение памяти для результата или использования промежуточного буфера Вы не можете этого сделать. Это потому, что данная строка представляет собой фиксированное место в памяти с заранее(на этапе компиляции) определенным размером. Поэтому, чтоб собрать новую строку необходимо выделить место в памяти, учитывая размер числа, и скопировать туда данные.

    Я могу предложить Вам несколько методов решения Вашей задачи.
    1. Выделить место для результата с запасом на число.
    Код:

    #include <limits>
    #include <iostream>
    #include <cstring>

    using namespace std;

    #define RESULT_STR "Result : "

    int main(){
    char str[sizeof(RESULT_STR)+numeric_limits<int>::digits10+1]=RESULT_STR;
    int res=8;
    itoa(res,str+sizeof(RESULT_STR)-1,10);
    cout<<str<<endl;
    system("PAUSE");
    return 0;
    }


    2.Использовать возможности STL C++. Например тип данных class string вместо char*. Этот класс обладает несравненными преимуществами по сравнению с char*

    Код:

    #include <iostream>
    #include <string>
    #include <sstream>

    using namespace std;

    int main()
    {
    string str="Result : ";
    int res=8;
    ostringstream stream;
    stream<<str<<res;
    str=stream.str();
    cout<<str<<endl;
    system("PAUSE");
    return 0;
    }

    Не правда ли, так лучше. Кроме того строковые классы легко поддерживают различные виды операций.
    Так, например, выглядит конкатенация:
    Код:

    #include <iostream>
    #include <string>

    using namespace std;

    int main()
    {
    string str="Result : ";
    string res="8";
    cout<<str+res<<endl;
    system("PAUSE");
    return 0;
    }

    Все приведенные примеры выдают один и тот же результат:
    Код:

    Result : 8

    Ответ отправил: Micren, Практикант
    Ответ отправлен: 30.05.2009, 23:22

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



    Вопрос № 168578:

    Расположите числа на простые множетели. Составить программу, которая выдает разложение данного целого числа N на просты множетели
    например: 128=2*2*2*2*2*2*2
    17- простое число

    Отправлен: 30.05.2009, 21:36
    Вопрос задал: nnt.org
    Всего ответов: 1
    Страница вопроса >>


    Отвечает Micren, Практикант :
    Здравствуйте, nnt.org.
    Программа C++. Проверял MS VS 2008
    Код:

    #include <locale>
    #include <limits>
    #include <iostream>
    #include <cmath>
    #include <sstream>
    #include <map>

    using namespace std;

    // Этот класс будет использоваться для представления результата вычислений
    class simplemultipliers
    {
    private:
    // Тип ассоциированный массив будет использоваться для хранения множителей и подсчета их количества
    // Ключ - множитель
    // Значение - сколько раз встречается
    typedef map<unsigned int,unsigned int> countersType;
    public:
    // Константные итераторы для доступа к данным
    typedef countersType::const_iterator const_iterator;
    typedef countersType::con st_reverse_iterator const_reverse_iterator;
    // Возвращает общее количество множителей
    unsigned int multipliersCount() const;
    // Возвращает количество различных множителей
    unsigned int countersCount() const;
    // Возвращает число для которого ищем множители
    unsigned int number() const;
    // Возвращают итераторы. Применение аналогично итераторам из STL
    const_iterator begin() const;
    const_iterator end() const;
    const_reverse_iterator rbegin() const;
    const_reverse_iterator rend() const;
    private:
    // Конструктор
    explicit simplemultipliers(unsigned int number);
    // Индексатор для доступа к значениям по ключу. Используется внутри decomposed()
    unsigned int& operator[](unsigned int key);
    unsigned int _number;
    countersType _counters;
    friend simplemultipliers decomposed(unsigned int number);
    };

    // Шаблонный оператор вывода в поток
    template<class _Elem,class _Traits>
    basic_ostream<_Elem,_Traits >& operator<<(basic_ostream<_Elem,_Traits>&,const simplemultipliers&);

    // Собственно разлагает число на множители
    simplemultipliers decomposed(unsigned int number);

    int main()
    {
    setlocale(LC_ALL,"russian");
    // Вводим число
    unsigned int N;
    ios_base::fmtflags flags=cin.flags();
    cin.unsetf(ios_base::skipws);
    while(true)
    {
    cout<<"Введите целое положительное число:";
    cin>>N;
    if(cin.fail())
    {
    cout<<"Ошибочный ввод"<<endl;
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(),'\n');
    }
    else
    {
    cin.ignore(numeric_limits<streamsize>::max(),'\n');
    break;
    }
    }
    cin.flags(flags);
    // Разложим на множители
    simplemultipliers res=decomposed(N);
    // Выведем результат
    cout<<res<<endl;
    system("PAUSE");
    return 0;
    }

    unsign ed int simplemultipliers::multipliersCount() const
    {
    unsigned int res=0;
    for(const_iterator it=_counters.begin();it!=_counters.end();++it)
    {
    res+=it->second;
    }
    return res;
    }

    unsigned int simplemultipliers::countersCount() const
    {
    return _counters.size();
    }

    unsigned int simplemultipliers::number() const
    {
    return _number;
    }

    simplemultipliers::const_iterator simplemultipliers::begin() const
    {
    return _counters.begin();
    }

    simplemultipliers::const_iterator simplemultipliers::end() const
    {
    return _counters.end();
    }

    simplemultipliers::const_reverse_iterator simplemultipliers::rbegin() const
    {
    return _counters.rbegin();
    }

    simplemultipliers::const_reverse_iterator simplemultipliers::rend() const
    {
    return _counters.rend();
    }

    simplemultipliers::simplemultipliers( unsigned int number ) :_number(number)
    {

    }

    unsigned int& simplemult ipliers::operator[]( unsigned int key )
    {
    if(_counters.find(key)==_counters.end())
    {
    _counters[key]=0;
    }
    return _counters[key];
    }

    template<class _Elem,class _Traits>
    basic_ostream<_Elem,_Traits>& operator<<(basic_ostream<_Elem,_Traits>& stream,const simplemultipliers& r)
    {
    const ctype<_Elem>& fac=use_facet<ctype<_Elem> >(stream.getloc());
    basic_stringstream<_Elem,_Traits> outstream;
    outstream.flags(stream.flags());
    outstream.imbue(stream.getloc());
    outstream.precision(stream.precision());
    outstream<<r.number()<<fac.widen('=');
    for(simplemultipliers::const_iterator it=r.begin();it!=r.end();++it)
    {
    outstream<<it->first;
    if(it->second>1)
    {
    outstream<<fac.widen('^')<<it->second;
    }
    outstream<<fac.widen('*');
    }
    basic_string<_Elem,_Traits> res=outst ream.str();
    return stream<<res.substr(0,res.length()-1);
    }

    simplemultipliers decomposed(unsigned int number)
    {
    // Здесь будем хранить результат
    simplemultipliers result(number);
    // Максимальное значение до которого имеет смысл перебирать множители
    unsigned int maxNumber=static_cast<unsigned int>(sqrt(static_cast<double>(number)));
    // Начинаем с 2
    unsigned int multiplier=2;
    // Пока множитель не больше максимального значения до которого есть смысл перебирать
    while(multiplier<=maxNumber)
    {
    // Флаг показывающий, что множитель добавлен
    bool ifAdded=false;
    // Пока делится на множитель
    while(!(number%multiplier))
    {
    // Увеличим счетчик
    ++result[multiplier];
    // Разделим число
    number/=multiplier;
    // И установим флаг
    ifAdded=true;
    }
    // А если изменилось number то есть смысл пересчитать maxNumber
    if(ifAdded)
    {
    maxNumber=static_c ast<unsigned int>(sqrt(static_cast<double>(number)));
    }
    // А этот оператор увеличит множитель на 2 если множитель нечетный и на 1 если множитель четный,
    // а четный он может быть только 2
    multiplier+=(multiplier&1)+1;
    }
    // Если есть остаток добавим и его
    if(number!=1 || !result._counters.size())
    {
    ++result[number];
    }
    return result;
    }

    Пример работы:
    Код:

    Введите целое положительное число:128
    128=2^7

    Введите целое положительное число:17
    17=17

    Введите целое положительное число:65535
    65535=3*5*17*257

    Ответ отправил: Micren, Практикант
    Ответ отправлен: 31.05.2009, 02:03

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



    Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
    оценить выпуск >>

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

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

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

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

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

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


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

    В избранное