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

<channel>
	<title>Статьи о программировании, все о программировании, исходники программ</title>
	<atom:link href="http://statprog.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://statprog.ru</link>
	<description>Авторские статьи, исходники, программы.</description>
	<lastBuildDate>Sun, 07 Feb 2010 08:23:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Пьяньчуга &#8211; Моделирование движения пьяного человека на 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 вероятностей &#8211; остаться на месте и перемещаться в 4 стороны. Если появляется попытка переместиться через стенку, то «пьяньчуга» остается на месте. Сумма вероятностей строго равно 1. Если «пьяньчуга» нашел выход или попал в один из люков, то моделирование заканчивается и выводится соответствующее сообщение.<span id="more-402"></span></p>
<p>И так, в <strong>Visual Studio</strong> в <strong>C#</strong> создайте форму, и объекты как показано на рисунке «Рисунок 1.1». Соответственно, к каждому объекту подписано его имя.</p>
<p style="text-align: justify;"><img src="http://statprog.ru/wp-content/012810_1459_2.jpg" alt="Моделирование движения пьяного человека на C#" width="556" height="351" /></p>
<p style="text-align: justify;"><img src="http://statprog.ru/wp-content/012810_1459_1.png" alt="Рисунок 1.1" /></p>
<p style="text-align: justify;">
<p>После создания формы и всех ее объектов приступим к написанию кода программы.<br />
Для начала я перечислю, какие библиотеки и глобальные переменные необходимы для работы программы.<br />
<strong>Библиотеки:</strong></p>
<pre class="brush: csharp;">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;">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;">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;">	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>Напишем метод «MessageShow», который будет выводить сообщение на экран при завершении моделирования.<br />
void MessageShow(int type)<br />
{<br />
if(type == 1)<br />
MessageBox.Show(&laquo;Моделирование закончено!&raquo;);<br />
else<br />
MessageBox.Show(&laquo;Пьянчуга попал в люк&raquo;);<br />
}<br />
Теперь напишем объект «check», который осуществляет ряд проверок движения «пьяньчуги». Если «пьяньчуга» нашел выход или попал в один из люков, выводится соответствующее сообщение и моделирование прекращается.</p>
<pre class="brush: csharp;">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 &lt;= coord[0, 1].Y)
	{
		if(type == 1)
			MessageShow(1);
		return -1;
	}
	//Пьянчуга попал в люк
	if (GraphicsPathEllipse.IsVisible(PointUser))
	{
		if(type == 1)
			MessageShow(2);
		return -1;
	}
	//Слева линия
	if (PointUser.X &lt;= coord[1, 0].X &amp;&amp; PointUser.Y &gt;= 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 &lt;= coord[2, 0].Y)
	{
		PointUser.Y += shag;
	}
	//Верхняя 2
	if (PointUser.X &gt;= coord[6, 0].X &amp;&amp; PointUser.X &lt; = coord[6, 1].X &amp;&amp; PointUser.Y &lt;= coord[6, 0].Y)
	{
		PointUser.Y += shag;
	}
	//Правая линия
	if (PointUser.X &gt;= 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>Следующие объекты и методы необходимы для проверки правильного указания коэффициентов вероятности перемещения и количества люков.</p>
<pre class="brush: csharp;">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;">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;">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&lt;Point&gt; mass_nums = new List&lt;point&gt;();

		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;">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 &lt;= Convert.ToInt32(count_steps.Text); i++)
		{
			if (rnd.Next(1, 5) != 1)
			{
				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(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>
<p><img src="file:///C:/Users/EVTEEV/AppData/Local/Temp/moz-screenshot.png" alt="" /></p>
<p style="text-align: center;"><a href="http://statprog.ru/wp-content/picpiyan.jpg"><img class="aligncenter size-full wp-image-436" title="Пьяньчуга попал в люк" src="http://statprog.ru/wp-content/picpiyan.jpg" alt="Пьяньчуга попал в люк" width="550" height="350" /></a></p>
<p style="text-align: left;">«Пьяньчуга» нашел выход:</p>
<p style="text-align: center;"><a href="http://statprog.ru/wp-content/picpiyan2.jpg"><img class="aligncenter size-full wp-image-437" title="Пьяньчуга нашел выход" src="http://statprog.ru/wp-content/picpiyan2.jpg" alt="Пьяньчуга нашел выход" width="550" height="350" /></a></p>
<p>Данную статью Вы можете скачать в формате doc<br />
<a href="http://statprog.ru/wp-content/modelirovanie_piyanchugi.rar">Скачать Пьяньчуга &#8211; Моделирование движения пьяного человека на 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”. Для этого создадим переменные для работы со структурой и саму структуру.
Pt m1, m2, v1, v2, b1, b2;
public struct Pt
{
	double x;
	double y;
	public Pt(double a, double b)
	{
		x = a;
		y [...]]]></description>
			<content:encoded><![CDATA[<p>В статье мы займемся рисованием, рисовать будем треугольник, вписанную и описанную окружность. Конечно, рисовать будет программа, код которой мы сейчас напишем.<br />
Координаты вершин треугольника будут находиться в структуре “Pt”. Для этого создадим переменные для работы со структурой и саму структуру.</p>
<pre class="brush: csharp;">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 &#8211; x1) ^2+ (y2-y1) ^2) ^ (1/2), где (x1, y1) и (x2, y2) &#8211; это координаты начала и конца отрезка.<span id="more-268"></span></p>
<pre class="brush: csharp;">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 &#8211; скалярное произведение векторов s1 и s2,а s1 и s2 &#8211; стороны треугольника (абсолютные величины векторов).</p>
<pre class="brush: csharp;">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;">double Perimetr(double s1, double s2, double s3)
{
	return (s1 + s2 + s3);
}</pre>
<p><strong>Площадь треугольника</strong> находится с помощью формулы Герона:</p>
<pre class="brush: csharp;">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;">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;">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;&amp;amp; ((m1 / l1) - (m2 / l2) != 0) &amp;amp;&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;">private void button1_Click_1(object sender, EventArgs e)</pre>
<p>Объявим нужные переменные и занесем в структуру координаты вершин треугольника из текстовых полей на форме.</p>
<pre class="brush: csharp;">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;">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;">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;">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;">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;"> 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;">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;">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;">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 &amp;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 &amp;gt; 0)
	coef2 = -1;</pre>
<p>Поворачиваем точку a[2] вокруг a[0] на угол равный половине угла ang2</p>
<pre class="brush: csharp;">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;">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>
<p><img class="aligncenter size-medium wp-image-270" title="buid_tr_okr" src="http://statprog.ru/wp-content/buid_tr_okr-300x273.jpg" alt="buid_tr_okr" width="300" height="273" /></p>
<p>Треугольник и две окружности построены, для решения этой задачи нам понадобились небольшие знания C# и геометрии.<br />
<strong>Автор</strong>: <em>Евтеев Евгений Александрович</em><br />
<strong>Email</strong>: <em>evteev_e2003@mail.ru</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>В предшествующей статье я рассказал, как найти наибольшее общее кратное двух чисел, используя алгоритм вычисления <a href="http://statprog.ru/2009/04/04/poisk-naibolshego-obshhego-delitelya-dvux-chisel/">НОД</a>. В этой статей мы с вами напишем универсальный алгоритм нахождения <a href="http://statprog.ru/2009/11/16/najti-naimenshee-obshhee-kratnoe-ispolzuya-agloritm-nod/">НОК</a>. Этот алгоритм позволяет найти <a href="http://statprog.ru/2009/11/16/najti-naimenshee-obshhee-kratnoe-ispolzuya-agloritm-nod/">НОК</a> не только для двух чисел, но для множества чисел.<br />
Начнем с создания формы проекта, примерная форма показана на рисунке:<br />
<img src="http://statprog.ru/wp-content/app_find_nok_2-300x174.gif" alt="app_find_nok_2" title="app_find_nok_2" width="300" height="174" class="aligncenter size-medium wp-image-239" /></p>
<p>Форму создали, разместили необходимые объекты на ней. Теперь будем заниматься написанием кода программы. Числа, для которых будет производиться поиск НОК, будут вводиться через пробел. Для того, что их читать из поля “n_gr ” напишем функцию.</p>
<pre class="brush: csharp;">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”. Функция возращает массив с числами из строки.<span id="more-236"></span></p>
<p>Теперь процедура события клика по кнопке “find”:</p>
<pre class="brush: csharp;">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>
<p><img src="http://statprog.ru/wp-content/app_find_nok_2_res-300x174.gif" alt="app_find_nok_2_res" title="app_find_nok_2_res" width="300" height="174" class="aligncenter size-medium wp-image-240" /><br />
На рисунке показан пример удачного поиска НОК, универсальный алгоритм работает правильно.</p>
<blockquote><p><strong>Автор</strong>: <em>Евтеев Евгений Александрович</em><br />
<strong>Email</strong>: <em>evteev_e2003@mail.ru</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><a href="http://statprog.ru/2009/04/04/poisk-naibolshego-obshhego-delitelya-dvux-chisel/">НОД</a></strong>. Лучше всего реализовать алгоритм в рекурсивной функции.<span id="more-233"></span></p>
<pre class="brush: csharp;">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;">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><a href="http://statprog.ru/2009/04/04/poisk-naibolshego-obshhego-delitelya-dvux-chisel/">НОД</a></strong> этих двух чисел. Результат вычисления <strong>НОК</strong> записывается в текстовое поле “n_nok”.</p>
<p>Вы думали, что написать такую программу будет не так просто? Извините, что разочаровал вас. В другой статье, я расскажу вам, как вычислить <strong>НОК</strong> для двух и более чисел, так называемый <strong>универсальный алгоритм</strong>.</p>
<blockquote><p><strong>Автор</strong>: <em>Евтеев Евгений Александрович</em><br />
<strong>Email</strong>: <em>evteev_e2003@mail.ru</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[Перевод из десятичной системы в двоичную
Как преобразовать десятичное число в двоичный вид на VC++?
Ответ на этот вопрос мы и рассмотрим в этой статье. Мы будем использовать всем известный метод, нахождения двоичного представления десятичного числа – деление числа на 2. Все эти преобразования будут находиться в процедуре “Dec2Bin(int ch)”, где “ch”- число в десятичном представлении, которое [...]]]></description>
			<content:encoded><![CDATA[<h1 style="font-size: 15px; font-weight: bold;">Перевод из десятичной системы в двоичную</h1>
<h2 style="font-size: 14px; font-weight: bold;">Как преобразовать десятичное число в двоичный вид на VC++?</h2>
<p>Ответ на этот вопрос мы и рассмотрим в этой статье. Мы будем использовать всем известный метод, нахождения двоичного представления десятичного числа – деление числа на 2. Все эти преобразования будут находиться в процедуре “Dec2Bin(int ch)”, где “ch”- число в десятичном представлении, которое собственно мы будем <strong>декодировать в двоичное</strong>. <span id="more-33"></span></p>
<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;">void Dec2Bin(int ch)
{
	int i, ch2, s[n];
	ch2 = ch;
	for (i = 0; i &amp;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 &amp;lt; 0)
	{
		for (i = n - 1; i &amp;gt;= 0; i--)
			if (s[i] == 1)
				s[i] = 0;
			else
				s[i] = 1;
	}
	for (i = 0; i &amp;lt; n; i++)
		if (s[i] == 1)
			s[i] = 0;
		else
		{
			s[i] = 1;
			break;
		}
	wcout &amp;lt;&amp;lt; L&quot;Двоичное представление :&quot; &amp;lt;&amp;lt; endl;
	for (i = n - 1; i &amp;gt;= 0; i--) //цикл вывода массива с введенным числом
		cout &amp;lt;&amp;lt; s[i]; //представленным в двоичной системе счисления
}</pre>
<p>Число в 2-м виде получили, но разве вам не хочется декодировать его обратно? Для начала напишем функции возведения числа в степень и получения длины массива, они нам понадобятся.</p>
<p>Функция “len(char str[])”:</p>
<pre class="brush: cpp;">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;">int stepen(int ch, int st)
{
	int a = 1;
	for(int i = 0; i &amp;lt; st; i++)
		a *= ch;
	return a;
}</pre>
<p>Функция “len(char str[])” возвращает длину массива “str[]”, а “stepen(int ch, int st)” возводит число 2 в степень “st”.</p>
<h3 style="font-size: 15px; font-weight: bold;">Перевод из двоичной системы в десятичную</h3>
<p>Теперь рассмотрим функцию “Bin2Dec (char m[])”, где “m[]”- это есть массив двоичных данных, в которых спрятано число. Если первый символ в массиве равен ‘1’, т.е. наше число отрицательное, то каждый символ в массиве до первой найденной ‘1’ инвертируем и после этого снова выполняет замену всех символов массива на ‘0’, если этот символ это ‘1’ или на ‘1’ соответственно. Затем непосредственно выполняем перевод в 10-й вид, используя нашу функцию возведения в степень. Код приведен ниже:</p>
<p>Функция “Bin2Dec (char m[])” &#8211; <strong>Перевод из двоичной системы в десятичную</strong></p>
<pre class="brush: cpp;">int Bin2Dec (char m[])
{
	int i, deca=0, j = 0, q = 1;
	if (m[0] == '1')
	{
		for (i = n - 1; i &amp;gt;= 0; i--)
			if (m[i] == '0')
				m[i] = '1';
			else
			{
				m[i] = '0';
				break;
			}
		for (i = 0; i &amp;lt; n; i++)
			if (m[i] == '1')
				m[i] = '0';
			else
				m[i] = '1';
		q*=-1;
	}
	for (i = n - 1; i &amp;gt;= 0; i--, j++)
		if(m[i] == '1')
			deca += stepen(2,j);
	return deca*q;
}</pre>
<p>Ну и, наконец, главная функция, с которой начинается работа нашего приложения. Здесь происходит ввод данных и вывод результата работы программы на экран пользователя.</p>
<p>Главный метод:</p>
<pre class="brush: cpp;">[/cpp]int main()
{
	wcout.imbue(locale("rus_rus.866"));
	int ch;
	char c[n];
	wcout &lt;&lt; L"Введите число (десятичное):" &lt;&lt; endl; //вывод сообщения на экран
	cin &gt;&gt; ch; //ввод значения с клавиатуры
	Dec2Bin(ch);
	/*------------------------------------------------------------------------*/
	wcout &lt;&lt; L"\n\nВведите число (двоичное):" &lt;&lt; endl; //вывод сообщения на экран
	cin&gt;&gt;c; //ввод значения с клавиатуры
	wcout &lt;&lt; L"Десятичное представление :" &lt;&lt; endl &lt;&lt; Bin2Dec(c) &lt;&lt; endl; //выводим на экран число в 10-й системе счисления
	system("pause");
	return 1;
}[cpp]</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><a href="http://statprog.ru/2009/08/30/plagin-muzyka-kopirovanie-muzyki-u-druzej-v-socialengine-excalibur/">Копирование музыки у друзей</a></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;">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;">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>
<p>Данную статью Вы также можете скачать в формате doc:<br />
<a href="http://statprog.ru/wp-content/copy_music_SocialEngine_Excalibur_2.rar">скачать</a></p>
<p><strong>Автор:<em> Евтеев Евгений Александрович</em></strong></p>
<p><strong>Email:<em> evteev_e2003@mail.ru</em></strong></p>
]]></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>Плагин музыка &#8211; копирование музыки у друзей в 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[В этой статье поговорим о плагине “Музыка”, а именно о копировании музыки у друзей. А что тут говорить, такой возможности в плагине “Музыка” нет, так вот я покажу, как в несколько шагов реализовать такую возможность.
Сначала необходимо добавить еще одно поле в таблицу «se_music», где хранятся записи о добавленным песнях. Выполним sql-запрос:
ALTER TABLE `se_music` ADD `owner_user_id` [...]]]></description>
			<content:encoded><![CDATA[<p>В этой статье поговорим о плагине “Музыка”, а именно о копировании музыки у друзей. А что тут говорить, такой возможности в плагине “Музыка” нет, так вот я покажу, как в несколько шагов реализовать такую возможность.</p>
<p>Сначала необходимо добавить еще одно поле в таблицу «se_music», где хранятся записи о добавленным песнях. Выполним sql-запрос:</p>
<pre class="brush: sql;">ALTER TABLE `se_music` ADD `owner_user_id` text AFTER `music_user_id`</pre>
<p>Для работы функции «is_already_music()», которая возвращает логическую ложь в том случае, если у участника нет данной песни в его коллекции, пропишем ее в класс «user».<span id="more-349"></span></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;">return array
(

'collaborators' =&amp;gt; &amp;amp;$collaborators,

'pms'           =&amp;gt; &amp;amp;$pms

);

}</pre>
<p><strong>Добавить после</strong></p>
<p><strong>Подсказка:</strong> Добавьте эти строки на новой строке после ранее найденных строк.</p>
<pre class="brush: php;">function is_already_music($music_id)

{

global $database;

$music_tb = $database-&amp;gt;database_fetch_assoc($database-&amp;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-&amp;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;">if( $this-&amp;gt;user_id ) $sql .= &quot;

WHERE

se_music.music_user_id='{$this-&amp;gt;user_id}'

&quot;;</pre>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php;">if( $this-&amp;gt;user_id ) $sql .= &quot;

WHERE

se_music.music_user_id='{$this-&amp;gt;user_id}' OR FIND_IN_SET('{$this-&amp;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;">$music_object = new se_music();</pre>
<p><strong>Добавить</strong></p>
<p><strong>Подсказка:</strong> Добавьте эти строки на новой строке перед ранее найденными строками.</p>
<pre class="brush: php;">$music_id = $_GET['music_id'];

if( $_GET['task'] == &quot;copy&quot; &amp;amp;&amp;amp; $music_id &amp;gt; 0)

{

ob_end_clean();

$music_tb = $database-&amp;gt;database_fetch_assoc($database-&amp;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-&amp;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-&amp;gt;user_info['user_id'];

}

else

{

if($owner_user_id == $user-&amp;gt;user_info['user_id'] || strlen($owner_user_id) == 0)

$owner_user_id_update = $user-&amp;gt;user_info['user_id'];

if( strlen($owner_user_id) &amp;gt; 0 )

$owner_user_id_update = $owner_user_id . &quot;,&quot; . $user-&amp;gt;user_info['user_id'];

}

$database-&amp;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;">$musiclist = $music-&amp;gt;music_list();</pre>
<p><strong>Добавить</strong></p>
<p><strong>Подсказка:</strong> Добавьте эти строки на новой строке перед ранее найденными строками.</p>
<pre class="brush: php;">if( $task == &quot;removesong&quot; &amp;amp;&amp;amp; $music_id &amp;gt; 0)

{

ob_end_clean();

$music_tb = $database-&amp;gt;database_fetch_assoc($database-&amp;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-&amp;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-&amp;gt;user_info['user_id'])

$owner_user_id_text = '';

}

$database-&amp;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>music_ajax.php</span></strong><br />
<strong>Найти </strong><br />
<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php;">$user_dir = $url-&amp;gt;url_userdir($user_id);</pre>
<p><strong>Удалить</strong><br />
<strong>Подсказка:</strong> Удалите ранее найденные строки.<strong>Найти </strong><br />
<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php;">{$user_dir}</pre>
<p><strong>Заменить</strong><br />
<strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php;">{$url-&amp;gt;url_userdir($song[music_user_id])}</pre>
</li>
<li><strong>Открыть</strong><strong>: user_music.tpl</strong><br />
<strong>Найти </strong><br />
<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php;">{assign var='media_dir' value=$url-&amp;gt;url_userdir($user-&amp;gt;user_info.user_id)}

{section name=music_loop loop=$musiclist}</pre>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php;">{section loop=$musiclist}

{assign var='media_dir' value=$url-&amp;gt;url_userdir($musiclist[music_loop].music_user_id)}</pre>
<p><strong>Найти </strong></p>
<p><strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php;">&amp;lt;input type='checkbox' name='delete_music_{$musiclist[music_loop].music_id}' value='1' /&amp;gt;</pre>
<p><strong>Заменить</strong><strong> </strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php;">{if $musiclist[music_loop].music_user_id == $user-&amp;gt;user_info.user_id}&amp;lt;input type='checkbox' name='delete_music_{$musiclist[music_loop].music_id}' value='1' /&amp;gt;{/if}</pre>
<p><strong> </strong><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>Найти </strong></p>
<p><strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php;">&amp;lt;span class=&quot;seMusicTitleEdit&quot;&amp;gt;&amp;amp;nbsp;(&amp;lt;a href=&quot;javascript:void(0);&quot;&amp;gt;{lang_print id=187}&amp;lt;/a&amp;gt;)&amp;lt;/span&amp;gt;</pre>
<p><strong>Заменить</strong><strong> </strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php;">{if $musiclist[music_loop].music_user_id == $user-&amp;gt;user_info.user_id}&amp;lt;span class=&quot;seMusicTitleEdit&quot;&amp;gt;&amp;amp;nbsp;(&amp;lt;a href=&quot;javascript:void(0);&quot;&amp;gt;{lang_print id=187}&amp;lt;/a&amp;gt;)&amp;lt;/span&amp;gt;{/if}</pre>
<p><strong> </strong></p>
<p><strong>Найти </strong></p>
<p><strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php;">&amp;lt;span class=&quot;seMusicDelete&quot;&amp;gt;&amp;lt;a href=&quot;javascript:void(0);&quot; onclick=&quot;SocialEngine.Music.deleteMusic({$musiclist[music_loop].music_id});&quot;&amp;gt;{lang_print id=155}&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;</pre>
<p><strong>Заменить</strong><strong> </strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php;">{if $musiclist[music_loop].music_user_id == $user-&amp;gt;user_info.user_id}

&amp;lt;span class=&quot;seMusicDelete&quot;&amp;gt;&amp;lt;a href=&quot;javascript:void(0);&quot; onclick=&quot;SocialEngine.Music.deleteMusic({$musiclist[music_loop].music_id});&quot;&amp;gt;{lang_print id=155}&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;

{else}

&amp;lt;span class=&quot;seMusicDelete&quot;&amp;gt;&amp;lt;a href=&quot; user_music.php?task=removesong&amp;amp;music_id={$musiclist[music_loop].music_id}&quot;&amp;gt;{lang_print id=155}&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;

{/if}</pre>
</li>
<li><strong>Открыть</strong><strong>: user_music.tpl</strong><br />
<strong>Найти </strong><br />
<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php;">{assign var='media_dir' value=$url-&amp;gt;url_userdir($user-&amp;gt;user_info.user_id)}

{section name=music_loop loop=$musiclist}</pre>
<p><strong>Заменить</strong><strong> </strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php;">{section loop=$musiclist}

{assign var='media_dir' value=$url-&amp;gt;url_userdir($musiclist[music_loop].music_user_id)}</pre>
<p><strong> </strong><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>Найти </strong></p>
<p><strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php;">&amp;lt;input type='checkbox' name='delete_music_{$musiclist[music_loop].music_id}' value='1' /&amp;gt;</pre>
<p><strong>Заменить</strong><strong> </strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php;">{if $musiclist[music_loop].music_user_id == $user-&amp;gt;user_info.user_id}&amp;lt;input type='checkbox' name='delete_music_{$musiclist[music_loop].music_id}' value='1' /&amp;gt;{/if}</pre>
<p><strong> </strong><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>Найти </strong></p>
<p><strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php;">&amp;lt;span class=&quot;seMusicTitleEdit&quot;&amp;gt;&amp;amp;nbsp;(&amp;lt;a href=&quot;javascript:void(0);&quot;&amp;gt;{lang_print id=187}&amp;lt;/a&amp;gt;)&amp;lt;/span&amp;gt;</pre>
<p><strong>Заменить</strong><strong> </strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php;">{if $musiclist[music_loop].music_user_id == $user-&amp;gt;user_info.user_id}&amp;lt;span class=&quot;seMusicTitleEdit&quot;&amp;gt;&amp;amp;nbsp;(&amp;lt;a href=&quot;javascript:void(0);&quot;&amp;gt;{lang_print id=187}&amp;lt;/a&amp;gt;)&amp;lt;/span&amp;gt;{/if}</pre>
<p><strong> </strong></p>
<p><strong>Найти </strong></p>
<p><strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php;">&amp;lt;span class=&quot;seMusicDelete&quot;&amp;gt;&amp;lt;a href=&quot;javascript:void(0);&quot; onclick=&quot;SocialEngine.Music.deleteMusic({$musiclist[music_loop].music_id});&quot;&amp;gt;{lang_print id=155}&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;</pre>
<p><strong>Заменить</strong><strong> </strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<pre class="brush: php;">{if $musiclist[music_loop].music_user_id == $user-&amp;gt;user_info.user_id}

&amp;lt;span class=&quot;seMusicDelete&quot;&amp;gt;&amp;lt;a href=&quot;javascript:void(0);&quot; onclick=&quot;SocialEngine.Music.deleteMusic({$musiclist[music_loop].music_id});&quot;&amp;gt;{lang_print id=155}&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;

{else}

&amp;lt;span class=&quot;seMusicDelete&quot;&amp;gt;&amp;lt;a href=&quot; user_music.php?task=removesong&amp;amp;music_id={$musiclist[music_loop].music_id}&quot;&amp;gt;{lang_print id=155}&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;

{/if}</pre>
</li>
</ol>
<p>Готово! Теперь на странице «browse_music.php» напротив музыки будет показана ссылка «Копировать» в том случае, если ее нет у участника. На странице «user_music.php» можно будет удалить музыку, которую скопировали от друзей.</p>
<p>Если удобнее читать данную статью в программе Word, можно скачать по ссылке <a title="Плагин музыка – копирование музыки у друзей в SocialEngine Excalibur" href="http://statprog.ru/wp-content/kopirovanie-muzyki.rar" target="_blank">Плагин музыка – копирование музыки у друзей в SocialEngine Excalibur</a></p>
<p><strong>Автор:<em> Евтеев Евгений Александрович</em></strong><br />
<strong>Email:<em> evteev_e2003@mail.ru</em></strong></p>
]]></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, при нажатии на вкладку Группы система думает, а думает о том, зачем Вы на меня кликнули, если меня НЕТ!!!</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 есть код, отвечающий за отображение вкладки &laquo;Группы&raquo; и групп, по нажатию на эту вкладку будут появляться новые группы.</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$ Блог - %2$s
Посмотрите на
%1$
, видим, что здесь нет символа
s
.
Исправляем и у нас получается:
1500125:=%1$s [...]]]></description>
			<content:encoded><![CDATA[<p><span>Слово блог в заголовке при просмотре какой-то записи в блоге отображается некорректно, вместо буквы Б отображается знак вопроса в ромбе.<br />
Что надо делать и как исправить данный баг?</span></p>
<p>А ошибка всего лишь в одном символе, которого нет в файле языка.<br />
В файле языка была запись:</p>
<pre class="brush: plain;">1500125:=%1$ Блог - %2$s</pre>
<p>Посмотрите на
<pre class="brush: plain;">%1$</pre>
<p>, видим, что здесь нет символа
<pre class="brush: plain;">s</pre>
<p>.<br />
Исправляем и у нас получается:</p>
<pre class="brush: plain;">1500125:=%1$s Блог - %2$s</pre>
<p>Мне понадобилось это изменить в базе данных, нашел данную запись по запросу</p>
<pre class="brush: sql;">SELECT * FROM `se_languagevars` WHERE `languagevar_id` = 1500125</pre>
<p>Находите и исправляете на правильную запись:</p>
<pre class="brush: plain;">%1$s Блог - %2$s</pre>
<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;Сейчас на сайте&#8217; отображаются имя и фамилия участников, которые в данный момент находятся на сайте. Отображение только этих данных как-то ухудшают видимость этого блока, с помощью внедрения в код нескольких строчек и в этом блоке будет отображаться и фотография участника наряду с именем и фамилией.
Что для этого нужно сделать?

Открыть: functions_general.php
Подсказка: [...]]]></description>
			<content:encoded><![CDATA[<p>В движке SocialEngine в блоке &#8216;Сейчас на сайте&#8217; отображаются имя и фамилия участников, которые в данный момент находятся на сайте. Отображение только этих данных как-то ухудшают видимость этого блока, с помощью внедрения в код нескольких строчек и в этом блоке будет отображаться и фотография участника наряду с именем и фамилией.</p>
<p>Что для этого нужно сделать?<span id="more-340"></span></p>
<ol>
<li><strong>Открыть: functions_general.</strong><strong>php</strong><strong></strong>
<p><strong>Подсказка:</strong> Данный файл находится в папке include.</p>
<p><strong>Найти</strong></p>
<p><strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть. Данная строка находится внутри функции online_users().</p>
<blockquote><p><code>$online_user-&gt;user_info['user_displayname'] = $online_user_info['user_displayname'];</code></p></blockquote>
<p><strong>Добавить</strong><strong> </strong><strong>после</strong><strong></strong></p>
<p><strong>Подсказка:</strong> Добавьте эти строки на новой строке после ранее найденных строк.</p>
<blockquote><p><code>$view_user_photo = $database-&gt;database_query("SELECT user_id, user_photo FROM se_users WHERE user_id='" . $online_user_info['user_id'] . "' LIMIT 1");</p>
<p>$views_user_photo = $database-&gt;database_fetch_assoc($view_user_photo);</p>
<p>$online_user-&gt;user_info['user_photo']                          = $views_user_photo['user_photo'];</code></p></blockquote>
</li>
<li><strong>Открыть</strong><strong>: user_home.tpl</strong>
<p><strong>Найти</strong><strong></strong></p>
<blockquote><p><code>&lt;a href='{$url-&gt;url_create("profile", $online_users[0][online_loop]-&gt;user_info.user_username)}'&gt;{$online_users[0][online_loop]-&gt;user_displayname}&lt;/a&gt;</code></p></blockquote>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<blockquote><p><code>&lt;center&gt;&lt;img class='reflect' src='{$online_users[0][online_loop]-&gt;user_photo("./images/nophoto.gif")}' border='0'&gt;&lt;br&gt;&lt;a href='{$url-&gt;url_create("profile", $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;</code></p></blockquote>
</li>
</ol>
<p><strong>Автор:<em> Евтеев Евгений Александрович</em></strong></p>
<p><strong>Email:<em> evteev_e2003@mail.ru</em></strong></p>
]]></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>.</p>
<p>Выполним пару действий шаг за шагом:</p>
<ol>
<li><strong>Открыть: browse_groups.</strong><strong>php</strong><br />
	<strong>Найти</strong><br />
	<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<pre class="brush: php;">
		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><span id="more-338"></span></p>
<p><strong>Добавить после</strong></p>
<p><strong>Подсказка:</strong> Добавьте эти строки на новой строке после ранее найденных строк.</p>
<pre class="brush: php;">//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;">&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;">&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>
<p><strong>Автор:<em> Евтеев Евгений Александрович</em></strong></p>
<p><strong>Email:<em> evteev_e2003@mail.ru</em></strong></p>
]]></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><a href="http://statprog.ru/2009/08/12/dobavlenie-stran-regionov-i-gorodov-v-socialengine-excalibur/">SocialEngine Excalibur</a></strong>, сегодня мы добавим эти поля в <strong>расширенный поиск</strong> – это тоже немало важный апгрейд. Написание этой статьи меня подтолкнул вопрос, зачем нужны поля <strong>страна</strong>, <strong>регион</strong> и <strong>город</strong> в профиле участника, если нет возможности найти участников, используя данные поля?</p>
<p>Для добавления данных полей необходимо выполнить пару шагов:</p>
<ol>
<li><strong>Открыть: search_advanced.</strong><strong>php</strong><br />
<strong>Найти</strong><br />
<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<blockquote><p><code>$search_query = "<strong>SELECT</strong> se_users.user_id, se_users.user_username, se_users.user_fname, se_users.user_lname, se_users.user_photo <strong>FROM</strong> se_profilevalues LEFT JOIN se_users ON se_profilevalues.profilevalue_user_id=se_users.user_id <strong>LEFT JOIN</strong> se_levels ON se_levels.level_id=se_users.user_level_id <strong>WHERE</strong> se_users.user_profilecat_id='{$cat_selected}' <strong>AND</strong> se_users.user_verified='1' <strong>AND</strong> se_users.user_enabled='1' <strong>AND</strong> (se_users.user_search='1' <strong>OR</strong> se_levels.level_profile_search='0')";<br />
if($user_online == 1) { $search_query .= " <strong>AND</strong> user_lastactive&gt;'".(time()-10*60)."' <strong>AND</strong> user_invisible=0"; }<br />
if($user_withphoto == 1) { $search_query .= " <strong>AND</strong> user_photo &lt;&gt; ''"; }<br />
if($field-&gt;field_query != "") { $search_query .= " <strong>AND</strong> ".$field-&gt;field_query; }</code></p></blockquote>
<p><strong>Заменить</strong><br />
<strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<blockquote><p><code>$search_query = "<strong>SELECT</strong> se_users.user_id, se_users.user_username, se_users.user_fname, se_users.user_lname, se_users.user_photo <strong>FROM</strong> se_profilevalues <strong>LEFT JOIN</strong> se_users <strong>ON</strong> se_profilevalues.profilevalue_user_id=se_users.user_id <strong>LEFT JOIN</strong> se_levels <strong>ON</strong> se_levels.level_id=se_users.user_level_id <strong>LEFT JOIN</strong> cites_profilevalues <strong>ON</strong> se_profilevalues.profilevalue_user_id=cites_profilevalues.profilevalue_id <strong>WHERE</strong> se_users.user_profilecat_id='{$cat_selected}' <strong>AND</strong> se_users.user_verified='1' <strong>AND</strong> se_users.user_enabled='1' <strong>AND</strong> (se_users.user_search='1' <strong>OR</strong> se_levels.level_profile_search='0')";<br />
if($user_online == 1) { $search_query .= " <strong>AND</strong> user_lastactive&gt;'".(time()-10*60)."' <strong>AND</strong> user_invisible=0"; }<br />
if($user_withphoto == 1) { $search_query .= " <strong>AND</strong> user_photo &lt;&gt; ''"; }<br />
if($field-&gt;field_query != "") { $search_query .= " <strong>AND</strong> se_profilevalues.".$field-&gt;field_query; }<br />
if(isset($_POST['dhtmlgoodies_country']) &amp;&amp; $_POST['dhtmlgoodies_country'] &gt; 0)<br />
$search_query .= " <strong>AND</strong> cites_profilevalues.profilevalue_7 = '" . $_POST['dhtmlgoodies_country'] . "'";<br />
if(isset($_POST['dhtmlgoodies_region']) &amp;&amp; $_POST['dhtmlgoodies_region'] &gt; 0)<br />
$search_query .= " <strong>AND</strong> cites_profilevalues.profilevalue_8 = '" . $_POST['dhtmlgoodies_region'] . "'";<br />
if(isset($_POST['dhtmlgoodies_city']) &amp;&amp; $_POST['dhtmlgoodies_city'] &gt; 0)<br />
$search_query .= " <strong>AND</strong> cites_profilevalues.profilevalue_9 = '" . $_POST['dhtmlgoodies_city'] . "'";</code></p></blockquote>
<p><span id="more-332"></span></p>
<p><strong>Найти</strong><br />
<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<blockquote><p><code>// SET GLOBAL PAGE TITLE<br />
$global_page_title[0] = 926;<br />
$global_page_description[0] = 1088;<br />
}</code></p></blockquote>
<p><strong>Добавить после</strong><br />
<strong>Подсказка:</strong> Добавьте эти строки на новой строке после ранее найденных строк.</p>
<blockquote><p><code>// GET COUNTRY, REGION AND CITY<br />
$sql = $database-&gt;database_query ("<strong>SELECT</strong> * <strong>FROM</strong> country");<br />
while ($country_bd = $database-&gt;database_fetch_assoc ($sql))<br />
{<br />
if(isset($_POST['dhtmlgoodies_country']) &amp;&amp; $country_bd[country_id] == $_POST['dhtmlgoodies_country'])<br />
$country_sel = " SELECTED";<br />
else<br />
$country_sel = "";</code></p>
<p>$country .= &laquo;&lt;option value=&#8217;&raquo; . $country_bd[country_id] . &laquo;&#8216;&raquo; . $country_sel . &laquo;&gt;&raquo; . $country_bd[name] . &laquo;&lt;/option&gt;\n&raquo;;<br />
}</p>
<p>if(isset($_POST['dhtmlgoodies_region']))<br />
{<br />
$region_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&laquo;<strong>SELECT</strong> region_id, name <strong>FROM</strong> region <strong>WHERE</strong> region_id=&#8217;&raquo;.$_POST['dhtmlgoodies_region'].&raquo;&#8216; <strong>LIMIT</strong> 1&#8243;));<br />
if(strlen($region_tb[name]) &gt; 1)<br />
$region .= &laquo;&lt;option value=&#8217;&raquo; . $region_tb[region_id] . &laquo;&#8216; SELECTED&gt;&raquo; . $region_tb[name] . &laquo;&lt;/option&gt;\n&raquo;;<br />
}</p>
<p>if(isset($_POST['dhtmlgoodies_city']))<br />
{<br />
$city_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&laquo;<strong>SELECT</strong> city_id, name <strong>FROM</strong> city <strong>WHERE</strong> city_id=&#8217;&raquo;.$_POST['dhtmlgoodies_city'].&raquo;&#8216; <strong>LIMIT</strong> 1&#8243;));<br />
if(strlen($city_tb[name]) &gt; 1)<br />
$city .= &laquo;&lt;option value=&#8217;&raquo; . $city_tb[city_id] . &laquo;&#8216; SELECTED&gt;&raquo; . $city_tb[name] . &laquo;&lt;/option&gt;\n&raquo;;<br />
}<br />
$smarty-&gt;assign(&#8216;country&#8217;, $country);<br />
$smarty-&gt;assign(&#8216;region&#8217;, $region);<br />
$smarty-&gt;assign(&#8216;city&#8217;, $city);<br />
// END GET COUNTRY, REGION AND CITY</p></blockquote>
</li>
<li><strong>Открыть: search_advanced.tpl</strong><br />
<strong>Найти</strong></p>
<blockquote><p><code>&lt;/div&gt;<br />
{/section}<br />
{/section}<br />
{/section}</code></p></blockquote>
<p><strong>Добавить после</strong><br />
<strong>Подсказка:</strong> Добавьте эти строки на новой строке после ранее найденных строк.</p>
<blockquote><p><code>&lt;table cellpadding='0' cellspacing='0' style='padding-top: 5px;'&gt;<br />
&lt;tr&gt;&lt;td&gt;<br />
&lt;div style='font-weight: bold; margin-top: 5px;'&gt;Страна проживания&lt;/div&gt;<br />
&lt;select name='dhtmlgoodies_country' id='dhtmlgoodies_country' onchange="getRegionList(this.value);"&gt;<br />
&lt;option id='op' value='-1'&gt;[ Страна ]&lt;/option&gt;<br />
{$country}&lt;/select&gt;<br />
&lt;/div&gt;<br />
&lt;div style='font-weight: bold; margin-top: 5px;'&gt;Регион проживания&lt;/div&gt;<br />
&lt;select name='dhtmlgoodies_region' id='dhtmlgoodies_region' onchange="getCityList(this.value);"&gt;<br />
&lt;option id='op' value='-1'&gt;[ Регион ]&lt;/option&gt;<br />
{$region}&lt;/select&gt;<br />
&lt;/div&gt;<br />
&lt;div style='font-weight: bold; margin-top: 5px;'&gt;Город проживания&lt;/div&gt;<br />
&lt;select name='dhtmlgoodies_city' id='dhtmlgoodies_city'&gt;<br />
&lt;option id='op' value='-1'&gt;[ Город ]&lt;/option&gt;<br />
{$city}&lt;/select&gt;<br />
&lt;/div&gt;<br />
&lt;/td&gt;&lt;/tr&gt;<br />
&lt;/table&gt;</code></p></blockquote>
</li>
</ol>
<p>Все! Найти участников теперь можно по стране, региону и городу проживания.</p>
<p>Вы ожидали больше шагов? Извините, что все так просто. Если у Вас возникнут вопросы, пишите мне на мыло, разберемся.</p>
<p><strong>Автор:<em> Евтеев Евгений Александрович</em></strong></p>
<p><strong>Email:<em> evteev_e2003@mail.ru</em></strong></p>
]]></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
Мне и моему другу захотелось создать свою социальную сеть, перебрали множество движков и остановились на SocialEngine Excalibur 3.15. По нашему мнению, SocialEngine Excalibur &#8211; это отличный движок для создания своей социальной сети, множество настроек, плагинов, но самое главное &#8211; серьезно мощный и простой в понимании код скриптов. Если имеются знания в таких языках как [...]]]></description>
			<content:encoded><![CDATA[<h1 class="titlepage">SocialEngine Excalibur</h1>
<p>Мне и моему другу захотелось создать свою социальную сеть, перебрали множество движков и остановились на <strong>SocialEngine Excalibur 3.15</strong>. По нашему мнению, <strong>SocialEngine Excalibur</strong> &#8211; это отличный движок для создания своей социальной сети, множество настроек, плагинов, но самое главное &#8211; серьезно мощный и простой в понимании код скриптов. Если имеются знания в таких языках как html, php и JavaScript, можно с легкостью переписать код скриптов <strong>SocialEngine Excalibur</strong> под свои нужды.</p>
<p>У нас возникла проблема, когда необходимо было добавить новые поля в профиль участника: <strong>страну</strong>, <strong>регион</strong> и <strong>город</strong>. В скрипте <strong>SocialEngine Excalibur</strong>, который имеется у нас, была база с этими данными, в файлах присутствовал код, ответственен за работу с данными полями. Но возник вопрос, почему при редактировании профиля не было этих полей?</p>
<p>Сначала искали ответ на этот вопрос на форуме <strong>SocialEngine Excalibur</strong>, даже создали свою тему, но ответа так и не получили. Я решил, что ответ мы не получим и если получим, то не скоро. Было принято решение сделать все своими руками, применив знания программирования.</p>
<h3 class="addonpage">SocialEngine Excalibur</h3>
<p>Для того чтобы поля «<strong>Страна</strong>», «<strong>Регион</strong>» и «<strong>Город</strong>» появились в <strong>SocialEngine Excalibur</strong> в разделе «<strong>Редактировать профиль</strong>» необходимо:<span id="more-321"></span></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><br />
<strong>Найти</strong><br />
<strong>Подсказка:</strong> Возможно, здесь приведена не вся строка, а лишь ее часть.</p>
<blockquote><p><code>&lt;div class='form_desc'&gt;{lang_print id=$fields[field_loop].field_desc}&lt;/div&gt;</code></p>
<p>{capture assign=&#8217;current_subnet&#8217;}{lang_print id=$user-&gt;subnet_info.subnet_name}{/capture}</p>
<p>{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}</p>
<p>{capture assign=&#8217;field_error&#8217;}{lang_print id=$fields[field_loop].field_error}{/capture}</p>
<p>{if $field_error != &laquo;&raquo;}&lt;div class=&#8217;form_error&#8217;&gt;&lt;img src=&#8217;./images/icons/error16.gif&#8217; border=&#8217;0&#8242; class=&#8217;icon&#8217;&gt; {$field_error}&lt;/div&gt;{/if}</p>
<p>&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>{/section}</p></blockquote>
<p><strong>Добавить после</strong></p>
<p><strong>Подсказка:</strong> Добавьте эти строки на новой строке после ранее найденных строк.</p>
<blockquote><p><code>{if $cat_id == 3}</code></p>
<p>&lt;tr&gt;</p>
<p>&lt;td class=&#8217;form1&#8242; width=&#8217;150&#8242;&gt;Страна&lt;/td&gt;</p>
<p>&lt;td class=&#8217;form2&#8242;&gt;</p>
<p>&lt;div&gt;&lt;select name=&#8217;dhtmlgoodies_country&#8217; id=&#8217;dhtmlgoodies_country&#8217; onchange=&raquo;getRegionList(this.value);&raquo;&gt;</p>
<p>&lt;option id=&#8217;op&#8217; value=&#8217;-1&#8242;&gt;&lt;/option&gt;</p>
<p>{$country}&lt;/select&gt;</p>
<p>&lt;/div&gt;</p>
<p>&lt;div id=&#8217;dhtmlgoodies_country&#8217;&gt;</p>
<p>Страна, в которой Вы в текущий момент проживаете.</p>
<p>&lt;/div&gt;</p>
<p>&lt;div class=&#8217;form_desc&#8217;&gt;&lt;/div&gt;</p>
<p>&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td class=&#8217;form1&#8242; width=&#8217;150&#8242;&gt;Регион&lt;/td&gt;</p>
<p>&lt;td class=&#8217;form2&#8242;&gt;</p>
<p>&lt;div&gt;&lt;select name=&#8217;dhtmlgoodies_region&#8217; id=&#8217;dhtmlgoodies_region&#8217; onchange=&raquo;getCityList(this.value);&raquo;&gt;</p>
<p>&lt;option id=&#8217;op&#8217; value=&#8217;-1&#8242;&gt;&lt;/option&gt;</p>
<p>{$region}&lt;/select&gt;</p>
<p>&lt;/div&gt;</p>
<p>&lt;div id=&#8217;dhtmlgoodies_region&#8217;&gt;</p>
<p>Регион, в котором Вы в текущий момент проживаете.</p>
<p>&lt;/div&gt;</p>
<p>&lt;div class=&#8217;form_desc&#8217;&gt;&lt;/div&gt;</p>
<p>&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td class=&#8217;form1&#8242; width=&#8217;150&#8242;&gt;Город&lt;/td&gt;</p>
<p>&lt;td class=&#8217;form2&#8242;&gt;</p>
<p>&lt;div&gt;&lt;select name=&#8217;dhtmlgoodies_city&#8217; id=&#8217;dhtmlgoodies_city&#8217;&gt;</p>
<p>&lt;option id=&#8217;op&#8217; value=&#8217;-1&#8242;&gt;&lt;/option&gt;</p>
<p>{$city}&lt;/select&gt;</p>
<p>&lt;/div&gt;</p>
<p>&lt;div id=&#8217;dhtmlgoodies_city&#8217;&gt;</p>
<p>Город, в котором Вы в текущий момент проживаете.</p>
<p>&lt;/div&gt;</p>
<p>&lt;div class=&#8217;form_desc&#8217;&gt;&lt;/div&gt;</p>
<p>&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>{/if}</p></blockquote>
<p>Условие {if $cat_id == 3} отвечает за отображение полей только в подкатегории «Персональная информация», это нужно если Вы собираетесь создавать дополнительные подкатегории, как, например, у нас создана {$country}, {$region} и {$city} &#8211; данные, которые формируются php-скриптом в файле user_editprofile.php</li>
<li><strong>Открыть: header_global.tpl</strong><br />
<strong>Найти</strong></p>
<blockquote><p><code>var countryCode = sel.options[sel.selectedIndex].value;</code></p></blockquote>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<blockquote><p><code>var countryCode = sel;</code></p></blockquote>
<p><strong> </strong></p>
<p><strong>Найти</strong><strong> </strong></p>
<blockquote><p><code>var regionCode = sel.options[sel.selectedIndex].value;</code></p></blockquote>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<blockquote><p><code>var regionCode = sel;</code></p></blockquote>
</li>
<p><strong>Открыть: user_editprofile.</strong><strong>php</strong><strong> </strong></p>
<p><strong>Найти</strong><strong> </strong></p>
<blockquote><p><code>if(isset($_POST['dhtmlgoodies_country'])) {</code></p>
<p>$country=$_POST['dhtmlgoodies_country'];</p>
<p>$sql = &laquo;<strong>SELECT</strong> profilevalue_7 <strong>FROM</strong> cites_profilevalues <strong>WHERE</strong> profilevalue_id=$id_ex LIMIT 1&#8243;;</p>
<p>if(!$database-&gt;database_query($sql))</p>
<p>{</p>
<p>$query=&raquo;<strong>INSERT INTO</strong> &#8216;cites_profilevalues&#8217; (&#8216;profilevalue_id&#8217;, &#8216;profilevalue_7&#8242;) <strong>VALUES</strong> ($id_ex,&#8217;$country&#8217;)&raquo;;</p>
<p>$database-&gt;database_query($query);</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>$query=&raquo;<strong>UPDATE</strong> &#8216;cites_profilevalues&#8217; <strong>SET</strong> &#8216;profilevalue_7&#8242; = &#8216;$country&#8217; <strong>WHERE</strong> &#8216;cites_profilevalues&#8217;.'profilevalue_id&#8217; = $id_ex&raquo;;</p>
<p>$database-&gt;database_query($query);</p>
<p>}</p>
<p>}</p>
<p>if(isset($_POST['dhtmlgoodies_region'])) {</p>
<p>$region=$_POST['dhtmlgoodies_region'];</p>
<p>$sql = &laquo;<strong>SELECT</strong> profilevalue_8 <strong>FROM</strong> cites_profilevalues <strong>WHERE</strong> profilevalue_id=$id_ex LIMIT 1&#8243;;</p>
<p>if(!$database-&gt;database_query($sql))</p>
<p>{</p>
<p>$query=&raquo;<strong>INSERT INTO</strong> &#8216;cites_profilevalues&#8217; (&#8216;profilevalue_id&#8217;, &#8216;profilevalue_8&#8242;) <strong>VALUES</strong> ($id_ex,&#8217;$region&#8217;)&raquo;;</p>
<p>$database-&gt;database_query($query);</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>$query=&raquo;<strong>UPDATE</strong> &#8216;cites_profilevalues&#8217; <strong>SET</strong> &#8216;profilevalue_8&#8242; = &#8216;$region&#8217; <strong>WHERE</strong> &#8216;cites_profilevalues&#8217;.'profilevalue_id&#8217; = $id_ex&raquo;;</p>
<p>$database-&gt;database_query($query);</p>
<p>}</p>
<p>}</p>
<p>if(isset($_POST['dhtmlgoodies_city'])) {</p>
<p>$city=$_POST['dhtmlgoodies_city'];</p>
<p>$sql = &laquo;<strong>SELECT</strong> profilevalue_9 <strong>FROM</strong> cites_profilevalues <strong>WHERE</strong> profilevalue_id=$id_ex <strong>LIMIT</strong> 1&#8243;;</p>
<p>if(!$database-&gt;database_query($sql))</p>
<p>{</p>
<p>$query=&raquo;<strong>INSERT INTO</strong> &#8216;cites_profilevalues&#8217; (&#8216;profilevalue_id&#8217;, &#8216;profilevalue_9&#8242;) <strong>VALUES</strong> ($id_ex,&#8217;$city&#8217;)&raquo;;</p>
<p>$database-&gt;database_query($query);</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>$query=&raquo;<strong>UPDATE</strong> &#8216;cites_profilevalues&#8217; <strong>SET</strong> &#8216;profilevalue_9&#8242; = &#8216;$city&#8217; <strong>WHERE</strong> &#8216;cites_profilevalues&#8217;.'profilevalue_id&#8217; = $id_ex&raquo;;</p>
<p>$database-&gt;database_query($query);</p>
<p>}</p>
<p>}</p></blockquote>
<p><strong>Заменить</strong></p>
<p><strong>Подсказка:</strong> Произведите замену ранее найденных строк.</p>
<blockquote><p><code>if(isset($_POST['dhtmlgoodies_country']))</code></p>
<p>{</p>
<p>$country=$_POST['dhtmlgoodies_country'];</p>
<p>$country_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&laquo;<strong>SELECT</strong> profilevalue_id <strong>FROM</strong> cites_profilevalues <strong>WHERE</strong> profilevalue_id=&#8217;&raquo;.$user-&gt;user_info['user_id'].&raquo;&#8216; <strong>LIMIT</strong> 1&#8243;));</p>
<p>$country_id = $country_tb[profilevalue_id];</p>
<p>if($country_id &lt;= 0)</p>
<p>{</p>
<p>$query=&raquo;<strong>INSERT INTO</strong> &#8216;cites_profilevalues&#8217; (&#8216;profilevalue_id&#8217;, &#8216;profilevalue_7&#8242;) <strong>VALUES</strong> ($id_ex,&#8217;$country&#8217;)&raquo;;</p>
<p>$database-&gt;database_query($query);</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>$query=&raquo;<strong>UPDATE</strong> &#8216;cites_profilevalues&#8217; <strong>SET</strong> &#8216;profilevalue_7&#8242; = &#8216;$country&#8217; <strong>WHERE</strong> &#8216;cites_profilevalues&#8217;.'profilevalue_id&#8217; = &#8216;&raquo;.$user-&gt;user_info['user_id'].&raquo;&#8216;&raquo;;</p>
<p>$database-&gt;database_query($query);</p>
<p>}</p>
<p>}</p>
<p>if(isset($_POST['dhtmlgoodies_region']))</p>
<p>{</p>
<p>$region=$_POST['dhtmlgoodies_region'];</p>
<p>$region_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&laquo;<strong>SELECT</strong> profilevalue_id <strong>FROM</strong> cites_profilevalues <strong>WHERE</strong> profilevalue_id=&#8217;&raquo;.$user-&gt;user_info['user_id'].&raquo;&#8216; <strong>LIMIT</strong> 1&#8243;));</p>
<p>$region_id = $region_tb[profilevalue_id];</p>
<p>//$sql = &laquo;<strong>SELECT</strong> profilevalue_8 <strong>FROM</strong> cites_profilevalues <strong>WHERE</strong> profilevalue_id=$id_ex <strong>LIMIT</strong> 1&#8243;;</p>
<p>if($region_id &lt;= 0)</p>
<p>{</p>
<p>$query=&raquo;<strong>INSERT INTO</strong> &#8216;cites_profilevalues&#8217; (&#8216;profilevalue_id&#8217;, &#8216;profilevalue_8&#8242;) <strong>VALUES</strong> ($id_ex,&#8217;$region&#8217;)&raquo;;</p>
<p>$database-&gt;database_query($query);</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>$query=&raquo;<strong>UPDATE</strong> &#8216;cites_profilevalues&#8217; <strong>SET</strong> &#8216;profilevalue_8&#8242; = &#8216;$region&#8217; <strong>WHERE</strong> &#8216;cites_profilevalues&#8217;.'profilevalue_id&#8217; = &#8216;&raquo;.$user-&gt;user_info['user_id'].&raquo;&#8216;&raquo;;</p>
<p>$database-&gt;database_query($query);</p>
<p>}</p>
<p>}</p>
<p>if(isset($_POST['dhtmlgoodies_city']))</p>
<p>{</p>
<p>$city=$_POST['dhtmlgoodies_city'];</p>
<p>$city_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&laquo;<strong>SELECT</strong> profilevalue_id <strong>FROM</strong> cites_profilevalues <strong>WHERE</strong> profilevalue_id=&#8217;&raquo;.$user-&gt;user_info['user_id'].&raquo;&#8216; <strong>LIMIT</strong> 1&#8243;));</p>
<p>$city_id = $city_tb[profilevalue_id];</p>
<p>//$sql = &laquo;<strong>SELECT</strong> profilevalue_9 <strong>FROM</strong> cites_profilevalues <strong>WHERE</strong> profilevalue_id=&#8217;&raquo;.$user-&gt;user_info['user_id'].&raquo;&#8216; <strong>LIMIT</strong> 1&#8243;;</p>
<p>if($city_id &lt;= 0)</p>
<p>{</p>
<p>$query=&raquo;<strong>INSERT INTO</strong> &#8216;cites_profilevalues&#8217; (&#8216;profilevalue_id&#8217;, &#8216;profilevalue_9&#8242;) <strong>VALUES</strong> ($id_ex,&#8217;$city&#8217;)&raquo;;</p>
<p>$database-&gt;database_query($query);</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>$query=&raquo;<strong>UPDATE</strong> &#8216;cites_profilevalues&#8217; <strong>SET</strong> &#8216;profilevalue_9&#8242; = &#8216;$city&#8217; <strong>WHERE</strong> &#8216;cites_profilevalues&#8217;.'profilevalue_id&#8217; = &#8216;&raquo;.$user-&gt;user_info['user_id'].&raquo;&#8216;&raquo;;</p>
<p>$database-&gt;database_query($query);</p>
<p>}</p>
<p>}</p></blockquote>
<p><strong>Найти</strong><strong> </strong></p>
<blockquote><p><code>$sql = $database-&gt;database_query ("<strong>SELECT</strong> * <strong>FROM</strong> country");</code></p>
<p>$countries = array ();</p>
<p>while ($country = $database-&gt;database_fetch_assoc ($sql))</p>
<p>{</p>
<p>$countries[] = $country;</p>
<p>}</p>
<p>$smarty-&gt;assign(&#8216;countries&#8217;, $countries);</p></blockquote>
<p><strong>Заменить</strong><strong> </strong></p>
<p><strong>Подсказка</strong><strong>:</strong> Произведите замену ранее найденных строк.</p>
<blockquote><p><code>$country_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query("<strong>SELECT</strong> profilevalue_7 <strong>FROM</strong> cites_profilevalues <strong>WHERE</strong> profilevalue_id='".$user-&gt;user_info['user_id']."' <strong>LIMIT</strong> 1"));</code></p>
<p>$country_id = $country_tb[profilevalue_7];</p>
<p>$sql = $database-&gt;database_query (&laquo;<strong>SELECT</strong> * <strong>FROM</strong> country&raquo;);</p>
<p>while ($country_bd = $database-&gt;database_fetch_assoc ($sql))</p>
<p>{</p>
<p>if($country_id == $country_bd[country_id])</p>
<p>$country_sel = &raquo; SELECTED&raquo;;</p>
<p>else</p>
<p>$country_sel = &laquo;&raquo;;</p>
<p>$country .= &laquo;&lt;option value=&#8217;&raquo; . $country_bd[country_id] . &laquo;&#8216;&raquo; . $country_sel . &laquo;&gt;&raquo; . $country_bd[name] . &laquo;&lt;/option&gt;\n&raquo;;</p>
<p>}</p>
<p>$region_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&laquo;<strong>SELECT</strong> profilevalue_8 <strong>FROM</strong> cites_profilevalues <strong>WHERE</strong> profilevalue_id=&#8217;&raquo;.$user-&gt;user_info['user_id'].&raquo;&#8216; <strong>LIMIT</strong> 1&#8243;));</p>
<p>$region_id = $region_tb[profilevalue_8];</p>
<p>if($region_id &gt; 0)</p>
<p>{</p>
<p>$region_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&laquo;<strong>SELECT</strong> region_id, name <strong>FROM</strong> region <strong>WHERE</strong> region_id=&#8217;&raquo;.$region_id.&raquo;&#8216; <strong>LIMIT</strong> 1&#8243;));</p>
<p>$region .= &laquo;&lt;option value=&#8217;&raquo; . $region_tb[region_id] . &laquo;&#8216; SELECTED&gt;&raquo; . $region_tb[name] . &laquo;&lt;/option&gt;\n&raquo;;</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>$sql = $database-&gt;database_query (&laquo;<strong>SELECT</strong> * <strong>FROM</strong> region&raquo;);</p>
<p>while ($region_bd = $database-&gt;database_fetch_assoc ($sql))</p>
<p>{</p>
<p>if($region_id == $region_bd[region_id])</p>
<p>$region_sel = &raquo; SELECTED&raquo;;</p>
<p>else</p>
<p>$region_sel = &laquo;&raquo;;</p>
<p>$region .= &laquo;&lt;option value=&#8217;&raquo; . $region_bd[region_id] . &laquo;&#8216;&raquo; . $region_sel . &laquo;&gt;&raquo; . $region_bd[name] . &laquo;&lt;/option&gt;\n&raquo;;</p>
<p>}</p>
<p>}</p>
<p>$city_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&laquo;<strong>SELECT</strong> profilevalue_9 <strong>FROM</strong> cites_profilevalues <strong>WHERE</strong> profilevalue_id=&#8217;&raquo;.$user-&gt;user_info['user_id'].&raquo;&#8216; <strong>LIMIT</strong> 1&#8243;));</p>
<p>$city_id = $city_tb[profilevalue_9];</p>
<p>if($city_id &gt; 0)</p>
<p>{</p>
<p>$city_tb = $database-&gt;database_fetch_assoc($database-&gt;database_query(&laquo;<strong>SELECT</strong> city_id, name <strong>FROM</strong> city <strong>WHERE</strong> city_id=&#8217;&raquo;.$city_id.&raquo;&#8216; <strong>LIMIT</strong> 1&#8243;));</p>
<p>$city .= &laquo;&lt;option value=&#8217;&raquo; . $city_tb[city_id] . &laquo;&#8216; SELECTED&gt;&raquo; . $city_tb[name] . &laquo;&lt;/option&gt;\n&raquo;;</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>$sql = $database-&gt;database_query (&laquo;<strong>SELECT</strong> * <strong>FROM</strong> city <strong>ORDER BY</strong> name <strong>ASC</strong>&laquo;);</p>
<p>while ($city_bd = $database-&gt;database_fetch_assoc ($sql))</p>
<p>{</p>
<p>if($city_id == $city_bd[city_id])</p>
<p>$city_sel = &raquo; SELECTED&raquo;;</p>
<p>else</p>
<p>$city_sel = &laquo;&raquo;;</p>
<p>$city .= &laquo;&lt;option value=&#8217;&raquo; . $city_bd[city_id] . &laquo;&#8216;&raquo; . $city_sel . &laquo;&gt;&raquo; . $city_bd[name] . &laquo;&lt;/option&gt;\n&raquo;;</p>
<p>}</p>
<p>}</p>
<p>$smarty-&gt;assign(&#8216;country&#8217;, $country);</p>
<p>$smarty-&gt;assign(&#8216;region&#8217;, $region);</p>
<p>$smarty-&gt;assign(&#8216;city&#8217;, $city);</p></blockquote>
</ol>
<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>
<p><strong>Email:<em> evteev_e2003@mail.ru</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>Перед написанием программы разберемся, в чем суть алгоритма RLE? Суть алгоритма состоит в том, что последовательность из n одинаковых символов k заменяется парой символов nk. Например, нужно закодировать строку “aaaaarooow”, после кодирования по алгоритму RLE получаем сжатую строку вида “5ar3ow”. Кодированная строка на 4 символа меньше, соответственно эффективность алгоритма доказана. Теперь можно приступить к реализации данного алгоритма в виде программного кода на C#.</p>
<p>Текст, который нужно будет кодировать, получим из текстового поля “text_input” и запишем в строковую переменную “str1”. Далее будем пробегать по каждому символу в этой строке, получать текущий символ в строковую переменную “ch”. В том случае, если данный символ равен следующему, продолжаем поиск количества таких символов, начиная текущей позиции в строке.</p>
<p>После всего этого формируем кодируемую строку равную количеству найденных символов и самому символу, которых повторяется друг за другом n-e количество раз. Если найден только один символ строка принимает значение равное этому символу.<br />
Все выше описанные операции выполняются до тех пор, пока не будет достигнут конец файла.</p>
<blockquote><p><code>            string str1 = text_input.Text, str = "", ch = "";<br />
            int i, k, j;<br />
            for (i = 0; i < str1.Length; ) // от 0 до длины строки<br />
            {<br />
                ch = str1.Substring(i, 1); // получаем текущий символ из строки str1<br />
                k = 0; //счетчик количества повторяющихся символов<br />
                if (i == str1.Length - 1) // если последний символ<br />
                {<br />
                    str += Convert.ToString(ch);<br />
                    break; //выходим из цикла<br />
                }<br />
                if (str1.Substring(i + 1, 1) == ch)<br />
                {<br />
                    for (j = i; j < str1.Length; j++)<br />
                    {<br />
                        if (str1.Substring(j, 1) == ch)//если текущий символ равен символу из строки ch<br />
                        {<br />
                            k++;//увеличиваем счетчик<br />
                        }<br />
                        else<br />
                            break; //выходим из цикла<br />
                    }<br />
                    i = j;<br />
                }<br />
                else<br />
                    i++;<br />
                if (k != 0)<br />
                    str += Convert.ToString(k) + Convert.ToString(ch);<br />
                else<br />
                    str += Convert.ToString(ch);</p>
<p>            }<br />
            text_output.Text = str;<br />
            button2.Enabled = true;</code></code></p></blockquote>
<p><span id="more-319"></span></p>
<p>Кодировку успешно выполнили, теперь напишем декодировку строки, кодированную при помощи алгоритма RLE. Декодирование закодированной строки выполняется путем поиска числа, которое является количеством повторений символа и самого символа.<br />
И так, получаем закодированную строку из текстового поля “textBox1” и записывает полученный текст в переменную “str1”. При каждом проходе цикла, который выполняется, пока недостигнут последний символ, записываем в переменную “ch” текущий символ и если он является цифрой, выполняем поиск цифр идущих друг за другом. Тем самым последовательность найденных цифр будет представлять собой число, являющееся количеством повторений символа, идущего сразу же после этой последовательности. В конце в строковую переменную “str” записываем букву столько раз, сколько равно значение числа.</p>
<blockquote><p><code>           string str1 = textBox1.Text, str = "", ch = "", s = "", symb = "";<br />
            int i, k = 0, j;<br />
            for (i = 0; i < str1.Length; )<br />
            {<br />
                ch = str1.Substring(i, 1); // текущий символ i<br />
                k = 0;<br />
                s = "";<br />
                if ("0123456789".Contains(ch)) // если символ ch является цифрой<br />
                {<br />
                    for (j = i; j < str1.Length; j++)<br />
                    {<br />
                        if ("0123456789".Contains(str1.Substring(j, 1))) // если текущий символ j является цифрой<br />
                        {<br />
                            s += str1.Substring(j, 1);<br />
                        }<br />
                        else<br />
                            break;<br />
                    }<br />
                    symb = str1.Substring(j, 1); // получаем букву<br />
                    i = j + 1;<br />
                }<br />
                else<br />
                    i++;<br />
                if (s.Length != 0)<br />
                {<br />
                    for (j = 0; j < Convert.ToInt32(s); j++) // декодирование буквы<br />
                        str += symb;<br />
                }<br />
                else<br />
                    str += Convert.ToString(ch);<br />
            }<br />
            out_shifr.Text = str;</code></code></p></blockquote>
<p>В данной программе реализовано кодирование и декодирование строки, используя алгоритм сжатия данных RLE.</p>
<blockquote><p><strong>Автор</strong>: <em>Евтеев Евгений Александрович</em><br />
<strong>Email</strong>: <em>evteev_e2003@mail.ru</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>
		<item>
		<title>Получить последовательность a1…an цифр 0,1,2, в которой нет смежных одинаковых участков</title>
		<link>http://statprog.ru/2009/05/18/poluchit-posledovatelnost-a1%e2%80%a6an-cifr-012-v-kotoroj-net-smezhnyx-odinakovyx-uchastkov/</link>
		<comments>http://statprog.ru/2009/05/18/poluchit-posledovatelnost-a1%e2%80%a6an-cifr-012-v-kotoroj-net-smezhnyx-odinakovyx-uchastkov/#comments</comments>
		<pubDate>Mon, 18 May 2009 15:12:21 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>

		<guid isPermaLink="false">http://statprog.ru/?p=301</guid>
		<description><![CDATA[Программа должна генерировать последовательность любой длины из цифр 0, 1 и 2, но она не должна содержать в себе одинаковых участков таких как, например, последовательность 1010 – недопустимо, т.к. участки 10 и 10 расположены один за другим; последовательность 120120 – имеются два одинаковых участка 120 и 120.
Напишем функцию “check_str”, которая будет возвращать “false” в случае [...]]]></description>
			<content:encoded><![CDATA[<p>Программа должна генерировать последовательность любой длины из цифр 0, 1 и 2, но она не должна содержать в себе одинаковых участков таких как, например, последовательность 1010 – недопустимо, т.к. участки 10 и 10 расположены один за другим; последовательность 120120 – имеются два одинаковых участка 120 и 120.</p>
<p>Напишем функцию “check_str”, которая будет возвращать “false” в случае если найден одинаковый участок в последовательности “s”.</p>
<blockquote><p><code>Boolean check_str(string s)<br />
        {<br />
            string start, end;<br />
            for (int i = 1; i < = s.Length / 2; i++)<br />
            {<br />
                start = s.Substring(0, s.Length - i);<br />
                end = s.Substring(s.Length - i, i);<br />
                if (start.Length < end.Length)<br />
                    return true;<br />
                if (start.Substring(start.Length - i, i) == end)<br />
                    return false;<br />
            }<br />
            return true;<br />
        }</code></code></p></blockquote>
<p>В функции выполняется проверка на все возможные смежные одинаковые участки. Разберем работу функции на примере последовательности 120120. Для выполнения всех проверок достаточно всего 3 прохода, при первом проходе сравниваются последние цифры 1201<strong>2</strong><strong>0</strong>, если они равны, то одинаковый участок найден и выполняется завершение работы функции, в противном случае выполняется 2-й проход и уже сравниваются цифры 01 и 20. При следующем и последнем проходе сравниваются первые и последние 3 цифры 120 и 120, вот теперь они равны и производится выход из функции, возвращается значение “false”.<span id="more-301"></span><br />
Теперь рассмотрим код процедуры “generate_Click”, которая вызывается при нажатии на кнопку “generate”.</p>
<blockquote><p><code>private void generate_Click(object sender, EventArgs e)<br />
        {<br />
            int kol = Convert.ToInt32(kolvo.Text);<br />
            Random r = new Random();<br />
            generate_num.Clear();<br />
            int x;<br />
            string s = "";<br />
            for (int i = 1; i < = kol; i++)<br />
            {<br />
                for (; ; )<br />
                {<br />
                    x = r.Next(0, 3);<br />
                    if (i == 1)<br />
                    {<br />
                        s = Convert.ToString(x);</p>
<p>                        break;<br />
                    }<br />
                    if (check_str(s + Convert.ToString(x)))<br />
                    {<br />
                        s += Convert.ToString(x);<br />
                        break;<br />
                    }<br />
                    else<br />
                    {<br />
                        if (!check_str(s + "0") &#038;&#038; !check_str(s + "1") &#038;&#038; !check_str(s + "2"))<br />
                        {<br />
                            generate_num.Text = s + " (Дальнейшая генерация числа невозможна)";<br />
                            return;<br />
                        }<br />
                    }<br />
                }<br />
            }<br />
            generate_num.Text += s;<br />
        }</code></code></p></blockquote>
<p>В этом процедуре происходит автоматическая генерация цифр от 0 до 2, добавление цифры к строке “s” (в случае положительного результата от функции “check_str”) и вывод сгенерированной последовательности на форму пользователя.<br />
Бывают такие случаи, когда невозможна дальнейшая генерации последовательности, в этом случае выводится последовательность и текст “(Дальнейшая генерация числа невозможна)”.</p>
<blockquote><p><strong>Автор</strong>: <em>Евтеев Евгений Александрович</em><br />
<strong>Email</strong>: <em>evteev_e2003@mail.ru</em></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://statprog.ru/2009/05/18/poluchit-posledovatelnost-a1%e2%80%a6an-cifr-012-v-kotoroj-net-smezhnyx-odinakovyx-uchastkov/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
