шаблоны сайт визитка joomla
Скачать шаблоны Joomla 3.5 бесплатно
Вы находитесь здесь:Главная»Учебные материалы»Pascal»Pascal. Строковый тип данных

Pascal. Строковый тип данных

Строковой тип данных

Для обработки строковой информации в Турбо Паскаль введен строковый тип данных. Строкой в Паскале называется последовательность из определенного количества символов. Количество символов последовательности называется длиной строки. Синтаксис:

var s: string[n];
var s: string;

n - максимально возможная длина строки - целое число в диапазоне 1..255. Если этот параметр опущен, то по умолчанию он принимается равным 255.

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

Пример: 'Текстовая строка'

Пустой символ обозначается двумя подряд стоящими апострофами. Если апостроф входит в строку как литера, то при записи он удваивается.

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

В Турбо Паскаль имеется простой доступ к отдельным символам строковой переменной: i-й символ переменной st записывается как st[i]. Например, если st - это 'Строка', то st[1] - это 'С', st[2] - это 'т', st[3] - 'р' и так далее.

Над строковыми данными определена операция слияния (конкантенации), обозначаемая знаком +. Например:

a := 'Turbo';
b := 'Pascal';
c := a + b;

В этом примере переменная c приобретет значение 'TurboPascal'.

Кроме слияния над строками определены операции сравнения <,>,=,<>,<=,>=. Две строки сравниваются посимвольно, слева направо, по кодам символов. Если одна строка меньше другой по длине, недостающие символы короткой строки заменяются символом с кодом 0.

 

Процедуры и функции для работы со строками

В системе Turbo Pascal имеется несколько полезных стандартных процедур и функций, ориентированных на работу со строками. Ниже приводится список этих процедур и функций с краткими пояснениями.

Length(s:string):integer
Функция возвращает в качестве результата значение текущей длины строки-параметра
Пример: 
n := length('Pascal'); {n будетравно 6}

Concat(s1,[s2,...,sn]:string):string
Функция выполняет слияние строк-параметров, которых может быть произвольное количество. Каждый параметр является выражением строкового типа. Если длина строки-результата превышает 255 символов, то она усекается до 255 символов. Данная функция эквивалентна операции конкатенации "+" и работает немного менее эффективно, чем эта операция. 

Copy(s:string; index:integer; count:integer):string
Функция возвращает подстроку, выделенную из исходной строки s, длиной count символов, начиная с символа под номером index.

Пример:
s := 'Система Turbo Pascal';
s2 := copy(s, 1, 7); {s2 будет равно 'Система'}
s3 := copy(s, 9, 5); {s3 будетравно 'Turbo'}
s4 := copy(s, 15, 6); {s4 будетравно 'Pascal'}

Delete(var s:string; index,count:integer)
Процедура удаляет из строки-параметра s подстроку длиной count символов, начиная с символа под номером index.

Пример.
s := 'Система Turbo Pascal';
delete(s,8,6); {s будет равно 'Система Pascal'}

Insert(source:string; var s:string;index:integer)
Процедура предназначена для вставки строки source в строку s, начиная с символа index этой строки.

Пример.
s := 'Система Pascal';
insert('Turbo ',s,9); {s будет равно 'Система Turbo Pascal'}

Pos(substr,s:string):byte
Функция производит поиск в строке s подстроки substr. Результатом функции является номер первой позиции подстроки в исходной строке. Если подстрока не найдена, то функция возвращает 0.

Пример.
s := 'Система Turbo Pascal';
x1 := pos('Pascal', s); {x1 будет равно 15}
x2 := pos('Basic', s); {x2 будетравно 0}

Str(X: арифметическое выражение; var st: string)
Процедура преобразует численное выражение X в его строковое представление и помещает результат в st. 

Val(st: string; x: числоваяпеременная; var code: integer)
Процедура преобразует строковую запись числа, содержащуюся в st, в числовое представление, помещая результат в x. x - может быть как целой, так и действительной переменной. Если в st встречается недопустимый (с точки зрения правил записи чисел) символ, то преобразование не происходит, а в code записывается позиция первого недопустимого символа. Выполнение программы при этом не прерывается, диагностика не выдается. Если после выполнения процедуры code равно 0, то это свидетельствует об успешно произошедшем преобразовании.

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

Chr(n: byte): char
Функция возвращает символ по коду, равному значению выражения n. Если n можно представить как числовую константу, то можно также пользоваться записью #n. 

Ord(ch: char): byte;
В данном случае функция возвращает код символа ch. 

UpCase(c: char): char;
Если c - строчная латинская буква, то функция возвращает соответствующую прописную латинскую букву, в противном случае символ c возвращается без изменения.

