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

Клуб профессиональных программистов :: Выпуск #99


Клуб профессиональных программистов "Весельчак У"
Информационная рассылка сайта и форума.  Выпуск No99 (2010-09-27).

Здравствуйте, уважаемые читатели!

Так как напрошлой неделе мы не выпускали рассылку, то за это время успело выйти две статьи (и еще есть, но пока придерживаем). Здесь приводим фрагменты статей и ссылки на них на нашем сайте. Это «Заметки по оформлению статьи на сайте» и «Использование LVM snapshot для уменьшения простоя при бекапе OpenVZ».




На неделе будет опубликован перевод одной статьи. Для него автору потребовалось найти русскоязычные аналоги различных английских терминов. Под это была создана тема на форуме и несколько страничек к нашей Вики. Если кому интересен данный вопрос, просим посетить форум и присодиниться к обсуждению.

Тема форума здесь. Вики смотреть здесь.



Также предлагаем вашему вниманию подборку интересных тем форума.



В предыдущей статье я кратко задел вопрос об оформлении текста тегами. Напомню. HTML — язык разметки текста.

Опубликованный текст на сайте читают, в первую очередь, люди. Ты делаешь сайт для людей. Задача твоего сайта — дать, как можно доступней, информацию о своем предприятии, о продукции твоего предприятия, об услугах, которые предоставляет твоя организация.

А теперь о разметке.


Таблицы


Проще показать на том, что тебе близко. Как ты показываешь (отображаешь) технические характеристики своей продукции? Таблицей (конечно, есть другие способы)!

Как рисуется таблица, тебе известно:


Код:
<table>
   <tr>
      <td>1</td>
      <td>Содержание столбца</td>
      <td>Характеристика</td>
  </tr>
  <tr>
      <td>2</td>
       ...
       ...
  </tr>
  ...
  ...
</table>

Вот как это будет выглядеть приблизительно:


1Содержание столбцаХарактеристика
2Содержание столбца2Характеристика2

Красиво? Понятно? Вроде как, наглядно, но чего-то не хватает. Не хватает заголовка!


Код:
<table>
   <tr>
      <td>№ п/п</td>
      <td>Название</td>
      <td>Параметры</td>
  </tr>
  <tr>
      <td>1</td>
      <td>Содержание столбца</td>
      <td>Характеристика</td>
  </tr>
  <tr>
      <td>2</td>
       ...
       ...
  </tr>
  ...
  ...
</table>

№ п/пНазваниеПараметры
1Содержание столбцаХарактеристика
2Содержание столбца2Характеристика2

А теперь расскажи — чем первая строка отличается от второй? Содержанием? И все? Я утверждаю — ничем. Я безболезненно могу переставить эти строки, их семантическая наполненность не изменится.

Есть замечательный тег TH — заголовок столбца таблицы.

А теперь..?


Код:
<table>
   <tr>
      <th>№ п/п</th>
      <th>Название</th>
      <th>Параметры</th>
  </tr>
   <tr>
      <td>1</td>
      <td>Содержание столбца</td>
      <td>Характеристика</td>
  </tr>
  <tr>
      <td>2</td>
       ...
       ...
  </tr>
  ...
  ...
</table>

№ п/пНазваниеПараметры
1Содержание столбцаХарактеристика
2Содержание столбца2Характеристика2

Визуально выделено, семантически выделено. Теперь первую и вторую строки поменять нельзя.



Полностью это описано здесь.


Введение.


В настоящее время все шире применяться различные средства виртуализации серверов. Это существенно упрощает создание новых хостов, управление ими, распределение нагрузки между физическими серверами и как следствие — снижает суммарную стоимость «железа», занимаемое физическими серверами место и энергопотребление, удешевляет обслуживание.

Одним из средств виртуализации является OpenVZ — открытый проект на базе коммерческой системы Virtuozzo. Это система виртуализации операционной системы для Linux. Для всех виртуальных контейнеров используется одно общее ядро ОС, что существенно снижает, по сравнению с полной и паравиртуализацией, расход оперативной памяти и отклик системы. Для виртуальных контейнеров в OpenVZ есть другой термин — виртуальное окружение (virtual environment — VE), что точнее отражает суть, но по-русски менее понятно на слух. Физический сервер в терминах OpenVZ называется аппаратным узлом (hardware node — HN).

В статье пойдет речь о создании резервных копий виртуальных контейнеров.


Резервное копирование контейнеров OpenVZ.


Физически файлы контейнера просто находятся в некоторой директории на HN. При запуске VE эта директория монтируются в другую, посредством механизмов, напоминающих mount --bind и последующий chroot. Т.е. для резервного копирования достаточно скопировать или съархивировать эту директорию. Т.к. контейнер может быть запущен либо остановлен, то и резервное копирование может быть выполнено «горячее», либо «холодное».

При горячем копировании может произойти порча структуры файлов, которые не были закрыты запущенными в контейнере программами. Особенно это чревато для баз данных. По этому этот метод нужно использовать очень осторожно. Этих недостатков лишено холодное копирование, но для него необходимо остановить контейнер, что не всегда приемлемо, да и вообще не хорошо вмешиваться в работу VE.



