Как найти позицию в строке паскаль

Раздел: Стандартные функции Паскаля

Основы программирования 2.0

Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать.
Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь.
Подробнее…

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

function Pos(const substr : shortstring; 
             const s : shortstring) : SizeInt;

function Pos(C : Char;
             const s : shortstring) : SizeInt;

function Pos(const Substr : ShortString;
             const Source : AnsiString) : SizeInt;

function pos(const substr : shortstring;
             c : Char) : SizeInt;

function Pos(const Substr : AnsiString;
             const Source : AnsiString) : SizeInt;

function Pos(c : Char;
             const s : AnsiString) : SizeInt;

function Pos(const Substr : UnicodeString;
             const Source: UnicodeString) : SizeInt;

function Pos(c : Char;
             const s : UnicodeString) : SizeInt;

function Pos(c : UnicodeChar;
             const s : UnicodeString) : SizeInt;

function Pos(c : AnsiString;
             const s : UnicodeString) : SizeInt;

function Pos(c : UnicodeString;
             const s: AnsiString) : SizeInt;

function Pos(c : ShortString;
             const s : UnicodeString) : SizeInt;

function Pos(const Substr : WideString;
             const Source : WideString) : SizeInt;

function Pos(c : Char;
             const s : WideString) : SizeInt;

function Pos(c : WideChar;
             const s : WideString) : SizeInt;

function Pos(c : WideChar;
             const s : AnsiString) : SizeInt;

function Pos(c : AnsiString;
             const s : WideString) : SizeInt;

function Pos(c : WideString;
             const s : AnsiString) : SizeInt;

function Pos(c : ShortString;
             const s : WideString) : SizeInt;

function Pos(c : Char;
             const v : Variant) : SizeInt;

function Pos(s : ShortString;
             const v : Variant) : SizeInt;

function Pos(a : AnsiString;
             const v : Variant) : SizeInt;

function Pos(w : WideString;
            const v : Variant) : SizeInt;

function Pos(w : UnicodeString;
             const v : Variant) : SizeInt;

function Pos(v : Variant;
             const c: Char) : SizeInt;

function Pos(v : Variant;
             const s : ShortString) : SizeInt;

function Pos(v : Variant;
             const a : AnsiString) : SizeInt;

function Pos(v : Variant;
             const w : WideString) : SizeInt;

function Pos(v : Variant;
             const w : UnicodeString) : SizeInt;

function Pos(v1 : Variant;
             const v2 : Variant) : SizeInt;

Вся эта куча вариантов взята из документации. Так что просьба не критиковать за излишние подробности )))

Функция Pos возвращает индекс подстроки Substr в строке S, если строка S содержит в себе подстроку Substr. Если подстрока Substr не найдена в строке, то функция возвращает 0. Поиск чувствителен к регистру.

Как найти подстроку в строке

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

Проще всего найти в строке символ — это можно сделать простым перебором символов в строке.

Найти вхождение подстроки из нескольких символов будет сложнее. Но тоже возможно — существуют специальные алгоритмы.

Однако зачем “изобретать велосипед”, если есть готовые функции. Такие, например, как функция Pos.

С помощью этой функции можно найти символ или подстроку в строке.

Как часто приходится это делать? Зависит от специфики вашей работы.

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

Если же вы работаете с большими объёмами текстовой информации, с файлами, то довольно часто.

Итак, пример:

S := 'abcdefgcde';
Writeln(Pos('f', S));     //Pos = 6
Writeln(Pos('F', S));     //Pos = 0 - буква F не найдена
Writeln(Pos('cde', S));   //Pos = 3, потому что функция 
                          //возвращает индекс первого 
                          //найденного вхождения
Writeln(Pos('cdf', S));   //Pos = 0 - такой подстроки нет

В принципе, здесь всё понятно. Особых разъяснений не требуется.

Единственное замечание по варианту поиска подстроки cde. Как видите, в исходной строке есть две подстроки cde. Но функция возвращает число 3, то есть индекс первого элемента первой найденной подстроки.

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

program posfunc;

var S : string;

begin
//Ищем индекс первого пробела в строке
  S := 'The first space in this sentence is at position : ';
  Writeln(S, Pos(' ', S));  //Pos = 4

//Ищем последнюю букву английского алфавита в строке
  S := 'The last letter of the alphabet doesn''t appear in this sentence ';
  //Так как такой буквы в строке нет, то будет выведено сообщение об этом
  if (Pos('Z', S) = 0) and (Pos('z', S) = 0) then
    Writeln(S);

//Проверяем, что функция Pos действительно чувствительна к регистру
  S := 'abcdefgcde';
  Writeln(Pos('f', S));     //Pos = 6
  Writeln(Pos('F', S));     //Pos = 0 - буква F не найдена
  Writeln(Pos('cde', S));   //Pos = 3, потому что функция 
                            //возвращает индекс первого 
                            //найденного вхождения
  Writeln(Pos('cdf', S));   //Pos = 0 - такой подстроки нет

  ReadLn;
end. 

Как стать программистом 2.0

Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки…
Подробнее…

Помощь в технических вопросах

Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение — ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации.
Подробнее…

title keywords last_updated sidebar permalink toc folder

Символы и строки в PascalABC.NET

strings, PascalABC.NET, Pascal, Паскаль

19.12.2020

mydoc_sidebar

school_strings.html

true

mydoc

Символы и основные операции над ними

Символы имеют тип char, занимают 2 байта и хранятся в кодировке Unicode (UTF-16).

var c1: char;
var c2 := 'z';

Для преобразования символа c в код используется функция Ord(c), для обратного преобразования кода i в символ используется функция Chr(i).

