Упр. 9. Стр. 61

1. Напишите программу, которая определит количество предложений в тексте. Предложение заканчивается одним из трех символов: «.», «?», «!». Предполагается, что в тексте есть хотя бы одно предложение (см. пример 9.2).

Так как нам нужно обнаружить один из трёх символов, воспользуемся в условии логическим оператором or.

var st: string;
n, k: integer;
begin
writeln('Введите текст');
readln(st);
n := length(st);
k := 1;
for var i := 1 to n do
begin
if (st[i] = '.') or (st[i] = '?') or (st[i] = '!') then
k := k + 1;
end;
writeln('В тексте ', k, ' предложения(-ий)');
end.

2. Напишите программу, которая определит количество слов в тексте, если между любыми двумя словами может быть более одного пробела. Предполагается, что в тексте есть хотя бы одно слово (см. пример 9.2).

Чтобы считать количество слов с любым количеством пробелов между ними, реализуем так называемое «подглядывание»: перед каждым увеличением переменной k будем смотреть на следующий символ, и если он также равен пробелу, то переменную k не увеличиваем. Таким образом, наш счётчик будет пропускать несколько пробелов подряд и увеличиваться в тот момент, когда обнаружит символ, отличный от пробела.

var st: string;
n, k: integer;
begin
writeln('Введите текст');
readln(st);
n := length(st);
k := 1;
for var i := 1 to n - 1 do
begin
if (st[i] = ' ') and (st[i+1] <> ' ') then
k := k + 1;
end;
writeln('В тексте ', k, ' слов(-о/-а)');
end.

3. Напишите программу, которая определит, каких букв в строке с русским текстом больше: «о» или «O» (см. пример 9.3).

Слегка изменим пример 9.3, поменяем точки и запятые на большую и маленькую букву «о».

var St: string;
n, k1, k2: integer;
begin
writeln('Введите текст');
readln(St);
n := length(St);
k1 := 0; k2 := 0;
for var i := 1 to n do
begin
if St[i] = 'о' then
k1 := k1 + 1;
if St[i] = 'О' then
k2 := k2 + 1;
end;
if k1 > k2 then
writeln('«о» больше')
else
if k2 > k1 then
writeln('«О» больше')
else
writeln('Количество «О» равно количеству «о»');
end.

4. Напишите программу, которая определит, какой процент составляют буквы «a» во введенном тексте (см. пример 9.3).

Удалим ненужную переменную k2, и условие, связанное с этой переменной. Также нам не нужно последнее вложенное условие. Объявим переменную p: real;, которая будет содержать процент вхождения в текст русской буквы «а». Высчитаем процент по простой формуле: разделим количество найденных букв k1 на общее количество символов в строке n и умножим на 100, в выводе для красоты округлим наш процент с помощью функции round();.

var St: string;
n, k1: integer;
p: real;
begin
writeln('Введите текст');
readln(St);
n := length(St);
k1 := 0;
for var i := 1 to n do
begin
if St[i] = 'а' then
k1 := k1 + 1;
end;
p := k1 / n * 100;
writeln('Буква «а» составляет ', round(p), '%');
end.

5. Напишите программу, которая определит, сколько слов в тексте начинается на букву «а».

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

var St: string;
n, k1: integer;
begin
writeln('Введите текст');
readln(St);
n := length(St);
k1 := 0;
if (St[1] = 'а') or (St[1] = 'А') then
k1 := k1 + 1;
for var i := 2 to n do
begin
if ((St[i] = 'а') or (St[iа] = 'А')) and (St[i-1] = ' ') then
k1 := k1 + 1;
end;
writeln('На букву «а» начинается ', k1, ' слов(-о/-а)');
end.

6. Напишите программу, которая определит, какой процент слов в тексте начинается на букву «к». (Слово может начинаться как с прописной, так и со строчной буквы.)

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

var St: string;
n, k1, sl: integer;
p: real;
begin
writeln('Введите текст');
readln(St);
n := length(St);
k1 := 0; sl := 1;
if (St[1] = 'к') or (St[1] = 'К') then
k1 := k1 + 1;
for var i := 2 to n do
begin
if St[i] = ' ' then
sl := sl + 1;
if ((St[i] = 'к') or (St[i] = 'К')) and (St[i-1] = ' ') then
k1 := k1 + 1;
end;
p := k1 / sl * 100;
writeln('На букву «к» начинается ', round(p), '% слов');
end.

