Раздел: Стандартные функции Паскаля
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее… |
Функция 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
Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… |
|
Помощь в технических вопросах
Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: 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
надо написать программу которая определяет
0 |
sobakabobik 42 / 42 / 51 Регистрация: 04.01.2013 Сообщений: 105 |
||||
25.08.2013, 02:16 |
2 |
|||
Сообщение было отмечено Скриптыч как решение Решение
1 |
murderer 4149 / 1803 / 213 Регистрация: 06.10.2010 Сообщений: 4,033 |
||||
28.08.2013, 08:59 |
3 |
|||
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 решениям: если алгоритм работы этих программ не понятен, то составьте блок-схемы алгоритма, тогда всё станет ясно.