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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2011, 16:56   #1
big_brat
Новичок
Джуниор
 
Регистрация: 21.12.2011
Сообщений: 5
Восклицание текстовый файл f, каждая строка которого состоит из слов. Найти слова с наибольшим количеством гласных латинских букв (Delphi)

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

Дан текстовый файл f, каждая строка которого состоит из слов, разделенных одним и более пробелами.
Найти все слова, содержащие наибольшее количество гласных латинских букв
(a, e, i, o, u). Сформировать из этих слов новый файл g.


_________
Название темы должно адекватно отражать суть решаемой задачи/проблемы.
На первый раз я исправил.
В дальнейшем темы с подобным названием будут закрываться/удаляться.

Модератор.

Последний раз редактировалось Serge_Bliznykov; 22.12.2011 в 09:32.
big_brat вне форума Ответить с цитированием
Старый 21.12.2011, 18:32   #2
big_brat
Новичок
Джуниор
 
Регистрация: 21.12.2011
Сообщений: 5
По умолчанию

помогите безвозмездно. надо в делфи. алгоритм я придумал но реализовать не могу. можно из файла ф все скопировать в г. потом там удалить те слова в которых нет вообще гласных. потом отсортировать остаток по типу пузырьковой сортировки и удалить те и которых меньше гласных чем в других
big_brat вне форума Ответить с цитированием
Старый 22.12.2011, 09:39   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

для начала сходите в поиск. подобные задачи здесь на форуме неоднократно решались.

p.s. а придумали Вы ПЛОХО.
максимальное_число_найденных_гласны х := 0;
Нужно читать файл посторочно. Каждую строчку разбирать на отдельные слова.
Проверять количество глассных. Если число глассных в слове больше нуля и больше максимальное_число_найденных_гласны х, то максимальное_число_найденных_гласны х := числу гласных.
когда первый проход закончится,
открыть исходный файл - пройти ещё раз тем же самым алгоритмом, только все найденные слова, в которых число гласных равно максимальное_число_найденных_гласны х - писать в новый файл.
всё.

p.s. можно, конечно, и одним проходом по файлу обойтись, но тогда надо сохранять найденные слова. Это тоже можно сделать, но потребуется структура в памяти, где эти слова будут сохраняться (+ возможно возникнут ограничения по количеству слов. впрочем, на практике подобные ограничения вполне допустимы!)

Последний раз редактировалось Serge_Bliznykov; 22.12.2011 в 09:45.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.12.2011, 12:26   #4
big_brat
Новичок
Джуниор
 
Регистрация: 21.12.2011
Сообщений: 5
По умолчанию

Код:
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  Windows;