7. Дан текст. Напишите программу, которая проверит, правильно ли в нем расставлены круглые скобки. Если нет, то вывести соответствующее сообщение: «Открывающихся скобок больше (меньше), чем закрывающихся»; «Закрывающиеся скобки раньше открывающихся скобок».

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

var St: string;
n, l, r, er_r: integer;
begin
writeln('Введите текст');
readln(St);
n := length(St);
er_r := 0; r := 0; l := 0;
for var i := 1 to n do
begin
if St[i] = '(' then
begin
l := l + 1;
if (l <= r) and (r <> 0) then
er_r := 1;
end;
if St[i] = ')' then
r := r + 1;
end;
if l < r then
writeln('Открывающихся скобок меньше, чем закрывающихся');
if l > r then
writeln('Открывающихся скобок больше, чем закрывающихся');
if er_r > 0 then
writeln('Закрывающиеся скобки раньше открывающихся скобок');
end.

 

8. В тексте могут встречаться гласные и согласные буквы, а также символы «ь» и «ъ». Измените программу из примера 9.5 так, чтобы символы «ь» и «ъ» выводились желтым цветом.

Объявим переменную o, которая будет содержать буквы «ь» и «ъ», и m, в которую будет записываться вхождения текущего символа в нашу строку «ь» и «ъ». Добавим дополнительное условие для задания жёлтого цвета этим буквам.

uses GraphABC;
var s, g, o: string;
n, k, p, m: integer;
begin
writeln('Введите слово');
readln(s); writeln(s);
n := length(s);
g := 'ЁУЕЭОАЫЯИЮёуеэоаыяию';
o := 'ьъЪЬ';
for var i := 1 to n do
begin
p := pos(s[i], g);
m := pos(s[i], o);
if p <> 0 then
begin
SetFontColor(clRed);
k := k + 1;
end
else
begin
if m <> 0 then
SetFontColor(clYellow)
else
SetFontColor(clBlue)
end;
write(s[i]);
end;
writeln;
SetFontColor(clGreen);
writeln('Количество гласных - ', k);
end.

9. Дано арифметическое выражение, состоящее из цифр, скобок и знаков арифметических действий. Напишите программу, которая выведет цифры синим цветом, а остальные символы — голубым: например, в выражении 2 + (3 - 5) * 7 - 13 (см. пример 9.5).

Заменим строку g на строку, которая содержит все цифры '1234567890' и установим нужные цвета (clBlue для цифр, clCyan для всего остального).

uses GraphABC;
var s, g: string;
n, p: integer;
begin
writeln('Введите слово');
readln(s); writeln(s);
n := length(s);
g := '1234567890';
for var i := 1 to n do
begin
p := pos(s[i], g);
if p <> 0 then
SetFontColor(clBlue)
else
SetFontColor(clCyan);
write(s[i]);
end;
end.

10. Напишите программу для решения задачи. Задана строка цифр. Вывести четные цифры синим цветом, а нечетные — голубым (например, 128235). Сколько в строке нечетных цифр? (См. примеры 9.3 и 9.5.)

В переменную k будем записывать количество нечётных чисел. Перемнная g содержит только чётные цифры.

uses GraphABC;
var s, g: string;
n, p, k: integer;
begin
writeln('Введите слово');
readln(s); writeln(s);
k := 0;
n := length(s);
g := '02468';
for var i := 1 to n do
begin
p := pos(s[i], g);
if p <> 0 then
SetFontColor(clBlue)
else
begin
SetFontColor(clCyan);
k := k + 1;
end;
write(s[i]);
end;
writeln();
SetFontColor(clBlack);
writeln('В строке нечетных цифр ', k);
end.

11. Вводится текст, слова в котором разделены пробелами, после слов могут стоять точки или запятые. Напишите программу, которая выведет синим цветом те буквы «а», которые являются последними буквами слова, остальные символы текста вывести голубым цветом (например, в скороговорке На дворе — трава, на траве — дрова). Какой процент от общего количества слов составляют слова, заканчивающиеся на букву «а»?

Посчитаем количество слов в тексте, посчитаем количество слов, заканчивающихся на букву «а», и высчитаем процент.

