Green Brown Cyan LightGray 23 глава




 

Рис. 7.6.1. Программа для пересчета расстояний из миль в километры и результаты ее работы.

7.6.2. Оператор Repeat … until

Общий вид оператора следующий:

Repeat

< тело цикла >

until < условие >;

где repeat и until – служебные слова. repeat означает повторять, until – до тех пор.

Цикл работает следующим образом: вначале выполняется оператор или группа операторов, входящая в тело цикла. Затем проверяется, выполняется ли условие, находящееся после until. Если условие истинно, то работа цикла на этом завершается, если условие ложно, то тело цикла выполняется снова. Таким образом, данный цикл будет работать до тех пор, пока условие находящееся после слова until, ложно. Такой цикл называют циклом с постусловием (латинская приставка «пост» означает «после»). Такое название цикла связано с тем, что проверка условия, определяющего работу цикла, производится уже после его выполнения. Если условие вообще никогда не выполняется, то тело цикла будет выполнено хотя бы один раз.


 

Рис. 7.6.2. Программа определения среднего роста и результаты ее работы

 

Цикл такого типа удобно использовать для решения следующей задачи: требуется определить средний рост учеников в классе. Данные о росте каждого ученика вводятся с клавиатуры. Сколько учащихся в классе заранее неизвестно, но признаком окончания ввода исходных данных является ввод нуля (рис. 7.6.2).

Опишем следующие переменные: rost – используется для хранения роста каждого отдельного ученика; n – общее число членов последовательности, которая будет на единицу больше, чем общее число учеников в классе, так как последний член последовательности – это, как мы помним не чей-либо рост, а признак конца; sum –сумма членов последовательности; sred – искомый средний рост учеников в классе (эта величина должна быть вещественной, так как она является результатом деления).

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

В итоге после окончания работы цикла нам останется только определить средний рост, представляющий собой частное от деления итоговой суммы на число учеников класса величин sred.

7.6.3. Оператор While

Общий вид оператора while следующий:

while < условие > do

< тело цикла >;

где while и do – служебные слова, while означает «пока», do – « делать, выполнять».

Цикл работает следующим образом: первоначально проверяется условие, находящееся после слова while, если данное условие является ложным, то тело цикла не выполняется и работа оператора цикла на этом завершается. Если условие является истинным, то выполняется оператор или группа операторов, входящая в тело цикла. Затем снова производится проверка условия, содержащегося в строке заголовка и так далее. Таким образом, тело цикла выполняется пока истинно условие, содержащееся в заголовке цикла. Цикл такого типа называют циклом с предусловием. Это объясняется тем, что перед первым же выполнением цикла производится проверка истинности находящегося в заголовке условия. Если условие изначально не выполняется, то тело цикла не будет выполнено ни разу.

В качестве примера использования цикла типа while приведем программу разложения целого положительного числа на простые множители (рис. 7.6.3). Напомним, что простым называется целое число (кроме единицы), которое делится только на единицу и само на себя. Составным или сложным называется число, которое делится еще и на другие числа. Любое составное число можно представить единственным образом в виде произведения простых чисел, которые и называются простыми множителями.

Алгоритм разложения числа на множители заключается в следующем. Исходное число делится на все числа, начиная с 2. Если число нацело разделилось на делитель, то этот делитель является одним из искомых простых множителей. Тогда мы определяем частное от деления этих двух чисел и делим уже его на все числа, начиная с 2. Если же исходное число или последнее получившееся частное не делится нацело на делитель, то значение делителя увеличиваем на единицу и уже это новое значение используем при дальнейшей работе. Так мы будем действовать до тех пор, пока значение делителя не станет равным частному или самому числу (в том случае, если простых множителей для исходного числа не было найдено). На этом поиск простых множителей завершается.

Опишем переменные программы: c - исходное число, d – делитель.