Полностью это описано здесь.

  • Программирование :: Общий
  • При переводе документации на русский язык часто получается так, что дословный перевод термина выглядит нелепо, транслитерация кириллицей напоминает слэнг малолетних какеров ("пропатчил баги в релизе"), а чередование английских и русских слов в одном тексте превращает его в какой-то пиджин.

    Вот и я при переводе одной статьи попал в аналогичную ловушку. Пока затруднения вызвали следующие термины:

    • firmware
    • mock
    • constructor injection

    Это только самое начало, наверняка будут и другие.

    Кто может предложить более-менее благозвучный русскоязычный вариант? Или поставим вопрос шире: какой из перечисленных вариантов кажется предпочтительнее (или хотя бы вызывает наименьшее отторжение)?
  • День добрый. Хочу спросить вот что. Пытаюсь освоить трехзвенку. В каком месте лучше проверять валидацию данных, заносимых в БД? На клиенте (при вводе данных шуршать таблицы через прослойку) или в промежуточном слое? бизнес-правила в самой БД учтены (при удалении - каскадом в дочерних, уникальность ВК, проч...). Если в среднем слое - то как оповещать об этом клиента? через исключения?
    Или же это дело сугубо личное?
  • кто подскажет, как в Qt программно сделать прописывание приложения в автозагрузку (и "выписывание" тоже) ?

    Целевая система -любая, поддерживаемая Qt
  • Программирование :: .NET технология от и до
  • День добрый. Столкнулся с такой проблемой: в C# 3.0 появились т.н. "Автоматические свойства". Пользовался приблудой - все хорошо, пока не сталкнулся с абстрактными свойствами. Собственно, сеттер теперь нуждается в теле.
    Цитировать
    Автоматические свойства: компилятор сгенерирует закрытое (private) поле и соответствующие аксессор и мутатор для кода вида
    Код:
    public string Name { get; private set;
    }

    Код:
        public abstract class Symbol : ISymbol
        {
            public abstract void Draw();
            public abstract Brush SymbolBrush  { get; protected set; }
        }
    Код:
        public class SimpleFillSymbol:Symbol, ISymbol
        {

            public override Brush SymbolBrush
            {
                get
                {
                    return new SolidColorBrush(FillColor);
                }
                protected set; // SymbolBrush.set must declare a body because it is not marked abstract, extern, or partial

            }

        }
  • Имеется файл заранее известного формата.

    В С++ для его загрузки в память я описываю структуру, выделяю память, подгружаю данные из файла в выделенную область и обращаюсь к ней через указатель структуры. Элементарно.

    А вот как быть с C#?..  :-/
  • Программирование :: .NET технология от и до :: WinForms
  • Здравствуйте.

    Существует очень большая проблема и она не даёт мне покоя. Итак:

    Есть TabControl с WebBrowser'ом на каждой закладке. При открытии окон в том же окне- всё ок, но когда окно открывается в новом (открыть в новой вкладке), то тут начинаются большие проблемы. Кое-как решил этот вопрос следующим кодом:

    Код:
            private void webBrowser1_DocumentCompleted(object
    sender, WebBrowserDocumentCompletedEventArgs e)
            {
                HtmlElementCollection links = this.webBrowser1.Document.Links;
                foreach (HtmlElement var in links)
                {
                    var.AttachEventHandler("onclick", LinkClicked);
                }
            }

            private void LinkClicked(object sender, EventArgs e)
            {
                HtmlElement link = this.webBrowser1.Document.ActiveElement;
                url = link.GetAttribute("href");
            }

            private void webBrowser1_NewWindow(object sender, CancelEventArgs e)
            {
                //Prevent new window being opened in IE.
                e.Cancel = true;
                OpenLinkInOwnWindow w = new OpenLinkInOwnWindow();
                w.Show();
                w.Navigate(url);
            }

    Дальше больше- появились ссылки, которые находятся во фреймах и так же требуют к себе открытия в новой вкладке. Тоже решил это посредством перебора всех фреймов страницы, и получением активного элемента в одном из них- не очень красиво, но жить можно.

    Теперь оказывается существует ещё способ открытия нового окна через JavaScript на всевозможных элементах (картинки, кнопки и т.д.)- это вообще беда...

    Вопрос: Неужели нельзя абстрагироваться от всех этих условий и отлавливания каждого чиха и пыха и где-то получить адрес страницы, которая должна открываться в новом окне и уже её открывать у себя в новой вкладке?

    Вопрос очень важный и серьёзный для меня, если чем-то смогу помочь- помогу. Спасибо.
  • Программирование :: .NET технология от и до :: ASP.NET
  • Есть веб-сайт для .NET 2.0, работа с ним идёт в VS2008.

    Сайт работает с веб-сервисами, и для отладки понадобилось в Release обращаться к одной версии сервиса, а в Debug - к другой. Добавил два web-reference и написал условную компиляцию типа:
    Код: (C#)
    #if DEBUG
      DebugService...
    #else
      ReleaseService...
    #endif
    и стал искать способ задать при компиляции define. В свойствах проекта ничего похожего на опции компилятора нет в принципе.

    Что обнаружилось после некоторых размышлений о природе вещей и созерцания содержимого сайта.

    1) Находящийся рядом с кнопкой пуск combobox, указывающий конфигурацию Release или Debug на веб-сайт не оказывает ни малейшего действия. Связано это с тем, что сам сайт в общем-то не обязательно компилируется при разработке - он может компилироваться прямо на веб-сервере, поэтому настройки VS никак не влияют на получающийся в результате бинарник и наличие pdb-файлов с отладочной информацией.

    Правильное место для конфигурирования компиляции - файл web.config. В частности, там есть элемент:
    Код:
    <configuration>
      <system.web>
        <compilation debug="true"/>
      </system.web>
    </configuration>
    где true и false определяют Debug и Release конфигурацию сборки сайта.

    2) Для определения #define DEBUG нужно добраться до ключей компилятора. Это делается элементом:
    Код:
    <compiler language="c#;cs;csharp" extension=".cs" compilerOptions="/d:DEBUG"
      type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    Для версий .NET выше или ниже 2.0, соответственно, нужно изменить атрибут type. Для сборки сайта в .NET 1.0 - 2.0 данный элемент должен
    находиться в секции файла web.config:
    Код:
    <configuration>
      <system.codedom>
        <compilers>
          <compiler ... />
        </compilers>
      <system.codedom>
    </configuration>
    Для сборки сайта в .NET 3.0 и выше данный элемент можно оставить в system.codedom или же можно поместить в секцию:
    Код:
    <configuration>
      <system.web>
        <compilation debug="true">
          <compilers>
            <compiler ... />
          </compilers>
        </compilation>
      </system.web>
    </configuration>
  • Здравствуйте! Помогите. На C# только учусь писать, c ASP  та же история, поэтому заранее прошу прощения за, возможно глупые, вопросы!!!!!

    Задача: На Web странице есть TreeView данные в который выгружаются динамически из бд (порядка полутора тысяч объектов). Дерево выстраивается в зависимости от того какой элемент выбран в DropDownList, данные в который грузятся так же из бд. Это пока всё что я написала:

    Код:
    using
    System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using System.Drawing.Design;


    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           
        }


        protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
        {
           // lableStatus.Text = "ты выбрал: " + TreeView1.SelectedNode.Text;
        }

        protected void TreeView1_TreeNodePopulate(object sender, System.Web.UI.WebControls.TreeNodeEventArgs e)   
        {
            if (e.Node.ChildNodes.Count == 0)
            {

                switch (e.Node.Depth)
                {
                    case 0:
                        PopulateCategories(e.Node);     
                        break;
                    case 1:
                        PopulateProducts(e.Node);       
                        break;
                    case 2:
                        PopulateProducts_TreeLayer(e.Node);   
                        break;
                    case 3:
                        PopulateProducts_TreeNextLayer(e.Node);   
                        break;
                    case 4:
                        PopulateProducts_TreeNextLayer_1(e.Node);   
                        break;
                    case 5:
                        PopulateProducts_TreeNextLayer_2(e.Node);   
                        break;
                    case 6:
                        PopulateProducts_TreeNextLayer_3(e.Node);     
                        break;
                }
            }
        }


        private DataSet RunQuery(SqlCommand sqlQuery) 
        {
            string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            SqlConnection DBConnection = new SqlConnection(connectionString);
            SqlDataAdapter dbAdapter = new SqlDataAdapter();
            dbAdapter.SelectCommand = sqlQuery;
            sqlQuery.Connection = DBConnection;
            DataSet resultsDataSet = new DataSet();
            try
            {
                dbAdapter.Fill(resultsDataSet);
            }
            catch
            {
                lableStatus.Text = "Unable to connect to SQL Server";
            }
            return resultsDataSet;
        }




        void PopulateProducts_TreeNextLayer_3(TreeNode node)
        {
            string parentID3 = node.Value.Trim();
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "SELECT ........ = '" + parentID3 + "'";
            DataSet ResultSet = RunQuery(sqlQuery);


            foreach (DataRow row in ResultSet.Tables[0].Rows)
            {
                TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
                NewNode.PopulateOnDemand = true;
                NewNode.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);
            }

        }




        void PopulateProducts_TreeNextLayer_2(TreeNode node) 
        {
            string parentID2 = node.Value.Trim();
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "SELECT ....... = '" + parentID2 + "'";
            DataSet ResultSet = RunQuery(sqlQuery);

           
            foreach (DataRow row in ResultSet.Tables[0].Rows)
            {
                TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
                NewNode.PopulateOnDemand = true;
                NewNode.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);
            }

        }

        void PopulateProducts_TreeNextLayer_1(TreeNode node) 
        {
            string parentID1 = node.Value.Trim();
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "SELECT ....... = '" + parentID1 + "'";
            DataSet ResultSet = RunQuery(sqlQuery);

             foreach (DataRow row in ResultSet.Tables[0].Rows)
            {
                TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
                NewNode.PopulateOnDemand = true;
                NewNode.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);
            }
         
        }





        void PopulateProducts_TreeNextLayer(TreeNode node) // класс построения четвёртого уровня дерева
        {
            string parentID = node.Value.Trim();
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "SELECT .......... = '" + parentID + "'";
            DataSet ResultSet = RunQuery(sqlQuery);

            foreach (DataRow row in ResultSet.Tables[0].Rows)
            {
                TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
                NewNode.PopulateOnDemand = true;
                NewNode.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);
            }
        }





        void PopulateProducts_TreeLayer(TreeNode node)
        {
            string parextID = node.Value.Trim();
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "SELECT ............ = '" + parextID + "'";
            DataSet ResultSet = RunQuery(sqlQuery);

            foreach (DataRow row in ResultSet.Tables[0].Rows)
            {
                TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
                NewNode.PopulateOnDemand = true;
                NewNode.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);
            }
        }




        void PopulateProducts(TreeNode node)
        {
            string parID = node.Value.Trim();
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "SELECT .............. = '" + parID + "'";
            DataSet ResultSet = RunQuery(sqlQuery);

            foreach (DataRow row in ResultSet.Tables[0].Rows)
            {
                TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1731"].ToString(), row["ID"].ToString());
                NewNode.PopulateOnDemand = true;
                NewNode.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);

            }
        }




        void PopulateCategories(TreeNode node)   
        {
           string value_Item = DropDownList1.SelectedValue.Trim();
            SqlCommand sqlQuery = new SqlCommand("SELECT ........... = '" + value_Item + "'");
            DataSet resultSet;
            resultSet = RunQuery(sqlQuery);
            if (resultSet.Tables.Count > 0)   
            {
                foreach (DataRow row in resultSet.Tables[0].Rows)   
                {
                    TreeNode NewNode = new TreeNode(row["SP1731"].ToString(), row["ID"].ToString());
                    NewNode.ImageUrl = "http://...";
                    NewNode.PopulateOnDemand = true;   
                    NewNode.SelectAction = TreeNodeSelectAction.Select;
                    node.ChildNodes.Add(NewNode);
                }
            }
        }
        protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
        {

        }
    protected void DropDownList1_SelectIndexChange(object sender, EventArgs e)
    {

    }
    }
    Теперь непосредственно в чём проблемы:

    1) При каждом изменении в DropDownList перестраивать дерево(на данный момент оно 2 раза перестраивает дерево, а на третий уже построенное дерево просто не меняется, не понимаю почему)

    2) Как правильно выводить сообщение-предупреждение пользователю, дорустим о том что что сначала неоюходимо выбрать элемент в  DropDownList? (MessegeDox-не работает, это WindowsForms, alert-тоже, это javascript? не понимаю)

    3) Необходимо реализовать поиск объектов в дереве, с раскрытием необходимого узла дерева автоматически! Как? ведь оно грузится динамически? это вообще возможно реализовать?

    4) Ещё хотелось бы рядом с каждым treenode разместить нечто типа imegebutton, либо всплывающего меню, цель которого открыть открыть новую страницу, на которой в textbox отобразится имя выбранного в дереве обьекта, ну и парочку таблиц с информацией по данному объекту, в общем выполнить межстраничную передачу данных, но чтоб новая страница открывалась в новой вкладке или новом окне IE.
  • Программирование :: С/С++
  • Правильно ли это, что обьект (test) класса Class1, как показано в примере ниже, не будет создан?
    Код:
    class SomeException {};

    class Class1
    {
    public:
            Class1()
            {
                    this->function1();
            }

            void function1()
            {
                    throw SomeException();
            }
    };

    int main(int argc, char** argv)
    {
            try
            {
                    Class1 test;
            }
            catch(...) { return 1; }

            return 0;
    }
  • Есть 3 текстовых файла:
    1 - хранится информация
    2 - хранится имя первого файла - dir1
    3 - куда нужно скопировать информацию из первого файла - dictionary

    Пробовала разными способами считать имя файла и передать его в параметр функции fopen, но не работает

    Не работает этот блок:

                    if((file = fopen(fgets(buf, 20, dir1),"rt")) == NULL){
                            fprintf(stderr, "Cannot open input file.\n");
                            return 1;
                    }
                    while(!feof(file)){
                            fputc(fgetc(file),dictionary);
                    }               

    Если напрямую прописать имя первого файла, то работает. Пробовала также массив char, куда считывала имя функции и использовала как параметр - имя файла - в fopen, тоже не получается.

    Что делаю неправильно?
  • Программирование :: С/С++ :: WinAPI & Visual C++
  • Всем привет!
    Мне нужно узнать, заблокирован ли компьютер. То есть находится ли система в состоянии блокировка.
    Один из способов такой блокировки: ctrl+alt+del -> блокировка.
    Я нашол статью http://support.microsoft.com/kb/310153#top.
    К сожалению у меня выдает ошибку:
    Цитировать
    fastuserswitching\fastuserswitching.cpp(4) : fatal error C1083: Cannot open precompiled header file: 'Debug/FastUserSwitching.pch': No such file or directory
    Error executing cl.exe.
    Всю инструкцию я проделал в новом проекте.
    Работаю в Visual 6.
    Помогите разобраться.
    Заранее спасибо.
  • Стоит задача читать xml файлы в формате юникод, подскажите библиотеку под c++ которая может это делать
  • Добрый день!Подскажите пожалуйста, почему при сабклассинге я не получаю сообщение wm_drawitem. Если нельзя получить, то как перерисовать кнопку...через wm_paint...как правильно...Заранее спасибо.
  • Здравствуйте,

    очень нужна помощь, очень прошу помочь по следующей теме.
    Есть список некоторых системных функций. Помогите, пожалуйста, определить какие функции среди них друг от друга зависимы:

    EnumWindows
    ReadTimeStampCounter
    CryptGenRandom
    QueryPerformanceCounter
    GetSystemTimeAsFileTime
    GetDiskFreeSpaceEx
    ScreenContent
    (Network statistic)
    Process info: aProcesses, hProcess


    Это нужно для измерения энтропии этих функций.

    Заранее благодорю. 
  • Программирование :: Delphi
  • Здравствуйте! :thumbsup:
    Нам дали на самостоятельное изучение реализацию SQL-запросов с помощью Delphi. Тема несложная, но на самом последнем этапе трудности всё-таки возникли. :spy:
    Вот задание:
    Практическое задание
    1.С помощью MS Access создайте таблицу БД в соответствие с Табл. 1. Создайте в таблице не менее пяти записей.
    2.Используя программный способ формирования SQL-запросов, создайте приложение, которое реализует следующие возможности:
    - Определяет номер телефона по фамилии абонента;
    - Определяет фамилию, имя, отчество и адрес абонента по номеру телефона;
    - Выдает все номера телефонов, Ф.И.О. и номера квартир абонентов, проживающих на одной улице в одном доме (по указанному номеру дома и указанной улице
    Вот с последним-то заданием я и не справилась. :insane:
    У меня есть два Edit'а-один для ввода улицы, другой для ввода дома, кнопка, в процедуре написано следующее:
    Код:
    procedure
    TForm1.Button4Click(Sender: TObject);
    begin
    ADOQuery1.Active:=False;
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT PhoneNum, FName, LName, PhName , Kv');
    ADOQuery1.SQL.Add('FROM Таблица1');
    ADOQuery1.SQL.Add('WHERE Street='+'"'+Edit4.Text+'"');
    //ADOQuery1.SQL.Add('WHERE House='+'"'+Edit9.Text+'"');
    ADOQuery1.Open;
    ADOQuery1.Active:=True;
    end;
    По отдельности (когда один из них закомментирован) запросы работают правильно, но вместе никак не хотят, программа вылетает и выдаёт ошибку "Ошибка синтаксиса (пропущен оператор) в выражении запроса Street="Пушкина" WHERE House="77""
    Помогите пожалуйста! :confused:
  • Программирование :: VisualBasic :: Visual Basic for Applications
  • Всем привет.

    есть такой макрос:
    Код:
    Dim oRange
    Set oRange = Selection

    If oRange.Offset(0, -1).Value = 1 Then
        oRange.Value = 1
    Else
        oRange.Value = 0
    End If

    End Sub

    При выделении одной ячейки работает, если несколько ячеек - то нет.
    Как нужно изменить макрос чтобы он работал при выделении нескольких ячеек?
  • Дорбый день!  :)

    Сделал руками:

    Range("A11").Select
        ActiveWindow.SmallScroll Down:=87
        Range("A11:J500").Select

    Очень хочу научиться вместо "500" получать количество заполненных строк.
  • Программирование :: Java
  • Подскажите как можно переназначить System.out.println().....?
  • Программирование :: Программирование 1С
  • Добрый день, подскажите: у клиента не формируется в специализированных отчетах расчетная ведомость по налогам после обновления. Раньше формировалась в 2009 году. Проводки в 2009 году формировались при операции "закрытие месяца". С 2010 года при закрытии месяца в карточке запроса поставлена галочка "формировать начисление налогов яс фонда оплаты труда". В модуле тоже прописаны проводки. А в конечном итоге показывает только суммы зарплаты и удержанный подоходный налог.
  • Программирование :: Программирование 1С :: 1С 7.x
  • Подскажите, пожалуйста, как из документа "Операция" из журнала "Операции введенные вручную или через регламентированный отчет" получить данные по каждой введенной операции, чтобы заполнить их в ТЗ. Проблема в том, что там нет табличной части, и как из него вытащить данные, не представляю.
  • Программирование :: Программирование 1С :: 1С 8.x
  • Необходимо создать кнопку на форме, которая открывает ВНЕШНИЙ файл, с жеского диска(и прикрепляет гиперссылку чтобы потом можно было по ней, или по другой кнопке, открыть этот файл). Очень долго бьюсь нарыл кучу литературы, но ничего не выходит:
    http://www.sql.ru/forum/actualthread.aspx?bid=63&tid=547230&pg=1
    http://www.forum.mista.ru/topic.php?id=506312

    не могу понять что делаю не так. Очень прошу помощи.
  • Подскажите как можно подключить классфикатор адресов к чистой базе 1с 8.1 (пишу свою конфигурацию)???
  • Доброго времени суток, дамы и господа! Сложилась неприятная ситуация, база крутится на SQL, при выгрузке .dt и попытке загрузить его в файловый режим, вылетала ошибка: "Недостаточно памяти", сделал тестирование и исправление, думал поможет. Не помогло, теперь вылетает ошибка:
    Код:
    Ошибка загрузки информационной базы. В информационную базу загружены не все данные
    по причине:
    Ошибка СУБД:
    Превышен максимально допустимый размер внутреннего файла '*:\*\1Cv8Log/1Cv8.1CD'
    по причине:
    Превышен максимально допустимый размер внутреннего файла '*:\*\1Cv8Log/1Cv8.1CD'

    Буквально пару месяцев назад все было нормально и без проблем грузилось. Кто-нибудь сталкивался с такой проблемой???

    Платформа и конфигурация:
    1С:Предприятие 8.2 (8.2.12.80)
    Управление производственным предприятием, редакция 1.3 (1.3.2.1)
  • Есть регистр сведений с измерениями:
    - ОтКого
    - Кому
    - Важность
    И ресурс:
    - Сообщение

    1) Как сделать отбор, чтобы выводились записи только по полю "ОтКого"?

    2) Как присвоить программно чтобы при создании новой записи автоматом записывалось поле "ОтКого"?
  • Операционные системы :: Windows
  • Решил поставить вторую windows на комп, какая семёрка сейчась менее глючная? :)
    До этого пробовал Ultimate так она за долбала глюками, Pro работала нормально. :)
  • При установке сборки ZverDVD 2010.8 + AlkidSE возникают проблемы. :(
    В разных случаях чего то не находится. Или какой нибудь фаил или драйвер, например оптического привода, CD-ROM или жеский диск.
    При установке ZverCD Lego v9.12.2 выскакивает синий экран
    stop 0*0000006F (0*0000020, 0*0000000, 0*0000000, 0*0000000).
    С Zver CD Lego 9.2.3 wm-uglich.ru были такие же проблемы.
    После чтения разных форумов, предполагаю, что не находится драйвер жёского диска.
    Ноутбук ASER TravelMate 2450.
    Win 7 установить удалось (ради эксперемента), но один раз.
    Я перепрошил BIOS и попытался установить windows xp.
    Теперь сново ни чего не устанавливается. При попытке установить Win 7 возникают разные проблемы:
    могут не найтись какие-нибудь файлы (разные),
    может в процессе установки не установиться русский язык и установка прервётся,  
    может после копирования файлов не найтись раздел для установки (но после нажатия "форматировать" раздел всё же находится).
    Чаще всего появляется надпись: "windows не удаётся становить необходимые файлы. Возможно, файл поврежден или отсутствует. Убедитесь, что имеются все файлы, неободимые для установки, и перезапустите установку. Код ошибки: 080070017.
    При установке windows xp ни чего не изменилось.
    Ошибка  0*0000006F (0*0000020, 0*0000000, 0*0000000, 0*0000000) высвечивается чаще всех.

    диск с ZverDVD 2010.8 + AlkidSE;  ZverCD Lego v9.12.2; xp я не проверял ранее
    Zver CD Lego 9.2.3 wm-uglich.ru был ранее установлен на этом и других ноутбуках
    windows 7 установлен у меня на компе

    Все проблемы начались после вируса. Проблемы описаны тут:
    http://forum.shelek.ru/index.php/topic,25365.new.html#new
  • Операционные системы :: Unix и другие :: Linux
  • Раньше долго работал с gentoo на x86 и всё было без проблем. Поменяли компьютер на работе и соотвественно требования дистрибутиву поменяли.
    Впервые установил верасию для 64-х розрядную машину. Ставил как и x86 версию только stage3 исользовал 64-х розрядную версию.
    Когда всё поствилось, я зашел под root'ом и при просто решил поставить пакет gedit.

    Он начал ругатся а ставить октказаля.
    Вот ошибоки:


      * IMPORTANT: 1 news items need reading for repository 'gentoo'.
     * Use eselect news to read news items.

    Calculating dependencies... done!

    emerge: there are no ebuilds built with USE flags to satisfy ">=x11-libs/cairo-1.6[X,svg]".
    !!! One of the following packages is required to complete your request:
    - x11-libs/cairo-1.8.10 (Change USE: +X)
    (dependency required by "x11-libs/gtk+-2.20.1-r1" [ebuild])
    (dependency required by "dev-python/pygtk-2.16.0-r1" [ebuild])
    (dependency required by "app-editors/gedit-2.30.3" [ebuild])
    (dependency required by "gedit" [argument])


     * IMPORTANT: 1 news items need reading for repository 'gentoo'.
     * Use eselect news to read news items.


    Перечетал мануалов но так чё то не нашел внятного обьяснения.
    Не фанат gentoo и как оказалось не очень лажу emerge. Но на архитектуре x86 он работал стабильно.
    Тут начал ругатся на маску. Вроде профиль правильно указан и делала всё по манулалу. :dontknow:
  • Доброе вреся суток.

    Собирал вручную из исходных кодов программу класическим способом: ./configure && make && make install.
    Не получилось не как. Читал документацию и какие не обходимо пераметры сборки.
    Установил все зависимости(apt-get build-dep <имя пакета>) для запуска и сборки.
    Короче перепробовал всё и не чего не получилось. :dontknow:

    Потом попробовал через apt-get -b source <имя пакета>....
    И система сама всё собрала на ура!

    Подозреваю что что то упустил в параметрах сборки. :insane:

    Такой вопрос:    как узнать какие параметры сборки пакета использует APT-GET ?
  • Всем доброго времени суток, многих наверняка рассмешило название темы... но прошу отнестись к моей проблеме с пониманием.
    Случилось так, что я по вине своих кривых рук(если это так можно назвать), при установке linux mint указал опцию "использовать весь диск" вместо опции "использовать имеющееся свободное место на диске". Свежеустановленной mint я конечно порадовался, но каково было мое разочарование, когда я увидел, что моего основного ntfs раздела больше не существует. :interesting:
    Скажите пожалуйста, чем более безболезненно можно переформатировать разделы и реально ли потом выдернуть хоть какую-то часть данных?
  • Направления программирования :: Drivers
  • Решаю всю ту же проблему, что была обозначена в конце темы http://forum.shelek.ru/index.php/topic,24622.0.html. А именно, мой USB-девайс при работе с драйвером, созданным в DS 3.2 пропускает данные на медленных машинах (PIV) и не пропускает данные на машине Core 2 Duo, при условии, если не запущены приложения, требующие значительных ресурсов (Opera). Отсюда сделал вывод, что пропуски могут проходить на уровне драйвера. Девайс работает следующим образом: подготовив данные для передачи по USB (заполнив FIFO UDP-модуля контроллера, отвечающего за работу с USB), ставит флаг готовности для передачи пакета данных размером 60 байт по USB. Далее ожидает, пока придет запрос от Хоста и уже после этого начинает передачу данных. Запросы формирует драйвер, который в свою очередь принимает их от приложения. Если я правильно понял, то в медленных или загруженных другими приложениями эти запросы могут задерживаться и в случае маленького буфера для запросов - теряться. Таким образом, какой смысл делать большой буфер для принимаемых драйвером от девайса данных, если при этом запросы на считывание этих данных приложением будут поступать с той же  частотой или реже?
    Что вы посоветуете для решения подобной проблемы?
    Заранее благодарен!
  • Всем доброго времени суток.
    Имеется разработаное мною USB устройство, которое в OC Windows выглядит как СОМ-порт. Хочу подменить окно свойств порта в диспетчере устройств Windows. Т.е. вместо стандартной вкладки Windows для СОМ-порта, где можно менять его параметры и прочее, создать свою, где можно было бы менять режимы работы устройства, может быть даже обновлять прошивку и т.п.
    Подскажите, куда копать. Что то гуглением ни как не получается:( Может не туда смотрю, или не так пишу:)
    Спасибо. 
  • Привет всем.
    Проблема в следующем. Для драйверов x86 использую для отладки связку WinDbg+WMWare, меня это вполне устраивает. Пытаюсь аналогично делать для драйверов x64 - WinDbg отказывается коннектится к WMWare. Подозреваю, что хост-система тоже должна быть x64 с WinDbg for x64 (пытаюсь делать из хоста WinXP x86, отлаживаемая система в WMWare - Win7 x64). Если кто делал такое, пните меня в нужном направлении. Да и если все таки нужно, чтобы хост был также x64, можно ли сделать, чтобы хостом была тоже виртуальная система.
    З.Ы. Предварительно драйвер подписал как тестовый и соответственно настроил систему, то есть без отладки драйвер запускается.
  • Практические разделы :: Базы данных
  • CREATE TABLE Anketa
    (emp_id int IDENTITY(1,1) PRIMARY KEY,
    second_name varchar(30) NOT NULL,
    first_name varchar(15) NOT NULL,
    middle_name varchar(20) NULL,
    sex char(1),
    birth_date datetime,
    position varchar(50)
    CONSTRAINT const_Anketa UNIQUE
    (second_name ASC, first_name ASC, birth_date DESC)
    )   
    CREATE TABLE Места Работы
    (emp_id int IDENTITY(1,1) PRIMARY KEY,
    second_name varchar(30) NOT NULL,
    first_name varchar(15) NOT NULL,
    middle_name varchar(20) NULL,
    sex char(1),
    birth_date datetime,
    position varchar(50)
    CONSTRAINT const_Места Работы UNIQUE
    (second_name ASC, first_name ASC, birth_date DESC)
    )   
    Insert Into Anketa
    (ФИО, дата и место  рождения, паспортные данные, личные качества, характеристики, дату занесения)
    Values (Колосов Евгений Александрович, 28.11.1989 Пушкино, 4606659892 29.12.2009 выдан Пушкинским ОУФМС, целеустремленный, 17.09.2010)
    Insert Into Места Работы
    (дата поступления на работу, дата увольниния, место работы, причина увольнения)
    Values (11.2009, 08.2010, ТопТелеком, по собственному желанию)
  • Учимся программировать :: Срочно пАмАгите!!!
  • 1.   Программа должна обеспечивать работу в двух режимах: администратора (пользователя с фиксированным именем ADMIN) и обычного пользователя.
    2.   В режиме администратора программа должна поддерживать следующие функции (при правильном вводе пароля):
    ∙   смена пароля администратора (при правильном вводе старого пароля);
    ∙   просмотр списка имен зарегистрированных пользователей и установленных для них параметров (блокировка учетной записи, включение ограничений на выбираемые пароли) – всего списка целиком в одном окне или по одному элементу списка с возможностью перемещения к его началу или концу;
    ∙   добавление уникального имени нового пользователя к списку с пустым паролем (строкой нулевой длины);
    ∙   блокирование возможности работы пользователя с заданным именем;
    ∙   включение или отключение ограничений на выбираемые пользователем пароли (в соответствии с индивидуальным заданием, определяемым номером варианта);
    ∙   завершение работы с программой.
    3.   В режиме обычного пользователя программа должна поддерживать только функции смены пароля пользователя (при правильном вводе старого пароля) и завершения работы, а все остальные функции должны быть заблокированы.
    4.   После своего запуска программа должна запрашивать у пользователя в специальном окне входа ввод его имени и пароля. При вводе пароля его символы всегда должны на экране заменяться символом ‘*’.
    5.   При отсутствии введенного в окне входа имени пользователя в списке зарегистрированных администратором пользователей программа должна выдавать соответствующее сообщение и предоставлять пользователю возможность повторного ввода имени или завершения работы с программой.
    6.   При неправильном вводе пароля программа должна выдавать соответствующее сообщение и предоставлять пользователю возможность повторного ввода. При трехкратном вводе неверного пароля работа программы должна завершаться.
    7.   При первоначальном вводе пароля (обязательном при первом входе администратора или пользователя с зарегистрированным ранее администратором именем) и при дальнейшей замене пароля программа должна просить пользователя подтвердить введенный пароль путем его повторного ввода.
    8.   Если выбранный пользователем пароль не соответствует требуемым ограничениям (при установке соответствующего параметра учетной записи пользователя), то программа должна выдавать соответствующее сообщение и предоставлять пользователю возможность ввода другого пароля, завершения работы с программой (при первом входе данного пользователя) или отказа от смены пароля.
    9.   Информация о зарегистрированных пользователях, их паролях, отсутствии блокировки их работы с программой, а также включении или отключении ограничений на выбираемые пароли должна сохраняться в специальном файле. При первом запуске программы этот файл должен создаваться автоматически и содержать информацию только об администраторе, имеющем пустой пароль.
    10.   Интерфейс с программой должен быть организован на основе меню, обязательной частью которого должно являться подменю «Справка» с командой «О программе». При выборе этой команды должна выдаваться информация об авторе программы и выданном индивидуальном задании. Интерфейс пользователя программы может также включать панель управления с дублирующими команды меню графическими кнопками и строку состояния.
    11.   Для реализации указанных в пунктах 2-3 функций в программе должны использоваться специальные диалоговые формы.

    P.S.Не знаю даже с чего начать;(Помогите, пожалуйста:(
  • Всем доброго время суток. У меня возникла проблема. Есть исходник программы "Восьмирнашки"(аналог Пятнашек., только на поле 3х3). Мне очень нужна помощь - нужно разобраться, как работает эта программа и составить алгоритм работы этой программы как можно подробнее.
    Вот сам код:
    Код:
    #include <stdio.h>

    /******************  MUST BE OPPOSITES ******************/
    #define LEFT 1
    #define RIGHT -1
    #define UP 2
    #define DOWN -2
    #define EMPTY_STACK -3

    #define OPTIMIZATION

    #ifdef OPTIMIZATION
    #define MAX_MOVES 1000    // Для больших этого может быть не достаточно, однако это только используется для оптимизации и может быть опущено

    int move_stack[MAX_MOVES];    // Для оптимизации
    int stack_top=0;
    #endif
    int move_count;        // Неоптимизированые шаги;

    #define columns 3
    #define rows 3

    int solution[rows][columns]= {     { 1, 2, 3 }, //Правильное решение
                    { 4, 5, 6 },
                    { 7, 8, 0 } };

    int current[rows][columns]= {    { 4, 5, 7 },//Заданая матрица
                    { 3, 1, 2 },
                    { 6, 8, 0 } };

    int b_row, b_column;    // Координаты пустого квадрата
    int t_row, t_column;    // Координаты целевого квадрата

    void get_blank() { //Поиск  координатов ячейки с нулем
        int i,j;
        for(i=0; i<columns; i++) {
            for(j=0; j<rows; j++) {
                if (current[j][i]==0) {
                    b_row=j;
                    b_column=i;
                    return;
                }
            }
        }
    }

    void get_target_square(int target_num) {//Поиск координатов не пойму толком чего
        int i,j;
    //    printf("going for \"%d\"\n", target_num);
        for(i=0; i<columns; i++) {
            for(j=0; j<rows; j++) {
                if (current[j][i]==target_num) {
                    t_row=j;
                    t_column=i;
                    return;
                }
            }
        }
    }


    void print_current()//Вывод матрицы
    {
        int i, j;
        for(i=0; i<rows; i++) {
            for(j=0; j<columns; j++) {
                printf(" %d ", current[i][j]);
            }
            printf("\n");
        }
        printf("\n");
    }

    #ifdef OPTIMIZATION
    void push_move(int direction) {
        if (direction == EMPTY_STACK) return;
        move_stack[stack_top++]=direction;
    }

    int pop_move() {
        if (stack_top==0) return(-3);
        return(move_stack[--stack_top]);
    }
    #endif

    void move_blank (int direction) //Пробел перемещения. Только это изменяет/заменяет плату
    {
        int b_new_row, b_new_column;
        int last;
        int printit=1;
    #ifdef OPTIMIZATION
        if((last=pop_move()) != -direction) {
            push_move(last);
            push_move(direction);
        }
    #endif
        move_count++;
        if(printit) printf("move: ");
        switch (direction) {
            case UP:
                b_new_row=b_row-1;
                b_new_column=b_column;
                if(printit) printf("UP\n");
                break;
            case DOWN:
                b_new_row=b_row+1;
                b_new_column=b_column;
                if(printit) printf("DOWN\n");
                break;
            case LEFT:
                b_new_row=b_row;
                b_new_column=b_column-1;
                if(printit) printf("LEFT\n");
                break;
            case RIGHT:
                b_new_row=b_row;
                b_new_column=b_column+1;
                if(printit) printf("RIGHT\n");
                break;
        }
        current[b_row][b_column]=current[b_new_row][b_new_column];
        current[b_new_row][b_new_column]=0;
        b_row=b_new_row;
        b_column=b_new_column;
    }

    int check_move_target(int direction) // Проверка перемещения цели. Должно быть глупое название для ф-и...
    {
        int bt_row, bt_column;
        bt_row=t_row;
        bt_column=t_column;
        switch(direction) {
            case UP:
                bt_row--;
                break;
            case DOWN:
                bt_row++;
                break;
            case LEFT:
                bt_column--;
                break;
            case RIGHT:
                bt_column++;
                break;
        }
        if(bt_column!=b_column || bt_row !=b_row ) {
            printf("SCREWED UP BADLY\n");
            return(-1);
        }
        t_row=bt_row;
        t_column=bt_column;
        move_blank(-direction);        // Поскольку они противоположны.
        return(1);
    }

    void third_quarter()//Третий квартал. BS функция
    {
        if (b_row<t_row) {
            if(b_column==t_column) {
                if (b_column<columns-1) move_blank(RIGHT);
                else move_blank(LEFT);
            }
            while(b_row<t_row && b_row<rows-1) move_blank(DOWN);
        }
        if(b_column<t_column && b_column<columns-1) {
            if(b_row==t_row) {
                if(b_row<rows-1) move_blank(DOWN);
                else move_blank(UP);
            }
            while(b_column<t_column && b_column<columns-1) move_blank(RIGHT);
        }
    }

    void blank_approach_target()//Пустая цель подхода. Устанавливаем ошибочный ход.
    {
        third_quarter();
        if(b_row>t_row) {
            while(b_row>t_row+1) move_blank(UP);
        }
        else {
            while(b_row<t_row-1) move_blank(DOWN);
        }

        if (b_column>t_column) {
            while(b_column>t_column+1) move_blank(LEFT);
        }
        else {
            while(b_column<t_column-1) move_blank(RIGHT);
        }
    }

    void move_target(int direction)//Цель перемещения
    {
        blank_approach_target();
        switch(direction) {
            case UP:
                if (t_column==b_column && t_row<b_row) {
                    // detour
                    if (b_column< columns-1)
                        move_blank(RIGHT);
                    else
                        move_blank(LEFT);
                }
                while(t_row-1>b_row) move_blank(DOWN);
                while(t_row-1<b_row) move_blank(UP);
                while(t_column>b_column) move_blank(RIGHT);
                while(t_column<b_column) move_blank(LEFT);
                break;
            case DOWN:
                if (t_column==b_column && t_row>b_row) {
                    // detour
                    if (b_column< columns-1)
                        move_blank(RIGHT);
                    else
                        move_blank(LEFT);
                }
                while(t_row+1>b_row) move_blank(DOWN);
                while(t_row+1<b_row) move_blank(UP);
                while(t_column>b_column) move_blank(RIGHT);
                while(t_column<b_column) move_blank(LEFT);
                break;
            case LEFT:
                if (t_row==b_row && t_column<b_column) {
                    // detour
                    if(b_row<rows-1)
                        move_blank(DOWN);
                    else
                        move_blank(UP);
                }
                while(t_column-1>b_column) move_blank(RIGHT);
                while(t_column-1<b_column) move_blank(LEFT);
                while(t_row>b_row) move_blank(DOWN);
                while(t_row<b_row) move_blank(UP);
                break;
            case RIGHT:
                if (t_row==b_row && t_column>b_column) {
                    // detour
                    if(b_row<rows-1)
                        move_blank(DOWN);
                    else
                        move_blank(UP);
                }
                while(t_column+1>b_column) move_blank(RIGHT);
                while(t_column+1<b_column) move_blank(LEFT);
                while(t_row>b_row) move_blank(DOWN);
                while(t_row<b_row) move_blank(UP);
                break;
        }
        check_move_target(direction);
    }

    void solve_column(int column)//Решение столбца
    {
        int i;

        for(i=0; i<rows-2; i++) {
            if(current[i][column] != solution[i][column]) {
                get_target_square(solution[i][column]);
                while(t_row>i) move_target(UP);
                while(t_row<i) move_target(DOWN);
    print_current();
                while(t_column>column) move_target(LEFT);
                while(t_column<column) move_target(RIGHT);
                if(b_column<columns-1) move_blank(RIGHT);
    print_current();
            }
        }
        if(current[rows-2][column] != solution[rows-1][column]) {
            get_target_square(solution[rows-1][column]);
            while(t_row>rows-2) move_target(UP);
            while(t_row<rows-2) move_target(DOWN);
    print_current();
            while(t_column>column) move_target(LEFT);
            while(t_column<column) move_target(RIGHT);
            if(b_column<columns-1) move_blank(RIGHT);
    print_current();
        }
        if(b_column<columns-1) move_blank(RIGHT);
        if(b_column<columns-1) move_blank(RIGHT);
        if(current[rows-1][column] == solution[rows-2][column]) {
            // special case : known as tyflosoyrths
            while(b_row<rows-1) move_blank(DOWN);
            while(b_column<column+2) move_blank(RIGHT);
            while(b_column>column+2) move_blank(LEFT);
            move_blank(LEFT);
            move_blank(LEFT);
            move_blank(UP);
            move_blank(RIGHT);
            move_blank(RIGHT);
            move_blank(DOWN);
            move_blank(LEFT);
            move_blank(UP);
            move_blank(LEFT);
            move_blank(DOWN);
            move_blank(RIGHT);
        }
    print_current();
        get_target_square(solution[rows-2][column]);
        while(t_column>column+1) move_target(LEFT);
        while(t_row>rows-2) move_target(UP);
        while(t_row<rows-2) move_target(DOWN);
        while(b_column<column+2) move_blank(RIGHT);
        while(b_row<rows-1) move_blank(DOWN);
        // small tyflosoyrths
        move_blank(LEFT);
        move_blank(LEFT);
        move_blank(UP);
        move_blank(RIGHT);
    print_current();
    }

    void solve_row(int row)//Решение строки
    {
        int i;

        for(i=0; i<columns-2; i++) {
            if(current[row][i] != solution[row][i]) {
                get_target_square(solution[row][i]);
                while(t_column>i) move_target(LEFT);
                while(t_column<i) move_target(RIGHT);
    print_current();
                while(t_row>row) move_target(UP);
                while(t_row<row) move_target(DOWN);
                if(b_row<rows-1) move_blank(DOWN);
    print_current();
            }
        }
        if(current[row][columns-1] != solution[row][columns-2]) {
            get_target_square(solution[row][columns-2]);
            while(t_column<columns-1) move_target(RIGHT);
    print_current();
            while(t_row>row) move_target(UP);
            while(t_row<row) move_target(DOWN);
            if(b_row<rows-1) move_blank(DOWN);
    print_current();
        }
        if(b_row<rows-1) move_blank(DOWN);
        if(b_row<rows-1) move_blank(DOWN);

        if(current[row][columns-2] == solution[row][columns-1]) {
            // special case : known as tyflosoyrths
            while(b_column<columns-2) move_blank(RIGHT);
            while(b_column>columns-2) move_blank(LEFT);

            while(b_row<row+2) move_blank(DOWN);
            while(b_row>row+2) move_blank(UP);
            move_blank(UP);
            move_blank(UP);
            move_blank(RIGHT);
            move_blank(DOWN);
            move_blank(DOWN);
            move_blank(LEFT);
            move_blank(UP);
            move_blank(RIGHT);
            move_blank(UP);
            move_blank(LEFT);
            move_blank(DOWN);
        }
    print_current();//Вывод потока
        get_target_square(solution[row][columns-1]);
        while(t_row>row+1) move_target(UP);
        while(t_column<columns-1) move_target(RIGHT);

        while(b_row<row+2) move_blank(DOWN);
        while(b_row>row+2) move_blank(UP);
        while(b_column>columns-2) move_blank(LEFT);
        while(b_column<columns-2) move_blank(RIGHT);
        // small tyflosoyrths
        move_blank(UP);
        move_blank(UP);
        move_blank(RIGHT);
        move_blank(DOWN);
    print_current();

    }

    int main() {//Главная функция

        int i;
        get_blank();
    //    print_current();
        for(i=0; i<columns-2; i++) {
            solve_column(i);
        }
        for(i=0; i<rows-2; i++) {
            solve_row(i);
        }
        while(b_row<rows-1) move_blank(DOWN);
        while(b_column<columns-1) move_blank(RIGHT);
        print_current();

    #ifdef OPTIMIZATION
    printf("\n\n Это реальное решение\n");
        for(i=0; i<stack_top; i++) {
            switch(move_stack[i]) {
                case UP:
                    printf("move: Вверх\n");
                    break;
                case DOWN:
                    printf("move: Вниз\n");
                    break;
                case LEFT:
                    printf("move: Влево\n");
                    break;
                case RIGHT:
                    printf("move: Вправо\n");
                    break;
            }
        }
        printf("\ntotal moves: %d\n(unoptimized moves: %d)\n", stack_top, move_count);
    #endif
    }


    Пытался разбираться - и остановился на функции get_target_square(int target_num). Не могу понять, координаты чего конкретно там определяются и откуда вообще берется значение  target_num?
    Затем не могу понять,что делают функции  push_move(int direction) и pop_move() . Ну и дальше полная каша и неразбериха :dontknow:

    Очень надеюсь на ваш опыт и прошу помочь мне разобраться с принципом работы и составить алгоритм ну или написать здесь алгоритм программы если кто уже смог разобраться или встречался с подобной программой.
  • вот программа... что добавить что бы при вводе с клавиатуры буквенного значения, выходила ошибка, чтоб ввести числовое значение ...
    Код:
    #include <iostream> 
    #include <string>
    #include <math.h>
    using namespace std;
    int main()
    {
    double x, y ;
    cout<< "введите x:";
    cin>> x;
    y=2*(tan(x)+sin(x)/2);
    cout<< "y="<< y<< "\n" ;
    return 0;
    }
  • Новичок в C++
    Народ помогите пожалуйста, написать программу
    которая решает этот пример:
    y=2*(tgx + sinx/2)
  • Есть программа работающая с файлом, нужно этой файл прочитать из другой. При попытке открытия файла для чтения получаю INVALID_HANDLE_VALUE, при этом через fopen("my.file","r") всё читается нормально.

    Код:
    m_h=CreateFile("my.file",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL);
    if(m_h==INVALID_HANDLE_VALUE)
    {
    int h=GetLastError();
    AddToLog("Открытие файла ... Error!");
    return;
    }

А теперь прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


В избранное