uses GraphABC;
var s, g, a: string;
n, p, k, m, sl: integer;
per: real;
begin
writeln('Введите слово');
readln(s); writeln(s);
k := 0; m := 0; sl := 1;
n := length(s);
g := '., ';
a := ' -—,.';
for var i := 1 to n - 1 do
begin
p := pos(s[i+1], g);
k := pos(s[i+1], a);
if (k = 0) and (s[i] = ' ') then
sl := sl + 1;
if (p <> 0) and (s[i] = 'а') then
begin
SetFontColor(clBlue);
m := m + 1;
end
else
SetFontColor(clCyan);
write(s[i]);
end;
if s[n] = 'а' then
SetFontColor(clBlue);
writeln(s[n]);
SetFontColor(clBlack);
per := m / sl * 100;
writeln('Процент от общего количества слов ', round(per), '%');
end.

12. Напишите программу, которая заменит в заданном тексте каждую букву «a» символом «*» (см. пример 9.6).

В программе из примера 9.6 заменим символ запятой на букву «а», аточку на символ «*».

var st: string; n: integer;
begin
writeln('Введите строку');
readln(st);
n := length(st);
for var i := 1 to n do
if (st[i] = 'а') then
st[i] := '*';
writeln('Преобразованная строка:');
writeln(st);
end.

13. Напишите программу, которая заменит в заданном тексте каждую цифру символом «?» (см. примеры 9.5 и 9.6).

Объявим строковую переменную s, которая будет хранить все цифры, и в цикле for каждый раз будем проверять существует ли текущий символ в нашей строке s. Если существует, заменяем текущий символ на знак «?».

var st, s: string; n, p: integer;
begin
writeln('Введите строку');
readln(st);
s := '0123456789';
n := length(st);
for var i := 1 to n do
begin
p := pos(st[i], s);
if (p <> 0) then
st[i] := '?';
end;
writeln('Преобразованная строка:');
writeln(st);
end.

14. Напишите программу, которая заменит в заданном тексте из латинских букв все вхождения «x» на «ks» (см. пример 9.7).

Заменим в программе из примера 9.7 символ «2» на «x» и строку «два» на «ks».

var st: string;
i: integer;
begin
writeln('Введите строку');
readln(st);
i := 1;
while i <= length(st) do
begin
if (st[i] = 'x') then
begin
delete(st, i, 1);
insert('ks', st, i);
end;
i := i + 1;
end;
writeln('Преобразованная строка:');
writeln(st);
end.

15. Напишите программу, которая заменит в заданном тексте из латинских букв все вхождения «ing» на «ed» (см. пример 9.7).

Перед началом цикла найдём вхождения подстроки 'ing' в нашем тексте. Для цикла while поставим условие p > 0 — цикл завершит свою работу только тогда, когда больше не останется вхождений «ing» в нашу строку. В цикле удаляем 3 символа с позиции вхождения «ing» и вставляем «ed», затем минусуем перемнную i, т.к. «ed» содержит на 1 символ меньше, чем «ing» и нам нужно вернуться на одну позицию назад, чтобы продолжить.

var st: string;
i, p: integer;
begin
writeln('Введите строку');
readln(st);
i := 1;
p := pos('ing', st);
while p > 0 do
begin
p := pos('ing', st);
writeln('"ing" найден в позиции ', p);
if p <> 0 then
begin
delete(st, p, 3);
insert('ed', st, p);
end;
i := i - 1;
end;
writeln('Преобразованная строка:');
writeln(st);
end.

16. Напишите программу для решения задачи. В заданном тексте заменить все слова А1 на слова А2 (слова в тексте разделены пробелами, слова А1 и А2 вводятся).