const
  //Множество разделителей слов.
  D = ['.', ',', ':', ';', '!', '?', '-', ' ', #9, #10, #13];
  //Множество гласных букв.
  Da = [
    //Русские гласные буквы.
    'а', 'я', 'о', 'ё', 'ы', 'и', 'э', 'е', 'у', 'ю',
    'А', 'Я', 'О', 'Ё', 'Ы', 'И', 'Э', 'Е', 'У', 'Ю',
    //Гласные буквы латиницы.
    'a', 'e', 'i', 'o', 'u', 'y',
    'A', 'E', 'I', 'O', 'U', 'Y'
  ];
  //Короткие имена файлов.
  Fn1 = 'file1.txt';
  Fn2 = 'file2.txt';
  //Наибольшее количество слов, которое может быть записано в массив.
  M = 100;
var
  F : TextFile;
  S, FileName : String;
  Arr : array[1..M] of String;
  i, j, Len, Pos1, CntA, CntAMax : Integer;
begin
  //Переключение окна консоли на кодовую страницу CP1251 (Win-1251).
  //Если после переключения русские буквы показываются неверно,
  //следует открыть системное меню консольного окна - щелчком мыши в левом
  //верхнем углу окна консоли и выбрать:
  //Свойства - закладка "Шрифт" - выбрать шрифт: "Lucida Console".
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
 
  repeat
    //Полное имя первого файла.
    FileName := ExtractFilePath( ParamStr(0) ) + Fn1;
 
    //Открываем первый файл, обрабатываем его данные построчно и записываем искомые слова
    //в массив Arr.
    AssignFile(F, FileName);
    Reset(F);
    //Наибольшее количество гласных букв в слове.
    CntAMax := 0;
    //Индекс элемента массива.
    j := 0;
    while not Eof(F) do begin
      //Читаем очередную строку из файла.
      Readln(F, S);
      //Добавляем в массив слова с наибольшим количеством гласных букв.
      Len := Length(S);
      CntA := 0;
      Pos1 := 0;
      for i := 1 to Len do begin
        //Пропускаем разделители.
        if S[i] in D then Continue;
        //Подсчёт количества гласных букв в пределах слова.
        if S[i] in Da then Inc(CntA);
        //Отслеживаем начало слова.
        if (i = 1) or (S[i - 1] in D) then Pos1 := i;
        //Отслеживаем конец слова.
        if (i = Len) or (S[i + 1] in D) then begin
          if CntA > CntAMax then begin
            //Если найдено слово с бОльшим количеством гласных, чем текущее
            //наибольшее значение, то начинаем запись в массив заново (с начала массива).
            CntAMax := CntA;
            j := 1;
            Arr[j] := Copy(S, Pos1, i - Pos1 + 1);
          end else if CntA = CntAMax then begin
            //Если найдено слово с количеством гласных, равным текущему наибольшему,
            //то записываем его в массив под очередным номером.
            Inc(j);
            Arr[j] := Copy(S, Pos1, i - Pos1 + 1);
          end;
        end;
      end;
    end;
    CloseFile(F);
 
    //Теперь все искомые слова записаны в массив Arr.
    //Записываем эти слова во второй файл.
 
    //Полное имя второго файла.
    FileName := ExtractFilePath( ParamStr(0) ) + Fn2;
    //Создаём/пересоздаём второй файл и записываем в него слова из массива Arr.
    //Выполняем также распечатку на экране.
    AssignFile(F, FileName);
    Rewrite(F);
    Writeln('Содержимое второго файла:');
    for i := 1 to j do begin
      if i > 1 then begin
        Write(F, ', ');
        Write(', ');
      end;
      Write(F, Arr[i]);
      Write(Arr[i]);
    end;
    Writeln;
    CloseFile(F);
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.


программа работает но находит не все и лишнее бывает




___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

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

Цитата:
программа работает но находит не все и лишнее бывает
угу. допускаю.
и что от нас требуется?...


p.s. как минимум, в процедуру где обнаружен конец слова вставьте обнуление счётчика:
Код:
        if (i = Len) or (S[i + 1] in D) then begin
          if CntA > CntAMax then begin
            //Если найдено слово с бОльшим количеством гласных, чем текущее
            //наибольшее значение, то начинаем запись в массив заново (с начала массива).
            CntAMax := CntA;
            j := 1;
            Arr[j] := Copy(S, Pos1, i - Pos1 + 1);
          end else if CntA = CntAMax then begin
            //Если найдено слово с количеством гласных, равным текущему наибольшему,
            //то записываем его в массив под очередным номером.
            Inc(j);
            Arr[j] := Copy(S, Pos1, i - Pos1 + 1);
          end;
          CntA := 0;
        end;
p.s. а ещё в программе совсем нет обработки ситуации, когда в исходном файле окажется больше, чем M слов с одинаково большим количеством глассных букв...

Последний раз редактировалось Serge_Bliznykov; 22.12.2011 в 14:19.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строки, как найти слово с наименьшим количеством букв(Delphi) Dima-91 Помощь студентам 9 30.09.2010 17:37
поиск латинских гласных букв в строке KoFeMaN Помощь студентам 7 12.12.2009 17:24
посчет в тексте кол-во слов, гласных и согласных букв DiabloRVK Помощь студентам 4 01.12.2008 14:23
Найти и вывести все слова,у котоpых число гласных букв пpевышает число согласных. Briz Помощь студентам 2 11.05.2008 00:56
Напечатать строку с наибольшим количеством слов. jenja Помощь студентам 9 07.03.2008 05:28