Вихідні коди прикладів з Turbo Pascal 4.0
Вихідні коди прикладів з Turbo Pascal 4.0
Страница: 1
Сообщений 1 страница 6 из 6
Поделиться22023-10-01 18:46:44
CRTDEMO.PAS
Код:
{Copyright (C) 1985, 87 Borland International, Inc.} program CrtDemo; {Прикладна програма, яка використовує блок CRT. Використовує наступні процедури З блоктору CRT: Clrscr delline gotoxy insline keypressed readkey textbackground TextColor textMode, WhereX, WhereY, Window, Write, writeeln; Також використовує змінні LastMode та Windmax з CRT - модуль. 1. init Roundine: - Збережіть оригінальний режим відео. На EGA або VGA використовуйте шрифт 8x8 (43 рядки на EGA, 50 на VGA). - Налаштування Lastrow для збереження останнього рядка на екрані для повідомлень (Зберігає останні 2 рядки в 40-колонному режимі). Налаштування Lastcol. - Ініціалізуйте генератор випадкових чисел. 2. MakeWindow Roundine: -На екрані розміщує випадкові розміри випадкового кольору вікна. 3. Програмний корпус: - Call Init - Повтор, поки не буде введено Contrl-C: - Ехо -клавіші (Turbo Pascal Windows автоматично оберніть і прокрутка). - Підтримка спеціальних ключів: <ins> вставляє лінію в курсор <del> видаляє лінію на курсорі <up>, <dn>, <right>, <Left> Розмістіть курсор у вікно <Alt-R> генерувати випадковий текст, поки клавіша не натиснеться <Alt-W> створює ще одне випадкове вікно <ESC> виходить з програми } { Example program that uses the Crt unit. Uses the following routines from the Crt unit: ClrScr DelLine GoToXY InsLine KeyPressed ReadKey TextBackground TextColor TextMode WhereX WhereY Window Write WriteLn; Also uses LastMode and WindMax variables from Crt unit. 1. Init routine: - Save original video mode. On an EGA or VGA, use the 8x8 font (43 lines on an EGA, 50 on VGA). - Setup LastRow to preserve last line on screen for messages (preserves last 2 lines in 40-column mode). Setup LastCol. - Initialize the random number generator. 2. MakeWindow routine: - Puts up random-sized, random-colored windows on screen. 3. Program body: - Call Init - Loop until Contrl-C is typed: - Echo keystrokes (Turbo Pascal windows automatically wrap and scroll). - Support special keys: <Ins> inserts a line at the cursor <Del> deletes a line at the cursor <Up>, <Dn>, <Right>, <Left> position the cursor in the window <Alt-R> generate random text until a key is pressed <Alt-W> creates another random window <ESC> exits the program } uses Crt; var OrigMode,LastCol,LastRow: Word; Ch: Char; Done: Boolean; procedure Initialize; { Initialize the video mode, LastCol, LastRow, and the random number } { generator. Paint the help line. } begin CheckBreak:=False; { turn off Contrl-C checking } OrigMode:=LastMode; { Remember original video mode } TextMode(Lo(LastMode)+Font8x8); { use 43 or 50 lines on EGA/VGA } LastCol:=Lo(WindMax)+1; { get last column, row } LastRow:=Hi(WindMax)+1; GoToXY(1,LastRow); { put message line on screen } TextBackground(Black); TextColor(White); Write(' Ins-InsLine ', 'Del-DelLine ', #27#24#25#26'-Cursor ', 'Alt-W-Window ', 'Alt-R-Random ', 'Esc-Exit'); Dec(LastRow,80 div LastCol); { don't write on message line } Randomize; { init random number generator } end; { Init } procedure MakeWindow; { Make a random window, with random background and foreground colors } var X,Y,Width,Height: Word; begin Width:=Random(LastCol-2)+2; { random window size } Height:=Random(LastRow-2)+2; X:=Random(LastCol-Width)+1; { random position on screen } Y:=Random(LastRow-Height)+1; Window(X,Y,X+Width,Y+Height); if OrigMode = Mono then begin TextBackground(White); TextColor(Black); ClrScr; Window(X+1,Y+1,X+Width-1,Y+Height-1); TextBackground(Black); TextColor(White); ClrScr; end else begin TextBackground(Random(8)); TextColor(Random(7)+9); end; ClrScr; end; { MakeWindow } procedure RandomText; { Generate random text until a key is pressed. Filter out } { control characters. } begin repeat Write(Chr(Random(256-32)+32)); until KeyPressed; end; { RandomText } begin { program body } Initialize; MakeWindow; Done:=False; repeat Ch:=ReadKey; case Ch of #0: { Function keys } begin Ch:=ReadKey; case Ch of #17: MakeWindow; { Alt-W } #19: RandomText; { Alt-R } #45: Done:=True; { Alt-X } #72: GotoXY(WhereX,WhereY-1); { Up } #75: GotoXY(WhereX-1,WhereY); { Left } #77: GotoXY(WhereX+1,WhereY); { Right } #80: GotoXY(WhereX,WhereY+1); { Down } #82: InsLine; { Ins } #83: DelLine; { Del } end; end; #3: Done:=True; { Ctrl-C } #13: WriteLn; { Enter } #27: Done:=True; { Esc } else Write(Ch); end; until Done; TextMode(OrigMode); end.
Поделиться32023-10-01 18:47:42
FIB8087.PAS
Код:
{ Copyright (c) 1985, 87 by Borland International, Inc. } {$N+} program Fib8087; { Зразкова програма від P-335 у посібнику власника, яка демонструє, як уникнути переповнення стека 8087 в рекурсивному Функції, які використовують співпроцесор математики 8087. Місцеві змінні використовуються для зберігання тимчасових результатів на стеку 8086. ПРИМІТКА. Ця програма вимагає математичний сопроцесор } { Sample program from P-335 in the Owner's Handbook that demonstrates how to avoid 8087 stack overflow in recursive functions that use the 8087 math co-processor. Local variables are used to store temporary results on the 8086 stack. Note: THIS PROGRAM REQUIRES A MATH CO-PROCESSOR } var i : integer; function Fib(N : integer) : extended; { calculate the fibonacci sequence for N } var F1, F2 : extended; begin if N = 0 then Fib := 0.0 else if N = 1 then Fib := 1.0 else begin (* Use this line instead of the 3 lines that follow this comment to cause an 8087 stack overflow for values of N >= 8: Fib := Fib(N - 1) + Fib(N - 2); { will cause overflow for N > 8 } *) F1 := Fib(N - 1); { store results in temporaries on 8086 } F2 := Fib(N - 2); { stack to avoid 8087 stack overflow } Fib := F1 + F2; end; end; { Fib } begin for i := 0 to 15 do Writeln(i, '. ', Fib(i)); end.
Поделиться42023-10-01 18:51:40
HILB.PAS
Код:
{$N-} program Hilb; { Програма виконує одночасне рішення Гаусса-Йордана усунення. ------------------------------------------------- Від: програми Pascal для вчених та інженерів Алан Р. Міллер, Сибекс n x n зворотна матриця Гільберта розчин 1 1 1 1 1 Двохнова версія ------------------------------------------------- Інструкції 1. Складіть та запустіть програму за допомогою $ n- (числова обробка: Програмне забезпечення) Директива компілятора. 2. Якщо у вас є математичний копроцесор на вашому комп’ютері, складіть і запустіть Програма за допомогою компілятора $ N+ (числова обробка: обладнання) Директива. Порівняйте швидкість та точність результатів з ними прикладу 1. } { The program performs simultaneous solution by Gauss-Jordan elimination. -------------------------------------------------- From: Pascal Programs for Scientists and Engineers Alan R. Miller, Sybex n x n inverse hilbert matrix solution is 1 1 1 1 1 double precision version -------------------------------------------------- INSTRUCTIONS 1. Compile and run the program using the $N- (Numeric Processing : Software) compiler directive. 2. if you have a math coprocessor in your computer, compile and run the program using the $N+ (Numeric Processing : Hardware) compiler directive. Compare the speed and precision of the results to those of example 1. } const maxr = 10; maxc = 10; type {$IFOPT N+} { use extended type if using 80x87 } real = extended; {$ENDIF} ary = array[1..maxr] of real; arys = array[1..maxc] of real; ary2s = array[1..maxr, 1..maxc] of real; var y : arys; coef : arys; a, b : ary2s; n, m, i, j : integer; error : boolean; procedure gaussj (var b : ary2s; (* square matrix of coefficients *) y : arys; (* constant vector *) var coef : arys; (* solution vector *) ncol : integer; (* order of matrix *) var error: boolean); (* true if matrix singular *) (* Gauss Jordan matrix inversion and solution *) (* Adapted from McCormick *) (* Feb 8, 81 *) (* B(N,N) coefficient matrix, becomes inverse *) (* Y(N) original constant vector *) (* W(N,M) constant vector(s) become solution vector *) (* DETERM is the determinant *) (* ERROR = 1 if singular *) (* INDEX(N,3) *) (* NV is number of constant vectors *) var w : array[1..maxc, 1..maxc] of real; index: array[1..maxc, 1..3] of integer; i, j, k, l, nv, irow, icol, n, l1 : integer; determ, pivot, hold, sum, t, ab, big: real; procedure swap(var a, b: real); var hold: real; begin (* swap *) hold := a; a := b; b := hold end (* procedure swap *); begin (* Gauss-Jordan main program *) error := false; nv := 1 (* single constant vector *); n := ncol; for i := 1 to n do begin w[i, 1] := y[i] (* copy constant vector *); index[i, 3] := 0 end; determ := 1.0; for i := 1 to n do begin (* search for largest element *) big := 0.0; for j := 1 to n do begin if index[j, 3] <> 1 then begin for k := 1 to n do begin if index[k, 3] > 1 then begin writeln(' ERROR: matrix singular'); error := true; exit; (* abort *) end; if index[k, 3] < 1 then if abs(b[j, k]) > big then begin irow := j; icol := k; big := abs(b[j, k]) end end (* k loop *) end end (* j loop *); index[icol, 3] := index[icol, 3] + 1; index[i, 1] := irow; index[i, 2] := icol; (* interchange rows to put pivot on diagonal *) if irow <> icol then begin determ := - determ; for l := 1 to n do swap(b[irow, l], b[icol, l]); if nv > 0 then for l := 1 to nv do swap(w[irow, l], w[icol, l]) end; (* if irow <> icol *) (* divide pivot row by pivot column *) pivot := b[icol, icol]; determ := determ * pivot; b[icol, icol] := 1.0; for l := 1 to n do b[icol, l] := b[icol, l] / pivot; if nv > 0 then for l := 1 to nv do w[icol, l] := w[icol, l] / pivot; (* reduce nonpivot rows *) for l1 := 1 to n do begin if l1 <> icol then begin t := b[l1, icol]; b[l1, icol] := 0.0; for l := 1 to n do b[l1, l] := b[l1, l] - b[icol, l] * t; if nv > 0 then for l := 1 to nv do w[l1, l] := w[l1, l] - w[icol, l] * t; end (* if l1 <> icol *) end end (* i loop *); if error then exit; (* interchange columns *) for i := 1 to n do begin l := n - i + 1; if index[l, 1] <> index[l, 2] then begin irow := index[l, 1]; icol := index[l, 2]; for k := 1 to n do swap(b[k, irow], b[k, icol]) end (* if index *) end (* i loop *); for k := 1 to n do if index[k, 3] <> 1 then begin writeln(' ERROR: matrix singular'); error := true; exit; (* abort *) end; for i := 1 to n do coef[i] := w[i, 1]; end (* procedure gaussj *); procedure get_data(var a : ary2s; var y : arys; var n, m : integer); (* setup n-by-n hilbert matrix *) var i, j : integer; begin for i := 1 to n do begin a[n,i] := 1.0/(n + i - 1); a[i,n] := a[n,i] end; a[n,n] := 1.0/(2*n -1); for i := 1 to n do begin y[i] := 0.0; for j := 1 to n do y[i] := y[i] + a[i,j] end; writeln; if n < 7 then begin for i:= 1 to n do begin for j:= 1 to m do write( a[i,j] :7:5, ' '); writeln( ' : ', y[i] :7:5) end; writeln end (* if n<7 *) end (* procedure get_data *); procedure write_data; (* print out the answers *) var i : integer; begin for i := 1 to m do write( coef[i] :13:9); writeln; end (* write_data *); begin (* main program *) a[1,1] := 1.0; n := 2; m := n; repeat get_data (a, y, n, m); for i := 1 to n do for j := 1 to n do b[i,j] := a[i,j] (* setup work array *); gaussj (b, y, coef, n, error); if not error then write_data; n := n+1; m := n until n > maxr; end.
Поделиться52023-10-01 18:56:14
LISTER.PAS
Код:
{ Copyright (c) 1985, 87 by Borland International, Inc. } program SourceLister; { Джерело демонстраційна програма Це проста програма для переліку ваших програм Turbo Pascal Source. Псевдо -код 1. Знайдіть вихідний файл Pascal, який потрібно вказати 2. Ініціалізуйте змінні програми 3. Відкрийте головний вихідний файл 4. Обробіть файл а. Прочитайте символ у буфер рядків до повного або eoln Linebuffer; б. Буфер пошукового рядка для включення файлу. c. Якщо рядок містить команду файлу: Потім обробіть команду файлу та витягування з буфера рядка В іншому випадку роздрукуйте лінійний буфер. д. Повторіть крок 4.A через 4.c до EOF (основний файл); Інструкції 1. Складіть та запустіть програму: а. У середовищі розвитку навантаження Lister.PAS та Натисніть на альт-R. б. У типу командного рядка TPC Lister.pas /r 2. Вкажіть файл для друку. } { SOURCE LISTER DEMONSTRATION PROGRAM This is a simple program to list your TURBO PASCAL source programs. PSEUDO CODE 1. Find Pascal source file to be listed 2. Initialize program variables 3. Open main source file 4. Process the file a. Read a character into line buffer until linebuffer full or eoln; b. Search line buffer for include file. c. If line contains include file command: Then process include file and extract command from line buffer Else print out the line buffer. d. Repeat step 4.a thru 4.c until eof(main file); INSTRUCTIONS 1. Compile and run the program: a. In the Development Environment load LISTER.PAS and press ALT-R. b. From the command line type TPC LISTER.PAS /R 2. Specify the file to print. } uses Printer; const PageWidth = 80; PrintLength = 55; PathLength = 65; FormFeed = #12; VerticalTabLength = 3; type WorkString = string[126]; FileName = string[PathLength]; var CurRow : integer; MainFileName: FileName; MainFile: text; search1, search2, search3, search4: string[5]; procedure Initialize; begin CurRow := 0; search1 := '{$'+'I'; { different forms that the include compiler } search2 := '{$'+'i'; { directive can take. } search3 := '(*$'+'I'; search4 := '(*$'+'i'; end {initialize}; function Open(var fp:text; name: Filename): boolean; begin Assign(fp,Name); {$I-} Reset(fp); {$I+} Open := IOResult = 0; end { Open }; procedure OpenMain; begin if ParamCount = 0 then begin Write('Enter filename: '); Readln(MainFileName); end else MainFileName := ParamStr(1); if (MainFileName = '') or not Open(MainFile,MainFileName) then begin Writeln('ERROR: file not found (', MainFileName, ')'); Halt(1); end; end {Open Main}; procedure VerticalTab; var i: integer; begin for i := 1 to VerticalTabLength do Writeln(LST); end {vertical tab}; procedure ProcessLine(PrintStr: WorkString); begin CurRow := Succ(CurRow); if Length(PrintStr) > PageWidth then Inc(CurRow); if CurRow > PrintLength then begin Write(LST,FormFeed); VerticalTab; CurRow := 1; end; Writeln(LST,PrintStr); end {Process line}; procedure ProcessFile; {Ця процедура відображає вміст програми Turbo Pascal на} {принтер. Це рекурсивно процеси включають файли, якщо вони вкладені. } { This procedure displays the contents of the Turbo Pascal program on the } { printer. It recursively processes include files if they are nested. } var LineBuffer: WorkString; function IncludeIn(var CurStr: WorkString): boolean; var ChkChar: char; column: integer; begin ChkChar := '-'; column := Pos(search1,CurStr); if column <> 0 then chkchar := CurStr[column+3] else begin column := Pos(search3,CurStr); if column <> 0 then chkchar := CurStr[column+4] else begin column := Pos(search2,CurStr); if column <> 0 then chkchar := CurStr[column+3] else begin column := Pos(search4,CurStr); if column <> 0 then chkchar := CurStr[column+4] end; end; end; if ChkChar in ['+','-'] then IncludeIn := False else IncludeIn := True; end { IncludeIn }; procedure ProcessIncludeFile(var IncStr: WorkString); var NameStart, NameEnd: integer; IncludeFile: text; IncludeFileName: Filename; Function Parse(IncStr: WorkString): WorkString; begin NameStart := Pos('$I',IncStr)+2; while IncStr[NameStart] = ' ' do NameStart := Succ(NameStart); NameEnd := NameStart; while (not (IncStr[NameEnd] in [' ','}','*'])) and ((NameEnd - NameStart) <= PathLength) do Inc(NameEnd); Dec(NameEnd); Parse := Copy(IncStr,NameStart,(NameEnd-NameStart+1)); end {Parse}; begin {Process include file} IncludeFileName := Parse(IncStr); if not Open(IncludeFile,IncludeFileName) then begin LineBuffer := 'ERROR: include file not found (' + IncludeFileName + ')'; ProcessLine(LineBuffer); end else begin while not EOF(IncludeFile) do begin Readln(IncludeFile,LineBuffer); { Turbo Pascal 4.0 allows nested include files so we must check for them and do a recursive call if necessary } if IncludeIn(LineBuffer) then ProcessIncludeFile(LineBuffer) else ProcessLine(LineBuffer); end; Close(IncludeFile); end; end {Process include file}; begin {Process File} VerticalTab; Writeln('Printing . . . '); while not EOF(mainfile) do begin Readln(MainFile,LineBuffer); if IncludeIn(LineBuffer) then ProcessIncludeFile(LineBuffer) else ProcessLine(LineBuffer); end; Close(MainFile); Write(LST,FormFeed); { move the printer to the beginning of the next } { page } end {Process File}; begin Initialize; { initialize some global variables } OpenMain; { open the file to print } ProcessFile; { print the program } end.
Поделиться62023-10-01 18:58:16
QSORT.PAS
Код:
{ Copyright (c) 1985, 87 by Borland International, Inc. } program qsort; {$R-} {$S-} uses Crt; {Ця програма демонструє алгоритм QuickSort, який} {забезпечує надзвичайно ефективний метод сортування масивів у} {пам'ять. Програма генерує список 1000 випадкових чисел} {між 0 і 29999, а потім сортує їх за допомогою QuickSort} {процедура. Нарешті, відсортований список виводиться на екрані. } {Зауважте, що перевірки стека та діапазону вимкнено (через} {Директива компілятора вище) для оптимізації швидкості виконання. } { This program demonstrates the quicksort algorithm, which } { provides an extremely efficient method of sorting arrays in } { memory. The program generates a list of 1000 random numbers } { between 0 and 29999, and then sorts them using the QUICKSORT } { procedure. Finally, the sorted list is output on the screen. } { Note that stack and range checks are turned off (through the } { compiler directive above) to optimize execution speed. } const max = 1000; type list = array[1..max] of integer; var data: list; i: integer; {Quicksort сортує елементи в масиві A з індексами між} {Lo і hi (обидва включно). Зауважте, що Quicksort Proce-} {Dure забезпечує лише "інтерфейс" для програми. Фактично} {Обробка відбувається в процедурі сортування, яка виконує} {Сам рекурсивно. } { QUICKSORT sorts elements in the array A with indices between } { LO and HI (both inclusive). Note that the QUICKSORT proce- } { dure provides only an "interface" to the program. The actual } { processing takes place in the SORT procedure, which executes } { itself recursively. } procedure quicksort(var a: list; Lo,Hi: integer); procedure sort(l,r: integer); var i,j,x,y: integer; begin i:=l; j:=r; x:=a[(l+r) DIV 2]; repeat while a[i]<x do i:=i+1; while x<a[j] do j:=j-1; if i<=j then begin y:=a[i]; a[i]:=a[j]; a[j]:=y; i:=i+1; j:=j-1; end; until i>j; if l<j then sort(l,j); if i<r then sort(i,r); end; begin {quicksort}; sort(Lo,Hi); end; begin {qsort} Write('Now generating 1000 random numbers...'); Randomize; for i:=1 to max do data[i]:=Random(30000); Writeln; Write('Now sorting random numbers...'); quicksort(data,1,max); Writeln; for i:=1 to 1000 do Write(data[i]:8); end.
Страница: 1