Помощь - Поиск - Пользователи - Календарь
Полная версия: Обработка текстовой на языке Паскаль
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
IKh
Здравствуйте.

Поставлена учебная задача обработки текстовой информации на языке Паскаль со следующими условиями.

Удалить из заданного в программе текста все символы, не являющиеся буквами латинского алфавита, подсчитать число вхождений каждой буквы латинского алфавита в введенном тексте.

Ниже приведен текст моей программы для этой решения задачи. Так как я начинающий и это моя первая программа, то для меня важно и хотелось бы знать ваши критические замечания и советы.

Текст программы



program Task5;
uses
crt;
var
indata:string; {Вводимая строка символов}
outdata:string; {Строка символов латинского алфавита определенных из введеных}
exit:boolean; {Условие завершения работы}

{Описание процедуры определения символов латинского алфавита}
procedure filter (X:string; var Y:string);
var
i:integer; {Параметр цикла определяемый длиной строки}
stringlength:integer; {Длина строки введенных симолов}
begin
stringlength:=length(X); {Определяем число введенных символов}
Y:=''; {Удаляем данные из переменной, т.к. переменная переменной передается в процедуру но не изменяется}
for i:=1 to stringlength do {Определяем цикл с параметром т.к. известо число шагов цикла}
if (ord(X[i])>=65)and(ord(X[i])<=90) {Если порядковое значение кода ASCII введенного символа принадлежит}
or {к множеству порядковых значений кода ASCII символов латинского алфавита}
(ord(X[i])>=97)and(ord(X[i])<=122) {(от 65 до 90 - заглавные буквы; от 97 до 122 - прописные буквы), то символ}
then Y:=Y+X[i]; {записывается в выходную переменную Y строкового типа.}
end;

{Описание процедуры подсчета числа раз введения символа латинского алфавита}
procedure counter (X:string);
var
i:integer; {Параметр цикла определяемый длиной строки}
stringlength:integer; {Длина строки введенных симолов}
number:integer; {Число раз ввода символа}
symbol:char; {Символ определяемого числа раз ввода}
A:char; {Служебная переменная используется для перезаписи элемента в конец строки}
begin
stringlength:=length(X); {Определяем общее число символов}
while stringlength>0 do {Определяем цикл числа раз подсчета ввода символов}
begin
number:=0; {Устанавливаем счетчик ввода символа в 0}
symbol:=X[1]; {Получаем значение первого символа в строке}
for i:=1 to stringlength do {Определяем цикл числа раз ввода символа}
begin
if symbol=X[1] then {Проверяем равенство символа с первым элементом строки}
begin {Условие проверки истинно для всех символов при первой проверке}
number:=number+1; {Увеличиваем счетчик числа раз ввода символа}
delete(X,1,1); {Удаляем первый символов из строки символов}
stringlength:=length(X); {Определяем число оставшихся символов в строке}
end
else {Если подсчитываемый символ не равен следующему "первому" символу строки}
begin
A:=X[1]; {Присваеваем переменной значение следующего "первого" символа строки}
delete(X,1,1); {Удаляем следующий "первый" символ из строки символов}
X:=X+A; {Записсываем значение переменной в конец строки}
end;
end;
writeln('Символ ',symbol,' введен ',number,' раз/раза');{Выводим колличество раз ввода символа и символ}
end;
end;
begin
clrscr;
writeln('Для продолжения нажмите любую кнопку. Для выхода Esc');
if ord(readkey)=27 then halt; {Условие продолжения или выхода из программы}
repeat {Определяем цикл повторного выполнения программы}
clrscr;
writeln('Введите текст');
readln(indata);
writeln(#10#13,'Общее число введенных симолов ',length(indata));
filter(indata,outdata); {Вызываем процедуру выбора символов латинского алфавита}
if length(outdata)>0 then {Определяем наличие символов латинского алфавита}
begin
writeln(#10#13,'Латинские символы введены следующее число раз:',#10#13);
counter(outdata) {Вызываем процедуру подсчета числа раз ввода символа}
end
else
writeln('В введеной строке латинских символов символов нет');
{clrscr; {Очищаем экран}
writeln(#10#13,'Для продолжения нажмите любую кнопку. Для выхода Esc');
exit:=ord(readkey)=27; {Определяем условие повторного выполнения программы или окончание работы}
until exit;
end.




Krjuger
Ну принцпи,если она работает,то довольно таки неплохо.Принципи попозже,я может быть предложу вариант с небольшой экономией ресурсов памяти.Только вот

writeln('Для продолжения нажмите любую кнопку. Для выхода Esc');
if ord(readkey)=27 then halt; {Условие продолжения или выхода из программы}


На мой взгляд совсем ненужно,если программа запускается,то она должна быть выполнена хотябы один раз,хотя как защита от дурака вполне сойдет.
volvo
Цитата
Принципи попозже,я может быть предложу вариант с небольшой экономией ресурсов памяти
Тут в принципе экономить нечего, не умничай... 512 байт, которые используются в программе совершенно не надо экономить... Не стоит оно этого.

Добавление еще 26 байт в виде переменных приведет к уменьшению кода программы...

Теперь о недостатках: Exit - это зарезервированное слово, я бы не стал его использовать в программе в виде идентификатора. И уж совсем не надо делать

  exit:=ord(readkey)=27;
until exit;
, лучше внеси в Until сразу условие...

Оформление программы - никакое. Код теряется в комментариях... Зачем тебе описывать каждую строку? Там где интуитивно понятно, что делается - ничего комментировать не надо.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.