Pred(c: char): char;
Если c - строчная латинская буква, то функция возвращает предыдущий символ из таблицы кодов.

Succ(c: char): char;
Если c - строчная латинская буква, то функция возвращает следующий символ из таблицы кодов.

ASCII-kod

 

Примеры задач на строки

Задача 1С клавиатуры вводят слово и символ. Напишите программу, которая осуществляет проверку наличия в этом слове заданного символа. Если символ встречается - подсчитать его количество в слове.

var s, sim:string;                  {s - переменная для слова , sim - переменная для символа}
     i, k: integer;                          {i - переменная для счетчика цикла, k - переменная для количества символов в слове}
begin
     writeln ('Введите строку'); 
     readln (s); 
     writeln ('Введите символ'); 
     readln (sim); 
     k:=0; 
     for i:=1 to length(s) do
          if s[i]=sim then 
               k:=k+1; 
         if k=0 then writeln ('Символ ',sim,' в слове не встречается') 
     writeln ('Символ ', sim,' встречается в слове ', k,' раз(а)'); 
end.

 

Задача 2. С клавиатуры строковым типом вводится натуральное число. Найти сумму цифр введенного числа.

Var
     S : String;
     I,X,A,C : Integer;
Begin

     Writeln('Введите натуральное число');  
     Readln(S);                                                      {Число вводится в строковую переменную}
     A:=0;
     For I:=1 To Length(S) Do 
     Begin
           Val(S[I],X,C);                                             {Цифровой символ превращается в число}
     A:=A+X {Цифры суммируются}
     End;
     Writeln('Сумма цифр равна ',A)
End.

 

Задача 1. На ав­то­за­пра­воч­ных стан­ци­ях (АЗС) про­да­ет­ся бен­зин с мар­ки­ров­кой 92, 95 и 98. В го­ро­де N был про­ве­ден мо­ни­то­ринг цены бен­зи­на на раз­лич­ных АЗС.

На­пи­ши­те эф­фек­тив­ную по вре­ме­ни ра­бо­ты и по ис­поль­зу­е­мой па­мя­ти про­грам­му (ука­жи­те ис­поль­зу­е­мую вер­сию языка про­грам­ми­ро­ва­ния, на­при­мер, Borland Pascal 7.0), ко­то­рая будет опре­де­лять для каж­до­го вида бен­зи­на, сколь­ко АЗС про­да­ют его де­шев­ле всего. На вход про­грам­ме в пер­вой стро­ке по­да­ет­ся число дан­ных о сто­и­мо­сти бен­зи­на. В каж­дой из по­сле­ду­ю­щих N строк на­хо­дит­ся ин­фор­ма­ция в сле­ду­ю­щем фор­ма­те:

<Ком­па­ния> <Улица> <Марка> <Цена> где <Ком­па­ния> – стро­ка, со­сто­я­щая не более, чем из 20 сим­во­лов без про­бе­лов, <Улица> – стро­ка, со­сто­я­щая не более, чем из 20 сим­во­лов без про­бе­лов, <Марка> – одно из чисел – 92, 95 или 98, <Цена> – целое число в диа­па­зо­не от 1000 до 3000, обо­зна­ча­ю­щее сто­и­мость од­но­го литра бен­зи­на в ко­пей­ках. <Ком­па­ния> и <Улица>, <Улица> и <Марка>, а также <Марка> и <цена> раз­де­ле­ны ровно одним про­бе­лом. При­мер вход­ной стро­ки: Си­нойл Цве­точ­ная 95 2250 Про­грам­ма долж­на вы­во­дить через про­бел 3 числа — ко­ли­че­ство АЗС, про­да­ю­щих де­шев­ле всего 92-й, 95-й и 98-й бен­зин со­от­вет­ствен­но. Если бен­зин какой-то марки нигде не про­да­вал­ся, то сле­ду­ет вы­ве­сти 0.

var
     min, ans: array[92..98] of integer;
     c: char;
     i, k, N, b: integer;
begin
   for i:=92 to 98 do
   begin
      min[i]:=3001;          {допустимое и другое число, >3000}
      ans[i]:=0;
   end;
   readln(N);
   for i:=1 to N do
   begin
      repeat
         read(c);
      until c=' ';               {считана компания}
      repeat
          read(c);
      until c=' ';               {считана улица}
      readln(k,b);
      if min[k] > b then
      begin
          min[k]:=b;    ans[k]:=1
      end

      else
     if min[k] = b then ans[k]:=ans[k]+1;
     end;                                                           {если бензина какой─то марки не было,  ans[i] осталось равным 0}
    writeln(ans[92],' ', ans[95],' ', ans[98])
end.

 

