Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal.doc
Скачиваний:
32
Добавлен:
12.03.2016
Размер:
3.29 Mб
Скачать
      1. Строковый тип String. Работа со строками

Со строковым типом Stringмы познакомились в 0.14.

Как можно сэкономить память, работая со строками? Если мы напишем VAR a:String, то Паскаль отведет под символы строковой переменнойa 255 байтов. Если мы не собираемся присваивать переменной bзначений длиннее, например, 20 байтов, то выгодно написатьVAR b:String[20]. В этом случае под символы переменнойbв памяти будет отведено 20 байтов.

Теперь разберем функции для работы над строками.

Исходные данные

Операция

Результат

Пояснение

s1:='Мото'; s2:='роллер'

s3:=s1+s2

s3='Мото-роллер'

Операция + над двумя строками просто соединяет две строки в одну

s5:='Мото-роллер'

k:=Pos('рол',s5)

k=5

Функция Pos возвращает позицию, на которой находится строка 'рол' в строке s5

s3:='Мото-роллер'

l:=Length(s3)

l=10

Функция Length (длина) выдает (возвращает) количество символов в строк

s3:='астро-ном'

s4:=Copy(s3,3,4)

s4= ‘трон’

Функция Copy возвращает часть строки длиной 4, начиная с третьего символа

s5:='Коро-бочка';

Delete(s5,4,2)

s5='Коро-чка'

Процедура Delete удаляет из строки s5 два символа, начиная с четвертого

s6:='Рука'; s7:='баш';

Insert(s7,s6,3)

s6='Руба-шка'

Процедура Insert вставляет в строку s6 строку s7, начиная с третьего символа

x:=2.73284

Str(x:4:2,s8)

s8='2.73'

Процедура Str преобразует число в строку. 4:2 – это желаемый формат числа (см. 3.5)

s8='2.73'

Val(s8,x,Osh)

x=2.73

Процедура Val преобразует строку в число. Параметр Osh должен иметь тип Integer. Он имеет смысл при анализе ошибки в преобразовании

Процедура Strможет вам понадобиться, например, вот в каком случае. МодульGraphимеет возможность печатать на экране большими красивыми шрифтами (см. 4.6). Но так печатает он только строковый тип. А в программе “Торпедная атака” вам может захотеться печатать красивым шрифтом счетчик подбитых кораблей, который у вас описан, как целочисленный. Вот тут и пригодитсяStr. Примеры использованияStrиValсм.в 4.6.

Если задана строка s:='Банка', то считается автоматически заданным массив символов с тем же именем:s[1]=’Б’, s[2]=’а’, s[3]=’н’, s[4]=’к’, s[5]=’а’. Тогда после выполнения оператораs[3]:=’р’мы получимs='Барка'.

Строки можно сравнивать. Условие s1=s2считается выполненным, если обе строки абсолютно одинаковы, включая и пробелы. Сравнение идет посимвольно слева направо. Поэтому считается, что‘панк’ < ‘парк’, так как первый несовпадающий символ ‘р’ имеет больший номер, чем ‘н’.

Задание 114:Среди детей встречается игра, заключающаяся в зашифровке своей речи “для секретности” за счет вставки в произносимые слова какого-нибудь словосочетания, например, “быр”. Тогда вместо слова “корова” будет произнесено “кобырробырвабыр”. Составьте программу, которая распечатывает заданную строку, после каждой второй буквы вставляя “быр”.

Задание 115:Давайте поставим задачу шифрования текста более серьезно. Имеется строка текста. Требуется написать программу, которая зашифровывала бы ее в другую строку. Способов шифровки вы можете придумать сколько угодно. Попробуйте такой – заменять каждый символ текста символом, следующим по порядку в таблице ASCII. Тогда словоКОТ превратится в словоЛПУ. Составьте, пожалуйста, и программу дешифровки. Когда вы познакомитесь с файлами, вы сможете уже зашифровывать и дешифровывать не отдельные строки, а целые тексты. В том числе и ваши паскалевские программы.

      1. Записи

На вооружении флота 100 подводных лодок. Адмиралу часто приходится решать задачи такого типа: 1)перечислить названия лодок, имеющих скорость, превышающую скорость вражеской подводной лодки Шредер; 2)подсчитать, сколько лодок имеют на вооружении больше 10 торпед; и т.д. Чтобы ускорить решение таких задач, адмирал приказал занести в компьютер сведения обо всех лодках, включая вражеские лодки ШредериРокстеди, а именно: их названия, скорость и число торпед, находящихся на вооружении.

Отвести место в оперативной памяти под указанную информацию о 102 лодках можно двумя способами: 1)с помощью массивов, 2)с помощью записей.

Рассмотрим программу, использующую первый способ. В каждом массиве будет 102 элемента, причем элементы 101 и 102 отведены под лодки противника.

VARnazvanie :array[1..102]ofString; {Место под 102 названия} skorost :array[1..102]ofReal; {Место под 102 скорости} torped :array[1..102]ofByte; {Место под 102 количества торпед} i :Integer;BEGIN{Здесь каким-нибудь способом заносим в отведенное место всю информацию, например, присвоением - nazvanie[1]:='Щука'.... или загрузкой из файла} {А теперь решим первую из двух задач:}fori:=1to100doifskorost[i] > skorost [101]thenWriteLn(nazvanie[i])END.

В памяти компьютера информация размещается в том порядке, в котором она встречается в описаниях:

ЯЧЕЙКИ ДЛЯ ИНФОРМАЦИИ

ИНФОРМАЦИЯ

nazvanie[1]

Щука

nazvanie[2]

Дельфин

...........

........

nazvanie[101]

Шредер

nazvanie[102]

Рокстеди

skorost[1]

26

skorost[2]

24

...........

........

skorost[101]

20

skorost[102]

18

torped[1]

6

torped[2]

10

...........

........

torped[101]

15

torped[102]

22

i

?

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

Рассмотрим второй способ. Иногда бывает удобно, чтобы данные, касающиеся одной лодки, хранились в памяти рядом, вот так:

ЯЧЕЙКИ ДЛЯ ИНФОРМАЦИИ

ИНФОРМАЦИЯ

lodka[1].nazvanie

Щука

lodka[1].skorost

26

lodka[1].torped

6

lodka[2].nazvanie

Дельфин

lodka[2].skorost

14

lodka[2].torped

10

. . . . . . . . . . . . . .

. . . . . . . . .

vr .nazvanie

Шредер

vr .skorost

20

vr .torped

15

prot .nazvanie

Рокстеди

prot .skorost

18

prot .torped

22

Выстроенную подобным образом информацию в памяти компьютера часто называют базой данных.

Сами по себе массивы не позволяют хранить информацию в таком порядке, для этого нужно использовать записи. Запись- это набор данных (полей)различныхтипов, касающийся одного объекта. Например, запись, касающаяся нашей первой лодки, это набор трех полей: название -Щука(типString), скорость - 26 (типReal), количество торпед - 6 (типByte). Точка отделяет имя поля от обозначения записи, содержащей это поле.

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

Прежде чем отводить место в памяти под всю информацию, объясним Паскалю, из чего состоит одна запись, то есть опишем ее, задав специальный тип записи record и придумав ему имя, скажем,podlodka:

TYPE podlodka = record nazvanie :String; skorost :Real; torped :Byte; end; ..........

Тип определен, но место в памяти пока не отведено. Здесь нам, хочешь-не хочешь, придется воспользоваться массивом. При помощи VARотведем место под массив из 100 записей для наших подлодок и отдельное место под две записи для вражеских. Массиву придумаем имяlodka.

VAR lodka :array[1..100] of podlodka; vr,prot :podlodka; {Записи для двух вражеских лодок} i :Integer;

..........................

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

Вот программа целиком:

TYPE podlodka = record nazvanie :String; skorost :Real; torped :Byte; end; VAR lodka :array[1..100] of podlodka; vr,prot :podlodka; i :Integer;

BEGIN{Здесь задаем значения полям всех записей. Конечно, удобнее это делать при помощи типизированных констант (см.следующую программу) или файлов данных, но я использую простое присвоение:} lodka[1].nazvanie :='Щука'; lodka[1].skorost :=26; . . . . . . . .prot.torped :=22; {А теперь решаем первую задачу:} for i:=1 to 100 do if lodka[i].skorost > vr.skorost then WriteLn (lodka[i].nazvanie) END.

Согласитесь, что при использовании записей текст программы гораздо понятнее.

Теперь запишем нашу программу с использованием типизированных констант, для краткости ограничив наш флот тремя подводными лодками:

TYPE podlodka = record nazvanie :String; skorost :Real; torped :Byte; end; CONST lodka : array[1..3] of podlodka = ((nazvanie:'Щука'; skorost:26; torped: 6), (nazvanie:'Дельфин'; skorost:14; torped:10), (nazvanie:'Леонардо'; skorost:28; torped:11)); vr : podlodka = (nazvanie:'Шредер'; skorost:20; torped:15); prot : podlodka = (nazvanie:'Рокстеди'; skorost:18; torped:22); VAR i : Integer; BEGIN for i:=1 to 3 do if lodka[i].skorost > vr.skorost then WriteLn(lodka[i].nazvanie); END.

Здесь вы видите, как правильно придавать начальные значения типизированным константам типа record.

Задание 116: Создайте базу данных о своих родственниках. О каждом родственнике должно быть известно:

  • Имя

  • Год рождения

  • Цвет глаз

Массивы не используйте. Программа должна:

  1. Распечатать ваш возраст и цвет глаз

  2. Ответить на вопрос – правда ли, что ваш дядя старше тети.

Задание 117:Создайте базу данных о своих однокашниках. О каждом однокашнике должно быть известно:

  • Фамилия

  • Имя

  • Пол

  • Год рождения

Обязательно используйте массив не меньше, чем из 10 записей. Программа должна:

  1. Вычислить средний возраст ваших однокашников

  2. Определить, кого среди них больше – дам или кавалеров

  3. Ответить на вопрос – есть ли в вашей базе тезки (это нелегко).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]