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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2012, 13:39   #1
Jamguranga
Пользователь
 
Регистрация: 26.12.2012
Сообщений: 48
По умолчанию Задача символы

Нужно найти слово, в котором наибольшее количество букв "о", НО нужно считывать со строки, а я начал делать, считывая по рядам, т.е. в каждом ряду по 1 слову.

Код:
uses crt;
type info=record;
     word:string;
  end;
  
var f:text;
    a:array[1..100] of info;
    b:array[1..100] of integer;
    i,n,c,max,maxw:integer;
    res:string;

Begin
Clrscr;
assign(f, 'd:/lab8/lab8.txt');
reset(f);
i:=1;
  while not eof(f) do
    with a[i] do
      begin
         readln(f,word);
         inc(i);
      end;
    n:=i;

close(f);
i:=1;
        for i:=1 to n do
          with a[i] do
          for c:=1 to length(word) do
            if (word[c]='o') or (word[c]='O')  then inc(b[i]);
 max:=b[i];
 maxw:=1;
 
for i:=1 to n do
  if b[i]>max then
   begin
     max:=b[i];
     maxw:=i;
   end;


   
   for i:=1 to n do
    begin
    with a[i] do
     if maxw=i then res:=word;
   end;
write('Naibilse (o) y slovi: ', res);
readln;
end.
Нужно считывать слова, ориентируясь на пробелы, или же мне советовали использовать copy/delete, но я как-то провтыкал эту тему, кому не сложно, скиньте либо ссылку на обучающий материал, либо переделайте программу, спасибо за внимение
Jamguranga вне форума Ответить с цитированием
Старый 26.12.2012, 14:23   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Ну вот Вам пример Copy и Delete:

Код:
s:='12345';
s:=Copy(s,2,3); {s='234'}
Delete(s,2,1); {s='24'}
Разберетесь?

А еще есть функция pos, которая ищет подстроку в строке:

Код:
s:='1234 5678';
p:=pos(' ',s);    {p=5}
p:=pos('0',s);    {p=0}
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Stilet; 26.12.2012 в 22:04.
Sciv вне форума Ответить с цитированием
Старый 26.12.2012, 14:31   #3
Jamguranga
Пользователь
 
Регистрация: 26.12.2012
Сообщений: 48
По умолчанию

спасибо, буду думать
Jamguranga вне форума Ответить с цитированием
Старый 26.12.2012, 15:43   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

на форуме неоднократно решались задачи по разбору строки на отдельные слова (т.н. парсинг == parse ).

посмотрите примеры кода:

Код:
{отпарсить - разобрать строчку на слова.
 выделить слова}

{ (c) Stilet}

var 
  s:string; a:array[1..100] of string;
  i,count:integer;
begin   {$o-}
 s:='Hello my world';
 count:=1;
 i:=1; 
 while (i<=length(s)) do begin
   if s[i]=' ' then begin inc(count);inc(i);end;
   a[count]:=a[count]+s[i];
   inc(i);
 end;

Count - количество слов.
или по ссылочкам:

http://www.programmersforum.ru/showp...16&postcount=2

http://www.programmersforum.ru/showp...89&postcount=2


p.s. в принципе, Вам массив в данной задаче не нужен, слова можно (и желательно) обрабатывать по мере выделения их из текста...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.12.2012, 16:00   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

разберите вот такую программу:
Код:
{
Нужно найти слово, в котором наибольшее количество букв "о"
}

function CountLetterOinWord(w : string) : integer;
var i,rez : integer;
begin
  rez := 0;
  for i:=1 to length(w) do
    if w[i] = 'o' then Inc(rez);
  CountLetterOinWord := rez;  
end;

var 
  s : string;
  OneWord, MaxLetterWord : string; 
  i, k, CountLetterMaxWord : integer;
begin

 CountLetterMaxWord := 0; {изначально считаем, что нет слов с буквой О, поэтому максимальное значение равно 0} 


 s:='Hello mommy world no problem in comode this totoshko debug mode';

 { обработка одной строки }
 i:=1; 
 OneWord := '';
 while (i<=length(s)) do begin
   if (s[i]=' ') or (i=length(s)) then 
     begin 
       if (i=length(s)) then OneWord := OneWord + s[i];
       inc(i);

       if OneWord<>'' then begin
          k := CountLetterOinWord(OneWord);
          WriteLn('#Отладка# Слово: ',OneWord, '  количество букв "o"  = ', k);

          {поиск слова с максимальным количеством букв}
          if  k > CountLetterMaxWord then begin
             CountLetterMaxWord := k;
             MaxLetterWord := OneWord;
          end;
          OneWord := ''; {очистили текущее слово}
       end;
    end;
    OneWord := OneWord + s[i];
    inc(i);
 end;

 WriteLn;
 if CountLetterMaxWord=0 
   then WriteLn('Нет подходящих слов!')
   else WriteLn('Больше всего букв "o" в слове ',MaxLetterWord, ' там таких букв: ',CountLetterMaxWord);

 Readln;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.12.2012, 18:05   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
s:='Hello mommy world no problem in comode this totoshko debug mode';
Супер!) Серж,а Вы, однако, поэт
Poma][a вне форума Ответить с цитированием
Старый 26.12.2012, 18:24   #7
Jamguranga
Пользователь
 
Регистрация: 26.12.2012
Сообщений: 48
Печаль мой вариант

Код:
Program lab8;
uses crt;
var s,res:string; a:array[1..100] of string;
    i,n,c,count,max,maxw:integer;  f:text;
    b:array[1..100] of integer;
Begin
clrscr;
          assign(f, 'd:\STUDENT\jamgur\lab8\lab8.txt');
          reset(f);
          read(f,s);
 count:=1;
 i:=1;
 n:=1;
 while (i<=length(s)) do
  begin
   if s[i]=' ' then
       begin
         inc(count);
         inc(i);
         inc(n);
       end;

   a[count]:=a[count]+s[i];
       inc(i);
 end;

  for i:=1 to n do
   for c:= 1 to length(a[i]) do
    if (a[i][c]='o') or (a[i][c]='O') then inc(b[i]);


 max:=b[1];
    for i:=2 to n do
      if b[i]>max then
             max:=b[i];



 close(f);
 writeln('naibilse o y slovi:', a[max]);
 readln;
 end.
всё равно не работает
Jamguranga вне форума Ответить с цитированием
Старый 26.12.2012, 21:29   #8
Jamguranga
Пользователь
 
Регистрация: 26.12.2012
Сообщений: 48
По умолчанию *

ошибка найдена, всем спасибо
Jamguranga вне форума Ответить с цитированием
Старый 26.12.2012, 23:04   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

почти всё правильно. при поиска максимально Вы чуть-чуть дали маху.
Вы ищете максимальное значение. А потом вдруг (неизвестно почему) решаете, что максиальное значение соответствует НОМЕРУ слова. Это не так.

исправить очень легко.
Вот так:
Код:
  max:=1;
  for i:=2 to n do
    if b[i]>b[max] then
             max:=i;


p.s. у вас лишняя переменная Count и n - предназначены ровно для одного и того же. Я бы оставил одну из них (любую, какая Вам больше по душе...)
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача 1-реализована.Задача 2-Найти и вывести символы 2-ой строки не совпавшие с символами 1-ой строки Leshkin Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 12.11.2013 08:57
Задача на символы BlackFishSQL Помощь студентам 1 02.12.2012 20:42
Задача на символы Evgenyi Паскаль, Turbo Pascal, PascalABC.NET 0 20.06.2011 17:06
Задача на С++. Символы,строки. cuzo Помощь студентам 7 07.01.2010 18:16