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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2013, 14:57   #1
HailMe
Пользователь
 
Регистрация: 07.10.2012
Сообщений: 13
По умолчанию Одномерный массив - стек. Паскаль

Здравствуйте. Суть задания - записать в файл текст из другого файла, но он должен быть в обратном порядке. Для этого использовать стек, размер его - 10. Нароботка:
Код:
var 
 a:array [1..10] of string; 
 t,g:text; 
 i,n,k,q,st:integer; 
 s,m:string; 
    
 procedure POP; 
  begin 
  write (g,a[q],' '); 
  a[q]:=''; 
  q:=q-1; 
   end; 
  
procedure PUSH (str:string); 
begin 
  q:=q+1; 
  a[q]:=str 
  end; 
    
 begin 
   assign (g,'g.txt'); 
 rewrite (g);  
 assign (t,'t.txt'); 
  reset (t); 
 
 m:=''; 
         
      while not EOF(t) do begin  
            readln (t,s); 
           k:=0; 
           n:=1; 
           i:=0; 
                   for n:=1 to length(s) do begin 
                    i:=n-k; {размер копирования} 
                   
                       if (s[n]=' ') or EOLn(t) then begin  {ищу слово,забиваю в ячейку} 
                       m:=copy (s,k,i); 
                       k:=n; {место точки} 
                       end; 
                               
                  if (m<>'') and (q<=10) then begin {если m не пусто, а стек не полон,то я его забиваю и м обнуляю} 
                  PUSH(m); 
                  m:=''; 
                 end; 
                  
                 if q=10 then begin 
                 for st:=1 to q do 
                 POP(); 
                 writeln (g); 
                 end; 
               
              end;             
end; 
 
   close (g); 
  close (t); 
   end.
Имеется пару ошибок, не могу найти их причину. Первое: последнее слово в строке не копируется в стек, хотя поставил условие конца строки.
Второе: если первая строка выходит в файл в обратном порядке, то вторая уже нет - программа в лоб не хочет видеть условий копирования слова, а забивает в стек по одной букве.

Заранее спасибо за помощь

Последний раз редактировалось HailMe; 11.02.2013 в 15:06.
HailMe вне форума Ответить с цитированием
Старый 11.02.2013, 15:08   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
записать в файл текст из другого файла, но он должен быть в обратном порядке.
а давайте мы с Вами для начала определимся ЧТО должно быть в обратном порядке?!

например, пусть в исходном файле дан такой текст (три строчки, как видно):

Мама мыла раму мочалкой.
Спорт - это мир! Кто виноват?!
А Шура шарил в базе данных.


что должно быть в выходном файле?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.02.2013, 15:10   #3
HailMe
Пользователь
 
Регистрация: 07.10.2012
Сообщений: 13
По умолчанию

данных. базе в шарил Шура А
виноват?! Кто мир! это - Спорт
мочалкой. раму мыла Мама


Как-то так.
HailMe вне форума Ответить с цитированием
Старый 11.02.2013, 15:11   #4
HailMe
Пользователь
 
Регистрация: 07.10.2012
Сообщений: 13
По умолчанию

Я пока такой порядок не пытался написать в программе, хотя-бы просто перевести порядок слов в предложении в обратный порядок, уже там начинаются вылеты.
HailMe вне форума Ответить с цитированием
Старый 11.02.2013, 15:28   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

в вашем коде не всё чисто с пробелами (мало того, что пробел попадает внутрь слова, так ещё и при сохранении стека в файл Вы ещё пробелы добавляете)
но, в целом, работает:
Код:
const
  MaxStekSize = 100;
var
  a: array[1..MaxStekSize] of string;
  t, g: text;
  i, n, k, q, st: integer;
  s, m: string;

procedure POP;
begin
  write(g, a[q], ' ');
  a[q] := '';
  q := q - 1;
end;

procedure PUSH(str: string);
begin
  q := q + 1;
  a[q] := str
end;

begin
  assign(g, 'g_out.txt');
  rewrite(g);
  assign(t, 'g_in.txt');
  reset(t);

  m := '';

  while not EOF(t) do begin
    readln(t, s);
    if (Length(s)>0) and (s[Length(s)]<>' ') then s := s + ' ';
    k := 0;
    n := 1;
    i := 0;
    for n := 1 to length(s) do begin
      i := n - k; {размер копирования}

      if (s[n] = ' ') then begin {ищу слово,забиваю в ячейку}
        m := copy(s, k, i);
        k := n; {место точки}
      end;

      if (m <> '') and (q <= MaxStekSize) then begin {если m не пусто, а стек не полон,то я его забиваю и м обнуляю}
        PUSH(m);
        m := '';
      end;

      if q = MaxStekSize then begin
        for st := 1 to q do
          POP;
        writeln(g);
      end;

    end;
    {чтобы сохранить информацию о переводах строк запишем в стек перевод строки}
    PUSH(#13#10);
  end;

  while q>0 do POP;  {пока стек не пуст, тогда сохраним его в файл}

  close(g);
  close(t);
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.02.2013, 15:44   #6
HailMe
Пользователь
 
Регистрация: 07.10.2012
Сообщений: 13
По умолчанию

Спасибо, в целом да, работает, но не так правильно. По условию - в стеке должно быть 10 значений. Когда стоит 100 - всё отлично. Но когда 10, при тексте:
Медведь Иван напал на девочку. Девочка отбилась банкой с вареньем.
Студент взял билет. Билет был автобусный.
А как же борщ?

в файле получается:
вареньем. с банкой отбилась Девочка девочку. на напал Иван Медведь
как А
автобусный. был Билет билет. взял Студент


борщ? же
HailMe вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одномерный массив. Паскаль. Женька Good Помощь студентам 2 01.12.2011 09:21
Паскаль. Одномерный массив. Женька Good Помощь студентам 1 30.11.2011 18:52
Одномерный массив(паскаль) mig44 Помощь студентам 2 01.06.2010 07:27
одномерный массив Паскаль integral4 Помощь студентам 3 14.03.2010 14:28
ПАСКАЛЬ, одномерный массив (Kate) Помощь студентам 2 23.11.2008 15:06