Начало - Антивируси
Дробни типове данни в паскал. Прости типове данни

Поредните типове включват (вижте Фигура 4.1) цели числа, логически, символни, изброени и диапазонни типове. За всяка от тях е приложима функцията ORD(X), която връща поредния номер на стойността на израза X. За целочислените типове функцията ORD(X) връща стойността на самия X, т.е. ORD(X) = X за X, принадлежащ към произволен тип обвивка. Прилагането на ORD(X) към булеви, символни и изброени типове създава положително цяло число в диапазона от 0 до 1 (булево), 0 до 155 (символ), 0 до 65535 (изброяване). Тип диапазон запазва всички свойства на основния порядъчен тип, така че резултатът от прилагането на функцията ORD(X) към него зависи от свойствата на този тип.

Можете също да приложите функции към редни типове:

PRED (X) - връща предишната стойност от пореден тип (стойността, която съответства на поредния номер ORD(X) - 1), т.е.

ORD(PRED(X)) = ORD(X) - 1;

SUCC(X) - връща следваща стойностпореден тип, който отговаря на поредния номер ORD(X) +1, т.е.

ORD(SUCC(X)) = ORD(X) + 1.

Например, ако програма дефинира променлива

тогава функцията PRED(C) ще върне стойността "4", а функцията SUCC(C) ще върне стойността "6".

Ако си представим който и да е порядъчен тип като подреден набор от стойности, нарастващ отляво надясно и заемащ определен сегмент на числовата ос, тогава функцията PRED(X) не е дефинирана за ляво, а SUCC(X) за дясно край на този сегмент.

Цели видове. Диапазонът от възможни стойности на целочислени типове зависи от тяхното вътрешно представяне, което може да бъде един, два или четири байта. В табл 4.1 показва името на целочислените типове, дължината на тяхното вътрешно представяне в байтове и диапазона от възможни стойности.

Таблица 4.1

Когато използвате процедури и функции с целочислени параметри, трябва да се ръководите от „вложеността“ на типовете, т.е. навсякъде, където може да се използва WORD, може да се използва BYTE (но не и обратното), LONGINT „включва“ INTEGER, което от своя страна включва SHORTINT.

Списъкът на процедурите и функциите, приложими към целочислени типове, е даден в таблица 4.2. Писма b, s, w, i, lИзрази от тип BYTE, SHORTINT, WORD, INTEGER и LONGINT са обозначени съответно, x е израз от който и да е от тези типове; писма vb, vs, vw, vi, vl, vxобозначават променливи от съответните типове. Незадължителният параметър е посочен в квадратни скоби.

Таблица 4.2

Стандартни процедури и функции, приложими за цели типове
Обжалване Тип резултат Действие
абс(х) х Връща модул x
chr(b) Char Връща знак по неговия код
dec(vx[, i]) - Намалява стойността на vx с i, а при липса на i - с 1
inc(vx[, i]) - Увеличава стойността на vx с i, а при липса на i - с 1
здравей(и) Байт Връща старшия байт на аргумента
здравей(ш) същото същото
Lo(i) " Връща малкия байт на аргумента
Ниска (w) " същото
странно (l) Булева стойност Връща True, ако аргументът е нечетно число
произволно (w) Същото като параметър Връща псевдослучайно число, равномерно разпределено в диапазона 0...(w-l)
sgr(x) X Връща квадрата на аргумента
размяна(и) Цяло число Разменя байтове в една дума
размяна (w) Слово

При работа с цели числа типът на резултата ще съответства на типа на операндите, а ако операндите са от различни цели числа, на типа на операнда, който има максимална мощност (максимален диапазон от стойности). Евентуалното препълване на резултата не се контролира по никакъв начин, което може да доведе до недоразумения, например:

a:= 32767; (Максимална възможна стойност INTEGER)

x:= a + 2; (Препълване при оценяване на този израз !}

y:= LongInt(a)+2; (Без препълване след прехвърляне на променливата към по-мощен тип)

WriteLn(x:10:0, y:10:0)

В резултат на изпълнението на програмата получаваме

Булев тип. Булевите стойности могат да бъдат една от предварително декларираните константи FALSE или TRUE. За тях важат правилата:

Невярно< True;

succ(False)= Вярно;

pred(True) = False.

Тъй като булевият тип е порядъчен тип, той може да се използва в оператор с изброим тип, например:

за 1:= False към True направете ....

Тип символ.Стойността на тип знак е наборът от всички PC символи. На всеки знак се присвоява цяло число в диапазона 0...255. Това число служи като код за вътрешно представяне на символа; то се връща от функцията ORD.

ASCII кодът се използва за кодиране ( Американски стандартен код за обмен на информация- американски стандартен кодза обмен на информация). Това е 7-битов код, т.е. той може да кодира само 128 знака в диапазона от 0 до 127. В същото време, в 8-битовия байт, разпределен за съхранение на знак в Turbo Pascal, можете да кодирате два пъти повече символи в диапазона от 0 до 255. първата половина на знаците PC с кодове 0...127 съответства на стандарта ASCII (Таблица 4.3). Втората половина на знаците с кодове 128...255 не е ограничена от твърдата рамка на стандарта и може да се променя на компютър различни видове(Приложение 2 показва някои общи опции за кодиране на тези знаци).

Таблица 4.3

Кодиране на знаци според стандарта ASCII
Код Символ Код Символ Код Символ Код Символ
NUL Б.Л. ® "
ЗОН ! А а
STX " IN b
ETX # СЪС с
EOT $ г d
ENQ % д д
ПИТАЙТЕ & Е f
БЕЛ " Ж ж
Б.С. ( з ч
NT ) аз аз
LF * Дж й
VT + к к
FF , Л аз
CR - М м
ТАКА . Н п
С.И. / ЗА
DEL стр П
DC1 Q р
DC2 Р r
DC3 С s
DC4 Т t
Н.А.К. U u
SYN V V
ETB w w
МОЖЕ X X
Е.М. U U
ПОДП : z z
ESC / [ {
FS < \ л
Г.С. = ] }
Р.С. > ^ ~
САЩ ? - п

