faqs.org.ru

 Главная > Программирование > Языки Pascal/Delphi >

Dze Pascal FAQ

Секция 1 из 2 - Предыдущая - Следующая

From: Faq Keeper <Faq.Keeper@p21.f49.n5026.z2.fidonet.org>
Date: Sat, 03 Apr 2004 23:00:00 +0400

                                                        _______
    _         _.,,._                                    `+fo.
    fo..offo.                                  `f
    +f,                                 :
     `+:                                 if
       i:i :ffo+.                         i
       :+: :o,                      i:
        j+' :+      -[liP]-        :
        j*+" ,,._+                      i
        i*"        `^-+:"`jj+                      ii
        :I'      -      -+f+     .+offo+.           i:
        i:              - ifo.  :         ::
        +             - i: :+"i         i
       :+     :     , +i :i      "``"-   i
  _,.ofj.-````````.,p: :+,i  -   ` :i
 jj*++""`    +jj+  :  :   : :
 *+"^`              "+*jjjj*+`   `+*j*+' ..,,.-  :i
                                                             :
                                 Dze Pascal FAQ               `^"""^`

             ___   __  __      ___    ___    ____  _____   ___    __
            / _ \ / / / /     / _ \  / _ |  / __/ / ___/  / _ |  / /
           / , _// /_/ /  _  / ___/ / __ | _\ \  / /__   / __ | / /__
          /_/|_| \____/  (_)/_/    /_/ |_|/___/  \___/  /_/ |_|/____/

------------------------------------------------------------------------------


                               Dze Pascal FAQ



v 1.1.0.1
(x) Copyleft by Dze aka Geniya Bocharov // [DzeSoft] 1999-2000
(x) Copyright by Pavel Fomin, 2001-2003
Последнее обновление: Fri 01 Sep 2000, Sat 17 May 2003


                                            Эпиграф:
                                                "RTFM!   LMD!  FAQ!  А  чё
                                                 это  я  хоть   сказал-то?"
                                                            (С) не скажу =)

                                            Ещё один:
                                               "С  точки  зpения банальной
                                                эpудиции каждый индивидуум,
                                                кpитически..."
                                                           (С) все знают =)
------------------------------------------------------------------------------

  Данный    FAQ   был   составлен,   исходя  из наиболее общих вопросов,
  которые  слишком  уж  часто  возникали в эхоконференцях RU.PASCAL.* (и
  частично   SU.PASCAL.MODULA.ADA)    сети    FidoNet.  Большая  просьба
  прочитать его перед тем, как  писать  в эху. За заданные в эхе вопросы
  рассмотренные  в  данном FAQ,  вы получите как минимум [*]. За ответ в
  эхе на подобные вопросы, вы будете наказание ещё строже...

------------------------------------------------------------------------------


  На какие эхи рекомендуется подписаться:

        RU.PASCAL              -   наиболее общие вопросы по языку
                                   програмирования, разновидноcтям
                                   компилляторов итд
        RU.PASCAL.SOURCES      -   обмен исходными текстами на Паскале
        RU.PASCAL.CHAINIK      -   эха для начинающих.
        RU.PASCAL.ASM          -   использование ассемблера на благо Паскаля

        SU.PASCAL.MODULA.ADA   -   общесовковая эха по Паскалю.
        XSU.PMA.FAQ            -   её придаток, в котором обсуждаются
                                   вопросы из тамошнего FAQ
        RU.TMT                 -   особенности программирования на TMT Pascal
        RU.VP                  -   особенности программирования на
                                   Virtual Pascal
        RU.FREEPASCAL          -   Эха поддержки компилятора FreePascal
        RU.DELPHI.*            -   всё, что касается Дельфи.
        SU.FLAME, NetMail      -   для выяснения кто из вас ламер и какой
                                   паскаль круче.

