<?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>Mon, 23 Jan 2012 08:02:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</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[Visual Studio]]></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# можно легко определить попала ли точка с координатами (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;

//Создадим прямоугольник и эллипс.
Rectangle RectangleDraw = new Rectangle(coordR_X, coordR_Y, RectangleWidth, RectangleHeight);
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>

		<guid isPermaLink="false">http://statprog.ru/?p=268</guid>
		<description><![CDATA[В статье мы займемся рисованием, рисовать будем треугольник, вписанную и описанную окружность. Конечно, рисовать будет программа, код которой мы сейчас напишем. Координаты вершин треугольника будут находиться в структуре “Pt”. Для этого создадим переменные для работы со структурой и саму структуру. Далее напишем функции для вычисления длин, углов треугольника и т.д. и процедуру для вывода графики [...]]]></description>
			<content:encoded><![CDATA[<p>В статье мы займемся рисованием, рисовать будем треугольник, вписанную и описанную окружность. Конечно, рисовать будет программа, код которой мы сейчас напишем.</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>

		<guid isPermaLink="false">http://statprog.ru/?p=236</guid>
		<description><![CDATA[В предшествующей статье я рассказал, как найти наибольшее общее кратное двух чисел, используя алгоритм вычисления НОД. В этой статей мы с вами напишем универсальный алгоритм нахождения НОК. Этот алгоритм позволяет найти НОК не только для двух чисел, но для множества чисел. Начнем с создания формы проекта, примерная форма показана на рисунке: Форму создали, разместили необходимые [...]]]></description>
			<content:encoded><![CDATA[<p>В предшествующей статье я рассказал, как найти наибольшее общее кратное двух чисел, используя алгоритм вычисления НОД. В этой статей мы с вами напишем универсальный алгоритм нахождения НОК. Этот алгоритм позволяет найти НОК не только для двух чисел, но для множества чисел.<span id="more-236"></span><br />
Начнем с создания формы проекта, примерная форма показана на рисунке:</p>
<div id="attachment_239" class="wp-caption aligncenter" style="width: 310px"><a href="http://statprog.ru/wp-content/app_find_nok_2.gif" 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>Форму создали, разместили необходимые объекты на ней. Теперь будем заниматься написанием кода программы. Числа, для которых будет производиться поиск НОК, будут вводиться через пробел. Для того, что их читать из поля “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>Здесь сначала вычисляется количество чисел в введенной строке, создается и заполняется массив с числами. Затем используется следующий алгоритм вычисления НОК: постоянно увеличивающееся число 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>На рисунке показан пример удачного поиска НОК, универсальный алгоритм работает правильно.</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>

		<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>

		<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>

		<guid isPermaLink="false">http://statprog.ru/?p=349</guid>
		<description><![CDATA[В этой статье поговорим о плагине “Музыка”, а именно о копировании музыки у друзей. А что тут говорить, такой возможности в плагине “Музыка” нет, так вот я покажу, как в несколько шагов реализовать такую возможность. Так сказать модифицируем плагин Музыка такие образом, чтобы он поддерживал возможность &#171;Копирование музыки у друзей&#171;. Копирование музыки у друзей Сначала [...]]]></description>
			<content:encoded><![CDATA[<p>В этой статье поговорим о плагине “<strong>Музыка</strong>”, а именно о копировании музыки у друзей. А что тут говорить, такой возможности в плагине “Музыка” нет, так вот я покажу, как в несколько шагов реализовать такую возможность. Так сказать модифицируем плагин Музыка такие образом, чтобы он поддерживал возможность &#171;<strong>Копирование музыки у друзей</strong>&#171;.<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>

		<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>

		<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>

		<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>

		<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>

		<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>

		<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>

		<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 символа меньше, соответственно эффективность алгоритма доказана. Теперь можно приступить к реализации данного алгоритма в виде программного кода на C#.<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>