Поиск простых множителей мы будем производить в цикле. Этот цикл с предусловием будет работать до тех пор, пока значение делителя d будет меньше или равно делимому c. Как только d станет больше c, работа цикла прекратится, так как дальнейший поиск не имеет смысла. Если исходное число является простым, то в результате работы программы на экран будет выведен единственный результат – само исходное число. Если же число является составным, то простых множителей будет как минимум два. Результат работы программы показан также на рис. 7.6.3.


 

 

Рис. 7.6.3. Программа разложения числа на простые множители и результаты работы программы.

 

7.7. Работа с символами и строками

 

В языке Паскаль также предусмотрена возможность обработки текстовых данных. Для работы с ними используются типы char и string, которые соответственно применяются для работы с данными символьного и строкового типов.

 

7.7.1. Символьные константы и переменные

В программах написанных на Паскале широко используются символьные константы и переменные. Значениями как тех, так и других являются символы. Символами называются все буквы и цифры, пробел, знаки препинания которые можно вводить с клавиатуры компьютера.

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

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

ASCII – это аббревиатура от American Standart Code for Information Interchange, что в переводе означает «американский стандартный код для обмена информацией». Это – используемая во всем мире таблица для кодирования вводимой в компьютер текстовой информации. Данная таблица содержит буквы латинского алфавита (прописные и строчные), цифры от 0 до 9, символы арифметических операций и знаки препинания, а также различные специальные символы. Каждому из имеющихся в таблице символов соответствует свой числовой код. Например, прописной букве «N» латинского алфавита соответствует числовой код 78, строчной букве «n» - код 110 (строчные и прописные буквы имеют разные коды). Цифре «6» соответствует код 54, пробелу – код 32, запятой – код 44 и т.д. Кроме того, кодовая таблица содержит так называемые управляющие символы, которые при вводе не отображаются непосредственно на экране компьютера, но при этом выполняют определенные действия, например, производят перевод курсора на следующую строку при работе с текстом или выдают звуковой сигнал. Каждому из управляющих символов также соответствует числовой код. Всего эта таблица содержит 128 символов. Данная таблица является единой для всех IBM-PC совместимых компьютеров.

К основной таблице ASCII существует дополнение, также содержащее 128 символов. Эта вторая половина таблицы зарезервирована для символов национальных алфавитов. В России во второй половине таблицы содержатся, прописные и строчные буквы гражданского русского алфавита, введенного Петром I и построенного на основе кириллицы. В этой части таблицы содержатся так называемые псеводграфические символы, которые не имеют соответствующих им клавиш на клавиатуре компьютера, но могут быть выведены на экран путем набора их числового кода при нажатой клавише Alt. Содержит эта часть таблицы и некоторые специальные символы, отсутствующие в первой, международной части таблицы. К их числу относится радикал (знак квадратного корня). В этой части таблицы содержатся например коды для прописной буквы «Ж» - 134, строчной буквы «ж» -166, знака √ (радикал) – 251 и другие.

Следовательно, всего расширенная таблица, состоящая из международной и национальной части, содержит 256 символов. Обычно числовой код записывают в привычной всем нам десятичной системе счисления, но в ряде случае для его записи применяют и другую, шестнадцатеричную систему счисления, в которой помимо цифр от 0 до 9 используют также буквы латинского алфавита от «A» до «F», обозначающие числа от 10 до 15. На рис. 7.7.1 приведены символы, входящие в таблицу ASCII и соответствующие каждому из этих символов десятичный и шестнадцатеричный числовой код.


Рис. 7.7.1. Символы кодовой таблицы ASCII.

 

В каждом из столбцов первая запись слева обозначает десятичный код символа, вторая запись – код этого же символа, записанный в шестнадцатеричной системе счисления, широко применяемой в программировании. Справа в столбце изображен сам символ.

Большинство символов, которые не являются псевдографическими и управляющими, можно использовать в программе непосредственно в виде символьных констант. Употребляемые в программе символьные константы записываются так: ‘A’ ‘y’ ‘?’ ‘щ’, то есть запись символьной константы состоит из символа, заключенного в апострофы.

Символьная переменная, она должна быть предварительно указана в разделе описаний подобно числовым переменным. Описание символьной переменной выглядит следующим образом:

