Цель работы:
- изучить приемы работы с символьными и строковыми типами данных;
- приобрести навыки составления, отладки и тестирования программ;
- разработать пользовательский модуль работы со строками и символами.
1. Введение
Под данными будем понимать информацию, представленную в формализованном виде. В программах данные фигурируют в качестве значений переменных и констант. Каждая константа и переменная в языке Паскаль имеет определенный тип. Тип данных определяет:
1) множество допустимых значений переменной;
2) формат внутреннего представления на ЭВМ и объем памяти, занимаемый одним значением;
3) набор операций, которые можно применять к значениям данного типа.
Строгая типизация данных, принятая в языке Паскаль, на первый взгляд кажется излишней, однако она придает высокую надежность при работе с данными и позволяет создавать новые типы. Умение разрабатывать необходимые для решения данной задачи типы данных – одно из важнейших профессиональных качеств программиста, приобретаемое постепенно в процессе решения конкретных задач.
В языке Паскаль данные принято делить на простые и структуированные. Простой тип данных имеет одно значение и поэтому называется также скалярным типом. Он является базовым для структуированных (или сложных, составных) типов данных, таких как массивы, множества, записи, файлы.
К простым типам, в свою очередь, относятся символьные, строковые, логические, целые, перечисляемые, диапазонные и вещественные типы данных. Все они, кроме вещественных, относятся к порядковому типу, т.е. множеству значений, каждое из которых имеет свой порядковый номер.
Помимо стандартных типов, определяемых по умолчанию, в языке Паскаль могут создаваться собственные, пользовательские типы. Для этого в разделе описаний записывается:
type <имя типа> = <описание типа>;
И далее в разделе описания переменных следует:
var <список переменных>: <имя типа>;
В последних версиях языка допускается использование так называемых типизированных констант, которые в отличие от констант, могут изменять свое значение в процессе выполнения программы, т.е. ведут себя как переменные, но задаются в разделе описания констант с указанием после имени ее типа. Например,
const f1: boolean = true;
a: real = pi/180;
Использование типизированных констант избавляет от необходимости присвоения начальных значений переменным непосредственно в исполняемой программе. Кроме того, значения типизированных констант, измененные при выполнении процедуры, сохраняют свои значения к следующему запуску процедуры и могут быть, таким образом, использованы для сохранения внутренних параметров процедур.
В этой работе остановимся подробнее на изучении стандартных символьных и строковых типов данных.
2. Символьный тип данных.
Символьный (или литерный) тип данных задает конечное и упорядоченное множество символов, каждый из которых занимает 1 байт памяти. В одном байте возможно 28=256 комбинаций из двоичных 0 и 1. Каждому символу соответствует свой числовой код. Существует много таблиц кодировок символов, наиболее распространенная из них – американский стандартный код для обмена информацией ASCII (American Standard Code Information Interchange). Первая половина этой таблицы (символы с кодами от 0..127) идентична для всех IBM-совместимых компьютеров. Так, арабским цифрам от 0 до 9 соответствуют коды от 48 до 57, прописным буквам латинского алфавита коды от 65 до 90, строчным буквам от 97 до 122. Вторая половина таблицы ASCII отведена для символов национальных алфавитов, псевдографики и др.
Переменные символьного типа задаются в разделе описания как переменные типа Char (от character – символ). Например,
var c1, c2: char;
Переменная типа char хранит только один символ.
Значения для этого типа переменных могут быть заданы двумя способами:
1) через апостроф, например, c1:=’g’; c2:=”n”;
2) через знак диеза (#) и номер символа в кодовой таблице ASCII, например, c1:=#103; c2:=#110.
Поскольку каждое значение символьного типа имеет порядковый номер, к ним могут быть применимы стандартные функции:
Chr (x:byte): char – преобразует значение целочисленного типа в символьный в соответствии с таблицей ASCII;
Ord(x):longint – возвращает порядковый номер, соответствующий значению х порядкового типа;
Pred(x) – возвращает предшествующее значение аргумента, причем тип результата соответствует типу аргумента;
Succ(x) – возвращает последующее значение аргумента.
При работе с символьным типом полезна также стандартная функция
Upcase(x:char): – преобразует строчные буквы латинского алфавита в прописные, но не изменяет другие символы.
Функции Chr и Ord обратны по отношению друг к другу:
Сhr (Оrd(x))=x;
Ord (Сhr(x))=i;
Chr (Оrd(x)-1)=Pred(x);
Chr (Оrd(x)+1)=Succ(x).
С переменными символьного типа можно производить операции присваивания, а также логические операции отношений. Причем сравнение по величине производится согласно порядкового номера в кодовой таблице: из двух символов меньше тот, который встречается в таблице раньше.
Символьный тип данных удобно использовать при организации диалога компьютер-пользователь, в операторах цикла и операторе выбора case.
Заметим, что в таблице ASCII кроме обычных символов имеются специальные управляющие символы, занимающие первые 32 позиции. Они представляют собой команды, приводящие к выполнению определенных действий. Исторически они обозначались двух- или трехбуквенными сокращениями. Например, мнемоническое обозначение Esc, соответствует 27 коду ASCII – символ Escape, HT – горизонтальная табуляция, расположена в коде 9. Существует несколько способов обращения к управляющим символам:
1. по его ASCII-коду;
2. по Ctrl-последовательности, т.е. коду, порождаемому одновременным нажатием клавиш Ctrl и какой-либо другой клавиши; например, Ctrl+H (или это обозначается как ^H);
3. с помощью функции Chr(i).
Например,
1. ch:=10; ch:=^J; ch:=chr(10)
эти операторы присваивают символьной переменной ch одно и тоже символьное значение, соответствующее переводу строки (мнемоническое обозначение LF).
В качестве демонстрационного примера рассмотрим фрагмент программы, работающей как калькулятор:
var x, y, z: real; operator: char;
begin
writeln (‘Введи число х=’); readln(x);
writeln (‘Действие +, -, *, /?’); readln(operator);
writeln (‘Введи число y=’); readln(y);
case operator of
‘+’: z:= x+y;
‘-‘: z:= x-y;
‘*’: z:=x*y;
‘/’: z:=x/y;
end;
writeln (‘z=’,z); readln
end.
Другой демонстрационный пример попробуйте разобрать самостоятельно:
var ch:char; k,m:byte;
begin
readln(ch); k:=0;
repeat
m:=Ord(ch) – Ord(‘0’);
k:=10*k+m; readln(ch)
until not ((ch>=’0’) and (ch<=’9’));
writeln(‘ k=’,k); readln
end.
Проведите отладку и тестирование указанных фрагментов программ. Оформить их в виде подпрограмм, проведя предварительно улучшение сервиса.
3. Строковый тип данных.
Последовательность символов можно представить в виде переменной типа массив array[1..n] of char. Однако в языке Паскаль вводится стандартный символьный тип данных string.
Например, var st1:string;
st2:string[8];
где целое число в квадратных скобках задает максимальную длину строки. В данном примере длина переменной st2 равна 8. Если длина строки не указана, как для переменной st1, то она по умолчанию автоматически принимается равной максимально возможному значению 255.
Все символы, номера которых превосходят заказанную при объявлении длину строки, будут отброшены. Значения строковых переменных заключаются в апострофы, например, st2:=’frequency’. Поскольку ее длина равна 8, то фактическое значение переменной st2 будет ’frequenc’.
В языке Паскаль существует такое понятие как текущая длина строки, которая показывает число реально используемых символов строки, но не превосходящих указанной в описании. Эта информация хранится в нулевом байте памяти, например st2[0], и автоматически обновляется при изменении длины строки.
Поскольку в каждой ячейке строки может храниться только переменная типа char, в нулевую ячейку записывается символ, номер которого в таблице ASCII совпадает с текущей длиной строки. В нулевую ячейку можно записать любой символ, задавая, таким образом, принудительно длину строки.
Из сказанного видно, что переменные типа string и char являются совместными типами с учетом того, что в переменных char может храниться только одни символ.
Длину строки можно определить с помощью функций Length(st2) или Ord(st2[0]). Стандартная функция Length считает все символы, включая и пробелы.
Строки можно сравнивать при помощи операций отношений =, <, <= и т.д. Сравниваются при этом коды символов, начиная с первых символов строк. Две строки будут равными, если они равны оп длине и совпадают посимвольно. Более короткая строка всегда меньше более длиной. Например, ‘150’ < ‘160’; ‘Max’< ‘mini’.
Строковый тип может использоваться для определения констант и типизированных констант. В первом случае конкретный тип строки определяется определенной длиной заданного текста, а во втором – описанием типа. Например, типизированная константа
const s1:string[50]=’Ваня’;
задает строку типа string[50], но имеет текущую длину равную 4.
Строковый тип данных похож на одномерный массив тем, что имеет определенную длину и к каждому символу которого можно обратиться по его номеру st2[i]. Однако имеется и ряд различий, например, вывод строк производится не поэлементно, как в массиве, а сразу целиком. Для символьных типов данных существует понятие текущей длины строки, имеется набор стандартных процедур и функций для их обработки.
4. Стандартные подпрограммы обработки строк.
Остановимся подробнее на некоторых стандартных функциях и процедурах для работы со строковыми переменными.
1.С функцией, определяющей длину аргумента str строкового типа, мы уже знакомы:
Length(str:string):byteю.
2. Функция Pos(substr, str:string):byte определяет позицию подстроки substr в строке str.Результат этой функции – целое число типа byte, равное номеру первого элемента, с которого начинается вхождение подстроки substr в строке str. Если такой подстроки нет, то значение функции равно 0.
Например, следующий фрагмент
st1:=’First’; st2:=’SetFirst’; k1:=Pos(st1,st2);
дает значение k1 равное 4.
3. К строкам можно применять операцию конкатенации – последовательное объединение нескольких строк (склеивания). Она осуществляется оператором конкатенации, обозначаемой знаком “плюс”:
st:=st1+st2+…+stn;
или функцией
st:=Concat(st1,st2,…,stn).
Длина результирующей строки st не должна превышать 255 литер.
4. Функция Copy(str:string, kstart,m:integer): string позволяет копировать m символов строки str, начиная с kstart символа. Исходная строка при этом не изменяется. Например,
gamma:= ‘SetColor’; beta:=Copy(gamma, 4,5); writeln(beta);
дает значение переменной beta=’Color’.
5. Процедура Delete (var str:string, kstart, m:integer) используется для удаления m символов строки str, начиная с позиции ksatr. Например,
alfa:=’element’;
Delete (alfa,4,3);
дает результат alfa=’elet’.Текущая длина строки уменьшается на m символов, оставшиеся в строке символы смещаются влево.
6. Процедура Insert(instr:string, var str:string, kstart:integer) позволяет делать вставку строки instr в строку str, начиная с позиции kstart. Например,
beta:=’123 ‘; alfa:=’element’;
Insert(beta, alfa,5);
дает результат alfa=’123_element’. В процедурах Delete и Insert параметр kstart может быть константой, переменной и любым выражением, имеющим целочисленное значение меньшее 255.
7. Процедура Str(n [:width[:decimals]]; var strn:string) переводит числовое значение n в строковое и присваивает результат строке strn. Здесь n – значение числового типа, strn – строковое значение, представляющее собой символьное изображение значения переменной n.
Например, Str(4.52, st1) переводит вещественное число в строковое st1=’4.52’.
8. Процедура Val (strn:sting; var n; var errcode:integer) выполняет обратное преобразование, переводит строковое значение strn в числовое n. Параметр errcode равен нулю при успешном выполнении преобразования. Если в strn имеются символы, недопустимые при записи числа, то значение параметра errcode равно номеру позиции с ошибочно заданным символом. Например,
Val(‘12345’, n,k);
здесь n = 12345; k=0.
Val (‘12_45’ n, k);
дает значение параметра k=3.
5. Экспериментальный раздел занятия.
1.Пусть задан не отформатированный текст. Требуется вставить пробел после точки и записать предложение с прописной буквы.
var str:string; k:integer;
begin
writeln(‘Введите текст’); readln(str);
for k:=1 to Length(str) do
if Copy(str,k,1)=’.’
then begin Insert(‘ ‘,str,k+1); str[k+2]:= UpCase(str[k+2] end;
writeln(str); readln
end.
Программа будет работать только с латинским шрифтом. Переделайте её так, чтобы можно было вести обработку кириллицы. Оформить её в виде подпрограммы и ввести требуемую на Ваш взгляд модификацию.
2. По правила машинописи после запятой в тексте всегда ставится пробел. Следующая программа вставляет недостающие пробелы.
var i: integer; s: string;
Begin
writeln (‘Введите текст’); readln (s);
i:=1;
while i<Length(s) do begin
if (s[i]=’,’) and not (s[i+1]=’ ‘)
then Insert(‘ ‘,s,i+1); Inc (i)
end;
writeln(s);
End.
Почему для организации цикла выбран оператор While, а не For? Почему в теле цикла нельзя использовать функцию Pos(“ “, s)? Обратите внимание на то, что если запятая — последний символ текста, то мы не добавляем пробел. Измените программу для исправления случаев нарушения правила “после символов “!”, “?” должен стоять пробел, а затем текст начинается с прописной буквы”. Вспомните еще ряд правил и традиционных ошибок и модифицируйте программу для их исправления.
3. Давайте разберемся со следующей рекурсивной процедурой, осуществляющей реверс введенного слова.
type strtype = string[20];
var strread,strrev:strtype;
function Reverse(str:strtype):strtype;
var firstch:char; rrest:strtype;
begin
if Length(str)=1
then Reverse:=str
else begin
firstch:=str[1]; Delete(str,1,1);
rrest:=Reverse(str);
Reverse:=Concat(rrest,firstch)
end
end;
Begin
repeat
writeln('Input text.Word endf - end'); readln(strread);
strrev:=Reverse(strread); writeln(strrev)
until strread = 'endf';
readln
End.
Поэкспериментируйте с данной программой. Исследуйте «слова-перевертыши» (палиндромы), которые читаются одинакова слева направо и справа налево: «доход», «заказ», «шалаш» и т.д.
Существуют целые предложения, стихи и рассказы – палиндромы. Приведем несколько смешных фраз: «торт с кофе не фокстрот», «удавы рвали лавры в аду», «Аргентина манит негра», «я и ты будем в аду бытия», «я не мил и не женили меня».
Попробуем составить программу, которая будет анализировать предложение на свойство палиндромности.
var x,y,z:string; k:integer;
function UpRusCase(w:char):char;
{Преобразование прописных русских слов в заглавные}
begin
if (w>=’ю’) and (w<=’ч ’)
then UpRusCase:=Chr(Ord(w)+32)
UpRusCase:=w
end;
Begin
y:=’ ’; z:=’ ‘;
writeln(‘Введите исседуемую фразу’); readln(x);
for k:=1 to Length(x) do
if (Copy(x,k,1)>=’ю’) and (Copy(x,k,1)<=’ч’)
then begin z:=Concat(z,UpRusCase(Copy(x,k,1)));
y:=Concat(UpRusCase(Copy(x,k,1)),y)
end;
if y=z
then writeln(‘да, палиндром’)
else writeln(‘увы, не палиндром’);
readln
End.
Поэкспериментируйте с данными программами.
4. Пусть дана строка. Будем считать ее отрывком текста. Группы символов, разделенных одним или несколькими пробелами, назовем словами. Пробелы могут находиться как в начале текста, так и в конце. Требуется выделить слова из текста и каждое слово записать в соответствующий элемент массива. Приведенная ниже программа решает эту задачу. Выполните ее в пошаговом режиме с использованием отладчика, наблюдая за изменением значений переменных.
const n=20; m=10; {Количество слов в тексте и количество букв в слове}
type Tstring=string[m];
var a: array[1..n] of Tstring; s: string; k, i: Integer;
procedure DelPr (var s: string); { Удаляем пробелы из текста }
begin
while (s[1]=’ ‘) and (s<>’ ‘) do Delete (s,1,1)
end;
function GetWord (var s: string): Tstring;
{Выделяем слово, удаляем его из текста и убираем пробелы после слова}
begin
GetWord:=Copy(s,1,Pos(‘ ‘,s)-1);
Delete (s,1,Pos(‘ ‘,s));
DelPr(s)
end;
Begin
writeln (‘Введите текст’); readln (s);
s:=s + ’ ‘; {Добавляем символ пробела в конец текста. Зачем?}
DelPr(s); {Удаляем пробелы в начале текста }
k:=0;
while s<>’ ’ do begin {Пока текст не пустой }
Inc(k); a[k]:=GetWord(s) {Берем слово из текста }
end;
for i:=1 to k do writeln (A[i]); readln
End.
Удалите вызов процедуры DelPr(s) из основной программы, а в функции GetWord переставьте этот вызов в ее начало. Что изменится в работе программы? На каких исходных данных она не будет правильно работать? Что произойдет, если в конец текста не добавлять символ пробела? В процедуре DelPr измените цикл
while (s[1]=’ ‘) and (s<>’ ‘) do Delete (s,1,1)
на
while (s[1]=’ ‘) do Delete (s,1,1)
Приведите пример исходных данных, при которых результат работы программы окажется неверным или его вообще не будет. Продолжите эксперименты с программой.
5.Даны две строки Х и Y. Назовем расстоянием r между строками Х и Y количество символов, которыми Х и Y различаются между собой. То есть нас интересует минимальное количество символов, которые необходимо добавить в строки Х и Y для того, чтобы после такого добавления они состояли из одних и тех же символов. При этом существенно количество символов, но не их порядок. Например Х= 'abcd', Y= 'dxxc', r= 4, Х= '1111111', Y= '111222', r= 7. Приведем текст решения данной задачи:
var i,j,r: integer; s,x,y: string;
Begin
writeln (' Первая строка '); readln (x);
writeln (' Вторая строка'); readln (y);
if Length(x)>Length(y)
then begin s:=x; x:=y; y:=s end;
{ Строка Y должна быть не короче X }
r:=Length(y);
for i:=l to Length (x) do begin
j:=1;
while (j<=Length(y)) and (y[j]<>x[i)) do Inc(j);
if j>Length(y)
then Inc(r)
else begin dec(r); Delete(y,j,1) end
{ Есть совпадение. Уменьшаем расстояние и удаляем символ из Y }
end;
writeln (' Расстояние ', r); readln
End.
К каким последствиям приведет исключение из решения строки со сравнением длин строк и записи в Y строки наибольшей длины? Проверьте. Исключим оператор Delete(Y,j,l). Что получится? Измените программу так, чтобы в тексте находились два слова, расстояние между которыми имеет максимальное (минимальное) значение.
6. Задания для самостоятельной работы
1. Составить программу:
- которая запрашивает имя человека и повторяет его на экране;
- которая запрашивает имя человека и повторяет его на экране с приветствием;
- которая запрашивает название футбольной команды и повторяет его на экране со словами: "Это чемпион!".
2. Дано название футбольного клуба. Определить количество символов в нем.
3. Дано название города. Определить, четно или нет количество символов в нем.
4.Даны две фамилии. Определить, какая из них длиннее.
5.Дано слово.
- Вывести на экран его третий символ.
- Вывести на экран его последний символ.
- Вывести на экран его k-й символ.
- Определить, одинаковы ли второй и четвертый символы в нем.
- Верно ли, что оно начинается и оканчивается на одну и ту же букву?
- Получить и вывести на экран буквосочетание, состоящее из его второго и четвертого символов.
- Получить и вывести на экран буквосочетание, состоящее из его третьего и последнего символов.
- Получить его часть, образованную второй, третьей и четвертой буквами.
- Получить его часть, образованную идущими подряд буквами, начиная с т-й и кончая n-й.
6. Даны два слова. Верно ли, что первое слово начинается на ту же букву, которой оканчивается второе слово?
7. Составить программу, которая запрашивает отдельно имя и отдельно фамилию, а затем выводит их как одну символьную строку.
8. Из слова "яблоко" путем вырезок его букв получить слова "блок" и "око”.
9. Из слова "информатика" путем вырезок его букв получить слова "форма" и "тик".
10. Из слова "вертикаль" путем вырезок и склеек его букв получить слова "тир" и "ветка".
11. Из слова "программа" путем вырезок и склеек его букв получить слова "ром" и "рампа".
12. Из слова "трос" путем вырезок и склеек его букв получить слова "сорт", "рост" и "торс".
13. Из слова "клоун" путем вырезок и склеек его букв получить слова "уклон", "кулон" и "колун".
14. Из слова "апельсин" путем вырезок и склеек его букв получить слово "спаниель".
15. Из слова "вирус" путем замены его букв получить слово "фокус".
16. Из слова "курсор" путем замены его букв получить слово "танцор".
17. Из слова "пробел" путем замены его букв получить слово "продел".
18. Из слова "строка" путем замены его букв получить слово "строфа".
19. Из слова "муха" путем замены его букв получить слово "слон".
20. Из слова "тетрадь" путем замены его букв получить слово "дневник".
21. Дано слово из четного числа букв. Поменять местами его половины. Задачу решить двумя способами: без использования оператора цикла; с использованием оператора цикла.
22. Дано слово из 12 букв. Поменять местами его трети следующим образом:
а) первую треть слова разместить на месте третьей, вторую треть — на месте первой, третью треть — на месте второй;
б) первую треть слова разместить на месте второй, вторую треть — на месте третьей, третью треть — на месте первой.
23. Дано слово. Переставить первые три и последние три буквы, сохранив порядок их следования. Задачу решить двумя способами: без использования оператора цикла; с использованием оператора цикла.
24. Дано слово. Перенести первые k его букв в конец.
25. Дано название футбольного клуба. Напечатать его на экран столбиком.
26. Составить программу, которая печатает заданное слово, начиная с последней буквы.
27. Дано слово s 1. Получить слово s 2, образованное нечетными буквами слова s 1.
28. Дано слово s. Получить слово t, получаемое путем прочтения слова s, начиная с его конца.
29. Получить строку, состоящую из пяти звездочек, т.е. символов "*".
30. Получить строку, состоящую из восьми символов "_".
31. Составить программу, формирующую строку, состоящую из любого заданного количества любых одинаковых символов.
32. Дано слово. Добавить к нему в начале 4 символа "+" и в конце 5 символов "—".
33. Дано слово. Добавить к нему в начале и в конце столько звездочек, сколько букв в этом слове.
34. Дано предложение. Напечатать все его буквы "и".
35. Дано предложение. Составить программу, которая печатает столбиком все вхождения в предложение некоторого символа.
36. Дано предложение.
- Вывести столбиком его третий, шестой и т.д. символы.
- Вывести все буквы "м" и "н" в нем.
- Составить программу, которая выводит все вхождения в предложение двух заданных символов.
- Вывести все имеющиеся в нем буквосочетания "нн".
- Вывести столбиком все его буквы "и", стоящие на четных местах.
- Вывести столбиком его первый, второй, пятый, шестой, девятый, десятый и т.д. символы.
- Определить число букв "о" в нем.
- Определить число пробелов в нем.
- Определить число вхождений в него некоторого символа.
- Определить долю (в %) букв "а" в нем.
37. Дано предложение. Определить:
а) число вхождений в него буквосочетания "ро";
б) число вхождений в него некоторого буквосочетания из двух букв;
в) число вхождений в него некоторого буквосочетания.
38. Дано предложение. В нем слова разделены одним пробелом (начальные и конечные пробелы и символ "—" в предложении отсутствуют). Определить количество слов в предложении.
39. Дано предложение. В нем слова разделены одним или несколькими пробелами (символ "—" в предложении отсутствует). Определить количество слов в предложении. Рассмотреть два случая:
1) начальные и конечные пробелы в предложении отсутствуют;
2) начальные и конечные пробелы в предложении имеются.
40. Дан текст. Подсчитать общее число вхождений в него символов "+" и "—".
41. Дана фраза. Определить, сколько в ней предложений.
42. Дано предложение.
- Определить, сколько в нем гласных букв.
- Все буквы "е" в нем заменить на букву "и".
- Все пробелы в нем заменить на символ "_".
- Все его символы, стоящие на четных местах, заменить на букву "ы".
- Все его символы, стоящие на третьем, шестом, девятом и т.д. местах, заменить на букву "А".
- Заменить в нем все вхождения буквосочетания "ах" на "ух".
- Заменить в нем все вхождения буквосочетания "да" на "не".
- Заменить в нем все вхождения буквосочетания "про" на "нет”.
- Заменить в нем все вхождения буквосочетания "бит" на "рог".
- Заменить в нем все вхождения подстроки Strl на подстроку Str2.
43. Дано предложение. Найти наибольшее количество идущих подряд пробелов.
44. Дан текст. Найти наибольшее количество идущих подряд одинаковых символов.
45. Дан символ. Выяснить, является ли он цифрой.
46. Дан текст.Напечатать все имеющиеся в нем цифры. Определить количество цифр в нем.
47. Дан текст, в котором имеются цифры.
а) Найти их сумму.
б) Найти максимальную цифру.
48. Дан текст, в начале которого имеются пробелы и в котором имеются цифры. Найти порядковый номер максимальной цифры, считая, что первый номер имеет первый непробел. Если максимальных цифр несколько, то должен быть найден номер первой из них.
49. Дан текст. Определить, является лион правильной десятичной записью целого числа.
50. Дан текст, представляющийсобой десятичную запись целого числа. Вычислить сумму цифрэтого числа.1.
51. Дан текст, имеющий вид: d1+d2+…+dn, где di — цифры (n > 1).
Вычислить записанную в тексте сумму.
52. Дан текст, имеющий вид: d1–d2+d3–…, где di — цифры (n > 1).
Вычислить записанную в тексте алгебраическую сумму.
53. Дан текст, имеющий вид: d1 ± d2 ±...± dn, где di — цифры (n > 1).
Вычислитьзаписанную в тексте алгебраическую сумму.
54. Дан текст. Найти наибольшееколичество идущих подряд цифр.
Найти сумму всехимеющихся в нем чисел.
Найти максимальноеиз имеющихся в нем чисел.
55. Дан текст, в котором имеется несколько идущих подряд цифр. Получить число, образованное этими цифрами.
56. Дано предложение. Определить, каких букв в нем больше: "м" или "н".
57. Дано предложение. В нем слова разделены одним пробелом (символ " — " в предложении отсутствует). Верно ли, что число слов в предложении больше трех.
58. Дано предложение, в котором имеются буквы "с" и "т". Определить, какая из них встречается позже (при просмотре слова слева направо). Если таких букв несколько, то должны учитываться последние из них. Оператор цикла с условием не использовать.
59. Дан текст. Верно ли, что в нем есть пять идущих подряд одинаковых символов?
60. Дано предложение. Напечатать все его символы, предшествующие первой запятой. Рассмотреть два случая: известно, что в предложении запятые имеются; в предложении запятых может не быть.
61. Дано предложение, в котором имеется несколько букв "е". Найти:
а) порядковый номер первой из них;
б) порядковый номер последней из них.
62. Дано предложение. Определить, есть ли в нем буква "а". В случае положительного ответа найти также порядковый номер первой из них.
63. Дано слово. Проверить, является ли оно перевертышем (перевертышем называется слово, читаемое одинаково как с начала, так и с конца).
64. Дан текст. Определить количество букв "и" в первом предложении. Рассмотреть два случая:
1) известно, что буквы "и" в этом предложении есть;
2) букв "и" в тексте может не быть.
65. Дана последовательность символов, в начале которой имеется некоторое количество одинаковых символов. Определить это количество. Рассмотреть два случая:
1) известно, что не все символы последовательности одинаковые;
2) все символы последовательности могут быть одинаковыми.
66. Даны два слова. Определить, сколько начальных букв первого слова совпадает с начальными буквами второго слова. Рассмотреть два случая:
1) известно, что слова разные;
2) слова могут быть одинаковыми.
67. Дано предложение, в котором нет символа "—". Определить количество букв "о" в первом слове. Учесть, что в начале предложения могут быть пробелы.
68. Дано предложение. Определить количество букв "н", предшествующих первой запятой предложения. Рассмотреть два случая:
1) известно, что запятые в предложении есть;
2) запятых в предложении может не быть.
69. Дано предложение. Определить порядковые номера первой пары одинаковых "соседних" символов. Если таких символов нет, то должно быть напечатано соответствующее сообщение. Определить, есть ли в нем сочетания "чу" или "щу". В случае положительного ответа найти также порядковый номер первой буквы первого из них.
70. Дана последовательность слов.Проверить,правильно ли в ней записаны сочетания "жи" и "ши". Проверить, правильно ли в ней записаны сочетания "ча" и "ща". Исправить ошибки.
71. Дано предложение. Напечатать все символы, расположенные между первой и второй запятой. Если второй запятой нет, то должны быть напечатаны все символы, расположенные после единственной имеющейся запятой.
72. Дано предложение, в котором имеются одна буква "с" и одна буква "т". Определить, какая из них встречается раньше (при просмотре слова слева направо).
73. Символьной строке по ошибке вместо "опечатка" присвоено значение "очепатка". Изменить значение s так, чтобы ошибки не было.
74. Дано слово. Поменять местами его m-ю и п-ю буквы. Поменять местами первую из букв "а" и последнюю из букв "о". Учесть возможность того, что таких букв в слове может не быть.
75. Дано слово из четного числа букв. Поменять местами первую букву со второй, третью — с четвертой и т.д. Поменять местами его половины следующим способом: первую букву поменять с последней, вторую — с предпоследней и т.д.
76. Дано слово из 12 букв. Переставить в обратном порядке буквы, расположенные между второй и десятой буквами (т.е. с третьей по девятую).
77. Дано слово из 15 букв. Переставить в обратном порядке буквы, расположенные между k -й и s-й буквами (т.е. с (k + 1)-й по (s - 1)-ю). Значения k и s вводятся с клавиатуры, k < s.
В задачах 78-82 под удалением символа из символьной строки следует понимать:
1) исключение этого символа из строки путем смещения всех следующих за ним символов влево на одну позицию;
2) присваивание последнему символу исходной строки значения "_".
78. Устранить имеющуюся в заданном слове ошибку:
а) дано слово "глинянный";
б) дано слово "граффика".
79. Дано слово:
- удалить из него третью букву;
- удалить из него k-ю букву.
- удалить из него первую из букв “о”, если такая буква есть;
- удалить из него последнюю из букв "т", если такая буква есть.
- Если его длина нечетная, то удалить среднюю букву, в противном случае — две средних буквы.
- Удалить из него все повторяющиеся буквы, оставив их первые вхождения, то есть в слове должны остаться только различные буквы.
80. Дано предложение. Удалить из него все символы с nl-го по n2-й (n1 < n2).
Удалить из него все буквы "с".
Удалить из него все буквы "о", стоящие на нечетных местах.
81. Проверить, является ли «перевертышем» следующая символьная строка после удаления из нее всех пробелов:
а) "АРГЕНТИНА МАНИТ НЕГРА";
б) "А РОЗА УПАЛА НА ЛАПУ АЗОРА”.
Во всех задачах последние символы "_", полученные после удаления пробелов, не учитывать.
82. Проверить, является ли некоторая символьная строка перевертышем после удаления из нее всех пробелов Последние символы "__", полученные после удаления пробелов, не учитывать.
В задачах 83-89 под вставкой символа s в символьную строку после k-го символа следует понимать:
1) смещение всехсимволов, начиная с (k+1)-гo, вправо на одну позицию;
2) присваивание (k+1)-му символустроки значения s.
83. Дано слово "стекляный_". Исправить ошибку в нем.
84. Дана фраза "ценая вещь_". Исправить ошибку в ней.
85. Дано слово, оканчивающееся символом "_". Вставить букву "т" после k-й буквы.
86. Данослово, оканчивающееся символом "_". Составить программу,которая вставляет некоторую заданную букву после буквы с заданным номером.
87. Дано слово, оканчивающеесясимволом "_". Вставить заданную букву после первойбуквы "и".
88. Дано предложение, оканчивающееся символом “__". Вставить заданную букву перед последней буквой “и”.
89. Путем вставок и удаления символов исправить ошибки:
а) в слове "прроцесор";
б) во фразе "теекстовыйфайл";
в) во фразе "програма и аллгоритм";
г) во фразе "процесор и паммять".
90. Дано ошибочно написанное слово "рпроцессo". Путем перемещения его букв получить слово "процессор". Аналогично для слов:
- "иинформаця" - "информация";
- "алигортм" - "алгоритм";
- "роцессорп” - "процессор".
- "ИТЕРНЕТН" - "ИНТЕРНЕТ".
- "килбайот" - "килобайт".
91. Дано слово.
- Переставить его s-ю букву на место k-й (s < k). При этом (s + 1)-ю, (s+ 2)-ю,.., k-ю буквы сдвинуть влево на одну позицию.
- Переставить его первую букву на место последней. При этом вторую, третью,..., последнюю буквы сдвинуть влево на одну позицию.
- Переставить его первую буквунаместо k-й. При этом вторую, третью,..., k-ю буквы сдвинуть влево на одну позицию.
- Переставить его последнюю букву на место первой. При этом первую, вторую,..., предпоследнюю буквы сдвинуть вправо на одну позицию.
- Переставить его последнюю букву на место k-й. При этом k-ю, (k + 1)-ю,.., предпоследнюю буквы сдвинуть вправо на одну позицию.
- Определить, сколько различных букв в нем.
92. В слове имеются только две одинаковых буквы. Найти их.
93.Даны два слова.
- Для каждой буквы первого слова (в том числе для повторяющихся в этом слове букв) определить, входит ли она во второе слово. Например, если заданные слова "информация" и "процессор", то для букв первого из них ответом должно быть. "нет нет нет да да нет нет да нет нет".
- Для каждой буквы первого слова определить, входит ли она во второе слово. Повторяющиеся буквы первого слова не рассматривать. Например, если заданные слова "процессор" и "информация", то для букв первого из них ответом должно быть: "нет да да да нет нет".
- Напечатать только те буквы слов, которые есть только в одном из них (в том числе повторяющиеся). Например, если заданные слова "процессор" и "информация", то ответом должно быть:
- "п е с с и ф м а и я".
- Напечатать только те буквы слов, которые встречаются в обоих словах только один раз. Например, если заданные слова "процессор" и "информация", то ответом должно быть: "п е ф м л я".
- Определить, можно ли из букв первого из них получить второе. Рассмотреть два варианта:
1) повторяющиеся буквы второго слова могут в первом слове не повторяться;
2) каждая буква второго слова должна входить в первое слово столько же раз, сколько и во второе.
94. Даны три слова.
- Напечатать их общие буквы. Повторяющиеся буквы каждого слова не рассматривать.
- Напечатать только те буквы слов, которые есть только в одном из слов. Рассмотреть два варианта: повторяющиеся буквы каждого слова рассматриваю
| Поделиться: |
Поиск по сайту
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-07-23 Нарушение авторских прав и Нарушение персональных данных