Как составить программу на паскале для строки

На занятии будет рассмотрен Строковый тип данных в Паскаль и примеры работы с ним

Содержание:

  • Символьный тип char в Паскале
    • Основные функции для работы с символами
  • Строковые переменные в Паскаль
  • Функции работы со строками в Pascal
  • Стандартные методы и запросы (pascalAbc.net)
    • Посимвольный ввод до пробела

Символьный тип char в Паскале

Символьной переменной соответствует тип char:

Инициализация символьной переменной:

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

Функция преобразует целое число, имеющее тип BYTE, в один символ ASCII-кода:

Пример: распечатать двойную кавычку по ее коду в ASCII-таблице

1
2
3
4
5
6
7
var a:char;
    i:byte;
begin
     i:=34; {код, соответствующей символу " в ASCII-таблице}
     a:=chr(i);
     writeln(a)
end.

Функция возвращает порядковый номер символа параметра в таблице ASCII:

Пример: Распечатайте часть таблицы ASCII, конкретнее — символы, соответствующие кодам 32-255

1
2
3
4
5
var i: integer;
begin
     for i:=32 to 255 do
         write(chr(i):3);
end.

Примеры:

var c := 'Ю';
var n := Ord(c); // n := c.Code
Print(n); // 1070
c := Chr(n);
print(c); // Ю

Символьные константы: #код – символ с определенным кодом:

#10 – новая строка (Linux)
#13#10 – новая строка (Windows)
#9 – tab 
Print('a'#10'b');

Методы класса типа char

char.IsLetter(с); // буква ли, boolean
char.IsDigit(с); // десятичное ли число, boolean
char.IsLower(с); // буква нижнего регистра, boolean
char.IsUpper(с); // буква верхнего регистра, boolean
char.IsPunctuation(с); // знак препинания, boolean
 
с := char.ToLower(с) ;
с := char.ToUpper(с);

Операции для типа char

c1 < c2;// сравнение по коду
c1 > c2;
с in ['a','e','i','o','u',’y’]; // c принадлежит гласным
с in ['a'..'z','A'..'Z’]; // c принадлежит английским буквам

Задание:
Запросите ввести два символа. Определите, принадлежат ли символы английским буквам, и если да, то гласные ли это буквы. Преобразуйте в верхний регистр ту букву, код которой меньше.

Пример вывода:

Введите два символа:
u z
u - английская буква, гласная
z - английская буква, не гласная
Буква u в верхнем регистре U

Некоторые выражения:

//c принадлежит диапазону:
c.InRange('a'..'z');  
 
//Трансформация символа в цифру: 
var n := Ord(c)Ord('0');
 
// Увеличение кода символа на n: 
c := Chr(Ord(c) + n);
   // или 
Inc(c,2);

Строковые переменные в Паскаль

Строковые переменные в Паскале имеют тип String

Объявление и инициализация строковой переменной:

1
2
3
4
5
var a:string;
begin
 a:='Привет всем!';
 writeln(a);
end.

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

1
2
3
4
5
6
var a:string;
begin
 writeln('Введите слово');
 readln(a);
 writeln('Вы ввели слово ',a);
end.

Строка «рассматривается» компилятором, как массив букв:

для компилятора:

s[1]='Б'   s[2]='а'   s[3]='н'   s[4]='к'   s[5]='а'

Важно: Значения строковых переменных всегда заключаются в одинарные кавычки

Функции работы со строками в Pascal

Исходные данные Операция Результат
s1:='Мото';      s2:='роллер'
s3:=s1+s2;
s3=’Мотороллер’
s5:='Мотороллер';
k:=Pos('рол',s5);
k=5
s3:='Мотороллер';
l:=Length(s3);
l=10
s3:='астроном';
s4:=Copy(s3,3,4);
s4= ‘трон’
s5:='Коробочка';
Delete(s5,4,2);
s5=’Корочка’
s6:='Рука'; s7:='баш';
Insert(s7,s6,3);
s6=’Рубашка’
x:=2.73284;
Str(x:4:2,s8);
s8=’2.73′
s8='2.73';
Val(s8,x,Osh);
x=2.73

Пример: Подсчитать кол-во букв «f» в тексте.

Показать решение:

Паскаль PascalAbc.NET
1
2
3
4
5
6
7
8
9
10
11
var s:string[30];
    n,i:integer;
begin
 writeln('введите текст');
 readln(s);
 n:=0;
 for i:=1 to length(s) do
     if s[i]='f' then
        n:=n+1;
 write('в тексте букв f = ',n)
end.
1
2
3
4
5
6
7
8
begin
  var s := readString('введите текст');
  var n := 0;
  foreach var c in s do
    if c = 'f' then
      inc(n);
  Print(n);
end.
 

Операции со строками:

s1 + s2  // конкатенация s1 и s2
s1 += s2  
s1 < s2  // лексикографическое сравнение
  'abcd' < 'aad'
s * n    // конкатенация n копий строки s
s[a:b]       // срез (индексация с 1)
s[a:b:step]  // срез с шагом
s?[3:5]   ;   // безопасный срез (не вызывает ошибок)
s?[a:b:step] // безопасный срез с шагом
s1 in s

String 1. Дан текст. Удалить в нём все слова кот. Выполнить задание двумя способами: используя стандартные функции работы со строками, и, работая со строкой как с массивом символов.

Пример выполнения:

введите строку 
мой кот - хороший кот
Результат: мой  - хороший 

* Задание повышенной сложности: запросить у пользователя ввести подстроку, которую требуется удалить из исходной строки.

String 2. Составить программу проверки, есть ли в тексте буква s. Выдавать true (если найдено) или false (если не найдено).
Примеры использования логического типа (true и false) смотрите здесь.

Пример выполнения:

Введите строку:
Hello world
Результат: false
Введите строку:
Hello students
Результат: true

String 3. Имеется строка текста. Требуется написать программу, которая зашифровывала бы ее в другую строку — заменяя каждый символ текста символом, следующим по порядку в таблице ASCII. Тогда слово КОТ превратится в слово ЛПУ. Требуется составить и программу дешифровки.
Использовать функции для работы с символами: chr и ord pascal.

String 4. Дано предложение, определить количество слов в нём.
Подсказка: считать количество слов по количеству пробелов в строке.

* усложненный вариант: предусмотреть, что в начале или в конце введенной строки введен пробел

Пример: Найти количество цифр в строке.

Показать решение:

Паскаль PascalAbc.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const
  m = ['0'..'9'];
 
var
  s: string;
  i, k: byte;
 
begin
  read(s);
  k := 0;
  for i := 1 to length(s) do
    if s[i] in m then inc(k);
  writeln('цифр  = ', k);
  readln;
end.
1
2
3
4
5
6
7
8
begin
  var s := readString;
  var k := 0;
  foreach var c in s do
    if char.IsDigit(c) then
      k += 1;
  Print($'цифр  = {k}');
end.

Пример: Определить является ли данное слово перевертышем (палиндромом).

Показать решение:

Паскаль PascalAbc.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
var a,b,c:string;
    i:longint;
begin
write('введите слово:');
readln(a);
b:='';
for i:=1 to length(a) do
    b:=a[i]+b;
if a=b then
   write('перевертыш')
   else
   write('не перевертыш');
end.
1
2
3
4
5
6
7
8
9
10
// с помощью среза
begin
  var s := readString;
  var n := s.Length;
  var s1 := s[::-1];
  if s = s1 then
    print('перевертыш')
  else
    print('не перевертыш');
end.

String 5. Составить программу подсчета количества встречаемых в тексте сочетаний букв «ма».

String 6. Определить, встречается ли в тексте сочетание букв «ку».

Пример выполнения:

Введите строку:
Кума
Результат: да
Введите строку:
Дед
Результат: нет

String 7. Заменить данную букву в слове другой буквой (буквы вводит пользователь).

Пример выполнения:

Введите строку:
Барабулька
Введите букву, которую заменить:
а
Введите букву, на которую заменить:
у
Результат: Бурубульку

String 8. Дано предложение, определить количество слов, начинающихся с буквы «к».

String 9. Дано предложение, состоящее из букв и цифр. Определить слово с наибольшим количеством букв (не цифр). В качестве подсказки можете использовать предложенный ниже алгоритм:

Пример выполнения:

Введите строку:
1234567891011слово следующееСлово иСледСлово
Слово с максимальным количеством букв:
следующееСлово 

Алгоритм:

  • После того как строка считывается (вводится), измеряется ее длина (функция length).
  • Далее стока просматривается посимвольно в цикле while или for.
  • Если символ строки входит в множество букв (const letters=['a'..'z'];), то этот символ прибавляется к первому элементу массива слов строки (... array [1..100] of string).
  • Если символ равен пробелу, то увеличиваем счетчик для массива слов и переходим к следующей итерации цикла.
  • String 10. Дано предложение. Расположить слова в нем в порядке возрастания числа букв в словах. В качестве подсказки можете использовать предложенный ниже алгоритм:

    Алгоритм:

  • В цикле до конца длины строки выполняем: если текущий символ строки — не пробел, то формируем элемент массива arrayS (arrayS: array[1..100] of string; строковый массив — будущий массив из слов предложения). Добавляя каждую букву к элементу arrayS[k].
  • При достижении пробела переходим к следующему элементу arrayS[k] и начинаем формировать следующее слово.
  • После того, как массив из всех слов arrayS сформирован: выполняем сортировку массива по длине букв в словах.
  • String 11. Ввести имя, отчество и фамилию. Преобразовать их к формату «фамилия-инициалы».

    Пример:
    
    Введите имя, фамилию и отчество:
    Иван Алибабаевич Попов
    Результат:
    Попов И.А. 
    

    Примечание:
    Использовать функции: Pos, Copy, Delete

    String 12. Программа должна позволять ввести текст, и потом удалять в нем все восклицательные знаки, расположенные непосредственно перед запятой, и выводить измененный текст на экран.

    Пример:

    Входной текст: 
    Алгоритм — это  правила выполнения определенных действий!,
     предписание исполнителю! совершить последовательность действий!, 
    набор команд для компьютера!
    Выходной текст:
    Алгоритм — это  правила выполнения определенных действий, 
    предписание исполнителю! совершить последовательность действий, 
    набор команд для компьютера!
    

    Трудность низкая:
    Программа должна формировать в памяти вторую строковую переменную с измененным текстом, а потом выводить ее на экран.

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

    А теперь рассмотрим олимпиадное задание по Паскалю:

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

    * Решить ту же задачу, в которой сдвиг будет не на 3 позиции, а на k, причем отрицательное значение является признаком сдвига влево, положительное — вправо.

    Показать решение:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    var a:char;
        i,n:byte;
        s,s1:string;
    begin
    s1:='';
    readln(s);
    for i:=1 to length(s) do
        begin
         n:=ord(...); 
         n:=n+3;
         if n=123 then n:=97; {в ASCII 120 - x, 97 - a}
         if ...; {в ASCII 121 - y, 98 - b}
         if ...; {в ASCII 122 - z, 99 - c}
         a:=chr(...);
         s1:=...;
         end;
         writeln(s1)
    end.

    Стандартные методы и запросы (pascalAbc.net)

  • CountOf — количество вхождений
  • 'мама мыла раму'.CountOf('м').Print; // 4
  • Contains — содержит ли (логическая)
  • 'мама мыла раму'.Contains('б').Print; // False
  • IndexOf — индекс искомого вхождения
  • 'hello world'.IndexOf('w').Print; // 6
  • Remove — удаление вхождения
  • 'hello world'.Remove(' ').Print; // helloworld
  • Replace — замена вхождений символа на другой символ
  • 'hello world'.Replace('l','L').Print; // heLLo worLd

    и другие…

    Запросы LINQ со строками

    * LINQ (Language Integrated Query) — язык интегрированных запросов

  • Where — Фильтрация массива (последовательности) с условием
  • var sArr:=Arr('aab','bcd','efg');
    sArr.Where(w->w.Contains('b')).Print; // aab bcd
    sArr.Where(w->w.CountOf('a')=2).Print; // aab

    Задания: Предыдущие задания выполнить с использованием стандартных методов и запросов фильтрации.

    Посимвольный ввод до пробела

    Посимвольный ввод удобен для «мгновенной» обработки символов в строке.

    Пример: посимвольно считывать фамилию

    Решение:

    var name: array[1..n] of string;
        c:char;
    ...
    

    посимвольный ввод строк

    Для организации массива символьных строк:

    Пример: посимвольно считывать фамилии и заносить их в массив фамилий

    Решение:
    массив символьных строк

    String 13. Программа должна позволять ввести предложение до точки (.). Необходимо в введенном тексте вместо всех букв «ё» ставить буквы «е». Выполнить, работая со строкой посимвольно: программа должна формировать в памяти вторую строковую переменную с измененным предложением, а потом выводить ее на экран.

    Пример:

    Входной текст: 
    Алгоритм — это  правила выполнения определённых действий.
    Выходной текст:
    Алгоритм — это  правила выполнения определенных действий.
    

    String 14. с клавиатуры вводится число N, обозначающее количество студентов в группе, а затем – N строк, в каждой из которых – информация о студенте в формате:
    <Фамилия> <год рождения> <оценка>

    1. Все данные разделяются одним пробелом. Нужно подсчитать, сколько студентов получили отметку 5.
    2. Вывести фамилии студентов, у которых оценка 2.
    3. Вывести фамилии студентов, родившихся в 1996 году.

    Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:

    проверь себя

    22.02.2021
    2705
    Программируем на Паскале
    Ваш комментарий

    Сегодня мы познакомимся со строковым типом данных — String. Как ясно из определения, в переменных такого типа можно сохранять строки.

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

    Вначале поговорим об ограничениях, которые накладываются на переменные этого типа.

    Когда при помощи процедур write и writeln мы выводили сообщения в программах на экран, то так или иначе касались строк. И строки эти мы обособляли одиночными кавычками — апострофами «’». Из этого вытекает первое ограничение: апостроф не может являться частью строки. Точнее, может, но его для этого нужно «экранировать», мы об этом поговорим позже.

    Второе ограничение накладывается на длину передаваемых в программе строк. И длина эта не может превышать 255 символов. При этом на каждую переменную такого типа отводится до 256 байтов: 255 — собственно на строку, а в нулевом байте сохраняется реальная длина переданных данных. Вдумайтесь, для хранения чисел мы использовали 1, 2, 4 или 6 байтов памяти, а для строк отводится до 256 байтов! Если вспомнить, что Паскаль как язык программирования появился в 1968-1969 годах, и на тогдашних компьютерах было очень мало оперативной памяти, то отдавать по 256 байтов на данные какого-то одного типа — было почти расточительством. Сегодня же мы эту оперативку не считаем вовсе.

    Если честно, то современные среды разработки позволяют сохранять в переменную типа String почти ничем не ограниченные строки. Строго говоря, ограничения всё-таки есть, но они находятся близко к объёму оперативной памяти вашего компьютера. Я же с самого начала решил рассказывать в своих статьях и видео о традиционном паскале, поэтому мы эту скользкую тему обойдём.

    При наличии современных кодировок и кодовых страниц, я даже не берусь считать, сколько байтов отводит для хранения каждой переменной типа String наша среда разработки — Pascal ABC.Net. Однако и в прежние времена механизм хранения строк был относительно гибким.

    1 байт = 8 битов. Бит — минимальная единица информации, в которой может в любой момент времени храниться 0 или 1. Если число состоит из восьми цифр, каждая из которых может принимать только два значения, то мы можем записать 28 различных чисел. 256 чисел от 0 до 255.

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

    Листинг 1.

    program TypeString;
    
    var
      s: String[20];
    
    BEGIN
      
    END.

    При попытке сохранить большее количество символов (байтов) в объявленную таким образом переменную, Паскаль выдаст ошибку. Пример вышел так себе, мы только объявили в нём переменную. Теперь напишем совсем другую программу. В ней мы объявим две строковые переменные и с их помощью выведем на экран текст «Привет, мир!», то есть выполним те же действия, что и на первом нашем уроке. Также воспользуемся процедурой writeln, но на этот раз не будем помещать в неё строку в явном виде, а воспользуемся для этого двумя переменными.

    Листинг 2.

    program TypeString;
    
    var
      s1, s2: String;
    
    BEGIN
      s1 := 'Привет, ';
      s2 := 'мир!';
    
      writeln(s1, s2);
      readln;
    END.

    Кстати, если строковая переменная объявлена без ограничений, то в её нулевом байте также хранится реальный размер строки, а не гипотетические 255 байтов. В частности, длина переменной s1 из примера выше равна 8 символам, а для s2 — 4 символа.

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

    Если бы строковые данные можно было только выводить на экран, то они не стоили бы даже отведённой на их хранение оперативной памяти. Например, строки можно складывать. Давайте перепишем второй пример так, как показано ниже и запустим нашу программу на исполнение.

    Листинг 3.

    program TypeString;
    
    var
      s1, s2, s3: String;
    
    BEGIN
      s1 := 'Привет, ';
      s2 := 'мир!';
      s3 := s1 + s2;
    
      writeln(s3);
      readln;
    END.

    В окне вывода данных PascalABC или в окне программы при её компиляции, вы увидите тот же результат, что и раньше, однако внутренне программа устроена и работает несколько иначе. В переменную s3 мы поместили результат «сложения» двух других строк — переменных s1 и s2. Пишу сложение в кавычках, так как это не сложение двух аргументов как в математике. Во всяком случае, от перемены мест «слагаемых» при использовании строк, зависит очень многое. Попробуйте у себя в примере поменять переменные s1 и s2 местами и снова запустите программу. Легко убедиться, что на экран по-прежнему выводится объединённая строка, вот только теперь в ней мало смысла. Итак, сложение строк называется мудрёным словом конкатенация и обозначает их объединение в том порядке, как они и записаны.

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

    Кому-то милее знак сложения между строками, а кого-то он только путает. Что ж, в Паскале для конкатенации строк имеется специальная функция Concat, которой в скобках через запятую можно указать от двух и более аргументов-строк. Возможно, именно вам подобная форма записи покажется более наглядной.

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

    Листинг 4.

    program TypeString;
    
    var
      s1, s2: String;
    
    BEGIN
      s1 := 'Привет, ';
      s2 := 'Д''Артаньян';
    
      writeln(s1, s2);
      readln;
    END.

    Как видите, ничего сложного.

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

    Листинг 5.

    program TypeString;
    
    var
      s1: String;
      userName: String[20];
    
    BEGIN
      s1 := 'Привет, ';
      write('Введите пожалуйста ваше имя: ');
      readln(userName);
    
      writeln(s1, userName);
      readln;
    END.

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

    Когда мы непосредственно в программе присваиваем переменным какие-то строковые значения, нам несложно сосчитать длину этих строк, но как только мы вносим в программу интерактив — отдаём хотя бы на время управление пользователю, то теряем контроль над ситуацией и мы точно не сможем знать количество символов, хранимых в той или иной переменной типа String. А как быть, если нам необходимо узнать фактическую длину строковой переменной? Для этого у Паскаля есть функция Length. Она как раз и возвращает в качестве значения целое число — фактическую длину строки. Смотрите пример ниже.

    Листинг 6.

    program TypeString;
    
    var
      s1, s2, s3: String;
      i: Integer;
    
    BEGIN
      s1 := 'Привет, ';
      s2 := 'мир!';
      s3 := s1 + s2;
      i := length(s3);
    
      writeln('Длина строки, записанной в переменную s3 равна ', i);
      readln;
    END.

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

    Для обращения к конкретному символу в строковой переменной следует после её имени в квадратных скобках передать его номер. Приведу ещё один пример:

    Листинг 7.

    program TypeString;
    
    var
      s1, s2, s3: String;
    
    BEGIN
      s1 := 'Привет, ';
      s2 := 'мир!';
      s3 := s1 + s2;
    
      writeln(s3[1]);
      readln;
    END.

    Запустив программу мы убеждаемся, что символы в строке нумеруются, начиная с единицы. Это вызывает путаницу у новичков. Очень многие сущности в программировании начинают нумероваться с нуля, а в строке нулевой байт отведён для хранения её фактической длины, это мы уже неоднократно обсуждали. Следовательно, номера элементов строки — обычные натуральные числа.

    Прекрасно, распечатать первый, второй или третий символ из нашей строки мы можем. А как напечатать самый последний, да ещё и в том случае, когда нам не известна заранее длина строки? Здесь нам также поможет функция Length.

    Листинг 8.

    program TypeString;
    
    var
      s1, s2, s3: String;
    
    BEGIN
      s1 := 'Привет, ';
      s2 := 'мир!';
      s3 := s1 + s2;
    
      writeln(s3[length(s3)]);
      readln;
    END.

    Может показаться, что код выглядит громоздко. Если вам так кажется, воспользуйтесь листингом 7 и подставьте в квадратные скобки переменную i. Во всяком случае, в современных компьютерах более чем достаточно оперативки и от одной дополнительной переменной мы потеряем немного.

    Мы уже умеем «складывать» строки, вычислять их длину, но всё ли это? — Нет. Мы также можем искать подстроку в строке. Причём, в качестве подстроки может выступать как небольшая строка, так и отдельные символы. Не буду вас томить, в Паскале имеется функция Pos, и работает она следующим образом: в скобках ей передаются два аргумента. Сначала мы должны указать что мы ищем, а затем — где мы это делаем. То есть сначала указывается подстрока или символ, а затем строка, где мы и ведём поиск. Наберите в среде разработки следующий пример и запустите программу на выполнение.

    Листинг 9.

    program TypeString;
    
    var
      s1, s2, s3: String;
    
    BEGIN
      s1 := 'Привет, ';
      s2 := 'мир!';
      s3 := s1 + s2;
    
      writeln( pos('р', s3) );
      readln;
    END.

    Что мы видим? Во-первых, функция нашла только первое вхождение искомой подстроки. В результате напечаталось число 2 — буква «р» действительно находится во второй позиции в строке s3. Однако, предпоследний символ в этой строке — тоже буква «р», но до неё наша функция не дошла. Это всегда следует помнить! Функция Pos находит лишь первое вхождение подстроки в строке. Во-вторых, она ищет буквально то, что было велено. Если бы мы заставили искать в нашей строке прописную — заглавную «Р», то функция вернула бы нам 0, так как подобной буквы в нашей строке нет.

    Как же быть, если строку будет вводить пользователь, и мы не знаем заранее, как именно он её внесёт с клавиатуры? — В этом случае обе строки — искомую фразу, и ту, где мы ведём поиск, желательно перевести в нижний или верхний регистр. Этой цели служат специальные функции Паскаля: LowerCase — переводит аргумент в строчные (маленькие) буквы, а UpperCase — в прописные (заглавные).

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

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

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

    Листинг 10.

    program TypeString;
    
    var
      s1, s2, s3: String;
    
    BEGIN
      s1 := 'Привет, ';
      s2 := 'мир!';
      s3 := s1 + s2;
    
      writeln( copy(s3, 9, 3) );
      readln;
    END.

    Если вы запустите программу из десятого примера, то сможете убедиться, что на экране появится слово «мир». Во-первых, я не стал присваивать скопированное значение в строчную переменную, а сразу вывел на экран. Во-вторых, я немного схитрил. Зная, что именно сохранено в переменной s3, мне было легко вычислить позицию 9 — с которой собственно и начинается наше слово, ну а длина его мне была известна заранее. Когда мы имеем дело с не столь очевидными примерами, тут-то нам и может пригодиться функция Pos, которая могла бы найти индекс — первое число.

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

    Теперь пришло время познакомиться с процедурой и это процедура Delete. Данная процедура удаляет подстроку. Здесь тоже удаляемая подстрока не указывается явно. Вместо этого из строчной переменной удаляются символы — их количество снова указывается числом, и удаление начинается с определённого символа в строке.

    В процедуру Delete также как и в функцию Copy передаются три аргумента: строка и два целых числа. Вот только процедуры не возвращают значений. Выполненные ими действия не получится присвоить какой-то переменной, но процедуры часто меняют переданные им аргументы. Delete следит за тем, чтобы в качестве первого аргумента — строки, ей была передана не просто строка, но строковая переменная. В ней-то и будут происходить изменения.

    Листинг 11.

    program TypeString;
    
    var
      s1, s2, s3: String;
    
    BEGIN
      s1 := 'Привет, ';
      s2 := 'мир!';
      s3 := s1 + s2;
      delete(s3, 7, 5);
    
      writeln(s3);
      readln;
    END.

    Запускаем пример 11 и получаем в результате «Привет!». Что это значит? — В переменной s3 мы удалили 5 символов, начиная с седьмого. При этом, если в строке символов было больше, то все прочие — в нашем случае это восклицательный знак — никуда не исчезают. Тем не менее, мы удалили подстроку «, мир» — запятая, пробел и слово мир из нашей переменной s3. Процедура изменила сам аргумент.

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

    Коль скоро есть процедура Delete, удаляющая подстроку в строковой переменной, есть также процедура Insert, которая вставляет подстроку, но ей аргументы передаются несколько иначе. Смотрим очередной пример.

    Листинг 12.

    program TypeString;
    
    var
      s1, s2, s3: String;
    
    BEGIN
      s1 := 'Привет, ';
      s2 := 'мир!';
      s3 := s1 + s2;
      delete(s3, 9, 3);
      insert('Владимир', s3, 9);
    
      writeln(s3);
      readln;
    END.

    В этой программе я использовал обе процедуры. Сначала из строки «Привет, мир!» я удаляю 3 символа, начиная с девятого — удаляю слово «мир». Затем добавляю строчку «Владимир» с того же девятого символа. Таким образом, я заменяю слово «мир» собственным именем.

    В процедуру Insert аргументы подаются в следующем порядке: первым идёт строка, которую мы собираемся вставить, она может быть задана как переменная или явно. Вторым аргументом мы указываем переменную типа String, в которую и будет производиться вставка. В последнюю очередь указывают число — номер символа, начиная с которого и должна быть произведена вставка.

    Урок подзатянулся, но он будет неполным, если мы не поговорим ещё об одной возможности — строки можно сравнивать.

    Напишем очередную короткую программу.

    Листинг 13.

    program TypeString;
    
    var
      s1, s2: String;
    
    BEGIN
      s1 := 'Ваня';
      s2 := 'Вова';
    
      if s1 >= s2 then
        writeln(s1, ' больше или равно ', s2)
      else
        writeln(s2, ' больше ', s1);
      readln;
    END.

    На этот раз оставляем лишь две строковые переменные. Присвоим им похожие имена. Дальше воспользуемся материалами прошлого урока — устроим логическое ветвление программы по условию.

    Если вы запустите программу, то легко сможете убедиться, что переменная s2, содержащая «Вова», оказывается строго больше переменной s1, в которой записано имя «Ваня».

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

    Чем дальше та или иная буква от начала алфавита, тем больше код, которым она кодируется. В этом смысле, русская буква «о» явно больше буквы «а» — которая в алфавите стоит первой.

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

    Репозиторий листингов программ.

    Оставьте ваш отзыв:

    to continue to Google Sites

    Not your computer? Use Guest mode to sign in privately. Learn more

    Учебник по программированию. Создание сайтов. Первые шаги.

    §11. Строки.

    Строка в Pascal представляет собой одномерный массив символов. Для того, что бы объявить переменную типа строка используется слово String. При объявлении переменной типа String после слова String можно в квадратных скобках указать максимальную длину строки. При этом во время выполнения программы данная переменная не сможет содержать в себе строку с большим количеством символов. Все лишние символы будут обрезаться. Если вы не укажете максимальное число символов в строке, то строка будет считаться переменной длины, и размер памяти под эту строку будет выбираться автоматически в зависимости от количества символов в ней. Пример:

    Var s1:String[5];//Строка из 5 символов

        s2:String;//Строка переменной длины

    Работа с переменными типа String похожа на работу с переменными других типов, но со своими нюансами.

    Вывести на экран строку можно с помощью процедур Write и Writeln.

    writeln(s1);

    Так как переменная типа String является массивом символов, то к каждому символу можно обратиться по его порядковому номеру, причём порядковые номера начинаются с единицы:

    write(s1[1]);

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

    s1:=‘Денис’;

    Если вы укажете строку с большим количеством символов, чем может содержать переменная, то последние символы просто обрежутся:

    Var s1:String[5];

    begin

      s1:=‘Денису’;

      writeln(s1);

    end.

    _______________________________________

    Денис

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

    Var s1:String[5];

        s2:String;

    begin

      s1:=‘Денис’;

      s2:=‘Куклин’;

      writeln(s2,‘ ‘,s1);

    end.

    ___________________________________________

    Куклин Денис

    Переменные типа String можно складывать (сцеплять) друг с другом с помощью операции +:

    Var s1,s2,s3:string;

    begin

      s1:=‘Куклин’;

      s2:=‘Денис’;

      s3:=‘Меня зовут ‘+s1+‘ ‘+s2;

      writeln(s3);

    end.

    ______________________________

    Меня зовут Куклин Денис

    Переменные типа String можно сравнивать друг с другом с помощью всех известных нам знаков сравнения, причём сравниваться они будут посимвольно, начиная с первого символа. Большей будет считаться та строка, в которой первый символ имеет порядковый номер больше, чем первый символ другой строки. Если первые символы одинаковые, то сравниваются вторые символы. И т.д. Если в какой либо строке будет меньше символов, то для сравнения автоматически в конец этой строки добавятся недостающие символы с порядковыми номерами 0:

    Var s1,s2:string;

    begin

      s1:=‘Борис’;

      s2:=‘Антон’;

      if s1<s2 then writeln(s1,‘ < ‘,s2)

        else writeln(s1,‘ > ‘,s2);

    end.

    ____________________________________

    Борис > Антон

    Для работы со строками в Pascal существуют различные системные процедуры и функции. Здесь мы рассмотрим некоторые из них, остальные можно изучить в справке PascalABC.NET в разделе «Справочник по языку -> Системные процедуры, функции, типы и константы -> Процедуры и функции для работы с символами и строками».

    Небольшое отступление. Сейчас и далее по тексту процедуры и функции буду приводить так же как и в справке PascalABC.Net, в следующем виде:

    function Pos(subs,s: string): integer;

    Первое слово (function или procedure) указывает на то, чем является данная подпрограмма, процедурой или функцией. Далее название подпрограммы, затем в скобках указывается список передаваемых подпрограмме параметров. Этот список состоит из названий переменных. На практике, эти названия вы можете придумать свои. Так же в скобках после двоеточия указывается тип этих параметров. Если это функция, то после скобок стоит двоеточие, затем указывается тип возвращаемого функцией значения. В общем, подпрограммы будут приводиться так же как и при их объявлении в тексте кода, С той лишь разницей, что тело подпрограммы приводиться не будет.

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

    function Pos(subs,s: string): integer;

    Возвращает позицию подстроки subs в строке s. Если не найдена, возвращает 0. Говоря простыми словами, данная функция осуществляет поиск какой-то «небольшой» строчки в «большой» строке и при этом выдаёт порядковый номер символа, с которого начинается данная «небольшая» строчка в «большой» строке. Если в «большой» строке нет данной строчки, то функция выдаёт ноль. Пример:

    Var s1,s2:string;

        i:word;

    begin

    s1:=‘В классе 20 учеников.’;

    s2:=‘ученик’;

    write(‘В строке «‘,s1,‘» слово ученик ‘);

    i:=Pos(s2,s1);

    if i <> 0 then write(‘присутствует, начиная с ‘,i,‘ символа.’)

       else write(‘отсутствует.’);

    end.

    _________________________________________________________________________

    В строке «В классе 20 учеников.» слово ученик присутствует, начиная с 13 символа.

    Обратите внимание, что в строке s1 встречается слово «учеников», а не «ученик», однако компьютер нам сообщил, что данное слово присутствует. Это потому что компьютер не человек и всё воспринимает буквально. Поэтому, что бы он искал именно слово «ученик» необходимо проверять какой символ стоит после слова «ученик», если это не буква, то значит мы нашли именно слово «ученик».

    function PosEx(subs,s: string; from: integer := 1): integer;

    Возвращает позицию подстроки subs в строке s, начиная с позиции from. Если не найдена, возвращает 0. Такая же функция, как и предыдущая, только здесь можно указать позицию, с которой нужно искать «маленькую» строчку. Если позицию не указать, то по умолчанию поиск начнётся с первого символа. В следующем примере программа отыскивает слово в тексте и считает сколько раз оно там встречается:

    Program Poisc_slova;

    Var s1,s2:string;

        i,s:word;

    begin

    s1:=‘В классе 20 учеников. Все ученики учатся по-разному. Одни ученики ‘+

    ‘являются отличниками или хорошистами, другие ученики троечники, учеников ‘+

    ‘двоечников нет.’;

    s2:=‘ученик’;

    s:=0;

    i:=1;

    while i<length(s1)do

       begin

        if (PosEx(s2,s1,i)<>0)then

          begin

            s:=s+1;

            i:=PosEx(s2,s1,i);

          end;

          i:=i+1;

       end;

    writeln(‘В следующем тексте:’);

    writeln;

    writeln(s1);

    writeln;

    write(‘слово ученик ‘);

    if s<>0 then writeln(‘встречается ‘,s,‘ раз.’)

      else writeln(‘не встречается ни разу.’);

    end.

    _________________________________________________________________________

    В следующем тексте:

    В классе 20 учеников. Все ученики учатся по-разному. Одни ученики являются отличниками или хорошистами, другие ученики троечники, учеников двоечников нет.

    слово ученик встречается 5 раз.

    Пояснение к строкам 4-6: В старых версиях языка Pascal cтрока в коде программы не может занимать белее определённого количества символов. Сейчас речь идёт не о переменной типа строка, а о строке в редакторе кода. Для того, что бы переменной типа String присвоить строку с большим числом символов, чем то количество, которое входит в строку редактора кода, можно использовать операцию сцепления строк, как это сделано в 4-6 строках программы. В PascalABC.NET весь текст можно разместить в одной строчке, однако для чтения программы это не удобно, так как такая строка не войдёт в страницу текстового редактора и для того, что бы её просмотреть придётся прокручивать страницу вправо. Поэтому рекомендую такой вариант заполнения переменной типа String.

    Пояснение к строке 10. В строке 10 встретилась незнакомая вам функция Length. Данная функция возвращает длину строки, т.е. количество символов строки или порядковый номер последнего символа.

    function Length(s: string): integer;

    Возвращает длину строки. Пример использования данной функции приведён в предыдущем примере.

    procedure SetLength(var s: string; n: integer);

    Устанавливает длину строки s равной n, то же самое, если мы при объявлении переменной типа String в квадратных скобках укажем максимальную длину строки. Данная процедура может использоваться в том случае, если заранее неизвестно, какая длина должна быть у строки. Пример:

    var s:string;

    begin

    s:=‘l23456789’;

    setlength(s,3);

    writeln(s);

    end.

    ________________

    123

    Примечание: обратите внимание на то, что в скобках присутствует слово var. Использование данного слова в описании процедур и функций будет подробно изучено в 15 параграфе. А сейчас вам достаточно знать, что если встречается такое слово, то процедура или функция будет производить какие-либо действия напрямую с той переменной, которая была передана в качестве параметра. Т.е. в данном примере процедура SetLength устанавливает максимальную длину именно в переменной s, а не в какой-то своей собственной.

    procedure Insert(source, var s:string; index:integer);

    Вставляет подстроку source в строку s с позиции index. Пример:

    var s:string;

    begin

    s:=‘Автомобиль 2109’;

    Writeln(s);

    Insert(‘ваз ‘,s,12);

    writeln(s);

    end.

    ______________________

    Автомобиль 2109

    Автомобиль ваз 2109

    procedure Delete(var s:string; index,count: integer);

    Удаляет из строки s count символов с позиции index. Пример:

    var s:string;

    begin

    s:=‘Автомобиль ваз 2109’;

    Writeln(s);

    Delete(s,12,4);

    writeln(s);

    end.

    ______________________

    Автомобиль ваз 2109

    Автомобиль 2109

    function Copy(s: string; index,count: integer): string;

    Возвращает подстроку строки s длины count с позиции index. Пример:

    var s:string;

    begin

    s:=‘Автомобиль ваз 2109’;

    Writeln(s);

    Writeln(Copy(s,12,4));

    end.

    _________________________

    Автомобиль ваз 2109

    Ваз

    function Concat(s1,s2,…: string): string;

    Возвращает строку, являющуюся результатом слияния строк s1,s2,… Данная функция равносильна следующему коду: s1+s2+… В данном случае вы сами решите для себя каким способом вам удобнее пользоваться. Пример:

    var s:string;

    begin

    s:=‘Автомобиль’;

    Writeln(concat(s,‘ ваз ‘,‘2109’));

    end.

    ___________________________________

    Автомобиль ваз 2109

    function LowerCase(s: string): string;

    Возвращает строку в нижнем регистре.

    function UpperCase(s: string): string;

    Возвращает строку в верхнем регистре. Пример:

    var s:string;

    begin

    s:=‘Автомобиль Ваз 2109’;

    Writeln(UpperCase(s));

    Writeln(LowerCase(s));

    end.

    end.

    ___________________________________

    АВТОМОБИЛЬ ВАЗ 2109

    автомобиль ваз 2109

    function CompareStr(s1,s2: string): integer;

    Сравнивает строки. Возвращает значение равное меньше нуля в том случае, если s1<s2,  значение больше ноля если s1>s2 и  равное нулю если s1=s2.

    var s1,s2:string;

    begin

    s1:=‘153’;

    s2:=‘136’;

    Writeln(CompareStr(s1,s2));

    end.

    ____________________________

    2

    function StrToInt(s: string): integer;

    Преобразует строковое представление целого числа к числовому значению. Преобразует строку, в которой записано целое число в число типа integer.

    function StrToFloat(s: string): real;

    Преобразует строковое представление вещественного числа к числовому значению. Преобразует строку, в которой записано вещественное число в число типа real. Пример:

    var s1,s2:string;

        i:integer;

        r:real;

    begin

    s1:=‘153’;  i:=StrToInt(s1);

    s2:=‘136.34’;  r:=StrToFloat(s2);

    Writeln(i,‘  ‘,r);

    end.

    __________________________________

    153  136.34

    function TryStrToInt(s: string; var value: integer): boolean;

    Преобразует строковое представление s целого числа к числовому значению и записывает его в value. При невозможности преобразования возвращается False.

    function TryStrToFloat(s: string; var value: real): boolean;

    Преобразует строковое представление s вещественного числа к числовому значению и записывает его в value. При невозможности преобразования возвращается False.

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

    Var i:integer;

        r:real;

        s1,s2:string;

    begin

    Writeln(‘Введите целое число.’);

    readln(s1);

    if TryStrToInt(s1,i) then writeln(‘Ввод целого числа произведён ‘ +

             ‘корректно, вы ввели число ‘,i)

         else writeln(‘Ввод целого числа произведён не корректно.’);

    Writeln(‘Введите вещественное число.’);

    readln(s2);

    if TryStrToFloat(s2,r) then writeln(‘Ввод вещественного числа’ +

             ‘ произведён корректно, вы ввели число ‘,r)

         else writeln(‘Ввод вещественного числа произведён не корректно.’);

    end.

    _________________________________________________________________________

    Введите целое число.

    34п

    Ввод целого числа произведён не корректно.

    Введите вещественное число.

    34.45

    Ввод вещественного числа произведён корректно, вы ввели число 34.45

    function IntToStr(a: integer): string; преобразует целое число в строку.

    function FloatToStr(a: real): string; преобразует вещественное число в строку. Пример:

    Var i:integer;

        r:real;

        s1,s2:string;

    begin

    i:=12;

    r:=3.45;

    s1:=‘На базе ‘+IntToStr(i)+‘ кг картофеля.’;

    s2:=‘Стоимость одного килограмма ‘+FloatToStr(r)+‘ рублей.’;

    Writeln(s1,‘ ‘,s2);

    end.

    _________________________________________________________________

    На базе 12 кг картофеля. Стоимость одного килограмма 3.45 рублей.

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

    Задачи.

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

    2. Создать базу данных учеников в классе. Должны быть следующие поля: Фамилия; Имя; Успеваемость (средняя оценка по всем предметам). Заполнить базу данных не менее 5 записей. Организовать сортировку по Успеваемости и организовать поиск ученика по фамилии.

    3. В данном параграфе в качестве примера была приведена программа Poisc_slova. Составить блок-схему алгоритма работы самого процесса поиска слова. А так же переписать программу, выделив процесс поиска в отдельную функцию.

    4. Имеем следующий текст: «Утром на базу поступил 112 кг картофеля. В обед привезли ещё 52 кг. А вечером приехала фура с 1050 кг картофеля». Необходимо сосчитать общее количество картофеля.

    5. Имеем следующую строку: «В школе    учится  520 учеников.   Работает    22  учителя». Обратите внимание, что между словами не один пробел, а несколько. Необходимо удалить лишние пробелы из текста.

    Решение.

    1.

    Const rus: set of char = [‘А’..‘Я’,‘а’..‘я’];

    Var s:string;

        i:byte;

        b:boolean;

    begin

      Writeln(‘Введите фамилию.’);

      readln(s);

      b:=true;

      for i:=1 to length(s) do

        if not (s[i]in rus) then

          begin

            writeln(‘Фамилия введена не корректно.’);

            b:=false;

            break;

          end;

      If b then

        begin

          s[1]:=UpCase(s[1]);

          writeln(‘Вы ввели фамилию: ‘,s);

        end;

    end.

    ____________________________________________________

    Введите фамилию.

    афанасьев

    Вы ввели фамилию: Афанасьев

    2.

    Program BDUchenikov;

    type Tbd = record

           fam:string;

           im:string;

           oc:1..5 end;

    var bd: array [1..5] of Tbd;

        temp:Tbd;

        i,k:byte;

        s:string;

    begin

    {Заполняем базу данных}

      bd[1].fam:=‘Афанасьев’; bd[1].im:=‘Сергей’;    bd[1].oc:=4;

      bd[2].fam:=‘Иванов’;    bd[2].im:=‘Андрей’;    bd[2].oc:=5;

      bd[3].fam:=‘Петров’;    bd[3].im:=‘Иван’;      bd[3].oc:=4;

      bd[4].fam:=‘Сидоров’;   bd[4].im:=‘Сергей’;    bd[4].oc:=3;

      bd[5].fam:=‘Печкин’;    bd[5].im:=‘Владислав’; bd[5].oc:=4;

    //Выводим базу на экран

      Writeln(‘Имеем следующую базу данных:’);

      Writeln(‘    Фамилия          Имя   Успеваемость’);

      For i:=1 to 5 do writeln(bd[i].fam:11,‘  ‘,bd[i].im:11,‘       ‘,bd[i].oc);

    //Сортируем базу по успеваемости

      for k:=1 to 5 do

        For i:=1 to 4 do

          begin

            If bd[i].oc < bd[i+1].oc then

              begin

                temp:=bd[i];

                bd[i]:=bd[i+1];

                bd[i+1]:=temp;

              end;

          end;

    //Выводим отсортированную базу на экран

      writeln;

      Writeln(‘Сортируем по успеваемости:’);

      Writeln(‘    Фамилия          Имя   Успеваемость’);

      For i:=1 to 5 do writeln(bd[i].fam:11,‘  ‘,bd[i].im:11,‘       ‘,bd[i].oc);

    //Поиск ученика по фамилии

      Writeln(‘Введите фамилию для поиска.’);

      readln(s);

      k:=0;

      for i:=1 to 5 do

        if bd[i].fam = s then k:=i;

    //Выводим найденного ученика на экран

      If k = 0 then writeln(‘Такого ученика в классе нет.’)

        else

       begin

        Writeln(‘    Фамилия          Имя   Успеваемость’);

        writeln(bd[k].fam:11,‘  ‘,bd[k].im:11,‘       ‘,bd[k].oc);

       end;

    end.

    _________________________________________________________________________

    Имеем следующую базу данных:

        Фамилия          Имя   Успеваемость

      Афанасьев       Сергей       4

         Иванов       Андрей       5

         Петров         Иван       4

        Сидоров       Сергей       3

         Печкин    Владислав       4

    Сортируем по фамилии:

        Фамилия          Имя   Успеваемость

         Иванов       Андрей       5

      Афанасьев       Сергей       4

         Петров         Иван       4

         Печкин    Владислав       4

        Сидоров       Сергей       3

    Введите фамилию для поиска.

    Петров

        Фамилия          Имя   Успеваемость

         Петров         Иван       4

    3.

    Program Poisc_slova_2;

    Var s1,s2:string;

        kol:word;

    Function Poisc(s1,s2:string):word;

    var i,s:word;

    begin

    s:=0;

    i:=1;

    while i<length(s1)do

       begin

        if (PosEx(s2,s1,i)<>0)then

          begin

            s:=s+1;

            i:=PosEx(s2,s1,i);

          end;

          i:=i+1;

       end;

      Poisc:=s;

    end;

    begin

    s1:=‘В классе 20 учеников. Все ученики учатся по-разному. Одни ученики ‘+

    ‘являются отличниками или хорошистами, другие ученики троечники, учеников ‘+

    ‘двоечников нет.’;

    s2:=‘ученик’;

    kol:=Poisc(s1,s2);

    writeln(‘В следующем тексте:’);

    writeln;

    writeln(s1);

    writeln;

    write(‘слово ученик ‘);

    if kol<>0 then writeln(‘встречается ‘,kol,‘ раз.’)

      else writeln(‘не встречается ни разу.’);

    end.

    4.

    const cifry:set of char = [‘0’..‘9’];

    Var s,temp:string;

        sum,i:word;

    Begin

      s:=‘Утром на базу поступил 112 кг картофеля. В обед привезли ‘+

         ‘ещё 52 кг. А вечером приехала фура с 1050 кг картофеля.’;

       writeln(s);

      temp:=»;

      i:=1;

      sum:=0;

      while i<length(s) do

        begin

          If s[i] in cifry then

            begin

              while (s[i] in cifry) do

                begin

                  temp:=temp+s[i];

                  inc(i);

                end

              sum:=sum+StrToInt(temp);

            end;

          temp:=»;

          inc(i);

        end;

      writeln(‘Всего завезли ‘,sum,‘ кг картофеля.’); 

    end.

    __________________________________________________________________

    Утром на базу поступил 112 кг картофеля. В обед привезли ещё 52 кг. А вечером приехала фура с 1050 кг картофеля.

    Всего завезли 1214 кг картофеля.

    5.

    Var s:string;

        i,k:word;

    begin

      s:=‘В школе    учится  520 учеников.   Работает    22  учителя.’;

      Writeln(‘Имеем следующую строку:’);

      Writeln(s);

      i:=1;

      while i<length(s) do

        begin

          if (s[i]=‘ ‘) then

            begin

              k:=i+1;

              while s[k]=‘ ‘ do inc(k);

              delete(s,i+1,k-i-1)

            end;

          inc(i); 

        end;

      writeln(‘После форматирования строка имеет следующий вид:’);

      Writeln(s);

    end.

    _________________________________________________________________

    Имеем следующую строку:

    В школе    учится  520 учеников.   Работает    22  учителя.

    После форматирования строка имеет следующий вид:

    В школе учится 520 учеников. Работает 22 учителя.

    Примечание к последним 3 решениям: если алгоритм работы этих программ не понятен, то составьте блок-схемы алгоритма, тогда всё станет ясно.

    Строка в Pascal – это последовательность символов заключенных в апострофы. Переменную строкового типа данных определяет слово string:

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

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

    Также как и массив, каждый элемент строки имеет свой индекс, и может быть отдельно где-либо задействован. Например, так выведется 7-ой элемент строки sing, которая содержит выражение ‘сингулярность’:

    write(sing[7]); { символ ‘я’ }

    Для вывода строки указывается строка без скобок и их содержащего:

    write(sing);

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    program stroki;
    uses crt;
    var sing, quant, sq: string;
    begin
    quant:=‘Квантовая’;
    sing:=‘cингулярность’;
    sq:=quant+‘ ‘+sing;
    writeln(sq);
    write(concat(sq, ‘ ‘,quant,‘ ‘, sing));
    end.

    Сравнение двух строк в Паскале осуществляется операциями отношения (<,>,=,<>,<=,>=). При этом первый символ первой строки сравнивается с первым второй строки, потом второй со вторым, третий с третьим и т. д. до тех пор, пока не нарушится равенство (т. е. число символов, либо их количество в строках окажется разным), или операция не завершится.

    ‘stroke’ < ‘stroke’ {вернет false}
    ‘stroke’ > ‘str’ {вернет true}
    ‘stroke’ = ‘stroke’ {вернет true}

    Удалить необходимые символы из строки можно с помощью процедуры Delete. В общем виде она имеет вид:

    Delete(<строка>, <начиная с этого символа>, <количество>)

    Вот так выглядит элементарная программа, в которой используется процедура Delete:

    1
    2
    3
    4
    5
    6
    7
    8

    program stroki;
    uses crt;
    var sing, quant, sq: string;
    begin
    quant:=‘Квантовая’;
    delete(quant, 6, 4);
    write(quant);
    end.

    После ее выполнения на экране появится слово «Квант».

    Для вставки подстроки в строку в Паскале есть процедура Insert.

    lnsert(<строка 1>, <строка 2>, <начиная с этого символа>)

    Строка 1 вставляется в строку 2, начиная с указанного символа. Так, например, для вставки нашей строки sing в строку quant нужно пописать следующий код.

    quant:=’Квантовая’;

    sing:=’ cингулярность’;

    insert(sing, quant, 10);

    Длина строки – это количество символов содержащихся в переменной строкового типа. Чтобы узнать ее можно воспользоваться функцией Length, возвращающей целое число. Форма записи данной функции такая:

    Length(<строка>);

    В Паскале для копирования строк предусмотрена функция Copy:

    Copy(<строка>, <начиная с этого символа>, <количество>);

    Пример программы, использующей функцию Copy:

    1
    2
    3
    4
    5
    6
    7
    8
    9

    program stroki;
    uses crt;
    var sing, quant, sq: string;
    begin
    sq:=‘Квантовая cингулярность’;
    quant:=copy(sq, 1, 9);
    sing:=copy(sq, 10, 14);
    write(quant, sing);
    end.

    Из sq было произведено копирование в две другие строки.

    Функция Pos определяет позицию подстроки в строке, и в случае удачи возвращает целое число соответствующее номеру элемента, с которого начинается вхождение. Общий вид функции:

    Pos(<подстрока>, <строка>);

    Преобразование числового значения осуществляется посредством процедуры Str:

    Str(<числовая величина>, <строка>);

    Пример программы:

    1
    2
    3
    4
    5
    6
    7
    8
    9

    program stroki;
    uses crt;
    var s: string;
    c: integer;
    begin
    c:=1000;
    str(c, s);
    write(s); {s = ‘1000’}
    end.

    Преобразовать строку в числовое значение можно при помощи процедуры Val:

    Val(<строка>, <числовая величина>, <переменная>);

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

    Пример кода:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    program stroki;
    uses crt;
    var s: string;
    c, err: integer;
    begin
    s:=‘1000’;
    val(s, c, err);
    writeln(c); {c = 1000}
    writeln(err); {err = 0}
    s:=’12p23′;
    val(s, c, err);
    writeln(c); {c = 12}
    write(err); {err = 3}
    end.

    Понравилась статья? Поделить с друзьями:
  • Как правильно составить договор с ребенком
  • Как найти куриные ножки
  • Непрерывный сигнал биос как исправить
  • Как найти песню с помощью напева
  • Ваганьковское кладбище тальков как найти