По условиям задачи, слова могут быть разделены только пробелами, поэтому проверку на знаки препинания не делаем. Переменная p будет хранить первую позицию вхождения слова, p1 — вхождение с пробелом перед словом (чтобы убедится, что перед нами точно слово, а не его часть, и p2 — вхождение с пробелом после слова (также нужно для подтверждения того, что перед нами именно слово). Почему мы не объединили переменные p1 и p2 в одну (с пробелами с обеих сторон)? Потому что слово может стоять в начале предложения — тогда пробела перед словом не будет, и в конце — тогда пробела не будет после слова. Затем делаем практически те же действия, что и в предыдущих программах, но стоит обратить внимание на переменную i — она нужна для перехода к следующей или предыдущей позиции в строке, т.к. слово, которое мы хотим заменить, может быть длиннее или короче того, на которое мы хотим заменить. Таким образом эта переменная содержит разницу в длинне слов a1 и a2.

var st, a1, a2: string;
i, p, p1, p2: integer;
begin
writeln('Введите строку');
readln(st);
writeln('Введите строку a1 для замены');
readln(a1);
writeln('Введите строку a2 для подстановки');
readln(a2);
i := 1;

p := pos(a1, st);
p1 := pos(' ' + a1, st);
p2 := pos(a1 + ' ', st);

while (p > 0) or (p1 > 0) or (p2 > 0) do
begin

p := pos(a1, st);
p1 := pos(' ' + a1, st);
p2 := pos(a1 + ' ', st);

writeln('"', a1, '" найден в позиции ', p);
if p <> 0 then
begin
delete(st, p, length(a1));
insert(a2, st, p);
end;
i := i + length(a1) - length(a2);
end;
writeln('Преобразованная строка:');
writeln(st);
end.

17. Напишите программу, которая удалит из текста все гласные буквы (см. примеры 9.5 и 9.9).

Реализуем цикл while при условии, что i <= length(s) — мы должны каждый раз убеждаться, что i меньше или равно текущей длине нашей строки. Внутри цикла, если мы находим вхождение текущего символа в строку с гласными буквами, то удаляем эту позицию из нашей строки, не трогая переменную i. Если символ на текущей позции не был найден в списке гласных букв, то увеличиваем i на единицу и переходим к следующей букве.

var s, g: string;
p, i: integer;
begin
writeln('Введите слово');
readln(s); writeln(s);
i := 1;
g := 'ЁУЕЭОАЫЯИЮёуеэоаыяию';
while i <= length(s) do
begin
p := pos(s[i], g);
if p <> 0 then
delete(s, i, 1)
else
i := i + 1;
end;
writeln;
writeln('Слово без согласных: ', s);
end.

18. Напишите программу, которая удалит из текста все знаки «+», непосредственно за которыми стоит не цифра.

Объявим переменную p, которая будет содержать список всех цифр — будет проверять каждую букву на равенство символу «+» и вхождение следующего символа в этот список, и если буква не была найдена, то удаляем этот символ из строки. В условии цикла while i должна быть меньше (но не равна) length(s), чтобы не выйти за границы строки, когда каждую итерацию цикла мы будет заглядывать в следующую позицию. Также после цикла проверим последний символ на равенство символу «+».

var s, g: string;
p, i: integer;
begin
writeln('Введите слово');
readln(s); writeln(s);
i := 1;
g := '0123456789';
while i < length(s) do
begin
p := pos(s[i+1], g);
if (s[i] = '+') and (p = 0) then
delete(s, i, 1)
else
i := i + 1;
end;
if s[length(s)] = '+' then
delete(s, length(s), 1);
writeln;
writeln('Слово без согласных: ', s);
end.

19. Напишите программу, которая в заданном тексте после каждой латинской буквы «q» добавит букву «u» (см. пример 9.10).

Проходимя по символам строки и, если находим букву «q», вставляем «u» в позицию i + 1.

var s: string;
i: integer;
begin
writeln('Введите слово');
readln(s); writeln(s);
i := 1;
while i <= length(s) do
begin
if s[i] = 'q' then
insert('u', s, i + 1);
i := i + 1;
end;
writeln;
writeln('Слово без согласных: ', s);
end.

20. Напишите программу, которая в заданном тексте после каждого знака препинания («.», «,», «:», «;») вставит пробел, если его там нет (см. пример 9.10).

Объявим переменную g, которая будет хранить строку со знаками препинания. В цикле while будем проверять текущий символ на вхождение в строку g, и если вхождение найдено и следующий символ не равен пробелу, добавляем пробел.

var s, g: string;
i, p: integer;
begin
writeln('Введите слово');
readln(s); writeln(s);
g := '.,:;';
i := 1;
while i < length(s) do
begin
p := pos(s[i], g);
if (p <> 0) and (s[i+1] <> ' ') then
insert(' ', s, i + 1);
i := i + 1;
end;
writeln;
writeln('Слово без согласных: ', s);
end.

21. Измените функцию CheckPalindrom из примера 9.11 так, чтобы слова, которые начинаются на заглавную букву, тоже считались палиндромами, например «Анна», «Алла».

В функции CheckPalindrom приведём строку s книжнему регистру, чтобы сравнение символов проводилось без учёта регистра. Тогда итоговая программа будет выглядеть так:

var st, sl: string;
p: boolean; n: integer;
procedure DelSpace(var s: string);
begin
while (s<>'') and (s[1]= ' ') do
delete(s, 1, 1);
end;
function FirstWord(s: string):
string;
var
i: integer;
begin
i := pos(' ', s);
if i <> 0 then
FirstWord := copy(s, 1, i - 1)
else
FirstWord := s;
end;
function CheckPalindrom (s: string): boolean;
var n: integer; f: boolean;
begin
n := length(s); f := true; s := LowerCase(s);
for var i := 1 to n div 2 do
if s[i] <> s[n-i + 1] then
f := false;
CheckPalindrom := f;
end;
begin
writeln('Введите st ');
readln(st); p := false;
while st <> '' do
begin
DelSpace(st);
sl := FirstWord(st);
if CheckPalindrom(sl) then
begin
writeln(sl); p := true;
end;
n := length(sl);
delete(st, 1, n);
end;
if p = false then
writeln('Нет палидромов');
end.

22. Добавьте в программу из примера 9.11 подсчет количества выведенных палиндромов.

Объявим счётик k и будем его увеличивать каждый раз, когда находим палиндром. Итоговая программа будет выглядеть так:

var st, sl: string;
p: boolean; n, k: integer;
procedure DelSpace(var s: string);
begin
while (s<>'') and (s[1]= ' ') do
delete(s, 1, 1);
end;
function FirstWord(s: string):
string;
var
i: integer;
begin
i := pos(' ', s);
if i <> 0 then
FirstWord := copy(s, 1, i - 1)
else
FirstWord := s;
end;
function CheckPalindrom (s: string): boolean;
var n: integer; f: boolean;
begin
n := length(s); f := true;
for var i := 1 to n div 2 do
if s[i] <> s[n-i + 1] then
f := false;
CheckPalindrom := f;
end;
begin
writeln('Введите st ');
readln(st); p := false;
k := 0;
while st <> '' do
begin
DelSpace(st);
sl := FirstWord(st);
if CheckPalindrom(sl) then
begin
writeln(sl); p := true;
k := k + 1;
end;
n := length(sl);
delete(st, 1, n);
end;
writeln('Количество палидромов: ', k);
if p = false then
writeln('Нет палидромов');
end.

23. Фразы-палиндромы читаются одинаково слева направо и справа налево без учета пробелов и знаков препинания. Например: «Кулинар, храни лук» или «А роза упала на лапу Азора». Напишите программу, которая определит, является ли фраза палиндромом.

В первом цикле избавим нашу строку от пробелов и знаков препинания, а во втором — сравнив зеркальные символы друг с другом. Важное условие второго цикла — p = true — как только мы видим, что буквы не совпадают, прекращаем работу цикла и делаем вывод, что фраза — не полиндром. Если цикл завершился и переменная p осталась равная true — значит, фраза является палиндромом.

var g, st: string;
p: boolean; n, i, k: integer;
begin
writeln('Введите фразу ');
readln(st);
g := ',.?-!— "«»';
i := 1;
while i <= length(st) do
begin
k := pos(st[i], g);
if k <> 0 then
delete(st, i, 1)
else
i := i + 1;
end;

i := 1; p := true;
n := length(st);
while (i <= n) and (p = true) do
begin
if LowerCase(st[i]) = LowerCase(st[n - i + 1]) then
p := true
else
p := false;
i := i + 1;
end;
if p = false then
writeln('Эта фраза — не палидром')
else
writeln('Это фраза — палидром');
end.

24. Напишите программу, которая проверяет, является ли данный текст записью числа. В непустой текст могут входить только цифры или буквы. Если да, то требуется проверить, делится ли данное число на 4, иначе вывести соответствующее сообщение. Для проверки делимости на 4 использовать признак делимости: число делится на 4, если двузначное число, состоящее из последних двух цифр исходного числа, делится на 4 (см. пример 9.13).

Аналогично примеру 9.13 проверим, является ли текст числом. Затем проверим по признаку делимости, делится ли число на 4: с помощью функции преобразования строки к числовому значению присвоим переменной s последние два символа строки, преобразовав их к числу s := StrToInt(st[n-1] + st[n]);. Затем разделим с остатком s на 4, если выйдет ноль — число делится на 4.

var st: string; n, k, s: integer;
begin
writeln('Введите текст');
readln(st);
n := length(st); k := 0; s := 0;
for var i := 1 to n do
begin
if (st[i] >= '0') and (st[i] <= '9') then
begin
k := k + 1;
end;
end;
if k = n then
writeln('Текст является числом')
else
writeln('Текст не число');
s := StrToInt(st[n-1] + st[n]);
if s mod 4 = 0 then
writeln('Число делится на 4')
else
writeln('Число не делится на 4');
end.

25. Измените программу из упражнения 20 так, чтобы проверялась делимость на 2, 3, 5, 6, 8, 12 (используйте соответствующие признаки делимости).

Авторы, видимо, перепутали номер упражнения. Изменим программу не из 20 упражнения, а из 24. Воспользуемся признаками делимости: число делится на 2, если последняя цифра числа делится на 2; на 3, если сумма цифр числа делится на 3; на 5, если число оканчивается цифрой 0 или 5; на 6, если число делится на 2 и на 3; на 8, если число, составленное из трёх последних цифр нашего числа, делится на 8; на 12, если число делится на 3 и на 4.

var st: string; n, k, s: integer;
begin
writeln('Введите текст');
readln(st);
n := length(st); k := 0; s := 0;
for var i := 1 to n do
begin
if (st[i] >= '0') and (st[i] <= '9') then
begin
k := k + 1;
s := s + StrToInt(st[i]);
end;
end;
if k = n then
writeln('Текст является числом')
else
writeln('Текст не число');
if StrToInt(st[n]) mod 2 = 0 then
writeln('Число делится на 2');
if s mod 3 = 0 then
writeln('Число делится на 3');
if (st[n] = '0') or (st[n] = '5') then
writeln('Число делится на 5');
if (StrToInt(st[n]) mod 2 = 0) and (s mod 3 = 0) then
writeln('Число делится на 6');
if StrToInt(copy(st, n-2, 3)) mod 8 = 0 then
writeln('Число делится на 8');
if (StrToInt(st[n-1]+st[n]) mod 4 = 0) and (s mod 3 = 0) then
writeln('Число делится на 12');
end.

26. Дан текст. Напишите программу, которая проверит, может ли быть этот текст записью вещественного числа.

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

var st, g: string; n, k, p, m, t: integer;
begin
writeln('Введите текст');
readln(st);
n := length(st); k := 0; m := 0; t := 0;
g := '0123456789,.-';
for var i := 1 to n do
begin
p := pos(st[i], g);
if p <> 0 then
begin
t := t + 1;
if (st[i] = ',') or (st[i] = '.') then
k := k + 1;
if st[i] = '-' then
m := m + 1;
end;
end;
if (k + m < 2) and (n = t) then
writeln('Текст может быть вещественным числом')
else
writeln('Текст не может быть вещественным числом');
end.

27. Напишите программу для решения задачи. Строка представляет собой запись следующего вида: «а ± b». Найти значение выражения. Вместо знака «±» может быть знак «+» или знак «−». Числа a и b являются целыми и состоят не более чем из девяти цифр (см. пример 9.14).

Найдём подстроку до первого пробела и подстроку после последнего пробела — эти подстроки преобразуем в числа соответственно a и b. Затем выполним соответствуещее математическое действие в зависимости от найденного знака «+» или «-».

var st, с: string; n, a, b, p1, p2: integer;
begin
writeln('Введите выражение');
readln(st);
n := length(st);
p1 := pos(' ', st);
p2 := lastPos(' ', st);
a := StrToInt(copy(st, 1, p1 - 1));
b := StrToInt(copy(st, p2 + 1, n - p2 + 1));
if pos('+', st) <> 0 then
writeln(st, ' = ', a+b);
if pos('-', st) <> 0 then
writeln(st, ' = ', a-b);
end.

28. Напишите программу для решения задачи. Строка представляет собой запись следующего вида: «(a + b) / c». Выделить из записи числа и найти целочисленное значение выражения и остаток от деления. Числа, входящие в выражение, являются целыми и состоят не более чем из девяти цифр (см. пример 9.14).

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

var st: string; n, a, b, c, plus, del, skob: integer;
begin
writeln('Введите выражение');
readln(st);
n := length(st);
plus := pos('+', st);
skob := pos(')', st);
del := pos('/', st);
a := StrToInt(copy(st, 2, plus - 3));
b := StrToInt(copy(st, plus + 2, skob - plus - 2));
c := StrToInt(copy(st, del + 2, n - del - 1));
writeln('a: ', a, '; b: ', b, '; c: ', c);
writeln('Целочисленное значение: ', (a + b) div c);
writeln('Остаток от деления: ', (a + b) mod c);
end.