파스칼-퀵 가이드

Pascal은 원래 1970 년대 초 Niklaus Wirth가 개발 한 범용 고수준 언어입니다. 프로그래밍을 체계적인 학문으로 가르치고 안정적이고 효율적인 프로그램을 개발하기 위해 개발되었습니다.

Pascal은 Algol 기반 언어이며 Algol의 많은 구성을 포함합니다. Algol 60은 Pascal의 하위 집합입니다. Pascal은 여러 데이터 유형과 프로그래밍 구조를 제공합니다. 파스칼 프로그램을 이해하고 유지하는 것은 쉽습니다.

Pascal은 다양한 이유로 교육 및 학술 분야에서 인기를 얻었습니다.

  • 배우기 쉽습니다.
  • 구조화 된 언어.
  • 투명하고 효율적이며 신뢰할 수있는 프로그램을 생성합니다.
  • 다양한 컴퓨터 플랫폼에서 컴파일 할 수 있습니다.

파스칼 언어의 특징

파스칼은 다음과 같은 특징이 있습니다.

  • 파스칼은 강력한 형식의 언어입니다.
  • 광범위한 오류 검사를 제공합니다.
  • 배열, 레코드, 파일 및 세트와 같은 여러 데이터 유형을 제공합니다.
  • 다양한 프로그래밍 구조를 제공합니다.
  • 기능과 절차를 통해 구조화 된 프로그래밍을 지원합니다.
  • 객체 지향 프로그래밍을 지원합니다.

파스칼에 대한 사실

  • 파스칼 언어는 프랑스의 수학자이자 컴퓨터 개발의 선구자 인 Blaise Pascal의 이름을 따서 명명되었습니다.

  • Niklaus Wirth는 1970 년 원래 Pascal 프로그래밍 언어 개발을 완료했습니다.

  • Pascal은 Algol 프로그래밍 언어의 블록 구조 스타일을 기반으로합니다.

  • Pascal은 프로그래밍을 체계적인 학문으로 가르치기에 적합한 언어로 개발되었으며, 그 구현은 신뢰할 수 있고 효율적일 수 있습니다.

  • ISO 7185 파스칼 표준은 원래 1983 년에 출판되었습니다.

  • Pascal은 Apple Lisa와 Mac 초기에 개발에 사용 된 기본 고급 언어였습니다.

  • 1986 년 Apple Computer는 최초의 Object Pascal 구현을 발표했으며 1993 년 Pascal Standards Committee는 Pascal에 대한 객체 지향 확장을 발표했습니다.

Pascal을 사용하는 이유는 무엇입니까?

Pascal은 프로그래머가 복잡한 구조화 된 데이터 유형을 정의하고 목록, 트리 및 그래프와 같은 동적 및 재귀 데이터 구조를 구축 할 수 있도록합니다. Pascal은 레코드, 열거 형, 하위 범위, 관련 포인터 및 세트와 함께 동적으로 할당 된 변수와 같은 기능을 제공합니다.

Pascal은 모든 수준의 깊이에 중첩 된 프로 시저 정의를 허용합니다. 이것은 근본적인 개념을 기반으로 한 체계적인 학문으로서 프로그래밍을 배우기위한 훌륭한 프로그래밍 환경을 제공합니다.

Pascal의 가장 놀라운 구현은 다음과 같습니다.

  • Skype
  • 총 사령관
  • TeX
  • Macromedia Captivate
  • 애플 리사
  • 다양한 PC 게임
  • 임베디드 시스템

일반적인 용도로 사용할 수있는 여러 Pascal 컴파일러 및 인터프리터가 있습니다. 이들 중에는-

  • Turbo Pascal − CP / M, CP / M-86, DOS, Windows 및 Macintosh에서 Pascal 프로그램을 실행하기위한 IDE 및 컴파일러를 제공합니다.

  • Delphi− Object Pascal을 실행하기위한 컴파일러를 제공하고 32 비트 및 64 비트 Windows 운영 체제, 32 비트 Mac OS X 및 iOS 용 네이티브 코드를 생성합니다. Embarcadero는 Linux 및 Android 운영 체제에 대한 지원을 구축 할 계획입니다.

  • Free Pascal− Pascal 및 Object Pascal 프로그램을 실행하기위한 무료 컴파일러입니다. Free Pascal 컴파일러는 Linux, Windows, OS / 2, FreeBSD, Mac OS X, DOS 및 기타 여러 플랫폼을위한 32 비트 및 64 비트 Turbo Pascal 및 Delphi 호환 Pascal 컴파일러입니다.

  • Turbo51 − 8051 마이크로 컨트롤러 제품군을위한 무료 Pascal 컴파일러이며 Turbo Pascal 7 구문을 사용합니다.

  • Oxygene − .NET 및 Mono 플랫폼 용 오브젝트 파스칼 컴파일러입니다.

  • GNU Pascal (GPC) − GNU Compiler Collection의 프론트 엔드로 구성된 파스칼 컴파일러입니다.

이 튜토리얼에서는 Free Pascal을 사용할 것입니다. 다음 링크에서 운영 체제 용 Free Pascal을 다운로드 할 수 있습니다. Download Free Pascal

Linux에 Free Pascal 설치

Free Pascal의 Linux 배포는 세 가지 형태로 제공됩니다.

  • tar.gz 버전, 별도의 파일로도 제공됩니다.

  • .rpm (Red Hat 패키지 관리자) 버전.

  • .deb (데비안) 버전.

.rpm 버전의 설치 코드 ::

rpm -i fpc-X.Y.Z-N.ARCH.rpm

여기서 XYZ는 .rpm 파일의 버전 번호이고 ARCH는 지원되는 아키텍처 (i386, x86_64 등) 중 하나입니다.

Debian 버전 (예 : Ubuntu)의 설치 코드-

dpkg -i fpc-XXX.deb

여기서 XXX는 .deb 파일의 버전 번호입니다.

자세한 내용은 프리 파스칼 설치 가이드를 읽어보십시오.

Mac에 Free Pascal 설치

Mac OS X를 사용하는 경우 Free Pascal을 사용하는 가장 쉬운 방법은 Apple 웹 사이트에서 Xcode 개발 환경을 다운로드하고 간단한 설치 지침을 따르는 것입니다. Xcode 설정이 완료되면 Free Pascal 컴파일러를 사용할 수 있습니다.

Windows에 Free Pascal 설치

Windows의 경우 Windows 설치 프로그램 인 setup.exe를 다운로드합니다. 이것은 일반적인 설치 프로그램입니다. 설치하려면 다음 단계를 수행해야합니다.

  • 디렉토리를 선택하십시오.

  • 설치할 패키지 부분을 선택하십시오.

  • 선택적으로 .pp 또는 .pas 확장자를 Free Pascal IDE와 연결하도록 선택합니다.

자세한 내용은 프리 파스칼 설치 가이드를 읽어보십시오.

텍스트 에디터

이것은 프로그램을 입력하는 데 사용됩니다. 몇 가지 편집기의 예로는 Windows 메모장, OS 편집 명령, Brief, Epsilon, EMACS 및 vim 또는 vi가 있습니다.

텍스트 편집기의 이름과 버전은 운영 체제에 따라 다를 수 있습니다. 예를 들어, 메모장은 Windows에서 사용되며 vim 또는 vi는 Linux 또는 UNIX뿐만 아니라 Windows에서도 사용할 수 있습니다.

편집기로 만든 파일을 소스 파일이라고하며 프로그램 소스 코드를 포함합니다. 파스칼 프로그램의 소스 파일은 일반적으로 확장자로 명명됩니다..pas.

프로그래밍을 시작하기 전에 하나의 텍스트 편집기가 있고 컴퓨터 프로그램을 작성하고 파일에 저장하고 컴파일하고 마지막으로 실행할 수있는 충분한 경험이 있는지 확인하십시오.

파스칼 프로그래밍 언어의 기본 구성 요소를 연구하기 전에 다음 장에서 참조 할 수 있도록 최소한의 파스칼 프로그램 구조를 살펴 보겠습니다.

파스칼 프로그램 구조

파스칼 프로그램은 기본적으로 다음 부분으로 구성됩니다.

  • 프로그램 명
  • 명령 사용
  • 유형 선언
  • 상수 선언
  • 변수 선언
  • 함수 선언
  • 절차 선언
  • 메인 프로그램 블록
  • 각 블록 내의 문 및 표현식
  • Comments

모든 파스칼 프로그램은 일반적으로 제목 문, 선언 및 실행 부분을 엄격하게 순서대로 가지고 있습니다. 다음 형식은 파스칼 프로그램의 기본 구문을 보여줍니다-

program {name of the program}
uses {comma delimited names of libraries you use}
const {global constant declaration block}
var {global variable declaration block}

function {function declarations, if any}
{ local variables }
begin
...
end;

procedure { procedure declarations, if any}
{ local variables }
begin
...
end;

begin { main program block starts}
...
end. { the end of main program block }

Pascal Hello World 예제

다음은 "Hello, World!"라는 단어를 인쇄하는 간단한 파스칼 코드입니다. −

program HelloWorld;
uses crt;

(* Here the main program block starts *)
begin
   writeln('Hello, World!');
   readkey;
end.

이것은 다음 결과를 생성합니다-

Hello, World!

위 프로그램의 다양한 부분을 살펴 보겠습니다.

  • 프로그램의 첫 번째 줄 program HelloWorld; 프로그램의 이름을 나타냅니다.

  • 프로그램의 두 번째 줄 uses crt; 실제 컴파일로 이동하기 전에 crt 단위를 포함하도록 컴파일러에 지시하는 전 처리기 명령입니다.

  • begin 및 end 문으로 묶인 다음 줄은 기본 프로그램 블록입니다. Pascal의 모든 블록은begin 진술 및 end성명서. 그러나 주 프로그램의 끝을 나타내는 end 문 뒤에는 세미콜론 (;) 대신 마침표 (.)가옵니다.

  • 그만큼 begin 메인 프로그램 블록의 문은 프로그램 실행이 시작되는 곳입니다.

  • 내 라인 (*...*) 컴파일러에 의해 무시되며 comment 프로그램에서.

  • 진술 writeln('Hello, World!');Pascal에서 사용할 수있는 writeln 함수를 사용하여 "Hello, World!"라는 메시지를 표시합니다. 화면에 표시됩니다.

  • 진술 readkey;사용자가 키를 누를 때까지 디스플레이가 일시 중지되도록합니다. crt 단위의 일부입니다. 유닛은 파스칼의 도서관과 같습니다.

  • 마지막 진술 end. 프로그램을 종료합니다.

파스칼 프로그램 컴파일 및 실행

  • 텍스트 편집기를 열고 위에서 언급 한 코드를 추가하십시오.

  • 파일을 hello.pas 로 저장합니다.

  • 명령 프롬프트를 열고 파일을 저장 한 디렉토리로 이동하십시오.

  • 명령 프롬프트에서 fpc hello.pas를 입력하고 Enter 키를 눌러 코드를 컴파일합니다.

  • 코드에 오류가 없으면 명령 프롬프트가 다음 줄로 이동하여 다음을 생성합니다. hello 실행 파일 및 hello.o 개체 파일.

  • 이제 입력 hello 프로그램을 실행하려면 명령 프롬프트에서.

  • 화면에 "Hello World"가 인쇄 된 것을 볼 수 있으며 아무 키나 누를 때까지 프로그램이 대기합니다.

$ fpc hello.pas Free Pascal Compiler version 2.6.0 [2011/12/23] for x86_64 Copyright (c) 1993-2011 by Florian Klaempfl and others Target OS: Linux for x86-64 Compiling hello.pas Linking hello 8 lines compiled, 0.1 sec $ ./hello
Hello, World!

무료 파스칼 컴파일러가 fpc 경로에 있고 소스 파일 hello.pas가 포함 된 디렉토리에서 실행 중입니다.

파스칼 프로그램의 기본 구조를 보았으므로 파스칼 프로그래밍 언어의 다른 기본 구성 요소를 쉽게 이해할 수 있습니다.

변수

변수 정의는 var 키워드 뒤에 다음과 같이 변수 정의가 나옵니다.

var
A_Variable, B_Variable ... : Variable_Type;

파스칼 변수는 함수의 코드 본문 외부에서 선언됩니다. 즉, beginend 그러나 그들은 프로 시저 / 함수 정의 후와 begin예어. 전역 변수의 경우 프로그램 헤더 뒤에 정의됩니다.

기능 / 절차

파스칼에서는 procedure 실행될 명령 집합이며 반환 값이없고 function반환 값이있는 프로 시저입니다. 기능 / 절차의 정의는 다음과 같습니다.

Function Func_Name(params...) : Return_Value;
Procedure Proc_Name(params...);

코멘트

여러 줄 주석은 (* ... *)로 중괄호와 별표로 묶여 있습니다. Pascal은 중괄호 {...}로 묶인 한 줄 주석을 허용합니다.

(* This is a multi-line comments
   and it will span multiple lines. *)

{ This is a single line comment in pascal }

대소 문자 구분

Pascal은 대소 문자를 구분하지 않는 언어이므로 두 경우 모두 변수, 함수 및 프로 시저를 작성할 수 있습니다. 변수 A_Variable과 마찬가지로 a_variable과 A_VARIABLE은 Pascal에서 동일한 의미를 갖습니다.

파스칼 선언문

파스칼 프로그램은 진술로 구성됩니다. 각 명령문은 프로그램의 명확한 작업을 지정합니다. 이러한 작업은 선언, 할당, 데이터 읽기, 데이터 쓰기, 논리적 결정, 프로그램 흐름 제어 전송 등이 될 수 있습니다.

예를 들면-

readln (a, b, c);
s := (a + b + c)/2.0;
area := sqrt(s * (s - a)*(s-b)*(s-c));
writeln(area);

파스칼의 예약어

Pascal의 문은 예약어라고하는 특정 Pascal 단어로 설계되었습니다. 예를 들어, 단어, 프로그램, 입력, 출력, var, real, begin, readline, writeline 및 end는 모두 예약어입니다.

다음은 파스칼에서 사용할 수있는 예약어 목록입니다.

정렬 시작하다 케이스 const
div 하다 아래로 그밖에 종료
파일 ...에 대한 함수 이동 만약
상표 모드 아니
또는 포장 된 순서 프로그램
기록 반복 세트 그때 ...에
유형 ...까지 var 동안

파스칼의 문자 집합 및 식별자