Знаците с кодове 0...31 се отнасят за служебни кодове. Ако тези кодове се използват в символния текст на програмата, те се считат за интервал. Когато се използват в I/O операции, те могат да имат следното независимо значение:

Символ Код Значение
БЕЛ Обаждане; Показването на този символ е придружено от звуков сигнал
NT Хоризонтална табулация; когато се показва на екрана, премества курсора до позиция, която е кратна на 8 плюс 1 (9, 17, 25 и т.н.)
LF Подаване на линия; когато се показва на екрана, всички следващи знаци ще бъдат изведени, започвайки от същата позиция, но на следващия ред
VT Вертикален раздел; когато се покаже на екрана, той се заменя със специален знак
FF Изпълнение на страници; когато се извежда на принтер, той формира страница; когато се извежда на екрана, се заменя със специален знак
CR Връщане на карета; въвежда се чрез натискане на клавиша Enter (когато се въвежда с помощта на READ или READLN, това означава командата „Enter“ и не се поставя във входния буфер; когато се извежда, това означава командата „Продължаване на извеждането от началото“ текуща линия»)
ПОДП Край на файла; въвежда се от клавиатурата чрез натискане на Ctrl-Z; при извеждане се заменя със специален знак
SSC Край на работа; въвежда се от клавиатурата чрез натискане на клавиш ESC; при извеждане се заменя със специален знак

За типа CHAR са приложими релационни операции, както и вградени функции: СНR(В) - функция от тип CHAR; преобразува израз B от тип BYTE в знак и го връща с неговата стойност;

UPCASE(CH) - функция тип CHAR; връща главна буква, ако CH е малка латинска буква, в противен случай връща самия знак CH, например:

cl:= UpCase("s") ;

c2:= UpCase ("Ф") ;

WriteLn(cl," ",c2)

Тъй като функцията UPCASE не обработва кирилица, резултатът от изпълнението на това

програми ще бъдат показани на екрана

Тип enum. Изброеният тип се определя чрез изброяване на стойностите, които може да получи. Всяка стойност е наименувана с някакъв идентификатор и се намира в списък, ограден със скоби, например:

цветове =(червено, бяло, синьо);

Използването на изброени типове прави програмите по-визуални. Ако, например, програмата използва данни, свързани с месеците от годината, тогава следният фрагмент от програмата:

TypeMonth=(януари,февруари,мар,април,май,юни,юли,август,септември,октомври,ноември,декември);

месец: TypeMonth;

if month = Aug then WriteLn("Би било хубаво да отидем на море!");

Би било, разбирате ли, много ясно. Уви! В Turbo Pascal не можете да използвате кирилица в идентификаторите, така че сме принудени да пишем така:

TypeMonth=(януари,февруари,мар,май,юни,юли,август,септември,окт,ноември,дек);

месец: TypeMonth;

if month = aug then WriteLn("Би било хубаво да отидем на море!");

Съответствието между стойностите на изброения тип и поредните номера на тези стойности се установява от реда на изброяване: първата стойност в списъка получава пореден номер 0, втората - 1 и т.н. Максимална мощностизброеният тип има 65536 стойности, така че всъщност изброеният тип дефинира някакво подмножество от целия тип WORD и може да се разглежда като компактна декларация на група целочислени константи със стойности 0, 1 и т.н.

Използването на изброени типове повишава надеждността на програмите, като ви позволява да контролирате стойностите, които съответните променливи получават. Например, нека бъдат дадени следните изброени типове:

цветове = (черно, червено, бяло);

ordenal= (едно, две, три);

дни = (понеделник, вторник, сряда);

По отношение на силата и вътрешното представителство и трите типа са еквивалентни:

ord(черно)=0, ..., ord(бяло)=2,

ord(едно)=0, ...ord(три)=2,

ord(понеделник)=0, ...ord(сряда)=2.

Въпреки това, ако променливите са дефинирани

col:цветове; число: пореден;

тогава операторите са разрешени

num:= succ(две);

ден:= пред(вторник);

но неприемливо

Както вече беше споменато, има едно към едно съответствие между стойностите на изброения тип и набора от цели числа, определени от функцията ORD(X). Turbo Pascal позволява и обратното преобразуване: всеки израз от тип WORD може да бъде преобразуван в стойност от тип enum, стига стойността на целочисления израз да не надвишава power1™ на типа enumeration. Това преобразуване се постига чрез използване на автоматично декларирана функция с името на изброения тип (вижте раздел 4.4). Например, за декларацията на типа, обсъдена по-горе, следните присвоявания са еквивалентни:

col:= цветове(0);

Разбира се, задание

ще бъде неприемливо.

Променливи от всеки изброен тип могат да бъдат декларирани без първо да декларирате този тип, например:

col: (черно, бяло, зелено);

Тип-обхват. Типът диапазон е подмножество от своя основен тип, който може да бъде произволен порядъчен тип, с изключение на тип диапазон. Тип диапазон се определя от границите на неговите стойности в рамките на основния тип:

<мин.знач.>..<макс.знач.>

тук<мин.знач. >- минимална стойност на тип-диапазон;

<макс.знач.>- максималната му стойност.

Например:

цифра = "0".."9";

Типът диапазон не трябва да се описва в секцията TYPE, но може да бъде указан директно при деклариране на променлива, например:

Ichr: "A".."Z";.

Когато определяте тип диапазон, трябва да следвате следните правила:

  • два знака ".." се третират като един знак, така че интервали между тях не са разрешени;
  • лявата граница на диапазона не трябва да надвишава дясната граница. Тип диапазон наследява всички свойства на основния си тип, но с ограниченията на по-ниската си мощност. По-специално, ако е дефинирана променлива

