| Символьная информация
- это информация, отображаемая
с помощью символов (букв, цифр, знаков операций и др.). |
Соответствие символов и байтов задается таблицей кодировки, в которой для каждого символа указывается соответствующий байт.
Символы с кодами от 0 до 127 построены по стандарту
ASCII (American Standard
Code for Information
Interchange - Американский стандартный
код обмена информацией, читается "аски"). Вторая
половина таблицы (коды 128 ... 255) в нашей стране
содержит русские буквы (кириллицу) и символы псевдографики.
![]() |
![]() |
Символьная информация в алгоритмах и программах описывается данными двух типов: символьным и литерным. Они отличаются друг от друга тем, что значением символьной переменной является один символ, а литерной - строка символов.
|
|
|
|
|
|
|
a:=" f " ; b:="+" ; c:="5"
If a=" " then k:=k+1 |
|
|
t:="Литерная величина"
s:=" " (пустая строка) |
|
|
|
|
a:=' f ' ; b:='+' ; c:='5' ;
If a=' ' then k:=k+1 |
|
|
t:='Литерная величина' ;
f:=' ' ; (пустая строка) |
|
|
|
|
t$:="Литерная величина"
f$:=" " (пустая строка) |
Школьный АЯ
Функция длин(S) Возвращает количество символов в строке S.
Операция вырезка позволяет "вырезать" из строки группу соседних символов. Вырезка из строки S подстроки, начинающейся с i-ой и кончающейся j-ой позицией, обозначается S [ i : j]. Вырезка из строки S одного i-го символа обозначается S[i].
Команда присваивания вырезке S[N : M] := SubS.
Часть строки S, начиная с позиции N и кончая позицией M, заменяется на
подстроку SubS такой же длины.
Turbo Pascal
Процедуры
Delete(Var S:String; N,M:Integer) Удаляет M символов из строки S, начиная с позиции N.
Insert(SubS: String; Var S:String; N:Integer) Вставляет подстроку SubS в строку S, начиная с позиции N.
Str(X:Integer; Var S:String) Возвращает представление числа X в его символьной форме S.
Val(S:String; Var X, Code: Integer) Возвращает представление символов строки S в ее числовой форме X. Параметр Code содержит признак ошибки преобразования (если Code = 0, ошибки нет).
Функции
Chr(X:Byte): Char Возвращает символ с заданным порядковым номером X.
Сoncat(S1[, S2, ..., SN]): String Выполняет сцепку (конкатенацию) последовательности строк.
Copy(S: String; N,M: Integer): String Возвращает подстроку из строки S, начиная с позиции N и длиной M символов.
Length(S: String): Byte Возвращает количество символов в строке S.
Ord(X: Char): LongInt Возвращает порядковый номер символа X в таблице кодов символов.
Pos(SubS, S: String): Byte Возвращает
номер позиции, начиная с которой в строке S располагается подстрока SubS
(если значение функции равно нулю, то S не содержит SubS).
QBasic
Функции
ASC(X$) Возвращает порядковый номер символа X$ в таблице кодов символов.
CHR$(N) Возвращает символ с заданным порядковым номером N.
INSTR([N,] X$,Y$) Возвращает номер позиции строки X$, начиная с которой в ней размещается подстрока Y$. Если подстрока не найдена, то значение функции равно нулю. Поиск подстроки ведется с позиции N, а если N не задано, то с начала строки.
LEFT$(X$,N) Возвращает подстроку, составленную из первых N символов строки X$.
LEN(X$) Возвращает количество символов в строке X$.
MID$(X$,N [,M]) Возвращает подстроку, составленную из M символов строки X$, начиная с позиции N (если параметр М опущен, то возвращаются все символы, начиная с позиции N).
RIGHT$(X$,N) Возвращает подстроку, составленную из последних N символов строки X$.
STR$(N) Возвращает представление числа N в символьной форме.
VAL(X$) Возвращает представление символов строки X$ в числовой форме.
Операторы
MID$(X$,N,M) = Y$ Часть строки X$, начиная с позиции N, длиной M позиций заменяется на строку Y$. Длина X$ не изменяется.
SWAP X$,Y$ Строки X$ и Y$ обмениваются
своими значениями.
Если слова в тексте разделены одним пробелом, то задача сводится к подсчету числа пробелов. Количество слов при этом равно числу пробелов плюс 1. Если же число пробелов между соседними словами произвольное, как обычно и бывает, то алгоритм усложняется. Рассмотрим оба варианта решения этой задачи.
|
|
|
|
|
|
Школьный АЯ
алг Число слов (арг лит Text, рез цел N)
дано | В непустом тексте Text слова
| разделены одним пробелом
надо | N - количество слов
нач цел i
N:=1
нц для i от 1 до длин(Text)
| цикл по буквам текста
если Text[i] = " "
то N:=N+1
все
кц
кон
|
|
Program Probel;
Uses Crt;
Var Text : String; {заданный непустой текст}
i, Number : Integer; {Number - количество слов в тексте}
Letter : Char; {текущая буква }
BEGIN ClrScr;
WriteLn('Введите текст :'); ReadLn(Text);
Number:=1;
For i:=1 to Length(Text) do {цикл по буквам текста}
begin
Letter:=Text[i];
If (Letter = ' ' ) then Number:=Number+1;
end;
WriteLn('О т в е т : количество слов в тексте равно ', Number);
END.
|
|
|
|
|
|
Школьный АЯ
алг Число слов (арг лит Text, рез цел N)
дано | В тексте Text слова могут быть разделены
| произвольным количеством пробелов
надо | N - количество слов в тексте Text
нач цел i, лог Flag
N:=0; Flag:=да
нц для i от 1 до длин(Text) | цикл по буквам текста
если (Text[i]<>" ") и (Flag=да) | это условие выполняется только
то N:=N+1 | для первой буквы каждого слова
все
Flag := (Text[i]=" ") | Flag=да, если очередная буква - пробел,
кц | в противном случае Flag = нет
кон
|
|
|
|
|
|
|
|
|
|
|
|
Program KolSlov;
Uses Crt;
Var Text : String; {заданный текст}
i, Number : Integer; {Number - количество слов в тексте}
Flag : Boolean;
Letter : Char; {текущая буква }
BEGIN
ClrScr;
WriteLn('Введите текст :');
ReadLn(Text);
Number := 0; Flag := TRUE;
For i := 1 to Length(Text) do {цикл по буквам текста}
begin
Letter := Text[i]; {текущая буква текста }
If (Letter <> ' ') and Flag
then Number := Number+1;
Flag := (Letter=' ') {(Letter=' ') - логическое выражение,}
end; {принимающее значения TRUE или FALSE }
WriteLn;
WriteLn('О т в е т : количество слов в тексте равно ', Number); ReadLn
END.
CLS PRINT "Введите текст, отделяя слова пробелами." PRINT "Если в тексте есть запятые, заключите его в кавычки." INPUT Text$ : PRINT
Number = 0 : Flag = 0 FOR i = 1 TO LEN(Text$) 'цикл по буквам текста Letter$ = MID$(Text$, i, 1) 'текущая буква текста IF (Letter$ <> " ") AND (Flag = 0) THEN Number=Number+1 IF (Letter$ = " ") THEN Flag = 0 ELSE Flag = 1 NEXT i
PRINT "О т в е т : количество слов в тексте равно "; Number END
|
|
|
|
|
|
|
|
|
|
|
|
Школьный АЯ
алг Перевертыш (арг лит Slovo, рез лит Otvet)
надо | Otvet = "Перевертыш", если Slovo совпадает с собой
| после переворачивания
нач цел Dlina, i, лог Flag Dlina:=длин(Slovo) i:=1; Flag:=да нц пока (i<=Dlina/2) и Flag | цикл пока с прерыванием до Flag:=(Slovo[i]=Slovo[Dlina-i+1]) | первой несовпавшей пары букв, i:=i+1 | если такая имеется в слове кц
если Flag то Otvet:="Перевертыш" иначе Otvet:="Не перевертыш" все конИсполнение алгоритма
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
Program TurnOver;
Uses Crt;
Var Slovo : String;
Dlina, i : Integer;
Flag : Boolean;
BEGIN
ClrScr;
Write('Введите слово : '); ReadLn(Slovo);
Dlina:= Length(Slovo);
{Сравниваются пары букв: первая буква с последней, }
{вторая буква с предпоследней и т.д. }
i:=1; Flag := TRUE;
While (i <= Dlina/2) and Flag do {цикл до первой несовпавшей }
begin {пары букв (если такая есть)}
Flag := (Slovo[i]=Slovo[Dlina-i+1]);
i := i+1
end;
WriteLn; Write( 'О т в е т : слово ', Slovo);
If Flag then WriteLn(' - перевертыш. ')
else WriteLn(' - не перевертыш');
ReadLn
END.
CLS : INPUT "Введите слово : ", SLOVO$ Dlina = LEN(SLOVO$) ' Сравниваются пары букв: первая буква с последней, ' вторая буква с предпоследней и т.д. i = 1 : Flag = 0 WHILE (i<=Dlina/2) AND (Flag=0) 'цикл до первой несовпавшей пары букв Letter1$ = MID$(SLOVO$, i, 1) 'первая буква пары Letter2$ = MID$(SLOVO$, Dlina-i+1, 1) 'вторая буква пары IF Letter1$ = Letter2$ THEN i=i+1 ELSE Flag=1 WEND PRINT : PRINT "О т в е т : слово "; SLOVO$; IF Flag = 0 THEN PRINT " - перевертыш." ELSE PRINT " - не перевертыш." END
|
|
|
||
|
|
|
|
|
|
|
|
|
|
Школьный АЯ
алг Замена (арг рез лит Текст, арг лит Слово1, Слово2)
дано | длины Слово1 и Слово2 совпадают
надо | в строке Текст подстрока Слово1 везде
| заменена на подстроку Слово2
нач цел i, DS
DS:=длин(Слово1)
нц для i от 1 до длин(Текст)-DS+1
если Текст[i : i+DS-1] = Слово1 | если вырезка равна Слово1,
то Текст[i : i+DS-1] :=Слово2 | то вырезке присваиваем Слово2
i:=i+DS | и продвигаемся на длину слова
все
кц
кон
Для тестовых данных имеем: DS=3, длин (Текст)-DS+1= 8.
|
|
|
|
|
|
|
|
|
|
Program Replace;
Uses Crt;
Var Text, Slovo1, Slovo2 : String;
i, DlinaSlova, P : Integer;
BEGIN ClrScr;
Write('Введите строку : '); ReadLn(Text);
Write('Какое слово заменить ? '); ReadLn(Slovo1);
Write('На какое слово заменить ? '); ReadLn(Slovo2);
WriteLn; WriteLn('О т в е т : ');
WriteLn('Исходный текст: ', Text); DlinaSlova:=Length(Slovo1);
DlinaSlova:=Length(Slovo1);
P:=Pos(Slovo1,Text); {номер позиции, с которой в строке Text }
{в первый раз встречается подстрока Slovo1 }
While P>0 do {цикл продолжается до тех пор,пока подстрока}
{Slovo1 встречается в строке Text }
begin
Delete(Text, P, DlinaSlova); {удаление подстроки Slovo1, начинаю-}
{щейся с позиции P, из строки Text }
Insert(Slovo2, Text, P); {вставка подстроки Slovo2 }
{ в строку Text с позиции Р}
P:=Pos(Slovo1, Text); {номер позиции, с которой подстрока Slovo1}
{встречается в строке Text в очередной раз}
end;
WriteLn('Новый текст: ', Text);
ReadLn
END.
CLS : INPUT "Введите текст : " , Text$ INPUT "Какое слово заменить ? " , Slovo1$ INPUT "На какое слово заменить ? " , Slovo2$
PRINT : PRINT "О т в е т" PRINT "Исходный текст : " ; Text$ DlinaText = LEN(Text$) : DlinaSlova = LEN(Slovo1$)
FOR i = 1 TO DlinaText-DlinaSlova+1
IF MID$(Text$, i, DlinaSlova) = Slovo1$ THEN
MID$(Text$, i) = Slovo2$ : i=i+DlinaSlova
END IF
NEXT i
PRINT "Новый текст : " ; Text$ END
|
|
|
|
|
Words=("гора", "стол", "стул", "яма") |
Школьный АЯ (АЯ расширен добавлением типа данных лит таб и операций отношения для литерных переменных)
алг Расположить по алфавиту(арг цел NWords, арг рез лит таб Words[1:NWords]) надо | Таблица Words упорядочена лексикографически
нач цел i, j, лит Tmp
нц для i от 1 до NWords-1
нц для j от i+1 до NWords
если Words[i]>Words[j] | условие перестановки слов
то Tmp:=Words[i]; Words[i]:=Words[j]; Words[j]:=Tmp
все
кц
кц
кон
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Program LexOrder;
Uses Crt;
Var Words : Array[1..10] of String; {массив слов}
Tmp : String; {Tmp - вспомогательная переменная}
i, j, NWords : Integer; {NWords - количество слов}
BEGIN
ClrScr;
Write('Количество слов в тексте - ');
ReadLn(NWords);
For i := 1 to NWords do
begin Write(i, '-ое слово : ');
ReadLn(Words[i])
end;
For i := 1 to NWords-1 do {лексикографическое упорядочение слов}
For j := i+1 to NWords do
If Words[i]>Words[j] then
begin
Tmp := Words[i]; Words[i]:=Words[j]; Words[j]:=Tmp
end;
WriteLn; WriteLn('О т в е т');
WriteLn('Лексикографически упорядоченный массив слов:');
For i := 1 to NWords do Write(Words[i], ' ');
WriteLn; ReadLn
END.
CLS : INPUT "Количество слов в тексте - ", NWords DIM Words(NWords) AS STRING
FOR i = 1 TO NWords PRINT i; "-ое слово " ; : INPUT Words(i) NEXT i
FOR i = 1 TO NWords - 1 'лексикографическое упорядочение слов FOR j = i + 1 TO NWords IF Words(i) > Words(j) THEN SWAP Words(i), Words(j) NEXT j NEXT i
PRINT : PRINT "О т в е т" PRINT "Лексикографически упорядоченный массив слов:" FOR i = 1 TO NWords PRINT Words(i); " " ; NEXT i PRINT END
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Школьный АЯ
алг Баланс скобок(арг лит S, рез лит Otvet)
нач цел Dlina, Flag, i
i:=1; Flag:=0; Dlina:=длин(S)
нц пока (Flag>=0) и (i<=Dlina)
если S[i] = "("
то Flag:=Flag+1
все
если S[i] = ")"
то Flag:=Flag-1
все
i:=i+1
кц
если Flag=0
то Otvet := “Есть баланс”
иначе Otvet := “Нет баланса”
все
кон
Program Balance;
Uses Crt;
Var S : String;
Dlina, Flag, i : Integer;
BEGIN ClrScr;
GotoXY(15, 5);
Write('Введите линейную запись математической формулы :');
GotoXY(32,7); ReadLn(S);
i:=1; Flag:=0; Dlina:=Length(S);
While (Flag>=0) and (i<=Dlina) do
begin
If S[i] = '(' then Flag:=Flag+1;
If S[i] = ')' then Flag:=Flag-1;
i:=i+1
end;
GotoXY(32, 9); WriteLn('О т в е т');
GotoXY(15,11);
If Flag=0 then Write('Есть баланс ') else Write('Нет баланса ');
WriteLn('открывающих и закрывающих скобок');
ReadLn
END.
CLS INPUT "Введите линейную запись математической формулы :", S$
i = 1 : Flag = 0 : Dlina = LEN(S$)
WHILE Flag >= 0 AND i <= Dlina
IF MID$(S$, i, 1) = "(" THEN Flag = Flag + 1
IF MID$(S$, i, 1) = ")" THEN Flag = Flag - 1
i = i + 1
WEND
PRINT : PRINT "О т в е т" IF Flag = 0 THEN PRINT "Есть баланс "; ELSE PRINT "Нет баланса "; PRINT "открывающих и закрывающих скобок" END
7.1. [Pascal | Basic] Подсчитать количество запятых в заданном тексте.
7.2. [Pascal | Basic] Подсчитать, сколько раз в заданном тексте встречается заданный символ.
7.3. [Pascal | Basic] Определить долю пробелов в заданной строке.
7.4. [Pascal | Basic] Проверить, является ли заданное слово названием времени года на русском языке.
7.5. [Pascal | Basic] Заменить в заданном тексте буквосочетание "min" на "max".
7.6. [Pascal | Basic] В заданном тексте подсчитать общее количество букв "x" и "y".
7.7. [Pascal | Basic] В заданном тексте везде букву "а" заменить на букву "б", а букву "б" - на букву "а".
7.8. [Pascal | Basic] Удвоить каждую букву в заданном тексте.
7.9. [Pascal | Basic] В заданном слове каждую букву "б" заменить буквосочетанием "ку".
7.10. [Pascal | Basic] Вычеркнуть из заданного слова все буквы "а".
7.11. [Pascal | Basic] Подсчитать, сколько раз в заданном слове встречается буквосочетание "аб".
7.12. [Pascal | Basic] Заданную строку А переписать в обратном порядке в строку В.
7.13. [Pascal | Basic] Выяснить, есть ли в заданном предложении буква "ы".
7.14. [Pascal | Basic] Выяснить, верно ли, что в заданном предложении P есть все буквы, входящие в заданное слово S.
7.15. [Pascal | Basic] Определить количество предложений в заданном тексте (предложение заканчивается либо точкой, либо вопросительным или восклицательным знаком).
7.16. [Pascal | Basic] Определить долю гласных букв в заданном тексте на русском (английском) языке.
7.17. [Pascal | Basic] Определить, является ли одно заданное слово обращением другого заданного слова.
7.18. [Pascal | Basic] Из заданного текста удалить те его части, которые заключены в кавычки (вместе с кавычками).
7.19. [Pascal | Basic] Каждые n символов во введенном тексте отделить знаком "!".
7.20. [Pascal | Basic] Выяснить, верно ли, что в заданном предложении есть пара соседствующих одинаковых символов.
7.21. [Pascal | Basic] Найти хотя бы одно слово, которое встречается в каждом из трех заданных предложений.
7.22. [Pascal | Basic] Отредактировать заданное предложение, удаляя из него все слова с чётными номерами.
7.23. [Pascal | Basic] В заданном предложении указать слово, в котором доля гласных (A, E, I, O, U - строчных или прописных) максимальна.
7.24. [Pascal | Basic] Дан текст из цифр и строчных латинских букв, за которым следует точка. Определить, каких букв - гласных (A, E, I, O, U) или согласных - больше в этом тексте.
7.25. [Pascal | Basic] В заданную упорядоченную в лексикографическом (алфавитном) порядке последовательность слов вставить новое заданное слово так, чтобы лексикографический порядок сохранился.
7.26. [Pascal | Basic] В заданной последовательности слов найти все слова, начинающиеся с заданной приставки.
7.27. [Pascal | Basic] В заданной последовательности слов найти все слова, имеющие заданное окончание.
7.28. [Pascal | Basic] Найти самое длинное и самое короткое слово в заданном предложении.
7.29. [Pascal | Basic] В заданном тексте подсчитать наибольшее количество подряд идущих пробелов.
7.30. [Pascal | Basic] Для каждого из слов заданного предложения указать, сколько раз оно встречается в предложении.
7.31. [Pascal | Basic] Найти самое длинное симметричное слово заданного предложения.
7.32. [Pascal | Basic] Из заданного текста выбрать и напечатать те символы, которые встречаются в нём ровно один раз.
7.33. [Pascal | Basic] Определить частоту вхождения в текст каждой буквы русского алфавита.
7.34. [Pascal | Basic]
Дана последовательность слов, в которой слова разделены запятыми, а за
последним словом - точка. Напечатать:
а) эту же последовательность слов, но
в обратном порядке;
б) все различные слова, указав для каждого
из них число его вхождений в последовательность.
7.35*. [Pascal | Basic] Отредактировать заданное предложение, удаляя из него все лишние пробелы.
7.36*. [Pascal | Basic] Из заданного предложения удалить те слова, которые уже встречались в предложении раньше.
7.37*. [Pascal | Basic] Преобразовать заданное десятичное натуральное число в римскую систему счисления.
7.38*. [Pascal | Basic]
Преобразовать число, заданное в римской системе счисления, в число десятичной
системы.