< имя_переменной >:char;

где char – служебное слово, обозначающее тип данной переменной. char – это сокращение от английского слова character, означающего в переводе «символ».

Например, если в программе в разделе описания переменных мы видим:

var i,n: integer;

d: real;

sim,bukv: char;

то в данной программе используются две переменных целого типа (i и n), одна – вещественного типа(d), и две – символьного типа (sim и bukv). Если переменной символьного типа присваивается какое-либо значение, то оно также должно быть заключено в апострофы. Например:

sim:=’ш’;

означает что переменной sim было присвоено значение буквы «ш». Возможен в программе и такой оператор присваивания

cfr: =’7’;

наличие в программе такой записи говорит о том, что переменной cfr присваивается значение символа «7» (а не числа «7» как было бы в случае с числовой переменной).

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

‘л’<’н’

результат этой операции будет истинным (равен true), так как код символа ‘л’ равен 171, а код символа ‘н’ равен 173. А если мы запишем следующее соотношение:

‘к’>’т’

то такое соотношение будет ложным (false), так как код символа ‘к’ равен 170, а символа ‘т’ – 226. Можно проверять символьные величины также на равенство или неравенство друг другу. Знаки для операций сравнения символьных величин используются те же, что и для числовых величин.

В языке Паскаль для работы с символьными переменными используются специальные стандартные функции chr и ord.

Функция chr по известному числовому коду символа определяет сам этот символ.

Общий вид функции: chr (k)

где k – десятичный числовой код символа. Например, значение chr (33) будет равно ‘!’, chr (233) – ‘щ’ и т. д.

Действие функции ord противоположно функции chr. Аргументом данной функции является символ, а значением десятичный код данного символа. Общий вид данной функции: ord (‘s’)

где s – символ, код которого мы определяем. Обратите внимание, что обрабатываемый функцией символ должен быть обязательно заключен в кавычки, иначе при компиляции программы с использованием данной функции будет выдано сообщение об ошибке. Поэтому запись функции должна выглядеть в программе следующим образом ord (‘ж’), ord (‘ф’) и так далее. Для символа ‘ж’ функция выдаст код 166, для символа ‘ф’ - 228.


 

 


Рис. 7.7.2. Программа, выводящая символы кодовой таблицы ASCII и результаты ее работы

7.7.2. Строковые переменные

Для эффективной работы с текстом необходимо уметь обрабатывать не только отдельные символы, но и слова, фразы, строки, то есть группы символов. Для обработки таких групп символов в Паскале используется строковый тип данных. Для описания символьных переменных используется служебное слово string. Описание символьной переменной в общем виде выглядит следующим образом:

< имя_переменной >: string[ длина ];

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

var i: integer;

x: real;

stroka: string[25];

то это означает, что в данной программе наряду с переменными целого типа i и вещественного типа x используется и переменная строкового типа stroka, которая может содержать до 25 символов. Если же после имени переменной ее длина не указывается, то по умолчанию она считается равной 255 символам. В этом случае описание символьной переменной будет выглядеть так:

stroka: string;

Значения символьных переменных так же, как и уже знакомые нам символьные константы (к текстовым константам относятся, в частности, сообщения, выводимые оператором writeln) должны обязательно заключаться в апострофы. Таким образом, оператор присваивания строковой переменной stroka значения ‘набор_символов’ будет выглядеть следующим образом:

stroka:= ‘набор_символов’;

Подобно числовым переменным, строковые переменные можно «складывать» (присоединять одно слово к концу другого). Результат сложения также можно присваивать какой-либо символьной переменной. Например, если значение переменной slovo1 равно «Турбо », а переменной slovo2 – «Паскаль», то в результате операции:

slovo:=slovo1+slovo2;

значение переменной slovo станет равным словосочетанию «Турбо Паскаль». Можно присоединять к строковой переменной текстовую константу. Например, если в программе имеется следующий оператор:

fraza:=slovo + “версия 7.0”;