파스칼 문자 집합은-

  • 모두 대문자 (AZ)

  • 모두 소문자 (az)

  • 모든 숫자 (0-9)

  • 특수 기호-+ * / : =,. ;. () [] = {}`공백

변수 및 상수, 유형, 함수, 프로 시저 및 레코드 등과 같은 파스칼 프로그램의 엔티티에는 이름 또는 식별자가 있습니다. 식별자는 문자로 시작하는 일련의 문자와 숫자입니다. 식별자에 특수 기호와 공백을 사용해서는 안됩니다.

엔티티의 데이터 유형은 의미, 제약 조건, 가능한 값, 작업, 기능 및 관련 스토리지 모드를 나타냅니다.

정수, 실수, 부울 및 문자 유형을 표준 데이터 유형이라고합니다. 데이터 유형은 스칼라, 포인터 및 구조화 된 데이터 유형으로 분류 할 수 있습니다. 스칼라 데이터 유형의 예로는 정수, 실수, 부울, 문자, 하위 범위 및 열거가 있습니다. 구조화 된 데이터 유형은 스칼라 유형으로 구성됩니다. 예를 들어, 배열, 레코드, 파일 및 세트. 포인터 데이터 유형은 나중에 논의 할 것입니다.

파스칼 데이터 유형

파스칼 데이터 유형은 다음 다이어그램에서 다음과 같이 요약 할 수 있습니다.

유형 선언

유형 선언은 식별자의 데이터 유형을 선언하는 데 사용됩니다. 유형 선언 구문은-

type-identifier-1, type-identfier-2 = type-specifier;

예를 들어, 다음 선언은 변수 day 및 age를 정수 유형으로, yes 및 true를 부울 유형으로, 이름과 도시를 문자열 유형으로, 수수료 및 비용을 실제 유형으로 정의합니다.

type
days, age = integer;
yes, true = boolean;
name, city = string;
fees, expenses = real;

정수 유형

다음 표는 오브젝트 파스칼에서 사용되는 저장 크기 및 값 범위와 함께 표준 정수 유형에 대한 세부 정보를 제공합니다.

유형 최저한의 최고 체재
정수 -2147483648 2147483647 부호있는 32 비트
추기경 0 4294967295 부호없는 32 비트
Shortint -128 127 부호있는 8 비트
Smallint -32768 32767 부호있는 16 비트
Longint -2147483648 2147483647 부호있는 32 비트
Int64 -2 ^ 63 2 ^ 63-1 부호있는 64 비트
바이트 0 255 부호없는 8 비트
워드 0 65535 부호없는 16 비트
롱 워드 0 4294967295 부호없는 32 비트

상수

상수를 사용하면 프로그램을 더 쉽게 읽을 수 있고 프로그램 시작의 한 위치에 특수 수량을 유지하는 데 도움이됩니다. Pascal은 숫자, 논리, 문자열문자 상수를 허용합니다. 상수는 다음을 지정하여 프로그램의 선언 부분에서 선언 할 수 있습니다.const 선언.

상수 유형 선언의 구문은 다음과 같습니다.

const
Identifier = contant_value;

다음은 상수 선언의 몇 가지 예입니다.

VELOCITY_LIGHT = 3.0E=10;
PIE = 3.141592;
NAME = 'Stuart Little';
CHOICE = yes;
OPERATOR = '+';

모든 상수 선언은 변수 선언 전에 제공되어야합니다.

열거 형

열거 된 데이터 유형은 사용자 정의 데이터 유형입니다. 목록에 값을 지정할 수 있습니다. 만 할당 연산자와 관계 연산자는 열거 된 데이터 유형에 허용됩니다. 열거 된 데이터 유형은 다음과 같이 선언 할 수 있습니다-

type
enum-identifier = (item1, item2, item3, ... )

다음은 열거 형 선언의 몇 가지 예입니다.

type
SUMMER = (April, May, June, July, September);
COLORS = (Red, Green, Blue, Yellow, Magenta, Cyan, Black, White);
TRANSPORT = (Bus, Train, Airplane, Ship);

열거 유형의 도메인에 항목이 나열되는 순서는 항목의 순서를 정의합니다. 예를 들어, 열거 형 SUMMER에서 April은 5 월 이전에, May는 6 월 이전에 오는 식입니다. 열거 형 식별자의 도메인은 숫자 또는 문자 상수로 구성 될 수 없습니다.

하위 범위 유형

하위 범위 유형을 사용하면 변수가 특정 범위 내에있는 값을 가정 할 수 있습니다. 예를 들어, 유권자 의 연령 이 18 세에서 100 세 사이 여야 하는 경우 age 라는 변수는 다음과 같이 선언 될 수 있습니다.

var
age: 18 ... 100;

다음 섹션에서 변수 선언에 대해 자세히 살펴 보겠습니다. 유형 선언을 사용하여 하위 범위 유형을 정의 할 수도 있습니다. 하위 범위 유형을 선언하는 구문은 다음과 같습니다.

type
subrange-identifier = lower-limit ... upper-limit;

다음은 하위 범위 유형 선언의 몇 가지 예입니다.

const
P = 18;
Q = 90;
type
Number = 1 ... 100;
Value = P ... Q;

하위 범위 유형은 이미 정의 된 열거 유형의 하위 집합에서 만들 수 있습니다. 예 :

type
months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Summer = Apr ... Aug;
Winter = Oct ... Dec;

변수는 프로그램이 조작 할 수있는 저장 영역에 주어진 이름 일뿐입니다. Pascal의 각 변수에는 변수 메모리의 크기와 레이아웃을 결정하는 특정 유형이 있습니다. 해당 메모리 내에 저장할 수있는 값의 범위 변수에 적용 할 수있는 연산 집합입니다.

변수 이름은 문자, 숫자 및 밑줄 문자로 구성 될 수 있습니다. 문자 또는 밑줄로 시작해야합니다. 파스칼은not case-sensitive, 따라서 여기서 대문자와 소문자는 같은 의미입니다. 이전 장에서 설명한 기본 유형에 따라 다음과 같은 기본 변수 유형이 있습니다.

파스칼의 기본 변수

Sr. 아니요 유형 및 설명
1

Character

일반적으로 단일 옥텟 (1 바이트)입니다. 이것은 정수 유형입니다.

2

Integer

기계의 가장 자연스러운 정수 크기입니다.

Real

단 정밀도 부동 소수점 값입니다.

4

Boolean

참 또는 거짓 논리 값을 지정합니다. 이것은 또한 정수 유형입니다.

5

Enumerated

사용자 정의 목록을 지정합니다.

6

Subrange

값이 범위 내에있는 변수를 나타냅니다.

7

String

문자 배열을 저장합니다.

파스칼 프로그래밍 언어는 또한 다양한 다른 유형의 변수를 정의 할 수 있도록합니다. 포인터, 배열, 레코드, 세트 및 파일 등과 같은 후속 장에서 다룰 것입니다.이 장에서는 기본적인 변수 유형 만 살펴 보겠습니다.

파스칼의 변수 선언

모든 변수는 파스칼 프로그램에서 사용하기 전에 선언되어야합니다. 모든 변수 선언 뒤에는 var 키워드 가옵니다 . 선언은 변수 목록, 콜론 (:) 및 유형을 지정합니다. 변수 선언 구문은-

var
variable_list : type;

여기서 type은 문자, 정수, 실수, 부울 또는 사용자 정의 데이터 유형 등을 포함하는 유효한 Pascal 데이터 유형이어야하며 variable_list는 쉼표로 구분 된 하나 이상의 식별자 이름으로 구성 될 수 있습니다. 몇 가지 유효한 변수 선언이 여기에 표시됩니다.

var
age, weekdays : integer;
taxrate, net_income: real;
choice, isready: boolean;
initials, grade: char;
name, surname : string;

이전 튜토리얼에서 우리는 Pascal이 타입 선언을 허용한다고 논의했습니다. 유형은 이름 또는 식별자로 식별 할 수 있습니다. 이 유형은 해당 유형의 변수를 정의하는 데 사용할 수 있습니다. 예를 들면

type
days, age = integer;
yes, true = boolean;
name, city = string;
fees, expenses = real;

이제 이렇게 정의 된 유형은 변수 선언에서 사용할 수 있습니다.

var
weekdays, holidays : days;
choice: yes;
student_name, emp_name : name;
capital: city;
cost: expenses;

유형 선언과 var 선언 의 차이점에 유의하십시오 . 유형 선언은 정수, 실수 등과 같은 유형의 범주 또는 클래스를 나타내는 반면 변수 사양은 변수가 사용할 수있는 값의 유형을 나타냅니다. 파스칼의 유형 선언과 C의 typedef 를 비교할 수 있습니다 . 가장 중요한 것은 변수 이름이 변수 값이 저장 될 메모리 위치를 참조한다는 것입니다. 유형 선언은 그렇지 않습니다.

파스칼의 변수 초기화

변수에는 콜론과 등호와 상수 표현식이있는 값이 할당됩니다. 값을 할당하는 일반적인 형식은 다음과 같습니다.

variable_name := value;

기본적으로 파스칼의 변수는 0으로 초기화되지 않습니다. 쓰레기 값이 포함될 수 있습니다. 따라서 프로그램에서 변수를 초기화하는 것이 더 좋습니다. 변수는 선언에서 초기화 (초기 값 할당) 할 수 있습니다. 초기화 다음에는var 키워드 및 초기화 구문은 다음과 같습니다-

var
variable_name : type = value;

몇 가지 예는-

age: integer = 15;
taxrate: real = 0.5;
grade: char = 'A';
name: string = 'John Smith';

지금까지 논의 된 다양한 유형의 변수를 사용하는 예제를 살펴 보겠습니다.

program Greetings;
const
message = ' Welcome to the world of Pascal ';

type
name = string;
var
firstname, surname: name;

begin
   writeln('Please enter your first name: ');
   readln(firstname);
   
   writeln('Please enter your surname: ');
   readln(surname);
   
   writeln;
   writeln(message, ' ', firstname, ' ', surname);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Please enter your first name:
John
Please enter your surname:
Smith
Welcome to the world of Pascal John Smith

열거 변수

정수, 실수 및 부울과 같은 간단한 변수 유형을 사용하는 방법을 살펴 보았습니다. 이제 다음과 같이 정의 할 수있는 열거 형의 변수를 살펴 보겠습니다.

var
var1, var2, ...  : enum-identifier;

열거 형을 선언 한 경우 해당 유형의 변수를 선언 할 수 있습니다. 예를 들면

type
months = (January, February, March, April, May, June, July, August, September, October, November, December);
Var
m: months;
...
M := January;

다음 예제는 개념을 설명합니다-

program exEnumeration;
type
beverage = (coffee, tea, milk, water, coke, limejuice);

var
drink:beverage;

begin
   writeln('Which drink do you want?');
   drink := limejuice;
   
   writeln('You can drink ', drink);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Which drink do you want?
You can drink limejuice

하위 범위 변수

하위 범위 변수는 다음과 같이 선언됩니다.

var
subrange-name : lowerlim ... uperlim;

하위 범위 변수의 예는 다음과 같습니다.

var
marks: 1 ... 100;
grade: 'A' ... 'E';
age: 1 ... 25;

다음 프로그램은 개념을 설명합니다-

program exSubrange;
var
marks: 1 .. 100;
grade: 'A' .. 'E';

begin
   writeln( 'Enter your marks(1 - 100): ');
   readln(marks);
   
   writeln( 'Enter your grade(A - E): ');
   readln(grade);
   
   writeln('Marks: ' , marks, ' Grade: ', grade);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Enter your marks(1 - 100): 
100
Enter your grade(A - E):
A
Marks: 100 Grade: A

상수는 프로그램 실행 중에 변경되지 않은 상태로 유지되는 엔티티입니다. Pascal은 다음 유형의 상수 만 선언 할 수 있습니다.

  • 서수 유형
  • 세트 유형
  • 포인터 유형 (그러나 허용되는 유일한 값은 Nil입니다).
  • 실제 유형
  • Char
  • String

상수 선언

상수를 선언하는 구문은 다음과 같습니다.

const
identifier = constant_value;

다음 표는 몇 가지 유효한 상수 선언의 예를 제공합니다.

Real type constant

Sr. 아니요 상수 유형 및 예
1

Ordinal(Integer)type constant

valid_age = 21;

2

Set type constant

모음 = (A, E, I, O, U);

Pointer type constant

P = NIL;

4

e = 2.7182818;

velocity_light = 3.0E + 10;

5

Character type constant

연산자 = '+';

6

String type constant

대통령 = '조니 뎁';

다음 예제는 개념을 설명합니다-

program const_circle (input,output);
const
PI = 3.141592654;

var
r, d, c : real;   {variable declaration: radius, dia, circumference}

begin
   writeln('Enter the radius of the circle');
   readln(r);
   
   d := 2 * r;
   c :=  PI * d;
   writeln('The circumference of the circle is ',c:7:2);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Enter the radius of the circle
23
The circumference of the circle is 144.51

프로그램의 출력 명령문에서 형식화를 관찰하십시오. 변수 c는 소수점 이하 7 자리와 2 자리의 총 자릿수로 형식화됩니다. Pascal은 숫자 변수를 사용하여 이러한 출력 형식을 허용합니다.

연산자는 컴파일러에게 특정 수학적 또는 논리적 조작을 수행하도록 지시하는 기호입니다. Pascal은 다음 유형의 연산자를 허용합니다.

  • 산술 연산자
  • 관계 연산자
  • 부울 연산자
  • 비트 연산자
  • 집합 연산자
  • 문자열 연산자

산술, 관계형, 부울 및 비트 연산자를 하나씩 살펴 보겠습니다. 집합 연산자와 문자열 연산은 나중에 논의 할 것입니다.

산술 연산자

다음 표는 Pascal에서 지원하는 모든 산술 연산자를 보여줍니다. 변수 가정A 10 개와 가변 B 20 개를 보유하면-

예시보기

운영자 기술
+ 두 개의 피연산자를 더합니다. A + B는 30을 줄 것입니다
- 첫 번째에서 두 번째 피연산자를 뺍니다. A-B는 -10을 줄 것입니다.
* 두 피연산자를 곱합니다. A * B는 200을 줄 것입니다
/ 분자를 분모로 나눕니다. B / A는 2를 줄 것입니다
% 계수 연산자 및 정수 나누기 후의 나머지 B % A는 0을 제공합니다.

관계 연산자

다음 표는 Pascal에서 지원하는 모든 관계 연산자를 보여줍니다. 변수 가정A 10 개와 가변 B 20 개를 보유하면-

예시보기

운영자 기술
= 두 피연산자의 값이 같은지 확인하고, 그렇다면 조건이 참이됩니다. (A = B)는 사실이 아닙니다.
<> 두 피연산자의 값이 같은지 확인하고, 값이 같지 않으면 조건이 참이됩니다. (A <> B)는 사실입니다.
> 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 큰지 확인하고, 그렇다면 조건이 참이됩니다. (A> B)는 사실이 아닙니다.
< 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 작은 지 확인하고, 그렇다면 조건이 참이됩니다. (A <B)는 사실입니다.
> = 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 크거나 같은지 확인하고, 그렇다면 조건이 참이됩니다. (A> = B)는 사실이 아닙니다.
<= 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 작거나 같은지 확인하고, 그렇다면 조건이 참이됩니다. (A <= B)는 참입니다.

부울 연산자

다음 표는 파스칼 언어에서 지원하는 모든 부울 연산자를 보여줍니다. 이러한 모든 연산자는 부울 피연산자에 대해 작동하고 부울 결과를 생성합니다. 변수 가정A 진실하고 가변적이다 B 거짓을 유지하면-

예시보기

운영자 기술
부울 AND 연산자라고합니다. 두 피연산자가 모두 참이면 조건이 참이됩니다. (A와 B)는 거짓입니다.
그리고 AND 연산자와 유사하지만 컴파일러가 논리식을 평가하는 순서를 보장합니다. 왼쪽에서 오른쪽으로 및 오른쪽 피연산자는 필요한 경우에만 평가됩니다. (A와 B)는 거짓입니다.
또는 부울 OR 연산자라고합니다. 두 피연산자 중 하나가 참이면 조건이 참이됩니다. (A 또는 B)가 참입니다.
그렇지 않으면 부울 OR과 유사하지만 컴파일러가 논리식을 평가하는 순서를 보장합니다. 왼쪽에서 오른쪽으로 및 오른쪽 피연산자는 필요한 경우에만 평가됩니다. (A 또는 B)가 참입니다.
아니 부울 NOT 연산자라고합니다. 피연산자의 논리적 상태를 반전하는 데 사용됩니다. 조건이 참이면 논리 NOT 연산자는이를 거짓으로 만듭니다. 아니 (A와 B)는 사실입니다.

비트 연산자

비트 연산자는 비트에 대해 작업하고 비트 단위 연산을 수행합니다. 이러한 모든 연산자는 정수 피연산자에서 작동하며 정수 결과를 생성합니다. 비트 및 (&), 비트 또는 (|) 및 비트가 아닌 (~)에 대한 진리표는 다음과 같습니다.

p & q p | 큐 ~ p ~ q
0 0 0 0 1 1
0 1 0 1 1 0
1 1 1 1 0 0
1 0 0 1 0 1

A = 60이라고 가정합니다. 그리고 B = 13; 이제 바이너리 형식으로 다음과 같이됩니다.

A = 0011 1100

B = 0000 1101

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

A & B = 0000 1100

A ^ B = 0011 0001

~ A = 1100 0011

Pascal에서 지원하는 Bitwise 연산자는 다음 표에 나열되어 있습니다. 변수 A가 60을 보유하고 변수 B가 13을 보유한다고 가정하면 다음과 같습니다.

예시보기

운영자 기술
& 이진 AND 연산자는 두 피연산자에 모두있는 경우 결과에 비트를 복사합니다. (A & B)는 0000 1100 인 12를 줄 것입니다.
| 이진 OR 연산자는 피연산자 중 하나에 있으면 비트를 복사합니다. (A | B)는 61, 즉 0011 1101을 제공합니다.
! 이진 OR 연산자는 피연산자 중 하나에 있으면 비트를 복사합니다. 그것과 동일 | 운영자. (A! B)는 61, 즉 0011 1101
~ Binary Ones Complement Operator는 단항이며 비트를 '뒤집는'효과가 있습니다. (~ A)는 부호가있는 이진수로 인해 2의 보수 형식으로 1100 0011 인 -61을 제공합니다.
<< 이진 왼쪽 시프트 연산자. 왼쪽 피연산자 값은 오른쪽 피연산자에 지정된 비트 수만큼 왼쪽으로 이동합니다. << 2는 240, 즉 1111 0000을 제공합니다.
>> 이진 오른쪽 시프트 연산자. 왼쪽 피연산자 값은 오른쪽 피연산자에 지정된 비트 수만큼 오른쪽으로 이동합니다. A >> 2는 15, 즉 0000 1111을 제공합니다.

Pascal의 다른 구현은 비트 연산자에서 다릅니다. 그러나 여기서 사용한 컴파일러 인 Free Pascal은 다음과 같은 비트 연산자를 지원합니다.

연산자 운영
아니 비트 NOT
비트 AND
또는 비트 OR
xor 비트 배타적 OR
shl 왼쪽으로 비트 시프트
shr 비트 오른쪽으로 시프트
<< 왼쪽으로 비트 시프트
>> 비트 오른쪽으로 시프트

파스칼의 연산자 우선 순위

연산자 우선 순위는 식의 용어 그룹화를 결정합니다. 이는식이 평가되는 방식에 영향을줍니다. 특정 연산자는 다른 연산자보다 우선 순위가 높습니다. 예를 들어 곱셈 연산자는 더하기 연산자보다 우선 순위가 높습니다.

예를 들어 x = 7 + 3 * 2; 여기서 x는 연산자 *가 +보다 우선 순위가 높기 때문에 20이 아닌 13이 할당됩니다. 따라서 먼저 3 * 2를 곱한 다음 7에 더합니다.

여기에서 우선 순위가 가장 높은 연산자는 테이블 맨 위에 표시되고 가장 낮은 연산자는 맨 아래에 표시됩니다. 식 내에서 우선 순위가 높은 연산자가 먼저 평가됩니다.

예시보기

운영자 상위
~, 아니, 제일 높은
*, /, div, mod 및 &
|,!, +,-또는,
=, <>, <, <=,>,> =, in
아니면 최저

의사 결정 구조에서는 프로그래머가 조건이 참인 경우 실행될 명령문 또는 명령문과 함께 프로그램에서 평가하거나 테스트 할 하나 이상의 조건을 지정하고, 조건이 충족되는 경우 실행될 다른 명령문을 선택적으로 지정해야합니다. 거짓으로 결정됩니다.

다음은 대부분의 프로그래밍 언어에서 발견되는 일반적인 의사 결정 구조의 일반적인 형태입니다.

파스칼 프로그래밍 언어는 다음과 같은 유형의 의사 결정문을 제공합니다. 세부 사항을 확인하려면 다음 링크를 클릭하십시오.

Sr. 아니요 성명 및 설명
1 if-then 문

if - then statement 부울 표현식과 하나 이상의 문으로 구성됩니다.

2 If-then-else 문

if - then statement 뒤에 선택 사항이 올 수 있습니다. else statement, 부울 표현식이 false 일 때 실행됩니다.

중첩 된 if 문

하나를 사용할 수 있습니다 if 또는 else if 다른 내부의 진술 if 또는 else if 진술 (들).

4 사례 진술

case 문을 사용하면 변수가 값 목록과 같은지 테스트 할 수 있습니다.

5 case-else 문

그것은 if-then-else 성명서. 여기,else 용어는 case statement.

6 중첩 된 case 문

하나를 사용할 수 있습니다 case 다른 내부의 진술 case 진술 (들).

코드 블록을 여러 번 실행해야하는 상황이있을 수 있습니다. 일반적으로 명령문은 순차적으로 실행됩니다. 함수의 첫 번째 명령문이 먼저 실행되고 두 번째 명령문이 실행되는 식입니다.

프로그래밍 언어는보다 복잡한 실행 경로를 허용하는 다양한 제어 구조를 제공합니다.

루프 문을 사용하면 문 또는 문 그룹을 여러 번 실행할 수 있으며 다음은 대부분의 프로그래밍 언어에서 루프 문의 일반적인 형식입니다.

파스칼 프로그래밍 언어는 루핑 요구 사항을 처리하기 위해 다음 유형의 루프 구조를 제공합니다. 자세한 내용을 확인하려면 다음 링크를 클릭하십시오.

Sr. 아니요 루프 유형 및 설명
1 while-do 루프

주어진 조건이 참인 동안 명령문 또는 명령문 그룹을 반복합니다. 루프 본문을 실행하기 전에 조건을 테스트합니다.

2 for-do 루프

일련의 명령문을 여러 번 실행하고 루프 변수를 관리하는 코드를 축약합니다.

루프까지 반복

while 문과 비슷하지만 루프 본문의 끝에서 조건을 테스트한다는 점이 다릅니다.

4 중첩 된 루프

while, for 또는 repeat until 루프 내부에서 하나 이상의 루프를 사용할 수 있습니다.

루프 제어문

루프 제어문은 정상적인 순서에서 실행을 변경합니다. 실행이 범위를 벗어나면 해당 범위에서 생성 된 모든 자동 개체가 삭제됩니다.

Pascal은 다음 제어문을 지원합니다. 자세한 내용을 확인하려면 다음 링크를 클릭하십시오.

Sr. 아니요 제어문 및 설명
1 break 문

종료 loop 또는 case 문을 열고 루프 또는 case 문 바로 다음 문으로 실행을 전송합니다.

2 계속 진술

루프가 본문의 나머지 부분을 건너 뛰고 반복하기 전에 즉시 상태를 다시 테스트하도록합니다.

goto 문

레이블이 지정된 명령문으로 제어를 전송합니다. 프로그램에서 goto 문을 사용하지 않는 것이 좋습니다.

하위 프로그램

서브 프로그램은 특정 작업을 수행하는 프로그램 단위 / 모듈입니다. 이러한 하위 프로그램은 결합되어 더 큰 프로그램을 형성합니다. 이를 기본적으로 '모듈 형 설계'라고합니다. 서브 프로그램은 호출 프로그램이라고하는 서브 프로그램 / 프로그램에 의해 호출 될 수 있습니다.

파스칼은 두 종류의 서브 프로그램을 제공합니다.

  • Functions −이 서브 프로그램은 단일 값을 반환합니다.

  • Procedures −이 서브 프로그램은 값을 직접 반환하지 않습니다.

기능

function함께 작업을 수행하는 명령문 그룹입니다. 모든 파스칼 프로그램에는 프로그램 자체 인 하나 이상의 기능이 있으며 가장 사소한 프로그램은 모두 추가 기능을 정의 할 수 있습니다.

기능 declaration함수의 이름, 반환 유형 및 매개 변수에 대해 컴파일러에 알려줍니다. 기능definition 함수의 실제 본문을 제공합니다.

Pascal 표준 라이브러리는 프로그램이 호출 할 수있는 다양한 내장 함수를 제공합니다. 예를 들어, 함수AppendStr() 두 개의 문자열을 추가합니다. New() 메모리를 변수와 더 많은 함수에 동적으로 할당합니다.

함수 정의

파스칼에서는 functionfunction 키워드를 사용하여 정의됩니다. 함수 정의의 일반적인 형식은 다음과 같습니다.

function name(argument(s): type1; argument(s): type2; ...): function_type;
local declarations;

begin
   ...
   < statements >
   ...
   name:= expression;
end;

파스칼의 함수 정의는 함수로 구성됩니다. header, 현지 declarations 및 기능 body. 함수 헤더는 키워드 함수와name함수에 주어집니다. 다음은 함수의 모든 부분입니다.

  • Arguments− 인수는 호출 프로그램과 함수 식별자 사이의 연결을 설정하며 형식 매개 변수라고도합니다. 매개 변수는 자리 표시 자와 같습니다. 함수가 호출되면 매개 변수에 값을 전달합니다. 이 값을 실제 매개 변수 또는 인수라고합니다. 매개 변수 목록은 함수의 매개 변수 유형, 순서 및 수를 나타냅니다. 이러한 형식 매개 변수의 사용은 선택 사항입니다. 이러한 매개 변수에는 표준 데이터 유형, 사용자 정의 데이터 유형 또는 하위 범위 데이터 유형이있을 수 있습니다.

    함수 명령문에 나타나는 형식 매개 변수 목록은 단순 또는 첨자 변수, 배열 또는 구조화 된 변수 또는 서브 프로그램 일 수 있습니다.

  • Return Type− 모든 함수는 값을 반환해야하므로 모든 함수에는 유형이 할당되어야합니다. 그만큼function-type함수가 반환하는 값의 데이터 유형입니다. 표준, 사용자 정의 스칼라 또는 하위 범위 유형일 수 있지만 구조화 된 유형은 될 수 없습니다.

  • Local declarations − 지역 선언은 함수 본문에만 적용되는 레이블, 상수, 변수, 함수 및 프로 시저에 대한 선언을 의미합니다.

  • Function Body− 함수 본문에는 함수의 기능을 정의하는 명령문 모음이 포함되어 있습니다. 항상 예약어 시작과 끝 사이에 넣어야합니다. 모든 계산이 수행되는 함수의 일부입니다. 다음 유형의 지정 문이 있어야합니다.name := expression;함수 이름에 값을 할당하는 함수 본문에서. 이 값은 함수가 실행될 때 반환됩니다. 본문의 마지막 문은 끝 문이어야합니다.

다음은 파스칼에서 함수를 정의하는 방법을 보여주는 예입니다.

(* function returning the max between two numbers *)
function max(num1, num2: integer): integer;

var
   (* local variable declaration *)
   result: integer;

begin
   if (num1 > num2) then
      result := num1
   
   else
      result := num2;
   max := result;
end;

함수 선언

기능 declaration컴파일러에게 함수 이름과 함수 호출 방법을 알려줍니다. 함수의 실제 본문은 별도로 정의 할 수 있습니다.

함수 선언에는 다음과 같은 부분이 있습니다.

function name(argument(s): type1; argument(s): type2; ...): function_type;

위에 정의 된 함수 max ()의 경우 다음은 함수 선언입니다.

function max(num1, num2: integer): integer;

한 소스 파일에서 함수를 정의하고 다른 파일에서 해당 함수를 호출 할 때 함수 선언이 필요합니다. 이 경우 함수를 호출하는 파일의 맨 위에 함수를 선언해야합니다.

함수 호출

함수를 만드는 동안 함수가 수행해야하는 작업에 대한 정의를 제공합니다. 함수를 사용하려면 정의 된 작업을 수행하기 위해 해당 함수를 호출해야합니다. 프로그램이 함수를 호출하면 프로그램 제어가 호출 된 함수로 전송됩니다. 호출 된 함수는 정의 된 작업을 수행하고 return 문이 실행되거나 마지막 end 문에 도달하면 프로그램 제어를 주 프로그램으로 되돌립니다.

함수를 호출하려면 함수 이름과 함께 필요한 매개 변수를 전달하기 만하면됩니다. 함수가 값을 반환하면 반환 된 값을 저장할 수 있습니다. 다음은 사용법을 보여주는 간단한 예입니다.

program exFunction;
var
   a, b, ret : integer;

(*function definition *)
function max(num1, num2: integer): integer;
var
   (* local variable declaration *)
   result: integer;

begin
   if (num1 > num2) then
      result := num1
   
   else
      result := num2;
   max := result;
end;

begin
   a := 100;
   b := 200;
   (* calling a function to get max value *)
   ret := max(a, b);
   
   writeln( 'Max value is : ', ret );
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Max value is : 200

Procedures 단일 값을 반환하는 대신 결과 그룹을 얻을 수있는 하위 프로그램입니다.

절차 정의

Pascal에서 절차는 procedure예어. 절차 정의의 일반적인 형식은 다음과 같습니다.

procedure name(argument(s): type1, argument(s): type 2, ... );
   < local declarations >
begin
   < procedure body >
end;

절차 definition 파스칼에서 header, 현지 declarations 그리고 body절차의. 프로 시저 헤더는 키워드로 구성됩니다.procedure그리고 절차에 주어진 이름. 다음은 절차의 모든 부분입니다.

  • Arguments− 인수 (들)는 호출 프로그램과 프로 시저 식별자 사이의 연결을 설정하고 형식 매개 변수라고도합니다. 프로 시저의 인수 규칙은 함수의 규칙과 동일합니다.

  • Local declarations − 로컬 선언은 레이블, 상수, 변수, 함수 및 프로 시저에 대한 선언을 의미하며 프로 시저 본문에만 적용됩니다.

  • Procedure Body− 절차 본문에는 절차가 수행하는 작업을 정의하는 명령문 모음이 포함되어 있습니다. 항상 예약어 시작과 끝 사이에 넣어야합니다. 모든 계산이 수행되는 절차의 일부입니다.

다음은 findMin () 이라는 프로 시저의 소스 코드입니다 . 이 프로시 저는 4 개의 매개 변수 x, y, z 및 m을 사용하고 m이라는 변수에 처음 세 개의 변수 중 최소값을 저장합니다. 변수 m은 다음과 같이 전달됩니다.reference (조금 나중에 참조로 인수 전달에 대해 논의 할 것입니다) −

procedure findMin(x, y, z: integer; var m: integer); 
(* Finds the minimum of the 3 values *)

begin
   if x < y then
      m := x
   else
      m := y;
   
   if z <m then
      m := z;
end; { end of procedure findMin }

절차 선언

절차 declaration프로 시저 이름과 프로 시저 호출 방법에 대해 컴파일러에 알려줍니다. 절차의 실제 본문은 별도로 정의 할 수 있습니다.

프로 시저 선언에는 다음 구문이 있습니다.

procedure name(argument(s): type1, argument(s): type 2, ... );

유의하시기 바랍니다 name of the procedure is not associated with any type. 위의 정의 된 절차 findMin () , 다음은 선언입니다-

procedure findMin(x, y, z: integer; var m: integer);

프로 시저 호출

프로 시저를 생성하는 동안 프로 시저가 수행해야하는 작업에 대한 정의를 제공합니다. 프로 시저를 사용하려면 해당 프로 시저를 호출하여 정의 된 작업을 수행해야합니다. 프로그램이 프로 시저를 호출하면 프로그램 제어가 호출 된 프로 시저로 전송됩니다. 호출 된 프로시 저는 정의 된 작업을 수행하고 마지막 end 문에 도달하면 제어를 호출 프로그램으로 반환합니다.

프로 시저를 호출하려면 아래와 같이 프로 시저 이름과 함께 필요한 매개 변수를 전달하면됩니다.

program exProcedure;
var
   a, b, c,  min: integer;
procedure findMin(x, y, z: integer; var m: integer); 
(* Finds the minimum of the 3 values *)

begin
   if x < y then
      m:= x
   else
      m:= y;
   
   if z < m then
      m:= z;
end; { end of procedure findMin }  

begin
   writeln(' Enter three numbers: ');
   readln( a, b, c);
   findMin(a, b, c, min); (* Procedure call *)
   
   writeln(' Minimum: ', min);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Enter three numbers:
89 45 67
Minimum: 45

재귀 하위 프로그램

우리는 프로그램이나 하위 프로그램이 다른 하위 프로그램을 호출 할 수 있음을 보았습니다. 서브 프로그램이 자신을 호출 할 때이를 재귀 호출이라고하며 프로세스를 재귀라고합니다.

개념을 설명하기 위해 숫자의 계승을 계산해 보겠습니다. n의 계승은 다음과 같이 정의됩니다.

n! = n*(n-1)!
   = n*(n-1)*(n-2)!
      ...
   = n*(n-1)*(n-2)*(n-3)... 1

다음 프로그램은 자신을 재귀 적으로 호출하여 주어진 숫자의 계승을 계산합니다.

program exRecursion;
var
   num, f: integer;
function fact(x: integer): integer; (* calculates factorial of x - x! *)

begin
   if x=0 then
      fact := 1
   else
      fact := x * fact(x-1); (* recursive call *)
end; { end of function fact}

begin
   writeln(' Enter a number: ');
   readln(num);
   f := fact(num);
   
   writeln(' Factorial ', num, ' is: ' , f);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Enter a number:
5
Factorial 5 is: 120

다음은 Fibonacci Series a를 사용하여 주어진 숫자에 대해 recursive 기능-

program recursiveFibonacci;
var
   i: integer;
function fibonacci(n: integer): integer;

begin
   if n=1 then
      fibonacci := 0
   
   else if n=2 then
      fibonacci := 1
   
   else
      fibonacci := fibonacci(n-1) + fibonacci(n-2);
end; 

begin
   for i:= 1 to 10 do
   
   write(fibonacci (i), '  ');
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

0 1 1 2	3 5 8 13 21 34

서브 프로그램의 인수

하위 프로그램 (function or procedure) 인수를 사용하려면 인수 값을 허용하는 변수를 선언해야합니다. 이러한 변수를formal parameters 서브 프로그램의.

형식 매개 변수는 서브 프로그램 내부의 다른 지역 변수처럼 작동하며 서브 프로그램에 들어갈 때 생성되고 종료시 삭제됩니다.

서브 프로그램을 호출하는 동안 인수를 서브 프로그램에 전달할 수있는 두 가지 방법이 있습니다.

Sr. 아니요 통화 유형 및 설명
1 가치로 부르기

이 메소드는 인수의 실제 값을 서브 프로그램의 형식 매개 변수로 복사합니다. 이 경우 서브 프로그램 내에서 매개 변수를 변경해도 인수에 영향을주지 않습니다.

2 참조로 전화

이 메서드는 인수의 주소를 형식 매개 변수에 복사합니다. 서브 프로그램 내에서 주소는 호출에 사용 된 실제 인수에 액세스하는 데 사용됩니다. 이는 매개 변수의 변경 사항이 인수에 영향을 미친다는 것을 의미합니다.

기본적으로 Pascal은 call by value인수를 전달합니다. 일반적으로 이는 하위 프로그램 내의 코드가 하위 프로그램을 호출하는 데 사용되는 인수를 변경할 수 없음을 의미합니다. '파스칼-함수'장에서 사용한 예제 프로그램은 다음을 사용하여 max ()라는 함수를 호출했습니다.call by value.

반면 여기에 제공된 예제 프로그램 ( exProcedure )은 다음을 사용하여 findMin () 프로 시저를 호출합니다.call by reference.

모든 프로그래밍에서 범위는 정의 된 변수가 존재할 수 있고 해당 변수를 넘어서 액세스 할 수없는 프로그램의 영역입니다. 파스칼 프로그래밍 언어로 변수를 선언 할 수있는 세 곳이 있습니다.

  • 하위 프로그램 또는 지역 변수라고하는 블록 내부

  • 전역 변수라고하는 모든 하위 프로그램 외부

  • 형식 매개 변수라고하는 서브 프로그램 매개 변수의 정의에서

무엇인지 설명하겠습니다. localglobal 변수 및 형식 매개 변수.

지역 변수

서브 프로그램 또는 블록 내에서 선언 된 변수를 로컬 변수라고합니다. 하위 프로그램 또는 코드 블록 내부에있는 문에서만 사용할 수 있습니다. 로컬 변수는 자체 외부의 서브 프로그램에 알려지지 않았습니다. 다음은 지역 변수를 사용한 예입니다. 여기서 모든 변수 a , bcexLocal 이라는 프로그램에 로컬 입니다.

program exLocal; 
var
   a, b, c: integer;

begin
   (* actual initialization *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

value of a = 10 b = 20 c = 30

이제 프로그램을 조금 더 확장 해 보겠습니다. display라는 프로 시저를 만들어 보겠습니다.이 프로시 저는 자체 변수 a , bc 세트를 갖고 exLocal 프로그램에서 바로 값을 표시합니다 .

program exLocal;
var
   a, b, c: integer;
procedure display;

var
   a, b, c: integer;
begin
   (* local variables *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('Winthin the procedure display');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end;

begin
   a:= 100;
   b:= 200;
   c:= a + b;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   display();
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
value of a = 10 b = 20 c = 30

글로벌 변수

전역 변수는 일반적으로 프로그램 상단에서 함수 외부에서 정의됩니다. 전역 변수는 프로그램의 수명 내내 그 값을 유지하며 프로그램에 대해 정의 된 모든 함수 내에서 액세스 할 수 있습니다.

global변수는 모든 함수에서 액세스 할 수 있습니다. 즉, 전역 변수는 선언 후 전체 프로그램에서 사용할 수 있습니다. 다음은globallocal 변수-

program exGlobal;
var
   a, b, c: integer;
procedure display;
var
   x, y, z: integer;

begin
   (* local variables *)
   x := 10;
   y := 20;
   z := x + y;
   
   (*global variables *)
   a := 30;
   b:= 40;
   c:= a + b;
   
   writeln('Winthin the procedure display');
   writeln(' Displaying the global variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   writeln('Displaying the local variables x, y, and z');
   
   writeln('value of x = ', x , ' y =  ',  y, ' and z = ', z);
end;

begin
   a:= 100;
   b:= 200;
   c:= 300;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   
   display();
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
Displaying the global variables a, b, and c
value of a = 30 b = 40 c = 70
Displaying the local variables x, y, and z
value of x = 10 y = 20 z = 30

프로 시저 디스플레이는 디스플레이 및 자체 로컬 변수에 대한 전역 변수 인 변수 a, b 및 c에 액세스 할 수 있습니다. 프로그램은 지역 및 전역 변수에 대해 동일한 이름을 가질 수 있지만 함수 내부의 지역 변수 값이 우선합니다.

이전 예제를 약간 변경해 보겠습니다. 이제 프로 시저 디스플레이의 로컬 변수는 a , b , c

program exGlobal;
var
   a, b, c: integer;
procedure display;

var
   a, b, c: integer;

begin
   (* local variables *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('Winthin the procedure display');
   writeln(' Displaying the global variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   writeln('Displaying the local variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end;

begin
   a:= 100;
   b:= 200;
   c:= 300;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);   
   
   display();
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
Displaying the global variables a, b, and c
value of a = 10 b = 20 c = 30
Displaying the local variables a, b, and c
value of a = 10 b = 20 c = 30

파스칼의 문자열은 실제로 선택적 크기 사양이있는 일련의 문자입니다. 문자는 숫자, 문자, 공백, 특수 문자 또는 모두의 조합 일 수 있습니다. Extended Pascal은 시스템 및 구현에 따라 다양한 유형의 문자열 객체를 제공합니다. 프로그램에서 사용되는 더 일반적인 유형의 문자열에 대해 설명합니다.

다양한 방법으로 문자열을 정의 할 수 있습니다.

  • Character arrays − 이것은 작은 따옴표로 묶인 0 개 이상의 바이트 크기 문자 시퀀스 인 문자열입니다.

  • String variables − Turbo Pascal에 정의 된 String 유형의 변수.

  • Short strings − 크기가 지정된 문자열 유형의 변수.

  • Null terminated strings − 변수 pchar 유형.

  • AnsiStrings − Ansistring은 길이 제한이없는 문자열입니다.

Pascal은 하나의 문자열 연산자, 문자열 연결 연산자 (+) 만 제공합니다.

다음 프로그램은 처음 네 종류의 문자열을 인쇄합니다. 다음 예제에서는 AnsiStrings를 사용합니다.

program exString;
var
   greetings: string;
   name: packed array [1..10] of char;
   organisation: string[10];
   message: pchar;

begin
   greetings := 'Hello ';
   message := 'Good Day!';
   
   writeln('Please Enter your Name');
   readln(name);
   
   writeln('Please Enter the name of your Organisation');
   readln(organisation);
   
   writeln(greetings, name, ' from ', organisation);
   writeln(message); 
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Please Enter your Name
John Smith
Please Enter the name of your Organisation
Infotech
Hello John Smith from Infotech

다음 예제는 몇 가지 기능을 더 사용합니다.

program exString;
uses sysutils;
var
   str1, str2, str3 : ansistring;
   str4: string;
   len: integer;

begin
   str1 := 'Hello ';
   str2 := 'There!';
   
   (* copy str1 into str3 *)
   str3 := str1;
   writeln('appendstr( str3, str1) :  ', str3 );
   
   (* concatenates str1 and str2 *)
   appendstr( str1, str2);
   writeln( 'appendstr( str1, str2) ' , str1 );
   str4 := str1 + str2;
   writeln('Now str4 is: ', str4);
   
   (* total lenghth of str4 after concatenation  *)
   len := byte(str4[0]);
   writeln('Length of the final string str4: ', len); 
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

appendstr( str3, str1) : Hello
appendstr( str1, str2) : Hello There!
Now str4 is: Hello There! There!
Length of the final string str4: 18

파스칼 문자열 함수 및 절차

Pascal은 문자열을 조작하는 다양한 함수와 절차를 지원합니다. 이러한 하위 프로그램은 구현 방식에 따라 다릅니다. 여기, 우리는 Free Pascal에서 제공하는 다양한 문자열 조작 서브 프로그램을 나열합니다.

Sr. 아니. 기능 및 목적
1

function AnsiCompareStr(const S1: ; const S2:):Integer;

두 문자열을 비교합니다.

2

function AnsiCompareText(const S1: ; const S2:):Integer;

대소 문자를 구분하지 않고 두 문자열을 비교합니다.

function AnsiExtractQuotedStr(var Src: PChar; Quote: Char):;

문자열에서 따옴표를 제거합니다.

4

function AnsiLastChar(const S:):PChar;

문자열의 마지막 문자를 가져옵니다.

5

function AnsiLowerCase(const s:):

문자열을 모두 소문자로 변환합니다.

6

function AnsiQuotedStr(const S: ; Quote: Char):;

문자열을 인용

7

function AnsiStrComp(S1: PChar;S2: PChar):Integer;

대소 문자를 구분하는 문자열 비교

8

function AnsiStrIComp(S1: PChar; S2: PChar):Integer;

대소 문자를 구분하지 않는 문자열 비교

9

function AnsiStrLComp(S1: PChar; S2: PChar; MaxLen: Cardinal):Integer;

대소 문자를 구분하는 문자열의 L 자 비교

10

function AnsiStrLIComp(S1: PChar; S2: PChar; MaxLen: Cardinal):Integer;

대소 문자를 구분하지 않는 문자열의 L 자 비교

11

function AnsiStrLastChar(Str: PChar):PChar;

문자열의 마지막 문자를 가져옵니다.

12

function AnsiStrLower(Str: PChar):PChar;

문자열을 모두 소문자로 변환합니다.

13

function AnsiStrUpper(Str: PChar):PChar;

문자열을 모두 대문자로 변환

14

function AnsiUpperCase(const s:):;

문자열을 모두 대문자로 변환

15

procedure AppendStr(var Dest: ; const S:);

2 개의 문자열을 추가합니다.

16

procedure AssignStr(var P: PString; const S:);

힙에 문자열 값을 할당합니다.

17

function CompareStr(const S1: ; const S2:):Integer; overload;

대소 문자를 구분하는 두 문자열 비교

18

function CompareText(const S1: ; const S2:):Integer;

대소 문자를 구분하지 않는 두 문자열을 비교합니다.

19 procedure DisposeStr(S: PString); overload;

힙에서 문자열을 제거합니다.

20

procedure DisposeStr(S: PShortString); overload;

힙에서 문자열을 제거합니다.

21

function IsValidIdent( const Ident:):Boolean;

문자열은 유효한 파스칼 식별자입니다.

22

function LastDelimiter(const Delimiters: ; const S:):Integer;

문자열의 마지막 문자

23

function LeftStr(const S: ; Count: Integer):;

문자열의 처음 N 개 문자를 가져옵니다.

24

function LoadStr(Ident: Integer):;

리소스에서 문자열로드

25

function LowerCase(const s: ):; overload;

문자열을 모두 소문자로 변환합니다.

26

function LowerCase(const V: variant ):; overload;

문자열을 모두 소문자로 변환합니다.

27

function NewStr(const S:):PString; overload;

힙에 새 문자열을 할당합니다.

28

function RightStr(const S: ; Count: Integer):;

문자열의 마지막 N 문자를 가져옵니다.

29

function StrAlloc(Size: Cardinal):PChar;

문자열에 대한 메모리 할당

30

function StrBufSize(Str: PChar):SizeUInt;

문자열을 위해 메모리를 예약합니다.

31

procedure StrDispose(Str: PChar);

힙에서 문자열을 제거합니다.

32

function StrPas(Str: PChar):;

PChar를 파스칼 문자열로 변환

33

function StrPCopy(Dest: PChar; Source:):PChar;

파스칼 문자열 복사

34

function StrPLCopy(Dest: PChar; Source: ; MaxLen: SizeUInt):PChar;

N 바이트의 파스칼 문자열 복사

35

function UpperCase(const s:):;

문자열을 모두 대문자로 변환

Pascal은 프로그래머가 상수, 변수, 함수 및 표현식 등과 같은 논리 엔티티를 정의, 저장 및 조작 할 수 있도록하는 데이터 유형 부울을 제공합니다.

부울 값은 기본적으로 정수 유형입니다. 부울 유형 변수에는 두 개의 사전 정의 가능한 값이 있습니다.TrueFalse. 부울 값으로 해석되는 표현식은 부울 유형에도 할당 될 수 있습니다.

Free Pascal은 또한 ByteBool, WordBoolLongBool유형. 이들은 각각 Byte, Word 또는 Longint 유형입니다.

False 값은 0 (영)과 같고 부울 값으로 변환 할 때 0이 아닌 값은 True로 간주됩니다. 부울 값 True는 LongBool 유형의 변수에 할당 된 경우 -1로 변환됩니다.

논리 연산자는 and, ornot 부울 데이터 유형에 대해 정의됩니다.

부울 데이터 유형 선언

부울 유형의 변수는 var 키워드를 사용하여 선언됩니다.

var
boolean-identifier: boolean;

예를 들면

var
choice: boolean;

program exBoolean;
var
exit: boolean;

choice: char;
   begin
   writeln('Do you want to continue? ');
   writeln('Enter Y/y for yes, and N/n for no');
   readln(choice);

if(choice = 'n') then
   exit := true
else
   exit := false;

if (exit) then
   writeln(' Good Bye!')
else
   writeln('Please Continue');

readln;
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Do you want to continue?
Enter Y/y for yes, and N/n for no
N
Good Bye!
Y
Please Continue

파스칼 프로그래밍 언어는 배열이라고하는 데이터 구조를 제공하며, 이는 동일한 유형의 요소의 고정 크기 순차 컬렉션을 저장할 수 있습니다. 배열은 데이터 모음을 저장하는 데 사용되지만 배열을 동일한 유형의 변수 모음으로 생각하는 것이 더 유용합니다.

number1, number2, ... 및 number100과 같은 개별 변수를 선언하는 대신 숫자와 같은 하나의 배열 변수를 선언하고 numbers [1], numbers [2] 및 ..., numbers [100]을 사용하여 개별 변수. 배열의 특정 요소는 인덱스로 액세스됩니다.

모든 어레이는 연속적인 메모리 위치로 구성됩니다. 가장 낮은 주소는 첫 번째 요소에 해당하고 가장 높은 주소는 마지막 요소에 해당합니다.

인덱스 0에서 시작하는 C 스타일 배열을 원한다면 1이 아닌 0에서 인덱스를 시작하면됩니다.

배열 선언

파스칼에서 배열을 선언하기 위해 프로그래머는 유형을 선언 한 다음 해당 배열의 변수를 생성하거나 배열 변수를 직접 선언 할 수 있습니다.

1 차원 배열 유형 선언의 일반적인 형식은 다음과 같습니다.

type
   array-identifier = array[index-type] of element-type;

어디,

  • array-identifier − 배열 유형의 이름을 나타냅니다.

  • index-type− 배열의 첨자를 지정합니다. 실수를 제외한 모든 스칼라 데이터 유형이 될 수 있습니다.

  • element-type − 저장 될 값의 유형을 지정합니다.

예를 들면

type
   vector = array [ 1..25] of real;
var
   velocity: vector;

이제 속도는 최대 25 개의 실수를 담기에 충분한 벡터 유형의 가변 배열입니다.

0 인덱스에서 배열을 시작하려면 선언은 다음과 같습니다.

type
   vector = array [ 0..24] of real;
var
   velocity: vector;

배열 첨자의 유형

Pascal에서 배열 첨자는 실수를 제외하고 정수, 부울, 열거 형 또는 하위 범위와 같은 스칼라 유형일 수 있습니다. 배열 첨자도 음수 값을 가질 수 있습니다.

예를 들면

type
   temperature = array [-10 .. 50] of real;
var
   day_temp, night_temp: temperature;

아래 첨자가 문자 유형 인 또 다른 예를 들어 보겠습니다.

type
   ch_array = array[char] of 1..26;
var
   alphabet: ch_array;

아래 첨자는 열거 유형이 될 수 있습니다-

type
   color = ( red, black, blue, silver, beige);
   car_color = array of [color] of boolean;
var
   car_body: car_color;

배열 초기화

Pascal에서 배열은 특정 첨자를 지정하거나 for-do 루프를 사용하여 할당을 통해 초기화됩니다.

예를 들면-

type
   ch_array = array[char] of 1..26;
var
   alphabet: ch_array;
   c: char;

begin
   ...
   for c:= 'A' to 'Z' do
   alphabet[c] := ord[m];  
   (* the ord() function returns the ordinal values *)

배열 요소에 액세스

배열 이름을 인덱싱하여 요소에 액세스합니다. 이는 배열 이름 뒤에 대괄호 안에 요소의 인덱스를 배치하여 수행됩니다. 예를 들면-

a: integer;
a: = alphabet['A'];

위의 문은 alphabet이라는 배열의 첫 번째 요소를 가져와 변수 a에 값을 할당합니다.

다음은 위에서 언급 한 세 가지 개념을 모두 사용하는 예입니다. 선언, 할당 및 액세스 배열-

program exArrays;
var
   n: array [1..10] of integer;   (* n is an array of 10 integers *)
   i, j: integer;

begin
   (* initialize elements of array n to 0 *)        
   for i := 1 to 10 do
       n[ i ] := i + 100;   (* set element at location i to i + 100 *)
    (* output each array element's value *)
   
   for j:= 1 to 10 do
      writeln('Element[', j, '] = ', n[j] );
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
Element[10] = 110

세부 파스칼 배열

배열은 Pascal에 중요하며 더 많은 세부 정보가 필요합니다. Pascal 프로그래머에게 명확해야 할 배열과 관련된 몇 가지 중요한 개념이 있습니다.

Sr. 아니요 개념 및 설명
1 다차원 배열

Pascal은 다차원 배열을 지원합니다. 다차원 배열의 가장 간단한 형태는 2 차원 배열입니다.

2 동적 배열

이 유형의 배열에서 초기 길이는 0입니다. 어레이의 실제 길이는 표준으로 설정되어야합니다.SetLength 함수.

패킹 된 어레이

이러한 배열은 비트로 압축됩니다. 즉, 각 문자 또는 진리 값은 하나의 저장 장치, 일반적으로 단어 (4 바이트 이상)를 사용하는 대신 연속 바이트로 저장됩니다.

4 서브 프로그램에 배열 전달

인덱스없이 배열 이름을 지정하여 배열에 대한 포인터를 서브 프로그램에 전달할 수 있습니다.

파스칼의 포인터는 쉽고 재미있게 배울 수 있습니다. 일부 파스칼 프로그래밍 작업은 포인터로 더 쉽게 수행되며 동적 메모리 할당과 같은 다른 작업은 포인터를 사용하지 않고 수행 할 수 없습니다. 따라서 완벽한 파스칼 프로그래머가되기 위해서는 포인터를 배울 필요가 있습니다. 간단하고 쉬운 단계로 학습을 시작하겠습니다.

아시다시피 모든 변수는 메모리 위치이며 모든 메모리 위치에는 메모리의 주소를 나타내는 포인터 변수의 이름을 사용하여 액세스 할 수있는 주소가 정의되어 있습니다.

포인터 란?

포인터는 동적 변수이며, 그 값은 다른 변수의 주소, 즉 메모리 위치의 직접 주소입니다. 다른 변수 나 상수와 마찬가지로 포인터를 사용하여 변수 주소를 저장하려면 먼저 포인터를 선언해야합니다. 포인터 변수 선언의 일반적인 형식은 다음과 같습니다.

type
   ptr-identifier = ^base-variable-type;

포인터 유형은 캐럿 기호 (^)의 위쪽 화살표 앞에 기본 유형을 추가하여 정의됩니다. 기본 유형은 데이터 항목의 유형을 정의합니다. 포인터 변수가 특정 유형으로 정의되면 해당 유형의 데이터 항목 만 가리킬 수 있습니다. 포인터 유형이 정의되면 다음을 사용할 수 있습니다.var 포인터 변수를 선언하는 선언.

var
   p1, p2, ... : ptr-identifier;

다음은 유효한 포인터 선언입니다-

type
   Rptr = ^real;
   Cptr = ^char;
   Bptr = ^ Boolean;
   Aptr = ^array[1..5] of real;
   date-ptr = ^ date;
      Date = record
         Day: 1..31;
         Month: 1..12;
         Year: 1900..3000;
      End;
var
   a, b : Rptr;
   d: date-ptr;

포인터 변수는 동일한 캐럿 기호 (^)를 사용하여 역 참조됩니다. 예를 들어, 포인터 rptr이 참조하는 관련 변수 는 rptr ^ 입니다. 다음과 같이 액세스 할 수 있습니다.

rptr^ := 234.56;

다음 예는이 개념을 설명합니다.

program exPointers;
var
   number: integer;
   iptr: ^integer;

begin
   number := 100;
   writeln('Number is: ', number);
   
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200

파스칼로 메모리 주소 인쇄

Pascal에서는 주소 연산자 (@)를 사용하여 변수의 주소를 포인터 변수에 할당 할 수 있습니다. 이 포인터를 사용하여 데이터 항목을 조작하고 액세스합니다. 그러나 어떤 이유로 메모리 주소 자체로 작업해야하는 경우 단어 유형 변수에 저장해야합니다.

우리가 포인터에 저장된 메모리 주소를 인쇄하려면 위의 예제를 확장 할 수 iptr을 -

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   number := 100;
   writeln('Number is: ', number);
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
   y := addr(iptr);
   writeln(y^); 
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200
45504

NIL 포인터

항상 할당하는 것이 좋습니다. NIL할당 할 정확한 주소가없는 경우 포인터 변수에 값을 추가합니다. 이것은 변수 선언시 수행됩니다. 할당 된 포인터NIL아무데도 가리 키지 않습니다. 다음 프로그램을 고려하십시오-

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   iptr := nil;
   y := addr(iptr);
   
   writeln('the vaule of iptr is ', y^);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

The value of ptr is 0

확인하려면 nil 포인터는 다음과 같이 if 문을 사용할 수 있습니다-

if(ptr <> nill )then     (* succeeds if p is not null *)
if(ptr = nill)then    (* succeeds if p is null *)

파스칼 포인터 상세

포인터는 많지만 쉬운 개념을 가지고 있으며 Pascal 프로그래밍에 매우 중요합니다. 다음과 같은 몇 가지 중요한 포인터 개념이 있습니다. 파스칼 프로그래머에게는 분명합니다.

Sr. 아니요 개념 및 설명
1 파스칼-포인터 산술

포인터에 사용할 수있는 산술 연산자는 증가, 감소, +,-네 가지가 있습니다.

2 파스칼-포인터 배열

여러 포인터를 보유하도록 배열을 정의 할 수 있습니다.

파스칼-포인터에 대한 포인터

Pascal을 사용하면 포인터에 포인터를 놓을 수 있습니다.

4 Pascal에서 하위 프로그램에 포인터 전달

참조 또는 주소로 인수를 전달하면 호출 된 하위 프로그램이 호출 하위 프로그램에서 전달 된 인수를 변경할 수 있습니다.

5 파스칼의 하위 프로그램에서 포인터 반환

Pascal을 사용하면 하위 프로그램이 포인터를 반환 할 수 있습니다.

파스칼 배열을 사용하면 동일한 종류의 여러 데이터 항목을 보유 할 수있는 변수 유형을 정의 할 수 있지만 레코드는 다른 종류의 데이터 항목을 결합 할 수있는 파스칼에서 사용할 수있는 또 다른 사용자 정의 데이터 유형입니다.

레코드는 서로 다른 필드로 구성됩니다. 도서관에서 책을 추적하고 싶다면 각 책에 대한 다음 속성을 추적 할 수 있습니다.

  • Title
  • Author
  • Subject
  • 도서 ID

레코드 정의

레코드 유형을 정의하려면 유형 선언문을 사용할 수 있습니다. 레코드 유형은 다음과 같이 정의됩니다.

type
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

도서 기록을 선언하는 방법은 다음과 같습니다.

type 
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

레코드 변수는 다음과 같은 일반적인 방식으로 정의됩니다.

var
   r1, r2, ... : record-name;

또는 레코드 유형 변수를 다음과 같이 직접 정의 할 수 있습니다.

var
Books : record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

레코드 필드 액세스

레코드의 모든 필드에 액세스하려면 멤버 액세스 연산자 (.)를 사용합니다. 멤버 액세스 연산자는 레코드 변수 이름과 액세스하려는 필드 사이의 마침표로 코딩됩니다. 다음은 구조의 사용법을 설명하는 예입니다-

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)

begin
   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

   (* book 2 specification *)
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;
 
   (* print Book1 info *)
   writeln ('Book 1 title : ', Book1.title);
   writeln('Book 1 author : ', Book1.author);
   writeln( 'Book 1 subject : ', Book1.subject);
   writeln( 'Book 1 book_id : ', Book1.book_id);
   writeln; 

   (* print Book2 info *)
   writeln ('Book 2 title : ', Book2.title);
   writeln('Book 2 author : ', Book2.author);
   writeln( 'Book 2 subject : ', Book2.subject);
   writeln( 'Book 2 book_id : ', Book2.book_id);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

서브 프로그램 인수로 기록

다른 변수 나 포인터를 전달하는 것과 매우 유사한 방식으로 레코드를 서브 프로그램 인수로 전달할 수 있습니다. 위의 예에서 액세스 한 것과 유사한 방식으로 레코드 필드에 액세스합니다.

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)

(* procedure declaration *)
procedure printBook( var book: Books );

begin
   (* print Book info *)
   writeln ('Book  title : ', book.title);
   writeln('Book  author : ', book.author);
   writeln( 'Book  subject : ', book.subject);
   writeln( 'Book book_id : ', book.book_id);
end;

begin
   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;
   
   (* book 2 specification *)
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;
   
   (* print Book1 info *)
   printbook(Book1);
   writeln; 

   (* print Book2 info *)
   printbook(Book2);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

레코드에 대한 포인터

다음과 같이 다른 변수에 대한 포인터를 정의하는 것과 매우 유사한 방식으로 레코드에 대한 포인터를 정의 할 수 있습니다.

type
record-ptr = ^ record-name;
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

이제 위에서 정의한 포인터 변수에 레코드 유형 변수의 주소를 저장할 수 있습니다. 생성 된 포인터 유형의 변수를 선언하려면 var 키워드를 사용합니다.

var
   r1, r2, ... : record-ptr;

이러한 포인터를 사용하기 전에 레코드 이름 유형 변수에 대한 저장소를 만들어야합니다.이 변수는 이러한 포인터에 의해 조작됩니다.

new(r1);
new(r2);

해당 레코드에 대한 포인터를 사용하여 레코드의 멤버에 액세스하려면 ^를 사용해야합니다. 다음과 같이 연산자-

r1^.feild1 := value1;
r1^.feild2 := value2;
...
r1^fieldn := valuen;

마지막으로, 사용한 스토리지는 더 이상 사용하지 않을 때 폐기하는 것을 잊지 마십시오.

dispose(r1);
dispose(r2);

Books 레코드에 대한 포인터를 사용하여 첫 번째 예제를 다시 작성해 보겠습니다. 이것이 당신이 개념을 이해하기 쉽기를 바랍니다.

program exRecords;
type
BooksPtr = ^ Books;
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
  (* Declare Book1 and Book2 of pointer type that refers to Book type *)
   Book1, Book2: BooksPtr; 

begin
   new(Book1);
   new(book2);
   
   (* book 1 specification *)
   Book1^.title  := 'C Programming';
   Book1^.author := 'Nuha Ali '; 
   Book1^.subject := 'C Programming Tutorial';
   Book1^.book_id := 6495407;
   
   (* book 2 specification *)
   Book2^.title := 'Telecom Billing';
   Book2^.author := 'Zara Ali';
   Book2^.subject := 'Telecom Billing Tutorial';
   Book2^.book_id := 6495700;
   
   (* print Book1 info *)
   writeln ('Book 1 title : ', Book1^.title);
   writeln('Book 1 author : ', Book1^.author);
   writeln( 'Book 1 subject : ', Book1^.subject);
   writeln( 'Book 1 book_id : ', Book1^.book_id);
   
   (* print Book2 info *)
   writeln ('Book 2 title : ', Book2^.title);
   writeln('Book 2 author : ', Book2^.author);
   writeln( 'Book 2 subject : ', Book2^.subject);
   writeln( 'Book 2 book_id : ', Book2^.book_id);
   
   dispose(Book1); 
   dispose(Book2);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

With 문

멤버 액세스 연산자 (.)를 사용하여 레코드의 멤버에 액세스 할 수 있다고 논의했습니다. 이렇게하면 매번 레코드 변수의 이름을 써야합니다. 그만큼With 성명은이를 수행하는 다른 방법을 제공합니다.

첫 번째 예제에서 가져온 다음 코드 스 니펫을보십시오.

(* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

동일한 할당은 With 문장을-

(* book 1 specification *)
With Book1 do
begin
   title  := 'C Programming';
   author := 'Nuha Ali '; 
   subject := 'C Programming Tutorial';
   book_id := 6495407;
end;

Pascal은 변형이라는 고유 한 유형의 스토리지를 지원합니다. 변형 변수에 모든 단순 유형의 값을 할당 할 수 있습니다. 변형에 저장된 값의 유형은 런타임에만 결정됩니다. 서수 유형, 문자열 유형, int64 유형 등 거의 모든 단순 유형을 변형에 할당 할 수 있습니다.

집합, 레코드, 배열, 파일, 개체 및 클래스와 같은 구조화 된 유형은 변형과 할당 호환되지 않습니다. 변형에 포인터를 할당 할 수도 있습니다.

Free Pascal은 변형을 지원합니다.

변형 선언

다른 유형과 마찬가지로 변형 유형을 선언 할 수 있습니다. var예어. 변형 유형을 선언하는 구문은 다음과 같습니다.

var
   v: variant;

이제이 변형 변수 v는 열거 된 유형을 포함하여 거의 모든 단순 유형에 할당 될 수 있으며 그 반대의 경우도 마찬가지입니다.

type  
   color = (red, black, white);  
var  
   v : variant;  
   i : integer;  
   b : byte;  
   w : word;  
   q : int64;  
   e : extended;  
   d : double;  
   en : color;  
   as : ansistring;  
   ws : widestring;  

begin  
   v := i;  
   v := b;  
   v := w;  
   v := q;  
   v := e;  
   v := en;  
   v := d:  
   v := as;  
   v := ws;  
end;

다음 예는 개념을 설명합니다.

Program exVariant;

uses variants;
type
   color = (red, black, white);

var
   v : variant;
   i : integer;
   r: real;
   c : color;
   as : ansistring;


begin
   i := 100;
   v:= i;
   writeln('Variant as Integer: ', v);

   r:= 234.345;
   v:= r;
   writeln('Variant as real: ', v);

   c := red;
   v := c;
   writeln('Variant as Enumerated data: ', v);

   as:= ' I am an AnsiString';
   v:= as;
   writeln('Variant as AnsiString: ', v);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Variant as Integer: 100
Variant as real: 234.345
Variant as Enumerated data: 0
Variant as AnsiString: I am an AnsiString

집합은 동일한 유형의 요소 모음입니다. Pascal은 세트 데이터 유형을 정의 할 수 있습니다. 집합의 요소를 구성원이라고합니다. 수학에서 집합은 중괄호 {} 안에 멤버를 묶어 표시합니다 . 그러나 파스칼에서 집합 요소는 집합 생성자라고하는 대괄호 []로 묶여 있습니다.

집합 유형 및 변수 정의

파스칼 세트 유형은 다음과 같이 정의됩니다.

type
set-identifier = set of base type;

집합 유형의 변수는 다음과 같이 정의됩니다.

var
s1, s2, ...: set-identifier;

또는,

s1, s2...: set of base type;

유효한 집합 유형 선언의 예는 다음과 같습니다.

type
Days = (mon, tue, wed, thu, fri, sat, sun);
Letters = set of char;
DaySet = set of days;
Alphabets = set of 'A' .. 'Z';
studentAge = set of 13..20;

집합 연산자

파스칼 세트에서 다음과 같은 세트 작업을 수행 할 수 있습니다.

Sr. 아니요 운영 및 설명
1

Union

이것은 두 세트를 결합하고 두 세트의 구성원으로 새 세트를 제공합니다.

2

Difference

두 세트의 차이를 가져오고 두 세트에 공통되지 않는 요소가있는 새 세트를 제공합니다.

Intersection

두 세트의 교차점을 가져오고 두 세트에 공통된 요소가있는 새 세트를 제공합니다.

4

Inclusion

P의 모든 항목이 Q에도 있지만 그 반대가 아닌 경우 세트 P는 세트 Q에 포함됩니다.

5

Symmetric difference

두 세트의 대칭 차이를 가져오고 교차가 아닌 세트 중 하나에있는 요소 세트를 제공합니다.

6

In

회원을 확인합니다.

다음 표는 Free Pascal에서 지원하는 모든 집합 연산자를 보여줍니다. 그것을 가정S1S2 두 개의 문자 세트입니다.

S1 : = [ 'a', 'b', 'c'];

S2 : = [ 'c', 'd', 'e'];

운영자 기술
+ 두 세트의 조합

S1 + S2는 세트를 줄 것입니다

['에이 비 씨 디이']

- 2 개 세트의 차이

S1-S2는 세트를 줄 것입니다

[ 'a', 'b']

* 두 세트의 교차점

S1 * S2는 세트를 줄 것입니다

['씨']

> < 두 세트의 대칭 차이 S1> <S2는 세트 [ 'a', 'b', 'd', 'e']를 제공합니다.
= 두 세트의 동일성을 확인합니다. S1 = S2는 부울 값 False를 제공합니다.
<> 두 세트가 같지 않은지 확인합니다. S1 <> S2는 부울 값 True를 제공합니다.
<= 포함 (한 세트가 다른 세트의 서브 세트인지 확인) S1 <= S2는 부울 값 False를 제공합니다.
포함 세트에 요소를 포함합니다. 기본적으로 동일한 기본 유형의 집합과 요소의 결합입니다.

Include (S1, [ 'd'])는 세트를 제공합니다

[ 'a', 'b', 'c', 'd']

들어오지 못하게 하다 집합에서 요소를 제외합니다. 기본적으로 동일한 기본 유형의 집합과 요소의 차이입니다.

제외 (S2, [ 'd'])는 세트를 제공합니다.

[ 'c', 'e']

집합에있는 요소의 집합 구성원을 확인합니다. S2의 [ 'e']는 부울 값 True를 제공합니다.

다음 예제는 이러한 연산자의 사용을 보여줍니다-

program setColors;
type  
color = (red, blue, yellow, green, white, black, orange);  
colors = set of color;  
 
procedure displayColors(c : colors);  
const  
names : array [color] of String[7]  
  = ('red', 'blue', 'yellow', 'green', 'white', 'black', 'orange');  
var  
   cl : color;  
   s : String;  

begin  
   s:= ' ';  
   for cl:=red to orange do  
      if cl in c then  
      begin  
         if (s<>' ') then s :=s +' , ';  
         s:=s+names[cl];  
      end;  
   writeln('[',s,']');  
end;  
 
var  
   c : colors;  
 
begin  
   c:= [red, blue, yellow, green, white, black, orange];
   displayColors(c);

   c:=[red, blue]+[yellow, green]; 
   displayColors(c);  

   c:=[red, blue, yellow, green, white, black, orange] - [green, white];     
   displayColors(c);    

   c:= [red, blue, yellow, green, white, black, orange]*[green, white];     
   displayColors(c);  

   c:= [red, blue, yellow, green]><[yellow, green, white, black]; 
   displayColors(c);  
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

[ red , blue , yellow , green , white , black , orange]
[ red , blue , yellow , green]
[ red , blue , yellow , black , orange]
[ green , white]
[ red , blue , white , black]

Pascal은 파일을 균일 한 유형의 구성 요소 시퀀스로 취급합니다. 파일 유형은 구성 요소 유형에 따라 결정됩니다. 파일 데이터 유형은 다음과 같이 정의됩니다.

type
file-name = file of base-type;

여기서 기본 유형은 파일 구성 요소의 유형을 나타냅니다. 기본 유형은 정수, 실수, 부울, 열거, 하위 범위, 레코드, 배열 및 다른 파일 유형을 제외한 세트와 같은 것이 될 수 있습니다. 파일 유형의 변수는 var 선언을 사용하여 생성됩니다 -

var
f1, f2,...: file-name;

다음은 일부 파일 유형과 파일 변수를 정의하는 몇 가지 예입니다.

type
   rfile = file of real;
   ifile = file of integer;
   bfile = file of boolean;
   datafile = file of record
   arrfile = file of array[1..4] of integer;

var
   marks: arrfile;
   studentdata: datafile;
   rainfalldata: rfile;
   tempdata: ifile;
   choices: bfile;

파일 생성 및 쓰기

학생들의 기록을위한 데이터 파일을 만드는 프로그램을 작성해 보겠습니다. 그것은 students.dat라는 파일을 생성하고 그것에 학생의 데이터를 쓸 것입니다-

program DataFiles;
type
   StudentRecord = Record
      s_name: String;
      s_addr: String;
      s_batchcode: String;
   end;

var
   Student: StudentRecord;
   f: file of StudentRecord;

begin
   Assign(f,'students.dat');
   Rewrite(f);
   Student.s_name := 'John Smith';
   Student.s_addr := 'United States of America';
   Student.s_batchcode := 'Computer Science';
   Write(f,Student);
   Close(f);
end.

컴파일되고 실행되면 프로그램은 students.dat 라는 파일을 작업 디렉토리에 생성합니다. 메모장과 같은 텍스트 편집기를 사용하여 파일을 열어 John Smith의 데이터를 볼 수 있습니다.

파일에서 읽기

방금 만든 다음 students.dat라는 파일에 기록했습니다. 이제 파일에서 학생의 데이터를 읽는 프로그램을 작성해 보겠습니다.

program DataFiles;
type
   StudentRecord = Record
      s_name: String;
      s_addr: String;
      s_batchcode: String;
   end;

var
   Student: StudentRecord;
   f: file of StudentRecord;

begin
   assign(f, 'students.dat');
   reset(f); 
   while not eof(f) do
   
   begin
      read(f,Student);
      writeln('Name: ',Student.s_name);
      writeln('Address: ',Student.s_addr);
      writeln('Batch Code: ', Student.s_batchcode);
   end;
   
   close(f);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Name: John Smith
Address: United States of America
Batch Code: Computer Science

서브 프로그램 매개 변수로서의 파일

Pascal을 사용하면 파일 변수를 표준 및 사용자 정의 하위 프로그램에서 매개 변수로 사용할 수 있습니다. 다음 예는이 개념을 보여줍니다. 이 프로그램은 rainfall.txt라는 파일을 생성하고 일부 강우 데이터를 저장합니다. 다음으로 파일을 열고 데이터를 읽고 평균 강우량을 계산합니다.

점에 유의하시기 바랍니다, if you use a file parameter with subprograms, it must be declared as a var parameter.

program addFiledata;
const
   MAX = 4;
type
   raindata = file of real;

var
   rainfile: raindata;
   filename: string;
procedure writedata(var f: raindata);

var
   data: real;
   i: integer;

begin
   rewrite(f, sizeof(data));
   for i:=1 to MAX do
   
   begin
      writeln('Enter rainfall data: ');
      readln(data);
      write(f, data);
   end;
   
   close(f);
end;

procedure computeAverage(var x: raindata);
var
   d, sum: real;
   average: real;

begin
   reset(x);
   sum:= 0.0;
   while not eof(x) do
   
   begin
      read(x, d);
      sum := sum + d;
   end;
   
   average := sum/MAX;
   close(x);
   writeln('Average Rainfall: ', average:7:2);
end;

begin
   writeln('Enter the File Name: ');
   readln(filename);
   assign(rainfile, filename);
   writedata(rainfile);
   computeAverage(rainfile);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Enter the File Name:
rainfall.txt
Enter rainfall data:
34
Enter rainfall data:
45
Enter rainfall data:
56
Enter rainfall data:
78
Average Rainfall: 53.25

텍스트 파일

Pascal의 텍스트 파일은 각 줄이 줄 끝 마커로 끝나는 문자 줄로 구성됩니다. 다음과 같은 파일을 선언하고 정의 할 수 있습니다.

type
file-name = text;

일반 문자 파일과 텍스트 파일의 차이점은 텍스트 파일이 줄로 나뉘며 각 줄은 시스템에서 자동으로 삽입되는 특수 줄 끝 마커로 끝납니다. 다음 예제는 contact.txt라는 텍스트 파일을 만들고 작성합니다.

program exText;
var
   filename, data: string;
   myfile: text;

begin
   writeln('Enter the file name: ');
   readln(filename);
   
   assign(myfile, filename);
   rewrite(myfile);
   
   writeln(myfile, 'Note to Students: ');
   writeln(myfile, 'For details information on Pascal Programming');
   writeln(myfile, 'Contact: Tutorials Point');
   writeln('Completed writing'); 
   
   close(myfile);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Enter the file name:
contact.txt 
Completed writing

파일에 추가

파일에 추가한다는 것은 파일을 덮어 쓰지 않고 이미 일부 데이터가있는 기존 파일에 쓰는 것을 의미합니다. 다음 프로그램은 이것을 설명합니다-

program exAppendfile;
var
   myfile: text;
   info: string;

begin
   assign(myfile, 'contact.txt');
   append(myfile);
   
   writeln('Contact Details');
   writeln('[email protected]');
   close(myfile);
   
   (* let us read from this file *)
   assign(myfile, 'contact.txt');
   reset(myfile);
   while not eof(myfile) do
   
   begin
      readln(myfile, info);
      writeln(info);
   end;
   close(myfile);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Contact Details
[email protected]
Note to Students:
For details information on Pascal Programming
Contact: Tutorials Point

파일 처리 기능

Free Pascal은 파일 처리를 위해 다음과 같은 기능 / 절차를 제공합니다.

Sr. 아니. 기능 이름 및 설명
1

procedure Append(var t: Text);

추가 모드에서 파일을 엽니 다.

2

procedure Assign(out f: file; const Name:);

파일에 이름을 지정합니다.

procedure Assign(out f: file; p: PChar);

파일에 이름을 지정합니다.

4

procedure Assign(out f: file; c: Char);

파일에 이름을 지정합니다.

5

procedure Assign(out f: TypedFile; const Name:);

파일에 이름을 지정합니다.

6

procedure Assign(out f: TypedFile; p: PChar);

파일에 이름을 지정합니다.

7

procedure Assign(out f: TypedFile; c: Char);

파일에 이름을 지정합니다.

8

procedure Assign(out t: Text; const s:);

파일에 이름을 지정합니다.

9

procedure Assign(out t: Text; p: PChar);

파일에 이름을 지정합니다.

10

procedure Assign(out t: Text; c: Char);

파일에 이름을 지정합니다.

11

procedure BlockRead(var f: file; var Buf; count: Int64; var Result: Int64);

파일에서 메모리로 데이터를 읽습니다.

12

procedure BlockRead(var f: file; var Buf; count: LongInt; var Result: LongInt);

파일에서 메모리로 데이터를 읽습니다.

13

procedure BlockRead(var f: file; var Buf; count: Cardinal; var Result: Cardinal);

파일에서 메모리로 데이터를 읽습니다.

14

procedure BlockRead(var f: file; var Buf; count: Word; var Result: Word);

파일에서 메모리로 데이터를 읽습니다.

15

procedure BlockRead(var f: file; var Buf; count: Word; var Result: Integer);

파일에서 메모리로 데이터를 읽습니다.

16

procedure BlockRead(var f: file; var Buf; count: Int64);

파일에서 메모리로 데이터를 읽습니다.

17

procedure BlockWrite(var f: file; const Buf; Count: Int64; var Result: Int64);

메모리의 데이터를 파일에 씁니다.

18

procedure BlockWrite(var f: file; const Buf; Count: LongInt; var Result: LongInt);

메모리의 데이터를 파일에 씁니다.

19

procedure BlockWrite(var f: file; const Buf; Count: Cardinal; var Result: Cardinal);

메모리의 데이터를 파일에 씁니다.

20

procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Word);

메모리의 데이터를 파일에 씁니다.

21

procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Integer);

메모리의 데이터를 파일에 씁니다.

22

procedure BlockWrite(var f: file; const Buf; Count: LongInt);

메모리의 데이터를 파일에 씁니다.

23

procedure Close(var f: file);

파일을 닫습니다.

24

procedure Close(var t: Text);

파일을 닫습니다.

25

function EOF(var f: file):Boolean;

파일의 끝을 확인합니다.

26

function EOF(var t: Text):Boolean;

파일의 끝을 확인합니다.

27

function EOF: Boolean;

파일의 끝을 확인합니다.

28

function EOLn(var t: Text):Boolean;

줄 끝 확인

29

function EOLn: Boolean;

줄 끝 확인

30

procedure Erase(var f: file);

디스크에서 파일 삭제

31

procedure Erase(var t: Text);

디스크에서 파일 삭제

32

function FilePos( var f: file):Int64;

파일 내 위치

33

function FileSize(var f: file):Int64;

파일 크기

34

procedure Flush(var t: Text);

디스크에 파일 버퍼 쓰기

35

function IOResult: Word;

마지막 파일 IO 작업의 결과를 반환합니다.

36

procedure Read(var F: Text; Args: Arguments);

파일에서 변수로 읽습니다.

37

procedure Read(Args: Arguments);

파일에서 변수로 읽습니다.

38

procedure ReadLn(var F: Text; Args: Arguments);

파일에서 변수로 읽고 다음 줄로 이동

39

procedure ReadLn(Args: Arguments);

파일에서 변수로 읽고 다음 줄로 이동

40

procedure Rename(var f: file; const s:);

디스크의 파일 이름 변경

41

procedure Rename(var f: file; p: PChar);

디스크의 파일 이름 변경

42

procedure Rename(var f: file; c: Char);

디스크의 파일 이름 변경

43

procedure Rename(var t: Text; const s);

디스크의 파일 이름 바꾸기

44

procedure Rename(var t: Text; p: PChar);

디스크의 파일 이름 변경

45

procedure Rename( var t: Text; c: Char);

디스크의 파일 이름 변경

46

procedure Reset(var f: file; l: LongInt);

읽기 위해 파일을 엽니 다.

47

procedure Reset(var f: file);

읽기 위해 파일을 엽니 다.

48

procedure Reset(var f: TypedFile);

읽기 위해 파일을 엽니 다.

49

procedure Reset(var t: Text);

읽기 위해 파일을 엽니 다.

50

procedure Rewrite(var f: file; l: LongInt);

쓰기 위해 파일을 엽니 다.

51

procedure Rewrite(var f: file);

쓰기 위해 파일을 엽니 다.

52

procedure Rewrite(var f: TypedFile);

쓰기 위해 파일을 엽니 다.

53

procedure Rewrite(var t: Text);

쓰기 위해 파일을 엽니 다.

54

procedure Seek(var f: file; Pos: Int64);

파일 위치 설정

55

function SeekEOF(var t: Text):Boolean;

파일 위치를 파일 끝으로 설정

56

function SeekEOF: Boolean;

파일 위치를 파일 끝으로 설정

57

function SeekEOLn(var t: Text):Boolean;

파일 위치를 줄 끝으로 설정

58

function SeekEOLn: Boolean;

파일 위치를 줄 끝으로 설정

59

procedure SetTextBuf(var f: Text; var Buf);

파일 버퍼 크기 설정

60

procedure SetTextBuf(var f: Text; var Buf; Size: SizeInt);

파일 버퍼 크기 설정

61

procedure Truncate(var F: file);

위치에서 파일 자르기

62

procedure Write(Args: Arguments);

파일에 변수 쓰기

63

procedure Write(var F: Text; Args: Arguments);

파일에 변수 쓰기

64

procedure Writeln(Args: Arguments);

파일에 변수를 쓰고 개행을 추가합니다.

65

procedure WriteLn(var F: Text; Args: Arguments);

파일에 변수를 쓰고 개행을 추가합니다.

이 장에서는 파스칼의 동적 메모리 관리에 대해 설명합니다. 파스칼 프로그래밍 언어는 메모리 할당 및 관리를위한 여러 기능을 제공합니다.

동적으로 메모리 할당

프로그래밍을하는 동안 배열의 크기를 알고 있다면 쉽게 배열로 정의 할 수 있습니다. 예를 들어, 어떤 사람의 이름을 저장하려면 최대 100 자까지 입력 할 수 있으므로 다음과 같이 정의 할 수 있습니다.

var
name: array[1..100] of char;

그러나 이제 저장해야하는 텍스트의 길이에 대해 전혀 모르는 상황 (예 : 주제에 대한 자세한 설명을 저장하려는 경우)을 고려해 보겠습니다. 여기에서는 필요한 메모리 양을 정의하지 않고 문자열에 대한 포인터를 정의해야합니다.

파스칼은 절차를 제공합니다 new포인터 변수를 만듭니다.

program exMemory;
var
name: array[1..100] of char;
description: ^string;

begin
   name:= 'Zara Ali';
   
   new(description);
      if not assigned(description) then
         writeln(' Error - unable to allocate required memory')
      else
         description^ := 'Zara ali a DPS student in class 10th';
   writeln('Name = ', name );
   writeln('Description: ', description^ );
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

이제 나중에 참조 할 특정 바이트 수로 포인터를 정의해야하는 경우 다음을 사용해야합니다. getmem 기능 또는 getmem 다음 구문이있는 절차-

procedure Getmem(
   out p: pointer;
   Size: PtrUInt
);

function GetMem(
   size: PtrUInt
):pointer;

이전 예에서 우리는 문자열에 대한 포인터를 선언했습니다. 문자열의 최대 값은 255 바이트입니다. 실제로 그렇게 많은 공간이 필요하지 않거나 바이트 측면에서 더 큰 공간이 필요하지 않은 경우 getmem 하위 프로그램에서이를 지정할 수 있습니다. getmem을 사용하여 이전 예제를 다시 작성해 보겠습니다 .

program exMemory;
var
name: array[1..100] of char;
description: ^string;

begin
   name:= 'Zara Ali';
   
   description := getmem(200);
      if not assigned(description) then
         writeln(' Error - unable to allocate required memory')
      else
         description^ := 'Zara ali a DPS student in class 10th';
   writeln('Name = ', name );
   writeln('Description: ', description^ );
   
   freemem(description);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

따라서 완전한 제어가 가능하며 일단 크기를 정의하면 크기를 변경할 수없는 배열과 달리 메모리를 할당하면서 모든 크기 값을 전달할 수 있습니다.

메모리 크기 조정 및 해제

프로그램이 나오면 운영 체제는 프로그램에서 할당 한 모든 메모리를 자동으로 해제하지만 더 이상 메모리가 필요하지 않을 때 좋은 방법으로 해당 메모리를 해제해야합니다.

파스칼은 절차를 제공합니다 dispose 프로 시저를 사용하여 동적으로 생성 된 변수를 해제하려면 new. 다음을 사용하여 메모리를 할당 한 경우 getmem 하위 프로그램을 사용하려면 하위 프로그램을 사용해야합니다. freemem이 메모리를 해제합니다. freemem 서브 프로그램은 다음과 같은 구문을 가지고 -

procedure Freemem(
   p: pointer;
  Size: PtrUInt
);

function Freemem(
   p: pointer
):PtrUInt;

또는 ReAllocMem 함수를 호출하여 할당 된 메모리 블록의 크기를 늘리거나 줄일 수 있습니다 . 위의 프로그램을 다시 한번 확인하고 ReAllocMemfreemem 서브 프로그램 을 활용보겠습니다 . 다음은 ReAllocMem 의 구문입니다 -

function ReAllocMem(
   var p: pointer;
   Size: PtrUInt
):pointer;

다음은 ReAllocMemfreemem 하위 프로그램을 사용하는 예입니다.

program exMemory;
var
name: array[1..100] of char;
description: ^string;
desp: string;

begin
   name:= 'Zara Ali';
   desp := 'Zara ali a DPS student.';
   
   description := getmem(30);
      if not assigned(description) then
         writeln('Error - unable to allocate required memory')
      else
         description^ := desp;

   (* Suppose you want to store bigger description *)
   description := reallocmem(description, 100);
   desp := desp + ' She is in class 10th.';
   description^:= desp; 
   
   writeln('Name = ', name );
   writeln('Description: ', description^ );
   
   freemem(description);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Name = Zara Ali
Description: Zara ali a DPS student. She is in class 10th

메모리 관리 기능

Pascal은 다양한 데이터 구조를 구현하고 Pascal에서 저수준 프로그래밍을 구현하는 데 사용되는 메모리 관리 기능을 제공합니다. 이러한 기능의 대부분은 구현에 따라 다릅니다. Free Pascal은 메모리 관리를 위해 다음과 같은 기능과 절차를 제공합니다.

SN 기능 이름 및 설명
1

function Addr(X: TAnytype):Pointer;

변수의 주소를 반환

2

function Assigned(P: Pointer):Boolean;

포인터가 유효한지 확인

function CompareByte(const buf1; const buf2; len: SizeInt):SizeInt;

바이트 당 2 개의 메모리 버퍼를 비교합니다.

4

function CompareChar(const buf1; const buf2; len: SizeInt):SizeInt;

바이트 당 2 개의 메모리 버퍼를 비교합니다.

5

function CompareDWord(const buf1; const buf2; len: SizeInt):SizeInt;

바이트 당 2 개의 메모리 버퍼를 비교합니다.

6

function CompareWord(const buf1; const buf2; len: SizeInt):SizeInt;

바이트 당 2 개의 메모리 버퍼를 비교합니다.

7

function Cseg: Word;

코드 세그먼트를 반환합니다.

8

procedure Dispose(P: Pointer);

동적으로 할당 된 메모리를 해제합니다.

9

procedure Dispose(P: TypedPointer; Des: TProcedure);

동적으로 할당 된 메모리를 해제합니다.

10

function Dseg: Word;

데이터 세그먼트를 반환합니다.

11

procedure FillByte(var x; count: SizeInt; value: Byte);

8 비트 패턴으로 메모리 영역 채우기

12

procedure FillChar( var x; count: SizeInt; Value: Byte|Boolean|Char);

특정 문자로 메모리 영역을 채 웁니다.

13

procedure FillDWord( var x; count: SizeInt; value: DWord);

메모리 영역을 32 비트 패턴으로 채 웁니다.

14

procedure FillQWord( var x; count: SizeInt; value: QWord);

메모리 영역을 64 비트 패턴으로 채 웁니다.

15 procedure FillWord( var x; count: SizeInt; Value: Word);

16 비트 패턴으로 메모리 영역 채우기

16

procedure Freemem( p: pointer; Size: PtrUInt);

할당 된 메모리 해제

17

procedure Freemem( p: pointer );

할당 된 메모리 해제

18

procedure Getmem( out p: pointer; Size: PtrUInt);

새 메모리 할당

19

procedure Getmem( out p: pointer);

새 메모리 할당

20

procedure GetMemoryManager( var MemMgr: TMemoryManager);

현재 메모리 관리자를 반환합니다.

21

function High( Arg: TypeOrVariable):TOrdinal;

열린 배열 또는 열거의 가장 높은 인덱스를 반환합니다.

22

function IndexByte( const buf; len: SizeInt; b: Byte):SizeInt;

메모리 범위에서 바이트 크기 값을 찾습니다.

23

function IndexChar( const buf; len: SizeInt; b: Char):SizeInt;

메모리 범위에서 문자 크기 값을 찾습니다.

24

function IndexDWord( const buf; len: SizeInt; b: DWord):SizeInt;

메모리 범위에서 DWord 크기 (32 비트) 값을 찾습니다.

25

function IndexQWord( const buf; len: SizeInt; b: QWord):SizeInt;

메모리 범위에서 QWord 크기 값을 찾습니다.

26

function Indexword( const buf; len: SizeInt; b: Word):SizeInt;

메모리 범위에서 단어 크기 값을 찾습니다.

27

function IsMemoryManagerSet: Boolean;

메모리 관리자가 설정되어 있습니까?

28

function Low( Arg: TypeOrVariable ):TOrdinal;

열린 배열 또는 열거의 가장 낮은 인덱스를 반환합니다.

29

procedure Move( const source; var dest; count: SizeInt );

메모리의 한 위치에서 다른 위치로 데이터를 이동합니다.

30

procedure MoveChar0( const buf1; var buf2; len: SizeInt);

첫 번째 0 문자까지 데이터를 이동합니다.

31

procedure New( var P: Pointer);

변수에 대해 동적으로 메모리 할당

32

procedure New( var P: Pointer; Cons: TProcedure);

변수에 대한 메모리를 동적으로 할당

33

function Ofs( var X ):LongInt;

변수의 오프셋을 반환합니다.

34

function ptr( sel: LongInt; off: LongInt):farpointer;

세그먼트와 오프셋을 포인터에 결합

35

function ReAllocMem( var p: pointer; Size: PtrUInt):pointer;

힙의 메모리 블록 크기를 조정합니다.

36

function Seg( var X):LongInt;

반품 구간

37

procedure SetMemoryManager( const MemMgr: TMemoryManager );

메모리 관리자를 설정합니다.

38

function Sptr: Pointer;

현재 스택 포인터를 반환합니다.

39

function Sseg: Word;

스택 세그먼트 레지스터 값을 반환합니다.

파스칼 프로그램은 단위라는 모듈로 구성 될 수 있습니다. 단위는 변수와 유형 선언, 명령문, 프로 시저 등으로 구성되는 일부 코드 블록으로 구성 될 수 있습니다. Pascal에는 많은 내장 단위가 있으며 Pascal은 프로그래머가 사용할 자체 단위를 정의하고 작성할 수 있도록합니다. 나중에 다양한 프로그램에서.

내장 장치 사용

내장 단위와 사용자 정의 단위는 모두 uses 절에 의해 프로그램에 포함됩니다. 우리는 이미 Pascal-Variants 튜토리얼 에서 변형 유닛을 사용했습니다 . 이 자습서에서는 사용자 정의 단위를 만들고 포함하는 방법에 대해 설명합니다. 그러나 먼저 내장 유닛을 포함하는 방법을 살펴 보겠습니다.crt 당신의 프로그램에서-

program myprog;
uses crt;

다음 예는 crt 단위 −

Program Calculate_Area (input, output);
uses crt;
var 
   a, b, c, s, area: real;

begin
   textbackground(white); (* gives a white background *)
   clrscr; (*clears the screen *)
   
   textcolor(green); (* text color is green *)
   gotoxy(30, 4); (* takes the pointer to the 4th line and 30th column) 
   
   writeln('This program calculates area of a triangle:');
   writeln('Area = area = sqrt(s(s-a)(s-b)(s-c))');
   writeln('S stands for semi-perimeter');
   writeln('a, b, c are sides of the triangle');
   writeln('Press any key when you are ready');
   
   readkey;
   clrscr;
   gotoxy(20,3);
   
   write('Enter a: ');
   readln(a);
   gotoxy(20,5);
   
   write('Enter b:');
   readln(b);
   gotoxy(20, 7);
   
   write('Enter c: ');
   readln(c);

   s := (a + b + c)/2.0;
   area := sqrt(s * (s - a)*(s-b)*(s-c));
   gotoxy(20, 9);
   
   writeln('Area: ',area:10:3);
   readkey;
end.

파스칼 튜토리얼의 시작 부분에서 사용했던 것과 동일한 프로그램으로, 변경 효과를 찾기 위해 컴파일하고 실행합니다.

파스칼 단위 생성 및 사용

유닛을 생성하려면 저장하려는 모듈 또는 서브 프로그램을 작성하고 다음을 사용하여 파일에 저장해야합니다. .pas신장. 이 파일의 첫 번째 줄은 unit 키워드로 시작하고 그 뒤에 단위 이름이 와야합니다. 예를 들면-

unit calculateArea;

다음은 파스칼 단위를 만드는 세 가지 중요한 단계입니다.

  • 파일 이름과 장치 이름은 정확히 일치해야합니다. 따라서 우리의 단위 calculateAreacalculateArea.pas 라는 파일에 저장 됩니다.

  • 다음 줄은 단일 키워드로 구성되어야합니다. interface. 이 줄 뒤에는이 단원에 포함될 모든 함수와 프로 시저에 대한 선언을 작성합니다.

  • 함수 선언 바로 뒤에 단어를 작성하십시오. implementation, 다시 키워드입니다. 키워드 구현을 포함하는 줄 뒤에 모든 하위 프로그램의 정의를 제공합니다.

다음 프로그램은 calculateArea라는 단위를 생성합니다.

unit CalculateArea;
interface

function RectangleArea( length, width: real): real;
function CircleArea(radius: real) : real;
function TriangleArea( side1, side2, side3: real): real;

implementation

function RectangleArea( length, width: real): real;
begin
   RectangleArea := length * width;
end;

function CircleArea(radius: real) : real;
const
   PI = 3.14159;
begin
   CircleArea := PI * radius * radius;
end;

function TriangleArea( side1, side2, side3: real): real;
var
   s, area: real;

begin
   s := (side1 + side2 + side3)/2.0;
   area := sqrt(s * (s - side1)*(s-side2)*(s-side3));
   TriangleArea := area;
end;

end.

다음으로 위에서 정의한 단위를 사용하는 간단한 프로그램을 작성해 보겠습니다.

program AreaCalculation;
uses CalculateArea,crt;

var
   l, w, r, a, b, c, area: real;

begin
   clrscr;
   l := 5.4;
   w := 4.7;
   area := RectangleArea(l, w);
   writeln('Area of Rectangle 5.4 x 4.7 is: ', area:7:3);

   r:= 7.0;
   area:= CircleArea(r);
   writeln('Area of Circle with radius 7.0 is: ', area:7:3);

   a := 3.0;
   b:= 4.0;
   c:= 5.0;
  
   area:= TriangleArea(a, b, c);
   writeln('Area of Triangle 3.0 by 4.0 by 5.0 is: ', area:7:3);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Area of Rectangle 5.4 x 4.7 is: 25.380
Area of Circle with radius 7.0 is: 153.938
Area of Triangle 3.0 by 4.0 by 5.0 is: 6.000

작성하는 대부분의 소프트웨어는 현재 날짜 및 시간을 반환하는 일부 형식의 날짜 함수를 구현해야합니다. 데이트는 일상 생활에서 너무나 많은 부분을 차지하여 생각없이 쉽게 작업 할 수 있습니다. Pascal은 또한 날짜를 쉽게 조작 할 수있는 강력한 날짜 산술 도구를 제공합니다. 그러나 이러한 함수의 실제 이름과 작동 방식은 컴파일러마다 다릅니다.

현재 날짜 및 시간 얻기

Pascal의 TimeToString 함수는 콜론 (:)으로 구분 된 형식으로 현재 시간을 제공합니다. 다음 예제는 현재 시간을 얻는 방법을 보여줍니다-

program TimeDemo;
uses sysutils;

begin
   writeln ('Current time : ',TimeToStr(Time));
end.

위의 코드가 컴파일되고 실행되면 다음 결과가 생성됩니다.

Current time : 18:33:08

그만큼 Date 함수는 현재 날짜를 반환합니다. TDateTime체재. TDateTime은 이중 값이며 일부 디코딩 및 형식 지정이 필요합니다. 다음 프로그램은 현재 날짜를 표시하기 위해 프로그램에서 사용하는 방법을 보여줍니다-

Program DateDemo;
uses sysutils;
var
   YY,MM,DD : Word;

begin
   writeln ('Date : ',Date);
   DeCodeDate (Date,YY,MM,DD);
   writeln (format ('Today is (DD/MM/YY): %d/%d/%d ',[dd,mm,yy]));
end.

위의 코드가 컴파일되고 실행되면 다음 결과가 생성됩니다.

Date: 4.111300000000000E+004
Today is (DD/MM/YY):23/7/2012

Now 함수는 현재 날짜와 시간을 반환합니다.

Program DatenTimeDemo;
uses sysutils;
begin
   writeln ('Date and Time at the time of writing : ',DateTimeToStr(Now));
end.

위의 코드가 컴파일되고 실행되면 다음 결과가 생성됩니다.

Date and Time at the time of writing : 23/7/2012 18:51:

Free Pascal은 다음과 같은 간단한 타임 스탬프 구조를 제공합니다. TTimeStamp, 형식은 다음과 같습니다.

type TTimeStamp = record
   Time: Integer;
   Date: Integer;
end;

다양한 날짜 및 시간 기능

Free Pascal은 다음과 같은 날짜 및 시간 기능을 제공합니다.

Sr. 아니. 기능 이름 및 설명
1

function DateTimeToFileDate(DateTime: TDateTime):LongInt;

DateTime 유형을 파일 날짜로 변환합니다.

2

function DateTimeToStr( DateTime: TDateTime):;

DateTime의 문자열 표현을 구성합니다.

function DateTimeToStr(DateTime: TDateTime; const FormatSettings: TFormatSettings):;

DateTime의 문자열 표현을 구성합니다.

4

procedure DateTimeToString(out Result: ;const FormatStr: ;const DateTime: TDateTime);

DateTime의 문자열 표현을 구성합니다.

5

procedure DateTimeToString(out Result: ; const FormatStr: ; const DateTime: TDateTime; const FormatSettings: TFormatSettings);

DateTime의 문자열 표현을 구성합니다.

6

procedure DateTimeToSystemTime(DateTime: TDateTime; out SystemTime: TSystemTime);

DateTime을 시스템 시간으로 변환합니다.

7

function DateTimeToTimeStamp( DateTime: TDateTime):TTimeStamp;DateTime을 타임 스탬프로 변환합니다.

8

function DateToStr(Date: TDateTime):;

날짜의 문자열 표현을 구성합니다.

9

function DateToStr(Date: TDateTime; const FormatSettings: TFormatSettings):;

날짜의 문자열 표현을 구성합니다.

10

function Date: TDateTime;

현재 날짜를 가져옵니다.

11

function DayOfWeek(DateTime: TDateTime):Integer;

요일을 가져옵니다.

12

procedure DecodeDate(Date: TDateTime; out Year: Word; out Month: Word; out Day: Word);

DateTime을 년 월 및 일로 디코딩

13

procedure DecodeTime(Time: TDateTime; out Hour: Word; out Minute: Word; out Second: Word; out MilliSecond: Word);

DateTime을 시간, 분 및 초로 디코딩합니다.

14

function EncodeDate(Year: Word; Month: Word; Day: Word):TDateTime;

년, 일, 월을 DateTime으로 인코딩

15

function EncodeTime(Hour: Word; Minute: Word; Second: Word; MilliSecond: Word):TDateTime;

시간, 분, 초를 DateTime으로 인코딩

16

function FormatDateTime(const FormatStr: ; DateTime: TDateTime):;

DateTime의 문자열 표현을 반환합니다.

17

function FormatDateTime(const FormatStr: ; DateTime: TDateTime; const FormatSettings: TFormatSettings):;

DateTime의 문자열 표현을 반환합니다.

18

function IncMonth(const DateTime: TDateTime; NumberOfMonths: Integer = 1):TDateTime;

월에 1 추가

19

function IsLeapYear(Year: Word):Boolean;

연도가 윤년인지 확인

20

function MSecsToTimeStamp(MSecs: Comp):TTimeStamp;

밀리 초 수를 타임 스탬프로 변환합니다.

21

function Now: TDateTime;

현재 날짜와 시간을 가져옵니다.

22

function StrToDateTime(const S:):TDateTime;

문자열을 DateTime으로 변환

23

function StrToDateTime(const s: ShortString; const FormatSettings: TFormatSettings):TDateTime;

문자열을 DateTime으로 변환

24

function StrToDateTime(const s: AnsiString; const FormatSettings: TFormatSettings):TDateTime;

문자열을 DateTime으로 변환

25

function StrToDate(const S: ShortString):TDateTime;

문자열을 날짜로 변환

26

function StrToDate(const S: Ansistring):TDateTime;

문자열을 날짜로 변환

27

function StrToDate(const S: ShortString; separator: Char):TDateTime;

문자열을 날짜로 변환

28

function StrToDate(const S: AnsiString; separator: Char):TDateTime;

문자열을 날짜로 변환

29

function StrToDate(const S: ShortString; const useformat: ; separator: Char):TDateTime;

문자열을 날짜로 변환

30

function StrToDate(const S: AnsiString; const useformat: ; separator: Char):TDateTime;

문자열을 날짜로 변환

31

function StrToDate(const S: PChar; Len: Integer; const useformat: ; separator: Char = #0):TDateTime;

문자열을 날짜로 변환

32

function StrToTime(const S: Shortstring):TDateTime;

문자열을 시간으로 변환

33

function StrToTime(const S: Ansistring):TDateTime;

문자열을 시간으로 변환

34

function StrToTime(const S: ShortString; separator: Char):TDateTime;

문자열을 시간으로 변환

35

function StrToTime(const S: AnsiString; separator: Char):TDateTime;

문자열을 시간으로 변환

36

function StrToTime(const S: ; FormatSettings: TFormatSettings):TDateTime;

문자열을 시간으로 변환

37

function StrToTime(const S: PChar; Len: Integer; separator: Char = #0):TDateTime;

문자열을 시간으로 변환

38

function SystemTimeToDateTime(const SystemTime: TSystemTime):TDateTime;

시스템 시간을 datetime으로 변환

39

function TimeStampToDateTime(const TimeStamp: TTimeStamp):TDateTime;

타임 스탬프를 DateTime으로 변환

40

function TimeStampToMSecs(const TimeStamp: TTimeStamp):comp;

타임 스탬프를 밀리 초 수로 변환합니다.

41

function TimeToStr(Time: TDateTime):;

시간의 문자열 표현을 반환합니다.

42

function TimeToStr(Time: TDateTime; const FormatSettings: TFormatSettings):;

시간의 문자열 표현을 반환합니다.

43

function Time: TDateTime;

현재 시간 가져 오기

다음 예제는 위의 일부 기능의 사용을 보여줍니다-

Program DatenTimeDemo;
uses sysutils;
var
year, month, day, hr, min, sec, ms: Word;

begin
   writeln ('Date and Time at the time of writing : ',DateTimeToStr(Now));
   writeln('Today is ',LongDayNames[DayOfWeek(Date)]);
   writeln;
   writeln('Details of Date: ');
   
   DecodeDate(Date,year,month,day);
   writeln (Format ('Day: %d',[day]));
   writeln (Format ('Month: %d',[month]));
   writeln (Format ('Year: %d',[year]));
   writeln;
   writeln('Details of Time: ');
   
   DecodeTime(Time,hr, min, sec, ms);
   writeln (format('Hour: %d:',[hr]));
   writeln (format('Minutes: %d:',[min]));
   writeln (format('Seconds: %d:',[sec]));
   writeln (format('Milliseconds: %d:',[hr]));
end.

위의 코드를 컴파일하고 실행하면 다음과 같은 결과가 나왔습니다.

Date and Time at the time of writing : 7/24/2012 8:26:
Today is Tuesday
Details of Date:
Day:24
Month:7
Year: 2012
Details of Time:
Hour: 8
Minutes: 26
Seconds: 21
Milliseconds: 8

우리는 우리의 우주가 태양, 지구, 달 등과 같은 다른 물체로 만들어진 것을 상상할 수 있습니다. 마찬가지로, 우리는 자동차가 바퀴, 스티어링, 기어 등과 같은 다른 물체로 만들어진 것을 상상할 수 있습니다. 같은 방식으로, 객체 지향 프로그래밍 개념이 있습니다. 모든 것을 객체로 가정하고 다른 객체를 사용하여 소프트웨어를 구현합니다. Pascal에는 실제 객체를 구현하는 데 사용되는 두 가지 구조 데이터 유형이 있습니다.

  • 개체 유형
  • 클래스 유형

객체 지향 개념

자세히 알아보기 전에 객체 지향 파스칼과 관련된 중요한 파스칼 용어를 정의하겠습니다.

  • Object− 객체는 레코드와 같은 필드를 포함하는 특별한 종류의 레코드입니다. 그러나 레코드와 달리 개체는 개체의 일부로 프로 시저 및 기능을 포함합니다. 이러한 프로 시저 및 함수는 개체 유형과 관련된 메서드에 대한 포인터로 유지됩니다.

  • Class− Class는 Object와 거의 같은 방식으로 정의되지만 생성되는 방식에 차이가 있습니다. 클래스는 프로그램의 힙에 할당되는 반면 객체는 스택에 할당됩니다. 개체 자체가 아니라 개체에 대한 포인터입니다.

  • Instantiation of a class− 인스턴스화는 해당 클래스 유형의 변수를 생성하는 것을 의미합니다. 클래스는 포인터 일 뿐이므로 클래스 타입의 변수를 선언하면 전체 객체가 아닌 포인터에 대해서만 메모리가 할당됩니다. 생성자 중 하나를 사용하여 인스턴스화 될 때만 메모리가 개체에 할당됩니다. 클래스의 인스턴스를 '오브젝트'라고도하지만 오브젝트 파스칼 오브젝트와 혼동하지 마십시오. 이 튜토리얼에서 우리는 Pascal 객체에 대해 'Object'를 작성하고 개념적 객체 또는 클래스 인스턴스에 대해 'object'를 작성합니다.

  • Member Variables − 이들은 클래스 또는 객체 내부에 정의 된 변수입니다.

  • Member Functions − 이들은 클래스 또는 객체 내부에 정의 된 함수 또는 절차이며 객체 데이터에 액세스하는 데 사용됩니다.

  • Visibility of Members− 객체 또는 클래스의 구성원을 필드라고도합니다. 이 필드는 가시성이 다릅니다. 가시성은 구성원의 접근성, 즉 이러한 구성원이 액세스 할 수있는 정확한 위치를 나타냅니다. 개체에는 공개, 비공개 및 보호의 세 가지 가시성 수준이 있습니다. 클래스에는 공개, 비공개, 엄격 비공개, 보호 및 게시의 다섯 가지 가시성 유형이 있습니다. 가시성을 자세히 논의하겠습니다.

  • Inheritance− 클래스가 부모 클래스의 기존 기능을 상속하여 정의되면 상속되었다고합니다. 여기서 자식 클래스는 부모 클래스의 멤버 함수와 변수를 모두 또는 일부 상속합니다. 객체는 상속 될 수도 있습니다.

  • Parent Class− 다른 클래스에 의해 상속 된 클래스. 이를 기본 클래스 또는 수퍼 클래스라고도합니다.

  • Child Class− 다른 클래스에서 상속되는 클래스. 이를 하위 클래스 또는 파생 클래스라고도합니다.

  • Polymorphism− 동일한 기능을 다른 용도로 사용할 수있는 객체 지향 개념입니다. 예를 들어 함수 이름은 동일하게 유지되지만 인수 개수가 다를 수 있으며 다른 작업을 수행 할 수 있습니다. 파스칼 클래스는 다형성을 구현합니다. 객체는 다형성을 구현하지 않습니다.

  • Overloading− 연산자의 일부 또는 전체가 인수 유형에 따라 다른 구현을 갖는 다형성의 한 유형입니다. 마찬가지로 함수는 다른 구현으로 오버로드 될 수도 있습니다. 파스칼 클래스는 오버로딩을 구현하지만 오브젝트는 그렇지 않습니다.

  • Data Abstraction − 구현 세부 사항이 숨겨져있는 (추상화 된) 데이터 표현.

  • Encapsulation − 모든 데이터와 멤버 함수를 함께 캡슐화하여 객체를 형성하는 개념을 의미합니다.

  • Constructor − 클래스 또는 Object로부터 객체 형성이있을 때마다 자동으로 호출되는 특별한 유형의 함수를 말합니다.

  • Destructor − Object 또는 Class가 삭제되거나 범위를 벗어날 때마다 자동으로 호출되는 특수한 유형의 함수를 의미합니다.

파스칼 객체 정의

객체는 유형 선언을 사용하여 선언됩니다. 객체 선언의 일반적인 형식은 다음과 같습니다.

type object-identifier = object  
   private
   field1 : field-type;  
   field2 : field-type;  
   ...
   public
   procedure proc1;  
   function f1(): function-type;
   end;  
var objectvar : object-identifier;

두 개의 정수형 데이터 멤버가있는 Rectangle 객체를 정의하겠습니다. lengthwidth 이러한 데이터 멤버를 조작하는 일부 멤버 함수와 사각형을 그리는 프로 시저가 있습니다.

type 
   Rectangle = object  
   private  
      length, width: integer; 
   
   public  
      constructor init;  
      destructor done;  
      
      procedure setlength(l: inteter);  
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

개체를 만든 후 해당 개체와 관련된 멤버 함수를 호출 할 수 있습니다. 하나의 멤버 함수는 관련 객체의 멤버 변수 만 처리 할 수 ​​있습니다.

다음 예제는 두 사각형 객체의 길이와 너비를 설정하고 멤버 함수를 호출하여 그리는 방법을 보여줍니다.

r1.setlength(3);
r1.setwidth(7);

writeln(' Draw a rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
r1.draw;
new(pr1);
pr1^.setlength(5);
pr1^.setwidth(4);

writeln(' Draw a rectangle: ', pr1^.getlength(), ' by ' ,pr1^.getwidth());
pr1^.draw;
dispose(pr1);

다음은 파스칼에서 객체를 사용하는 방법을 보여주는 완전한 예입니다.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   
   public  
      procedure setlength(l: integer);
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;  
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
     for j:= 1 to width do
        write(' * ');
     writeln;
   end;
end;

begin
   r1.setlength(3);
   r1.setwidth(7);
   
   writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   new(pr1);
   pr1^.setlength(5);
   pr1^.setwidth(4);
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
   pr1^.draw;
   dispose(pr1);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *

개체 구성원의 가시성

가시성은 오브젝트 멤버의 액세스 가능성을 나타냅니다. 파스칼 객체 멤버는 세 가지 유형의 가시성을 가지고 있습니다.

Sr. 아니요 가시성 및 접근성
1

Public

멤버는 프로그램 단위 외부의 다른 단위에서 사용할 수 있습니다.

2

Private

구성원은 현재 단위에서만 액세스 할 수 있습니다.

Protected

멤버는 상위 개체의 하위 개체에만 사용할 수 있습니다.

기본적으로 개체의 필드와 메서드는 공용이며 현재 단위 외부로 내보내집니다.

파스칼 객체를위한 생성자와 소멸자 −

Constructors객체가 생성 될 때마다 자동으로 호출되는 특수한 유형의 메서드입니다. 키워드 생성자로 메서드를 선언하는 것만으로 Pascal에서 생성자를 만듭니다. 일반적으로 메서드 이름은 Init이지만 유효한 식별자를 제공 할 수 있습니다. 생성자 함수에 원하는만큼 인수를 전달할 수 있습니다.

Destructors개체를 파괴하는 동안 호출되는 메서드입니다. 소멸자 메서드는 생성자가 만든 모든 메모리 할당을 파괴합니다.

다음 예제는 Rectangle 클래스에 대한 생성자 및 소멸자를 제공합니다.이 클래스는 객체 생성시 사각형의 길이와 너비를 초기화하고 범위를 벗어나면 제거합니다.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   public  
      constructor init(l, w: integer);
      destructor done;
      
      procedure setlength(l: integer);
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;

var
   r1: Rectangle;
   pr1: ^Rectangle;

constructor Rectangle.init(l, w: integer);
begin
   length := l;
   width := w;
end;

destructor Rectangle.done;
begin
   writeln(' Desctructor Called');
end; 

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;  
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
   end;
end;

begin
   r1.init(3, 7);
   writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   new(pr1, init(5, 4));
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ',pr1^.getwidth());
   pr1^.draw;
   pr1^.init(7, 9);
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
   pr1^.draw;
   dispose(pr1);
   r1.done;
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *
Draw a rectangle: 7 by 9
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
Destructor Called

파스칼 객체의 상속

파스칼 객체는 선택적으로 부모 객체에서 상속 할 수 있습니다. 다음 프로그램은 파스칼 객체의 상속을 보여줍니다. 이름이 다른 개체를 만들어 보겠습니다.TableTop, Rectangle 객체에서 상속됩니다.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   public  
      procedure setlength(l: integer);  
      function getlength(): integer;  
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      procedure draw;
end;

TableTop = object (Rectangle)
   private
     material: string;
   public
      function getmaterial(): string;
      procedure setmaterial( m: string);
      procedure displaydetails;
      procedure draw;
end;

var
   tt1: TableTop;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth():integer;
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
  end;
end;

function TableTop.getmaterial(): string;
begin
   getmaterial := material;
end;

procedure TableTop.setmaterial( m: string);
begin
   material := m;
end;

procedure TableTop.displaydetails;
begin
   writeln('Table Top: ', self.getlength(), ' by ' , self.getwidth());
   writeln('Material: ', self.getmaterial());
end;

procedure TableTop.draw();
var
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
   writeln;
   end;
   writeln('Material: ', material);
end;

begin
   tt1.setlength(3);
   tt1.setwidth(7);
   tt1.setmaterial('Wood');
   tt1.displaydetails();
   writeln;
   writeln('Calling the Draw method');
   tt1.draw();
end.

다음은 기록해야 할 중요한 사항입니다.

  • Tabletop 개체 는 Rectangle 개체의 모든 멤버를 상속했습니다.

  • TableTop 에도 그리기 방법이 있습니다. 때 그리기 방법이 사용이라고 탁상 객체를 탁상의 무승부가 호출됩니다.

  • 라는 암시 적 인스턴스가 있습니다. self 개체의 현재 인스턴스를 참조합니다.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Table Top: 3 by 7
Material: Wood

Calling the Draw Method 
* * * * * * *
* * * * * * *
* * * * * * *
Material: Wood

파스칼 객체가 객체 지향 패러다임의 몇 가지 특성을 보여줍니다. 캡슐화, 데이터 숨김 및 상속을 구현하지만 제한 사항도 있습니다. 예를 들어, 파스칼 오브젝트는 다형성에 참여하지 않습니다. 따라서 클래스는 프로그램, 특히 GUI 기반 소프트웨어에서 적절한 객체 지향 동작을 구현하는 데 널리 사용됩니다.

클래스는 객체와 거의 같은 방식으로 정의되지만 객체 자체가 아니라 객체에 대한 포인터입니다. 기술적으로 이것은 클래스가 프로그램의 힙에 할당되고 객체가 스택에 할당됨을 의미합니다. 즉, 변수를 객체 유형으로 선언하면 스택에서 객체의 크기만큼 많은 공간을 차지하지만 클래스 유형의 변수를 선언하면 항상 포인터의 크기를 차지합니다. 스택에. 실제 클래스 데이터는 힙에 있습니다.

파스칼 클래스 정의

클래스는 유형 선언을 사용하여 객체와 동일한 방식으로 선언됩니다. 클래스 선언의 일반적인 형식은 다음과 같습니다.

type class-identifier = class  
   private
      field1 : field-type;  
      field2 : field-type;  
        ...
   
   public
      constructor create();
      procedure proc1;  
      function f1(): function-type;
end;  
var classvar : class-identifier;

중요한 사항에 따라 주목할 가치가 있습니다.

  • 클래스 정의는 프로그램의 유형 선언 부분에만 있어야합니다.

  • 클래스는 class 예어.

  • 필드는 클래스의 각 인스턴스에 존재하는 데이터 항목입니다.

  • 메서드는 클래스 정의 내에서 선언됩니다.

  • 라는 미리 정의 된 생성자가 있습니다. Create루트 클래스에서. 모든 추상 클래스와 모든 구체적인 클래스는 Root의 후손이므로 모든 클래스에는 최소한 하나의 생성자가 있습니다.

  • 라는 미리 정의 된 소멸자가 있습니다. Destroy루트 클래스에서. 모든 추상 클래스와 모든 구체적인 클래스는 Root의 후손이므로 모든 클래스에는 적어도 하나의 소멸자가 있습니다.

두 개의 정수형 데이터 멤버, 즉 길이와 너비, 이러한 데이터 멤버를 조작하는 일부 멤버 함수와 사각형을 그리는 프로 시저가있는 Rectangle 클래스를 정의 해 보겠습니다.

type
   Rectangle = class
   private
      length, width: integer;
   
   public
      constructor create(l, w: integer);
      procedure setlength(l: integer);
      function getlength(): integer;
      procedure setwidth(w: integer);
      function getwidth(): integer;
      procedure draw;
end;

직사각형 클래스의 인스턴스를 만들고 직사각형을 그리는 완전한 프로그램을 작성해 보겠습니다. 이것은 파스칼 오브젝트에 대해 논의 할 때 사용한 것과 동일한 예입니다. 두 프로그램은 다음을 제외하고 거의 동일합니다.

  • 클래스를 사용하려면 {$ mode objfpc} 지시문을 포함해야합니다.

  • 생성자를 사용하려면 {$ m +} 지시문을 포함해야합니다.

  • 클래스 인스턴스화는 객체 인스턴스화와 다릅니다. 변수를 선언하는 것만으로는 인스턴스를위한 공간이 생성되지 않으며 생성자 create를 사용하여 메모리를 할당합니다.

다음은 완전한 예입니다.

{$mode objfpc} // directive to be used for defining classes {$m+}		   // directive to be used for using constructor

program exClass;
type
   Rectangle = class
   private
      length, width: integer;
   
   public
      constructor create(l, w: integer);
      procedure setlength(l: integer);
      
      function getlength(): integer;
      procedure setwidth(w: integer);
      
      function getwidth(): integer;
      procedure draw;
end;
var
   r1: Rectangle;

constructor Rectangle.create(l, w: integer);
begin
   length := l;
   width := w;
end;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
   end;
end;

begin
   r1:= Rectangle.create(3, 7);
   
   writeln(' Draw Rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   r1.setlength(4);
   r1.setwidth(6);
   
   writeln(' Draw Rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Draw Rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw Rectangle: 4 by 6
* * * * * * 
* * * * * * 
* * * * * * 
* * * * * *

학급 구성원의 가시성

가시성은 클래스 멤버의 액세스 가능성을 나타냅니다. 파스칼 클래스 멤버는 다섯 가지 유형의 가시성을 가지고 있습니다.

Sr. 아니요 가시성 및 접근성
1

Public

이러한 구성원은 항상 액세스 할 수 있습니다.

2

Private

이러한 멤버는 클래스 정의가 포함 된 모듈 또는 단위에서만 액세스 할 수 있습니다. 클래스 메서드 내부 또는 외부에서 액세스 할 수 있습니다.

Strict Private

이러한 멤버는 클래스 자체의 메서드에서만 액세스 할 수 있습니다. 같은 단위의 다른 클래스 또는 하위 클래스는 액세스 할 수 없습니다.

4

Protected

이 멤버는 다른 모듈에서 구현 된 경우에도 하위 유형에 액세스 할 수 있다는 점을 제외하면 private과 동일합니다.

5

Published

이는 Public과 동일하지만 컴파일러가 {$ M +} 상태에있는 경우 이러한 클래스의 자동 스트리밍에 필요한 유형 정보를 생성합니다. 게시 된 섹션에 정의 된 필드는 클래스 유형이어야합니다.

파스칼 클래스의 생성자와 소멸자

생성자는 객체가 생성 될 때마다 자동으로 호출되는 특수 메서드입니다. 따라서 생성자 함수를 통해 많은 것을 초기화하여이 동작을 최대한 활용합니다.

Pascal은 생성자를 정의하기 위해 create ()라는 특수 함수를 제공합니다. 생성자 함수에 원하는만큼 인수를 전달할 수 있습니다.

다음 예제는 Books라는 클래스에 대한 하나의 생성자를 만들고 개체 생성시 책의 가격과 제목을 초기화합니다.

program classExample;

{$MODE OBJFPC} //directive to be used for creating classes
{$M+} //directive that allows class constructors and destructors
type
   Books = Class 
   private 
      title : String; 
      price: real;
   
   public
      constructor Create(t : String; p: real); //default constructor
      
      procedure setTitle(t : String); //sets title for a book
      function getTitle() : String; //retrieves title
      
      procedure setPrice(p : real); //sets price for a book
      function getPrice() : real; //retrieves price
      
      procedure Display(); // display details of a book
end;
var
   physics, chemistry, maths: Books;

//default constructor 
constructor Books.Create(t : String; p: real);
begin
   title := t;
   price := p;
end;

procedure Books.setTitle(t : String); //sets title for a book
begin
   title := t;
end;

function Books.getTitle() : String; //retrieves title
begin
   getTitle := title;
end;

procedure Books.setPrice(p : real); //sets price for a book
begin
   price := p;
end;

function Books.getPrice() : real; //retrieves price
begin
   getPrice:= price;
end;

procedure Books.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price:5:2);
end;

begin 
   physics := Books.Create('Physics for High School', 10);
   chemistry := Books.Create('Advanced Chemistry', 15);
   maths := Books.Create('Algebra', 7);
   
   physics.Display;
   chemistry.Display;
   maths.Display;
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Title: Physics for High School
Price: 10
Title: Advanced Chemistry
Price: 15
Title: Algebra
Price: 7

create라는 암시 적 생성자와 마찬가지로 클래스에 사용 된 모든 리소스를 해제 할 수있는 암시 적 소멸자 메서드 destroy도 있습니다.

계승

파스칼 클래스 정의는 부모 클래스 정의에서 선택적으로 상속 할 수 있습니다. 구문은 다음과 같습니다-

type
childClas-identifier = class(baseClass-identifier) 
< members >
end;

다음 예제는 Books 클래스를 상속하고 요구 사항에 따라 더 많은 기능을 추가하는 novels 클래스를 제공합니다.

program inheritanceExample;

{$MODE OBJFPC} //directive to be used for creating classes
{$M+} //directive that allows class constructors and destructors

type
   Books = Class 
   protected 
      title : String; 
      price: real;
   
   public
      constructor Create(t : String; p: real); //default constructor
      
      procedure setTitle(t : String); //sets title for a book
      function getTitle() : String; //retrieves title
      
      procedure setPrice(p : real); //sets price for a book
      function getPrice() : real; //retrieves price
      
      procedure Display(); virtual; // display details of a book
end;
(* Creating a derived class *)

type
   Novels = Class(Books)
   private
      author: String;
   
   public
      constructor Create(t: String); overload;
      constructor Create(a: String; t: String; p: real); overload;
      
      procedure setAuthor(a: String); // sets author for a book
      function getAuthor(): String; // retrieves author name
      
      procedure Display(); override;
end;
var
   n1, n2: Novels;

//default constructor 
constructor Books.Create(t : String; p: real);
begin
   title := t;
   price := p;
end;

procedure Books.setTitle(t : String); //sets title for a book
begin
   title := t;
end;

function Books.getTitle() : String; //retrieves title
begin
   getTitle := title;
end;

procedure Books.setPrice(p : real); //sets price for a book
begin
   price := p;
end;

function Books.getPrice() : real; //retrieves price
begin
   getPrice:= price;
end;

procedure Books.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price);
end;

(* Now the derived class methods  *)
constructor Novels.Create(t: String);
begin
   inherited Create(t, 0.0);
   author:= ' ';
end;

constructor Novels.Create(a: String; t: String; p: real);
begin
   inherited Create(t, p);
   author:= a;
end;

procedure Novels.setAuthor(a : String); //sets author for a book
begin
   author := a;
end;

function Novels.getAuthor() : String; //retrieves author
begin
   getAuthor := author;
end;

procedure Novels.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price:5:2);
   writeln('Author: ', author);
end;

begin 
   n1 := Novels.Create('Gone with the Wind');
   n2 := Novels.Create('Ayn Rand','Atlas Shrugged', 467.75);
   n1.setAuthor('Margaret Mitchell');
   n1.setPrice(375.99);
   n1.Display;
   n2.Display;
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Title: Gone with the Wind
Price: 375.99
Author: Margaret Mitchell
Title: Atlas Shrugged
Price: 467.75
Author: Ayn Rand

중요한 사항에 따라 주목할 가치가 있습니다.

  • Books 클래스의 구성원은 protected 시계.

  • Novels 클래스에는 두 개의 생성자가 있으므로 overload 연산자는 함수 오버로딩에 사용됩니다.

  • Books.Display 프로 시저가 선언되었습니다. virtual, Novels 클래스의 동일한 메서드가 override 그것.

  • Novels.Create 생성자는 다음을 사용하여 기본 클래스 생성자를 호출합니다. inherited 예어.

인터페이스

인터페이스는 구현 자에게 공통 함수 이름을 제공하도록 정의됩니다. 다른 구현자는 요구 사항에 따라 이러한 인터페이스를 구현할 수 있습니다. 인터페이스는 개발자가 구현 한 골격이라고 말할 수 있습니다. 다음은 인터페이스의 예입니다-

type  
   Mail = Interface  
      Procedure SendMail;  
      Procedure GetMail;  
   end;  
   
   Report = Class(TInterfacedObject,  Mail)  
      Procedure SendMail;  
      Procedure GetMail;  
   end;

클래스가 인터페이스를 구현할 때 인터페이스의 모든 메서드를 구현해야합니다. 인터페이스의 메서드가 구현되지 않은 경우 컴파일러에서 오류가 발생합니다.

추상 클래스

추상 클래스는 인스턴스화 할 수없고 상속 만 가능한 클래스입니다. 추상 클래스는 다음과 같이 클래스 정의에 abstract라는 단어를 포함하여 지정됩니다.

type
   Shape = ABSTRACT CLASS (Root)
      Procedure draw; ABSTRACT;
      ...
   end;

추상 클래스에서 상속 할 때 부모의 클래스 선언에서 abstract로 표시된 모든 메서드는 자식에 의해 정의되어야합니다. 또한 이러한 메서드는 동일한 가시성으로 정의되어야합니다.

정적 키워드

클래스 멤버 또는 메서드를 정적으로 선언하면 클래스를 인스턴스화 할 필요없이 액세스 할 수 있습니다. static으로 선언 된 멤버는 인스턴스화 된 클래스 개체를 사용하여 액세스 할 수 없습니다 (정적 메서드는 가능함). 다음 예제는 개념을 설명합니다-

program StaticExample;
{$mode objfpc}
{$static on}
type
   myclass=class
      num : integer;static;
   end;
var
   n1, n2 : myclass;
begin
   n1:= myclass.create;
   n2:= myclass.create;
   n1.num := 12;
   writeln(n2.num);
   n2.num := 31;
   writeln(n1.num);
   writeln(myclass.num);
   myclass.num := myclass.num + 20;
   writeln(n1.num);
   writeln(n2.num);
end.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

12
31
31
51
51

정적 멤버를 사용하려면 {$ static on} 지시문을 사용해야합니다.