------------------------------------------------------------------------------

  Имена, адреса и команды программерских серверов:

  DzeServer             down, очень жаль :(
  Creeping FAQRobot     2:5023/23.21                   %help %list %prog
  PdvFAQserver          2:5030/175.62                  %help %list
  SliderFAQ             2:5010/215.215                 %list
  pascaler              2:5005/80.113                  %list %help

  http://pascal.sources.ru

  <none>                <none>                         <none>

   (Кто хочет добавить сюда информацию о себе  -  пишите мылом)

------------------------------------------------------------------------------


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

------------------------------------------------------------------------------

  thanks to:

        Dmitry Suhodoev                     2:5010/150.16
        Andrew Lening                       2:5026/49.11
        Diman Petrov                        2:5023/27.18
        Max Alekseyev                       2:5015/60

        За лого особенная благодарность:
        leap (liP)                          2:5005/80.113
        За надпись к лого:
        Sergey Markin                       2:5020/1094.55

------------------------------------------------------------------------------


Содержание

(последние обновления выделены '>')

        1. Общие вопросы.
                1.1  Какие бывают Паскали?
                1.2  Какой Паскаль лучше?
                1.3  Что сделать с откомпиленными в TP6 модулями,
                     чтоб работать в TP7?
                1.4  Чем отличаться TP7 и BP7?
                1.5  Где взять инфу по прерываниям, портам и т.д.?
                1.6  Что за ошибка 200 (Divide by Zero) и как лечить?
                1.7  А у кого есть содержимое дискетки, идущей вместе
                     с книгой Фаронова?
                1.8  А есть ли русский хелп для BP?
                1.9  А может заюючить в эху модули Фаронова, сорцы ДН или
                     русский хелп для BP?


        2. Вопросы касающиеся программирования
                2.1  А как ..?!

                2.2  Проблемы в текстовом режиме
                        2.2.1  Как писать/читать напрямую в видеопамять
                               (в т. ч. и в DPMI)?
                        2.2.2  Как выключать/менять размеры курсора?
                        2.2.3  Как включить/выключить бит мигания?
                        2.2.4  Как скрыть сообщения от запускаемой через Exec
                               программы?
                        2.2.5  Как переключать видеостраницы?

                2.3  Проблемы с мат частью
                        2.3.1  Как возводить в степень (в т. ч. и дробную)?
                        2.3.2  Как работать с отдельными битами?
                        2.3.4  Как проверить простое ли число?
                        2.3.3  Как _быстро_ проверить простое ли число?
                        2.3.4  Как перевести число из одной системы
                               счисления в другую?

                2.4  System & OS functions
                        2.4.1  Как узнать состояние клавиш Shift, Alt, Ctrl,
                               Num Lock, Caps Lock, Scroll Lock
                               и искусственно переключать их?
                        2.4.2  Как осуществить холодную перезагрузку?
                        2.4.3  Как скопировать файл?
                        2.4.4  Как определить под какой операционкой мы
                               запустились?
                        2.4.5  Как читать клавиши курсора, F1-F12 и т.д.?
                        2.4.5  Как получить в свое распоряжение больше чем
                               640 кило памяти?
                        2.4.6  Как в BP юзать 32-разрядный асм?
                        2.4.7  Как писать TSR'ы?
                        2.4.8  Как осуществить поиск файла по всем
                               директориям?
                        2.4.9  А как организовать нормальную задержку?
                        2.4.10 А можно из паскаля работать с длинными именами
                               файлов? А из-под ДОСа?
                        2.4.11 "А почему у меня exec() не работает" или
                               как запустить внешнюю программу.

                2.5  Файлы
                        2.5.1  Где взять описание <такого-то> формата файлов?
                        2.5.2  Как прочитать mp3 tag?
                        2.5.3  Как прочитать файлы с картинками?
                        2.5.4  Как удалить строку из текстового файла?
                        2.5.5  Как читать .ctl/.cfg -файлы
                                2.5.5.1  Как обрабатывать INCLUDE?
                        2.5.6  Как дописать в конец .exe-файла?
                                2.5.6.1  свою программу?
                                2.5.6.2  свои настройки, как это делает
                                         сам BP/TP?

                2.6 Другое
                        2.6.1 Есть 2 юнита. В каждом из них есть процедура с
                              одним и тем же именем. Как компилятор узнает
                              какую нужно вызывать?
------------------------------------------------------------------------------

>--- Часть 1. Общие вопросы. -------------------------------------------------


Q:>  1.1 Какие бывают Паскали?

A:>  Паскали бывают хорошими и плохими, разными и хорошими, рулезные и
     саксовые, халявные и ... хм тоже халявные, борландовские и нет.
     А если конкретно, то наиболее распространены сейчас следующие
     компиляторы:
       Borland Pascal 7.x     (BP7)
       Turbo Pascal   7.x     (TP7)
       TMT Pascal             (TMT)
       Virtual Pascal         (VP)
       Free Pascal Compiler   (FPC)
       Borland Delphi          - что строго говоря не есть паскаль в чистом
                              виде, поэтому здесь говорить о нём не будем.

     Остальные компиляторы не обсуждаются в силу малораспространенности и
     неактуальности сегодняшним задачам. =)