то в результате значение строковой переменной fraza станет равным «Турбо Паскаль версия 7.0».

Для работы со строковыми переменными в языке Паскаль используются различные функции, например, функция length. Аргументом данной функции является имя какой-либо символьной переменной, а значением фактическое количество символов, которое содержится в данной переменной (эта величина может быть меньше максимальной длины, заданной при описании переменной). Так значение функции length, аргументом которой является переменная stroka после выполнения вышеуказанного оператора присваивания, будет равно 14, а не 25, как указано в разделе описаний, так как фраза «набор символов» содержит 14 символов.

Если надо работать не со всей переменной целиком, а лишь с отдельным содержащимся в ней символом, то к этому символу можно обратиться непосредственно, указав имя строковой переменной и его порядковый номер в этой переменной, заключенный в квадратные скобки. Например, если мы напишем в основной части программы (а не в разделе описаний) stroka[5], то работать мы будем с буквой «р», которая является пятым по счету символом в данной переменной. При обращении к элементу строковой переменной в скобках после ее имени может указываться не только числовая константа, но и имя переменной целого типа. Например, если индекс i имеетзначение 10, то stroka[i ], определяет букву ‘в’, которая является в строковой переменной десятой по счету.

В качестве примера рассмотрим программу, которая для введенной строки символов выводит на экран компьютера последовательность соответствующих им числовых кодов таблицы ASCII рис. 7.7.3).

 


 

 


Рис. 7.7.3. Программа определения числовых кодов для вводимой строки символов и результаты ее работы

 

7.8. Массивы

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

 

7.8.1. Одномерные массивы

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

var < имя массива >: array[a..b] of < тип элементов >;

где var, array и of – служебные слова. Array означает массив, предлог of в данном случае – из, a и b – соответственно нижняя и верхняя границы диапазона массива.

Приведем примеры описания массивов:

var a: array[1..20] of integer;

это – описание массива с именем a, который может содержать до 20 элементов, причем все эти элементы целого типа.

var st: array[1..10] of string[15];

а в данном случае описан массив с именем st из 10 строковых элементов, каждый из которых может содержать до 15 символов.

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

Рассмотрим программу определения максимальной и минимальной температуры за месяц (рис. 7.8.1). Данные о температуре за каждый день в программе вводятся с клавиатуры и хранятся в массиве. Нижней границей диапазона массива будет 1, а верхней 31 (максимальное число дней, которое может быть в месяце). Переменная v - число дней, которое содержится в месяце. Переменные min и max – результат работы программы определяют соответственно вычисленное минимальное и максимальное значение температуры за месяц.

 

 

Рис. 7.8.1. Программа определения максимальной и минимальной температур за месяц и результаты ее работы

7.8.2. Двумерные массивы.

Простейшим примером двумерного массива является всем известная таблица умножения, в которой результат умножения двух чисел определяется по номеру строки, соответствующей одному из сомножителей, и номеру столбца, соответствующему другому. Соответственно и в любом двумерном массиве элемент определяется по двум индексам.

В языке Паскаль в общем виде двумерные массивы описываются следующим образом:

var < имя массива >: array[ a..b,c..d ] of < тип элементов >;

где a и b – соответственно верхняя и нижняя граница диапазона значений для первого индекса; c и d - верхняя и нижняя граница диапазона значений для второго индекса.

Двумерный массив таким образом можно представить в виде таблицы, имеющей b-a+1 строк и c-d+1 столбцов.

Пример описания двумерного массива:

var tabl: array [ 1..9,1..10 ] of integer;

таким образом, описан целочисленный массив, содержащий 9 строк и 10 столбцов.

Рассмотрим основные приемы работы с двумерными массивами на примере программы arrsum, составленной для решения следующей задачи: дан двумерный массив размерностью 4*5. Элементами данного массива являются вещественные числа. Требуется: заполнить массив произвольными числами, затем вывести содержимое массива на экран компьютера, подсчитать сумму элементов для каждого столбца, имеющегося в массиве, и сформировать из этих сумм одномерный массив. Ниже приводится текст программы.

