<?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://about-programming.ru/feed" rel="self" type="application/rss+xml" />
	<link>http://about-programming.ru</link>
	<description>Все о программировании - языки программирования скачать (Basic, C, C++, C#, Delphi, Pascal, Java, PHP)</description>
	<lastBuildDate>Mon, 19 Jul 2010 16:44:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Как ускорить работу Windows XP</title>
		<link>http://about-programming.ru/operacionnye-sistemy/655.html</link>
		<comments>http://about-programming.ru/operacionnye-sistemy/655.html#comments</comments>
		<pubDate>Fri, 02 Jul 2010 14:09:17 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Windows XP]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=655</guid>
		<description><![CDATA[Есть множество ответов на вопрос Как ускорить работу Windows XP. Например, можно отключить различные анимации и эффекты рабочего стола. Сделать это можно выполнив несколько шагов: Щелкнуть правой кнопкой мыши по пиктограмме: My Computer (Мой компьютер). Выбрать: Properties (Свойства) > вкладка &#8216;Advanced&#8217; (Дополнительно) > Performance (Быстродействие) > кнопка &#8216;Settings&#8217; (Параметры) > вкладка &#8216;Visual effects&#8217; (Визуальные эффекты). [...]]]></description>
			<content:encoded><![CDATA[<p>Есть множество ответов на вопрос <strong>Как ускорить работу Windows XP</strong>.</p>
<p>Например, можно отключить различные анимации и эффекты рабочего стола. Сделать это можно выполнив несколько шагов:<br />
Щелкнуть правой кнопкой мыши по пиктограмме: My Computer (Мой компьютер). Выбрать: Properties (Свойства) > вкладка &#8216;Advanced&#8217; (Дополнительно) > Performance (Быстродействие) > кнопка &#8216;Settings&#8217; (Параметры) > вкладка &#8216;Visual effects&#8217; (Визуальные эффекты).<br />
Выбрать: Adjust for best performance (Обеспечить наилучшее быстродействие).<br />
Щелкнуть мышью по кнопке: Apply (Применить).<br />
Этим можно неплохо <strong>ускорить работу Windows XP</strong>.<span id="more-655"></span></p>
<p>Еще можно <strong>оптимизировать использование памяти</strong>:<br />
Щелкнуть правой кнопкой мыши по пиктограмме: My Computer (Мой компьютер). Выбрать: Properties (Свойства) > вкладка &#8216;Advanced&#8217; (Дополнительно) > Performance (Быстродействие) > кнопка &#8216;Settings&#8217; (Параметры) > вкладка &#8216;Advanced&#8217; (Дополнительно). Выбрать: Processor scheduling (Распределение времени процессора) > Programs (Оптимизировать работу программ).<br />
Выбрать: Memory usage (Использование памяти) > Programs (Оптимизировать работу программ).<br />
Щелкнуть мышью по кнопке: Apply (Применить). </p>
<p>Использование классической темы позволит <strong>ускорить работу Windows XP</strong>.<br />
Start (Пуск) > Control Panel (Панель управления) > Display (Экран) > Themes (Темы).<br />
Выбрать: Windows Classic (Классическая).<br />
Щелкнуть мышью по кнопке: Apply (Применить). </p>
<p>Использование обоев на рабочем столе увеличивает расход оперативной памяти, убрав обои, можно <strong>ускорить работу Windows XP</strong>.<br />
Start (Пуск) > Control Panel (Панель управления) > Display (Экран) > Desktop (Рабочий стол).<br />
Выбрать: Background &#8211; None (Фоновый рисунок: (нет)).<br />
Щелкнуть мышью по кнопке: Apply (Применить). </p>
<p><strong>Ускорить работу Windows XP</strong> можно путем отключения системных Служб. Отключить их можно разными путями: в командную строку ввести команду services.msc или в меню &laquo;Администрирование&raquo; в разделе &laquo;Службы&raquo; выбрать свойство нужной службы. Второй путь более рационален, т.к. вы не забудете, что отключали и в любое время можете восстановить &#8211; &laquo;Настройка системы&raquo; (msconfig.exe). Перед отключением какой-либо службы, посмотрите &laquo;Зависимости&raquo; в свойстве этой службы, какие компоненты зависят от отключаемой вами службы. </p>
<p>С помощью специальных программ можно хорошо <strong>ускорить работу Windows XP</strong>.<br />
Выполнение таких действий как чистка диска, чистка реестра, дефрагментация диска, оптимизация диска, дефрагментация реестра позволит значительно <strong>ускорить работу Windows XP</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/operacionnye-sistemy/655.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как узнать IP и MAC адрес своего компьютера на C++</title>
		<link>http://about-programming.ru/ccc/591.html</link>
		<comments>http://about-programming.ru/ccc/591.html#comments</comments>
		<pubDate>Mon, 04 Jan 2010 19:33:08 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[IP адрес]]></category>
		<category><![CDATA[MAC адрес]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=591</guid>
		<description><![CDATA[Как узнать IP и MAC адрес моего компа в сети на C++ Для определения мы будем пользоваться функциями gethostname и gethostbyname из библиотеки winsock.h. Если у вас два и более сетевых подключений, программа покажет IP адрес первого в очереди. #include &#60;winsock.h&#62; #include &#60;windows.h&#62; int main (int argc, char* argv[]) { const int WSVer = 0×101; [...]]]></description>
			<content:encoded><![CDATA[<h3>Как узнать IP и MAC адрес моего компа в сети на C++</h3>
<p>Для определения мы будем пользоваться функциями <strong>gethostname</strong> и <strong>gethostbyname</strong> из библиотеки <strong>winsock.h.</strong> Если у вас два и более сетевых подключений, программа покажет <strong>IP адрес</strong> первого в очереди.<span id="more-591"></span></p>
<blockquote><p><strong>#include &lt;winsock.h&gt;<br />
#include &lt;windows.h&gt;</strong></p>
<p><strong>int main (int argc, char* argv[])<br />
{<br />
const int WSVer  =  0×101;<br />
WSAData wsaData;<br />
hostent *h;<br />
char Buf[128];<br />
if  (WSAStartup (WSVer,  &amp;wsaData)  ==  0)<br />
{<br />
if (gethostname (&amp;Buf[0],  128)  ==  0)<br />
{<br />
h = gethostbyname (&amp;Buf[0]);<br />
if  (h  !=  NULL)      MessageBox (0,inet_ntoa (*(reinterpret_cast&lt;in_addr *&gt;(*(h-&gt;h_addr_list)))),0,0);<br />
else             MessageBox (0,&raquo;Вы не в сети. И IP адреса у вас нет.&raquo;,0,0);<br />
}<br />
WSACleanup;<br />
}<br />
return 0;<br />
}</strong></p></blockquote>
<p>Также можно воспользоваться WinAPI функцией <strong>GetAdaptersInfo</strong>. Она тебе вернет информацию по всем сетевым адаптерам системы.WinAPI фукнции очень полезная вещь, рекомендую тебе почаще листать справочник.</p>
<p><strong><a href="http://about-programming.ru/ccc/591.html">Узнать MAC адрес</a></strong> можно как предыдущим способом, с помощью <strong>GetAdaptersInfo</strong>. Но также и другим:</p>
<blockquote><p><strong>#include &lt;stdio.h&gt;<br />
#include &lt;windows.h&gt;<br />
#include &lt;Winsock2.h&gt;<br />
#include &lt;Iphlpapi.h&gt;</strong></p>
<p><strong>///&#8212;&#8212;&#8211; cpp-файл &#8212;&#8212;&#8212;- </strong></p>
<p><strong>#include «stdafx.h»<br />
char ip[]=&raquo;192.168.100.1&#8243;;</strong></p>
<p><strong>int main (int argc, char* argv[])<br />
{<br />
//Будем использовать сокеты<br />
WSADATA WsaData;<br />
DWORD _ip=inet_addr (ip);<br />
if (WSAStartup (0×0202, &amp;WsaData)==NULL)<br />
printf («WSA Starup OK!\n»);</strong></p>
<p><strong>//Создаём UDP-сокет и отсылаем по нему любые данные<br />
SOCKET udp_s;<br />
SOCKADDR_IN udp_sin;<br />
udp_s=socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);<br />
if (udp_s!=SOCKET_ERROR)<br />
{<br />
udp_sin.sin_family = AF_INET;<br />
udp_sin.sin_port = htons (5232); //Шлём на любой порт.<br />
udp_sin.sin_addr.s_addr = _ip;<br />
if (sendto (udp_s, «TEST», 5, NULL, (SOCKADDR*)&amp;udp_sin, sizeof (udp_sin))&gt;0)<br />
{ //Пакет отослан. Вытаскиваем MAC-адрес из системы<br />
MIB_IPNETTABLE * pIpNetTable = (MIB_IPNETTABLE *) new char[0xFFFF];<br />
ULONG cbIpNetTable = 0xFFFF;<br />
if (NO_ERROR == GetIpNetTable (pIpNetTable, &amp;cbIpNetTable, TRUE))<br />
{<br />
for (DWORD i = 0; i &lt; pIpNetTable-&gt;dwNumEntries; i++)<br />
{<br />
if (pIpNetTable-&gt;table[i].dwAddr == _ip&amp;&amp;pIpNetTable-&gt;table[i].dwType != 2)<br />
{<br />
printf («IP:%s MAC:%X-%X-%X-%X-%X-%X\n», ip,<br />
pIpNetTable-&gt;table[i].bPhysAddr[0],<br />
pIpNetTable-&gt;table[i].bPhysAddr[1],<br />
pIpNetTable-&gt;table[i].bPhysAddr[2],<br />
pIpNetTable-&gt;table[i].bPhysAddr[3],<br />
pIpNetTable-&gt;table[i].bPhysAddr[4],<br />
pIpNetTable-&gt;table[i].bPhysAddr[5]);<br />
delete[] pIpNetTable;<br />
closesocket (udp_s);<br />
WSACleanup ();<br />
return 0;<br />
}<br />
}<br />
printf («MAC-address not found\n»);<br />
delete[] pIpNetTable;<br />
}<br />
else printf («ERROR Open IPMAC table\n»);<br />
}<br />
else printf («Send data ERROR!\n»);</strong></p>
<p><strong>closesocket (udp_s);<br />
}<br />
else printf («ERROR open socket\n»);</strong></p>
<p><strong>WSACleanup ();         //Освобождаем ресурсы<br />
return 0;<br />
}</strong>﻿</p></blockquote>
<p>Мой блог находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru">языки программирования</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/ccc/591.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Особенности копирования текста страницы в CppWebBrowser на C++ Builder</title>
		<link>http://about-programming.ru/ccc/586.html</link>
		<comments>http://about-programming.ru/ccc/586.html#comments</comments>
		<pubDate>Sat, 02 Jan 2010 14:05:41 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[CppWebBrowser]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=586</guid>
		<description><![CDATA[В интернете выложено несколько похожих способов копирования текста (ну или html-текста, не суть) с компоненты CppWebBrowser. Я использовал следующий рабочий вариант копирования html-текста в Memo: IHTMLDocument2 *HTMLDocument = NULL; IPersistFile *PersistFile = NULL; LONG ilFramesCount = 0; AnsiString slTmpFileExtension = ".html"; // Falls eine Seite geladen: if(!Form1->CppWebBrowser1->Busy &#038;&#038; Form1->CppWebBrowser1->Document &#038;&#038; AnsiString(Form1->CppWebBrowser1->LocationURL) != "about:blank" &#038;&#038; SUCCEEDED(Form1->CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, [...]]]></description>
			<content:encoded><![CDATA[<p>В интернете выложено несколько похожих способов копирования текста (ну или html-текста, не суть) с компоненты <strong><a href="http://about-programming.ru/tag/cppwebbrowser">CppWebBrowser</a></strong>.<br />
Я использовал следующий рабочий вариант копирования html-текста в Memo:<span id="more-586"></span></p>
<p><code><br />
IHTMLDocument2 *HTMLDocument = NULL;<br />
IPersistFile *PersistFile = NULL;<br />
LONG ilFramesCount = 0;<br />
AnsiString slTmpFileExtension = ".html";<br />
// Falls eine Seite geladen:<br />
if(!Form1-><strong>CppWebBrowser</strong>1->Busy &#038;&#038; Form1-><strong>CppWebBrowser</strong>1->Document &#038;&#038;<br />
AnsiString(Form1-><strong>CppWebBrowser</strong>1->LocationURL) != "about:blank" &#038;&#038;<br />
SUCCEEDED(Form1-><strong>CppWebBrowser</strong>1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&#038;HTMLDocument)))<br />
{<br />
// HTML-Code des Hauptdokuments speichern:<br />
       if(SUCCEEDED(HTMLDocument->QueryInterface(IID_IPersistFile,(LPVOID*)&#038;PersistFile)))<br />
       {<br />
               // HTML-Code des Hauptdokuments speichern:<br />
               PersistFile->Save(WideString(String(ExtractFilePath(ParamStr(0))+"0"+slTmpFileExtension)), false);<br />
               PersistFile->Release();<br />
               // ggf. auch Frames-Code extrahieren:<br />
               IHTMLFramesCollection2 *pFrames = NULL;<br />
               if(SUCCEEDED(HTMLDocument->get_frames(&#038;pFrames)))<br />
               {<br />
               // Anzahl der Frames bestimmen:<br />
               pFrames->get_length(&#038;ilFramesCount);<br />
               if(ilFramesCount < 2) ilFramesCount= 0;<br />
               VARIANT vFrame;<br />
               VARIANT ret;<br />
               vFrame.vt = VT_UINT;<br />
               // f?r jedes Frame:<br />
               for(LONG ilFrameIndex = 0; ilFrameIndex < ilFramesCount; ilFrameIndex++)<br />
               {<br />
                       vFrame.lVal = ilFrameIndex;<br />
                       if(SUCCEEDED(pFrames->item(&#038;vFrame, &#038;ret)))<br />
                       {<br />
                               // Zeiger auf IHTMLWindow2 des Frames besorgen:<br />
                               IHTMLWindow2 *pWindow = NULL;<br />
                               if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2,<br />
                               (LPVOID*)&#038;pWindow)))<br />
                               {<br />
                                       // Zeiger auf IHTMLDocument2 des Frames besorgen:<br />
                                       IHTMLDocument2 *pDoc = NULL;<br />
                                       if(SUCCEEDED(pWindow->get_document(&#038;pDoc)))<br />
                                       {<br />
                                               // Frame in der Datei "Framenummer.html" speichern:<br />
                                               IPersistFile *PersistFile = NULL;<br />
                                               if(SUCCEEDED(pDoc->QueryInterface(IID_IPersistFile,<br />
                                               (LPVOID*)&#038;PersistFile)))<br />
                                               {<br />
                                                       PersistFile->Save(WideString(String(ExtractFilePath(ParamStr(0))+<br />
                                                       IntToStr(ilFrameIndex+1) + slTmpFileExtension)), false);<br />
                                                       PersistFile->Release();<br />
                                               }<br />
                                               pDoc->Release();<br />
                                       }<br />
                                       pWindow->Release();<br />
                               }<br />
                       }<br />
               }<br />
               pFrames->Release();<br />
       }<br />
}<br />
HTMLDocument->Release();<br />
TStringList* pFileStrings = new TStringList;<br />
if(pFileStrings)<br />
{<br />
// Die gepufferten Dateien mit dem HTML-Code der<br />
// Seite in die RichEdit einlesen und die Dateien l?schen:<br />
       if(FileExists(ExtractFilePath(ParamStr(0))+"0"+slTmpFileExtension))<br />
               {<br />
                       Form1->Memo1->Lines->LoadFromFile(ExtractFilePath(<br />
                       ParamStr(0))+"0"+slTmpFileExtension);<br />
                       DeleteFile(ExtractFilePath(ParamStr(0))+"0"+slTmpFileExtension);<br />
               }<br />
       if(ilFramesCount > 0)<br />
               {<br />
               for(LONG ilFrameIndex = 0; ilFrameIndex < ilFramesCount; ilFrameIndex++)<br />
                       {<br />
                               if(FileExists(ExtractFilePath(ParamStr(0))+IntToStr(<br />
                               ilFrameIndex+1) + slTmpFileExtension))<br />
                               {<br />
                                       pFileStrings->LoadFromFile(ExtractFilePath(ParamStr(0))+<br />
                                       IntToStr(ilFrameIndex+1) + slTmpFileExtension);<br />
                                       Form1->Memo1->Lines->Add("\n- - - Frame " +<br />
                                       IntToStr(ilFrameIndex+1) + " - - -");<br />
                                       Form1->Memo1->Lines->Add(pFileStrings->Text);<br />
                                       DeleteFile(ExtractFilePath(ParamStr(0))+IntToStr(<br />
                                       ilFrameIndex+1) + slTmpFileExtension);<br />
                               }<br />
                       }<br />
               }<br />
       delete pFileStrings;<br />
       }<br />
}<br />
else Form1->Memo1->Lines->Clear();<br />
</code></p>
<p>Проблема в следующем&#8230; Текст извлекаю из известного сайта vkontakte.ru. Предположим, захожу в поиск людей.. мне выводится несколько страниц, к примеру по 10 человек. Копирую текст для первых 10 &#8211; всё Ок. А вот если хочу скопировать текст для следущих 10 найденных, то копируется текст снова для первых 10 В код копирования страницы не вникал ибо не особо в этих приёмах разбираюсь, а если начну разбираться то уйдёт на это много времени&#8230;<br />
Вопрос в следующем: можно как-нибудь подправить этот код или может, кто в работе с html страницами хорошо разбирается, предложит свой вариант для решения проблемы?</p>
<hr />
<p><code>AnsiString GetAllTextFromWebPage(TCppWebBrowser *wb)<br />
{<br />
        AnsiString s = wb->OleObject.OlePropertyGet("Document").OlePropertyGet("Body").OlePropertyGet("InnerText");<br />
        return s;<br />
}</code><br />
Сам на днях перерыл много инфы, ни чего толком не нашел, но пришел к такому изяществу, через COM-объект получаешь весь текст на странице<br />
Если нужен HTML код странице, меняешь только значение переменной, кажется так, пробуй:<br />
<code>AnsiString GetHTMLTextFromWebPage(TCppWebBrowser *wb)<br />
{<br />
        AnsiString s = wb->OleObject.OlePropertyGet("Document").OlePropertyGet("Body").OlePropertyGet("InnerHtml");<br />
        return s;<br />
}</code></p>
<hr />
<p>Проблема в том, что в цикле браузер не успевает загрузить содержимое страницы и на этом этапе возникает ошибка доступа. Все решиться если знать как дождаться определенного события = загрузки страницы, и только после этого запускать остальные фунциии цикла, стоит вопрос, как это сделать?</p>
<p>Проблема решается  следущим образом, в теле цикла где происходит обработка страницы пишем сразу после того как браузер получает адрес страницы <a href="http://about-programming.ru/tag/cppwebbrowser">CppWebBrowser</a>->Navigate2(URL)</p>
<p><code>while (CppWebBrowser->ReadyState != 4)<br />
{<br />
  Application->ProcessMessages();;<br />
}</code></p>
<blockquote><p><strong>Похожая статья:</strong><br />
<a href="http://about-programming.ru/ccc/586.html">Особенности копирования текста страницы в CppWebBrowser на C++ Builder</a></p></blockquote>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/ccc/586.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Пишем браузер на С++Builder</title>
		<link>http://about-programming.ru/ccc/582.html</link>
		<comments>http://about-programming.ru/ccc/582.html#comments</comments>
		<pubDate>Sat, 02 Jan 2010 13:56:28 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[CppWebBrowser]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=582</guid>
		<description><![CDATA[Продолжаю тему клонирования программ darkamster&#8217;a на Delphi в С++Builder. В этой статье я покажу, как с помощью стандартных компонентов, можно создать свой браузер. Браузер будет на движке &#8216;всеми-любимого&#8217; InternetExplorer. Наш зверь сможет ходить по URL, смотреть Html странички, ходить вперед и назад, конечно, перезагружать странички и останавливать загрузку. Начнем новый проект. Советую сразу определиться с [...]]]></description>
			<content:encoded><![CDATA[<p>Продолжаю тему клонирования программ darkamster&#8217;a на Delphi в <strong>С++Builder</strong>. В этой статье я покажу, как с помощью стандартных компонентов, можно создать свой браузер. Браузер будет на движке &#8216;всеми-любимого&#8217; InternetExplorer. Наш зверь сможет ходить по URL, смотреть Html странички, ходить вперед и назад, конечно, перезагружать странички и останавливать загрузку.<span id="more-582"></span><br />
Начнем новый проект. Советую сразу определиться с дизайном программы, не стоит далеко отходить от принятых стандартов, т.е кнопки навигации вверху, чуть ниже поле для ввода адреса URL, под ними будет располагаться просмотровщик страниц (компонент <strong><a href="http://about-programming.ru/tag/cppwebbrowser">CppWebBrowser</a></strong>).</p>
<p><img class="aligncenter" title="Пишем браузер" src="http://i-faq.ru/uploads/posts/2007-09/1190994432_builder1.jpg" alt="" width="231" height="144" />Я вместо button использовал компонент panel (это моя задумка &#8211; во время наведения курсора панелька будет подсвечена, как это реализовать я напишу в самом конце). Под навигацией у меня располагается Edit для ввода адреса, под ним компонент <strong><a href="http://about-programming.ru/tag/cppwebbrowser">CppWebBrowser</a></strong>, так же нам понадобиться компонент OpenDialod &#8211; для просмотра страничек с жесткого диска. Итак, впервую очередь мы распишем событие, совершаемое при нажатии enter в edit (с учетом того, что пользователь указал адрес сайта, событие называется &#8211; OnKeyPress). Вот код:</p>
<p><code>if (Key == VK_RETURN){ // нажат ЕНТЕР<br />
wchar_t URL[100];<br />
Edit1-&gt;Text.WideChar(URL,100); //Edit1 принял адрес сайта<br />
<strong>CppWebBrowser</strong>-&gt;Navigate(URL,0,NULL,NULL,NULL); //Адрес направлен на <strong>cppwebbrowser</strong>, пошла загрузка<br />
}</code></p>
<p>Далее напишем код для кнопки открыть:</p>
<p><code>OpenDialog1-&gt;Execute(); //Открываем окно выбора файлов<br />
wchar_t URL[100];<br />
Edit1-&gt;Text=(OpenDialog1-&gt;FileName); //Присваемаем Edit название выбраного файла<br />
Edit1-&gt;Text.WideChar(URL,100);<br />
<strong>CppWebBrowser</strong>-&gt;Navigate(URL,0,NULL,NULL,NULL);</code></p>
<p>Кнопка назад:</p>
<p><code><strong>CppWebBrowser</strong>-&gt;GoBack();</code></p>
<p>Кнопка вперед:</p>
<p><code><strong>CppWebBrowser</strong>-&gt;GoForward();</code></p>
<p>Кнопка стоп:</p>
<p><code><strong>[block]2[/block]</strong>-&gt;Stop();</code></p>
<p>Кнопка Обновить:</p>
<p><code><strong>[block]3[/block]</strong>-&gt;Refresh();</code></p>
<p>Все готово =) Браузер будет спокойно бороздить просторы инета, под вашим чутким контролем. Теперь я распишу то, как менять цвет панелек при наведении. Итак, для начала обговорим, что стандартным цветом наших panel будет &#8211; clBtnFace. Теперь ставим на OnMouseMove, следующий код:</p>
<p><code>Panel1-&gt;Color=clSkyBlue; //я выбрал цвет - небесно синий</code></p>
<p>В результате чего, при наведии панель поменяет цвет, теперь заставим вернуть ее преждний цвет (если пользователь убрал мышь). Сперва, мы должны выбрать событие OnMouseMove для Form1 и теперь пишем код:</p>
<p><code>Panel1-&gt;Color=clBtnFace; //результат панель приняла стандартный цвет</code></p>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/ccc/582.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ввод/вывод с помощью функции CreateFile</title>
		<link>http://about-programming.ru/ccc/565.html</link>
		<comments>http://about-programming.ru/ccc/565.html#comments</comments>
		<pubDate>Tue, 29 Dec 2009 23:50:21 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[Delphi/Pascal]]></category>
		<category><![CDATA[CreateFile]]></category>
		<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=565</guid>
		<description><![CDATA[В Win32 файл открывается при помощи функции, имеющей обманчивое название: function CreateFile(IpFileName: PChar; dwDesiredAccess, dwShareMode: DWORD; IpSecurityAttributes: PSecurityAttributes; dwCreationDistribution, dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle Хоть ее название и начинается с create, но она позволяет не только создавать, но и открывать уже существующие файлы. Такое огромное количество параметров оправдано, т. к. createFile используется для открытия файлов [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-family: Verdana; font-size: small;"> В <a href="http://about-programming.ru/tag/win32">Win32</a> файл открывается при помощи функции, имеющей обманчивое название: </span></p>
<blockquote><p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> <strong>function</strong> <strong><a href="http://about-programming.ru/tag/createfile">CreateFile</a></strong>(IpFileName: PChar; dwDesiredAccess, </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">dwShareMode: DWORD;   IpSecurityAttributes: PSecurityAttributes;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> dwCreationDistribution, dwFlagsAndAttributes: DWORD; </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">hTemplateFile: THandle): THandle</span> </span></p></blockquote>
<p><span style="font-family: Verdana; font-size: small;"> Хоть ее название и начинается с<strong> <span style="font-family: Verdana; font-size: x-small;">create</span></strong>, но она позволяет не только создавать, но и открывать уже существующие файлы. </span></p>
<p><span style="font-family: Verdana; font-size: small;"> Такое огромное количество параметров оправдано, т. к. <span style="font-family: Verdana; font-size: x-small;"> createFile</span> используется для открытия файлов на диске, устройств, каналов, портов и вообще любых источников ввода/вывода.<span id="more-565"></span></span></p>
<p><span style="font-family: Verdana; font-size: small;"> Функция <strong><span style="font-family: Verdana; font-size: x-small;"> createFile</span></strong> возвращает дескриптор открытого объекта ввода/вывода. Если открытие невозможно из-за ошибок, возвращается код <span style="font-family: Verdana; font-size: x-small;">INVALID_HANDLE_VALUE</span>, а расширенный код ошибки можно узнать, вызвав функцию<strong> </strong><span style="font-family: Verdana; font-size: x-small;">GetLastError</span>. </span></p>
<p><span style="font-family: Verdana; font-size: small;"> Закрывается файл в <a href="http://about-programming.ru/tag/win32">Win32</a> функцией <strong><span style="font-family: Verdana; font-size: x-small;">closeHandie</span></strong> (не <strong><span style="font-family: Verdana; font-size: x-small;">closeFile</span></strong>, a <strong><span style="font-family: Verdana; font-size: x-small;">closeHandle</span></strong>! Правда, &laquo;легко&raquo; запомнить? Что поделать, так их назвали разработчики Win32). </span></p>
<p><span style="font-family: Verdana; font-size: small;"> Приведем из большого разнообразия несколько приемов использования функции <strong><span style="font-family: Verdana; font-size: x-small;">CreateFile</span></strong>. Часто программисты хотят иметь возможность организовать посекторный доступ к физическим устройствам хранения — например к дискете. Сделать это не так уж сложно, но при этом методы для Windows 98 и Windows 2000 различаются. В Windows 2000 придется открывать устройство (&#8216;\\.\A:&#8217;), а в Windows 98 — специальный драйвер доступа (обозначается &#8216;\\.\vwin32&#8242;). И то и другое делается функцией <strong><span style="font-family: Verdana; font-size: x-small;">createFile</span></strong>.</span></p>
<p style="text-align: center;"><span style="font-family: Verdana; font-size: small;">Чтение    сектора с дискеты при помощи функции CreateFile</span></p>
<blockquote><p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> type</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> pDIOCRegs  = ^TDIOCRegs;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> TDIOCRegs = packed record</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> rEBX,rEDX,rECX,rEAX,rEDI, rESI, rFlags : DWORD;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> end;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> const VWIN32_DIOC_DOS_IOCTL = 1;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> VWIN32_DIOC_DOS_INT13  =  4;        //Прерывание 13</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> SectorSize = 512;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> function ReadSector(Head, Track, Sector: Integer; buffer : pointer; </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">Floppy: char):Boolean; </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> var hDevice : THandle; </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> Regs : TDIOCRegs;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> DevName : string; nb : Integer; </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> begin</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> if WIN32PLATFORM &lt;&gt; VER_PLATFORM_WIN32_NT then</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> begin {win95/98} hDevice := CreateFile(&#8216;\\.\vwin32&#8242;, GENERIC_READ, 0, nil, 0,</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> FILE_FLAG_DELETE_ON_CLOSE, 0);</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> if (hDevice = INVALID_HANDLE_VALUE) then</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> begin</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> Result := FALSE;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> Exit; end;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> regs.rEDX := Head * $100 + Ord(Floppy in ['b', 'B']);</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> regs.rEAX := $201; // KOH onepam-iM read sector</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> regs.rEBX := DWORD(buffer); // buffer</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> regs.rECX := Track * $100 + Sector;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> regs.rFlags := $0;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> Result := DeviceloControl(hDevice,VWIN32_DIOC_DOS_INT13,</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> @regs, sizeof(regs),  @regs, sizeof(regs), nb, nil) </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> and ((regs.rFlags and $1)=0); CloseHandle(hDevice); </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> end {win95/98} </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> else</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> begin // Windows NT/2000 </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> DevName :=&#8217;\\.\A:&#8217;;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> if Floppy in ['b', 'B'] then DevName[5] := Floppy;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> hDevice := CreateFile(pChar(Devname), GENERIC_READ,     FILE_SHARE_READ </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> if (hDevice = INVALID_HANDLE_VALUE) then </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> begin </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> Result := FALSE;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">Exit;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">end;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">SetFilePointer(hDevice, (Sector-1)*SectorSize, nil, FILE_BEGIN); // нумерация с 1</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"><span style="font-family: Verdana; font-size: x-small;"> Result := ReadFile(hDevice, buffer&#8217;;, SectorSize, nb, nil) and (nb=SectorSize);</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> CloseHandle(hDevice);</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> end; // Windows NT/2000 </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">end;</span> </span></p></blockquote>
<p><span style="font-family: Verdana; font-size: small;"> Для чтения и записи данных в Win32 используются функции: </span></p>
<blockquote><p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> function ReadFile(hFile: THandle; var Buffer; nNumberOfBytesToRead: DWORD; var IpNumberOfBytesRead: DWORD; IpOverlapped: POverlapped): BOOL; function WriteFile(hFile: THandle; const Buffer; nNumberOfBytesToWrite: DWORD; var IpNumberOfBytesWritten: DWORD; IpOverlapped: POverlapped): BOOL;</span> </span></p></blockquote>
<p><span style="font-family: Verdana; font-size: small;"> Здесь все сходно с <span style="font-family: Verdana; font-size: x-small;">BlockRead</span> и <span style="font-family: Verdana; font-size: x-small;">Blockwrite: hFile</span> — это дескриптор файла, <span style="font-family: Verdana; font-size: x-small;"> Buffer</span> — адрес, по которому будут читаться (писаться) данные; третий параметр означает требуемое число читаемых (записываемых) байтов, а четвертый — фактически прочитанное (записанное). Последний параметр — <span style="font-family: Verdana; font-size: x-small;"> IpOverlapped</span> — обсудим чуть позже. </span></p>
<p><span style="font-family: Verdana; font-size: small;"> Функция <span style="font-family: Verdana; font-size: x-small;"> createFile</span> используется и для доступа к портам ввода/вывода. Часто программисты сталкиваются с задачей: как организовать обмен данными с различными нестандартными устройствами, подключенными к параллельному или последовательному порту? В Turbo Pascal для DOS был очень хороший псевдомассив <span style="font-family: Verdana; font-size: x-small;"> Ports</span>: пишешь <span style="font-family: Verdana; font-size: x-small;"> Port[x] := у;</span> и не знаешь проблем. В Win32 прямой доступ к портам запрещен и приходится открывать их как файлы: </span></p>
<blockquote><p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">&#8230;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> hCom := CreateFile(&#8216;COM2&#8242;, GENERIC_READ or GENERIC_WRITE,</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> 0, NIL, OPEN_EXISTING, FILE_FLAG__OVERLAPPED, 0) ;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> if hCom = INVALID_HANDLE_VALUE then</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> begin</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> raise EAbort.CreateFmt(&#8216;Ошибка открытия порта: %d*,[GetLastError]);</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> end;</span> </span></p></blockquote>
<p><span style="font-family: Verdana; font-size: small;"> Самое  большое  отличие  от  предыдущего  примера —  в  скромном  флаге <span style="font-family: Verdana; font-size: x-small;">FILE_FLAG_OVERLAPPED</span>.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/ccc/565.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Расстановка 8 ферзей на Delphi / Pascal</title>
		<link>http://about-programming.ru/delphipascal/563.html</link>
		<comments>http://about-programming.ru/delphipascal/563.html#comments</comments>
		<pubDate>Tue, 29 Dec 2009 23:43:11 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[Delphi/Pascal]]></category>
		<category><![CDATA[8 ферзей]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=563</guid>
		<description><![CDATA[Программа расставляет на шахматной доске 8 ферзей так, чтобы они не били друг друга. Расстановка 8 ферзей. Исходный код Uses CRT; Const N = 8; // 8 Клеток M = 8; // 8 Ферзей Type Queen = record X,Y : Integer; End; Var A : Array[1..N, 1..N] Of Integer; K : Array[1..M] Of Queen; I,J,Q,X,Y [...]]]></description>
			<content:encoded><![CDATA[<p>Программа расставляет на шахматной доске <strong><a href="http://about-programming.ru/tag/8-%d1%84%d0%b5%d1%80%d0%b7%d0%b5%d0%b9">8 ферзей</a></strong> так, чтобы они не били друг друга.</p>
<h3>Расстановка <a href="http://about-programming.ru/tag/8-%d1%84%d0%b5%d1%80%d0%b7%d0%b5%d0%b9">8 ферзей</a>. Исходный код</h3>
<p><code>Uses CRT;<br />
Const N = 8; // 8 Клеток<br />
M = 8; // <strong>8 Ферзей</strong><br />
Type Queen = record<br />
X,Y : Integer;<br />
End;<br />
Var A : Array[1..N, 1..N] Of Integer;<br />
K : Array[1..M] Of Queen;<br />
I,J,Q,X,Y : Integer;</code><br />
<span id="more-563"></span><br />
<code><br />
Procedure ClearQueen;<br />
Var I : Integer;<br />
Begin<br />
For I := 1 To M Do<br />
Begin<br />
K[I].X := 0;<br />
K[I].Y := 0;<br />
End;<br />
End;</code></p>
<p>Procedure ShowQueen;<br />
Var I : Integer;<br />
Begin<br />
For I := 1 To M Do<br />
WriteLn(&#8216;Q&#8217;,I, &#8216; [', K[I].X, &#8216;,&#8217;, K[I].Y, &#8216;]&#8217;);<br />
End;</p>
<p>Procedure SetQueen;<br />
Begin<br />
For I := 1 To M Do<br />
If (K[I].X &lt;&gt; 0) And (K[I].Y &lt;&gt; 0) Then<br />
A[K[I].X, K[I].Y] := I;<br />
End;</p>
<p>Procedure ClearArray;<br />
Var I,J : Integer;<br />
Begin<br />
For I := 1 To N Do<br />
For J := 1 To N Do<br />
A[I, J] := 0;<br />
End;</p>
<p>Procedure ShowArray;<br />
Var I,J : Integer;<br />
Begin<br />
For I := 1 To N Do<br />
Begin<br />
For J := 1 To N Do<br />
Write(A[I, J]:3);<br />
WriteLn;<br />
End;<br />
End;</p>
<p>Procedure SetArray(X,Y : Integer);<br />
Var I,J : Integer;<br />
Begin<br />
For I := 1 To N Do Inc(A[I,Y]);<br />
For I := 1 To N Do Inc(A[X,I]);<br />
For I := -N To N Do<br />
If (X+I&gt;=1) And (X+I&lt;=N) And (Y+I&gt;=1) And (Y+I&lt;=N) Then             Inc(A[X+I,Y+I]);      For I := -N To N Do          If (X+I&gt;=1) And (X+I&lt;=N) And (Y-I&gt;=1) And (Y-I&lt;=N) Then<br />
Inc(A[X+I,Y-I]);<br />
End;</p>
<p>Function CountArray:Integer;<br />
Var I,J,S : Integer;<br />
Begin<br />
S := 0;<br />
For I := 1 To N Do<br />
For J := 1 To N Do<br />
If A[I, J] = 0 Then Inc(S);<br />
CountArray := S;<br />
End;</p>
<p>Begin<br />
ClrScr;<br />
ClearArray;<br />
ClearQueen;</p>
<p>// =ЦЕЛОЕ((B2-1)/8)+1<br />
// =B2-8*(C2-1)</p>
<p>Q := 1;<br />
I := 1;</p>
<p>While (Q &lt;= M) Do      Begin           X := Trunc((I-1)/N)+1;           Y := I-N*(X-1);           If A[X,Y] = 0           Then             Begin                SetArray(X,Y);                K[Q].X := X;                K[Q].Y := Y;                Inc(Q);             End           Else Inc(I);                      If I &gt; N*N<br />
Then<br />
Begin<br />
Dec(Q);<br />
I := 1+((K[Q].X &#8211; 1) * N + K[Q].Y);<br />
K[Q].X := 0;<br />
K[Q].Y := 0;</p>
<p>ClearArray;<br />
For J := 1 To Q-1 Do SetArray(K[J].X,K[J].Y);<br />
End;</p>
<p>End;</p>
<p>ClrScr;<br />
ShowQueen;<br />
ClearArray;<br />
SetQueen;<br />
ShowArray;</p>
<p>End.</p>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru/category/ccc.html">программирование C++</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/delphipascal/563.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Расстановка 8 ферзей на шахматной доске</title>
		<link>http://about-programming.ru/ccc/560.html</link>
		<comments>http://about-programming.ru/ccc/560.html#comments</comments>
		<pubDate>Tue, 29 Dec 2009 23:37:25 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[8 ферзей]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=560</guid>
		<description><![CDATA[Пробовали ли вы когда-нибудь расставить 8 ферзей на шахматной доске так, чтобы ни один из них не находился под ударом? Зная, что ферзь бьет по вертикали, горизонтали и диагонали, довольно непросто подобрать такую позицию. Но не для С. Небольшая программа за считанные минуты выдаст вам около 90 таких позиций, например, вот такую: int col[8], up_free[15], [...]]]></description>
			<content:encoded><![CDATA[<p>Пробовали ли вы когда-нибудь расставить <a href="http://about-programming.ru/tag/8-%D1%84%D0%B5%D1%80%D0%B7%D0%B5%D0%B9">8 ферзей</a> на шахматной доске так, чтобы ни один из них не находился под ударом? Зная, что ферзь бьет по вертикали, горизонтали и диагонали, довольно непросто подобрать такую позицию. Но не для С.<span id="more-560"></span> Небольшая программа за считанные минуты выдаст вам около 90 таких позиций, например, вот такую:</p>
<p><img class="aligncenter" title="Расстановка 8 ферзей" src="http://www.codenet.ru/progr/alg/ferzi.gif" alt="" width="205" height="205" /></p>
<p><code><br />
int col[8], up_free[15], dn_free[15], coln[8] ;</code></p>
<p>main( )<br />
{<br />
int i ;</p>
<p>for ( i = 0 ; i &lt;= 7 ; i++ )<br />
col[i] = 1 ;<br />
for ( i = 0 ; i &lt;= 14 ; i++ )<br />
up_free[i] = dn_free[i] = 1 ;<br />
clrscr( ) ;<br />
addqueen( ) ;<br />
}</p>
<p>addqueen( )<br />
{<br />
int i, c, r ;<br />
static int comb, row = -1 ;</p>
<p>row++ ;</p>
<p>/* Проверяем колонки */<br />
for ( i = 0 ; i &lt;= 7 ; i++ )                 {                     /* если клетка не находится под ударом */                     if ( col[i] &amp;&amp; up_free[i+row] &amp;&amp; dn_free[row-i+7])         {             			  /* запоминаем, что в строке находится ферзь */ 	          coln[row] = i ; 	           /* маркируем колонку и диагональ */  	          col[i] = 0 ;              	          up_free[i+row] = 0 ;              	          dn_free[row-i+7] = 0 ; 	           /* если заполнены все строки */             	          if ( row &gt;= 7 )<br />
{<br />
comb++ ;<br />
printf ( &laquo;\n\n\ncombination no. %d&raquo;, comb ) ;<br />
for ( r = 0 ; r &lt;= 7 ; r++ )<br />
{<br />
printf ( &laquo;\n&raquo; ) ;<br />
for ( c = 0 ; c &lt;= 7 ; c++ )<br />
{<br />
if ( c == coln[r] )<br />
printf ( &raquo; Q &raquo; ) ;<br />
else<br />
printf ( &raquo; . &raquo; ) ;<br />
}<br />
}<br />
}<br />
else<br />
addqueen( ) ;</p>
<p>/* снимаем пометку с колонки и диагонали */<br />
col[ coln[row] ] = 1 ;<br />
up_free[ row + coln[row] ] = 1 ;<br />
dn_free[ row - coln[ row ] + 7 ] = 1 ;<br />
}<br />
}<br />
row&#8211; ; /* уменьшаем счетчик строк, пробуем следующую комбинацию */<br />
}</p>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru/category/ccc.html">программирование C++</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/ccc/560.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Комплексные числа в Delphi 7</title>
		<link>http://about-programming.ru/delphipascal/527.html</link>
		<comments>http://about-programming.ru/delphipascal/527.html#comments</comments>
		<pubDate>Tue, 29 Dec 2009 17:32:02 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[Delphi/Pascal]]></category>
		<category><![CDATA[Комплексные числа]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=527</guid>
		<description><![CDATA[Комплексные числа в Delphi 7 имеют два представления: rectanglar: Z = a + i * b, a является действительной частью, и b мнимой частью: Z = r * exp(i * phi), r является абсолютной ценностью, и phi является аргументом (угол). Вот это подразделение, которое приближается к сложным, как запись. Использовать запись двойного назначения, либо прямоугольные [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Комплексные числа в Delphi 7</strong> имеют два представления: rectanglar: Z = a + i * b, a является действительной частью, и b мнимой частью: Z = r * exp(i * phi), r является абсолютной ценностью, и phi является аргументом (угол). Вот это подразделение, которое приближается к сложным, как запись. Использовать запись двойного назначения, либо прямоугольные или полярные.<span id="more-527"></span><br />
<H3>Комплексные числа в Delphi 7. Код программы</H3><br />
<code><em>{ </em>единицы для комплексных чисел основан на C_reords<br />
<em>-----------------------------------------</em> они являются эффективными с массивами<br />
<em>}</em><br />
<strong>unit</strong> ComplexRec;</code></p>
<p><strong>interface</strong></p>
<p><strong>type</strong><br />
float = extended;</p>
<p>ComplexPtr = ^Complex;<br />
Complex = <strong>record</strong><br />
a, b: float;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_Copy(a: ComplexPtr): ComplexPtr; <em>// result:=a</em></p>
<p><strong>function</strong> C_One: ComplexPtr; <em>// result:=1 </em><em>Оба</em><br />
<strong>function</strong> C_I: ComplexPtr; <em>// result:=i </em><em>Прямоугольные</em><br />
<strong>function</strong> C_IP: ComplexPtr; <em>// result:=i </em><em>Поляризованные</em><br />
<strong>procedure</strong> C_P2R(a: ComplexPtr); <em>// </em><em>поляризованный</em><em> в</em><em> прямоугольный</em><br />
<strong>procedure</strong> C_R2P(a: ComplexPtr); <em>// </em><em>прямоугольный</em><em> </em> в <em>поляризованный</em><em> </em><br />
<strong>function</strong> C_abs(a: ComplexPtr): float; <em>// </em><em>Прямоугольные</em><br />
<strong>function</strong> C_arg(a: ComplexPtr): float; <em>// </em><em>Прямоугольные</em><br />
<strong>function</strong> C_re(a: ComplexPtr): float; <em>// </em><em>Поляризованные</em><br />
<strong>function</strong> C_im(a: ComplexPtr): float; <em>// </em><em>Поляризованные</em><br />
<strong>procedure</strong> C_Inv(a: ComplexPtr); <em>// a:=-a </em><em>Прямоугольные</em><br />
<strong>procedure</strong> C_InvP(a: ComplexPtr); <em>// a:=-a </em><em>Поляризованные</em><br />
<strong>procedure</strong> C_Conj(a: ComplexPtr); <em>// a:=konjug(a) </em><em>Оба</em><br />
<strong>function</strong> C_ConjN(a: ComplexPtr): ComplexPtr; <em>//result:=konjug(a) </em><em>Оба</em><br />
<strong>procedure</strong> C_Scale(a: ComplexPtr; u: float); <em>// a:=a*u;</em><br />
<strong>procedure</strong> C_ScaleP(a: ComplexPtr; u: float); <em>// a:=a*u;</em></p>
<p><strong>procedure</strong> C_Add(a, b: ComplexPtr); <em>//a:=a+b </em><em>Прямоугольный</em><em> </em><br />
<strong>function</strong> C_AddN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a+b </em><em>Прямоугольный</em><em> </em><br />
<strong>procedure</strong> C_Sub(a, b: ComplexPtr); <em>//a:=a-b </em><em>Прямоугольный</em><em> </em><br />
<strong>function</strong> C_SubN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a-b </em><em>Прямоугольный</em><em> </em><br />
<strong>procedure</strong> C_Mul(a, b: ComplexPtr); <em>//a:=a*b </em><em>Прямоугольный</em><em></em><br />
<strong>function</strong> C_MulN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a*b </em><em>Прямоугольный</em><em></em><br />
<strong>procedure</strong> C_MulP(a, b: ComplexPtr); <em>//a:=a*b </em><em>Поляризованный</em><em></em><br />
<strong>function</strong> C_MulNP(a, b: ComplexPtr): ComplexPtr; <em>//result:=a*b </em><em>Поляризованный</em><em></em><br />
<strong>procedure</strong> C_DivP(a, b: ComplexPtr); <em>//a:=a/b </em><em>Поляризованный</em><em></em><br />
<strong>function</strong> C_DivNP(a, b: ComplexPtr): ComplexPtr; <em>//result:=a/b </em><em>Поляризованный</em><em></em><br />
<strong>procedure</strong> C_Div(a, b: ComplexPtr); <em>//a:=a/b </em><em>Поляризованный</em><em></em><br />
<strong>function</strong> C_DivN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a/b </em><em>Поляризованный</em><em></em><br />
<strong>function</strong> C_ExpN(a: ComplexPtr): ComplexPtr; <em>// </em><em>Прямоугольный</em><em></em><br />
<strong>function</strong> C_LogN(a: ComplexPtr): ComplexPtr; <em>// </em><em>Поляризованный</em><em></em><br />
<strong>function</strong> C_SinN(a: ComplexPtr): ComplexPtr;<br />
<strong>function</strong> C_CosN(a: ComplexPtr): ComplexPtr;<br />
<strong>function</strong> C_TanN(a: ComplexPtr): ComplexPtr;<br />
<strong>function</strong> C_SinhN(a: ComplexPtr): ComplexPtr;<br />
<strong>function</strong> C_CoshN(a: ComplexPtr): ComplexPtr;<br />
<strong>function</strong> C_TanhN(a: ComplexPtr): ComplexPtr;<br />
<strong>function</strong> C_IntPowerN(a: ComplexPtr; n: integer): ComplexPtr; <em>// </em><em>Прямоугольный</em><em></em><br />
<strong>function</strong> C_IntPowerNP(a: ComplexPtr; n: integer): ComplexPtr; <em>// </em><em>Поляризованный</em><em></em></p>
<p><strong>function</strong> C_ParallelN(a, b: ComplexPtr): ComplexPtr;<br />
<em>// result:=a//b =(a*b)/(a+b) </em><em>Прямоугольный</em><em></em></p>
<p><em></em></p>
<p><strong>implementation</strong></p>
<p><strong>uses</strong> math;</p>
<p><strong>const</strong><br />
AlmostZero = 1E-30;</p>
<p><strong>function</strong> C_Copy(a: ComplexPtr): ComplexPtr; <em>// result:=a</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a;<br />
result.b := a.b;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_One: ComplexPtr; <em>// result:=1</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := 1;<br />
result.b := 0;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_I: ComplexPtr; <em>// result:=i </em><em>Прямоугольный</em><em></em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := 0;<br />
result.b := 1;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_IP: ComplexPtr; <em>// result:=i </em><em>Поляризованный</em><em></em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := 1;<br />
result.b := pi / 2;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_P2R(a: ComplexPtr);<br />
<strong>var</strong><br />
t, u, v: float;<br />
<strong>begin</strong><br />
t := a.a;<br />
sincos(a.b, u, v);<br />
a.a := t * v;<br />
a.b := t * u;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_R2P(a: ComplexPtr);<br />
<strong>var</strong><br />
t: float;<br />
<strong>begin</strong><br />
t := a.a;<br />
a.a := sqrt(sqr(a.a) + sqr(a.b));<br />
<strong>if</strong> (abs(t)0 <strong>then</strong> a.b := pi / 2<br />
<strong>else</strong><br />
a.b := -pi / 2;<br />
<strong>end</strong><br />
<strong>else</strong><br />
<strong>begin</strong><br />
a.b := arctan(a.b / t);<br />
<strong>if</strong> (t &lt; 0) <strong>then</strong><br />
a.b := a.b + pi;<br />
<strong>end</strong>;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_abs(a: ComplexPtr): float;<br />
<strong>begin</strong><br />
result := sqrt(sqr(a.a) + sqr(a.b));<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_arg(a: ComplexPtr): float;<br />
<strong>begin</strong><br />
<strong>if</strong> (abs(a.a)0 <strong>then</strong> result := pi / 2<br />
<strong>else</strong><br />
result := -pi / 2;<br />
<strong>end</strong><br />
<strong>else</strong><br />
<strong>begin</strong><br />
result := arctan(a.b / a.a);<br />
<strong>if</strong> (a.a &lt; 0) <strong>then</strong><br />
result := result + pi;<br />
<strong>end</strong>;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_re(a: ComplexPtr): float; <em>// ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
result := a.a * cos(a.b);<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_im(a: ComplexPtr): float; <em>// ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
result := a.a * sin(a.b);<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_Inv(a: ComplexPtr); <em>// a:=-a </em><em>Прямоугольный</em><em></em><br />
<strong>begin</strong><br />
a.a := -a.a;<br />
a.b := -a.b;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_InvP(a: ComplexPtr); <em>// a:=-a ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
a.b := a.b + pi;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_Conj(a: ComplexPtr); <em>// a:=konjug(a) </em><em>Оба</em><br />
<strong>begin</strong><br />
a.b := -a.b;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_ConjN(a: ComplexPtr): ComplexPtr; <em>//result:=konjug(a) </em><em>Оба</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a;<br />
result.b := -a.b;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_Scale(a: ComplexPtr; u: float); <em>// a:=a*u;</em><br />
<strong>begin</strong><br />
a.a := a.a * u;<br />
a.b := a.b * u;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_ScaleP(a: ComplexPtr; u: float); <em>// a:=a*u;</em><br />
<strong>begin</strong><br />
a.a := a.a * u;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_Add(a, b: ComplexPtr); <em>//a:=a+b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>begin</strong><br />
a.a := a.a + b.a;<br />
a.b := a.b + b.b;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_AddN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a+b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a + b.a;<br />
result.b := a.b + b.b;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_Sub(a, b: ComplexPtr); <em>//a:=a-b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>begin</strong><br />
a.a := a.a &#8211; b.a;<br />
a.b := a.b &#8211; b.b;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_SubN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a-b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a &#8211; b.a;<br />
result.b := a.b &#8211; b.b;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_Mul(a, b: ComplexPtr); <em>//a:=a*b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>var</strong><br />
u, v: float;<br />
<strong>begin</strong><br />
u := a.a * b.a &#8211; a.b * b.b;<br />
v := a.a * b.b + a.b * b.a;<br />
a.a := u;<br />
a.b := v;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_MulN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a*b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a * b.a &#8211; a.b * b.b;<br />
result.b := a.a * b.b + a.b * b.a;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_MulP(a, b: ComplexPtr); <em>//a:=a*b ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
a.a := a.a * b.a;<br />
a.b := a.b + b.b;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_MulNP(a, b: ComplexPtr): ComplexPtr; <em>//result:=a*b ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a * b.a;<br />
result.b := a.b + b.b;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_Div(a, b: ComplexPtr); <em>//a:=a/b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>var</strong><br />
t: float;<br />
<strong>begin</strong><br />
t := a.a / b.a + a.b / b.b;<br />
a.b := -a.a / b.b + a.b / b.a;<br />
a.a := t;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_DivN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a/b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a / b.a + a.b / b.b;<br />
result.b := -a.a / b.b + a.b / b.a;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_DivP(a, b: ComplexPtr); <em>//a:=a/b ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
a.a := a.a / b.a;<br />
a.b := a.b &#8211; b.b;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_DivNP(a, b: ComplexPtr): ComplexPtr; <em>//result:=a/b ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a / b.a;<br />
result.b := a.b &#8211; b.b;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_ExpN(a: ComplexPtr): ComplexPtr; <em>// RECTANGLE</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := exp(a.a);<br />
result.b := a.b;<br />
C_P2R(result);<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_LogN(a: ComplexPtr): ComplexPtr; <em>// ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := ln(a.a);<br />
result.b := a.b;<br />
C_R2P(result);<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_SinN(a: ComplexPtr): ComplexPtr;<br />
<strong>var</strong><br />
z, n, v, t: ComplexPtr;<br />
<strong>begin</strong><br />
t := C_I;<br />
v := C_MulN(a, t); <em>// i*a</em><br />
z := C_expN(a); <em>// exp(i*a)</em><br />
t := C_Copy(v);<br />
C_Inv(t); <em>// -i*a</em><br />
t := C_ExpN(v); <em>// exp(-i*a)</em><br />
C_Sub(z, t);<br />
n := C_I;<br />
C_Scale(n, 2);<br />
result := C_DivN(z, n);<br />
dispose(z);<br />
dispose(n);<br />
dispose(v);<br />
dispose(t);<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_CosN(a: ComplexPtr): ComplexPtr;<br />
<strong>var</strong><br />
z, n, v, t: ComplexPtr;<br />
<strong>begin</strong><br />
t := C_I;<br />
v := C_MulN(a, t); <em>// i*a</em><br />
z := C_expN(a); <em>// exp(i*a)</em><br />
t := C_Copy(v);<br />
C_Inv(t); <em>// -i*a</em><br />
t := C_ExpN(v); <em>// exp(-i*a)</em><br />
C_Add(z, t);<br />
n := C_One;<br />
C_Scale(n, 2);<br />
result := C_DivN(z, n);<br />
dispose(z);<br />
dispose(n);<br />
dispose(v);<br />
dispose(t);<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_TanN(a: ComplexPtr): ComplexPtr;<br />
<strong>begin</strong></p>
<p><strong>end</strong>;</p>
<p><strong>function</strong> C_SinhN(a: ComplexPtr): ComplexPtr;<br />
<strong>var</strong><br />
u, v, t: ComplexPtr;<br />
<strong>begin</strong><br />
u := C_ExpN(a);<br />
t := C_Copy(a);<br />
C_inv(t);<br />
v := C_ExpN(t);<br />
result := C_SubN(u, v);<br />
C_Scale(result, 1 / 2);<br />
dispose(u);<br />
dispose(v);<br />
dispose(t);<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_CoshN(a: ComplexPtr): ComplexPtr;<br />
<strong>var</strong><br />
u, v, t: ComplexPtr;<br />
<strong>begin</strong><br />
u := C_ExpN(a);<br />
t := C_Copy(a);<br />
C_inv(t);<br />
v := C_ExpN(t);<br />
result := C_AddN(u, v);<br />
C_Scale(result, 1 / 2);<br />
dispose(u);<br />
dispose(v);<br />
dispose(t);<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_TanhN(a: ComplexPtr): ComplexPtr;<br />
<strong>begin</strong></p>
<p><strong>end</strong>;</p>
<p><strong>function</strong> C_IntPowerN(a: ComplexPtr; n: integer): ComplexPtr;<br />
<strong>var</strong><br />
j: integer;<br />
u, v: float;<br />
<strong>begin</strong><br />
<strong>if</strong> n = 0 <strong>then</strong><br />
result := C_One<br />
<strong>else</strong><br />
<strong>begin</strong><br />
result := C_Copy(a);<br />
<strong>if</strong> n &gt; 1 <strong>then</strong><br />
<strong>begin</strong><br />
C_R2P(result);<br />
u := result.a;<br />
v := result.b;<br />
<strong>for</strong> j := 2 <strong>to</strong> n <strong>do</strong><br />
<strong>begin</strong><br />
u := u * result.a;<br />
v := v + result.b;<br />
<strong>end</strong>;<br />
result.a := u;<br />
result.b := v;<br />
C_P2R(result);<br />
<strong>end</strong>;<br />
<strong>if</strong> n &lt; 0 <strong>then</strong><br />
<strong>begin</strong></p>
<p><strong>end</strong>;<br />
<strong>end</strong>;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_IntPowerNP(a: ComplexPtr; n: integer): ComplexPtr;<br />
<strong>var</strong><br />
j: integer;<br />
u, v: float;<br />
<strong>begin</strong><br />
result := C_Copy(a);<br />
u := result.a;<br />
v := result.b;<br />
<strong>for</strong> j := 2 <strong>to</strong> n <strong>do</strong><br />
<strong>begin</strong><br />
u := u * result.a;<br />
v := v + result.b;<br />
<strong>end</strong>;<br />
result.a := u;<br />
result.b := v;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_ParallelN(a, b: ComplexPtr): ComplexPtr;<br />
<em>// result:=a//b = (a*b)/(a+b)</em><br />
<strong>var</strong><br />
z, n: ComplexPtr;<br />
<strong>begin</strong><br />
z := C_MulN(a, b);<br />
n := C_AddN(a, b);<br />
C_R2P(n);<br />
C_R2P(z);<br />
result := C_DivNP(z, n);<br />
C_P2R(result);<br />
dispose(n);<br />
dispose(z);<br />
<strong>end</strong>;</p>
<p><strong>end</strong>.</p>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru/category/ccc.html">программирование C++</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/delphipascal/527.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Чтение/запись блоков данных на C# (C Sharp)</title>
		<link>http://about-programming.ru/ccc/491.html</link>
		<comments>http://about-programming.ru/ccc/491.html#comments</comments>
		<pubDate>Mon, 28 Dec 2009 19:01:01 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=491</guid>
		<description><![CDATA[Чтение/запись блоков данных на C# (C Sharp) В этой статье речь пойдет о чтении/записи данных в файл, буфер или в память при помощи трех классов, образованых от абстрактного класс System.IO.Stream. Мы рассмотрим классы FileStream, MemoryStream, BufferedStream. Классы, производные от Stream(поток), предназначенны для работы с двоичными данными и могут искать какую-то часть данных в потоке. Сам [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Чтение/запись блоков данных на C# (C Sharp)</strong></p>
<div>
<div>
<div>
<p>В этой статье речь пойдет о <strong>чтении/записи данных</strong> в файл, буфер или в память при помощи трех классов, образованых от абстрактного класс System.IO.Stream. Мы рассмотрим классы FileStream, MemoryStream, BufferedStream.</p>
<p>Классы, производные от Stream(поток), предназначенны для работы с двоичными данными и могут искать какую-то часть данных в потоке. Сам по себе, базовый класс уже имеет некоторые методы и свойства, который унаследованы в следующих классах. Вот список и предназначение этих методов и свойств.<span id="more-491"></span></p>
<table border="1" cellspacing="0" cellpadding="0" width="89%" bgcolor="#000" bordercolor="#ffffff">
<tbody>
<tr>
<td width="16%"><strong>CanRead</strong></td>
<td width="84%">Определяет, будет ли данный поток поддерживать чтение</td>
</tr>
<tr>
<td><strong>CanSeek</strong></td>
<td>Определяет, будет ли данный поток поддерживать поиск</td>
</tr>
<tr>
<td><strong>CanWrite</strong></td>
<td>И соответственно, будет ли поток поддерживать запись</td>
</tr>
<tr>
<td><strong>Close()</strong></td>
<td>Закрывает текущий поток и освобождает ресурсы</td>
</tr>
<tr>
<td><strong>Flush()</strong></td>
<td>Записывает все данные из буфера в соответствующий источник данных. Освобождает буфер</td>
</tr>
<tr>
<td><strong>Length</strong></td>
<td>Возвращает длину потока в байтах</td>
</tr>
<tr>
<td><strong>Position</strong></td>
<td>Определяет указатель на позицию в потоке</td>
</tr>
<tr>
<td><strong>Read()</strong></td>
<td>Читает последовательность байт</td>
</tr>
<tr>
<td><strong>ReadByte()</strong></td>
<td>Читает один байт</td>
</tr>
<tr>
<td><strong>Seek()</strong></td>
<td>Устанавливает указатель на местонахождение в текущем потоке</td>
</tr>
<tr>
<td><strong>SetLendth()</strong></td>
<td>Устанавливает длину текущего потока</td>
</tr>
<tr>
<td><strong>Write()</strong></td>
<td>Записывает последовательность байт</td>
</tr>
<tr>
<td><strong>WriteByte()</strong></td>
<td>Записывает один байт</td>
</tr>
</tbody>
</table>
<p>Перейдем к первому классу, унаследовавшему эти элементы<br />
Класс FileStream</p>
<p>Этот класс предназначен для работы с файлами(их создание, чтение, запись). Вот пример его использования:</p>
<p>FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read);</p>
<p>Здесь переменная filename указывает на имя файла, а остальные параметры указывают на ограничения и допустимые действия над ним. Рассмотрим их поподробнее.</p>
<p>Перечесление FileMode:</p>
<table border="1" cellspacing="0" cellpadding="0" width="548" bgcolor="#000" bordercolor="#ffffff">
<tbody>
<tr>
<td width="175" valign="TOP"><strong>FileMode.Append</strong></td>
<td width="373">Открыть файл(переданный первым параметром) и установить указатель на конец файла(то есть для дописываения в него данных. Можно использовать только с <strong>FileAccess.Write</strong>, иначе будет сгенерировано исключение <strong>System.ArgumentException</strong>. Если файл отсутствует, то он создается автоматически и открывается для записи.</td>
</tr>
<tr>
<td valign="TOP"><strong>FileMode.Create</strong></td>
<td>Создать новый файл. Если файл уже существует, то перезаписать его.</td>
</tr>
<tr>
<td valign="TOP"><strong>FileMode.CreateNew</strong></td>
<td>Отличается от предыдущего тем, что если файл уже существует, то будет сгенерировано исключение</td>
</tr>
<tr>
<td valign="TOP"><strong>FileMode.Open</strong></td>
<td>Открыть файл и установить указатель на начало. Если файл не существует, будет сгенерировано исключение <strong>System.IO.FileNotFoundException</strong></td>
</tr>
<tr>
<td valign="TOP"><strong>FileMode.OpenOrCreate</strong></td>
<td>Отличается от предыдущего тем, что при отсутствии файла, его создает.</td>
</tr>
<tr>
<td valign="TOP"><strong>FileMode.Truncate</strong></td>
<td>Открывает существующий файл и обрезает его длину до 0 байт. Попытка прочитать файл с указанием такого перечисления приведет к исключению</td>
</tr>
</tbody>
</table>
<p>Перечисление FileAccess:</p>
<table style="height: 68px;" border="1" cellspacing="0" cellpadding="0" width="548" bgcolor="#000" bordercolor="#ffffff">
<tbody>
<tr>
<td width="181"><strong>FileAccess.Read</strong></td>
<td width="323">Файл открывается исключительно для чтения</td>
</tr>
<tr>
<td><strong>FileAccess.Write</strong></td>
<td>Файл открывается исключительно для записи</td>
</tr>
<tr>
<td><strong>FileAccess.ReadWrite</strong></td>
<td>Это комбо-вариант двух предыдущих</td>
</tr>
</tbody>
</table>
<p>Есть также перечисление FileShare, но оно для нас сейчас не является столь важным. Оно нужно для синхронизации записи или чтения с другими потоками.</p>
<p>Вот код, демонстрирующий простую запись в файл и чтение из него в консоль</p>
<p>FileStream stream = new FileStream(&laquo;test.dat&raquo;, FileMode.OpenOrCreate, FileAccess.ReadWrite);<br />
for(int i = 0: i &lt; 256; i++)<br />
{<br />
myFStream.WriteByte((byte)i);<br />
}<br />
<span style="color: #999999;">// Переставляем внутренний указатель на начало</span><br />
myFStream.Position = 0;<br />
<span style="color: #999999;">// Считываем байты из файла *.dat</span><br />
for(int i = 0; i &lt; 256; i++)<br />
(<br />
Console.Write(myFStream.ReadByte());<br />
}<br />
myFStream.Close();</p>
<h3>Класс MemoryStream</h3>
<p>Этот класс не особо отличается от предыдущего, нами рассмотренного, за исключением того, что он работает(записывает и читает) не с файлом, а с оперативной памятью. Ниже перечисленны наиболее важные его члены:</p>
<table style="height: 124px;" border="1" cellspacing="0" cellpadding="0" width="540" bgcolor="#000" bordercolor="#ffffff">
<tbody>
<tr>
<td width="116" valign="TOP"><strong>Capacity</strong></td>
<td width="609">Это свойство позволяет получить или установить кол-во байтов выделенных под этот поток</td>
</tr>
<tr>
<td valign="TOP"><strong>GetBuffer()</strong></td>
<td>Возвращает массив байтов при помощи которых был создан поток</td>
</tr>
<tr>
<td valign="TOP"><strong>ToArray()</strong></td>
<td>Записывает все содержимое потока в массив байтов не зависимо от свойства Position</td>
</tr>
<tr>
<td valign="TOP"><strong>WriteTo()</strong></td>
<td>Записывает все содержимое объекта(MemoryStream) в другой обьект класса, производного от Stream(например в FileStream)</td>
</tr>
</tbody>
</table>
<p>Вот пример кода осуществляющего запись в файл из MemoryStream через FileStream:</p>
<p>FileStream dumpFile = new FIleStream(&laquo;Dump.dat&raquo;, FleMode.Create, FileAccess.ReadWrlte);<br />
myMemStream.WriteTo(dumpFile);</p>
<p>myMemStream есть объект класса MemoryStream.</p>
<h3>Класс BufferedStream</h3>
<p>И завершает нашу тройку класс BufferedStream. Этот класс нужен для организации временного хранилища данных, чтобы потом передать их в постоянное хранилище. Казалось бы, для чего это нужно, разве не проще просто записать некоторые данные через FileStream.Write()? Конечно можно, но если нам нужна производительность, то лучше использовать буфер, так как при многократном вызове FileStream.Write() нам приходиться много раз обращаться к диску, что существенно замедляет работу нащей программы.<br />
Вот пример использования BufferedStream</p>
<p><span style="color: #999999;">// Создаем объект BufferedStream. подключенный к уже имеющемуся объекту FileStream</span><br />
BufferedStream rnyFileBuffer = new BufferedStream(dumpFile);<br />
<span style="color: #999999;">// Добавляем в BufferedStream несколько байтов</span><br />
<span style="color: #0000ff;"> byte</span>[] str = {127, 0&#215;77, 0&#215;4, 0&#215;0, 0&#215;0, 0&#215;16};<br />
myFileBuffer.Write(str, 0, str.Length);<br />
<span style="color: #999999;">// А теперь записываем все содержимое BufferedStream в файл</span><br />
myFlleBuffer.Close();</p>
<p>Ну вот впринципе и все что. Успехов вам в программировании.</p>
<p><strong>Автор:</strong> CODER</p>
</div>
</div>
</div>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru/category/ccc.html">программирование C++</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/ccc/491.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTTP аутентификация, установка защиты на страницу используя MySQL и PHP</title>
		<link>http://about-programming.ru/php/487.html</link>
		<comments>http://about-programming.ru/php/487.html#comments</comments>
		<pubDate>Mon, 28 Dec 2009 17:00:10 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование на PHP]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=487</guid>
		<description><![CDATA[HTTP аутентификация Вступление Это &#8211; обучающая программа которая должна вам показать основы защиты ваших страниц в сети, использующие HTTP аутентификацию. Вместо традиционного .htaccess метода (Apache сервер), мы собираемся использовать для хранения данных о пользователях и их пароли в MySQL. Я постараюсь максимально разжевать все на, что по моему разумению требуется для начинающего изучать MySQL и [...]]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://about-programming.ru/php/487.html">HTTP аутентификация</a></strong><br />
<strong>Вступление</strong></p>
<p>Это &#8211; обучающая программа которая должна вам показать основы защиты ваших страниц в сети, использующие <strong>HTTP</strong> аутентификацию. Вместо традиционного .<strong>htaccess</strong> метода (<strong>Apache сервер</strong>), мы собираемся использовать для хранения данных о пользователях и их пароли в <strong><a href="http://about-programming.ru/tag/mysql">MySQL</a></strong>. Я постараюсь максимально разжевать все на, что по моему разумению требуется для начинающего изучать <strong><a href="http://about-programming.ru/tag/mysql">MySQL</a></strong> и <strong><a href="http://about-programming.ru/tag/php">PHP</a></strong>. В принципе на основе этой программы вы можете использовать любой DBMS (система управления базы данных). Почему интересен этот метод? Ну например хотя бы потому что, если Вы используете базу данных, вы можете с легкостью разрешить, только определенной группе (человеку) иметь определенные права для доступа к той или иной информации. Если Вы используете традиционный .<strong>htaccess</strong> метод <strong>Apache</strong>, Вы должны вручную добавлять пользователей и пароль в файле пароля. А преимущество данного метода, ну&#8230;.взгляните сами.<span id="more-487"></span><br />
Программное обеспечение которое необходио:</p>
<p>· *nix платформа (Linux, Unix, *BSD) · <strong>PHP</strong> 3.0.x или <strong>PHP</strong> 4.x · MySQL (любая версия)<br />
<strong>Шаг номер один </strong></p>
<p>- Вперед, первое что надо это выяснить что мы хотим позволить пользователям, которые находится в нашей базе данных, чтобы получить доступ к указанной странице? И как мы собираемся это сделать? ( многим не очень нравится, но надо привыкать перед программированием брать бумажку и записывать все требования, которые мы хотим получить от проги, в перспективе вы сэкономите часы а может дни, для внесения изменений в код (прим.))</p>
<ol>
<li>Проверить, заверен ли пользователь уже.</li>
<li>Если нет, отправить сообшение в броузер, с сообщением и формой для доступа.</li>
<li>Если пользователь княпает на кнопку отмены, не позволить ему доступ и переадресовывать его идти на&#8230; 403: Доступ отвергнут, или показать (кукиш J ) простое сообщение.</li>
<li>Если пользователь заполнил username и комбинацию пароля, проверьте их в <strong>MySQL</strong> базе данных и удостоверятся, что они верны, при положительном исходе разрешить доступ.</li>
</ol>
<p>Если Вы не поняли все не волнуйтесь, станет ясно позже (а может никогда)!</p>
<p><strong>Шаг Два &#8211; Создаем Нашу Базу данных </strong></p>
<p>Мы хотим, чтобы база данных хранила имена (login) и пароль наших пользователей. Требуемые поля могут легко быть добавлены к существующей базе данных, но мы предположим пока, что Вы не добавляете к уже имеющейся базе а создаете новую. Следующий код это описание того как это сделать. Предположение если у вас на компе стоит Апач совсем что надо, можете немедленно приступить : )</p>
<p><code>mysql&gt; create database members;<br />
mysql&gt; create table users (<br />
username varchar(25) NOT NULL,<br />
password varchar(15) NOT NULL,<br />
primary key (username),<br />
unique username (username)<br />
);</code></p>
<p>Мы теперь имеем базу данных, чтобы хранить в ней пользователей, она предполагает, что username до 25 знаков, и пароли до 15 знаков. (если вам по каким-то причинам не подходит, установите как посчитаете Нужным) Username должен иметь значение &laquo;первичный ключ&raquo; и быть &laquo;уникальным&raquo;, так как мы не хотим чтоб 2 или больше людей имели одинаковый username.<br />
Пожалуйста обратите внимание, что usernames будет чувствитен к следующему случаю, пользователь &#8216;Vasya&#8217; будет идентифицирован другим, нежели пользователь &#8216;vasya&#8217;, проще говоря чувствителен к регистру. Теперь мы добавим в <strong>MySQL</strong> тестового пользователя, чтобы использовать его дянные для тестов, когда мы создадим <strong>PHP страницу</strong>.</p>
<p><code>mysql&gt; grant select on members.users<br />
to httpuser@localhost<br />
identified by 'MyPassword';</code></p>
<p>Это для того чтоб, когда мы хотим проверить пользователя и пароль, человека зарегистрировавшегося в нашей базе данных, мы будем использовать пользователя &laquo;httpuser&raquo; с паролем &laquo;MyPassword&raquo;. Наконец мы должны добавить логин и пароль человека, которому мы хотим позволить доступу .</p>
<p><code>mysql&gt; insert into users value('john_doe', 'eod_nhoj');</code></p>
<p>Я сознательно в проге не шифровал данные, для того, чтоб в случае утери пароля не дешифровать его, и упростить до минимума получения оного : )) Все, с MySQLпокончено теперь идем дальше!</p>
<p><strong>Шаг Три &#8211; пишем PHP код. </strong></p>
<p>Прежде, чем мы начинаем, я опишу вкратце то, что будет делать пага. Когда Вы попадете на защищенную страницу то сервер пошлет запрос и выведет страницу для введения имени и пароля. Если вы нажмете на кнопку отмены или введете не правильные данные то сервер отправит вам ( 401 Неправомочный удар головой, и будет отрицать доступ. ) &#8211; так переводит промпт обычно строку (401 Unauthorized header, and deny access) не буду пояснять по моему лучше не скажешь!!! При случае если вы все введете как надо, то окажется что просто напросто вы получите доступ (то что и требовалось доказать) Теперь самое веселое, это и есть тот самый код. Он написан сознательно с номерами строк, после кода (внизу) даны пояснения к строкам.</p>
<p><code>---<br />
01 &lt;?php<br />
02<br />
03 function access_denied() {<br />
04 echo "401 Unauthorized: The username / password combination you entered was invalid.n";<br />
05 }<br />
06<br />
07 function auth_headers($title) {<br />
08 Header("WWW-Authenticate: Basic realm="$title"");<br />
09 Header("HTTP/1.0 401 Unauthorized");<br />
10 }<br />
11<br />
12 if(!isset($PHP_AUTH_USER)) {<br />
13 auth_headers("My Protected Web Page");<br />
14 access_denied();<br />
15 exit;<br />
16 }<br />
17 else {<br />
18<br />
19 $hostname = "localhost";<br />
20 $username = "httpuser";<br />
21 $password = "MyPassword";<br />
22 $database = "members";<br />
23<br />
24 $query = "select username,password from users where username='$PHP_AUTH_USER' and password='$PHP_AUTH_PW'";<br />
25 $link = mysql_connect($localhost, $username, $password) or die("Unable to connect to database server");<br />
26<br />
27 if (mysql_num_rows(mysql_db_query($database, $query)) == 0) {<br />
28 auth_headers("My Protected Web Page");<br />
29 access_denied();<br />
30 exit;<br />
31 }<br />
32<br />
33 mysql_close($link);<br />
34 }<br />
35 ?&gt;</code></p>
<p>Вот и весь фокус &#8211; покус, работает проверенно можете использовать, где хотите когда хотите и как хотите, меняйте, улучшаете, если вам удасться сократить код до двух строк при сохранении функциональных возможностей проги, то обязательно пришлите его мне!!!</p>
<p>В этой секции мы быстро исследуем каждую линию, чтоб предупредить зарание пылкий обмен вопросами в коментариях к данной статейке.</p>
<p><strong>Строка 3:</strong><br />
Эта функция покажет сообщение, если &laquo;злой юзер&raquo; упорно будет вводить левые данные. Я сделал это функцией, потому что используем ее дважды, и просто чтоб сократить исходный код.<br />
<strong>Строка 7: </strong><br />
Так как мы используем этот заголовок тоже дважды я также сделал это функцией.<br />
<strong>Строка 8: </strong><br />
Передать броузеру заголовок, который заставит таки юзера ввести логин и пароль. Переменная $title будет показана в login диалоге.<br />
<strong>Строка 9: </strong><br />
При первом запросе выводится заголовок при повторной отмене выводит сообщение о запрете доступа.<br />
Строка 12:<br />
$PHP_AUTH_USER цикл который выводит сообщение о том что мол пага защищена, и убирайся вон!<br />
<strong>Строка 19-23: </strong><br />
Это то что кроме вас никто не знает, то есть средства для коннекта с базой данных, имя хоста, имы базы, имя юзера, и пароль. (для соеденения с <strong>MySQL</strong>)<br />
<strong>Строка 24: </strong><br />
Запрос к MySQL который возвращает имена и пароли.<br />
<strong>Строка 25: </strong><br />
Установить связь с <strong>MySQL</strong> и вывести ругательство если связи не будет!!! (это значит что у вас что-то не то в строках 19-23, или вообще нет <strong>MySQL</strong>)<br />
<strong>Строка 27: </strong><br />
Обработать $query. Если возвращет &#8211; 0, это означает, что была введена недействительная комбинация.<br />
<strong>Строка 33: </strong><br />
Разъединить соеденение с <strong>MySQL</strong>.</p>
<p>Я рекомендовал бы сохранить <strong>PHP код</strong> в файле под наванием user_auth.php, user_auth.php3, или&#8230; (тут ваша фантазия на эту тему) Предположим, что таки сохранили этот код в файле user_auth.php. Всякий раз, когда мы захотим вдруг защитить нашу сверхсекретную пагу в сети, мы просто подключаем этот файл. Единственное на что хочется обратить внимание, что по логике надо подключать в самой верхней части своей защищенной <strong>PHP страницы</strong>, советую в строке номер 1 ваше паги написать следующее:</p>
<p><code>&lt;?php require("user_auth.php"); ?&gt;</code></p>
<p>где &laquo;user_auth.php&raquo; это имя файла под которым вы сохранили код.</p>
<p><strong>Ваш вопрос &#8211; я не использую MySQL, как быть? </strong><br />
Посоветуйтесь с админом вашего сервера, если он окажется добрым, то он вам поможет, для него это 5 минут работы, если злой то не поможет, тогда идите на форум относящийся к той БД которую вы исьпользуете и кричите о помощи! Или если вы считаете себя нормальным программером, то&#8230;вам вообще этот код не понадобиться, и вы будите создавать &laquo;сессии&raquo;, шифровать с помощью PGP вобщем извращаться так, как быдто вы делаете защиту для amazon.com</p>
<p>Удачи! : )</p>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/php/487.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
