Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3.doc
Скачиваний:
2
Добавлен:
30.04.2019
Размер:
262.66 Кб
Скачать

7.2. Форматування виведення числової інформації

Для ілюстрації пошуку і заміни розглянемо приклад задачі, яка реалізується при форматному виведенні.

Задача 32. Дано текст з двох частин: перша — керуючий рядок; друга (можливо порожня) - аргументи. У керуючому рядку розташовано спеціальні символи, які задають специфікації перетворення аргуліетів при виведенні. Аргументи від-окрелиіені один від одного і від керуючого рядка комами. Перетворити текст, підготувавши його до друку. Тобто, використовуючи специфікації, помістити дані у потрібне місце у відповідному вигляді.

Вважатимемо, що: керуючий рядок - це послідовність довільних символів у лапках; кожна специфікація починається символом %; кількість специфікацій дорівнює кількості елементів у списку аргумен­тів; рядок закінчується специфікацією.

Нехай аргументами будуть лише цілочислові значення, а специфікації задають такі перетворення:

d - число у десятковій системі;

h -число у шістнадцятковій системі.

Наприклад, якщо вхідний рядок має вигляд

"Значення змінних %d та %h",-123,428

то результуючий повинен бути таким:

Значення змінних -123 та 1АС

Зміст алгоритму полягає у пошуку аргументів та відповідних до них специфікацій і заміні специфікацій відповідними підрядками:

program formating;

var vr:string; {вхідний рядок}

res:string; {рядок - результат}

hexs,des:string; b,t,err:boolean;;

zn:integer; n:longint; 1,і,j,p,pm,k:byte;

mvst: array [1.. 255] of byte;

const o=ord('0'); a=ord('A')-10;

procedure decHex(d:longint; var h:string); (утворення шістнадцяткового запису h числа d}

var cyf: byte; c:char; z : Boolean; begin h:=''; {запис спочатку порожній}

if d>=0 then z:=false else

begin d:=-d; z:=true end;

while d>0 do

begin cyf:=d mod 16; {отримання чергової цифри числа}

case cyf of

0..9: C:=chr(cyf+o);

10..15: c:=chr(cyf+a)

end; {case} h:=c+h;

d:=d div 16

end; {while} if z then h: = '-'+h

end; {decHex}

procedure strDec (var s:string,- var k:longint; var t:boolean);

{перетворення з символьного представлення у числове}

var zn:integer; і,cyf:byte; begin k:=0; i:=l; zn:=l; {число зі знаком}

if s[i] = ' + ' then i:=2 else

if s[i]='-' then begin zn:=-l; і:=2 end; t:=true; {припускаємо, що запис числа правильний}

while(i<=length(s))and t do begin if (s[i]>='0')and(s[i]<=* 9') then

begin cyf :=ord (s [і] )-о,- {обчислили значення цифри}

k:=k*10+cyf {доповнили число}

end else t:= false;

i : = i +1

end;{while} if t then k:=zn*k

end;{strDecj

begin {основна програма}

writeln('Введіть рядок для форматування');

readln (vr) ; res : = ' ' ; err: =fаlse;

{пошук і виділення керуючого рядка}

i:=1 ; 1:=1ength (vr) ; b:=-t rue;

if vr[і]<>'"' then

begin writeln ('Неправильний початок керуючого рядка.');

err:=true

end else

begin i:=i + l; j:=0;

while (i<=l) and b do {пошук кінця керуючого рядка}

begin if vr[i] = '" ' then b:=false else

if vr[i]='%' then

begin j:=j+l; mvst[j]:=i {пошук місця вставки}

end; {if & if} і : = і +1

end;{while}

if b then

begin writeln('У рядку немає закриваючих лапок.');

err:=true

end else

begin {кінець керуючого рядка}

if j=0 then

begin writeln('Немає специфікацій.');

res:=res+copy(vr,2,і - 3)

end else

begin k:=l; p:=2; {формування рядків аргументів}

while (k<=j)and(not err) do

begin des:=''; i:=i+l; b:=true;

if vr[i] in ['+','-'] then

begin des:=des+vr[i]; i:=i+l end;

while b and not err do

begin if vr[i] in ['0'..'9'] then

begin des:=des+vr[i]; i:=i+l end else

if vr[i]=',' then b:=false else

begin writeln('Неправильні аргументи');

err:=true

end; {if & if} b:=b and(i< = l)

end;(while i)

if not b then {опрацювання аргументa}

begin pm:=mvst[k] ; k:=k+l;

res:=res + coру(vr,p,pm-p) ;

p:=pm;+2; {мІСЦЄ ДЛЯ ПроДОВЖЄННЯ ТЄКСТу початкового рядка}

if vr[pm+l]='d' then res:=res+des {занесення в результуючий рядок десяткового значення}

else if vr [pm+l] = ' h ' then {занесення із результуючий рядок шістнадцяткового значення}

begin STRDEC(des,n,t);

if t then begin DECHEX(n,hexs);

res:=res+hexs end

else err:=true

end else

begin writeln('Неправильна специфікація');

err:=true

end; (if & if}

end else

begin writeln('невідповідність між', специфікаціями та аргументами');

err:=true

end; {if not b}

end {while no специфікаціях}

end (if j=0 - формування рядка з аргументами}

end (if b)

end;(vr[і]}

if err then writeln('Помилка у вхідному рядку')

else writeln('Результуючий рядок: ',res)

end.

Наведений приклад демонструє, що навіть не надто складне опрацювання тексту вимагає значних зусиль. Більшу частину з них затрачено на перевірку правильності вхідного рядка.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]