вторник, 16 июня 2009 г.

среднее арифметическое значение длин слов в строке

Задан текст . Для каждой строки вычислить среднее арифметическое значение длин слов в строке.

Порассуждаем

  1. Надо как-то определяться где заканчиваются строки - как правило это символ перевода строки 13,10 или 10(в юникс) или "\n"
  2. Нужно как-то определять где заканчивается слово - набор пробельных символов ' ', -, ',', '.', ':', '?', '!', (ничего не забыл?)
  3. Ну и откуда слово начинается - всё кроме перечисленных в пункте 2.
  4. ну и как-то перебрать все символы текста - представим себе текст массивом символов и будем обращаться к нему соов. stroka[i] для доступа к i-тому элементу



...сделал универсальный вариант - с чтением из файла


var
f: text; {переменная описывающая входной текстовый файл}
s: string; {переменная под текущую строку}
i: integer; {переменная текущего символа строки}

delim: string; {здесь будем хранить набор пробельных символов}
j: integer; {переменная тукущего пробельного символа}

n_bukv: integer; {букв в строке}
n_slov: integer; {слов в строке}
is_delimiter: boolean; {признак пробельного символа}
is_slovo: boolean; {признак слова}

Begin
delim := ' ,.;:!?"''&'; {наши пробельные символы}

Assign(f, 'readme.txt'); {откроем файл}
Reset(f); {установим указатель считывания на начало файла}
Repeat
Readln(f, s); {прочитали строку из файла}

{инициализация данных}
is_slovo:=false;
n_bukv:=0;
n_slov:=0;

{определяем является ли текущий символ пробельным}
for i:=1 to Length(s) do begin
is_delimiter:=false; {сначала полагаем что это не пробельный символ}
for j:=1 to Length(delim) do begin
if delim[j] = s[i] then begin
is_delimiter:=true; {если текущая i-я буква пробельный символ - ставим флаг}
break; {и дальше не ищем}
end;
end;

if is_slovo then begin {если было слово}
if is_delimiter then begin {и встретился пробельный символ}
is_slovo:=false; {ставим флаг - признак того что слово закончилось}
end else begin {и это тоже буква}
n_bukv:=n_bukv+1; {увеличиваем счётчик букв строки}
end;
end else begin {до этого был пробельный символ}
if is_delimiter then begin {и это тоже пробельный}
{продолжается пробельный символ - идём дальше}
end else begin {появилась буква!}
n_bukv:=n_bukv+1; {увеличиваем колво букв строки}
n_slov:=n_slov+1; {увеличиваем кол-во слов строки}
is_slovo:=true; {и помечаем что это таки началось слово}
end;
end;
end;

if n_slov <> 0 then begin {если это была не пустая строка}
writeln(s); {печатаем саму строку}
{и результаты наших вычислений}
writeln('bukv=', n_bukv, ' slov=', n_slov, ' avg=', n_bukv div n_slov);
end;
until Eof(f); {читаем пока не конец файла}
Close(f);
End.



скачать отформатированный рабочий вариант можно здесь

Комментариев нет:

Отправить комментарий