Коды символов
Очень большой класс задач на символьные переменные проще решать, используя коды символов в кодовой таблице. По этому я рассмотрю несколько типовых, на мой взгляд, задач.
Для решения этих задач, не плохо знать интервалы букв и цифр:
Русские заглавные: 192 ≤ i ≤ 223
Русские строчные: 224 ≤ i ≤ 255
Английские заглавные: 65 ≤ i ≤ 90
Английские строчные: 97 ≤ i ≤ 122
Цифры: 48 ≤ i ≤ 57
Разница в кодах между заглавной и строчной -32
Напомню, что для работами с кодами нам потребуются две функции: функция Ord(S) – определяет порядковый номер символа, и функция Chr(i) – определяет символ с порядковым номером i.
Используя цикл с параметром можно просмотреть коды всех символов в кодовой таблице. Для удобства чтения кодовой таблицы воспользуемся оператором GotoXY, который устанавливает текстовый курсор в указанное место на экране. У нас получается 10 столбиков по 24 строки в каждом.
program bukw;
Uses crt;
var i, x,y:integer;
begin
x:=1;y:=1;
for i:=30 to 255 do begin
gotoxy(x,y);
writeln(i,'-',chr(i),'; ');
y:=y+1;
if (y mod 25 = 0) then begin
x:=x+8;
y:=1;
end;
end;
End.
Задача 1. Составить программу которая считает сколько русских и сколько английских букв в строке введенной с клавиатуры. В данном примере две переменные S и S1 увеличиваются в зависимости от того в каком интервале находится код i-го символа.
Program n1;
uses crt;
var a:string;
b,s,s1,i:integer;
begin
clrscr;
writeln('введи строку');
readln(a);
s:=0;
s1:=0;
for i:=1 to length(a) do
begin
b:=ord(a[i]);
if(b>=65)and(b<=90)or (b>=97)and(b<=122)then then s:=s+1;
if(b>=192)and(b<=255)then s1:=s1+1;
end;
writeln(s,'-английских букв');
writeln(s1,'-русских букв');
end.
В принципе интервалы можно задавать в виде множеств. Причем в первом случае код символа используется как элемент множества:
if (b in [65..90]) or (b in [97..122]) then…
Во втором случае сам символ используется как элемент множества:
if (a[i] in ['А'..'Я']) or (a[i] in ['а'..'я']) then…
Задача 2. Составить программу заменяющую все заглавные буквы на строчные. В строке вводятся русские и латинские буквы вразнобой. Идея решения заключается в том, что разница между кодами строчных и заглавных букв постоянна. Так как заглавные буквы стоят в кодовой таблице впереди строчных то достаточно к коду заглавной буквы прибавить 32, то мы получим код строчной буквы. А затем заменяем в строке i-ый символ на новый при помощи операции присваивания.
Program n2;
uses crt;
var a:string;
b,i:integer;
begin
clrscr;
writeln('введи строку');
readln(a);
for i:=1 to length(a) do
begin
b:=ord(a[i]);
if(b<=90)and(b>=65)or(b<=223)and(b>=192) then
begin
b:=b+32;
a[i]:=chr(b);
end;
end;
writeln(a);
end.
Задача 3. С клавиатуры вводится строка из заглавных русских букв. Подсчитать сколько каждых букв по отдельности в этой строке. (Например: А-10, Б-2, В-4 и т.д.) Идея решения заключается в следующем: так как считать нужно только русские заглавные буквы, нам достаточно массива из 33 ячеек, в которых будем хранить количество тех или иных букв. Что бы получить порядковый номер буквы в русском алфавите, то есть индекс ячейки массива, необходимо из кода символа вычесть 191 (и наоборот, чтобы из номера буквы в алфавите получить код буквы в кодовой таблице необходимо прибавить 191). Мы перебираем буквы и если это заглавная русская буква, то содержимое ячейки под номером данной буквы увеличиваем на единицу. При выводе массива добавлено условие, те буквы которые не встретились в строке, на экран не выводятся.
Program n3;
uses crt;
var a:string;
s:array[1..33] of integer;
b,i:integer;
begin
clrscr;
write('введи строку{русские заглавные}'); readln(a);
for i:=1 to length(a) do
begin
b:=ord(a[i]);
if(b>=192)and(b<=223)then s[b-191]:=s[b-191]+1;
end;
for i:=1 to 33 do if (s[i]<>0) then
writeln(chr(i+191),' - ', s[i]);
end.
Задача 4. Составить программу – генератор паролей из английских заглавных, строчных букв и цифр.
Вспомним как в паскале генерируются случайные числа.
m :=RANDOM (А)
случайное число из интервала [0; А)
m :=RANDOM(B-A)+A;
случайное число из интервала [A ; B)
m :=RANDOM(B-A+1)+A;
случайное число из интервала [A ; B]
Например:
Случайное число из интервала [10 ; 30].
А = 10, В = 30,
подставим в формулу
m :=RANDOM(B-A+1)+A;
m :=RANDOM(30-10+1)+10;
такую запись нужно упростить
m :=RANDOM(21)+10;
В данном примере переменная k определяет вид знака: заглавная, строчная или цифра. k:=random(3); дает случайное число от 0 до 2 включительно. 0- число генерируется из интервала заглавных букв, 1- строчных, 2 – цифр. А затем полученное случайное число из определенного интервала преобразуется в символ и добавляется к паролю.
program n4;
Uses crt;
var s:string;
i,n,k:integer;
begin
for i:=1 to 10 do begin
k:=random(3);
if k=0 then n:=random(25)+65;
if k=1 then n:=random(25)+97;
if k=2 then n:=random(9)+49;
s:=s+chr(n);
end;
writeln(s);
End.