<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Статьи о программировании, все о программировании, исходники программ</title>
	<atom:link href="http://statprog.ru/feed" rel="self" type="application/rss+xml" />
	<link>http://statprog.ru</link>
	<description>Авторские статьи, исходники программ.</description>
	<lastBuildDate>Sun, 19 Feb 2012 19:41:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Определить попадание точки в прямоугольник или эллипс на C#</title>
		<link>http://statprog.ru/2010/05/29/opredelit-popadanie-tochki-v-pryamougolnik-ili-ellips-na-c</link>
		<comments>http://statprog.ru/2010/05/29/opredelit-popadanie-tochki-v-pryamougolnik-ili-ellips-na-c#comments</comments>
		<pubDate>Sat, 29 May 2010 18:44:56 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C / C++ / C#]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Определить попадание точки]]></category>
		<category><![CDATA[попадание точки]]></category>
		<category><![CDATA[прямоугольник]]></category>
		<category><![CDATA[эллипс]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=453</guid>
		<description><![CDATA[Работая в Visual Studio в C# можно легко определить попадание точки с координатами (X, Y) в область прямоугольника или эллипса. Определяется это даже без применения каких либо геометрических формул, все очень просто &#8212; с помощью стандартных средств Visual Studio. Давайте посмотрим как же будем это определять. Все, мы выполнили создание прямоугольника, эллипса и точки. Теперь [...]]]></description>
			<content:encoded><![CDATA[<p>Работая в Visual Studio в C# можно легко определить <strong>попадание точки</strong> с координатами (X, Y) в область прямоугольника или эллипса. Определяется это даже без применения каких либо геометрических формул, все очень просто &#8212; с помощью стандартных средств <strong>Visual Studio</strong>.<span id="more-453"></span></p>
<p>Давайте посмотрим как же будем это определять.</p>
<pre class="brush: csharp; title: ; notranslate">//Сначала определим переменные с шириной и высотой прямоугольника и эллипса.
int RectangleWidth = 400;
int RectangleHeight = 200;
int EllipseWidth = 500;
int EllipseHeight = 450;

//Далее зададим им координаты размещения на форме.
int coordR_X = 200;
int coordR_Y = 200;
int coordE_X = 100;
int coordE_Y = 400;

//&lt;strong&gt;Создадим прямоугольник&lt;/strong&gt;.
Rectangle RectangleDraw = new Rectangle(coordR_X, coordR_Y, RectangleWidth, RectangleHeight);
//&lt;strong&gt;Создадим эллипс&lt;/strong&gt;.
Rectangle EllipseDraw = new Rectangle(coordE_X, coordE_Y, EllipseWidth, EllipseHeight);

//Создадим графическую область для прямоугольника и эллипса.
GraphicsPath GraphicsPathRectangle = new GraphicsPath();
GraphicsPath GraphicsPathEllipse = new GraphicsPath();

//Добавим в первую область созданный прямоугольник.
GraphicsPathRectangle.AddRectangle(RectangleDraw);

//Добавим во вторую область созданный эллипс.
GraphicsPathEllipse.AddEllipse(EllipseDraw);

//Создадим точку с координатами (100; 200).
Point PointUser = new Point(100, 200);</pre>
<p>Все, мы выполнили создание прямоугольника, эллипса и точки.<br />
Теперь давай проверим определим в какую область попала точка.<br />
С помощью объекта IsVisible можно это сделать.</p>
<pre class="brush: csharp; title: ; notranslate">
if (GraphicsPathEllipse.IsVisible(PointUser))
	MessageBox.Show(&quot;Попала в эллипс!&quot;);

if (GraphicsPathRectangle.IsVisible(PointUser))
	MessageBox.Show(&quot;Попала в прямоугольник!&quot;);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2010/05/29/opredelit-popadanie-tochki-v-pryamougolnik-ili-ellips-na-c/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Пьяньчуга &#8212; Моделирование движения пьяного человека на C#</title>
		<link>http://statprog.ru/2010/01/28/pyanchuga-modelirovanie-dvizheniya-pyanogo-cheloveka-na-c</link>
		<comments>http://statprog.ru/2010/01/28/pyanchuga-modelirovanie-dvizheniya-pyanogo-cheloveka-na-c#comments</comments>
		<pubDate>Thu, 28 Jan 2010 14:59:09 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C / C++ / C#]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Моделирование]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=402</guid>
		<description><![CDATA[Надоели скучные и однообразные программы? Давайте немного пофантазируем и напишем программу, которая будет моделировать движение пьяного человека, и представим все это графически. Суть программы будет заключаться в следующем: Будем моделировать движение пьяного человека (он пьян до того, что не знает что делает, но лежать ему не хочется). В начальный момент времени задается положение человека в [...]]]></description>
			<content:encoded><![CDATA[<p>Надоели скучные и однообразные программы? Давайте немного пофантазируем и напишем программу, которая будет моделировать движение пьяного человека, и представим все это графически.</p>
<p>Суть программы будет заключаться в следующем:</p>
<p>Будем моделировать движение пьяного человека (он пьян до того, что не знает что делает, но лежать ему не хочется). В начальный момент времени задается положение человека в некотором дворе с непроницаемыми стенками и одним выходом. Кроме того даются 5 вероятностей &#8212; остаться на месте и перемещаться в 4 стороны. Если появляется попытка переместиться через стенку, то «пьяньчуга» остается на месте. Сумма вероятностей строго равно 1. Если «пьяньчуга» нашел выход или попал в один из люков, то моделирование заканчивается и выводится соответствующее сообщение.<span id="more-402"></span></p>
<p>И так, в <strong>Visual Studio</strong> в <strong>C#</strong> создайте форму, и объекты как показано на рисунке «Рисунок 1.1». Соответственно, к каждому объекту подписано его имя.</p>
<div class="wp-caption aligncenter" style="width: 566px"><a href="http://statprog.ru/wp-content/012810_1459_2.jpg" rel="lightbox[402]"><img title="Моделирование движения пьяного человека на C#" src="http://statprog.ru/wp-content/012810_1459_2.jpg" alt="Моделирование движения пьяного человека на C#" width="556" height="351" /></a><p class="wp-caption-text">Моделирование движения пьяного человека на C#</p></div>
<p style="text-align: justify;">
<p style="text-align: justify;"><img src="http://statprog.ru/wp-content/012810_1459_1.png" alt="Рисунок 1.1" /></p>
<p>После создания формы и всех ее объектов приступим к написанию кода программы.<br />
Для начала я перечислю, какие библиотеки и глобальные переменные необходимы для работы программы.<br />
<strong>Библиотеки:</strong></p>
<pre class="brush: csharp; title: ; notranslate">using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;</pre>
<p><strong>Глобальные переменные:</strong></p>
<pre class="brush: csharp; title: ; notranslate">Point[,] coord = new Point[11, 11];
Point[] coord_courses;
coord_points[] mass_points;
Point PointUser = new Point();
Point PointUser_For_searche = new Point();
int shag = 5;
Graphics Line;
Rectangle EllipseDraw = new Rectangle();
Rectangle EllipseDraw2 = new Rectangle();
GraphicsPath GraphicsPathEllipse;</pre>
<p>Для того чтобы запоминать сколько раз «пьяньчуга» попадал в ту или иную точку, мы будем использовать структуру «coord_points», которая включает в себя координаты точки x и y и количество попаданий «Count». Структуру объявляем глобально.</p>
<pre class="brush: csharp; title: ; notranslate">public struct coord_points
{
	int x;
	int y;
	int Count;
	public coord_points(int X, int Y, int count)
	{
		x = X;
		y = Y;
		Count = count;
	}
	public int X
	{
		get { return x; }
		set { x = value; }
	}
	public int Y
	{
		get { return y; }
		set { y = value; }
	}
	public int count
	{
		get { return Count; }
		set { Count = value; }
	}
};</pre>
<p>Теперь напишем код для кнопки «Нарисовать местность».</p>
<pre class="brush: csharp; title: ; notranslate">	pictureBox.Refresh(); //Обновить область для рисования
	listBox1.Items.Clear(); // Очищаем ListBox с координатами
	isleovanie.Text = &quot;&quot;; // Очищаем значение исследования
	Line = Graphics.FromHwnd(pictureBox.Handle); // Создаем объект для рисования на pictureBox

	count_iter.Text = 0.ToString();//Обнуляем поле «Кол-во итераций»
	distance.Text = 0.ToString();//Обнуляем поле «Расстояние (пиксеметры)»

	count_courses.Text = 0.ToString();//Обнуляем поле «Общее кол-во шагов»
	count_down.Text = 0.ToString();//Обнуляем поле количество шагов «Вниз»
	count_up.Text = 0.ToString();//Обнуляем поле количество шагов «Вверх»
	count_l.Text = 0.ToString();//Обнуляем поле количество шагов «Влево»
	count_r.Text = 0.ToString();//Обнуляем поле количество шагов «Вправо»

	System.Drawing.Pen red = new Pen(Color.Red, 1);
	SolidBrush EllipseBrush = new SolidBrush(Color.Black);
	Graphics Ellipse = Graphics.FromHwnd(pictureBox.Handle);
	Graphics Ellipse2 = Graphics.FromHwnd(pictureBox.Handle);
	GraphicsPathEllipse = new GraphicsPath();
	Random rnd = new Random();
	int max_h = pictureBox.Height / 2 + pictureBox.Height / 4;
	int max_w = pictureBox.Width / 2 + pictureBox.Width / 4;
	int temp = 0;

	Point start1 = new Point(10, 10);
	Point start2 = new Point(10, 10);
	Point end1 = new Point(10, pictureBox.Height - 50);
	Point end2 = new Point(pictureBox.Width - 10, 10);
	Point end3 = new Point(pictureBox.Width - 10, pictureBox.Height - 50);
	//Координаты помещения
	coord[0, 0].X = end2.X - rnd.Next(pictureBox.Width / 3, pictureBox.Width / 2);
	coord[0, 0].Y = start1.Y;
	coord[0, 1].X = end2.X - rnd.Next(5, pictureBox.Width / 3);
	coord[0, 1].Y = end2.Y;
	//Слева линия
	coord[1, 0].X = start1.X;
	coord[1, 0].Y = start1.Y;
	coord[1, 1].X = end1.X;
	coord[1, 1].Y = end1.Y;
	//Верхняя
	coord[2, 0].X = start1.X;
	coord[2, 0].Y = start1.Y;
	coord[2, 1].X = coord[0, 0].X;
	coord[2, 1].Y = end2.Y;
	//Верхняя 2
	coord[6, 0].X = coord[0, 1].X;
	coord[6, 0].Y = start1.Y;
	coord[6, 1].X = end2.X;
	coord[6, 1].Y = end2.Y;
	//Правая
	coord[3, 0].X = end2.X;
	coord[3, 0].Y = end2.Y;
	coord[3, 1].X = end3.X;
	coord[3, 1].Y = end3.Y;
	//Нижняя
	coord[4, 0].X = end1.X;
	coord[4, 0].Y = end1.Y;
	coord[4, 1].X = end3.X - pictureBox.Width / 2 - pictureBox.Width / 3 - rnd.Next(0, 30);
	coord[4, 1].Y = end3.Y;
	//Нижняя
	coord[7, 0].X = end3.X - pictureBox.Width / 4 - pictureBox.Width / 2 - rnd.Next(0, 50);
	coord[7, 0].Y = end1.Y;
	coord[7, 1].X = end3.X;
	coord[7, 1].Y = end3.Y;
	//Нижняя 2
	coord[8, 0].X = coord[4, 1].X;
	coord[8, 0].Y = end3.Y;
	coord[8, 1].X = coord[4, 1].X;
	coord[8, 1].Y = end3.Y + 40;
	//Нижняя 2
	coord[9, 0].X = coord[7, 0].X;
	coord[9, 0].Y = end3.Y;
	coord[9, 1].X = coord[7, 0].X;
	coord[9, 1].Y = coord[8, 1].Y;
	//Нижняя 3
	coord[10, 0].X = coord[8, 1].X;
	coord[10, 0].Y = coord[8, 1].Y;
	coord[10, 1].X = coord[9, 1].X;
	coord[10, 1].Y = coord[9, 1].Y;
	//Координаты для эллипса
	coord[5, 0].X = rnd.Next(50, max_w);
	coord[5, 0].Y = rnd.Next(50, max_h);
	coord[5, 1].X = rnd.Next(50, max_w);
	coord[5, 1].Y = rnd.Next(50, max_h);
	for (; ; )
	{
		if (coord[5, 1].X == 0 || coord[5, 1].Y == 0)
		{
			temp = rnd.Next(50, max_w);
			if (temp != coord[5, 0].X)
				coord[5, 1].X = temp;

			temp = rnd.Next(50, max_w);
			if (temp != coord[5, 0].Y)
				coord[5, 1].Y = temp;
		}
		else
			break;
	}
	//////////////////
	EllipseDraw = new Rectangle(coord[5, 0].X, coord[5, 0].Y, 10, 10);
	EllipseDraw2 = new Rectangle(coord[5, 1].X, coord[5, 1].Y, 10, 10);

	Line.DrawLine(red, start1.X, start1.Y, end1.X, end1.Y); //Левая

	Line.DrawLine(red, coord[2, 0].X, coord[2, 0].Y, coord[2, 1].X, coord[2, 1].Y); //Верхняя
	Line.DrawLine(red, coord[6, 0].X, coord[6, 0].Y, coord[6, 1].X, coord[6, 1].Y); //Верхняя

	Line.DrawLine(red, end2, end3); //Правая

	Line.DrawLine(red, coord[4, 0].X, coord[4, 0].Y, coord[4, 1].X, coord[4, 1].Y); //Нижняя прямая
	Line.DrawLine(red, coord[7, 0].X, coord[7, 0].Y, coord[7, 1].X, coord[7, 1].Y); //Нижняя прямая

	Line.DrawLine(red, coord[8, 0].X, coord[8, 0].Y, coord[8, 1].X, coord[8, 1].Y); //Нижняя 2 слева

	Line.DrawLine(red, coord[9, 0].X, coord[9, 0].Y, coord[9, 1].X, coord[9, 1].Y); //Нижняя 2 справа

	Line.DrawLine(red, coord[10, 0].X, coord[10, 0].Y, coord[10, 1].X, coord[10, 1].Y); //Нижняя 3 прямая

	int el_x1 = rnd.Next(50, max_w);
	int el_y1 = rnd.Next(50, max_h);

	GraphicsPathEllipse.AddEllipse(new Rectangle(el_x1, el_y1, 10, 10));//Рисуем первый люк
	Ellipse.FillEllipse(EllipseBrush, new Rectangle(el_x1, el_y1, 10, 10));
	//Рисуем случайно все остальные люки (kolvolukov.Text – кол-во люков)
	for (int i = 2; i &lt; = Convert.ToInt32(kolvolukov.Text); i++) 	{ 		int el_x2 = rnd.Next(50, max_w); 		int el_y2 = rnd.Next(50, max_h); 		for (; ; ) 		{ 			if (el_x2 == 0 || el_y2 == 0) 			{ 				temp = rnd.Next(50, max_w); 				if (temp != el_x1) 					el_x2 = temp; 				temp = rnd.Next(50, max_w); 				if (temp != el_y1) 					el_y2 = temp; 			} 			else 				break; 		} 		el_x1 = el_x2; 		el_y1 = el_y2; 		GraphicsPathEllipse.AddEllipse(new Rectangle(el_x2, el_y2, 10, 10)); 		Ellipse.FillEllipse(EllipseBrush, new Rectangle(el_x2, el_y2, 10, 10)); 	} 	searching.Enabled = true; //Активируем кнопку «Провести исследование»</pre>
<p style="text-align: justify;">Напишем метод «MessageShow», который будет выводить сообщение на экран при завершении моделирования. void MessageShow(int type) { if(type == 1) MessageBox.Show(&#171;Моделирование закончено!&#187;); else MessageBox.Show(&#171;Пьянчуга попал в люк&#187;); } Теперь напишем объект «check», который осуществляет ряд проверок движения «пьяньчуги». Если «пьяньчуга» нашел выход или попал в один из люков, выводится соответствующее сообщение и моделирование прекращается.</p>
<pre class="brush: csharp; title: ; notranslate">int check(int type) { 	//Конец пути пьянчуги 	if (PointUser.X &gt;= coord[0, 0].X &amp;&amp; PointUser.X &lt; = coord[0, 1].X &amp;&amp; PointUser.Y 	{
		if(type == 1)
			MessageShow(1);
		return -1;
	}
	//Пьянчуга попал в люк
	if (GraphicsPathEllipse.IsVisible(PointUser))
	{
		if(type == 1)
			MessageShow(2);
		return -1;
	}
	//Слева линия
	if (PointUser.X = coord[1, 0].Y &amp;&amp; PointUser.Y &lt; = coord[1, 1].Y) 	{ 		PointUser.X += shag; 	} 	//Верхняя 	if(PointUser.X &gt;= coord[2, 0].X &amp;&amp; PointUser.X &lt; = coord[2, 1].X &amp;&amp; PointUser.Y = coord[6, 0].X &amp;&amp; PointUser.X &lt; = coord[6, 1].X &amp;&amp; PointUser.Y = coord[3, 0].X &amp;&amp; PointUser.Y &gt;= coord[3, 0].Y &amp;&amp; PointUser.Y &lt; = coord[3, 1].Y) 	{ 		PointUser.X -= shag; 	} 	//Нижняя 	if ((PointUser.X &gt;= coord[4, 0].X &amp;&amp; PointUser.X &lt; = coord[4, 1].X) &amp;&amp; PointUser.Y &gt;= coord[4, 1].Y)
	{
		PointUser.Y -= shag;
	}
	if ((PointUser.X &gt;= coord[7, 0].X &amp;&amp; PointUser.X &lt; = coord[7, 1].X) &amp;&amp; PointUser.Y &gt;= coord[7, 1].Y)
	{
		PointUser.Y -= shag;
	}
	if (PointUser.X &lt; = coord[8, 0].X &amp;&amp; PointUser.Y &gt;= coord[8, 0].Y &amp;&amp; PointUser.Y &lt; = coord[8, 1].Y) 	{ 		PointUser.X += shag; 	} 	if ((PointUser.X &gt;= coord[10, 0].X &amp;&amp; PointUser.X &lt; = coord[10, 1].X) &amp;&amp; PointUser.Y &gt;= coord[10, 1].Y)
	{
		PointUser.Y -= shag;
	}
	if (PointUser.X &gt;= coord[9, 0].X &amp;&amp; PointUser.Y &gt;= coord[9, 0].Y &amp;&amp; PointUser.Y &lt; = coord[9, 1].Y)//Нижняя 2 справа 	{ 		PointUser.X -= shag; 	} 	return 0; }</pre>
<p style="text-align: justify;">Следующие объекты и методы необходимы для проверки правильного указания коэффициентов вероятности перемещения и количества люков.</p>
<pre class="brush: csharp; title: ; notranslate">bool check_ver() { 	double sum = Convert.ToDouble(go_up.Text) + Convert.ToDouble(go_down.Text) + Convert.ToDouble(go_right.Text) + Convert.ToDouble(go_left.Text); 	if (sum &gt; 1 || sum &lt; 1)
		MessageBox.Show(&quot;Сумма коэффициентов направленности превышает допустимое значение равное 1.&quot;);
	else if (Convert.ToInt32(kolvolukov.Text) &lt; 1 || Convert.ToInt32(kolvolukov.Text) &gt; 50)
		MessageBox.Show(&quot;Количество люков не может быть меньше 1 или больше 50.&quot;);
	else
		return true;

	return false;
}
//Запускается, когда происходит изменение Вероятности перемещения «Вверх»
private void go_up_TextChanged(object sender, EventArgs e)
{
	check_ver();
}
//Запускается, когда происходит изменение Вероятности перемещения «Вниз»
private void go_down_TextChanged(object sender, EventArgs e)
{
	check_ver();
}
//Запускается, когда происходит изменение Вероятности перемещения «Вправо»
private void go_right_TextChanged(object sender, EventArgs e)
{
	check_ver();
}
//Запускается, когда происходит изменение Вероятности перемещения «Влево»
private void go_left_TextChanged(object sender, EventArgs e)
{
	check_ver();
}
//Запускается, когда происходит изменение поля Количество люков
private void kolvolukov_TextChanged(object sender, EventArgs e)
{
	check_ver();
}</pre>
<p>Напишем методы, которые изменяют шаг движения. Если на объект выводятся «точки», шаг составляет 5, если цифры – 15. Создано для удобства вывода на экран.</p>
<pre class="brush: csharp; title: ; notranslate">private void pic_point_CheckedChanged(object sender, EventArgs e)
{
	shag = 5;
}
private void pic_char_CheckedChanged(object sender, EventArgs e)
{
	shag = 15;
}
//Объект «isPoint» возвращает положение координаты точки, если она есть в массиве mass_points
int isPoint(Point mass_nums, coord_points[] mass_points)
{
	for (int i = 0; i &lt; mass_points.Count(); i++)
	{
		if (mass_points[i].X == mass_nums.X &amp;&amp; mass_points[i].Y == mass_nums.Y)
			return i;
	}
	return -1;
}
//Метод «setCount» увеличивает счетчик попадания человека в точку на 1
void setCount(coord_points[] mass_points, int index)
{
	mass_points[index].count = mass_points[index].count + 1;
}
// Метод «listBox1_MouseDoubleClick» вызывается при двойном клике на объект «listBox1», где хранятся координаты перемещения «пьяньчуги». Метод выделяет красным цветом точку по указанной координате.
private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
	System.Drawing.Pen red = new Pen(Color.Red, 2);
	Graphics Ellipse = Graphics.FromHwnd(pictureBox.Handle);

	Ellipse.DrawEllipse(red, new Rectangle(mass_points[listBox1.Items.IndexOf(listBox1.Text)].X, mass_points[listBox1.Items.IndexOf(listBox1.Text)].Y, 2, 2));

}</pre>
<p>Наконец, метод «pictureBox_MouseDown», который осуществляет моделирование движения пьяного человека.</p>
<pre class="brush: csharp; title: ; notranslate">private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
	if (check_ver() == true)//Если все проверки прошли
	{
		PointUser.X = e.X; //Получаем X-координату точки
		PointUser.Y = e.Y; //Получаем Y-координату точки

		PointUser_For_searche.X = e.X;
		PointUser_For_searche.Y = e.Y;

		Line = Graphics.FromHwnd(pictureBox.Handle);
		System.Drawing.Graphics graph = Graphics.FromHwnd(pictureBox.Handle);

		System.Drawing.Pen WhiteSmoke = new Pen(Color.WhiteSmoke, 1);
		System.Drawing.Pen Black = new Pen(Color.Black, 2);
		EllipseDraw = new Rectangle(PointUser.X, PointUser.Y, 2, 2);
		Graphics Ellipse = Graphics.FromHwnd(pictureBox.Handle);
		Ellipse.DrawEllipse(Black, EllipseDraw);

		Random rnd = new Random();
		int count = 0, countiter = 0, c_left = 0, c_right = 0, c_up = 0, c_down = 0;
		double hod, left, right, up, down;
		coord_courses = new Point[Convert.ToInt32(count_steps.Text)];

		List mass_nums = new List();

		for (int i = 1; i &lt; = Convert.ToInt32(count_steps.Text); i++) 		{ 			if (rnd.Next(1, 5) != 1)//Если вероятность не «стоять на месте» 			{ 				coord_courses[count] = PointUser; 				mass_nums.Add(PointUser); 				hod = rnd.NextDouble(); 				up = Convert.ToDouble(go_up.Text); 				down = Convert.ToDouble(go_down.Text); 				right = up + down; 				left = up + down + Convert.ToDouble(go_right.Text); //Если вероятность «идти влево» 				if (hod &gt; left &amp;&amp; hod &lt; left + Convert.ToDouble(go_left.Text)) 				{ 					PointUser.X -= shag; 					if (check(1) == -1) 						break; 					else 					{ 						if (pic_point.Checked) 							Ellipse.DrawEllipse(Black, new Rectangle(PointUser.X, PointUser.Y, 2, 2)); 					} 					c_left++; 				} 				else if (hod &gt; 0 &amp;&amp; hod &lt; up) //Если вероятность «идти вверх» 				{ 					PointUser.Y -= shag; 					if (check(1) == -1) 						break; 					else 					{ 						if (pic_point.Checked) 							Ellipse.DrawEllipse(Black, new Rectangle(PointUser.X, PointUser.Y, 2, 2)); 					} 					c_up++; 				} 				else if (hod &gt; right &amp;&amp; hod &lt; right + Convert.ToDouble(go_right.Text)) //вправо 				{ 					PointUser.X += shag; 					if (check(1) == -1) 						break; 					else 					{ 						if (pic_point.Checked) 							Ellipse.DrawEllipse(Black, new Rectangle(PointUser.X, PointUser.Y, 2, 2)); 					} 					c_right++; 				} 				else if (hod &gt; up &amp;&amp; hod &lt; up + down) //вниз 				{ 					PointUser.Y += shag; 					if (check(1) == -1) 						break; 					else 					{ 						if (pic_point.Checked) 							Ellipse.DrawEllipse(Black, new Rectangle(PointUser.X, PointUser.Y, 2, 2)); 					} 					c_down++; 				} 			} 			countiter++; 		} 		count = c_down + c_left + c_right + c_up; 		count_iter.Text = countiter.ToString(); 		distance.Text = (count).ToString(); 		count_courses.Text = count.ToString(); 		count_down.Text = c_down.ToString(); 		count_up.Text = c_up.ToString(); 		count_l.Text = c_left.ToString(); 		count_r.Text = c_right.ToString(); 		up = Convert.ToDouble(go_up.Text); 		down = Convert.ToDouble(go_down.Text); 		right = Convert.ToDouble(go_right.Text); 		left = Convert.ToDouble(go_left.Text); 		if (up &gt; down &amp;&amp; up &gt; right &amp;&amp; up &gt; left)
			isleovanie.Text = &quot;При к.н. (Вверх) пьянчуга прошел &quot; + Math.Round(((double)c_up / (double)count) * 100) + &quot;% пути&quot;;
		else if (down &gt; up &amp;&amp; down &gt; right &amp;&amp; down &gt; right)
			isleovanie.Text = &quot;При к.н. (Вниз) пьянчуга прошел &quot; + Math.Round(((double)c_down / (double)count) * 100) + &quot;% пути&quot;;
		else if (right &gt; up &amp;&amp; right &gt; left &amp;&amp; right &gt; down)
			isleovanie.Text = &quot;При к.н. (Вправо) пьянчуга прошел &quot; + Math.Round(((double)c_right / (double)count) * 100) + &quot;% пути&quot;;
		else if (left &gt; up &amp;&amp; left &gt; right &amp;&amp; left &gt; down)
			isleovanie.Text = &quot;При к.н. (Влево) пьянчуга прошел &quot; + Math.Round(((double)c_left / (double)count) * 100) + &quot;% пути&quot;;

		mass_points = new coord_points[mass_nums.Count];
		Point[] coord_courses2 = new Point[mass_nums.Count];
		int index = 0, j = 0;
		for (int i = 0; i &lt; mass_nums.Count; i++) 			if ((index = isPoint(mass_nums[i], mass_points)) &gt; -1)
			{
				setCount(mass_points, index);
			}
			else
			{
				mass_points[j].X = mass_nums[i].X;
				mass_points[j].Y = mass_nums[i].Y;
				mass_points[j].count = 1;
				j++;
			}

		for (int i = j - 1; i &gt;= 0; i--)
		{
			if (!pic_point.Checked)
			{
				if (i + 1 == j)
					graph.DrawString(mass_points[i].count.ToString(), new Font(&quot;Times New Roman&quot;, 8), new SolidBrush(Color.Red), mass_points[i].X - 3, mass_points[i].Y - 8);
				else
					graph.DrawString(mass_points[i].count.ToString(), new Font(&quot;Times New Roman&quot;, 8), new SolidBrush(Color.Black), mass_points[i].X - 3, mass_points[i].Y - 8);
			}
			listBox1.Items.Add(&quot;X:&quot; + mass_points[i].X + &quot;; Y:&quot; + mass_points[i].Y + &quot;; Кол-во:&quot; + mass_points[i].count);
		}
	}
}</pre>
<p>Напишем последний метод «searching_Click», чтобы завершить написание программы. Здесь выполняется исследование.</p>
<pre class="brush: csharp; title: ; notranslate">private void searching_Click(object sender, EventArgs e)
{
	Random rnd = new Random();
	int count = 0, countiter = 0, c_left = 0, c_right = 0, c_up = 0, c_down = 0;
	double hod, left, right, up, down;

	for (int sch = 1; sch &lt; = 10; sch++)
	{
		PointUser = PointUser_For_searche;
		for (int i = 1; i  left &amp;&amp; hod &lt; left + Convert.ToDouble(go_left.Text)) //влево 				{ 					PointUser.X -= shag; 					if (check(2) == -1) 						break; 					c_left++; 				} 				else if (hod &gt; 0 &amp;&amp; hod &lt; up) //вверх 				{ 					PointUser.Y -= shag; 					if (check(2) == -1) 						break; 					c_up++; 				} 				else if (hod &gt; right &amp;&amp; hod &lt; right + Convert.ToDouble(go_right.Text)) //вправо 				{ 					PointUser.X += shag; 					if (check(2) == -1) 						break; 					c_right++; 				} 				else if (hod &gt; up &amp;&amp; hod &lt; up + down) //вниз 				{ 					PointUser.Y += shag; 					if (check(2) == -1) 						break; 					c_down++; 				} 			} 			countiter++; 		} 	} 	count = c_down + c_left + c_right + c_up; 	count_iter.Text = countiter.ToString(); 	distance.Text = (count).ToString(); 	count_courses.Text = count.ToString(); 	count_down.Text = c_down.ToString(); 	count_up.Text = c_up.ToString(); 	count_l.Text = c_left.ToString(); 	count_r.Text = c_right.ToString(); 	up = Convert.ToDouble(go_up.Text); 	down = Convert.ToDouble(go_down.Text); 	right = Convert.ToDouble(go_right.Text); 	left = Convert.ToDouble(go_left.Text); 	if (up &gt; down &amp;&amp; up &gt; right &amp;&amp; up &gt; left)
	{
		isleovanie.Text = &quot;При к.н. (Вверх) пьянчуга прошел &quot; + Math.Round(((double)c_up / (double)count) * 100) + &quot;% пути&quot;;
		label10.Text = &quot;Среднее значение: &quot; + Math.Round((double)c_up / (double)count, 2).ToString();
	}
	else if (down &gt; up &amp;&amp; down &gt; right &amp;&amp; down &gt; right)
	{
		isleovanie.Text = &quot;При к.н. (Вниз) пьянчуга прошел &quot; + Math.Round(((double)c_down / (double)count) * 100) + &quot;% пути&quot;;
		label10.Text = &quot;Среднее значение: &quot; + Math.Round((double)c_down / (double)count, 2).ToString();
	}
	else if (right &gt; up &amp;&amp; right &gt; left &amp;&amp; right &gt; down)
	{
		isleovanie.Text = &quot;При к.н. (Вправо) пьянчуга прошел &quot; + Math.Round(((double)c_right / (double)count) * 100) + &quot;% пути&quot;;
		label10.Text = &quot;Среднее значение: &quot; + Math.Round((double)c_right / (double)count, 2).ToString();
	}
	else if (left &gt; up &amp;&amp; left &gt; right &amp;&amp; left &gt; down)
	{
		isleovanie.Text = &quot;При к.н. (Влево) пьянчуга прошел &quot; + Math.Round(((double)c_left / (double)count) * 100) + &quot;% пути&quot;;
		label10.Text = &quot;Среднее значение: &quot; + Math.Round((double)c_left / (double)count, 2).ToString();
	}
}</pre>
<p>После написание кода программы проверим ее работу:</p>
<ul>
<li>
<div style="text-align: justify;">Указать вероятности перемещения</div>
</li>
<li>
<div style="text-align: justify;">Указать количество люков и тактов</div>
</li>
<li>
<div style="text-align: justify;">Выбрать метод представления пути перемещения («Точки» или «Цифры»)</div>
</li>
<li>
<div style="text-align: justify;">Кликнуть по кнопке «Нарисовать местность»</div>
</li>
<li>
<div style="text-align: justify;">Кликнуть мышкой по области рисования «pictureBox»</div>
</li>
<li>
<div style="text-align: justify;">Посмеяться над «пьяньчугой»</div>
</li>
<li>
<div style="text-align: justify;">Кликнуть по кнопке «Провести исследование»</div>
</li>
</ul>
<p><strong><span style="text-decoration: underline;">Примеры работы программы:</span></strong></p>
<p>«Пьяньчуга» попал в люк:</p>
<div id="attachment_436" class="wp-caption aligncenter" style="width: 560px"><a href="http://statprog.ru/wp-content/picpiyan.jpg" rel="lightbox[402]"><img class="size-full wp-image-436" title="Пьяньчуга попал в люк" src="http://statprog.ru/wp-content/picpiyan.jpg" alt="Пьяньчуга попал в люк" width="550" height="350" /></a><p class="wp-caption-text">Пьяньчуга попал в люк</p></div>
<p style="text-align: center;">
<p style="text-align: left;">«Пьяньчуга» нашел выход:</p>
<div id="attachment_437" class="wp-caption aligncenter" style="width: 560px"><a href="http://statprog.ru/wp-content/picpiyan2.jpg" rel="lightbox[402]"><img class="size-full wp-image-437" title="Пьяньчуга нашел выход" src="http://statprog.ru/wp-content/picpiyan2.jpg" alt="Пьяньчуга нашел выход" width="550" height="350" /></a><p class="wp-caption-text">Пьяньчуга нашел выход</p></div>
<p style="text-align: center;">
<p>Данную статью Вы можете скачать в формате doc<br />
<a href="http://statprog.ru/wp-content/modelirovanie_piyanchugi.rar">Скачать Пьяньчуга &#8212; Моделирование движения пьяного человека на C#</a></p>
<p style="text-align: justify;"><span style="color: black; font-family: Times New Roman; font-size: 12pt;"><strong>Автор:<em> Евтеев Евгений Александрович<br />
</em></strong></span></p>
<p><span style="color: black; font-family: Times New Roman; font-size: 12pt;"><strong>Email:<em> evteev_e2003@mail.ru</em></strong></span></p>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2010/01/28/pyanchuga-modelirovanie-dvizheniya-pyanogo-cheloveka-na-c/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Построить треугольник, описать и вписать окружность на C#</title>
		<link>http://statprog.ru/2009/11/29/postroit-treugolnik-opisat-i-vpisat-okruzhnost-na-c</link>
		<comments>http://statprog.ru/2009/11/29/postroit-treugolnik-opisat-i-vpisat-okruzhnost-na-c#comments</comments>
		<pubDate>Sun, 29 Nov 2009 18:16:27 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C / C++ / C#]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[вписать окружность]]></category>
		<category><![CDATA[окружность]]></category>
		<category><![CDATA[описать окружность]]></category>
		<category><![CDATA[Построить треугольник]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=268</guid>
		<description><![CDATA[В статье мы займемся рисованием, рисовать будем треугольник, вписанную и описанную окружность. Конечно, рисовать будет программа, код которой мы сейчас напишем. Координаты вершин треугольника будут находиться в структуре “Pt”. Для этого создадим переменные для работы со структурой и саму структуру. Далее напишем функции для вычисления длин, углов треугольника и т.д. и процедуру для вывода графики [...]]]></description>
			<content:encoded><![CDATA[<p>В статье мы займемся рисованием, рисовать будем треугольник, вписанную и описанную <strong>окружность</strong>. Конечно, рисовать будет программа, код которой мы сейчас напишем.</p>
<p>Координаты вершин треугольника будут находиться в структуре “Pt”. Для этого создадим переменные для работы со структурой и саму структуру.<span id="more-268"></span></p>
<pre class="brush: csharp; title: ; notranslate">Pt m1, m2, v1, v2, b1, b2;
public struct Pt
{
	double x;
	double y;
	public Pt(double a, double b)
	{
		x = a;
		y = b;
	}
	public double X
	{
		get { return x; }
		set { x = value; }
	}
	public double Y
	{
		get { return y; }
		set { y = value; }
	}
};</pre>
<p>Далее напишем функции для вычисления длин, углов треугольника и т.д. и процедуру для вывода графики на форму.<br />
Пишем функцию нахождения длины строны треугольника по заданным координатам. Будем использовать формулу нахождения расстояния между двумя точками.<br />
S = ((x2 &#8212; x1) ^2+ (y2-y1) ^2) ^ (1/2), где (x1, y1) и (x2, y2) &#8212; это координаты начала и конца отрезка.</p>
<pre class="brush: csharp; title: ; notranslate">double SideLength(double x1, double y1, double x2, double y2)
{
	double a = Math.Sqrt((x2 - x1) / 10 * (x2 - x1) / 10 + (y2 - y1) / 10 * (y2 - y1) / 10);
	return a * 10;
}</pre>
<p>Чтобы найти углы треугольника воспользуемся формулой скалярного произведения векторов<br />
cos(ang) = a/(s1*s2), где a &#8212; скалярное произведение векторов s1 и s2,а s1 и s2 &#8212; стороны треугольника (абсолютные величины векторов).</p>
<pre class="brush: csharp; title: ; notranslate">double Angles(Pt p1, Pt p2, Pt p3)
{
	double a = (p2.X - p1.X) * (p3.X - p1.X) + (p2.Y - p1.Y) * (p3.Y - p1.Y);
	double exp = a / SideLength(p1.X, p1.Y, p2.X, p2.Y) / SideLength(p1.X, p1.Y, p3.X, p3.Y);
	return Math.Acos(exp);
}</pre>
<p>Периметр находим как сумма длин трех сторон треугольника.</p>
<pre class="brush: csharp; title: ; notranslate">double Perimetr(double s1, double s2, double s3)
{
	return (s1 + s2 + s3);
}</pre>
<p><strong>Площадь треугольника</strong> находится с помощью формулы Герона:</p>
<pre class="brush: csharp; title: ; notranslate">Sqr = (p * (p - s1) * (p - s2) * (p - s3)) ^ (1 / 2), где p - полупериметр треугольника.
double Sqare(double s1, double s2, double s3)
{
	double p;
	p = (Perimetr(s1, s2, s3)) / 2;
	return Math.Sqrt((p * (p - s1) * (p - s2) * (p - s3)));
}</pre>
<p>Теперь найдем радиусы вписанной и описанной окружности.</p>
<pre class="brush: csharp; title: ; notranslate">double radius(double S, double p)
{
	return S / p;
}

double Radius(double S, double s1, double s2, double s3)
{
	return (s1 * s2 * s3) / (4 * S);
}</pre>
<p>И, наконец, процедура, которая будет осуществлять конечные вычисления, и рисовать окружность на форме программы.</p>
<pre class="brush: csharp; title: ; notranslate">void DescrCircle(double R, int x01, int y01, int x02, int y02, double l1, double m1, double l2, double m2)
{
	double X, Y;
	if ((l1 != 0) &amp;&amp; ((m1 / l1) - (m2 / l2) != 0) &amp;&amp; (l2 != 0))
	{
		X = ((m1 / l1) * x01 - y01 - (m2 / l2) * x02 + y02) / ((m1 / l1) - (m2 / l2));
		Y = (m1 * X - m1 * x01 + l1 * y01) / l1;
		System.Drawing.Graphics graph = this.CreateGraphics();
		System.Drawing.Pen color = new Pen(Color.Blue, 1);
		graph.DrawEllipse(color, (int)X, (int)Y, 1, 1); //рисуем центр окружности
		graph.DrawEllipse(color, (int)X - (float)R, (int)Y - (float)R, (float)R * 2, (float)R * 2); //рисуем окружность
	}
}</pre>
<p>Процедура кнопки, которая будет вызывать всю процедуру рисования треугольника и окружностей.</p>
<pre class="brush: csharp; title: ; notranslate">private void button1_Click_1(object sender, EventArgs e)</pre>
<p>Объявим нужные переменные и занесем в структуру координаты вершин треугольника из текстовых полей на форме.</p>
<pre class="brush: csharp; title: ; notranslate">double s1 ,s2 ,s3 ,S ,p ,r, R, ang1, ang2, ang3, x1, x2, y1, y2, det;
znach.Items.Clear();

Pt[] a = new Pt[3];
a[0].X = Convert.ToDouble(Ax.Text);
a[0].Y = Convert.ToDouble(Ay.Text);
a[1].X = Convert.ToDouble(Bx.Text);
a[1].Y = Convert.ToDouble(By.Text);
a[2].X = Convert.ToDouble(Cx.Text);
a[2].Y = Convert.ToDouble(Cy.Text);</pre>
<p>Нарисуем форме три линии, которые будут составлять наш треугольник и названия вершин A, B и C.</p>
<pre class="brush: csharp; title: ; notranslate">System.Drawing.Graphics graph = this.CreateGraphics();
System.Drawing.Pen red = new Pen(Color.Red, 1);

graph.DrawLine(red, (int)a[0].X, (int)a[0].Y, (int)a[1].X, (int)a[1].Y);
graph.DrawString(&quot;A&quot;, new Font(&quot;Times New Roman&quot;, 12), new SolidBrush(Color.Black), (int)a[0].X, (int)a[0].Y);
graph.DrawLine(red, (int)a[1].X, (int)a[1].Y, (int)a[2].X, (int)a[2].Y);
graph.DrawString(&quot;B&quot;, new Font(&quot;Times New Roman&quot;, 12), new SolidBrush(Color.Black), (int)a[1].X, (int)a[1].Y);
graph.DrawLine(red, (int)a[0].X, (int)a[0].Y, (int)a[2].X, (int)a[2].Y);
graph.DrawString(&quot;C&quot;, new Font(&quot;Times New Roman&quot;, 12), new SolidBrush(Color.Black), (int)a[2].X, (int)a[2].Y);</pre>
<p>Используя написанные функции, найдем длины сторон, полупериметр, площадь, радиусы вписанной и описанной окружности и углы треугольника.</p>
<pre class="brush: csharp; title: ; notranslate">s1 = SideLength(a[0].X, a[0].Y, a[1].X, a[1].Y);
s2 = SideLength(a[1].X, a[1].Y, a[2].X, a[2].Y);
s3 = SideLength(a[2].X, a[2].Y, a[0].X, a[0].Y);

p = (Perimetr(s1, s2, s3)) / 2;
S = Sqare(s1, s2, s3);

r = radius(S, p);
R = Radius(S, s1, s2, s3);

ang1 = Angles(a[2], a[0], a[1]);
ang2 = Angles(a[0], a[1], a[2]);
ang3 = Angles(a[1], a[2], a[0]);</pre>
<p>Выведем на форму все эти вычисленные значения в ListBox “znach”.</p>
<pre class="brush: csharp; title: ; notranslate">znach.Items.Add(&quot;Длина AB: &quot; + s1);
znach.Items.Add(&quot;Длина BC: &quot; + s2);
znach.Items.Add(&quot;Длина AC: &quot; + s3);
znach.Items.Add(&quot;Полупериметр: &quot; + p);
znach.Items.Add(&quot;Площадь: &quot; + S);
znach.Items.Add(&quot;Радиус вписанной о.: &quot; + r);
znach.Items.Add(&quot;Радиус описанной о.: &quot; + R);
znach.Items.Add(&quot;Угл CAB: &quot; + ang1);
znach.Items.Add(&quot;Угл ABC: &quot; + ang2);
znach.Items.Add(&quot;Угл BCA: &quot; + ang3);</pre>
<p>Найдем середины сторон s1 и s2.</p>
<pre class="brush: csharp; title: ; notranslate">m1.X = (a[0].X + a[1].X) / 2;
m1.Y = (a[0].Y + a[1].Y) / 2;
m2.X = (a[1].X + a[2].X) / 2;
m2.Y = (a[1].Y + a[2].Y) / 2;</pre>
<p>Необходимо повернуть точки на угол 90 градусов.<br />
Поворачиваем точку а[2] вокруг середины стороны:</p>
<pre class="brush: csharp; title: ; notranslate"> x1 = a[2].X; y1 = a[2].Y;
x1 -= m2.X; y1 -= m2.Y;
b1.X = x1 * Math.Cos(Math.PI / 2) - y1 * Math.Sin(Math.PI / 2);
b1.Y = x1 * Math.Sin(Math.PI / 2) + y1 * Math.Cos(Math.PI / 2);
b1.X += m2.X; b1.Y += m2.Y;
v1.X = b1.X - m2.X; v1.Y = b1.Y - m2.Y;</pre>
<p>Поворачиваем точку а[0] вокруг середины стороны s1:</p>
<pre class="brush: csharp; title: ; notranslate">x1 = a[0].X; y1 = a[0].Y;
x1 -= m1.X; y1 -= m1.Y;
b2.X = x1 * Math.Cos(Math.PI / 2) - y1 * Math.Sin(Math.PI / 2);
b2.Y = x1 * Math.Sin(Math.PI / 2) + y1 * Math.Cos(Math.PI / 2);
b2.X += m1.X; b2.Y += m1.Y;
v2.X = b2.X - m1.X; v2.Y = b2.Y - m1.Y;</pre>
<p>Вызовем нашу процедуру для вывода графики и построим описанную окружность с центром в точке пересечения серединных перепендикуляров.</p>
<pre class="brush: csharp; title: ; notranslate">DescrCircle(R, (int)m1.X, (int)m1.Y, (int)m2.X, (int)m2.Y, v2.X, v2.Y, v1.X, v1.Y);</pre>
<p>int coef1 = 1, coef2 = 1; //коэффициенты,указывающие напрвление поворота<br />
Вычисляем знак третьей координаты векторного произведения векторов, между которыми строится биссектриса.</p>
<pre class="brush: csharp; title: ; notranslate">det = (a[1].X - a[0].X) * (a[2].Y - a[0].Y) - (a[2].X - a[0].X) * (a[1].Y - a[0].Y);
if (det &gt; 0) coef1 = -1;
	det = (a[1].X - a[2].X) * (a[0].Y - a[2].Y) - (a[0].X - a[2].X) * (a[1].Y - a[2].Y);
if (det &gt; 0)
	coef2 = -1;</pre>
<p>Поворачиваем точку a[2] вокруг a[0] на угол равный половине угла ang2</p>
<pre class="brush: csharp; title: ; notranslate">x1 = a[2].X; y1 = a[2].Y;
x1 -= a[0].X; y1 -= a[0].Y;
b1.X = x1 * Math.Cos(coef1 * ang2 / 2) - y1 * Math.Sin(coef1 * ang2 / 2);
b1.Y = x1 * Math.Sin(coef1 * ang2 / 2) + y1 * Math.Cos(coef1 * ang2 / 2);
b1.X += a[0].X; b1.Y += a[0].Y;
v1.X = b1.X - a[0].X; v1.Y = b1.Y - a[0].Y;

x2 = a[0].X; y2 = a[0].Y;
x2 -= a[2].X; y2 -= a[2].Y;
b2.X = x2 * Math.Cos(coef2 * ang1 / 2) - y2 * Math.Sin(coef2 * ang1 / 2);
b2.Y = x2 * Math.Sin(coef2 * ang1 / 2) + y2 * Math.Cos(coef2 * ang1 / 2);
b2.X += a[2].X; b2.Y += a[2].Y;
v2.X = b2.X - a[2].X; v2.Y = b2.Y - a[2].Y; //v1.x v1.y- координаты направляющего вектора биссектрисы</pre>
<p>И последнее, что мы делаем это выполняем построение вписанной окружности с центром в точке пересечения биссектрисс.</p>
<pre class="brush: csharp; title: ; notranslate">DescrCircle(r, (int)a[2].X, (int)a[2].Y, (int)a[0].X, (int)a[0].Y, v2.X, v2.Y, v1.X, v1.Y);</pre>
<div id="attachment_270" class="wp-caption aligncenter" style="width: 310px"><a href="http://statprog.ru/wp-content/buid_tr_okr.jpg" rel="lightbox[268]"><img class="size-medium wp-image-270" title="Построить треугольник, описать и вписать окружность" src="http://statprog.ru/wp-content/buid_tr_okr-300x273.jpg" alt="Построить треугольник, описать и вписать окружность" width="300" height="273" /></a><p class="wp-caption-text">Построить треугольник, описать и вписать окружность</p></div>
<p>Треугольник и две окружности построены, для решения этой задачи нам понадобились небольшие знания C# и геометрии.<br />
<strong>Автор</strong>: <em>Евтеев Евгений Александрович</em><strong></strong><em></em></p>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2009/11/29/postroit-treugolnik-opisat-i-vpisat-okruzhnost-na-c/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Найти наименьшее общее кратное, используя универсальный алгоритм</title>
		<link>http://statprog.ru/2009/11/16/najti-naimenshee-obshhee-kratnoe-ispolzuya-universalnyj-algoritm</link>
		<comments>http://statprog.ru/2009/11/16/najti-naimenshee-obshhee-kratnoe-ispolzuya-universalnyj-algoritm#comments</comments>
		<pubDate>Mon, 16 Nov 2009 18:40:27 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C / C++ / C#]]></category>
		<category><![CDATA[Наименьшее общее кратное]]></category>
		<category><![CDATA[НОК]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=236</guid>
		<description><![CDATA[В предшествующей статье я рассказал, как найти наибольшее общее кратное двух чисел, используя алгоритм вычисления НОД. В этой статей мы с вами напишем универсальный алгоритм нахождения НОК. Этот алгоритм позволяет найти НОК не только для двух чисел, но для множества чисел. Наименьшее общее кратное Начнем с создания формы проекта, примерная форма показана на рисунке: Форму [...]]]></description>
			<content:encoded><![CDATA[<p>В предшествующей статье я рассказал, как найти наибольшее общее кратное двух чисел, используя алгоритм вычисления НОД. В этой статей мы с вами напишем универсальный алгоритм нахождения НОК. Этот алгоритм позволяет найти НОК не только для двух чисел, но для множества чисел.<span id="more-236"></span></p>
<h2>Наименьшее общее кратное</h2>
<p>Начнем с создания формы проекта, примерная форма показана на рисунке:</p>
<div id="attachment_239" class="wp-caption aligncenter" style="width: 310px"><a href="http://statprog.ru/wp-content/app_find_nok_2.gif" title="Наименьшее общее кратное" rel="lightbox[236]"><img class="size-medium wp-image-239" title="Наименьшее общее кратное" src="http://statprog.ru/wp-content/app_find_nok_2-300x174.gif" alt="Наименьшее общее кратное" width="300" height="174" /></a><p class="wp-caption-text">Наименьшее общее кратное</p></div>
<p>Форму создали, разместили необходимые объекты на ней. Теперь будем заниматься написанием кода программы. Числа, для которых будет производиться поиск <strong>наименьшее общее кратное</strong> (<strong>НОК</strong>), будут вводиться через пробел. Для того, что их читать из поля “n_gr ” напишем функцию.</p>
<pre class="brush: csharp; title: ; notranslate">string[] nums(string str, int f_m) {
	string[] numbers = new string[f_m + 1];
	f_m = 0;
	for (int i = 0; i &lt; str.Length; i++) {
		if (str.Substring(i, 1) != &quot; &quot;)
			numbers[f_m] += str.Substring(i, 1);
		else
			f_m++;
	}
	return numbers;
}</pre>
<p>Входные параметры “str” и “f_m” – это строка с числа и количество чисел соответственно. Создаем массив размерностью “f_m” и начинаем “выдирать” числа из строки и добавлять их в массив “numbers”. Функция возращает массив с числами из строки.</p>
<p>Теперь процедура события клика по кнопке “find”:</p>
<pre class="brush: csharp; title: ; notranslate">private void find_Click(object sender, EventArgs e) {
	string s = n_gr.Text;
	int i = 0, f_m = 0;
	while (i &lt; s.Length) {
		if (s.Substring(i, 1) == &quot; &quot;)
			f_m++;
		i++;
	}
	string[] numbers = new string[f_m + 1];
	numbers = nums(s, f_m);
	int c = 2;
	bool nok = true;
	for (; ; ) {
		for (i = 0; i &lt; numbers.Length; i++)
			if (numbers[i] != &quot;&quot;)
				if (c % Convert.ToInt32(numbers[i]) == 0) {
					if (i == 0 || nok == true)
						nok = true;
				}
				else
					nok = false;

		if (nok == true) {
			n_nok2.Text = Convert.ToString(c);
			break;
		}

		if (c &gt;= 1000000) {
			n_nok2.Text = &quot;НОК для данных чисел не найден!&quot;;
			break;
		}
		c++;
	}
}</pre>
<p>Здесь сначала вычисляется количество чисел в введенной строке, создается и заполняется массив с числами. Затем используется следующий <strong>алгоритм вычисления НОК</strong>: постоянно увеличивающееся число 2 делим на каждое из введенных чисел и НОК будет найден в том случае, когда остаток от деления на каждое число будет равен нулю. Если НОК найден или количество проходов цикла перевалило за 1000000 прекращаем работу программы, выводим соответствующий результат ее работы.</p>
<div id="attachment_240" class="wp-caption aligncenter" style="width: 310px"><a href="http://statprog.ru/wp-content/app_find_nok_2_res.gif" rel="lightbox[236]"><img class="size-medium wp-image-240" title="Универсальный алгоритм вычисления наименьшее общее кратное" src="http://statprog.ru/wp-content/app_find_nok_2_res-300x174.gif" alt="Универсальный алгоритм вычисления наименьшее общее кратное" width="300" height="174" /></a><p class="wp-caption-text">Универсальный алгоритм вычисления наименьшее общее кратное</p></div>
<p>На рисунке показан пример удачного поиска <strong>НОК</strong>, универсальный алгоритм работает правильно.</p>
<blockquote><p><strong>Автор</strong>: <em>Евтеев Евгений Александрович</em></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2009/11/16/najti-naimenshee-obshhee-kratnoe-ispolzuya-universalnyj-algoritm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Найти наименьшее общее кратное (НОК), используя алгоритм НОД</title>
		<link>http://statprog.ru/2009/11/16/najti-naimenshee-obshhee-kratnoe-ispolzuya-agloritm-nod</link>
		<comments>http://statprog.ru/2009/11/16/najti-naimenshee-obshhee-kratnoe-ispolzuya-agloritm-nod#comments</comments>
		<pubDate>Sun, 15 Nov 2009 21:18:20 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C / C++ / C#]]></category>
		<category><![CDATA[алгоритм Евклида]]></category>
		<category><![CDATA[Наименьшее общее кратное]]></category>
		<category><![CDATA[НОД]]></category>
		<category><![CDATA[НОК]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=233</guid>
		<description><![CDATA[Сегодня мы поговорим о наименьшем общем кратном (НОК) двух чисел и как его найти. НОК – это целое число, которое делится на два любых целых числа. Например, даны два числа 2 и 3, НОК этих чисел равен 6, т.е. число 6 делится и на 2 и на 3. Чтобы написать данную программу на C# будем [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня мы поговорим о наименьшем общем кратном (<strong>НОК</strong>) двух чисел и как его найти. <strong>НОК</strong> – это целое число, которое делится на два любых целых числа. Например, даны два числа 2 и 3, <strong>НОК</strong> этих чисел равен 6, т.е. число 6 делится и на 2 и на 3.<br />
Чтобы написать данную программу на <strong>C#</strong> будем использовать ко всему прочему <strong>алгоритм Евклида</strong> нахождение <strong>НОД</strong>. Лучше всего реализовать алгоритм в рекурсивной функции.<span id="more-233"></span></p>
<pre class="brush: csharp; title: ; notranslate">int nod_recur(int num1, int num2)
{
	int n = num1 % num2;
	num1 = num2;
	num2 = n;
	if (n &gt; 0)
		return nod_recur(num1, num2);
	else
		return num1;
}</pre>
<p>Как работает эта функция, я рассказывать не буду, т.к. вы можете прочитать это в другой моей статье, посвященной этому алгоритму. Ну и собственно код процедуры события клика по кнопке “button1”:</p>
<pre class="brush: csharp; title: ; notranslate">private void button1_Click(object sender, EventArgs e)
{
	int num1 = Convert.ToInt32(n1.Text);
	int num2 = Convert.ToInt32(n2.Text);
	n_nok.Text = Convert.ToString(num1 * num2 / nod_recur(num1, num2));
}</pre>
<p>Как вы видите из кода, здесь происходит считывание двух введенных чисел в переменные и вычисление <strong>НОК</strong>. Можно сказать, что <strong>НОК</strong> вычисляется в два действия: перемножаются два и результат от умножения делится на результат вычисления <strong>НОД</strong> этих двух чисел. Результат вычисления <strong>НОК</strong> записывается в текстовое поле “n_nok”.</p>
<p>Вы думали, что написать такую программу будет не так просто? Извините, что разочаровал вас. В другой статье, я расскажу вам, как вычислить <strong>НОК</strong> для двух и более чисел, так называемый <strong>универсальный алгоритм</strong>.</p>
<blockquote><p><strong>Автор</strong>: <em>Евтеев Евгений Александрович</em></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2009/11/16/najti-naimenshee-obshhee-kratnoe-ispolzuya-agloritm-nod/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Перевод десятичного числа в двоичное на VC++</title>
		<link>http://statprog.ru/2009/11/04/perevod-desyatichnogo-chisla-v-dvoichnoe-na-vc</link>
		<comments>http://statprog.ru/2009/11/04/perevod-desyatichnogo-chisla-v-dvoichnoe-na-vc#comments</comments>
		<pubDate>Tue, 03 Nov 2009 22:55:54 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C / C++ / C#]]></category>
		<category><![CDATA[VC++]]></category>
		<category><![CDATA[из десятичной системы в двоичную]]></category>
		<category><![CDATA[Перевод десятичного числа]]></category>
		<category><![CDATA[Перевод из двоичной системы в десятичную]]></category>
		<category><![CDATA[преобразовать десятичное число в двоичный вид]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=33</guid>
		<description><![CDATA[Перевод из десятичной системы в двоичную Ответ на этот вопрос мы и рассмотрим в этой статье. Мы будем использовать всем известный метод, нахождения двоичного представления десятичного числа – деление числа на 2. Все эти преобразования будут находиться в процедуре “Dec2Bin(int ch)”, где “ch”- число в десятичном представлении, которое собственно мы будем декодировать в двоичное. Как [...]]]></description>
			<content:encoded><![CDATA[<h2>Перевод из десятичной системы в двоичную</h2>
<p>Ответ на этот вопрос мы и рассмотрим в этой статье. Мы будем использовать всем известный метод, нахождения двоичного представления десятичного числа – деление числа на 2. Все эти преобразования будут находиться в процедуре “Dec2Bin(int ch)”, где “ch”- число в десятичном представлении, которое собственно мы будем <strong>декодировать в двоичное</strong>. <span id="more-33"></span></p>
<h3>Как преобразовать десятичное число в двоичный вид на VC++?</h3>
<p>До всего прочего нужно сначала объявить переменную “n” как константу: “const int n = 32;” Она отвечает за размерность массива “s[n]”, в который будет помещаться <strong>двоичное</strong> представление числа.<br />
И так, давайте рассмотрим процедуру “Dec2Bin(int ch)”, которая будет <strong>преобразовать десятичное число в двоичный вид</strong>. Что в этой процедуре мы делаем?</p>
<p>Наше число в 10-м виде делим на 2 с остатком и если при делении получается число с остатком, то в i-й элемент массива “s[i]” мы записываем число 1, в противном случае записываем 0. Этому числу “ch” приравниваем значение равное “ch”деленное на 2, эти действия выполняются пока число “ch” не будут равно нулю.</p>
<p>Дальше проверяем, если наше 10-е число отрицательное инвертируем значения массива “s[n]”, т.е. число 1 заменяем на 0 и число 0 на 1. Это правило распространяется только на отрицательные числа. Затем приводим наш массив “s[n]” в нормальный вид, инвертируя значения до тех пор, пока ни встретится значение равное 0. В конце концов, прогоняя массив по циклу “for” выводим двоичное представление числа в 10-м виде. Вот и все, теперь посмотрите, что получилось:</p>
<p>Процедура “Dec2Bin(int ch)” -<strong>Перевод из десятичной системы в двоичную</strong></p>
<pre class="brush: cpp; title: ; notranslate">void Dec2Bin(int ch)
{
	int i, ch2, s[n];
	ch2 = ch;
	for (i = 0; i &lt; n; i++)
	s[i] = 0;
	for (i = 0; ch != 0; i++)
	{
		s[i] = abs(ch) % 2; //текущему значению массива s присваиваем 1 или 0
		ch = abs(ch) / 2;
	}
	if (ch2 &lt; 0)
	{
		for (i = n - 1; i &gt;= 0; i--)
			if (s[i] == 1)
				s[i] = 0;
			else
				s[i] = 1;
	}
	for (i = 0; i &lt; n; i++)
		if (s[i] == 1)
			s[i] = 0;
		else
		{
			s[i] = 1;
			break;
		}
	wcout &lt;&lt; L&quot;Двоичное представление :&quot; &lt;&lt; endl;
	for (i = n - 1; i &gt;= 0; i--) //цикл вывода массива с введенным числом
		cout &lt;&lt; s[i]; //представленным в двоичной системе счисления
}</pre>
<p>Число в 2-м виде получили, но разве вам не хочется декодировать его обратно? Для начала напишем функции возведения числа в степень и получения длины массива, они нам понадобятся.</p>
<p>Функция “len(char str[])”:</p>
<pre class="brush: cpp; title: ; notranslate">int len(char str[])
{
	int i = 0;
	while (str[i] != 0)
		i++;
	return i-1;
}</pre>
<p>Функция “stepen(int ch, int st)”:</p>
<pre class="brush: cpp; title: ; notranslate">int stepen(int ch, int st)
{
	int a = 1;
	for(int i = 0; i &lt; st; i++)
		a *= ch;
	return a;
}</pre>
<p>Функция “len(char str[])” возвращает длину массива “str[]”, а “stepen(int ch, int st)” возводит число 2 в степень “st”.</p>
<h2>Перевод из двоичной системы в десятичную</h2>
<p>Теперь рассмотрим функцию “Bin2Dec (char m[])”, где “m[]”- это есть массив двоичных данных, в которых спрятано число. Если первый символ в массиве равен ‘1’, т.е. наше число отрицательное, то каждый символ в массиве до первой найденной ‘1’ инвертируем и после этого снова выполняет замену всех символов массива на ‘0’, если этот символ это ‘1’ или на ‘1’ соответственно. Затем непосредственно выполняем перевод в 10-й вид, используя нашу функцию возведения в степень. Код приведен ниже:</p>
<p>Функция “Bin2Dec (char m[])” &#8212; <strong>Перевод из двоичной системы в десятичную</strong></p>
<pre class="brush: cpp; title: ; notranslate">int Bin2Dec (char m[])
{
	int i, deca=0, j = 0, q = 1;
	if (m[0] == '1')
	{
		for (i = n - 1; i &gt;= 0; i--)
			if (m[i] == '0')
				m[i] = '1';
			else
			{
				m[i] = '0';
				break;
			}
		for (i = 0; i &lt; n; i++)
			if (m[i] == '1')
				m[i] = '0';
			else
				m[i] = '1';
		q*=-1;
	}
	for (i = n - 1; i &gt;= 0; i--, j++)
		if(m[i] == '1')
			deca += stepen(2,j);
	return deca*q;
}</pre>
<p>Ну и, наконец, главная функция, с которой начинается работа нашего приложения. Здесь происходит ввод данных и вывод результата работы программы на экран пользователя.</p>
<p>Главный метод:</p>
<pre class="brush: cpp; title: ; notranslate">int main()
{
	wcout.imbue(locale(&quot;rus_rus.866&quot;));
	int ch;
	char c[n];
	wcout &lt;&lt; L&quot;Введите число (десятичное):&quot; &lt;&lt; endl; //вывод сообщения на экран
	cin &gt;&gt; ch; //ввод значения с клавиатуры
	Dec2Bin(ch);
	/*------------------------------------------------------------------------*/
	wcout &lt;&lt; L&quot;\n\nВведите число (двоичное):&quot; &lt;&lt; endl; //вывод сообщения на экран
	cin&gt;&gt;c; //ввод значения с клавиатуры
	wcout &lt;&lt; L&quot;Десятичное представление :&quot; &lt;&lt; endl &lt;&lt; Bin2Dec(c) &lt;&lt; endl; //выводим на экран число в 10-й системе счисления
	system(&quot;pause&quot;);
	return 1;
}</pre>
<p>Используя данное приложение, вы с легкостью сможете переводить числа из десятичной системы счисления в двоичный вид и, наоборот, из двоичной системы счисления в десятичный вид. Желаю вам удачи!</p>
<blockquote><p><strong>Автор</strong>: Евтеев Евгений Александрович<br />
<strong>Email</strong>: evteev_e2003@mail.ru</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2009/11/04/perevod-desyatichnogo-chisla-v-dvoichnoe-na-vc/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Копирование музыки у друзей в SocialEngine Excalibur (Часть 2)</title>
		<link>http://statprog.ru/2009/09/13/kopirovanie-muzyki-u-druzej-v-socialengine-excalibur-chast-2</link>
		<comments>http://statprog.ru/2009/09/13/kopirovanie-muzyki-u-druzej-v-socialengine-excalibur-chast-2#comments</comments>
		<pubDate>Sun, 13 Sep 2009 15:30:58 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Excalibur]]></category>
		<category><![CDATA[SocialEngine]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=356</guid>
		<description><![CDATA[Продолжаем говорить о моде “Копирование музыки у друзей”. В предыдущей статье я рассказал, как сделать эту возможность, но недавно обнаружена недоработка в этом моде, при удалении музыки владельцем удалялась она и у всех скопировавших эту музыку. Сейчас я расскажу, как сделать, чтобы при удалении музыки владельцем права и сама музыка копировались одному из его друзей, [...]]]></description>
			<content:encoded><![CDATA[<p>Продолжаем говорить о моде “<strong>Копирование музыки у друзей</strong>”. В предыдущей статье я рассказал, как сделать эту возможность, но недавно обнаружена недоработка в этом моде, при удалении музыки владельцем удалялась она и у всех скопировавших эту музыку.</p>
<p>Сейчас я расскажу, как сделать, чтобы при удалении музыки владельцем права и сама музыка копировались одному из его друзей, которые скопировали его музыку.</p>
<p>Здесь все просто, необходимо произвести изменения всего в одном файле.<span id="more-356"></span></p>
<p><strong>Открыть: class_music.</strong><strong>php</strong><strong></strong></p>
<p><strong>Подсказка:</strong> Данный файл находится в папке include.</p>
<p><strong>Найти</strong></p>
<pre class="brush: php; title: ; notranslate">music_delete($music_id)</pre>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка:</strong> Полностью заменить функцию music_delete() начиная с function music_delete($music_id) и заканчивая return TRUE; }</p>
<pre class="brush: php; title: ; notranslate">function music_delete($music_id)
{
	global $database, $url, $user, $admin;
	if( $this-&gt;user_id )
	{
		$music = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT * FROM se_music WHERE music_user_id='{$this-&gt;user_id}' &amp;&amp; music_id='{$music_id}'&quot;));
	}

	elseif( $admin &amp;&amp; $admin-&gt;admin_exists )
	{
		$music = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT * FROM se_music WHERE music_id='{$music_id}'&quot;));
	}

	if( empty($music) )
		return FALSE;

	$music_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT owner_user_id FROM se_music WHERE music_id='{$music_id}' LIMIT 1&quot;));
	$owner_user_id = $music_tb[owner_user_id];

	if( strlen($owner_user_id) &gt; 0 )
	{
		if(strrchr($owner_user_id, ','))
		{
			$owner_user_id_text = explode(',', $owner_user_id);
			$owner_user_id_db = &quot;&quot;;
			$new_user_music = &quot;&quot;;
			foreach($owner_user_id_text as $owner_user_id)
			{
				if($new_user_music == &quot;&quot;)
					$new_user_music = $owner_user_id;

				if($owner_user_id != $new_user_music)
					$owner_user_id_db = $owner_user_id_db . &quot;&quot; . $owner_user_id . &quot;,&quot;;
			}
			$owner_user_id_db = trim(substr_replace($owner_user_id_db, &quot;&quot;, strlen($owner_user_id_db) - 1));
		}
		else
		{
			$new_user_music = $owner_user_id;
			$owner_user_id_db = '';
		}
		$userdir_old = $url-&gt;url_userdir($music['music_user_id']);
		$music_file_old = &quot;{$userdir_old}{$music['music_id']}.{$music['music_ext']}&quot;;
		$userdir_new = $url-&gt;url_userdir($new_user_music);
		$music_file_new = &quot;{$userdir_new}{$music['music_id']}.{$music['music_ext']}&quot;;

		if( file_exists($music_file_old) )
		{
			copy($music_file_old, $music_file_new);
			unlink($music_file_old);
		}
		$database-&gt;database_query(&quot;UPDATE `se_music` SET `music_user_id` = '{$new_user_music}', `owner_user_id` = '{$owner_user_id_db}' WHERE `music_id` = '{$music_id}' LIMIT 1&quot;);
	}
	else
	{
		$userdir = $url-&gt;url_userdir($music['music_user_id']);
		$music_file = &quot;{$userdir}{$music['music_id']}.{$music['music_ext']}&quot;;
		$database-&gt;database_query(&quot;DELETE FROM se_music WHERE music_id='{$music_id}' LIMIT 1&quot;);
		if( file_exists($music_file) )
			unlink($music_file);
	}
	return TRUE;
}</pre>
<blockquote><p>Данную статью Вы также можете скачать в формате doc:<br />
<a href="http://statprog.ru/wp-content/copy_music_SocialEngine_Excalibur_2.rar">скачать</a></p></blockquote>
<blockquote><p><strong>Автор:<em> Евтеев Евгений Александрович</em></strong></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2009/09/13/kopirovanie-muzyki-u-druzej-v-socialengine-excalibur-chast-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Плагин музыка &#8212; копирование музыки у друзей в SocialEngine Excalibur</title>
		<link>http://statprog.ru/2009/08/30/plagin-muzyka-kopirovanie-muzyki-u-druzej-v-socialengine-excalibur</link>
		<comments>http://statprog.ru/2009/08/30/plagin-muzyka-kopirovanie-muzyki-u-druzej-v-socialengine-excalibur#comments</comments>
		<pubDate>Sun, 30 Aug 2009 04:37:40 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Excalibur]]></category>
		<category><![CDATA[SocialEngine]]></category>
		<category><![CDATA[музыка social engine]]></category>
		<category><![CDATA[Плагин музыка]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=349</guid>
		<description><![CDATA[В этой статье поговорим о плагине “Музыка”, а именно о копировании музыки у друзей. А что тут говорить, такой возможности в плагине “Музыка” нет, так вот я покажу, как в несколько шагов реализовать такую возможность. Так сказать модифицируем плагин Музыка такие образом, чтобы он поддерживал возможность Копирование музыки у друзей. Копирование музыки у друзей Сначала [...]]]></description>
			<content:encoded><![CDATA[<p>В этой статье поговорим о плагине “<strong>Музыка</strong>”, а именно о копировании музыки у друзей. А что тут говорить, такой возможности в плагине “Музыка” нет, так вот я покажу, как в несколько шагов реализовать такую возможность. Так сказать модифицируем плагин Музыка такие образом, чтобы он поддерживал возможность <strong>Копирование музыки у друзей</strong>.<span id="more-349"></span></p>
<h2>Копирование музыки у друзей</h2>
<p>Сначала необходимо добавить еще одно поле в таблицу «se_music», где хранятся записи о добавленным песнях. Выполним sql-запрос:</p>
<pre class="brush: sql; title: ; notranslate">ALTER TABLE `se_music` ADD `owner_user_id` text AFTER `music_user_id`</pre>
<p>Для работы функции «is_already_music()», которая возвращает логическую ложь в том случае, если у участника нет данной песни в его коллекции, пропишем ее в класс «user».</p>
<ol>
<li><strong>Открыть: class_user.php</strong><br />
<strong>Подсказка:</strong> Данный файл находится в папке include.<br />
<strong>Найти</strong><br />
<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть. Данная часть кода находится внутри функции user_message_view ().</p>
<pre class="brush: php; title: ; notranslate">return array
    (
      'collaborators' =&gt; &amp;$collaborators,
      'pms'           =&gt; &amp;$pms
    );
  }
</pre>
<p><strong>Добавить после</strong></p>
<p><strong>Подсказка:</strong> Добавьте эти строки на новой строке после ранее найденных строк.</p>
<pre class="brush: php; title: ; notranslate">function is_already_music($music_id)
{
	global $database;

	$music_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT owner_user_id FROM se_music WHERE music_id='{$music_id}' LIMIT 1&quot;));
	$owner_user_id = $music_tb[owner_user_id];

	if(substr_count($owner_user_id, $this-&gt;user_info['user_id']) == 0)
		return 0;
	else
		return 1;
	return 1;
}
</pre>
<p>Далее уже будем работать с файлами, отвечающими за вывод и добавление музыки.</li>
<li><strong>Открыть</strong>: <strong>class_music.php</strong><br />
<strong>Найти</strong><br />
<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть. Данная часть кода находится внутри функции music_list ().</p>
<pre class="brush: php; title: ; notranslate">if( $this-&gt;user_id ) $sql .= &quot;
      WHERE
        se_music.music_user_id='{$this-&gt;user_id}'
    &quot;;
</pre>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php; title: ; notranslate">if( $this-&gt;user_id ) $sql .= &quot;
      WHERE
        se_music.music_user_id='{$this-&gt;user_id}' OR FIND_IN_SET('{$this-&gt;user_id}', owner_user_id)&quot;;</pre>
</li>
<li><strong>Открыть</strong><strong>: browse_music.php</strong><br />
<strong>Найти </strong><br />
<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php; title: ; notranslate">$music_object = new se_music();</pre>
<p><strong>Добавить</strong></p>
<p><strong>Подсказка:</strong> Добавьте эти строки на новой строке перед ранее найденными строками.</p>
<pre class="brush: php; title: ; notranslate">$music_id = $_GET['music_id'];
if( $_GET['task'] == &quot;copy&quot; &amp;&amp; $music_id &gt; 0)
{
	ob_end_clean();

	$music_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT owner_user_id FROM se_music WHERE music_id='{$music_id}' LIMIT 1&quot;));
	$owner_user_id = trim($music_tb[owner_user_id]);

	if(strrchr($owner_user_id, ','))
	{
		$owner_user_id_text = explode(',', $owner_user_id);
		$owner_user_id_update = &quot;&quot;;
		foreach($owner_user_id_text as $owner_user_id)
		{
			if($owner_user_id != $user-&gt;user_info['user_id'])
				$owner_user_id_update = $owner_user_id_update . &quot;&quot; . $owner_user_id . &quot;,&quot;;
		}
		$owner_user_id_update = $owner_user_id_update . &quot;&quot; . $user-&gt;user_info['user_id'];
	}
	else
	{
		if($owner_user_id == $user-&gt;user_info['user_id'] || strlen($owner_user_id) == 0)
			$owner_user_id_update = $user-&gt;user_info['user_id'];
		if( strlen($owner_user_id) &gt; 0 )
			$owner_user_id_update = $owner_user_id . &quot;,&quot; . $user-&gt;user_info['user_id'];
	}
	$database-&gt;database_query(&quot;UPDATE `se_music` SET `owner_user_id` = '{$owner_user_id_update}' WHERE `music_id` = '{$music_id}' LIMIT 1&quot;);
}</pre>
</li>
<li><strong>Открыть</strong><strong>: user_music.php</strong><br />
<strong>Найти </strong><br />
<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php; title: ; notranslate">$musiclist = $music-&gt;music_list();</pre>
<p><strong>Добавить</strong></p>
<p><strong>Подсказка:</strong> Добавьте эти строки на новой строке перед ранее найденными строками.</p>
<pre class="brush: php; title: ; notranslate">if( $task == &quot;removesong&quot; &amp;&amp; $music_id &gt; 0)
{
	ob_end_clean();

	$music_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT owner_user_id FROM se_music WHERE music_id='{$music_id}' LIMIT 1&quot;));
	$owner_user_id = $music_tb[owner_user_id];

	if(strrchr($owner_user_id, ','))
	{
		$owner_user_id_text = explode(',', $owner_user_id);
		$owner_user_id_db = &quot;&quot;;
		foreach($owner_user_id_text as $owner_user_id)
		{
			if($owner_user_id != $user-&gt;user_info['user_id'])
				$owner_user_id_db = $owner_user_id_db . &quot;&quot; . $owner_user_id . &quot;,&quot;;
		}
		$owner_user_id_db = trim(substr_replace($owner_user_id_db, &quot;&quot;, strlen($owner_user_id_db) - 1));
	}
	else
	{
		if($owner_user_id == $user-&gt;user_info['user_id'])
			$owner_user_id_text = '';
	}
	$database-&gt;database_query(&quot;UPDATE `se_music` SET `owner_user_id` = '{$owner_user_id_db}' WHERE `music_id` = '{$music_id}' LIMIT 1&quot;);
}
</pre>
</li>
<li><strong>Открыть</strong><strong>: <span>browse_music.tpl</span></strong><br />
<strong>Найти </strong><br />
<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php; title: ; notranslate">{if $user-&gt;user_exists &amp;&amp; $user-&gt;level_info.level_music_allow_downloads}&lt;/pre&gt;
&lt;div style=&quot;margin-top: 4px;&quot;&gt;&lt;a type=&quot;application/force-download&quot; href=&quot;{$media_path}&quot;&gt;{lang_print id=4000095}&lt;/a&gt;&lt;/div&gt;
&lt;pre&gt;
        {/if}
</pre>
<p><strong>Добавить после</strong><br />
 <strong>Подсказка:</strong> Добавьте эти строки на новой строке после ранее найденных строк.</p>
<pre class="brush: php; title: ; notranslate">
{if $user-&gt;user_friended($browse_music_list[browse_music_list_loop].user_id, 1) &amp;&amp; $user-&gt;is_already_music($browse_music_list[browse_music_list_loop].music_id) == 0}&lt;/pre&gt;
&lt;div style=&quot;font-weight: bold; font-size: 8pt; text-align: right;&quot;&gt;&lt;a title=&quot;Скопировать музыку к себе&quot; href=&quot;browse_music.php?task=copy&amp;music_id={$browse_music_list[browse_music_list_loop].music_id}&quot;&gt;Копировать&lt;/a&gt;&lt;/div&gt;
&lt;pre&gt;
 {/if}
</pre>
</li>
<li><strong>Открыть</strong><strong>: user_music.tpl</strong><br />
<strong>Найти </strong><br />
<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php; title: ; notranslate">{assign var='media_dir' value=$url-&gt;url_userdir($user-&gt;user_info.user_id)}
{section name=music_loop loop=$musiclist}
</pre>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php; title: ; notranslate">{section name=music_loop loop=$musiclist}
      {assign var='media_dir' value=$url-&gt;url_userdir($musiclist[music_loop].music_user_id)}
</pre>
<p><strong>Найти </strong></p>
<p><strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php; title: ; notranslate">&lt;input type=&quot;checkbox&quot; name=&quot;delete_music_{$musiclist[music_loop].music_id}&quot; value=&quot;1&quot; /&gt;</pre>
<p><strong>Заменить</strong><strong> </strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php; title: ; notranslate">{if $musiclist[music_loop].music_user_id == $user-&gt;user_info.user_id}&lt;input type=&quot;checkbox&quot; name=&quot;delete_music_{$musiclist[music_loop].music_id}&quot; value=&quot;1&quot; /&gt;{/if}</pre>
<p><strong>Найти </strong></p>
<p><strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php; title: ; notranslate">&lt;span class=&quot;seMusicTitleEdit&quot;&gt; (&lt;a onclick=&quot;SocialEngine.Music.editMusicTitle({$musiclist[music_loop].music_id});&quot; href=&quot;javascript:void(0);&quot;&gt;{lang_print id=187}&lt;/a&gt;)&lt;/span&gt;</pre>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php; title: ; notranslate">{if $musiclist[music_loop].music_user_id == $user-&gt;user_info.user_id}&lt;span class=&quot;seMusicTitleEdit&quot;&gt; (&lt;a onclick=&quot;SocialEngine.Music.editMusicTitle({$musiclist[music_loop].music_id});&quot; href=&quot;javascript:void(0);&quot;&gt;{lang_print id=187}&lt;/a&gt;)&lt;/span&gt;{/if}</pre>
<p>&nbsp;</p>
<p><strong>Найти </strong></p>
<p><strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php; title: ; notranslate">&lt;span class=&quot;seMusicDelete&quot;&gt;&lt;a onclick=&quot;SocialEngine.Music.deleteMusic({$musiclist[music_loop].music_id});&quot; href=&quot;javascript:void(0);&quot;&gt;{lang_print id=155}&lt;/a&gt; &lt;/span&gt;</pre>
<p><strong>Заменить</strong><strong> </strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php; title: ; notranslate">{if $musiclist[music_loop].music_user_id == $user-&gt;user_info.user_id}
&lt;span class=&quot;seMusicDelete&quot;&gt;&lt;a onclick=&quot;SocialEngine.Music.deleteMusic({$musiclist[music_loop].music_id});&quot; href=&quot;javascript:void(0);&quot;&gt;{lang_print id=155}&lt;/a&gt; &lt;/span&gt;
{else}
&lt;span class=&quot;seMusicDelete&quot;&gt;&lt;a href=&quot; user_music.php?task=removesong&amp;music_id={$musiclist[music_loop].music_id}&quot;&gt;{lang_print id=155}&lt;/a&gt; &lt;/span&gt;
{/if}
</pre>
</li>
</ol>
<p>Готово! Теперь на странице «browse_music.php» напротив музыки будет показана ссылка «Копировать» в том случае, если ее нет у участника. На странице «user_music.php» можно будет удалить музыку, которую скопировали от друзей.</p>
<blockquote><p>Если удобнее читать данную статью в программе Word, можно скачать по ссылке <a title="Плагин музыка – копирование музыки у друзей в SocialEngine Excalibur" href="http://statprog.ru/wp-content/kopirovanie-muzyki.rar" target="_blank">Плагин музыка – копирование музыки у друзей в SocialEngine Excalibur</a></p></blockquote>
<blockquote><p><strong>Автор:<em> Евтеев Евгений Александрович</em></strong></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2009/08/30/plagin-muzyka-kopirovanie-muzyki-u-druzej-v-socialengine-excalibur/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Вывод новых групп на главной странице (home.php) в SocialEngine</title>
		<link>http://statprog.ru/2009/08/22/vyvod-novyx-grupp-na-glavnoj-stranice-home-php-v-socialengine</link>
		<comments>http://statprog.ru/2009/08/22/vyvod-novyx-grupp-na-glavnoj-stranice-home-php-v-socialengine#comments</comments>
		<pubDate>Sat, 22 Aug 2009 18:58:08 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[SocialEngine]]></category>
		<category><![CDATA[Вывод новых групп]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=346</guid>
		<description><![CDATA[В плагине Группы как оказалось нет поддержки вывода последних созданных групп на главной на странице home.php, при нажатии на вкладку Группы система думает, а думает о том, зачем Вы на меня кликнули, если меня НЕТ!!! Чтобы при нажатии на эту вкладку отображались группы сначала скачиваем архив ajax_get_recentgroup.rar Разархивируем все файлы как они находятся в архиве [...]]]></description>
			<content:encoded><![CDATA[<p>В плагине Группы как оказалось нет поддержки вывода последних созданных групп на главной на странице home.php, при нажатии на вкладку <strong>Группы</strong> система думает, а думает о том, зачем Вы на меня кликнули, если меня НЕТ!!!</p>
<p>Чтобы при нажатии на эту вкладку отображались группы сначала скачиваем архив <a href="http://statprog.ru/wp-content/ajax_get_recentgroup.rar"> ajax_get_recentgroup.rar</a></p>
<p>Разархивируем все файлы как они находятся в архиве в каталог с установленным SocialEngine, т.е. файл ajax_get_recentgroup.php в главную папку, а ajax_get_recentgroup.tpl в каталог templates (ваш шаблон).</p>
<p>Все, если у Вас в файле home.tpl есть код, отвечающий за отображение вкладки &#171;Группы&#187; и групп, по нажатию на эту вкладку будут появляться новые группы.</p>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2009/08/22/vyvod-novyx-grupp-na-glavnoj-stranice-home-php-v-socialengine/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Убираем знак вопроса в ромбе в блоге в SocialEngine</title>
		<link>http://statprog.ru/2009/08/21/ubiraem-znak-voprosa-v-rombe-v-bloge-v-socialengine</link>
		<comments>http://statprog.ru/2009/08/21/ubiraem-znak-voprosa-v-rombe-v-bloge-v-socialengine#comments</comments>
		<pubDate>Fri, 21 Aug 2009 17:49:50 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[SocialEngine]]></category>
		<category><![CDATA[знак вопроса в ромбе]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=343</guid>
		<description><![CDATA[Слово блог в заголовке при просмотре какой-то записи в блоге отображается некорректно, вместо буквы Б отображается знак вопроса в ромбе. Что надо делать и как исправить данный баг? А ошибка всего лишь в одном символе, которого нет в файле языка. В файле языка была запись: 1500125:=%1$ Блог &#8212; %2$s Посмотрите на %1$ Мы видим, что [...]]]></description>
			<content:encoded><![CDATA[<p>Слово блог в заголовке при просмотре какой-то записи в блоге отображается некорректно, вместо буквы Б отображается знак вопроса в ромбе.<br />
Что надо делать и как исправить данный баг?<span id="more-343"></span></p>
<p>А ошибка всего лишь в одном символе, которого нет в файле языка.<br />
В файле языка была запись:<br />
<strong>1500125:=%1$ Блог &#8212; %2$s</strong><br />
Посмотрите на<br />
<strong>%1$</strong><br />
Мы видим, что здесь нет символа <strong>s</strong>.</p>
<p>Исправляем и у нас получается:<br />
<strong>1500125:=%1$s Блог &#8212; %2$s</strong></p>
<p>Мне понадобилось это изменить в базе данных, нашел данную запись по запросу</p>
<pre class="brush: sql; title: ; notranslate">SELECT * FROM `se_languagevars` WHERE `languagevar_id` = 1500125</pre>
<p>Находите и исправляете на правильную запись:<br />
<strong>%1$s Блог &#8212; %2$s</strong></p>
<p>Все! Любуемся красотой Вашего блога!</p>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2009/08/21/ubiraem-znak-voprosa-v-rombe-v-bloge-v-socialengine/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Добавление фотографии к участникам в блоке &#8216;Сейчас на сайте&#8217; в SocialEngine Excalibur</title>
		<link>http://statprog.ru/2009/08/21/dobavlenie-fotografii-k-uchastnikam-v-bloke-sejchas-na-sajte-v-socialengine-excalibur</link>
		<comments>http://statprog.ru/2009/08/21/dobavlenie-fotografii-k-uchastnikam-v-bloke-sejchas-na-sajte-v-socialengine-excalibur#comments</comments>
		<pubDate>Fri, 21 Aug 2009 17:11:32 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Excalibur]]></category>
		<category><![CDATA[SocialEngine]]></category>
		<category><![CDATA[Сейчас на сайте]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=340</guid>
		<description><![CDATA[В движке SocialEngine в блоке &#8216;Сейчас на сайте&#8216; отображаются имя и фамилия участников, которые в данный момент находятся на сайте. Отображение только этих данных как-то ухудшают видимость этого блока, с помощью внедрения в код нескольких строчек и в этом блоке будет отображаться и фотография участника наряду с именем и фамилией. Что для этого нужно сделать? [...]]]></description>
			<content:encoded><![CDATA[<p>В движке <strong>SocialEngine</strong> в блоке &#8216;<strong>Сейчас на сайте</strong>&#8216; отображаются имя и фамилия участников, которые в данный момент находятся на сайте. Отображение только этих данных как-то ухудшают видимость этого блока, с помощью внедрения в код нескольких строчек и в этом блоке будет отображаться и фотография участника наряду с именем и фамилией.</p>
<p>Что для этого нужно сделать?<span id="more-340"></span></p>
<ol>
<li><strong>Открыть: functions_general.php</strong>
<p><strong>Подсказка:</strong> Данный файл находится в папке include.</p>
<p><strong>Найти</strong></p>
<p><strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть. Данная строка находится внутри функции online_users().</p>
<pre class="brush: php; title: ; notranslate">$online_user-&gt;user_info['user_displayname'] = $online_user_info['user_displayname'];</pre>
<p><strong>Добавить после</strong></p>
<p><strong>Подсказка:</strong> Добавьте эти строки на новой строке после ранее найденных строк.</p>
<pre class="brush: php; title: ; notranslate">$view_user_photo = $database-&gt;database_query(&quot;SELECT user_id, user_photo FROM se_users WHERE user_id='&quot; . $online_user_info['user_id'] . &quot;' LIMIT 1&quot;);

$views_user_photo = $database-&gt;database_fetch_assoc($view_user_photo);

$online_user-&gt;user_info['user_photo'] = $views_user_photo['user_photo'];</pre>
</li>
<li><strong>Открыть:</strong> <strong>user_home.tpl</strong>
<p>	<strong>Найти</strong></p>
<pre class="brush: php; title: ; notranslate">&lt;a href='{$url-&gt;url_create(&quot;profile&quot;, $online_users[0][online_loop]-&gt;user_info.user_username)}'&gt;{$online_users[0][online_loop]-&gt;user_displayname}&lt;/a&gt;</pre>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php; title: ; notranslate">&lt;center&gt;&lt;img class='reflect' src='{$online_users[0][online_loop]-&gt;user_photo(&quot;./images/nophoto.gif&quot;)}' border='0'&gt;&lt;br&gt; &lt;a href='{$url-&gt;url_create(&quot;profile&quot;, $online_users[0][online_loop]-&gt;user_info.user_username)}'&gt;{$online_users[0][online_loop]-&gt;user_displayname}&lt;/a&gt;&lt;/center&gt;</pre>
</li>
</ol>
<blockquote><p><strong>Автор:<em> Евтеев Евгений Александрович</em></strong></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2009/08/21/dobavlenie-fotografii-k-uchastnikam-v-bloke-sejchas-na-sajte-v-socialengine-excalibur/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Улучшенный поиск по группам в SocialEngine Excalibur</title>
		<link>http://statprog.ru/2009/08/15/uluchshennyj-poisk-po-gruppam-v-socialengine-excalibur</link>
		<comments>http://statprog.ru/2009/08/15/uluchshennyj-poisk-po-gruppam-v-socialengine-excalibur#comments</comments>
		<pubDate>Sat, 15 Aug 2009 14:54:44 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Excalibur]]></category>
		<category><![CDATA[SocialEngine]]></category>
		<category><![CDATA[группы]]></category>
		<category><![CDATA[Улучшенный поиск]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=338</guid>
		<description><![CDATA[В этой статье я расскажу, как сделать поиск по группам с такими параметрами как точный и приблизительный поиск с поиском по названию, описанию и лидеру группы. Сделать это очень просто: несколько строчек кода на php, пару sql-запросов и несколько полей в html. Выполним пару действий шаг за шагом: Открыть: browse_groups.php Найти Подсказка: Возможно, здесь приведена [...]]]></description>
			<content:encoded><![CDATA[<p>В этой статье я расскажу, как сделать поиск по группам с такими параметрами как точный и приблизительный <strong>поиск</strong> с поиском по названию, описанию и лидеру <strong>группы</strong>. Сделать это очень просто: несколько строчек кода на <strong>php</strong>, пару <strong>sql-запросов</strong> и несколько полей в <strong>html</strong>.<span id="more-338"></span></p>
<p>Выполним пару действий шаг за шагом:</p>
<ol>
<li><strong>Открыть: browse_groups.</strong><strong>php</strong><br />
	<strong>Найти</strong><br />
	<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php; title: ; notranslate">
		else
		{
			$where .= &quot; AND se_groups.group_groupcat_id='{$groupcat['groupcat_id']}'&quot;;
			$groupsubcat = $groupcat;
			$groupcat = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT groupcat_id, groupcat_title FROM se_groupcats WHERE groupcat_id='{$groupcat['groupcat_dependency']}' LIMIT 1&quot;));
		}
	}
}</pre>
<p><strong>Добавить после</strong></p>
<p><strong>Подсказка:</strong> Добавьте эти строки на новой строке после ранее найденных строк.</p>
<pre class="brush: php; title: ; notranslate">//GROUPS SEARCH
if(isset($_POST['submit']) &amp;&amp; $_POST['field_search'] != '')
{
	if($_POST['type_search2'] == 0)
		$search_f = &quot;group_title&quot;;
	elseif($_POST['type_search2'] == 1)
		$search_f = &quot;group_desc&quot;;
	else
	{
		$user_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT user_id FROM se_users WHERE user_fname LIKE '%&quot; . $_POST['field_search'] . &quot;%' LIMIT 1&quot;));
		$_POST['field_search'] = $user_tb[user_id];
		$search_f = &quot;group_user_id&quot;;
	}

	if($_POST['type_search'] == 1)
		$search_f2 = &quot;= '&quot; . $_POST['field_search'] . &quot;'&quot;;
	else
		$search_f2 = &quot;LIKE '%&quot; . $_POST['field_search'] . &quot;%'&quot;;

	$where .= &quot; AND se_groups.{$search_f} {$search_f2}&quot;;
}

//END GROUPS SEARCH</pre>
</li>
<li><strong>Открыть: browse_groups.tpl</strong><strong>Найти</strong>
<pre class="brush: php; title: ; notranslate">&lt;div style='text-align: center; line-height: 12pt; margin-top: 5px;'&gt;
{lang_print}&amp;nbsp;
&lt;select class='group_small' name='s' onchange=&quot;window.location.href='browse_groups.php?v={$v}&amp;s='+this.options[this.selectedIndex].value;&quot;&gt;
&lt;option value='group_totalmembers DESC'{if $s == &quot;group_totalmembers DESC&quot;} SELECTED{/if}&gt;{lang_print}&lt;/option&gt;
&lt;option value='group_datecreated DESC'{if $s == &quot;group_datecreated DESC&quot;} SELECTED{/if}&gt;{lang_print id=2000130}&lt;/option&gt;
&lt;/select&gt;
&lt;/div&gt;
&lt;/div&gt;</pre>
<p><strong>Добавить после</strong></p>
<p><strong>Подсказка:</strong> Добавьте эти строки на новой строке после ранее найденных строк.</p>
<pre class="brush: xml; title: ; notranslate">&lt;form action='browse_groups.php' method='post'&gt;
&lt;div style='margin-top: 10px; padding: 10px; background: #F2F2F2; border: 1px solid #BBBBBB; font-weight: bold;'&gt;
&lt;div style='text-align: center; line-height: 12pt;'&gt;Поиск групп:&lt;/div&gt;
&lt;div style='text-align: left; line-height: 12pt; margin-top: 5px; border: 1px solid #BBBBBB;'&gt;
&lt;input type='radio' name='type_search' value='1' CHECKED&gt;Точный поиск
&lt;br&gt;
&lt;input type='radio' name='type_search' value='0'&gt;Приблизительный
&lt;/div&gt;
&lt;div style='text-align: left; line-height: 12pt; margin-top: 5px; border: 1px solid #BBBBBB;'&gt;
&lt;input type='radio' name='type_search2' value='0' CHECKED&gt;По названию
&lt;br&gt;
&lt;input type='radio' name='type_search2' value='1'&gt;По описанию
&lt;br&gt;
&lt;input type='radio' name='type_search2' value='2'&gt;По лидеру
&lt;/div&gt;
&lt;div style='text-align: center; line-height: 12pt; margin-top: 5px; '&gt;
&lt;input type='input' name='field_search' value='' style='width: 180px;'&gt;
&lt;br&gt;&lt;br&gt;
&lt;input type='submit' name='submit' value='Выполнить поиск'&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/form&gt;</pre>
</li>
</ol>
<p>После выполнения этих простых действий на странице обзора групп появятся новые поля для лучшего поиска групп по различным критериям.</p>
<blockquote><p><strong>Автор:<em> Евтеев Евгений Александрович</em></strong></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2009/08/15/uluchshennyj-poisk-po-gruppam-v-socialengine-excalibur/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Добавление полей страна, регион и город в расширенный поиск в SocialEngine Excalibur</title>
		<link>http://statprog.ru/2009/08/15/dobavlenie-polej-strana-region-i-gorod-v-rasshirennyj-poisk-v-socialengine-excalibur</link>
		<comments>http://statprog.ru/2009/08/15/dobavlenie-polej-strana-region-i-gorod-v-rasshirennyj-poisk-v-socialengine-excalibur#comments</comments>
		<pubDate>Sat, 15 Aug 2009 09:56:37 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Excalibur]]></category>
		<category><![CDATA[SocialEngine]]></category>
		<category><![CDATA[Добавление полей в SocialEngine]]></category>
		<category><![CDATA[расширенный поиск]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=332</guid>
		<description><![CDATA[В прошлой статье я рассказал Вам о решении проблемы с добавлением полей страна, регион и город в профиль в движок SocialEngine Excalibur, сегодня мы добавим эти поля в расширенный поиск – это тоже немало важный апгрейд. Написание этой статьи меня подтолкнул вопрос, зачем нужны поля страна, регион и город в профиле участника, если нет возможности [...]]]></description>
			<content:encoded><![CDATA[<p>В прошлой статье я рассказал Вам о решении проблемы с добавлением полей <strong>страна</strong>, <strong>регион</strong> и <strong>город</strong> в профиль в <strong>движок</strong> <strong>SocialEngine Excalibur</strong>, сегодня мы добавим эти поля в <strong>расширенный поиск</strong> – это тоже немало важный апгрейд. Написание этой статьи меня подтолкнул вопрос, зачем нужны поля <strong>страна</strong>, <strong>регион</strong> и <strong>город</strong> в профиле участника, если нет возможности найти участников, используя данные поля?<span id="more-332"></span></p>
<p>Для добавления данных полей необходимо выполнить пару шагов:</p>
<ol>
<li>
<strong>Открыть: search_advanced.php</strong></p>
<p><strong>Найти</strong></p>
<p><strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php; title: ; notranslate">$search_query = &quot;SELECT se_users.user_id, se_users.user_username, se_users.user_fname, se_users.user_lname, se_users.user_photo
FROM se_profilevalues LEFT JOIN se_users ON se_profilevalues.profilevalue_user_id=se_users.user_id
LEFT JOIN se_levels ON se_levels.level_id=se_users.user_level_id
WHERE se_users.user_profilecat_id='{$cat_selected}' AND se_users.user_verified='1' AND se_users.user_enabled='1' AND (se_users.user_search='1' OR se_levels.level_profile_search='0')&quot;;

if($user_online == 1) {
	$search_query .= &quot; AND user_lastactive&gt;'&quot;.(time()-10*60).&quot;' AND user_invisible=0&quot;;
}

if($user_withphoto == 1) {
	$search_query .= &quot; AND user_photo &lt;&gt; ''&quot;;
}

if($field-&gt;field_query != &quot;&quot;) {
	$search_query .= &quot; AND &quot;.$field-&gt;field_query;
}</pre>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php; title: ; notranslate">$search_query = &quot;SELECT se_users.user_id, se_users.user_username, se_users.user_fname, se_users.user_lname, se_users.user_photo
FROM se_profilevalues LEFT JOIN se_users ON se_profilevalues.profilevalue_user_id=se_users.user_id
LEFT JOIN se_levels ON se_levels.level_id=se_users.user_level_id
LEFT JOIN cites_profilevalues ON se_profilevalues.profilevalue_user_id=cites_profilevalues.profilevalue_id
WHERE se_users.user_profilecat_id='{$cat_selected}' AND se_users.user_verified='1' AND se_users.user_enabled='1' AND (se_users.user_search='1' OR se_levels.level_profile_search='0')&quot;;

if($user_online == 1) {
	$search_query .= &quot; AND user_lastactive&gt;'&quot;.(time()-10*60).&quot;' AND user_invisible=0&quot;;
}

if($user_withphoto == 1)
	$search_query .= &quot; AND user_photo &lt;&gt; ''&quot;;

if($field-&gt;field_query != &quot;&quot;)
	$search_query .= &quot; AND se_profilevalues.&quot;.$field-&gt;field_query;

if(isset($_POST['dhtmlgoodies_country']) &amp;&amp; $_POST['dhtmlgoodies_country'] &gt; 0)
	$search_query .= &quot; AND cites_profilevalues.profilevalue_7 = '&quot; . $_POST['dhtmlgoodies_country'] . &quot;'&quot;;

if(isset($_POST['dhtmlgoodies_region']) &amp;&amp; $_POST['dhtmlgoodies_region'] &gt; 0)
	$search_query .= &quot; AND cites_profilevalues.profilevalue_8 = '&quot; . $_POST['dhtmlgoodies_region'] . &quot;'&quot;;

if(isset($_POST['dhtmlgoodies_city']) &amp;&amp; $_POST['dhtmlgoodies_city'] &gt; 0)
	$search_query .= &quot; AND cites_profilevalues.profilevalue_9 = '&quot; . $_POST['dhtmlgoodies_city'] . &quot;'&quot;;</pre>
<p><strong>Найти</strong></p>
<p><strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php; title: ; notranslate">	// SET GLOBAL PAGE TITLE
	$global_page_title[0] = 926;
	$global_page_description[0] = 1088;
}</pre>
<p><strong>Добавить после</strong></p>
<p><strong>Подсказка:</strong> Добавьте эти строки на новой строке после ранее найденных строк.</p>
<pre class="brush: php; title: ; notranslate">// GET COUNTRY, REGION AND CITY
$sql = $database-&gt;database_query (&quot;SELECT * FROM country&quot;);
while ($country_bd = $database-&gt;database_fetch_assoc ($sql))
{
	if(isset($_POST['dhtmlgoodies_country']) &amp;&amp; $country_bd[country_id] == $_POST['dhtmlgoodies_country'])
		$country_sel = &quot; SELECTED&quot;;
	else
		$country_sel = &quot;&quot;;

	$country .= &quot;&lt;option value='&quot; . $country_bd[country_id] . &quot;'&quot; . $country_sel . &quot;'&quot; . $country_bd[name] . &quot;&lt;/option&gt;\n&quot;;
}

if(isset($_POST['dhtmlgoodies_region']))
{
	$region_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(«SELECT region_id, name FROM region WHERE region_id=’».$_POST['dhtmlgoodies_region'].»‘ LIMIT 1?));
	if(strlen($region_tb[name]) &gt; 1)
		$region .= &quot;&lt;option value='&quot; . $region_tb[region_id] . &quot;' SELECTED'&quot; . $region_tb[name] . &quot;&lt;/option&gt;\n&quot;;
}

if(isset($_POST['dhtmlgoodies_city']))
{
	$city_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT city_id, name FROM city WHERE city_id='&quot;.$_POST['dhtmlgoodies_city'].&quot;' LIMIT 1&quot;));
	if(strlen($city_tb[name]) &gt; 1)
		$city .= &quot;&lt;option value='&quot; . $city_tb[city_id] . &quot;' SELECTED&gt;» . $city_tb[name] . &quot;&lt;/option&gt;\n&quot;;
}

$smarty-&gt;assign('country', $country);
$smarty-&gt;assign('region', $region);
$smarty-&gt;assign('city', $city);
// END GET COUNTRY, REGION AND CITY</pre>
</li>
<li><strong>Открыть: search_advanced.tpl</strong>
<p><strong>Найти</strong></p>
<pre class="brush: xml; title: ; notranslate">&lt;/div&gt;
{/section}
{/section}
{/section}</pre>
<p><strong>Добавить после</strong><br />
<strong>Подсказка:</strong> Добавьте эти строки на новой строке после ранее найденных строк.</p>
<pre class="brush: xml; title: ; notranslate">&lt;table cellpadding='0' cellspacing='0' style='padding-top: 5px;'&gt;
&lt;tr&gt;&lt;td&gt;
&lt;div style='font-weight: bold; margin-top: 5px;'&gt;Страна проживания&lt;/div&gt;
&lt;select name='dhtmlgoodies_country' id='dhtmlgoodies_country' onchange=&quot;getRegionList(this.value);&quot;&gt;
&lt;option id='op' value='-1'&gt;[ Страна ]&lt;/option&gt;
{$country}&lt;/select&gt;
&lt;/div&gt;
&lt;div style='font-weight: bold; margin-top: 5px;'&gt;Регион проживания&lt;/div&gt;
&lt;select name='dhtmlgoodies_region' id='dhtmlgoodies_region' onchange=&quot;getCityList(this.value);&quot;&gt;
&lt;option id='op' value='-1'&gt;[ Регион ]&lt;/option&gt;
{$region}&lt;/select&gt;
&lt;/div&gt;
&lt;div style='font-weight: bold; margin-top: 5px;'&gt;Город проживания&lt;/div&gt;
&lt;select name='dhtmlgoodies_city' id='dhtmlgoodies_city'&gt;
&lt;option id='op' value='-1'&gt;[ Город ]&lt;/option&gt;
{$city}&lt;/select&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</pre>
</li>
</ol>
<p>Все! Найти участников теперь можно по стране, региону и городу проживания.</p>
<p><a href="http://statprog.ru/wp-content/dobavlenie-polyei-strana-region-i-gorod-v-rasshirennyi-poisk-v-SocialEngine-Ekskalibur.rar">Скачать статью в формате word (.doc)</a></p>
<p>Вы ожидали больше шагов? Извините, что все так просто. Если у Вас возникнут вопросы, пишите, разберемся.</p>
<blockquote><p><strong>Автор: <em>Евтеев Евгений Александрович</em></strong></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2009/08/15/dobavlenie-polej-strana-region-i-gorod-v-rasshirennyj-poisk-v-socialengine-excalibur/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Добавление полей страна, регион и город в SocialEngine Excalibur</title>
		<link>http://statprog.ru/2009/08/12/dobavlenie-stran-regionov-i-gorodov-v-socialengine-excalibur</link>
		<comments>http://statprog.ru/2009/08/12/dobavlenie-stran-regionov-i-gorodov-v-socialengine-excalibur#comments</comments>
		<pubDate>Wed, 12 Aug 2009 10:50:32 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Excalibur]]></category>
		<category><![CDATA[SocialEngine]]></category>
		<category><![CDATA[Добавление полей в SocialEngine]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=321</guid>
		<description><![CDATA[Мне и моему другу захотелось создать свою социальную сеть, перебрали множество движков и остановились на SocialEngine Excalibur 3.15. По нашему мнению, SocialEngine Excalibur &#8212; это отличный движок для создания своей социальной сети, множество настроек, плагинов, но самое главное &#8212; серьезно мощный и простой в понимании код скриптов. Если имеются знания в таких языках как html, [...]]]></description>
			<content:encoded><![CDATA[<p>Мне и моему другу захотелось создать свою социальную сеть, перебрали множество движков и остановились на <strong>SocialEngine Excalibur 3.15</strong>. По нашему мнению, <strong>SocialEngine Excalibur</strong> &#8212; это отличный движок для создания своей социальной сети, множество настроек, плагинов, но самое главное &#8212; серьезно мощный и простой в понимании код скриптов. Если имеются знания в таких языках как html, php и JavaScript, можно с легкостью переписать код скриптов <strong>SocialEngine</strong> под свои нужды.<span id="more-321"></span></p>
<p>У нас возникла проблема, когда необходимо было добавить новые поля в профиль участника: <strong>страну</strong>, <strong>регион</strong> и <strong>город</strong>. В скрипте <strong>SocialEngine Excalibur</strong>, который имеется у нас, была база с этими данными, в файлах присутствовал код, ответственен за работу с данными полями. Но возник вопрос, почему при редактировании профиля не было этих полей?</p>
<p>Сначала искали ответ на этот вопрос на форуме <strong>SocialEngine Excalibur</strong>, даже создали свою тему, но ответа так и не получили. Я решил, что ответ мы не получим и если получим, то не скоро. Было принято решение сделать все своими руками, применив знания программирования.</p>
<h3>SocialEngine Excalibur</h3>
<p>Для того чтобы поля «<strong>Страна</strong>», «<strong>Регион</strong>» и «<strong>Город</strong>» появились в <strong>SocialEngine Excalibur</strong> в разделе «<strong>Редактировать профиль</strong>» необходимо:</p>
<ol>
<li>Импортировать данные из файла <a href="http://statprog.ru/wp-content/cities.rar" target="_blank">cities.sql</a> в Вашу базу данных, выполнив <strong>запрос SQL</strong> или импорт файла целиком в <strong>phpmyadmin</strong>.</li>
<li><strong>Открыть: user_editprofile.tpl</strong>
<p><strong>Найти</strong></p>
<p><strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: xml; title: ; notranslate">&lt;div class='form_desc'&gt;
  {lang_print id=$fields[field_loop].field_desc}
&lt;/div&gt;

{capture assign='current_subnet'}
  {lang_print id=$user-&gt;subnet_info.subnet_name}
{/capture}

{if $fields[field_loop].field_id == $setting.setting_subnet_field1_id || $fields[field_loop].field_id == $setting.setting_subnet_field2_id}
  {lang_sprintf id=766 1=$current_subnet}
{/if}

{capture assign='field_error'}
  {lang_print id=$fields[field_loop].field_error}
{/capture}

{if $field_error != ''}
  &lt;div class='form_error'&gt;&lt;img src='./images/icons/error16.gif' border='0' class='icon'&gt; {$field_error}&lt;/div&gt;
{/if}
&lt;/td&gt;
&lt;/tr&gt;
{/section}</pre>
<p><strong>Добавить после</strong></p>
<p><strong>Подсказка:</strong> Добавьте эти строки на новой строке после ранее найденных строк.</p>
<pre class="brush: xml; title: ; notranslate">{if $cat_id == 3}
&lt;tr&gt;
&lt;td class='form1' width='150'&gt;Страна&lt;/td&gt;
&lt;td class='form2'&gt;
  &lt;div&gt;
    &lt;select name='dhtmlgoodies_country' id='dhtmlgoodies_country' onchange='getRegionList(this.value);'&gt;
      &lt;option id='op' value='-1'&gt;&lt;/option&gt;
      {$country}
    &lt;/select&gt;
  &lt;/div&gt;
  &lt;div id='dhtmlgoodies_country'&gt;
    Страна, в которой Вы в текущий момент проживаете.
  &lt;/div&gt;

  &lt;div class='form_desc'&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class='form1' width='150'&gt;Регион&lt;/td&gt;
  &lt;td class='form2'&gt;
    &lt;div&gt;
      &lt;select name='dhtmlgoodies_region' id='dhtmlgoodies_region' onchange='getCityList(this.value);'&gt;
        &lt;option id='op' value='-1'&gt;&lt;/option&gt;
        {$region}
      &lt;/select&gt;

    &lt;/div&gt;
    &lt;div id='dhtmlgoodies_region'&gt;
      Регион, в котором Вы в текущий момент проживаете.
    &lt;/div&gt;

    &lt;div class='form_desc'&gt;&lt;/div&gt;
  &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class='form1' width='150'&gt;Город&lt;/td&gt;
  &lt;td class='form2'&gt;
  &lt;div&gt;
    &lt;select name='dhtmlgoodies_city' id='dhtmlgoodies_city'&gt;
      &lt;option id='op' value='-1'&gt;&lt;/option&gt;
      {$city}
    &lt;/select&gt;
  &lt;/div&gt;
  &lt;div id='dhtmlgoodies_city'&gt;
    Город, в котором Вы в текущий момент проживаете.
  &lt;/div&gt;

  &lt;div class='form_desc'&gt;&lt;/div&gt;
  &lt;/td&gt;
&lt;/tr&gt;
{/if}</pre>
<p>Условие {if $cat_id == 3} отвечает за отображение полей только в подкатегории «Персональная информация», это нужно если Вы собираетесь создавать дополнительные подкатегории, как, например, у нас создана {$country}, {$region} и {$city} &#8212; данные, которые формируются php-скриптом в файле user_editprofile.php</li>
<li><strong>Открыть: header_global.tpl</strong>
<p><strong>Найти</strong></p>
<pre class="brush: jscript; title: ; notranslate">var countryCode = sel.options[sel.selectedIndex].value;</pre>
<p><strong>Заменить</strong><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: jscript; title: ; notranslate">var countryCode = sel;</pre>
<p><strong>Найти</strong></p>
<pre class="brush: jscript; title: ; notranslate">var regionCode = sel.options[sel.selectedIndex].value;</pre>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: jscript; title: ; notranslate">var regionCode = sel;</pre>
</li>
</ol>
<p><strong>Открыть: user_editprofile.</strong><strong>php</strong></p>
<p><strong>Найти</strong></p>
<pre class="brush: php; title: ; notranslate">if( isset($_POST['dhtmlgoodies_country']) ) {

  $country = $_POST['dhtmlgoodies_country'];
  $sql = &quot;SELECT profilevalue_7 FROM cites_profilevalues WHERE profilevalue_id=$id_ex LIMIT 1&quot;;
  if( !$database-&gt;database_query($sql) ) {
    $query = &quot;INSERT INTO cites_profilevalues (profilevalue_id, profilevalue_7) VALUES ($id_ex, '$country')&quot;;
    $database-&gt;database_query($query);
  }
  else {
    $query = &quot;UPDATE cites_profilevalues SET profilevalue_7 = '$country' WHERE cites_profilevalues.profilevalue_id = $id_ex&quot;;
    $database-&gt;database_query($query);
  }
}

if( isset($_POST['dhtmlgoodies_region']) ) {
  $region = $_POST['dhtmlgoodies_region'];

  $sql = &quot;SELECT profilevalue_8 FROM cites_profilevalues WHERE profilevalue_id=$id_ex LIMIT 1&quot;;
  if( !$database-&gt;database_query($sql) ) {
    $query = &quot;INSERT INTO cites_profilevalues (profilevalue_id, profilevalue_8) VALUES ($id_ex, '$region')&quot;;
    $database-&gt;database_query($query);
  }
  else {
    $query = &quot;UPDATE cites_profilevalues SET profilevalue_8 = '$region' WHERE cites_profilevalues.profilevalue_id = $id_ex&quot;;
    $database-&gt;database_query($query);
  }
}

if( isset($_POST['dhtmlgoodies_city']) ) {
  $city = $_POST['dhtmlgoodies_city'];

  $sql = &quot;SELECT profilevalue_9 FROM cites_profilevalues WHERE profilevalue_id = $id_ex LIMIT 1&quot;;
  if( !$database-&gt;database_query($sql) ) {
    $query = &quot;INSERT INTO cites_profilevalues (profilevalue_id, profilevalue_9) VALUES ($id_ex, '$city')&quot;;
    $database-&gt;database_query($query);
  }
  else {
    $query = &quot;UPDATE cites_profilevalues SET profilevalue_9 = '$city' WHERE cites_profilevalues.profilevalue_id = $id_ex&quot;;
    $database-&gt;database_query($query);
  }
}</pre>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php; title: ; notranslate">if( isset($_POST['dhtmlgoodies_country']) ) {

  $country = $_POST['dhtmlgoodies_country'];

  $country_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT profilevalue_id FROM cites_profilevalues WHERE profilevalue_id='&quot; . $user-&gt;user_info['user_id'] . &quot;' LIMIT 1&quot;));

  $country_id = $country_tb[profilevalue_id];

  if($country_id &lt;= 0) {
    $query = &quot;INSERT INTO cites_profilevalues (profilevalue_id, profilevalue_7) VALUES ($id_ex, '$country')&quot;;
    $database-&gt;database_query($query);
  }
  else {
    $query = &quot;UPDATE cites_profilevalues SET profilevalue_7 = '$country' WHERE cites_profilevalues.profilevalue_id = '&quot; . $user-&gt;user_info['user_id'] . &quot;'&quot;;
    $database-&gt;database_query($query);
  }
}

if( isset($_POST['dhtmlgoodies_region']) ) {
  $region = $_POST['dhtmlgoodies_region'];
  $region_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT profilevalue_id FROM cites_profilevalues WHERE profilevalue_id='&quot; . $user-&gt;user_info['user_id'] . &quot;' LIMIT 1&quot;));
  $region_id = $region_tb[profilevalue_id];

  if($region_id &lt;= 0)  {
    $query = &quot;INSERT INTO cites_profilevalues (profilevalue_id, profilevalue_8) VALUES ($id_ex, '$region')&quot;;
    $database-&gt;database_query($query);
  }
  else {
    $query = &quot;UPDATE cites_profilevalues SET profilevalue_8 = '$region' WHERE cites_profilevalues.profilevalue_id = '&quot; . $user-&gt;user_info['user_id'] . &quot;'&quot;;
    $database-&gt;database_query($query);
  }
}

if( isset($_POST['dhtmlgoodies_city']) ) {
  $city = $_POST['dhtmlgoodies_city'];
  $city_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT profilevalue_id FROM cites_profilevalues WHERE profilevalue_id='&quot; . $user-&gt;user_info['user_id'] . &quot;' LIMIT 1&quot;));
  $city_id = $city_tb[profilevalue_id];

  if($city_id &lt;= 0) {
    $query = &quot;INSERT INTO cites_profilevalues (profilevalue_id, profilevalue_9) VALUES ($id_ex, '$city')&quot;;
    $database-&gt;database_query($query);
  }
  else {
    $query = &quot;UPDATE cites_profilevalues SET profilevalue_9 = '$city' WHERE cites_profilevalues.profilevalue_id = '&quot; . $user-&gt;user_info['user_id'] . &quot;'&quot;;
    $database-&gt;database_query($query);
  }
}</pre>
<p><strong>Найти</strong></p>
<pre class="brush: php; title: ; notranslate">$sql = $database-&gt;database_query (&quot;SELECT * FROM country&quot;);
$countries = array();

while ($country = $database-&gt;database_fetch_assoc ($sql)) {
  $countries[] = $country;
}

$smarty-&gt;assign('countries', $countries);</pre>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка</strong><strong>:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php; title: ; notranslate">$country_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT profilevalue_7 FROM cites_profilevalues WHERE profilevalue_id='&quot; . $user-&gt;user_info['user_id'] . &quot;' LIMIT 1&quot;));
$country_id = $country_tb[profilevalue_7];

$sql = $database-&gt;database_query (&quot;SELECT * FROM country&quot;);
while ($country_bd = $database-&gt;database_fetch_assoc ($sql)) {

	if($country_id == $country_bd[country_id])
		$country_sel = ' SELECTED';
	else
		$country_sel = '';

	$country .= &quot;&lt;option value='&quot; . $country_bd[country_id] . &quot;'&quot; . $country_sel . &quot;&gt;&quot; . $country_bd[name] . &quot;&lt;/option&gt;\n&quot;;

}

$region_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT profilevalue_8 FROM cites_profilevalues WHERE profilevalue_id='&quot; . $user-&gt;user_info['user_id'] . &quot;' LIMIT 1?));
$region_id = $region_tb[profilevalue_8];

if($region_id &gt; 0) {
	$region_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT region_id, name FROM region WHERE region_id='&quot; . $region_id . &quot;' LIMIT 1&quot;));
	$region .= &quot;&lt;option value='&quot; . $region_tb[region_id] . &quot;' SELECTED&gt;&quot; . $region_tb[name] . &quot;&lt;/option&gt;\n&quot;;
}
else {
	$sql = $database-&gt;database_query (&quot;SELECT * FROM region&quot;);
	while ($region_bd = $database-&gt;database_fetch_assoc ($sql)) {

		if($region_id == $region_bd[region_id])
			$region_sel = ' SELECTED';
		else
			$region_sel = '';

		$region .= &quot;&lt;option value='&quot; . $region_bd[region_id] . &quot;'&quot; . $region_sel . &quot;&gt;&quot; . $region_bd[name] . &quot;&lt;/option&gt;\n&quot;;
	}
}

$city_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT profilevalue_9 FROM cites_profilevalues WHERE profilevalue_id='&quot; . $user-&gt;user_info['user_id'] . &quot;' LIMIT 1&quot;));
$city_id = $city_tb[profilevalue_9];
if($city_id &gt; 0) {
	$city_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&quot;SELECT city_id, name FROM city WHERE city_id='&quot; . $city_id . &quot;' LIMIT 1&quot;));
	$city .= &quot;&lt;option value='&quot; . $city_tb[city_id] . &quot;' SELECTED&gt;&quot; . $city_tb[name] . &quot;&lt;/option&gt;\n&quot;;
}