дни = (mo,tu,we,th,fr,sa,su);

WeekEnd = sa .. su;

тогава ORD(W) ще върне стойността 5, докато PRED(W) ще доведе до грешка.

Стандартната библиотека Turbo Pascal включва две функции, които поддържат работа с типове диапазони:

HIGH(X) - връща максималната стойност на типа диапазон, към който принадлежи променливата X;

LOW(X) - връща минималната стойност на типа диапазон.

Следващата кратка програма ще отпечата реда

WriteLn(Low(k),"..",High(k))

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

Числото с плаваща запетая се състои от набор от отделни цифри, условно разделени на знак, експонента и мантиса. Показателят и мантисата са цели числа, които заедно със знака дават следното представяне на число с плаваща запетая:

Математически се записва така:

(-1) s × M × B E, където s е знакът, B е основата, E е степента, а M е мантисата.

Базата определя цифровата система. Математически е доказано, че числата с плаваща запетая с основа B=2 (двоично представяне) са най-устойчиви на грешки при закръгляване, следователно на практика се срещат само бази 2 и по-рядко 10. За по-нататъшно представяне винаги ще приемаме B =2 и формулата за число с плаваща запетая ще изглежда така:

(-1) s × M × 2 E

Какво е мантиса и ред? Мантисае цяло число с фиксирана дължина, което представлява най-значимите битове на реално число. Да кажем, че нашата мантиса се състои от три бита (|M|=3). Вземете например числото „5“, което двоична системаще бъде равно на 101 2. Най-значимият бит съответства на 2 2 =4, средният бит (който е равен на нула) е 2 1 =2, а най-младшият бит е 2 0 =1. ред– това е степента на основата (две) на най-високата цифра. В нашия случай E=2. Удобно е да напишете такива числа в така наречената „научна“ стандартна форма, например „1.01e+2“. Веднага става ясно, че мантисата се състои от три знака, а редът е два.

Да кажем, че искаме да получим дробно число, използвайки същите 3 бита от мантисата. Можем да направим това, ако вземем, да речем, E=1. Тогава броят ни ще бъде равен

1.01e+1 = 1×2 1 +0×2 0 +1×2 -1 =2+0.5=2.5

Очевидно по този начин едно и също число може да бъде представено по различни начини. Нека разгледаме пример с дължина на мантисата |M|=4. Числото "2" може да бъде представено по следния начин:

2 = 10 (в двоичен формат) = 1,000e+1 = 0,100e+2 = 0,010e+3.

Затова още в първите машини числата са били представени в т.нар нормализирана форма, когато първият бит на мантисата винаги се приемаше за равен на единица.

