Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2008, 11:14   #1
Noxil
Пользователь
 
Регистрация: 30.10.2008
Сообщений: 22
По умолчанию Строки

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

Объясните, пожалуйста, алгоритм определения среднего числа символов в словах четной длины. Как это реализовать?
Noxil вне форума Ответить с цитированием
Старый 02.11.2008, 11:45   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

проходите в цикле по строке, анализируйте символы,
накапливайте символы. если встретили пробел - значит в переменной у Вас слово.
если длина слова чётная (Not Odd(Length(Slovo))) тогда его длину приплюсовывайте к суммарной длине чётных слов (перед циклом сумма должна быть нулевая) и увеличивайте счётчик чётных слов на единицу.
После окончания цикла (когда дошли до конца строки символов) делим сумму на количество слов (не забудьте проверить, что количество слов > 0) и результат выдаёте на экран.
При анализе строки не забудьте учесть, что:
1) в конце строки пробела может НЕ БЫТЬ
(для борьбы с этим лучше всего без всяких проверок просто добавить перед циклом в конец строки пробел!)
2) пробел может быть вначале строки.
3) в начале/конце/между словами пробелов подряд может быть НЕСКОЛЬКО.

удачи.

p.s. алгоритмы разбора строки на слова здесь в форуме были неоднократно! ищите и обрящите.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.11.2008, 19:28   #3
Noxil
Пользователь
 
Регистрация: 30.10.2008
Сообщений: 22
По умолчанию

что-то не получается. Вот я набрасал такой код, посмотрите что не так, и как лучше сделать
Код:
program test;
var
i,x,n,l:integer;
s:string[30];
begin
i:=1;
x:=0;
l:=0;
writeln('Введите строку: ');
readln(s);
n:=length(s);
repeat
while (s[i]=' ') and (i<=n) do
 i:=i+1;
 if (s[i]<>' ') and (i<=n) then
   begin
   if (not odd(length(s[i]))) then
   x:=x+length(s[i]); l:=l+1;
   end;
  while (s[i]<>' ') and (i<=n) do
  i:=i+1;
until i>n;
if l=0 then
 writeln('Слов четной длины нет!')
 else
  writeln('Среднее кол-во букв в словах четной длинны: ',x/l);
  readln;
  end.
Noxil вне форума Ответить с цитированием
Старый 03.11.2008, 20:40   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Цитата:
if (not odd(length(s[i]))) then
x:=x+length(s[i]); l:=l+1;
Тут begin end нужны и вместо s[i] (это один символ и длина его всегда = 1) надо подставить слово из строки
Код:
program test;
var
  i,x,l:integer;
  s:string[30];
begin
  x:=0;
  l:=0;
  write('Введите строку: ');
  readln(s);
  s := ' ' + s + ' ';
  while pos('  ', s) > 0 do delete(s, pos('  ', s), 1);//лишнии пробелы уберём
  delete(s, 1, 1);
  //теперь любая строка выглядит так "слово1 слово2 ... словоN "
  while pos(' ', s) > 0 do
  begin
    i := pos(' ', s); //ищем пробел
    if not odd(i-1) then //i-1 - длина первого слова
    begin
      inc(l);
      inc(x, i-1)
    end;
    delete(s, 1, i) //удаляем первое слово с пробелом
  end;
  if l=0 then
    writeln('Слов четной длины нет!')
  else
    writeln('Среднее кол-во букв в словах четной длинны: ',x/l:0:2);
  readln;
end.
eoln вне форума Ответить с цитированием
Старый 03.11.2008, 21:36   #5
Noxil
Пользователь
 
Регистрация: 30.10.2008
Сообщений: 22
По умолчанию

Цитата:
Тут begin end нужны и вместо s[i] (это один символ и длина его всегда = 1) надо подставить слово из строки
Тоесть мой код более-менее верен? А как подставить слово в length(), а не символ строки?
Noxil вне форума Ответить с цитированием
Старый 03.11.2008, 22:17   #6
Sm1Le
Форумчанин
 
Аватар для Sm1Le
 
Регистрация: 31.10.2008
Сообщений: 500
По умолчанию

Цитата:
Сообщение от Noxil Посмотреть сообщение
Тоесть мой код более-менее верен? А как подставить слово в length(), а не символ строки?

Что то я не понял... length('slovo') - будет равен 5, вроде бы так ....
или Slovo:string , length(slovo);
Skype : UASm1Le.
Sm1Le вне форума Ответить с цитированием
Старый 04.11.2008, 10:42   #7
Noxil
Пользователь
 
Регистрация: 30.10.2008
Сообщений: 22
По умолчанию

Скажите пожалуйста, что в моем примере надо изменить, чтоб работало как надо? Я так понял в этом куске что-то не так:
Код:
if (not odd(length(s[i]))) then
x:=x+length(s[i]); l:=l+1;
Noxil вне форума Ответить с цитированием
Старый 04.11.2008, 11:21   #8
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Цитата:
Сообщение от Noxil Посмотреть сообщение
Скажите пожалуйста, что в моем примере надо изменить, чтоб работало как надо? Я так понял в этом куске что-то не так:
Код:
if (not odd(length(s[i]))) then
x:=x+length(s[i]); l:=l+1;
Надо объявить новую переменную var k: byte; и заменить на это
Код:
  for k := i to n do if s[k] = ' ' then break;
  if k = n then k:=k+1;
  if (not odd(length( copy(s,i,k-i) ))) then begin
  x:=x+length(copy(s,i,k-i)); l:=l+1; end
eoln вне форума Ответить с цитированием
Старый 04.11.2008, 11:43   #9
Noxil
Пользователь
 
Регистрация: 30.10.2008
Сообщений: 22
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Надо объявить новую переменную var k: byte; и заменить на это
Код:
  for k := i to n do if s[k] = ' ' then break;
  if k = n then k:=k+1;
  if (not odd(length( copy(s,i,k-i) ))) then begin
  x:=x+length(copy(s,i,k-i)); l:=l+1; end
Спасибо. Можете объяснить что имеено этот код делает,а то чет я не могк понять.
Noxil вне форума Ответить с цитированием
Старый 04.11.2008, 12:02   #10
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

if (s[i]<>' ') and (i<=n) then//найдено начало слова на позиции i
begin
for k := i to n do if s[k] = ' ' then break;//с этой позиции до конца
//строки ищем пробел. Как только нашли, выходим из цикла
//теперь в переменной к храниться позиция конца слова + 1
if k = n then k:=k+1;
//если перебрали всю строку (k=n) значит пробела в конце возможно не было
//k:=k+1 считаем что пробел якобы был в конце
//теперь в переменной к храниться позиция конца слова + 1
if (not odd(length( copy(s,i,k-i) ))) then begin
x:=x+length(copy(s,i,k-i)); l:=l+1; end
//copy(s,i,k-i) - копируем из строки слово
//где i - начало слова (см первую строку)
//k-i - длина_слова = координаты_конца_слова +1 - координаты_начала_слова
end;

Последний раз редактировалось eoln; 04.11.2008 в 12:04.
eoln вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c++ строки Abbatik Помощь студентам 1 14.05.2008 20:09
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27
Строки Zenit10 Помощь студентам 10 18.01.2008 15:49
Строки furian Общие вопросы C/C++ 15 19.12.2007 20:15
как вывести строку поочередно сначала первая буква первой строки потом первая буква второй строки и т.д. vitalik007 Помощь студентам 1 25.09.2007 20:45