------------------------------------------------------------------------------
Q:>  1.2 Какой Паскаль лучше?

A:>  Как  и  на  любой из подобных вопросов ответ один: смотря для чего.
     Если  вы  - новичок или пишите простенькие лабы для универа, то вам
     хватит  BP  или TP.
     Если  вам  нужен  неплохой,  несколько  глюкавый,  но  стpемительно
     pазвивающийся   и   коммеpческий   компилятоp  для  dos dpmi32,  то
     есть  смысл  остановить  свой  выбоp  на  tmt  pascal. На нем очень
     пpиятно   и   удобно   писать  демки,  так  как  tmt pascal имеет в
     поставке  мощный  модуль  graph.  Веpсия  2.12, котоpая доступна на
     любой файлопомойке может компилять только под dos dpmi32, но сейчас
     уже  есть  в наличии веpсия 3.20, котоpая может компилять под os/2,
     dos dpmi32, win32. Пpичем под последние две платфоpмы также имеется
     мощный  модуль  graph. Для win32 этот модуль постpоен на технологии
     directx.
     Если  вам нужен пpостой и мощный компилеp для win32 и os/2 консоли,
     а  также  для  os/2  presentation manager, то вам опpеделенно нужен
     Virtual   Pascal   2.0.   Также   для   Virtual   Pascal   2.0 есть
     пpисадки  (к  сожалению  несколько глюкавые) для компиляции под dos
     dpmi32   и  linux.  Если  же  вам  нужно  компилять только под os/2
     presentation  manager,  то  лучше  все таки остановиться на Virtual
     Pascal  1.11. Почему? А глюков меньше. Очень он уж вылизан.
     Если  вы  разрабатываете   базы   данных  или  просто предпочитаете
     визуальное   программирование,    то   без     Дельфи     вам    не
     обойтись.
     И наконец,   если   вы  хотите пожертвовать   некоторыми удобствами
     в пользу бесплатности - юзайте FPC.
------------------------------------------------------------------------------
Q:>  1.3  Что сделать с откомпиленными в TP6 модулями, чтоб работать в TP7?

A:>  Ничего. Компания Борланд поддерживает несовместимость откомпиленных
     модулей.  BTW, именно поэтому не рекомендуется постить в эху *.tpu
     модули.

------------------------------------------------------------------------------
Q:>  1.4  Чем отличаются TP7 и BP7?

A:>  TP7  -  это самостоятельный пакет, который тем не менее очень похож
     на   BP7  и,  по  своей  сути  являясь упрощённой версией BP7, даже
     входит  в  комплект    поставки   Borland   Pascal'я   7.
     Основные возможности BP7, котоpых нет в TP7 это компиляция под DPMI
     16-bitи 16-bit win, а также бpаузеp. Следует отметить, что хотя BP7
     и  компилит  под  DPMI  и windows, хотя pеально под компиляцией под
     windows  мало  кто  пользуется.  Во-пеpвых  из-за 16-битности, а во
     втоpых из-за невозможности ноpмальной отладки в этом pежиме.

------------------------------------------------------------------------------
Q:>  1.5  Где взять инфу по прерываниям, портам и т.д.?

A:>  Как  правило  многие  функции  операционной  системы  или железа не
     всегда реализованы в виде стандартных Паскалевских функций. Поэтому
     возникает  необходимость получения инфы по тем или иным прерываниям
     или портам. Как правило юзаются следующие вещи:

             Interrupt List by Ralf Brown - наиболее популярная и полная
                                            справочная система по железу
                                            IBM PC.
             Tech Help!                   - также весьма и весьма неплохая
                                            электронная справочная система
                                            Последняя версия насколько мне
                                            известно - 6.0 К сожалению, по
                                            некоторым отзывам в ней иногда
                                            бывают ошибки.
            Из бумажной литературы весьма рекомендую книгу Питера Нортона
            "Персональный компьютер фирмы IBM и операционная система MS-DOS"
            Весьма занятное чтиво, хотя и несколько устаревшее.

            Tech! Help, как и List Брауна выложены на DzeServer'е.
            Однако,  в силу не самого маленького объёма последнего
            постарайтесь найти его где-нибудь ещё =)