Това спестява един бит (тъй като имплицитният не трябва да се съхранява в паметта) и гарантира, че числото е представено уникално. В нашия пример "2" има едно представяне ("1.000e+1"), а мантисата се съхранява в паметта като "000", тъй като водещата единица се подразбира имплицитно. Но възниква нов проблем при нормализираното представяне на числата - невъзможно е да се представи нула в тази форма.

  • Анализ на данни с помощта на командите за избор на параметри и търсене на решение
  • Анализ и интерпретация на данни от експериментални психологически изследвания.
  • Анализ на изходните данни. Технически норми за градски пътища.
  • АНАЛИЗ НА ПОЛУЧЕНИТЕ ДАННИ. ВЗЕМАНЕ НА РЕШЕНИЕ ЗА ДОСТАТЪЧНОСТТА ИЛИ НЕДОСТАТЪЧНОСТТА НА ВОДОСНАБДИТЕЛНАТА ХАРАКТЕРИСТИКА ЗА НУЖДИТЕ НА НАПОИТЕЛНАТА СИСТЕМА.
  • Оборудване за комуникационни линии: оборудване за предаване на данни, крайно оборудване, междинно оборудване.

  • Всяка програма, написана на който и да е език за програмиране, по същество е предназначена да обработва данни. Данните могат да бъдат числа, текстове, графики, звук и др. Някои данни са изходни данни, други са резултат, който се получава при обработка на изходните данни от програмата.

    Данните се съхраняват в паметта на компютъра. Програмата осъществява достъп до тях, като използва имена на променливи, свързани с местата в паметта, където се съхраняват данните.

    Променливите са описани преди основния програмен код. Тук са посочени имената на променливите и типът данни, съхранявани в тях.

    В езика за програмиране Pascal има много типове данни. В допълнение, самият потребител може да дефинира свои собствени типове.

    Типът на променливата определя какви данни могат да се съхраняват в мястото на паметта, свързано с нея.

    Типови променливи цяло числоможе да се свързва само с целочислени стойности обикновено в диапазона от -32768 до 32767. Pascal има други цели числа (байт, longint).

    Типови променливи истинскисъхранява реални (дробни) числа.

    Променлива Булева стойност(Boolean) тип (boolean) може да приема само две стойности - вярно(1, вярно) или невярно(0, невярно).

    Тип символ (char)може да приема стойности от специфична подредена последователност от знаци.

    Интервален типдефинирани от потребителя и образувани само от порядъчни типове. Представлява подмножество от стойности в определен диапазон.

    Можете да създадете свой собствен тип данни, като просто изброите стойностите, които променливата може да приеме. от този тип. Това е т.нар изброен тип данни.

    Всички горепосочени са прости типове данни. Но има и сложни, структурирани, които се основават на прости типове.

    Масиве структура, която заема една област в паметта и се състои от фиксиран брой компоненти от същия тип.

    струние последователност от знаци. Освен това броят на тези символи не може да бъде повече от 255 включително. Това ограничение е характерна особеностПаскал.

    Записвайтее структура, състояща се от фиксиран брой компоненти, наречени полета. Данните в различните полета на запис могат да бъдат от различни типове.

    Комплектипредставляват колекция от произволен брой елементи, но от един и същи изброен тип.

    файловеза Pascal те са поредици от същия тип данни, които се съхраняват на устройства външна памет(например твърд диск).

    Концепцията за такъв тип данни като показалецсвързани с динамично съхранение на данни в компютърната памет. Често използването на динамични типове данни е по-ефективно при програмиране от използването на статични типове данни.

    ЛЕКЦИЯ 2

    Основи на програмирането.

    Въведение в Паскал. Типове данни. Операции.

    Езикова азбукаПаскал

    Всеки естествен език се състои от елементи като символи, думи, фрази и изречения. Езикът за програмиране също има подобни елементи: символи, думи, изрази (фрази), оператори (изречения).

    Думите се образуват от колекция от символи. Изрази - това са групи от думи и оператори - Това са комбинации от думи и изрази. Езиковите символи са елементарни знаци (букви), които се използват за съставяне на някои текстове. И така, наборът от тези символи образува азбуката на езика.

    Азбуката Паскал се състои от:

    1. главни и малки букви от латинската азбука, която включва следните знаци:

    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z - главни букви;

    A b c d e f g h i j k l m n o p q r s t u v w x y z - малки букви;

    2. десетични арабски цифри: 0 1 2 3 4 5 6 7 8 9;

    3. шестнадесетични цифри (съставени от десетични цифри и букви от A до F);

    4. 32 главни и малки букви от руската азбука;

    5. специални знаци:

    Комбинациите от специални знаци могат да образуват съставни знаци:

    : = присвояване;

    < >не е равен;

    >= по-голямо или равно на;

    <= меньше или равно;

    Диапазон от стойности;

    (* *) или ( ) - коментар.

    Програмна структура на Pascal

    За да може компилаторът на Passal правилно да разбере точно какви действия се очакват от него, вашата програма трябва да бъде форматирана в пълно съответствие със синтаксиса (правилата за изграждане на програмата) на този език.

    Всяка програма на Pascal може да се състои от следните блокове (незадължителните части са маркирани с квадратни скоби по-долу):

    програма<имя_программы>;

    [използва<имена_подключаемых_модулей>;]

    [ етикет<список_меток>;]

    [ конст<имя_константы> = <значение_константы>;]

    [ тип<имя_типа> = <определение_типа>;]

    [вар<имя_переменной> : <тип_переменной>;]

    [ процедура<имя_процедуры> <описание_процедуры>;]

    [ функция<имя_функции> <описание_функции>;]

    начало (началото на основното тяло на програмата)

    <операторы>

    край. (* край на основното тяло на програмата *)

    По-късните версии на езиковите компилатори Pascal вече не изискват посочване на името на програмата, тоест програмния ред<имя_программы>; може да се пропусне. Но това е възможно само ако цялата програма се съдържа в един модулен файл. Ако програмата се състои от няколко независими части - модули, тогава всеки от тях трябва да има заглавна част (програма или модул).

    Всеки от изброените незадължителни раздели може да се появи повече от веднъж в текста на програмата, общата им последователност също може да се промени, но винаги трябва да се спазва основното правило на езика Pascal: преди да се използва обект, той трябва да бъде деклариран и описан.

    Компилаторите на Pascal не правят разлика между малки и главни букви и игнорират празните знаци, така че текстът на програмата може да бъде структуриран по такъв начин, че да бъде най-удобен за четене и отстраняване на грешки.

    Директиви на компилатора

    Редът, започващ със символите ($, не е коментар, а директива за компилатор - специална команда, от която зависи процесът на компилиране и изпълнение на програмата. Ще разгледаме директивите в онези раздели, към които те се отнасят „по смисъл“.

    Например редът ($I-,Q+) деактивира входно/изходното валидиране, но позволява контрол на препълване на изчисленията.

    Идентификатори

    Имената, дадени на програмни обекти (константи, типове, променливи, функции и процедури и цялата програма), се наричат ​​идентификатори. Те могат да се състоят само от цифри, латински букви и знака "_" (долна черта). Номерът обаче не може да започва име. Идентификаторите могат да бъдат с всякаква дължина, но ако две имена имат еднакви първи 63 знака, тогава имената се считат за идентични.

    Можете да дадете произволно име на вашите програмни обекти, но трябва да се уверите, че те са различни от запазените думи, използвани от Pascal, тъй като компилаторът пак няма да приеме променливи с "чужди" имена.

    Ето списък на най-често срещаните запазени думи:

    реализация на масив шл

    интерфейсен низ на case

    const етикет тогава

    файлов указател използва

    far процедура вар

    за програма докато

    напред запис с

    функция повторение xor

    Променливи и типове данни

    Променливата е програмен обект, чиято стойност може да се променя, докато програмата работи.

    Типът данни е характеристика на диапазона от стойности, които променливите, принадлежащи към този тип данни, могат да приемат.

    Всички променливи, използвани в програмата, трябва да бъдат описани в специален раздел var, като се използва следният шаблон:

    вар<имя_переменной_1> [, <имя_переменной_2, _>] : <имя_типа_1>;

    <имя_переменной_3> [, <имя_переменной_4, _>] : <имя_типа_2>;

    Езикът Pascal има голям набор от различни типове данни, но сега ще посочим само няколко от тях. Ще говорим за всички типове данни по-нататък.

    Константи

    Константата е обект, чиято стойност е известна преди програмата да започне да работи.

    Константите са необходими за проектирането на визуални програми, незаменими са при използване на многократно повтарящи се стойности в текста на програмата и са удобни, ако е необходимо да промените тези стойности в цялата програма наведнъж.

    Има три вида константи в Pascal:

    Неназовани константи (цифри и числа, символи и низове, множества);

    Именувани нетипизирани константи;

    Наименувани типизирани константи.

    Безименни константи

    Ненаименуваните константи нямат имена и следователно не е необходимо да бъдат декларирани.

    Типът на неназованата константа се определя автоматично по подразбиране:

    Всяка поредица от числа (може би предшествана от знак "-" или "+" или разделена с една точка) се възприема от компилатора като неназована константа - число (цяло число или реално);

    Всяка последователност от знаци, оградена с апостроф, се третира като неназована константа - низ;

    Всяка последователност от цели числа или символи, разделени със запетаи, оградени с квадратни скоби, се възприема като неназована константа - набор.

    Освен това има две специални константи true и false, свързани с булевия тип данни.

    Примерите за използване на неименувани константи включват следните оператори:

    реално2:= 12,075 + x;

    низ4:= "abc" + низ44;

    set5:= * set55;

    boolean6:= вярно;

    Нетипизирани константи

    Именуваните константи, както подсказва името им, трябва да имат име. Следователно тези имена трябва да бъдат докладвани на компилатора, тоест описани в специален const раздел.

    Ако не посочите типа на константата, тогава по нейния външен вид компилаторът сам ще определи към кой (базов) тип трябва да бъде присвоена. Всяка вече описана константа може да се използва при деклариране на други константи, променливи и типове данни. Ето няколко примера за описание на нетипизирани именувани константи:

    Типизирани константи

    Типизираните наименувани константи са променливи(!) с начална стойност, която вече е известна към момента на стартиране на програмата. Следователно, първо, въведените константи не могат да се използват за дефиниране на други константи, типове данни и променливи, и второ, техните стойности могат да се променят, докато програмата работи.

    Въведените константи са описани с помощта на следния шаблон:

    конст<имя_константы> : <тип_константы> = <начальное_значение>;

    Примерите по-долу показват как да направите това:

    const n: цяло число = -10;

    b: boolean = true;

    Ще предоставим примери за типизирани константи от други типове, докато изучаваме съответните типове данни.

    Типове данни на Pascal

    Компилаторите на Pascal изискват информация за количеството памет, необходима за изпълнение на програма, да бъде предоставена преди да се изпълни. За да направите това, в раздела за описание на променливи (var), трябва да посочите всички променливи, използвани в програмата. Освен това трябва да кажете на компилатора колко памет ще заема всяка от тези променливи.

    Всичко това може да бъде съобщено на програмата чрез просто посочване на типа на бъдещата променлива. Имайки информация за типа на променливата, компилаторът „разбира“ колко байта трябва да бъдат разпределени за нея, какви действия могат да се извършват с нея и в какви конструкции може да участва.

    За удобство на програмистите Pascal има много стандартни типове данни и освен това възможност за създаване на нови типове данни на базата на съществуващи (стандартни или отново дефинирани от програмиста), които се наричат ​​конструирани.

    Разделението на основни и конструирани типове данни в Pascal е показано в таблицата:

    Ординални (дискретни) типове данни

    Типове адресни данни

    Структурирани типове данни

    Аритметични типове данни

    Основни типове данни

    Логично

    Символично

    истински

    Нетипизи

    индексиран индекс

    Конструирани типове

    Листируем

    седмица = (su, mo, tu, we, th, fr,sa);

    Въведен указател

    Масив

    низ низ

    рекорден запис

    Процедурен

    Обект

    Интервал (диапазон)

    Програмист конструирани типове данни

    Поредни типове данни

    Сред основните типове данни се открояват редните типове. Това име може да бъде оправдано по два начина:

    1. Всеки елемент от пореден тип може да бъде свързан с уникален (пореден) номер. Номерирането на стойностите започва от нула. Изключение правят типовете данни shortint, integer и longint. Тяхното номериране съвпада със стойностите на елементите.

    2. Освен това върху елементи от всеки порядъчен тип се определя ред (в математическия смисъл на думата), който пряко зависи от номерацията. Така за всеки два елемента от порядъчен тип може да се каже точно кой от тях е по-малък и кой по-голям.

    Стандартни процедури, които обработват редови типове данни

    Следните функции и процедури са дефинирани само за редови типове:

    1. Функцията ord(x) връща поредния номер на стойността на променливата x (спрямо типа, към който принадлежи променливата x).

    2. Функцията pred(x) връща стойността, предхождаща x (не е приложимо за първия елемент от типа).

    3. Функцията succ(x) връща стойността след x (не е приложимо за последния елемент от типа).

    4. Процедурата inc(x) връща стойността след x (за аритметични типове данни това е еквивалентно на оператора x:=x+1).

    5. Процедурата inc(x,k) връща k-тата стойност след x (за аритметични типове данни това е еквивалентно на оператора x:=x+k).

    6. Процедурата dec(x) връща стойността, предхождаща x (за аритметични типове данни това е еквивалентно на оператора x:=x-1).

    7. Процедурата dec(x,k) връща k-e стойността, предхождаща x (за аритметични типове данни това е еквивалентно на оператора x:=x-k).

    На пръв поглед изглежда, че резултатът от използването на процедурата inc(x) е абсолютно същият като резултата от използването на функцията succ(x). Разликата между тях обаче се появява в границите на допустимия диапазон. Функцията succ(x) не е приложима към максималния елемент от даден тип, но процедурата inc(x) няма да доведе до грешка, но, действайки съгласно правилата за машинно добавяне, ще добави следващия към номера на елемента . Числото, разбира се, ще излезе извън диапазона и поради отрязването ще се превърне в числото на минималната стойност на диапазона. Оказва се, че процедурите inc() и dec() възприемат всеки порядъчен тип като „затворен в пръстен“: веднага след последната стойност отново идва първата стойност.

    Нека обясним всичко казано с пример. За тип данни

    тип шестнадесет = 0..15;

    опитът да добавите 1 към числото 15 ще даде следния резултат:

    Първоначалната единица ще бъде отрязана и следователно се оказва, че inc(15)=0.

    Подобна ситуация при долната граница на допустимия диапазон на произволен порядъчен тип данни се наблюдава за процедурата dec(x) и функцията pred(x):

    dec(min_element)= max_element

    Типове данни, свързани с редния номер

    1. Булевият тип има две стойности: false и true и за тях са валидни следните равенства:

    ord(false)=0, ord(true)=1, false

    pred(true)=false, succ(false)=true,

    inc(true)=false, inc(false)=true,

    dec(true)=false, dec(false)=true.

    2. Символният тип char съдържа 256 разширени ASCII знака (например "a", "b", "i", "7", "#"). Номерът на знака, върнат от функцията ord(), е същият като номера на знака в ASCII таблицата.

    3. Нека обобщим целочислените типове данни в таблица:

    Тип данни

    Брой байтове

    Обхват

    2147483648..2147483647

    4. Изброените типове данни се специфицират в секцията тип чрез изрично изброяване на техните елементи. Например:

    тип седмица = (слънце, понеделник, вт, сряда, четвъртък, петък, събота)

    Спомнете си, че за този тип данни:

    inc(sat) = слънце, dec(sun) = сб.

    5. Интервалните типове данни се определят само от границите на техния диапазон. Например:

    тип месец = 1..12;

    budni = пн..пет;

    6. Типовете данни, конструирани от програмиста, са описани в раздела тип съгласно следния модел:

    тип<имя_типа> = <описание_типа>;

    Например:

    тип lat_bukvy = "a".."z", "A".."Z";

    Основните типове данни са стандартни, така че не е необходимо да ги описвате в раздела за типове. Въпреки това, ако желаете, това може да стане, например, като на дълги дефиниции дадете кратки имена. Да кажем чрез въвеждане на нов тип данни

    тип int = цяло число;

    Можете да съкратите малко програмния текст.

    Реални типове данни

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

    Тип данни

    Брой байтове

    Диапазон (абсолютна стойност)

    1.5*10-45..3.4*1038

    2.9*10-39..1.7*1038

    5.0*10-324..1.7*10308

    3.4*10-4932..1.1*104932

    Конструирани типове данни

    Ще разгледаме тези типове данни (заедно с дефинираните за тях операции) допълнително в хода на няколко лекции.

    Операции и изрази

    Аритметични операции

    Нека поговорим за операции - стандартни действия, разрешени за променливи от един или друг основен тип данни. Основата ще бъдат аритметични и логически операции.

    Забележка: Всички оператори, изброени по-долу (с изключение на унарния "-" и не) изискват два операнда.

    1. Логическите операции (и - логическо И, или - логическо ИЛИ, не - логическо НЕ, xor - изключително ИЛИ) са приложими само за стойности от булев тип. Те също водят до булеви стойности. Ето таблици със стойности за тези операции:

    вярно фалшиво вярно

    невярно невярно невярно

    вярно невярно невярно

    2. Операции за сравнение (=,<>, >, <, <=, >=) важи за всички основни типове. Техните резултати също са булеви стойности.

    3. Операциите на целочислената аритметика са приложими само за цели числа. Техният резултат е цяло число, чийто тип зависи от типовете на операндите.

    a div b - пълно разделяне на a на b (вероятно няма нужда да ви напомняме, че деленето на 0 е забранено, така че в такива случаи операцията генерира грешка). Резултатът ще бъде от тип данни, общ за типовете, към които принадлежат операндите.

    Например (shortint div byte = integer). Това може да се обясни по следния начин: integer е минимален тип, чийто байт и shortint са подмножества.

    a mod b - вземане на остатъка при деление на a на b. Типът на резултата, както и в предишния случай, се определя от типовете на операндите, а 0 е недопустима стойност за b. За разлика от математическата операция mod, чийто резултат винаги е неотрицателно число, знакът на резултата от операцията mod "програмист" се определя от знака на нейния първи операнд. Така, ако в математиката (-2 mod 5) = 3, тогава имаме (-2 mod 5) = -2.

    a shl k - изместване на стойността на a с k бита наляво (това е еквивалентно на умножаване на стойността на променлива a по 2k). Резултатът от операцията ще бъде от същия тип като нейния първи операнд(и).

    a shr k - измества стойността на a с k бита надясно (това е еквивалентно на пълно разделяне на стойността на променлива a на 2k). Резултатът от операцията ще бъде от същия тип като нейния първи операнд(и).

    and,or,not,xor - двоични аритметични операции, които работят с битове от двоичното представяне на цели числа, съгласно същите правила като съответните логически операции.

    4. Общите аритметични операции (+, -, *, /) се прилагат за всички аритметични типове. Техният резултат принадлежи към тип данни, общ за двата операнда (единственото изключение е операцията дробно деление /, резултатът от която винаги е реален тип данни).

    Други операции

    Има и други операции, които са специфични за стойностите на някои от стандартните типове данни на Pascal. Ще разгледаме тези операции в съответните раздели:

    #, in, +, *, : вижте лекция 5 „Символи. Линии. множество"

    @, ^: вижте лекция 7 „Адреси и указатели“

    Стандартни аритметични функции

    Аритметичните операции също включват стандартни аритметични функции. Предоставяме списък с тях с кратко описание в таблицата.

    функция

    Описание

    Тип аргумент

    Тип резултат

    Абсолютна стойност (модул) на число

    Аритметика

    Същото като типа аргумент

    Арктангенс (в радиани)

    Аритметика

    истински

    Косинус (в радиани)

    Аритметика

    истински

    Експонента (ex)

    Аритметика

    истински

    Вземане на дробната част от число

    Аритметика

    истински

    Вземане на цялата част от число

    Аритметика

    истински

    Натурален логаритъм (основа e)

    Аритметика

    истински

    Проверка дали числото е нечетно

    Значение на числото

    истински

    Закръглете до най-близкото цяло число

    Аритметика

    Закръгляване надолу - до най-близкото по-малко цяло число

    Аритметика

    Синус (в радиани)

    Аритметика

    истински

    Квадратура

    Аритметика

    истински

    корен квадратен

    Аритметика

    истински

    Аритметични изрази

    Всички аритметични операции могат да се комбинират помежду си - разбира се, като се вземат предвид типовете данни, разрешени за техните операнди.

    Операндите на всяка операция могат да бъдат променливи, константи, извиквания на функции или изрази, изградени на базата на други операции. Всичко заедно се нарича израз.

    Примери за аритметични изрази:

    (x<0) and (y>0) - израз, чийто резултат е от тип boolean;

    z shl abs(k) - вторият операнд е извикване на стандартната функция;

    (x mod k) + min(a,b) + trunc(z) - комбинация от аритметични операции и извиквания на функции;

    odd(round(x/abs(x))) - "многоетажен" израз.

    Ред на изчисление

    Ако изразът съдържа скоби, тогава изчисленията се извършват в следния ред: колкото по-малка е дълбочината на влагане на скобите, толкова по-късно се изчислява операцията, затворена в тях. Ако няма скоби, първо се изчисляват стойностите на операциите с по-висок приоритет, а след това тези с по-нисък приоритет. Няколко последователни операции с еднакъв приоритет се изчисляват последователно отляво надясно.

    Таблица 2.1. Приоритети (за всички) Pascal операции

    Концепцията за тип е една от основните концепции на всеки език за програмиране. Обектите (константи, променливи, функции, изрази), с които работи програмата, принадлежат към определен тип.

    Тип е набор от стойности, които програмните обекти могат да приемат, и набор от операции, разрешени върху тези стойности.

    например, стойностите 1 и 2 са от целочислен тип, могат да се събират, умножават и други аритметични операции. Значенията „монитор“ и „Паскал“ са лингвистични по природа; те имат свой собствен набор от валидни операции. В повечето често използвани езици могат да се използват само строго определени, предварително известни типове. Pascal, заедно със стандартните типове, открити в други езици на високо ниво, позволява на програмиста да създава свои собствени типове.

    Всички типове, разрешени в езика Pascal, са разделени на две големи групи: прости и сложни (структурирани).

    Тип Обхват Мантиса, знаци Необходима памет (байтове)
    ИСТИНСКИ 2.9*10E-39..1.7*10E38 11-12
    ЕДИНЕН 1.5*10E-45..3.4*10E38 7-8
    ДВОЙНО 5.0*10E-324..1.7*10E308 15-16
    РАЗШИРЕН 1.9*10E-4951..1.1*10E4932 19-20
    COMP -2E+63+1..2E+63-1 10-20

    Ефективното използване на типовете SINGLE, DOUBLE, EXTEND, COMP е възможно само когато директивата ($N+) е активирана. По подразбиране е изключено. За решаване на инженерни и икономически проблеми са достатъчни стойности от типа REAL.

    Пример

    Var Res, Summa, Itog: истински;

    Булева стойносттипът данни се описва от идентификатора BOOLEAN. Променливите и константите от този тип могат да приемат само една от двете стойности: TRUE (истина) или FALSE (false).

    Пример

    Var Sel1, Sel2: булево;

    A,B,C,D: булево;

    Булевите изрази заемат 1 байт памет и се използват в логически и релационни изрази и за контролиране на реда, в който се изпълняват програмните изрази.

    Литерал (символ)типът се описва от стандартния CHAR идентификатор. Константите и променливите от този тип могат да приемат една от стойностите на ASCII кодовата таблица. Значението на константа или променлива от този тип е оградено с апостроф.

    например, Var Bukva, Znak, Символ: char;

    Буква:=’А’; Знак:=’+’; Символ:=’!’

    Променливите от символен тип заемат 1 байт в паметта. Използването на char данни в аритметични изрази е забранено. Операциите за сравнение могат да се прилагат към литерални стойности, като резултатът зависи от номера на литералната променлива или константа в кодовата таблица.

    В допълнение към стандартните типове данни, Pascal поддържа скаларни типове, дефиниран от потребителя. Те включват изброимИ интервалвидове . Тези типове данни заемат 1 байт в паметта, така че всеки потребителски тип не може да съдържа повече от 255 елемента. Използването им значително подобрява видимостта на програмата, улеснява намирането на грешки и спестява памет.

    Тип enumсе определя директно чрез изброяване на всички стойности, които променлива от даден тип може да приеме. Индивидуалните стойности са разделени със запетаи, а целият списък е ограден в скоби.

    формат

    Тип<имя типа>=(<значение1, значение2, ..., значениеN>);

    вар<идентификатор, ...>: < имя типа>;

    Пример

    Тип Сезон =(Пролет, Лято, Есен, Зима);

    Var S1, S2: Сезон;

    Есен: (септември, октомври, ноември);

    Този пример показва изрично дефиниран тип потребителски данни Сезон. Определени са техните значения – означения на сезоните. Променливите S1 и S2 могат да приемат само една от изброените стойности. Опитът да им се присвои друга стойност ще доведе до софтуерно прекъсване. Третият тип изброяване е анонимен (няма име) и се определя чрез изброяване на стойности в секцията Var. Есента е променлива от този тип и може да приема стойностите септември, октомври, ноември. По този начин може да се посочи всеки тип, но това не винаги е приемливо. Първият метод със сигурност е по-разбираем и по-съвместим с природата на езика Pascal.

    Интервален типви позволява да посочите две константи, които определят границите на диапазона от стойности за дадена променлива. За всяка операция върху интервална променлива, компилаторът генерира рутинни проверки, за да определи дали стойността на променливата остава в определения диапазон. И двете константи трябва да принадлежат към един от стандартните типове, различен от real. Стойността на първата константа трябва задължително да бъде по-малка от стойността на втората.

    формат

    Тип<имя типа> = <константа1> .. <константа2>;

    вар<идентификатор>: < имя типа>;

    Пример

    Тип Дни = 1.. 31;

    Var Work_d, Free_d: дни;

    В този пример променливите Работа_d, Свободен_dимат тип Днии може да приема произволна стойност от диапазона 1. . 31.

    Излизането от обхвата причинява софтуерно прекъсване.

    Можете да дефинирате тип интервал, като дефинирате границите на диапазона не чрез стойностите на константите, а чрез техните имена:

    Const Min = 1; Макс = 31;

    Тип Дни = Мин .. Макс;

    Var Work_d, Free_d: дни;

    Структурирани типоветиповете данни са базирани на скаларни типове и могат да съдържат различни комбинации от тях. Те определят подредена колекция от скаларни елементи и се характеризират с вида на техните компоненти. Езикът Pascal предоставя следните типове структурирани данни:

    линия -поредица от знаци, затворени в апостроф;

    масив -структуриран тип данни, състоящ се от фиксиран брой елементи от един и същи тип, достъпни чрез индекс ;

    много -набор от обекти, избрани според някаква характеристика или група от характеристики, които могат да се разглеждат като едно цяло;

    запис -набор от фиксиран брой компоненти от различни видове;

    файл- последователност от компоненти от един и същи тип и еднаква дължина.

    Два по-структурирани типа - процедурен и обектен - е трудно да се съпоставят с данни в конвенционално представяне.

    Фигура 1- Набор от основни типове на езика Pascal

    Най-простият числов типданните в Pascal са цели числа, предназначени да съхраняват цели числа. Целите числа в Паскал обикновено се разделят на два типа: със знак и без знак. Числата със знак са цяло число, което включва както положителни, така и отрицателни числа, числата без знак са само положителни числа.

    По-долу има две таблици с цели числа. Първо ще изпишем цели числа със знак:


    ТипБайтДиапазон от стойности
    shortint1 -128 ... 127
    smallint2 -32768 ... 32767
    integer, longint4 -2147483648 ... 2147483647
    int648 -9223372036854775808 ... 9223372036854775807

    И това цели числа без знак:


    ТипБайтДиапазон от стойности
    байт1 0 ... 255
    дума2 0 ... 65535
    дълга дума, кардинал4 0 ... 4294967295
    uint648 0 ... 18446744073709551615

    Както можете да видите, първата колона съдържа името на типа, втората - броя на байтовете, заети в паметта от числа от този тип, а третата - съответно обхвата на възможните стойности. Има два вида числа със знак - integer и longint (буквално "цяло число" и "дълго цяло число"), които са синоними. Тоест можете да използвате едно или друго име в раздела за описание.

    По подобен начин във втората таблица (неотрицателни цели числа в Pascal) също има два 4-байтови синонимни цели числа - дълга дума и кардинал, така че използвайте едното или другото.

    Можете също така да забележите, че ако условно преместим числата на първата таблица в дясната страна спрямо нула (преместете интервала вдясно, така че минималното число да е 0), тогава ще получим интервали от цели числа във втората таблица, лежаща в съответните редове. Така че, ако в 1-байтов shortint тип добавим 128 към лявата и дясната граница, получаваме типа байт (0..255); ако в 2-байтов тип smallint добавим 32768 към границите, получаваме съответната 2-байтова дума от неподписан тип (0..65535) и т.н.

    Всичко това се случва, защото в типовете цели числа без знак числата могат да бъдат разделени точно на две: половината от числата на отрицателната част, половината на положителната част. Защо тогава в числата със знак лявата граница е по абсолютна стойност с 1 по-голяма от дясната граница? – питате вие. Например, в типа shortint минимумът е -128, докато максимумът е само 127 (по модул 1 по-малко). И това е така, защото дясната страна също включва 0 и трябва да знаете и запомните това.

    Тогава защо целите числа в Pascal трябва да бъдат разделени на толкова много типове? Защо не се справите например с най-големия от целочислените типове в PascalABC.Net и Free Pascal – int64 – който е почти 9 и половина квинтилиона (!) с минус и плюс? Да, по проста банална (?) причина - спестяване на памет. Ако трябва да добавите две малки еднобайтови положителни числа (0..255) и сте описали тези числа като int64 (8 байта), тогава са били необходими 8 пъти повече памет. И ако програмата е голяма и има много променливи, спестяванията на памет нарастват много рязко. Освен това няма смисъл да се използват цели числа със знак, ако проблемът се занимава с количества като дължина, маса, разстояние, време и т.н.

    В раздела на сайта с книгата за задачи на Абрахамян (подраздел Integer) наблюдавайте използването на различни типове цели числа в Pascal.



     


    Прочетете:



    Използване на стилове в Excel Как да създадете свой собствен нов стил

    Използване на стилове в Excel Как да създадете свой собствен нов стил

    Ако постоянно използвате едни и същи опции за форматиране на клетки от работен лист във вашите електронни таблици, може би е разумно да създадете стил на форматиране...

    Какви грешки възникват по време на инсталацията?

    Какви грешки възникват по време на инсталацията?

    Забележка: Програмите на AutoLISP могат да се изпълняват само на пълната версия на AutoCAD, те не работят под AutoCAD LT. (с изключение на случаите на зареждане...

    Социален статус на човек в обществото

    Социален статус на човек в обществото

    Предложете какво определя избора на човек за основния му статус. Използвайки текста и фактите от социалния живот, направете две предположения и...

    Пълна интерпретация на грешките

    Пълна интерпретация на грешките

    Доста потребители са се сблъскали с феномена син екран на смъртта. Какво да направите (Windows 7 най-често е предразположен към този проблем)...

    feed-image RSS