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

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


Клуб профессиональных программистов «Весельчак У»
Информационная рассылка сайта и форума.  Выпуск 127.  29 ноября 2011 г.

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

Сегодня предлагаем вам фрагмент шестой части статьи «Hello World! в embedded-исполнении». Данная статья уже полностью написана (не опубликована одна, заключительная часть). Если она вас заинтересовала, рекомендуем присоединиться к обсуждению темы для следующей статьи.


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


Приятного чтения!


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

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



Оглавление



«Позвольте, товарищ, у меня все ходы записаны»


Взявшись за наведение порядка в коде, следует вспомнить о еще одном важном деле — документировании кода. Именно документирование ходов шахматной партии позволило вывести на чистую воду великого комбинатора, которому почти всегда все сходило с рук. В нашем случае тщательное документирование тоже поможет разрешить множество недоразумений, порой возникающих по ходу проекта. Мы уже начали этот процесс, когда рисовали диаграммы UML, разрабатывая архитектуру приложения. Но эти диаграммы поясняют лишь архитектуру в целом, так сказать, с высоты птичьего полета, не раскрывая крайне важных деталей.

Мы уже определили интерфейсы вспомогательных модулей Led и Timer, которыми будет пользоваться Application, и сгенерировали для них подставные объекты, которые позволили протестировать логику работы нашего центрального модуля Application до реализации вспомогательных модулей в соответствии с принципами TDD. Теперь следует задокументировать эти интерфейсы перед их реализацией.

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

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

Краткий обзор использования Doxygen вы можете найти на сайте нашего клуба, но я все же рекомендовал бы изучить прилагаемую документацию полностью, поскольку возможностей в продукт заложено очень много, и далеко не все из них удастся обнаружить «методом тыка» или беглым просмотром примеров.

Возвращаемся к нашим исходникам, открываем их в редакторе и комментируем. При комментировании крайне важно иметь чувство меры и не переусердствовать. Так, начинающие программисты (не все, конечно; есть и такие, которые способны наворотить горы запутанного кода без единого комментария; впрочем, отсутствие комментариев в данном случае — не признак лени, просто пишущий не понимает толком, что делает, и ему нечего написать в комментариях) часто пишут нечто такое:


Код: (C)
count++; // увеличить значение счетчика
total += current; // добавить текущий платеж к общей сумме

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

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

С учетом вышесказанного получаем:


...



