Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль (прогр) 2008июль.doc
Скачиваний:
1
Добавлен:
17.11.2018
Размер:
900.61 Кб
Скачать

П

program P7_3;

Var X:string[1]; d:string; I:integer;

const s:string='абвxyz123ABC'; {тестовый пример}

begin

d:='';

for i:=1 to length(s) do begin {перебор символов в S}

x:=copy(s,i,1); {очередной символ заносится в X}

{если 'а'<=буква<='п', код уменьшаем на 32}

if (x>='а')and(x<='п') then x:=chr(ord(x[1])-32);

{если 'р'<=буква<='я', код уменьшаем на 80}

if (x>='р')and(x<='я') then x:=chr(ord(x[1])-80);

{латинские преобразуем в заглавные}

if x<'А' then x:=upcase(x[1]);

d:=d+x; {заполнение слова D}

end;

write(d); {результат: 'АБВXYZ123ABC'}

end.

редставление символьных данных.
Каждому символу ПК сопоставлен код (целое число от 0 до 255) из ASCII-таблицы кодов. Первые 128 символов включают цифры, знаки, латинские символы. Из них символы с кодами 0..31 являются служебными (возврат каретки, перевод строки и т.д.). Латинские буквы A..Z имеют коды 65..90, a..z – 97..122. Следующие 128 позиций заняты символами псевдографики и буквами национального алфавита. В кириллице буквы А..Я имеют коды 128..159, а..п – 160..175, р..я – 224..239, буквы Ё – 240, ё – 241. Заметим, что коды заглавных и строчных букв а..п различаются на 32, а букв р..я – на 80.

Очевидно, что на клавиатуре нет всех 256 знаков. Тем не менее, они могут быть отражены в программе с помощью своего кода в форме: #код. Так, оператор write(#65,#177,#201,#205,#187); выведет строку: “A▒╔═╗”. Символы, отсутствующие на клавиатуре, можно найти в справочнике, а можно и вывести вместе с их кодами на экран с помощью операторов: for i:=0 to 255 do write(chr(i),i:3,' ');. Отметим, что коды от 0 до 31 являются управляющими и, хотя многие из них имеют экранное отображение, использовать эти символы для непосредственного вывода нельзя. Символьные данные можно сравнивать между собой. При этом более короткая строка дополняется символами с кодом 0 до размеров более длинной строки. Далее последовательно слева направо коды символов сравниваются попарно из обеих строк (чей код больше – тот символ больше). Например: 'а'<'б'; 'а'='а'; 'а'>'А' (заглавные буквы имеют меньший код); 'ВАЛЯ'<'ВАСЯ' (расхождение в третьем символе, где 'Л'<'С'); 'ЯША'>'ПЕТР' (буква Я больше П).

Пример 7-3. В строке S содержатся русские и латинские символы (заглавные и строчные), цифры и знаки препинания S:='абвxyz123ABC'. Преобразовать все символы строки в заглавные. Результат занести в переменную D. В программе X – однострочная переменая, куда заносятся поочередно все символы из S для преобразования (x:=copy(s,i,1);). Далее выясняется код ord(x[1]) текущего символа. Если это русские буквы в диапазоне от “а” до “п”, из него вычитается 32 (т.е. вычисляется код соответствующей заглавной буквы), и, наконец, этот код снова преобразуется в символ X:=chr(ord(x[1])-32). Похожие действия производятся и над другми символами. В результате получим D='АБВXYZ123ABC'.

Пример 7-4. Напечатать целое число X (в диапазоне 0-99) прописью. Такая потребность возникает при печати в финансовых документах “суммы прописью”. Результат поместить в переменную PR. Нам понадобятся три текстовых массива. s1[0..9] для числительных в диапазоне "ноль" – "девять", s2[10..19] для "десять" – "девятнадцать", s3[2..9] для "двадцать" – "девяносто". Начальный и конечный индексы массивов лучше выбирать в соответствии со значениями числительных. Понадобятся вспомогательные переменные. ST – строковое представление X, N1 и N2 – числительные для десятков и единиц в случае, если они формируются отдельно (т.е. для чисел от 20 до 99).

program P7_4; {число прописью}

uses crt;

label m;

Var X,n1,n2,k:integer; st,pr:string;

const

s1: array [0..9] of string=('ноль','один','два', 'три','четыре','пять','шесть','семь','восемь','девять');

