Главная страница
Навигация по странице:

  • HALT(Cod);

  • Program lr7; type mass = array[1..5] of integer;var ka, kb

  • 8. ОБРАБОТКА СИМВОЛЬНЫХ ДАННЫХ 8.1. Символьный тип

  • Пример

  • ORD(С )

  • 8.2. Задания для символьных данных

  • 9. ОБРАБОТКА СТРОК ТЕКСТА 9.1. Строковый тип

  • Учебное пособие Омск Издательство Омгту 2010 удк 004. 4 (075) ббк 32. 973018я73 ч 49 Рецензенты


    Скачать 1.07 Mb.
    НазваниеУчебное пособие Омск Издательство Омгту 2010 удк 004. 4 (075) ббк 32. 973018я73 ч 49 Рецензенты
    АнкорABC_Pascal.doc
    Дата15.02.2017
    Размер1.07 Mb.
    Формат файлаdoc
    Имя файлаABC_Pascal.doc
    ТипУчебное пособие
    #2721
    страница6 из 8
    1   2   3   4   5   6   7   8

    PROCEDURE B(I:BYTE); FORWARD;

    PROCEDURE A(J:BYTE);

    BEGIN

    . . .

    B(J);

    END;

    PROCEDURE B(I:BYTE);

    BEGIN

    . . .

    A(I);

    END;

    7.8. Вложенные подпрограммы

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

    Любые идентификаторы для описания переменных, констант, типов, а также процедур и функций, описанные внутри подпрограммы, локализуются только в ней и называются локальными для данного блока (подпрограммы). Такой блок подпрограммы вместе с выделенными в нем модулями называется областью действия этих локальных имен. Локальные имена не являются формальными параметрами.

    Переменные, описанные в разделе описания основной программы, на­зываются глобальными. Область действия глобальных переменных  основ­ная программа и ее подпрограммы.

    Имена называются нелокальными, если они описаны не в самой подпрограмме, а в охватывающем ее блоке (или во внешней подпрограмме).

    Все имена в пределах подпрограммы должны быть уникальными и не могут совпадать с именем самой подпрограммы. При входе в подпрограмму низшего уровня становятся доступными не только объявленные в ней име­на, но и сохраняется доступ ко всем именам внешних уровней.

    Рекомендуется описывать имена в том блоке, где они используются, если это возможно. Если один и тот же объект (переменная или констан­та) используется в двух и более блоках, то их описание необходимо сде­лать в самом верхнем блоке, который содержит все остальные. Если переменная, используемая в подпрограмме должна сохранять свое значение до следующего вызова этой подпрограммы, то она описывается во внешнем блоке, содержащем данную подпрограмму.

    7.9. Процедуры EXIT и HALT

    Процедура EXIT; осуществляет выход из программного модуля  под­программы или основной программы. Из подпрограммы управление передает­ся этой процедурой в вызывающую программу к следующему за ее вызовом оператору. В программе EXIT приводит к завершению ее работы.

    Процедура HALT(Cod); прекращает выполнение программы, вызывает в случае необходимости подпрограмму завершения и осуществляет выход в операционную систему. Cod  необязательный параметр, определяющий код завершения программы.

    7.10. Пример и задания с подпрограммой-процедурой

    Пример. Ввести два массива A [1..3], B [1..4] с помощью процедуры "ввод". Вычислить средние арифметическое и геометрическое значения элементов каждого из них, используя подпрограмму-процедуру.

    Для решения задачи pазpаботана СА (pис. 15), состоящая из ос­новной программы (а) и двух процедур: одной  для ввода элементов массива (б), другой – для определения средних арифметического и геометрического значений в массиве (в), а также написана пpогpамма для реализации алгоритма:

    Program lr7;

    type

    mass = array[1..5] of integer;

    var

    ka, kb: byte;

    Sr, Sg: real;

    a, b: mass;

    PROCEDURE VVOD ( Var d: mass; Var k: byte ); {заголовок процедуры ввода}

    Var

    i: integer;

    Begin {тело процедуры}

    writeln(' введите число элементов');

    read(k);

    writeln(' введите массив из ', k,' элементов');

    FOR i:=1 to k do read(d[i]);

    e
    nd;
    {конец процедуры VVOD}

    PROCEDURE SARR (k:byte; f:mass; var s,p:real); {заголовок процедуры}

    var

    i: byte;

    begin

    s:=0 ;

    p:=1;

    for i:=1 to k do begin

    s := s+f [i]; p:=p*f[i]

    end ;

    s := s/k ;

    p := EXP(Ln(p)/k)

    End; {конец тела процедуры SARR}

    BEGIN {Блок основной программы}

    VVOD(a,ka); { ввод элементов массива А и его размера}

    SARR(ka,a,Sr,Sg); {вызов процедуры для обработки массива А}

    writeln( ‘ SrA= ’ , Sr:5:2 , ‘ SgA= ’ , Sg :5:2);

    VVOD(b,kb);

    SARR(kb,b,Sr,Sg); {вызов процедуры для обработки массива B}

    writeln( ‘ SrB= ’ , Sr :5:2, ‘ SgB= ’ , Sg :5:2);

    END.
    Задания для самостоятельного выполнения

    Задание 1

    Написать и отладить программу для п. 6.4 с выделением алгоритма обработки или формирования массива. Организовать вызов процедуры с параметрами-массивами для двух наборов исходных данных. (Для ускорения отладки массив можно задать типизированной константой).

    Задание 2

    1. Даны массивы A [1..6], B [1..6], C [1..6]. Получить A*B, B*С, A*C. Вычисление произведения массивов оформить процедурой.

    2. Даны массивы A [1..5], B [1..6]. Получить новые массивы путем сдвига элементов в массиве А на один разряд, а в массиве В  на два разряда вправо, освободившиеся слева элементы обнулить. Сдвиг элементов в массиве оформить подпрограммой.

    3. Даны два одномерных массива А [1..6] и C [1..6]. Получить A2, С2, А*С. Перемножение массивов выполнить в подпрограмме.

    4. Даны две матрицы целых чисел S [1..3,0..2], K [1..3,0..2], в которых имеется по два одинаковых числа. Найти и распечатать их значение и индексы.

    5. Вычислить значение функции Z = x1+ex2, где x1, x2 – корни уравнения Aix2+Bix + Ci = 0, i = 1,2,..,N. Коэффициенты уравнения заданы в массивах A [1..N], B [1..N], C [1..N]. Для вычисления корней использовать процедуру.

    6. Составить процедуру для перемножения двух квадратных матриц, с помощью которой вычислить вторую, третью и четвертую степени матрицы M [1..5,1..5].

    7. Даны массивы A [1..6], B [1..6], C [1..6]. Преобразовать их, каждому элементу массива присваивая значение соседнего с ним справа. Последнему элементу присвоить значение первого.

    8. По заданным вещественным массивам A [1..6], B [1..6] и С [1..6] вычислить (minAi)/maxAi + (maxCi)/min(Ci) + max(B+C)i /min(B+C)i.

    9. Даны массивы A [1..6], B [1..8]. Выбрать из них положительные элементы и записать соответственно в массивы A1 [1..k] и B1 [1..n], где k < 6, n < 8; из отрицательных элементов сформировать массивы A2 [1..6-k], B2 [1..8-n].

    10. Даны массивы A [1..6], B [1..6], C [1..6]. Переставить элементы в них таким образом, чтобы слева подряд были записаны отрицательные, а справа положительные элементы.

    11. Даны две целые квадратные матрицы четного порядка. Элементы массивов с четными номерами строки и столбца заменить нулем (стереть). Напечатать полученные массивы.

    12. Даны одномерные массивы A [1..6], B [1..8], C [1..10]. Записать их в виде матриц AA [1..3,1..2], BB [1..2,2..4], CC [1..5,1..2].

    13. Даны две целые квадратные матрицы шестого порядка. Распечатать элементы главных диагоналей каждой из них и определить симметричность каждой матрицы относительно главной диагонали.

    14. По заданным 10 элементам вещественных массивов A, B и С вычислить



    15. Даны две матрицы целых чисел V (-1..2,0..3) W [1..3,0..2]. Сформировать из них одномерные массивы VV и WW, записывая элементы построчно.

    16. Дана матрица чисел H [1..5,1..6]. Переставить столбцы матрицы таким образом, чтобы элементы первой строки матрицы были расположены в порядке возрастания их модулей. Перестановку двух столбцов матрицы реализовать процедурой.

    17. Дана матрица чисел G [1..4,1..6]. Переставить элементы в матрице так, чтобы элементы каждого столбца матрицы были расположены в порядке возрастания их модулей. Перестановку элементов в столбце реализовать процедурой.

    18. Даны массивы A [1..6], B [1..6], C [1..6]. Упорядочить элементы в них в порядке убывания их модулей.

    19. Даны две матрицы целых чисел V [1..2,1..3], W [1..3,1..2]. Найти общие суммы элементов строк и столбцов, результаты сформировать в виде двух массивов.

    20. Даны две целые квадратные матрицы шестого порядка. Определить, можно ли отражением относительно главной и побочной диагоналей преобразовать одну в другую.
    8. ОБРАБОТКА СИМВОЛЬНЫХ ДАННЫХ

    8.1. Символьный тип

    Символьный тип  это тип данных, состоящих из одного символа (знака, буквы, цифры). Традиционная запись символьного значения предс­тавляет собой символ, заключенный в апострофы ('ж'). В Pascal ABC имеются аль­тернативные способы представления символов [1]. Значениями символьного типа является множество всех символов компьютера. Каждому символу приписывается целое число в диапазоне 0..255, которое служит кодом его внутреннего представления. Связь между символом и кодом устанавливается функцией ORD:

    <Код > = ORD ( <символ> ) .

    Переменные символьного типа объявляются в блоке VAR ключе­вым словом CHAR. Пример.

    VAR

    C1, C2, C3: CHAR;

    BEGIN C1 := 'A' ; C2 := 'B' ; C3 := chr(43);

    END.

    Для кодирования символов используется код ASCII (AMERICAN STAN­DART CODE FOR INFORMATION INTERCHANGE  Американский стандартный код для обмена информацией). Код ASCII имеет 7 бит, которые поз­воляют кодировать в стандарте основные 128 символов, включающие латинские пpописные и стpочные буквы, цифpы, pазделители и pяд служебных символов
    (с кодами 0..31). Служебные символы в тексте считаются пробельными и в операциях ввода-вывода имеют самостоятельное значение (табл. 7).

    В Pascal ABC применяется восьмибитовый код, содержащий 256 символов. Ко­дировка символов с номерами [128..255] зависит от типа ПК и включает буквы русского алфавита, а также графические символы [3–5].

    К символам типа char применимы операции присваивания и все операции логических отношений: <, >, <=, >=, =, <>.

    Примеры 'A' = 'A' (TRUE);

    'A' <> 'a' (TRUE);

    'A' < 'a' (TRUE);

    Таблица 7

    Служебные символы

    Символ

    Код

    Назначение

    BEL

    HT

    LT

    VT

    FF

    CR

    SUB

    ESC

    7

    9

    10

    11

    12

    13

    26

    27

    Звонок

    Табуляция горизонтальная

    Перевод строки с сохранением текущей позиции

    Табуляция вертикальная

    Прогон страницы

    Возврат каретки

    Конец файла

    Конец работы


    Символьный тип имеет следующие встроенные функции:

    ORD(С )  возвращает код типа byte для символа С:char;

    CHR( b)  возвращает символ по коду аргумента b:byte;

    UPCASE(c)  переводит в верхний регистр только букву латинс­кого алфавита, оставляя любой другой символ без изменения, и возвращает символ c:char;

    PRED(C)  возвращает символ, предшествующий С:char в таблице ко­дов;

    SUCC(C)  возвращает символ, следующий за С:char в таблице кодов.

    Пример. Напечатать прописными только латинские буквы из двух заданных. Зададим буквы константами и применим функцию UpCase:

    Var

    c1, c2:char;

    Begin

    c1:= UPCASE( 'f' );

    c2:= UPCASE( 'ф' );

    writeln(c1, ' ' , c2, #7 ) {строка вывода: F ф }

    End. {Вывод сопровождается звуковым сигналом}

    Символы также можно описывать указанием в функции CHR кода симво­ла или с признаком # перед кодом. Например, считаются эквивалентными следующие записи:

    'A'  CHR(65)  #65.

    8.2. Задания для символьных данных

    1. Дана строка из 20 символов. Вывести из нее на печать только строчные буквы латинского алфавита.

    2. Вывести на печать все строчные, а затем все прописные буквы русского и латинского алфавитов.

    3. В заданной строке подсчитать частоту появления букв «a», «b».

    4. Дан текст из 60 литер. Напечатать только строчные русские буквы, входящие в этот текст.

    5. Дана последовательность символов, содержащая символ «я». Определить порядковый номер символа «я» в последовательности.

    6. Дана последовательность символов. Определить в ней символ, который по алфавиту предшествует другим.

    7. Напечатать в алфавитном порядке все различные строчные буквы, входящие в заданный текст из 100 литер.

    8. Определить, является ли заданная последовательность символов в строке симметричной: читается одинаково слева направо и справа налево.

    9. Напечатать текст, образованный символами с порядковыми номерами 56, 89, 84 и 69, и текст с изменением регистра.

    10. Даны две строки с1 и с2, содержащие до 5 цифр каждая. Преобразовать их к данным целого типа, используя процедуру VAL, вычислить арифметическое выражение с3 = (с1-с2)/(с1+с2).

    11. Вычислить суммы кодов всех букв, входящих в слова SUM и ALFA. Сравнить слова и определить, какое из них больше.

    12. Напечатать заданный текст с удалением из него всех букв b, непосредственно перед которыми находится буква с.

    13. Имеется символьная переменная d, присвоить логической переменной T значение true, если значение d – цифра, и значение false в противном случае.

    14. Если в заданный текст входит каждая из букв слова key, тогда напечатать «yes» , иначе – «no».

    15. Написать программу, которая предварительно запрашивает ваше имя, а затем приветствует вас по имени.

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

    17. Ввести строку, состоящую из нулей, единиц и десятичной точки. Преобразовать ее в десятичное число.

    9. ОБРАБОТКА СТРОК ТЕКСТА

    9.1. Строковый тип

    Строковый тип (String) используется для обработки текстовой информации. Строка-константа  это произвольная последовательность символов, заключённая в апострофы. Отдельный символ совместим по типу с элементом типа CHAR.

    Для обработки текстовой ин­формации используется тип динамических строк. Строка представляет собой цепочку символов. В программе строковая переменная может быть описана в блоках Type или Var. Напри­мер:

    CONST N=16; {N255}

    TYPE stroka: string[100];

    VAR st: string; {строка может содержать не более 255 символов}

    str: string[10]; {строка может содержать не более 10 символов} st1: string[N]; {строка может содержать не более N =16 символов} st2: stroka; {строка может содержать не более 100 символов}

    Максимальная длина строки  255 символов. Строка имеет структуру, подобную одномерному массиву. Поэтому строка st1 трактуется как

    st1: array[0..N] of char.

    Отличие между строкой типа string и массивом состоит в том, что строка имеет переменную длину (количество символов) и нулевой элемент строки st[0] содержит информацию о длине строки. Длина строки может быть изменена путем заполнения строки новым элементом или путем изме­нения ее нулевого элемента. Текущая длина строки может быть определена значением ORD(st[0]).

    Строки можно присваивать и сравнивать. Операции отношения >, <, =, >=, <=, <> для строк выполняются посимвольно слева направо с учетом внутренней кодировки символов. Строки считаются одинаковыми, если они имеют одинаковую дли­ну и одинаковые символы. Например:

    'abcd' = ‘abcd'

    'abcd' <> 'abcde'

    'abcd' > ' abc'

    'abcd' < ' ABC'.

    К строкам применима операция сцепления (+) или конкатенации, например:

    st := 'AB' + 'BC';

    st := st + 'CD'; {st содержит 'ABBCCD'}

    Если количество символов превышает максимально допустимую длину, то "лишние" символы справа отбрасываются.

    Отдельный элемент строки совместим с типом char.

    Пример:

    Var

    stt: string[2]; c: char;

    Begin

    stt := '123'; c := 'a';

    writeln(stt); {stt = '12' , излишек отсекается }

    stt[2] := c ; {stt = '1a' }

    End.

    9.2. Встроенные функции и процедуры для обработки строк

    LENGTH(s)  функция выдает в байтах длину строки s:string, измеряемую в символах.

    Например, функция LENGTH(st), где St = 'ABBCCD' возвратит значение 6.

    CONCAT(s1,s2,...,sN) – функция осуществляет сцепление строк s1,s2, ..., sN:string и выдает результат в виде одной общей строки. Например:

    St := '1a'; S3 :=Concat(St, 'bc'); аналог S3 := St+'bc' S3 = '1abc'.

    COPY(S, Start, Len)  функция выдает подстроку типа string из строки S:string длиной Len:integer, начиная с символа с номером Start:integer.

    Если Start >Length(S) (больше длины всей строки S), то функция вернет пустую строку; если Start>255, то возникает ошибка. Если Len больше, чем число символов от позиции Start до конца строки S, то вернется остаток строки S от Start до конца. Например, для выражения COPY('ABCDEF', 2, 3) результатом является строка 'BCD'.
    1   2   3   4   5   6   7   8


    написать администратору сайта