program arrsum;

Uses Crt;

Var

f :array[ 1..4,1..5 ] of real; x :array[ 1..5 ] of real; i,j :integer; s :real;

Begin

Clrscr;

for i:=1 to 4 do

for j:=1 to 5 do

Begin

writeln ('Введите ',j,' элемент ',i,' строки');

readln (f[i,j])

end;

writeln ('элементы двумерного массива');

for i:=1 to 4 do

Begin

for j:=1 to 5 do write ( f[i,j]:7:2,' ' );

Writeln

end;

writeln ('элементы одномерного массива');

for j:= 1 to 5 do

Begin

s:=0;

for i:=1 to 4 do

s:=s+f[i,j];

x[j]:=s;

write( x[j]:7:2,' ' )

end;

Readln

End.

В программе arrsum в разделе описания переменных описываются два массива. Первый из них – это двумерный массив f, который в дальнейшем будет заполнен числами вещественного типа. В данном массиве, как видно из описания, имеется 4 строки и 5 столбцов. Второй описанный в разделе массив x является одномерным и в дальнейшем будет заполнен элементами, каждый из которых представляет собой сумму элементов, содержащихся в одном из столбцов двумерного массива. Всего в одномерном массиве x должно быть 5 элементов – по количеству столбцов в двумерном массиве f. Вспомогательная переменная s – используется для подсчета суммы элементов, содержащихся в одном из столбцов


Рис. 7.8.2. Результаты работы программы, заполняющей двумерный массив произвольными элементами, и формирующей на его основе одномерный массив

7.9. Функции и процедуры.

 

7.9.1. Функции

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

Исходные данные называются аргументом функции, а вычисленный результат – ее значением. При обращении к функции аргумент указывается в круглых скобках.

К наиболее широко употребляемым стандартным функциям кроме уже известных нам функций length, ord и char, используемых для работы со строковыми переменными, относятся также следующие:

abs(x) – определяет aбсолютное значение аргумента, которым может быть число или выражение целого или вещественного типа;

arctan(x) – вычисляет арктангенс угла, значение которого выражено в радианах;

cos(x) – вычисляет косинус угла, значение которого выражено в радианах;

exp(x) – вычисляет экспоненту аргумента (то есть e в степени x);

int(x) – определяет целую часть аргумента. Значением функции является величина вещественного типа;

ln(x) – вычисляет натуральный логарифм аргумента (т. е. логарифм по основанию e);

pi – данная функция не имеет параметров, а значением ее является число 3.1415926…

round(x) – округляет значение аргумента до ближайшего целого числа;

sin(x) - вычисляет cинус угла, значение которого выражено в радианах;

sqr(x) – вычисляет квадрат аргумента, которым может быть число или выражение целого или вещественного типа;

sqrt(x) – вычисляет квадратный корень из аргумента;

trunc(x) – определяет целую часть аргумента. Значением функции является величина целого типа;

copy(x,n,l) – выделяет в строковой переменной x группу символов, начиная с позиции с номером n. Длина группы равна l. Параметры n и l должны быть величинами целого типа;

delete(x,n,l) – удаляет из строковой переменной x группу символов, начиная с позиции с номером n. Количество символов равно l.

 

В качестве примера программы с использованием стандартных функций рассмотрим программу решения квадратного уравнения ax2+bx+c=0 ( рис. 7.9.1).

В данной задаче вначале с помощью стандартной функции sqr вычисляется дискриминант уравнения. В зависимости от значения дискриминанта выясняется, имеет ли данное уравнение решение. Если решения нет, то соответствующее сообщение выводится на экран компьютера. В случае же, если решение имеется, оно определяется с помощью стандартной функции sqrt.


При значениях коэффициентов уравнения 2, 7 и 3 получаем решение, изображенное на рис. 7.9.1.

 


Рис. 7.9.1. Программа решения квадратного уравнения и результаты его решения.

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

 

Структура описания создаваемой программистом функции выглядит следующим образом:



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: