Типы данных
В большинстве применений компьютера алфавитно-цифровая информация используется наряду с числовой. Прежде чем мы сможем написать программу, которая манипулирует алфавитно-цифровыми знаками (литерами), нам потребуется тип данных для их представления. Для этих целей в языке Паскаль предусмотрен тип данных char. Так же, как переменная типа integer может хранить одно целое число, переменная типа char может хранить один символ. Например,
| Var Alpha : char; Begin Alpha :=’p’; Alpha :=’+’; Alpha :=’3′; Alpha :=’ ‘; Alpha :=»»; |
Первый оператор присваивания записывает в переменную Alpha литеру р. Второй делает Alpha равной литере плюса (+). Третий делает Alpha равной символу 3. Заметим, что символ 3 отличается от целого числа 3 тем, что символ не может быть использован в арифметических операциях. Четвертый оператор присваивания делает Alpha равной литере пробела. Хотя литера пробела при печати не изображается, она является обыкновенным значением типа char. Последний оператор присваивания делает Alpha равной литере апострофа, это специальный случай, так как знак апострофа используется для ограничения значения типа char. Мы будем пользоваться множеством литер, находящимся в таблице кодов, называемой ASCII — американский стандартный код обмена информацией. Все символы упорядочены, т.к. имеют свой личный номер. Важно, что соблюдаются следующие отношения: ‘A’ < 'B' < 'C' < . < 'X' < 'Y' < 'Z' '0' < '1' < '2' < . < '7' < '8' < '9'Для проверки равенства или неравенства переменных типа char могут использоваться операторы сравнения. Задача. Написать программу, которая считывает две литеры и печатает больше, равна или меньше первая литера второй.
| Program Sravnenie; Var First, Second : char; Begin write (‘Введите две литеры: ‘); readln (First, Second); write (‘Первая литера ‘); if First > Second then write (‘больше второй. ‘) else if First = Second then write (‘равна второй. ‘) else write (‘меньше второй. ‘); Еnd. |
Так как char — порядковый тип, то к его значениям применимы следующие функции.
Succ — возвращает следующий символ литерного множества; Pred — возвращает предыдущий символ литерного множества; Ord — возвращает значение кода литеры; Chr — возвращает значение литеры по ее коду, является обратной по отношению к функции Ord.
Например, Succ(‘0′)=’1’ — символ, следующий за символом 0, равен символу 1. Pred(‘3′)=’2′ — символ, предшествующий символу 3, равен 2; Chr(65)=’A’ — символ, соответствующий коду 65, равен А; Ord(‘A’)=65 — код символа А равен 65.
Лекция 4. Строки
Строка — последовательность символов. Минимальная длина строки равна нулю. Это — пустая строка. Строки похожи на одномерные массивы, но могут изменять длину во время работы программы. В Turbo Pascal 7 есть 2 типа данных для работы со строками.
A) Тип string — это строка длиной не более 255 символов.
Можно указать максимальную длину строки, например — string[50]. Рассмотрим программу:
var ss: string; st: string[20]; begin ss:= 'Это пример строки'; st:= copy(ss,1,11)+ ss[5]+'рограммы !'; writeln (st); readln; end. ------- Результат: Turbo Pascal Version 7.0 Copyright (c) 1983,92 Borland International Это пример программы
В примере строка st описана с указанием максимальной длины (лишние символы справа отбрасываются), поэтому результат равен: st =’Это пример программы’.
ss[5] — это 5-й символ строки ss, т е ‘п’. Copy — это функция, которая (здесь) возвращает 11 символов строки ss, начиная с 1-го символа. Знак + соединяет строки. Цепочка символов, заключенная в апострофы есть КОНСТАНТА строкового типа.
Каждый символ строки занимает при хранении в памяти один байт. В памяти хранится код символа, т е число 0..255. Длину строки можно увидеть в нулевом символе, т е ss[0] = 17 и st[0] = 20, но чтобы это увидеть в программе, требуется преобразование к типу Byte, например:
writeln(‘Длина строки ss = ‘, byte(ss[0]));
Существует много подпрограмм для работы со строками (но в Delphi их еще больше, а в PHP — много)
--------------- procedure Delete (var S: string; Index,Count:Integer); Удаляет подстроку из строки S. Параметр S - переменная строкового типа. Index и Count - целочисленные выражения. Delete удаляет Count символов из строки S, начиная с позиции Index. --------------- procedure Insert (Source: string; var S: string; Index: Integer); Вставляет подстроку в строку. Параметр Source - выражение строкового типа. Параметр S - переменная строкового типа любой длины. Index - выражение целочисленного типа. Процедура Insert вставляет строку Source в строку S в позиции с номером Index. Если возникающая в результате строка длиннее 255-и символов, то она усекается после 255-го символа. --------------- procedure Str (X [: Width [: Decimals ]]; var S) Преобразовывает число в строку. Преобразовывает числовое значение X в строковое представление этого числа, Необязательные: Width - ширина поля вывода, Decimals- число цифр дробной части. -------------- procedure Val (S; var V; var Code: Integer) Преобразовывает строковое значение в его числовое представление. Где: S - переменная строкового типа. Должна представлять последовательность символов, формирующих число. V - переменная типа Real или Integer Code - переменная типа Integer Преобразовывает строковое значение (S) в его числовое представление, как это происходит при чтении из текстового файла с помощью Read. Code - позиция, в которой произошла ошибка при преобразовании, или нуль, если ошибки не было. ------------------ function Copy (S; Index, Count: Integer): string; Возвращает подстроку строки. Параметр S - выражение строкового типа. Index и Count - выражения целочисленного типа. Функция Copy возвращает подстроку строки S, содержащую Count символов, начиная с символа с номером Index. ---------------- function Length (S): Integer; Возвращает динамическую длину строки. ----------------- function Pos (Substr: string; S: string): Integer; Параметры Substr и S - строковые выражения. Pos ищет первое вхождение строки Substr в строку S и возвращает целочисленное значение, которое является индексом первого символа Substr внутри S. Если строка Substr не найдена, то Pos возвращает нуль. ------------- Примечание: подробнее - читайте в справочной системе Турбо-Паскаль7
Эти же подпрограммы есть в Делфи. Чтобы найти их и другие подпрограммы, поступим так:
1. В окне редактора (среды IDE Делфи), где виден текст разрабатываемого модуля допишем lehgth к какому-нибудь комментарию, например: < Public declarations length >
2. Поставим курсор внутрь lehgth (это имя одной из строковых функций) и нажмем клавишу F1. Далее в окошке «Найденные разделы» выберем Length function ( Object . Щелкнем «Показать». Получим справку об этой функции. НО САМОЕ ВАЖНОЕ — здесь же список подпрограмм для работы со строками (string handling routines). Щелкаем эту ссылку и видим список. Незнающим английский не стоит комплексовать, так как разобраться в синтаксисе можно, зная только Паскаль. Однако имена подпрорамм понимать очень полезно.
3.Например,
function AnsiEndsText(const ASubText, AText: string): Boolean; возвращает true, если строка ASubText является суффиксом (окончанием) строки AText. Здесь ANSI-кодировка (1 символ в 1 байте), Ends- конец, Text- вероятно, угадаете.
4.Аналогично можно найти тригонометрические функции Делфи, «зацепившись» за sin (Category — trigonometry routines), или арифметические, начав с sqrt — корень квадратный.(Category -arithmetic routines)
Б) ASCIIZ — строка размером до 64Кб, оканчивающаяся кодом 0
Этот тип данных введен в 7-й версии Turbo Pascal. Определение типа:
type PChar = ^Char;
То есть это просто УКАЗАТЕЛЬ на один символ. (Тип данных — указатели будет рассмотрен далее). Однако в режиме «Расширенный синтаксис» компилятора (это режим — по умолчанию) переменные типа PChar можно использовать как переменные типа:
type PChar = array[0..K] of Char;
где K < 64*1024 - число символов в строке ( не считая завершающего нуля). Использование переменных этого типа немного отличается от использования переменных типа string.
1. Если s1: PChar; s2:string; то s1[0] и s2[1] — крайние левые символы строк.
2. Для типа PChar используются другие подпрограммы. Пример на Turbo Pascal7
uses strings; var ss: string; ssP,stP: PChar; ii:Integer; begin ssP:= ‘Это пример строки’#0; ss:= Copy(StrPas(ssP),1,11)+ ssP[4]+’рограммы !’; StrPCopy(stP, ss); for ii:=0 to StrLen(stp) do write(stp[ii]); readln; end.
В этом примере работа со строками выполняется над данными типа string, а показанные здесь функции StrPas StrPCopy выполняют только преобразование типов. Для использования этих подпрограмм необходимо подключить модуль strings. Тип PChar необходим для обращения к функциям ОС Windows, т е при использовании WinAPI (для этого в Делфи есть модуль Windows, а в TPas7 — WinProcs, WinTypes) Рассмотрим аналогичный пример в Делфи (консольная программа). Комментарии в тексте.
program PChar1; uses sysutils; var pss,pst: PChar; ss: string; begin pss:= 'Eto primer stroki'; ss:= copy(StrPas(pss),1,11) + pss[4]+'rogrammi !'; < StrPas(pss) - преобразует строку pss к типу string copy - функция, рассмотренная ранее для Turbo Pascal >GetMem(pst,Length(ss) + 1); < GetMem - выделяет переменной pst память на 1 больше размера строки ss>pst := StrPCopy(pst,ss); writeln('Result= ',pst); readln; end.
В) Для работы со строками в Делфи можно использовать типы данных:
1. ShortString — это тип, который в Паскале назывался string. Допускается ограничение длины: string[20];
2. AnsiString — в работе с переменными этого типа используются те же подпрограммы и методы, как для коротких строк. Можно хранить строки не длинее 2Гб. Однако при объявлении таких переменных память для них не выделяется. Она будет выделена при присваивании или процедурой SetLength. Присваивание таким строкам значений типа PChar требуется предварительное преобразование типов, например,
var ss: string; sp: PChar; begin . . . ss:= PChar(sp);
Примеры преобразований можно видеть в предыдущем примере.
3. WideString — тип, предназначенный для хранения текстов в кодировке UniCode. Для каждого символа отводится 2 байта. В остальном он похож на AnsiString.
4. Под типом string в Делфи понимают, в зависимости от настройки компилятора, или AnsiString или WideString.
5. И, конечно, PChar, такой же, как в Паскале, но может хранить до 2Гб.
Примеры программ и варианты заданий по этой теме можно найти в справочнике-задачнике. Запустите его, щелкните кнопку «Задания», выберите: Турбо-Паскаль, Задание 3-а.
Turbo Pascal задачи на строки.
Здравствуйте. помогите плиз я уже не знаю что делать.
Если вы в строках понимаете, то тут 3 лёгкие задачи для вас:
1. Дана строка длиной не более 255 символов. Словом назовём последовательностью символов без пробела. Подсчитать количество слов в строке. ПРимер: «раз два раз два раз два три» Ответ: 3.
2. Дана строка не более 255 символов. Словом назовём последовательность букв латинского алфавита. Подсчитать кол-во слов в строке.
Пример: «Hello!My name is Peter.» Ответ: 5. Хм и я заметил что в примере после ! нету пробела. так что это не моя опечатка, так написано.
3. Заменить все гласные латинские буквы на *. Пример: «Hello! My name is Peter.» Ответ: «H*ll*! M* n*m* *s P*t*r.»
а вот тут есть пробел после !.
Плиз помогите.
Лучший ответ
1. k:=0;
for j:=0 to length(s) do
if (s[j]=’ ‘) then k:=k+1;
writeln(k);
если в слове будут повторяющиеся подряд пробелы, будет считать не правильно — проверяй тогда чтобы s[j+1]<>‘ ‘. так же, если начинается строка с пробела, будет неверно.
2. k:=0;
for j:=0 to length(s) d
if (s[j]>=’ ‘) or (s[j]=’!’) or (s[j]=’.’) or (s[j]=’,’) then k:=k+1;
writeln(k);
опять же, если любые из этих символов будут идти подряд — работать верно не будет. отсутствие пробела после воскл. знака намекает что такого не должно быть) )
3. for j:=0 to length(s) do
if (s[j]=’a’) or (s[j]=’e’) or (s[j]=’i’) or (s[j]=’o’) or (s[j]=’u’) or (s[j]=’y’) then s[j]=’*’;
вроде все гласные латинские буквы перечислил? не забудь потом вывести строку если что.
Остальные ответы
«помогите плиз я уже не знаю что делать. «
Учить Паскаль, вот что 🙂
Строковый тип данных в языке Pascal
Познакомимся с типом данных, который относится к числу структурированных. Это строковый тип данных (строка). Строка это последовательность символов. Каждый символ занимает 1 байт памяти (код ASCII). Количество символов в строке называется ее длиной . Длина строки может находиться в диапазоне от 0 до 255. Строковые величины могут быть константами и переменными. Особенностью строки в Turbo Pascal является то, что с ней можно работать как с массивом символов, с одной стороны, и как с единым объектом, с другой. За счет этого обработка строк достаточно гибка и удобна. Строковая константа есть последовательность символов, заключенная в апострофы. Например: ‘это строковая константа’, ‘272’. Строковая переменная описывается в разделе описания переменных следующим образом:
Var Name : string[20];
Параметр длины может и не указываться в описании. В таком случае подразумевается, что он равен максимальной величине 255. Например: Var slovo : string.
Строковая переменная занимает в памяти на 1 байт больше, чем указанная в описании длина. Дело в том, что один (нулевой) байт содержит значение текущей длины строки. Если строковой переменной не присвоено никакого значения, то ее текущая длина равна нулю. По мере заполнения строки символами ее текущая длина возрастает, но она не должна превышать максимальной по описанию величины.
Символы внутри строки индексируются (нумеруются) от единицы. Каждый отдельный символ идентифицируется именем строки с индексом, заключенным в квадратные скобки. Например: N[5], S[i], slovo[k+l]. Индекс может быть положительной константой, переменной, выражением целого типа. Значение индекса не должно выходить за границы описания.
Тип string и стандартный тип char совместимы. Строки и символы могут употребляться в одних и тех же выражениях.
Строковые выражения строятся из строковых констант, переменных, функций и знаков операций. Над строковыми данными допустимы операции сцепления и операции отношения.
Операция сцепления (конкатенации) (+) применяется для соединения нескольких строк в одну результирующую строку. Сцеплять можно как строковые константы, так и переменные.
Пример: ‘Мама ‘ + ‘мыла ‘ + ‘раму’. В результате получится строка: ‘Мама мыла раму’. Длина результирующей строки не должна превышать 255.
Операции отношения: =, , =, <>. Позволяют произвести сравнение двух строк, в результате чего получается логическое значение (true или false). Операция отношения имеет приоритет более низкий, чем операция сцепления. Сравнение строк производится слева направо до первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий символ имеет больший номер в таблице символьной кодировки. Если строки имеют различную длину, но в общей части символы совпадают, считается, что более короткая строка меньше, чем более длинная. Строки равны, если они полностью совпадают по длине и содержат одни и те же символы.
| Выражение | Результат |
| ‘True1’ ’MOTHER’ | True |
| ‘Мама ‘ <> ‘Мама’ | True |
| ‘Cat’=’Cat’ | True |
Функция Copy(S, Pozition, N) выделяет из строки S подстроку длиной N символов, начиная с позиции Pozition. Здесь N и Pozition целочисленные выражения.
| Значение S | Выражение | Результат |
| ‘Мама мыла раму’ | Copy(S, 6, 4) | ‘мыла’ |
| ‘Маша ела кашу’ | Copy(S, 1, 8) | ‘Маша ела’ |
Функция Concat(S1, S2, …, SN) выполняет сцепление (конкатенацию) строк S1, S2, …, SN в одну строку.
| Выражение | Результат |
| Concat(‘Маша ‘, ‘ела ‘, ‘кашу’) | ‘Маша ела кашу’ |
Функция Length(S) определяет текущую длину строки S . Результат значение целого типа.
| Значение S | Выражение | Результат |
| ‘test-5’ | Length(S) | 6 |
| ‘(A+B)*C’ | Length(S) | 7 |
Функция Pos(S1, S2) обнаруживает первое появление в строке S2 подстроки S1. Результат целое число, равное номеру позиции, где находится первый символ подстроки S1. Если в S2 подстроки S1 не обнаружено, то результат равен 0.
| Значение S2 | Выражение | Результат |
| ‘abcdef’ | Pos(‘cd’, S2) | 3 |
| ‘abcdcdef’ | Pos(‘cd’, S2) | 3 |
| ‘abcdef’ | Pos(‘k’, S2) | 0 |
Процедура Delete(S, Poz, N) удаление N символов из строки S , начиная с позиции Poz.
| Исходное значение S | Оператор | Конечное значение S |
| ‘abcdefg’ | Delete(S, 3, 2) | ‘abefg’ |
| ‘abcdefg’ | Delete(S, 2, 6) | ‘a’ |
В результате выполнения процедуры уменьшается текущая длина строки в переменной S .
Процедура Insert(S1, S2, Poz) вставка строки S1 в строку S2, начиная с позиции Poz.
| Исходное значение S2 | Оператор | Конечное значение S2 |
| ‘ЭВМ РС’ | Insert(‘IBM-‘, S2, 5) | ‘ЭВМ IBM-PC’ |
| ‘Рис. 2’ | Insert(‘N’, S2, 6) | ‘Рис. N 2’ |
- Как можно объявить величину строкового типа?
- К каким типам данных относятся строки?
- Какова максимально возможная длина строки?
- С величиной какого типа данных совместим по присваиванию отдельный символ строки?
- Расскажите об операциях, которые можно выполнять над строковыми величинами.
- Расскажите о функциях, определенных для величин строкового типа.
- Расскажите о процедурах, определенных для величин строкового типа.
- Как осуществляется доступ к отдельному символу строки?
- Почему значение отношения ‘Мама’<>‘мама’ равно TRUE?
- Дан фрагмент программы:
S:= ''; For I:= '0' to '9' do S:=S+I;
Type String40 = String[40]; M = Array[1..100] Of String40; Var A : M; I, J, Min, N : Byte; Vsp : String40; Begin Write('N? '); ReadLn(N); For I := 1 To N Do ReadLn(A[I]); For I := 1 To N-1 Do Begin Min := I; For J := I + 1 To N Do If A[J] < A[Min] Then Min := J; Vsp := A[I]; A[I] := A[Min]; A[Min] := Vsp; End; WriteLn('Ответ: '); For I := 1 To N Do WriteLn(A[I]) End.
Var S : Array[1..100] Of String;