Основы программирования (947332), страница 20
Текст из файла (страница 20)
Процедура Str(x[:w [:d]], St) - преобразует результат выражения x встроку st, содержащую запись этого числа в виде последовательности символов (как при выводе).Примечание. По правилам описания конструкций языков программирования используемые в описании заголовков процедур и функций квадратные скобки означают, что соответствующий параметр может быть опущен.Значение w, если оно указано, интерпретируется как длина строки, азначение d, если оно указано - как количество цифр дробной части для вещественных чисел, например:х:=-5.67;Str(x:7:3,sl);{получим строку ' -5.670'}Процедура обычно используется для формирования строк, включающихчисловую информацию.5.
Процедура Val(St, х, Code) - преобразует строку St с записью числа ввиде последовательности символов во внутреннее представление целого иливещественного числа и помещает его в переменную х. В целочисленной переменной Code процедура возвращает код ошибки: О, если преобразованиепрошло успешно, и номер ошибочного символа, если строка st не являласьдопустимой формой записи числа.1164. Структурные типы данныхПроцедура обычно используется, если необходимо предотвратить некорректный ввод чисел, например:Var S:strmg; Code:mteger; a:real; ....„repeatWrite('Beedume число a:');ReadLn(S);{вводим строку}Val(S,afCode); {пытаемся преобразовать строку в число}ifCodeoOthenWriteLn('Число введено не верно *);until Code-0;...{до получения правильного значения числа}6.
Функция Copy(St,index,count):string - возвращает фрагмент строки Stдлиной count символов, начиная с символа с номером index, например:S1 = 'qqqEEEEEEuuuuu';S:= Copy(SlJ,6);{получим строку 'ЕЕЕЕЕЕ'}7. Функция Pos(St2,Stl):integer - возвращает номер позиции первоговхождения подстроки St2 в строку Stl. Если вхождение не найдено, то функция возвращает О, например:S] = 'qqqEEppEEuuuuu':i:= Pos('EE\Sl);{получим i=4}8. Функция UpCase(ch):char - возвращает символ, соответствующийсимволу верхнего регистра для ch, если таковой имеется, либо сам символch, если для него не определен символ верхнего регистра.В качестве первого примера посмотрим, как будет выглядеть решениезадачи из примера 4.3 с использованием строковых типов.Пример 4.14. Дана строка не более 40 символов, состоящая из слов, разделенных пробелами.
Разработать программу удаления «лишних» пробелов.Лишними считать пробелы в начале строки до первого символа, второй и более пробелы между словами и пробелы в конце строки.При решении данной задачи с использованием строкового типа отпадает необходимость посимвольного анализа строки. Функция Pos, которой вкачестве подстроки заданы два пробела подряд, позволит определить все места в строке, где записаны несколько пробелов подряд. Поочередно удаливлишние пробелы, получим строку, в которой останется только проверить ипри необходимости удалить пробел в начале и пробел в конце (рис. 4.28).
Ниже приведен текст программы.Program ex;Var st:string[40];k:byte;117Часть I. Основы алгоритмизации и процедурное программированиенет1.delete(St, 1,1)k:=length{st):st[k] = 'J>нет(1delete(st,k,l)Конец JРис. 4.28. Схема алгоритма программы удаления «лишних» пробеловBeginWriteLnCВведите строку длиной <= 40 символов');ReadLn(st):Write (*Введенная строка:');WriteLn(^);k:-posC^^ \st); {проверяем, есть ли сдвоенные пробелы?}while к<>0 do {пока есть сдвоенные пробелы}begindelete(st,k,l);{удаляем первый пробел}k:=posC^^ ^,st); {проверяем, есть ли сдвоенные пробелы?}end;ifst[l]= ^^^ then delete(stJJ);{удалили пробел в начале}Л:;= length(st);ifst[kj= ^^^ then delete(st,kj); {удалили пробел в конце}WriteLn('Результат:');iflength(st.)<>0 then WnteLn(st)else WriteLn('Строка codepjfcana только пробелы.');End1184.
Структурные типы данныхПример 4Л5. Разработать программу, которая вводит строки, содержащие фамилию, имя, отчество и год рождения, а выводит - строки, содержащие фамилию, инициалы и возраст на текущий год. Например:Иванов Иван Иванович 1956 => Иванов И.И. 45Завершение ввода - при чтении пустой строки.Для выполнения операций над строками используем строковые функции. Обработку строк будем выполнять в цикле до ввода пустой строки. Начнем с определения местоположения первого пробела, который отделяет имяот фамилии.
Для этого используем функцию Pos, а результат запишем в переменную с1. Затем перепишем в строку результата фамилию, пробел и первый инициал. Туда же дописываем точ!^.Для поиска следующего пробела придется копировать в рабочую строкучасть исходной строки, начиная с символа после первой буквы имени. В этойстроке вновь определяем местоположение пробела и заносим результат в переменную с2. Теперь можно переписать в строку-результат второй инициал.Удаляем из рабочей строки начало, включая второй инициал, и вновь определяем местоположение пробела, выделяя подстро!^, содержащую годрождения.
Удаляем из рабочей строки остаток отчества и преобразуем строку в число. Полученное значение вычитаем из текущего номера года, а результат вновь преобразуем в строку и дописываем к строке результата. Выводим результат на экран и вводим следующую строку.Несколько первых шагов преобразования показаны на рис. 4.29.Program stroka;Var st,strez,strab:string[40]:cl, c2, c3, n, old, code:word;cl[T|ИсходнаястрокаSt T""^1И|в 1 a 1HI 01 в 1 | и | в | а | н | | и | в | а [ н [ )( | в | и | ч |^с2|1|9|5|б|Рабочая строка 1 4 1strab^''|в|а|н|| и | в | а | н | () РвУи|чУ 1 1 ] 9] 5 |Т]г1 1""^^Строка резулbxaxastrez j ^|И|в|а|н|о|в|\Щ.\2кШЖЁШ^t ] 1 1 1 1 1 IIРис.
4.29. Начало решения задачи преобразования строк119Часть I. Основы алгоритмизации и процедурное программированиеBeginWriteLn('Введите строку. Завершение - ввод пустой строки.');ReadLn(st);while sto^^ do {цикл ввода, преобразования и вывода строк}begincl:=Pos(' ',^/у);{определим местоположение первого пробела}strez:=Copy(stJ,c] + lJ+ \ V {перепишем фамилию, инициали добавим точку}strab:=Copy(st,cl+2,Length(st)-cJ-l);{копируем остаток строкив рабочее поле}c2:=Pos(' \strab); {определяем местоположение второго пробела}strez:=strez+strabfc2+lj+ \ V {добавляем к результату второйинициал и точку}Delete(strabJ,c2+l);{удаляем распознанную часть}c3:=PosC \strab); {onpmQ^HQM местоположение третьего пробела}Delete(strabJ,c3);{удаляем остаток имени}Val(strab,n,code);{преобразуем год рождения в число}old:=2001'n;{определяем возраст}Str(old,strab);{преобразуем возраст в строку}strez:=strez-^ ' '+strab;{добавляем возраст в результат}WriteLn(strez);{выводим результат}WriteLnCВведите строку.
Завершение- ввод пустой строки. ');ReadLn(st);end;End.4.6. Практикум. Обработка и поиск символьной информацииВ основе обработки символьной информации, как правило, лежит разбиение текста на слова и выполнение некоторых операций со словами.Пример 4.16. Разработать программу, которая определяет в строке количество слов длиннее четырех символов. Слова разделены одним пробелом.Решение задачи будем осуществлять следующим образом. Вначале убедимся, что в конце строки есть пробел. Если пробела нет, тогда вставим его.Затем, пока длина строки не станет равной нулю, будем определять местоположение пробела и, соответственно, длину слова, которая на единицу меньше номера пробела.
Если длина слова больше четырех символов, то добавимединицу к счетчику слов. Затем удалим обработанное слово вместе с пробелом и перейдем к обработке следующего слова.Program strokal;Var St: string;p, spos: integer;1204. Структурные типы данныхBeginWriteLn('Введите строку');ReadLn(st); {вводим строку}р:=0;{обнуляем счетчик слов }ifst[Length(st)] <> ' ' then st:=st-^ ' V {если в конце нет пробела,то добавим его}while Length(st)<>0 dobeginspos:^ Pos(' \ St);ifspos>5 thenp:=p+J;{определяем длину слова}Delete(st,l,spos);{удаляем слово}end;WriteLnCB строке \ p, ' слов(а), длина которых больше четырех. ) ;End.Пример 4.17. Разработать программу, меняющую в строке односочетание букв на другое.С использованием строковых функций задача решается просто. Вводимстроку и оба сочетания букв.
Затем определяем вхождения заменяемого сочетания, удаляем его и вставляем на это место заменяющее сочетание.Program Stroka;Var mbyte; s, si, s2:string;BeginWriteLnCBeediwie исходную строку);ReadLn(s);WriteLnCВведите заменяемое слово: ) ;ReadLn(sl);WriteLn('Введите заменяюгцее слово: ) ;ReadLn(s2);n:=Pos(sl,s);{определяем вхождение заменяемого сочетания}while п > О dobeginDelete(s,n,Length(s 1)); {удаляем заменяемое сочетание}Insert(s2,s,n);{вставляем заменяющее сочетание}n:=Pos(sl,s); {определяем следующее вхождение}end;WriteLn(Teзyльmam : \s);ReadLn;EndПример 4.18. Разработать программу, меняющую в строке местами слова с указанными номерами.