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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2008, 19:50   #1
Студентка@
 
Аватар для Студентка@
 
Регистрация: 30.01.2008
Сообщений: 5
По умолчанию Массивы

Помогите с задачкой,пожалуйста!Дан массив, элементами которого являются строки, состоящие из слов и знаков препинания. Упорядочить его по возрастанию средней длины слов в строках.Спасибо за внимание!
К@тюш@
Студентка@ вне форума Ответить с цитированием
Старый 03.05.2008, 11:52   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
состоящие из слов и знаков препинания
Я так понимаю пробелов нет? Слово1,слово2,слово3
Ну тогда вот так (лучше слова в Delphi вводить на англ яз)
Код:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
  n=5;

var
  mas: array[1..n]of string;
  i, j, leng, num: integer;
  s, tmp: string;

function sred(st: string): real;
var
  k, l, d: integer;
  s0: string;
begin
  d := 1;
  k := 0; //количество слов
  l := 0; //общая длина всех слов
  st := st + '.';
  repeat
    s0 := copy(st, d, 1);
    //знаки препинания могут быть любыми из перечисленных
    if (s0 = ',') or (s0 = '.') then begin
       inc(k);
       l := l + d - 1;
       delete(st, 1, d);
       d := 0;
    end;
    inc(d);
  until d > length(st);
  result := l/k; {sred := l/k - если в паскале}
end;

begin
  for i := 1 to n do readln(mas[i]);
  for i := 1 to n do begin
    num := i;
    for j := 1 to n do
      if sred(mas[i]) < sred(mas[j]) then begin
      num := j;
      tmp := mas[i];
      mas[i] := mas[num];
      mas[num] := tmp
    end;
  end;
  for i := 1 to n do writeln(sred(mas[i]):5:2, ' ', mas[i]);
  readln
end.

Последний раз редактировалось eoln; 03.05.2008 в 12:29. Причина: запятая
eoln вне форума Ответить с цитированием
Старый 03.05.2008, 14:32   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Отлично!
несколько маленьких замечаний:
1) нет проверки на пустую строку в массиве.
2) строчка может быть и не пустой, но состоять только из знаков препинания.
в этих двух случаях я бы возращал sred нулевой.
Код:
if k=0 then
  sred := 0
else
  sred := l/k;
и пустые строчки стали бы первыми.
3)
Цитата:
result := l/k; {sred := l/k - если в паскале}
а чего сразу не написать универсально:
sred := l/k - это и в Дельфи прекрасно отработает ;-)
4) я бы всё таки пробелы добавил.
и вообще, так, на мой взгляд нагляднее, проще и универсальнее:
Код:
const
  WordDelimiters : set of char = [' ',',','.']; {можно сюда добавить и тире, и точку с запятой и двоеточие и что угодно}
...
   s0 := copy(st, d, 1);
   if s0 in WordDelimiters then begin
   ....
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массивы в С\С++ Zahar11 Помощь студентам 4 31.05.2008 00:35
массивы ShenDy Общие вопросы C/C++ 4 17.04.2008 00:01
Массивы Snord Общие вопросы Delphi 2 12.04.2008 13:45