begin
  var c := 'ю';
  Print(Ord(c)); // 1102
  Print(Chr(1102)); // ю
end.

Классический способ определить символ, следующий за данным в кодовой таблице, — это преобразовать символ в код, прибавить к коду число и потом преобразовать полученный код снова в символ:

Аналогично определяется предыдущий символ

Методы типа char

Методы, встроенные в тип char, делятся на две категории:

  • проверяющие, принадлежит ли символ указанной категории: c.IsDigit, c.IsLetter, c.IsLower, c.IsUpper
  • преобразующие символ: c.ToUpper, c.ToLower, c.ToDigit.

Отметим, что c.IsDigit эквивалентно (c >= '0') and (c <= '9') и эквивалентно c in '0'..'9'
Для c.IsLower, c.IsLower, c.IsUpper такой простой аналогии нет. Дело в том, что в этих методах проверяются все символы, являющиеся буквами в каком-то алфавите народов мира (в частности, английские и русские)

Отметим также, что c.IsLower возвращает True только если это буква в нижнем регистре — для не букв возвращается False.

Строки

Введение

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

Основная причина — многие методы строк в .NET считают, что строки индексируются с нуля, а в Паскале строки индексируются с 1.

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

Индексация строк

Строки в Паскале индексируются с 1. К символам строк можно обращаться по индексам — s[i].

Например:

begin
  var s: string;
  s := 'тор';
  Print(s[1],s[2],s[3]);
end.

Символы строк можно менять:

begin
  var s := 'пир';
  s[1] := 'м';
  Print(s); // мир
end.

Можно использовать индексацию с конца: s[^i] обозначает i-тый символ с конца

begin
  var s := 'мир';
  s[^1] := 'г';
  Print(s); // миг
end.

Циклы по строкам

begin
  var s := 'привет';
  for var i:=1 to s.Length do
    s[i] := Chr(Ord(s[i])+1);
  Print(s);
end.  
foreach var c in s do
  Print(c);  

Операции +, *n и in

Строки можно складывать и умножать на целое положительное число

Пример. Генерация строки ‘abcdefghijklmnopqrstuvwxyz’

Идея. Начать с пустой строки. Всякий раз в цикле добавлять к строке символы от ‘a’ до ‘z’

Код

begin
  var s := '';
  for var c := 'a' to 'z' do
    s += c;
end.  

Методы Count, CountOf, Where

Чтобы посчитать количество символов в строке, удовлетворяющих определённому условию, используется метод Count. Если нужно посчитать, сколько раз встречается определенный символ, используется более простой метод CountOf

begin
  var s := 'абракадабра';
  s.CountOf('а').Print;
  s := 'а123бр45а67к89адабра';
  s.Count(c -> c.IsDigit).Print;
end.  

Если в строке надо отфильтровать только определенные символы, используется метод Where. Он возвращает последовательность символов, которую можно назад преобразовать к строке, используя метод JoinToString:

begin
  var s := 'а123бр45а67к89адабра';
  s := s.Where(c -> c.IsLetter).JoinToString;
end.  

s.ToWords и разбиение строки на слова

Метод s.ToWords разбивает строку на массив слов, используя пробел в качестве разделителя. Полученный массив можно преобразовать и слить в строку, используя метод JoinToString:

begin
  var s := 'как однажды жак звонарь головой сломал фонарь';
  var a := s.ToWords;
  Sort(a);
  s := a.JoinToString
end.  

По умолчанию JoinToString разделяет слова пробелами

Функция Pos и процедуры Delete, Insert

Pos(subs,s) возвращает позицию первого вхождения подстроки subs в сторке s или 0 если подстрока не найдена

Pos(subs,s,from) начинает искать подстроку в строке с позиции from.

Следующий код выводит позиции всех вхождений s1 в s:

begin
  var s := 'абракадабра';
  var s1 := 'бра';
  var p := Pos(s1,s);
  while p>0 do
  begin
    Print(p);
    p := Pos(s1,s,p+s1.Length);
  end;
end.

{% include links.html %}

28 / 17 / 0

Регистрация: 14.08.2013

Сообщений: 147

1

Позиция символа в строке

25.08.2013, 00:46. Показов 4928. Ответов 2


Студворк — интернет-сервис помощи студентам

надо написать программу которая определяет
какое место в слове занимает введеная юзверем
буковка !
1 трем ответившим (по делу) +
заранее спасибо !



0



sobakabobik

42 / 42 / 51

Регистрация: 04.01.2013

Сообщений: 105

25.08.2013, 02:16

2

Лучший ответ Сообщение было отмечено Скриптыч как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
uses
  crt;
 
var
  w: string;
  l: char;
  i: word;
 
begin
  write('Введите слово: ');
  readln(w);
  write('Введите букву: ');
  readln(l);
  write('Буква ', l, ' находится на позиции(-ях) № ');
  for i := 1 to length(w) do
    if w[i] = l then
      write(i, ' ');
  readln;
 
end.



1



murderer

4149 / 1803 / 213

Регистрация: 06.10.2010

Сообщений: 4,033

28.08.2013, 08:59

3

Pascal
1
write('Буква ', l, ' находится на позиции № ',pos(l,w));



1



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

§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 решениям: если алгоритм работы этих программ не понятен, то составьте блок-схемы алгоритма, тогда всё станет ясно.

Понравилась статья? Поделить с друзьями:
  • Как найти железную руду в скайриме
  • Как найти по адресу кто владелец квартиры
  • Как найти голову червя
  • Ледники майнкрафт как найти
  • Как исправить ошибки yum