Файл: Данные и их типы.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 30.06.2023

Просмотров: 66

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Например, чтобы обратиться к третьему символу строки SumStr надо записать SumStr[3]. Запись SumStr[0] дает значение текущей длины строки.

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

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

Program StringLength;

Var
  S : string; {макс. длина строки = 255}

Begin

  S:=''; {пустая строка}

  writeln (S,' ',SizeOf(S),' ',Length(S)); {размер=256, длина=0}
  S:='Пример длинной строки'; {присваиваем строке некоторое значение}

  writeln (S,' ',SizeOf(S),' ',Length(S)); {размер=256, длина=21}

  Delete(S,7,8); {удаляем из строки 8 символов, начиная с 7}

  writeln (S,' ',SizeOf(S),' ',Length(S)); {размер=256, длина=13}

  S:=S+' символов'; {добавляем к строке строку}

  writeln (S,' ',SizeOf(S),' ',Length(S)); {размер=256, длина=22}

End.

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

Program StringElements;

Var

  S : string; {макс. длина строки = 255}

Begin

  S:='ABCD'; {инициализация строки}

  writeln (S,' ',Length(S)); {вывод строки и ее длины}

  S[5] := 'E'; {присваивание элементу строки}

  writeln (S,' ',Length(S)); {ни сама строка, ни ее длина не изменились}

End.

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

Program StringElements2;

Var

  Str : string[26]; {длина строки = 26}

i : integer;

Begin

Str:='A'; 

  for i := 1 to 26 do

    Str[i] := Chr (Ord('A')+i-1);


  writeln(Str);

End.

Предполагается, что данная программа должна сформировать строку из 26 символов, содержимым которой является последовательность заглавных букв латинского алфавита. Однако вызов процедуры writeln показывает, что содержимым переменной Str будет строка из одного символа 'А'. Природа совершенной ошибки заключается в том, что присваивание значений элементам строки не влияет не текущую длину, которая была установлена равной 1 при первом присваивании. Поэтому правильной будет следующая программа:

Program stringElements3;

Var

  Str : string[26]; {длина строки = 26}

  i : integer;

Begin
  S:='';

  for i := 'A' to 'Z' do

    Str := Str + i;

  writeln(Str);

End

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

Переменные логического типа описываются посредством идентификатора Boolean. Они могут принимать только два значения - False (ложь) и True (истина). Описываются они также в разделе описания переменных.

Var
  Flag : Boolean;

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

В языке Турбо Паскаль имеются логические операции, применяемые к переменным логического типа. Это операции not, and, or и хor. В этой теме Вы рассмотрите три логические операции. Обозначения и результаты этих операций приведены в таблице. Рассмотрите ее.

Операция not (не) имеет один операнд и образует его логическое отрицание. Результат операции not есть False, если операнд истинен, и True, если операнд имеет значение ложь. Так,

not True  False (неправда есть ложь)

not False  True (не ложь есть правда)

Результат операции and (и) есть истина, только если оба ее операнда истинны, и ложь во всех других случаях.

Результат операции or (или) есть истина, если какой-либо из ее операндов истинен, и ложен только тогда, когда оба операнда ложны.

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