else {
	$sql = $database-&gt;database_query (&quot;SELECT * FROM city ORDER BY name ASC&quot;);
	while ($city_bd = $database-&gt;database_fetch_assoc($sql)) {

		if($city_id == $city_bd[city_id])
			$city_sel = ' SELECTED';
		else
			$city_sel = '';

		$city .= &quot;&lt;option value='&quot; . $city_bd[city_id] . &quot;'&quot; . $city_sel . &quot;&gt;&quot; . $city_bd[name] . &quot;&lt;/option&gt;\n&quot;;
	}
}

$smarty-&gt;assign('country', $country);
$smarty-&gt;assign('region', $region);
$smarty-&gt;assign('city', $city);</pre>
<p>Если Вы выполнили все действия правильно, то теперь участники Вашей социальной сети <strong>SocialEngine Excalibur</strong> могут указать в профиле страну, регион и город проживания.</p>
<p>Также данную статью можно <a href="http://statprog.ru/wp-content/add_country_region_city_se.rar" target="_blank">скачать</a> в формате doc.</p>
<p><strong>Автор:<em> Евтеев Евгений Александрович</em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2009/08/12/dobavlenie-stran-regionov-i-gorodov-v-socialengine-excalibur/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Реализовать алгоритм сжатия данных RLE</title>
		<link>http://statprog.ru/2009/06/02/realizovat-algoritm-szhatiya-dannyx-rle</link>
		<comments>http://statprog.ru/2009/06/02/realizovat-algoritm-szhatiya-dannyx-rle#comments</comments>
		<pubDate>Mon, 01 Jun 2009 21:35:52 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C / C++ / C#]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[RLE]]></category>
		<category><![CDATA[алгоритм сжатия данных]]></category>
		<category><![CDATA[декодирование]]></category>
		<category><![CDATA[кодирование]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=319</guid>
		<description><![CDATA[Перед написанием программы разберемся, в чем суть алгоритма RLE? Суть алгоритма состоит в том, что последовательность из n одинаковых символов k заменяется парой символов nk. Например, нужно закодировать строку “aaaaarooow”, после кодирования по алгоритму RLE получаем сжатую строку вида “5ar3ow”. Кодированная строка на 4 символа меньше, соответственно эффективность алгоритма доказана. Теперь можно приступить к реализации [...]]]></description>
			<content:encoded><![CDATA[<p>Перед написанием программы разберемся, в чем суть алгоритма <strong>RLE</strong>? Суть алгоритма состоит в том, что последовательность из n одинаковых символов k заменяется парой символов nk. Например, нужно закодировать строку “aaaaarooow”, после кодирования по алгоритму RLE получаем сжатую строку вида “5ar3ow”. Кодированная строка на 4 символа меньше, соответственно эффективность алгоритма доказана. Теперь можно приступить к реализации данного алгоритма в виде программного кода на <strong>C#</strong>.<span id="more-319"></span></p>
<p>Текст, который нужно будет кодировать, получим из текстового поля “text_input” и запишем в строковую переменную “str1”. Далее будем пробегать по каждому символу в этой строке, получать текущий символ в строковую переменную “ch”. В том случае, если данный символ равен следующему, продолжаем поиск количества таких символов, начиная текущей позиции в строке.</p>
<p>После всего этого формируем кодируемую строку равную количеству найденных символов и самому символу, которых повторяется друг за другом n-e количество раз. Если найден только один символ строка принимает значение равное этому символу.<br />
Все выше описанные операции выполняются до тех пор, пока не будет достигнут конец файла.</p>
<pre class="brush: csharp; title: ; notranslate">string str1 = text_input.Text, str = &quot;&quot;, ch = &quot;&quot;;
int i, k, j;
for (i = 0; i &lt; str1.Length; ) { // от 0 до длины строки
	ch = str1.Substring(i, 1); // получаем текущий символ из строки str1
	k = 0; //счетчик количества повторяющихся символов
	if (i == str1.Length - 1) { // если последний символ
		str += Convert.ToString(ch);
		break; //выходим из цикла
	}

	if (str1.Substring(i + 1, 1) == ch)	{
		for (j = i; j &lt; str1.Length; j++) {
			if (str1.Substring(j, 1) == ch) //если текущий символ равен символу из строки ch
				k++; //увеличиваем счетчик
			else
				break; //выходим из цикла
		}
		i = j;
	}
	else
		i++;

	if (k != 0)
		str += Convert.ToString(k) + Convert.ToString(ch);
	else
		str += Convert.ToString(ch);

}

text_output.Text = str;
button2.Enabled = true;</pre>
<p>Кодировку успешно выполнили, теперь напишем декодировку строки, кодированную при помощи алгоритма RLE. Декодирование закодированной строки выполняется путем поиска числа, которое является количеством повторений символа и самого символа.<br />
И так, получаем закодированную строку из текстового поля “textBox1” и записывает полученный текст в переменную “str1”. При каждом проходе цикла, который выполняется, пока недостигнут последний символ, записываем в переменную “ch” текущий символ и если он является цифрой, выполняем поиск цифр идущих друг за другом. Тем самым последовательность найденных цифр будет представлять собой число, являющееся количеством повторений символа, идущего сразу же после этой последовательности. В конце в строковую переменную “str” записываем букву столько раз, сколько равно значение числа.</p>
<pre class="brush: csharp; title: ; notranslate">string str1 = textBox1.Text, str = &quot;&quot;, ch = &quot;&quot;, s = &quot;&quot;, symb = &quot;&quot;;
int i, k = 0, j;
for (i = 0; i &lt; str1.Length; ) {
	ch = str1.Substring(i, 1); // текущий символ i
	k = 0;
	s = &quot;&quot;;
	if (&quot;0123456789&quot;.Contains(ch)) { // если символ ch является цифрой
		for (j = i; j &lt; str1.Length; j++) {
			if (&quot;0123456789&quot;.Contains(str1.Substring(j, 1))) { // если текущий символ j является цифрой
				s += str1.Substring(j, 1);
			}
			else
				break;
		}
		symb = str1.Substring(j, 1); // получаем букву
		i = j + 1;
	}
	else
		i++;

	if (s.Length != 0) {
		for (j = 0; j &lt; Convert.ToInt32(s); j++) // декодирование буквы
			str += symb;
	}
	else
		str += Convert.ToString(ch);
}
out_shifr.Text = str;</pre>
<p>В данной программе реализовано <strong>кодирование</strong> и <strong>декодирование</strong> строки, используя <strong>алгоритм сжатия данных</strong> <strong>RLE</strong>.</p>
<blockquote><p><strong>Автор</strong>: <em>Евтеев Евгений Александрович</em></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2009/06/02/realizovat-algoritm-szhatiya-dannyx-rle/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