s2: array [10..19] of string=('десять','одиннадцать','двенадцать','тринадцать','четырнадцать',

'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать');

s3: array [2..9] of string=('двадцать','тридцать','сорок','пятьдесят',

'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто');

begin;

clrscr;

write('введите число X '); readln(x); {ввод преобразуемого числа}

IF x > 99 THEN begin writeln('число слишком велико'); exit; end; {проверка диапазона}

IF x < 10 THEN begin pr:=s1[x]; goto m; end; {число до 9}

IF x < 20 THEN begin pr:=s2[x]; goto m; end; {число от 10 до 19}

{число от 20}

val(copy(st,1,1),n1,k); {десятки}

val(copy(st,2,1),n2,k); {единицы}

pr:=s3[n1]+' '+s1[n2]; {формирование строки прописью}

m: writeln(pr); {вывод результата}

end.

Задания для самостоятельного решения.

7.1. В символьной строке X (придумайте ее сами) удалить лишние (начальные, конечные и сдвоенные) пробелы.

7.2. В X подсчитать число вхождений слова ‘его’.

7.3. В X поменять порядок символов на обратный.

7.4. В X напечатать самое длинное слово.

7.5. В X подсчитать число вхождений всех встречающихся знаков.

7.6. В X подсчитать число вхождений произвольного символа.

7.7. В X в каждом слове поменять порядок символов на обратный.

7.8. В X расположить слова в порядке увеличения их длины.

7.9. Выяснить, является ли число А полиандром (числом, которое одинаково читается слева-направо и наоборот). Таким число является, например, 23532.

7.10. Есть строка X длиной ≤N, предназначенная для вывода. Выровнять при печати X к правой границе так, чтобы строка занимала все N позиций. Выравнивание производить за счет равномерного увеличения числа пробелов между словами.

7.11. Зашифровать строку X, заменив каждый символ, на символ, следующий за данным по алфавиту (буква А заменяется на Б и т.д., буква Я заменяется на А). Расшифровать полученный текст.

7.12. В строке X имеются открывающиеся и закрывающиеся скобки (включая вложенные). Выяснить, правильно ли они расставлены. Если есть ошибки – сообщить об этом конкретно, включая номер позиции, где она обнаружена.

7.13. Строка X содержит любые русские и латинские символы (как заглавные, так и строчные), цифры и знаки препинания. Преобразовать все символы X в строчные. Результат занести в Y.

7.14. Пусть имеется таблица работников бригады со столбцами: Имя, Отработано дней, Зарплата. Отсортировать любым методом таблицу по алфавиту. Для упрощения будем считать, что имена не превышают 8-ми символов, содержат только заглавные буквы и не имеют буквы Ё (эта буква в кодовой таблице русских символов находится не на месте).

7.15. Отсортировать таблицу по алфавиту, где для имен допускаются любые буквы русского алфавита, включая Ё и ё. Сложность здесь заключается как раз в этих буквах. Их коды 240 и 241, т.е. самые большие среди русских букв, в виду чего сравнивать слова придется не целиком, а побуквенно. В случае, если встретилась буква Ё и ё, в программе они должны считаться большими букв Е/е и меньшими Ж/ж.

7.16. Написать программу, которая из заданной даты формирует следующую. Исходная дата задается в форме текстовой строки вида ‘дд.мм.гггг’, например ’06.04.2002’.

7.17. Написать программу, которая от заданной даты (диапазон 1900..2100) находит новую, отстоящую от данной на M месяцев. Если в новом месяце такой даты нет, берется последний день нового месяца.

7.18. Написать программу, которая от заданной даты (1900..2100), находит новую, отстоящую от данной на X дней.

7.19. Преобразовать число X, отображенное цифрами в число “прописью”:

а). X имеет три разряда в диапазоне 0999.

б). X имеет шесть разрядов в диапазоне 0999 999.

в). X имеет девять разрядов в диапазоне 0999 999 999.

Результатом преобразования, например числа 23 245 012, должно быть выражение “двадцать три млн. двести сорок пять тыс. двенадцать руб.” Основой для решения этих задач является пример 7-4, разобранный выше. Понадобится еще массив для сотен числительных “сто” – “девятьсот”. И отдельный массив для разряда единиц тысяч, поскольку “одна” тысяча, но “один” рубль. При формировании строки следует разбить исходное число на триады (т.е. по три разряда), для которых техника преобразования практически аналогична.