Полностью прочитать статью можно на нашем сайте, в разделе «Инструменты и технологии проектирования ПО».

  • Программирование :: Неотложка
  • Вот такая задача
    Дана целочисленная матрица размером MхN. Пусть для каж-дой строки матрицы определена функция f(a), равная сумме составных чисел, являющихся элементами строки a. Упоря-дочить (переставить) строки матрицы по неубыванию в со-ответствии со следующим критерием: строка a считается «больше» строки b, если f(a) > f(b). Используйте алгоритм простого выбора.

    ВНИМАНИЕ: в задаче необходимо составить программу, реализующую алгоритм сортировки. На экран выводятся исходный и результирующий массивы. Алгоритм сортировки оформить в виде процедуры.

     Сделала, как смогла, но хотелось бы , что бы  матрица формировалась random  а не являлась константой, помогите с этим разобраться. Спасибо всем-всем.....))))


    Код: (pascal)
    const
       n = 3;
       m = 4;
    type
       index = 1 .. n;
       element = array[1 .. m] of integer;
       mas = array[index] of element;

    function f(s : element) : integer;
    var
       i, j, sum : integer;
       divisors : integer;
    begin
        sum := 0;
        for i := 1 to m do
        begin
           divisors := 0;
           for j := 2 to trunc(sqrt(s[i])) do
              if s[i] mod j = 0 then inc(divisors);

           if divisors > 0 then
              sum := sum + s[i];
        end;
        f := sum
    end;
     
    procedure sort(var a:mas);
    var
       i, j, k : index;
       x : element;
    begin
       for i := 1 to n - 1 do
       begin
          k := i;
          x := a[i];
          for j := i + 1 to n do
             if f(a[j]) < f(x) then
             begin
                k := j; x := a[j]
             end;

          a[k] := a[i];
          a[i] := x
       end;
    end;
     
    procedure print(const a : mas);
    var i, j : integer;
    begin
       for i := 1 to n do
       begin
          for j := 1 to m do write(a[i, j]:4);
          writeln;
       end;
    end;
     
    const
       a : mas =
       (
          ( 2,  3,  4,  5), // f =  4
          (10, 11, 12, 15), // f = 37
          (17, 19, 23, 19)  // f =  0
       );
     
    begin
       writeln('До:');
       print(a);
       sort(a);
       writeln('После:');
       print(a);
    end.
  • Есть письмо (в аттаче). это обычный текстовый файл. под семеркой, например, его благополучно откроет почта Windows Live. при этом кодировки кривые. Если же это письмо просматривать через веб-интерфейс - там все прекрасно.

    я пробовал играться с content-type, content-encoding - но результата не добился. можно ли что-то поправить в хидере этого письма так, чтобы оно корректно отображалось штатными почтовиками?
  • Есть ли программа которая может принимать информацию с термена и отсылать смс-информацию на мобильник этому же человеку.
    например: пришел чел загрузил деньги на счет свой и после загрузки это информация автоматически приходит на компьютер и автоматический  отсылает смс-информацию тому же человеке о том что загрузились деньги успешна на его номер.
  • Программирование :: C/C++
  • Доброго времени суток.


    есть ли какие-нибудь стандартные функции (mfc) поворота изображения на форме?
  • Программирование :: C/C++ :: WinAPI & Visual C++
  • Добрый день, Знатоки!
    Пишу на Borland C++ 6, Win XP.
    Работаю с COM RS485 портом.
    Код программы:

    Код: (C)
    Com1Port=CreateFile("COM5",GENERIC_READ|GENERIC_WRITE,
                         0,// устройство связи должно быть открыто для монопольного доступа
                         NULL,// нет атрибутов защиты
                         OPEN_EXISTING, // cустройства связи должен использовать OPEN_EXISTING
                         0, // нет перекрытый с I/O
                         NULL); // для коммуникационных устройств параметр hTemplate должен быть NULL

     if(Com1Port==INVALID_HANDLE_VALUE)  ShowMessage("Порт COM5 занят ");
     
    // Установвить размер буфера:
        SetupComm( Com1Port, 1024, 1024 );

    // Очистить буфер
        PurgeComm( Com1Port, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );

     // Задать установки таймаута

        ct.ReadIntervalTimeout=2;
        ct.ReadTotalTimeoutMultiplier=1;
        ct.ReadTotalTimeoutConstant=MAXDWORD;
        ct.WriteTotalTimeoutMultiplier=1;
        ct.WriteTotalTimeoutConstant=1000 ; //MAXDWORD;

        fSuccess =  SetCommTimeouts(Com1Port,&ct);   // timeout
        if (!fSuccess) ShowMessage ("( Error SetCommTimeouts)");

     // Получить текущую конфигурацию.
        fSuccess = GetCommState(Com1Port, &dcb);


      dcb.BaudRate = CBR_38400;      // устанавливаем скорость
      dcb.ByteSize  = 8;                     // размер данных xmit, и rcv
      dcb.Parity      = NOPARITY;         // нет бита четности
      dcb.StopBits = ONESTOPBIT;     // один стоп-бит
      dcb.EofChar  = '}';

        // setup hardware flow control
      dcb.fDtrControl = DTR_CONTROL_ENABLE;
      dcb.fRtsControl = RTS_CONTROL_ENABLE;
      dcb.fOutxDsrFlow = 0;
      dcb.fOutxCtsFlow = 0;

    // Установить текущую конфигурацию.
      fSuccess=SetCommState( Com1Port, &dcb );
      if (!fSuccess)  ShowMessage ("(Set_CommState)");

    // Послать запрос в файл
      fSuccess = WriteFile(Com1Port, Buffer, Size, &dw,NULL);
      if (!fSuccess)  ShowMessage (" Error WriteFile ");

      for (i=0; i<100; i++)          // ждем ответ
      {
      ClearCommError(Com1Port, & Errors, & Stat);
      if (Stat.cbInQue > 0 ) break;  // буфер порта
      Sleep(10);  // ждать
      }
      // гарантированно пришел ответ
      dw = 0;
      fSuccess=ReadFile(Com1Port, Buffer, 100 , &dw, NULL);

      if (dw > 0)
     после принятия данных из порта  в Buffer, уходим на обработку данных. И вроде все хорошо...

    Каждые 5 секунд я запускаю таймер, который считывает данные из порта. Все работает.
    Закрываю порт я по завершению работы программы по событию OnClose.

    Но со мной в группе работает еще один парень, который тоже пишет программы для работы с этим же портом COM5.

     После того как отработает программа этого парня, "перестает" работать моя программа, а именно:

    Код:
     ClearCommError(Com1Port, & Errors, & Stat);
      if (Stat.cbInQue > 0 ) break;  // буфер порта

    Stat.cbInQue всегда равен нулю.

    И помогает мне только  перезагрузка компа. Только после полной перезагрузки компа моя программа опять работает нормально.
    Так вот вопрос: какую команду (или набор команд) мне нужно подать в порт, чтобы не перезагружать компьютер всякий раз, когда мне нужно поработать?



  • Программирование :: C/C++ :: Borland C/C++
  • 1)настройка boost под С++ Builder
    Скачал Boost 1.32 вроде сделал необходимые шаги по настройке ее и проекта
    т.е.
    а)запустил утилиту make make –fbcb6.mak clean
    б)в настройках include проекта установил ссылку на каталог boost
    D:\Mathem_Libraries\boost_1_32_0
    в) запустил пару тестовых программ
    Код:
    #include <boost/numeric/ublas/matrix.hpp>
    #include <boost/numeric/ublas/io.hpp>
     using namespace boost::numeric::ublas;
     
    int main () {
     
        matrix<double> m (3, 3);
        for (unsigned i = 0; i < m.size1 (); ++ i)
            for (unsigned j = 0; j < m.size2 (); ++ j)
                m (i, j) = 3 * i + j;
        std::cout << m << std::endl;
    }
    Проблема у них одна: компилятор выбрасывает сообщение что не может найти соответствие для
    std::abs, std::sqrt и других функций

    открывая при этом в проекте файл traits,hpp
    насколько понимаю это не имеет отношения к
    using namespace std

    2)Собственно вопрос конечно не столько в boost сколько вообще в какой-нибудь библиотеке линейной алгебры под C++ работающей с матрицами, собств значениями
    насколько понимаю их 3 - это boost, IMSL CML и alglib
    c 1-ми двумя у меня сейчас или в свое время остались проблемы установки, 3-я благополучно работает
    единственные небольшие недостатки alglib - надо бросать несколько h- и cpp-файлов в каждый проект
    и включать их в проект и кроме того нет проги решения собственных частот в виде 2-х матриц (входные параметры)  т.е A=P*B  где A,B -симметричные матрицы

    Собственно знаю таже что boost 1.42 включена в CodeGear (С++ Builder v.9) но также не мог его установить из-за отсутствия серийника
  • Программирование :: Delphi
  • В гриде много колонок. Перешли вправо на некоторое их количество и решили расширить одну из колонок, оттянув мышью границу, как показано на рисунке:
    (http://forum.shelek.ru/index.php?action=dlattach;attach=6331;image)

    Колонка "Время регистрации" - она примерно 4 по счету в гриде. Так вот, когда вы отпустите мышь грид горизонтально прокрутится влево и у вас перед глазами будут первые колонки. Что за феномен?

    Delphi XE
  • Программирование :: VisualBasic
  • Пишу диплом. Столкнулась с проблемой. Не могу подключить базу данныех, сделанную в Аксесе к форме в Бэйсике. =(
    Что бы не возникало лишних вопрсов расскажу, что делаю:
    1. Написала базу на офисе 2000 (читала на каком-то форуме, что 2003 офис уже не подойдет для 6 бэйсика)
    2. Создаю форму в бэйсике и вытаскиваю на нее объект: Data.
    3. Далее указываю путь до базы.
    4. И дальше бы мне поменять свойство RecordSourse, но вот тут возникает проблема. Пишет: Unrecognized databaze format 'Путь до базы'

    Помогите пожалуйста. Все вроде бы уже перепробовала =( Стандартную базу (которая в папке с Бэйсиком) он  видит и подключает, а мою не хочет. И База  и Прога в одной папке. И сохраняла и переокрывала.  Ну не работает и все тут :o :dontknow:
  • Программирование :: Программирование 1С
  • Всем здравствуйте. Скажите можно ли в 1с нормально зарабатывать без сертификатов? Проблема со сдачей. не могу выучить профов :(
  • Программирование :: Программирование 1С :: 1С 8.2: Управляемое приложение
  • Здравствуйте! Вот какая ситуация:Я начинающий программист в этом деле. Пробую написать базу в 1с 8.2 В документе "Приходная накладная" хочу возвращать цену со справочника. которая является не просто реквизитом, а реквизитом табличной части Справочника.  Жду помощи,спасибо заранее.
  • задача такова: необходимо по определённому событию определять активен ли заданный пользователь в данный момент и если активен то запускать у него форму/обработку/сообщение/предупреждение. т.е. мы по событию в нашем сеансе должны запускать какие то события в сеансе другого пользователя.

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

    тонкий клиент, клиент-серверный вариант, управляемые формы.

    чем можно воспользоваться, может какие то методы или кооллекции сенсов?
  • Направления программирования :: Drivers
  • Здравствуйте!
    Есть такая задачка: имеется некое устройство, типа клавиатуры. Виндой оно и определяется как HID клавиатура, поэтому и работает вместе с основной клавой(как одна или в один поток). Но хочется, чтобы эта клавиатура работала не всегда, а только тогда, когда ей скажут, то есть в конкретном приложении. В общем все видимо сводится к написанию драйвера.

    Прочитал уже достаточно разного материала, но как то так и не получилось извлечь нужное. Каша в голове)
    Сейчас больше инетересует как получать данные с устройства. DriveEntry и прочие общие понятия вроде как усвоились.

    http://www.e-reading.org.ua/bookreader.php/130090/Tarvo_-_Ispol'zovanie_NuMega_DriverStudio_dlya_napisaniya_WDM-draiiverov.html - вот вроде как хороший пример, но к сожалению DriverStudio не работает на версиях винды старше XP SP2.
    То есть что нить бы подобное под WDK...

    И надо чтобы в итоге это все кончилось какой-нить dll по взаимодействую с этим устройством, ну или в идеале - .NET объектом )
  • Направления программирования :: Web :: Клиентские скрипты
  • Всем доброго времени суток! Дело обстоит так: в Опере 11.52, IE9, Google Chrom (15.0.874.121) все скрипты работают, а вот FireFox 7.0.1 отказывается их выполнять.  Вот например самый простой скрипт:
    Код:
    <style text=text/css>
      .shell {line-height:15pt;}
      #shell1 div{display:none; width:95%; position:relative; left:60px; }
      a.funk{color:#466aca;}
      a.funk:hover {color:#CC0066; }
      .shell a{line-height:20pt;}
    </style>

    <script type="text/javascript">

       function Razvorot(d)
      { d.style.display='block';}

       function Svertka(d)
      { d.style.display='none';}

     </script> 

    Код:

    <div id=content2>
      <div class=shell id=shell1>
        <h3 align=center> Содержание курса  </h3>
    <a href="lect1.html">Лекция №1.</a>
          <a href="#1" class=funk onclick="Razvorot(lect1);"> !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! &darr;</a> <br>
         <div id=lect1>
         <ul> <li> !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! </li>
                          <li>ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! .</li>
                          <li>ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! </li>
                          <li>ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! !ТЕКСТ! .</li>
    </ul>
                         <a class=funk href="#01" onClick="Svertka(lect1);"> Свернуть &uarr; </a>
                       </div>
      </div>
    </div>
    На всякий случай пробовала  вместо d.style.display='block'; писать document.getElementById(d).style.display='block'; - не помогло.
    Консоль ошибок в файрфоксе почти на все скрипты выдает  ошибку: "lect1 is not defined" и предупреждение:"reference to undefined property fbs.breakOnDebugCall
    [Прерывать на этой ошибке] var hookReturn = d...e, errorInfo, fbs.breakOnDebugCall); "
    Поскольку я делаю сайт первый раз, понимаю, что могла наделать кучу глупых ошибок. Помогите, пожалуйста!
  • Практические разделы :: Базы данных
  • Запускал MySQLInstanceConfig:
     
    "%ProgramFiles%\MySQL\MySQL Server 5.5\bin\MySQLInstanceConfig.exe" -i -q "-lC:\mysql_install_log.txt" "-nMySQL Server 5.5" "-p%ProgramFiles%\MySQL\MySQL Server 5.5" -v5.5.17 "-t%ProgramFiles%\MySQL\MySQL Server 5.5\my-template.ini" "-c%ProgramFiles%\MySQL\MySQL Server 5.5\my.ini" RootPassword=123 AddBinToPath=yes ConnectionCount=300 Charset=utf8

    Почему max_connections равен оказался 341 ?

    Цитата
    # The maximum amount of concurrent sessions the MySQL server will
    # allow. One of these connections will be reserved for a user with
    # SUPER privileges to allow the administrator to login even if the
    # connection limit has been reached.
    max_connections=341

    А на другом компе, при той же команде конфирурирования:
    max_connections=170

    Он что рэндомом их назначает ?
  • Допустим. вы переустанавливаете MySQL-сервер. В прошлом у вас была какая-то БД. Поставив MySQL заново, при условии что в конфиге одно и тоже значение у переменной datadir, вы получите доступ к своей прежней БД.
    Возьмем случай, что вы не в курсе, была ли сохранена база (имя - "mybase") или нет.

    1) Вы запускаете:
    "%PROGRAMFILES%\MySQL\MySQL Server 5.5\bin\mysql" -uroot -p123456 -e "CREATE DATABASE IF NOT EXISTS mybase"
    Безопасная команда, как видим.

    2) Затем заносите в нее данные:
    "%PROGRAMFILES%\MySQL\MySQL Server 5.5\bin\mysql" -uroot -p123456 mybase < myolddump.txt

    Файл myolddump.txt имеет такое содержимое:

    Код: (mysql)
    DROP TABLE IF EXISTS `my_main_table`;
    CREATE TABLE `my_main_table` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `item` varchar(100) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;


    --
    -- Dumping data for table `my_main_table`
    --

    LOCK TABLES `my_main_table` WRITE;
    INSERT INTO `my_main_table` VALUES (1,'строка1'),(2,'строка2'),(3,'строка3'),(4,'строка4'),(5,'строка5');
    UNLOCK TABLES;


    Вместо :

    Код: (mysql)
    DROP TABLE IF EXISTS `my_main_table`;
    CREATE TABLE `my_main_table` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `item` varchar(100) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;

    вероятно нужно написать:

    Код: (mysql)
    CREATE TABLE IF NOT EXISTS `my_main_table` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `item` varchar(100) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;

    А на что заменить участок

    Код: (mysql)
    LOCK TABLES `my_main_table` WRITE;
    INSERT INTO `my_main_table` VALUES (1,'строка1'),(2,'строка2'),(3,'строка3'),(4,'строка4'),(5,'строка5');
    UNLOCK TABLES;
    ?
  • Практические разделы :: Железо
  • Всем добрый вечер. Подскажите плиз как можно получить серийный номер винчестера Сервера
  • Учимся программировать :: Начинающим
  • Подскажите какой компилятор Pas использовать для учебной задачи, сложности y=sin(x).
    Delphi разворачивать ради этого не хочется.
    Критерии
    - компактность,
    - отсутствие ООП наворотов,
    - желателно без инсталяции.
    ---------------
    Всречался где-то архив, кажется tpas-free, адаптированный под Windows, но давно было, не найду.
    (нечто подобное BC3.xx).
    Желательно ссылку, или хотябы где искать.
    Если без дельфи ну-ни-как - то какую версию ?


    ps  y=sin(x) надо не мне, общчественная нагрузка как-бы :)
    в методичке до задания даются основы работы в NC ;)
  • Подскажите нубу, с помощью какой функции можно считывать файл построчно? мне нужно написать программу которая будет находить файлы по маске. А в дальнейшем отбирать файлы с определенной строкой. С поиском по маске я разобрался, а вот как считывать построчно каждую строку не могу... было бы здорово если бы  кто-нибудь привел примеры. Может есть еще какой-нибудь способ реализовать данную задачу?
  •  Здравствуйте, и вновь я обращаюсь К Вам за помощью... составила какую то жуть я.. а до ума довести не могу....
    Задача
    Необходимо в начале программы создать файл (элементы файла вводим с клавиатуры), а в конце программы сначала вывести на экран содержимое созданного файла, а затем отразить полученные результаты.
    Описать логическую функцию check(s) для текстового файла s, проверяющую, содержит ли файл s латинские буквы.
    Указание: введите файл s (последний элемент в файле '.') и вычислите значение функции check(s).
     
    Код:
    Program Latin_letters;
    {  Программа,проверяющая, содержит ли файл s латинские буквы}
     var
        f: text;
        x: string;
        ch: char;

    function check(var s: text) : boolean;
             begin
                 assign (f,'C:\SOFT\TUSUR\bin\s.txt');
                 reset(f);
                   repeat
                      readln(f,x);
                      writeln(x);
                 until eof(f);
                 close (f);

                end;

                           begin

                    assign (f,'C:\SOFT\TUSUR\bin\s.txt');
                    reset(f);
                   ch := upcase(ch); ch := #0;
                   while (ch <> '.') do begin
                   read(f, ch);
                   writeln(ch);

      if ( (ch >= 'A') and (ch <= 'Z') ) then
                                  write ('Файл s содержит латинские буквы')

         else write ('Файл s не содержит латинские буквы');
         end;
         close(f);
    end

    Спасибо, за то, что всегда оперативно отзываетесь и помогаете.

В избранное