IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Обработка текстовой на языке Паскаль, Ваши критические коментарии, советы.
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Игорь

Репутация: -  0  +


Здравствуйте.

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

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

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

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



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.




 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


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

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


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

Сообщение отредактировано: Krjuger -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






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

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

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

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

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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 31.10.2020 16:08
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name