------------------------------------------------------------------------------
Q:>  1.6  Что за ошибка 200 (Divide by Zero) и как лечить?

A:>  В связи  с  кривизной  модуля  CRT на быстрых машинах типа iPentium
     II/III, iCeleron программы  откомпиленные  на  BP7/TP7  при запуске
     вылетают  с run-time error 200 - деление на ноль. Причём ошибка эта
     появляется  при  подключение  модуля  даже  если  вы  и не вызывали
     процедуру Delay, которая там криво написана. Суть проблемы состоит
     в том, что в этом модуле время  измерялась через производительность
     процессора - в то давнее древнее время, как сами понимаете, не было
     столь  быстрых  процессоров  и не было этой ошибки. Для того, чтобы
     ваши  программы  не  вылетали  вам  нужно  установить  пропатченный
     вариант CRT. Достать его не проблема, BTW, он есть на DzeServer'е.
     Кроме  того  можно  пропатчить  уже откомпиленные программы. Более
     полную инфу как это делать ищите там же.

A:>  Можете так же воспользоваться утилитой unzero.com - маленький резидент,
     позволяющий работать даже непропатченным программам. ЭТО НЕ ВИРУС!

section 1 of uuencode 5.10 of file unzero.com    by R.E.M.

begin 644 unzero.com
MZ.,`#>+E([N@H8X1X-S^KMPRU];5U$](T=#/SE&LF977S^%-P/E["K3+0["B
M`KR[`+VW11'5+GV_KQ>/F&&*C"+OI9ND9-:J&]2>*I11NED0AH67'(J+DQV6
MFX\!BI&+,:FB/(:%3J,[&'[*=+%:P$%YNE%_>3<;!QD+"TT.$DHS#14)104/
M#A,%/CHD?#,U-C,R,GM>7G9;70LG.R4O+VDJ/F8_(3$M82A0459921I/"1D&
M/SEA>V$0;%Q(35]#7TT'85=+5E(!"'PW/4<I("TN+SDL(3TK*#!$8F)B;V-B
?;5H,""!>N>8`K#+!+HA$_^+WZ4+_*$,I35A,+U))4%))
`
end
sum -r/size 44168/383 section (from "begin" to "end")
sum -r/size 55029/256 entire input file


------------------------------------------------------------------------------
Q:>  1.7  А у кого есть содержимое дискетки, идущей вместе с книгой Фаронова?

A:>  Есть. По-моему уже у всех, кому надо было. Искать на DzeServer'е
A:>  http://www.pasha1st.pp.ru

------------------------------------------------------------------------------
Q:>  1.8  А есть ли русский хелп для BP?

A:>  Есть. Глюкавый, нелитературный, но есть.
     Есть в инете. Например на www.pasha1st.pp.ru

------------------------------------------------------------------------------
Q:>  1.9  А может заюючить в эху модули Фаронова, сорцы ДН или русский
          хелп для BP?
A:>  НЕ НАДО. достали. блин. =)
     В любом случае все исходники больших размеров публикуются только в
     RU.PASCAL.SOURCES и только с разрешения (ко)модератора если они уж очень
     большие. И тем более не рекомендуется юючить вещи, которые и так есть у
     доброй половины эхи.

------------------------------------------------------------------------------

>--- Часть 2. А как ..?! -----------------------------------------------------



        Прежде всего посмотрите в справке. В справке и демках BP можно найти
        очень интересные сведения не поднимая бессмысленной переписки в эхе.
        Далее ищите в свагах. SWAG Pascal Snippets (SWAG - SourceWare
        Archival Group - популярная коллекция исходников на паскале) - там
        вы найдёте очень много исходников для чего угодно.

        http://www.gdsoft.com/swag/swag.html  - официальный сайт SWAG (eng)
        http://rswag.boom.ru                  - официальный сайт русского SWAG
        2:5020/293, 2:00-5:30, 7:30-8:30, FREQ files

 >      http://pascal.sources.ru - Сайт поддеpжки гpyппы эх "RU.PASCAL.*"
 >                                 Если Вы ищете исходники, то пpежде, чем
 >                                 спpашивать в эхе, загляните сюда!
 >
 >    Для тех, y кого нет достyпа к интеpнетy:
 >
 >    Поищите на ближайших фpек-yзлах локальные веpсии
 >    паскальных коллекций SWAG и Russian SWAG (RSWAG).

------------------------------------------------------------------------------
Q:>  2.2  Проблемы в текстовом режиме

      Как правило все вопросы про текстовый режим заканчиваются прямым
      доступом к видеопамяти или использованием функций int 10h (видео-
      сервис). Здесь собраны только наиболее надоевшие вопросы.

------------------------------------------------------------------------------
Q:>  2.2.1  Как писать/читать напрямую в видеопамять (в т. ч. и в DPMI)

A:>  Писать  напрямую  в видео пямять намного быстрее и удобнее, чем
     выводить символы на экран через БИОС. Строго говоря, процедура
     Write  (WriteLN) тоже может писать в видео память напрямую. Тем
     не  менее  обычно  лучше  пользоваться  своими процедурами для
     вывода  символов. В реале видео память располагается начиная с
     $B800:0000.  На каждый символ отводится 2 байта: сам символ и
     его  атрибуты. Таким образом на экран 80*25 нужно 4000 байт. В
     DPMI  никаких принципиальных отличий нет. Просто вместо адреса
     $B800:0000   нужно  писать  типизированную  константу  SegB800,
     которая  будет  указывать  при  прогоне на начало видеопамяти.
     Таким образом определив следующий массив

     var
        Screen: Array[1..2000,1..2] of byte absolute $B800:0;

     мы получаем доступ к любому символу и его атрибуту по порядковому
     номеру символа. Т.е. для точки (1,1)
        Screen[1,1] будет ASCII код того, что на экране, а
        Screen[1,2] - его атрибуты.

     Так же можно использовать
     var
        Screen: Array[1..25,1..80,1..2] of byte absolute $B800:0;
                      ^     ^N столбца
                      ^N строки

------------------------------------------------------------------------------
Q:>  2.2.2  Как выключать/менять размеры курсора

A:>  Функция 01h прерывания 10h (видео сервис) изменяет размеры
     курсора. Следующая процедура позволяет управлять размерами
     курсора.

     procedure SetCursor(startline, endline: byte); assembler;
      asm
        mov ch, [startline]
        mov cl, [endline]
        mov ah, 01
        int 10h
      End;

     Диапазон значений 0h-1Fh. При указании startline=20h курсор не
     отображается.

------------------------------------------------------------------------------
Q:>  2.2.3  Как включить/выключить бит мигания.

A:>  Как и в предыдущем вопросе все дело сводиться к юзанью
     прерывания 10h (видео сервис).

     procedure Blinking(On: boolean); assembler;
     asm
        mov bl, [On]
        mov ax, 1003h
        int 10h
     End;

     Эта процедура включает или выключает мигание в зависимости от
     параметра On.


------------------------------------------------------------------------------
Q:>  2.2.4  Как скрыть сообщения от запускаемой через Exec программы?

A:>  1) попытаться использовать возможности самих программ, например
        параметров командной строки типа '/q'
     2) Использовать возможности переопределения вывода от Дос
        т. е. добавлять в параметры ' > nul '.
     3) Пpотив тех, кто напpямyю пишет в видеопамять тоже есть методы:
        изменять активнyю видеостpаницy. (см ниже)

------------------------------------------------------------------------------

Q:>  2.2.5  Как переключать видеостраницы?

A:>  Пример процедуры, делающей активной страницу номер PageNo
     (для VGA, EGA, CGA от 0 до 7):

        procedure SetVideoPage(PageNo:byte); assembler;
        asm
                mov ah, 05
                mov al, PageNo
                int 10h
        end;



------------------------------------------------------------------------------
Q:>  2.3  Проблемы с мат частью

A:>  Почти все подобные проблемы возникают из-за того, что кто-то уж очень
     сильно не любит математику/информатику или просто не желает думать.

------------------------------------------------------------------------------
Q:>  2.3.1  Как возводить в степень (в т. ч. и дробную)

A:>  В Паскале нет функций возведения в степень. Есть только функции
     SQR и SQRT - возведение в квадрат и извлечение корня. Тем не менее
     знания математики на уровне средней школы достаточно для написания
     подобной функции:

        function Power(Base,Exponent: Real): Real;
          var
                Tmp: Real;
          begin
                Power:=0;
                if Int(Exponent/2)=Exponent/2 then Base:=Abs(Base);
                if Exponent=0 then begin
                        Power:=1;
                        Exit
                end;
                if Base=0 then begin
                        power:=0;
                        exit
                end;
                if Base>0 then begin
                        Tmp:=Exp((Abs(Exponent))*Ln(Base));
                        if Exponent>0 then begin
                                power:=Tmp;
                                exit
                        end;
                        if Exponent<0 then begin
                                power:=1/Tmp;
                                exit
                        end;
                end;
                if Base<0 then begin
                        Tmp :=Exp((Abs(Exponent))*Ln(Abs(Base)));
                        if Exponent>0 then begin
                                power:=-Tmp;
                                exit
                        end;
                        if Exponent<0 then begin
                                power:=-1/Tmp;
                                exit
                        end;
                end;
          end;

A:>  Кроме того вот более быстрая функция из vp'шного math.pas:

       function Power(Base, Exponent: Extended): Extended; assembler;
       {&Frame-} {&Uses none}
       asm
         fld      Exponent
         fld      Base
         fabs
         fyl2x
         fld      st
         frndint
         fsub     st(1),st
         fxch     st(1)
         ftst
         fstsw    ax
         sahf
         jb       @L0
         f2xm1
         jmp      @L1
       @L0:
         fchs
         f2xm1
         fld1
         fadd     st,st(1)
         fdivp    st(1),st
         fchs
       @L1:
         fld1
         faddp    st(1),st
         fscale
         fstp     st(1)
       end;



------------------------------------------------------------------------------
Q:>  2.3.2  Как работать с отдельными битами

A:>  Вариантов огромное кол-во. Imho наиболее просто пользоваться
     логическими функциями OR и AND. Например:
        Включить(сделать единицей =) первый бит в переменной b
                b:=b or 1;
        Включить второй бит в переменной b
                b:=b or 2;
        третий:
                b:=b or 4;
     Для проверки включённости бита можно юзать AND.
     То есть выражение (b and 1 <> 0) будет true, если первый бит
     включён. Думаю, идея ясна, а извращаться можно уж как угодно:
     писать функции и процедуры, что тоже есть рулез.

     Другой вариант выключения/сброса бита

     procedure SetBit(var B : Byte; BitNo : Byte);
        begin
          B := B or ($01 shl BitNo);
        end;
     procedure ResetBit(var B : Byte; BitNo : Byte);
        begin
          B := B and (not ($01 shl BitNo));
        end;

------------------------------------------------------------------------------
Q:>  2.3.3  Как проверить простое ли число?

A:>  Вот функция (вполне подходит для не самых больших чисел):

        function isPrime(X: word): boolean;
         var
            i: integer;
         Begin
                isPrime:=false;
                for i:=2 to trunc(sqrt(x)) do
                        if x mod i = 0 then Exit;
                isPrime:=true;
         End;


------------------------------------------------------------------------------
Q:>  2.3.3.1  Как _быстро_ проверить простое ли число?

A:>  Вот программа. Работает действительно очень быстро и достаточно точно.
     К сожалению в предыдущем варианте фака в этой программе содержалась
     ошибка. Теперь её вроде как нет. =)

     {IsPrime.Pas (c) Max Alekseyev, FidoNet: 2:5015/60, e-mail: relf@os2.ru}
     {Реализация вероятностного алгоритма Миллера-Рабина с 20 раундами.
     Для примера выдает простые на отрезке [1000000000,1000100000]}

     function mulmod(x,y,m:longint):longint; assembler;
      asm
        mov eax,x
        mul y
        div m
        mov eax,edx
      end;

     function powmod(x,a,m:longint):longint;
      var
        r:longint;
      begin
       r:=1;
       while a>0 do
       begin
         if odd(a) then r:=mulmod(r,x,m);
         a:=a shr 1;
         x:=mulmod(x,x,m);
       end;
       powmod:=r;
     end;

     function isprime(p:longint):boolean;
     var q,i,a:longint;
     const rounds=20;
     begin
     if odd(p) then
     begin
       isprime:=true;
       q:=p-1;
       while not odd(q) do q:=q shr 1;
       for i:=1 to rounds do
       begin
         a:=Random(p-2)+2;
         if powmod(a,p-1,p)<>1 then
         begin
           isprime:=false;
           break;
         end;
         a:=powmod(a,q,p);
         if a<>1 then
         begin
           while (a<>1) and (a<>p-1) do a:=mulmod(a,a,p);
           if a=1 then
           begin
             isprime:=false;
             break;
           end;
         end;
       end;
     end else isprime:=(p=2);
     end;

     var t:longint;
     begin
       Randomize;
       for t:=1000000000 to 1000100000 do if isprime(t) then writeln(t);
     end.


A:>  Кроме того вот ещё один вариант алгоритма: программа-пример от Зюзика
     (хотя вроде как помедленней предыдущего).

     Program ZuzikNumbers; {(c) Andrew Lening, 1999}{TurboPascal v7.0}
       uses Crt,Dos;
       var
          n,k,Check1,Check2,SqRoot,Temp,FoundCount: LongInt;
          tHour,tMin,tSec,tSec100: Word;
          TimeWhenProgRunned,TimeWhenProgStopped: LongInt;
          IsBasic1,IsBasic2: Boolean;
       begin
          Write('Введите N (от 3 до 2*10^9): ');
          ReadLn(n);
          If (n<3) or (n>2000000000) then begin
            WriteLn('Сам дурак. Тут же проверка на тебя есть...');
            Halt(1);
          end;
          FoundCount:=0;
          GetTime(tHour,tMin,tSec,tSec100);
          TimeWhenProgRunned:=tHour*3600+tMin*60+tSec;
          For k:=1 to (n div 6) do begin
            Check1:=6*k-1;
            Check2:=6*k+1;
            IsBasic1:=True;
            IsBasic2:=True;
            SqRoot:=Round(sqrt(6*k+1));
            For Temp:=3 to SqRoot do
              If (Check1 mod Temp)=0 then IsBasic1:=False;
            For Temp:=3 to SqRoot do
              If (Check2 mod Temp)=0 then IsBasic2:=False;
            If IsBasic1 then begin
              WriteLn(Check1);
              Inc(FoundCount);
            end;
            If IsBasic2 then begin
              WriteLn(Check2);
              Inc(FoundCount);
            end;
          end;
          GetTime(tHour,tMin,tSec,tSec100);
          TimeWhenProgStopped:=tHour*3600+tMin*60+tSec;
          WriteLn('Программа нашла ',FoundCount,' простых чисел от 3');
          WriteLn('до ',n,' за ',TimeWhenProgStopped-
                  TimeWhenProgRunned, ' секунд(у,ы).Крюто.');
          WriteLn('Самое время что-нибудь нажать');
          repeat until KeyPressed;
        end.

        Вот. Для пpавильного опpеделения вpемени не запускайте
        в полночь :-) Алгоpитм спеpт у босса. Можно pешетом
        Эpатосфена, но это не быстpее и гемоp вообще.

        Программа немного перенавороченная - она выводит на экран
        и считает время, сколько работала.
        btw, если убрать вывод на экран, то все будет вообще
        резвее. (тормозит он =)

------------------------------------------------------------------------------
Q:>  2.3.4  Как перевести число из одной системы счисления в другую?

A:>  Вот две процедуры. Одна переводит из любой системы счисления в
     десятичную, вторая наобормот =)

        function FromDec(n, radix:longint):string;  {перевод числа n из
                                                     10-й c/c в radix}
         var
                s: String;
         const
                digit: string[16]='0123456789ABCDEF';
         begin
                s:='';
                repeat
                        s:=digit[(n mod radix)+1]+s;
                        n:=n div radix;
                until n=0;
                FromDec:=s;
         end;

        function ToDec(n:string; radix:longint):longint;  {перевод числа n из
                                                          radix с/с в 10-ную}
         var
                m, i: longint;
         const
                digit: string[16]='0123456789ABCDEF';
         begin
                m:=0;
                while n[1]='0' do delete(n,1,1);
                for i:=1 to length(n) do m:=m*radix+pos(n[i],digit)-1;
                ToDec:=m;
         end;

------------------------------------------------------------------------------
  >  2.4  System & OS functions

     Вопросы, сводящиеся к использованию функций операционной системы,

Секция 1 из 2 - Предыдущая - Следующая

Вернуться в раздел "Языки Pascal/Delphi" - Обсудить эту статью на Форуме
Главная - Поиск по сайту - О проекте - Форум - Обратная связь

© faqs.org.ru