Задача 4.  На вход про­грам­ме по­да­ет­ся набор сим­во­лов, за­кан­чи­ва­ю­щий­ся точ­кой. На­пи­ши­те эф­фек­тив­ную, в том числе и по ис­поль­зу­е­мой па­мя­ти, про­грам­му, ко­то­рая сна­ча­ла будет опре­де­лять, есть ли в этом на­бо­ре сим­во­лы, со­от­вет­ству­ю­щие де­ся­тич­ным циф­рам. Если такие сим­во­лы есть, то можно ли пе­ре­ста­вить их так, чтобы по­лу­чен­ное число было сим­мет­рич­ным (чи­та­лось оди­на­ко­во как слева на­пра­во, так и спра­ва на­ле­во). Ве­ду­щих нулей в числе быть не долж­но, ис­клю­че­ние – число 0, за­пись ко­то­ро­го со­дер­жит ровно один ноль.

Если тре­бу­е­мое число со­ста­вить не­воз­мож­но, то про­грам­ма долж­на вы­ве­сти на экран слово «NO». А если воз­мож­но, то в пер­вой стро­ке сле­ду­ет вы­ве­сти слово «YES», а во вто­рой – ис­ко­мое сим­мет­рич­ное число. Если таких чисел не­сколь­ко, то про­грам­ма долж­на вы­во­дить мак­си­маль­ное из них. На­при­мер, пусть на вход по­да­ют­ся сле­ду­ю­щие сим­во­лы: Do not 911 to 09 do.

В дан­ном слу­чае про­грам­ма долж­на вы­ве­сти:

YES
91019

По­яс­не­ние: про­грам­ма чи­та­ет все вход­ные сим­во­лы до точки один раз, под­счи­ты­вая в мас­си­ве, хра­ня­щем 10 целых чисел, ко­ли­че­ство каж­дой из цифр. Сами вход­ные сим­во­лы при этом не за­по­ми­на­ют­ся. Затем про­ве­ря­ет­ся — сколь­ко в этом мас­си­ве не­чет­ных эле­мен­тов. Если боль­ше од­но­го, то за­да­ча ре­ше­ния не имеет. При на­ли­чии ре­ше­ния сна­ча­ла пе­ча­та­ет­ся по­ло­ви­на име­ю­щих­ся цифр 9 (если та­ко­вые име­ют­ся, в слу­чае не­чет­но­го числа цифр — мень­шая по­ло­ви­на), затем 8 и т.д. до 0, потом пе­ча­та­ет­ся цифра, ко­то­рая встре­ча­ет­ся во вход­ных дан­ных не­чет­ное число раз, а затем — остав­ша­я­ся по­ло­ви­на цифр 0 (если та­ко­вые име­ют­ся, в слу­чае не­чет­но­го числа цифр — мень­шая по­ло­ви­на), 1, и т.д. до 9. Если ни­ка­ких цифр, кроме 0, во вход­ных дан­ных нет, то за­да­ча имеет ре­ше­ние, толь­ко если этот ноль един­ствен­ный. Если нулей чет­ное число, а не­ну­ле­вая цифра един­ствен­ная, то ре­ше­ния не су­ще­ству­ет.

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

var a:array['0'..'9'] of integer;

c, c_odd: char;

i, k: integer;

f: boolean;

begin

for c:='0' to '9' do a[c]:=0;

read(с);

while c<>'.' do

begin

if c in ['0' .. '9'] then a[c] := a[c] + 1;

read(c);

end;

k := 0; {ко­ли­че­ство цифр, встре­ча­ю­щих­ся не­чет­ное число раз}

for c := '0' to '9' do

if a[c] mod 2 = 1 then

begin

k := k + 1;

c_odd := c

end;

f := (a['0'] = 1);

for c := '1' to '9' do

if (a[c] > 1) or (a[c] = 1) and (a['0'] = 0) then f := true;

if (k > 1)or not f then writeln('NO') else

begin

writeln('YES');

for c := '9' downto '0' do

for i := 1 to a[c] div 2 do

write(c);

if k = 1 then

write(c_odd);

for c := '0' to '9' do

for i := 1 to a[c] div 2 do

write(c);

end

end.

Похожие материалы (по тегу)

Новости о нас

О том, как проходят наши занятия по робототехнике в новом учебном году - смотрите на фото!  Подробнее
  Преподаватели ВУЗов Китая посетили наш технопарк Толтек СФ БашГУ! Подробнее
Расписание занятий для каждой сформированной группы по робототехнике на 2017-2018 учебный год. Подробнее
Учебный год начался, и у нас очередная радостная новость для вас, педагоги! В этом году... Подробнее
Наши учащиеся выступили на августовской конференции педагогов! Подробнее

Наши партнеры

 TZOyoOCZ8y0 logotip novy SF BashGU  utv logo  CityMoll  VolnoeDelo