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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2012, 20:46   #1
Rediska512
Пользователь
 
Регистрация: 16.02.2012
Сообщений: 16
По умолчанию Стек

Помогите пожалуйста.
Задача: Создать текстовый файл, между словами запятая, в конце точка.
За один просмотр файла вывести самые длинные слова (с помощью стека)

Вот код процедуры обработки программы
Код:
procedure obrabotka(var f:text; var head:ptr);
var s,slovo:string; i,j:byte;
begin
   reset(f)
   while not(eof(f)) do
   begin
      readln(f,s);
      slovo:='';
      for i:=1 to length(s) do
      begin
      if s[i]<>',' then slovo:=slovo+s[i]
      else
      begin
         if head=nil then begin add(head,slovo); slovo:=''; end
         else
         if length(slovo)=length(head^.data) then begin add(head,slovo); slovo:=''; end
         else if length(slovo)>length(head^.data) then
         begin
            del(head);
            add(head,slovo); slovo:='';
         end;
      end;
      end;
   end;
   close(f);
end;
все хорошо если самое длинное слово одно, а когда 2 и больше то начинаются непонятки, выводит что угодно кроме того что надо
и мне кажется что проблема в строчке
Код:
  if length(slovo)=length(head^.data) then begin add(head,slovo); slovo:='';
а вот что именно не пойму
ЗЫ Процедуры add и del работают правильно (проверял в другой программе)
Помогите пожалуйста
Rediska512 вне форума Ответить с цитированием
Старый 18.03.2012, 20:47   #2
Rediska512
Пользователь
 
Регистрация: 16.02.2012
Сообщений: 16
По умолчанию

еще я пропустил условие точки в конце строчки и ставил в конце запятую
если кто знает помогите и это исправить пожалуйста
Rediska512 вне форума Ответить с цитированием
Старый 20.03.2012, 22:54   #3
Rediska512
Пользователь
 
Регистрация: 16.02.2012
Сообщений: 16
По умолчанию

что никто не может помочь?
Rediska512 вне форума Ответить с цитированием
Старый 21.03.2012, 08:10   #4
rubius2008
Форумчанин
 
Регистрация: 19.03.2010
Сообщений: 409
По умолчанию

del - удаляет один элемент стека или весь стек? мне почему-то кажется, что один, а надо чтоб весь полностью стек очищался
Есть вопросы, пишите в ЛС.
rubius2008 вне форума Ответить с цитированием
Старый 21.03.2012, 09:58   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
что никто не может помочь?
выкладывайте код программы целиком, можно будет пройтись в отладчике, посмотреть, что происходит.

а так, можно гадать..
например, я согласен с rubius2008, вполне может быть причина в том, что не удаляются все элементы...
а может быть, и в другом ошибка..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.03.2012, 23:12   #6
Rediska512
Пользователь
 
Регистрация: 16.02.2012
Сообщений: 16
По умолчанию

del удаляет весь стек

Код:
program z_STEC;
uses crt;
type 
   str=string[20];
   ptr=^element;
   element=record
         data:scr;
         next:ptr;
         end;
var
head:ptr; f:text; name:string;

procedure init_file(var f:text);
var s:string;
begin
   rewrite(f);
   writeln('Vvedite stro4ki slov, mejdy slovami zapyatie, konec #');
   readln(s);
   while s<>'#' do
   begin
      write(f,s);
      readln(s);
   end;
   close(f);
end;

procedure Add(var head:ptr; s:string);
var x:ptr;
begin
   new(x);
   x^.data:=s;
   x^.next:=head;
   head:=x;
end;

procedure Del(var head:ptr);
var x:ptr;
begin
   while head<>nil do
   begin
      x:=head;
      head:=head^.next;
      dispose(x);
   end;
end;

procedure VuvodStek(var head:ptr);
var
s:string; x:ptr;
begin
   writeln('Samie dlinie slova:');
   while head<>nil do
   begin
      x:=head;
      s:=x^.data;
      writeln(s);
      head:=head^.next;
      dispose(x);
   end;
end;

procedure obrabotka(var f:text; var head:ptr);
var s,slovo:string; i,j:byte;
begin
   reset(f)
   while not(eof(f)) do
   begin
      readln(f,s);
      slovo:='';
      for i:=1 to length(s) do
      begin
      if s[i]<>',' then slovo:=slovo+s[i]
      else
      begin
         if head=nil then begin add(head,slovo); slovo:=''; end
         else
         if length(slovo)=length(head^.data) then begin add(head,slovo); slovo:=''; end
         else if length(slovo)>length(head^.data) then
         begin
            del(head);
            add(head,slovo); slovo:='';
         end;
      end;
      end;
   end;
   close(f);
end;

BEGIN
   clrscr;
   writeln('Vvedite Imya faila')'
   readln(name);
   assign(f,name);
   init_file(f);
   head:=nil;
   obrabotka(f,head);
   if head=nil then writeln('Fail ne soderjit dannie')
   else vuvodstek(head);
   readln;
end.
Rediska512 вне форума Ответить с цитированием
Старый 22.03.2012, 17:46   #7
Rediska512
Пользователь
 
Регистрация: 16.02.2012
Сообщений: 16
По умолчанию

опять никто не поможет?
Rediska512 вне форума Ответить с цитированием
Старый 22.03.2012, 19:29   #8
rubius2008
Форумчанин
 
Регистрация: 19.03.2010
Сообщений: 409
По умолчанию

попробуйте поправить в init_file
Код:
write(f,s);
на
Код:
writeln(f,s);
Есть вопросы, пишите в ЛС.
rubius2008 вне форума Ответить с цитированием
Старый 22.03.2012, 19:33   #9
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Диагноз: в случае, если слово-кандидат не подходит по параметрам length(slovo)=length(head^.data) или length(slovo)>length(head^.data), переменная slovo не обнуляется, поэтому добавляем строчку как в коде ниже.

Код:
         begin
            del(head);
            add(head,slovo); slovo:='';
         end;
         slovo:=''
P.S. Можно из строк выше убрать обнуление слова, чтобы дублирования команд не было и чтобы избавиться от лишних операторных скобок begin/end, но можно этого и не делать - всё-равно работает.
P.P.S. Ввод не оченб удачен, ибо после последнего слова тоже надо ставить запятую
eoln вне форума Ответить с цитированием
Старый 22.03.2012, 22:27   #10
Rediska512
Пользователь
 
Регистрация: 16.02.2012
Сообщений: 16
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Диагноз: в случае, если слово-кандидат не подходит по параметрам length(slovo)=length(head^.data) или length(slovo)>length(head^.data), переменная slovo не обнуляется, поэтому добавляем строчку как в коде ниже.

Код:
         begin
            del(head);
            add(head,slovo); slovo:='';
         end;
         slovo:=''
P.S. Можно из строк выше убрать обнуление слова, чтобы дублирования команд не было и чтобы избавиться от лишних операторных скобок begin/end, но можно этого и не делать - всё-равно работает.
P.P.S. Ввод не оченб удачен, ибо после последнего слова тоже надо ставить запятую
огромное спасибо, все работает, а то я себе весь мозг сломал уже
Rediska512 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# Стек Lexey92 Помощь студентам 2 09.03.2012 19:14
Стек? VintProg Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 19.07.2010 13:46
Стек GBTA Общие вопросы C/C++ 3 14.07.2010 21:21
Стек Anabella Помощь студентам 1 20.06.2010 21:01
C++ Стек phantom4eg Помощь студентам 0 31.05.2010 01:16